aboutsummaryrefslogtreecommitdiff
path: root/Analysis/RValues.h
diff options
context:
space:
mode:
Diffstat (limited to 'Analysis/RValues.h')
-rw-r--r--Analysis/RValues.h154
1 files changed, 50 insertions, 104 deletions
diff --git a/Analysis/RValues.h b/Analysis/RValues.h
index bf3fe0dec9..01df7dcd48 100644
--- a/Analysis/RValues.h
+++ b/Analysis/RValues.h
@@ -150,13 +150,23 @@ public:
~ValueManager();
ASTContext& getContext() const { return Ctx; }
+
const llvm::APSInt& getValue(const llvm::APSInt& X);
const llvm::APSInt& getValue(uint64_t X, unsigned BitWidth, bool isUnsigned);
const llvm::APSInt& getValue(uint64_t X, QualType T,
SourceLocation Loc = SourceLocation());
inline const llvm::APSInt& getZeroWithPtrWidth() {
- return getValue(0, Ctx.getTypeSize(Ctx.VoidPtrTy, SourceLocation()), true);
+ return getValue( 0,
+ Ctx.getTypeSize(Ctx.VoidPtrTy, SourceLocation()),
+ true );
+ }
+
+ inline const llvm::APSInt& getTruthValue(bool b) {
+ return getValue( b ? 1 : 0,
+ Ctx.getTypeSize(Ctx.IntTy, SourceLocation()),
+ false );
+
}
const SymIntConstraint& getConstraint(SymbolID sym, BinaryOperator::Opcode Op,
@@ -228,7 +238,7 @@ public:
typedef llvm::SmallVector<RValue,5> BufferTy;
- RValue Cast(ValueManager& ValMgr, Expr* CastExpr) const;
+ RValue EvalCast(ValueManager& ValMgr, Expr* CastExpr) const;
unsigned getRawKind() const { return Kind; }
BaseKind getBaseKind() const { return (BaseKind) (Kind & BaseMask); }
@@ -245,6 +255,7 @@ public:
static RValue GetSymbolValue(SymbolManager& SymMgr, ParmVarDecl *D);
+
inline bool isValid() const { return getRawKind() != InvalidKind; }
inline bool isInvalid() const { return getRawKind() == InvalidKind; }
@@ -280,21 +291,13 @@ protected:
public:
void print(std::ostream& Out) const;
- RValue Cast(ValueManager& ValMgr, Expr* CastExpr) const;
+ NonLValue EvalBinaryOp(ValueManager& ValMgr,
+ BinaryOperator::Opcode Op,
+ const NonLValue& RHS) const;
- // Arithmetic operators.
- NonLValue Add(ValueManager& ValMgr, const NonLValue& RHS) const;
- NonLValue Sub(ValueManager& ValMgr, const NonLValue& RHS) const;
- NonLValue Mul(ValueManager& ValMgr, const NonLValue& RHS) const;
- NonLValue Div(ValueManager& ValMgr, const NonLValue& RHS) const;
- NonLValue Rem(ValueManager& ValMgr, const NonLValue& RHS) const;
- NonLValue UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const;
- NonLValue BitwiseComplement(ValueManager& ValMgr) const;
-
- // Equality operators.
- NonLValue EQ(ValueManager& ValMgr, const NonLValue& RHS) const;
- NonLValue NE(ValueManager& ValMgr, const NonLValue& RHS) const;
-
+ RValue EvalCast(ValueManager& ValMgr, Expr* CastExpr) const;
+ NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const;
+ NonLValue EvalComplement(ValueManager& ValMgr) const;
// Utility methods to create NonLValues.
static NonLValue GetValue(ValueManager& ValMgr, uint64_t X, QualType T,
@@ -302,10 +305,8 @@ public:
static NonLValue GetValue(ValueManager& ValMgr, IntegerLiteral* I);
- static inline NonLValue GetIntTruthValue(ValueManager& ValMgr, bool X) {
- return GetValue(ValMgr, X ? 1U : 0U, ValMgr.getContext().IntTy);
- }
-
+ static NonLValue GetIntTruthValue(ValueManager& ValMgr, bool b);
+
// Implement isa<T> support.
static inline bool classof(const RValue* V) {
return V->getBaseKind() >= NonLValueKind;
@@ -316,16 +317,19 @@ class LValue : public RValue {
protected:
LValue(unsigned SubKind, const void* D) : RValue(const_cast<void*>(D),
true, SubKind) {}
-
-public:
- void print(std::ostream& Out) const;
-
- RValue Cast(ValueManager& ValMgr, Expr* CastExpr) const;
// Equality operators.
NonLValue EQ(ValueManager& ValMgr, const LValue& RHS) const;
NonLValue NE(ValueManager& ValMgr, const LValue& RHS) const;
+public:
+ void print(std::ostream& Out) const;
+
+ RValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
+ const LValue& RHS) const;
+
+ RValue EvalCast(ValueManager& ValMgr, Expr* CastExpr) const;
+
// Implement isa<T> support.
static inline bool classof(const RValue* V) {
return V->getBaseKind() == LValueKind;
@@ -380,67 +384,22 @@ namespace nonlval {
return *static_cast<llvm::APSInt*>(getRawPtr());
}
- // Arithmetic operators.
-
- ConcreteInt Add(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() + V.getValue());
- }
-
- ConcreteInt Sub(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() - V.getValue());
- }
-
- ConcreteInt Mul(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() * V.getValue());
- }
-
- ConcreteInt Div(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() / V.getValue());
- }
-
- ConcreteInt Rem(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() % V.getValue());
- }
-
- ConcreteInt UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const {
- assert (U->getType() == U->getSubExpr()->getType());
- assert (U->getType()->isIntegerType());
- return ValMgr.getValue(-getValue());
- }
-
- ConcreteInt BitwiseComplement(ValueManager& ValMgr) const {
- return ValMgr.getValue(~getValue());
- }
-
- // Casting.
-
- ConcreteInt Cast(ValueManager& ValMgr, Expr* CastExpr) const {
- assert (CastExpr->getType()->isIntegerType());
-
- llvm::APSInt X(getValue());
- X.extOrTrunc(ValMgr.getContext().getTypeSize(CastExpr->getType(),
- CastExpr->getLocStart()));
- return ValMgr.getValue(X);
- }
-
- // Equality operators.
-
- ConcreteInt EQ(ValueManager& ValMgr, const ConcreteInt& V) const {
- const llvm::APSInt& Val = getValue();
- return ValMgr.getValue(Val == V.getValue() ? 1U : 0U,
- Val.getBitWidth(), Val.isUnsigned());
- }
+ // Transfer functions for binary/unary operations on ConcreteInts.
+ ConcreteInt EvalBinaryOp(ValueManager& ValMgr,
+ BinaryOperator::Opcode Op,
+ const ConcreteInt& RHS) const;
- ConcreteInt NE(ValueManager& ValMgr, const ConcreteInt& V) const {
- const llvm::APSInt& Val = getValue();
- return ValMgr.getValue(Val != V.getValue() ? 1U : 0U,
- Val.getBitWidth(), Val.isUnsigned());
- }
+ ConcreteInt EvalComplement(ValueManager& ValMgr) const;
+ ConcreteInt EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const;
// Implement isa<T> support.
static inline bool classof(const RValue* V) {
return isa<NonLValue>(V) && V->getSubKind() == ConcreteIntKind;
}
+
+ static inline bool classof(const NonLValue* V) {
+ return V->getSubKind() == ConcreteIntKind;
+ }
};
} // end namespace clang::nonlval
@@ -500,34 +459,21 @@ namespace lval {
return *static_cast<llvm::APSInt*>(getRawPtr());
}
- // Arithmetic operators.
-
- ConcreteInt Add(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() + V.getValue());
- }
-
- ConcreteInt Sub(ValueManager& ValMgr, const ConcreteInt& V) const {
- return ValMgr.getValue(getValue() - V.getValue());
- }
-
- // Equality operators.
-
- ConcreteInt EQ(ValueManager& ValMgr, const ConcreteInt& V) const {
- const llvm::APSInt& Val = getValue();
- return ValMgr.getValue(Val == V.getValue() ? 1U : 0U,
- Val.getBitWidth(), Val.isUnsigned());
- }
-
- ConcreteInt NE(ValueManager& ValMgr, const ConcreteInt& V) const {
- const llvm::APSInt& Val = getValue();
- return ValMgr.getValue(Val != V.getValue() ? 1U : 0U,
- Val.getBitWidth(), Val.isUnsigned());
- }
-
+
+ // Transfer functions for binary/unary operations on ConcreteInts.
+ ConcreteInt EvalBinaryOp(ValueManager& ValMgr,
+ BinaryOperator::Opcode Op,
+ const ConcreteInt& RHS) const;
+
// Implement isa<T> support.
static inline bool classof(const RValue* V) {
+ return isa<LValue>(V) && V->getSubKind() == ConcreteIntKind;
+ }
+
+ static inline bool classof(const LValue* V) {
return V->getSubKind() == ConcreteIntKind;
}
+
};
} // end clang::lval namespace