diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-08-04 09:47:02 +0000 | 
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-08-04 09:47:02 +0000 | 
| commit | 3849fcbe0e809e3f060aea7a94083a207061d88c (patch) | |
| tree | 722ffc0f6aef91519d09cadd55c999c1b2c8a234 /llvm/lib | |
| parent | aa63610b098243617fb88e0fa9b89e34cb104915 (diff) | |
| download | bcm5719-llvm-3849fcbe0e809e3f060aea7a94083a207061d88c.tar.gz bcm5719-llvm-3849fcbe0e809e3f060aea7a94083a207061d88c.zip | |
Postpone the deletion of the old name in StructType::setName to allow using a slice of the old name.
Fixes PR13522. Add a rudimentary unit test to exercise the behavior.
llvm-svn: 161296
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/VMCore/Type.cpp | 30 | 
1 files changed, 20 insertions, 10 deletions
| diff --git a/llvm/lib/VMCore/Type.cpp b/llvm/lib/VMCore/Type.cpp index c6f35580e15..5e9a00fc085 100644 --- a/llvm/lib/VMCore/Type.cpp +++ b/llvm/lib/VMCore/Type.cpp @@ -464,19 +464,26 @@ void StructType::setBody(ArrayRef<Type*> Elements, bool isPacked) {  void StructType::setName(StringRef Name) {    if (Name == getName()) return; -  // If this struct already had a name, remove its symbol table entry. -  if (SymbolTableEntry) { -    getContext().pImpl->NamedStructTypes.erase(getName()); -    SymbolTableEntry = 0; -  } -   +  StringMap<StructType *> &SymbolTable = getContext().pImpl->NamedStructTypes; +  typedef StringMap<StructType *>::MapEntryTy EntryTy; + +  // If this struct already had a name, remove its symbol table entry. Don't +  // delete the data yet because it may be part of the new name. +  if (SymbolTableEntry) +    SymbolTable.remove((EntryTy *)SymbolTableEntry); +    // If this is just removing the name, we're done. -  if (Name.empty()) +  if (Name.empty()) { +    if (SymbolTableEntry) { +      // Delete the old string data. +      ((EntryTy *)SymbolTableEntry)->Destroy(SymbolTable.getAllocator()); +      SymbolTableEntry = 0; +    }      return; +  }    // Look up the entry for the name. -  StringMapEntry<StructType*> *Entry = -    &getContext().pImpl->NamedStructTypes.GetOrCreateValue(Name); +  EntryTy *Entry = &getContext().pImpl->NamedStructTypes.GetOrCreateValue(Name);    // While we have a name collision, try a random rename.    if (Entry->getValue()) { @@ -497,7 +504,10 @@ void StructType::setName(StringRef Name) {    // Okay, we found an entry that isn't used.  It's us!    Entry->setValue(this); -     + +  // Delete the old string data. +  if (SymbolTableEntry) +    ((EntryTy *)SymbolTableEntry)->Destroy(SymbolTable.getAllocator());    SymbolTableEntry = Entry;  } | 

