]> granicus.if.org Git - clang/commitdiff
If a class does not have a key function, its linkage should be weak_odr.
authorAnders Carlsson <andersca@mac.com>
Sat, 5 Dec 2009 22:24:38 +0000 (22:24 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 5 Dec 2009 22:24:38 +0000 (22:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90680 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGVtable.cpp
test/CodeGenCXX/virt-template-vtable.cpp
test/CodeGenCXX/vtable-linkage.cpp

index 9ed90f0ba51961ab375632b60dc39b3f04c22bb5..9c78c236313e2e6c1cfe4a3fece6f1aa749d616d 100644 (file)
@@ -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 = 
index 478daa75cb06390f9d99f3cdbfae7875eeb1e770..3fbdd2d9cde00d9ede814464ebf97f107f13f38f 100644 (file)
@@ -9,4 +9,4 @@ class B : A<int> {
 };
 B::B() {}
 
-// CHECK: @_ZTV1AIiE = linkonce_odr constant
+// CHECK: @_ZTV1AIiE = weak_odr constant
index 39435a3c7fd9e2d050c82a9e388db82850c4fe04..4eae3175a07dc19a07dcf18f669a8743d8680f20 100644 (file)
@@ -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