summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-06-26 22:43:48 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-06-26 22:43:48 +0000
commit289a7d4c7da8c408d5f9ddb06424d31b4b911b42 (patch)
treecbb99cc2ac72d45a12d89c5166c340fbb55d92e6 /llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
parent2f17824463f407a515ddb9307273a2c34a783851 (diff)
downloadbcm5719-llvm-289a7d4c7da8c408d5f9ddb06424d31b4b911b42.tar.gz
bcm5719-llvm-289a7d4c7da8c408d5f9ddb06424d31b4b911b42.zip
Revert "[asan] Instrument comdat globals on COFF targets"
Causes false positive ODR violation reports on __llvm_profile_raw_version. llvm-svn: 335681
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp41
1 files changed, 8 insertions, 33 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index c8a46087d9b..b33cc5e7c2e 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -1653,6 +1653,14 @@ bool AddressSanitizerModule::ShouldInstrumentGlobal(GlobalVariable *G) {
if (!Ty->isSized()) return false;
if (!G->hasInitializer()) return false;
if (GlobalWasGeneratedByCompiler(G)) return false; // Our own globals.
+ // Touch only those globals that will not be defined in other modules.
+ // Don't handle ODR linkage types and COMDATs since other modules may be built
+ // without ASan.
+ if (G->getLinkage() != GlobalVariable::ExternalLinkage &&
+ G->getLinkage() != GlobalVariable::PrivateLinkage &&
+ G->getLinkage() != GlobalVariable::InternalLinkage)
+ return false;
+ if (G->hasComdat()) return false;
// Two problems with thread-locals:
// - The address of the main thread's copy can't be computed at link-time.
// - Need to poison all copies, not just the main thread's one.
@@ -1660,38 +1668,6 @@ bool AddressSanitizerModule::ShouldInstrumentGlobal(GlobalVariable *G) {
// For now, just ignore this Global if the alignment is large.
if (G->getAlignment() > MinRedzoneSizeForGlobal()) return false;
- // If we know this global is defined only in this module (external or static),
- // we can instrument it.
- if (G->getLinkage() != GlobalVariable::ExternalLinkage &&
- G->getLinkage() != GlobalVariable::PrivateLinkage &&
- G->getLinkage() != GlobalVariable::InternalLinkage) {
- // For targets that support comdats, we can instrument ODR globals in
- // comdats. We simply add our global metadata to the group and hope that an
- // instrumented global is selected.
- // FIXME: This should work on ELF, enable it there too.
- if (!TargetTriple.isOSBinFormatCOFF())
- return false;
- if (G->getLinkage() != GlobalVariable::WeakODRLinkage &&
- G->getLinkage() != GlobalVariable::LinkOnceODRLinkage)
- return false;
- if (!G->hasComdat())
- return false;
- }
-
- // If a comdat is present, it must have a selection kind that implies ODR
- // semantics: no duplicates, any, or exact match.
- if (Comdat *C = G->getComdat()) {
- switch (C->getSelectionKind()) {
- case Comdat::Any:
- case Comdat::ExactMatch:
- case Comdat::NoDuplicates:
- break;
- case Comdat::Largest:
- case Comdat::SameSize:
- return false;
- }
- }
-
if (G->hasSection()) {
StringRef Section = G->getSection();
@@ -2145,7 +2121,6 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool
new GlobalVariable(M, NewTy, G->isConstant(), Linkage, NewInitializer,
"", G, G->getThreadLocalMode());
NewGlobal->copyAttributesFrom(G);
- NewGlobal->setComdat(G->getComdat());
NewGlobal->setAlignment(MinRZ);
// Move null-terminated C strings to "__asan_cstring" section on Darwin.
OpenPOWER on IntegriCloud