[PATCH] D26840: [ThinLTO] Fix crash when importing an opaque type

Mehdi AMINI via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 17 23:39:01 PST 2016


mehdi_amini created this revision.
mehdi_amini added a reviewer: tejohnson.
mehdi_amini added a subscriber: llvm-commits.

It seems that because ThinLTO does not import the full module,
some invariant of the type mapper are broken.

In Monolithic LTO, we import every globals: when calling
IRLinker::copyFunctionProto() on @foo(), we end-up calling
TypeMapTy::get(FTy) on the type of @foo(), which will map
%0 and record the destination as opaque.

ThinLTO skips this because @foo is not imported and goes directly
to the next stage.

Next we call computeTypeMapping() that map the types for each
globals, and ends up checking for type isomorphism, and may add
type mapping. However it didn't record if there was an opaque
destination type that was resolved, which is what this patch
addresses.


https://reviews.llvm.org/D26840

Files:
  llvm/lib/Linker/IRMover.cpp
  llvm/test/ThinLTO/X86/Inputs/import_opaque_type.ll
  llvm/test/ThinLTO/X86/import_opaque_type.ll


Index: llvm/test/ThinLTO/X86/import_opaque_type.ll
===================================================================
--- /dev/null
+++ llvm/test/ThinLTO/X86/import_opaque_type.ll
@@ -0,0 +1,27 @@
+; Do setup work for all below tests: generate bitcode and combined index
+; RUN: opt -module-summary %s -o %t.bc
+; RUN: opt -module-summary %p/Inputs/import_opaque_type.ll -o %t2.bc
+; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t.bc %t2.bc
+
+; Check that we import correctly the imported type to replace the opaque one here
+; RUN: llvm-lto -thinlto-action=import %t.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s 
+
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.11.0"
+
+; CHECK: %0 = type { i8 }
+%0 = type opaque
+
+%a = type { %0 * }
+
+declare void @baz()
+define void @foo(%a *) {
+	call void @baz()
+	ret void
+}
+
+define i32 @main() {
+    call void @foo(%a *null)
+	ret i32 0
+}
\ No newline at end of file
Index: llvm/test/ThinLTO/X86/Inputs/import_opaque_type.ll
===================================================================
--- /dev/null
+++ llvm/test/ThinLTO/X86/Inputs/import_opaque_type.ll
@@ -0,0 +1,15 @@
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.11.0"
+
+%0 = type { i8 }
+
+%a = type { %0 * }
+
+define void @bar(%a *) {
+	ret void
+}
+
+define void @baz() {
+	call void @bar(%a *null)
+	ret void
+}
\ No newline at end of file
Index: llvm/lib/Linker/IRMover.cpp
===================================================================
--- llvm/lib/Linker/IRMover.cpp
+++ llvm/lib/Linker/IRMover.cpp
@@ -145,6 +145,7 @@
       SrcDefinitionsToResolve.push_back(SSTy);
       SpeculativeTypes.push_back(SrcTy);
       SpeculativeDstOpaqueTypes.push_back(cast<StructType>(DstTy));
+      DstStructTypesSet.addOpaque(cast<StructType>(DstTy));
       Entry = DstTy;
       return true;
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26840.78477.patch
Type: text/x-patch
Size: 1948 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161118/ff41be9d/attachment.bin>


More information about the llvm-commits mailing list