Fix bitcode auto-upgrade when using bitcode lazy loading
authorMehdi Amini <mehdi.amini@apple.com>
Sun, 14 Aug 2016 00:01:27 +0000 (00:01 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Sun, 14 Aug 2016 00:01:27 +0000 (00:01 +0000)
The auto-upgrade path could be called before the VST (global
names) was fully parsed, and thus intrinsic names were not
available and the autoupgrade logic could not operate.

Fix link failures with ThinLTO.

This is a recommit of r278610 with a different fix.

llvm-svn: 278615

llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/test/ThinLTO/X86/Inputs/autoupgrade.bc [new file with mode: 0644]
llvm/test/ThinLTO/X86/autoupgrade.ll [new file with mode: 0644]

index 9bb8b2f..3084410 100644 (file)
@@ -3682,7 +3682,9 @@ std::error_code BitcodeReader::parseModule(uint64_t ResumeBit,
         // have been seen yet. In this case, just finish the parse now.
         if (SeenValueSymbolTable) {
           NextUnreadBit = Stream.GetCurrentBitNo();
-          return std::error_code();
+          // After the VST has been parsed, we need to make sure intrinsic name
+          // are auto-upgraded.
+          return globalCleanup();
         }
         break;
       case bitc::USELIST_BLOCK_ID:
diff --git a/llvm/test/ThinLTO/X86/Inputs/autoupgrade.bc b/llvm/test/ThinLTO/X86/Inputs/autoupgrade.bc
new file mode 100644 (file)
index 0000000..578b337
Binary files /dev/null and b/llvm/test/ThinLTO/X86/Inputs/autoupgrade.bc differ
diff --git a/llvm/test/ThinLTO/X86/autoupgrade.ll b/llvm/test/ThinLTO/X86/autoupgrade.ll
new file mode 100644 (file)
index 0000000..fd71114
--- /dev/null
@@ -0,0 +1,23 @@
+; Verify that auto-upgrading intrinsics works with Lazy loaded bitcode
+; Do setup work for all below tests: generate bitcode and combined index
+; RUN: opt -module-summary %s -o %t.bc
+; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t.bc %p/Inputs/autoupgrade.bc
+
+; RUN: llvm-lto -thinlto-action=import %t.bc -thinlto-index=%t3.bc -o - | llvm-bcanalyzer -dump | FileCheck %s
+
+; We can't use llvm-dis here, because it would do the autoupgrade itself.
+
+; CHECK-NOT: 'llvm.invariant.start'
+; CHECK: record string = 'llvm.invariant.start.p0i8'
+; CHECK-NOT: 'llvm.invariant.start'
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.11.0"
+
+define i32 @main() #0 {
+entry:
+  call void (...) @globalfunc1()
+  ret i32 0
+}
+
+declare void @globalfunc1(...) #1