diff --git a/runtime/libprofile/BlockProfiling.c b/runtime/libprofile/BlockProfiling.c new file mode 100644 index 00000000000..01b80a88e01 --- /dev/null +++ b/runtime/libprofile/BlockProfiling.c @@ -0,0 +1,43 @@ +/*===-- BlockProfiling.c - Support library for block profiling ------------===*\ +|* +|* The LLVM Compiler Infrastructure +|* +|* This file was developed by the LLVM research group and is distributed under +|* the University of Illinois Open Source License. See LICENSE.TXT for details. +|* +|*===----------------------------------------------------------------------===*| +|* +|* This file implements the call back routines for the block profiling +|* instrumentation pass. This should be used with the -insert-block-profiling +|* LLVM pass. +|* +\*===----------------------------------------------------------------------===*/ + +#include "Profiling.h" +#include + +static unsigned *ArrayStart; +static unsigned NumElements; + +/* BlockProfAtExitHandler - When the program exits, just write out the profiling + * data. + */ +static void BlockProfAtExitHandler() { + /* Note that if this were doing something more intellegent with the + instrumentation, that we could do some computation here to expand what we + collected into simple block profiles. Since we directly count each block, + */ + write_profiling_data(Block, ArrayStart, NumElements); +} + + +/* llvm_start_block_profiling - This is the main entry point of the block + * profiling library. It is responsible for setting up the atexit handler. + */ +void llvm_start_block_profiling(int argc, const char **argv, + unsigned *arrayStart, unsigned numElements) { + save_arguments(argc, argv); + ArrayStart = arrayStart; + NumElements = numElements; + atexit(BlockProfAtExitHandler); +} diff --git a/runtime/libprofile/CommonProfiling.c b/runtime/libprofile/CommonProfiling.c new file mode 100644 index 00000000000..ea795b6989e --- /dev/null +++ b/runtime/libprofile/CommonProfiling.c @@ -0,0 +1,82 @@ +/*===-- CommonProfiling.c - Profiling support library support -------------===*\ +|* +|* The LLVM Compiler Infrastructure +|* +|* This file was developed by the LLVM research group and 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 + +static int SavedArgc = 0; +static const char **SavedArgv = 0; + +/* save_arguments - Save argc and argv as passed into the program for the file + * we output. + */ +void save_arguments(int argc, const char **argv) { + if (SavedArgv) return; /* This can be called multiple times */ + + /* FIXME: this should copy the arguments out of argv into a string of our own, + * because the program might modify the arguments! + */ + SavedArgc = argc; + SavedArgv = 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. + */ +void write_profiling_data(enum ProfilingType PT, unsigned *Start, + unsigned NumElements) { + 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 (OutFile == -1) { + off_t Offset; + OutFile = open("llvmprof.out", O_CREAT | O_WRONLY | O_APPEND, 0666); + if (OutFile == -1) { + perror("LLVM profiling: while opening 'llvmprof.out'"); + return; + } + + /* Output the command line arguments to the file. */ + { + const char *Args = ""; + int PTy = Arguments; + int ArgLength = strlen(Args); + int Zeros = 0; + write(OutFile, &PTy, sizeof(int)); + write(OutFile, &ArgLength, sizeof(int)); + write(OutFile, Args, ArgLength); + /* Pad out to a multiple of four bytes */ + if (ArgLength & 3) + write(OutFile, &Zeros, 4-(ArgLength&3)); + } + } + + /* Write out this record! */ + PTy = PT; + write(OutFile, &PTy, sizeof(int)); + write(OutFile, Start, NumElements*sizeof(unsigned)); +} diff --git a/runtime/libprofile/FunctionProfiling.c b/runtime/libprofile/FunctionProfiling.c new file mode 100644 index 00000000000..8bee2f9ba62 --- /dev/null +++ b/runtime/libprofile/FunctionProfiling.c @@ -0,0 +1,41 @@ +/*===-- FunctionProfiling.c - Support library for function profiling ------===*\ +|* +|* The LLVM Compiler Infrastructure +|* +|* This file was developed by the LLVM research group and is distributed under +|* the University of Illinois Open Source License. See LICENSE.TXT for details. +|* +|*===----------------------------------------------------------------------===*| +|* +|* This file implements the call back routines for the function profiling +|* instrumentation pass. This should be used with the +|* -insert-function-profiling LLVM pass. +|* +\*===----------------------------------------------------------------------===*/ + +#include "Profiling.h" +#include + +static unsigned *ArrayStart; +static unsigned NumElements; + +/* FuncProfAtExitHandler - When the program exits, just write out the profiling + * data. + */ +static void FuncProfAtExitHandler() { + /* Just write out the data we collected. + */ + write_profiling_data(Function, ArrayStart, NumElements); +} + + +/* llvm_start_func_profiling - This is the main entry point of the function + * profiling library. It is responsible for setting up the atexit handler. + */ +void llvm_start_func_profiling(int argc, const char **argv, + unsigned *arrayStart, unsigned numElements) { + save_arguments(argc, argv); + ArrayStart = arrayStart; + NumElements = numElements; + atexit(FuncProfAtExitHandler); +} diff --git a/runtime/libprofile/Makefile b/runtime/libprofile/Makefile new file mode 100644 index 00000000000..87badfec026 --- /dev/null +++ b/runtime/libprofile/Makefile @@ -0,0 +1,17 @@ +##===- runtime/libprofile/Makefile -------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file was developed by the LLVM research group and is distributed under +# the University of Illinois Open Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../.. +BYTECODE_LIBRARY=1 +SHARED_LIBRARY=1 +#DONT_BUILD_RELINKED=1 +LIBRARYNAME=profile_rt +EXPORTED_SYMBOL_FILE = $(SourceDir)/exported_symbols.lst + +include $(LEVEL)/Makefile.common + diff --git a/runtime/libprofile/Profiling.h b/runtime/libprofile/Profiling.h new file mode 100644 index 00000000000..bb7cc8bc96c --- /dev/null +++ b/runtime/libprofile/Profiling.h @@ -0,0 +1,34 @@ +/*===-- Profiling.h - Profiling support library support routines --*- C -*-===*\ +|* +|* The LLVM Compiler Infrastructure +|* +|* This file was developed by the LLVM research group and is distributed under +|* the University of Illinois Open Source License. See LICENSE.TXT for details. +|* +|*===----------------------------------------------------------------------===*| +|* +|* This file defines functions shared by the various different profiling +|* implementations. +|* +\*===----------------------------------------------------------------------===*/ + +#ifndef PROFILING_H +#define PROFILING_H + +/* save_arguments - Save argc and argv as passed into the program for the file + * we output. + */ +void save_arguments(int argc, const char **argv); + +enum ProfilingType { + Arguments = 1, /* The command line argument block */ + Function = 2, /* Function profiling information */ + Block = 3, /* Block profiling information */ + Edge = 4, /* Edge profiling information */ + Path = 5 /* Path profiling information */ +}; + +void write_profiling_data(enum ProfilingType PT, unsigned *Start, + unsigned NumElements); + +#endif diff --git a/runtime/libprofile/exported_symbols.lst b/runtime/libprofile/exported_symbols.lst new file mode 100644 index 00000000000..faed3efd203 --- /dev/null +++ b/runtime/libprofile/exported_symbols.lst @@ -0,0 +1,3 @@ + +llvm_start_func_profiling +llvm_start_block_profiling