[XRay] Fix __xray_function_address on PPC reguarding local entry points.
authorTim Shen <timshen91@gmail.com>
Wed, 17 May 2017 21:20:00 +0000 (21:20 +0000)
committerTim Shen <timshen91@gmail.com>
Wed, 17 May 2017 21:20:00 +0000 (21:20 +0000)
Reviewers: echristo, dberris

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D33266

llvm-svn: 303302

compiler-rt/lib/xray/xray_interface.cc
compiler-rt/test/xray/TestCases/Linux/func-id-utils.cc

index c437a72..523ed16 100644 (file)
@@ -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 {
index c9a2952..17185c3 100644 (file)
          "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");