|  | /*===-- OptimalEdgeProfiling.c - Support library for opt. edge 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 edge profiling | 
|  | |* instrumentation pass.  This should be used with the | 
|  | |* -insert-opt-edge-profiling LLVM pass. | 
|  | |* | 
|  | \*===----------------------------------------------------------------------===*/ | 
|  |  | 
|  | #include "Profiling.h" | 
|  | #include <stdlib.h> | 
|  |  | 
|  | static unsigned *ArrayStart; | 
|  | static unsigned NumElements; | 
|  |  | 
|  | /* OptEdgeProfAtExitHandler - When the program exits, just write out the | 
|  | * profiling data. | 
|  | */ | 
|  | static void OptEdgeProfAtExitHandler(void) { | 
|  | /* Note that, although the array has a counter for each edge, not all | 
|  | * counters are updated, the ones that are not used are initialised with -1. | 
|  | * When loading this information the counters with value -1 have to be | 
|  | * recalculated, it is guaranteed that this is possible. | 
|  | */ | 
|  | write_profiling_data(OptEdgeInfo, ArrayStart, NumElements); | 
|  | } | 
|  |  | 
|  |  | 
|  | /* llvm_start_opt_edge_profiling - This is the main entry point of the edge | 
|  | * profiling library.  It is responsible for setting up the atexit handler. | 
|  | */ | 
|  | int llvm_start_opt_edge_profiling(int argc, const char **argv, | 
|  | unsigned *arrayStart, unsigned numElements) { | 
|  | int Ret = save_arguments(argc, argv); | 
|  | ArrayStart = arrayStart; | 
|  | NumElements = numElements; | 
|  | atexit(OptEdgeProfAtExitHandler); | 
|  | return Ret; | 
|  | } |