From dcc44c64c1695ce47770aca0a724ce5c0aa9923a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 8 Dec 2014 18:05:48 +0000 Subject: [PATCH] Don't crash when the key of a comdat is lazily linked. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223673 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Linker/LinkModules.cpp | 9 +++++++++ test/Linker/comdat9.ll | 16 +++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 06710240c94..331fdad9000 100644 --- a/lib/Linker/LinkModules.cpp +++ b/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/test/Linker/comdat9.ll b/test/Linker/comdat9.ll index 0e9c217180d..c48d256959d 100644 --- a/test/Linker/comdat9.ll +++ b/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