]> git.lizzy.rs Git - rust.git/commitdiff
Fix crash when struct argument size is not a multiple of the pointer size
authorbjorn3 <bjorn3@users.noreply.github.com>
Wed, 15 Dec 2021 15:53:35 +0000 (16:53 +0100)
committerbjorn3 <bjorn3@users.noreply.github.com>
Wed, 15 Dec 2021 15:53:35 +0000 (16:53 +0100)
Fixes #1200

src/abi/pass_mode.rs

index c01ed24990428f3d8bb8f4206ba0c51e58dd5605..9f0bd31e95fcc47a162066fd13c4127f61137305 100644 (file)
@@ -117,7 +117,9 @@ impl<'tcx> ArgAbiExt<'tcx> for ArgAbi<'tcx, Ty<'tcx>> {
             PassMode::Cast(cast) => cast_target_to_abi_params(cast),
             PassMode::Indirect { attrs, extra_attrs: None, on_stack } => {
                 if on_stack {
-                    let size = u32::try_from(self.layout.size.bytes()).unwrap();
+                    // Abi requires aligning struct size to pointer size
+                    let size = self.layout.size.align_to(tcx.data_layout.pointer_align.abi);
+                    let size = u32::try_from(size.bytes()).unwrap();
                     smallvec![apply_arg_attrs_to_abi_param(
                         AbiParam::special(pointer_ty(tcx), ArgumentPurpose::StructArgument(size),),
                         attrs