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