diff options
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 4 | ||||
-rw-r--r-- | test/CodeGenCXX/virt-template-vtable.cpp | 2 | ||||
-rw-r--r-- | test/CodeGenCXX/vtable-linkage.cpp | 10 |
3 files changed, 13 insertions, 3 deletions
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<int> { }; 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 |