1*67e74705SXin Li // Tests for instrumentation of C++ methods, constructors, and destructors.
2*67e74705SXin Li
3*67e74705SXin Li // RUN: %clang_cc1 %s -o - -emit-llvm -fprofile-instrument=clang -triple %itanium_abi_triple > %tgen
4*67e74705SXin Li // RUN: FileCheck --input-file=%tgen -check-prefix=CTRGEN %s
5*67e74705SXin Li // RUN: FileCheck --input-file=%tgen -check-prefix=DTRGEN %s
6*67e74705SXin Li // RUN: FileCheck --input-file=%tgen -check-prefix=MTHGEN %s
7*67e74705SXin Li // RUN: FileCheck --input-file=%tgen -check-prefix=WRPGEN %s
8*67e74705SXin Li
9*67e74705SXin Li // RUN: llvm-profdata merge %S/Inputs/cxx-class.proftext -o %t.profdata
10*67e74705SXin Li // RUN: %clang_cc1 %s -o - -emit-llvm -fprofile-instrument-use-path=%t.profdata -triple %itanium_abi_triple > %tuse
11*67e74705SXin Li // RUN: FileCheck --input-file=%tuse -check-prefix=CTRUSE %s
12*67e74705SXin Li // RUN: FileCheck --input-file=%tuse -check-prefix=DTRUSE %s
13*67e74705SXin Li // RUN: FileCheck --input-file=%tuse -check-prefix=MTHUSE %s
14*67e74705SXin Li // RUN: FileCheck --input-file=%tuse -check-prefix=WRPUSE %s
15*67e74705SXin Li
16*67e74705SXin Li class Simple {
17*67e74705SXin Li int Member;
18*67e74705SXin Li public:
19*67e74705SXin Li // CTRGEN-LABEL: define {{.*}} @_ZN6SimpleC2Ei(
20*67e74705SXin Li // CTRUSE-LABEL: define {{.*}} @_ZN6SimpleC2Ei(
21*67e74705SXin Li // CTRGEN: store {{.*}} @[[SCC:__profc__ZN6SimpleC2Ei]], i64 0, i64 0
Simple(int Member)22*67e74705SXin Li explicit Simple(int Member) : Member(Member) {
23*67e74705SXin Li // CTRGEN: store {{.*}} @[[SCC]], i64 0, i64 1
24*67e74705SXin Li // CTRUSE: br {{.*}} !prof ![[SC1:[0-9]+]]
25*67e74705SXin Li if (Member) {}
26*67e74705SXin Li // CTRGEN-NOT: store {{.*}} @[[SCC]],
27*67e74705SXin Li // CTRUSE-NOT: br {{.*}} !prof ![0-9]+
28*67e74705SXin Li // CTRUSE: ret
29*67e74705SXin Li }
30*67e74705SXin Li // CTRUSE: ![[SC1]] = !{!"branch_weights", i32 100, i32 2}
31*67e74705SXin Li
32*67e74705SXin Li // DTRGEN-LABEL: define {{.*}} @_ZN6SimpleD2Ev(
33*67e74705SXin Li // DTRUSE-LABEL: define {{.*}} @_ZN6SimpleD2Ev(
34*67e74705SXin Li // DTRGEN: store {{.*}} @[[SDC:__profc__ZN6SimpleD2Ev]], i64 0, i64 0
~Simple()35*67e74705SXin Li ~Simple() {
36*67e74705SXin Li // DTRGEN: store {{.*}} @[[SDC]], i64 0, i64 1
37*67e74705SXin Li // DTRUSE: br {{.*}} !prof ![[SD1:[0-9]+]]
38*67e74705SXin Li if (Member) {}
39*67e74705SXin Li // DTRGEN-NOT: store {{.*}} @[[SDC]],
40*67e74705SXin Li // DTRUSE-NOT: br {{.*}} !prof ![0-9]+
41*67e74705SXin Li // DTRUSE: ret
42*67e74705SXin Li }
43*67e74705SXin Li // DTRUSE: ![[SD1]] = !{!"branch_weights", i32 100, i32 2}
44*67e74705SXin Li
45*67e74705SXin Li // MTHGEN-LABEL: define {{.*}} @_ZN6Simple6methodEv(
46*67e74705SXin Li // MTHUSE-LABEL: define {{.*}} @_ZN6Simple6methodEv(
47*67e74705SXin Li // MTHGEN: store {{.*}} @[[SMC:__profc__ZN6Simple6methodEv]], i64 0, i64 0
method()48*67e74705SXin Li void method() {
49*67e74705SXin Li // MTHGEN: store {{.*}} @[[SMC]], i64 0, i64 1
50*67e74705SXin Li // MTHUSE: br {{.*}} !prof ![[SM1:[0-9]+]]
51*67e74705SXin Li if (Member) {}
52*67e74705SXin Li // MTHGEN-NOT: store {{.*}} @[[SMC]],
53*67e74705SXin Li // MTHUSE-NOT: br {{.*}} !prof ![0-9]+
54*67e74705SXin Li // MTHUSE: ret
55*67e74705SXin Li }
56*67e74705SXin Li // MTHUSE: ![[SM1]] = !{!"branch_weights", i32 100, i32 2}
57*67e74705SXin Li };
58*67e74705SXin Li
59*67e74705SXin Li // WRPGEN-LABEL: define {{.*}} @_Z14simple_wrapperv(
60*67e74705SXin Li // WRPUSE-LABEL: define {{.*}} @_Z14simple_wrapperv(
61*67e74705SXin Li // WRPGEN: store {{.*}} @[[SWC:__profc__Z14simple_wrapperv]], i64 0, i64 0
simple_wrapper()62*67e74705SXin Li void simple_wrapper() {
63*67e74705SXin Li // WRPGEN: store {{.*}} @[[SWC]], i64 0, i64 1
64*67e74705SXin Li // WRPUSE: br {{.*}} !prof ![[SW1:[0-9]+]]
65*67e74705SXin Li for (int I = 0; I < 100; ++I) {
66*67e74705SXin Li Simple S(I);
67*67e74705SXin Li S.method();
68*67e74705SXin Li }
69*67e74705SXin Li // WRPGEN-NOT: store {{.*}} @[[SWC]],
70*67e74705SXin Li // WRPUSE-NOT: br {{.*}} !prof ![0-9]+
71*67e74705SXin Li // WRPUSE: ret
72*67e74705SXin Li }
73*67e74705SXin Li // WRPUSE: ![[SW1]] = !{!"branch_weights", i32 101, i32 2}
74*67e74705SXin Li
main(int argc,const char * argv[])75*67e74705SXin Li int main(int argc, const char *argv[]) {
76*67e74705SXin Li simple_wrapper();
77*67e74705SXin Li return 0;
78*67e74705SXin Li }
79