MCELF: Copy the symbol name only if we're going to modify it.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 12 Nov 2010 19:26:04 +0000 (19:26 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 12 Nov 2010 19:26:04 +0000 (19:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118920 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp

index f8caee9882f6b479b70f8d290b61bb2d82407125..10600a5acda7f24998c57a097887b4b0b72e553b 100644 (file)
@@ -1016,21 +1016,20 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm,
     // The @@@ in symbol version is replaced with @ in undefined symbols and
     // @@ in defined ones.
     StringRef Name = Symbol.getName();
+    SmallString<32> Buf;
+
     size_t Pos = Name.find("@@@");
-    std::string FinalName;
     if (Pos != StringRef::npos) {
-      StringRef Prefix = Name.substr(0, Pos);
-      unsigned n = MSD.SectionIndex == ELF::SHN_UNDEF ? 2 : 1;
-      StringRef Suffix = Name.substr(Pos + n);
-      FinalName = Prefix.str() + Suffix.str();
-    } else {
-      FinalName = Name.str();
+      Buf += Name.substr(0, Pos);
+      unsigned Skip = MSD.SectionIndex == ELF::SHN_UNDEF ? 2 : 1;
+      Buf += Name.substr(Pos + Skip);
+      Name = Buf;
     }
 
-    uint64_t &Entry = StringIndexMap[FinalName];
+    uint64_t &Entry = StringIndexMap[Name];
     if (!Entry) {
       Entry = StringTable.size();
-      StringTable += FinalName;
+      StringTable += Name;
       StringTable += '\x00';
     }
     MSD.StringIndex = Entry;