diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-10-06 17:05:19 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-10-06 17:05:19 +0000 |
commit | 1b1a399489f7b1d376f0e3073afbd67733d3c759 (patch) | |
tree | e9ee5b2e60fed4c7a2d24327e186656092185b4b /llvm/lib/MC/StringTableBuilder.cpp | |
parent | 116033303b5c48611df5dd2d0a9762804ee6e16f (diff) | |
download | bcm5719-llvm-1b1a399489f7b1d376f0e3073afbd67733d3c759.tar.gz bcm5719-llvm-1b1a399489f7b1d376f0e3073afbd67733d3c759.zip |
MachObjectWriter: optimize the string table for common suffices
This is a follow-up to r207670 (ELF) and r218636 (COFF).
Differential Revision: http://reviews.llvm.org/D5622
llvm-svn: 219126
Diffstat (limited to 'llvm/lib/MC/StringTableBuilder.cpp')
-rw-r--r-- | llvm/lib/MC/StringTableBuilder.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp index 34e7e6fdfbb..9de9363611e 100644 --- a/llvm/lib/MC/StringTableBuilder.cpp +++ b/llvm/lib/MC/StringTableBuilder.cpp @@ -36,12 +36,16 @@ void StringTableBuilder::finalize(Kind kind) { std::sort(Strings.begin(), Strings.end(), compareBySuffix); - if (kind == ELF) { + switch (kind) { + case ELF: + case MachO: // Start the table with a NUL byte. StringTable += '\x00'; - } else if (kind == WinCOFF) { + break; + case WinCOFF: // Make room to write the table size later. StringTable.append(4, '\x00'); + break; } StringRef Previous; @@ -60,11 +64,21 @@ void StringTableBuilder::finalize(Kind kind) { Previous = s; } - if (kind == WinCOFF) { + switch (kind) { + case ELF: + break; + case MachO: + // Pad to multiple of 4. + while (StringTable.size() % 4) + StringTable += '\x00'; + break; + case WinCOFF: + // Write the table size in the first word. assert(StringTable.size() <= std::numeric_limits<uint32_t>::max()); uint32_t size = static_cast<uint32_t>(StringTable.size()); support::endian::write<uint32_t, support::little, support::unaligned>( StringTable.data(), size); + break; } } |