This revision was automatically updated to reflect the committed changes. Closed by commit rG705a6aef3502: [MS] Emit exported complete/vbase destructors (authored by rnk).
Changed prior to commit: https://reviews.llvm.org/D70931?vs=231796&id=231998#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D70931/new/ https://reviews.llvm.org/D70931 Files: clang/lib/CodeGen/MicrosoftCXXABI.cpp clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp Index: clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp =================================================================== --- clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp +++ clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp @@ -19,9 +19,9 @@ virtual ~ImportOverrideVDtor() {} }; -// Virtually inherits from a non-dllimport base class. This time we need to call -// the complete destructor and emit it inline. It's not exported from the DLL, -// and it must be emitted. +// Virtually inherits from a non-dllimport base class. In this case, we can +// expect the DLL to provide a definition of the complete dtor. See +// dllexport-dtor-thunks.cpp. struct __declspec(dllimport) ImportVBaseOverrideVDtor : public virtual BaseClass { virtual ~ImportVBaseOverrideVDtor() {} Index: clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp =================================================================== --- clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp +++ clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp @@ -1,5 +1,12 @@ // RUN: %clang_cc1 -mconstructor-aliases -fms-extensions %s -emit-llvm -o - -triple x86_64-windows-msvc | FileCheck %s +namespace test1 { +struct A { ~A(); }; +struct __declspec(dllexport) B : virtual A { }; +// CHECK: define weak_odr dso_local dllexport void @"??1B@test1@@QEAA@XZ" +// CHECK: define weak_odr dso_local dllexport void @"??_DB@test1@@QEAAXXZ" +} + struct __declspec(dllexport) A { virtual ~A(); }; struct __declspec(dllexport) B { virtual ~B(); }; struct __declspec(dllexport) C : A, B { virtual ~C(); }; Index: clang/lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1343,6 +1343,13 @@ // The TU defining a dtor is only guaranteed to emit a base destructor. All // other destructor variants are delegating thunks. CGM.EmitGlobal(GlobalDecl(D, Dtor_Base)); + + // If the class is dllexported, emit the complete (vbase) destructor wherever + // the base dtor is emitted. + // FIXME: To match MSVC, this should only be done when the class is exported + // with -fdllexport-inlines enabled. + if (D->getParent()->getNumVBases() > 0 && D->hasAttr<DLLExportAttr>()) + CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete)); } CharUnits
Index: clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp =================================================================== --- clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp +++ clang/test/CodeGenCXX/dllimport-dtor-thunks.cpp @@ -19,9 +19,9 @@ virtual ~ImportOverrideVDtor() {} }; -// Virtually inherits from a non-dllimport base class. This time we need to call -// the complete destructor and emit it inline. It's not exported from the DLL, -// and it must be emitted. +// Virtually inherits from a non-dllimport base class. In this case, we can +// expect the DLL to provide a definition of the complete dtor. See +// dllexport-dtor-thunks.cpp. struct __declspec(dllimport) ImportVBaseOverrideVDtor : public virtual BaseClass { virtual ~ImportVBaseOverrideVDtor() {} Index: clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp =================================================================== --- clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp +++ clang/test/CodeGenCXX/dllexport-dtor-thunks.cpp @@ -1,5 +1,12 @@ // RUN: %clang_cc1 -mconstructor-aliases -fms-extensions %s -emit-llvm -o - -triple x86_64-windows-msvc | FileCheck %s +namespace test1 { +struct A { ~A(); }; +struct __declspec(dllexport) B : virtual A { }; +// CHECK: define weak_odr dso_local dllexport void @"??1B@test1@@QEAA@XZ" +// CHECK: define weak_odr dso_local dllexport void @"??_DB@test1@@QEAAXXZ" +} + struct __declspec(dllexport) A { virtual ~A(); }; struct __declspec(dllexport) B { virtual ~B(); }; struct __declspec(dllexport) C : A, B { virtual ~C(); }; Index: clang/lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1343,6 +1343,13 @@ // The TU defining a dtor is only guaranteed to emit a base destructor. All // other destructor variants are delegating thunks. CGM.EmitGlobal(GlobalDecl(D, Dtor_Base)); + + // If the class is dllexported, emit the complete (vbase) destructor wherever + // the base dtor is emitted. + // FIXME: To match MSVC, this should only be done when the class is exported + // with -fdllexport-inlines enabled. + if (D->getParent()->getNumVBases() > 0 && D->hasAttr<DLLExportAttr>()) + CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete)); } CharUnits
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits