[PATCH] D157142: [lld] Align EC code region boundaries.
Jacek Caban via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 4 14:26:43 PDT 2023
jacek created this revision.
jacek added a reviewer: mstorsjo.
Herald added a subscriber: zzheng.
Herald added a project: All.
jacek requested review of this revision.
Boundaries between code chunks of different architecture are always aligned. 0x100 seems to be a constant, this does not seem to be affected by any command line alignment argument.
https://reviews.llvm.org/D157142
Files:
lld/COFF/Writer.cpp
lld/test/COFF/arm64ec-codemap.test
Index: lld/test/COFF/arm64ec-codemap.test
===================================================================
--- lld/test/COFF/arm64ec-codemap.test
+++ lld/test/COFF/arm64ec-codemap.test
@@ -92,7 +92,7 @@
RUN: llvm-readobj --coff-load-config testm.dll | FileCheck -check-prefix=CODEMAPM %s
CODEMAPM: CodeMap [
CODEMAPM-NEXT: 0x1000 - 0x1010 ARM64EC
-CODEMAPM-NEXT: 0x2000 - 0x3004 X64
+CODEMAPM-NEXT: 0x2000 - 0x200E X64
CODEMAPM-NEXT: ]
RUN: llvm-objdump -d testm.dll | FileCheck -check-prefix=DISASMM %s
@@ -106,9 +106,9 @@
DISASMM-NEXT: ...
DISASMM-NEXT: 180002000: b8 03 00 00 00 movl $0x3, %eax
DISASMM-NEXT: 180002005: c3 retq
-DISASMM-NEXT: ...
-DISASMM-NEXT: 180002ffe: 00 00 addb %al, (%rax)
-DISASMM-NEXT: 180003000: b8 06 00 00 00 movl $0x6, %eax
+DISASMM-NEXT: 180002006: 00 00 addb %al, (%rax)
+DISASMM-NEXT: 180002008: b8 06 00 00 00 movl $0x6, %eax
+DISASMM-NEXT: 18000200d: c3 retq
#--- arm64-func-sym.s
.text
@@ -121,7 +121,7 @@
#--- arm64ec-func-sym.s
.text
.globl arm64ec_func_sym
- .p2align 12, 0x0
+ .p2align 2, 0x0
arm64ec_func_sym:
mov w0, #2
ret
@@ -136,14 +136,14 @@
#--- x86_64-func-sym.s
.text
.globl x86_64_func_sym
- .p2align 12, 0x0
+ .p2align 2, 0x0
x86_64_func_sym:
movl $3, %eax
retq
.section test, "xr"
.globl x86_64_func_sym2
- .p2align 12, 0x0
+ .p2align 2, 0x0
x86_64_func_sym2:
movl $6, %eax
retq
@@ -189,7 +189,7 @@
.rva arm64ec_func_sym + 1
.word 16
.rva x86_64_func_sym + 2
- .word 0x1004
+ .word 14
.globl code_map_count
code_map_count = 2
Index: lld/COFF/Writer.cpp
===================================================================
--- lld/COFF/Writer.cpp
+++ lld/COFF/Writer.cpp
@@ -1392,8 +1392,19 @@
// If /FUNCTIONPADMIN is used, functions are padded in order to create a
// hotpatchable image.
uint32_t padding = sec->isCodeSection() ? config->functionPadMin : 0;
+ MachineTypes prevECMachine = IMAGE_FILE_MACHINE_UNKNOWN;
for (Chunk *c : sec->chunks) {
+ if (COFF::isArm64EC(ctx.config.machine) && sec->isCodeSection()) {
+ MachineTypes machine = c->getMachine();
+ if (machine != IMAGE_FILE_MACHINE_UNKNOWN) {
+ // We need additional alignment when crossing EC range baudaries.
+ if (prevECMachine != IMAGE_FILE_MACHINE_UNKNOWN &&
+ machine != prevECMachine)
+ virtualSize = alignTo(virtualSize, 4096);
+ prevECMachine = machine;
+ }
+ }
if (padding && c->isHotPatchable())
virtualSize += padding;
virtualSize = alignTo(virtualSize, c->getAlignment());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D157142.547348.patch
Type: text/x-patch
Size: 2869 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230804/95b61353/attachment.bin>
More information about the llvm-commits
mailing list