From 512be1f83e3481403c0ce5ce678254388a6fb852 Mon Sep 17 00:00:00 2001 From: Nuno Lopes Date: Sat, 23 Jun 2012 00:12:34 +0000 Subject: [PATCH] BoundsChecking: attach debug info to traps to make my life a bit more sane git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159055 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/BoundsChecking.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/Transforms/Scalar/BoundsChecking.cpp b/lib/Transforms/Scalar/BoundsChecking.cpp index 6729dd20598..ce7438cf0ef 100644 --- a/lib/Transforms/Scalar/BoundsChecking.cpp +++ b/lib/Transforms/Scalar/BoundsChecking.cpp @@ -54,7 +54,7 @@ namespace { const TargetData *TD; ObjectSizeOffsetEvaluator *ObjSizeEval; BuilderTy *Builder; - Function *Fn; + Instruction *Inst; BasicBlock *TrapBB; unsigned Penalty; @@ -80,6 +80,7 @@ BasicBlock *BoundsChecking::getTrapBB() { if (TrapBB && SingleTrapBB) return TrapBB; + Function *Fn = Inst->getParent()->getParent(); BasicBlock::iterator PrevInsertPoint = Builder->GetInsertPoint(); TrapBB = BasicBlock::Create(Fn->getContext(), "trap", Fn); Builder->SetInsertPoint(TrapBB); @@ -88,6 +89,7 @@ BasicBlock *BoundsChecking::getTrapBB() { CallInst *TrapCall = Builder->CreateCall(F); TrapCall->setDoesNotReturn(); TrapCall->setDoesNotThrow(); + TrapCall->setDebugLoc(Inst->getDebugLoc()); Builder->CreateUnreachable(); Builder->SetInsertPoint(PrevInsertPoint); @@ -140,7 +142,7 @@ bool BoundsChecking::instrument(Value *Ptr, Value *InstVal) { Value *Size = SizeOffset.first; Value *Offset = SizeOffset.second; - IntegerType *IntTy = TD->getIntPtrType(Fn->getContext()); + IntegerType *IntTy = TD->getIntPtrType(Inst->getContext()); Value *NeededSizeVal = ConstantInt::get(IntTy, NeededSize); // three checks are required to ensure safety: @@ -163,7 +165,6 @@ bool BoundsChecking::runOnFunction(Function &F) { TD = &getAnalysis(); TrapBB = 0; - Fn = &F; BuilderTy TheBuilder(F.getContext(), TargetFolder(TD)); Builder = &TheBuilder; ObjectSizeOffsetEvaluator TheObjSizeEval(TD, F.getContext()); @@ -182,16 +183,16 @@ bool BoundsChecking::runOnFunction(Function &F) { bool MadeChange = false; for (std::vector::iterator i = WorkList.begin(), e = WorkList.end(); i != e; ++i) { - Instruction *I = *i; + Inst = *i; - Builder->SetInsertPoint(I); - if (LoadInst *LI = dyn_cast(I)) { + Builder->SetInsertPoint(Inst); + if (LoadInst *LI = dyn_cast(Inst)) { MadeChange |= instrument(LI->getPointerOperand(), LI); - } else if (StoreInst *SI = dyn_cast(I)) { + } else if (StoreInst *SI = dyn_cast(Inst)) { MadeChange |= instrument(SI->getPointerOperand(), SI->getValueOperand()); - } else if (AtomicCmpXchgInst *AI = dyn_cast(I)) { + } else if (AtomicCmpXchgInst *AI = dyn_cast(Inst)) { MadeChange |= instrument(AI->getPointerOperand(),AI->getCompareOperand()); - } else if (AtomicRMWInst *AI = dyn_cast(I)) { + } else if (AtomicRMWInst *AI = dyn_cast(Inst)) { MadeChange |= instrument(AI->getPointerOperand(), AI->getValOperand()); } else { llvm_unreachable("unknown Instruction type");