llvm-project/llvm/test/Linker
Nick Desaulniers 23ec5782c3 [Bitcode] materialize Functions early when BlockAddress taken
IRLinker builds a work list of functions to materialize, then moves them
from a source module to a destination module one at a time.

This is a problem for blockaddress Constants, since they need not refer
to the function they are used in; IPSCCP is quite good at sinking these
constants deep into other functions when passed as arguments.

This would lead to curious errors during LTO:
  ld.lld: error: Never resolved function from blockaddress ...
based on the ordering of function definitions in IR.

The problem was that IRLinker would basically do:

  for function f in worklist:
    materialize f
    splice f from source module to destination module

in one pass, with Functions being lazily added to the running worklist.
This confuses BitcodeReader, which cannot disambiguate whether a
blockaddress is referring to a function which has not yet been parsed
("materialized") or is simply empty because its body was spliced out.
This causes BitcodeReader to insert Functions into its BasicBlockFwdRefs
list incorrectly, as it will never re-materialize an already
materialized (but spliced out) function.

Because of the possibility that blockaddress Constants may appear in
Functions other than the ones they reference, this patch adds a new
bitcode function code FUNC_CODE_BLOCKADDR_USERS that is a simple list of
Functions that contain BlockAddress Constants that refer back to this
Function, rather then the Function they are scoped in. We then
materialize those functions when materializing `f` from the example loop
above. This might over-materialize Functions should the user of
BitcodeReader ultimately decide not to link those Functions, but we can
at least now we can avoid this ordering related issue with blockaddresses.

Fixes: https://github.com/llvm/llvm-project/issues/52787
Fixes: https://github.com/ClangBuiltLinux/linux/issues/1215

Reviewed By: dexonsmith

