[InstrProfiling] No runtime hook for unused funcs

This is a reland of https://reviews.llvm.org/D122336.
Original patch caused a problem in collecting coverage in
Fuchsia because it was returning early without putting unused
function names into __llvm_prf_names section. This patch
fixes that issue.

The original commit message is as the following:
CoverageMappingModuleGen generates a coverage mapping record
even for unused functions with internal linkage, e.g.
static int foo() { return 100; }
Clang frontend eliminates such functions, but InstrProfiling pass
still emits runtime hook since there is a coverage record.
Fuchsia uses runtime counter relocation, and pulling in profile
runtime for unused functions causes a linker error:
undefined hidden symbol: __llvm_profile_counter_bias.
Since https://reviews.llvm.org/D98061, we do not hook profile
runtime for the binaries that none of its translation units
have been instrumented in Fuchsia. This patch extends that for
the instrumented binaries that consist of only unused functions.

Reviewed By: phosek

Differential Revision: https://reviews.llvm.org/D122336
This commit is contained in:
Gulfem Savrun Yeniceri 2022-08-26 16:38:44 +00:00
parent 3eca0b395f
commit d6aed77f0d
2 changed files with 16 additions and 4 deletions

View File

@ -0,0 +1,6 @@
// RUN: %clang -target x86_64-unknown-fuchsia -fprofile-instr-generate -fcoverage-mapping -emit-llvm -S %s -o - | FileCheck %s
// CHECK-NOT: @__llvm_profile_runtime
static int f0() {
return 100;
}

View File

@ -525,9 +525,8 @@ bool InstrProfiling::run(
TT = Triple(M.getTargetTriple());
bool MadeChange = false;
// Emit the runtime hook even if no counters are present.
if (needsRuntimeHookUnconditionally(TT))
bool NeedsRuntimeHook = needsRuntimeHookUnconditionally(TT);
if (NeedsRuntimeHook)
MadeChange = emitRuntimeHook();
// Improve compile time by avoiding linear scans when there is no work.
@ -567,7 +566,14 @@ bool InstrProfiling::run(
emitVNodes();
emitNameData();
emitRuntimeHook();
// Emit runtime hook except for the cases where coverage is enabled on
// code that is eliminated by the front-end, e.g. unused functions with
// internal linkage, and the target does not require pulling in profile
// runtime.
if (containsProfilingIntrinsics(M) || !CoverageNamesVar || NeedsRuntimeHook)
emitRuntimeHook();
emitRegistration();
emitUses();
emitInitialization();