diff options
author | Tim Shen <timshen91@gmail.com> | 2017-05-17 21:20:00 +0000 |
---|---|---|
committer | Tim Shen <timshen91@gmail.com> | 2017-05-17 21:20:00 +0000 |
commit | e1cd1705926eb39307a7239bf0531c55940a3639 (patch) | |
tree | b02b5c3860a71793cc86d672cbc4456d48cf31b2 | |
parent | 3cd2b8fb91fd44fcd076ad4fe747922710c0f74e (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.cc | 9 | ||||
-rw-r--r-- | test/xray/TestCases/Linux/func-id-utils.cc | 16 |
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"); |