diff --git a/llvm/include/llvm/Value.h b/llvm/include/llvm/Value.h index fa36706114e1..be751d5f6323 100644 --- a/llvm/include/llvm/Value.h +++ b/llvm/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/llvm/lib/VMCore/Value.cpp b/llvm/lib/VMCore/Value.cpp index 109994efb71a..ee6f94ad386a 100644 --- a/llvm/lib/VMCore/Value.cpp +++ b/llvm/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) {