gulfem created this revision. Herald added subscribers: ellis, abrachet, phosek, hiraditya. Herald added a project: All. gulfem requested review of this revision. Herald added projects: clang, LLVM. Herald added subscribers: llvm-commits, cfe-commits.
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 pulls in profile runtime 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 389dc94d4be7 <https://reviews.llvm.org/rG389dc94d4be7a75c243528981a25260c1c7a6103>, 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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D122336 Files: clang/test/CoverageMapping/unused_function_no_runtime_hook.cpp llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp Index: llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -558,16 +558,20 @@ 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. GlobalVariable *CoverageNamesVar = M.getNamedGlobal(getCoverageUnusedNamesVarName()); - if (!containsProfilingIntrinsics(M) && !CoverageNamesVar) - return MadeChange; + if (!containsProfilingIntrinsics(M)) { + if (!CoverageNamesVar) { + return MadeChange; + } else if (!NeedsRuntimeHook) { + return MadeChange; + } + } // We did not know how many value sites there would be inside // the instrumented function. This is counting the number of instrumented Index: clang/test/CoverageMapping/unused_function_no_runtime_hook.cpp =================================================================== --- /dev/null +++ clang/test/CoverageMapping/unused_function_no_runtime_hook.cpp @@ -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; +}
Index: llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -558,16 +558,20 @@ 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. GlobalVariable *CoverageNamesVar = M.getNamedGlobal(getCoverageUnusedNamesVarName()); - if (!containsProfilingIntrinsics(M) && !CoverageNamesVar) - return MadeChange; + if (!containsProfilingIntrinsics(M)) { + if (!CoverageNamesVar) { + return MadeChange; + } else if (!NeedsRuntimeHook) { + return MadeChange; + } + } // We did not know how many value sites there would be inside // the instrumented function. This is counting the number of instrumented Index: clang/test/CoverageMapping/unused_function_no_runtime_hook.cpp =================================================================== --- /dev/null +++ clang/test/CoverageMapping/unused_function_no_runtime_hook.cpp @@ -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; +}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits