30 #ifndef PATHALLOCATOR_H_ 31 #define PATHALLOCATOR_H_ 103 CondToTermInstMap::const_iterator it =
condToInstMap.find(cond);
126 inline Condition*
condAnd(Condition* lhs, Condition* rhs)
130 inline Condition*
condOr(Condition* lhs, Condition* rhs)
268 BBToCondMap::const_iterator it =
bbToCondMap.find(bb);
DdNode * AND(DdNode *lhs, DdNode *rhs)
Operations on conditions.
bool isTestNullExpr(const Value *test, const Value *val) const
Return true if this is a test null expression.
virtual void allocateForBB(const BasicBlock &bb)
Allocate path condition for every basic block.
Condition * getBranchCond(const BasicBlock *bb, const BasicBlock *succ) const
Get branch condition.
llvm::BranchInst BranchInst
virtual Condition * ComputeInterCallVFGGuard(const BasicBlock *src, const BasicBlock *dst, const BasicBlock *callBB)
void printDbg(Condition *cond)
Print debug information for this condition.
llvm::BasicBlock BasicBlock
Condition * evaluateBranchCond(const BasicBlock *bb, const BasicBlock *succ, const Value *val)
Evaluate branch conditions.
Condition * evaluateTestNullLikeExpr(const BranchInst *brInst, const BasicBlock *succ, const Value *val)
Return branch condition after evaluating test null like expression.
NodeBS exactCondElem(Condition *cond)
Iterator every element of the bdd.
Condition * getEvalBrCond(const BasicBlock *bb, const BasicBlock *succ)
Get a condition, evaluate the value for conditions if necessary (e.g., testNull like express) ...
const Value * getCurEvalVal() const
Get current value for branch condition evaluation.
Set< const BasicBlock * > BasicBlockSet
Condition * getTrueCond() const
bool setCFCond(const BasicBlock *bb, Condition *cond)
Get/Set control-flow conditions.
void setCurEvalVal(const Value *val)
Set current value for branch condition evaluation.
PostDominatorTree * getPostDT(const Function *fun)
Get Postdominators.
Condition * evaluateLoopExitBranch(const BasicBlock *bb, const BasicBlock *succ)
Evaluate loop exit branch.
static u32_t getMaxLiveCondNumber()
void printPathCond()
Print out the path condition information.
DominatorTree * getDT(const Function *fun)
Get dominators.
void BddSupport(DdNode *f, NodeBS &support) const
IndexToConditionMap indexToDDNodeMap
Condition * condOr(Condition *lhs, Condition *rhs)
Map< const Function *, BasicBlockSet > FunToExitBBsMap
map a function to all its basic blocks calling program exit
DdNode * getTrueCond() const
const Value * curEvalVal
current llvm value to evaluate branch condition when computing guards
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map
static BddCondManager * bddCondMgr
bbd manager
Condition * newCond(const Instruction *inst)
Allocate a new condition.
FunToExitBBsMap funToExitBBsMap
map a function to all its basic blocks calling program exit
Condition * getCond(u32_t i) const
Given an index, get its condition.
PostDominatorTree * getPostDT(const Function *f)
Get post dominator tree of a function.
llvm::PostDominatorTree PostDominatorTree
void markForRelease(Condition *cond)
Decrease reference counting for the bdd.
bool isTestContainsNullAndTheValue(const CmpInst *cmp, const Value *val) const
Return true if two values on the predicate are what we want.
BBCondMap bbConds
map basic block to its successors/predecessors branch conditions
static Condition * trueCond()
virtual ~PathCondAllocator()
Destructor.
CondToTermInstMap condToInstMap
map a condition to its corresponding llvm instruction
DdNode * Cudd_bdd(u32_t i)
Condition * getFalseCond() const
void setBranchCond(const BasicBlock *bb, const BasicBlock *succ, Condition *cond)
Get/Set a branch condition, and its terminator instruction.
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
LoopInfo * getLoopInfo(const Function *f)
Get loop info of a function.
llvm::Instruction Instruction
bool isNECmp(const CmpInst *cmp) const
Return true if the predicate of this compare instruction is not equal.
Condition * evaluateProgExit(const BranchInst *brInst, const BasicBlock *succ)
Return condition when there is a branch calls program exit.
bool isEQCmp(const CmpInst *cmp) const
Evaluate test null/not null like expressions.
LoopInfo * getLoopInfo(const Function *f)
Get LoopInfo.
PTACFInfoBuilder cfInfoBuilder
map a function to its loop info
virtual Condition * ComputeInterRetVFGGuard(const BasicBlock *src, const BasicBlock *dst, const BasicBlock *retBB)
BBToCondMap bbToCondMap
map a basic block to its path condition starting from root
llvm::DominatorTree DominatorTree
static BddCondManager * getBddCondManager()
Used internally, not supposed to be exposed to other classes.
static u32_t getMemUsage()
Statistics.
u32_t getMaxLiveCondNumber()
DominatorTree * getDT(const Function *f)
Get dominator tree of a function.
Condition * condAnd(Condition *lhs, Condition *rhs)
Condition operations.
FIFOWorkList< const BasicBlock * > CFWorkList
worklist for control-flow guard computation
DdNode * getFalseCond() const
void allocate(const SVFModule *module)
Perform path allocation.
bool isTestNotNullExpr(const Value *test, const Value *val) const
Return true if this is a test not null expression.
DdNode * OR(DdNode *lhs, DdNode *rhs)
Map< u32_t, Condition * > CondPosMap
map a branch to its Condition
PathCondAllocator()
Constructor.
Condition * condNeg(Condition *cond)
void destroy()
Release memory.
std::string dumpStr(DdNode *lhs) const
Condition * getCFCond(const BasicBlock *bb) const
DdNode * NEG(DdNode *lhs)
Map< const BasicBlock *, Condition * > BBToCondMap
map a basic block to its condition during control-flow guard computation
llvm::SparseBitVector NodeBS
Condition * createNewCond(u32_t i)
Create new BDD condition.
bool isBBCallsProgExit(const BasicBlock *bb)
static u32_t totalCondNum
static Condition * falseCond()
Map< u32_t, Condition * > IndexToConditionMap
std::string dumpCond(Condition *cond) const
void collectBBCallingProgExit(const BasicBlock &bb)
Collect basic block contains program exit function call.
const Instruction * getCondInst(const Condition *cond) const
Get llvm conditional expression.
virtual Condition * ComputeIntraVFGGuard(const BasicBlock *src, const BasicBlock *dst)
Guard Computation for a value-flow (between two basic blocks)
virtual Condition * getPHIComplementCond(const BasicBlock *BB1, const BasicBlock *BB2, const BasicBlock *BB0)
Map< const BasicBlock *, CondPosMap > BBCondMap
Map< const Condition *, const Instruction *> CondToTermInstMap
static u32_t getCondNum()
void markForRelease(DdNode *cond)