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__) 13#include <stdlib.h> 14 15static const __llvm_profile_data *DataFirst = NULL; 16static const __llvm_profile_data *DataLast = NULL; 17static const char *NamesFirst = NULL; 18static const char *NamesLast = NULL; 19static uint64_t *CountersFirst = NULL; 20static 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__attribute__((visibility("hidden"))) 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->Name; 37 NamesLast = Data->Name + Data->NameSize; 38 CountersFirst = Data->Counters; 39 CountersLast = Data->Counters + Data->NumCounters; 40 return; 41 } 42 43#define UPDATE_FIRST(First, New) \ 44 First = New < First ? New : First 45 UPDATE_FIRST(DataFirst, Data); 46 UPDATE_FIRST(NamesFirst, Data->Name); 47 UPDATE_FIRST(CountersFirst, Data->Counters); 48#undef UPDATE_FIRST 49 50#define UPDATE_LAST(Last, New) \ 51 Last = New > Last ? New : Last 52 UPDATE_LAST(DataLast, Data + 1); 53 UPDATE_LAST(NamesLast, Data->Name + Data->NameSize); 54 UPDATE_LAST(CountersLast, Data->Counters + Data->NumCounters); 55#undef UPDATE_LAST 56} 57 58__attribute__((visibility("hidden"))) 59const __llvm_profile_data *__llvm_profile_data_begin(void) { 60 return DataFirst; 61} 62__attribute__((visibility("hidden"))) 63const __llvm_profile_data *__llvm_profile_data_end(void) { 64 return DataLast; 65} 66__attribute__((visibility("hidden"))) 67const char *__llvm_profile_names_begin(void) { return NamesFirst; } 68__attribute__((visibility("hidden"))) 69const char *__llvm_profile_names_end(void) { return NamesLast; } 70__attribute__((visibility("hidden"))) 71uint64_t *__llvm_profile_counters_begin(void) { return CountersFirst; } 72__attribute__((visibility("hidden"))) 73uint64_t *__llvm_profile_counters_end(void) { return CountersLast; } 74#endif 75