| // RUN: %clang_cc1 -emit-llvm %s -std=c++11 -o - -fno-rtti \ |
| // RUN: -fprofile-instrument=clang -fcoverage-mapping -disable-llvm-passes \ |
| // RUN: -triple=x86_64-windows-msvc | FileCheck %s --check-prefix=MSVC |
| // RUN: %clang_cc1 -emit-llvm %s -std=c++11 -o - -fno-rtti \ |
| // RUN: -fprofile-instrument=clang -fcoverage-mapping -disable-llvm-passes \ |
| // RUN: -triple=x86_64-linux-gnu | FileCheck %s --check-prefix=LINUX |
| |
| // Check that clang doesn't emit counters or __profn_ variables for deleting |
| // destructor variants in both C++ ABIs. |
| |
| struct ABC { |
| virtual ~ABC() = default; |
| virtual void pure() = 0; |
| }; |
| struct DerivedABC : ABC { |
| ~DerivedABC() override = default; |
| void pure() override {} |
| }; |
| DerivedABC *useABCVTable() { return new DerivedABC(); } |
| |
| // MSVC-NOT: @"__profn_??_G{{.*}}" = |
| // MSVC: @"__profn_??1DerivedABC@@{{.*}}" = |
| // MSVC-NOT: @"__profn_??_G{{.*}}" = |
| // MSVC: @"__profn_??1ABC@@{{.*}}" = |
| // MSVC-NOT: @"__profn_??_G{{.*}}" = |
| |
| // MSVC-LABEL: define linkonce_odr dso_local i8* @"??_GDerivedABC@@UEAAPEAXI@Z"(%struct.DerivedABC* {{[^,]*}} %this, {{.*}}) |
| // MSVC-NOT: call void @llvm.instrprof.increment({{.*}}) |
| // MSVC: call void @"??1DerivedABC@@UEAA@XZ"({{.*}}) |
| // MSVC: ret void |
| |
| // MSVC-LABEL: define linkonce_odr dso_local i8* @"??_GABC@@UEAAPEAXI@Z"(%struct.ABC* {{[^,]*}} %this, {{.*}}) |
| // MSVC-NOT: call void @llvm.instrprof.increment({{.*}}) |
| // MSVC: call void @llvm.trap() |
| // MSVC-NEXT: unreachable |
| |
| // MSVC-LABEL: define linkonce_odr dso_local void @"??1DerivedABC@@UEAA@XZ"({{.*}}) |
| // MSVC: call void @llvm.instrprof.increment({{.*}}) |
| // MSVC: call void @"??1ABC@@UEAA@XZ"({{.*}}) |
| // MSVC: ret void |
| |
| // MSVC-LABEL: define linkonce_odr dso_local void @"??1ABC@@UEAA@XZ"({{.*}}) |
| // MSVC: call void @llvm.instrprof.increment({{.*}}) |
| // MSVC: ret void |
| |
| |
| // D2 is the base, D1 and D0 are deleting and complete dtors. |
| |
| // LINUX-NOT: @__profn_{{.*D[01]Ev}} = |
| // LINUX: @__profn__ZN10DerivedABCD2Ev = |
| // LINUX-NOT: @__profn_{{.*D[01]Ev}} = |
| // LINUX: @__profn__ZN3ABCD2Ev = |
| // LINUX-NOT: @__profn_{{.*D[01]Ev}} = |
| |
| // LINUX-LABEL: define linkonce_odr void @_ZN10DerivedABCD1Ev(%struct.DerivedABC* {{[^,]*}} %this) |
| // LINUX-NOT: call void @llvm.instrprof.increment({{.*}}) |
| // LINUX: call void @_ZN10DerivedABCD2Ev({{.*}}) |
| // LINUX: ret void |
| |
| // LINUX-LABEL: define linkonce_odr void @_ZN10DerivedABCD0Ev(%struct.DerivedABC* {{[^,]*}} %this) |
| // LINUX-NOT: call void @llvm.instrprof.increment({{.*}}) |
| // LINUX: call void @_ZN10DerivedABCD1Ev({{.*}}) |
| // LINUX: call void @_ZdlPv({{.*}}) |
| // LINUX: ret void |
| |
| // LINUX-LABEL: define linkonce_odr void @_ZN3ABCD1Ev(%struct.ABC* {{[^,]*}} %this) |
| // LINUX-NOT: call void @llvm.instrprof.increment({{.*}}) |
| // LINUX: call void @llvm.trap() |
| // LINUX-NEXT: unreachable |
| |
| // LINUX-LABEL: define linkonce_odr void @_ZN3ABCD0Ev(%struct.ABC* {{[^,]*}} %this) |
| // LINUX-NOT: call void @llvm.instrprof.increment({{.*}}) |
| // LINUX: call void @llvm.trap() |
| // LINUX-NEXT: unreachable |
| |
| // LINUX-LABEL: define linkonce_odr void @_ZN10DerivedABCD2Ev(%struct.DerivedABC* {{[^,]*}} %this) |
| // LINUX: call void @llvm.instrprof.increment({{.*}}) |
| // LINUX: call void @_ZN3ABCD2Ev({{.*}}) |
| // LINUX: ret void |
| |
| // LINUX-LABEL: define linkonce_odr void @_ZN3ABCD2Ev(%struct.ABC* {{[^,]*}} %this) |
| // LINUX: call void @llvm.instrprof.increment({{.*}}) |
| // LINUX: ret void |