Differential Revision: https://reviews.llvm.org/D120781
2022-04-12 11:38:35 -07:00
..
Inputs [AIX] Bump DWARF versions to 3 because XCOFF64 requires DWARF64 2022-02-01 11:18:19 -05:00
2002-07-17-GlobalFail.ll
2002-07-17-LinkTest2.ll
2002-08-20-ConstantExpr.ll
2003-01-30-LinkerRename.ll
2003-01-30-LinkerTypeRename.ll
2003-04-23-LinkOnceLost.ll
2003-04-26-NullPtrLinkProblem.ll
2003-05-15-TypeProblem.ll
2003-05-31-LinkerRename.ll
2003-06-02-TypeResolveProblem.ll
2003-06-02-TypeResolveProblem2.ll
2003-08-20-OpaqueTypeResolve.ll
2003-08-23-GlobalVarLinking.ll
2003-08-23-RecursiveOpaqueTypeResolve.ll
2003-08-24-InheritPtrSize.ll
2003-08-28-TypeResolvesGlobal.ll
2003-08-28-TypeResolvesGlobal2.ll
2003-08-28-TypeResolvesGlobal3.ll
2003-10-27-LinkOncePromote.ll
2003-11-18-TypeResolution.ll
2004-02-17-WeakStrongLinkage.ll
2004-05-07-TypeResolution1.ll
2004-05-07-TypeResolution2.ll
2004-12-03-DisagreeingType.ll
2005-02-12-ConstantGlobals-2.ll
2005-02-12-ConstantGlobals.ll
2005-12-06-AppendingZeroLengthArrays.ll
2006-01-19-ConstantPacked.ll
2008-03-05-AliasReference.ll
2008-03-05-AliasReference2.ll
2008-03-07-DroppedSection_a.ll
2008-03-07-DroppedSection_b.ll
2008-06-13-LinkOnceRedefinition.ll
2008-06-26-AddressSpace.ll
2008-07-06-AliasFnDecl.ll
2008-07-06-AliasFnDecl2.ll
2008-07-06-AliasWeakDest.ll
2008-07-06-AliasWeakDest2.ll
2009-09-03-mdnode.ll
2009-09-03-mdnode2.ll
2011-08-04-DebugLoc.ll
2011-08-04-DebugLoc2.ll
2011-08-04-Metadata.ll
2011-08-04-Metadata2.ll
2011-08-18-unique-class-type.ll
2011-08-18-unique-class-type2.ll
2011-08-18-unique-debug-type.ll
2011-08-18-unique-debug-type2.ll
AppendingLinkage.ll
AppendingLinkage2.ll
ConstantGlobals.ll
DSOLocalEquivalent.ll [llvm] Change DSOLocalEquivalent type if the underlying global value type changes 2021-03-09 15:09:48 -08:00
DbgDeclare.ll
DbgDeclare2.ll
LinkOnce.ll
PR8300.ll
addrspace.ll
alias-2.ll
alias-3.ll
alias-4.ll Linker: Avoid scheduling the link of a global value twice due to an alias 2021-04-28 13:22:10 -07:00
alias-threadlocal.ll
alias.ll
alignment.ll
appending-global-crash.ll [llvm-link] Fix crash when materializing appending global 2021-01-25 18:08:07 -08:00
appending-global-err1.ll [llvm-link] Fix for an assertion when linking global with appending linkage 2021-01-23 00:10:42 -08:00
appending-global-err2.ll [llvm-link] Fix for an assertion when linking global with appending linkage 2021-01-23 00:10:42 -08:00
appending-global-err3.ll [llvm-link] Fix for an assertion when linking global with appending linkage 2021-01-23 00:10:42 -08:00
appending-global-err4.ll [llvm-link] Fix for an assertion when linking global with appending linkage 2021-01-23 00:10:42 -08:00
appending-global-err5.ll [llvm-link] Fix for an assertion when linking global with appending linkage 2021-01-23 00:10:42 -08:00
appending-global-proto.ll [llvm-link] Fix for an assertion when linking global with appending linkage 2021-01-23 00:10:42 -08:00
apple-version.ll
available_externally_a.ll
available_externally_b.ll
available_externally_over_decl.ll
basiclink.ll
blockaddress.ll [Bitcode] materialize Functions early when BlockAddress taken 2022-04-12 11:38:35 -07:00
broken.ll
byref-types.ll Linker: Fix linking of byref types 2020-11-17 11:02:04 -05:00
byval-types.ll
comdat-any.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-incompatible-kinds.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-largest.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-nodeduplicate.ll [Linker] Handle comdat nodeduplicate 2021-08-31 22:32:20 -07:00
comdat-nonprevailing-decl.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-refer-to-discarded.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-rm-dst.ll
comdat-samesize.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-size-err.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat-unneeded.ll [test] Reorganize test/Linker/comdat*.ll 2021-08-28 10:11:08 -07:00
comdat.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
comdat_group.ll
commandline.ll
constructor-comdat.ll
ctors.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
ctors2.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
ctors3.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
ctors4.ll
cuda-libdevice.ll [IRLinker] Suppress linker warnings when linking with CUDA libdevice. 2021-09-01 10:45:15 -07:00
datalayout.ll
debug-info-bad-enum.ll [DebugInfo] Skip ODRUniquing for mismatched tags 2021-10-26 15:28:25 -07:00
debug-info-global-var.ll
debug-info-use-before-def.ll [DebugInfo] ValueMapper impl for DIArgList respects IgnoreMissingLocals 2022-01-17 17:17:32 +00:00
debug-info-version-a.ll
debug-info-version-b.ll
dicompositetype-unique.ll
distinct-cycles.ll
distinct.ll
dllstorage-a.ll
dllstorage-b.ll
drop-debug.ll
elementtype-struct-1.ll Copy Elementtype Attribute to IR at Link step 2021-09-07 11:41:43 -07:00
empty-swift.ll
func-attrs-a.ll OpaquePtr: Bulk update tests to use typed sret 2020-11-20 17:58:26 -05:00
func-attrs-b.ll OpaquePtr: Bulk update tests to use typed sret 2020-11-20 17:58:26 -05:00
funcimport.ll
funcimport2.ll
funcimport_appending_global.ll
funcimport_comdat.ll
globalorder.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
ident.ll
ifunc.ll [Verifier] Add verification logic for GlobalIFuncs 2021-10-31 20:00:57 -07:00
inalloca-types.ll Reapply "OpaquePtr: Turn inalloca into a type attribute" 2021-03-29 08:55:30 -04:00
inlineasm.ll [Tests] Add elementtype attribute to indirect inline asm operands (NFC) 2022-01-06 14:23:51 +01:00
internalize-lazy.ll
intrinsics-with-unnamed-types.ll Support intrinsic overloading on unnamed types 2021-03-19 14:34:25 +01:00
link-arm-and-thumb-module-inline-asm.ll Simplify append to module inline asm string in IRLinker::run() 2020-12-02 14:56:43 +01:00
link-arm-and-thumb.ll
link-flags.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
link-global-to-func.ll
link-type-names.ll
linkage.ll
linkage2.ll
linkmdnode.ll
linkmdnode2.ll
linknamedmdnode.ll
linknamedmdnode2.ll
lto-attributes.ll
mdlocation.ll
metadata-a.ll
metadata-attach.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
metadata-b.ll
metadata-function.ll
metadata-global.ll
metadata-mismatch.test
metadata-source.ll
metadata-with-global-value-operand.ll
module-flags-1-a.ll
module-flags-1-b.ll
module-flags-2-a.ll
module-flags-2-b.ll
module-flags-3-a.ll
module-flags-3-b.ll
module-flags-4-a.ll
module-flags-4-b.ll
module-flags-5-a.ll
module-flags-5-b.ll
module-flags-6-a.ll
module-flags-6-b.ll
module-flags-7-a.ll
module-flags-7-b.ll
module-flags-8-a.ll
module-flags-8-b.ll
module-flags-dont-change-others.ll
module-flags-pic-1-a.ll
module-flags-pic-2-a.ll
module-max-warn.ll
multiple-merged-structs.ll
null_mapping_constant.ll
objectivec-class-property-flag-mismatch.ll
odr-lambda-1.ll
odr.ll
only-needed-compiler-used.ll
only-needed-ctors1.ll [test] Fix unused check prefixes in test/Linker/ and test/Other/ 2020-10-29 21:54:56 -07:00
only-needed-ctors2.ll [test] Fix unused check prefixes in test/Linker/ and test/Other/ 2020-10-29 21:54:56 -07:00
only-needed-debug-metadata.ll
only-needed-dtors1.ll [test] Fix unused check prefixes in test/Linker/ and test/Other/ 2020-10-29 21:54:56 -07:00
only-needed-dtors2.ll [test] Fix unused check prefixes in test/Linker/ and test/Other/ 2020-10-29 21:54:56 -07:00
only-needed-named-metadata.ll
only-needed-recurse.ll
only-needed-used.ll
opaque.ll
override-different-linkage.ll
override-with-internal-linkage-2.ll
override-with-internal-linkage.ll
override.ll
partial-type-refinement-link.ll
partial-type-refinement.ll
pr21374.ll
pr21494.ll
pr22807.ll
pr26037.ll
pr27044.ll
prologuedata.ll
redefinition.ll
replaced-function-matches-first-subprogram.ll
scalable-vector-type-construction.ll Fix typo of colon to semicolon in lit tests 2021-10-09 10:03:50 +08:00
sret-types.ll
stack-alignment.ll reland [IR] make -stack-alignment= into a module attr 2021-06-08 10:59:46 -07:00
stack-protector-guard-module-attrs.ll [IR] make stack-protector-guard-* flags into module attrs 2021-05-21 15:53:30 -07:00
subprogram-linkonce-weak.ll [tests] Make 'object-emission' imply 'default_triple' 2022-03-22 16:46:48 +04:00
syncscopes.ll
targettriple.ll
testlink.ll Preserve the lexical order for global variables during llvm-link merge 2021-04-26 10:11:34 -07:00
thinlto_funcimport_debug.ll Revert "[NFC] remove explicit default value for strboolattr attribute in tests" 2021-05-24 19:43:40 +02:00
transitive-lazy-link.ll
type-unique-alias.ll
type-unique-dst-types.ll
type-unique-inheritance.ll
type-unique-name.ll
type-unique-odr-a.ll [tests] Make 'object-emission' imply 'default_triple' 2022-03-22 16:46:48 +04:00
type-unique-odr-b.ll
type-unique-opaque.ll
type-unique-simple-a.ll [tests] Make 'object-emission' imply 'default_triple' 2022-03-22 16:46:48 +04:00
type-unique-simple-b.ll [AIX] Bump DWARF versions to 3 because XCOFF64 requires DWARF64 2022-02-01 11:18:19 -05:00
type-unique-simple2-a.ll [tests] Make 'object-emission' imply 'default_triple' 2022-03-22 16:46:48 +04:00
type-unique-simple2-b.ll [AIX] Bump DWARF versions to 3 because XCOFF64 requires DWARF64 2022-02-01 11:18:19 -05:00
type-unique-simple2.ll [tests] Make 'object-emission' imply 'default_triple' 2022-03-22 16:46:48 +04:00
type-unique-src-type.ll
type-unique-type-array-a.ll [tests] Make 'object-emission' imply 'default_triple' 2022-03-22 16:46:48 +04:00
type-unique-type-array-b.ll [AIX] Bump DWARF versions to 3 because XCOFF64 requires DWARF64 2022-02-01 11:18:19 -05:00
type-unique-unrelated.ll
unique-fwd-decl-a.ll
unique-fwd-decl-order.ll
uniqued-distinct-cycles.ll
unnamed-addr-err-a.ll
unnamed-addr-err-b.ll
unnamed-addr1-a.ll
unnamed-addr1-b.ll
visibility.ll
weakextern.ll
wrong-addrspace-gv-declaration.ll