diff options
Diffstat (limited to 'Analysis/RValues.cpp')
-rw-r--r-- | Analysis/RValues.cpp | 166 |
1 files changed, 3 insertions, 163 deletions
diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp index a9b44eb3d2..c8a4dfa8d9 100644 --- a/Analysis/RValues.cpp +++ b/Analysis/RValues.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/PathSensitive/RValues.h" +#include "llvm/Support/Streams.h" using namespace clang; using llvm::dyn_cast; @@ -20,110 +21,6 @@ using llvm::cast; using llvm::APSInt; //===----------------------------------------------------------------------===// -// SymbolManager. -//===----------------------------------------------------------------------===// - -SymbolID SymbolManager::getSymbol(ParmVarDecl* D) { - SymbolID& X = DataToSymbol[getKey(D)]; - - if (!X.isInitialized()) { - X = SymbolToData.size(); - SymbolToData.push_back(SymbolDataParmVar(D)); - } - - return X; -} - -SymbolID SymbolManager::getContentsOfSymbol(SymbolID sym) { - SymbolID& X = DataToSymbol[getKey(sym)]; - - if (!X.isInitialized()) { - X = SymbolToData.size(); - SymbolToData.push_back(SymbolDataContentsOf(sym)); - } - - return X; -} - -QualType SymbolData::getType() const { - switch (getKind()) { - default: - assert (false && "getType() not implemented for this symbol."); - - case ParmKind: - return cast<SymbolDataParmVar>(this)->getDecl()->getType(); - - } -} - -SymbolManager::SymbolManager() {} -SymbolManager::~SymbolManager() {} - -//===----------------------------------------------------------------------===// -// Values and ValueManager. -//===----------------------------------------------------------------------===// - -ValueManager::~ValueManager() { - // Note that the dstor for the contents of APSIntSet will never be called, - // so we iterate over the set and invoke the dstor for each APSInt. This - // frees an aux. memory allocated to represent very large constants. - for (APSIntSetTy::iterator I=APSIntSet.begin(), E=APSIntSet.end(); I!=E; ++I) - I->getValue().~APSInt(); -} - -const APSInt& ValueManager::getValue(const APSInt& X) { - llvm::FoldingSetNodeID ID; - void* InsertPos; - typedef llvm::FoldingSetNodeWrapper<APSInt> FoldNodeTy; - - X.Profile(ID); - FoldNodeTy* P = APSIntSet.FindNodeOrInsertPos(ID, InsertPos); - - if (!P) { - P = (FoldNodeTy*) BPAlloc.Allocate<FoldNodeTy>(); - new (P) FoldNodeTy(X); - APSIntSet.InsertNode(P, InsertPos); - } - - return *P; -} - -const APSInt& ValueManager::getValue(uint64_t X, unsigned BitWidth, - bool isUnsigned) { - APSInt V(BitWidth, isUnsigned); - V = X; - return getValue(V); -} - -const APSInt& ValueManager::getValue(uint64_t X, QualType T, - SourceLocation Loc) { - - unsigned bits = Ctx.getTypeSize(T, Loc); - APSInt V(bits, T->isUnsignedIntegerType()); - V = X; - return getValue(V); -} - -const SymIntConstraint& -ValueManager::getConstraint(SymbolID sym, BinaryOperator::Opcode Op, - const llvm::APSInt& V) { - - llvm::FoldingSetNodeID ID; - SymIntConstraint::Profile(ID, sym, Op, V); - void* InsertPos; - - SymIntConstraint* C = SymIntCSet.FindNodeOrInsertPos(ID, InsertPos); - - if (!C) { - C = (SymIntConstraint*) BPAlloc.Allocate<SymIntConstraint>(); - new (C) SymIntConstraint(sym, Op, V); - SymIntCSet.InsertNode(C, InsertPos); - } - - return *C; -} - -//===----------------------------------------------------------------------===// // Symbol Iteration. //===----------------------------------------------------------------------===// @@ -154,69 +51,12 @@ RValue::symbol_iterator RValue::symbol_end() const { // Transfer function dispatch for Non-LValues. //===----------------------------------------------------------------------===// -static const -llvm::APSInt& EvaluateAPSInt(ValueManager& ValMgr, BinaryOperator::Opcode Op, - const llvm::APSInt& V1, const llvm::APSInt& V2) { - - switch (Op) { - default: - assert (false && "Invalid Opcode."); - - case BinaryOperator::Mul: - return ValMgr.getValue( V1 * V2 ); - - case BinaryOperator::Div: - return ValMgr.getValue( V1 / V2 ); - - case BinaryOperator::Rem: - return ValMgr.getValue( V1 % V2 ); - - case BinaryOperator::Add: - return ValMgr.getValue( V1 + V2 ); - - case BinaryOperator::Sub: - return ValMgr.getValue( V1 - V2 ); - - case BinaryOperator::Shl: - return ValMgr.getValue( V1.operator<<( (unsigned) V2.getZExtValue() )); - - case BinaryOperator::Shr: - return ValMgr.getValue( V1.operator>>( (unsigned) V2.getZExtValue() )); - - case BinaryOperator::LT: - return ValMgr.getTruthValue( V1 < V2 ); - - case BinaryOperator::GT: - return ValMgr.getTruthValue( V1 > V2 ); - - case BinaryOperator::LE: - return ValMgr.getTruthValue( V1 <= V2 ); - - case BinaryOperator::GE: - return ValMgr.getTruthValue( V1 >= V2 ); - - case BinaryOperator::EQ: - return ValMgr.getTruthValue( V1 == V2 ); - - case BinaryOperator::NE: - return ValMgr.getTruthValue( V1 != V2 ); - - // Note: LAnd, LOr, Comma are handled specially by higher-level logic. - - case BinaryOperator::And: - return ValMgr.getValue( V1 & V2 ); - - case BinaryOperator::Or: - return ValMgr.getValue( V1 | V2 ); - } -} - nonlval::ConcreteInt nonlval::ConcreteInt::EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op, const nonlval::ConcreteInt& RHS) const { - return EvaluateAPSInt(ValMgr, Op, getValue(), RHS.getValue()); + return ValMgr.EvaluateAPSInt(Op, getValue(), RHS.getValue()); } @@ -249,7 +89,7 @@ lval::ConcreteInt::EvalBinaryOp(ValueManager& ValMgr, assert (Op == BinaryOperator::Add || Op == BinaryOperator::Sub || (Op >= BinaryOperator::LT && Op <= BinaryOperator::NE)); - return EvaluateAPSInt(ValMgr, Op, getValue(), RHS.getValue()); + return ValMgr.EvaluateAPSInt(Op, getValue(), RHS.getValue()); } NonLValue LValue::EQ(ValueManager& ValMgr, const LValue& RHS) const { |