YAMLTraits.h: replace DenseMap that used a bad implementation of DenseMapInfo
authorDmitri Gribenko <gribozavr@gmail.com>
Wed, 7 Aug 2013 05:51:27 +0000 (05:51 +0000)
committerDmitri Gribenko <gribozavr@gmail.com>
Wed, 7 Aug 2013 05:51:27 +0000 (05:51 +0000)
for StringRef with a StringMap

The bug is that the empty key compares equal to the tombstone key.

Also added an assertion to DenseMap to catch similar bugs in future.

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

include/llvm/ADT/DenseMap.h
include/llvm/Support/YAMLTraits.h
lib/Object/YAML.cpp
lib/Support/YAMLTraits.cpp

index d5aa8646b31c7628e5ace51b55dce723244e2a23..71069ff470d89f1b419a283a4de4db76f0f53a5f 100644 (file)
@@ -606,6 +606,9 @@ public:
   }
 
   void init(unsigned InitBuckets) {
+    assert(!KeyInfoT::isEqual(this->getEmptyKey(), this->getTombstoneKey()) &&
+           "Bad implementation of KeyInfoT: empty key and tombstone key "
+           "should be different");
     if (allocateBuckets(InitBuckets)) {
       this->BaseT::initEmpty();
     } else {
index 801868ff1f1f7d4196eea8367f3417fd8340a6d6..0f57f44340c23acd2d0a19cdf24160441f6ff37f 100644 (file)
@@ -14,7 +14,7 @@
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseMapInfo.h"
 #include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/ADT/Twine.h"
@@ -760,15 +760,7 @@ private:
     }
     static inline bool classof(const MapHNode *) { return true; }
 
-    struct StrMappingInfo {
-      static StringRef getEmptyKey() { return StringRef(); }
-      static StringRef getTombstoneKey() { return StringRef(" ", 0); }
-      static unsigned getHashValue(StringRef const val) {
-                                                return llvm::HashString(val); }
-      static bool isEqual(StringRef const lhs,
-                          StringRef const rhs) { return lhs.equals(rhs); }
-    };
-    typedef llvm::DenseMap<StringRef, HNode*, StrMappingInfo> NameToNode;
+    typedef llvm::StringMap<HNode*> NameToNode;
 
     bool isValidKey(StringRef key);
 
index 5b665032bb3449680070e0ac5f6f583255216dea..21bacb8578f6a97c2162bd980bccea30fa0acae7 100644 (file)
@@ -13,6 +13,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Object/YAML.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace llvm;
index 1e42b63e8d540063e43e6c60d751db6dec3e8b29..b0cd415186379840c27b6aad25ee4dce171d1d57 100644 (file)
@@ -127,8 +127,8 @@ void Input::endMapping() {
     return;
   for (MapHNode::NameToNode::iterator i = MN->Mapping.begin(),
        End = MN->Mapping.end(); i != End; ++i) {
-    if (!MN->isValidKey(i->first)) {
-      setError(i->second, Twine("unknown key '") + i->first + "'");
+    if (!MN->isValidKey(i->first())) {
+      setError(i->second, Twine("unknown key '") + i->first() + "'");
       break;
     }
   }