| //@ add-minicore | |
| //@ revisions: bpfel bpfeb | |
| //@[bpfel] compile-flags: --target=bpfel-unknown-none | |
| //@[bpfeb] compile-flags: --target=bpfeb-unknown-none | |
| //@ needs-llvm-components: bpf | |
| //@ compile-flags: -Copt-level=3 -Cno-prepopulate-passes | |
| //@ min-llvm-version: 23 | |
| #![feature(no_core)] | |
| #![no_core] | |
| #![crate_type = "lib"] | |
| extern crate minicore; | |
| use minicore::*; | |
| #[repr(C)] | |
| struct T1 {} | |
| #[repr(C)] | |
| struct T2 { | |
| a: i32, | |
| } | |
| impl Copy for T2 {} | |
| #[repr(C)] | |
| struct T3 { | |
| a: i32, | |
| b: i64, | |
| } | |
| #[repr(C)] | |
| struct T4 { | |
| a: i64, | |
| b: i64, | |
| c: i64, | |
| } | |
| #[repr(C)] | |
| struct T5 { | |
| a: i8, | |
| } | |
| #[repr(C)] | |
| union U1 { | |
| a: i32, | |
| b: i64, | |
| } | |
| // CHECK: define{{.*}} void @foo1() | |
| #[no_mangle] | |
| extern "C" fn foo1() -> T1 { | |
| T1 {} | |
| } | |
| // CHECK: define{{.*}} i32 @foo2() | |
| #[no_mangle] | |
| extern "C" fn foo2() -> T2 { | |
| T2 { a: 0 } | |
| } | |
| // CHECK: define{{.*}} [2 x i64] @foo3() | |
| #[no_mangle] | |
| extern "C" fn foo3() -> T3 { | |
| T3 { a: 0, b: 0 } | |
| } | |
| // CHECK: define{{.*}} void @foo4(ptr{{.*}}sret([24 x i8]){{.*}}align 8 | |
| #[no_mangle] | |
| extern "C" fn foo4() -> T4 { | |
| T4 { a: 0, b: 0, c: 0 } | |
| } | |
| // CHECK: define{{.*}} i8 @foo5() | |
| #[no_mangle] | |
| extern "C" fn foo5() -> T5 { | |
| T5 { a: 0 } | |
| } | |
| // CHECK: define{{.*}} i64 @foou() | |
| #[no_mangle] | |
| extern "C" fn foou() -> U1 { | |
| U1 { b: 0 } | |
| } | |
| // CHECK-LABEL: define{{.*}} i32 @bar() | |
| // CHECK: %[[C2:.*]] = call i32 @foo2() | |
| // CHECK: store i32 %[[C2]] | |
| // CHECK: %[[C3:.*]] = call [2 x i64] @foo3() | |
| // CHECK: store [2 x i64] %[[C3]] | |
| #[no_mangle] | |
| extern "C" fn bar() -> i32 { | |
| let a = foo2(); | |
| let b = foo3(); | |
| hint::black_box((a, b)); | |
| a.a | |
| } |