| #ifndef INSERT_BOUNDS_H |
| #define INSERT_BOUNDS_H |
| |
| #include "safecode/Config/config.h" |
| #include "ConvertUnsafeAllocas.h" |
| #include "llvm/Analysis/ScalarEvolutionExpressions.h" |
| #include "llvm/Pass.h" |
| |
| #ifndef LLVA_KERNEL |
| #include "SafeDynMemAlloc.h" |
| #include "poolalloc/PoolAllocate.h" |
| #endif |
| |
| #include <map> |
| #include <set> |
| |
| #ifdef LLVA_KERNEL |
| #define LLVA_ICONTEXT_SIZE (18*4) |
| #define LLVA_INTEGERSTATE_SIZE (18*4) |
| #define LLVA_FPSTATE_SIZE (27*4) |
| #endif |
| namespace llvm { |
| |
| ModulePass *creatInsertPoolChecks(); |
| using namespace CUA; |
| |
| struct PreInsertPoolChecks : public ModulePass { |
| public: |
| virtual bool runOnModule (Module & M); |
| virtual void getAnalysisUsage(AnalysisUsage &AU) const { |
| // Required passes |
| AU.addRequired<ConvertUnsafeAllocas>(); |
| AU.addRequired<TDDataStructures>(); |
| AU.addRequired<TargetData>(); |
| |
| // Preserved passes |
| AU.addPreserved<ConvertUnsafeAllocas>(); |
| AU.addPreserved<TDDataStructures>(); |
| } |
| |
| bool nodeNeedsAlignment (DSNode * Node) { |
| return ((AlignmentNodes.find (Node)) != (AlignmentNodes.end())); |
| } |
| private: |
| // Private variables |
| CUA::ConvertUnsafeAllocas * cuaPass; |
| TDDataStructures * TDPass; |
| TargetData * TD; |
| |
| // Set of DSNodes that require alignment checks |
| std::set<DSNode *> AlignmentNodes; |
| |
| // External functions in the SAFECode run-time library |
| Function *PoolCheck; |
| Function *PoolCheckArray; |
| Function *PoolCheckIArray; |
| Function *ExactCheck; |
| Function *FunctionCheck; |
| Function *FunctionCheckT; |
| Function *FunctionCheckG; |
| Function *ICCheck; |
| Function *BoundsCheck; |
| Function *UIBoundsCheck; |
| Function *getBounds; |
| Function *UIgetBounds; |
| Function *ExactCheck2; |
| Function *ExactCheck3; |
| Function *GetActualValue; |
| Function *PoolRegister; |
| Function *StackRegister; |
| Function *ObjFree; |
| Function *StackFree; |
| Function *FuncRegister; |
| Function *PoolRegMP; |
| Function *PoolFindMP; |
| Function *getBegin; |
| Function *getEnd; |
| |
| // Private methods |
| void addPoolCheckProto(Module &M); |
| void registerGlobalArraysWithGlobalPools(Module &M); |
| void addLinksNeedingAlignment (DSNode * Node); |
| Value * createPoolHandle (const Value * V, Function * F); |
| Value * createPoolHandle (Module & M, DSNode * Node); |
| Value* getPD(DSNode* N, Module& M) { |
| if (!N) return 0; |
| createPoolHandle (M, N); |
| if (N->getMP()) |
| return N->getMP()->getMetaPoolValue(); |
| else |
| return 0; |
| } |
| }; |
| |
| struct InsertPoolChecks : public FunctionPass { |
| public : |
| const char *getPassName() const { return "Inserting pool checks for array bounds "; } |
| virtual bool doInitialization (Module &M); |
| virtual bool doFinalization (Module &M); |
| virtual bool runOnFunction (Function & F); |
| virtual void getAnalysisUsage(AnalysisUsage &AU) const { |
| AU.addRequired<PreInsertPoolChecks>(); |
| AU.addRequired<ConvertUnsafeAllocas>(); |
| AU.addRequired<ScalarEvolution>(); |
| AU.addRequired<LoopInfo>(); |
| #if 0 |
| AU.addRequired<CompleteBUDataStructures>(); |
| AU.addRequired<TDDataStructures>(); |
| #endif |
| #ifndef LLVA_KERNEL |
| AU.addRequired<EquivClassGraphs>(); |
| AU.addRequired<PoolAllocate>(); |
| AU.addRequired<EmbeCFreeRemoval>(); |
| AU.addRequired<TargetData>(); |
| #else |
| AU.addRequired<TDDataStructures>(); |
| AU.addRequired<TargetData>(); |
| #endif |
| }; |
| |
| private : |
| // Prerequisite passes |
| PreInsertPoolChecks * preSCPass; |
| CUA::ConvertUnsafeAllocas * cuaPass; |
| ScalarEvolution * scevPass; |
| LoopInfo *LI; |
| TargetData * TD; |
| #ifndef LLVA_KERNEL |
| PoolAllocate * paPass; |
| EquivClassGraphs *equivPass; |
| EmbeCFreeRemoval *efPass; |
| #else |
| TDDataStructures * TDPass; |
| #endif |
| |
| // Map of DSNode to Function List Global Variables |
| std::map<Value *, GlobalVariable *> FuncListMap; |
| |
| // Set of DSNodes for which we do full bounds checks |
| std::set<DSNode *> PHNeeded; |
| |
| // Functions |
| Function *PoolCheck; |
| Function *PoolCheckAlign; |
| Function *PoolCheckUI; |
| Function *PoolCheckAlignUI; |
| Function *PoolCheckArray; |
| Function *PoolCheckIArray; |
| Function *ExactCheck; |
| Function *FunctionCheck; |
| Function *FunctionCheckT; |
| Function *FunctionCheckG; |
| Function *ICCheck; |
| Function *BoundsCheck; |
| Function *UIBoundsCheck; |
| Function *getBounds; |
| Function *UIgetBounds; |
| Function *ExactCheck2; |
| Function *ExactCheck3; |
| Function *GetActualValue; |
| Function *PoolRegister; |
| Function *StackRegister; |
| Function *ObjFree; |
| Function *StackFree; |
| Function *FuncRegister; |
| Function *KmemCachegetSize; |
| Function *PoolRegMP; |
| Function *PoolFindMP; |
| Function *getBegin; |
| Function *getEnd; |
| |
| void simplifyGEPList(); |
| void addObjFrees(Module& M); |
| void addMetaPools(Module& M, MetaPool* MP, DSNode* N); |
| void addPoolCheckProto(Module &M); |
| void addPoolChecks(Module &M); |
| void addGetElementPtrChecks(Module &M); |
| DSNode* getDSNode(const Value *V, Function *F); |
| unsigned getDSNodeOffset(const Value *V, Function *F); |
| void addLoadStoreChecks (Function & F); |
| void insertAlignmentCheck (LoadInst * LI); |
| void TransformFunction(Function &F); |
| void handleCallInst(CallInst *CI); |
| void handleGetElementPtr(GetElementPtrInst *MAI); |
| void addGetActualValue(SetCondInst *SCI, unsigned operand); |
| void registerAllocaInst(AllocaInst *AI, AllocaInst *AIOrig); |
| GlobalVariable * getOrCreateFunctionTable (DSNode * Node, Value * PH, Module * M); |
| void addExactCheck (Instruction * GEP, Value * Index, Value * Bound); |
| void addExactCheck (Value * Pointer, Value * Index, Value * Bound, Instruction * InsertPt); |
| void addExactCheck2 (Value * Base, Value * Result, Value * Bound, Instruction * InsertPt); |
| Value * addExactCheck3 (Value * Source, Value * Result, Value * Bound, Instruction * Next); |
| bool insertExactCheck (GetElementPtrInst * GEP); |
| bool insertExactCheck (Instruction * , Value *, Value *, Instruction *); |
| void insertFunctionCheck(CallInst* CI); |
| void insertICCheck (Value * Pointer, Instruction * InsertPt); |
| Value * insertBoundsCheck (Instruction * , Value *, Value *, Instruction *); |
| bool AggregateGEPs (GetElementPtrInst * GEP, std::set<Instruction *> & GEPs); |
| bool findCheckedPointer (Value * PointerOperand); |
| void addHeapRegs (Module & M); |
| |
| #ifndef LLVA_KERNEL |
| void addLSChecks(Value *Vnew, const Value *V, Instruction *I, Function *F); |
| Value * getPoolHandle(const Value *V, Function *F, PA::FuncInfo &FI, bool collapsed = false); |
| #else |
| Value* getPD(DSNode* N, Module& M) { |
| if (!N) return 0; |
| addMetaPools(M, N->getMP(), N); |
| if (N->getMP()) |
| return N->getMP()->getMetaPoolValue(); |
| else |
| return 0; |
| } |
| void addLSChecks(Value *V, Instruction *I, Function *F); |
| Value * getPoolHandle(const Value *V, Function *F); |
| #endif |
| }; |
| } |
| #endif |