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 #include "Language/Spec/Memory.h"
22 
23 using namespace llvm;
24 
25 class SEGOperandNode;
26 class SEGLoadMemNode;
27 class SEGStoreMemNode;
28 class CFGReachabilityAnalysis;
29 class ControlDependenceAnalysis;
30 class DebugInfoAnalysis;
31 class FalconAA;
32 class FunctionPropertyPass;
33 class TypeInference;
34 class CBCallGraphWrapper;
35 class AADriver;
36 
37 class SymbolicExprGraphBuilder : public ModulePass, public SEGMapBase {
38 public:
39  static char ID;
42 
43  void getAnalysisUsage(AnalysisUsage &) const;
44 
45  bool runOnModule(Module &);
46 
49  SymbolicExprGraph *getOrCreateSymbolicExprGraph(Function *F);
50 
52  SEGOperandNode *getNode(Value *val);
53 
54 private:
57  CFGReachabilityAnalysis *CRA = nullptr;
58  ControlDependenceAnalysis *CDGs = nullptr;
59 
60  TSDataLayout *TSDL = nullptr;
61  DebugInfoAnalysis *DIA = nullptr;
62  FalconAA *Falcon = nullptr;
63  AADriver *AA = nullptr;
64  FunctionPropertyPass *FPP = nullptr;
65  TypeInference *INFER = nullptr;
66  CBCallGraphWrapper *CGWrapper = nullptr;
68 
69 private:
70  typedef std::unordered_map<Value *, kvec<SEGLoadMemNode *>>
71  ValueLoadMemNodesMapTy;
72  typedef std::unordered_map<Value *, kvec<SEGStoreMemNode *>>
73  ValueStoreMemNodesMapTy;
74 
78  void matchLoadStore(SymbolicExprGraph *, ValueLoadMemNodesMapTy *,
79  ValueStoreMemNodesMapTy *);
80 
81  void labelBackEdge(Module &M);
82 
84  SymbolicExprGraph *buildSymbolicExprGraph(Function &F);
85 
87  void modelIntrinsics(CallSite CS, SymbolicExprGraph *G);
88 
90  void modelInstruction(Instruction &I, BasicBlock *, SymbolicExprGraph *G);
91 
93  SEGOperandNode *modelConstantExpr(ConstantExpr *CE, SymbolicExprGraph *G);
94 
96  SEGOpcodeNode *modelGEPOperator(GEPOperator *GEP, BasicBlock *B,
98 
101  SEGOpcodeNode::CodeKind getOpcode(int LLVMInstOpcode, int Predicate = 0);
102 
104  SEGOperandNode *findOrCreateNode(SymbolicExprGraph *SEG, Value *V);
105 };
106 
107 #endif
SEGStoreMemNode
Definition: SEGStoreMemNode.h:23
SEGOperandNode
Definition: SymbolicExprGraph.h:456
SEGOpcodeNode::CodeKind
CodeKind
Definition: SymbolicExprGraph.h:522
SEGMapBase
Definition: SEGMapBase.h:20
SymbolicExprGraph
Definition: SymbolicExprGraph.h:707
SymbolicExprGraphBuilder
Definition: SymbolicExprGraphBuilder.h:37
SEGOpcodeNode
Definition: SymbolicExprGraph.h:519
SEGLoadMemNode
Definition: SEGLoadMemNode.h:21