Home | History | Annotate | Line # | Download | only in profile
      1 /*===- InstrProfilingPlatformOther.c - Profile data default platform ------===*\
      2 |*
      3 |*                     The LLVM Compiler Infrastructure
      4 |*
      5 |* This file is distributed under the University of Illinois Open Source
      6 |* License. See LICENSE.TXT for details.
      7 |*
      8 \*===----------------------------------------------------------------------===*/
      9 
     10 #include "InstrProfiling.h"
     11 
     12 #if !defined(__APPLE__) && !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__)
     13 #include <stdlib.h>
     14 
     15 static const __llvm_profile_data *DataFirst = NULL;
     16 static const __llvm_profile_data *DataLast = NULL;
     17 static const char *NamesFirst = NULL;
     18 static const char *NamesLast = NULL;
     19 static uint64_t *CountersFirst = NULL;
     20 static uint64_t *CountersLast = NULL;
     21 
     22 /*!
     23  * \brief Register an instrumented function.
     24  *
     25  * Calls to this are emitted by clang with -fprofile-instr-generate.  Such
     26  * calls are only required (and only emitted) on targets where we haven't
     27  * implemented linker magic to find the bounds of the sections.
     28  */
     29 COMPILER_RT_VISIBILITY
     30 void __llvm_profile_register_function(void *Data_) {
     31   /* TODO: Only emit this function if we can't use linker magic. */
     32   const __llvm_profile_data *Data = (__llvm_profile_data *)Data_;
     33   if (!DataFirst) {
     34     DataFirst = Data;
     35     DataLast = Data + 1;
     36     NamesFirst = Data->NamePtr;
     37     NamesLast = (const char *)Data->NamePtr + Data->NameSize;
     38     CountersFirst = Data->CounterPtr;
     39     CountersLast = (uint64_t *)Data->CounterPtr + Data->NumCounters;
     40     return;
     41   }
     42 
     43 #define UPDATE_FIRST(First, New) First = New < First ? New : First
     44   UPDATE_FIRST(DataFirst, Data);
     45   UPDATE_FIRST(NamesFirst, (const char *)Data->NamePtr);
     46   UPDATE_FIRST(CountersFirst, (uint64_t *)Data->CounterPtr);
     47 #undef UPDATE_FIRST
     48 
     49 #define UPDATE_LAST(Last, New) Last = New > Last ? New : Last
     50   UPDATE_LAST(DataLast, Data + 1);
     51   UPDATE_LAST(NamesLast, (const char *)Data->NamePtr + Data->NameSize);
     52   UPDATE_LAST(CountersLast, (uint64_t *)Data->CounterPtr + Data->NumCounters);
     53 #undef UPDATE_LAST
     54 }
     55 
     56 COMPILER_RT_VISIBILITY
     57 const __llvm_profile_data *__llvm_profile_begin_data(void) { return DataFirst; }
     58 COMPILER_RT_VISIBILITY
     59 const __llvm_profile_data *__llvm_profile_end_data(void) { return DataLast; }
     60 COMPILER_RT_VISIBILITY
     61 const char *__llvm_profile_begin_names(void) { return NamesFirst; }
     62 COMPILER_RT_VISIBILITY
     63 const char *__llvm_profile_end_names(void) { return NamesLast; }
     64 COMPILER_RT_VISIBILITY
     65 uint64_t *__llvm_profile_begin_counters(void) { return CountersFirst; }
     66 COMPILER_RT_VISIBILITY
     67 uint64_t *__llvm_profile_end_counters(void) { return CountersLast; }
     68 #endif
     69