[ThinLTO] Fix crash when importing an opaque type
authorMehdi Amini <mehdi.amini@apple.com>
Sat, 19 Nov 2016 18:44:16 +0000 (18:44 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Sat, 19 Nov 2016 18:44:16 +0000 (18:44 +0000)
commitfec21582921cd27bdb00ce68e75d8cdd23c96009
treebfbcd57db11751c0c44d10833709944ac8d63fb3
parent98bdbdaedd839e5f1eaba085132118daed3a19a0
[ThinLTO] Fix crash when importing an opaque type

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 doesn't record if there was an opaque
destination type that was resolved.

Instead of lazily "discovering" opaque type in the destination
module on the go, we change the TypeFinder to eagerly record all
types and not only the named ones.

Differential Revision: https://reviews.llvm.org/D26840

llvm-svn: 287453
llvm/lib/Linker/IRMover.cpp
llvm/test/ThinLTO/X86/Inputs/import_opaque_type.ll [new file with mode: 0644]
llvm/test/ThinLTO/X86/import_opaque_type.ll [new file with mode: 0644]