summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-05-15 20:43:42 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-05-15 20:43:42 +0000
commitb56012b548fbc896b256257c929b2c4d0d7b5195 (patch)
treea5e06426f7f636e071182a7709a9351ac14ea5c1 /llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
parentcf0675bb74597ba2639c0d1392a466d69363101c (diff)
downloadbcm5719-llvm-b56012b548fbc896b256257c929b2c4d0d7b5195.tar.gz
bcm5719-llvm-b56012b548fbc896b256257c929b2c4d0d7b5195.zip
[asan] Better workaround for gold PR19002.
See the comment for more details. Test in a follow-up CFE commit. llvm-svn: 303113
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index d718046adf7..a3b517dfe88 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -613,7 +613,15 @@ public:
bool UseGlobalsGC = true)
: ModulePass(ID), CompileKernel(CompileKernel || ClEnableKasan),
Recover(Recover || ClRecover),
- UseGlobalsGC(UseGlobalsGC && ClUseGlobalsGC) {}
+ UseGlobalsGC(UseGlobalsGC && ClUseGlobalsGC),
+ // Not a typo: ClWithComdat is almost completely pointless without
+ // ClUseGlobalsGC (because then it only works on modules without
+ // globals, which are rare); it is a prerequisite for ClUseGlobalsGC;
+ // and both suffer from gold PR19002 for which UseGlobalsGC constructor
+ // argument is designed as workaround. Therefore, disable both
+ // ClWithComdat and ClUseGlobalsGC unless the frontend says it's ok to
+ // do globals-gc.
+ UseCtorComdat(UseGlobalsGC && ClWithComdat) {}
bool runOnModule(Module &M) override;
static char ID; // Pass identification, replacement for typeid
StringRef getPassName() const override { return "AddressSanitizerModule"; }
@@ -656,6 +664,7 @@ private:
bool CompileKernel;
bool Recover;
bool UseGlobalsGC;
+ bool UseCtorComdat;
Type *IntptrTy;
LLVMContext *C;
Triple TargetTriple;
@@ -2072,7 +2081,7 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
// Put the constructor and destructor in comdat if both
// (1) global instrumentation is not TU-specific
// (2) target is ELF.
- if (ClWithComdat && TargetTriple.isOSBinFormatELF() && CtorComdat) {
+ if (UseCtorComdat && TargetTriple.isOSBinFormatELF() && CtorComdat) {
AsanCtorFunction->setComdat(M.getOrInsertComdat(kAsanModuleCtorName));
appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority,
AsanCtorFunction);
OpenPOWER on IntegriCloud