forked from OSchip/llvm-project
[PGO]: Eliminate calls to __llvm_profile_register_function for Linux.
On Linux, the profile runtime can use __start_SECTNAME and __stop_SECTNAME symbols defined by the linker to locate the start and end location of a named section (with C name). This eliminates the need for instrumented binary to call __llvm_profile_register_function during start-up time. llvm-svn: 250200
This commit is contained in:
parent
3dd8817d84
commit
f556a7e3c3
|
@ -6,6 +6,7 @@ set(PROFILE_SOURCES
|
|||
InstrProfilingBuffer.c
|
||||
InstrProfilingFile.c
|
||||
InstrProfilingPlatformDarwin.c
|
||||
InstrProfilingPlatformLinux.c
|
||||
InstrProfilingPlatformOther.c
|
||||
InstrProfilingRuntime.cc
|
||||
InstrProfilingUtil.c)
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
/*===- InstrProfilingPlatformLinux.c - Profile data Linux platform ------===*\
|
||||
|*
|
||||
|* The LLVM Compiler Infrastructure
|
||||
|*
|
||||
|* This file is distributed under the University of Illinois Open Source
|
||||
|* License. See LICENSE.TXT for details.
|
||||
|*
|
||||
\*===----------------------------------------------------------------------===*/
|
||||
|
||||
#include "InstrProfiling.h"
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <stdlib.h>
|
||||
|
||||
extern __llvm_profile_data __start___llvm_prf_data
|
||||
__attribute__((visibility("hidden")));
|
||||
extern __llvm_profile_data __stop___llvm_prf_data
|
||||
__attribute__((visibility("hidden")));
|
||||
extern uint64_t __start___llvm_prf_cnts __attribute__((visibility("hidden")));
|
||||
extern uint64_t __stop___llvm_prf_cnts __attribute__((visibility("hidden")));
|
||||
extern char __start___llvm_prf_names __attribute__((visibility("hidden")));
|
||||
extern char __stop___llvm_prf_names __attribute__((visibility("hidden")));
|
||||
|
||||
__attribute__((visibility("hidden"))) const __llvm_profile_data *
|
||||
__llvm_profile_begin_data(void) {
|
||||
return &__start___llvm_prf_data;
|
||||
}
|
||||
__attribute__((visibility("hidden"))) const __llvm_profile_data *
|
||||
__llvm_profile_end_data(void) {
|
||||
return &__stop___llvm_prf_data;
|
||||
}
|
||||
__attribute__((visibility("hidden"))) const char *__llvm_profile_begin_names(
|
||||
void) {
|
||||
return &__start___llvm_prf_names;
|
||||
}
|
||||
__attribute__((visibility("hidden"))) const char *__llvm_profile_end_names(
|
||||
void) {
|
||||
return &__stop___llvm_prf_names;
|
||||
}
|
||||
__attribute__((visibility("hidden"))) uint64_t *__llvm_profile_begin_counters(
|
||||
void) {
|
||||
return &__start___llvm_prf_cnts;
|
||||
}
|
||||
__attribute__((visibility("hidden"))) uint64_t *__llvm_profile_end_counters(
|
||||
void) {
|
||||
return &__stop___llvm_prf_cnts;
|
||||
}
|
||||
#endif
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
#include "InstrProfiling.h"
|
||||
|
||||
#if !defined(__APPLE__)
|
||||
#if !defined(__APPLE__) && !defined(__linux__)
|
||||
#include <stdlib.h>
|
||||
|
||||
static const __llvm_profile_data *DataFirst = NULL;
|
||||
|
|
Loading…
Reference in New Issue