Skip to content

Commit dafbc97

Browse files
authored
[LLD][COFF] Append a terminator entry to redirection metadata (#115202)
For MSVC compatibility.
1 parent fef6613 commit dafbc97

10 files changed

+128
-119
lines changed

lld/COFF/Chunks.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,8 @@ void CHPECodeRangesChunk::writeTo(uint8_t *buf) const {
10831083
}
10841084

10851085
size_t CHPERedirectionChunk::getSize() const {
1086-
return exportThunks.size() * sizeof(chpe_redirection_entry);
1086+
// Add an extra +1 for a terminator entry.
1087+
return (exportThunks.size() + 1) * sizeof(chpe_redirection_entry);
10871088
}
10881089

10891090
void CHPERedirectionChunk::writeTo(uint8_t *buf) const {

lld/test/COFF/arm64ec-altnames.s

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ DISASM-NEXT: 180001004: d65f03c0 ret
1717
DISASM-NOT: .thnk
1818

1919
RUN: llvm-readobj --hex-dump=.test out1.dll | FileCheck --check-prefix=TESTSEC %s
20-
TESTSEC: 0x180004000 00100000 00100000
20+
TESTSEC: 0x180005000 00100000 00100000
2121

2222
# Ensure -alternatename can change a demangled function symbol aliasing an anti-dependency symbol.
2323

@@ -32,12 +32,12 @@ DISASM2-NEXT: 180001004: d65f03c0 ret
3232
DISASM2-EMPTY:
3333
DISASM2-NEXT: Disassembly of section .thnk:
3434
DISASM2-EMPTY:
35-
DISASM2-NEXT: 0000000180005000 <.thnk>:
36-
DISASM2-NEXT: 180005000: 52800040 mov w0, #0x2 // =2
37-
DISASM2-NEXT: 180005004: d65f03c0 ret
35+
DISASM2-NEXT: 0000000180006000 <.thnk>:
36+
DISASM2-NEXT: 180006000: 52800040 mov w0, #0x2 // =2
37+
DISASM2-NEXT: 180006004: d65f03c0 ret
3838

3939
RUN: llvm-readobj --hex-dump=.test out2.dll | FileCheck --check-prefix=TESTSEC2 %s
40-
TESTSEC2: 0x180004000 00100000 00500000
40+
TESTSEC2: 0x180005000 00100000 00600000
4141

4242
# Ensure -alternatename cannot modify a demangled function symbol aliasing a defined symbol.
4343

lld/test/COFF/arm64ec-codemap.test

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ RUN: llvm-readobj --coff-load-config test.dll | FileCheck -check-prefix=CODEMAP
2020
CODEMAP: CodeMap [
2121
CODEMAP-NEXT: 0x1000 - 0x1008 ARM64EC
2222
CODEMAP-NEXT: 0x2000 - 0x2006 X64
23-
CODEMAP-NEXT: 0x5000 - 0x5008 ARM64EC
24-
CODEMAP-NEXT: 0x6000 - 0x6006 X64
23+
CODEMAP-NEXT: 0x6000 - 0x6008 ARM64EC
24+
CODEMAP-NEXT: 0x7000 - 0x7006 X64
2525
CODEMAP-NEXT: ]
2626

2727
RUN: llvm-objdump -d test.dll | FileCheck -check-prefix=DISASM %s
@@ -36,12 +36,12 @@ DISASM-NEXT: 180002005: c3 retq
3636
DISASM-EMPTY:
3737
DISASM-NEXT: Disassembly of section test:
3838
DISASM-EMPTY:
39-
DISASM-NEXT: 0000000180005000 <test>:
40-
DISASM-NEXT: 180005000: 528000a0 mov w0, #0x5
41-
DISASM-NEXT: 180005004: d65f03c0 ret
39+
DISASM-NEXT: 0000000180006000 <test>:
40+
DISASM-NEXT: 180006000: 528000a0 mov w0, #0x5
41+
DISASM-NEXT: 180006004: d65f03c0 ret
4242
DISASM-NEXT: ...
43-
DISASM-NEXT: 180006000: b8 06 00 00 00 movl $0x6, %eax
44-
DISASM-NEXT: 180006005: c3 retq
43+
DISASM-NEXT: 180007000: b8 06 00 00 00 movl $0x6, %eax
44+
DISASM-NEXT: 180007005: c3 retq
4545

4646
Order of arguments doesn't matter in this case, chunks are sorted by target type anyway.
4747

@@ -66,8 +66,8 @@ CODEMAPX: CodeMap [
6666
CODEMAPX-NEXT: 0x1000 - 0x1008 ARM64
6767
CODEMAPX-NEXT: 0x2000 - 0x2008 ARM64EC
6868
CODEMAPX-NEXT: 0x3000 - 0x3006 X64
69-
CODEMAPX-NEXT: 0x6000 - 0x6008 ARM64EC
70-
CODEMAPX-NEXT: 0x7000 - 0x7006 X64
69+
CODEMAPX-NEXT: 0x7000 - 0x7008 ARM64EC
70+
CODEMAPX-NEXT: 0x8000 - 0x8006 X64
7171
CODEMAPX-NEXT: ]
7272

7373
RUN: llvm-objdump -d testx.dll | FileCheck -check-prefix=DISASMX %s
@@ -85,12 +85,12 @@ DISASMX-NEXT: 180003005: c3 retq
8585
DISASMX-EMPTY:
8686
DISASMX-NEXT: Disassembly of section test:
8787
DISASMX-EMPTY:
88-
DISASMX-NEXT: 0000000180006000 <test>:
89-
DISASMX-NEXT: 180006000: 528000a0 mov w0, #0x5
90-
DISASMX-NEXT: 180006004: d65f03c0 ret
88+
DISASMX-NEXT: 0000000180007000 <test>:
89+
DISASMX-NEXT: 180007000: 528000a0 mov w0, #0x5
90+
DISASMX-NEXT: 180007004: d65f03c0 ret
9191
DISASMX-NEXT: ...
92-
DISASMX-NEXT: 180007000: b8 06 00 00 00 movl $0x6, %eax
93-
DISASMX-NEXT: 180007005: c3 retq
92+
DISASMX-NEXT: 180008000: b8 06 00 00 00 movl $0x6, %eax
93+
DISASMX-NEXT: 180008005: c3 retq
9494

9595
Test merged sections.
9696

@@ -127,8 +127,8 @@ RUN: llvm-readobj --coff-load-config testdm.dll | FileCheck -check-prefix=CODEMA
127127
CODEMAPDM: CodeMap [
128128
CODEMAPDM-NEXT: 0x2000 - 0x2008 ARM64EC
129129
CODEMAPDM-NEXT: 0x3000 - 0x3006 X64
130-
CODEMAPDM-NEXT: 0x6000 - 0x6008 ARM64EC
131-
CODEMAPDM-NEXT: 0x7000 - 0x7006 X64
130+
CODEMAPDM-NEXT: 0x7000 - 0x7008 ARM64EC
131+
CODEMAPDM-NEXT: 0x8000 - 0x8006 X64
132132
CODEMAPDM-NEXT: ]
133133

134134
RUN: llvm-objdump -d testdm.dll | FileCheck -check-prefix=DISASMDM %s
@@ -147,12 +147,12 @@ DISASMDM-NEXT: 180003005: c3 retq
147147
DISASMDM-EMPTY:
148148
DISASMDM-NEXT: Disassembly of section test:
149149
DISASMDM-EMPTY:
150-
DISASMDM-NEXT: 0000000180005000 <test>:
151-
DISASMDM: 180006000: 528000a0 mov w0, #0x5
152-
DISASMDM-NEXT: 180006004: d65f03c0 ret
150+
DISASMDM-NEXT: 0000000180006000 <test>:
151+
DISASMDM: 180007000: 528000a0 mov w0, #0x5
152+
DISASMDM-NEXT: 180007004: d65f03c0 ret
153153
DISASMDM-NEXT: ...
154-
DISASMDM-NEXT: 180007000: b8 06 00 00 00 movl $0x6, %eax
155-
DISASMDM-NEXT: 180007005: c3 retq
154+
DISASMDM-NEXT: 180008000: b8 06 00 00 00 movl $0x6, %eax
155+
DISASMDM-NEXT: 180008005: c3 retq
156156

157157
Merging a code section into data section produces a valid code map.
158158

@@ -161,20 +161,20 @@ RUN: loadconfig-arm64ec.obj -dll -noentry -merge:test=.testdata -merge:
161161

162162
RUN: llvm-readobj --coff-load-config testcm.dll | FileCheck -check-prefix=CODEMAPCM %s
163163
CODEMAPCM: CodeMap [
164-
CODEMAPCM-NEXT: 0x3008 - 0x3016 X64
164+
CODEMAPCM-NEXT: 0x4008 - 0x4016 X64
165165
CODEMAPCM-NEXT: ]
166166

167167
RUN: llvm-objdump -d testcm.dll | FileCheck -check-prefix=DISASMCM %s
168168
DISASMCM: Disassembly of section .testdat:
169169
DISASMCM-EMPTY:
170-
DISASMCM-NEXT: 0000000180003000 <.testdat>:
171-
DISASMCM-NEXT: 180003000: 00000001 udf #0x1
172-
DISASMCM-NEXT: 180003004: 00000000 udf #0x0
173-
DISASMCM-NEXT: 180003008: b8 03 00 00 00 movl $0x3, %eax
174-
DISASMCM-NEXT: 18000300d: c3 retq
175-
DISASMCM-NEXT: 18000300e: 00 00 addb %al, (%rax)
176-
DISASMCM-NEXT: 180003010: b8 06 00 00 00 movl $0x6, %eax
177-
DISASMCM-NEXT: 180003015: c3
170+
DISASMCM-NEXT: 0000000180004000 <.testdat>:
171+
DISASMCM-NEXT: 180004000: 00000001 udf #0x1
172+
DISASMCM-NEXT: 180004004: 00000000 udf #0x0
173+
DISASMCM-NEXT: 180004008: b8 03 00 00 00 movl $0x3, %eax
174+
DISASMCM-NEXT: 18000400d: c3 retq
175+
DISASMCM-NEXT: 18000400e: 00 00 addb %al, (%rax)
176+
DISASMCM-NEXT: 180004010: b8 06 00 00 00 movl $0x6, %eax
177+
DISASMCM-NEXT: 180004015: c3
178178

179179
Test code map range entry spanning over multiple sections.
180180

@@ -184,7 +184,7 @@ RUN: loadconfig-arm64ec.obj -dll -noentry
184184
RUN: llvm-readobj --coff-load-config testms.dll | FileCheck -check-prefix=CODEMAPMS %s
185185
CODEMAPMS: CodeMap [
186186
CODEMAPMS-NEXT: 0x1000 - 0x1008 ARM64EC
187-
CODEMAPMS-NEXT: 0x4000 - 0x5008 ARM64EC
187+
CODEMAPMS-NEXT: 0x5000 - 0x6008 ARM64EC
188188
CODEMAPMS-NEXT: ]
189189

190190
RUN: llvm-objdump -d testms.dll | FileCheck -check-prefix=DISASMMS %s
@@ -196,15 +196,15 @@ DISASMMS-NEXT: 180001004: d65f03c0 ret
196196
DISASMMS-EMPTY:
197197
DISASMMS-NEXT: Disassembly of section test:
198198
DISASMMS-EMPTY:
199-
DISASMMS-NEXT: 0000000180004000 <test>:
200-
DISASMMS-NEXT: 180004000: 528000a0 mov w0, #0x5 // =5
201-
DISASMMS-NEXT: 180004004: d65f03c0 ret
199+
DISASMMS-NEXT: 0000000180005000 <test>:
200+
DISASMMS-NEXT: 180005000: 528000a0 mov w0, #0x5 // =5
201+
DISASMMS-NEXT: 180005004: d65f03c0 ret
202202
DISASMMS-EMPTY:
203203
DISASMMS-NEXT: Disassembly of section test2:
204204
DISASMMS-EMPTY:
205-
DISASMMS-NEXT: 0000000180005000 <test2>:
206-
DISASMMS-NEXT: 180005000: 528000a0 mov w0, #0x5 // =5
207-
DISASMMS-NEXT: 180005004: d65f03c0 ret
205+
DISASMMS-NEXT: 0000000180006000 <test2>:
206+
DISASMMS-NEXT: 180006000: 528000a0 mov w0, #0x5 // =5
207+
DISASMMS-NEXT: 180006004: d65f03c0 ret
208208

209209

210210
#--- arm64-func-sym.s

lld/test/COFF/arm64ec-delayimport.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ RUN: lld-link -machine:arm64ec -dll -noentry -out:out.dll loadconfig-arm64ec.obj
1212
RUN: helper-mangled.obj test-arm64ec.lib test2-arm64ec.lib -delayload:test.dll -map
1313

1414
RUN: llvm-readobj --hex-dump=.test out.dll | FileCheck --check-prefix=TESTSEC %s
15-
TESTSEC: 0x180008000 00600000 88700000 00200000 10100000
16-
TESTSEC-NEXT: 0x180008010 08600000 90700000 10200000 30100000
17-
TESTSEC-NEXT: 0x180008020 1c100000 3c100000 00300000
15+
TESTSEC: 0x180009000 00600000 88700000 00200000 10100000
16+
TESTSEC-NEXT: 0x180009010 08600000 90700000 10200000 30100000
17+
TESTSEC-NEXT: 0x180009020 1c100000 3c100000 00300000
1818

1919
RUN: llvm-objdump -d out.dll | FileCheck --check-prefix=DISASM %s
2020
DISASM: 0000000180001000 <.text>:

lld/test/COFF/arm64ec-export-thunks.test

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ EXP-CHPE-NEXT: ]
7070
RUN: llvm-readobj --sections exports.dll | FileCheck --check-prefix=A64XRM %s
7171

7272
A64XRM: Name: .a64xrm (2E 61 36 34 78 72 6D 00)
73-
A64XRM-NEXT: VirtualSize: 0x10
73+
A64XRM-NEXT: VirtualSize: 0x18
7474
A64XRM-NEXT: VirtualAddress: 0x6000
7575
A64XRM-NEXT: RawDataSize: 512
7676
A64XRM-NEXT: PointerToRawData:
@@ -83,6 +83,11 @@ A64XRM-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
8383
A64XRM-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
8484
A64XRM-NEXT: ]
8585

