diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-04-06 05:36:52 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-04-06 05:36:52 +0000 |
commit | af4db5fc95f5d846c48e80f4266687a34a2975f4 (patch) | |
tree | 5ca31d55bdf710a7e03aaf4847c76e3be19e7d5b | |
parent | 49460bc49990ddfcf81e6f0670924f896645d9c7 (diff) | |
download | external_llvm-af4db5fc95f5d846c48e80f4266687a34a2975f4.zip external_llvm-af4db5fc95f5d846c48e80f4266687a34a2975f4.tar.gz external_llvm-af4db5fc95f5d846c48e80f4266687a34a2975f4.tar.bz2 |
Support using DebugLoc's in a DenseMap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128988 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Support/DebugLoc.h | 20 | ||||
-rw-r--r-- | lib/VMCore/DebugLoc.cpp | 24 |
2 files changed, 44 insertions, 0 deletions
diff --git a/include/llvm/Support/DebugLoc.h b/include/llvm/Support/DebugLoc.h index ccc3446..764591c 100644 --- a/include/llvm/Support/DebugLoc.h +++ b/include/llvm/Support/DebugLoc.h @@ -15,6 +15,8 @@ #ifndef LLVM_SUPPORT_DEBUGLOC_H #define LLVM_SUPPORT_DEBUGLOC_H +#include "llvm/ADT/DenseMapInfo.h" + namespace llvm { class MDNode; class LLVMContext; @@ -23,6 +25,16 @@ namespace llvm { /// and MachineInstr to compactly encode file/line/scope information for an /// operation. class DebugLoc { + friend struct DenseMapInfo<DebugLoc>; + + /// getTombstoneKey() - A private constructor that returns an unknown that + /// is distinguishable from the usual one. + static DebugLoc getTombstoneKey() { + DebugLoc DL; + DL.LineCol = -1; + return DL; + } + /// LineCol - This 32-bit value encodes the line and column number for the /// location, encoded as 24-bits for line and 8 bits for col. A value of 0 /// for either means unknown. @@ -75,6 +87,14 @@ namespace llvm { } bool operator!=(const DebugLoc &DL) const { return !(*this == DL); } }; + + template <> + struct DenseMapInfo<DebugLoc> { + static DebugLoc getEmptyKey(); + static DebugLoc getTombstoneKey(); + static unsigned getHashValue(const DebugLoc &Key); + static bool isEqual(const DebugLoc &LHS, const DebugLoc &RHS); + }; } // end namespace llvm #endif /* LLVM_DEBUGLOC_H */ diff --git a/lib/VMCore/DebugLoc.cpp b/lib/VMCore/DebugLoc.cpp index f8b45ee..cb077cb 100644 --- a/lib/VMCore/DebugLoc.cpp +++ b/lib/VMCore/DebugLoc.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/DebugLoc.h" +#include "llvm/ADT/DenseMapInfo.h" #include "LLVMContextImpl.h" using namespace llvm; @@ -128,6 +129,29 @@ DebugLoc DebugLoc::getFromDILocation(MDNode *N) { } //===----------------------------------------------------------------------===// +// DenseMap specialization +//===----------------------------------------------------------------------===// + +DebugLoc DenseMapInfo<DebugLoc>::getEmptyKey() { + return DebugLoc(); +} + +DebugLoc DenseMapInfo<DebugLoc>::getTombstoneKey() { + return DebugLoc::getTombstoneKey(); +} + +unsigned DenseMapInfo<DebugLoc>::getHashValue(const DebugLoc &Key) { + FoldingSetNodeID ID; + ID.AddInteger(Key.LineCol); + ID.AddInteger(Key.ScopeIdx); + return ID.ComputeHash(); +} + +bool DenseMapInfo<DebugLoc>::isEqual(const DebugLoc &LHS, const DebugLoc &RHS) { + return LHS == RHS; +} + +//===----------------------------------------------------------------------===// // LLVMContextImpl Implementation //===----------------------------------------------------------------------===// |