Fix use of uninitialized variable.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 11 Aug 2014 17:07:34 +0000 (17:07 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 11 Aug 2014 17:07:34 +0000 (17:07 +0000)
Fixes linking bitcode files that use the new style comdats for constructors
with ones that don't.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215364 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Linker/LinkModules.cpp
test/Linker/Inputs/constructor-comdat.ll [new file with mode: 0644]
test/Linker/constructor-comdat.ll [new file with mode: 0644]

index 1f4c3c13238e770d6904987ea16a72266a4d47dd..1748af4740250b485ddac38f227ea67585a76085 100644 (file)
@@ -644,15 +644,19 @@ bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName,
 bool ModuleLinker::getComdatResult(const Comdat *SrcC,
                                    Comdat::SelectionKind &Result,
                                    bool &LinkFromSrc) {
+  Comdat::SelectionKind SSK = SrcC->getSelectionKind();
   StringRef ComdatName = SrcC->getName();
   Module::ComdatSymTabType &ComdatSymTab = DstM->getComdatSymbolTable();
   Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName);
 
-  if (DstCI == ComdatSymTab.end())
+  if (DstCI == ComdatSymTab.end()) {
+    // Use the comdat if it is only available in one of the modules.
+    LinkFromSrc = true;
+    Result = SSK;
     return false;
+  }
 
   const Comdat *DstC = &DstCI->second;
-  Comdat::SelectionKind SSK = SrcC->getSelectionKind();
   Comdat::SelectionKind DSK = DstC->getSelectionKind();
   return computeResultingSelectionKind(ComdatName, SSK, DSK, Result,
                                        LinkFromSrc);
diff --git a/test/Linker/Inputs/constructor-comdat.ll b/test/Linker/Inputs/constructor-comdat.ll
new file mode 100644 (file)
index 0000000..b5f23da
--- /dev/null
@@ -0,0 +1,7 @@
+define weak_odr void @_ZN3fooIiEC2Ev() {
+  ret void
+}
+
+define weak_odr void @_ZN3fooIiEC1Ev() {
+  ret void
+}
diff --git a/test/Linker/constructor-comdat.ll b/test/Linker/constructor-comdat.ll
new file mode 100644 (file)
index 0000000..42e2d83
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: llvm-link %s %p/Inputs/constructor-comdat.ll -S -o - 2>&1 | FileCheck %s
+; RUN: llvm-link %p/Inputs/constructor-comdat.ll %s -S -o - 2>&1 | FileCheck %s
+
+$_ZN3fooIiEC5Ev = comdat any
+; CHECK: $_ZN3fooIiEC5Ev = comdat any
+
+@_ZN3fooIiEC1Ev = weak_odr alias void ()* @_ZN3fooIiEC2Ev
+; CHECK: @_ZN3fooIiEC1Ev = weak_odr alias void ()* @_ZN3fooIiEC2Ev
+
+; CHECK: define weak_odr void @_ZN3fooIiEC2Ev() comdat $_ZN3fooIiEC5Ev {
+define weak_odr void @_ZN3fooIiEC2Ev() comdat $_ZN3fooIiEC5Ev {
+  ret void
+}