aboutsummaryrefslogtreecommitdiff
path: root/Analysis/ValueState.h
diff options
context:
space:
mode:
Diffstat (limited to 'Analysis/ValueState.h')
-rw-r--r--Analysis/ValueState.h93
1 files changed, 31 insertions, 62 deletions
diff --git a/Analysis/ValueState.h b/Analysis/ValueState.h
index 1e3730ff4b..3d7a2e6bef 100644
--- a/Analysis/ValueState.h
+++ b/Analysis/ValueState.h
@@ -39,30 +39,25 @@
namespace clang {
-/// ExprBindKey - A variant smart pointer that wraps either a ValueDecl* or a
-/// Stmt*. Use cast<> or dyn_cast<> to get actual pointer type
class ExprBindKey {
uintptr_t Raw;
void operator=(const ExprBindKey& RHS); // Do not implement.
+ inline void* getPtr() const {
+ return reinterpret_cast<void*>(Raw & ~Mask);
+ }
+
public:
- enum Kind { IsSubExpr=0x0, IsBlkExpr=0x1, IsDecl=0x2, // L-Value Bindings.
- IsSymbol=0x3, // Symbol Bindings.
- Mask=0x3 };
+ enum Kind { IsSubExpr=0x0, IsBlkExpr=0x1, Mask=0x1 };
inline Kind getKind() const {
return (Kind) (Raw & Mask);
}
-
- inline void* getPtr() const {
- return reinterpret_cast<void*>(Raw & ~Mask);
- }
-
- ExprBindKey(const ValueDecl* VD)
- : Raw(reinterpret_cast<uintptr_t>(VD) | IsDecl) {
- assert(VD && "ValueDecl cannot be NULL.");
+
+ inline Expr* getExpr() const {
+ return (Expr*) getPtr();
}
-
+
ExprBindKey(Expr* E, bool isBlkExpr = false)
: Raw(reinterpret_cast<uintptr_t>(E) | (isBlkExpr ? IsBlkExpr : IsSubExpr)){
assert(E && "Tracked statement cannot be NULL.");
@@ -71,12 +66,6 @@ public:
bool isSubExpr() const { return getKind() == IsSubExpr; }
bool isBlkExpr() const { return getKind() == IsBlkExpr; }
-
-
-
- bool isDecl() const { return getKind() == IsDecl; }
- bool isStmt() const { return getKind() <= IsBlkExpr; }
-
inline void Profile(llvm::FoldingSetNodeID& ID) const {
ID.AddPointer(getPtr());
}
@@ -101,7 +90,8 @@ public:
namespace vstate {
typedef llvm::ImmutableSet<llvm::APSInt*> IntSetTy;
- typedef llvm::ImmutableMap<ExprBindKey,RValue> VarBindingsTy;
+ typedef llvm::ImmutableMap<ExprBindKey,RValue> ExprBindingsTy;
+ typedef llvm::ImmutableMap<VarDecl*,RValue> VarBindingsTy;
typedef llvm::ImmutableMap<SymbolID,IntSetTy> ConstantNotEqTy;
typedef llvm::ImmutableMap<SymbolID,const llvm::APSInt*> ConstantEqTy;
}
@@ -115,20 +105,23 @@ private:
void operator=(const ValueStateImpl& R) const;
public:
+ vstate::ExprBindingsTy ExprBindings;
vstate::VarBindingsTy VarBindings;
vstate::ConstantNotEqTy ConstantNotEq;
vstate::ConstantEqTy ConstantEq;
/// This ctor is used when creating the first ValueStateImpl object.
- ValueStateImpl(vstate::VarBindingsTy VB,
+ ValueStateImpl(vstate::ExprBindingsTy EB,
+ vstate::VarBindingsTy VB,
vstate::ConstantNotEqTy CNE,
vstate::ConstantEqTy CE)
- : VarBindings(VB), ConstantNotEq(CNE), ConstantEq(CE) {}
+ : ExprBindings(EB), VarBindings(VB), ConstantNotEq(CNE), ConstantEq(CE) {}
/// Copy ctor - We must explicitly define this or else the "Next" ptr
/// in FoldingSetNode will also get copied.
ValueStateImpl(const ValueStateImpl& RHS)
: llvm::FoldingSetNode(),
+ ExprBindings(RHS.ExprBindings),
VarBindings(RHS.VarBindings),
ConstantNotEq(RHS.ConstantNotEq),
ConstantEq(RHS.ConstantEq) {}
@@ -138,6 +131,7 @@ public:
/// Profile - Profile the contents of a ValueStateImpl object for use
/// in a FoldingSet.
static void Profile(llvm::FoldingSetNodeID& ID, const ValueStateImpl& V) {
+ V.ExprBindings.Profile(ID);
V.VarBindings.Profile(ID);
V.ConstantNotEq.Profile(ID);
V.ConstantEq.Profile(ID);
@@ -169,7 +163,8 @@ public:
// Typedefs.
typedef vstate::IntSetTy IntSetTy;
- typedef vstate::VarBindingsTy VarBindingsTy;
+ typedef vstate::ExprBindingsTy ExprBindingsTy;
+ typedef vstate::VarBindingsTy VarBindingsTy;
typedef vstate::ConstantNotEqTy ConstantNotEqTy;
typedef vstate::ConstantEqTy ConstantEqTy;
@@ -183,8 +178,12 @@ public:
// Iterators.
typedef VarBindingsTy::iterator vb_iterator;
- vb_iterator begin() { return Data->VarBindings.begin(); }
- vb_iterator end() { return Data->VarBindings.end(); }
+ vb_iterator vb_begin() { return Data->VarBindings.begin(); }
+ vb_iterator vb_end() { return Data->VarBindings.end(); }
+
+ typedef ExprBindingsTy::iterator eb_iterator;
+ eb_iterator eb_begin() { return Data->ExprBindings.begin(); }
+ eb_iterator eb_end() { return Data->ExprBindings.end(); }
// Profiling and equality testing.
@@ -217,7 +216,8 @@ public:
private:
ValueState::IntSetTy::Factory ISetFactory;
- ValueState::VarBindingsTy::Factory VBFactory;
+ ValueState::ExprBindingsTy::Factory EXFactory;
+ ValueState::VarBindingsTy::Factory VBFactory;
ValueState::ConstantNotEqTy::Factory CNEFactory;
ValueState::ConstantEqTy::Factory CEFactory;
@@ -255,11 +255,12 @@ public:
RValue GetValue(const StateTy& St, const LValue& LV, QualType* T = NULL);
LValue GetLValue(const StateTy& St, Expr* S);
-
-
-
StateTy Add(StateTy St, ExprBindKey K, const RValue& V);
StateTy Remove(StateTy St, ExprBindKey K);
+
+ StateTy Add(StateTy St, VarDecl* D, const RValue& V);
+ StateTy Remove(StateTy St, VarDecl* D);
+
StateTy getPersistentState(const ValueStateImpl& Impl);
StateTy AddEQ(StateTy St, SymbolID sym, const llvm::APSInt& V);
@@ -268,36 +269,4 @@ public:
} // end clang namespace
-//==------------------------------------------------------------------------==//
-// Casting machinery to get cast<> and dyn_cast<> working with ExprBindKey.
-//==------------------------------------------------------------------------==//
-
-namespace llvm {
-
- template<> inline bool
- isa<clang::ValueDecl,clang::ExprBindKey>(const clang::ExprBindKey& V) {
- return V.getKind() == clang::ExprBindKey::IsDecl;
- }
-
- template<> inline bool
- isa<clang::Stmt,clang::ExprBindKey>(const clang::ExprBindKey& V) {
- return ((unsigned) V.getKind()) < clang::ExprBindKey::IsDecl;
- }
-
- template<> struct cast_retty_impl<clang::ValueDecl,clang::ExprBindKey> {
- typedef const clang::ValueDecl* ret_type;
- };
-
- template<> struct cast_retty_impl<clang::Stmt,clang::ExprBindKey> {
- typedef const clang::Stmt* ret_type;
- };
-
- template<> struct simplify_type<clang::ExprBindKey> {
- typedef void* SimpleType;
- static inline SimpleType getSimplifiedValue(const clang::ExprBindKey &V) {
- return V.getPtr();
- }
- };
-} // end llvm namespace
-
#endif