rustc_target/callconv/
bpf.rs

1// see https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/BPF/BPFCallingConv.td
2use rustc_abi::TyAbiInterface;
3
4use crate::callconv::{ArgAbi, FnAbi};
5
6fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
7    if ret.layout.is_aggregate() || ret.layout.size.bits() > 64 {
8        ret.make_indirect();
9    } else {
10        ret.extend_integer_width_to(32);
11    }
12}
13
14fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'a, Ty>)
15where
16    Ty: TyAbiInterface<'a, C> + Copy,
17{
18    if arg.layout.pass_indirectly_in_non_rustic_abis(cx) {
19        arg.make_indirect();
20        return;
21    }
22    if arg.layout.is_aggregate() || arg.layout.size.bits() > 64 {
23        arg.make_indirect();
24    } else {
25        arg.extend_integer_width_to(32);
26    }
27}
28
29pub(crate) fn compute_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'a, Ty>)
30where
31    Ty: TyAbiInterface<'a, C> + Copy,
32{
33    if !fn_abi.ret.is_ignore() {
34        classify_ret(&mut fn_abi.ret);
35    }
36
37    for arg in fn_abi.args.iter_mut() {
38        if arg.is_ignore() {
39            continue;
40        }
41        classify_arg(cx, arg);
42    }
43}
44
45pub(crate) fn compute_rust_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) {
46    if !fn_abi.ret.is_ignore() {
47        classify_ret(&mut fn_abi.ret);
48    }
49}