[XRay] Fix the test func-id-utils.cc on PPC.
authorTim Shen <timshen91@gmail.com>
Wed, 10 May 2017 16:07:03 +0000 (16:07 +0000)
committerTim Shen <timshen91@gmail.com>
Wed, 10 May 2017 16:07:03 +0000 (16:07 +0000)
Summary:
The test fails on PPC, because the address of a function may vary
depending on whether the "taker" shares the same ToC (roughly, in the
same "module") as the function.

Therefore the addresses of the functions taken in func-id-utils.cc may be
different from the addresses taken in xray runtime.

Change the test to be permissive on address comparison.

Reviewers: dberris, echristo

Subscribers: llvm-commits

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

llvm-svn: 302686

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

index 82ba34d30acc0ade691238d44eaf955f0af3ba5e..c9a2952c695d233347b92bb96eb2e6932518baea 100644 (file)
@@ -3,8 +3,6 @@
 //
 // RUN: %clangxx_xray -std=c++11 %s -o %t
 // RUN: XRAY_OPTIONS="patch_premain=false xray_naive_log=false" %run %t
-// FIXME: When we know why this fails in ppc, un-xfail it.
-// XFAIL: powerpc64le
 
 #include "xray/xray_interface.h"
 #include <algorithm>
   assert(all_instrumented.size() == __xray_max_function_id() &&
          "each function id must be assigned to a unique function");
 
-  std::set<void *> common;
-  std::set_intersection(all_instrumented.begin(), all_instrumented.end(),
-                        must_be_instrumented.begin(),
-                        must_be_instrumented.end(),
-                        std::inserter(common, common.begin()));
+  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);
   assert(
-      common == must_be_instrumented &&
+      not_instrumented.empty() &&
       "we should see all explicitly instrumented functions with function ids");
-  return common == must_be_instrumented ? 0 : 1;
+  return not_instrumented.empty() ? 0 : 1;
 }