1 // compile-flags: --target riscv64gc-unknown-linux-gnu -C no-prepopulate-passes
2 // needs-llvm-components: riscv
6 #![feature(no_core, lang_items)]
7 #![allow(improper_ctypes)]
14 // CHECK: define void @f_void()
16 pub extern "C" fn f_void() {}
18 // CHECK: define noundef zeroext i1 @f_scalar_0(i1 noundef zeroext %a)
20 pub extern "C" fn f_scalar_0(a
: bool
) -> bool
{
24 // CHECK: define signext i8 @f_scalar_1(i8 signext %x)
26 pub extern "C" fn f_scalar_1(x
: i8) -> i8 {
30 // CHECK: define zeroext i8 @f_scalar_2(i8 zeroext %x)
32 pub extern "C" fn f_scalar_2(x
: u8) -> u8 {
36 // CHECK: define signext i32 @f_scalar_3(i32 signext %x)
38 pub extern "C" fn f_scalar_3(x
: i32) -> u32 {
42 // CHECK: define i64 @f_scalar_4(i64 %x)
44 pub extern "C" fn f_scalar_4(x
: i64) -> i64 {
48 // CHECK: define float @f_fp_scalar_1(float %0)
50 pub extern "C" fn f_fp_scalar_1(x
: f32) -> f32 {
53 // CHECK: define double @f_fp_scalar_2(double %0)
55 pub extern "C" fn f_fp_scalar_2(x
: f64) -> f64 {
62 // CHECK: define void @f_agg_empty_struct()
64 pub extern "C" fn f_agg_empty_struct(e
: Empty
) -> Empty
{
76 // CHECK: define void @f_agg_tiny(i64 %0)
78 pub extern "C" fn f_agg_tiny(mut e
: Tiny
) {
81 // CHECK: define i64 @f_agg_tiny_ret()
83 pub extern "C" fn f_agg_tiny_ret() -> Tiny
{
84 Tiny { a: 1, b: 2, c: 3, d: 4 }
93 // CHECK: define void @f_agg_small([2 x i64] %0)
95 pub extern "C" fn f_agg_small(mut x
: Small
) {
98 // CHECK: define [2 x i64] @f_agg_small_ret()
100 pub extern "C" fn f_agg_small_ret() -> Small
{
101 Small { a: 1, b: 0 as *mut _ }
105 pub struct SmallAligned
{
109 // CHECK: define void @f_agg_small_aligned(i128 %0)
111 pub extern "C" fn f_agg_small_aligned(mut x
: SmallAligned
) {
122 // CHECK: define void @f_agg_large(%Large* {{.*}}%x)
124 pub extern "C" fn f_agg_large(mut x
: Large
) {
127 // CHECK: define void @f_agg_large_ret(%Large* {{.*}}sret{{.*}}, i32 signext %i, i8 signext %j)
129 pub extern "C" fn f_agg_large_ret(i
: i32, j
: i8) -> Large
{
130 Large { a: 1, b: 2, c: 3, d: 4 }
133 // CHECK: define void @f_scalar_stack_1(i64 %0, [2 x i64] %1, i128 %2, %Large* {{.*}}%d, i8 zeroext %e, i8 signext %f, i8 %g, i8 %h)
135 pub extern "C" fn f_scalar_stack_1(
147 // CHECK: define void @f_scalar_stack_2(%Large* {{.*}}sret{{.*}} %0, i64 %a, i128 %1, i128 %2, i64 %d, i8 zeroext %e, i8 %f, i8 %g)
149 pub extern "C" fn f_scalar_stack_2(
158 Large { a: a as i64, b: e as i64, c: f as i64, d: g as i64 }
162 fn f_va_callee(_
: i32, ...) -> i32;
166 pub unsafe extern "C" fn f_va_caller() {
167 // CHECK: call signext i32 (i32, ...) @f_va_callee(i32 signext 1, i32 signext 2, i64 3, double {{.*}}, double {{.*}}, i64 {{.*}}, [2 x i64] {{.*}}, i128 {{.*}}, %Large* {{.*}})
174 Tiny { a: 1, b: 2, c: 3, d: 4 }
,
175 Small { a: 10, b: 0 as *mut _ }
,
176 SmallAligned { a: 11 }
,
177 Large { a: 12, b: 13, c: 14, d: 15 }
,
179 // CHECK: call signext i32 (i32, ...) @f_va_callee(i32 signext 1, i32 signext 2, i32 signext 3, i32 signext 4, i128 {{.*}}, i32 signext 6, i32 signext 7, i32 8, i32 9)
180 f_va_callee(1, 2i32, 3i32, 4i32, SmallAligned { a: 5 }
, 6i32, 7i32, 8i32, 9i32);