add new isSingleStringRef()/getSingleStringRef() methods to twine,
authorChris Lattner <sabre@nondot.org>
Wed, 13 Jan 2010 07:12:06 +0000 (07:12 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 13 Jan 2010 07:12:06 +0000 (07:12 +0000)
and use them to avoid a copy of a string in getNameWithPrefix in
the common case.  It seems like Value::setName and other places
should use this as well?

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

include/llvm/ADT/Twine.h
lib/VMCore/Mangler.cpp

index ca0be53d481d4d0be5f3ddd62d9097ebf3382237..29490b95b451bf40e514b769c74f763d931a7d07 100644 (file)
@@ -329,6 +329,22 @@ namespace llvm {
     bool isTriviallyEmpty() const {
       return isNullary();
     }
+    
+    /// isSingleStringRef - Return true if this twine can be dynamically
+    /// accessed as a single StringRef value with getSingleStringRef().
+    bool isSingleStringRef() const {
+      if (getRHSKind() != EmptyKind) return false;
+      
+      switch (getLHSKind()) {
+      case EmptyKind:
+      case CStringKind:
+      case StdStringKind:
+      case StringRefKind:
+        return true;
+      default:
+        return false;
+      }
+    }
 
     /// @}
     /// @name String Operations
@@ -347,6 +363,20 @@ namespace llvm {
     /// SmallVector.
     void toVector(SmallVectorImpl<char> &Out) const;
 
+    /// getSingleStringRef - This returns the twine as a single StringRef.  This
+    /// method is only valid if isSingleStringRef() is true.
+    StringRef getSingleStringRef() const {
+      assert(isSingleStringRef() &&"This cannot be had as a single stringref!");
+      switch (getLHSKind()) {
+      default: assert(0 && "Out of sync with isSingleStringRef");
+      case EmptyKind:      return StringRef();
+      case CStringKind:    return StringRef((const char*)LHS);
+      case StdStringKind:  return StringRef(*(const std::string*)LHS);
+      case StringRefKind:  return *(const StringRef*)LHS;
+      }
+    }
+    
+    
     /// print - Write the concatenated string represented by this twine to the
     /// stream \arg OS.
     void print(raw_ostream &OS) const;
index 87a623a8f9c5a232648d43a7953207e7aa229845..4d8a91cbf3396cdf9ac707cf6ffd7f8da8fdb8bb 100644 (file)
@@ -188,8 +188,13 @@ std::string Mangler::getMangledName(const GlobalValue *GV, const char *Suffix,
 void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
                                 const Twine &GVName, ManglerPrefixTy PrefixTy) {
   SmallString<256> TmpData;
-  GVName.toVector(TmpData);
-  StringRef Name = TmpData.str();
+  StringRef Name;
+  if (GVName.isSingleStringRef())
+    Name = GVName.getSingleStringRef();
+  else {
+    GVName.toVector(TmpData);
+    Name = TmpData.str();
+  }
   assert(!Name.empty() && "getNameWithPrefix requires non-empty name");
   
   // If the global name is not led with \1, add the appropriate prefixes.