16db8c59fSFangrui Song // Test to check if we handle pic code properly. 26db8c59fSFangrui Song 36db8c59fSFangrui Song // RUN: %clangxx_xray -fxray-instrument -std=c++11 -ffunction-sections \ 46db8c59fSFangrui Song // RUN: -fdata-sections -fpic -fpie -Wl,--gc-sections %s -o %t 56db8c59fSFangrui Song // RUN: rm -f pic-test-logging-* 6*02cdbc34SFangrui Song // RUN: XRAY_OPTIONS="patch_premain=true verbosity=1 xray_mode=xray-basic \ 76db8c59fSFangrui Song // RUN: xray_logfile_base=pic-test-logging-" %run %t 2>&1 | FileCheck %s 86db8c59fSFangrui Song // After all that, clean up the output xray log. 96db8c59fSFangrui Song // 106db8c59fSFangrui Song // RUN: rm -f pic-test-logging-* 116db8c59fSFangrui Song 126db8c59fSFangrui Song // UNSUPPORTED: target-is-mips64,target-is-mips64el 136db8c59fSFangrui Song 146db8c59fSFangrui Song #include <cstdio> 156db8c59fSFangrui Song 166db8c59fSFangrui Song [[clang::xray_always_instrument]] 176db8c59fSFangrui Song unsigned short foo (unsigned b); 186db8c59fSFangrui Song 196db8c59fSFangrui Song [[clang::xray_always_instrument]] bar(unsigned short a)206db8c59fSFangrui Songunsigned short bar (unsigned short a) 216db8c59fSFangrui Song { 226db8c59fSFangrui Song printf("bar() is always instrumented!\n"); 236db8c59fSFangrui Song return foo(a); 246db8c59fSFangrui Song } 256db8c59fSFangrui Song foo(unsigned b)266db8c59fSFangrui Songunsigned short foo (unsigned b) 276db8c59fSFangrui Song { 286db8c59fSFangrui Song printf("foo() is always instrumented!\n"); 296db8c59fSFangrui Song return b + b + 5; 306db8c59fSFangrui Song } 316db8c59fSFangrui Song main()326db8c59fSFangrui Songint main () 336db8c59fSFangrui Song { 346db8c59fSFangrui Song // CHECK: XRay: Log file in 'pic-test-logging-{{.*}}' 356db8c59fSFangrui Song bar(10); 366db8c59fSFangrui Song // CHECK: bar() is always instrumented! 376db8c59fSFangrui Song // CHECK-NEXT: foo() is always instrumented! 386db8c59fSFangrui Song } 39