Static Value-Flow Analysis
Loading...
Searching...
No Matches
SVFIR.h
Go to the documentation of this file.
1//===- SVFIR.h -- IR of SVF ---------------------------------------------//
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 * SVFIR.h
25 *
26 * Created on: 31, 12, 2021
27 * Author: Yulei Sui
28 */
29
30#ifndef INCLUDE_SVFIR_H_
31#define INCLUDE_SVFIR_H_
32
33#include "Graphs/ICFG.h"
34#include "Graphs/IRGraph.h"
35#include "Util/GeneralType.h"
36#include "Util/SVFUtil.h"
37
38namespace SVF
39{
40class CommonCHGraph;
45class SVFIR : public IRGraph
46{
47 friend class SVFIRBuilder;
48 friend class ExternalPAG;
49 friend class PAGBuilderFromFile;
50 friend class BVDataPTAImpl;
51 friend class GraphDBClient;
52 friend class GraphDBSVFIRBuilder;
53
54public:
59 typedef std::vector<const SVFStmt*> SVFStmtList;
60 typedef std::vector<const ValVar*> ValVarList;
70 typedef std::pair<NodeID, APOffset> GepOffset;
71 typedef std::pair<NodeID, AccessPath> NodeAccessPath;
75 typedef std::pair<const SVFType*, std::vector<AccessPath>> SVFTypeLocSetsPair;
78
79private:
100 ICFG* icfg; // ICFG
101 CommonCHGraph* chgraph; // class hierarchy graph
104
105 static std::unique_ptr<SVFIR> pag;
106 static std::string pagReadFromTxt;
107
108 std::string moduleIdentifier;
109
111 SVFIR(bool buildFromFile);
112
114 void destroy();
115
116public:
117
119
120 static inline SVFIR* getPAG(bool buildFromFile = false)
121 {
122 if (pag == nullptr)
123 {
124 pag = std::unique_ptr<SVFIR>(new SVFIR(buildFromFile));
125 }
126 return pag.get();
127 }
128 static void releaseSVFIR()
129 {
130 pag = nullptr;
131 }
133
135 inline const SVFVar* getSVFVar(NodeID id) const
136 {
137 return getGNode(id);
138 }
139 inline const ValVar* getValVar(NodeID id) const
140 {
141 if(const SVFVar* var = getSVFVar(id))
142 return SVFUtil::dyn_cast<ValVar>(var);
143 else
144 {
145 assert(false && "the Node is not a ValVar");
146 return nullptr;
147 }
148 }
149 inline const ObjVar* getObjVar(NodeID id) const
150 {
151 if(const SVFVar* var = getSVFVar(id))
152 return SVFUtil::dyn_cast<ObjVar>(var);
153 else
154 {
155 assert(false && "the Node is not an ObjVar");
156 return nullptr;
157 }
158 }
159 inline const BaseObjVar* getBaseObjVar(NodeID id) const
160 {
161 if(const SVFVar* var = getSVFVar(id))
162 return SVFUtil::dyn_cast<BaseObjVar>(var);
163 else
164 {
165 assert(false && "the Node is not a BaseObjVar");
166 return nullptr;
167 }
168 }
169 inline const GepObjVar* getGepObjVar(NodeID id) const
170 {
171 if(const SVFVar* var = getSVFVar(id))
172 return SVFUtil::dyn_cast<GepObjVar>(var);
173 else
174 {
175 assert(false && "the Node is not a GepObjVar");
176 return nullptr;
177 }
178 }
179 inline bool isObjVar(NodeID id) const
180 {
181 return SVFUtil::isa<ObjVar>(getSVFVar(id));
182 }
183 inline bool isBaseObjVar(NodeID id) const
184 {
185 return SVFUtil::isa<BaseObjVar>(getSVFVar(id));
186 }
187 inline bool isGepObjVar(NodeID id) const
188 {
189 return SVFUtil::isa<GepObjVar>(getSVFVar(id));
190 }
192 inline const IDToNodeMapTy& getSVFVarMap() const
193 {
194 return IDToNodeMap;
195 }
197
199 {
200 return memToFieldsMap;
201 }
204 {
205 return GepObjVarMap;
206 }
209 {
210 return candidatePointers;
211 }
214
216 virtual ~SVFIR()
217 {
218 destroy();
219 }
221
222
223 static void handleBlackHole(bool b);
225
227 inline void setICFG(ICFG* i)
228 {
229 icfg = i;
230 }
231 inline ICFG* getICFG() const
232 {
233 assert(icfg->totalICFGNode>0 && "empty ICFG! Build SVF IR first!");
234 return icfg;
235 }
237 inline void setCHG(CommonCHGraph* c)
238 {
239 chgraph = c;
240 }
242 {
243 assert(chgraph && "empty ICFG! Build SVF IR first!");
244 return chgraph;
245 }
246
248 inline const CallGraph* getCallGraph()
249 {
250 assert(callGraph && "empty CallGraph! Build SVF IR first!");
251 return callGraph;
252 }
253
255 {
256 callGraph = cg;
257 }
258
259 const FunObjVar* getFunObjVar(const std::string& name);
260
261 inline const std::string& getModuleIdentifier() const
262 {
263 if (pagReadFromTxt.empty())
264 {
265 assert(!moduleIdentifier.empty() &&
266 "No module found! Reading from a file other than LLVM-IR?");
267 return moduleIdentifier;
268 }
269 else
270 {
271 return pagReadFromTxt;
272 }
273 }
274
275 static inline std::string pagFileName()
276 {
277 return pagReadFromTxt;
278 }
279
280 static inline bool pagReadFromTXT()
281 {
282 return !pagReadFromTxt.empty();
283 }
284
285 static inline void setPagFromTXT(const std::string& txt)
286 {
288 }
289
290 inline void setModuleIdentifier(const std::string& moduleIdentifier)
291 {
292 this->moduleIdentifier = moduleIdentifier;
293 }
294
296
297
299 {
300 return KindToSVFStmtSetMap[kind];
301 }
308 inline bool hasSVFStmtList(const ICFGNode* inst) const
309 {
310 return icfgNode2SVFStmtsMap.find(inst) != icfgNode2SVFStmtsMap.end();
311 }
312 inline bool hasPTASVFStmtList(const ICFGNode* inst) const
313 {
314 return icfgNode2PTASVFStmtsMap.find(inst) !=
316 }
319 {
320 return icfgNode2SVFStmtsMap[inst];
321 }
324 {
325 return icfgNode2PTASVFStmtsMap[inst];
326 }
329 {
330 edge->setICFGNode(inst);
331 icfgNode2SVFStmtsMap[inst].push_back(edge);
332 if (edge->isPTAEdge())
333 icfgNode2PTASVFStmtsMap[inst].push_back(edge);
334 }
347 {
348 return globSVFStmtSet;
349 }
351 inline const CallSiteSet& getCallSiteSet() const
352 {
353 return callSiteSet;
354 }
356 inline bool isPhiNode(const SVFVar* node) const
357 {
358 return phiNodeMap.find(node) != phiNodeMap.end();
359 }
361 inline CallPE* getCallPEForFormalParm(const SVFVar* param) const
362 {
363 auto it = fParmToCallPEMap.find(param);
364 return it != fParmToCallPEMap.end() ? it->second : nullptr;
365 }
366
368 inline bool hasFunArgsList(const FunObjVar* func) const
369 {
370 return (funArgsListMap.find(func) != funArgsListMap.end());
371 }
374 {
375 return funArgsListMap;
376 }
378 inline const ValVarList& getFunArgsList(const FunObjVar* func) const
379 {
380 FunToArgsListMap::const_iterator it = funArgsListMap.find(func);
381 assert(it != funArgsListMap.end() && "this function doesn't have arguments");
382 return it->second;
383 }
385 inline bool hasCallSiteArgsMap(const CallICFGNode* cs) const
386 {
387 return (callSiteArgsListMap.find(cs) != callSiteArgsListMap.end());
388 }
391 {
392 return callSiteArgsListMap;
393 }
395 inline const ValVarList& getCallSiteArgsList(const CallICFGNode* cs) const
396 {
397 CSToArgsListMap::const_iterator it = callSiteArgsListMap.find(cs);
398 assert(it != callSiteArgsListMap.end() && "this call site doesn't have arguments");
399 return it->second;
400 }
403 {
404 return callSiteRetMap;
405 }
407 inline const ValVar* getCallSiteRet(const RetICFGNode* cs) const
408 {
409 CSToRetMap::const_iterator it = callSiteRetMap.find(cs);
410 assert(it != callSiteRetMap.end() && "this call site doesn't have return");
411 return it->second;
412 }
413 inline bool callsiteHasRet(const RetICFGNode* cs) const
414 {
415 return callSiteRetMap.find(cs) != callSiteRetMap.end();
416 }
419 {
420 return funRetMap;
421 }
423 inline const ValVar* getFunRet(const FunObjVar* func) const
424 {
425 FunToRetMap::const_iterator it = funRetMap.find(func);
426 assert(it != funRetMap.end() && "this function doesn't have return");
427 return it->second;
428 }
429 inline bool funHasRet(const FunObjVar* func) const
430 {
431 return funRetMap.find(func) != funRetMap.end();
432 }
434
436
438 {
439 return GepValObjMap.size();
440 }
442 {
443 return GepObjVarMap.size();
444 }
446
449 const AccessPath& ap) const;
450
452
454 {
456 }
457 inline NodeID getFunPtr(const CallICFGNode* cs) const
458 {
459 CallSiteToFunPtrMap::const_iterator it = indCallSiteToFunPtrMap.find(cs);
460 assert(it!=indCallSiteToFunPtrMap.end() && "indirect callsite not have a function pointer?");
461 return it->second;
462 }
464 {
465 FunPtrToCallSitesMap::const_iterator it = funPtrToCallSitesMap.find(funPtr);
466 assert(it!=funPtrToCallSitesMap.end() && "function pointer not used at any indirect callsite?");
467 return it->second;
468 }
469 inline bool isIndirectCallSites(const CallICFGNode* cs) const
470 {
471 return (indCallSiteToFunPtrMap.find(cs) != indCallSiteToFunPtrMap.end());
472 }
473 inline bool isFunPtr(NodeID id) const
474 {
475 return (funPtrToCallSitesMap.find(id) != funPtrToCallSitesMap.end());
476 }
478
481 {
482 return getIntraPAGEdge(getGNode(src), getGNode(dst), kind);
483 }
485 {
486 SVFStmt edge(src, dst, kind, false);
488 SVFStmt::SVFStmtSetTy::const_iterator it = edgeSet.find(&edge);
489 assert(it != edgeSet.end() && "can not find pag edge");
490 return (*it);
491 }
493
497
498 inline const BaseObjVar* getBaseObject(NodeID id) const
499 {
500 const SVFVar* node = getSVFVar(id);
501 if(const GepObjVar* gepObjVar = SVFUtil::dyn_cast<GepObjVar>(node))
502 return SVFUtil::dyn_cast<BaseObjVar>(
503 getSVFVar(gepObjVar->getBaseNode()));
504 else
505 return SVFUtil::dyn_cast<BaseObjVar>(node);
506 }
507
508 inline const ValVar* getBaseValVar(NodeID id) const
509 {
510 const SVFVar* node = getSVFVar(id);
511 if(const GepValVar* gepVar = SVFUtil::dyn_cast<GepValVar>(node))
512 return gepVar->getBaseNode();
513 else
514 return SVFUtil::dyn_cast<ValVar>(node);
515 }
517
519 NodeID getGepObjVar(const BaseObjVar* baseObj, const APOffset& ap);
521 NodeID getGepObjVar(NodeID id, const APOffset& ap) ;
523
524 inline NodeID getFIObjVar(const BaseObjVar* obj) const
525 {
526 return obj->getId();
527 }
528 inline NodeID getFIObjVar(NodeID id) const
529 {
530 return getBaseObjVarID(id);
531 }
533
535
536
537 inline bool isBlkObjOrConstantObj(NodeID id) const
538 {
539 return (isBlkObj(id) || isConstantObj(id));
540 }
541
542 inline bool isConstantObj(NodeID id) const
543 {
544 const BaseObjVar* obj = getBaseObject(id);
545 assert(obj && "not an object node?");
546 return isConstantSym(id) ||
547 obj->isConstDataOrConstGlobal();
548 }
550
552
553
555 {
556 return getBaseObject(id)->getId();
557 }
559
561
567 {
568 return addDummyValNode(NodeIDAllocator::get()->allocateValueId(), nullptr);
569 }
571 {
572 return addDummyObjNode(NodeIDAllocator::get()->allocateObjectId(), type);
573 }
575
576 bool isValidPointer(NodeID nodeId) const;
577
578 bool isValidTopLevelPtr(const SVFVar* node);
580
582 void print();
583
584protected:
586 {
587 memToFieldsMap[node->getId()].set(node->getId());
588 return addObjNode(node);
589 }
590
592
593 NodeID addGepObjNode(GepObjVar* gepObj, NodeID base, const APOffset& apOffset);
594
596 {
597 GepValObjMap[curInstID][std::make_pair(gepValvar->getBaseNode()->getId(), gepValvar->getAccessPath())] = gepValvar->getId();
598 }
599
600private:
601
604 {
605 bool added = KindToSVFStmtSetMap[edge->getEdgeKind()].insert(edge).second;
606 (void)added; // Suppress warning of unused variable under release build
607 assert(added && "duplicated edge, not added!!!");
609 if (edge->isPTAEdge() || (SVFUtil::isa<CopyStmt>(edge) && SVFUtil::cast<CopyStmt>(edge)->isInt2Ptr()))
610 {
612 KindToPTASVFStmtSetMap[edge->getEdgeKind()].insert(edge);
613 }
614 }
616
617
618 inline void addFunArgs(const FunObjVar* fun, const ValVar* arg)
619 {
622 }
623
625 {
626 funEntryBlockNode->addFormalParms(arg);
627 funArgsListMap[fun].push_back(arg);
628 }
630 inline void addFunRet(const FunObjVar* fun, const ValVar* ret)
631 {
633 addFunRet(funExitBlockNode, fun, ret);
634 }
635
636 inline void addFunRet(FunExitICFGNode* funExitBlockNode, const FunObjVar* fun, const ValVar* ret)
637 {
638 funExitBlockNode->addFormalRet(ret);
639 funRetMap[fun] = ret;
640 }
642 inline void addCallSiteArgs(CallICFGNode* callBlockNode,const ValVar* arg)
643 {
644 callBlockNode->addActualParms(arg);
645 callSiteArgsListMap[callBlockNode].push_back(arg);
646 }
649 {
650 retBlockNode->addActualRet(arg);
652 }
655 {
656 bool added = indCallSiteToFunPtrMap.emplace(cs, funPtr).second;
657 (void) added;
658 funPtrToCallSitesMap[funPtr].insert(cs);
659 assert(added && "adding the same indirect callsite twice?");
660 }
661
663
664
665 inline NodeID addValNode(NodeID i, const SVFType* type, const ICFGNode* icfgNode)
666 {
667 ValVar *node = new ValVar(i, type, icfgNode, ValVar::ValNode);
668 return addValNode(node);
669 }
670
671 NodeID addFunValNode(NodeID i, const ICFGNode* icfgNode, const FunObjVar* funObjVar, const SVFType* type)
672 {
673 FunValVar* node = new FunValVar(i, icfgNode, funObjVar, type);
674 return addValNode(node);
675 }
676
677 NodeID addArgValNode(NodeID i, u32_t argNo, const ICFGNode* icfgNode, const FunObjVar* callGraphNode, const SVFType* type)
678 {
679 ArgValVar* node =
680 new ArgValVar(i, argNo, icfgNode, callGraphNode, type);
681 return addValNode(node);
682 }
683
684 inline NodeID addConstantFPValNode(const NodeID i, double dval,
685 const ICFGNode* icfgNode, const SVFType* type)
686 {
687 SVFVar* node = new ConstFPValVar(i, dval, icfgNode, type);
688 return addNode(node);
689 }
690
691 inline NodeID addConstantIntValNode(NodeID i, const std::pair<s64_t, u64_t>& intValue,
692 const ICFGNode* icfgNode, const SVFType* type)
693 {
694 SVFVar* node = new ConstIntValVar(i, intValue.first, intValue.second, icfgNode, type);
695 return addNode(node);
696 }
697
698 inline NodeID addConstantNullPtrValNode(const NodeID i, const ICFGNode* icfgNode, const SVFType* type)
699 {
700 SVFVar* node = new ConstNullPtrValVar(i, icfgNode, type);
701 return addNode(node);
702 }
703
704 inline NodeID addGlobalValNode(const NodeID i, const ICFGNode* icfgNode, const SVFType* svfType)
705 {
706 SVFVar* node = new GlobalValVar(i, icfgNode, svfType);
707 return addNode(node);
708 }
709
710 inline NodeID addConstantAggValNode(const NodeID i, const ICFGNode* icfgNode, const SVFType* svfType)
711 {
712 SVFVar* node = new ConstAggValVar(i, icfgNode, svfType);
713 return addNode(node);
714 }
715
716 inline NodeID addConstantDataValNode(const NodeID i, const ICFGNode* icfgNode, const SVFType* type)
717 {
718 SVFVar* node = new ConstDataValVar(i, icfgNode, type);
719 return addNode(node);
720 }
721
722
725 {
726 return addFIObjNode( i, ti, node);
727 }
728
733 {
734 HeapObjVar *heapObj = new HeapObjVar(i, ti, node);
735 return addBaseObjNode(heapObj);
736 }
737
742 {
743 StackObjVar *stackObj = new StackObjVar(i, ti, node);
744 return addBaseObjNode(stackObj);
745 }
746
748 {
749 FunObjVar* funObj = new FunObjVar(id, ti, node);
750 return addBaseObjNode(funObj);
751 }
752
753
754 inline NodeID addConstantFPObjNode(NodeID i, ObjTypeInfo* ti, double dval, const ICFGNode* node)
755 {
756 ConstFPObjVar* conObj = new ConstFPObjVar(i, dval, ti, node);
757 return addBaseObjNode(conObj);
758 }
759
760
761 inline NodeID addConstantIntObjNode(NodeID i, ObjTypeInfo* ti, const std::pair<s64_t, u64_t>& intValue, const ICFGNode* node)
762 {
764 new ConstIntObjVar(i, intValue.first, intValue.second, ti, node);
765 return addBaseObjNode(conObj);
766 }
767
768
770 {
772 return addBaseObjNode(conObj);
773 }
774
775 inline NodeID addGlobalObjNode(const NodeID i, ObjTypeInfo* ti, const ICFGNode* node)
776 {
777 GlobalObjVar* gObj = new GlobalObjVar(i, ti, node);
778 return addBaseObjNode(gObj);
779 }
781 {
782 ConstAggObjVar* conObj = new ConstAggObjVar(i, ti, node);
783 return addBaseObjNode(conObj);
784 }
786 {
788 return addBaseObjNode(conObj);
789 }
790
792 inline NodeID addRetNode(NodeID i, const FunObjVar* callGraphNode, const SVFType* type, const ICFGNode* icn)
793 {
794 SVFVar *node = new RetValPN(i, callGraphNode, type, icn);
795 return addRetNode(callGraphNode, node);
796 }
798 inline NodeID addVarargNode(NodeID i, const FunObjVar* val, const SVFType* type, const ICFGNode* n)
799 {
800 SVFVar *node = new VarArgValPN(i, val, type, n);
801 return addNode(node);
802 }
803
805 NodeID addGepValNode(NodeID curInst, const ValVar* base, const AccessPath& ap, NodeID i, const SVFType* type, const ICFGNode* node);
807 NodeID addGepObjNode(const BaseObjVar* baseObj, const APOffset& apOffset, const NodeID gepId);
810 {
811 BaseObjVar* baseObj = new BaseObjVar(i, ti, node);
812 return addBaseObjNode(baseObj);
813 }
814
815
817
819
821 {
822 return addValNode(new DummyValVar(i, node));
823 }
825 {
826 if (idToObjTypeInfoMap().find(i) == idToObjTypeInfoMap().end())
827 {
830 return addDummyObjNode(new DummyObjVar(i, ti, nullptr));
831 }
832 else
833 {
834 return addDummyObjNode(new DummyObjVar(i, getObjTypeInfo(i), nullptr));
835 }
836 }
837
843 {
845 }
847 {
848 return addDummyValNode(getBlkPtr(), nullptr);
849 }
851 {
852 return addValNode(new IntrinsicValVar(i, type));
853 }
855 {
856 return addValNode(new AsmPCValVar(i, type));
857 }
859
861 NodeID addValNode(ValVar* node);
863 NodeID addObjNode(ObjVar *node);
865 inline NodeID addRetNode(const FunObjVar*, SVFVar *node)
866 {
867 return addNode(node);
868 }
870 inline NodeID addVarargNode(const FunObjVar*, SVFVar *node)
871 {
872 return addNode(node);
873 }
874
876 inline void addGlobalPAGEdge(const SVFStmt* edge)
877 {
878 globSVFStmtSet.insert(edge);
879 }
881 inline void addCallSite(const CallICFGNode* call)
882 {
883 callSiteSet.insert(call);
884 }
886
887
893
896 void addPhiStmt(PhiStmt* edge, SVFVar* src, SVFVar* dst);
899 void addSelectStmt(SelectStmt* edge, SVFVar* src, SVFVar* dst);
902 void addCmpStmt(CmpStmt* edge, SVFVar* src, SVFVar* dst);
905 u32_t opcode);
906 void addBinaryOPStmt(BinaryOPStmt* edge, SVFVar* src, SVFVar* dst);
908 UnaryOPStmt* addUnaryOPStmt(NodeID src, NodeID dst, u32_t opcode);
909 void addUnaryOPStmt(UnaryOPStmt* edge, SVFVar* src, SVFVar* dst);
913 void addBranchStmt(BranchStmt* edge, SVFVar* src, SVFVar* dst);
918 StoreStmt* addStoreStmt(NodeID src, NodeID dst, const ICFGNode* val);
919 void addStoreStmt(StoreStmt* edge, SVFVar* src, SVFVar* dst);
921 CallPE* addCallPE(NodeID src, NodeID dst, const CallICFGNode* cs,
922 const FunEntryICFGNode* entry);
923 void addCallPE(CallPE* edge, SVFVar* src, SVFVar* dst);
925 RetPE* addRetPE(NodeID src, NodeID dst, const CallICFGNode* cs,
926 const FunExitICFGNode* exit);
927 void addRetPE(RetPE* edge, SVFVar* src, SVFVar* dst);
929 GepStmt* addGepStmt(NodeID src, NodeID dst, const AccessPath& ap,
930 bool constGep);
931 void addGepStmt(GepStmt* edge);
933 GepStmt* addNormalGepStmt(NodeID src, NodeID dst, const AccessPath& ap);
935 GepStmt* addVariantGepStmt(NodeID src, NodeID dst, const AccessPath& ap);
938 const FunEntryICFGNode* entry);
941 const FunExitICFGNode* exit);
943
946};
947
948typedef SVFIR PAG;
949
950} // End namespace SVF
951
952
953
954#endif /* INCLUDE_SVFIR_H_ */
newitem type
Definition cJSON.cpp:2739
cJSON * n
Definition cJSON.cpp:2558
const cJSON *const b
Definition cJSON.h:255
const char *const name
Definition cJSON.h:264
Class representing a function argument variable in the SVFIR.
NodeID getId() const
Get the memory object id.
std::vector< std::pair< const ICFGNode *, s32_t > > SuccAndCondPairVec
void addActualParms(const ValVar *ap)
Add actual parameters.
Definition ICFGNode.h:477
Common base for class hierarchy graph. Only implements what PointerAnalysis needs.
Definition CHG.h:51
NodeType * getGNode(NodeID id) const
Get a node.
OrderedMap< NodeID, NodeType * > IDToNodeMapTy
NodeID to GenericNode map.
Class representing a heap object variable in the SVFIR.
NodeID totalICFGNode
Definition ICFG.h:66
FunExitICFGNode * getFunExitICFGNode(const FunObjVar *fun)
Add a function exit node.
Definition ICFG.cpp:250
FunEntryICFGNode * getFunEntryICFGNode(const FunObjVar *fun)
Add a function entry node.
Definition ICFG.cpp:243
Set< const SVFStmt * > SVFStmtSet
Definition IRGraph.h:104
NodeID addNode(SVFVar *node)
Add a node into the graph.
Definition IRGraph.h:116
NodeID getBlkPtr() const
Definition IRGraph.h:254
NodeID getBlackHoleNode() const
Definition IRGraph.h:246
SVFStmt::KindToSVFStmtMapTy KindToSVFStmtSetMap
SVFIR edge map containing all PAGEdges.
Definition IRGraph.h:107
ObjTypeInfo * createObjTypeInfo(const SVFType *type)
Create an objectInfo based on LLVM type (value is null, and type could be null, representing a dummy ...
Definition IRGraph.cpp:235
static bool isBlkObj(NodeID id)
Definition IRGraph.h:164
u32_t totalPTAPAGEdge
Definition IRGraph.h:111
static bool isConstantSym(NodeID id)
Definition IRGraph.h:168
ObjTypeInfo * getObjTypeInfo(NodeID id) const
Definition IRGraph.h:233
NodeID getConstantNode() const
Definition IRGraph.h:250
SVFStmt::KindToSVFStmtMapTy KindToPTASVFStmtSetMap
SVFIR edge map containing only pointer-related edges, i.e., both LHS and RHS are of pointer type.
Definition IRGraph.h:108
IDToTypeInfoMapTy & idToObjTypeInfoMap()
Get different kinds of syms maps.
Definition IRGraph.h:211
static NodeIDAllocator * get(void)
Return (singleton) allocator.
static void releaseSVFIR()
Definition SVFIR.h:128
NodeID addFIObjNode(NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Add a field-insensitive node, this method can only invoked by getFIGepObjNode.
Definition SVFIR.h:809
const CallSiteSet & getCallSiteSet() const
Get all callsites.
Definition SVFIR.h:351
CSToArgsListMap & getCallSiteArgsMap()
Get callsite argument list.
Definition SVFIR.h:390
SVFStmt::SVFStmtSetTy & getPTASVFStmtSet(SVFStmt::PEDGEK kind)
Get PTA edges set according to its kind.
Definition SVFIR.h:303
NodeID addDummyValNode(NodeID i, const ICFGNode *node)
Add a dummy value/object node according to node ID (llvm value is null)
Definition SVFIR.h:820
bool hasPTASVFStmtList(const ICFGNode *inst) const
Definition SVFIR.h:312
GepStmt * addVariantGepStmt(NodeID src, NodeID dst, const AccessPath &ap)
Add Variant(Gep) edge.
Definition SVFIR.cpp:465
SVFStmt::SVFStmtSetTy & getSVFStmtSet(SVFStmt::PEDGEK kind)
Get/set methods to get SVFStmts based on their kinds and ICFGNodes.
Definition SVFIR.h:298
Map< const SVFVar *, PhiStmt * > PHINodeMap
Definition SVFIR.h:61
bool funHasRet(const FunObjVar *func) const
Definition SVFIR.h:429
CallSiteToFunPtrMap indCallSiteToFunPtrMap
Map an indirect callsite to its function pointer.
Definition SVFIR.h:95
NodeID addGlobalValNode(const NodeID i, const ICFGNode *icfgNode, const SVFType *svfType)
Definition SVFIR.h:704
void addFunArgs(const FunObjVar *fun, const ValVar *arg)
Get/set method for function/callsite arguments and returns.
Definition SVFIR.h:618
CopyStmt * addCopyStmt(NodeID src, NodeID dst, CopyStmt::CopyKind type)
Add Copy edge.
Definition SVFIR.cpp:86
CSToRetMap callSiteRetMap
Map a callsite to its callsite returns PAGNodes.
Definition SVFIR.h:93
NodeID getGepValVar(NodeID curInst, NodeID base, const AccessPath &ap) const
Due to constraint expression, curInst is used to distinguish different instructions (e....
Definition SVFIR.cpp:614
RetPE * addRetPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunExitICFGNode *exit)
Add Return edge.
Definition SVFIR.cpp:341
NodeID getFunPtr(const CallICFGNode *cs) const
Definition SVFIR.h:457
bool hasFunArgsList(const FunObjVar *func) const
Function has arguments list.
Definition SVFIR.h:368
std::pair< NodeID, APOffset > GepOffset
Definition SVFIR.h:70
Map< const CallICFGNode *, ValVarList > CSToArgsListMap
Definition SVFIR.h:64
const IDToNodeMapTy & getSVFVarMap() const
Return the entire SVFID to SVFVar map.
Definition SVFIR.h:192
GepStmt * addGepStmt(NodeID src, NodeID dst, const AccessPath &ap, bool constGep)
Add Gep edge.
Definition SVFIR.cpp:419
void print()
Print SVFIR.
Definition SVFIR.cpp:649
static void handleBlackHole(bool b)
SVFIR build configurations.
Definition SVFIR.cpp:782
FParmToCallPEMap fParmToCallPEMap
Map a formal param to its CallPE.
Definition SVFIR.h:90
NodeID getBaseObjVarID(NodeID id) const
Base and Offset methods for Value and Object node.
Definition SVFIR.h:554
const ValVar * getCallSiteRet(const RetICFGNode *cs) const
Get callsite return.
Definition SVFIR.h:407
const ValVarList & getFunArgsList(const FunObjVar *func) const
Get function arguments list.
Definition SVFIR.h:378
NodeID addConstantAggObjNode(const NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:780
void addToStmt2TypeMap(SVFStmt *edge)
Map a SVFStatement type to a set of corresponding SVF statements.
Definition SVFIR.h:603
friend class ExternalPAG
Definition SVFIR.h:48
NodeID addBlackholePtrNode()
Definition SVFIR.h:846
Set< const CallICFGNode * > CallSiteSet
Definition SVFIR.h:55
NodeID addBlackholeObjNode()
Definition SVFIR.h:838
NodeID addGlobalObjNode(const NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:775
CommonCHGraph * chgraph
Definition SVFIR.h:101
SVFStmt * addBlackHoleAddrStmt(NodeID node)
Set a pointer points-to black hole (e.g. int2ptr)
Definition SVFIR.cpp:364
NodeID addDummyObjNode(NodeID i, const SVFType *type)
Definition SVFIR.h:824
LoadStmt * addLoadStmt(NodeID src, NodeID dst)
Add Load edge.
Definition SVFIR.cpp:264
NodeID addGepValNode(NodeID curInst, const ValVar *base, const AccessPath &ap, NodeID i, const SVFType *type, const ICFGNode *node)
Add a temp field value node, this method can only invoked by getGepValVar.
Definition SVFIR.cpp:486
NodeID addConstantDataObjNode(const NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:785
GepStmt * addNormalGepStmt(NodeID src, NodeID dst, const AccessPath &ap)
Add Offset(Gep) edge.
Definition SVFIR.cpp:438
u32_t getFieldObjNodeNum() const
Definition SVFIR.h:441
MemObjToFieldsMap memToFieldsMap
Map a mem object id to all its fields.
Definition SVFIR.h:87
virtual ~SVFIR()
Destructor.
Definition SVFIR.h:216
bool isIndirectCallSites(const CallICFGNode *cs) const
Definition SVFIR.h:469
NodeID addConstantFPObjNode(NodeID i, ObjTypeInfo *ti, double dval, const ICFGNode *node)
Definition SVFIR.h:754
SVFStmt * getIntraPAGEdge(SVFVar *src, SVFVar *dst, SVFStmt::PEDGEK kind)
Definition SVFIR.h:484
PHINodeMap phiNodeMap
A set of phi copy edges.
Definition SVFIR.h:89
NodeBS getFieldsAfterCollapse(NodeID id)
Definition SVFIR.cpp:595
std::vector< const ValVar * > ValVarList
Definition SVFIR.h:60
NodeID addVarargNode(const FunObjVar *, SVFVar *node)
Add a unique vararg node for a procedure.
Definition SVFIR.h:870
Map< const ICFGNode *, SVFStmtList > ICFGNode2SVFStmtsMap
Definition SVFIR.h:68
NodeID addObjNode(NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Add a memory obj node.
Definition SVFIR.h:724
FunToRetMap funRetMap
Map a function to its unique function return PAGNodes.
Definition SVFIR.h:94
void addFunRet(const FunObjVar *fun, const ValVar *ret)
Add function returns.
Definition SVFIR.h:630
OrderedMap< const CallICFGNode *, NodeID > CallSiteToFunPtrMap
Definition SVFIR.h:56
static std::string pagFileName()
Definition SVFIR.h:275
CallPE * addCallPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunEntryICFGNode *entry)
Add Call edge (phi-like: merges actual params from all call sites into formal param)
Definition SVFIR.cpp:311
NodeID addConstantNullPtrValNode(const NodeID i, const ICFGNode *icfgNode, const SVFType *type)
Definition SVFIR.h:698
NodeID addHeapObjNode(NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:732
SVFStmtList & getSVFStmtList(const ICFGNode *inst)
Given an instruction, get all its PAGEdges.
Definition SVFIR.h:318
bool isValidTopLevelPtr(const SVFVar *node)
Definition SVFIR.cpp:765
bool isConstantObj(NodeID id) const
Definition SVFIR.h:542
bool isPhiNode(const SVFVar *node) const
Whether this SVFVar is a result operand a of phi node.
Definition SVFIR.h:356
static bool pagReadFromTXT()
Definition SVFIR.h:280
OrderedNodeSet & getAllValidPtrs()
Return valid pointers.
Definition SVFIR.h:208
bool hasSVFStmtList(const ICFGNode *inst) const
Whether this instruction has SVFIR Edge.
Definition SVFIR.h:308
TypeLocSetsMap typeLocSetsMap
Map an arg to its base SVFType* and all its field location sets.
Definition SVFIR.h:85
TDJoinPE * addThreadJoinPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunExitICFGNode *exit)
Add Thread join edge for parameter passing.
Definition SVFIR.cpp:399
CallGraph * callGraph
all the callsites of a program
Definition SVFIR.h:103
Map< NodeID, NodeID > NodeToNodeMap
Definition SVFIR.h:69
static std::string pagReadFromTxt
Definition SVFIR.h:106
friend class GraphDBSVFIRBuilder
Definition SVFIR.h:52
CSToRetMap & getCallSiteRets()
Get callsite return.
Definition SVFIR.h:402
void destroy()
Clean up memory.
Definition SVFIR.cpp:636
void addToSVFStmtList(ICFGNode *inst, SVFStmt *edge)
Add a SVFStmt into instruction map.
Definition SVFIR.h:328
std::vector< const SVFStmt * > SVFStmtList
Definition SVFIR.h:59
const BaseObjVar * getBaseObject(NodeID id) const
Definition SVFIR.h:498
const CallGraph * getCallGraph()
Get CG.
Definition SVFIR.h:248
NodeID addConstantNullPtrObjNode(const NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:769
SVFStmtSet globSVFStmtSet
Global PAGEdges without control flow information.
Definition SVFIR.h:88
NodeID addConstantDataValNode(const NodeID i, const ICFGNode *icfgNode, const SVFType *type)
Definition SVFIR.h:716
std::pair< NodeID, AccessPath > NodeAccessPath
Definition SVFIR.h:71
void setICFG(ICFG *i)
Set/Get ICFG.
Definition SVFIR.h:227
Map< NodeAccessPath, NodeID > NodeAccessPathMap
Definition SVFIR.h:73
std::string moduleIdentifier
Definition SVFIR.h:108
const FunObjVar * getFunObjVar(const std::string &name)
Definition SVFIR.cpp:48
CmpStmt * addCmpStmt(NodeID op1, NodeID op2, NodeID dst, u32_t predict)
Add Copy edge.
Definition SVFIR.cpp:168
FunToRetMap & getFunRets()
Get function return list.
Definition SVFIR.h:418
const BaseObjVar * getBaseObjVar(NodeID id) const
Definition SVFIR.h:159
SVFStmtSet & getGlobalSVFStmtSet()
Get global PAGEdges (not in a procedure)
Definition SVFIR.h:346
NodeID addIntrinsicValNode(NodeID i, const SVFType *type)
Definition SVFIR.h:850
void addCallSiteArgs(CallICFGNode *callBlockNode, const ValVar *arg)
Add callsite arguments.
Definition SVFIR.h:642
AddrStmt * addAddrStmt(NodeID src, NodeID dst)
Add an edge into SVFIR.
Definition SVFIR.cpp:64
Map< const FunObjVar *, ValVarList > FunToArgsListMap
Definition SVFIR.h:63
FunToArgsListMap funArgsListMap
Map a function to a list of all its formal parameters.
Definition SVFIR.h:91
ICFGNode2SVFStmtsMap icfgNode2SVFStmtsMap
Map an ICFGNode to its SVFStmts.
Definition SVFIR.h:82
NodeID addStackObjNode(NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:741
NodeID addConstantIntValNode(NodeID i, const std::pair< s64_t, u64_t > &intValue, const ICFGNode *icfgNode, const SVFType *type)
Definition SVFIR.h:691
ICFG * getICFG() const
Definition SVFIR.h:231
u32_t getFieldValNodeNum() const
Node and edge statistics.
Definition SVFIR.h:437
NodeID addFunValNode(NodeID i, const ICFGNode *icfgNode, const FunObjVar *funObjVar, const SVFType *type)
Definition SVFIR.h:671
NodeID addConstantFPValNode(const NodeID i, double dval, const ICFGNode *icfgNode, const SVFType *type)
Definition SVFIR.h:684
UnaryOPStmt * addUnaryOPStmt(NodeID src, NodeID dst, u32_t opcode)
Add Unary edge.
Definition SVFIR.cpp:218
NodeID addConstantAggValNode(const NodeID i, const ICFGNode *icfgNode, const SVFType *svfType)
Definition SVFIR.h:710
std::pair< const SVFType *, std::vector< AccessPath > > SVFTypeLocSetsPair
Definition SVFIR.h:75
TDForkPE * addThreadForkPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunEntryICFGNode *entry)
Add Thread fork edge for parameter passing.
Definition SVFIR.cpp:375
bool isFunPtr(NodeID id) const
Definition SVFIR.h:473
SVFStmt * getIntraPAGEdge(NodeID src, NodeID dst, SVFStmt::PEDGEK kind)
Get an edge according to src, dst and kind.
Definition SVFIR.h:480
BinaryOPStmt * addBinaryOPStmt(NodeID op1, NodeID op2, NodeID dst, u32_t opcode)
Add Copy edge.
Definition SVFIR.cpp:194
bool hasCallSiteArgsMap(const CallICFGNode *cs) const
Callsite has argument list.
Definition SVFIR.h:385
const ObjVar * getObjVar(NodeID id) const
Definition SVFIR.h:149
NodeBS & getAllFieldsObjVars(const BaseObjVar *obj)
Get all fields of an object.
Definition SVFIR.cpp:573
void addCallSite(const CallICFGNode *call)
Add callsites.
Definition SVFIR.h:881
static std::unique_ptr< SVFIR > pag
Callgraph with direct calls only; no change allowed after init and use callgraph in PointerAnalysis f...
Definition SVFIR.h:105
NodeID addValNode(NodeID i, const SVFType *type, const ICFGNode *icfgNode)
add node into SVFIR
Definition SVFIR.h:665
StoreStmt * addStoreStmt(NodeID src, NodeID dst, const ICFGNode *val)
Add Store edge.
Definition SVFIR.cpp:288
NodeID addGepObjNode(GepObjVar *gepObj, NodeID base, const APOffset &apOffset)
Definition SVFIR.cpp:547
void addFunArgs(FunEntryICFGNode *funEntryBlockNode, const FunObjVar *fun, const ValVar *arg)
Definition SVFIR.h:624
NodeID addVarargNode(NodeID i, const FunObjVar *val, const SVFType *type, const ICFGNode *n)
Add a unique vararg node for a procedure.
Definition SVFIR.h:798
void setCallGraph(CallGraph *cg)
Definition SVFIR.h:254
void addToTypeLocSetsMap(NodeID argId, SVFTypeLocSetsPair &locSets)
Add a base SVFType* and all its field location sets to an arg NodeId.
Definition SVFIR.h:336
NodeID addAsmPCValNode(NodeID i, const SVFType *type)
Definition SVFIR.h:854
CSToArgsListMap callSiteArgsListMap
Map a callsite to a list of all its actual parameters.
Definition SVFIR.h:92
void setCHG(CommonCHGraph *c)
Set/Get CHG.
Definition SVFIR.h:237
OffsetToGepVarMap GepObjVarMap
Map a pair<base,off> to a gep obj node id.
Definition SVFIR.h:86
const CallSiteToFunPtrMap & getIndirectCallsites() const
Add/get indirect callsites.
Definition SVFIR.h:453
bool isGepObjVar(NodeID id) const
Definition SVFIR.h:187
CommonCHGraph * getCHG()
Definition SVFIR.h:241
const SVFVar * getSVFVar(NodeID id) const
ObjVar/GepObjVar/BaseObjVar.
Definition SVFIR.h:135
bool callsiteHasRet(const RetICFGNode *cs) const
Definition SVFIR.h:413
NodeID addDummyValNode()
Definition SVFIR.h:566
SVFStmtList & getPTASVFStmtList(const ICFGNode *inst)
Given an instruction, get all its PTA PAGEdges.
Definition SVFIR.h:323
void addGepValObjFromDB(NodeID curInstID, const GepValVar *gepValvar)
Definition SVFIR.h:595
ICFGNode2SVFStmtsMap icfgNode2PTASVFStmtsMap
Map an ICFGNode to its PointerAnalysis related SVFStmts.
Definition SVFIR.h:83
NodeID addFunObjNode(NodeID id, ObjTypeInfo *ti, const ICFGNode *node)
Definition SVFIR.h:747
Map< const SVFVar *, CallPE * > FParmToCallPEMap
Definition SVFIR.h:62
OffsetToGepVarMap & getGepObjNodeMap()
Return GepObjVarMap.
Definition SVFIR.h:203
friend class GraphDBClient
Definition SVFIR.h:51
bool isObjVar(NodeID id) const
Definition SVFIR.h:179
Map< NodeID, NodeBS > MemObjToFieldsMap
Definition SVFIR.h:58
Map< NodePair, NodeID > NodePairSetMap
Definition SVFIR.h:77
Map< GepOffset, NodeID > OffsetToGepVarMap
Definition SVFIR.h:72
PhiStmt * addPhiStmt(NodeID res, NodeID opnd, const ICFGNode *pred)
Add phi node information.
Definition SVFIR.cpp:109
const ValVar * getFunRet(const FunObjVar *func) const
Get function return list.
Definition SVFIR.h:423
NodeID addBaseObjNode(BaseObjVar *node)
Definition SVFIR.h:585
OrderedNodeSet candidatePointers
Definition SVFIR.h:99
ICFG * icfg
Definition SVFIR.h:100
void setModuleIdentifier(const std::string &moduleIdentifier)
Definition SVFIR.h:290
Map< const FunObjVar *, const ValVar * > FunToRetMap
Definition SVFIR.h:66
CallSiteSet callSiteSet
Definition SVFIR.h:102
NodeID getFIObjVar(NodeID id) const
Definition SVFIR.h:528
Map< const RetICFGNode *, const ValVar * > CSToRetMap
Definition SVFIR.h:65
SelectStmt * addSelectStmt(NodeID res, NodeID op1, NodeID op2, NodeID cond)
Add SelectStmt.
Definition SVFIR.cpp:142
static SVFIR * getPAG(bool buildFromFile=false)
Singleton design here to make sure we only have one instance during any analysis.
Definition SVFIR.h:120
NodeID addConstantIntObjNode(NodeID i, ObjTypeInfo *ti, const std::pair< s64_t, u64_t > &intValue, const ICFGNode *node)
Definition SVFIR.h:761
Map< const FunObjVar *, SVFStmtSet > FunToPAGEdgeSetMap
Definition SVFIR.h:67
Map< NodeID, SVFTypeLocSetsPair > TypeLocSetsMap
Definition SVFIR.h:76
GepValueVarMap GepValObjMap
Map a pair<base,off> to a gep value node id.
Definition SVFIR.h:84
const ValVar * getBaseValVar(NodeID id) const
Definition SVFIR.h:508
const ValVarList & getCallSiteArgsList(const CallICFGNode *cs) const
Get callsite argument list.
Definition SVFIR.h:395
bool isBlkObjOrConstantObj(NodeID id) const
Get black hole and constant id.
Definition SVFIR.h:537
const GepObjVar * getGepObjVar(NodeID id) const
Definition SVFIR.h:169
const CallSiteSet & getIndCallSites(NodeID funPtr) const
Definition SVFIR.h:463
Map< NodeID, NodeAccessPathMap > GepValueVarMap
Definition SVFIR.h:74
bool isValidPointer(NodeID nodeId) const
Whether a node is a valid pointer.
Definition SVFIR.cpp:750
void addFunRet(FunExitICFGNode *funExitBlockNode, const FunObjVar *fun, const ValVar *ret)
Definition SVFIR.h:636
Map< NodeID, CallSiteSet > FunPtrToCallSitesMap
Definition SVFIR.h:57
void addGlobalPAGEdge(const SVFStmt *edge)
Add global PAGEdges (not in a procedure)
Definition SVFIR.h:876
const std::string & getModuleIdentifier() const
Definition SVFIR.h:261
BranchStmt * addBranchStmt(NodeID br, NodeID cond, const BranchStmt::SuccAndCondPairVec &succs)
Add BranchStmt.
Definition SVFIR.cpp:241
NodeID addRetNode(const FunObjVar *, SVFVar *node)
Add a unique return node for a procedure.
Definition SVFIR.h:865
const ValVar * getValVar(NodeID id) const
Definition SVFIR.h:139
CallPE * getCallPEForFormalParm(const SVFVar *param) const
Get the CallPE for a formal parameter (phi-like, nullptr if not found)
Definition SVFIR.h:361
void addIndirectCallsites(const CallICFGNode *cs, NodeID funPtr)
Add indirect callsites.
Definition SVFIR.h:654
bool isBaseObjVar(NodeID id) const
Definition SVFIR.h:183
FunToArgsListMap & getFunArgsMap()
Get function arguments list.
Definition SVFIR.h:373
void initialiseCandidatePointers()
Initialize candidate pointers.
Definition SVFIR.cpp:734
NodeID addRetNode(NodeID i, const FunObjVar *callGraphNode, const SVFType *type, const ICFGNode *icn)
Add a unique return node for a procedure.
Definition SVFIR.h:792
static void setPagFromTXT(const std::string &txt)
Definition SVFIR.h:285
NodeID getFIObjVar(const BaseObjVar *obj) const
Get a field-insensitive obj SVFIR node according to a mem obj.
Definition SVFIR.h:524
FunPtrToCallSitesMap funPtrToCallSitesMap
Definition SVFIR.h:96
NodeID addArgValNode(NodeID i, u32_t argNo, const ICFGNode *icfgNode, const FunObjVar *callGraphNode, const SVFType *type)
Definition SVFIR.h:677
void addCallSiteRets(RetICFGNode *retBlockNode, const ValVar *arg)
Add callsite returns.
Definition SVFIR.h:648
SVFTypeLocSetsPair & getTypeLocSetsMap(NodeID argId)
Given an arg NodeId, get its base SVFType* and all its field location sets.
Definition SVFIR.h:341
NodeID addDummyObjNode(const SVFType *type)
Definition SVFIR.h:570
MemObjToFieldsMap & getMemToFieldsMap()
Return memToFieldsMap.
Definition SVFIR.h:198
NodeID addConstantObjNode()
Definition SVFIR.h:842
GenericNode< SVFVar, SVFStmt >::GEdgeSetTy SVFStmtSetTy
Represents a stack-allocated object variable in the SVFIR (SVF Intermediate Representation) @inherits...
for isBitcode
Definition BasicTypes.h:70
OrderedSet< NodeID > OrderedNodeSet
Definition GeneralType.h:86
u32_t NodeID
Definition GeneralType.h:76
s64_t APOffset
Definition GeneralType.h:80
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76
SVFIR PAG
Definition SVFIR.h:948
unsigned u32_t
Definition GeneralType.h:67