Skip to content

Commit ec0382e

Browse files
committed
BPF: add assembly test
1 parent 6b27795 commit ec0382e

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

src/test/assembly/asm/bpf-types.rs

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
// min-llvm-version: 10.0.1
2+
// assembly-output: emit-asm
3+
// compile-flags: --target bpfel-unknown-none -C target_feature=+alu32
4+
// needs-llvm-components: bpf
5+
6+
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
7+
#![crate_type = "rlib"]
8+
#![no_core]
9+
#![allow(asm_sub_register, non_camel_case_types)]
10+
11+
#[rustc_builtin_macro]
12+
macro_rules! asm {
13+
() => {};
14+
}
15+
#[rustc_builtin_macro]
16+
macro_rules! concat {
17+
() => {};
18+
}
19+
#[rustc_builtin_macro]
20+
macro_rules! stringify {
21+
() => {};
22+
}
23+
24+
#[lang = "sized"]
25+
trait Sized {}
26+
#[lang = "copy"]
27+
trait Copy {}
28+
29+
type ptr = *const u64;
30+
31+
impl Copy for i8 {}
32+
impl Copy for i16 {}
33+
impl Copy for i32 {}
34+
impl Copy for i64 {}
35+
impl Copy for ptr {}
36+
37+
macro_rules! check {
38+
($func:ident $ty:ident $class:ident) => {
39+
#[no_mangle]
40+
pub unsafe fn $func(x: $ty) -> $ty {
41+
let y;
42+
asm!("{} = {}", out($class) y, in($class) x);
43+
y
44+
}
45+
};
46+
}
47+
48+
macro_rules! check_reg {
49+
($func:ident $ty:ident $reg:tt) => {
50+
#[no_mangle]
51+
pub unsafe fn $func(x: $ty) -> $ty {
52+
let y;
53+
asm!(concat!($reg, " = ", $reg), lateout($reg) y, in($reg) x);
54+
y
55+
}
56+
};
57+
}
58+
59+
extern "C" {
60+
fn extern_func();
61+
}
62+
63+
// CHECK-LABEL: sym_fn
64+
// CHECK: #APP
65+
// CHECK: call extern_func
66+
// CHECK: #NO_APP
67+
#[no_mangle]
68+
pub unsafe fn sym_fn() {
69+
asm!("call {}", sym extern_func);
70+
}
71+
72+
// CHECK-LABEL: reg_i8:
73+
// CHECK: #APP
74+
// CHECK: r{{[0-9]+}} = r{{[0-9]+}}
75+
// CHECK: #NO_APP
76+
check!(reg_i8 i8 reg);
77+
78+
// CHECK-LABEL: reg_i16:
79+
// CHECK: #APP
80+
// CHECK: r{{[0-9]+}} = r{{[0-9]+}}
81+
// CHECK: #NO_APP
82+
check!(reg_i16 i16 reg);
83+
84+
// CHECK-LABEL: reg_i32:
85+
// CHECK: #APP
86+
// CHECK: r{{[0-9]+}} = r{{[0-9]+}}
87+
// CHECK: #NO_APP
88+
check!(reg_i32 i32 reg);
89+
90+
// CHECK-LABEL: reg_i64:
91+
// CHECK: #APP
92+
// CHECK: r{{[0-9]+}} = r{{[0-9]+}}
93+
// CHECK: #NO_APP
94+
check!(reg_i64 i64 reg);
95+
96+
// CHECK-LABEL: wreg_i8:
97+
// CHECK: #APP
98+
// CHECK: w{{[0-9]+}} = w{{[0-9]+}}
99+
// CHECK: #NO_APP
100+
check!(wreg_i8 i8 wreg);
101+
102+
// CHECK-LABEL: wreg_i16:
103+
// CHECK: #APP
104+
// CHECK: w{{[0-9]+}} = w{{[0-9]+}}
105+
// CHECK: #NO_APP
106+
check!(wreg_i16 i16 wreg);
107+
108+
// CHECK-LABEL: wreg_i32:
109+
// CHECK: #APP
110+
// CHECK: w{{[0-9]+}} = w{{[0-9]+}}
111+
// CHECK: #NO_APP
112+
check!(wreg_i32 i32 wreg);
113+
114+
// CHECK-LABEL: r0_i8:
115+
// CHECK: #APP
116+
// CHECK: r0 = r0
117+
// CHECK: #NO_APP
118+
check_reg!(r0_i8 i8 "r0");
119+
120+
// CHECK-LABEL: r0_i16:
121+
// CHECK: #APP
122+
// CHECK: r0 = r0
123+
// CHECK: #NO_APP
124+
check_reg!(r0_i16 i16 "r0");
125+
126+
// CHECK-LABEL: r0_i32:
127+
// CHECK: #APP
128+
// CHECK: r0 = r0
129+
// CHECK: #NO_APP
130+
check_reg!(r0_i32 i32 "r0");
131+
132+
// CHECK-LABEL: r0_i64:
133+
// CHECK: #APP
134+
// CHECK: r0 = r0
135+
// CHECK: #NO_APP
136+
check_reg!(r0_i64 i64 "r0");
137+
138+
// CHECK-LABEL: w0_i8:
139+
// CHECK: #APP
140+
// CHECK: w0 = w0
141+
// CHECK: #NO_APP
142+
check_reg!(w0_i8 i8 "w0");
143+
144+
// CHECK-LABEL: w0_i16:
145+
// CHECK: #APP
146+
// CHECK: w0 = w0
147+
// CHECK: #NO_APP
148+
check_reg!(w0_i16 i16 "w0");
149+
150+
// CHECK-LABEL: w0_i32:
151+
// CHECK: #APP
152+
// CHECK: w0 = w0
153+
// CHECK: #NO_APP
154+
check_reg!(w0_i32 i32 "w0");

0 commit comments

Comments
 (0)