xref: /llvm-project/lld/test/COFF/arm64x-export.test (revision e902cf2df1718b46f83ff132bf4ec5f84b163209)
1REQUIRES: aarch64, x86
2RUN: split-file %s %t.dir && cd %t.dir
3
4RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func.s -o arm64ec-func.obj
5RUN: llvm-mc -filetype=obj -triple=aarch64-windows arm64-func.s -o arm64-func.obj
6RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func-drectve.s -o arm64ec-drectve.obj
7RUN: llvm-mc -filetype=obj -triple=aarch64-windows func-drectve.s -o arm64-drectve.obj
8RUN: llvm-mc -filetype=obj -triple=aarch64-windows edata.s -o arm64-edata.obj
9RUN: llvm-mc -filetype=obj -triple=arm64ec-windows edata.s -o arm64ec-edata.obj
10RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
11RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj
12
13
14# A command-line export applies only to EC exports.
15
16RUN: lld-link -machine:arm64x -dll -out:out-cmd.dll arm64ec-func.obj arm64-func.obj \
17RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj -noentry -export:func
18
19RUN: llvm-objdump -d out-cmd.dll | FileCheck --check-prefix=DISASM-EC %s
20DISASM-EC:      Disassembly of section .text:
21DISASM-EC-EMPTY:
22DISASM-EC-NEXT: 0000000180001000 <.text>:
23DISASM-EC-NEXT: 180001000: 52800040     mov     w0, #0x2                // =2
24DISASM-EC-NEXT: 180001004: d65f03c0     ret
25DISASM-EC-EMPTY:
26DISASM-EC-NEXT: Disassembly of section .hexpthk:
27DISASM-EC-EMPTY:
28DISASM-EC-NEXT: 0000000180002000 <.hexpthk>:
29DISASM-EC-NEXT: 180002000: 48 8b c4                     movq    %rsp, %rax
30DISASM-EC-NEXT: 180002003: 48 89 58 20                  movq    %rbx, 0x20(%rax)
31DISASM-EC-NEXT: 180002007: 55                           pushq   %rbp
32DISASM-EC-NEXT: 180002008: 5d                           popq    %rbp
33DISASM-EC-NEXT: 180002009: e9 f2 ef ff ff               jmp     0x180001000 <.text>
34DISASM-EC-NEXT: 18000200e: cc                           int3
35DISASM-EC-NEXT: 18000200f: cc                           int3
36
37RUN: llvm-readobj --headers --coff-exports out-cmd.dll | FileCheck --check-prefix=EXPORTS-EC %s
38EXPORTS-EC:      ExportTableRVA: 0x0
39EXPORTS-EC-NEXT: ExportTableSize: 0x0
40EXPORTS-EC-NOT:  Name: func
41EXPORTS-EC:      HybridObject {
42EXPORTS-EC:        ExportTableRVA: 0x3{{.*}}
43EXPORTS-EC-NEXT:   ExportTableSize: 0x4{{.*}}
44EXPORTS-EC:        Export {
45EXPORTS-EC-NEXT:     Ordinal: 1
46EXPORTS-EC-NEXT:     Name: func
47EXPORTS-EC-NEXT:     RVA: 0x2000
48EXPORTS-EC-NEXT:   }
49EXPORTS-EC-NEXT: }
50
51RUN: llvm-readobj out-cmd.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s
52IMPLIB-HEADER:      File: out-{{.*}}.lib(out{{.*}}.dll)
53IMPLIB-HEADER-NEXT: Format: COFF-ARM64
54IMPLIB-HEADER-NEXT: Arch: aarch64
55IMPLIB-HEADER-NEXT: AddressSize: 64bit
56IMPLIB-HEADER-EMPTY:
57IMPLIB-HEADER-NEXT: File: out-{{.*}}.lib(out{{.*}}.dll)
58IMPLIB-HEADER-NEXT: Format: COFF-ARM64
59IMPLIB-HEADER-NEXT: Arch: aarch64
60IMPLIB-HEADER-NEXT: AddressSize: 64bit
61IMPLIB-HEADER-EMPTY:
62IMPLIB-HEADER-NEXT: File: out-{{.*}}.lib(out{{.*}}.dll)
63IMPLIB-HEADER-NEXT: Format: COFF-ARM64
64IMPLIB-HEADER-NEXT: Arch: aarch64
65IMPLIB-HEADER-NEXT: AddressSize: 64bit
66IMPLIB-HEADER-EMPTY:
67IMPLIB-EC:      File: out{{.*}}.dll
68IMPLIB-EC-NEXT: Format: COFF-import-file-ARM64EC
69IMPLIB-EC-NEXT: Type: code
70IMPLIB-EC-NEXT: Name type: export as
71IMPLIB-EC-NEXT: Export name: func
72IMPLIB-EC-NEXT: Symbol: __imp_func
73IMPLIB-EC-NEXT: Symbol: func
74IMPLIB-EC-NEXT: Symbol: __imp_aux_func
75IMPLIB-EC-NEXT: Symbol: #func
76
77
78# Export using the EC .drectve section.
79
80RUN: lld-link -machine:arm64x -dll -out:out-drectve-ec.dll arm64ec-func.obj arm64-func.obj \
81RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj arm64ec-drectve.obj -noentry
82RUN: llvm-objdump -d out-drectve-ec.dll | FileCheck --check-prefix=DISASM-EC %s
83RUN: llvm-readobj --headers --coff-exports out-drectve-ec.dll | FileCheck --check-prefix=EXPORTS-EC %s
84RUN: llvm-readobj out-drectve-ec.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s
85
86# A command-line def file applies only to EC exports.
87
88RUN: lld-link -machine:arm64x -dll -out:out-def-ec.dll arm64ec-func.obj arm64-func.obj \
89RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj -def:func.def -noentry
90RUN: llvm-objdump -d out-def-ec.dll | FileCheck --check-prefix=DISASM-EC %s
91RUN: llvm-readobj --headers --coff-exports out-def-ec.dll | FileCheck --check-prefix=EXPORTS-EC %s
92RUN: llvm-readobj out-def-ec.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s
93
94# Export using the EC .edata section.
95
96RUN: lld-link -machine:arm64x -dll -out:out-edata-ec.dll arm64ec-func.obj arm64-func.obj \
97RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj arm64ec-edata.obj -noentry
98
99RUN: llvm-objdump -d out-edata-ec.dll | FileCheck --check-prefix=DISASM-EDATA-EC %s
100DISASM-EDATA-EC:      0000000180001000 <.text>:
101DISASM-EDATA-EC-NEXT: 180001000: 52800040     mov     w0, #0x2                // =2
102DISASM-EDATA-EC-NEXT: 180001004: d65f03c0     ret
103
104RUN: llvm-readobj --headers --coff-exports out-edata-ec.dll | FileCheck --check-prefix=EXPORTS-EDATA-EC %s
105EXPORTS-EDATA-EC:      ExportTableRVA: 0x0
106EXPORTS-EDATA-EC-NEXT: ExportTableSize: 0x0
107EXPORTS-EDATA-EC-NOT:  Name: func
108EXPORTS-EDATA-EC:      HybridObject {
109EXPORTS-EDATA-EC:        ExportTableRVA: 0x2{{.*}}
110EXPORTS-EDATA-EC-NEXT:   ExportTableSize: 0x4{{.*}}
111EXPORTS-EDATA-EC:        Export {
112EXPORTS-EDATA-EC-NEXT:     Ordinal: 1
113EXPORTS-EDATA-EC-NEXT:     Name: func
114EXPORTS-EDATA-EC-NEXT:     RVA: 0x1000
115EXPORTS-EDATA-EC-NEXT:   }
116EXPORTS-EDATA-EC-NEXT: }
117
118# Export using the native .drectve section.
119
120RUN: lld-link -machine:arm64x -dll -out:out-drectve-native.dll arm64ec-func.obj arm64-func.obj \
121RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-drectve.obj -noentry
122
123RUN: llvm-objdump -d out-drectve-native.dll | FileCheck --check-prefix=DISASM-NATIVE %s
124DISASM-NATIVE:      Disassembly of section .text:
125DISASM-NATIVE-EMPTY:
126DISASM-NATIVE-NEXT: 0000000180001000 <func>:
127DISASM-NATIVE-NEXT: 180001000: 52800020     mov     w0, #0x1                // =1
128DISASM-NATIVE-NEXT: 180001004: d65f03c0     ret
129
130RUN: llvm-readobj --headers --coff-exports out-drectve-native.dll | FileCheck --check-prefix=EXPORTS-NATIVE %s
131EXPORTS-NATIVE:      ExportTableRVA: 0x2{{.*}}
132EXPORTS-NATIVE-NEXT: ExportTableSize: 0x4{{.*}}
133EXPORTS-NATIVE:      Export {
134EXPORTS-NATIVE-NEXT:   Ordinal: 1
135EXPORTS-NATIVE-NEXT:   Name: func
136EXPORTS-NATIVE-NEXT:   RVA: 0x1000
137EXPORTS-NATIVE-NEXT: }
138EXPORTS-NATIVE:      HybridObject {
139EXPORTS-NATIVE:        ExportTableRVA: 0x0
140EXPORTS-NATIVE-NEXT:   ExportTableSize: 0x0
141EXPORTS-NATIVE-NOT:    Name: func
142
143RUN: llvm-readobj out-drectve-native.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-NATIVE %s
144IMPLIB-NATIVE:      File: out{{.*}}.dll
145IMPLIB-NATIVE-NEXT: Format: COFF-import-file-ARM64
146IMPLIB-NATIVE-NEXT: Type: code
147IMPLIB-NATIVE-NEXT: Name type: name
148IMPLIB-NATIVE-NEXT: Export name: func
149IMPLIB-NATIVE-NEXT: Symbol: __imp_func
150IMPLIB-NATIVE-NEXT: Symbol: func
151
152# Export using the native .edata section.
153
154RUN: lld-link -machine:arm64x -dll -out:out-edata.dll arm64ec-func.obj arm64-func.obj \
155RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-edata.obj -noentry
156RUN: llvm-objdump -d out-edata.dll | FileCheck --check-prefix=DISASM-NATIVE %s
157RUN: llvm-readobj --headers --coff-exports out-edata.dll | FileCheck --check-prefix=EXPORTS-NATIVE %s
158
159# Export using both the native and EC .drectve sections.
160
161RUN: lld-link -machine:arm64x -dll -out:out-both.dll arm64ec-func.obj arm64-func.obj \
162RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-drectve.obj arm64ec-drectve.obj -noentry
163
164RUN: llvm-objdump -d out-both.dll | FileCheck --check-prefix=DISASM-BOTH %s
165DISASM-BOTH:      Disassembly of section .text:
166DISASM-BOTH-EMPTY:
167DISASM-BOTH-NEXT: 0000000180001000 <func>:
168DISASM-BOTH-NEXT: 180001000: 52800020     mov     w0, #0x1                // =1
169DISASM-BOTH-NEXT: 180001004: d65f03c0     ret
170DISASM-BOTH-NEXT:                 ...
171DISASM-BOTH-NEXT: 180002000: 52800040     mov     w0, #0x2                // =2
172DISASM-BOTH-NEXT: 180002004: d65f03c0     ret
173DISASM-BOTH-EMPTY:
174DISASM-BOTH-NEXT: Disassembly of section .hexpthk:
175DISASM-BOTH-EMPTY:
176DISASM-BOTH-NEXT: 0000000180003000 <.hexpthk>:
177DISASM-BOTH-NEXT: 180003000: 48 8b c4                     movq    %rsp, %rax
178DISASM-BOTH-NEXT: 180003003: 48 89 58 20                  movq    %rbx, 0x20(%rax)
179DISASM-BOTH-NEXT: 180003007: 55                           pushq   %rbp
180DISASM-BOTH-NEXT: 180003008: 5d                           popq    %rbp
181DISASM-BOTH-NEXT: 180003009: e9 f2 ef ff ff               jmp     0x180002000 <func+0x1000>
182DISASM-BOTH-NEXT: 18000300e: cc                           int3
183DISASM-BOTH-NEXT: 18000300f: cc                           int3
184
185RUN: llvm-readobj --headers --coff-exports out-both.dll | FileCheck --check-prefix=EXPORTS-BOTH %s
186EXPORTS-BOTH:      ExportTableRVA: 0x4{{.*}}
187EXPORTS-BOTH-NEXT: ExportTableSize: 0x4{{.*}}
188EXPORTS-BOTH:      Export {
189EXPORTS-BOTH-NEXT:   Ordinal: 1
190EXPORTS-BOTH-NEXT:   Name: func
191EXPORTS-BOTH-NEXT:   RVA: 0x1000
192EXPORTS-BOTH-NEXT: }
193EXPORTS-BOTH:      HybridObject {
194EXPORTS-BOTH:        ExportTableRVA: 0x4{{.*}}
195EXPORTS-BOTH-NEXT:   ExportTableSize: 0x4{{.*}}
196EXPORTS-BOTH:        Export {
197EXPORTS-BOTH-NEXT:     Ordinal: 1
198EXPORTS-BOTH-NEXT:     Name: func
199EXPORTS-BOTH-NEXT:     RVA: 0x3000
200EXPORTS-BOTH-NEXT:   }
201EXPORTS-BOTH-NEXT: }
202
203RUN: llvm-readobj out-both.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC,IMPLIB-NATIVE %s
204
205# Export using both the -def and -defarm64native arguments.
206
207RUN: lld-link -machine:arm64x -dll -out:out-def-both.dll arm64ec-func.obj arm64-func.obj \
208RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj -def:func.def -defarm64native:func.def -noentry
209RUN: llvm-objdump -d out-def-both.dll | FileCheck --check-prefix=DISASM-BOTH %s
210RUN: llvm-readobj --headers --coff-exports out-def-both.dll | FileCheck --check-prefix=EXPORTS-BOTH %s
211RUN: llvm-readobj out-def-both.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC,IMPLIB-NATIVE %s
212
213# -defarm64native is ignored if -def is not specified.
214
215RUN: lld-link -machine:arm64x -dll -out:out-def-native.dll arm64ec-func.obj arm64-func.obj \
216RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj -defarm64native:func.def -noentry
217RUN: llvm-readobj --headers --coff-exports out-def-native.dll | FileCheck --check-prefix=NO-EXPORT %s
218NO-EXPORT:  ExportTableRVA: 0x0
219NO-EXPORT:  ExportTableSize: 0x0
220NO-EXPORT:  HybridObject {
221NO-EXPORT:    ExportTableRVA: 0x0
222NO-EXPORT:    ExportTableSize: 0x0
223NO-EXPORT:  }
224
225# -defarm64native is ignored on ARM64 target.
226
227RUN: lld-link -machine:arm64 -dll -out:out-arm64-def.dll arm64-func.obj -defarm64native:invalid.def -def:func.def -noentry 2>&1 | count 0
228
229# Export using both the native and EC .edata sections.
230
231RUN: lld-link -machine:arm64x -dll -out:out-edata-both.dll arm64ec-func.obj arm64-func.obj \
232RUN:          loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-edata.obj arm64ec-edata.obj -noentry
233RUN: llvm-readobj --headers --coff-exports out-edata-both.dll | FileCheck --check-prefix=EXPORTS-EDATA-BOTH %s
234EXPORTS-EDATA-BOTH:      ExportTableRVA: 0x3{{.*}}
235EXPORTS-EDATA-BOTH-NEXT: ExportTableSize: 0x4{{.*}}
236EXPORTS-EDATA-BOTH:      Export {
237EXPORTS-EDATA-BOTH-NEXT:   Ordinal: 1
238EXPORTS-EDATA-BOTH-NEXT:   Name: func
239EXPORTS-EDATA-BOTH-NEXT:   RVA: 0x1000
240EXPORTS-EDATA-BOTH-NEXT: }
241EXPORTS-EDATA-BOTH:      HybridObject {
242EXPORTS-EDATA-BOTH:        ExportTableRVA: 0x3{{.*}}
243EXPORTS-EDATA-BOTH-NEXT:   ExportTableSize: 0x4{{.*}}
244EXPORTS-EDATA-BOTH:        Export {
245EXPORTS-EDATA-BOTH-NEXT:     Ordinal: 1
246EXPORTS-EDATA-BOTH-NEXT:     Name: func
247EXPORTS-EDATA-BOTH-NEXT:     RVA: 0x2000
248EXPORTS-EDATA-BOTH-NEXT:   }
249EXPORTS-EDATA-BOTH-NEXT: }
250
251#--- arm64-func.s
252    .section .text,"xr",discard,func
253    .globl func
254    .p2align 2
255func:
256    mov w0, #1
257    ret
258
259#--- arm64ec-func.s
260    .section .text,"xr",discard,func
261    .globl func
262    .p2align 2
263func:
264    mov w0, #2
265    ret
266
267#--- func-drectve.s
268.section .drectve
269    .ascii "-export:func"
270
271#--- edata.s
272    .section .edata, "dr"
273    .align 4
274exports:
275    .long 0           // ExportFlags
276    .long 0           // TimeDateStamp
277    .long 0           // MajorVersion + MinorVersion
278    .rva name         // NameRVA
279    .long 1           // OrdinalBase
280    .long 1           // AddressTableEntries
281    .long 1           // NumberOfNamePointers
282    .rva functions    // ExportAddressTableRVA
283    .rva names        // NamePointerRVA
284    .rva nameordinals // OrdinalTableRVA
285
286names:
287    .rva funcname_func
288
289nameordinals:
290    .short 0
291
292functions:
293    .rva func
294    .long 0
295
296funcname_func:
297    .asciz "func"
298
299name:
300    .asciz "out-edata.dll"
301
302#--- func.def
303LIBRARY out.dll
304EXPORTS
305        func
306