xref: /aosp_15_r20/external/compiler-rt/test/cfi/cross-dso/stats.cpp (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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 Robot extern "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 Robot extern "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 Robot extern "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 Robot extern "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 Robot extern "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 Robot int 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