diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-08-23 05:39:36 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-08-23 05:39:36 +0000 |
commit | a67161fffae78b400866860be51e1388139251ba (patch) | |
tree | bafa00d97cd2db251b17beb38aa1e7f2aced7b1a | |
parent | 8505dcf7459ef6fafe1326ecc1fe6b67d4d95739 (diff) | |
download | bcm5719-llvm-a67161fffae78b400866860be51e1388139251ba.tar.gz bcm5719-llvm-a67161fffae78b400866860be51e1388139251ba.zip |
MC: Don't align COFF section contents.
Aligning section contents is not required, but only
recommended, by the specification. Microsoft's documentation says
(https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#section-table-section-headers):
"For object files, the value should be aligned on a 4-byte boundary
for best performance."
However, according to my measurements, aligning section contents has
a neutral to negative effect on performance.
I measured the median run time of 100 links of Chromium's
base_unittests on Linux with lld-link and on Windows with link.exe with
both aligned and unaligned sections. On Linux I didn't see a measurable
performance difference, and on Windows the link was slightly faster
with unaligned sections (presumably because on Windows the bottleneck
is I/O).
Also, the sections created by cl.exe are unaligned, so we should expect
tools to broadly accept unaligned sections.
Differential Revision: https://reviews.llvm.org/D51149
llvm-svn: 340514
-rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 10 | ||||
-rw-r--r-- | llvm/test/MC/COFF/directive-section-characteristics.ll | 2 |
2 files changed, 2 insertions, 10 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index 82c9fe76758..ab6fc2be633 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -620,14 +620,9 @@ void WinCOFFObjectWriter::writeSection(MCAssembler &Asm, // Write the section contents. if (Sec.Header.PointerToRawData != 0) { - assert(W.OS.tell() <= Sec.Header.PointerToRawData && + assert(W.OS.tell() == Sec.Header.PointerToRawData && "Section::PointerToRawData is insane!"); - unsigned PaddingSize = Sec.Header.PointerToRawData - W.OS.tell(); - assert(PaddingSize < 4 && - "Should only need at most three bytes of padding!"); - W.OS.write_zeros(PaddingSize); - uint32_t CRC = writeSectionContents(Asm, Layout, MCSec); // Update the section definition auxiliary symbol to record the CRC. @@ -912,10 +907,7 @@ void WinCOFFObjectWriter::assignFileOffsets(MCAssembler &Asm, Sec->Header.SizeOfRawData = Layout.getSectionAddressSize(&Section); if (IsPhysicalSection(Sec)) { - // Align the section data to a four byte boundary. - Offset = alignTo(Offset, 4); Sec->Header.PointerToRawData = Offset; - Offset += Sec->Header.SizeOfRawData; } diff --git a/llvm/test/MC/COFF/directive-section-characteristics.ll b/llvm/test/MC/COFF/directive-section-characteristics.ll index a44c81d2262..eed2dbf598e 100644 --- a/llvm/test/MC/COFF/directive-section-characteristics.ll +++ b/llvm/test/MC/COFF/directive-section-characteristics.ll @@ -13,7 +13,7 @@ entry: ; CHECK: Section { ; CHECK: Name: .drectve -; CHECK: PointerToRawData: 0xB8 +; CHECK: PointerToRawData: 0xB5 ; CHECK: Characteristics [ ; CHECK: IMAGE_SCN_ALIGN_1BYTES ; CHECK: IMAGE_SCN_LNK_INFO |