[cfe-commits] r47123 - in /cfe/trunk: Analysis/GRExprEngine.cpp Analysis/RValues.cpp Analysis/RValues.h Analysis/ValueState.h include/clang/Analysis/PathSensitive/RValues.h
Ted Kremenek
kremenek at apple.com
Thu Feb 14 09:30:51 PST 2008
Author: kremenek
Date: Thu Feb 14 11:30:51 2008
New Revision: 47123
URL: http://llvm.org/viewvc/llvm-project?rev=47123&view=rev
Log:
Moved Rvalues.h from "Analysis/" to "include/clang/Analysis/PathSensitive".
Added:
cfe/trunk/include/clang/Analysis/PathSensitive/RValues.h
- copied unchanged from r47121, cfe/trunk/Analysis/RValues.h
Removed:
cfe/trunk/Analysis/RValues.h
Modified:
cfe/trunk/Analysis/GRExprEngine.cpp
cfe/trunk/Analysis/RValues.cpp
cfe/trunk/Analysis/ValueState.h
Modified: cfe/trunk/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRExprEngine.cpp?rev=47123&r1=47122&r2=47123&view=diff
==============================================================================
--- cfe/trunk/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/Analysis/GRExprEngine.cpp Thu Feb 14 11:30:51 2008
@@ -15,7 +15,6 @@
//
//===----------------------------------------------------------------------===//
-#include "RValues.h"
#include "ValueState.h"
#include "clang/Analysis/PathSensitive/GRCoreEngine.h"
Modified: cfe/trunk/Analysis/RValues.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/RValues.cpp?rev=47123&r1=47122&r2=47123&view=diff
==============================================================================
--- cfe/trunk/Analysis/RValues.cpp (original)
+++ cfe/trunk/Analysis/RValues.cpp Thu Feb 14 11:30:51 2008
@@ -12,7 +12,7 @@
//
//===----------------------------------------------------------------------===//
-#include "RValues.h"
+#include "clang/Analysis/PathSensitive/RValues.h"
using namespace clang;
using llvm::dyn_cast;
Removed: cfe/trunk/Analysis/RValues.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/RValues.h?rev=47122&view=auto
==============================================================================
--- cfe/trunk/Analysis/RValues.h (original)
+++ cfe/trunk/Analysis/RValues.h (removed)
@@ -1,545 +0,0 @@
-//== RValues.h - Abstract RValues for Path-Sens. Value Tracking -*- C++ -*--==//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This files defines RValue, LValue, and NonLValue, classes that represent
-// abstract r-values for use with path-sensitive value tracking.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_ANALYSIS_RVALUE_H
-#define LLVM_CLANG_ANALYSIS_RVALUE_H
-
-// FIXME: reduce the number of includes.
-
-#include "clang/Analysis/PathSensitive/GRCoreEngine.h"
-#include "clang/AST/Expr.h"
-#include "clang/AST/Decl.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/Analysis/Analyses/LiveVariables.h"
-
-#include "llvm/Support/Casting.h"
-#include "llvm/Support/DataTypes.h"
-#include "llvm/ADT/APSInt.h"
-#include "llvm/ADT/FoldingSet.h"
-#include "llvm/ADT/ImmutableMap.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/Support/Allocator.h"
-#include "llvm/Support/Compiler.h"
-#include "llvm/Support/Streams.h"
-
-#include <functional>
-
-//==------------------------------------------------------------------------==//
-// Values and ValueManager.
-//==------------------------------------------------------------------------==//
-
-namespace clang {
-
-class SymbolID {
- unsigned Data;
-public:
- SymbolID() : Data(~0) {}
- SymbolID(unsigned x) : Data(x) {}
-
- bool isInitialized() const { return Data != (unsigned) ~0; }
- operator unsigned() const { assert (isInitialized()); return Data; }
-
- void Profile(llvm::FoldingSetNodeID& ID) const {
- assert (isInitialized());
- ID.AddInteger(Data);
- }
-
- static inline void Profile(llvm::FoldingSetNodeID& ID, SymbolID X) {
- X.Profile(ID);
- }
-};
-
- // SymbolData: Used to record meta data about symbols.
-
-class SymbolData {
-public:
- enum Kind { UninitKind, ParmKind, ContentsOfKind };
-
-private:
- uintptr_t Data;
- Kind K;
-
-protected:
- SymbolData(uintptr_t D, Kind k) : Data(D), K(k) {}
- SymbolData(void* D, Kind k) : Data(reinterpret_cast<uintptr_t>(D)), K(k) {}
-
- void* getPtr() const {
- assert (K != UninitKind);
- return reinterpret_cast<void*>(Data);
- }
-
- uintptr_t getInt() const {
- assert (K != UninitKind);
- return Data;
- }
-
-public:
- SymbolData() : Data(0), K(UninitKind) {}
-
- Kind getKind() const { return K; }
-
- inline bool operator==(const SymbolData& R) const {
- return K == R.K && Data == R.Data;
- }
-
- QualType getType() const;
-
- // Implement isa<T> support.
- static inline bool classof(const SymbolData*) { return true; }
-};
-
-class SymbolDataParmVar : public SymbolData {
-public:
- SymbolDataParmVar(ParmVarDecl* VD) : SymbolData(VD, ParmKind) {}
-
- ParmVarDecl* getDecl() const { return (ParmVarDecl*) getPtr(); }
-
- // Implement isa<T> support.
- static inline bool classof(const SymbolData* D) {
- return D->getKind() == ParmKind;
- }
-};
-
-class SymbolDataContentsOf : public SymbolData {
-public:
- SymbolDataContentsOf(SymbolID ID) : SymbolData(ID, ContentsOfKind) {}
-
- SymbolID getSymbol() const { return (SymbolID) getInt(); }
-
- // Implement isa<T> support.
- static inline bool classof(const SymbolData* D) {
- return D->getKind() == ContentsOfKind;
- }
-};
-
- // Constraints on symbols. Usually wrapped by RValues.
-
-class SymIntConstraint : public llvm::FoldingSetNode {
- SymbolID Symbol;
- BinaryOperator::Opcode Op;
- const llvm::APSInt& Val;
-public:
- SymIntConstraint(SymbolID sym, BinaryOperator::Opcode op,
- const llvm::APSInt& V)
- : Symbol(sym),
- Op(op), Val(V) {}
-
- BinaryOperator::Opcode getOpcode() const { return Op; }
- SymbolID getSymbol() const { return Symbol; }
- const llvm::APSInt& getInt() const { return Val; }
-
- static inline void Profile(llvm::FoldingSetNodeID& ID,
- const SymbolID& Symbol,
- BinaryOperator::Opcode Op,
- const llvm::APSInt& Val) {
- Symbol.Profile(ID);
- ID.AddInteger(Op);
- ID.AddPointer(&Val);
- }
-
- void Profile(llvm::FoldingSetNodeID& ID) {
- Profile(ID, Symbol, Op, Val);
- }
-};
-
-
-class SymbolManager {
- std::vector<SymbolData> SymbolToData;
-
- typedef llvm::DenseMap<void*,SymbolID> MapTy;
- MapTy DataToSymbol;
-
- void* getKey(void* P) const {
- return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(P) | 0x1);
- }
-
- void* getKey(SymbolID sym) const {
- return reinterpret_cast<void*>((uintptr_t) (sym << 1));
- }
-
-public:
- SymbolManager();
- ~SymbolManager();
-
- SymbolID getSymbol(ParmVarDecl* D);
- SymbolID getContentsOfSymbol(SymbolID sym);
-
- inline const SymbolData& getSymbolData(SymbolID ID) const {
- assert (ID < SymbolToData.size());
- return SymbolToData[ID];
- }
-
- inline QualType getType(SymbolID ID) const {
- return getSymbolData(ID).getType();
- }
-};
-
-
-class ValueManager {
- typedef llvm::FoldingSet<llvm::FoldingSetNodeWrapper<llvm::APSInt> >
- APSIntSetTy;
-
- typedef llvm::FoldingSet<SymIntConstraint>
- SymIntCSetTy;
-
-
- ASTContext& Ctx;
- llvm::BumpPtrAllocator& BPAlloc;
-
- APSIntSetTy APSIntSet;
- SymIntCSetTy SymIntCSet;
-
-public:
- ValueManager(ASTContext& ctx, llvm::BumpPtrAllocator& Alloc)
- : Ctx(ctx), BPAlloc(Alloc) {}
-
- ~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 );
- }
-
- 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,
- const llvm::APSInt& V);
-};
-
-} // end clang namespace
-
-//==------------------------------------------------------------------------==//
-// Base RValue types.
-//==------------------------------------------------------------------------==//
-
-namespace clang {
-
-class RValue {
-public:
- enum BaseKind { LValueKind=0x0,
- NonLValueKind=0x1,
- UninitializedKind=0x2,
- UnknownKind=0x3 };
-
- enum { BaseBits = 2,
- BaseMask = 0x3 };
-
-private:
- void* Data;
- unsigned Kind;
-
-protected:
- RValue(const void* d, bool isLValue, unsigned ValKind)
- : Data(const_cast<void*>(d)),
- Kind((isLValue ? LValueKind : NonLValueKind) | (ValKind << BaseBits)) {}
-
- explicit RValue(BaseKind k)
- : Data(0), Kind(k) {}
-
- void* getRawPtr() const {
- return reinterpret_cast<void*>(Data);
- }
-
-public:
- ~RValue() {};
-
- /// BufferTy - A temporary buffer to hold a set of RValues.
- typedef llvm::SmallVector<RValue,5> BufferTy;
-
-
- RValue EvalCast(ValueManager& ValMgr, Expr* CastExpr) const;
-
- unsigned getRawKind() const { return Kind; }
- BaseKind getBaseKind() const { return (BaseKind) (Kind & BaseMask); }
- unsigned getSubKind() const { return (Kind & ~BaseMask) >> BaseBits; }
-
- void Profile(llvm::FoldingSetNodeID& ID) const {
- ID.AddInteger((unsigned) getRawKind());
- ID.AddPointer(reinterpret_cast<void*>(Data));
- }
-
- bool operator==(const RValue& RHS) const {
- return getRawKind() == RHS.getRawKind() && Data == RHS.Data;
- }
-
- static RValue GetSymbolValue(SymbolManager& SymMgr, ParmVarDecl *D);
-
-
- inline bool isKnown() const { return getRawKind() != UnknownKind; }
- inline bool isUnknown() const { return getRawKind() == UnknownKind; }
-
- void print(std::ostream& OS) const;
- void print() const;
-
- // Implement isa<T> support.
- static inline bool classof(const RValue*) { return true; }
-};
-
-class UnknownVal : public RValue {
-public:
- UnknownVal() : RValue(UnknownKind) {}
-
- static inline bool classof(const RValue* V) {
- return V->getBaseKind() == UnknownKind;
- }
-};
-
-class UninitializedVal : public RValue {
-public:
- UninitializedVal() : RValue(UninitializedKind) {}
-
- static inline bool classof(const RValue* V) {
- return V->getBaseKind() == UninitializedKind;
- }
-};
-
-class NonLValue : public RValue {
-protected:
- NonLValue(unsigned SubKind, const void* d) : RValue(d, false, SubKind) {}
-
-public:
- void print(std::ostream& Out) const;
-
- NonLValue EvalBinaryOp(ValueManager& ValMgr,
- BinaryOperator::Opcode Op,
- 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,
- SourceLocation Loc = SourceLocation());
-
- static NonLValue GetValue(ValueManager& ValMgr, IntegerLiteral* I);
-
- static NonLValue GetIntTruthValue(ValueManager& ValMgr, bool b);
-
- // Implement isa<T> support.
- static inline bool classof(const RValue* V) {
- return V->getBaseKind() >= NonLValueKind;
- }
-};
-
-class LValue : public RValue {
-protected:
- LValue(unsigned SubKind, const void* D) : RValue(const_cast<void*>(D),
- true, SubKind) {}
-
- // 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;
-
- static LValue GetValue(AddrLabelExpr* E);
-
- // Implement isa<T> support.
- static inline bool classof(const RValue* V) {
- return V->getBaseKind() != NonLValueKind;
- }
-};
-
-//==------------------------------------------------------------------------==//
-// Subclasses of NonLValue.
-//==------------------------------------------------------------------------==//
-
-namespace nonlval {
-
- enum Kind { SymbolValKind,
- SymIntConstraintValKind,
- ConcreteIntKind,
- NumKind };
-
- class SymbolVal : public NonLValue {
- public:
- SymbolVal(unsigned SymID)
- : NonLValue(SymbolValKind,
- reinterpret_cast<void*>((uintptr_t) SymID)) {}
-
- SymbolID getSymbol() const {
- return (SymbolID) reinterpret_cast<uintptr_t>(getRawPtr());
- }
-
- static inline bool classof(const RValue* V) {
- return isa<NonLValue>(V) && V->getSubKind() == SymbolValKind;
- }
- };
-
- class SymIntConstraintVal : public NonLValue {
- public:
- SymIntConstraintVal(const SymIntConstraint& C)
- : NonLValue(SymIntConstraintValKind, reinterpret_cast<const void*>(&C)) {}
-
- const SymIntConstraint& getConstraint() const {
- return *reinterpret_cast<SymIntConstraint*>(getRawPtr());
- }
-
- static inline bool classof(const RValue* V) {
- return isa<NonLValue>(V) && V->getSubKind() == SymIntConstraintValKind;
- }
- };
-
- class ConcreteInt : public NonLValue {
- public:
- ConcreteInt(const llvm::APSInt& V) : NonLValue(ConcreteIntKind, &V) {}
-
- const llvm::APSInt& getValue() const {
- return *static_cast<llvm::APSInt*>(getRawPtr());
- }
-
- // Transfer functions for binary/unary operations on ConcreteInts.
- ConcreteInt EvalBinaryOp(ValueManager& ValMgr,
- BinaryOperator::Opcode Op,
- const ConcreteInt& RHS) const;
-
- 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
-
-//==------------------------------------------------------------------------==//
-// Subclasses of LValue.
-//==------------------------------------------------------------------------==//
-
-namespace lval {
-
- enum Kind { SymbolValKind,
- GotoLabelKind,
- DeclValKind,
- ConcreteIntKind,
- NumKind };
-
- class SymbolVal : public LValue {
- public:
- SymbolVal(unsigned SymID)
- : LValue(SymbolValKind, reinterpret_cast<void*>((uintptr_t) SymID)) {}
-
- SymbolID getSymbol() const {
- return (SymbolID) reinterpret_cast<uintptr_t>(getRawPtr());
- }
-
- static inline bool classof(const RValue* V) {
- return isa<LValue>(V) && V->getSubKind() == SymbolValKind;
- }
-
- static inline bool classof(const LValue* V) {
- return V->getSubKind() == SymbolValKind;
- }
- };
-
- class GotoLabel : public LValue {
- public:
- GotoLabel(LabelStmt* Label) : LValue(GotoLabelKind, Label) {}
-
- LabelStmt* getLabel() const {
- return static_cast<LabelStmt*>(getRawPtr());
- }
-
- static inline bool classof(const RValue* V) {
- return isa<LValue>(V) && V->getSubKind() == GotoLabelKind;
- }
-
- static inline bool classof(const LValue* V) {
- return V->getSubKind() == GotoLabelKind;
- }
- };
-
-
- class DeclVal : public LValue {
- public:
- DeclVal(const ValueDecl* vd) : LValue(DeclValKind,vd) {}
-
- ValueDecl* getDecl() const {
- return static_cast<ValueDecl*>(getRawPtr());
- }
-
- inline bool operator==(const DeclVal& R) const {
- return getDecl() == R.getDecl();
- }
-
- inline bool operator!=(const DeclVal& R) const {
- return getDecl() != R.getDecl();
- }
-
- // Implement isa<T> support.
- static inline bool classof(const RValue* V) {
- return isa<LValue>(V) && V->getSubKind() == DeclValKind;
- }
-
- static inline bool classof(const LValue* V) {
- return V->getSubKind() == DeclValKind;
- }
- };
-
- class ConcreteInt : public LValue {
- public:
- ConcreteInt(const llvm::APSInt& V) : LValue(ConcreteIntKind, &V) {}
-
- const llvm::APSInt& getValue() const {
- return *static_cast<llvm::APSInt*>(getRawPtr());
- }
-
-
- // 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
-
-} // end clang namespace
-
-#endif
Modified: cfe/trunk/Analysis/ValueState.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/ValueState.h?rev=47123&r1=47122&r2=47123&view=diff
==============================================================================
--- cfe/trunk/Analysis/ValueState.h (original)
+++ cfe/trunk/Analysis/ValueState.h Thu Feb 14 11:30:51 2008
@@ -16,8 +16,7 @@
// FIXME: Reduce the number of includes.
-#include "RValues.h"
-
+#include "clang/Analysis/PathSensitive/RValues.h"
#include "clang/Analysis/PathSensitive/GRCoreEngine.h"
#include "clang/AST/Expr.h"
#include "clang/AST/Decl.h"
More information about the cfe-commits
mailing list