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