aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-10-22 18:32:06 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-10-22 18:32:06 +0000
commitfc063e8fec64b72ef06a5e4ec8835745e6548740 (patch)
tree665727f29a1b2bf89db79ade949f210512ed76f0 /llvm/lib/MC/ELFObjectWriter.cpp
parentd276de6db1c231f5338cb05847654fcd21a8317a (diff)
downloadllvm-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.cpp11
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);