X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=runtime%2Flibprofile%2FCommonProfiling.c;h=210a5e5ab78ae67920bbd92914e906253ea3d195;hb=e0b58634a1953ed9138882da8b251b3e2aab9220;hp=8b27a257697429d04acfba512bb23cd0454ffa04;hpb=234d529e582963ad4b5d83b911cd057fe99d1435;p=oota-llvm.git diff --git a/runtime/libprofile/CommonProfiling.c b/runtime/libprofile/CommonProfiling.c index 8b27a257697..210a5e5ab78 100644 --- a/runtime/libprofile/CommonProfiling.c +++ b/runtime/libprofile/CommonProfiling.c @@ -2,23 +2,28 @@ |* |* The LLVM Compiler Infrastructure |* -|* This file is distributed under the University of Illinois Open Source -|* License. See LICENSE.TXT for details. -|* +|* This file is distributed under the University of Illinois Open Source +|* License. See LICENSE.TXT for details. +|* |*===----------------------------------------------------------------------===*| -|* +|* |* This file implements functions used by the various different types of |* profiling implementations. |* \*===----------------------------------------------------------------------===*/ #include "Profiling.h" +#include #include #include #include #include #include +#if !defined(_MSC_VER) && !defined(__MINGW32__) #include +#else +#include +#endif #include static char *SavedArgs = 0; @@ -74,26 +79,23 @@ int save_arguments(int argc, const char **argv) { } -/* write_profiling_data - Write a raw block of profiling counters out to the - * llvmprof.out file. Note that we allow programs to be instrumented with - * multiple different kinds of instrumentation. For this reason, this function - * may be called more than once. +/* + * Retrieves the file descriptor for the profile file. */ -void write_profiling_data(enum ProfilingType PT, unsigned *Start, - unsigned NumElements) { +int getOutFile() { static int OutFile = -1; - int PTy; - - /* If this is the first time this function is called, open the output file for - * appending, creating it if it does not already exist. + + /* If this is the first time this function is called, open the output file + * for appending, creating it if it does not already exist. */ if (OutFile == -1) { - OutFile = open(OutputFilename, O_CREAT | O_WRONLY | O_APPEND, 0666); + OutFile = open(OutputFilename, O_CREAT | O_WRONLY, 0666); + lseek(OutFile, 0, SEEK_END); /* O_APPEND prevents seeking */ if (OutFile == -1) { fprintf(stderr, "LLVM profiling runtime: while opening '%s': ", OutputFilename); perror(""); - return; + return(OutFile); } /* Output the command line arguments to the file. */ @@ -108,10 +110,25 @@ void write_profiling_data(enum ProfilingType PT, unsigned *Start, write(OutFile, &Zeros, 4-(SavedArgsLength&3)); } } - + return(OutFile); +} + +/* write_profiling_data - Write a raw block of profiling counters out to the + * llvmprof.out file. Note that we allow programs to be instrumented with + * multiple different kinds of instrumentation. For this reason, this function + * may be called more than once. + */ +void write_profiling_data(enum ProfilingType PT, unsigned *Start, + unsigned NumElements) { + int PTy; + int outFile = getOutFile(); + /* Write out this record! */ PTy = PT; - write(OutFile, &PTy, sizeof(int)); - write(OutFile, &NumElements, sizeof(unsigned)); - write(OutFile, Start, NumElements*sizeof(unsigned)); + if( write(outFile, &PTy, sizeof(int)) < 0 || + write(outFile, &NumElements, sizeof(unsigned)) < 0 || + write(outFile, Start, NumElements*sizeof(unsigned)) < 0 ) { + fprintf(stderr,"error: unable to write to output file."); + exit(0); + } }