[llvm-commits] [llvm] r93301 - in /llvm/trunk: include/llvm/ADT/Twine.h lib/VMCore/Mangler.cpp

Chris Lattner sabre at nondot.org
Tue Jan 12 23:12:07 PST 2010


Author: lattner
Date: Wed Jan 13 01:12:06 2010
New Revision: 93301

URL: http://llvm.org/viewvc/llvm-project?rev=93301&view=rev
Log:
add new isSingleStringRef()/getSingleStringRef() methods to twine, 
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?

Modified:
    llvm/trunk/include/llvm/ADT/Twine.h
    llvm/trunk/lib/VMCore/Mangler.cpp

Modified: llvm/trunk/include/llvm/ADT/Twine.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Twine.h?rev=93301&r1=93300&r2=93301&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/Twine.h (original)
+++ llvm/trunk/include/llvm/ADT/Twine.h Wed Jan 13 01:12:06 2010
@@ -329,6 +329,22 @@
     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 @@
     /// 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;

Modified: llvm/trunk/lib/VMCore/Mangler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Mangler.cpp?rev=93301&r1=93300&r2=93301&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Mangler.cpp (original)
+++ llvm/trunk/lib/VMCore/Mangler.cpp Wed Jan 13 01:12:06 2010
@@ -188,8 +188,13 @@
 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.





More information about the llvm-commits mailing list