diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 57 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp | 28 | 
2 files changed, 48 insertions, 37 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 444add65c5b..318e393afea 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -211,6 +211,7 @@ struct AddressSanitizer : public FunctionPass {    static char ID;  // Pass identification, replacement for typeid   private: +  void initializeCallbacks(Module &M);    uint64_t getAllocaSizeInBytes(AllocaInst *AI) {      Type *Ty = AI->getAllocatedType();      uint64_t SizeInBytes = TD->getTypeAllocSize(Ty); @@ -738,32 +739,8 @@ bool AddressSanitizerModule::runOnModule(Module &M) {    return true;  } -// virtual -bool AddressSanitizer::doInitialization(Module &M) { -  // Initialize the private fields. No one has accessed them before. -  TD = getAnalysisIfAvailable<DataLayout>(); - -  if (!TD) -    return false; -  BL.reset(new BlackList(ClBlackListFile)); -  DynamicallyInitializedGlobals.Init(M); - -  C = &(M.getContext()); -  LongSize = TD->getPointerSizeInBits(); -  IntptrTy = Type::getIntNTy(*C, LongSize); -  IntptrPtrTy = PointerType::get(IntptrTy, 0); - -  AsanCtorFunction = Function::Create( -      FunctionType::get(Type::getVoidTy(*C), false), -      GlobalValue::InternalLinkage, kAsanModuleCtorName, &M); -  BasicBlock *AsanCtorBB = BasicBlock::Create(*C, "", AsanCtorFunction); -  // call __asan_init in the module ctor. -  IRBuilder<> IRB(ReturnInst::Create(*C, AsanCtorBB)); -  AsanInitFunction = checkInterfaceFunction( -      M.getOrInsertFunction(kAsanInitName, IRB.getVoidTy(), NULL)); -  AsanInitFunction->setLinkage(Function::ExternalLinkage); -  IRB.CreateCall(AsanInitFunction); - +void AddressSanitizer::initializeCallbacks(Module &M) { +  IRBuilder<> IRB(*C);    // Create __asan_report* callbacks.    for (size_t AccessIsWrite = 0; AccessIsWrite <= 1; AccessIsWrite++) {      for (size_t AccessSizeIndex = 0; AccessSizeIndex < kNumberOfAccessSizes; @@ -790,6 +767,33 @@ bool AddressSanitizer::doInitialization(Module &M) {    EmptyAsm = InlineAsm::get(FunctionType::get(IRB.getVoidTy(), false),                              StringRef(""), StringRef(""),                              /*hasSideEffects=*/true); +} + +// virtual +bool AddressSanitizer::doInitialization(Module &M) { +  // Initialize the private fields. No one has accessed them before. +  TD = getAnalysisIfAvailable<DataLayout>(); + +  if (!TD) +    return false; +  BL.reset(new BlackList(ClBlackListFile)); +  DynamicallyInitializedGlobals.Init(M); + +  C = &(M.getContext()); +  LongSize = TD->getPointerSizeInBits(); +  IntptrTy = Type::getIntNTy(*C, LongSize); +  IntptrPtrTy = PointerType::get(IntptrTy, 0); + +  AsanCtorFunction = Function::Create( +      FunctionType::get(Type::getVoidTy(*C), false), +      GlobalValue::InternalLinkage, kAsanModuleCtorName, &M); +  BasicBlock *AsanCtorBB = BasicBlock::Create(*C, "", AsanCtorFunction); +  // call __asan_init in the module ctor. +  IRBuilder<> IRB(ReturnInst::Create(*C, AsanCtorBB)); +  AsanInitFunction = checkInterfaceFunction( +      M.getOrInsertFunction(kAsanInitName, IRB.getVoidTy(), NULL)); +  AsanInitFunction->setLinkage(Function::ExternalLinkage); +  IRB.CreateCall(AsanInitFunction);    llvm::Triple targetTriple(M.getTargetTriple());    bool isAndroid = targetTriple.getEnvironment() == llvm::Triple::Android; @@ -857,6 +861,7 @@ bool AddressSanitizer::runOnFunction(Function &F) {    if (BL->isIn(F)) return false;    if (&F == AsanCtorFunction) return false;    DEBUG(dbgs() << "ASAN instrumenting:\n" << F << "\n"); +  initializeCallbacks(*F.getParent());    // If needed, insert __asan_init before checking for AddressSafety attr.    maybeInsertAsanInitAtFunctionEntry(F); diff --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp index cdfaedf47c6..cbdd7ae55f8 100644 --- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -78,6 +78,7 @@ struct ThreadSanitizer : public FunctionPass {    static char ID;  // Pass identification, replacement for typeid.   private: +  void initializeCallbacks(Module &M);    bool instrumentLoadOrStore(Instruction *I);    bool instrumentAtomic(Instruction *I);    void chooseInstructionsToInstrument(SmallVectorImpl<Instruction*> &Local, @@ -130,18 +131,8 @@ static Function *checkInterfaceFunction(Constant *FuncOrBitcast) {    report_fatal_error("ThreadSanitizer interface function redefined");  } -bool ThreadSanitizer::doInitialization(Module &M) { -  TD = getAnalysisIfAvailable<DataLayout>(); -  if (!TD) -    return false; -  BL.reset(new BlackList(ClBlackListFile)); - -  // Always insert a call to __tsan_init into the module's CTORs. +void ThreadSanitizer::initializeCallbacks(Module &M) {    IRBuilder<> IRB(M.getContext()); -  Value *TsanInit = M.getOrInsertFunction("__tsan_init", -                                          IRB.getVoidTy(), NULL); -  appendToGlobalCtors(M, cast<Function>(TsanInit), 0); -    // Initialize the callbacks.    TsanFuncEntry = checkInterfaceFunction(M.getOrInsertFunction(        "__tsan_func_entry", IRB.getVoidTy(), IRB.getInt8PtrTy(), NULL)); @@ -209,6 +200,20 @@ bool ThreadSanitizer::doInitialization(Module &M) {        "__tsan_atomic_thread_fence", IRB.getVoidTy(), OrdTy, NULL));    TsanAtomicSignalFence = checkInterfaceFunction(M.getOrInsertFunction(        "__tsan_atomic_signal_fence", IRB.getVoidTy(), OrdTy, NULL)); +} + +bool ThreadSanitizer::doInitialization(Module &M) { +  TD = getAnalysisIfAvailable<DataLayout>(); +  if (!TD) +    return false; +  BL.reset(new BlackList(ClBlackListFile)); + +  // Always insert a call to __tsan_init into the module's CTORs. +  IRBuilder<> IRB(M.getContext()); +  Value *TsanInit = M.getOrInsertFunction("__tsan_init", +                                          IRB.getVoidTy(), NULL); +  appendToGlobalCtors(M, cast<Function>(TsanInit), 0); +    return true;  } @@ -299,6 +304,7 @@ static bool isAtomic(Instruction *I) {  bool ThreadSanitizer::runOnFunction(Function &F) {    if (!TD) return false;    if (BL->isIn(F)) return false; +  initializeCallbacks(*F.getParent());    SmallVector<Instruction*, 8> RetVec;    SmallVector<Instruction*, 8> AllLoadsAndStores;    SmallVector<Instruction*, 8> LocalLoadsAndStores;  | 

