forked from OSchip/llvm-project
[profile] initialize static pool properly
Remove dependency on runtime initializer to avoid issues related to initialization order. llvm-svn: 270371
This commit is contained in:
parent
8ec7e7c216
commit
7b41393497
|
|
@ -57,4 +57,7 @@ ValueProfNode *__llvm_profile_begin_vnodes(void) {
|
||||||
}
|
}
|
||||||
COMPILER_RT_VISIBILITY
|
COMPILER_RT_VISIBILITY
|
||||||
ValueProfNode *__llvm_profile_end_vnodes(void) { return &VNodesEnd; }
|
ValueProfNode *__llvm_profile_end_vnodes(void) { return &VNodesEnd; }
|
||||||
|
|
||||||
|
COMPILER_RT_VISIBILITY ValueProfNode *CurrentVNode = &VNodesStart;
|
||||||
|
COMPILER_RT_VISIBILITY ValueProfNode *EndVNode = &VNodesEnd;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,10 @@ COMPILER_RT_VISIBILITY ValueProfNode *
|
||||||
__llvm_profile_begin_vnodes(void) {
|
__llvm_profile_begin_vnodes(void) {
|
||||||
return &PROF_VNODES_START;
|
return &PROF_VNODES_START;
|
||||||
}
|
}
|
||||||
COMPILER_RT_VISIBILITY ValueProfNode *
|
COMPILER_RT_VISIBILITY ValueProfNode *__llvm_profile_end_vnodes(void) {
|
||||||
__llvm_profile_end_vnodes(void) {
|
|
||||||
return &PROF_VNODES_STOP;
|
return &PROF_VNODES_STOP;
|
||||||
}
|
}
|
||||||
|
COMPILER_RT_VISIBILITY ValueProfNode *CurrentVNode = &PROF_VNODES_START;
|
||||||
|
COMPILER_RT_VISIBILITY ValueProfNode *EndVNode = &PROF_VNODES_STOP;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -88,4 +88,7 @@ ValueProfNode *__llvm_profile_begin_vnodes(void) {
|
||||||
COMPILER_RT_VISIBILITY
|
COMPILER_RT_VISIBILITY
|
||||||
ValueProfNode *__llvm_profile_end_vnodes(void) { return 0; }
|
ValueProfNode *__llvm_profile_end_vnodes(void) { return 0; }
|
||||||
|
|
||||||
|
COMPILER_RT_VISIBILITY ValueProfNode *CurrentVNode = 0;
|
||||||
|
COMPILER_RT_VISIBILITY ValueProfNode *EndVNode = 0;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,6 @@ COMPILER_RT_VISIBILITY void lprofSetupValueProfiler() {
|
||||||
if (VPMaxNumValsPerSite > INSTR_PROF_MAX_NUM_VAL_PER_SITE)
|
if (VPMaxNumValsPerSite > INSTR_PROF_MAX_NUM_VAL_PER_SITE)
|
||||||
VPMaxNumValsPerSite = INSTR_PROF_MAX_NUM_VAL_PER_SITE;
|
VPMaxNumValsPerSite = INSTR_PROF_MAX_NUM_VAL_PER_SITE;
|
||||||
|
|
||||||
CurrentVNode = __llvm_profile_begin_vnodes();
|
|
||||||
EndVNode = __llvm_profile_end_vnodes();
|
|
||||||
if (!(EndVNode > CurrentVNode)) {
|
if (!(EndVNode > CurrentVNode)) {
|
||||||
CurrentVNode = 0;
|
CurrentVNode = 0;
|
||||||
EndVNode = 0;
|
EndVNode = 0;
|
||||||
|
|
@ -72,9 +70,16 @@ __llvm_get_function_addr(const __llvm_profile_data *Data) {
|
||||||
* 0 if allocation fails.
|
* 0 if allocation fails.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int hasStaticCounters = 1;
|
||||||
|
|
||||||
static int allocateValueProfileCounters(__llvm_profile_data *Data) {
|
static int allocateValueProfileCounters(__llvm_profile_data *Data) {
|
||||||
uint64_t NumVSites = 0;
|
uint64_t NumVSites = 0;
|
||||||
uint32_t VKI;
|
uint32_t VKI;
|
||||||
|
|
||||||
|
/* This function will never be called when value site array is allocated
|
||||||
|
statically at compile time. */
|
||||||
|
hasStaticCounters = 0;
|
||||||
|
|
||||||
for (VKI = IPVK_First; VKI <= IPVK_Last; ++VKI)
|
for (VKI = IPVK_First; VKI <= IPVK_Last; ++VKI)
|
||||||
NumVSites += Data->NumValueSites[VKI];
|
NumVSites += Data->NumValueSites[VKI];
|
||||||
|
|
||||||
|
|
@ -89,15 +94,11 @@ static int allocateValueProfileCounters(__llvm_profile_data *Data) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPILER_RT_VISIBILITY ValueProfNode *CurrentVNode = 0;
|
|
||||||
COMPILER_RT_VISIBILITY ValueProfNode *EndVNode = 0;
|
|
||||||
static int hasNoStaticCounters() { return (EndVNode == 0); }
|
|
||||||
|
|
||||||
static ValueProfNode *allocateOneNode(__llvm_profile_data *Data, uint32_t Index,
|
static ValueProfNode *allocateOneNode(__llvm_profile_data *Data, uint32_t Index,
|
||||||
uint64_t Value) {
|
uint64_t Value) {
|
||||||
ValueProfNode *Node;
|
ValueProfNode *Node;
|
||||||
|
|
||||||
if (hasNoStaticCounters())
|
if (!hasStaticCounters)
|
||||||
return (ValueProfNode *)calloc(1, sizeof(ValueProfNode));
|
return (ValueProfNode *)calloc(1, sizeof(ValueProfNode));
|
||||||
|
|
||||||
Node = COMPILER_RT_PTR_FETCH_ADD(ValueProfNode, CurrentVNode, 1);
|
Node = COMPILER_RT_PTR_FETCH_ADD(ValueProfNode, CurrentVNode, 1);
|
||||||
|
|
@ -116,8 +117,6 @@ __llvm_profile_instrument_target(uint64_t TargetValue, void *Data,
|
||||||
if (!PData)
|
if (!PData)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* This path will never be taken when value site array is allocated
|
|
||||||
statically at compile time. */
|
|
||||||
if (!PData->Values) {
|
if (!PData->Values) {
|
||||||
if (!allocateValueProfileCounters(PData))
|
if (!allocateValueProfileCounters(PData))
|
||||||
return;
|
return;
|
||||||
|
|
@ -195,7 +194,7 @@ __llvm_profile_instrument_target(uint64_t TargetValue, void *Data,
|
||||||
else if (PrevVNode && !PrevVNode->Next)
|
else if (PrevVNode && !PrevVNode->Next)
|
||||||
Success = COMPILER_RT_BOOL_CMPXCHG(&(PrevVNode->Next), 0, CurrentVNode);
|
Success = COMPILER_RT_BOOL_CMPXCHG(&(PrevVNode->Next), 0, CurrentVNode);
|
||||||
|
|
||||||
if (!Success && hasNoStaticCounters()) {
|
if (!Success && !hasStaticCounters) {
|
||||||
free(CurrentVNode);
|
free(CurrentVNode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// RUN: %clang_profgen -mllvm --enable-value-profiling=true -O2 -o %t %s
|
// RUN: %clang_profgen -mllvm --enable-value-profiling=true -mllvm -vp-static-alloc=true -mllvm -vp-counters-per-site=3 -O2 -o %t %s
|
||||||
// RUN: %run %t %t.profraw
|
// RUN: %run %t %t.profraw
|
||||||
// RUN: llvm-profdata merge -o %t.profdata %t.profraw
|
// RUN: llvm-profdata merge -o %t.profdata %t.profraw
|
||||||
// RUN: llvm-profdata show --all-functions --counts --ic-targets %t.profdata > %t.profdump
|
// RUN: llvm-profdata show --all-functions --counts --ic-targets %t.profdata > %t.profdump
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue