diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-04-10 20:36:36 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-04-10 20:36:36 +0000 |
commit | ed7fce7c845825646637566e207bc918114613b0 (patch) | |
tree | a694395df02381e7d7ab9d983c4a4f955c120604 /llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | |
parent | ba7c2e9661863644bfed7f40a28434cd338ff1bb (diff) | |
download | bcm5719-llvm-ed7fce7c845825646637566e207bc918114613b0.tar.gz bcm5719-llvm-ed7fce7c845825646637566e207bc918114613b0.zip |
Revert "[asan] Put ctor/dtor in comdat."
This reverts commit r299696, which is causing mysterious test failures.
llvm-svn: 299880
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 50 |
1 files changed, 9 insertions, 41 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 47395653acf..ae047239d82 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -606,7 +606,7 @@ class AddressSanitizerModule : public ModulePass { private: void initializeCallbacks(Module &M); - bool InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool *CtorComdat); + bool InstrumentGlobals(IRBuilder<> &IRB, Module &M); void InstrumentGlobalsCOFF(IRBuilder<> &IRB, Module &M, ArrayRef<GlobalVariable *> ExtendedGlobals, ArrayRef<Constant *> MetadataInitializers); @@ -645,9 +645,6 @@ private: Function *AsanUnregisterGlobals; Function *AsanRegisterImageGlobals; Function *AsanUnregisterImageGlobals; - - Function *AsanCtorFunction = nullptr; - Function *AsanDtorFunction = nullptr; }; // Stack poisoning does not play well with exception handling. @@ -1431,13 +1428,8 @@ void AddressSanitizerModule::poisonOneInitializer(Function &GlobalInit, void AddressSanitizerModule::createInitializerPoisonCalls( Module &M, GlobalValue *ModuleName) { GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors"); - if (!GV) - return; - - ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer()); - if (!CA) - return; + ConstantArray *CA = cast<ConstantArray>(GV->getInitializer()); for (Use &OP : CA->operands()) { if (isa<ConstantAggregateZero>(OP)) continue; ConstantStruct *CS = cast<ConstantStruct>(OP); @@ -1643,10 +1635,11 @@ AddressSanitizerModule::CreateMetadataGlobal(Module &M, Constant *Initializer, } IRBuilder<> AddressSanitizerModule::CreateAsanModuleDtor(Module &M) { - AsanDtorFunction = + Function *AsanDtorFunction = Function::Create(FunctionType::get(Type::getVoidTy(*C), false), GlobalValue::InternalLinkage, kAsanModuleDtorName, &M); BasicBlock *AsanDtorBB = BasicBlock::Create(*C, "", AsanDtorFunction); + appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndDtorPriority); return IRBuilder<>(ReturnInst::Create(*C, AsanDtorBB)); } @@ -1762,10 +1755,7 @@ void AddressSanitizerModule::InstrumentGlobalsWithMetadataArray( // This function replaces all global variables with new variables that have // trailing redzones. It also creates a function that poisons // redzones and inserts this function into llvm.global_ctors. -// Sets *CtorComdat to true if the global registration code emitted into the -// asan constructor is comdat-compatible. -bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool *CtorComdat) { - *CtorComdat = false; +bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M) { GlobalsMD.init(M); SmallVector<GlobalVariable *, 16> GlobalsToChange; @@ -1775,10 +1765,7 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool } size_t n = GlobalsToChange.size(); - if (n == 0) { - *CtorComdat = true; - return false; - } + if (n == 0) return false; auto &DL = M.getDataLayout(); @@ -1950,36 +1937,17 @@ bool AddressSanitizerModule::runOnModule(Module &M) { if (CompileKernel) return false; - // Create a module constructor. A destructor is created lazily because not all - // platforms, and not all modules need it. + Function *AsanCtorFunction; std::tie(AsanCtorFunction, std::ignore) = createSanitizerCtorAndInitFunctions( M, kAsanModuleCtorName, kAsanInitName, /*InitArgTypes=*/{}, /*InitArgs=*/{}, kAsanVersionCheckName); + appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority); - bool CtorComdat = true; bool Changed = false; // TODO(glider): temporarily disabled globals instrumentation for KASan. if (ClGlobals) { IRBuilder<> IRB(AsanCtorFunction->getEntryBlock().getTerminator()); - Changed |= InstrumentGlobals(IRB, M, &CtorComdat); - } - - // Put the constructor and destructor in comdat if both - // (1) global instrumentation is not TU-specific - // (2) target is ELF. - if (TargetTriple.isOSBinFormatELF() && CtorComdat) { - AsanCtorFunction->setComdat(M.getOrInsertComdat(kAsanModuleCtorName)); - appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority, - AsanCtorFunction); - if (AsanDtorFunction) { - AsanDtorFunction->setComdat(M.getOrInsertComdat(kAsanModuleDtorName)); - appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndDtorPriority, - AsanDtorFunction); - } - } else { - appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority); - if (AsanDtorFunction) - appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndDtorPriority); + Changed |= InstrumentGlobals(IRB, M); } return Changed; |