diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-22 18:32:06 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-22 18:32:06 +0000 |
commit | fc063e8fec64b72ef06a5e4ec8835745e6548740 (patch) | |
tree | 665727f29a1b2bf89db79ade949f210512ed76f0 /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | d276de6db1c231f5338cb05847654fcd21a8317a (diff) | |
download | llvm-fc063e8fec64b72ef06a5e4ec8835745e6548740.zip llvm-fc063e8fec64b72ef06a5e4ec8835745e6548740.tar.gz llvm-fc063e8fec64b72ef06a5e4ec8835745e6548740.tar.bz2 |
Avoid storing a second copy of each string in StringTableBuilder.
This was only use in the extremely uncommon case of @@@ symbols on ELF.
llvm-svn: 251039
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index f1acc1d..5fdfcf9 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -33,6 +33,7 @@ #include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/StringSaver.h" #include <vector> using namespace llvm; @@ -106,6 +107,8 @@ class ELFObjectWriter : public MCObjectWriter { /// @name Symbol Table Data /// @{ + BumpPtrAllocator Alloc; + StringSaver VersionSymSaver{Alloc}; StringTableBuilder StrTabBuilder; /// @} @@ -847,13 +850,15 @@ void ELFObjectWriter::computeSymbolTable( Buf += Name.substr(0, Pos); unsigned Skip = MSD.SectionIndex == ELF::SHN_UNDEF ? 2 : 1; Buf += Name.substr(Pos + Skip); - Name = Buf; + Name = VersionSymSaver.save(Buf.c_str()); } } // Sections have their own string table - if (Symbol.getType() != ELF::STT_SECTION) - MSD.Name = StrTabBuilder.add(Name); + if (Symbol.getType() != ELF::STT_SECTION) { + MSD.Name = Name; + StrTabBuilder.add(Name); + } if (Local) LocalSymbolData.push_back(MSD); |