From 9e8eafa0f0ad36c3e4397e97b67b8245b04ba618 Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Wed, 7 Aug 2013 05:51:27 +0000 Subject: [PATCH] YAMLTraits.h: replace DenseMap that used a bad implementation of DenseMapInfo 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 | 3 +++ include/llvm/Support/YAMLTraits.h | 12 ++---------- lib/Object/YAML.cpp | 1 + lib/Support/YAMLTraits.cpp | 4 ++-- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/include/llvm/ADT/DenseMap.h b/include/llvm/ADT/DenseMap.h index d5aa8646b31..71069ff470d 100644 --- a/include/llvm/ADT/DenseMap.h +++ b/include/llvm/ADT/DenseMap.h @@ -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 { diff --git a/include/llvm/Support/YAMLTraits.h b/include/llvm/Support/YAMLTraits.h index 801868ff1f1..0f57f44340c 100644 --- a/include/llvm/Support/YAMLTraits.h +++ b/include/llvm/Support/YAMLTraits.h @@ -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 NameToNode; + typedef llvm::StringMap NameToNode; bool isValidKey(StringRef key); diff --git a/lib/Object/YAML.cpp b/lib/Object/YAML.cpp index 5b665032bb3..21bacb8578f 100644 --- a/lib/Object/YAML.cpp +++ b/lib/Object/YAML.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Object/YAML.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; diff --git a/lib/Support/YAMLTraits.cpp b/lib/Support/YAMLTraits.cpp index 1e42b63e8d5..b0cd4151863 100644 --- a/lib/Support/YAMLTraits.cpp +++ b/lib/Support/YAMLTraits.cpp @@ -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; } } -- 2.34.1