forked from OSchip/llvm-project
[InstrProfiling] Support relative CountersPtr for PlatformOther
D104556 change the CountersPtr to be relative, however, it did not update the pointer initialization in __llvm_profile_register_function, so the platform (eg:AIX) that use __llvm_profile_register_function is now totaly broken, any PGO code will SEGV. This patch update the code to reflect that the Data->CountersPtr is now relative. Reviewed By: MaskRay, davidxl Differential Revision: https://reviews.llvm.org/D108304
This commit is contained in:
parent
6d7ea597ef
commit
66e2772e42
|
@ -46,17 +46,19 @@ void __llvm_profile_register_function(void *Data_) {
|
||||||
if (!DataFirst) {
|
if (!DataFirst) {
|
||||||
DataFirst = Data;
|
DataFirst = Data;
|
||||||
DataLast = Data + 1;
|
DataLast = Data + 1;
|
||||||
CountersFirst = Data->CounterPtr;
|
CountersFirst = (uint64_t *)((uintptr_t)Data_ + Data->CounterPtr);
|
||||||
CountersLast = (uint64_t *)Data->CounterPtr + Data->NumCounters;
|
CountersLast = CountersFirst + Data->NumCounters;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataFirst = (const __llvm_profile_data *)getMinAddr(DataFirst, Data);
|
DataFirst = (const __llvm_profile_data *)getMinAddr(DataFirst, Data);
|
||||||
CountersFirst = (uint64_t *)getMinAddr(CountersFirst, Data->CounterPtr);
|
CountersFirst = (uint64_t *)getMinAddr(
|
||||||
|
CountersFirst, (uint64_t *)((uintptr_t)Data_ + Data->CounterPtr));
|
||||||
|
|
||||||
DataLast = (const __llvm_profile_data *)getMaxAddr(DataLast, Data + 1);
|
DataLast = (const __llvm_profile_data *)getMaxAddr(DataLast, Data + 1);
|
||||||
CountersLast = (uint64_t *)getMaxAddr(
|
CountersLast = (uint64_t *)getMaxAddr(
|
||||||
CountersLast, (uint64_t *)Data->CounterPtr + Data->NumCounters);
|
CountersLast,
|
||||||
|
(uint64_t *)((uintptr_t)Data_ + Data->CounterPtr) + Data->NumCounters);
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPILER_RT_VISIBILITY
|
COMPILER_RT_VISIBILITY
|
||||||
|
|
Loading…
Reference in New Issue