ClearBlue
SymbolicExprGraphBuilder.h
1 /*
2  * SEG construction wrapper.
3  *
4  * Author: Fan Gang, qingkai
5  */
6 
7 #ifndef IR_SEG_SYMBOLICEXPRGRAPHBUILDER_H
8 #define IR_SEG_SYMBOLICEXPRGRAPHBUILDER_H
9 
10 #include <llvm/IR/Function.h>
11 #include <llvm/IR/Operator.h>
12 #include <llvm/Pass.h>
13 #include <mutex>
14 #include <string>
15 #include <unordered_map>
16 
17 #include "Analysis/Bitcode/TSDataLayout.h"
18 #include "Analysis/CallGraph/CBCallGraph.h"
19 #include "IR/SEG/SEGMapBase.h"
20 #include "IR/SEG/SymbolicExprGraph.h"
21 
22 using namespace llvm;
23 
24 class SEGOperandNode;
25 class SEGLoadMemNode;
26 class SEGStoreMemNode;
27 class CFGReachabilityAnalysis;
28 class ControlDependenceAnalysis;
29 class DebugInfoAnalysis;
30 class FalconAA;
31 class FunctionPropertyPass;
32 class TypeInference;
33 
34 namespace FalconPlus {
35 class FalconAA;
36 }
37 
38 class SymbolicExprGraphBuilder : public ModulePass, public SEGMapBase {
39 public:
40  static char ID;
43 
44  void getAnalysisUsage(AnalysisUsage &) const;
45 
46  bool runOnModule(Module &);
47 
50  SymbolicExprGraph *getSymbolicExprGraph(Function *F) override;
51 
52  SymbolicExprGraph *getSymbolicExprGraph(WrappedFunction *F) override;
53 
55  SEGOperandNode *getNode(Value *val);
56 
57 private:
60  CFGReachabilityAnalysis *CRA = nullptr;
61  ControlDependenceAnalysis *CDGs = nullptr;
62 
63  TSDataLayout *TSDL = nullptr;
64  DebugInfoAnalysis *DIA = nullptr;
65  FalconAA *Falcon = nullptr;
66  FalconPlus::FalconAA *FalconPlus = nullptr;
67  FunctionPropertyPass *FPP = nullptr;
68  TypeInference *INFER = nullptr;
70 
72  std::vector<SymbolicExprGraph *> SEGVector;
73 
74 private:
75  typedef std::unordered_map<Value *, kvec<SEGLoadMemNode *>>
76  ValueLoadMemNodesMapTy;
77  typedef std::unordered_map<Value *, kvec<SEGStoreMemNode *>>
78  ValueStoreMemNodesMapTy;
79 
83  void matchLoadStore(SymbolicExprGraph *, ValueLoadMemNodesMapTy *,
84  ValueStoreMemNodesMapTy *);
85 
86  void labelBackEdge(Module &M);
87 
89  SymbolicExprGraph *buildSymbolicExprGraph(Function &F);
90 
92  void modelIntrinsics(CallSite CS, SymbolicExprGraph *G);
93 
95  void modelInstruction(Instruction &I, BasicBlock *, SymbolicExprGraph *G);
96 
98  SEGOperandNode *modelConstantExpr(ConstantExpr *CE, SymbolicExprGraph *G);
99 
101  SEGOpcodeNode *modelGEPOperator(GEPOperator *GEP, BasicBlock *B,
102  SymbolicExprGraph *G);
103 
106  SEGOpcodeNode::CodeKind getOpcode(int LLVMInstOpcode, int Predicate = 0);
107 
109  SEGOperandNode *findOrCreateNode(SymbolicExprGraph *SEG, Value *V);
110 
111  void storePersistentSEG(Module &M, CBCallGraph &CBCG);
112 };
113 
114 #endif
SEGStoreMemNode
Definition: SEGStoreMemNode.h:25
SEGOperandNode
Definition: SymbolicExprGraph.h:539
SEGOpcodeNode::CodeKind
CodeKind
Definition: SymbolicExprGraph.h:635
SEGMapBase
Definition: SEGMapBase.h:19
SymbolicExprGraph
Definition: SymbolicExprGraph.h:855
SymbolicExprGraphBuilder
Definition: SymbolicExprGraphBuilder.h:38
SEGOpcodeNode
Definition: SymbolicExprGraph.h:624
SEGLoadMemNode
Definition: SEGLoadMemNode.h:23