diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-10-02 16:38:05 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-10-02 16:38:05 +0000 |
commit | 4c3fbe33194cd9b1bfff773647ed785b403e1ba5 (patch) | |
tree | 7ccec2cb37215886799003580f4521f5004072b3 | |
parent | 4db10894373ccc5d2d034d281b7c005da10a4ada (diff) |
Added DenseMapInfo traits for ProgramEdges
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42530 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Analysis/PathSensitive/ProgramEdge.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/include/clang/Analysis/PathSensitive/ProgramEdge.h b/include/clang/Analysis/PathSensitive/ProgramEdge.h index bfb7a0ae12..f28053ace7 100644 --- a/include/clang/Analysis/PathSensitive/ProgramEdge.h +++ b/include/clang/Analysis/PathSensitive/ProgramEdge.h @@ -16,6 +16,8 @@ #define LLVM_CLANG_ANALYSIS_PATHSENS_PROGRAM_POINT #include "llvm/Support/DataTypes.h" +#include "llvm/ADT/DenseMap.h" +#include <cassert> namespace clang { @@ -31,8 +33,23 @@ public: unsigned getKind() const { return (unsigned) Src & 0x3; } void* RawSrc() const { return reinterpret_cast<void*>(Src & ~0x3); } void* RawDst() const { return reinterpret_cast<void*>(Dst); } + + bool operator==(const ProgramEdge & RHS) const { + // comparing pointer values canoncalizes "NULL" edges where both pointers + // are NULL without having to worry about edgekind. We can otherwise + // ignore edgekind because no CFGBlock* or Stmt* will have the same value. + return RawSrc() == RHS.RawSrc() && RawDst() == RHS.RawDst(); + } + + unsigned getHashValue() const { + uintptr_t v1 = reinterpret_cast<uintptr_t>(RawSrc()); + uintptr_t v2 = reinterpret_cast<uintptr_t>(RawDst()); + return static_cast<unsigned>( (v1 >> 4) ^ (v1 >> 9) ^ + (v2 >> 5) ^ (v2 >> 10) ); + } protected: + ProgramEdge(const void* src, const void* dst, EdgeKind k) { assert (k >= StmtBlk && k <= BlkBlk); Src = reinterpret_cast<uintptr_t>(const_cast<void*>(src)) | k; @@ -86,4 +103,28 @@ public: }; } // end namespace clang + + +namespace llvm { // Traits specialization for DenseMap + +template <> struct DenseMapInfo<clang::ProgramEdge> { + + static inline clang::ProgramEdge getEmptyKey() { + return clang::BlkBlkEdge(NULL,NULL); + } + + static inline clang::ProgramEdge getTombstoneKey() { + return clang::BlkBlkEdge(reinterpret_cast<clang::CFGBlock*>(-1), + reinterpret_cast<clang::CFGBlock*>(-1)); + } + + static bool isEqual(const clang::ProgramEdge& LHS, + const clang::ProgramEdge& RHS) { + return LHS == RHS; + } + + static bool isPod() { return true; } +}; +} // end namespace llvm + #endif |