Index: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp +++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp @@ -771,14 +771,14 @@ // If so, instrument only base variant, others are implemented by delegation // to the base one, it would be counted twice otherwise. if (CGM.getTarget().getCXXABI().hasConstructorVariants()) { - if (isa(D) && GD.getDtorType() != Dtor_Base) - return; - if (const auto *CCD = dyn_cast(D)) if (GD.getCtorType() != Ctor_Base && CodeGenFunction::IsConstructorDelegationValid(CCD)) return; } + if (isa(D) && GD.getDtorType() != Dtor_Base) + return; + CGM.ClearUnusedCoverageMapping(D); setFuncName(Fn); Index: cfe/trunk/test/Profile/cxx-abc-deleting-dtor.cpp =================================================================== --- cfe/trunk/test/Profile/cxx-abc-deleting-dtor.cpp +++ cfe/trunk/test/Profile/cxx-abc-deleting-dtor.cpp @@ -0,0 +1,83 @@ +// 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