From 5ca7fa15fd6546ef8001d7d0e854b041344fb8d2 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 14 Jan 2015 13:53:50 +0000 Subject: [PATCH] Handle a symbol being undefined. This can happen if: * It is present in a comdat in one file. * It is not present in the comdat of the file that is kept. * Is is not used. This should fix the LTO boostrap. Thanks to Takumi NAKAMURA for setting up the bot! llvm-svn: 225983 --- llvm/test/tools/gold/Inputs/comdat.ll | 5 +++++ llvm/tools/gold/gold-plugin.cpp | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/llvm/test/tools/gold/Inputs/comdat.ll b/llvm/test/tools/gold/Inputs/comdat.ll index 8b699d4..464aefa 100644 --- a/llvm/test/tools/gold/Inputs/comdat.ll +++ b/llvm/test/tools/gold/Inputs/comdat.ll @@ -1,4 +1,9 @@ $c2 = comdat any +$c1 = comdat any + +; This is only present in this file. The linker will keep $c1 from the first +; file and this will be undefined. +@will_be_undefined = global i32 1, comdat($c1) @v1 = weak_odr global i32 41, comdat($c2) define weak_odr protected i32 @f1(i8* %this) comdat($c2) { diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 1ba08cc..bcc91e9 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -629,10 +629,14 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile, case LDPR_RESOLVED_IR: case LDPR_RESOLVED_EXEC: case LDPR_RESOLVED_DYN: - case LDPR_UNDEF: assert(GV->isDeclarationForLinker()); break; + case LDPR_UNDEF: + assert(GV->hasComdat()); + Drop.insert(GV); + break; + case LDPR_PREVAILING_DEF_IRONLY: { keepGlobalValue(*GV, KeptAliases); if (!Used.count(GV)) { -- 2.7.4