/*===-- BlockProfiling.c - Support library for block profiling ------------===*\ |* |* The LLVM Compiler Infrastructure |* |* This file 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 intelligent with the * instrumentation, we could do some computation here to expand what we * collected into simple block profiles. (Or we could do it in llvm-prof.) * Regardless, we directly count each block, so no expansion is necessary. */ write_profiling_data(BlockInfo, 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. */ int llvm_start_block_profiling(int argc, const char **argv, unsigned *arrayStart, unsigned numElements) { int Ret = save_arguments(argc, argv); ArrayStart = arrayStart; NumElements = numElements; atexit(BlockProfAtExitHandler); return Ret; }