Skip to content

Commit 8dcb452

Browse files
committed
[LLD][COFF] Align EC code ranges to page boundaries
We already ensure that code for different architectures is always placed in different pages in assignAddresses. We represent those ranges using their first and last chunks. However, the RVAs of those chunks may not be page-aligned, for example, due to extra padding for entry-thunk offsets. Align the chunk RVAs to the page boundary so that the emitted ranges correctly include the entire region. This change affects an existing test that checks corner cases triggered by merging a data section into a code section. We may now include such data in the code range. This differs from MSVC’s behavior, but it should not cause practical issues, and the new behavior is arguably more correct. Fixes #168119.
1 parent a4e7d15 commit 8dcb452

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

lld/COFF/Chunks.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -946,7 +946,7 @@ void ECCodeMapChunk::writeTo(uint8_t *buf) const {
946946
auto table = reinterpret_cast<chpe_range_entry *>(buf);
947947
for (uint32_t i = 0; i < map.size(); i++) {
948948
const ECCodeMapEntry &entry = map[i];
949-
uint32_t start = entry.first->getRVA();
949+
uint32_t start = entry.first->getRVA() & ~0xfff;
950950
table[i].StartOffset = start | entry.type;
951951
table[i].Length = entry.last->getRVA() + entry.last->getSize() - start;
952952
}

lld/test/COFF/arm64ec-codemap.test

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func-sym2.s -o arm64e
77
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows data-sec.s -o data-sec.obj
88
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows data-sec2.s -o data-sec2.obj
99
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows empty-sec.s -o arm64ec-empty-sec.obj
10+
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows entry-thunk.s -o entry-thunk.obj
1011
RUN: llvm-mc -filetype=obj -triple=x86_64-windows x86_64-func-sym.s -o x86_64-func-sym.obj
1112
RUN: llvm-mc -filetype=obj -triple=x86_64-windows empty-sec.s -o x86_64-empty-sec.obj
1213
RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj
@@ -162,15 +163,17 @@ RUN: loadconfig-arm64ec.obj -dll -noentry -merge:test=.testdata -merge:
162163

163164
RUN: llvm-readobj --coff-load-config testcm.dll | FileCheck -check-prefix=CODEMAPCM %s
164165
CODEMAPCM: CodeMap [
165-
CODEMAPCM-NEXT: 0x4008 - 0x4016 X64
166+
CODEMAPCM-NEXT: 0x4000 - 0x4016 X64
166167
CODEMAPCM-NEXT: ]
167168

168169
RUN: llvm-objdump -d testcm.dll | FileCheck -check-prefix=DISASMCM %s
169170
DISASMCM: Disassembly of section .testdat:
170171
DISASMCM-EMPTY:
171172
DISASMCM-NEXT: 0000000180004000 <.testdat>:
172-
DISASMCM-NEXT: 180004000: 00000001 udf #0x1
173-
DISASMCM-NEXT: 180004004: 00000000 udf #0x0
173+
DISASMCM-NEXT: 180004000: 01 00 addl %eax, (%rax)
174+
DISASMCM-NEXT: 180004002: 00 00 addb %al, (%rax)
175+
DISASMCM-NEXT: 180004004: 00 00 addb %al, (%rax)
176+
DISASMCM-NEXT: 180004006: 00 00 addb %al, (%rax)
174177
DISASMCM-NEXT: 180004008: b8 03 00 00 00 movl $0x3, %eax
175178
DISASMCM-NEXT: 18000400d: c3 retq
176179
DISASMCM-NEXT: 18000400e: 00 00 addb %al, (%rax)
@@ -207,6 +210,14 @@ DISASMMS-NEXT: 0000000180006000 <test2>:
207210
DISASMMS-NEXT: 180006000: 528000a0 mov w0, #0x5 // =5
208211
DISASMMS-NEXT: 180006004: d65f03c0 ret
209212

213+
Test the code map that includes an ARM64EC function padded by its entry-thunk offset.
214+
215+
RUN: lld-link -out:testpad.dll -machine:arm64ec entry-thunk.obj loadconfig-arm64ec.obj -dll -noentry -include:func
216+
RUN: llvm-readobj --coff-load-config testpad.dll | FileCheck -check-prefix=CODEMAPPAD %s
217+
CODEMAPPAD: CodeMap [
218+
CODEMAPPAD: 0x1000 - 0x1010 ARM64EC
219+
CODEMAPPAD-NEXT: ]
220+
210221

211222
#--- arm64-func-sym.s
212223
.text
@@ -266,3 +277,22 @@ x86_64_func_sym2:
266277
.section .empty1, "xr"
267278
.section .empty2, "xr"
268279
.section .empty3, "xr"
280+
281+
#--- entry-thunk.s
282+
.section .text,"xr",discard,func
283+
.globl func
284+
.p2align 2, 0x0
285+
func:
286+
mov w0, #1
287+
ret
288+
289+
.section .wowthk$aa,"xr",discard,thunk
290+
.globl thunk
291+
.p2align 2
292+
thunk:
293+
ret
294+
295+
.section .hybmp$x,"yi"
296+
.symidx func
297+
.symidx thunk
298+
.word 1 // entry thunk

0 commit comments

Comments
 (0)