1 // Check that we can patch and un-patch on demand, and that logging gets invoked
2 // appropriately.
3 //
4 // RUN: %clangxx_xray -fxray-instrument -std=c++11 %s -o %t
5 // RUN: XRAY_OPTIONS="patch_premain=false" %run %t 2>&1 | FileCheck %s
6 
7 // UNSUPPORTED: target-is-mips64,target-is-mips64el
8 
9 #include "xray/xray_interface.h"
10 
11 #include <cstdio>
12 
13 bool called = false;
14 
15 void test_handler(int32_t fid, XRayEntryType type) {
16   printf("called: %d, type=%d\n", fid, static_cast<int32_t>(type));
17   called = true;
18 }
19 
20 [[clang::xray_always_instrument]] void always_instrument() {
21   printf("always instrumented called\n");
22 }
23 
24 int main() {
25   __xray_set_handler(test_handler);
26   always_instrument();
27   // CHECK: always instrumented called
28   auto status = __xray_patch();
29   printf("patching status: %d\n", static_cast<int32_t>(status));
30   // CHECK-NEXT: patching status: 1
31   always_instrument();
32   // CHECK-NEXT: called: {{.*}}, type=0
33   // CHECK-NEXT: always instrumented called
34   // CHECK-NEXT: called: {{.*}}, type=1
35   status = __xray_unpatch();
36   printf("patching status: %d\n", static_cast<int32_t>(status));
37   // CHECK-NEXT: patching status: 1
38   always_instrument();
39   // CHECK-NEXT: always instrumented called
40   status = __xray_patch();
41   printf("patching status: %d\n", static_cast<int32_t>(status));
42   // CHECK-NEXT: patching status: 1
43   __xray_remove_handler();
44   always_instrument();
45   // CHECK-NEXT: always instrumented called
46   status = __xray_unpatch();
47   printf("patching status: %d\n", static_cast<int32_t>(status));
48   // CHECK-NEXT: patching status: 1
49 }
50