Skip to content

Commit 8b6d641

Browse files
authored
Unrolled build for rust-lang#131332
Rollup merge of rust-lang#131332 - taiki-e:arm64ec-clobber-abi, r=Amanieu Fix clobber_abi and disallow SVE-related registers in Arm64EC inline assembly Currently `clobber_abi` in Arm64EC inline assembly is implemented using `InlineAsmClobberAbi::AArch64NoX18`, but broken since it attempts to clobber registers that cannot be used in Arm64EC: https://godbolt.org/z/r3PTrGz5r ``` error: cannot use register `x13`: x13, x14, x23, x24, x28, v16-v31 cannot be used for Arm64EC --> <source>:6:14 | 6 | asm!("", clobber_abi("C"), options(nostack, nomem, preserves_flags)); | ^^^^^^^^^^^^^^^^ error: cannot use register `x14`: x13, x14, x23, x24, x28, v16-v31 cannot be used for Arm64EC --> <source>:6:14 | 6 | asm!("", clobber_abi("C"), options(nostack, nomem, preserves_flags)); | ^^^^^^^^^^^^^^^^ <omitted the same errors for v16-v31> ``` Additionally, this disallows SVE-related registers per rust-lang#131332 (comment). cc ``@dpaoliello`` r? ``@Amanieu`` ``@rustbot`` label O-windows O-AArch64 +A-inline-assembly
2 parents 17a19e6 + d858dfe commit 8b6d641

File tree

6 files changed

+143
-20
lines changed

6 files changed

+143
-20
lines changed

