Fix bitcode auto-upgrade when using bitcode lazy loading
authorMehdi Amini <mehdi.amini@apple.com>
Sat, 13 Aug 2016 23:31:53 +0000 (23:31 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Sat, 13 Aug 2016 23:31:53 +0000 (23:31 +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.

llvm-svn: 278610

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..a93c4ed 100644 (file)
@@ -3634,15 +3634,6 @@ std::error_code BitcodeReader::parseModule(uint64_t ResumeBit,
           return EC;
         break;
       case bitc::FUNCTION_BLOCK_ID:
-        // If this is the first function body we've seen, reverse the
-        // FunctionsWithBodies list.
-        if (!SeenFirstFunctionBody) {
-          std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
-          if (std::error_code EC = globalCleanup())
-            return EC;
-          SeenFirstFunctionBody = true;
-        }
-
         if (VSTOffset > 0) {
           // If we have a VST forward declaration record, make sure we
           // parse the VST now if we haven't already. It is needed to
@@ -3669,6 +3660,15 @@ std::error_code BitcodeReader::parseModule(uint64_t ResumeBit,
           }
         }
 
+        // If this is the first function body we've seen, reverse the
+        // FunctionsWithBodies list.
+        if (!SeenFirstFunctionBody) {
+          std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
+          if (std::error_code EC = globalCleanup())
+            return EC;
+          SeenFirstFunctionBody = true;
+        }
+
         // Support older bitcode files that did not have the function
         // index in the VST, nor a VST forward declaration record, as
         // well as anonymous functions that do not have VST entries.
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