[InstrProfiling] Use llvm.compiler.used instead of llvm.used for ELF
authorFangrui Song <i@maskray.me>
Sat, 27 Feb 2021 00:14:03 +0000 (16:14 -0800)
committerFangrui Song <i@maskray.me>
Sat, 27 Feb 2021 00:14:03 +0000 (16:14 -0800)
commitbf176c49e842693e16c97c05d3d5fad33fc3d617
tree7e3e9adaf2a2fb5edbcc2293c863fd62e763d6d6
parent5077d42cfa427598826eb7b69ad805bad8f4ec9d
[InstrProfiling] Use llvm.compiler.used instead of llvm.used for ELF

Many optimizers (e.g.  GlobalOpt/ConstantMerge) do not respect linker semantics
for comdat and may not discard the sections as a unit.

The interconnected `__llvm_prf_{cnts,data}` sections (in comdat for ELF)
are similar to D97432: `__profd_` is not directly referenced, so
`__profd_` may be discarded while `__profc_` is retained, breaking the
interconnection.  We currently conservatively add all such sections to
`llvm.used` and let the linker do GC for ELF.

In D97448, we will change GlobalObject's in the llvm.used list to use SHF_GNU_RETAIN,
causing the metadata sections to be unnecessarily retained (some `check-profile` tests check for GC).
Use `llvm.compiler.used` to retain the current GC behavior.

Differential Revision: https://reviews.llvm.org/D97585
llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
llvm/test/Instrumentation/InstrProfiling/profiling.ll