summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2018-08-23 05:39:36 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2018-08-23 05:39:36 +0000
commita67161fffae78b400866860be51e1388139251ba (patch)
treebafa00d97cd2db251b17beb38aa1e7f2aced7b1a
parent8505dcf7459ef6fafe1326ecc1fe6b67d4d95739 (diff)
downloadbcm5719-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.cpp10
-rw-r--r--llvm/test/MC/COFF/directive-section-characteristics.ll2
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
OpenPOWER on IntegriCloud