33 #ifndef LOCATIONSET_H_ 34 #define LOCATIONSET_H_ 57 fldIdx(idx), byteOffset(byteOff), elemTy(ty), elemNumStridePair(pa)
78 return elemNumStridePair.begin();
82 return elemNumStridePair.end();
114 ElemNumStridePairVec::const_iterator it = vec.begin();
115 ElemNumStridePairVec::const_iterator eit = vec.end();
116 for (; it != eit; ++it)
117 addElemNumStridePair(*it);
125 ElemNumStridePairVec::const_iterator it = vec.begin();
126 ElemNumStridePairVec::const_iterator eit = vec.end();
127 for (; it != eit; ++it)
128 addElemNumStridePair(*it);
141 ElemNumStridePairVec::const_iterator it = getNumStridePair().begin();
142 ElemNumStridePairVec::const_iterator eit = getNumStridePair().end();
143 for (; it != eit; ++it)
163 const ElemNumStridePairVec& pairVec = getNumStridePair();
165 if (pairVec.size() != rhsPairVec.size())
166 return (pairVec.size() < rhsPairVec.size());
169 ElemNumStridePairVec::const_iterator it = pairVec.begin();
170 ElemNumStridePairVec::const_iterator rhsIt = rhsPairVec.begin();
171 for (; it != pairVec.end() && rhsIt != rhsPairVec.end(); ++it, ++rhsIt)
173 if ((*it).first != (*rhsIt).first)
174 return ((*it).first < (*rhsIt).first);
175 else if ((*it).second != (*rhsIt).second)
176 return ((*it).second < (*rhsIt).second);
212 return numStridePair;
216 void addElemNumStridePair(
const NodePair& pair);
221 return (numStridePair.size() == 0);
235 if (lhsLocations.intersects(rhsLocations))
237 if (lhsLocations == rhsLocations)
239 else if (lhsLocations.contains(rhsLocations))
241 else if (rhsLocations.contains(lhsLocations))
258 rawstr <<
"LocationSet\tField_Index: " << getOffset();
259 rawstr <<
"\tOffset: " << getByteOffset()
260 <<
",\tNum-Stride: {";
261 const ElemNumStridePairVec& vec = getNumStridePair();
262 ElemNumStridePairVec::const_iterator it = vec.begin();
263 ElemNumStridePairVec::const_iterator eit = vec.end();
264 for (; it != eit; ++it)
266 rawstr <<
" (" << it->first <<
"," << it->second <<
")";
273 bool increaseIfNotReachUpperBound(std::vector<NodeID>& indices,
const ElemNumStridePairVec& pairVec)
const;
276 PointsTo computeAllLocations()
const;
279 inline unsigned gcd (
unsigned n1,
unsigned n2)
const 281 return (n2 == 0) ? n1 : gcd (n2, n1 % n2);
291 template <>
struct std::hash<
SVF::LocationSet> {
const Type * getFlattenElemTy() const
PointsTo computeAllLocations() const
Compute all possible locations according to offset and number-stride pairs.
bool intersects(const LocationSet &RHS) const
Return TRUE if we share any location in common with RHS.
void setByteOffset(Size_t os)
size_t operator()(const SVF::LocationSet &ls) const
u32_t getFlattenByteOffset() const
Size_t getByteOffset() const
ElemNumStridePairVec::const_iterator elemStridePairBegin() const
provide extra hash function for std::pair handling
FieldInfo::ElemNumStridePairVec ElemNumStridePairVec
u32_t getFlattenFldIdx() const
std::string dump() const
Dump location set.
void setFldIdx(Size_t idx)
bool isConstantOffset() const
Return TRUE if this is a constant location set.
void addElemNumStridePair(const NodePair &pair)
LocationSet(const FieldInfo &fi)
Initialization from FieldInfo.
LocationSet(Size_t o=0)
Constructor.
Size_t byteOffset
offset relative to base
unsigned gcd(unsigned n1, unsigned n2) const
Return greatest common divisor.
llvm::raw_string_ostream raw_string_ostream
Size_t fldIdx
offset relative to base
bool operator==(const LocationSet &rhs) const
FieldInfo(u32_t idx, u32_t byteOff, const Type *ty, ElemNumStridePairVec pa)
static LSRelation checkRelation(const LocationSet &LHS, const LocationSet &RHS)
Check relations of two location sets.
ElemNumStridePairVec elemNumStridePair
Size_t getOffset() const
Get methods.
LocationSet(const LocationSet &ls)
Copy Constructor.
const ElemNumStridePairVec & getElemNumStridePairVect() const
std::vector< NodePair > ElemNumStridePairVec
const ElemNumStridePairVec & getNumStridePair() const
std::pair< NodeID, NodeID > NodePair
ElemNumStridePairVec::const_iterator elemStridePairEnd() const
ElemNumStridePairVec numStridePair
element number and stride pair