Don't crash when the key of a comdat is lazily linked.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 8 Dec 2014 18:05:48 +0000 (18:05 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 8 Dec 2014 18:05:48 +0000 (18:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223673 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Linker/LinkModules.cpp
test/Linker/comdat9.ll

index 06710240c943d5fb28fc4347f4a372d84da338cf..331fdad9000d1bf5928c21863a1a56a2e2b3dfa8 100644 (file)
@@ -1482,6 +1482,15 @@ bool ModuleLinker::run() {
   for (unsigned i = 0, e = AppendingVars.size(); i != e; ++i)
     linkAppendingVarInit(AppendingVars[i]);
 
   for (unsigned i = 0, e = AppendingVars.size(); i != e; ++i)
     linkAppendingVarInit(AppendingVars[i]);
 
+  for (const auto &Entry : DstM->getComdatSymbolTable()) {
+    const Comdat &C = Entry.getValue();
+    if (C.getSelectionKind() == Comdat::Any)
+      continue;
+    const GlobalValue *GV = SrcM->getNamedValue(C.getName());
+    assert(GV);
+    MapValue(GV, ValueMap, RF_None, &TypeMap, &ValMaterializer);
+  }
+
   // Link in the function bodies that are defined in the source module into
   // DstM.
   for (Function &SF : *SrcM) {
   // Link in the function bodies that are defined in the source module into
   // DstM.
   for (Function &SF : *SrcM) {
index 0e9c217180d455e2977f6d4358582df2392bd051..c48d256959daea18d097c4bf6374db20812cee6c 100644 (file)
@@ -6,8 +6,14 @@ define internal void @f() comdat $c {
   ret void
 }
 
   ret void
 }
 
-; CHECK: $c = comdat any
-; CHECK: @a = alias void ()* @f
-; CHECK: define internal void @f() comdat $c {
-; CHECK:   ret void
-; CHECK: }
+; CHECK-DAG: $c = comdat any
+; CHECK-DAG: @a = alias void ()* @f
+; CHECK-DAG: define internal void @f() comdat $c
+
+$f2 = comdat largest
+define internal void @f2() comdat $f2 {
+  ret void
+}
+
+; CHECK-DAG: $f2 = comdat largest
+; CHECK-DAG: define internal void @f2() comdat $f2