rustc_target/callconv/
bpf.rs

1// see https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/BPF/BPFCallingConv.td
2use crate::callconv::{ArgAbi, FnAbi};
3
4fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
5    if ret.layout.is_aggregate() || ret.layout.size.bits() > 64 {
6        ret.make_indirect();
7    } else {
8        ret.extend_integer_width_to(32);
9    }
10}
11
12fn classify_arg<Ty>(arg: &mut ArgAbi<'_, Ty>) {
13    if arg.layout.is_aggregate() || arg.layout.size.bits() > 64 {
14        arg.make_indirect();
15    } else {
16        arg.extend_integer_width_to(32);
17    }
18}
19
20pub(crate) fn compute_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) {
21    if !fn_abi.ret.is_ignore() {
22        classify_ret(&mut fn_abi.ret);
23    }
24
25    for arg in fn_abi.args.iter_mut() {
26        if arg.is_ignore() {
27            continue;
28        }
29        classify_arg(arg);
30    }
31}