From: Anders Carlsson Date: Sat, 5 Dec 2009 22:24:38 +0000 (+0000) Subject: If a class does not have a key function, its linkage should be weak_odr. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=891c8b739917ec4d171a62ceaefc640115089e7d;p=clang If a class does not have a key function, its linkage should be weak_odr. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90680 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index 9ed90f0ba5..9c78c23631 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -1092,7 +1092,7 @@ createGlobalVariable(CodeGenModule &CGM, const CXXRecordDecl *RD, // Figure out the right linkage. llvm::GlobalVariable::LinkageTypes Linkage = - llvm::GlobalValue::LinkOnceODRLinkage; + llvm::GlobalValue::WeakODRLinkage; if (!Init) Linkage = llvm::GlobalValue::ExternalLinkage; else if (RD->isInAnonymousNamespace()) @@ -1167,7 +1167,7 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass, b.getVtable().size()); } llvm::GlobalVariable *OGV = GV; - GV = createGlobalVariable(*this, LayoutClass, ntype, C, Name); + GV = createGlobalVariable(*this, LayoutClass, ArrayType, Init, Name); if (OGV) { GV->takeName(OGV); llvm::Constant *NewPtr = diff --git a/test/CodeGenCXX/virt-template-vtable.cpp b/test/CodeGenCXX/virt-template-vtable.cpp index 478daa75cb..3fbdd2d9cd 100644 --- a/test/CodeGenCXX/virt-template-vtable.cpp +++ b/test/CodeGenCXX/virt-template-vtable.cpp @@ -9,4 +9,4 @@ class B : A { }; B::B() {} -// CHECK: @_ZTV1AIiE = linkonce_odr constant +// CHECK: @_ZTV1AIiE = weak_odr constant diff --git a/test/CodeGenCXX/vtable-linkage.cpp b/test/CodeGenCXX/vtable-linkage.cpp index 39435a3c7f..4eae3175a0 100644 --- a/test/CodeGenCXX/vtable-linkage.cpp +++ b/test/CodeGenCXX/vtable-linkage.cpp @@ -15,10 +15,20 @@ struct B { B::B() { } +struct C { + C(); + virtual void f() { } +}; + +C::C() { } + // B has a key function that is not defined in this translation unit so its vtable // has external linkage. // CHECK: @_ZTV1B = external constant +// C has no key function, so its vtable should have weak_odr linkage. +// CHECK: @_ZTV1C = weak_odr constant + // The A vtable should have internal linkage since it is inside an anonymous // namespace. // CHECK: @_ZTVN12_GLOBAL__N_11AE = internal constant