20 #include "llvm/ADT/APSInt.h" 21 #include "llvm/ADT/FoldingSet.h" 22 #include "llvm/ADT/ImmutableList.h" 23 #include "llvm/ADT/STLExtras.h" 28 using namespace clang;
32 llvm::ImmutableList<SVal> L) {
34 ID.AddPointer(L.getInternalPointer());
41 ID.AddPointer(region);
46 llvm::ImmutableList<const CXXBaseSpecifier *> L) {
48 ID.AddPointer(L.getInternalPointer());
59 ID.AddPointer( (
void*) X.second);
73 llvm::FoldingSet<llvm::FoldingSetNodeWrapper<SValData>>;
76 llvm::FoldingSet<llvm::FoldingSetNodeWrapper<SValPair>>;
82 for (
const auto &I : APSIntSet)
83 I.getValue().~APSInt();
90 llvm::FoldingSetNodeID
ID;
93 using FoldNodeTy = llvm::FoldingSetNodeWrapper<llvm::APSInt>;
96 FoldNodeTy*
P = APSIntSet.FindNodeOrInsertPos(ID, InsertPos);
99 P = (FoldNodeTy*) BPAlloc.Allocate<FoldNodeTy>();
100 new (
P) FoldNodeTy(X);
101 APSIntSet.InsertNode(P, InsertPos);
113 const llvm::APSInt& BasicValueFactory::getValue(uint64_t
X,
unsigned BitWidth,
126 llvm::ImmutableList<SVal> Vals) {
127 llvm::FoldingSetNodeID
ID;
131 CompoundValData* D = CompoundValDataSet.FindNodeOrInsertPos(ID, InsertPos);
136 CompoundValDataSet.InsertNode(D, InsertPos);
145 llvm::FoldingSetNodeID
ID;
150 LazyCompoundValDataSet.FindNodeOrInsertPos(ID, InsertPos);
155 LazyCompoundValDataSet.InsertNode(D, InsertPos);
162 const DeclaratorDecl *DD, llvm::ImmutableList<const CXXBaseSpecifier *> L) {
163 llvm::FoldingSetNodeID
ID;
168 PointerToMemberDataSet.FindNodeOrInsertPos(ID, InsertPos);
173 PointerToMemberDataSet.InsertNode(D, InsertPos);
180 llvm::iterator_range<CastExpr::path_const_iterator> PathRange,
184 llvm::ImmutableList<const CXXBaseSpecifier *> PathList;
190 PathList = CXXBaseListFactory.getEmptyList();
199 for (
const auto &I : llvm::reverse(PathRange))
200 PathList = prependCXXBase(I, PathList);
201 return getPointerToMemberData(DD, PathList);
209 llvm_unreachable(
"Invalid Opcode.");
234 if (V2.isSigned() && V2.isNegative())
237 uint64_t Amt = V2.getZExtValue();
239 if (Amt >= V1.getBitWidth())
242 if (!Ctx.getLangOpts().CPlusPlus2a) {
243 if (V1.isSigned() && V1.isNegative())
246 if (V1.isSigned() && Amt > V1.countLeadingZeros())
250 return &
getValue( V1.operator<<( (
unsigned) Amt ));
257 if (V2.isSigned() && V2.isNegative())
260 uint64_t Amt = V2.getZExtValue();
262 if (Amt >= V1.getBitWidth())
265 return &
getValue( V1.operator>>( (
unsigned) Amt ));
269 return &getTruthValue( V1 < V2 );
272 return &getTruthValue( V1 > V2 );
275 return &getTruthValue( V1 <= V2 );
278 return &getTruthValue( V1 >= V2 );
281 return &getTruthValue( V1 == V2 );
284 return &getTruthValue( V1 != V2 );
299 const std::pair<SVal, uintptr_t>&
304 llvm::FoldingSetNodeID
ID;
307 ID.AddPointer((
void*) Data);
311 using FoldNodeTy = llvm::FoldingSetNodeWrapper<SValData>;
313 FoldNodeTy*
P = Map.FindNodeOrInsertPos(ID, InsertPos);
316 P = (FoldNodeTy*) BPAlloc.Allocate<FoldNodeTy>();
317 new (
P) FoldNodeTy(std::make_pair(V, Data));
318 Map.InsertNode(P, InsertPos);
321 return P->getValue();
324 const std::pair<SVal, SVal>&
329 llvm::FoldingSetNodeID
ID;
336 using FoldNodeTy = llvm::FoldingSetNodeWrapper<SValPair>;
338 FoldNodeTy*
P = Map.FindNodeOrInsertPos(ID, InsertPos);
341 P = (FoldNodeTy*) BPAlloc.Allocate<FoldNodeTy>();
342 new (
P) FoldNodeTy(std::make_pair(V1, V2));
343 Map.InsertNode(P, InsertPos);
346 return P->getValue();
350 return &getPersistentSValWithData(X, 0).first;
TypedValueRegion - An abstract class representing regions having a typed value.
A (possibly-)qualified type.
llvm::ImmutableList< const CXXBaseSpecifier * > getCXXBaseList() const
Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion...
const CompoundValData * getCompoundValData(QualType T, llvm::ImmutableList< SVal > Vals)
const std::pair< SVal, SVal > & getPersistentSValPair(const SVal &V1, const SVal &V2)
std::pair< SVal, SVal > SValPair
const PointerToMemberData * accumCXXBase(llvm::iterator_range< CastExpr::path_const_iterator > PathRange, const nonloc::PointerToMember &PTM)
const PTMDataType getPTMData() const
const DeclaratorDecl * getDeclaratorDecl() const
Value representing pointer-to-member.
llvm::FoldingSet< llvm::FoldingSetNodeWrapper< SValData > > PersistentSValsTy
const SVal * getPersistentSVal(SVal X)
Represents a ValueDecl that came out of a declarator.
const PointerToMemberData * getPointerToMemberData(const DeclaratorDecl *DD, llvm::ImmutableList< const CXXBaseSpecifier *> L)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
void Profile(llvm::FoldingSetNodeID &ID) const
static SVal getValue(SVal val, SValBuilder &svalBuilder)
static void Profile(llvm::FoldingSetNodeID &ID, const StoreRef &store, const TypedValueRegion *region)
void Profile(llvm::FoldingSetNodeID &ID) const
SVal - This represents a symbolic expression, which can be either an L-value or an R-value...
const llvm::APSInt * evalAPSInt(BinaryOperator::Opcode Op, const llvm::APSInt &V1, const llvm::APSInt &V2)
Dataflow Directional Tag Classes.
std::pair< SVal, uintptr_t > SValData
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, llvm::ImmutableList< SVal > L)
static void Profile(llvm::FoldingSetNodeID &ID, const DeclaratorDecl *D, llvm::ImmutableList< const CXXBaseSpecifier *> L)
llvm::PointerUnion< const DeclaratorDecl *, const PointerToMemberData * > PTMDataType
static void Profile(const SValPair &X, llvm::FoldingSetNodeID &ID)
const std::pair< SVal, uintptr_t > & getPersistentSValWithData(const SVal &V, uintptr_t Data)
X
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
const LazyCompoundValData * getLazyCompoundValData(const StoreRef &store, const TypedValueRegion *region)
static void Profile(const SValData &X, llvm::FoldingSetNodeID &ID)
llvm::FoldingSet< llvm::FoldingSetNodeWrapper< SValPair > > PersistentSValPairsTy
CompoundValData(QualType t, llvm::ImmutableList< SVal > l)