summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Shen <timshen91@gmail.com>2017-05-17 21:20:00 +0000
committerTim Shen <timshen91@gmail.com>2017-05-17 21:20:00 +0000
commite1cd1705926eb39307a7239bf0531c55940a3639 (patch)
treeb02b5c3860a71793cc86d672cbc4456d48cf31b2
parent3cd2b8fb91fd44fcd076ad4fe747922710c0f74e (diff)
[XRay] Fix __xray_function_address on PPC reguarding local entry points.
Reviewers: echristo, dberris Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D33266 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@303302 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/xray/xray_interface.cc9
-rw-r--r--test/xray/TestCases/Linux/func-id-utils.cc16
2 files changed, 12 insertions, 13 deletions
diff --git a/lib/xray/xray_interface.cc b/lib/xray/xray_interface.cc
index c437a72e3..523ed16b9 100644
--- a/lib/xray/xray_interface.cc
+++ b/lib/xray/xray_interface.cc
@@ -326,7 +326,14 @@ uintptr_t __xray_function_address(int32_t FuncId) XRAY_NEVER_INSTRUMENT {
__sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex);
if (FuncId <= 0 || static_cast<size_t>(FuncId) > XRayInstrMap.Functions)
return 0;
- return XRayInstrMap.SledsIndex[FuncId - 1].Begin->Address;
+ return XRayInstrMap.SledsIndex[FuncId - 1].Begin->Address
+// On PPC, function entries are always aligned to 16 bytes. The beginning of a
+// sled might be a local entry, which is always +8 based on the global entry.
+// Always return the global entry.
+#ifdef __PPC__
+ & ~0xf
+#endif
+ ;
}
size_t __xray_max_function_id() XRAY_NEVER_INSTRUMENT {
diff --git a/test/xray/TestCases/Linux/func-id-utils.cc b/test/xray/TestCases/Linux/func-id-utils.cc
index c9a2952c6..17185c34c 100644
--- a/test/xray/TestCases/Linux/func-id-utils.cc
+++ b/test/xray/TestCases/Linux/func-id-utils.cc
@@ -31,18 +31,10 @@
"each function id must be assigned to a unique function");
std::set<void *> not_instrumented;
- const auto comp = [](void *lhs, void *rhs) {
-#ifdef __PPC__
- return reinterpret_cast<uintptr_t>(lhs) + 8 <
- reinterpret_cast<uintptr_t>(rhs);
-#else
- return lhs < rhs;
-#endif
- };
- std::set_difference(must_be_instrumented.begin(), must_be_instrumented.end(),
- all_instrumented.begin(), all_instrumented.end(),
- std::inserter(not_instrumented, not_instrumented.begin()),
- comp);
+ std::set_difference(
+ must_be_instrumented.begin(), must_be_instrumented.end(),
+ all_instrumented.begin(), all_instrumented.end(),
+ std::inserter(not_instrumented, not_instrumented.begin()));
assert(
not_instrumented.empty() &&
"we should see all explicitly instrumented functions with function ids");