[llvm] r226876 - IR: Change GenericDwarfNode::getHeader() to StringRef

Duncan P. N. Exon Smith dexonsmith at apple.com
Thu Jan 22 15:10:56 PST 2015


Author: dexonsmith
Date: Thu Jan 22 17:10:55 2015
New Revision: 226876

URL: http://llvm.org/viewvc/llvm-project?rev=226876&view=rev
Log:
IR: Change GenericDwarfNode::getHeader() to StringRef

Simplify the API to use a `StringRef` directly rather than exposing the
`MDString` bits underneath.

Modified:
    llvm/trunk/include/llvm/IR/Metadata.h
    llvm/trunk/lib/IR/LLVMContextImpl.h
    llvm/trunk/lib/IR/Metadata.cpp
    llvm/trunk/unittests/IR/MetadataTest.cpp

Modified: llvm/trunk/include/llvm/IR/Metadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=226876&r1=226875&r2=226876&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Metadata.h (original)
+++ llvm/trunk/include/llvm/IR/Metadata.h Thu Jan 22 17:10:55 2015
@@ -1073,7 +1073,7 @@ class GenericDebugNode : public DebugNod
   void recalculateHash();
 
   static GenericDebugNode *getImpl(LLVMContext &Context, unsigned Tag,
-                                   MDString *Header,
+                                   StringRef Header,
                                    ArrayRef<Metadata *> DwarfOps,
                                    StorageType Storage,
                                    bool ShouldCreate = true);
@@ -1087,25 +1087,24 @@ class GenericDebugNode : public DebugNod
 public:
   unsigned getHash() const { return SubclassData32; }
 
