xref: /llvm-project/lld/test/COFF/arm64ec-export-thunks.test (revision dafbc97594c26da67e34ba0301a6126419ae4604)
1REQUIRES: aarch64, x86
2RUN: split-file %s %t.dir && cd %t.dir
3
4RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-data.s -o arm64ec-data.obj
5RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func.s -o arm64ec-func.obj
6RUN: llvm-mc -filetype=obj -triple=arm64ec-windows antidep-func.s -o antidep-func.obj
7RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-data-sym.s -o arm64ec-data-sym.obj
8RUN: llvm-mc -filetype=obj -triple=x86_64-windows x86_64-func.s -o x86_64-func.obj
9RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
10
11RUN: lld-link -out:exports.dll -machine:arm64ec arm64ec-func.obj x86_64-func.obj loadconfig-arm64ec.obj \
12RUN:          arm64ec-data.obj -dll -noentry -export:arm64ec_func -export:func=arm64ec_func \
13RUN:          -export:x86_64_func -export:data_sym,DATA
14
15RUN: llvm-objdump -d exports.dll | FileCheck -check-prefix=EXP-DISASM %s
16EXP-DISASM:      Disassembly of section .text:
17EXP-DISASM-EMPTY:
18EXP-DISASM-NEXT: 0000000180001000 <.text>:
19EXP-DISASM-NEXT: 180001000: 90000008     adrp    x8, 0x180001000 <.text>
20EXP-DISASM-NEXT: 180001004: 52800040     mov     w0, #0x2
21EXP-DISASM-NEXT: 180001008: d65f03c0     ret
22EXP-DISASM-NEXT:                 ...
23EXP-DISASM-EMPTY:
24EXP-DISASM-NEXT: 0000000180002000 <x86_64_func>:
25EXP-DISASM-NEXT: 180002000: e8 fb ef ff ff               callq   0x180001000 <.text>
26EXP-DISASM-NEXT: 180002005: b8 03 00 00 00               movl    $0x3, %eax
27EXP-DISASM-NEXT: 18000200a: c3                           retq
28EXP-DISASM-EMPTY:
29EXP-DISASM-NEXT: Disassembly of section .hexpthk:
30EXP-DISASM-EMPTY:
31EXP-DISASM-NEXT: 0000000180003000 <func>:
32EXP-DISASM-NEXT: 180003000: 48 8b c4                     movq    %rsp, %rax
33EXP-DISASM-NEXT: 180003003: 48 89 58 20                  movq    %rbx, 0x20(%rax)
34EXP-DISASM-NEXT: 180003007: 55                           pushq   %rbp
35EXP-DISASM-NEXT: 180003008: 5d                           popq    %rbp
36EXP-DISASM-NEXT: 180003009: e9 f2 df ff ff               jmp     0x180001000 <.text>
37EXP-DISASM-NEXT: 18000300e: cc                           int3
38EXP-DISASM-NEXT: 18000300f: cc                           int3
39EXP-DISASM-EMPTY:
40EXP-DISASM-NEXT: 0000000180003010 <arm64ec_func>:
41EXP-DISASM-NEXT: 180003010: 48 8b c4                     movq    %rsp, %rax
42EXP-DISASM-NEXT: 180003013: 48 89 58 20                  movq    %rbx, 0x20(%rax)
43EXP-DISASM-NEXT: 180003017: 55                           pushq   %rbp
44EXP-DISASM-NEXT: 180003018: 5d                           popq    %rbp
45EXP-DISASM-NEXT: 180003019: e9 e2 df ff ff               jmp     0x180001000 <.text>
46EXP-DISASM-NEXT: 18000301e: cc                           int3
47EXP-DISASM-NEXT: 18000301f: cc                           int3
48
49RUN: llvm-objdump -p exports.dll | FileCheck -check-prefix=EXP-EXPORT %s
50EXP-EXPORT:      Ordinal      RVA  Name
51EXP-EXPORT-NEXT:       1   0x3010  arm64ec_func
52EXP-EXPORT-NEXT:       2   0x7000  data_sym
53EXP-EXPORT-NEXT:       3   0x3000  func
54EXP-EXPORT-NEXT:       4   0x2000  x86_64_func
55
56RUN: llvm-readobj --coff-load-config exports.dll | FileCheck -check-prefix=EXP-CHPE %s
57EXP-CHPE:       CodeMap [
58EXP-CHPE-NEXT:    0x1000 - 0x100C  ARM64EC
59EXP-CHPE-NEXT:    0x2000 - 0x3020  X64
60EXP-CHPE-NEXT:  ]
61EXP-CHPE-NEXT:  CodeRangesToEntryPoints [
62EXP-CHPE-NEXT:    0x3000 - 0x3010 -> 0x3000
63EXP-CHPE-NEXT:    0x3010 - 0x3020 -> 0x3010
64EXP-CHPE-NEXT:  ]
65EXP-CHPE-NEXT:  RedirectionMetadata [
66EXP-CHPE-NEXT:    0x3000 -> 0x1000
67EXP-CHPE-NEXT:    0x3010 -> 0x1000
68EXP-CHPE-NEXT:  ]
69
70RUN: llvm-readobj --sections exports.dll | FileCheck --check-prefix=A64XRM %s
71
72A64XRM:      Name: .a64xrm (2E 61 36 34 78 72 6D 00)
73A64XRM-NEXT: VirtualSize: 0x18
74A64XRM-NEXT: VirtualAddress: 0x6000
75A64XRM-NEXT: RawDataSize: 512
76A64XRM-NEXT: PointerToRawData:
77A64XRM-NEXT: PointerToRelocations: 0x0
78A64XRM-NEXT: PointerToLineNumbers: 0x0
79A64XRM-NEXT: RelocationCount: 0
80A64XRM-NEXT: LineNumberCount: 0
81A64XRM-NEXT: Characteristics [ (0x40000040)
82A64XRM-NEXT:   IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
83A64XRM-NEXT:   IMAGE_SCN_MEM_READ (0x40000000)
84A64XRM-NEXT: ]
85
86RUN: llvm-readobj --hex-dump=.a64xrm exports.dll | FileCheck --check-prefix=A64XRM-DUMP %s
87
88A64XRM-DUMP:      0x180006000 00300000 00100000 10300000 00100000
89A64XRM-DUMP-NEXT: 0x180006010 00000000 00000000
90
91RUN: llvm-objdump -s --section=.test exports.dll | FileCheck --check-prefix=EXP-DATA %s
92EXP-DATA: 180007000 00300000 10300000
93
94RUN: lld-link -out:exports2.dll -machine:arm64ec antidep-func.obj x86_64-func.obj loadconfig-arm64ec.obj \
95RUN:          arm64ec-data.obj -dll -noentry -export:arm64ec_func -export:func=arm64ec_func \
96RUN:          -export:x86_64_func -export:data_sym,DATA
97
98RUN: llvm-objdump -d exports2.dll | FileCheck -check-prefix=EXP-DISASM %s
99RUN: llvm-objdump -p exports2.dll | FileCheck -check-prefix=EXP-EXPORT %s
100RUN: llvm-objdump -s --section=.test exports2.dll | FileCheck --check-prefix=EXP-DATA %s
101RUN: llvm-readobj --coff-load-config exports2.dll | FileCheck -check-prefix=EXP-CHPE %s
102
103RUN: lld-link -out:entry.dll -machine:arm64ec arm64ec-func.obj loadconfig-arm64ec.obj -dll -entry:arm64ec_func
104
105RUN: llvm-objdump -d entry.dll | FileCheck -check-prefix=ENTRY-DISASM %s
106ENTRY-DISASM:      Disassembly of section .text:
107ENTRY-DISASM-EMPTY:
108ENTRY-DISASM-NEXT: 0000000180001000 <.text>:
109ENTRY-DISASM-NEXT: 180001000: 90000008     adrp    x8, 0x180001000 <.text>
110ENTRY-DISASM-NEXT: 180001004: 52800040     mov     w0, #0x2                // =2
111ENTRY-DISASM-NEXT: 180001008: d65f03c0     ret
112ENTRY-DISASM-EMPTY:
113ENTRY-DISASM-NEXT: Disassembly of section .hexpthk:
114ENTRY-DISASM-EMPTY:
115ENTRY-DISASM-NEXT: 0000000180002000 <.hexpthk>:
116ENTRY-DISASM-NEXT: 180002000: 48 8b c4                     movq    %rsp, %rax
117ENTRY-DISASM-NEXT: 180002003: 48 89 58 20                  movq    %rbx, 0x20(%rax)
118ENTRY-DISASM-NEXT: 180002007: 55                           pushq   %rbp
119ENTRY-DISASM-NEXT: 180002008: 5d                           popq    %rbp
120ENTRY-DISASM-NEXT: 180002009: e9 f2 ef ff ff               jmp     0x180001000 <.text>
121ENTRY-DISASM-NEXT: 18000200e: cc                           int3
122ENTRY-DISASM-NEXT: 18000200f: cc                           int3
123
124RUN: llvm-readobj --headers entry.dll | FileCheck -check-prefix=ENTRY %s
125ENTRY: AddressOfEntryPoint: 0x2000
126
127RUN: llvm-readobj --coff-load-config entry.dll | FileCheck -check-prefix=ENTRY-CHPE %s
128ENTRY-CHPE:       CodeMap [
129ENTRY-CHPE-NEXT:    0x1000 - 0x100C  ARM64EC
130ENTRY-CHPE-NEXT:    0x2000 - 0x2010  X64
131ENTRY-CHPE-NEXT:  ]
132ENTRY-CHPE-NEXT:  CodeRangesToEntryPoints [
133ENTRY-CHPE-NEXT:    0x2000 - 0x2010 -> 0x2000
134ENTRY-CHPE-NEXT:  ]
135ENTRY-CHPE-NEXT:  RedirectionMetadata [
136ENTRY-CHPE-NEXT:    0x2000 -> 0x1000
137ENTRY-CHPE-NEXT:  ]
138
139
140Test exporting data symbol as a function:
141
142RUN: lld-link -out:data-func.dll -machine:arm64ec arm64ec-data-sym.obj loadconfig-arm64ec.obj -dll -noentry -export:data_sym
143
144RUN: llvm-readobj --hex-dump=.test data-func.dll | FileCheck --check-prefix=DATAFUNC-TEST %s
145DATAFUNC-TEST:      Hex dump of section '.test':
146DATAFUNC-TEST-NEXT: 0x180004000 00000000                            ....
147
148RUN: llvm-readobj --coff-exports --hex-dump=.test data-func.dll | FileCheck --check-prefix=DATAFUNC-EXP %s
149DATAFUNC-EXP:      Export {
150DATAFUNC-EXP-NEXT:   Ordinal: 1
151DATAFUNC-EXP-NEXT:   Name: data_sym
152DATAFUNC-EXP-NEXT:   RVA: 0x4000
153DATAFUNC-EXP-NEXT: }
154
155
156Test mingw-style auto-export:
157
158RUN: lld-link -out:export-all.dll -machine:arm64ec arm64ec-func.obj loadconfig-arm64ec.obj -dll -noentry -lldmingw
159RUN: llvm-objdump -d export-all.dll | FileCheck --check-prefix=EXPORT-ALL %s
160
161EXPORT-ALL:     Disassembly of section .text:
162EXPORT-ALL-EMPTY:
163EXPORT-ALL-NEXT: 0000000180001000 <.text>:
164EXPORT-ALL-NEXT: 180001000: 90000008     adrp    x8, 0x180001000 <.text>
165EXPORT-ALL-NEXT: 180001004: 52800040     mov     w0, #0x2                // =2
166EXPORT-ALL-NEXT: 180001008: d65f03c0     ret
167EXPORT-ALL-EMPTY:
168EXPORT-ALL-NEXT: Disassembly of section .hexpthk:
169EXPORT-ALL-EMPTY:
170EXPORT-ALL-NEXT: 0000000180002000 <arm64ec_func>:
171EXPORT-ALL-NEXT: 180002000: 48 8b c4                     movq    %rsp, %rax
172EXPORT-ALL-NEXT: 180002003: 48 89 58 20                  movq    %rbx, 0x20(%rax)
173EXPORT-ALL-NEXT: 180002007: 55                           pushq   %rbp
174EXPORT-ALL-NEXT: 180002008: 5d                           popq    %rbp
175EXPORT-ALL-NEXT: 180002009: e9 f2 ef ff ff               jmp     0x180001000 <.text>
176EXPORT-ALL-NEXT: 18000200e: cc                           int3
177EXPORT-ALL-NEXT: 18000200f: cc                           int3
178
179
180#--- arm64ec-func.s
181    .text
182    .globl arm64ec_func
183    .p2align 2, 0x0
184arm64ec_func:
185    adrp x8,arm64ec_func
186    mov w0, #2
187    ret
188
189#--- antidep-func.s
190    .text
191    .globl "#arm64ec_func"
192    .p2align 2, 0x0
193"#arm64ec_func":
194    adrp x8,arm64ec_func
195    mov w0, #2
196    ret
197
198    .weak_anti_dep arm64ec_func
199arm64ec_func = "#arm64ec_func"
200
201#--- arm64ec-data.s
202    .section .test, "r"
203    .globl data_sym
204    .p2align 2, 0x0
205data_sym:
206    .rva "EXP+#func"
207    .rva "EXP+#arm64ec_func"
208
209#--- x86_64-func.s
210    .text
211    .globl x86_64_func
212    .p2align 2, 0x0
213x86_64_func:
214    call arm64ec_func
215    movl $3, %eax
216    retq
217
218#--- arm64ec-data-sym.s
219    .section .test, "r"
220    .globl data_sym
221    .p2align 2, 0x0
222data_sym:
223    .word 0
224