An global value in the llvm.used list does not have GC root semantics on ELF targets.
This will be changed in a subsequent backend patch.
Change some llvm.used in the ELF code path to use llvm.compiler.used to
prevent undesired GC root semantics.
Change one extern "C" alias (due to __attribute__((used)) in extern "C") to use llvm.compiler.used on all targets.
GNU ld has a rule "__start_/__stop_ references from a live input section retain the associated C identifier name sections",
which LLD may drop entirely (currently refined to exclude SHF_LINK_ORDER/SHF_GROUP) in a future release (the rule makes it clumsy to GC metadata sections; D96914 added a way to try the potential future behavior).
For llvm.used global values defined in a C identifier name section, keep using llvm.used so that
the future LLD change will not affect them.
rnk kindly categorized the changes:
ObjC/blocks: this wants GC root semantics, since ObjC mainly runs on Mac. MS C++ ABI stuff: wants GC root semantics, no change OpenMP: unsure, but GC root semantics probably don't hurt CodeGenModule: affected in this patch to *not* use GC root semantics so that __attribute__((used)) behavior remains the same on ELF, plus two other minor use cases that don't want GC semantics Coverage: Probably want GC root semantics CGExpr.cpp: refers to LTO, wants GC root CGDeclCXX.cpp: one is MS ABI specific, so yes GC root, one is some other C++ init functionality, which should form GC roots (C++ initializers can have side effects and must run) CGDecl.cpp: Changed in this patch for __attribute__((used))
I think this (and the corresponding line in codgen) is incorrect.
Previously, attribute((used)) marked something as 'used', so it makes it all the way to the linker.
After this change, anything that answers getTriple().isOSBinFormatELF() with true will emit ((used)) as compiler.used, which means it gets deleted earlier. In particular, amdgpu uses elf and the openmp runtime marks some symbols used, which are now getting deleted by clang during internalise.
Lots of targets presumably use 'elf' as the target binary format though, so I expect this to have broken user facing code on all of them.