| // Test that structs aligned to 128 bits are passed with the correct ABI on powerpc64le. |
| // This is similar to aarch64-struct-align-128.rs, but for ppc. |
| |
| //@ compile-flags: --target powerpc64le-unknown-linux-gnu |
| //@ needs-llvm-components: powerpc |
| |
| #![feature(no_core, lang_items)] |
| #![crate_type = "lib"] |
| #![no_core] |
| |
| #[lang = "sized"] |
| trait Sized {} |
| #[lang = "freeze"] |
| trait Freeze {} |
| #[lang = "copy"] |
| trait Copy {} |
| |
| #[repr(C)] |
| pub struct Align8 { |
| pub a: u64, |
| pub b: u64, |
| } |
| |
| #[repr(transparent)] |
| pub struct Transparent8 { |
| a: Align8, |
| } |
| |
| #[repr(C)] |
| pub struct Wrapped8 { |
| a: Align8, |
| } |
| |
| extern "C" { |
| // CHECK: declare void @test_8([2 x i64], [2 x i64], [2 x i64]) |
| fn test_8(a: Align8, b: Transparent8, c: Wrapped8); |
| } |
| |
| #[repr(C)] |
| #[repr(align(16))] |
| pub struct Align16 { |
| pub a: u64, |
| pub b: u64, |
| } |
| |
| #[repr(transparent)] |
| pub struct Transparent16 { |
| a: Align16, |
| } |
| |
| #[repr(C)] |
| pub struct Wrapped16 { |
| pub a: Align16, |
| } |
| |
| extern "C" { |
| // It's important that this produces [1 x i128] rather than just i128! |
| // CHECK: declare void @test_16([1 x i128], [1 x i128], [1 x i128]) |
| fn test_16(a: Align16, b: Transparent16, c: Wrapped16); |
| } |
| |
| #[repr(C)] |
| #[repr(align(32))] |
| pub struct Align32 { |
| pub a: u64, |
| pub b: u64, |
| pub c: u64, |
| } |
| |
| #[repr(transparent)] |
| pub struct Transparent32 { |
| a: Align32, |
| } |
| |
| #[repr(C)] |
| pub struct Wrapped32 { |
| pub a: Align32, |
| } |
| |
| extern "C" { |
| // CHECK: declare void @test_32([2 x i128], [2 x i128], [2 x i128]) |
| fn test_32(a: Align32, b: Transparent32, c: Wrapped32); |
| } |
| |
| pub unsafe fn main( |
| a1: Align8, |
| a2: Transparent8, |
| a3: Wrapped8, |
| b1: Align16, |
| b2: Transparent16, |
| b3: Wrapped16, |
| c1: Align32, |
| c2: Transparent32, |
| c3: Wrapped32, |
| ) { |
| test_8(a1, a2, a3); |
| test_16(b1, b2, b3); |
| test_32(c1, c2, c3); |
| } |