1 | // Allow having both the no-arg and arg1 logging implementation live together, |
2 | // and be called in the correct cases. |
3 | // |
4 | // RUN: rm -f arg0-arg1-logging-* |
5 | // RUN: %clangxx_xray -std=c++11 %s -o %t |
6 | // RUN: XRAY_OPTIONS="patch_premain=true verbosity=1 xray_logfile_base=arg0-arg1-logging-" %run %t |
7 | |
8 | // REQUIRES: target={{(aarch64|x86_64)-.*}} |
9 | |
10 | #include "xray/xray_interface.h" |
11 | #include <cassert> |
12 | #include <cstdio> |
13 | |
14 | using namespace std; |
15 | |
16 | bool arg0loggercalled = false; |
17 | void arg0logger(int32_t, XRayEntryType) { arg0loggercalled = true; } |
18 | |
19 | [[clang::xray_always_instrument]] void arg0fn() { printf(format: "hello, arg0!\n" ); } |
20 | |
21 | bool arg1loggercalled = false; |
22 | void arg1logger(int32_t, XRayEntryType, uint64_t) { arg1loggercalled = true; } |
23 | |
24 | [[ clang::xray_always_instrument, clang::xray_log_args(1) ]] void |
25 | arg1fn(uint64_t arg1) { |
26 | printf(format: "hello, arg1!\n" ); |
27 | } |
28 | |
29 | int main(int argc, char *argv[]) { |
30 | __xray_set_handler(entry: arg0logger); |
31 | __xray_set_handler_arg1(entry: arg1logger); |
32 | arg0fn(); |
33 | arg1fn(arg1: 0xcafef00d); |
34 | __xray_remove_handler_arg1(); |
35 | __xray_remove_handler(); |
36 | assert(arg0loggercalled && arg1loggercalled); |
37 | } |
38 | |