[PATCH] D51149: MC: Don't align COFF section contents.
Peter Collingbourne via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 22 20:23:41 PDT 2018
pcc created this revision.
pcc added reviewers: rnk, majnemer.
Herald added a subscriber: hiraditya.
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.
Repository:
rL LLVM
https://reviews.llvm.org/D51149
Files:
llvm/lib/MC/WinCOFFObjectWriter.cpp
llvm/test/MC/COFF/directive-section-characteristics.ll
Index: llvm/test/MC/COFF/directive-section-characteristics.ll
===================================================================
--- llvm/test/MC/COFF/directive-section-characteristics.ll
+++ llvm/test/MC/COFF/directive-section-characteristics.ll
@@ -13,7 +13,7 @@
; CHECK: Section {
; CHECK: Name: .drectve
-; CHECK: PointerToRawData: 0xB8
+; CHECK: PointerToRawData: 0xB5
; CHECK: Characteristics [
; CHECK: IMAGE_SCN_ALIGN_1BYTES
; CHECK: IMAGE_SCN_LNK_INFO
Index: llvm/lib/MC/WinCOFFObjectWriter.cpp
===================================================================
--- llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -620,14 +620,9 @@
// 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 @@
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;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51149.162127.patch
Type: text/x-patch
Size: 1616 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180823/63e393f6/attachment.bin>
More information about the llvm-commits
mailing list