IR: Rewrite uniquing and creation of MDString
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 14 Nov 2014 01:17:09 +0000 (01:17 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 14 Nov 2014 01:17:09 +0000 (01:17 +0000)
Stop using `Value::getName()` to get the string behind an `MDString`.
Switch to `StringMapEntry<MDString>` so that we can find the string by
its coallocation.

This is part of PR21532.

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

include/llvm/IR/Metadata.h
lib/IR/LLVMContextImpl.cpp
lib/IR/LLVMContextImpl.h
lib/IR/Metadata.cpp

index 36b1e063cb9ef820ae31ea9035317832676738b8..6cad37e9c0beb920294bc39444dfaa5df2a7e567 100644 (file)
@@ -57,14 +57,15 @@ public:
 ///
 /// TODO: Inherit from Metadata.
 class MDString : public Value {
+  friend class StringMapEntry<MDString>;
+
   virtual void anchor();
   MDString(const MDString &) LLVM_DELETED_FUNCTION;
 
   explicit MDString(LLVMContext &C);
 
-private:
   /// \brief Shadow Value::getName() to prevent its use.
-  StringRef getName() const { return Value::getName(); }
+  StringRef getName() const LLVM_DELETED_FUNCTION;
 
 public:
   static MDString *get(LLVMContext &Context, StringRef Str);
@@ -72,17 +73,17 @@ public:
     return get(Context, Str ? StringRef(Str) : StringRef());
   }
 
-  StringRef getString() const { return getName(); }
+  StringRef getString() const;
 
-  unsigned getLength() const { return (unsigned)getName().size(); }
+  unsigned getLength() const { return (unsigned)getString().size(); }
 
   typedef StringRef::iterator iterator;
 
   /// \brief Pointer to the first byte of the string.
-  iterator begin() const { return getName().begin(); }
+  iterator begin() const { return getString().begin(); }
 
   /// \brief Pointer to one byte past the end of the string.
-  iterator end() const { return getName().end(); }
+  iterator end() const { return getString().end(); }
 
   /// \brief Methods for support type inquiry through isa, cast, and dyn_cast.
   static bool classof(const Value *V) {
index 09bf6b123a909115c16b15002ec1968cd885b0d8..df3449d12c8bd520f899ad6bdee7f9b82eb766c7 100644 (file)
@@ -135,7 +135,7 @@ LLVMContextImpl::~LLVMContextImpl() {
          "Destroying all MDNodes didn't empty the Context's sets.");
 
   // Destroy MDStrings.
-  DeleteContainerSeconds(MDStringCache);
+  MDStringCache.clear();
 }
 
 // ConstantsContext anchors
index bd0097c31ba9b9a680a5ab5b1277fa71b5dbbc95..3190c22fceb05143b792f23833942f32e389f02f 100644 (file)
@@ -261,7 +261,7 @@ public:
   FoldingSet<AttributeSetImpl> AttrsLists;
   FoldingSet<AttributeSetNode> AttrsSetNodes;
 
-  StringMap<Value*> MDStringCache;
+  StringMap<MDString> MDStringCache;
 
   FoldingSet<MDNode> MDNodeSet;
 
index 8d616cfb0d6541c6b7efa94790e2ca52381963eb..bc9682976b8c044a0784ffa42727234cb49378c5 100644 (file)
@@ -37,13 +37,21 @@ MDString::MDString(LLVMContext &C)
   : Value(Type::getMetadataTy(C), Value::MDStringVal) {}
 
 MDString *MDString::get(LLVMContext &Context, StringRef Str) {
-  LLVMContextImpl *pImpl = Context.pImpl;
-  StringMapEntry<Value*> &Entry =
-    pImpl->MDStringCache.GetOrCreateValue(Str);
-  Value *&S = Entry.getValue();
-  if (!S) S = new MDString(Context);
-  S->setValueName(&Entry);
-  return cast<MDString>(S);
+  auto &Store = Context.pImpl->MDStringCache;
+  auto I = Store.find(Str);
+  if (I != Store.end())
+    return &I->second;
+
+  auto *Entry =
+      StringMapEntry<MDString>::Create(Str, Store.getAllocator(), Context);
+  bool WasInserted = Store.insert(Entry);
+  (void)WasInserted;
+  assert(WasInserted && "Expected entry to be inserted");
+  return &Entry->second;
+}
+
+StringRef MDString::getString() const {
+  return StringMapEntry<MDString>::GetStringMapEntryFromValue(*this).first();
 }
 
 //===----------------------------------------------------------------------===//