diff options
| author | Alex Shlyapnikov <alekseys@google.com> | 2017-03-27 23:11:50 +0000 | 
|---|---|---|
| committer | Alex Shlyapnikov <alekseys@google.com> | 2017-03-27 23:11:50 +0000 | 
| commit | bbd5cc63d7be58d8f63bc4a3cac4c0769efc6337 (patch) | |
| tree | 76fe1fb870abc892886dec45a39df4e824eec5c5 /llvm | |
| parent | 09171aa31fda68c219b5a8da83d7bc77859c6ba5 (diff) | |
| download | bcm5719-llvm-bbd5cc63d7be58d8f63bc4a3cac4c0769efc6337.tar.gz bcm5719-llvm-bbd5cc63d7be58d8f63bc4a3cac4c0769efc6337.zip  | |
Revert "[asan] Delay creation of asan ctor."
Speculative revert. Some libfuzzer tests are affected.
This reverts commit r298731.
llvm-svn: 298890
Diffstat (limited to 'llvm')
4 files changed, 23 insertions, 31 deletions
diff --git a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h index f5e843e2e8b..27508799f8e 100644 --- a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h +++ b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h @@ -46,9 +46,6 @@ void appendToGlobalDtors(Module &M, Function *F, int Priority,  // getOrInsertFunction returns a bitcast.  Function *checkSanitizerInterfaceFunction(Constant *FuncOrBitcast); -Function *declareSanitizerInitFunction(Module &M, StringRef InitName, -                                       ArrayRef<Type *> InitArgTypes); -  /// \brief Creates sanitizer constructor function, and calls sanitizer's init  /// function from it.  /// \return Returns pair of pointers to constructor, and init functions diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index ae047239d82..8784fa989ea 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -576,6 +576,8 @@ struct AddressSanitizer : public FunctionPass {    Type *IntptrTy;    ShadowMapping Mapping;    DominatorTree *DT; +  Function *AsanCtorFunction = nullptr; +  Function *AsanInitFunction = nullptr;    Function *AsanHandleNoReturnFunc;    Function *AsanPtrCmpFunction, *AsanPtrSubFunction;    // This array is indexed by AccessIsWrite, Experiment and log2(AccessSize). @@ -1934,19 +1936,13 @@ bool AddressSanitizerModule::runOnModule(Module &M) {    Mapping = getShadowMapping(TargetTriple, LongSize, CompileKernel);    initializeCallbacks(M); -  if (CompileKernel) -    return false; - -  Function *AsanCtorFunction; -  std::tie(AsanCtorFunction, std::ignore) = createSanitizerCtorAndInitFunctions( -      M, kAsanModuleCtorName, kAsanInitName, /*InitArgTypes=*/{}, -      /*InitArgs=*/{}, kAsanVersionCheckName); -  appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority); -    bool Changed = false; +    // TODO(glider): temporarily disabled globals instrumentation for KASan. -  if (ClGlobals) { -    IRBuilder<> IRB(AsanCtorFunction->getEntryBlock().getTerminator()); +  if (ClGlobals && !CompileKernel) { +    Function *CtorFunc = M.getFunction(kAsanModuleCtorName); +    assert(CtorFunc); +    IRBuilder<> IRB(CtorFunc->getEntryBlock().getTerminator());      Changed |= InstrumentGlobals(IRB, M);    } @@ -2015,6 +2011,7 @@ void AddressSanitizer::initializeCallbacks(Module &M) {  // virtual  bool AddressSanitizer::doInitialization(Module &M) {    // Initialize the private fields. No one has accessed them before. +    GlobalsMD.init(M);    C = &(M.getContext()); @@ -2022,6 +2019,13 @@ bool AddressSanitizer::doInitialization(Module &M) {    IntptrTy = Type::getIntNTy(*C, LongSize);    TargetTriple = Triple(M.getTargetTriple()); +  if (!CompileKernel) { +    std::tie(AsanCtorFunction, AsanInitFunction) = +        createSanitizerCtorAndInitFunctions( +            M, kAsanModuleCtorName, kAsanInitName, +            /*InitArgTypes=*/{}, /*InitArgs=*/{}, kAsanVersionCheckName); +    appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority); +  }    Mapping = getShadowMapping(TargetTriple, LongSize, CompileKernel);    return true;  } @@ -2040,8 +2044,6 @@ bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) {    // We cannot just ignore these methods, because they may call other    // instrumented functions.    if (F.getName().find(" load]") != std::string::npos) { -    Function *AsanInitFunction = -        declareSanitizerInitFunction(*F.getParent(), kAsanInitName, {});      IRBuilder<> IRB(&F.front(), F.front().begin());      IRB.CreateCall(AsanInitFunction, {});      return true; @@ -2089,6 +2091,7 @@ void AddressSanitizer::markEscapedLocalAllocas(Function &F) {  }  bool AddressSanitizer::runOnFunction(Function &F) { +  if (&F == AsanCtorFunction) return false;    if (F.getLinkage() == GlobalValue::AvailableExternallyLinkage) return false;    if (!ClDebugFunc.empty() && ClDebugFunc == F.getName()) return false;    if (F.getName().startswith("__asan_")) return false; diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp index dbe42c201dd..617c8f7175d 100644 --- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp +++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp @@ -138,17 +138,6 @@ Function *llvm::checkSanitizerInterfaceFunction(Constant *FuncOrBitcast) {    report_fatal_error(Err);  } -Function *llvm::declareSanitizerInitFunction(Module &M, StringRef InitName, -                                             ArrayRef<Type *> InitArgTypes) { -  assert(!InitName.empty() && "Expected init function name"); -  Function *F = checkSanitizerInterfaceFunction(M.getOrInsertFunction( -      InitName, -      FunctionType::get(Type::getVoidTy(M.getContext()), InitArgTypes, false), -      AttributeList())); -  F->setLinkage(Function::ExternalLinkage); -  return F; -} -  std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions(      Module &M, StringRef CtorName, StringRef InitName,      ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs, @@ -156,13 +145,16 @@ std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions(    assert(!InitName.empty() && "Expected init function name");    assert(InitArgs.size() == InitArgTypes.size() &&           "Sanitizer's init function expects different number of arguments"); -  Function *InitFunction = -      declareSanitizerInitFunction(M, InitName, InitArgTypes);    Function *Ctor = Function::Create(        FunctionType::get(Type::getVoidTy(M.getContext()), false),        GlobalValue::InternalLinkage, CtorName, &M);    BasicBlock *CtorBB = BasicBlock::Create(M.getContext(), "", Ctor);    IRBuilder<> IRB(ReturnInst::Create(M.getContext(), CtorBB)); +  Function *InitFunction = +      checkSanitizerInterfaceFunction(M.getOrInsertFunction( +          InitName, FunctionType::get(IRB.getVoidTy(), InitArgTypes, false), +          AttributeList())); +  InitFunction->setLinkage(Function::ExternalLinkage);    IRB.CreateCall(InitFunction, InitArgs);    if (!VersionCheckName.empty()) {      Function *VersionCheckFunction = diff --git a/llvm/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll b/llvm/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll index 8341697ff48..01a7a6610ca 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll @@ -16,10 +16,10 @@ entry:  ; OPT1: IncrementMe  ; OPT1: __asan_report_  ; OPT1-NOT: __asan_report_ -; OPT1: ret void +; OPT1: asan.module_ctor  ; Without optimizations we should see two calls to __asan_report_*  ; OPT0: IncrementMe  ; OPT0: __asan_report_  ; OPT0: __asan_report_ -; OPT0: ret void +; OPT0: asan.module_ctor  | 

