diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-03-20 03:23:10 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-03-20 03:23:10 +0000 |
commit | 4709975bfe6b884e3b2b62da7545b01a82239906 (patch) | |
tree | c945165555e4835915952a1ccc892e8c350da07b /lib/profile | |
parent | cab2b24e0704c4efb150c6ea44195b766e56a690 (diff) |
PGO: Split out initialization of section bounds
Currently we register instrumentation data at runtime to determine the
bounds of the sections where the data lives. Soon we'll implement
platform-specific linker magic to determine this at link time.
Move this logic to a separate file, so that our build system can choose
the correct platform-specific code.
No functionality change intended.
<rdar://problem/15943240>
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@204299 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/profile')
-rw-r--r-- | lib/profile/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/profile/InstrProfiling.c | 37 | ||||
-rw-r--r-- | lib/profile/InstrProfiling.h | 7 | ||||
-rw-r--r-- | lib/profile/InstrProfilingDefault.c | 59 |
4 files changed, 69 insertions, 35 deletions
diff --git a/lib/profile/CMakeLists.txt b/lib/profile/CMakeLists.txt index 20675372b..0374d6e7a 100644 --- a/lib/profile/CMakeLists.txt +++ b/lib/profile/CMakeLists.txt @@ -1,6 +1,7 @@ set(PROFILE_SOURCES GCDAProfiling.c InstrProfiling.c + InstrProfilingDefault.c InstrProfilingExtras.c) filter_available_targets(PROFILE_SUPPORTED_ARCH x86_64 i386 arm) diff --git a/lib/profile/InstrProfiling.c b/lib/profile/InstrProfiling.c index 41818ab8a..c897052d8 100644 --- a/lib/profile/InstrProfiling.c +++ b/lib/profile/InstrProfiling.c @@ -9,40 +9,6 @@ #include "InstrProfiling.h" -/* TODO: Calculate these with linker magic. */ -static const __llvm_pgo_data *First = NULL; -static const __llvm_pgo_data *Last = NULL; - -/*! - * \brief Register an instrumented function. - * - * Calls to this are emitted by clang with -fprofile-instr-generate. Such - * calls are only required (and only emitted) on targets where we haven't - * implemented linker magic to find the bounds of the section. - * - * For now, that's all targets. - */ -void __llvm_pgo_register_function(void *Data_) { - /* TODO: Only emit this function if we can't use linker magic. */ - const __llvm_pgo_data *Data = (__llvm_pgo_data*)Data_; - if (!First || Data < First) - First = Data; - if (!Last || Data >= Last) - Last = Data + 1; -} - -/*! \brief Get the first instrumentation record. */ -static const __llvm_pgo_data *getFirst() { - /* TODO: Use extern + linker magic instead of a static variable. */ - return First; -} - -/*! \brief Get the last instrumentation record. */ -static const __llvm_pgo_data *getLast() { - /* TODO: Use extern + linker magic instead of a static variable. */ - return Last; -} - /* TODO: void __llvm_pgo_get_size_for_buffer(void); */ static void writeFunction(FILE *OutputFile, const __llvm_pgo_data *Data) { @@ -64,6 +30,7 @@ void __llvm_pgo_write_buffer(FILE *OutputFile) { */ const __llvm_pgo_data *I, *E; - for (I = getFirst(), E = getLast(); I != E; ++I) + for (I = __llvm_pgo_data_begin(), E = __llvm_pgo_data_end(); + I != E; ++I) writeFunction(OutputFile, I); } diff --git a/lib/profile/InstrProfiling.h b/lib/profile/InstrProfiling.h index 8aaab016a..a3e86ca55 100644 --- a/lib/profile/InstrProfiling.h +++ b/lib/profile/InstrProfiling.h @@ -50,3 +50,10 @@ typedef struct __llvm_pgo_data { * to it. */ void __llvm_pgo_write_buffer(FILE *OutputFile); + +const __llvm_pgo_data *__llvm_pgo_data_begin(); +const __llvm_pgo_data *__llvm_pgo_data_end(); +const char *__llvm_pgo_names_begin(); +const char *__llvm_pgo_names_end(); +const uint64_t *__llvm_pgo_counters_begin(); +const uint64_t *__llvm_pgo_counters_end(); diff --git a/lib/profile/InstrProfilingDefault.c b/lib/profile/InstrProfilingDefault.c new file mode 100644 index 000000000..d39f39f37 --- /dev/null +++ b/lib/profile/InstrProfilingDefault.c @@ -0,0 +1,59 @@ +/*===- InstrProfilingDefault.c - Profile data default platfrom ------------===*\ +|* +|* The LLVM Compiler Infrastructure +|* +|* This file is distributed under the University of Illinois Open Source +|* License. See LICENSE.TXT for details. +|* +\*===----------------------------------------------------------------------===*/ + +#include "InstrProfiling.h" + +static const __llvm_pgo_data *DataFirst = NULL; +static const __llvm_pgo_data *DataLast = NULL; +static const char *NamesFirst = NULL; +static const char *NamesLast = NULL; +static const uint64_t *CountersFirst = NULL; +static const uint64_t *CountersLast = NULL; + +/*! + * \brief Register an instrumented function. + * + * Calls to this are emitted by clang with -fprofile-instr-generate. Such + * calls are only required (and only emitted) on targets where we haven't + * implemented linker magic to find the bounds of the sections. + */ +void __llvm_pgo_register_function(void *Data_) { + /* TODO: Only emit this function if we can't use linker magic. */ + const __llvm_pgo_data *Data = (__llvm_pgo_data*)Data_; + if (!DataFirst) { + DataFirst = Data; + DataLast = Data + 1; + NamesFirst = Data->Name; + NamesLast = Data->Name + Data->NameSize; + CountersFirst = Data->Counters; + CountersLast = Data->Counters + Data->NumCounters; + return; + } + +#define UPDATE_FIRST(First, New) \ + First = New < First ? New : First + UPDATE_FIRST(DataFirst, Data); + UPDATE_FIRST(NamesFirst, Data->Name); + UPDATE_FIRST(CountersFirst, Data->Counters); +#undef UPDATE_FIRST + +#define UPDATE_LAST(Last, New) \ + Last = New > Last ? New : Last + UPDATE_LAST(DataLast, Data + 1); + UPDATE_LAST(NamesLast, Data->Name + Data->NameSize); + UPDATE_LAST(CountersLast, Data->Counters + Data->NumCounters); +#undef UPDATE_LAST +} + +const __llvm_pgo_data *__llvm_pgo_data_begin() { return DataFirst; } +const __llvm_pgo_data *__llvm_pgo_data_end() { return DataLast; } +const char *__llvm_pgo_names_begin() { return NamesFirst; } +const char *__llvm_pgo_names_end() { return NamesLast; } +const uint64_t *__llvm_pgo_counters_begin() { return CountersFirst; } +const uint64_t *__llvm_pgo_counters_end() { return CountersLast; } |