This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG1d0bd8e51be2: [MSABI] Remove comdat attribute for inheriting ctor. (authored by jyu2).
Changed prior to commit: https://reviews.llvm.org/D158538?vs=554025&id=554075#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158538/new/ https://reviews.llvm.org/D158538 Files: clang/lib/AST/ASTContext.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/test/CodeGenCXX/ms-inheriting-ctor.cpp Index: clang/test/CodeGenCXX/ms-inheriting-ctor.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/ms-inheriting-ctor.cpp @@ -0,0 +1,49 @@ +// RUN: %clang_cc1 -fcxx-exceptions -triple=x86_64-windows-msvc -emit-llvm %s -o - | FileCheck %s + +class F { +public: + F(wchar_t *); +}; +using a = F; +struct A {}; +struct b { + b(a, F, A); +}; +template <typename, typename> struct c : b { + c(const a &p1, const A &d) : b(p1, 0, d) {} +}; +template <typename e> struct B : c<e, b> { + using c<e, b>::c; +}; +class f { +public: + f(...); +} + +typedef g; +class C { +public: + C(g, f); +}; +static wchar_t h; +class D { +public: + static C E(); +}; + +C D::E() { + C i(B<bool>(&h, {}), f()); + return i; +} + +// Inheriting ctor has internal linkage without comdat. + +// CHECK-LABEL: define internal noundef ptr @"??0?$B@_N@@QEAA@AEBVF@@AEBUA@@@Z" +// CHECK-NOT:comdat +// CHECK-SAME: {{\{$}} + +// non-inheriting ctro should has linkonce_odr with comdat attribute. + +// CHECK-LABEL: define linkonce_odr dso_local noundef ptr @"??0?$c@_NUb@@@@QEAA@AEBVF@@AEBUA@@@Z" +// CHECK:comdat +// CHECK-SAME: {{\{$}} Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -1970,15 +1970,6 @@ if (const auto *Dtor = dyn_cast<CXXDestructorDecl>(D)) return getCXXABI().getCXXDestructorLinkage(Linkage, Dtor, GD.getDtorType()); - if (isa<CXXConstructorDecl>(D) && - cast<CXXConstructorDecl>(D)->isInheritingConstructor() && - Context.getTargetInfo().getCXXABI().isMicrosoft()) { - // Our approach to inheriting constructors is fundamentally different from - // that used by the MS ABI, so keep our inheriting constructor thunks - // internal rather than trying to pick an unambiguous mangling for them. - return llvm::GlobalValue::InternalLinkage; - } - return getLLVMLinkageForDeclarator(D, Linkage); } Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -11688,6 +11688,14 @@ if (FD->isMSExternInline()) return GVA_StrongODR; + if (Context.getTargetInfo().getCXXABI().isMicrosoft() && + isa<CXXConstructorDecl>(FD) && + cast<CXXConstructorDecl>(FD)->isInheritingConstructor()) + // Our approach to inheriting constructors is fundamentally different from + // that used by the MS ABI, so keep our inheriting constructor thunks + // internal rather than trying to pick an unambiguous mangling for them. + return GVA_Internal; + return GVA_DiscardableODR; }
Index: clang/test/CodeGenCXX/ms-inheriting-ctor.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/ms-inheriting-ctor.cpp @@ -0,0 +1,49 @@ +// RUN: %clang_cc1 -fcxx-exceptions -triple=x86_64-windows-msvc -emit-llvm %s -o - | FileCheck %s + +class F { +public: + F(wchar_t *); +}; +using a = F; +struct A {}; +struct b { + b(a, F, A); +}; +template <typename, typename> struct c : b { + c(const a &p1, const A &d) : b(p1, 0, d) {} +}; +template <typename e> struct B : c<e, b> { + using c<e, b>::c; +}; +class f { +public: + f(...); +} + +typedef g; +class C { +public: + C(g, f); +}; +static wchar_t h; +class D { +public: + static C E(); +}; + +C D::E() { + C i(B<bool>(&h, {}), f()); + return i; +} + +// Inheriting ctor has internal linkage without comdat. + +// CHECK-LABEL: define internal noundef ptr @"??0?$B@_N@@QEAA@AEBVF@@AEBUA@@@Z" +// CHECK-NOT:comdat +// CHECK-SAME: {{\{$}} + +// non-inheriting ctro should has linkonce_odr with comdat attribute. + +// CHECK-LABEL: define linkonce_odr dso_local noundef ptr @"??0?$c@_NUb@@@@QEAA@AEBVF@@AEBUA@@@Z" +// CHECK:comdat +// CHECK-SAME: {{\{$}} Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -1970,15 +1970,6 @@ if (const auto *Dtor = dyn_cast<CXXDestructorDecl>(D)) return getCXXABI().getCXXDestructorLinkage(Linkage, Dtor, GD.getDtorType()); - if (isa<CXXConstructorDecl>(D) && - cast<CXXConstructorDecl>(D)->isInheritingConstructor() && - Context.getTargetInfo().getCXXABI().isMicrosoft()) { - // Our approach to inheriting constructors is fundamentally different from - // that used by the MS ABI, so keep our inheriting constructor thunks - // internal rather than trying to pick an unambiguous mangling for them. - return llvm::GlobalValue::InternalLinkage; - } - return getLLVMLinkageForDeclarator(D, Linkage); } Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -11688,6 +11688,14 @@ if (FD->isMSExternInline()) return GVA_StrongODR; + if (Context.getTargetInfo().getCXXABI().isMicrosoft() && + isa<CXXConstructorDecl>(FD) && + cast<CXXConstructorDecl>(FD)->isInheritingConstructor()) + // Our approach to inheriting constructors is fundamentally different from + // that used by the MS ABI, so keep our inheriting constructor thunks + // internal rather than trying to pick an unambiguous mangling for them. + return GVA_Internal; + return GVA_DiscardableODR; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits