Skip to content

Commit ffe49b7

Browse files
authored
[LLD][COFF] Use correct machine types in PDB records on ARM64EC (#115309)
1 parent 546066e commit ffe49b7

File tree

2 files changed

+278
-1
lines changed

2 files changed

+278
-1
lines changed

lld/COFF/PDB.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -1365,6 +1365,10 @@ static codeview::CPUType toCodeViewMachine(COFF::MachineTypes machine) {
13651365
return codeview::CPUType::ARM7;
13661366
case COFF::IMAGE_FILE_MACHINE_ARM64:
13671367
return codeview::CPUType::ARM64;
1368+
case COFF::IMAGE_FILE_MACHINE_ARM64EC:
1369+
return codeview::CPUType::ARM64EC;
1370+
case COFF::IMAGE_FILE_MACHINE_ARM64X:
1371+
return codeview::CPUType::ARM64X;
13681372
case COFF::IMAGE_FILE_MACHINE_ARMNT:
13691373
return codeview::CPUType::ARMNT;
13701374
case COFF::IMAGE_FILE_MACHINE_I386:
@@ -1431,7 +1435,13 @@ void PDBLinker::addCommonLinkerModuleSymbols(
14311435
ObjNameSym ons(SymbolRecordKind::ObjNameSym);
14321436
EnvBlockSym ebs(SymbolRecordKind::EnvBlockSym);
14331437
Compile3Sym cs(SymbolRecordKind::Compile3Sym);
1434-
fillLinkerVerRecord(cs, ctx.config.machine);
1438+
1439+
MachineTypes machine = ctx.config.machine;
1440+
// MSVC uses the ARM64X machine type for ARM64EC targets in the common linker
1441+
// module record.
1442+
if (isArm64EC(machine))
1443+
machine = ARM64X;
1444+
fillLinkerVerRecord(cs, machine);
14351445

14361446
ons.Name = "* Linker *";
14371447
ons.Signature = 0;

lld/test/COFF/arm64ec-pdb.test

+267
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
REQUIRES: aarch64, x86
2+
RUN: split-file %s %t.dir && cd %t.dir
3+
4+
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-arm64ec.s -o test-arm64ec.obj
5+
RUN: llvm-mc -filetype=obj -triple=x86_64-windows test-x86_64.s -o test-x86_64.obj
6+
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
7+
RUN: llvm-lib -out:test.lib -def:test.def -machine:arm64ec
8+
9+
RUN: lld-link -out:out.dll -debug -machine:arm64ec -dll -noentry test-arm64ec.obj test-x86_64.obj loadconfig-arm64ec.obj test.lib
10+
RUN: llvm-pdbutil dump out.pdb -all | FileCheck %s
11+
12+
CHECK: Streams
13+
CHECK-NEXT: ============================================================
14+
CHECK: Stream 10 ( 104 bytes): [Module "Import:test.dll"]
15+
CHECK-NEXT: Blocks: [9]
16+
CHECK-NEXT: Stream 11 ({{[ 0-9]+}} bytes): [Module "* Linker *"]
17+
CHECK-NEXT: Blocks: [10]
18+
19+
CHECK: Module Stats
20+
CHECK-NEXT: ============================================================
21+
CHECK-NEXT: Mod 0000 | `{{.*}}test-arm64ec.obj`:
22+
CHECK-NEXT: Mod 0 (debug info not present): [{{.*}}test-arm64ec.obj]
23+
CHECK-NEXT: Mod 0001 | `{{.*}}test-x86_64.obj`:
24+
CHECK-NEXT: Mod 1 (debug info not present): [{{.*}}test-x86_64.obj]
25+
CHECK-NEXT: Mod 0002 | `{{.*}}loadconfig-arm64ec.obj`:
26+
CHECK-NEXT: Mod 2 (debug info not present): [{{.*}}loadconfig-arm64ec.obj]
27+
CHECK-NEXT: Mod 0003 | `test.dll`:
28+
CHECK-NEXT: Mod 3 (debug info not present): [test.dll]
29+
CHECK-NEXT: Mod 0004 | `Import:test.dll`:
30+
CHECK-NEXT: Stream 10, 104 bytes
31+
32+
CHECK: Modules
33+
CHECK-NEXT: ============================================================
34+
CHECK-NEXT: Mod 0000 | `{{.*}}test-arm64ec.obj`:
35+
CHECK-NEXT: SC[.text] | mod = 0, 0001:0000, size = 8, data crc = 2063330902, reloc crc = 0
36+
CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
37+
CHECK-NEXT: IMAGE_SCN_MEM_READ
38+
CHECK-NEXT: Obj: `{{.*}}test-arm64ec.obj`:
39+
CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
40+
CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
41+
CHECK-NEXT: Mod 0001 | `{{.*}}test-x86_64.obj`:
42+
CHECK-NEXT: SC[.text] | mod = 1, 0001:4096, size = 0, data crc = 0, reloc crc = 0
43+
CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
44+
CHECK-NEXT: IMAGE_SCN_MEM_READ
45+
CHECK-NEXT: Obj: `{{.*}}test-x86_64.obj`:
46+
CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
47+
CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
48+
CHECK-NEXT: Mod 0002 | `{{.*}}loadconfig-arm64ec.obj`:
49+
CHECK-NEXT: SC[.text] | mod = 2, 0001:0008, size = 0, data crc = 0, reloc crc = 0
50+
CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
51+
CHECK-NEXT: IMAGE_SCN_MEM_READ
52+
CHECK-NEXT: Obj: `{{.*}}loadconfig-arm64ec.obj`:
53+
CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
54+
CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
55+
CHECK-NEXT: Mod 0003 | `test.dll`:
56+
CHECK-NEXT: SC[???] | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 0
57+
CHECK-NEXT: none
58+
CHECK-NEXT: Obj: `{{.*}}test.lib`:
59+
CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
60+
CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
61+
CHECK-NEXT: Mod 0004 | `Import:test.dll`:
62+
CHECK-NEXT: SC[.text] | mod = 4, 0001:4096, size = 6, data crc = 0, reloc crc = 0
63+
CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
64+
CHECK-NEXT: Obj: `{{.*}}test.lib`:
65+
CHECK-NEXT: debug stream: 10, # files: 0, has ec info: false
66+
CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
67+
CHECK-NEXT: Mod 0005 | `* Linker *`:
68+
CHECK-NEXT: SC[???] | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 0
69+
CHECK-NEXT: none
70+
CHECK-NEXT: Obj: ``:
71+
CHECK-NEXT: debug stream: 11, # files: 0, has ec info: false
72+
CHECK-NEXT: pdb file ni: 1 `{{.*}}out.pdb`, src file ni: 0 ``
73+
74+
CHECK: Public Symbols
75+
CHECK-NEXT: ============================================================
76+
CHECK-NEXT: Records
77+
CHECK-NEXT: 544 | S_PUB32 [size = 28] `x86_64_sym`
78+
CHECK-NEXT: flags = none, addr = 0005:0008
79+
CHECK-NEXT: 496 | S_PUB32 [size = 28] `arm64ec_sym`
80+
CHECK-NEXT: flags = none, addr = 0005:0000
81+
CHECK-NEXT: 168 | S_PUB32 [size = 44] `__hybrid_auxiliary_iat_copy`
82+
CHECK-NEXT: flags = none, addr = 0002:
83+
CHECK-NEXT: 96 | S_PUB32 [size = 32] `__chpe_metadata`
84+
CHECK-NEXT: flags = none, addr = 0003:0000
85+
CHECK-NEXT: 416 | S_PUB32 [size = 48] `__x64_code_ranges_to_entry_points`
86+
CHECK-NEXT: flags = none, addr = 0002:
87+
CHECK-NEXT: 0 | S_PUB32 [size = 20] `#func`
88+
CHECK-NEXT: flags = function, addr = 0001:0008
89+
CHECK-NEXT: 244 | S_PUB32 [size = 40] `__icall_helper_arm64ec`
90+
CHECK-NEXT: flags = none, addr = 0001:0000
91+
CHECK-NEXT: 64 | S_PUB32 [size = 32] `__auximpcopy_func`
92+
CHECK-NEXT: flags = none, addr = 0002:
93+
CHECK-NEXT: 464 | S_PUB32 [size = 32] `_load_config_used`
94+
CHECK-NEXT: flags = none, addr = 0002:
95+
CHECK-NEXT: 524 | S_PUB32 [size = 20] `func`
96+
CHECK-NEXT: flags = function, addr = 0001:4096
97+
CHECK-NEXT: 128 | S_PUB32 [size = 40] `__hybrid_auxiliary_iat`
98+
CHECK-NEXT: flags = none, addr = 0002:8192
99+
CHECK-NEXT: 284 | S_PUB32 [size = 32] `__imp_aux_func`
100+
CHECK-NEXT: flags = none, addr = 0002:0000
101+
CHECK-NEXT: 344 | S_PUB32 [size = 28] `__impchk_func`
102+
CHECK-NEXT: flags = function, addr = 0001:0020
103+
CHECK-NEXT: 372 | S_PUB32 [size = 44] `__os_arm64x_dispatch_icall`
104+
CHECK-NEXT: flags = none, addr = 0002:
105+
CHECK-NEXT: 212 | S_PUB32 [size = 32] `__hybrid_code_map`
106+
CHECK-NEXT: flags = none, addr = 0002:
107+
CHECK-NEXT: 20 | S_PUB32 [size = 44] `__arm64x_redirection_metadata`
108+
CHECK-NEXT: flags = none, addr = 0004:0000
109+
CHECK-NEXT: 316 | S_PUB32 [size = 28] `__imp_func`
110+
CHECK-NEXT: flags = none, addr = 0002:8192
111+
112+
CHECK: Symbols
113+
CHECK-NEXT: ============================================================
114+
CHECK-NEXT: Mod 0000 | `{{.*}}test-arm64ec.obj`:
115+
CHECK-NEXT: Error loading module stream 0. The specified stream could not be loaded. Module stream not present
116+
CHECK-NEXT: Mod 0001 | `{{.*}}test-x86_64.obj`:
117+
CHECK-NEXT: Error loading module stream 1. The specified stream could not be loaded. Module stream not present
118+
CHECK-NEXT: Mod 0002 | `{{.*}}loadconfig-arm64ec.obj`:
119+
CHECK-NEXT: Error loading module stream 2. The specified stream could not be loaded. Module stream not present
120+
CHECK-NEXT: Mod 0003 | `test.dll`:
121+
CHECK-NEXT: Error loading module stream 3. The specified stream could not be loaded. Module stream not present
122+
CHECK-NEXT: Mod 0004 | `Import:test.dll`:
123+
CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `test.dll`
124+
CHECK-NEXT: 24 | S_COMPILE3 [size = 40]
125+
CHECK-NEXT: machine = arm64ec, Ver = LLVM Linker, language = link
126+
CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0
127+
CHECK-NEXT: flags = none
128+
CHECK-NEXT: 64 | S_THUNK32 [size = 32] `func`
129+
CHECK-NEXT: parent = 0, end = 96, next = 0
130+
CHECK-NEXT: kind = thunk, size = 6, addr = 0001:4096
131+
CHECK-NEXT: 96 | S_END [size = 4]
132+
CHECK-NEXT: Mod 0005 | `* Linker *`:
133+
CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `* Linker *`
134+
CHECK-NEXT: 24 | S_COMPILE3 [size = 40]
135+
CHECK-NEXT: machine = arm64x, Ver = LLVM Linker, language = link
136+
CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0
137+
CHECK-NEXT: flags = none
138+
CHECK-NEXT: 64 | S_ENVBLOCK [size = {{[0-9]+}}]
139+
CHECK: {{[0-9]+}} | S_SECTION [size = 28] `.text`
140+
CHECK-NEXT: length = 4102, alignment = 12, rva = 4096, section # = 1
141+
CHECK-NEXT: characteristics =
142+
CHECK-NEXT: code
143+
CHECK-NEXT: execute permissions
144+
CHECK-NEXT: read permissions
145+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.text`
146+
CHECK-NEXT: length = 8, addr = 0001:0000
147+
CHECK-NEXT: characteristics =
148+
CHECK-NEXT: code
149+
CHECK-NEXT: execute permissions
150+
CHECK-NEXT: read permissions
151+
CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.rdata`
152+
CHECK-NEXT: length = 8208, alignment = 12, rva = 12288, section # = 2
153+
CHECK-NEXT: characteristics =
154+
CHECK-NEXT: initialized data
155+
CHECK-NEXT: read permissions
156+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$5`
157+
CHECK-NEXT: length = 16, addr = 0002:0000
158+
CHECK-NEXT: characteristics =
159+
CHECK-NEXT: initialized data
160+
CHECK-NEXT: read permissions
161+
CHECK-NEXT: write permissions
162+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.00cfg`
163+
CHECK-NEXT: length = 456, addr = 0002:
164+
CHECK-NEXT: characteristics =
165+
CHECK-NEXT: initialized data
166+
CHECK-NEXT: read permissions
167+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2`
168+
CHECK-NEXT: length = 40, addr = 0002:
169+
CHECK-NEXT: characteristics =
170+
CHECK-NEXT: initialized data
171+
CHECK-NEXT: read permissions
172+
CHECK-NEXT: write permissions
173+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$4`
174+
CHECK-NEXT: length = 16, addr = 0002:
175+
CHECK-NEXT: characteristics =
176+
CHECK-NEXT: initialized data
177+
CHECK-NEXT: read permissions
178+
CHECK-NEXT: write permissions
179+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$6`
180+
CHECK-NEXT: length = 8, addr = 0002:
181+
CHECK-NEXT: characteristics =
182+
CHECK-NEXT: initialized data
183+
CHECK-NEXT: read permissions
184+
CHECK-NEXT: write permissions
185+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$7`
186+
CHECK-NEXT: length = 9, addr = 0002:
187+
CHECK-NEXT: characteristics =
188+
CHECK-NEXT: initialized data
189+
CHECK-NEXT: read permissions
190+
CHECK-NEXT: write permissions
191+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$a`
192+
CHECK-NEXT: length = 16, addr = 0002:
193+
CHECK-NEXT: characteristics =
194+
CHECK-NEXT: initialized data
195+
CHECK-NEXT: read permissions
196+
CHECK-NEXT: write permissions
197+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$9`
198+
CHECK-NEXT: length = 16, addr = 0002:8192
199+
CHECK-NEXT: characteristics =
200+
CHECK-NEXT: initialized data
201+
CHECK-NEXT: read permissions
202+
CHECK-NEXT: write permissions
203+
CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.data`
204+
CHECK-NEXT: length = 124, alignment = 12, rva = 24576, section # = 3
205+
CHECK-NEXT: characteristics =
206+
CHECK-NEXT: initialized data
207+
CHECK-NEXT: read permissions
208+
CHECK-NEXT: write permissions
209+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.data`
210+
CHECK-NEXT: length = 124, addr = 0003:0000
211+
CHECK-NEXT: characteristics =
212+
CHECK-NEXT: initialized data
213+
CHECK-NEXT: read permissions
214+
CHECK-NEXT: write permissions
215+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.bss`
216+
CHECK-NEXT: length = 0, addr = 0003:0124
217+
CHECK-NEXT: characteristics =
218+
CHECK-NEXT: uninitialized data
219+
CHECK-NEXT: read permissions
220+
CHECK-NEXT: write permissions
221+
CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.a64xrm`
222+
CHECK-NEXT: length = 8, alignment = 12, rva = 28672, section # = 4
223+
CHECK-NEXT: characteristics =
224+
CHECK-NEXT: initialized data
225+
CHECK-NEXT: read permissions
226+
CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.test`
227+
CHECK-NEXT: length = 16, alignment = 12, rva = 32768, section # = 5
228+
CHECK-NEXT: characteristics =
229+
CHECK-NEXT: initialized data
230+
CHECK-NEXT: read permissions
231+
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.test`
232+
CHECK-NEXT: length = 16, addr = 0005:0000
233+
CHECK-NEXT: characteristics =
234+
CHECK-NEXT: initialized data
235+
CHECK-NEXT: read permissions
236+
CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.reloc`
237+
CHECK-NEXT: length = 32, alignment = 12, rva = 36864, section # = 6
238+
CHECK-NEXT: characteristics =
239+
CHECK-NEXT: initialized data
240+
CHECK-NEXT: discardable
241+
CHECK-NEXT: read permissions
242+
243+
#--- test-arm64ec.s
244+
.text
245+
.globl __icall_helper_arm64ec
246+
.p2align 2, 0x0
247+
__icall_helper_arm64ec:
248+
mov w0, #0
249+
ret
250+
251+
.section .test,"dr"
252+
.globl arm64ec_sym
253+
arm64ec_sym:
254+
.rva __imp_func
255+
.rva __imp_aux_func
256+
257+
#--- test-x86_64.s
258+
.section .test,"dr"
259+
.globl x86_64_sym
260+
x86_64_sym:
261+
.rva __imp_func
262+
.rva __imp_aux_func
263+
264+
#--- test.def
265+
LIBRARY test.dll
266+
EXPORTS
267+
func

0 commit comments

Comments
 (0)