From 042ad36871d67a2db48bf41a8dbde3a5676fc96f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 12 Feb 2007 18:52:59 +0000 Subject: [PATCH] Add new setName accessor which doesn't require creating a string. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34197 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Value.h | 1 + lib/VMCore/Value.cpp | 48 ++++++++++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/include/llvm/Value.h b/include/llvm/Value.h index fa36706114e..be751d5f632 100644 --- a/include/llvm/Value.h +++ b/include/llvm/Value.h @@ -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). diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index 109994efb71..ee6f94ad386 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -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) {