| //@ add-minicore | |
| //@ revisions:x86-linux x86-darwin | |
| //@[x86-linux] compile-flags: --target i686-unknown-linux-gnu | |
| //@[x86-linux] needs-llvm-components: x86 | |
| //@[x86-darwin] compile-flags: --target i686-apple-darwin | |
| //@[x86-darwin] needs-llvm-components: x86 | |
| // Tests that aggregates containing vector types get their alignment increased to 16 on Darwin. | |
| #![feature(no_core, simd_ffi)] | |
| #![crate_type = "lib"] | |
| #![no_std] | |
| #![no_core] | |
| #![allow(non_camel_case_types)] | |
| extern crate minicore; | |
| use minicore::simd::i32x4; | |
| use minicore::*; | |
| #[repr(C)] | |
| pub struct Foo { | |
| a: i32x4, | |
| b: i8, | |
| } | |
| // This tests that we recursively check for vector types, not just at the top level. | |
| #[repr(C)] | |
| pub struct DoubleFoo { | |
| one: Foo, | |
| two: Foo, | |
| } | |
| extern "C" { | |
| // x86-linux: declare void @f({{.*}}byval([32 x i8]) align 4{{.*}}) | |
| // x86-darwin: declare void @f({{.*}}byval([32 x i8]) align 16{{.*}}) | |
| fn f(foo: Foo); | |
| // x86-linux: declare void @g({{.*}}byval([64 x i8]) align 4{{.*}}) | |
| // x86-darwin: declare void @g({{.*}}byval([64 x i8]) align 16{{.*}}) | |
| fn g(foo: DoubleFoo); | |
| } | |
| pub fn main() { | |
| unsafe { f(Foo { a: i32x4::from_array([1, 2, 3, 4]), b: 0 }) } | |
| unsafe { | |
| g(DoubleFoo { | |
| one: Foo { a: i32x4::from_array([1, 2, 3, 4]), b: 0 }, | |
| two: Foo { a: i32x4::from_array([1, 2, 3, 4]), b: 0 }, | |
| }) | |
| } | |
| } |