From 88e4d2c2918428d55e34cd57c11279ea839c8822 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Sun, 19 Nov 2017 12:13:24 +0200 Subject: [PATCH] rustc_trans: work around i686-pc-windows-msvc byval align LLVM bug. --- src/librustc_trans/abi.rs | 4 +++- src/test/codegen/function-arguments.rs | 4 ++-- src/test/codegen/packed.rs | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/librustc_trans/abi.rs b/src/librustc_trans/abi.rs index 7ef89597b11ca..0bf6e84337b22 100644 --- a/src/librustc_trans/abi.rs +++ b/src/librustc_trans/abi.rs @@ -491,7 +491,9 @@ impl<'a, 'tcx> ArgType<'tcx> { .set(ArgAttribute::NoCapture) .set(ArgAttribute::NonNull); attrs.pointee_size = self.layout.size; - attrs.pointee_align = Some(self.layout.align); + // FIXME(eddyb) We should be doing this, but at least on + // i686-pc-windows-msvc, it results in wrong stack offsets. + // attrs.pointee_align = Some(self.layout.align); self.mode = PassMode::Indirect(attrs); } diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index f96c104b265f9..f8945a6ee8d93 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -66,7 +66,7 @@ pub fn mutable_unsafe_borrow(_: &mut UnsafeInner) { pub fn mutable_borrow(_: &mut i32) { } -// CHECK: @indirect_struct(%S* noalias nocapture align 4 dereferenceable(32) %arg0) +// CHECK: @indirect_struct(%S* noalias nocapture dereferenceable(32) %arg0) #[no_mangle] pub fn indirect_struct(_: S) { } @@ -83,7 +83,7 @@ pub fn _box(x: Box) -> Box { x } -// CHECK: @struct_return(%S* noalias nocapture sret align 4 dereferenceable(32)) +// CHECK: @struct_return(%S* noalias nocapture sret dereferenceable(32)) #[no_mangle] pub fn struct_return() -> S { S { diff --git a/src/test/codegen/packed.rs b/src/test/codegen/packed.rs index 64e842b026e24..dd530cf03cd41 100644 --- a/src/test/codegen/packed.rs +++ b/src/test/codegen/packed.rs @@ -39,7 +39,7 @@ pub struct BigPacked { #[no_mangle] pub fn call_pkd(f: fn() -> Array) -> BigPacked { // CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array -// CHECK: call void %{{.*}}(%Array* noalias nocapture sret align 4 dereferenceable(32) [[ALLOCA]]) +// CHECK: call void %{{.*}}(%Array* noalias nocapture sret dereferenceable(32) [[ALLOCA]]) // CHECK: call void @llvm.memcpy.{{.*}}(i8* %{{.*}}, i8* %{{.*}}, i{{[0-9]+}} 32, i32 1, i1 false) // check that calls whose destination is a field of a packed struct // go through an alloca rather than calling the function with an