16db8c59fSFangrui Song // Make sure we're aligning the stack properly when lowering the custom event 26db8c59fSFangrui Song // calls. 36db8c59fSFangrui Song // 46db8c59fSFangrui Song // RUN: %clangxx_xray -std=c++11 %s -o %t 5*02cdbc34SFangrui Song // RUN: XRAY_OPTIONS="patch_premain=false verbosity=1" \ 66db8c59fSFangrui Song // RUN: %run %t 2>&1 76db8c59fSFangrui Song // REQUIRES: x86_64-target-arch 86db8c59fSFangrui Song // REQUIRES: built-in-llvm-tree 96db8c59fSFangrui Song #include <xmmintrin.h> 106db8c59fSFangrui Song #include <stdio.h> 116db8c59fSFangrui Song #include "xray/xray_interface.h" 126db8c59fSFangrui Song f(__m128 * i)136db8c59fSFangrui Song[[clang::xray_never_instrument]] __attribute__((weak)) __m128 f(__m128 *i) { 146db8c59fSFangrui Song return *i; 156db8c59fSFangrui Song } 166db8c59fSFangrui Song foo()176db8c59fSFangrui Song[[clang::xray_always_instrument]] void foo() { 186db8c59fSFangrui Song __xray_customevent(0, 0); 196db8c59fSFangrui Song __m128 v = {}; 206db8c59fSFangrui Song f(&v); 216db8c59fSFangrui Song } 226db8c59fSFangrui Song bar()236db8c59fSFangrui Song[[clang::xray_always_instrument]] void bar() { 246db8c59fSFangrui Song __xray_customevent(0, 0); 256db8c59fSFangrui Song } 266db8c59fSFangrui Song printer(void * ptr,size_t size)276db8c59fSFangrui Songvoid printer(void* ptr, size_t size) { 286db8c59fSFangrui Song printf("handler called\n"); 296db8c59fSFangrui Song __m128 v = {}; 306db8c59fSFangrui Song f(&v); 316db8c59fSFangrui Song } 326db8c59fSFangrui Song main(int argc,char * argv[])336db8c59fSFangrui Songint main(int argc, char* argv[]) { 346db8c59fSFangrui Song __xray_set_customevent_handler(printer); 356db8c59fSFangrui Song __xray_patch(); 366db8c59fSFangrui Song foo(); // CHECK: handler called 376db8c59fSFangrui Song bar(); // CHECK: handler called 386db8c59fSFangrui Song __xray_unpatch(); 396db8c59fSFangrui Song __xray_remove_customevent_handler(); 406db8c59fSFangrui Song foo(); 416db8c59fSFangrui Song bar(); 426db8c59fSFangrui Song } 43