Add new setName accessor which doesn't require creating a string.
authorChris Lattner <sabre@nondot.org>
Mon, 12 Feb 2007 18:52:59 +0000 (18:52 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 12 Feb 2007 18:52:59 +0000 (18:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34197 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Value.h
lib/VMCore/Value.cpp

index fa36706114e1905d3932947357fa3d664053a497..be751d5f6323249eb321781eee70c95473009b5f 100644 (file)
@@ -91,6 +91,7 @@ public:
   ValueName *getValueName() const { return Name; }
 
   void setName(const std::string &name);
+  void setName(const char *Name, unsigned NameLen);
   
   /// takeName - transfer the name from V to this value, setting V's name to
   /// empty.  It is an error to call V->takeName(V). 
index 109994efb71a48f48e00ba1d6b7e94b5a90c8fbc..ee6f94ad386aa624bfb2009995ba71386c55667c 100644 (file)
@@ -119,33 +119,40 @@ std::string Value::getName() const {
 }
 
 void Value::setName(const std::string &name) {
-  if (name.empty() && !hasName()) return;
+  setName(&name[0], name.size());
+}
+
+void Value::setName(const char *NameStr, unsigned NameLen) {
+  if (NameLen == 0 && !hasName()) return;
   if (getType() != Type::VoidTy && "Cannot assign a name to void values!");
   
-  
   // Get the symbol table to update for this object.
   ValueSymbolTable *ST;
   if (getSymTab(this, ST))
     return;  // Cannot set a name on this value (e.g. constant).
 
   if (!ST) { // No symbol table to update?  Just do the change.
-    if (name.empty()) {
+    if (NameLen == 0) {
       // Free the name for this value.
       Name->Destroy();
       Name = 0;
-    } else {
-      if (Name) {
-        // Name isn't changing.
-        if (name.size() == Name->getKeyLength() &&
-            !memcmp(Name->getKeyData(), &name[0], name.size()))
-          return;
-        Name->Destroy();
-      }
-      
-      // Create the new name.
-      Name = ValueName::Create(&name[0], &name[name.size()]);
-      Name->setValue(this);
+      return;
     }
+    
+    if (Name) {
+      // Name isn't changing?
+      if (NameLen == Name->getKeyLength() &&
+          !memcmp(Name->getKeyData(), NameStr, NameLen))
+        return;
+      Name->Destroy();
+    }
+    
+    // NOTE: Could optimize for the case the name is shrinking to not deallocate
+    // then reallocated.
+      
+    // Create the new name.
+    Name = ValueName::Create(NameStr, NameStr+NameLen);
+    Name->setValue(this);
     return;
   }
   
@@ -153,8 +160,8 @@ void Value::setName(const std::string &name) {
   // then reallocated.
   if (hasName()) {
     // Name isn't changing?
-    if (name.size() == Name->getKeyLength() &&
-        !memcmp(Name->getKeyData(), &name[0], name.size()))
+    if (NameLen == Name->getKeyLength() &&
+        !memcmp(Name->getKeyData(), NameStr, NameLen))
       return;
 
     // Remove old name.
@@ -162,14 +169,15 @@ void Value::setName(const std::string &name) {
     Name->Destroy();
     Name = 0;
 
-    if (name.empty())
-       return;
+    if (NameLen == 0)
+      return;
   }
 
   // Name is changing to something new.
-  Name = ST->createValueName(&name[0], name.size(), this);
+  Name = ST->createValueName(NameStr, NameLen, this);
 }
 
+
 /// takeName - transfer the name from V to this value, setting V's name to
 /// empty.  It is an error to call V->takeName(V). 
 void Value::takeName(Value *V) {