5 using namespace SVFUtil;
15 if (pag->hasNonlabeledEdge(pag->getPAGNode(srcId), pag->getPAGNode(dstId),
PAGEdge::Copy))
20 if (
const CastInst *castInst = SVFUtil::dyn_cast<CastInst>(val))
22 updateObjType(castInst->getType(), getPts(edge->
getSrcID()));
24 else if (
const ConstantExpr *ce = SVFUtil::dyn_cast<ConstantExpr>(val))
26 if (ce->getOpcode() == Instruction::BitCast)
28 updateObjType(ce->getType(), getPts(edge->
getSrcID()));
38 for (PointsTo::iterator it = objs.begin(), eit = objs.end(); it != eit; ++it)
40 if (typeSystem->addTypeForVar(*it, type))
42 typeSystem->addVarForType(*it, type);
43 processTypeMismatchedGep(*it, type);
51 TypeMismatchedObjToEdgeTy::iterator it = typeMismatchedObjToEdges.find(obj);
52 if (it == typeMismatchedObjToEdges.end())
58 NodeBS &nodesOfType = typeSystem->getVarsForType(ptaTy);
62 if (
const NormalGepCGEdge *normalGepEdge = SVFUtil::dyn_cast<NormalGepCGEdge>(*nit))
64 if (!nodesOfType.test(normalGepEdge->getSrcID()))
69 processed.insert(normalGepEdge);
80 if (!typeSystem->hasTypeSet(ptrid) || !typeSystem->hasTypeSet(objid))
82 const TypeSet *ptrTypeSet = typeSystem->getTypeSet(ptrid);
83 const TypeSet *objTypeSet = typeSystem->getTypeSet(objid);
90 recordTypeMismatchedGep(objid, normalGepEdge);
100 if (pag->hasNonlabeledEdge(pag->getPAGNode(srcId), pag->getPAGNode(dstId),
PAGEdge::NormalGep))
106 if(typeSystem->addTypeForVar(
id, ptaTy))
107 typeSystem->addVarForType(
id, ptaTy);
117 const NodeBS &repNodes = getSCCDetector()->getRepNodes();
118 for (NodeBS::iterator it = repNodes.begin(), eit = repNodes.end(); it != eit; ++it)
120 NodeBS subNodes = getSCCDetector()->subNodes(*it);
121 mergeTypeOfNodes(subNodes);
124 return getSCCDetector()->topoNodeStack();
133 for (NodeBS::iterator it = nodes.begin(), eit = nodes.end(); it != eit; ++it)
135 if (typeSystem->hasTypeSet(*it))
137 const TypeSet *typeSet = typeSystem->getTypeSet(*it);
141 typesInSCC.insert(ptaTy);
147 for (NodeBS::iterator it = nodes.begin(), eit = nodes.end(); it != eit; ++it)
152 if (typeSystem->addTypeForVar(*it, ptaTy))
153 typeSystem->addVarForType(*it, ptaTy);
std::set< Key, Compare, Allocator > OrderedSet
std::stack< NodeID > NodeStack
NodeID getSrcID() const
get methods of the components
bool intersect(const TypeSet *typeset) const
Intersect with another typeset or not.
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
TypeSetTy::const_iterator const_iterator
virtual NodeStack & SCCDetect()
SCC detection.
virtual void addTypeForGepObjNode(NodeID id, const NormalGepCGEdge *normalGepEdge)
add type for newly created GepObjNode
virtual bool processGepPts(const PointsTo &pts, const GepCGEdge *edge)
void updateObjType(const Type *type, const PointsTo &objs)
update type of objects when process "bitcast" CopyCGEdge
llvm::SparseBitVector NodeBS
virtual NodeStack & SCCDetect()
SCC detection.
llvm::ConstantExpr ConstantExpr
virtual void processCast(const ConstraintEdge *edge)
process "bitcast" CopyCGEdge
static AndersenWaveDiffWithType * diffWaveWithType
virtual bool matchType(NodeID ptrid, NodeID objid, const NormalGepCGEdge *normalGepEdge)
match types for Gep Edges
void mergeTypeOfNodes(const NodeBS &nodes)
merge types of nodes in a cycle
void processTypeMismatchedGep(NodeID obj, const Type *type)
process mismatched gep edges