SVF
PAGBuilder.h
Go to the documentation of this file.
1 //===- PAGBuilder.h -- Building PAG-------------------------------------------//
2 //
3 // SVF: Static Value-Flow Analysis
4 //
5 // Copyright (C) <2013-2017> <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 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 General Public License for more details.
17 
18 // You should have received a copy of the GNU General Public License
19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
20 //
21 //===----------------------------------------------------------------------===//
22 
23 /*
24  * PAGBuilder.h
25  *
26  * Created on: Nov 1, 2013
27  * Author: Yulei Sui
28  */
29 
30 #ifndef PAGBUILDER_H_
31 #define PAGBUILDER_H_
32 
33 #include "Graphs/PAG.h"
34 #include "Util/ExtAPI.h"
35 #include "SVF-FE/ICFGBuilder.h"
36 
37 namespace SVF
38 {
39 
40 class SVFModule;
44 class PAGBuilder: public llvm::InstVisitor<PAGBuilder>
45 {
46 
47 private:
48  PAG* pag;
50  const BasicBlock* curBB;
51  const Value* curVal;
52 
53 public:
55  PAGBuilder(): pag(PAG::getPAG()), svfMod(nullptr), curBB(nullptr),curVal(nullptr)
56  {
57  }
59  virtual ~PAGBuilder()
60  {
61  }
62 
64  virtual PAG* build(SVFModule* svfModule);
65 
67  PAG* getPAG() const
68  {
69  return pag;
70  }
71 
73 
74  void initialiseNodes();
75  void addEdge(NodeID src, NodeID dst, PAGEdge::PEDGEK kind,
76  Size_t offset = 0, Instruction* cs = nullptr);
77  // @}
78 
80  void sanityCheck();
81 
83 
84  // GetValNode - Return the value node according to a LLVM Value.
86  {
87  // first handle gep edge if val if a constant expression
88  processCE(V);
89 
90  // strip off the constant cast and return the value node
91  return pag->getValueNode(V);
92  }
93 
95  inline NodeID getObjectNode(const Value *V)
96  {
97  return pag->getObjectNode(V);
98  }
99 
101  inline NodeID getReturnNode(const SVFFunction *func)
102  {
103  return pag->getReturnNode(func);
104  }
105 
107  inline NodeID getVarargNode(const SVFFunction *func)
108  {
109  return pag->getVarargNode(func);
110  }
112 
114 
115  void visitGlobal(SVFModule* svfModule);
116  void InitialGlobal(const GlobalVariable *gvar, Constant *C,
117  u32_t offset);
118  NodeID getGlobalVarField(const GlobalVariable *gvar, u32_t offset);
120 
122  void processCE(const Value *val);
123 
125  bool computeGepOffset(const User *V, LocationSet& ls);
126 
128  void handleDirectCall(CallSite cs, const SVFFunction *F);
129 
131  void handleIndCall(CallSite cs);
132 
134 
135  virtual void handleExtCall(CallSite cs, const SVFFunction *F);
136  const Type *getBaseTypeAndFlattenedFields(Value* v, std::vector<LocationSet> &fields);
137  void addComplexConsForExt(Value *D, Value *S,u32_t sz = 0);
139 
141 
142  // Instructions that cannot be folded away.
143  virtual void visitAllocaInst(AllocaInst &AI);
144  void visitPHINode(PHINode &I);
145  void visitStoreInst(StoreInst &I);
146  void visitLoadInst(LoadInst &I);
149  {
150  visitCallSite(&I);
151  }
153  {
154  visitCallSite(&II);
155  }
157  return visitCallSite(&I);
158  }
159  void visitCallSite(CallSite cs);
160  void visitReturnInst(ReturnInst &I);
161  void visitCastInst(CastInst &I);
162  void visitSelectInst(SelectInst &I);
164  void visitBranchInst(BranchInst &I);
165  void visitSwitchInst(SwitchInst &I);
167  {
169  }
170  // TerminatorInst and UnwindInst have been removed since llvm-8.0.0
171  // void visitTerminatorInst(TerminatorInst &TI) {}
172  // void visitUnwindInst(UnwindInst &I) { /*returns void*/}
173 
176  void visitCmpInst(CmpInst &I);
177 
180  void visitVAArgInst(VAArgInst&);
184 
188  void visitFreezeInst(FreezeInst& I);
189 
191 
193  {
195  }
197  {
199  }
201  {
203  }
204 
206  void visitResumeInst(ResumeInst&) /*returns void*/
207  {
208  }
209  void visitUnreachableInst(UnreachableInst&) /*returns void*/
210  {
211  }
212  void visitFenceInst(FenceInst &I) /*returns void*/
213  {
215  }
217  {
219  }
221  {
223  }
224 
227  {
228  // If a new instruction is added to LLVM that we don't handle.
229  // TODO: ignore here:
230  }
231  //}@
232 
234  inline void setCurrentLocation(const Value* val, const BasicBlock* bb)
235  {
236  curBB = bb;
237  curVal = val;
238  }
239  inline const Value *getCurrentValue() const
240  {
241  return curVal;
242  }
243  inline const BasicBlock *getCurrentBB() const
244  {
245  return curBB;
246  }
247 
249  void addGlobalBlackHoleAddrEdge(NodeID node, const ConstantExpr *int2Ptrce)
250  {
251  const Value* cval = getCurrentValue();
252  const BasicBlock* cbb = getCurrentBB();
253  setCurrentLocation(int2Ptrce,nullptr);
254  addBlackHoleAddrEdge(node);
255  setCurrentLocation(cval,cbb);
256  }
257 
260  {
261  NodeID nullPtr = pag->addDummyValNode(pag->getNullPtr());
264  ConstantPointerNull *constNull = ConstantPointerNull::get(Type::getInt8PtrTy(cxt));
265  setCurrentLocation(constNull, nullptr);
267  return nullPtr;
268  }
269 
270  NodeID getGepValNode(const Value* val, const LocationSet& ls, const Type *baseType, u32_t fieldidx);
271 
273 
275  {
276  PAGEdge *edge = pag->addBlackHoleAddrPE(node);
278  return edge;
279  }
280 
282  inline AddrPE* addAddrEdge(NodeID src, NodeID dst)
283  {
284  AddrPE *edge = pag->addAddrPE(src, dst);
286  return edge;
287  }
289  inline CopyPE* addCopyEdge(NodeID src, NodeID dst)
290  {
291  CopyPE *edge = pag->addCopyPE(src, dst);
293  return edge;
294  }
296  inline CmpPE* addCmpEdge(NodeID src, NodeID dst)
297  {
298  CmpPE *edge = pag->addCmpPE(src, dst);
300  return edge;
301  }
304  {
305  BinaryOPPE *edge = pag->addBinaryOPPE(src, dst);
307  return edge;
308  }
311  {
312  UnaryOPPE *edge = pag->addUnaryOPPE(src, dst);
314  return edge;
315  }
317  inline LoadPE* addLoadEdge(NodeID src, NodeID dst)
318  {
319  LoadPE *edge = pag->addLoadPE(src, dst);
321  return edge;
322  }
324  inline StorePE* addStoreEdge(NodeID src, NodeID dst)
325  {
326  IntraBlockNode* node;
327  if(const Instruction* inst = SVFUtil::dyn_cast<Instruction>(curVal))
328  node = pag->getICFG()->getIntraBlockNode(inst);
329  else
330  node = nullptr;
331  StorePE *edge = pag->addStorePE(src, dst, node);
333  return edge;
334  }
336  inline CallPE* addCallEdge(NodeID src, NodeID dst, const CallBlockNode* cs)
337  {
338  CallPE *edge = pag->addCallPE(src, dst, cs);
340  return edge;
341  }
343  inline RetPE* addRetEdge(NodeID src, NodeID dst, const CallBlockNode* cs)
344  {
345  RetPE *edge = pag->addRetPE(src, dst, cs);
347  return edge;
348  }
350  inline GepPE* addGepEdge(NodeID src, NodeID dst, const LocationSet& ls, bool constGep)
351  {
352  GepPE *edge = pag->addGepPE(src, dst, ls, constGep);
354  return edge;
355  }
357  inline NormalGepPE* addNormalGepEdge(NodeID src, NodeID dst, const LocationSet& ls)
358  {
359  NormalGepPE *edge = pag->addNormalGepPE(src, dst, ls);
361  return edge;
362  }
365  {
366  VariantGepPE *edge = pag->addVariantGepPE(src, dst);
368  return edge;
369  }
371  inline TDForkPE* addThreadForkEdge(NodeID src, NodeID dst, const CallBlockNode* cs)
372  {
373  TDForkPE *edge = pag->addThreadForkPE(src, dst, cs);
375  return edge;
376  }
378  inline TDJoinPE* addThreadJoinEdge(NodeID src, NodeID dst, const CallBlockNode* cs)
379  {
380  TDJoinPE *edge = pag->addThreadJoinPE(src, dst, cs);
382  return edge;
383  }
385 
386 };
387 
388 } // End namespace SVF
389 
390 #endif /* PAGBUILDER_H_ */
CmpPE * addCmpEdge(NodeID src, NodeID dst)
Add Copy edge.
Definition: PAGBuilder.h:296
const BasicBlock * getCurrentBB() const
Definition: PAGBuilder.h:243
void visitUnaryOperator(UnaryOperator &I)
Definition: PAGBuilder.cpp:632
llvm::StoreInst StoreInst
Definition: BasicTypes.h:146
llvm::UnreachableInst UnreachableInst
Definition: BasicTypes.h:170
llvm::ExtractElementInst ExtractElementInst
Definition: BasicTypes.h:165
void visitResumeInst(ResumeInst &)
Instruction not that often.
Definition: PAGBuilder.h:206
NodeID getValueNode(const Value *V)
Get PAG Node according to LLVM value.
Definition: PAG.h:521
llvm::VACopyInst VACopyInst
Definition: BasicTypes.h:175
void visitReturnInst(ReturnInst &I)
Definition: PAGBuilder.cpp:735
llvm::BranchInst BranchInst
Definition: BasicTypes.h:157
NormalGepPE * addNormalGepEdge(NodeID src, NodeID dst, const LocationSet &ls)
Add Offset(Gep) edge.
Definition: PAGBuilder.h:357
llvm::UnaryOperator UnaryOperator
Definition: BasicTypes.h:162
ICFG * getICFG()
Return ICFG.
Definition: PAG.h:133
TDJoinPE * addThreadJoinEdge(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Thread join edge for parameter passing.
Definition: PAGBuilder.h:378
llvm::CastInst CastInst
Definition: BasicTypes.h:150
llvm::BasicBlock BasicBlock
Definition: BasicTypes.h:77
CallPE * addCallPE(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Call edge.
Definition: PAG.cpp:494
BinaryOPPE * addBinaryOPPE(NodeID src, NodeID dst)
Add Copy edge.
Definition: PAG.cpp:425
void visitExtractElementInst(ExtractElementInst &I)
Definition: PAGBuilder.cpp:778
u32_t NodeID
Definition: SVFBasicTypes.h:80
llvm::Type Type
Definition: BasicTypes.h:75
llvm::GlobalVariable GlobalVariable
Definition: BasicTypes.h:83
llvm::ResumeInst ResumeInst
Definition: BasicTypes.h:169
void visitBinaryOperator(BinaryOperator &I)
Definition: PAGBuilder.cpp:617
const Value * curVal
Current Value during PAG construction when visiting the module.
Definition: PAGBuilder.h:51
llvm::PHINode PHINode
Definition: BasicTypes.h:148
CallPE * addCallEdge(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Call edge.
Definition: PAGBuilder.h:336
llvm::BinaryOperator BinaryOperator
Definition: BasicTypes.h:161
llvm::InsertElementInst InsertElementInst
Definition: BasicTypes.h:166
llvm::CallBrInst CallBrInst
Definition: BasicTypes.h:145
llvm::CallInst CallInst
Definition: BasicTypes.h:143
LLVMContext & getContext() const
Definition: LLVMModule.h:196
NodeID getReturnNode(const SVFFunction *func) const
GetReturnNode - Return the unique node representing the return value of a function.
Definition: PAG.h:559
PAG * getPAG() const
Return PAG.
Definition: PAGBuilder.h:67
llvm::InsertValueInst InsertValueInst
Definition: BasicTypes.h:160
NodeID addDummyValNode()
Add a dummy value/object node according to node ID (llvm value is null)
Definition: PAG.h:736
Definition: PAG.h:47
void setCurrentLocation(const Value *val, const BasicBlock *bb)
Set current basic block in order to keep track of control flow information.
Definition: PAGBuilder.h:234
void visitAtomicRMWInst(AtomicRMWInst &I)
Definition: PAGBuilder.h:220
void visitLoadInst(LoadInst &I)
Definition: PAGBuilder.cpp:535
StorePE * addStoreEdge(NodeID src, NodeID dst)
Add Store edge.
Definition: PAGBuilder.h:324
AddrPE * addAddrEdge(NodeID src, NodeID dst)
Add Address edge.
Definition: PAGBuilder.h:282
void initialiseNodes()
Initialize nodes and edges.
Definition: PAGBuilder.cpp:131
void visitExtractValueInst(ExtractValueInst &EVI)
Definition: PAGBuilder.cpp:764
void visitSwitchInst(SwitchInst &I)
Definition: PAGBuilder.cpp:799
CopyPE * addCopyEdge(NodeID src, NodeID dst)
Add Copy edge.
Definition: PAGBuilder.h:289
void visitSelectInst(SelectInst &I)
Definition: PAGBuilder.cpp:663
unsigned u32_t
Definition: SVFBasicTypes.h:75
NodeID getObjectNode(const Value *V)
Definition: PAG.h:531
void visitCallInst(CallInst &I)
Definition: PAGBuilder.h:148
GepPE * addGepPE(NodeID src, NodeID dst, const LocationSet &ls, bool constGep)
Add Gep edge.
Definition: PAG.cpp:576
NodeID getReturnNode(const SVFFunction *func)
getReturnNode - Return the node representing the unique return value of a function.
Definition: PAGBuilder.h:101
SVFModule * svfMod
Definition: PAGBuilder.h:49
PAGEdge * addBlackHoleAddrEdge(NodeID node)
Definition: PAGBuilder.h:274
void handleDirectCall(CallSite cs, const SVFFunction *F)
Handle direct call.
Definition: PAGBuilder.cpp:837
TDForkPE * addThreadForkEdge(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Thread fork edge for parameter passing.
Definition: PAGBuilder.h:371
void visitFenceInst(FenceInst &I)
Definition: PAGBuilder.h:212
PAGEdge * addBlackHoleAddrPE(NodeID node)
Set a pointer points-to black hole (e.g. int2ptr)
Definition: PAG.cpp:528
llvm::ReturnInst ReturnInst
Definition: BasicTypes.h:152
void visitVAEndInst(VAEndInst &I)
Definition: PAGBuilder.h:182
NodeID getVarargNode(const SVFFunction *func) const
getVarargNode - Return the unique node representing the variadic argument of a variadic function...
Definition: PAG.h:564
const Type * getBaseTypeAndFlattenedFields(Value *v, std::vector< LocationSet > &fields)
Definition: PAGBuilder.cpp:903
const Value * getCurrentValue() const
Definition: PAGBuilder.h:239
void handleIndCall(CallSite cs)
Handle indirect call.
IntraBlockNode * getIntraBlockNode(const Instruction *inst)
Definition: ICFG.cpp:221
llvm::SelectInst SelectInst
Definition: BasicTypes.h:154
llvm::ConstantPointerNull ConstantPointerNull
Definition: BasicTypes.h:127
void visitInsertValueInst(InsertValueInst &I)
Definition: PAGBuilder.h:166
virtual PAG * build(SVFModule *svfModule)
Start building PAG here.
Definition: PAGBuilder.cpp:47
llvm::AtomicCmpXchgInst AtomicCmpXchgInst
Definition: BasicTypes.h:172
llvm::Instruction Instruction
Definition: BasicTypes.h:79
AddrPE * addAddrPE(NodeID src, NodeID dst)
Add Address edge.
Definition: PAG.cpp:373
signed long Size_t
Definition: SVFBasicTypes.h:78
void visitCastInst(CastInst &I)
Definition: PAGBuilder.cpp:593
virtual void handleExtCall(CallSite cs, const SVFFunction *F)
Handle external call.
Definition: PAGBuilder.cpp:952
void visitGlobal(SVFModule *svfModule)
Handle globals including (global variable and functions)
Definition: PAGBuilder.cpp:445
PAGBuilder()
Constructor.
Definition: PAGBuilder.h:55
void sanityCheck()
Sanity check for PAG.
RetPE * addRetEdge(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Return edge.
Definition: PAGBuilder.h:343
NodeID getNullPtr() const
Definition: PAG.h:601
bool computeGepOffset(const User *V, LocationSet &ls)
Compute offset of a gep instruction or gep constant expression.
Definition: PAGBuilder.cpp:208
CopyPE * addCopyPE(NodeID src, NodeID dst)
Add Copy edge.
Definition: PAG.cpp:390
NormalGepPE * addNormalGepPE(NodeID src, NodeID dst, const LocationSet &ls)
Add Offset(Gep) edge.
Definition: PAG.cpp:595
llvm::AllocaInst AllocaInst
LLVM Instructions.
Definition: BasicTypes.h:142
NodeID getValueNode(const Value *V)
Get different kinds of node.
Definition: PAGBuilder.h:85
llvm::FenceInst FenceInst
Definition: BasicTypes.h:171
llvm::VAStartInst VAStartInst
Definition: BasicTypes.h:177
BinaryOPPE * addBinaryOPEdge(NodeID src, NodeID dst)
Add Copy edge.
Definition: PAGBuilder.h:303
void visitCallSite(CallSite cs)
Definition: PAGBuilder.cpp:682
void visitAtomicCmpXchgInst(AtomicCmpXchgInst &I)
Definition: PAGBuilder.h:216
void setCurrentBBAndValueForPAGEdge(PAGEdge *edge)
void visitStoreInst(StoreInst &I)
Definition: PAGBuilder.cpp:549
llvm::GetElementPtrInst GetElementPtrInst
Definition: BasicTypes.h:149
NodeID getGepValNode(const Value *val, const LocationSet &ls, const Type *baseType, u32_t fieldidx)
NodeID getBlkPtr() const
Definition: PAG.h:597
VariantGepPE * addVariantGepPE(NodeID src, NodeID dst)
Add Variant(Gep) edge.
Definition: PAG.cpp:614
void visitFreezeInst(FreezeInst &I)
Definition: PAGBuilder.cpp:823
CmpPE * addCmpPE(NodeID src, NodeID dst)
Add Copy edge.
Definition: PAG.cpp:407
void visitVAStartInst(VAStartInst &I)
Definition: PAGBuilder.h:183
RetPE * addRetPE(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Return edge.
Definition: PAG.cpp:511
void addComplexConsForExt(Value *D, Value *S, u32_t sz=0)
Definition: PAGBuilder.cpp:912
llvm::Constant Constant
Definition: BasicTypes.h:123
void InitialGlobal(const GlobalVariable *gvar, Constant *C, u32_t offset)
Definition: PAGBuilder.cpp:374
void visitBranchInst(BranchInst &I)
Definition: PAGBuilder.cpp:788
void visitInstruction(Instruction &)
Provide base case for our instruction visit.
Definition: PAGBuilder.h:226
void visitShuffleVectorInst(ShuffleVectorInst &I)
Definition: PAGBuilder.h:196
void visitGetElementPtrInst(GetElementPtrInst &I)
Definition: PAGBuilder.cpp:567
void processCE(const Value *val)
Process constant expression.
Definition: PAGBuilder.cpp:216
llvm::InvokeInst InvokeInst
Definition: BasicTypes.h:144
llvm::SwitchInst SwitchInst
Definition: BasicTypes.h:158
TDForkPE * addThreadForkPE(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Thread fork edge for parameter passing.
Definition: PAG.cpp:539
static LLVMModuleSet * getLLVMModuleSet()
Definition: LLVMModule.h:69
UnaryOPPE * addUnaryOPEdge(NodeID src, NodeID dst)
Add Unary edge.
Definition: PAGBuilder.h:310
llvm::LLVMContext LLVMContext
Definition: BasicTypes.h:74
for isBitcode
Definition: ContextDDA.h:15
void visitVACopyInst(VACopyInst &I)
Definition: PAGBuilder.h:181
llvm::ShuffleVectorInst ShuffleVectorInst
Definition: BasicTypes.h:167
void visitPHINode(PHINode &I)
Definition: PAGBuilder.cpp:513
NodeID addNullPtrNode()
Add NullPtr PAGNode.
Definition: PAGBuilder.h:259
VariantGepPE * addVariantGepEdge(NodeID src, NodeID dst)
Add Variant(Gep) edge.
Definition: PAGBuilder.h:364
llvm::LoadInst LoadInst
Definition: BasicTypes.h:147
virtual void visitAllocaInst(AllocaInst &AI)
Our visit overrides.
Definition: PAGBuilder.cpp:495
StorePE * addStorePE(NodeID src, NodeID dst, const IntraBlockNode *val)
Add Store edge.
Definition: PAG.cpp:477
void addGlobalBlackHoleAddrEdge(NodeID node, const ConstantExpr *int2Ptrce)
Add global black hole Address edge.
Definition: PAGBuilder.h:249
TDJoinPE * addThreadJoinPE(NodeID src, NodeID dst, const CallBlockNode *cs)
Add Thread join edge for parameter passing.
Definition: PAG.cpp:556
void visitCallBrInst(CallBrInst &I)
Definition: PAGBuilder.h:156
void visitInvokeInst(InvokeInst &II)
Definition: PAGBuilder.h:152
void addEdge(NodeID src, NodeID dst, PAGEdge::PEDGEK kind, Size_t offset=0, Instruction *cs=nullptr)
llvm::ExtractValueInst ExtractValueInst
Definition: BasicTypes.h:159
llvm::VAEndInst VAEndInst
Definition: BasicTypes.h:176
void visitCmpInst(CmpInst &I)
Definition: PAGBuilder.cpp:647
llvm::LandingPadInst LandingPadInst
Definition: BasicTypes.h:168
LoadPE * addLoadEdge(NodeID src, NodeID dst)
Add Load edge.
Definition: PAGBuilder.h:317
llvm::FreezeInst FreezeInst
Definition: BasicTypes.h:178
llvm::ConstantExpr ConstantExpr
Definition: BasicTypes.h:125
void visitLandingPadInst(LandingPadInst &I)
Definition: PAGBuilder.h:200
GepPE * addGepEdge(NodeID src, NodeID dst, const LocationSet &ls, bool constGep)
Add Gep edge.
Definition: PAGBuilder.h:350
void visitInsertElementInst(InsertElementInst &I)
Definition: PAGBuilder.h:192
NodeID getObjectNode(const Value *V)
GetObject - Return the object node (stack/global/heap/function) according to a LLVM Value...
Definition: PAGBuilder.h:95
LoadPE * addLoadPE(NodeID src, NodeID dst)
Add Load edge.
Definition: PAG.cpp:459
void visitVAArgInst(VAArgInst &)
Definition: PAGBuilder.cpp:812
void visitUnreachableInst(UnreachableInst &)
Definition: PAGBuilder.h:209
NodeID getGlobalVarField(const GlobalVariable *gvar, u32_t offset)
Definition: PAGBuilder.cpp:344
NodeID getVarargNode(const SVFFunction *func)
getVarargNode - Return the node representing the unique variadic argument of a function.
Definition: PAGBuilder.h:107
UnaryOPPE * addUnaryOPPE(NodeID src, NodeID dst)
Add Unary edge.
Definition: PAG.cpp:442
llvm::Value Value
Definition: BasicTypes.h:78
virtual ~PAGBuilder()
Destructor.
Definition: PAGBuilder.h:59
llvm::User User
Definition: BasicTypes.h:86
llvm::VAArgInst VAArgInst
Definition: BasicTypes.h:164
const BasicBlock * curBB
Current basic block during PAG construction when visiting the module.
Definition: PAGBuilder.h:50
llvm::AtomicRMWInst AtomicRMWInst
Definition: BasicTypes.h:173
llvm::CmpInst CmpInst
Definition: BasicTypes.h:156