diff options
| author | Kostya Serebryany <kcc@google.com> | 2012-07-16 14:09:42 +0000 | 
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2012-07-16 14:09:42 +0000 | 
| commit | 4273bb05d17ffdb18164b89a52f9fb1196acb51f (patch) | |
| tree | 4f1542e96563701c5df16690f34cfc85734921ed /llvm/lib/Transforms/Instrumentation | |
| parent | 277f6cf8051d2d48b5d8757dc807e5bf8855cd87 (diff) | |
| download | bcm5719-llvm-4273bb05d17ffdb18164b89a52f9fb1196acb51f.tar.gz bcm5719-llvm-4273bb05d17ffdb18164b89a52f9fb1196acb51f.zip  | |
[asan] initialize asan error callbacks in runOnModule instead of doing that on-demand
llvm-svn: 160269
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 28 | 
1 files changed, 20 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 482ebef2a23..3f1c9843cb5 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -180,7 +180,6 @@ struct AddressSanitizer : public ModulePass {                     Value *ShadowBase, bool DoPoison);    bool LooksLikeCodeInBug11395(Instruction *I); -  Module      *CurrentModule;    LLVMContext *C;    TargetData *TD;    uint64_t MappingOffset; @@ -193,6 +192,10 @@ struct AddressSanitizer : public ModulePass {    Function *AsanInitFunction;    Instruction *CtorInsertBefore;    OwningPtr<FunctionBlackList> BL; +  // Accesses sizes are powers of two: 1, 2, 4, 8, 16. +  static const size_t kNumberOfAccessSizes = 5; +  // This array is indexed by AccessIsWrite and log2(AccessSize). +  Function *AsanErrorCallback[2][kNumberOfAccessSizes];  };  }  // namespace @@ -361,12 +364,10 @@ Function *AddressSanitizer::checkInterfaceFunction(Constant *FuncOrBitcast) {  Instruction *AddressSanitizer::generateCrashCode(      IRBuilder<> &IRB, Value *Addr, bool IsWrite, uint32_t TypeSize) { -  // IsWrite and TypeSize are encoded in the function name. -  std::string FunctionName = std::string(kAsanReportErrorTemplate) + -      (IsWrite ? "store" : "load") + itostr(TypeSize / 8); -  Value *ReportWarningFunc = CurrentModule->getOrInsertFunction( -      FunctionName, IRB.getVoidTy(), IntptrTy, NULL); -  CallInst *Call = IRB.CreateCall(ReportWarningFunc, Addr); +  size_t AccessSizeIndex = CountTrailingZeros_32(TypeSize / 8); +  assert(AccessSizeIndex < kNumberOfAccessSizes); +  CallInst *Call = IRB.CreateCall(AsanErrorCallback[IsWrite][AccessSizeIndex], +                                  Addr);    Call->setDoesNotReturn();    return Call;  } @@ -581,7 +582,6 @@ bool AddressSanitizer::runOnModule(Module &M) {      return false;    BL.reset(new FunctionBlackList(ClBlackListFile)); -  CurrentModule = &M;    C = &(M.getContext());    LongSize = TD->getPointerSizeInBits();    IntptrTy = Type::getIntNTy(*C, LongSize); @@ -600,6 +600,18 @@ bool AddressSanitizer::runOnModule(Module &M) {    AsanInitFunction->setLinkage(Function::ExternalLinkage);    IRB.CreateCall(AsanInitFunction); +  // Create __asan_report* callbacks. +  for (size_t AccessIsWrite = 0; AccessIsWrite <= 1; AccessIsWrite++) { +    for (size_t AccessSizeIndex = 0; AccessSizeIndex < kNumberOfAccessSizes; +         AccessSizeIndex++) { +      // IsWrite and TypeSize are encoded in the function name. +      std::string FunctionName = std::string(kAsanReportErrorTemplate) + +          (AccessIsWrite ? "store" : "load") + itostr(1 << AccessSizeIndex); +      AsanErrorCallback[AccessIsWrite][AccessSizeIndex] = cast<Function>( +        M.getOrInsertFunction(FunctionName, IRB.getVoidTy(), IntptrTy, NULL)); +    } +  } +    llvm::Triple targetTriple(M.getTargetTriple());    bool isAndroid = targetTriple.getEnvironment() == llvm::Triple::ANDROIDEABI;  | 

