diff options
author | Dean Michael Berris <dberris@google.com> | 2016-08-08 03:10:22 +0000 |
---|---|---|
committer | Dean Michael Berris <dberris@google.com> | 2016-08-08 03:10:22 +0000 |
commit | 68e74847bf211cdf3e4e53f8676f81c536fd39fc (patch) | |
tree | 7780e2326ebf392028eaec0c951fc6a5e96a9fda /compiler-rt/test/xray/TestCases/Linux/patching-unpatching.cc | |
parent | 1d711627b4977ff9aef83d61c5fc0c510f561dcb (diff) | |
download | bcm5719-llvm-68e74847bf211cdf3e4e53f8676f81c536fd39fc.tar.gz bcm5719-llvm-68e74847bf211cdf3e4e53f8676f81c536fd39fc.zip |
[compiler-rt][XRay] Implement __xray_unpatch() and __xray_remove_handler()
Summary:
We also add one test (and the XRay testing infrastructure) to exercise
the patching and unpatching code. This uses the XRay API exported
through the headers as well, installing a custom log handler.
Depends on D23101 for the updated emitted code alignment for the
return/entry sleds.
Reviewers: rSerge, echristo, rnk
Subscribers: tberghammer, danalbert, srhines, mehdi_amini, llvm-commits
Differential Revision: https://reviews.llvm.org/D23154
llvm-svn: 277971
Diffstat (limited to 'compiler-rt/test/xray/TestCases/Linux/patching-unpatching.cc')
-rw-r--r-- | compiler-rt/test/xray/TestCases/Linux/patching-unpatching.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/compiler-rt/test/xray/TestCases/Linux/patching-unpatching.cc b/compiler-rt/test/xray/TestCases/Linux/patching-unpatching.cc new file mode 100644 index 00000000000..05478a48805 --- /dev/null +++ b/compiler-rt/test/xray/TestCases/Linux/patching-unpatching.cc @@ -0,0 +1,47 @@ +// Check that we can patch and un-patch on demand, and that logging gets invoked +// appropriately. +// +// RUN: %clangxx_xray -fxray-instrument -std=c++11 %s -o %t +// RUN: XRAY_OPTIONS="patch_premain=false" %run %t 2>&1 | FileCheck %s + +#include "xray/xray_interface.h" + +#include <cstdio> + +bool called = false; + +void test_handler(int32_t fid, XRayEntryType type) { + printf("called: %d, type=%d\n", fid, static_cast<int32_t>(type)); + called = true; +} + +[[clang::xray_always_instrument]] void always_instrument() { + printf("always instrumented called\n"); +} + +int main() { + __xray_set_handler(test_handler); + always_instrument(); + // CHECK: always instrumented called + auto status = __xray_patch(); + printf("patching status: %d\n", static_cast<int32_t>(status)); + // CHECK-NEXT: patching status: 1 + always_instrument(); + // CHECK-NEXT: called: {{.*}}, type=0 + // CHECK-NEXT: always instrumented called + // CHECK-NEXT: called: {{.*}}, type=1 + status = __xray_unpatch(); + printf("patching status: %d\n", static_cast<int32_t>(status)); + // CHECK-NEXT: patching status: 1 + always_instrument(); + // CHECK-NEXT: always instrumented called + status = __xray_patch(); + printf("patching status: %d\n", static_cast<int32_t>(status)); + // CHECK-NEXT: patching status: 1 + __xray_remove_handler(); + always_instrument(); + // CHECK-NEXT: always instrumented called + status = __xray_unpatch(); + printf("patching status: %d\n", static_cast<int32_t>(status)); + // CHECK-NEXT: patching status: 1 +} |