Switch the empty and tombstone key enumerators to not have explicit
authorChandler Carruth <chandlerc@gmail.com>
Sat, 5 Jan 2013 08:47:26 +0000 (08:47 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sat, 5 Jan 2013 08:47:26 +0000 (08:47 +0000)
values -- that's not required to fix the bug that was cropping up, and
the values selected made the enumeration's underlying type signed and
introduced some warnings. This fixes the -Werror build.

The underlying issue here was that the DenseMapInfo was casting values
completely outside the range of the underlying storage of the
enumeration to the enumeration's type. GCC went and "optimized" that
into infloops and other misbehavior. By providing designated special
values for these keys in the dense map, we ensure they are indeed
representable and that they won't be used for anything else.

It might be better to reuse None for the empty key and have the
tombstone share the value of the sentinel enumerator, but honestly
having 2 extra enumerators seemed not to matter and this seems a bit
simpler. I'll let Bill shuffle this around (or ask me to shuffle it
around) if he prefers it to look a different way.

I also made the switch a bit more clear (and produce a better assert)
that the enumerators are *never* going to show up and are errors if they
do.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171614 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/Attributes.h
lib/IR/Attributes.cpp

index 1932ffd3cb7aa0ed4a6c7cc25bd68135943628ca..1e5b1bb056d5338643b31c107335d1892356a097 100644 (file)
@@ -95,9 +95,8 @@ public:
 
     EndAttrKinds,          ///< Sentinal value useful for loops
 
-    // Values for DenseMapInfo
-    EmptyKey     = 0x7FFFFFFF,
-    TombstoneKey = -0x7FFFFFFF - 1
+    AttrKindEmptyKey,      ///< Empty key value for DenseMapInfo
+    AttrKindTombstoneKey   ///< Tombstone key value for DenseMapInfo
   };
 private:
   AttributeImpl *pImpl;
@@ -169,10 +168,10 @@ public:
 /// AttrBuilder.
 template<> struct DenseMapInfo<Attribute::AttrKind> {
   static inline Attribute::AttrKind getEmptyKey() {
-    return Attribute::EmptyKey;
+    return Attribute::AttrKindEmptyKey;
   }
   static inline Attribute::AttrKind getTombstoneKey() {
-    return Attribute::TombstoneKey;
+    return Attribute::AttrKindTombstoneKey;
   }
   static unsigned getHashValue(const Attribute::AttrKind &Val) {
     return Val * 37U;
index 039e036e894eb6e65dcfccf6dec643794ad7a08f..c0704dc97bccde2254c0db921c7d20d2723755d7 100644 (file)
@@ -425,9 +425,11 @@ uint64_t AttributeImpl::getBitMask() const {
 
 uint64_t AttributeImpl::getAttrMask(Attribute::AttrKind Val) {
   switch (Val) {
-  case Attribute::EndAttrKinds:    break;
-  case Attribute::EmptyKey:        break;
-  case Attribute::TombstoneKey:    break;
+  case Attribute::EndAttrKinds:
+  case Attribute::AttrKindEmptyKey:
+  case Attribute::AttrKindTombstoneKey:
+    llvm_unreachable("Synthetic enumerators which should never get here");
+
   case Attribute::None:            return 0;
   case Attribute::ZExt:            return 1 << 0;
   case Attribute::SExt:            return 1 << 1;