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