86+
RUN: llvm-readobj --hex-dump=.a64xrm exports.dll | FileCheck --check-prefix=A64XRM-DUMP %s
87+
88+
A64XRM-DUMP: 0x180006000 00300000 00100000 10300000 00100000
89+
A64XRM-DUMP-NEXT: 0x180006010 00000000 00000000
90+
8691
RUN: llvm-objdump -s --section=.test exports.dll | FileCheck --check-prefix=EXP-DATA %s
8792
EXP-DATA: 180007000 00300000 10300000
8893

@@ -138,13 +143,13 @@ RUN: lld-link -out:data-func.dll -machine:arm64ec arm64ec-data-sym.obj loadconfi
138143

139144
RUN: llvm-readobj --hex-dump=.test data-func.dll | FileCheck --check-prefix=DATAFUNC-TEST %s
140145
DATAFUNC-TEST: Hex dump of section '.test':
141-
DATAFUNC-TEST-NEXT: 0x180003000 00000000 ....
146+
DATAFUNC-TEST-NEXT: 0x180004000 00000000 ....
142147

143148
RUN: llvm-readobj --coff-exports --hex-dump=.test data-func.dll | FileCheck --check-prefix=DATAFUNC-EXP %s
144149
DATAFUNC-EXP: Export {
145150
DATAFUNC-EXP-NEXT: Ordinal: 1
146151
DATAFUNC-EXP-NEXT: Name: data_sym
147-
DATAFUNC-EXP-NEXT: RVA: 0x3000
152+
DATAFUNC-EXP-NEXT: RVA: 0x4000
148153
DATAFUNC-EXP-NEXT: }
149154

