summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation
diff options
context:
space:
mode:
authorMatt Morehouse <mascasa@google.com>2018-09-11 20:10:40 +0000
committerMatt Morehouse <mascasa@google.com>2018-09-11 20:10:40 +0000
commit7ce60324321a34c49aaf4f540038c6184253502c (patch)
tree5f1326b5e6d0f59fbd61d2bba45efcc6382b3a1f /llvm/lib/Transforms/Instrumentation
parent277b808ad394d0549972b08926b14f61c2017386 (diff)
downloadbcm5719-llvm-7ce60324321a34c49aaf4f540038c6184253502c.tar.gz
bcm5719-llvm-7ce60324321a34c49aaf4f540038c6184253502c.zip
[SanitizerCoverage] Create comdat for global arrays.
Summary: Place global arrays in comdat sections with their associated functions. This makes sure they are stripped along with the functions they reference, even on the BFD linker. Reviewers: eugenis Reviewed By: eugenis Subscribers: eraman, hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D51902 llvm-svn: 341987
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation')
-rw-r--r--llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
index 1f97e909851..5e7801f41a8 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
@@ -571,11 +571,34 @@ GlobalVariable *SanitizerCoverageModule::CreateFunctionLocalArrayInSection(
auto Array = new GlobalVariable(
*CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage,
Constant::getNullValue(ArrayTy), "__sancov_gen_");
- if (auto Comdat = F.getComdat())
+ if (auto Comdat = F.getComdat()) {
Array->setComdat(Comdat);
+ } else if (TargetTriple.isOSBinFormatELF()) {
+ // TODO: Refactor into a helper function and use it in ASan.
+ assert(F.hasName());
+ std::string Name = F.getName();
+ if (F.hasLocalLinkage()) {
+ std::string ModuleId = getUniqueModuleId(CurModule);
+ Name += ModuleId.empty() ? CurModule->getModuleIdentifier() : ModuleId;
+ }
+ Comdat = CurModule->getOrInsertComdat(Name);
+ // Make this IMAGE_COMDAT_SELECT_NODUPLICATES on COFF. Also upgrade private
+ // linkage to internal linkage so that a symbol table entry is emitted. This
+ // is necessary in order to create the comdat group.
+ if (TargetTriple.isOSBinFormatCOFF()) {
+ Comdat->setSelectionKind(Comdat::NoDuplicates);
+ if (F.hasPrivateLinkage())
+ F.setLinkage(GlobalValue::InternalLinkage);
+ }
+ F.setComdat(Comdat);
+ Array->setComdat(Comdat);
+ }
Array->setSection(getSectionName(Section));
Array->setAlignment(Ty->isPointerTy() ? DL->getPointerSize()
: Ty->getPrimitiveSizeInBits() / 8);
+ GlobalsToAppendToCompilerUsed.push_back(Array);
+ MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
+ Array->addMetadata(LLVMContext::MD_associated, *MD);
return Array;
}
@@ -613,23 +636,12 @@ void SanitizerCoverageModule::CreateFunctionLocalArrays(
FunctionGuardArray = CreateFunctionLocalArrayInSection(
AllBlocks.size(), F, Int32Ty, SanCovGuardsSectionName);
GlobalsToAppendToUsed.push_back(FunctionGuardArray);
- GlobalsToAppendToCompilerUsed.push_back(FunctionGuardArray);
- MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
- FunctionGuardArray->addMetadata(LLVMContext::MD_associated, *MD);
}
- if (Options.Inline8bitCounters) {
+ if (Options.Inline8bitCounters)
Function8bitCounterArray = CreateFunctionLocalArrayInSection(
AllBlocks.size(), F, Int8Ty, SanCovCountersSectionName);
- GlobalsToAppendToCompilerUsed.push_back(Function8bitCounterArray);
- MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
- Function8bitCounterArray->addMetadata(LLVMContext::MD_associated, *MD);
- }
- if (Options.PCTable) {
+ if (Options.PCTable)
FunctionPCsArray = CreatePCArray(F, AllBlocks);
- GlobalsToAppendToCompilerUsed.push_back(FunctionPCsArray);
- MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
- FunctionPCsArray->addMetadata(LLVMContext::MD_associated, *MD);
- }
}
bool SanitizerCoverageModule::InjectCoverage(Function &F,
OpenPOWER on IntegriCloud