summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Linker/LinkModules.cpp9
-rw-r--r--llvm/test/Linker/comdat9.ll16
2 files changed, 20 insertions, 5 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp
index 06710240c94..331fdad9000 100644
--- a/llvm/lib/Linker/LinkModules.cpp
+++ b/llvm/lib/Linker/LinkModules.cpp
@@ -1482,6 +1482,15 @@ bool ModuleLinker::run() {
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) {
diff --git a/llvm/test/Linker/comdat9.ll b/llvm/test/Linker/comdat9.ll
index 0e9c217180d..c48d256959d 100644
--- a/llvm/test/Linker/comdat9.ll
+++ b/llvm/test/Linker/comdat9.ll
@@ -6,8 +6,14 @@ define internal void @f() comdat $c {
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
OpenPOWER on IntegriCloud