1*6db8c59fSFangrui Song // Intercept the implicit 'this' argument of class member functions. 2*6db8c59fSFangrui Song // 3*6db8c59fSFangrui Song // RUN: %clangxx_xray -g -std=c++11 %s -o %t 4*6db8c59fSFangrui Song // RUN: rm -f log-args-this-* 5*6db8c59fSFangrui Song // RUN: XRAY_OPTIONS="patch_premain=true verbosity=1 xray_logfile_base=log-args-this-" %run %t 6*6db8c59fSFangrui Song // 7*6db8c59fSFangrui Song // XFAIL: FreeBSD || arm || aarch64 || mips 8*6db8c59fSFangrui Song // UNSUPPORTED: powerpc64le 9*6db8c59fSFangrui Song #include "xray/xray_interface.h" 10*6db8c59fSFangrui Song #include <cassert> 11*6db8c59fSFangrui Song 12*6db8c59fSFangrui Song class A { 13*6db8c59fSFangrui Song public: f()14*6db8c59fSFangrui Song [[clang::xray_always_instrument, clang::xray_log_args(1)]] void f() { 15*6db8c59fSFangrui Song // does nothing. 16*6db8c59fSFangrui Song } 17*6db8c59fSFangrui Song }; 18*6db8c59fSFangrui Song 19*6db8c59fSFangrui Song volatile uint64_t captured = 0; 20*6db8c59fSFangrui Song handler(int32_t,XRayEntryType,uint64_t arg1)21*6db8c59fSFangrui Songvoid handler(int32_t, XRayEntryType, uint64_t arg1) { 22*6db8c59fSFangrui Song captured = arg1; 23*6db8c59fSFangrui Song } 24*6db8c59fSFangrui Song main()25*6db8c59fSFangrui Songint main() { 26*6db8c59fSFangrui Song __xray_set_handler_arg1(handler); 27*6db8c59fSFangrui Song A instance; 28*6db8c59fSFangrui Song instance.f(); 29*6db8c59fSFangrui Song __xray_remove_handler_arg1(); 30*6db8c59fSFangrui Song assert(captured == (uint64_t)&instance); 31*6db8c59fSFangrui Song } 32