diff options
Diffstat (limited to 'clang/include/clang')
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/SVals.h | 22 | ||||
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/SymbolManager.h | 53 |
2 files changed, 44 insertions, 31 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/SVals.h b/clang/include/clang/Analysis/PathSensitive/SVals.h index a0bc3ed186b..42cd4225d34 100644 --- a/clang/include/clang/Analysis/PathSensitive/SVals.h +++ b/clang/include/clang/Analysis/PathSensitive/SVals.h @@ -66,8 +66,7 @@ public: inline bool operator==(const SVal& R) const { return getRawKind() == R.getRawKind() && Data == R.Data; } - - + inline bool operator!=(const SVal& R) const { return !(*this == R); } @@ -75,7 +74,6 @@ public: /// GetRValueSymbolVal - make a unique symbol for value of R. static SVal GetRValueSymbolVal(SymbolManager& SymMgr, const MemRegion* R); - inline bool isUnknown() const { return getRawKind() == UnknownKind; } @@ -94,6 +92,15 @@ public: bool isZeroConstant() const; + /// getAsLocSymbol - If this SVal is a location (subclasses Loc) and + /// wraps a symbol, return that SymbolRef. Otherwise return a SymbolRef + /// where 'isValid()' returns false. + SymbolRef getAsLocSymbol() const; + + /// getAsSymbol - If this Sval wraps a symbol return that SymbolRef. + /// Otherwise return a SymbolRef where 'isValid()' returns false. + SymbolRef getAsSymbol() const; + void print(std::ostream& OS) const; void print(llvm::raw_ostream& OS) const; void printStdErr() const; @@ -237,8 +244,9 @@ enum Kind { ConcreteIntKind, SymbolValKind, SymIntConstraintValKind, class SymbolVal : public NonLoc { public: - SymbolVal(unsigned SymID) - : NonLoc(SymbolValKind, reinterpret_cast<void*>((uintptr_t) SymID)) {} + SymbolVal(SymbolRef SymID) + : NonLoc(SymbolValKind, + reinterpret_cast<void*>((uintptr_t) SymID.getNumber())) {} SymbolRef getSymbol() const { return (SymbolRef) reinterpret_cast<uintptr_t>(Data); @@ -370,8 +378,8 @@ enum Kind { SymbolValKind, GotoLabelKind, MemRegionKind, FuncValKind, class SymbolVal : public Loc { public: - SymbolVal(unsigned SymID) - : Loc(SymbolValKind, reinterpret_cast<void*>((uintptr_t) SymID)) {} + SymbolVal(SymbolRef SymID) + : Loc(SymbolValKind, reinterpret_cast<void*>((uintptr_t) SymID.getNumber())){} SymbolRef getSymbol() const { return (SymbolRef) reinterpret_cast<uintptr_t>(Data); diff --git a/clang/include/clang/Analysis/PathSensitive/SymbolManager.h b/clang/include/clang/Analysis/PathSensitive/SymbolManager.h index 18c177bdd6e..91d3b348b96 100644 --- a/clang/include/clang/Analysis/PathSensitive/SymbolManager.h +++ b/clang/include/clang/Analysis/PathSensitive/SymbolManager.h @@ -39,40 +39,45 @@ class SymbolRef { public: SymbolRef() : Data(~0U - 2) {} SymbolRef(unsigned x) : Data(x) {} - - bool isInitialized() const { return Data != (unsigned) (~0U - 2); } - operator unsigned() const { return getNumber(); } - unsigned getNumber() const { assert (isInitialized()); return Data; } + + bool isValid() const { return Data != (unsigned) (~0U - 2); } + unsigned getNumber() const { assert (isValid()); return Data; } + bool operator<(const SymbolRef& X) const { return Data < X.Data; } + bool operator>(const SymbolRef& X) const { return Data > X.Data; } bool operator==(const SymbolRef& X) const { return Data == X.Data; } bool operator!=(const SymbolRef& X) const { return Data != X.Data; } - - void print(llvm::raw_ostream& os) const; - + void Profile(llvm::FoldingSetNodeID& ID) const { - assert (isInitialized()); + assert (isValid()); ID.AddInteger(Data); } }; - } // end clang namespace namespace llvm { - template <> struct DenseMapInfo<clang::SymbolRef> { - static inline clang::SymbolRef getEmptyKey() { - return clang::SymbolRef(~0U); - } - static inline clang::SymbolRef getTombstoneKey() { - return clang::SymbolRef(~0U - 1); - } - static unsigned getHashValue(clang::SymbolRef X) { - return X.getNumber(); - } - static bool isEqual(clang::SymbolRef X, clang::SymbolRef Y) { - return X.getNumber() == Y.getNumber(); - } - static bool isPod() { return true; } - }; + llvm::raw_ostream& operator<<(llvm::raw_ostream& Out, clang::SymbolRef Sym); +} +namespace std { + std::ostream& operator<<(std::ostream& Out, clang::SymbolRef Sym); +} + +namespace llvm { +template <> struct DenseMapInfo<clang::SymbolRef> { + static inline clang::SymbolRef getEmptyKey() { + return clang::SymbolRef(~0U); + } + static inline clang::SymbolRef getTombstoneKey() { + return clang::SymbolRef(~0U - 1); + } + static unsigned getHashValue(clang::SymbolRef X) { + return X.getNumber(); + } + static bool isEqual(clang::SymbolRef X, clang::SymbolRef Y) { + return X == Y; + } + static bool isPod() { return true; } +}; } // SymbolData: Used to record meta data about symbols. |