compiler/rustc_target/src/asm/aarch64.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ impl AArch64InlineAsmRegClass {
6464
neon: I8, I16, I32, I64, F16, F32, F64, F128,
6565
VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF16(4), VecF32(2), VecF64(1),
6666
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF16(8), VecF32(4), VecF64(2);
67+
// Note: When adding support for SVE vector types, they must be rejected for Arm64EC.
6768
},
6869
Self::preg => &[],
6970
}
@@ -96,7 +97,7 @@ fn restricted_for_arm64ec(
9697
_is_clobber: bool,
9798
) -> Result<(), &'static str> {
9899
if arch == InlineAsmArch::Arm64EC {
99-
Err("x13, x14, x23, x24, x28, v16-v31 cannot be used for Arm64EC")
100+
Err("x13, x14, x23, x24, x28, v16-v31, p*, ffr cannot be used for Arm64EC")
100101
} else {
101102
Ok(())
102103
}
@@ -165,23 +166,23 @@ def_regs! {
165166
v29: vreg = ["v29", "b29", "h29", "s29", "d29", "q29", "z29"] % restricted_for_arm64ec,
166167
v30: vreg = ["v30", "b30", "h30", "s30", "d30", "q30", "z30"] % restricted_for_arm64ec,
167168
v31: vreg = ["v31", "b31", "h31", "s31", "d31", "q31", "z31"] % restricted_for_arm64ec,
168-
p0: preg = ["p0"],
169-
p1: preg = ["p1"],
170-
p2: preg = ["p2"],
171-
p3: preg = ["p3"],
172-
p4: preg = ["p4"],
173-
p5: preg = ["p5"],
174-
p6: preg = ["p6"],
175-
p7: preg = ["p7"],
176-
p8: preg = ["p8"],
177-
p9: preg = ["p9"],
178-
p10: preg = ["p10"],
179-
p11: preg = ["p11"],
180-
p12: preg = ["p12"],
181-
p13: preg = ["p13"],
182-
p14: preg = ["p14"],
183-
p15: preg = ["p15"],
184-
ffr: preg = ["ffr"],
169+
p0: preg = ["p0"] % restricted_for_arm64ec,
170+
p1: preg = ["p1"] % restricted_for_arm64ec,
171+
p2: preg = ["p2"] % restricted_for_arm64ec,
172+
p3: preg = ["p3"] % restricted_for_arm64ec,
173+
p4: preg = ["p4"] % restricted_for_arm64ec,
174+
p5: preg = ["p5"] % restricted_for_arm64ec,
175+
p6: preg = ["p6"] % restricted_for_arm64ec,
176+
p7: preg = ["p7"] % restricted_for_arm64ec,
177+
p8: preg = ["p8"] % restricted_for_arm64ec,
178+
p9: preg = ["p9"] % restricted_for_arm64ec,
179+
p10: preg = ["p10"] % restricted_for_arm64ec,
180+
p11: preg = ["p11"] % restricted_for_arm64ec,
181+
p12: preg = ["p12"] % restricted_for_arm64ec,
182+
p13: preg = ["p13"] % restricted_for_arm64ec,
183+
p14: preg = ["p14"] % restricted_for_arm64ec,
184+
p15: preg = ["p15"] % restricted_for_arm64ec,
185+
ffr: preg = ["ffr"] % restricted_for_arm64ec,
185186
#error = ["x19", "w19"] =>
186187
"x19 is used internally by LLVM and cannot be used as an operand for inline asm",
187188
#error = ["x29", "w29", "fp", "wfp"] =>

compiler/rustc_target/src/asm/mod.rs

+15-2
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,7 @@ pub enum InlineAsmClobberAbi {
890890
Arm,
891891
AArch64,
892892
AArch64NoX18,
893+
Arm64EC,
893894
RiscV,
894895
LoongArch,
895896
S390x,
@@ -932,7 +933,7 @@ impl InlineAsmClobberAbi {
932933
_ => Err(&["C", "system", "efiapi"]),
933934
},
934935
InlineAsmArch::Arm64EC => match name {
935-
"C" | "system" => Ok(InlineAsmClobberAbi::AArch64NoX18),
936+
"C" | "system" => Ok(InlineAsmClobberAbi::Arm64EC),
936937
_ => Err(&["C", "system"]),
937938
},
938939
InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => match name {
@@ -1033,7 +1034,6 @@ impl InlineAsmClobberAbi {
10331034
p0, p1, p2, p3, p4, p5, p6, p7,
10341035
p8, p9, p10, p11, p12, p13, p14, p15,
10351036
ffr,
1036-
10371037
}
10381038
},
10391039
InlineAsmClobberAbi::AArch64NoX18 => clobbered_regs! {
@@ -1052,7 +1052,20 @@ impl InlineAsmClobberAbi {
10521052
p0, p1, p2, p3, p4, p5, p6, p7,
10531053
p8, p9, p10, p11, p12, p13, p14, p15,
10541054
ffr,
1055+
}
1056+
},
1057+
InlineAsmClobberAbi::Arm64EC => clobbered_regs! {
1058+
AArch64 AArch64InlineAsmReg {
1059+
// x13 and x14 cannot be used in Arm64EC.
1060+
x0, x1, x2, x3, x4, x5, x6, x7,
1061+
x8, x9, x10, x11, x12, x15,
1062+
x16, x17, x30,
10551063

1064+
// Technically the low 64 bits of v8-v15 are preserved, but
1065+
// we have no way of expressing this using clobbers.
1066+
v0, v1, v2, v3, v4, v5, v6, v7,
1067+
v8, v9, v10, v11, v12, v13, v14, v15,
1068+
// v16-v31, p*, and ffr cannot be used in Arm64EC.
10561069
}
10571070
},
10581071
InlineAsmClobberAbi::Arm => clobbered_regs! {

tests/codegen/asm-arm64ec-clobbers.rs

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//@ assembly-output: emit-asm
2+
//@ compile-flags: --target arm64ec-pc-windows-msvc
3+
//@ needs-llvm-components: aarch64
4+
5+
#![crate_type = "rlib"]
6+
#![feature(no_core, rustc_attrs, lang_items, asm_experimental_arch)]
7+
#![no_core]
8+
9+
#[lang = "sized"]
10+
trait Sized {}
11+
12+
#[rustc_builtin_macro]
13+
macro_rules! asm {
14+
() => {};
15+
}
16+
17+
// CHECK-LABEL: @cc_clobber
18+
// CHECK: call void asm sideeffect "", "~{cc}"()
19+
#[no_mangle]
20+
pub unsafe fn cc_clobber() {
21+
asm!("", options(nostack, nomem));
22+
}
23+
24+
// CHECK-LABEL: @no_clobber
25+
// CHECK: call void asm sideeffect "", ""()
26+
#[no_mangle]
27+
pub unsafe fn no_clobber() {
28+
asm!("", options(nostack, nomem, preserves_flags));
29+
}
30+
31+
// CHECK-LABEL: @clobber_abi
32+
// CHECK: asm sideeffect "", "={w0},={w1},={w2},={w3},={w4},={w5},={w6},={w7},={w8},={w9},={w10},={w11},={w12},={w15},={w16},={w17},={w30},={q0},={q1},={q2},={q3},={q4},={q5},={q6},={q7},={q8},={q9},={q10},={q11},={q12},={q13},={q14},={q15}"()
33+
#[no_mangle]
34+
pub unsafe fn clobber_abi() {
35+
asm!("", clobber_abi("C"), options(nostack, nomem, preserves_flags));
36+
}

tests/ui/asm/aarch64/aarch64-sve.rs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//@ only-aarch64
2+
//@ build-pass
3+
//@ needs-asm-support
4+
5+
#![crate_type = "rlib"]
6+
#![feature(no_core, rustc_attrs, lang_items)]
7+
#![no_core]
8+
9+
// AArch64 test corresponding to arm64ec-sve.rs.
10+
11+
#[lang = "sized"]
12+
trait Sized {}
13+
#[lang = "copy"]
14+
trait Copy {}
15+
16+
impl Copy for f64 {}
17+
18+
#[rustc_builtin_macro]
19+
macro_rules! asm {
20+
() => {};
21+
}
22+
23+
fn f(x: f64) {
24+
unsafe {
25+
asm!("", out("p0") _);
26+
asm!("", out("ffr") _);
27+
}
28+
}

tests/ui/asm/aarch64/arm64ec-sve.rs

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//@ compile-flags: --target arm64ec-pc-windows-msvc
2+
//@ needs-asm-support
3+
//@ needs-llvm-components: aarch64
4+
5+
#![crate_type = "rlib"]
6+
#![feature(no_core, rustc_attrs, lang_items, asm_experimental_arch)]
7+
#![no_core]
8+
9+
// SVE cannot be used for Arm64EC
10+
// https://github.com/rust-lang/rust/pull/131332#issuecomment-2401189142
11+
12+
#[lang = "sized"]
13+
trait Sized {}
14+
#[lang = "copy"]
15+
trait Copy {}
16+
17+
impl Copy for f64 {}
18+
19+
#[rustc_builtin_macro]
20+
macro_rules! asm {
21+
() => {};
22+
}
23+
24+
fn f(x: f64) {
25+
unsafe {
26+
asm!("", out("p0") _);
27+
//~^ ERROR cannot use register `p0`
28+
asm!("", out("ffr") _);
29+
//~^ ERROR cannot use register `ffr`
30+
}
31+
}
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error: cannot use register `p0`: x13, x14, x23, x24, x28, v16-v31, p*, ffr cannot be used for Arm64EC
2+
--> $DIR/arm64ec-sve.rs:26:18
3+
|
4+
LL | asm!("", out("p0") _);
5+
| ^^^^^^^^^^^
6+
7+
error: cannot use register `ffr`: x13, x14, x23, x24, x28, v16-v31, p*, ffr cannot be used for Arm64EC
8+
--> $DIR/arm64ec-sve.rs:28:18
9+
|
10+
LL | asm!("", out("ffr") _);
11+
| ^^^^^^^^^^^^
12+
13+
error: aborting due to 2 previous errors
14+

0 commit comments

Comments
 (0)