[llvm] r187352 - MC: Support larger COFF string tables
Rafael EspĂndola
rafael.espindola at gmail.com
Mon Jul 29 05:46:06 PDT 2013
Awesome. Thanks!
On 29 July 2013 08:30, Nico Rieck <nico.rieck at gmail.com> wrote:
> Author: nrieck
> Date: Mon Jul 29 07:30:12 2013
> New Revision: 187352
>
> URL: http://llvm.org/viewvc/llvm-project?rev=187352&view=rev
> Log:
> MC: Support larger COFF string tables
>
> Single-slash encoded entries do not require a terminating null. This bumps
> the maximum table size from ~1MB to ~9.5MB.
>
> Added:
> llvm/trunk/test/MC/COFF/section-name-encoding.s
> Modified:
> llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
>
> Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=187352&r1=187351&r2=187352&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
> +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Mon Jul 29 07:30:12 2013
> @@ -475,18 +475,21 @@ void WinCOFFObjectWriter::DefineSymbol(M
> /// name into the string table if needed
> void WinCOFFObjectWriter::MakeSectionReal(COFFSection &S, size_t Number) {
> if (S.Name.size() > COFF::NameSize) {
> - size_t StringTableEntry = Strings.insert(S.Name.c_str());
> + const unsigned Max6DecimalSize = 999999;
> + const unsigned Max7DecimalSize = 9999999;
> + uint64_t StringTableEntry = Strings.insert(S.Name.c_str());
>
> - // FIXME: Why is this number 999999? This number is never mentioned in the
> - // spec. I'm assuming this is due to the printed value needing to fit into
> - // the S.Header.Name field. In which case why not 9999999 (7 9's instead of
> - // 6)? The spec does not state if this entry should be null terminated in
> - // this case, and thus this seems to be the best way to do it. I think I
> - // just solved my own FIXME...
> - if (StringTableEntry > 999999)
> - report_fatal_error("COFF string table is greater than 999999 bytes.");
> -
> - std::sprintf(S.Header.Name, "/%d", unsigned(StringTableEntry));
> + if (StringTableEntry <= Max6DecimalSize) {
> + std::sprintf(S.Header.Name, "/%d", unsigned(StringTableEntry));
> + } else if (StringTableEntry <= Max7DecimalSize) {
> + // With seven digits, we have to skip the terminating null. Because
> + // sprintf always appends it, we use a larger temporary buffer.
> + char buffer[9] = { };
> + std::sprintf(buffer, "/%d", unsigned(StringTableEntry));
> + std::memcpy(S.Header.Name, buffer, 8);
> + } else {
> + report_fatal_error("COFF string table is greater than 9,999,999 bytes.");
> + }
> } else
> std::memcpy(S.Header.Name, S.Name.c_str(), S.Name.size());
>
>
> Added: llvm/trunk/test/MC/COFF/section-name-encoding.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/section-name-encoding.s?rev=187352&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/COFF/section-name-encoding.s (added)
> +++ llvm/trunk/test/MC/COFF/section-name-encoding.s Mon Jul 29 07:30:12 2013
> @@ -0,0 +1,62 @@
> +// Check that COFF section names are properly encoded.
> +//
> +// Encodings for different lengths:
> +// [0, 8]: raw name
> +// (8, 999999]: base 10 string table index (/9999999)
> +//
> +// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s | FileCheck %s
> +
> +// Raw encoding
> +
> +// CHECK: Section {
> +// CHECK: Number: 1
> +// CHECK: Name: s (73 00 00 00 00 00 00 00)
> +// CHECK: }
> +// CHECK: Section {
> +// CHECK: Number: 2
> +// CHECK: Name: s1234567 (73 31 32 33 34 35 36 37)
> +// CHECK: }
> +.section s; .long 1
> +.section s1234567; .long 1
> +
> +
> +// Base 10 encoding
> +
> +// /4
> +// CHECK: Section {
> +// CHECK: Number: 3
> +// CHECK: Name: s12345678 (2F 34 00 00 00 00 00 00)
> +// CHECK: }
> +.section s12345678; .long 1
> +
> +
> +// Generate padding sections to increase the string table size to at least
> +// 1,000,000 bytes.
> +.macro pad_sections2 pad
> + // 10x \pad
> + .section p0\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad; .long 1
> + .section p1\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad; .long 1
> + .section p2\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad; .long 1
> + .section p3\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad; .long 1
> + .section p4\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad; .long 1
> +.endm
> +
> +.macro pad_sections pad
> + // 20x \pad
> + pad_sections2 \pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad\pad
> +.endm
> +
> +// 1000x 'a'
> +pad_sections aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
> aaaaaaaaa
> aaaaaaaaaaaaaaaa
> +
> +
> +// /1000029 == 4 + 10 + (5 * (2 + (20 * 10 * 1000) + 1))
> +// v | | v ~~~~~~~~~~~~~~ v
> +// table size v v "p0" pad NUL seperator
> +// "s12345678\0" # of pad sections
> +//
> +// CHECK: Section {
> +// CHECK: Number: 9
> +// CHECK: Name: seven_digit (2F 31 30 30 30 30 32 39)
> +// CHECK: }
> +.section seven_digit; .long 1
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list