IR: Stop relying on GetStringMapEntryFromValue()
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 5 Dec 2014 01:41:34 +0000 (01:41 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 5 Dec 2014 01:41:34 +0000 (01:41 +0000)
It relies on undefined behaviour.

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

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

index a056b0d2973f15ee482abaae88d0118c491eba26..189ea3e73d661b6322ee173c2d649729039d5a99 100644 (file)
@@ -63,8 +63,9 @@ class MDString : public Metadata {
   virtual void anchor();
   MDString(const MDString &) LLVM_DELETED_FUNCTION;
 
+  StringMapEntry<MDString> *Entry;
   explicit MDString(LLVMContext &Context)
-      : Metadata(Context, Value::MDStringVal) {}
+      : Metadata(Context, Value::MDStringVal), Entry(nullptr) {}
 
   /// \brief Shadow Value::getName() to prevent its use.
   StringRef getName() const LLVM_DELETED_FUNCTION;
index 27ba9f7a87ba68f2fb3a0a0430b2c80b49422024..3a7c293bcdd9b3794ea47d697465257f9707d04f 100644 (file)
@@ -48,11 +48,13 @@ MDString *MDString::get(LLVMContext &Context, StringRef Str) {
   bool WasInserted = Store.insert(Entry);
   (void)WasInserted;
   assert(WasInserted && "Expected entry to be inserted");
+  Entry->second.Entry = Entry;
   return &Entry->second;
 }
 
 StringRef MDString::getString() const {
-  return StringMapEntry<MDString>::GetStringMapEntryFromValue(*this).first();
+  assert(Entry && "Expected to find string map entry");
+  return Entry->first();
 }
 
 //===----------------------------------------------------------------------===//