Skip to content

Commit 5811067

Browse files
authored
[LLD][COFF] Support ARM64EC in BitcodeFile::getMachineType (#115474)
1 parent 8833a44 commit 5811067

File tree

4 files changed

+40
-7
lines changed

4 files changed

+40
-7
lines changed

lld/COFF/InputFiles.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,8 @@ void BitcodeFile::parseLazy() {
12791279
}
12801280

12811281
MachineTypes BitcodeFile::getMachineType() const {
1282-
switch (Triple(obj->getTargetTriple()).getArch()) {
1282+
Triple t(obj->getTargetTriple());
1283+
switch (t.getArch()) {
12831284
case Triple::x86_64:
12841285
return AMD64;
12851286
case Triple::x86:
@@ -1288,7 +1289,7 @@ MachineTypes BitcodeFile::getMachineType() const {
12881289
case Triple::thumb:
12891290
return ARMNT;
12901291
case Triple::aarch64:
1291-
return ARM64;
1292+
return t.isWindowsArm64EC() ? ARM64EC : ARM64;
12921293
default:
12931294
return IMAGE_FILE_MACHINE_UNKNOWN;
12941295
}

lld/test/COFF/Inputs/loadconfig-arm64ec.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ __guard_dispatch_icall_fptr:
2626
.xword 0
2727
__os_arm64x_dispatch_call_no_redirect:
2828
.xword 0
29+
.globl __os_arm64x_dispatch_ret
2930
__os_arm64x_dispatch_ret:
3031
.xword 0
3132
__os_arm64x_check_call:

lld/test/COFF/arm64ec-pdb.test

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,25 +74,25 @@ CHECK-NEXT: pdb file ni: 1 `{{.*}}out.pdb`, src file ni: 0 ``
7474
CHECK: Public Symbols
7575
CHECK-NEXT: ============================================================
7676
CHECK-NEXT: Records
77-
CHECK-NEXT: 544 | S_PUB32 [size = 28] `x86_64_sym`
77+
CHECK-NEXT: 584 | S_PUB32 [size = 28] `x86_64_sym`
7878
CHECK-NEXT: flags = none, addr = 0005:0008
79-
CHECK-NEXT: 496 | S_PUB32 [size = 28] `arm64ec_sym`
79+
CHECK-NEXT: 536 | S_PUB32 [size = 28] `arm64ec_sym`
8080
CHECK-NEXT: flags = none, addr = 0005:0000
8181
CHECK-NEXT: 168 | S_PUB32 [size = 44] `__hybrid_auxiliary_iat_copy`
8282
CHECK-NEXT: flags = none, addr = 0002:
8383
CHECK-NEXT: 96 | S_PUB32 [size = 32] `__chpe_metadata`
8484
CHECK-NEXT: flags = none, addr = 0003:0000
85-
CHECK-NEXT: 416 | S_PUB32 [size = 48] `__x64_code_ranges_to_entry_points`
85+
CHECK-NEXT: 456 | S_PUB32 [size = 48] `__x64_code_ranges_to_entry_points`
8686
CHECK-NEXT: flags = none, addr = 0002:
8787
CHECK-NEXT: 0 | S_PUB32 [size = 20] `#func`
8888
CHECK-NEXT: flags = function, addr = 0001:0008
8989
CHECK-NEXT: 244 | S_PUB32 [size = 40] `__icall_helper_arm64ec`
9090
CHECK-NEXT: flags = none, addr = 0001:0000
9191
CHECK-NEXT: 64 | S_PUB32 [size = 32] `__auximpcopy_func`
9292
CHECK-NEXT: flags = none, addr = 0002:
93-
CHECK-NEXT: 464 | S_PUB32 [size = 32] `_load_config_used`
93+
CHECK-NEXT: 504 | S_PUB32 [size = 32] `_load_config_used`
9494
CHECK-NEXT: flags = none, addr = 0002:
95-
CHECK-NEXT: 524 | S_PUB32 [size = 20] `func`
95+
CHECK-NEXT: 564 | S_PUB32 [size = 20] `func`
9696
CHECK-NEXT: flags = function, addr = 0001:4096
9797
CHECK-NEXT: 128 | S_PUB32 [size = 40] `__hybrid_auxiliary_iat`
9898
CHECK-NEXT: flags = none, addr = 0002:8192
@@ -106,6 +106,8 @@ CHECK-NEXT: 212 | S_PUB32 [size = 32] `__hybrid_code_map`
106106
CHECK-NEXT: flags = none, addr = 0002:
107107
CHECK-NEXT: 20 | S_PUB32 [size = 44] `__arm64x_redirection_metadata`
108108
CHECK-NEXT: flags = none, addr = 0004:0000
109+
CHECK-NEXT: 416 | S_PUB32 [size = 40] `__os_arm64x_dispatch_ret`
110+
CHECK-NEXT: flags = none, addr = 0002:
109111
CHECK-NEXT: 316 | S_PUB32 [size = 28] `__imp_func`
110112
CHECK-NEXT: flags = none, addr = 0002:8192
111113

lld/test/COFF/lto-arm64ec.ll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
; REQUIRES: aarch64, x86
2+
3+
; RUN: llvm-as %s -o %t.obj
4+
; RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o %t-loadconfig.obj
5+
6+
; RUN: lld-link -machine:arm64ec %t.obj %t-loadconfig.obj -out:%t.exe -subsystem:console
7+
; RUN: llvm-objdump -d %t.exe | FileCheck %s
8+
9+
; CHECK: 0000000140001000 <.text>:
10+
; CHECK-NEXT: 140001000: 00000009 udf #0x9
11+
; CHECK-NEXT: 140001004: 52800020 mov w0, #0x1 // =1
12+
; CHECK-NEXT: 140001008: d65f03c0 ret
13+
14+
; CHECK: 0000000140002000 <.hexpthk>:
15+
; CHECK-NEXT: 140002000: 48 8b c4 movq %rsp, %rax
16+
; CHECK-NEXT: 140002003: 48 89 58 20 movq %rbx, 0x20(%rax)
17+
; CHECK-NEXT: 140002007: 55 pushq %rbp
18+
; CHECK-NEXT: 140002008: 5d popq %rbp
19+
; CHECK-NEXT: 140002009: e9 f6 ef ff ff jmp 0x140001004 <.text+0x4>
20+
; CHECK-NEXT: 14000200e: cc int3
21+
; CHECK-NEXT: 14000200f: cc int3
22+
23+
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32"
24+
target triple = "arm64ec-unknown-windows-msvc"
25+
26+
define dso_local i32 @mainCRTStartup() {
27+
entry:
28+
ret i32 1
29+
}

0 commit comments

Comments
 (0)