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 __llvm_profile_register_function(void * Data_)30void __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 __llvm_profile_begin_data(void)57const __llvm_profile_data *__llvm_profile_begin_data(void) { return DataFirst; } 58 COMPILER_RT_VISIBILITY __llvm_profile_end_data(void)59const __llvm_profile_data *__llvm_profile_end_data(void) { return DataLast; } 60 COMPILER_RT_VISIBILITY __llvm_profile_begin_names(void)61const char *__llvm_profile_begin_names(void) { return NamesFirst; } 62 COMPILER_RT_VISIBILITY __llvm_profile_end_names(void)63const char *__llvm_profile_end_names(void) { return NamesLast; } 64 COMPILER_RT_VISIBILITY __llvm_profile_begin_counters(void)65uint64_t *__llvm_profile_begin_counters(void) { return CountersFirst; } 66 COMPILER_RT_VISIBILITY __llvm_profile_end_counters(void)67uint64_t *__llvm_profile_end_counters(void) { return CountersLast; } 68 #endif 69