diff options
Diffstat (limited to 'llvm/lib')
| -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; | 

