add a helper method: Value::takeName
authorChris Lattner <sabre@nondot.org>
Sun, 11 Feb 2007 00:37:27 +0000 (00:37 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 11 Feb 2007 00:37:27 +0000 (00:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34171 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 63af0f747d6b64a1a78cf21afa1324394b00e259..3c072e0d6766b274648d855dd4baa8a8f5568b1a 100644 (file)
@@ -88,6 +88,10 @@ public:
   inline const std::string &getName() const { return Name; }
 
   void setName(const std::string &name);
+  
+  /// 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 takeName(Value *V);
 
   /// replaceAllUsesWith - Go through the uses list for this definition and make
   /// each use point to "V" instead of "this".  After this completes, 'this's
index f84671d4756b1d3bb281ef0c5272f2e20c623794..af753236c1d124f6c183939a529a3681b7e3eb68 100644 (file)
@@ -92,29 +92,34 @@ unsigned Value::getNumUses() const {
   return (unsigned)std::distance(use_begin(), use_end());
 }
 
-
-void Value::setName(const std::string &name) {
-  if (Name == name) return;   // Name is already set.
-
-  // Get the symbol table to update for this object.
-  ValueSymbolTable *ST = 0;
-  if (Instruction *I = dyn_cast<Instruction>(this)) {
+static bool getSymTab(Value *V, ValueSymbolTable *&ST) {
+  if (Instruction *I = dyn_cast<Instruction>(V)) {
     if (BasicBlock *P = I->getParent())
       if (Function *PP = P->getParent())
         ST = &PP->getValueSymbolTable();
-  } else if (BasicBlock *BB = dyn_cast<BasicBlock>(this)) {
+  } else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
     if (Function *P = BB->getParent()) 
       ST = &P->getValueSymbolTable();
-  } else if (GlobalValue *GV = dyn_cast<GlobalValue>(this)) {
+  } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
     if (Module *P = GV->getParent()) 
       ST = &P->getValueSymbolTable();
-  } else if (Argument *A = dyn_cast<Argument>(this)) {
+  } else if (Argument *A = dyn_cast<Argument>(V)) {
     if (Function *P = A->getParent()) 
       ST = &P->getValueSymbolTable();
   } else {
-    assert(isa<Constant>(this) && "Unknown value type!");
-    return;  // no name is setable for this.
+    assert(isa<Constant>(V) && "Unknown value type!");
+    return true;  // no name is setable for this.
   }
+  return false;
+}
+
+void Value::setName(const std::string &name) {
+  if (Name == name) return;   // Name is already set.
+
+  // 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.
     Name = name;
@@ -133,6 +138,15 @@ void Value::setName(const std::string &name) {
   }
 }
 
+/// 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) {
+  std::string Name = V->getName();
+  V->setName("");
+  setName(Name);
+}
+
+
 // uncheckedReplaceAllUsesWith - This is exactly the same as replaceAllUsesWith,
 // except that it doesn't have all of the asserts.  The asserts fail because we
 // are half-way done resolving types, which causes some types to exist as two