From: Rafael Espindola Date: Mon, 8 Dec 2014 18:05:48 +0000 (+0000) Subject: Don't crash when the key of a comdat is lazily linked. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=dcc44c64c1695ce47770aca0a724ce5c0aa9923a;p=oota-llvm.git 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 --- 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