aboutsummaryrefslogtreecommitdiff
path: root/test/xray/TestCases/Linux
diff options
context:
space:
mode:
Diffstat (limited to 'test/xray/TestCases/Linux')
-rw-r--r--test/xray/TestCases/Linux/coverage-sample.cc3
-rw-r--r--test/xray/TestCases/Linux/custom-event-logging.cc40
-rw-r--r--test/xray/TestCases/Linux/func-id-utils.cc24
3 files changed, 55 insertions, 12 deletions
diff --git a/test/xray/TestCases/Linux/coverage-sample.cc b/test/xray/TestCases/Linux/coverage-sample.cc
index df23d9f738de..623b4e34541b 100644
--- a/test/xray/TestCases/Linux/coverage-sample.cc
+++ b/test/xray/TestCases/Linux/coverage-sample.cc
@@ -2,9 +2,6 @@
//
// RUN: %clangxx_xray -std=c++11 %s -o %t
// RUN: XRAY_OPTIONS="patch_premain=false xray_naive_log=false" %run %t | FileCheck %s
-// FIXME: When run this test case causes a segementation fault on powerpc64le.
-// Remove the xfail when the problem is fixed.
-// XFAIL: powerpc64le
#include "xray/xray_interface.h"
diff --git a/test/xray/TestCases/Linux/custom-event-logging.cc b/test/xray/TestCases/Linux/custom-event-logging.cc
new file mode 100644
index 000000000000..b1a766d46045
--- /dev/null
+++ b/test/xray/TestCases/Linux/custom-event-logging.cc
@@ -0,0 +1,40 @@
+// Use the clang feature for custom xray event logging.
+//
+// RUN: %clangxx_xray -std=c++11 %s -o %t
+// RUN: XRAY_OPTIONS="patch_premain=false verbosity=1 xray_naive_log=false xray_logfile_base=custom-event-logging.xray-" %run %t 2>&1 | FileCheck %s
+// FIXME: Support this in non-x86_64 as well
+// REQUIRES: x86_64-linux
+// REQUIRES: built-in-llvm-tree
+#include <cstdio>
+#include "xray/xray_interface.h"
+
+[[clang::xray_always_instrument]] void foo() {
+ static constexpr char CustomLogged[] = "hello custom logging!";
+ printf("before calling the custom logging...\n");
+ __xray_customevent(CustomLogged, sizeof(CustomLogged));
+ printf("after calling the custom logging...\n");
+}
+
+void myprinter(void* ptr, size_t size) {
+ printf("%.*s\n", static_cast<int>(size), static_cast<const char*>(ptr));
+}
+
+int main() {
+ foo();
+ // CHECK: before calling the custom logging...
+ // CHECK-NEXT: after calling the custom logging...
+ printf("setting up custom event handler...\n");
+ // CHECK-NEXT: setting up custom event handler...
+ __xray_set_customevent_handler(myprinter);
+ __xray_patch();
+ // CHECK-NEXT: before calling the custom logging...
+ foo();
+ // CHECK-NEXT: hello custom logging!
+ // CHECK-NEXT: after calling the custom logging...
+ printf("removing custom event handler...\n");
+ // CHECK-NEXT: removing custom event handler...
+ __xray_set_customevent_handler(nullptr);
+ foo();
+ // CHECK-NEXT: before calling the custom logging...
+ // CHECK-NEXT: after calling the custom logging...
+}
diff --git a/test/xray/TestCases/Linux/func-id-utils.cc b/test/xray/TestCases/Linux/func-id-utils.cc
index 82ba34d30acc..c9a2952c695d 100644
--- a/test/xray/TestCases/Linux/func-id-utils.cc
+++ b/test/xray/TestCases/Linux/func-id-utils.cc
@@ -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>
@@ -32,13 +30,21 @@
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;
}