Handle a symbol being undefined.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 14 Jan 2015 13:53:50 +0000 (13:53 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 14 Jan 2015 13:53:50 +0000 (13:53 +0000)
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!

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

test/tools/gold/Inputs/comdat.ll
tools/gold/gold-plugin.cpp

index 8b699d439c56e2f6bb2e4c8ba8a7d27a7471fbcb..464aefa49dc12505004df69ad14b97456a260f9e 100644 (file)
@@ -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) {
index 1ba08cc53dc2df56623a34869aff96403e470fa9..bcc91e9d061278e9e2e3188a9fcd1460fb688482 100644 (file)
@@ -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)) {