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 Song void handler(int32_t, XRayEntryType, uint64_t arg1) {
22*6db8c59fSFangrui Song   captured = arg1;
23*6db8c59fSFangrui Song }
24*6db8c59fSFangrui Song 
main()25*6db8c59fSFangrui Song int 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