1*7c3d14c8STreehugger Robot // RUN: %clangxx_cfi_dso -DSHARED_LIB -fPIC -g -fsanitize-stats -shared -o %t.so %s 2*7c3d14c8STreehugger Robot // RUN: %clangxx_cfi_dso -g -fsanitize-stats -o %t %s %t.so 3*7c3d14c8STreehugger Robot // RUN: env SANITIZER_STATS_PATH=%t.stats %t 4*7c3d14c8STreehugger Robot // RUN: sanstats %t.stats | FileCheck %s 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot struct ABase {}; 7*7c3d14c8STreehugger Robot 8*7c3d14c8STreehugger Robot struct A : ABase { vfA9*7c3d14c8STreehugger Robot virtual void vf() {} nvfA10*7c3d14c8STreehugger Robot void nvf() {} 11*7c3d14c8STreehugger Robot }; 12*7c3d14c8STreehugger Robot 13*7c3d14c8STreehugger Robot extern "C" void vcall(A *a); 14*7c3d14c8STreehugger Robot extern "C" void nvcall(A *a); 15*7c3d14c8STreehugger Robot 16*7c3d14c8STreehugger Robot #ifdef SHARED_LIB 17*7c3d14c8STreehugger Robot vcall(A * a)18*7c3d14c8STreehugger Robotextern "C" __attribute__((noinline)) void vcall(A *a) { 19*7c3d14c8STreehugger Robot // CHECK: stats.cpp:[[@LINE+1]] vcall cfi-vcall 37 20*7c3d14c8STreehugger Robot a->vf(); 21*7c3d14c8STreehugger Robot } 22*7c3d14c8STreehugger Robot nvcall(A * a)23*7c3d14c8STreehugger Robotextern "C" __attribute__((noinline)) void nvcall(A *a) { 24*7c3d14c8STreehugger Robot // CHECK: stats.cpp:[[@LINE+1]] nvcall cfi-nvcall 51 25*7c3d14c8STreehugger Robot a->nvf(); 26*7c3d14c8STreehugger Robot } 27*7c3d14c8STreehugger Robot 28*7c3d14c8STreehugger Robot #else 29*7c3d14c8STreehugger Robot dcast(A * a)30*7c3d14c8STreehugger Robotextern "C" __attribute__((noinline)) A *dcast(A *a) { 31*7c3d14c8STreehugger Robot // CHECK: stats.cpp:[[@LINE+1]] dcast cfi-derived-cast 24 32*7c3d14c8STreehugger Robot return (A *)(ABase *)a; 33*7c3d14c8STreehugger Robot } 34*7c3d14c8STreehugger Robot ucast(A * a)35*7c3d14c8STreehugger Robotextern "C" __attribute__((noinline)) A *ucast(A *a) { 36*7c3d14c8STreehugger Robot // CHECK: stats.cpp:[[@LINE+1]] ucast cfi-unrelated-cast 81 37*7c3d14c8STreehugger Robot return (A *)(char *)a; 38*7c3d14c8STreehugger Robot } 39*7c3d14c8STreehugger Robot unreachable(A * a)40*7c3d14c8STreehugger Robotextern "C" __attribute__((noinline)) void unreachable(A *a) { 41*7c3d14c8STreehugger Robot // CHECK-NOT: unreachable 42*7c3d14c8STreehugger Robot a->vf(); 43*7c3d14c8STreehugger Robot } 44*7c3d14c8STreehugger Robot main()45*7c3d14c8STreehugger Robotint main() { 46*7c3d14c8STreehugger Robot A a; 47*7c3d14c8STreehugger Robot for (unsigned i = 0; i != 37; ++i) 48*7c3d14c8STreehugger Robot vcall(&a); 49*7c3d14c8STreehugger Robot for (unsigned i = 0; i != 51; ++i) 50*7c3d14c8STreehugger Robot nvcall(&a); 51*7c3d14c8STreehugger Robot for (unsigned i = 0; i != 24; ++i) 52*7c3d14c8STreehugger Robot dcast(&a); 53*7c3d14c8STreehugger Robot for (unsigned i = 0; i != 81; ++i) 54*7c3d14c8STreehugger Robot ucast(&a); 55*7c3d14c8STreehugger Robot for (unsigned i = 0; i != 0; ++i) 56*7c3d14c8STreehugger Robot unreachable(&a); 57*7c3d14c8STreehugger Robot } 58*7c3d14c8STreehugger Robot 59*7c3d14c8STreehugger Robot #endif 60