projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PM] Move TargetLibraryInfo into the Analysis library.
[oota-llvm.git]
/
lib
/
Transforms
/
Instrumentation
/
BoundsChecking.cpp
diff --git
a/lib/Transforms/Instrumentation/BoundsChecking.cpp
b/lib/Transforms/Instrumentation/BoundsChecking.cpp
index 031577ac3f8c85952babe317392df1ca0c920a25..56992564bea8f3693bb093ce6752ca39dd3bba45 100644
(file)
--- a/
lib/Transforms/Instrumentation/BoundsChecking.cpp
+++ b/
lib/Transforms/Instrumentation/BoundsChecking.cpp
@@
-12,22
+12,23
@@
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//
-#define DEBUG_TYPE "bounds-checking"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/MemoryBuiltins.h"
+#include "llvm/Analysis/TargetFolder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/IRBuilder.h"
+#include "llvm/IR/InstIterator.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
-#include "llvm/Support/InstIterator.h"
-#include "llvm/Support/TargetFolder.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/
Target
/TargetLibraryInfo.h"
+#include "llvm/
Analysis
/TargetLibraryInfo.h"
using namespace llvm;
using namespace llvm;
+#define DEBUG_TYPE "bounds-checking"
+
static cl::opt<bool> SingleTrapBB("bounds-checking-single-trap",
cl::desc("Use one trap block per function"));
static cl::opt<bool> SingleTrapBB("bounds-checking-single-trap",
cl::desc("Use one trap block per function"));
@@
-45,15
+46,15
@@
namespace {
initializeBoundsCheckingPass(*PassRegistry::getPassRegistry());
}
initializeBoundsCheckingPass(*PassRegistry::getPassRegistry());
}
-
virtual bool runOnFunction(Function &F)
;
+
bool runOnFunction(Function &F) override
;
- v
irtual void getAnalysisUsage(AnalysisUsage &AU) const
{
- AU.addRequired<DataLayout>();
+ v
oid getAnalysisUsage(AnalysisUsage &AU) const override
{
+ AU.addRequired<DataLayout
Pass
>();
AU.addRequired<TargetLibraryInfo>();
}
private:
AU.addRequired<TargetLibraryInfo>();
}
private:
- const DataLayout *
TD
;
+ const DataLayout *
DL
;
const TargetLibraryInfo *TLI;
ObjectSizeOffsetEvaluator *ObjSizeEval;
BuilderTy *Builder;
const TargetLibraryInfo *TLI;
ObjectSizeOffsetEvaluator *ObjSizeEval;
BuilderTy *Builder;
@@
-61,9
+62,7
@@
namespace {
BasicBlock *TrapBB;
BasicBlock *getTrapBB();
BasicBlock *TrapBB;
BasicBlock *getTrapBB();
- void emitBranchToTrap(Value *Cmp = 0);
- bool computeAllocSize(Value *Ptr, APInt &Offset, Value* &OffsetValue,
- APInt &Size, Value* &SizeValue);
+ void emitBranchToTrap(Value *Cmp = nullptr);
bool instrument(Value *Ptr, Value *Val);
};
}
bool instrument(Value *Ptr, Value *Val);
};
}
@@
-82,6
+81,7
@@
BasicBlock *BoundsChecking::getTrapBB() {
Function *Fn = Inst->getParent()->getParent();
IRBuilder<>::InsertPointGuard Guard(*Builder);
TrapBB = BasicBlock::Create(Fn->getContext(), "trap", Fn);
Function *Fn = Inst->getParent()->getParent();
IRBuilder<>::InsertPointGuard Guard(*Builder);
TrapBB = BasicBlock::Create(Fn->getContext(), "trap", Fn);
+ Builder->SetInsertPoint(TrapBB);
llvm::Value *F = Intrinsic::getDeclaration(Fn->getParent(), Intrinsic::trap);
CallInst *TrapCall = Builder->CreateCall(F);
llvm::Value *F = Intrinsic::getDeclaration(Fn->getParent(), Intrinsic::trap);
CallInst *TrapCall = Builder->CreateCall(F);
@@
-104,7
+104,7
@@
void BoundsChecking::emitBranchToTrap(Value *Cmp) {
if (!C->getZExtValue())
return;
else
if (!C->getZExtValue())
return;
else
- Cmp =
0
; // unconditional branch
+ Cmp =
nullptr
; // unconditional branch
}
++ChecksAdded;
}
++ChecksAdded;
@@
-126,7
+126,7
@@
void BoundsChecking::emitBranchToTrap(Value *Cmp) {
/// size of memory block that is touched.
/// Returns true if any change was made to the IR, false otherwise.
bool BoundsChecking::instrument(Value *Ptr, Value *InstVal) {
/// size of memory block that is touched.
/// Returns true if any change was made to the IR, false otherwise.
bool BoundsChecking::instrument(Value *Ptr, Value *InstVal) {
- uint64_t NeededSize =
TD
->getTypeStoreSize(InstVal->getType());
+ uint64_t NeededSize =
DL
->getTypeStoreSize(InstVal->getType());
DEBUG(dbgs() << "Instrument " << *Ptr << " for " << Twine(NeededSize)
<< " bytes\n");
DEBUG(dbgs() << "Instrument " << *Ptr << " for " << Twine(NeededSize)
<< " bytes\n");
@@
-141,7
+141,7
@@
bool BoundsChecking::instrument(Value *Ptr, Value *InstVal) {
Value *Offset = SizeOffset.second;
ConstantInt *SizeCI = dyn_cast<ConstantInt>(Size);
Value *Offset = SizeOffset.second;
ConstantInt *SizeCI = dyn_cast<ConstantInt>(Size);
- Type *IntTy =
TD
->getIntPtrType(Ptr->getType());
+ Type *IntTy =
DL
->getIntPtrType(Ptr->getType());
Value *NeededSizeVal = ConstantInt::get(IntTy, NeededSize);
// three checks are required to ensure safety:
Value *NeededSizeVal = ConstantInt::get(IntTy, NeededSize);
// three checks are required to ensure safety:
@@
-165,13
+165,14
@@
bool BoundsChecking::instrument(Value *Ptr, Value *InstVal) {
}
bool BoundsChecking::runOnFunction(Function &F) {
}
bool BoundsChecking::runOnFunction(Function &F) {
-
TD = &getAnalysis<DataLayout>
();
+
DL = &getAnalysis<DataLayoutPass>().getDataLayout
();
TLI = &getAnalysis<TargetLibraryInfo>();
TLI = &getAnalysis<TargetLibraryInfo>();
- TrapBB =
0
;
- BuilderTy TheBuilder(F.getContext(), TargetFolder(
TD
));
+ TrapBB =
nullptr
;
+ BuilderTy TheBuilder(F.getContext(), TargetFolder(
DL
));
Builder = &TheBuilder;
Builder = &TheBuilder;
- ObjectSizeOffsetEvaluator TheObjSizeEval(TD, TLI, F.getContext());
+ ObjectSizeOffsetEvaluator TheObjSizeEval(DL, TLI, F.getContext(),
+ /*RoundToAlign=*/true);
ObjSizeEval = &TheObjSizeEval;
// check HANDLE_MEMORY_INST in include/llvm/Instruction.def for memory
ObjSizeEval = &TheObjSizeEval;
// check HANDLE_MEMORY_INST in include/llvm/Instruction.def for memory