[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