1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Tests for instrumentation of C++ methods, constructors, and destructors.
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang %s -o - -emit-llvm -S -fprofile-instr-generate -fno-exceptions -target %itanium_abi_triple > %tgen
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tgen -check-prefix=CTRGEN %s
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tgen -check-prefix=DTRGEN %s
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tgen -check-prefix=MTHGEN %s
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tgen -check-prefix=WRPGEN %s
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: llvm-profdata merge %S/Inputs/cxx-class.proftext -o %t.profdata
106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang %s -o - -emit-llvm -S -fprofile-instr-use=%t.profdata -fno-exceptions -target %itanium_abi_triple > %tuse
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tuse -check-prefix=CTRUSE %s
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tuse -check-prefix=DTRUSE %s
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tuse -check-prefix=MTHUSE %s
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck --input-file=%tuse -check-prefix=WRPUSE %s
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass Simple {
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int Member;
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CTRGEN-LABEL: define {{.*}} @_ZN6SimpleC2Ei(
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CTRUSE-LABEL: define {{.*}} @_ZN6SimpleC2Ei(
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CTRGEN: store {{.*}} @[[SCC:__llvm_profile_counters__ZN6SimpleC2Ei]], i64 0, i64 0
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit Simple(int Member) : Member(Member) {
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // CTRGEN: store {{.*}} @[[SCC]], i64 0, i64 1
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // CTRUSE: br {{.*}} !prof ![[SC1:[0-9]+]]
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member) {}
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // CTRGEN-NOT: store {{.*}} @[[SCC]],
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // CTRUSE-NOT: br {{.*}} !prof ![0-9]+
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // CTRUSE: ret
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CTRUSE: ![[SC1]] = metadata !{metadata !"branch_weights", i32 100, i32 2}
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // DTRGEN-LABEL: define {{.*}} @_ZN6SimpleD2Ev(
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // DTRUSE-LABEL: define {{.*}} @_ZN6SimpleD2Ev(
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // DTRGEN: store {{.*}} @[[SDC:__llvm_profile_counters__ZN6SimpleD2Ev]], i64 0, i64 0
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ~Simple() {
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // DTRGEN: store {{.*}} @[[SDC]], i64 0, i64 1
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // DTRUSE: br {{.*}} !prof ![[SD1:[0-9]+]]
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member) {}
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // DTRGEN-NOT: store {{.*}} @[[SDC]],
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // DTRUSE-NOT: br {{.*}} !prof ![0-9]+
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // DTRUSE: ret
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // DTRUSE: ![[SD1]] = metadata !{metadata !"branch_weights", i32 100, i32 2}
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // MTHGEN-LABEL: define {{.*}} @_ZN6Simple6methodEv(
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // MTHUSE-LABEL: define {{.*}} @_ZN6Simple6methodEv(
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // MTHGEN: store {{.*}} @[[SMC:__llvm_profile_counters__ZN6Simple6methodEv]], i64 0, i64 0
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void method() {
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // MTHGEN: store {{.*}} @[[SMC]], i64 0, i64 1
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // MTHUSE: br {{.*}} !prof ![[SM1:[0-9]+]]
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Member) {}
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // MTHGEN-NOT: store {{.*}} @[[SMC]],
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // MTHUSE-NOT: br {{.*}} !prof ![0-9]+
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // MTHUSE: ret
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // MTHUSE: ![[SM1]] = metadata !{metadata !"branch_weights", i32 100, i32 2}
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// WRPGEN-LABEL: define {{.*}} @_Z14simple_wrapperv(
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// WRPUSE-LABEL: define {{.*}} @_Z14simple_wrapperv(
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// WRPGEN: store {{.*}} @[[SWC:__llvm_profile_counters__Z14simple_wrapperv]], i64 0, i64 0
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid simple_wrapper() {
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // WRPGEN: store {{.*}} @[[SWC]], i64 0, i64 1
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // WRPUSE: br {{.*}} !prof ![[SW1:[0-9]+]]
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (int I = 0; I < 100; ++I) {
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Simple S(I);
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    S.method();
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // WRPGEN-NOT: store {{.*}} @[[SWC]],
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // WRPUSE-NOT: br {{.*}} !prof ![0-9]+
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // WRPUSE: ret
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// WRPUSE: ![[SW1]] = metadata !{metadata !"branch_weights", i32 101, i32 2}
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint main(int argc, const char *argv[]) {
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  simple_wrapper();
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return 0;
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
79