From 7216811ea22d68cbf8df092cda8e64e13e394ac8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 11 Feb 2007 00:37:27 +0000 Subject: [PATCH] add a helper method: Value::takeName git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34171 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Value.h | 4 ++++ lib/VMCore/Value.cpp | 50 ++++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/include/llvm/Value.h b/include/llvm/Value.h index 63af0f747d6..3c072e0d676 100644 --- a/include/llvm/Value.h +++ b/include/llvm/Value.h @@ -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 diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index f84671d4756..af753236c1d 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -92,29 +92,34 @@ unsigned Value::getNumUses() const { return (unsigned)std::distance(use_begin(), use_end()); } +static bool getSymTab(Value *V, ValueSymbolTable *&ST) { + if (Instruction *I = dyn_cast(V)) { + if (BasicBlock *P = I->getParent()) + if (Function *PP = P->getParent()) + ST = &PP->getValueSymbolTable(); + } else if (BasicBlock *BB = dyn_cast(V)) { + if (Function *P = BB->getParent()) + ST = &P->getValueSymbolTable(); + } else if (GlobalValue *GV = dyn_cast(V)) { + if (Module *P = GV->getParent()) + ST = &P->getValueSymbolTable(); + } else if (Argument *A = dyn_cast(V)) { + if (Function *P = A->getParent()) + ST = &P->getValueSymbolTable(); + } else { + assert(isa(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 = 0; - if (Instruction *I = dyn_cast(this)) { - if (BasicBlock *P = I->getParent()) - if (Function *PP = P->getParent()) - ST = &PP->getValueSymbolTable(); - } else if (BasicBlock *BB = dyn_cast(this)) { - if (Function *P = BB->getParent()) - ST = &P->getValueSymbolTable(); - } else if (GlobalValue *GV = dyn_cast(this)) { - if (Module *P = GV->getParent()) - ST = &P->getValueSymbolTable(); - } else if (Argument *A = dyn_cast(this)) { - if (Function *P = A->getParent()) - ST = &P->getValueSymbolTable(); - } else { - assert(isa(this) && "Unknown value type!"); - return; // no name is setable for this. - } + 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