[sanitizer-coverage] call appendToUsed once per module, not once per function (which is too slow)

llvm-svn: 312855
This commit is contained in:
Kostya Serebryany 2017-09-09 05:30:13 +00:00
parent 415a60f303
commit 4192b96313
1 changed files with 8 additions and 8 deletions

View File

@ -242,6 +242,7 @@ private:
GlobalVariable *FunctionGuardArray; // for trace-pc-guard. GlobalVariable *FunctionGuardArray; // for trace-pc-guard.
GlobalVariable *Function8bitCounterArray; // for inline-8bit-counters. GlobalVariable *Function8bitCounterArray; // for inline-8bit-counters.
GlobalVariable *FunctionPCsArray; // for pc-table. GlobalVariable *FunctionPCsArray; // for pc-table.
SmallVector<GlobalValue *, 20> GlobalsToAppendToUsed;
SanitizerCoverageOptions Options; SanitizerCoverageOptions Options;
}; };
@ -400,6 +401,10 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
{IRB.CreatePointerCast(SecStartEnd.first, IntptrPtrTy), {IRB.CreatePointerCast(SecStartEnd.first, IntptrPtrTy),
IRB.CreatePointerCast(SecStartEnd.second, IntptrPtrTy)}); IRB.CreatePointerCast(SecStartEnd.second, IntptrPtrTy)});
} }
// We don't reference these arrays directly in any of our runtime functions,
// so we need to prevent them from being dead stripped.
if (TargetTriple.isOSBinFormatMachO())
appendToUsed(M, GlobalsToAppendToUsed);
return true; return true;
} }
@ -579,25 +584,20 @@ SanitizerCoverageModule::CreatePCArray(Function &F,
void SanitizerCoverageModule::CreateFunctionLocalArrays( void SanitizerCoverageModule::CreateFunctionLocalArrays(
Function &F, ArrayRef<BasicBlock *> AllBlocks) { Function &F, ArrayRef<BasicBlock *> AllBlocks) {
SmallVector<GlobalValue *, 3> LocalArrays;
if (Options.TracePCGuard) { if (Options.TracePCGuard) {
FunctionGuardArray = CreateFunctionLocalArrayInSection( FunctionGuardArray = CreateFunctionLocalArrayInSection(
AllBlocks.size(), F, Int32Ty, SanCovGuardsSectionName); AllBlocks.size(), F, Int32Ty, SanCovGuardsSectionName);
LocalArrays.push_back(FunctionGuardArray); GlobalsToAppendToUsed.push_back(FunctionGuardArray);
} }
if (Options.Inline8bitCounters) { if (Options.Inline8bitCounters) {
Function8bitCounterArray = CreateFunctionLocalArrayInSection( Function8bitCounterArray = CreateFunctionLocalArrayInSection(
AllBlocks.size(), F, Int8Ty, SanCovCountersSectionName); AllBlocks.size(), F, Int8Ty, SanCovCountersSectionName);
LocalArrays.push_back(Function8bitCounterArray); GlobalsToAppendToUsed.push_back(Function8bitCounterArray);
} }
if (Options.PCTable) { if (Options.PCTable) {
FunctionPCsArray = CreatePCArray(F, AllBlocks); FunctionPCsArray = CreatePCArray(F, AllBlocks);
LocalArrays.push_back(FunctionPCsArray); GlobalsToAppendToUsed.push_back(FunctionPCsArray);
} }
// We don't reference these arrays directly in any of our runtime functions,
// so we need to prevent them from being dead stripped.
appendToUsed(*F.getParent(), LocalArrays);
} }
bool SanitizerCoverageModule::InjectCoverage(Function &F, bool SanitizerCoverageModule::InjectCoverage(Function &F,