150155

lld/test/COFF/arm64ec-import.test

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,16 @@ DISASM-NEXT: 180002000: ff 25 02 10 00 00 jmpq *0x1002(%rip)
7676

7777
RUN: llvm-readobj --hex-dump=.test out.dll | FileCheck --check-prefix=TESTSEC %s
7878
RUN: llvm-readobj --hex-dump=.test out2.dll | FileCheck --check-prefix=TESTSEC %s
79-
TESTSEC: 0x180007000 08500000 00300000 10500000 20500000
80-
TESTSEC-NEXT: 0x180007010 08300000 00500000 10300000 20300000
81-
TESTSEC-NEXT: 0x180007020 14100000 28100000 00200000 08100000
82-
TESTSEC-NEXT: 0x180007030 3c100000 88420000
79+
TESTSEC: 0x180008000 08500000 00300000 10500000 20500000
80+
TESTSEC-NEXT: 0x180008010 08300000 00500000 10300000 20300000
81+
TESTSEC-NEXT: 0x180008020 14100000 28100000 00200000 08100000
82+
TESTSEC-NEXT: 0x180008030 3c100000 88420000
8383

8484
RUN: llvm-readobj --hex-dump=.test out3.dll | FileCheck -check-prefix=TESTSEC-X64 %s
85-
TESTSEC-X64: 0x180007000 08300000 00300000 10300000 20300000
86-
TESTSEC-X64-NEXT: 0x180007010 08300000 00500000 10300000 20300000
87-
TESTSEC-X64-NEXT: 0x180007020 14100000 28100000 00200000 08100000
88-
TESTSEC-X64-NEXT: 0x180007030 3c100000 88420000
85+
TESTSEC-X64: 0x180008000 08300000 00300000 10300000 20300000
86+
TESTSEC-X64-NEXT: 0x180008010 08300000 00500000 10300000 20300000
87+
TESTSEC-X64-NEXT: 0x180008020 14100000 28100000 00200000 08100000
88+
TESTSEC-X64-NEXT: 0x180008030 3c100000 88420000
8989

