summaryrefslogtreecommitdiffstats
path: root/clang/include/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang/include/clang')
-rw-r--r--clang/include/clang/Analysis/PathSensitive/SVals.h22
-rw-r--r--clang/include/clang/Analysis/PathSensitive/SymbolManager.h53
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.
OpenPOWER on IntegriCloud