about summary refs log tree commit diff
path: root/tests/codegen
diff options
context:
space:
mode:
authorErik Desjardins <erikdesjardins@users.noreply.github.com>2023-05-20 15:32:37 -0400
committerErik Desjardins <erikdesjardins@users.noreply.github.com>2023-07-10 19:19:37 -0400
commit8ec90f6f14a5c2c8cc454e78f87b7fc6347fe2f8 (patch)
tree787c9f2bc88aa8954ebf5c984852fb56cf4ad50c /tests/codegen
parent08d18929fbd343cd46e8a8216c0c8d67f9763216 (diff)
downloadrust-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.rs72
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);
 }