Static Value-Flow Analysis
ICFGBuilder.h
Go to the documentation of this file.
1 //===- ICFGBuilder.h ----------------------------------------------------------------//
2 //
3 // SVF: Static Value-Flow Analysis
4 //
5 // Copyright (C) <2013-> <Yulei Sui>
6 //
7 
8 // This program is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU Affero General Public License as published by
10 // the Free Software Foundation, either version 3 of the License, or
11 // (at your option) any later version.
12 
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU Affero General Public License for more details.
17 
18 // You should have received a copy of the GNU Affero General Public License
19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
20 //
21 //===----------------------------------------------------------------------===//
22 
23 /*
24  * ICFGBuilder.h
25  *
26  * Created on:
27  * Author: yulei
28  */
29 
30 #ifndef INCLUDE_UTIL_ICFGBUILDER_H_
31 #define INCLUDE_UTIL_ICFGBUILDER_H_
32 
33 #include "Graphs/ICFG.h"
34 #include "Util/WorkList.h"
35 #include "BasicTypes.h"
36 #include "LLVMModule.h"
37 
38 namespace SVF
39 {
40 
42 {
43 
44 public:
45 
46  typedef std::vector<const Instruction*> InstVec;
53 
54 
55 private:
57 
58 public:
60 
61  ICFGBuilder(): icfg(new ICFG())
62  {
63 
64  }
65  ICFG* build();
66 
67 private:
68 
70  {
72  }
73 
75  {
76  return llvmModuleSet()->CSToRetNodeMap;
77  }
78 
80  {
82  }
83 
85  {
87  }
88 
90  {
92  }
93 
95  {
97  }
98 
99 private:
100 
103  void processFunEntry(const Function* fun, WorkList& worklist);
104 
105  void processNoPrecessorBasicBlocks(const Function* fun, WorkList& worklist);
106 
107  void processFunBody(WorkList& worklist);
108 
109  void processFunExit(const Function* fun);
111 
112  void checkICFGNodesVisited(const Function* fun);
113 
115 
116 
118  void addICFGInterEdges(const Instruction* cs, const Function* callee);
119 
120  inline ICFGNode* getICFGNode(const Instruction* inst)
121  {
122  return llvmModuleSet()->getICFGNode(inst);
123  }
124 
125  inline bool hasICFGNode(const Instruction* inst)
126  {
127  return llvmModuleSet()->hasICFGNode(inst);
128  }
129 
132  {
133  return llvmModuleSet()->getCallICFGNode(cs);
134  }
137  {
138  return llvmModuleSet()->getRetICFGNode(cs);
139  }
142  {
143  return llvmModuleSet()->getIntraICFGNode(inst);
144  }
145 
148  {
149  return llvmModuleSet()->getFunEntryICFGNode(fun);
150  }
153  {
154  return llvmModuleSet()->getFunExitICFGNode(fun);
155  }
156 
158  {
159  return icfg->getGlobalICFGNode();
160  }
161 
164 
166  inline ICFGNode* addBlockICFGNode(const Instruction* inst);
167 
170 
172 
174 
175  inline void addGlobalICFGNode()
176  {
179  }
180 
181 private:
183 };
184 
185 } // End namespace SVF
186 
187 #endif /* INCLUDE_UTIL_ICFGBUILDER_H_ */
InstToBlockNodeMapTy & instToBlockNodeMap()
Definition: ICFGBuilder.h:84
FunEntryICFGNode * addFunEntryBlock(const Function *fun)
Map< const Instruction *, CallICFGNode * > CSToCallNodeMapTy
Definition: ICFGBuilder.h:48
void connectGlobalToProgEntry()
GlobalICFGNode * getGlobalICFGNode() const
Definition: ICFGBuilder.h:157
Map< const Instruction *, RetICFGNode * > CSToRetNodeMapTy
Definition: ICFGBuilder.h:49
CSToRetNodeMapTy & csToRetNodeMap()
Definition: ICFGBuilder.h:74
FIFOWorkList< const Instruction * > WorkList
Definition: ICFGBuilder.h:59
IntraICFGNode * addIntraBlockICFGNode(const Instruction *inst)
Add and get IntraBlock ICFGNode.
Map< const Instruction *, IntraICFGNode * > InstToBlockNodeMapTy
Definition: ICFGBuilder.h:50
IntraICFGNode * getIntraICFGNode(const Instruction *inst)
get a intra node
Definition: ICFGBuilder.h:141
std::vector< const Instruction * > InstVec
Definition: ICFGBuilder.h:46
void addGlobalICFGNode()
Definition: ICFGBuilder.h:175
Map< const Function *, FunEntryICFGNode * > FunToFunEntryNodeMapTy
Definition: ICFGBuilder.h:51
CallICFGNode * getCallICFGNode(const Instruction *cs)
get a call node
Definition: ICFGBuilder.h:131
Map< const Function *, FunExitICFGNode * > FunToFunExitNodeMapTy
Definition: ICFGBuilder.h:52
RetICFGNode * getRetICFGNode(const Instruction *cs)
get a return node
Definition: ICFGBuilder.h:136
void processNoPrecessorBasicBlocks(const Function *fun, WorkList &worklist)
InterICFGNode * addInterBlockICFGNode(const Instruction *inst)
Add/Get an inter block ICFGNode.
FunEntryICFGNode * getFunEntryICFGNode(const Function *fun)
get a function entry node
Definition: ICFGBuilder.h:147
FunToFunExitNodeMapTy & funToFunExitNodeMap()
Definition: ICFGBuilder.h:94
LLVMModuleSet * llvmModuleSet()
Definition: ICFGBuilder.h:69
FunExitICFGNode * getFunExitICFGNode(const Function *fun)
get a function exit node
Definition: ICFGBuilder.h:152
bool hasICFGNode(const Instruction *inst)
Definition: ICFGBuilder.h:125
CSToCallNodeMapTy & csToCallNodeMap()
Definition: ICFGBuilder.h:79
void processFunBody(WorkList &worklist)
Set< const Instruction * > BBSet
Definition: ICFGBuilder.h:47
void checkICFGNodesVisited(const Function *fun)
Definition: ICFGBuilder.cpp:84
void processFunEntry(const Function *fun, WorkList &worklist)
FunExitICFGNode * addFunExitBlock(const Function *fun)
ICFGNode * addBlockICFGNode(const Instruction *inst)
Add/Get a basic block ICFGNode.
void addICFGInterEdges(const Instruction *cs, const Function *callee)
Create edges between ICFG nodes across functions.
ICFGNode * getICFGNode(const Instruction *inst)
Definition: ICFGBuilder.h:120
void processFunExit(const Function *fun)
FunToFunEntryNodeMapTy & funToFunEntryNodeMap()
Definition: ICFGBuilder.h:89
Definition: ICFG.h:48
virtual void addICFGNode(ICFGNode *node)
Add a ICFG node.
Definition: ICFG.h:219
NodeID totalICFGNode
Definition: ICFG.h:66
GlobalICFGNode * globalBlockNode
unique basic block for all globals
Definition: ICFG.h:71
GlobalICFGNode * getGlobalICFGNode() const
Definition: ICFG.h:236
InstToBlockNodeMapTy InstToBlockNodeMap
map a basic block to its ICFGNode
Definition: LLVMModule.h:105
FunExitICFGNode * getFunExitICFGNode(const Function *fun)
Add a function exit node.
Definition: LLVMModule.h:312
FunEntryICFGNode * getFunEntryICFGNode(const Function *fun)
Add a function entry node.
Definition: LLVMModule.h:305
bool hasICFGNode(const Instruction *inst)
ICFGNode * getICFGNode(const Instruction *inst)
Get a basic block ICFGNode.
CallICFGNode * getCallICFGNode(const Instruction *cs)
get a call node
RetICFGNode * getRetICFGNode(const Instruction *cs)
get a return node
CSToCallNodeMapTy CSToCallNodeMap
map a callsite to its CallICFGNode
Definition: LLVMModule.h:103
CSToRetNodeMapTy CSToRetNodeMap
map a callsite to its RetICFGNode
Definition: LLVMModule.h:104
FunToFunEntryNodeMapTy FunToFunEntryNodeMap
map a function to its FunExitICFGNode
Definition: LLVMModule.h:106
IntraICFGNode * getIntraICFGNode(const Instruction *inst)
get a intra node
static LLVMModuleSet * getLLVMModuleSet()
Definition: LLVMModule.h:118
FunToFunExitNodeMapTy FunToFunExitNodeMap
map a function to its FunEntryICFGNode
Definition: LLVMModule.h:107
for isBitcode
Definition: BasicTypes.h:68
llvm::Function Function
Definition: BasicTypes.h:85
llvm::Instruction Instruction
Definition: BasicTypes.h:87
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map
Definition: GeneralType.h:101
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
Definition: GeneralType.h:96