-  static GenericDebugNode *get(LLVMContext &Context,
-                               unsigned Tag,
-                               MDString *Header,
+  static GenericDebugNode *get(LLVMContext &Context, unsigned Tag,
+                               StringRef Header,
                                ArrayRef<Metadata *> DwarfOps) {
     return getImpl(Context, Tag, Header, DwarfOps, Uniqued);
   }
   static GenericDebugNode *getIfExists(LLVMContext &Context, unsigned Tag,
-                                       MDString *Header,
+                                       StringRef Header,
                                        ArrayRef<Metadata *> DwarfOps) {
     return getImpl(Context, Tag, Header, DwarfOps, Uniqued,
                    /* ShouldCreate */ false);
   }
   static GenericDebugNode *getDistinct(LLVMContext &Context, unsigned Tag,
-                                       MDString *Header,
+                                       StringRef Header,
                                        ArrayRef<Metadata *> DwarfOps) {
     return getImpl(Context, Tag, Header, DwarfOps, Distinct);
   }
   static TempGenericDebugNode getTemporary(LLVMContext &Context, unsigned Tag,
-                                           MDString *Header,
+                                           StringRef Header,
                                            ArrayRef<Metadata *> DwarfOps) {
     return TempGenericDebugNode(
         getImpl(Context, Tag, Header, DwarfOps, Temporary));
@@ -1115,7 +1114,11 @@ public:
   TempGenericDebugNode clone() const { return cloneImpl(); }
 
   unsigned getTag() const { return SubclassData16; }
-  MDString *getHeader() const { return cast_or_null<MDString>(getOperand(0)); }
+  StringRef getHeader() const {
+    if (auto *S = cast_or_null<MDString>(getOperand(0)))
+      return S->getString();
+    return StringRef();
+  }
 
   op_iterator dwarf_op_begin() const { return op_begin() + 1; }
   op_iterator dwarf_op_end() const { return op_end(); }

Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=226876&r1=226875&r2=226876&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/IR/LLVMContextImpl.h Thu Jan 22 17:10:55 2015
@@ -288,8 +288,8 @@ struct MDLocationInfo {
 struct GenericDebugNodeInfo {
   struct KeyTy : MDNodeOpsKey {
     unsigned Tag;
-    MDString *Header;
-    KeyTy(unsigned Tag, MDString *Header, ArrayRef<Metadata *> DwarfOps)
+    StringRef Header;
+    KeyTy(unsigned Tag, StringRef Header, ArrayRef<Metadata *> DwarfOps)
         : MDNodeOpsKey(DwarfOps), Tag(Tag), Header(Header) {}
     KeyTy(GenericDebugNode *N)
         : MDNodeOpsKey(N, 1), Tag(N->getTag()), Header(N->getHeader()) {}

Modified: llvm/trunk/lib/IR/Metadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=226876&r1=226875&r2=226876&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Metadata.cpp (original)
+++ llvm/trunk/lib/IR/Metadata.cpp Thu Jan 22 17:10:55 2015
@@ -760,14 +760,10 @@ MDLocation *MDLocation::getImpl(LLVMCont
 }
 
 GenericDebugNode *GenericDebugNode::getImpl(LLVMContext &Context, unsigned Tag,
-                                            MDString *Header,
+                                            StringRef Header,
                                             ArrayRef<Metadata *> DwarfOps,
                                             StorageType Storage,
                                             bool ShouldCreate) {
-  // Canonicalize empty string to a nullptr.
-  if (Header && Header->getString().empty())
-    Header = nullptr;
-
   unsigned Hash = 0;
   if (Storage == Uniqued) {
     GenericDebugNodeInfo::KeyTy Key(Tag, Header, DwarfOps);
@@ -780,7 +776,9 @@ GenericDebugNode *GenericDebugNode::getI
     assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
   }
 
-  Metadata *PreOps[] = {Header};
+  // Use a nullptr for empty headers.
+  Metadata *PreOps[] = {Header.empty() ? nullptr
+                                       : MDString::get(Context, Header)};
   return storeImpl(new (DwarfOps.size() + 1) GenericDebugNode(
                        Context, Storage, Hash, Tag, PreOps, DwarfOps),
                    Storage, Context.pImpl->GenericDebugNodes);

Modified: llvm/trunk/unittests/IR/MetadataTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=226876&r1=226875&r2=226876&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/MetadataTest.cpp (original)
+++ llvm/trunk/unittests/IR/MetadataTest.cpp Thu Jan 22 17:10:55 2015
@@ -575,14 +575,14 @@ TEST_F(MDLocationTest, getTemporary) {
 typedef MetadataTest GenericDebugNodeTest;
 
 TEST_F(GenericDebugNodeTest, get) {
-  auto *Header = MDString::get(Context, "header");
+  StringRef Header = "header";
   auto *Empty = MDNode::get(Context, None);
   Metadata *Ops1[] = {Empty};
   auto *N = GenericDebugNode::get(Context, 15, Header, Ops1);
   EXPECT_EQ(15u, N->getTag());
   EXPECT_EQ(2u, N->getNumOperands());
   EXPECT_EQ(Header, N->getHeader());
-  EXPECT_EQ(Header, N->getOperand(0));
+  EXPECT_EQ(MDString::get(Context, Header), N->getOperand(0));
   EXPECT_EQ(1u, N->getNumDwarfOperands());
   EXPECT_EQ(Empty, N->getDwarfOperand(0));
   EXPECT_EQ(Empty, N->getOperand(1));
@@ -609,10 +609,9 @@ TEST_F(GenericDebugNodeTest, get) {
 
 TEST_F(GenericDebugNodeTest, getEmptyHeader) {
   // Canonicalize !"" to null.
-  auto *Header = MDString::get(Context, "");
-  EXPECT_NE(nullptr, Header);
-  auto *N = GenericDebugNode::get(Context, 15, Header, None);
-  EXPECT_EQ(nullptr, N->getHeader());
+  auto *N = GenericDebugNode::get(Context, 15, StringRef(), None);
+  EXPECT_EQ(StringRef(), N->getHeader());
+  EXPECT_EQ(nullptr, N->getOperand(0));
 }
 
 typedef MetadataTest MetadataAsValueTest;





More information about the llvm-commits mailing list