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))