Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit292dc2b

Browse files
cjacekTobias Hieta
authored and
Tobias Hieta
committed
[LLD][COFF] Align EC code ranges to page boundaries (#168222)
We already ensure that code for different architectures is always placedin different pages in `assignAddresses`. We represent those ranges usingtheir first and last chunks. However, the RVAs of those chunks may notbe page-aligned, for example, due to extra padding for entry-thunkoffsets. Align the chunk RVAs to the page boundary so that the emittedranges correctly include the entire region.This change affects an existing test that checks corner cases triggeredby merging a data section into a code section. We may now include suchdata in the code range. This differs from MSVC’s behavior, but it shouldnot cause practical issues, and the new behavior is arguably morecorrect.Fixes#168119.(cherry picked from commitaf45b02)
1 parent9ed1927 commit292dc2b

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
@@ -939,7 +939,7 @@ void ECCodeMapChunk::writeTo(uint8_t *buf) const {
939939
auto table =reinterpret_cast<chpe_range_entry *>(buf);
940940
for (uint32_t i =0; i < map.size(); i++) {
941941
const ECCodeMapEntry &entry = map[i];
942-
uint32_t start = entry.first->getRVA();
942+
uint32_t start = entry.first->getRVA() & ~0xfff;
943943
table[i].StartOffset = start | entry.type;
944944
table[i].Length = entry.last->getRVA() + entry.last->getSize() - start;
945945
}

‎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)

[8]ページ先頭

©2009-2025 Movatter.jp