diff options
| author | Erik Desjardins <erikdesjardins@users.noreply.github.com> | 2023-05-20 15:32:37 -0400 |
|---|---|---|
| committer | Erik Desjardins <erikdesjardins@users.noreply.github.com> | 2023-07-10 19:19:37 -0400 |
| commit | 8ec90f6f14a5c2c8cc454e78f87b7fc6347fe2f8 (patch) | |
| tree | 787c9f2bc88aa8954ebf5c984852fb56cf4ad50c /tests/codegen | |
| parent | 08d18929fbd343cd46e8a8216c0c8d67f9763216 (diff) | |
| download | rust-8ec90f6f14a5c2c8cc454e78f87b7fc6347fe2f8.tar.gz rust-8ec90f6f14a5c2c8cc454e78f87b7fc6347fe2f8.zip | |
align-byval test: add cases distinguishing natural vs forced/requested alignment
Diffstat (limited to 'tests/codegen')
| -rw-r--r-- | tests/codegen/align-byval.rs | 72 |
1 files changed, 62 insertions, 10 deletions
diff --git a/tests/codegen/align-byval.rs b/tests/codegen/align-byval.rs index 1470e7bf782..10ded42bd66 100644 --- a/tests/codegen/align-byval.rs +++ b/tests/codegen/align-byval.rs @@ -29,32 +29,84 @@ impl Copy for i32 {} impl Copy for i64 {} +// on i686-windows, this should be passed on stack using `byval` +#[repr(C)] +pub struct NaturalAlign8 { + a: i64, + b: i64, + c: i64 +} + +// on i686-windows, this should be passed by reference (because the alignment is requested/forced), +// even though it has the exact same layout as `NaturalAlign8` (!!!) +#[repr(C)] +#[repr(align(8))] +pub struct ForceAlign8 { + a: i64, + b: i64, + c: i64 +} + #[repr(C)] #[repr(align(16))] -struct Foo { +pub struct ForceAlign16 { a: [i32; 16], b: i8 } extern "C" { - // m68k: declare void @f({{.*}}byval(%Foo) align 16{{.*}}) + // m68k: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 4{{.*}}) + + // wasm: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 8{{.*}}) + + // x86_64-linux: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 8{{.*}}) + + // x86_64-windows: declare void @natural_align_8( + // x86_64-windows-NOT: byval + // x86_64-windows-SAME: align 8{{.*}}) + + // i686-linux: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 4{{.*}}) + + // i686-windows: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 4{{.*}}) + fn natural_align_8(x: NaturalAlign8); + + // m68k: declare void @force_align_8({{.*}}byval(%ForceAlign8) align 8{{.*}}) + + // wasm: declare void @force_align_8({{.*}}byval(%ForceAlign8) align 8{{.*}}) + + // x86_64-linux: declare void @force_align_8({{.*}}byval(%ForceAlign8) align 8{{.*}}) + + // x86_64-windows: declare void @force_align_8( + // x86_64-windows-NOT: byval + // x86_64-windows-SAME: align 8{{.*}}) + + // i686-linux: declare void @force_align_8({{.*}}byval(%ForceAlign8) align 4{{.*}}) + + // i686-windows: declare void @force_align_8( + // i686-windows-NOT: byval + // i686-windows-SAME: align 8{{.*}}) + fn force_align_8(y: ForceAlign8); + + // m68k: declare void @force_align_16({{.*}}byval(%ForceAlign16) align 16{{.*}}) - // wasm: declare void @f({{.*}}byval(%Foo) align 16{{.*}}) + // wasm: declare void @force_align_16({{.*}}byval(%ForceAlign16) align 16{{.*}}) - // x86_64-linux: declare void @f({{.*}}byval(%Foo) align 16{{.*}}) + // x86_64-linux: declare void @force_align_16({{.*}}byval(%ForceAlign16) align 16{{.*}}) - // x86_64-windows: declare void @f( + // x86_64-windows: declare void @force_align_16( // x86_64-windows-NOT: byval // x86_64-windows-SAME: align 16{{.*}}) - // i686-linux: declare void @f({{.*}}byval(%Foo) align 4{{.*}}) + // i686-linux: declare void @force_align_16({{.*}}byval(%ForceAlign16) align 4{{.*}}) - // i686-windows: declare void @f( + // i686-windows: declare void @force_align_16( // i686-windows-NOT: byval // i686-windows-SAME: align 16{{.*}}) - fn f(foo: Foo); + fn force_align_16(z: ForceAlign16); } -pub fn main() { - unsafe { f(Foo { a: [1; 16], b: 2 }) } +pub unsafe fn main(x: NaturalAlign8, y: ForceAlign8, z: ForceAlign16) { + natural_align_8(x); + force_align_8(y); + force_align_16(z); } |
