41 using namespace SVFUtil;
51 if (SVFModule::pagReadFromTXT())
54 return fileBuilder.
build();
58 if(pag->getNodeNumAfterPAGBuild() > 1)
68 visitGlobal(svfModule);
71 ExternalPAG::initialise(svfModule);
86 if(fun.
getLLVMFun()->doesNotReturn() ==
false && fun.
getLLVMFun()->getReturnType()->isVoidTy() ==
false)
87 pag->addFunRet(&fun,pag->getPAGNode(pag->getReturnNode(&fun)));
93 setCurrentLocation(&*I,&fun.
getLLVMFun()->getEntryBlock());
94 NodeID argValNodeId = pag->getValueNode(&*I);
102 pag->addFunArgs(&fun,pag->getPAGNode(argValNodeId));
109 for (BasicBlock::iterator it = bb.begin(), eit = bb.end();
113 setCurrentLocation(&inst,&bb);
121 pag->initialiseCandidatePointers();
123 pag->setNodeNumAfterPAGBuild(pag->getTotalNodeNum());
131 void PAGBuilder::initialiseNodes()
137 pag->addBlackholeObjNode();
138 pag->addConstantObjNode();
139 pag->addBlackholePtrNode();
142 for (SymbolTableInfo::ValueToIDMapTy::iterator iter =
149 pag->addValNode(iter->first, iter->second);
152 for (SymbolTableInfo::ValueToIDMapTy::iterator iter =
159 pag->addObjNode(iter->first, iter->second);
162 for (SymbolTableInfo::FunToIDMapTy::iterator iter =
167 const SVFFunction* fun = LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(iter->first);
168 pag->addRetNode(fun, iter->second);
171 for (SymbolTableInfo::FunToIDMapTy::iterator iter =
176 const SVFFunction* fun = LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(iter->first);
177 pag->addVarargNode(fun, iter->second);
181 for (SymbolTableInfo::ValueToIDMapTy::iterator iter =
182 symTable->
objSyms().begin(); iter != symTable->
objSyms().end(); ++iter)
184 DBOUT(
DPAGBuild,
outs() <<
"add address edges for constant node " << iter->second <<
"\n");
185 const Value* val = iter->first;
188 NodeID ptr = pag->getValueNode(val);
189 if(ptr!= pag->getBlkPtr() && ptr!= pag->getNullPtr())
191 setCurrentLocation(val,
nullptr);
192 addAddrEdge(iter->second, ptr);
198 &&
"not all node been inititalize!!!");
210 return SymbolTableInfo::SymbolInfo()->computeGepOffset(V,ls);
216 void PAGBuilder::processCE(
const Value *val)
218 if (
const Constant* ref = SVFUtil::dyn_cast<Constant>(val))
223 outs() <<
"handle gep constant expression " << *ref <<
"\n");
224 const Constant* opnd = gepce->getOperand(0);
228 bool constGep = computeGepOffset(gepce, ls);
230 const Value* cval = getCurrentValue();
232 setCurrentLocation(gepce,
nullptr);
237 addGepEdge(pag->getValueNode(opnd), pag->getValueNode(gepce), ls, constGep);
238 setCurrentLocation(cval, cbb);
243 outs() <<
"handle cast constant expression " << *ref <<
"\n");
244 const Constant* opnd = castce->getOperand(0);
246 const Value* cval = getCurrentValue();
248 setCurrentLocation(castce,
nullptr);
249 addCopyEdge(pag->getValueNode(opnd), pag->getValueNode(castce));
250 setCurrentLocation(cval, cbb);
255 outs() <<
"handle select constant expression " << *ref <<
"\n");
256 const Constant* src1 = selectce->getOperand(1);
257 const Constant* src2 = selectce->getOperand(2);
260 const Value* cval = getCurrentValue();
262 setCurrentLocation(selectce,
nullptr);
263 NodeID nsrc1 = pag->getValueNode(src1);
264 NodeID nsrc2 = pag->getValueNode(src2);
265 NodeID nres = pag->getValueNode(selectce);
266 const CopyPE* cpy1 = addCopyEdge(nsrc1, nres);
267 const CopyPE* cpy2 = addCopyEdge(nsrc2, nres);
268 pag->addPhiNode(pag->getPAGNode(nres),cpy1);
269 pag->addPhiNode(pag->getPAGNode(nres),cpy2);
270 setCurrentLocation(cval, cbb);
275 addGlobalBlackHoleAddrEdge(pag->getValueNode(int2Ptrce), int2Ptrce);
279 const Constant* opnd = ptr2Intce->getOperand(0);
282 const Value* cval = getCurrentValue();
283 setCurrentLocation(ptr2Intce,
nullptr);
284 addCopyEdge(pag->getValueNode(opnd), pag->getValueNode(ptr2Intce));
285 setCurrentLocation(cval, cbb);
290 const Value* cval = getCurrentValue();
292 setCurrentLocation(ref,
nullptr);
293 NodeID dst = pag->getValueNode(ref);
294 addBlackHoleAddrEdge(dst);
295 setCurrentLocation(cval, cbb);
300 const Value* cval = getCurrentValue();
302 setCurrentLocation(ref,
nullptr);
303 NodeID dst = pag->getValueNode(ref);
304 addBlackHoleAddrEdge(dst);
305 setCurrentLocation(cval, cbb);
310 const Value* cval = getCurrentValue();
312 setCurrentLocation(ref,
nullptr);
313 NodeID dst = pag->getValueNode(ref);
314 addBlackHoleAddrEdge(dst);
315 setCurrentLocation(cval, cbb);
317 else if (SVFUtil::isa<ConstantAggregate>(ref))
321 else if (SVFUtil::isa<BlockAddress>(ref))
325 const Value *cval = getCurrentValue();
327 setCurrentLocation(ref,
nullptr);
328 NodeID dst = pag->getValueNode(ref);
329 addAddrEdge(pag->getConstantNode(), dst);
330 setCurrentLocation(cval, cbb);
334 if(SVFUtil::isa<ConstantExpr>(val))
335 assert(
false &&
"we don't handle all other constant expression for now!");
348 if (offset == 0 && gvar->getInitializer()->getType()->isSingleValueType())
350 return getValueNode(gvar);
356 const Type *gvartype = gvar->getType();
357 while (
const PointerType *ptype = SVFUtil::dyn_cast<PointerType>(gvartype))
358 gvartype = ptype->getElementType();
359 return getGepValNode(gvar,
LocationSet(offset), gvartype, offset);
378 outs() <<
"global " << *gvar <<
" constant initializer: " << *C
381 if (C->getType()->isSingleValueType())
383 NodeID src = getValueNode(C);
385 setCurrentLocation(gvar,
nullptr);
386 NodeID field = getGlobalVarField(gvar, offset);
388 if (SVFUtil::isa<GlobalVariable>(C) || SVFUtil::isa<Function>(C))
390 setCurrentLocation(C,
nullptr);
391 addStoreEdge(src, field);
393 else if (SVFUtil::isa<ConstantExpr>(C))
397 setCurrentLocation(C,
nullptr);
398 addStoreEdge(src, field);
400 else if (SVFUtil::isa<BlockAddress>(C))
405 setCurrentLocation(C,
nullptr);
406 addAddrEdge(pag->getConstantNode(), src);
410 setCurrentLocation(C,
nullptr);
411 addStoreEdge(src, field);
413 if (C->getType()->isPtrOrPtrVectorTy() && src != pag->getNullPtr())
414 addCopyEdge(pag->getNullPtr(), src);
417 else if (SVFUtil::isa<ConstantArray>(C))
420 for (
u32_t i = 0, e = C->getNumOperands(); i != e; i++)
421 InitialGlobal(gvar, SVFUtil::cast<Constant>(C->getOperand(i)), offset);
424 else if (SVFUtil::isa<ConstantStruct>(C))
426 const StructType *sty = SVFUtil::cast<StructType>(C->getType());
427 const std::vector<u32_t>& offsetvect =
428 SymbolTableInfo::SymbolInfo()->getFattenFieldIdxVec(sty);
429 for (
u32_t i = 0, e = C->getNumOperands(); i != e; i++)
431 u32_t off = offsetvect[i];
432 InitialGlobal(gvar, SVFUtil::cast<Constant>(C->getOperand(i)), offset + off);
453 NodeID idx = getValueNode(gvar);
454 NodeID obj = getObjectNode(gvar);
456 setCurrentLocation(gvar,
nullptr);
457 addAddrEdge(obj, idx);
459 if (gvar->hasInitializer())
461 Constant *C = gvar->getInitializer();
463 InitialGlobal(gvar, C, 0);
472 NodeID idx = getValueNode(fun);
473 NodeID obj = getObjectNode(fun);
476 setCurrentLocation(fun,
nullptr);
477 addAddrEdge(obj, idx);
483 NodeID dst = pag->getValueNode(*I);
484 NodeID src = pag->getValueNode((*I)->getAliasee());
485 processCE((*I)->getAliasee());
486 setCurrentLocation(*I,
nullptr);
487 addCopyEdge(src,dst);
499 assert(SVFUtil::isa<PointerType>(inst.getType()));
502 NodeID dst = getValueNode(&inst);
504 NodeID src = getObjectNode(&inst);
506 addAddrEdge(src, dst);
518 NodeID dst = getValueNode(&inst);
520 for (
Size_t i = 0; i < inst.getNumIncomingValues(); ++i)
522 const Value* val = inst.getIncomingValue(i);
524 assert((incomingInst==
nullptr) || (incomingInst->getFunction() == inst.getFunction()));
526 NodeID src = getValueNode(val);
527 const CopyPE* copy = addCopyEdge(src, dst);
528 pag->addPhiNode(pag->getPAGNode(dst), copy);
539 NodeID dst = getValueNode(&inst);
541 NodeID src = getValueNode(inst.getPointerOperand());
543 addLoadEdge(src, dst);
552 assert(!SVFUtil::isa<PointerType>(inst.getType()));
556 NodeID dst = getValueNode(inst.getPointerOperand());
558 NodeID src = getValueNode(inst.getValueOperand());
560 addStoreEdge(src, dst);
570 NodeID dst = getValueNode(&inst);
573 if(SVFUtil::isa<VectorType>(inst.getType()))
575 addBlackHoleAddrEdge(dst);
579 assert(SVFUtil::isa<PointerType>(inst.getType()));
583 NodeID src = getValueNode(inst.getPointerOperand());
586 bool constGep = computeGepOffset(&inst, ls);
587 addGepEdge(src, dst, ls, constGep);
597 NodeID dst = getValueNode(&inst);
599 if (SVFUtil::isa<IntToPtrInst>(&inst))
601 addBlackHoleAddrEdge(dst);
605 Value * opnd = inst.getOperand(0);
606 if (!SVFUtil::isa<PointerType>(opnd->getType()))
609 NodeID src = getValueNode(opnd);
610 addCopyEdge(src, dst);
619 NodeID dst = getValueNode(&inst);
620 for (
u32_t i = 0; i < inst.getNumOperands(); i++)
622 Value* opnd = inst.getOperand(i);
623 NodeID src = getValueNode(opnd);
624 const BinaryOPPE* binayPE = addBinaryOPEdge(src, dst);
625 pag->addBinaryNode(pag->getPAGNode(dst),binayPE);
634 NodeID dst = getValueNode(&inst);
635 for (
u32_t i = 0; i < inst.getNumOperands(); i++)
637 Value* opnd = inst.getOperand(i);
638 NodeID src = getValueNode(opnd);
639 const UnaryOPPE* unaryPE = addUnaryOPEdge(src, dst);
640 pag->addUnaryNode(pag->getPAGNode(dst),unaryPE);
649 NodeID dst = getValueNode(&inst);
650 for (
u32_t i = 0; i < inst.getNumOperands(); i++)
652 Value* opnd = inst.getOperand(i);
653 NodeID src = getValueNode(opnd);
654 const CmpPE* cmpPE = addCmpEdge(src, dst);
655 pag->addCmpNode(pag->getPAGNode(dst),cmpPE);
668 NodeID dst = getValueNode(&inst);
669 NodeID src1 = getValueNode(inst.getTrueValue());
670 NodeID src2 = getValueNode(inst.getFalseValue());
671 const CopyPE* cpy1 = addCopyEdge(src1, dst);
672 const CopyPE* cpy2 = addCopyEdge(src2, dst);
675 pag->addPhiNode(pag->getPAGNode(dst), cpy1);
676 pag->addPhiNode(pag->getPAGNode(dst), cpy2);
695 pag->addCallSite(callBlockNode);
699 pag->addCallSiteArgs(callBlockNode,pag->getPAGNode(getValueNode(*itA)));
702 pag->addCallSiteRets(retBlockNode,pag->getPAGNode(getValueNode(cs.
getInstruction())));
710 if (ExternalPAG::hasExternalPAG(callee))
712 ExternalPAG::connectCallsiteToExternalPAG(&cs);
717 handleExtCall(cs, callee);
722 handleDirectCall(cs, callee);
739 assert(!SVFUtil::isa<PointerType>(inst.getType()));
743 if(
Value *src = inst.getReturnValue())
745 const SVFFunction *F = LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(inst.getParent()->getParent());
747 NodeID rnF = getReturnNode(F);
748 NodeID vnS = getValueNode(src);
750 const CopyPE* copy = addCopyEdge(vnS, rnF);
751 pag->addPhiNode(pag->getPAGNode(rnF), copy);
766 NodeID dst = getValueNode(&inst);
767 addBlackHoleAddrEdge(dst);
780 NodeID dst = getValueNode(&inst);
781 addBlackHoleAddrEdge(dst);
789 NodeID dst = getValueNode(&inst);
791 if (inst.isConditional())
792 src = getValueNode(inst.getCondition());
794 src = pag->getNullPtr();
795 const UnaryOPPE *unaryPE = addUnaryOPEdge(src, dst);
796 pag->addUnaryNode(pag->getPAGNode(dst),unaryPE);
800 NodeID dst = getValueNode(&inst);
801 Value* opnd = inst.getCondition();
802 NodeID src = getValueNode(opnd);
803 const UnaryOPPE* unaryPE = addUnaryOPEdge(src, dst);
804 pag->addUnaryNode(pag->getPAGNode(dst),unaryPE);
813 NodeID dst = getValueNode(&inst);
814 Value* opnd = inst.getPointerOperand();
815 NodeID src = getValueNode(opnd);
816 addCopyEdge(src,dst);
824 NodeID dst = getValueNode(&inst);
825 for (
u32_t i = 0; i < inst.getNumOperands(); i++)
827 Value* opnd = inst.getOperand(i);
828 NodeID src = getValueNode(opnd);
829 addCopyEdge(src,dst);
850 NodeID srcret = getReturnNode(F);
852 addRetEdge(srcret, dstrec,icfgNode);
856 Function::const_arg_iterator itF = F->
getLLVMFun()->arg_begin(), ieF = F->
getLLVMFun()->arg_end();
859 for (; itF != ieF; ++itA, ++itF)
867 const Value *AA = *itA, *FA = &*itF;
871 NodeID dstFA = getValueNode(FA);
872 NodeID srcAA = getValueNode(AA);
874 addCallEdge(srcAA, dstFA, icfgNode);
879 NodeID vaF = getVarargNode(F);
881 for (; itA != ieA; ++itA)
884 NodeID vnAA = getValueNode(AA);
886 addCallEdge(vnAA,vaF, icfgNode);
903 const Type *PAGBuilder::getBaseTypeAndFlattenedFields(
Value *V, std::vector<LocationSet> &fields)
905 return SymbolTableInfo::SymbolInfo()->getBaseTypeAndFlattenedFields(V, fields);
915 NodeID vnD= getValueNode(D), vnS= getValueNode(S);
919 std::vector<LocationSet> fields;
922 std::vector<LocationSet> srcFields;
923 std::vector<LocationSet> dstFields;
924 const Type *stype = getBaseTypeAndFlattenedFields(S, srcFields);
925 const Type *dtype = getBaseTypeAndFlattenedFields(D, dstFields);
926 if(srcFields.size() > dstFields.size())
935 assert(fields.size() >= sz &&
"the number of flattened fields is smaller than size");
938 for (
u32_t index = 0; index < sz; index++)
940 NodeID dField = getGepValNode(D,fields[index],dtype,index);
941 NodeID sField = getGepValNode(S,fields[index],stype,index);
942 NodeID dummy = pag->addDummyValNode();
943 addLoadEdge(sField,dummy);
944 addStoreEdge(dummy,dField);
960 NodeID val = getValueNode(inst);
961 NodeID obj = getObjectNode(inst);
962 addAddrEdge(obj, val);
970 if (arg->getType()->isPointerTy())
972 NodeID vnArg = getValueNode(arg);
973 NodeID dummy = pag->addDummyValNode();
974 NodeID obj = pag->addDummyObjNode();
975 if (vnArg && dummy && obj)
977 addAddrEdge(obj, dummy);
978 addStoreEdge(dummy, vnArg);
983 writeWrnMsg(
"Arg receiving new object must be pointer type");
994 case ExtAPI::EFT_REALLOC:
996 if(!SVFUtil::isa<PointerType>(inst->getType()))
1002 if(SVFUtil::isa<ConstantPointerNull>(cs.
getArgument(0)))
1004 NodeID val = getValueNode(inst);
1005 NodeID obj = getObjectNode(inst);
1006 addAddrEdge(obj, val);
1010 case ExtAPI::EFT_L_A0:
1011 case ExtAPI::EFT_L_A1:
1012 case ExtAPI::EFT_L_A2:
1013 case ExtAPI::EFT_L_A8:
1015 if(!SVFUtil::isa<PointerType>(inst->getType()))
1017 NodeID dstNode = getValueNode(inst);
1021 case ExtAPI::EFT_L_A1:
1024 case ExtAPI::EFT_L_A2:
1027 case ExtAPI::EFT_L_A8:
1034 if(SVFUtil::isa<PointerType>(src->getType()))
1036 NodeID srcNode = getValueNode(src);
1037 addCopyEdge(srcNode, dstNode);
1040 addBlackHoleAddrEdge(dstNode);
1044 case ExtAPI::EFT_L_A0__A0R_A1:
1050 if(SVFUtil::isa<PointerType>(inst->getType()))
1051 addCopyEdge(getValueNode(cs.
getArgument(0)), getValueNode(inst));
1054 case ExtAPI::EFT_L_A0__A0R_A1R:
1058 if(SVFUtil::isa<PointerType>(inst->getType()))
1060 addCopyEdge(getValueNode(cs.
getArgument(0)), getValueNode(inst));
1064 case ExtAPI::EFT_A1R_A0R:
1067 case ExtAPI::EFT_A3R_A1R_NS:
1071 case ExtAPI::EFT_A1R_A0:
1076 addStoreEdge(vnS,vnD);
1079 case ExtAPI::EFT_A2R_A1:
1084 addStoreEdge(vnS,vnD);
1087 case ExtAPI::EFT_A4R_A1:
1092 addStoreEdge(vnS,vnD);
1095 case ExtAPI::EFT_L_A0__A1_A0:
1102 addStoreEdge(getValueNode(cs.
getArgument(1)), getValueNode(load->getPointerOperand()));
1103 if (SVFUtil::isa<PointerType>(inst->getType()))
1104 addLoadEdge(getValueNode(load->getPointerOperand()), getValueNode(inst));
1113 case ExtAPI::EFT_L_A0__A2R_A0:
1115 if(SVFUtil::isa<PointerType>(inst->getType()))
1118 NodeID vnD= getValueNode(inst);
1120 if(SVFUtil::isa<PointerType>(src->getType()))
1122 NodeID vnS= getValueNode(src);
1124 addCopyEdge(vnS,vnD);
1127 addBlackHoleAddrEdge(vnD);
1133 addStoreEdge(vnS,vnD);
1136 case ExtAPI::EFT_A0R_NEW:
1137 case ExtAPI::EFT_A1R_NEW:
1138 case ExtAPI::EFT_A2R_NEW:
1139 case ExtAPI::EFT_A4R_NEW:
1140 case ExtAPI::EFT_A11R_NEW:
1142 assert(!
"Alloc via arg cases are not handled here.");
1145 case ExtAPI::EFT_ALLOC:
1146 case ExtAPI::EFT_NOSTRUCT_ALLOC:
1147 case ExtAPI::EFT_STAT:
1148 case ExtAPI::EFT_STAT2:
1149 if(SVFUtil::isa<PointerType>(inst->getType()))
1150 assert(!
"alloc type func. are not handled here");
1154 writeWrnMsg(
"alloc type func do not return pointer type");
1157 case ExtAPI::EFT_NOOP:
1158 case ExtAPI::EFT_FREE:
1160 case ExtAPI::EFT_STD_RB_TREE_INSERT_AND_REBALANCE:
1167 NodeID vnArg3 = pag->getValueNode(vArg3);
1168 Size_t offset = pag->getLocationSetFromBaseNode(vnArg3).getOffset();
1171 vector<LocationSet> fields;
1172 const Type *type = getBaseTypeAndFlattenedFields(vArg3, fields);
1173 assert(fields.size() >= 4 &&
"_Rb_tree_node_base should have at least 4 fields.\n");
1177 for (
int i = offset + 1; i <= offset + 3; ++i)
1179 NodeID vnD = getGepValNode(vArg3, fields[i], type, i);
1180 NodeID vnS = getValueNode(vArg1);
1182 addStoreEdge(vnS,vnD);
1186 case ExtAPI::EFT_STD_RB_TREE_INCREMENT:
1188 NodeID vnD = pag->getValueNode(inst);
1191 NodeID vnArg = pag->getValueNode(vArg);
1192 Size_t offset = pag->getLocationSetFromBaseNode(vnArg).getOffset();
1195 vector<LocationSet> fields;
1196 const Type *type = getBaseTypeAndFlattenedFields(vArg,fields);
1197 assert(fields.size() >= 4 &&
"_Rb_tree_node_base should have at least 4 fields.\n");
1201 for (
int i = offset + 1; i <= offset + 3; ++i)
1203 NodeID vnS = getGepValNode(vArg, fields[i], type, i);
1205 addStoreEdge(vnS,vnD);
1209 case ExtAPI::EFT_STD_LIST_HOOK:
1213 NodeID src = pag->getValueNode(vSrc);
1214 NodeID dst = pag->getValueNode(vDst);
1215 addStoreEdge(src, dst);
1218 case ExtAPI::CPP_EFT_A0R_A1:
1225 addStoreEdge(vnS, vnD);
1229 case ExtAPI::CPP_EFT_A0R_A1R:
1236 assert(vnD && vnS &&
"dst or src not exist?");
1237 NodeID dummy = pag->addDummyValNode();
1238 addLoadEdge(vnS,dummy);
1239 addStoreEdge(dummy,vnD);
1243 case ExtAPI::CPP_EFT_A1R:
1249 assert(vnS &&
"src not exist?");
1250 NodeID dummy = pag->addDummyValNode();
1251 addLoadEdge(vnS,dummy);
1255 case ExtAPI::CPP_EFT_DYNAMIC_CAST:
1259 NodeID src = getValueNode(vArg0);
1260 assert(src &&
"src not exist?");
1261 NodeID dst = getValueNode(retVal);
1262 assert(dst &&
"dst not exist?");
1263 addCopyEdge(src, dst);
1266 case ExtAPI::EFT_CXA_BEGIN_CATCH:
1271 case ExtAPI::EFT_OTHER:
1273 if(SVFUtil::isa<PointerType>(inst->getType()))
1277 rawstr <<
"function " << callee->
getName() <<
" not in the external function summary list";
1294 assert((forkedFun->arg_size() <= 2) &&
"Size of formal parameter of start routine should be one");
1295 if(forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)
1297 const Argument* formalParm = &(*forkedFun->arg_begin());
1299 if(SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()) )
1301 CallBlockNode* icfgNode = pag->getICFG()->getCallBlockNode(inst);
1302 addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm),icfgNode);
1324 assert((taskFunc->arg_size() == 3) &&
"Size of formal parameter of hare_parallel_for's task routine should be 3");
1326 const Argument* formalParm = &(*taskFunc->arg_begin());
1328 if(SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()) )
1330 CallBlockNode* icfgNode = pag->getICFG()->getCallBlockNode(inst);
1331 addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm),icfgNode);
1353 pag->addIndirectCallsites(cbn,pag->getValueNode(cs.
getCalledValue()));
1359 void PAGBuilder::sanityCheck()
1361 for (
PAG::iterator nIter = pag->begin(); nIter != pag->end(); ++nIter)
1363 (void) pag->getPAGNode(nIter->first);
1387 NodeID base = pag->getBaseValNode(getValueNode(val));
1388 NodeID gepval = pag->getGepValNode(curVal, base, ls);
1389 if (gepval==UINT_MAX)
1391 assert(UINT_MAX==-1 &&
"maximum limit of unsigned int is not -1?");
1400 assert((SVFUtil::isa<Instruction>(curVal) || SVFUtil::isa<GlobalVariable>(curVal)) &&
"curVal not an instruction or a globalvariable?");
1401 const std::vector<FieldInfo> &fieldinfo = SymbolTableInfo::SymbolInfo()->getFlattenFieldInfoVec(baseType);
1402 const Type *type = fieldinfo[fieldidx].getFlattenElemTy();
1406 const Value* cval = getCurrentValue();
1408 setCurrentLocation(curVal,
nullptr);
1409 NodeID gepNode= pag->addGepValNode(curVal, val,ls, NodeIDAllocator::get()->allocateValueId(),type,fieldidx);
1410 addGepEdge(base, gepNode, ls,
true);
1411 setCurrentLocation(cval, cbb);
1432 void PAGBuilder::setCurrentBBAndValueForPAGEdge(
PAGEdge* edge)
1434 if (SVFModule::pagReadFromTXT())
1437 assert(curVal &&
"current Val is nullptr?");
1440 ICFGNode* icfgNode = pag->getICFG()->getGlobalBlockNode();
1441 if (
const Instruction *curInst = SVFUtil::dyn_cast<Instruction>(curVal))
1445 if(srcFun!=
nullptr && !SVFUtil::isa<RetPE>(edge) && !SVFUtil::isa<Function>(edge->
getSrcNode()->getValue())) {
1446 assert(srcFun==curInst->getFunction() &&
"SrcNode of the PAGEdge not in the same function?");
1448 if(dstFun!=
nullptr && !SVFUtil::isa<CallPE>(edge) && !SVFUtil::isa<Function>(edge->
getDstNode()->getValue())) {
1449 assert(dstFun==curInst->getFunction() &&
"DstNode of the PAGEdge not in the same function?");
1453 if (!(SVFUtil::isa<GepPE>(edge) && SVFUtil::isa<GepValPN>(edge->
getDstNode())))
1454 assert(curBB &&
"instruction does not have a basic block??");
1456 icfgNode = pag->getICFG()->getBlockICFGNode(curInst);
1458 else if (
const Argument* arg = SVFUtil::dyn_cast<Argument>(curVal))
1460 assert(curBB && (&curBB->getParent()->getEntryBlock() == curBB));
1461 const SVFFunction* fun = LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(arg->getParent());
1462 icfgNode = pag->getICFG()->getFunEntryBlockNode(fun);
1464 else if (SVFUtil::isa<ConstantExpr>(curVal))
1467 pag->addGlobalPAGEdge(edge);
1469 icfgNode = pag->getICFG()->getBlockICFGNode(&curBB->front());
1471 else if (SVFUtil::isa<GlobalVariable>(curVal) ||
1472 SVFUtil::isa<Function>(curVal) ||
1473 SVFUtil::isa<Constant>(curVal) ||
1474 SVFUtil::isa<MetadataAsValue>(curVal))
1476 pag->addGlobalPAGEdge(edge);
1480 assert(
false &&
"what else value can we have?");
1483 pag->addToInstPAGEdgeList(icfgNode,edge);
Value * stripAllCasts(Value *val)
Strip off the all casts.
const Function * getLLVMFunction(const Value *val)
Return LLVM function if this value is.
llvm_iterator llvmFunEnd()
llvm::StoreInst StoreInst
llvm::ExtractElementInst ExtractElementInst
llvm::BranchInst BranchInst
llvm::UnaryOperator UnaryOperator
bool isIntrinsicInst(const Instruction *inst)
Return true if it is an intrinsic instruction.
llvm::BasicBlock BasicBlock
SymID blackholeSymID() const
const ConstantExpr * isTruncConstantExpr(const Value *val)
void setBB(const BasicBlock *bb)
AliasSetType::iterator alias_iterator
const SVFFunction * getDefFunForMultipleModule(const Function *fun)
Get the definition of a function across multiple modules.
llvm::GlobalVariable GlobalVariable
const ConstantExpr * isUnaryConstantExpr(const Value *val)
llvm::PointerType PointerType
Value * getCalledValue() const
const ConstantExpr * isInt2PtrConstantExpr(const Value *val)
llvm::BinaryOperator BinaryOperator
CallBase * getInstruction() const
SymID nullPtrSymID() const
ValueToIDMapTy & valSyms()
Get different kinds of syms maps.
Size_t getTotalSymNum() const
Statistics.
std::string getSourceLoc(const Value *val)
Return source code including line number and file name from debug information.
const llvm::StringRef getName() const
User::const_op_iterator arg_end() const
void writeWrnMsg(std::string msg)
Writes a message run through wrnMsg.
bool isHeapAllocOrStaticExtCall(const CallSite cs)
Return true if the call is a static global call.
const ConstantExpr * isCmpConstantExpr(const Value *val)
alias_iterator alias_end()
llvm_iterator llvmFunBegin()
bool isHareParForCall(const CallSite cs)
llvm::ReturnInst ReturnInst
const ConstantExpr * isGepConstantExpr(const Value *val)
Return corresponding constant expression, otherwise return nullptr.
IDToNodeMapTy::iterator iterator
Node Iterators.
PAG * build()
Start building.
Value * getArgument(unsigned ArgNo) const
llvm::SelectInst SelectInst
SymID constantSymID() const
NodeType * getDstNode() const
llvm::Instruction Instruction
LLVMFunctionSetType::const_iterator llvm_const_iterator
llvm::StructType StructType
LLVM types.
const Value * getTaskFuncAtHareParForSite(const CallSite cs)
Return the task function of the parallel_for routine.
llvm::raw_string_ostream raw_string_ostream
bool isHeapAllocExtCallViaArg(const CallSite cs)
User::const_op_iterator arg_begin() const
llvm::Argument Argument
LLVM Aliases and constants.
ExtAPI::extf_t extCallTy(const SVFFunction *fun)
Return external call type.
bool isHeapAllocExtCallViaRet(const CallSite cs)
interfaces to be used externally
bool isValVtbl(const Value *val)
llvm::AllocaInst AllocaInst
LLVM Instructions.
const SVFFunction * getCallee(const CallSite cs)
Return callee of a callsite. Return null if this is an indirect call.
GlobalSetType::iterator global_iterator
const Value * getActualParmAtForkSite(const CallSite cs)
Return sole argument of the thread routine.
void setValue(const Value *val)
bool isStaticExtCall(const CallSite cs)
llvm::GetElementPtrInst GetElementPtrInst
const ConstantExpr * isPtr2IntConstantExpr(const Value *val)
NodeType * getSrcNode() const
bool isThreadForkCall(const CallSite cs)
int getHeapAllocHoldingArgPosition(const SVFFunction *fun)
Get the position of argument that holds an allocated heap object.
raw_ostream & outs()
Overwrite llvm::outs()
void addPAGEdge(const PAGEdge *edge)
SymID blkPtrSymID() const
global_iterator global_begin()
FunToIDMapTy & varargSyms()
llvm::SwitchInst SwitchInst
Function * getLLVMFun() const
const Value * getForkedFun(const CallSite cs)
Return thread fork function.
alias_iterator alias_begin()
ValueToIDMapTy & objSyms()
bool getModelConstants() const
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
User::const_op_iterator arg_iterator
llvm::ExtractValueInst ExtractValueInst
const ConstantExpr * isSelectConstantExpr(const Value *val)
FunctionSetType::iterator iterator
Iterators type def.
const ConstantExpr * isCastConstantExpr(const Value *val)
llvm::FreezeInst FreezeInst
llvm::ConstantExpr ConstantExpr
const Value * getTaskDataAtHareParForSite(const CallSite cs)
Return the task data argument of the parallel_for rountine.
bool isConstantObjSym(const Value *val)
global_iterator global_end()
const ConstantExpr * isBinaryConstantExpr(const Value *val)
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DEBUG model of each pass.
llvm::VAArgInst VAArgInst
bool isExtCall(const SVFFunction *fun)