9090
RUN: FileCheck --check-prefix=MAP %s < out.map
9191
RUN: FileCheck --check-prefix=MAP %s < out2.map

lld/test/COFF/arm64ec-lib.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ DISASM-NEXT: 180001000: d65f03c0 ret
4141
DISASM-EMPTY:
4242

4343
RUN: llvm-readobj --hex-dump=.test ref-alias-1.dll | FileCheck -check-prefix=TESTSEC %s
44-
TESTSEC: 0x180004000 00100000
44+
TESTSEC: 0x180005000 00100000
4545

4646
The same test, but with a different input order.
4747
RUN: lld-link -machine:arm64ec -dll -noentry -out:ref-alias-2.dll func.lib ref-alias.obj loadconfig-arm64ec.obj

lld/test/COFF/arm64ec-loadcfg.s

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
# LOADCFG-NEXT: ]
3131

3232
# RUN: llvm-readobj --hex-dump=.test %t.dll | FileCheck --check-prefix=TEST %s
33-
# TEST: 0x180003000 00000000 00000000 00000000
33+
# TEST: 0x180004000 00000000 00000000 00000000
34+
35+
# RUN: llvm-readobj --hex-dump=.a64xrm %t.dll | FileCheck --check-prefix=A64XRM %s
36+
# A64XRM: 0x180003000 00000000 00000000 ........
3437

3538
.section .test,"dr"
3639
.rva __arm64x_native_entrypoint

0 commit comments

Comments
 (0)