Skip to content

Commit

Permalink
Unrolled build for rust-lang#136194
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#136194 - taiki-e:bpf-clobber-abi, r=amanieu

Support clobber_abi in BPF inline assembly

This supports [`clobber_abi`](https://doc.rust-lang.org/nightly/reference/inline-assembly.html#abi-clobbers) which is one of the requirements of stabilization mentioned in the tracking Issue for `asm_experimental_arch` (rust-lang#93335).

Refs: [Section 1.1 "Registers and calling convention" in BPF ABI Recommended Conventions and Guidelines v1.0](https://github.com/torvalds/linux/blob/v6.13/Documentation/bpf/standardization/abi.rst#11registers-and-calling-convention)
> R0 - R5 are scratch registers and BPF programs needs to spill/fill them if necessary across calls.

cc `@alessandrod` `@dave-tucker` `@tamird` `@vadorovsky` (target maintainers mentioned in platform support document which will be added by rust-lang#135107)

r? `@Amanieu`

`@rustbot` label +O-eBPF +A-inline-assembly
  • Loading branch information
rust-timer authored Jan 31, 2025
2 parents aa4cfd0 + e586382 commit 8a8fc0f
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
13 changes: 13 additions & 0 deletions compiler/rustc_target/src/asm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -934,6 +934,7 @@ pub enum InlineAsmClobberAbi {
LoongArch,
PowerPC,
S390x,
Bpf,
Msp430,
}

Expand Down Expand Up @@ -1003,6 +1004,10 @@ impl InlineAsmClobberAbi {
"C" | "system" => Ok(InlineAsmClobberAbi::S390x),
_ => Err(&["C", "system"]),
},
InlineAsmArch::Bpf => match name {
"C" | "system" => Ok(InlineAsmClobberAbi::Bpf),
_ => Err(&["C", "system"]),
},
InlineAsmArch::Msp430 => match name {
"C" | "system" => Ok(InlineAsmClobberAbi::Msp430),
_ => Err(&["C", "system"]),
Expand Down Expand Up @@ -1278,6 +1283,14 @@ impl InlineAsmClobberAbi {
a8, a9, a10, a11, a12, a13, a14, a15,
}
},
InlineAsmClobberAbi::Bpf => clobbered_regs! {
Bpf BpfInlineAsmReg {
// Refs: Section 1.1 "Registers and calling convention" in BPF ABI Recommended Conventions and Guidelines v1.0
// https://www.kernel.org/doc/html/latest/bpf/standardization/abi.html#registers-and-calling-convention

r0, r1, r2, r3, r4, r5,
}
},
InlineAsmClobberAbi::Msp430 => clobbered_regs! {
Msp430 Msp430InlineAsmReg {
r11, r12, r13, r14, r15,
Expand Down
31 changes: 31 additions & 0 deletions tests/codegen/asm/bpf-clobbers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//@ add-core-stubs
//@ compile-flags: --target bpfel-unknown-none
//@ needs-llvm-components: bpf

#![crate_type = "rlib"]
#![feature(no_core, asm_experimental_arch)]
#![no_core]

extern crate minicore;
use minicore::*;

// CHECK-LABEL: @flags_clobber
// CHECK: call void asm sideeffect "", ""()
#[no_mangle]
pub unsafe fn flags_clobber() {
asm!("", options(nostack, nomem));
}

// CHECK-LABEL: @no_clobber
// CHECK: call void asm sideeffect "", ""()
#[no_mangle]
pub unsafe fn no_clobber() {
asm!("", options(nostack, nomem, preserves_flags));
}

// CHECK-LABEL: @clobber_abi
// CHECK: asm sideeffect "", "={r0},={r1},={r2},={r3},={r4},={r5}"()
#[no_mangle]
pub unsafe fn clobber_abi() {
asm!("", clobber_abi("C"), options(nostack, nomem, preserves_flags));
}

0 comments on commit 8a8fc0f

Please sign in to comment.