Static Value-Flow Analysis
Loading...
Searching...
No Matches
SymbolTableBuilder.cpp
Go to the documentation of this file.
1//===- SymbolTableBuilder.cpp -- Symbol Table builder---------------------//
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 * SymbolTableBuilder.cpp
25 *
26 * Created on: Apr 28, 2014
27 * Author: Yulei Sui
28 */
29
30#include <memory>
31
32#include "SVF-LLVM/BasicTypes.h"
33#include "SVF-LLVM/CppUtil.h"
34#include "SVF-LLVM/GEPTypeBridgeIterator.h" // include bridge_gep_iterator
35#include "SVF-LLVM/LLVMUtil.h"
38#include "Util/Options.h"
39#include "Util/SVFUtil.h"
41
42using namespace SVF;
43using namespace SVFUtil;
44using namespace LLVMUtil;
45
60
75
76
81{
83
84 // Pointer #0 always represents the null pointer.
85 assert(svfir->totalSymNum++ == IRGraph::NullPtr && "Something changed!");
86
87 // Pointer #1 always represents the pointer points-to black hole.
88 assert(svfir->totalSymNum++ == IRGraph::BlkPtr && "Something changed!");
89
90 // Object #2 is black hole the object that may point to any object
91 assert(svfir->totalSymNum++ == IRGraph::BlackHole && "Something changed!");
93
94 // Object #3 always represents the unique constant of a program (merging all constants if Options::ModelConsts is disabled)
95 assert(svfir->totalSymNum++ == IRGraph::ConstantObj && "Something changed!");
97
99 {
100 // Add symbols for all the globals .
101 for (const GlobalVariable& gv : M.globals())
102 {
103 collectSym(&gv);
104 }
105
106 // Add symbols for all the global aliases
107 for (const GlobalAlias& ga : M.aliases())
108 {
109 collectSym(&ga);
110 collectSym(ga.getAliasee());
111 }
112
113 // Add symbols for all of the functions and the instructions in them.
114 for (const Function& fun : M.functions())
115 {
116 collectSym(&fun);
117 collectRet(&fun);
118 if (fun.getFunctionType()->isVarArg())
119 collectVararg(&fun);
120
121 // Add symbols for all formal parameters.
122 for (const Argument& arg : fun.args())
123 {
124 collectSym(&arg);
125 }
126
127 // collect and create symbols inside the function body
128 for (const Instruction& inst : instructions(fun))
129 {
130 collectSym(&inst);
131
132 // initialization for some special instructions
133 //{@
134 if (const StoreInst* st = SVFUtil::dyn_cast<StoreInst>(&inst))
135 {
136 collectSym(st->getPointerOperand());
137 collectSym(st->getValueOperand());
138 }
139 else if (const LoadInst* ld =
140 SVFUtil::dyn_cast<LoadInst>(&inst))
141 {
142 collectSym(ld->getPointerOperand());
143 }
144 else if (const AllocaInst* alloc =
145 SVFUtil::dyn_cast<AllocaInst>(&inst))
146 {
147 collectSym(alloc->getArraySize());
148 }
149 else if (const PHINode* phi = SVFUtil::dyn_cast<PHINode>(&inst))
150 {
151 for (u32_t i = 0; i < phi->getNumIncomingValues(); ++i)
152 {
153 collectSym(phi->getIncomingValue(i));
154 }
155 }
156 else if (const GetElementPtrInst* gep =
157 SVFUtil::dyn_cast<GetElementPtrInst>(&inst))
158 {
159 collectSym(gep->getPointerOperand());
160 for (u32_t i = 0; i < gep->getNumOperands(); ++i)
161 {
162 collectSym(gep->getOperand(i));
163 }
164 }
165 else if (const SelectInst* sel =
166 SVFUtil::dyn_cast<SelectInst>(&inst))
167 {
168 collectSym(sel->getTrueValue());
169 collectSym(sel->getFalseValue());
170 collectSym(sel->getCondition());
171 }
172 else if (const BinaryOperator* binary =
173 SVFUtil::dyn_cast<BinaryOperator>(&inst))
174 {
175 for (u32_t i = 0; i < binary->getNumOperands(); i++)
176 collectSym(binary->getOperand(i));
177 }
178 else if (const UnaryOperator* unary =
179 SVFUtil::dyn_cast<UnaryOperator>(&inst))
180 {
181 for (u32_t i = 0; i < unary->getNumOperands(); i++)
182 collectSym(unary->getOperand(i));
183 }
184 else if (const CmpInst* cmp = SVFUtil::dyn_cast<CmpInst>(&inst))
185 {
186 for (u32_t i = 0; i < cmp->getNumOperands(); i++)
187 collectSym(cmp->getOperand(i));
188 }
189 else if (const CastInst* cast =
190 SVFUtil::dyn_cast<CastInst>(&inst))
191 {
192 collectSym(cast->getOperand(0));
193 }
194 else if (const ReturnInst* ret =
195 SVFUtil::dyn_cast<ReturnInst>(&inst))
196 {
197 if (ret->getReturnValue())
198 collectSym(ret->getReturnValue());
199 }
200 else if (const BranchInst* br =
201 SVFUtil::dyn_cast<BranchInst>(&inst))
202 {
203 Value* opnd = br->isConditional() ? br->getCondition() : br->getOperand(0);
205 }
206 else if (const SwitchInst* sw =
207 SVFUtil::dyn_cast<SwitchInst>(&inst))
208 {
209 collectSym(sw->getCondition());
210 }
211 else if (const FreezeInst* fz = SVFUtil::dyn_cast<FreezeInst>(&inst))
212 {
213
214 for (u32_t i = 0; i < fz->getNumOperands(); i++)
215 {
216 Value* opnd = inst.getOperand(i);
218 }
219 }
220 else if (isNonInstricCallSite(&inst))
221 {
222
223 const CallBase* cs = LLVMUtil::getLLVMCallSite(&inst);
224 for (u32_t i = 0; i < cs->arg_size(); i++)
225 {
226 collectSym(cs->getArgOperand(i));
227 }
228 // Calls to inline asm need to be added as well because the
229 // callee isn't referenced anywhere else.
230 const Value* Callee = cs->getCalledOperand();
232
233 // TODO handle inlineAsm
236 {
238 }
239 }
241 }
242 }
243 }
244
247 {
249 }
250}
251
253{
254 Type *valType = val->getType();
256 if(isGepConstantExpr(val) || SVFUtil::isa<GetElementPtrInst>(val))
257 {
259 gi = bridge_gep_begin(SVFUtil::cast<User>(val)),
260 ge = bridge_gep_end(SVFUtil::cast<User>(val));
261 gi != ge; ++gi)
262 {
263 const Type* gepTy = *gi;
265 }
266 }
267}
268
273{
274
275 //TODO: filter the non-pointer type // if (!SVFUtil::isa<PointerType>(val->getType())) return;
276
278 outs() << "collect sym from ##" << LLVMUtil::dumpValue(val) << "\n");
279 //TODO handle constant expression value here??
280 handleCE(val);
281
282 // create a value sym
284
287
288 // create an object If it is a heap, stack, global, function.
289 if (isObject(val))
290 {
292 }
293}
294
299{
300 // collect and record special sym here
301 if (
304 SVFUtil::isa<BasicBlock>(val)
305 )
306 {
307 return;
308 }
309
310 LLVMModuleSet::ValueToIDMapTy::iterator iter = llvmModuleSet()->valSymMap.find(val);
311 if (iter == llvmModuleSet()->valSymMap.end())
312 {
313 // create val sym and sym type
315 llvmModuleSet()->valSymMap.insert(std::make_pair(val, id));
317 outs() << "create a new value sym " << id << "\n");
319 if (const GlobalVariable* globalVar = SVFUtil::dyn_cast<GlobalVariable>(val))
321 }
322
325}
326
331{
333 LLVMModuleSet::ValueToIDMapTy::iterator iter = llvmModuleSet()->objSymMap.find(val);
334 if (iter == llvmModuleSet()->objSymMap.end())
335 {
336 // if the object pointed by the pointer is a constant data (e.g., i32 0) or a global constant object (e.g. string)
337 // then we treat them as one ConstantObj
339 {
340 llvmModuleSet()->objSymMap.insert(std::make_pair(val, svfir->constantSymID()));
341 }
342 // otherwise, we will create an object for each abstract memory location
343 else
344 {
345 // create obj sym and sym type
347 llvmModuleSet()->objSymMap.insert(std::make_pair(val, id));
349 outs() << "create a new obj sym " << id << "\n");
350
351 // create a memory object
353 assert(svfir->objTypeInfoMap.find(id) == svfir->objTypeInfoMap.end());
354 svfir->objTypeInfoMap[id] = ti;
355 }
356 }
357}
358
363{
364
365 LLVMModuleSet::FunToIDMapTy::iterator iter =
367 if (iter == llvmModuleSet()->returnSymMap.end())
368 {
370 llvmModuleSet()->returnSymMap.insert(std::make_pair(val, id));
371 DBOUT(DMemModel, outs() << "create a return sym " << id << "\n");
372 }
373}
374
379{
380 LLVMModuleSet::FunToIDMapTy::iterator iter =
382 if (iter == llvmModuleSet()->varargSymMap.end())
383 {
385 llvmModuleSet()->varargSymMap.insert(std::make_pair(val, id));
386 DBOUT(DMemModel, outs() << "create a vararg sym " << id << "\n");
387 }
388}
389
394{
395 if (const Constant* ref = SVFUtil::dyn_cast<Constant>(val))
396 {
397 if (const ConstantExpr* ce = isGepConstantExpr(ref))
398 {
399 DBOUT(DMemModelCE, outs() << "handle constant expression "
400 << LLVMUtil::dumpValue(ref) << "\n");
401 collectVal(ce);
402
403 // handle the recursive constant express case
404 // like (gep (bitcast (gep X 1)) 1); the inner gep is ce->getOperand(0)
405 for (u32_t i = 0; i < ce->getNumOperands(); ++i)
406 {
407 collectVal(ce->getOperand(i));
408 handleCE(ce->getOperand(i));
409 }
410 }
411 else if (const ConstantExpr* ce = isCastConstantExpr(ref))
412 {
413 DBOUT(DMemModelCE, outs() << "handle constant expression "
414 << LLVMUtil::dumpValue(ref) << "\n");
415 collectVal(ce);
416 collectVal(ce->getOperand(0));
417 // handle the recursive constant express case
418 // like (gep (bitcast (gep X 1)) 1); the inner gep is ce->getOperand(0)
419 handleCE(ce->getOperand(0));
420 }
421 else if (const ConstantExpr* ce = isSelectConstantExpr(ref))
422 {
423 DBOUT(DMemModelCE, outs() << "handle constant expression "
424 << LLVMUtil::dumpValue(ref) << "\n");
425 collectVal(ce);
426 collectVal(ce->getOperand(0));
427 collectVal(ce->getOperand(1));
428 collectVal(ce->getOperand(2));
429 // handle the recursive constant express case
430 // like (gep (bitcast (gep X 1)) 1); the inner gep is ce->getOperand(0)
431 handleCE(ce->getOperand(0));
432 handleCE(ce->getOperand(1));
433 handleCE(ce->getOperand(2));
434 }
435 // if we meet a int2ptr, then it points-to black hole
437 {
439 const Constant* opnd = int2Ptrce->getOperand(0);
440 handleCE(opnd);
441 }
443 {
445 const Constant* opnd = ptr2Intce->getOperand(0);
446 handleCE(opnd);
447 }
449 {
451 }
452 else if (isBinaryConstantExpr(ref))
453 {
455 }
456 else if (isUnaryConstantExpr(ref))
457 {
458 // we don't handle unary constant expression like fneg(x) now
460 }
461 else if (SVFUtil::isa<ConstantAggregate>(ref))
462 {
463 // we don't handle constant aggregate like constant vectors
465 }
466 else
467 {
468 assert(!SVFUtil::isa<ConstantExpr>(val) &&
469 "we don't handle all other constant expression for now!");
471 }
472 }
473}
474
479{
480 assert(G);
481
482 //The type this global points to
483 const Type* T = G->getValueType();
484 bool is_array = 0;
485 //An array is considered a single variable of its type.
486 while (const ArrayType* AT = SVFUtil::dyn_cast<ArrayType>(T))
487 {
488 T = AT->getElementType();
489 is_array = true;
490 }
491
492 if (SVFUtil::isa<StructType>(T))
493 {
494 //A struct may be used in constant GEP expr.
495 for (const User* user : G->users())
496 {
497 handleCE(user);
498 }
499 }
500 else if (is_array)
501 {
502 for (const User* user : G->users())
503 {
504 handleCE(user);
505 }
506 }
507
508 if (G->hasInitializer())
509 {
510 handleGlobalInitializerCE(G->getInitializer());
511 }
512}
513
518{
519
520 if (C->getType()->isSingleValueType())
521 {
522 if (const ConstantExpr* E = SVFUtil::dyn_cast<ConstantExpr>(C))
523 {
524 handleCE(E);
525 }
526 else
527 {
528 collectVal(C);
529 }
530 }
531 else if (SVFUtil::isa<ConstantArray>(C))
532 {
533 for (u32_t i = 0, e = C->getNumOperands(); i != e; i++)
534 {
535 handleGlobalInitializerCE(SVFUtil::cast<Constant>(C->getOperand(i)));
536 }
537 }
538 else if (SVFUtil::isa<ConstantStruct>(C))
539 {
540 for (u32_t i = 0, e = C->getNumOperands(); i != e; i++)
541 {
542 handleGlobalInitializerCE(SVFUtil::cast<Constant>(C->getOperand(i)));
543 }
544 }
545 else if(const ConstantData* data = SVFUtil::dyn_cast<ConstantData>(C))
546 {
548 {
549 if (const ConstantDataSequential* seq =
550 SVFUtil::dyn_cast<ConstantDataSequential>(data))
551 {
552 for(u32_t i = 0; i < seq->getNumElements(); i++)
553 {
554 const Constant* ct = seq->getElementAsConstant(i);
556 }
557 }
558 else
559 {
560 assert(
561 (SVFUtil::isa<ConstantAggregateZero, UndefValue>(data)) &&
562 "Single value type data should have been handled!");
563 }
564 }
565 }
566 else
567 {
568 //TODO:assert(SVFUtil::isa<ConstantVector>(C),"what else do we have");
569 }
570}
571
576
577
582
587{
588 const Value* startValue = inst;
589 const PointerType *originalPType = SVFUtil::dyn_cast<PointerType>(inst->getType());
590 const Type* inferedType = nullptr;
591 assert(originalPType && "empty type?");
593 {
594 if(const Value* v = getFirstUseViaCastInst(inst))
595 {
596 if (const PointerType *newTy = SVFUtil::dyn_cast<PointerType>(v->getType()))
597 {
599 }
600 }
602 }
604 {
605 const CallBase* cs = LLVMUtil::getLLVMCallSite(inst);
606 u32_t arg_pos = LLVMUtil::getHeapAllocHoldingArgPosition(cs->getCalledFunction());
607 const Value* arg = cs->getArgOperand(arg_pos);
608 originalPType = SVFUtil::dyn_cast<PointerType>(arg->getType());
610 }
611 else
612 {
613 assert( false && "not a heap allocation instruction?");
614 }
615
617
618 return inferedType;
619}
620
621/*
622 * Initial the memory object here
623 */
625{
626 const Type* objTy = nullptr;
627
628 const Instruction* I = SVFUtil::dyn_cast<Instruction>(val);
629
630 // We consider two types of objects:
631 // (1) A heap/static object from a callsite
632 if (I && isNonInstricCallSite(I))
633 {
635 }
636 // (2) Other objects (e.g., alloca, global, etc.)
637 else
638 {
639 if (SVFUtil::isa<PointerType>(val->getType()))
640 {
641 if (const AllocaInst *allocaInst = SVFUtil::dyn_cast<AllocaInst>(val))
642 {
643 // get the type of the allocated memory
644 // e.g., for `%retval = alloca i64, align 4`, we return i64
645 objTy = allocaInst->getAllocatedType();
646 }
647 else if (const GlobalValue *global = SVFUtil::dyn_cast<GlobalValue>(val))
648 {
649 // get the pointee type of the global pointer (begins with @ symbol in llvm)
650 objTy = global->getValueType();
651 }
652 else
653 {
655 assert(false && "not an allocation or global?");
656 }
657 }
658 }
659
660 if (objTy)
661 {
663 ObjTypeInfo* typeInfo = new ObjTypeInfo(
664 llvmModuleSet()->getSVFType(objTy),
666 initTypeInfo(typeInfo,val, objTy);
667 return typeInfo;
668 }
669 else
670 {
671 writeWrnMsg("try to create an object with a non-pointer type.");
672 writeWrnMsg(val->getName().str());
673 writeWrnMsg("(" + getSourceLoc(val) + ")");
675 {
676 ObjTypeInfo* typeInfo = new ObjTypeInfo(
677 llvmModuleSet()->getSVFType(val->getType()),
678 0);
679 initTypeInfo(typeInfo,val, val->getType());
680 return typeInfo;
681 }
682 else
683 {
684 assert(false && "Memory object must be either (1) held by a pointer-typed ref value or (2) a constant value (e.g., 10).");
685 abort();
686 }
687 }
688}
689
694{
695 const Type *elemTy = llvmModuleSet()->getLLVMType(typeinfo->getType());
696 // Find the inter nested array element
697 while (const ArrayType* AT = SVFUtil::dyn_cast<ArrayType>(elemTy))
698 {
699 elemTy = AT->getElementType();
700 if (SVFUtil::isa<GlobalVariable>(val) &&
701 SVFUtil::cast<GlobalVariable>(val)->hasInitializer() &&
702 SVFUtil::isa<ConstantArray>(
703 SVFUtil::cast<GlobalVariable>(val)->getInitializer()))
705 else
707 }
708 if (SVFUtil::isa<StructType>(elemTy))
709 {
710 if (SVFUtil::isa<GlobalVariable>(val) &&
711 SVFUtil::cast<GlobalVariable>(val)->hasInitializer() &&
712 SVFUtil::isa<ConstantStruct>(
713 SVFUtil::cast<GlobalVariable>(val)->getInitializer()))
715 else
717 }
718}
719
735{
736 if(const llvm::CallInst* callInst = llvm::dyn_cast<llvm::CallInst>(val))
737 {
738 if (const llvm::Function* calledFunction =
739 callInst->getCalledFunction())
740 {
741 std::vector<const Value*> args;
742 // Heap alloc functions have annoation like "AllocSize:Arg1"
744 {
745 if (annotation.find("AllocSize:") != std::string::npos)
746 {
747 std::string allocSize = annotation.substr(10);
748 std::stringstream ss(allocSize);
749 std::string token;
750 // Analyaze annotation string and attract Arg list
751 while (std::getline(ss, token, '*'))
752 {
753 if (token.rfind("Arg", 0) == 0)
754 {
756 std::istringstream(token.substr(3)) >> argIndex;
758 {
759 args.push_back(
760 callInst->getArgOperand(argIndex));
761 }
762 }
763 }
764 }
765 }
766 u64_t product = 1;
767 if (args.size() > 0)
768 {
769 // for annotations like "AllocSize:Arg0*Arg1"
770 for (const llvm::Value* arg : args)
771 {
772 if (const llvm::ConstantInt* constIntArg =
773 llvm::dyn_cast<llvm::ConstantInt>(arg))
774 {
775 // Multiply the constant Value if all Args are const
777 }
778 else
779 {
780 // if Arg list has non-const value, return 0 to indicate it is non const byte size
781 return 0;
782 }
783 }
784 // If all the Args are const, return product
785 return product;
786 }
787 else
788 {
789 // for annotations like "AllocSize:UNKNOWN"
790 return 0;
791 }
792 }
793 }
794 // if it is not CallInst or CallInst has no CalledFunction, return 0 to indicate it is non const byte size
795 return 0;
796}
797
802{
804 analyzeObjType(typeinfo, val);
805 const Type* objTy = llvmModuleSet()->getLLVMType(typeinfo->getType());
806 if(SVFUtil::isa<ArrayType>(objTy))
807 return getNumOfElements(objTy);
808 else if(const StructType* st = SVFUtil::dyn_cast<StructType>(objTy))
809 {
813 typeinfo->resetTypeForHeapStaticObj(llvmModuleSet()->getSVFType(
814 llvmModuleSet()->getTypeInference()->ptrType()));
815 else
816 return getNumOfElements(objTy);
817 }
818 return typeinfo->getMaxFieldOffsetLimit();
819}
820
825{
827 {
829 analyzeObjType(typeinfo,castUse);
830 }
831 else
832 {
834 }
835}
836
841 const Type* objTy)
842{
843
844 u32_t elemNum = 1;
845 // init byteSize = 0, If byteSize is changed in the following process,
846 // it means that ObjTypeInfo has a Constant Byte Size
847 u32_t byteSize = 0;
848 // Global variable
849 // if val is Function Obj, byteSize is not set
850 if (SVFUtil::isa<Function>(val))
851 {
853 analyzeObjType(typeinfo,val);
854 elemNum = 0;
855 }
858 else if(const AllocaInst* allocaInst = SVFUtil::dyn_cast<AllocaInst>(val))
859 {
861 analyzeObjType(typeinfo,val);
864 if(const ConstantInt* sz = SVFUtil::dyn_cast<ConstantInt>(allocaInst->getArraySize()))
865 {
867 byteSize = LLVMUtil::getIntegerValue(sz).second * typeinfo->getType()->getByteSize();
868 }
870 else
871 {
872 elemNum = getNumOfElements(objTy);
873 byteSize = 0;
874 }
875 }
878 else if(SVFUtil::isa<GlobalVariable>(val))
879 {
883 analyzeObjType(typeinfo,val);
884 elemNum = getNumOfElements(objTy);
885 byteSize = typeinfo->getType()->getByteSize();
886 }
888 else if (SVFUtil::isa<Instruction>(val) &&
890 SVFUtil::cast<Instruction>(val)))
891 {
892 elemNum = analyzeHeapObjType(typeinfo,val);
893 // analyze heap alloc like (malloc/calloc/...), the alloc functions have
894 // annotation like "AllocSize:Arg1". Please refer to extapi.c.
895 // e.g. calloc(4, 10), annotation is "AllocSize:Arg0*Arg1",
896 // it means byteSize = 4 (Arg0) * 10 (Arg1) = 40
897 byteSize = analyzeHeapAllocByteSize(val);
898 }
900 {
901 analyzeStaticObjType(typeinfo,val);
902 // user input data, label its field as infinite here
903 elemNum = typeinfo->getMaxFieldOffsetLimit();
904 byteSize = typeinfo->getType()->getByteSize();
905 }
907 {
909 elemNum = getNumOfFlattenElements(val->getType());
910 byteSize = typeinfo->getType()->getByteSize();
911 }
912 else
913 {
914 assert("what other object do we have??");
915 abort();
916 }
917
918 // Reset maxOffsetLimit if it is over the total fieldNum of this object
919 if(typeinfo->getMaxFieldOffsetLimit() > elemNum)
920 typeinfo->setNumOfElements(elemNum);
921
922 // set ByteSize. If ByteSize > 0, this typeinfo has constant type.
923 // If ByteSize == 0, this typeinfo has 1) zero byte 2) non-const byte size
924 // If ByteSize>MaxFieldLimit, set MaxFieldLimit to the byteSize;
925 byteSize = Options::MaxFieldLimit() > byteSize? byteSize: Options::MaxFieldLimit();
926 typeinfo->setByteSizeOfObj(byteSize);
927}
928
933{
934 assert(ety && "type is null?");
935 u32_t numOfFields = 1;
936 if (SVFUtil::isa<StructType, ArrayType>(ety))
937 {
939 }
940 return numOfFields;
941}
942
951
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:593
#define DMemModelCE
Definition SVFType.h:603
#define DMemModel
Definition SVFType.h:602
NodeID constantSymID() const
Definition IRGraph.h:188
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:231
static bool isBlkObj(NodeID id)
Definition IRGraph.h:165
IDToTypeInfoMapTy objTypeInfoMap
map a memory sym id to its obj
Definition IRGraph.h:87
NodeID totalSymNum
total number of symbols
Definition IRGraph.h:100
static bool isConstantSym(NodeID id)
Definition IRGraph.h:169
ValueToIDMapTy valSymMap
map a value to its sym id
Definition LLVMModule.h:116
FunToIDMapTy varargSymMap
vararg map
Definition LLVMModule.h:119
const std::vector< std::string > & getExtFuncAnnotations(const Function *fun)
SVFType * getSVFType(const Type *T)
Get or create SVFType and typeinfo.
const Type * getLLVMType(const SVFType *T) const
Get LLVM Type.
ValueToIDMapTy objSymMap
map a obj reference to its sym id
Definition LLVMModule.h:117
FunToIDMapTy returnSymMap
return map
Definition LLVMModule.h:118
const std::vector< std::reference_wrapper< Module > > & getLLVMModules() const
Definition LLVMModule.h:160
ObjTypeInference * getTypeInference()
NodeID allocateValueId(void)
Allocate a value ID as determined by the strategy.
static NodeIDAllocator * get(void)
Return (singleton) allocator.
NodeID allocateObjectId(void)
Allocate an object ID as determined by the strategy.
NodeID endSymbolAllocation(void)
Notify the allocator that all symbols have had IDs allocated.
void typeSizeDiffTest(const PointerType *oPTy, const Type *iTy, const Value *val)
const Type * inferObjType(const Value *var)
get or infer the type of the object pointed by the value
void validateTypeCheck(const CallBase *cs)
validate type inference
void resetTypeForHeapStaticObj(const SVFType *t)
Definition ObjTypeInfo.h:78
u32_t getMaxFieldOffsetLimit()
Get max field offset limit.
const SVFType * getType() const
Get LLVM type.
Definition ObjTypeInfo.h:97
void setByteSizeOfObj(u32_t size)
Set the byte size of this object.
void setFlag(MEMTYPE mask)
Flag for this object type.
void setNumOfElements(u32_t num)
Set the number of elements of this object.
static Option< bool > ModelArrays
Definition Options.h:182
static const Option< bool > EnableTypeCheck
Definition Options.h:128
static const Option< bool > SymTabPrint
Definition Options.h:184
static Option< bool > ModelConsts
Definition Options.h:181
static const Option< u32_t > MaxFieldLimit
Maximum number of field derivations for an object.
Definition Options.h:35
StInfo * getTypeInfo()
Definition SVFType.h:275
u32_t getByteSize() const
Definition SVFType.h:289
u32_t getNumOfFlattenElements() const
Return number of elements after flattening (including array elements)
Definition SVFType.h:166
u32_t getNumOfFlattenFields() const
Return the number of fields after flattening (ignoring array elements)
Definition SVFType.h:172
const Type * inferTypeOfHeapObjOrStaticObj(const Instruction *inst)
Get the reference type of heap/static object from an allocation site.
void handleGlobalInitializerCE(const Constant *C)
void collectRet(const Function *val)
ObjTypeInfo * createObjTypeInfo(const Value *val)
Create an objectInfo based on LLVM value.
const Type * inferObjType(const Value *startValue)
Forward collect all possible infer sites starting from a value.
void collectSVFTypeInfo(const Value *val)
collect the syms
LLVMModuleSet * llvmModuleSet()
ObjTypeInference * getTypeInference()
ObjTypeInfo * createBlkObjTypeInfo(NodeID symId)
u32_t getNumOfFlattenElements(const Type *T)
Number of flattened elements of an array or struct.
u32_t getNumOfElements(const Type *ety)
Return size of this object based on LLVM value.
void handleGlobalCE(const GlobalVariable *G)
Handle constant expression.
u32_t analyzeHeapObjType(ObjTypeInfo *typeinfo, const Value *val)
Analyse types of heap and static objects.
u32_t analyzeHeapAllocByteSize(const Value *val)
Analyze byte size of heap alloc function (e.g. malloc/calloc/...)
void collectObj(const Value *val)
void buildMemModel()
Start building memory model.
ObjTypeInfo * createConstantObjTypeInfo(NodeID symId)
void collectVal(const Value *val)
void handleCE(const Value *val)
void collectSym(const Value *val)
void collectVararg(const Function *val)
void initTypeInfo(ObjTypeInfo *typeinfo, const Value *value, const Type *ty)
Initialize TypeInfo based on LLVM Value.
void analyzeObjType(ObjTypeInfo *typeinfo, const Value *val)
Analyse types of all flattened fields of this object.
StInfo * getOrAddSVFTypeInfo(const Type *T)
Get a reference to StructInfo.
void analyzeStaticObjType(ObjTypeInfo *typeinfo, const Value *val)
Analyse types of heap and static objects.
bool isHeapAllocExtCallViaRet(const Instruction *inst)
Definition LLVMUtil.cpp:638
const Value * getFirstUseViaCastInst(const Value *val)
Definition LLVMUtil.cpp:278
const CallBase * getLLVMCallSite(const Value *value)
Return LLVM callsite given a value.
Definition LLVMUtil.h:92
const ConstantExpr * isBinaryConstantExpr(const Value *val)
Definition LLVMUtil.h:294
bool isHeapAllocExtCall(const Instruction *inst)
Definition LLVMUtil.h:404
bool isConstantObjSym(const Value *val)
Check whether this value points-to a constant object.
Definition CppUtil.cpp:747
const ConstantExpr * isInt2PtrConstantExpr(const Value *val)
Definition LLVMUtil.h:229
const ConstantExpr * isSelectConstantExpr(const Value *val)
Definition LLVMUtil.h:259
const ConstantExpr * isTruncConstantExpr(const Value *val)
Definition LLVMUtil.h:269
std::pair< s64_t, u64_t > getIntegerValue(const ConstantInt *intValue)
Definition LLVMUtil.h:83
bool isNullPtrSym(const Value *val)
Check whether this value is a black hole.
Definition LLVMUtil.h:127
std::string dumpValueAndDbgInfo(const Value *val)
Definition LLVMUtil.cpp:627
bool isConstDataOrAggData(const Value *val)
Return true if the value refers to constant data, e.g., i32 0.
Definition LLVMUtil.h:376
const std::string getSourceLoc(const Value *val)
Definition LLVMUtil.cpp:453
const ConstantExpr * isPtr2IntConstantExpr(const Value *val)
Definition LLVMUtil.h:239
const Value * getGlobalRep(const Value *val)
find the unique defined global across multiple modules
Definition LLVMUtil.cpp:440
const ConstantExpr * isUnaryConstantExpr(const Value *val)
Definition LLVMUtil.h:305
const ConstantExpr * isCastConstantExpr(const Value *val)
Definition LLVMUtil.h:249
bool isBlackholeSym(const Value *val)
Check whether this value is a black hole.
Definition LLVMUtil.h:121
bool isHeapAllocExtCallViaArg(const Instruction *inst)
Definition LLVMUtil.cpp:653
bool isObject(const Value *ref)
Return true if this value refers to a object.
Definition LLVMUtil.cpp:60
bool ArgInProgEntryFunction(const Value *val)
Return true if this is an argument of a program entry function (e.g. main)
Definition LLVMUtil.h:168
const ConstantExpr * isGepConstantExpr(const Value *val)
Return corresponding constant expression, otherwise return nullptr.
Definition LLVMUtil.h:219
u32_t getHeapAllocHoldingArgPosition(const Function *fun)
Definition LLVMUtil.cpp:401
bool isNonInstricCallSite(const Instruction *inst)
Whether an instruction is a callsite in the application code, excluding llvm intrinsic calls.
Definition LLVMUtil.cpp:725
std::string dumpValue(const Value *val)
Definition LLVMUtil.cpp:605
const ConstantExpr * isCmpConstantExpr(const Value *val)
Definition LLVMUtil.h:283
void increaseStackSize()
Increase the stack size limit.
Definition SVFUtil.cpp:233
std::enable_if_t<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > cast(const Y &Val)
Definition Casting.h:360
std::ostream & errs()
Overwrite llvm::errs()
Definition SVFUtil.h:58
void writeWrnMsg(const std::string &msg)
Writes a message run through wrnMsg.
Definition SVFUtil.cpp:72
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52
bool classTyHasVTable(const StructType *ty)
Definition CppUtil.cpp:644
for isBitcode
Definition BasicTypes.h:70
llvm::GlobalVariable GlobalVariable
Definition BasicTypes.h:137
llvm::GlobalAlias GlobalAlias
Definition BasicTypes.h:135
llvm::ArrayType ArrayType
Definition BasicTypes.h:99
llvm::Type Type
Definition BasicTypes.h:87
llvm::CallBase CallBase
Definition BasicTypes.h:153
llvm::UnaryOperator UnaryOperator
Definition BasicTypes.h:187
llvm::StructType StructType
LLVM types.
Definition BasicTypes.h:98
unsigned long long u64_t
Definition GeneralType.h:49
llvm::AllocaInst AllocaInst
Definition BasicTypes.h:157
llvm::SwitchInst SwitchInst
Definition BasicTypes.h:162
u32_t NodeID
Definition GeneralType.h:56
llvm::Argument Argument
Definition BasicTypes.h:152
llvm::LoadInst LoadInst
Definition BasicTypes.h:156
llvm::CmpInst CmpInst
Definition BasicTypes.h:166
llvm::Function Function
Definition BasicTypes.h:89
llvm::GlobalValue GlobalValue
Definition BasicTypes.h:92
llvm::ConstantData ConstantData
Definition BasicTypes.h:120
llvm::Instruction Instruction
Definition BasicTypes.h:91
llvm::Constant Constant
Definition BasicTypes.h:128
llvm::ConstantDataSequential ConstantDataSequential
Definition BasicTypes.h:123
llvm::Value Value
LLVM Basic classes.
Definition BasicTypes.h:86
llvm::ConstantExpr ConstantExpr
Definition BasicTypes.h:124
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76
llvm::CastInst CastInst
Definition BasicTypes.h:165
llvm::FreezeInst FreezeInst
Definition BasicTypes.h:176
llvm::Module Module
Definition BasicTypes.h:88
llvm::PointerType PointerType
Definition BasicTypes.h:100
llvm::BinaryOperator BinaryOperator
Definition BasicTypes.h:186
llvm::StoreInst StoreInst
Definition BasicTypes.h:155
llvm::SelectInst SelectInst
Definition BasicTypes.h:181
llvm::GetElementPtrInst GetElementPtrInst
Definition BasicTypes.h:169
llvm::ReturnInst ReturnInst
Definition BasicTypes.h:164
llvm::PHINode PHINode
Definition BasicTypes.h:172
llvm::BranchInst BranchInst
Definition BasicTypes.h:161
unsigned u32_t
Definition GeneralType.h:47
llvm::ConstantInt ConstantInt
Definition BasicTypes.h:129
llvm::User User
Definition BasicTypes.h:149