From: Bill Wendling Date: Sat, 9 Feb 2013 15:42:51 +0000 (+0000) Subject: Add a DenseMapInfo class for the AttributeSet. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=16274258d16342a2f91aaa3690b78ce74e4105f1;p=oota-llvm.git Add a DenseMapInfo class for the AttributeSet. We are going to place the AttributeSet into a DenseMap during assembly writing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174812 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 4aee10fab3d..a5539cc713b 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -183,6 +183,26 @@ public: } }; +//===----------------------------------------------------------------------===// +/// \class +/// \brief Provide DenseMapInfo for Attribute::AttrKinds. This is used by +/// AttrBuilder. +template<> struct DenseMapInfo { + static inline Attribute::AttrKind getEmptyKey() { + return Attribute::AttrKindEmptyKey; + } + static inline Attribute::AttrKind getTombstoneKey() { + return Attribute::AttrKindTombstoneKey; + } + static unsigned getHashValue(const Attribute::AttrKind &Val) { + return Val * 37U; + } + static bool isEqual(const Attribute::AttrKind &LHS, + const Attribute::AttrKind &RHS) { + return LHS == RHS; + } +}; + //===----------------------------------------------------------------------===// /// \class /// \brief This class holds the attributes for a function, its return value, and @@ -200,6 +220,7 @@ public: private: friend class AttrBuilder; friend class AttributeSetImpl; + template friend struct DenseMapInfo; /// \brief The attributes that we are managing. This can be null to represent /// the empty attributes list. @@ -339,22 +360,23 @@ public: //===----------------------------------------------------------------------===// /// \class -/// \brief Provide DenseMapInfo for Attribute::AttrKinds. This is used by -/// AttrBuilder. -template<> struct DenseMapInfo { - static inline Attribute::AttrKind getEmptyKey() { - return Attribute::AttrKindEmptyKey; +/// \brief Provide DenseMapInfo for AttributeSet. +template<> struct DenseMapInfo { + static inline AttributeSet getEmptyKey() { + uintptr_t Val = static_cast(-1); + Val <<= PointerLikeTypeTraits::NumLowBitsAvailable; + return AttributeSet(reinterpret_cast(Val)); } - static inline Attribute::AttrKind getTombstoneKey() { - return Attribute::AttrKindTombstoneKey; - } - static unsigned getHashValue(const Attribute::AttrKind &Val) { - return Val * 37U; + static inline AttributeSet getTombstoneKey() { + uintptr_t Val = static_cast(-2); + Val <<= PointerLikeTypeTraits::NumLowBitsAvailable; + return AttributeSet(reinterpret_cast(Val)); } - static bool isEqual(const Attribute::AttrKind &LHS, - const Attribute::AttrKind &RHS) { - return LHS == RHS; + static unsigned getHashValue(AttributeSet AS) { + return (unsigned((uintptr_t)AS.pImpl) >> 4) ^ + (unsigned((uintptr_t)AS.pImpl) >> 9); } + static bool isEqual(AttributeSet LHS, AttributeSet RHS) { return LHS == RHS; } }; //===----------------------------------------------------------------------===//