Index: compiler-rt/test/fuzzer/gc-sections.test =================================================================== --- compiler-rt/test/fuzzer/gc-sections.test +++ compiler-rt/test/fuzzer/gc-sections.test @@ -5,8 +5,8 @@ RUN: nm %t | grep UnusedFunctionShouldBeRemovedByLinker | count 1 With gc-sections. Currently, we can't remove unused code. -DISABLED: %cpp_compiler %S/GcSectionsTest.cpp -o %t -ffunction-sections -Wl,-gc-sections -DISABLED: nm %t | grep UnusedFunctionShouldBeRemovedByLinker | count 1 +RUN: %cpp_compiler %S/GcSectionsTest.cpp -o %t -ffunction-sections -Wl,-gc-sections -fuse-ld=lld +RUN: nm %t | not grep UnusedFunctionShouldBeRemovedByLinker With gc sections, with trace-pc. Unused code is removed. RUN: %cpp_compiler %S/GcSectionsTest.cpp -o %t -fsanitize-coverage=0 -fsanitize-coverage=trace-pc -ffunction-sections -Wl,-gc-sections Index: llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -598,7 +598,8 @@ } if (Options.PCTable) { FunctionPCsArray = CreatePCArray(F, AllBlocks); - GlobalsToAppendToUsed.push_back(FunctionPCsArray); + MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F)); + FunctionPCsArray->addMetadata(LLVMContext::MD_associated, *MD); } }