Fix stack alignment problem on s390x
This commit is contained in:
parent
c7a50c2636
commit
b03b41420b
@ -1,26 +0,0 @@
|
|||||||
From dd82e95c9de212524e14fc60155de1ae40156dfc Mon Sep 17 00:00:00 2001
|
|
||||||
From: bjorn3 <bjorn3@users.noreply.github.com>
|
|
||||||
Date: Sun, 24 Nov 2019 15:34:06 +0100
|
|
||||||
Subject: [PATCH] [core] Ignore failing tests
|
|
||||||
|
|
||||||
---
|
|
||||||
library/core/tests/iter.rs | 4 ++++
|
|
||||||
library/core/tests/num/bignum.rs | 10 ++++++++++
|
|
||||||
library/core/tests/num/mod.rs | 5 +++--
|
|
||||||
library/core/tests/time.rs | 1 +
|
|
||||||
4 files changed, 18 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/atomic.rs b/atomic.rs
|
|
||||||
index 13b12db..96fe4b9 100644
|
|
||||||
--- a/atomic.rs
|
|
||||||
+++ b/atomic.rs
|
|
||||||
@@ -185,6 +185,7 @@ fn ptr_bitops() {
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
+#[cfg_attr(target_arch = "s390x", ignore)] // s390x backend doesn't support stack alignment >8 bytes
|
|
||||||
#[cfg(any(not(target_arch = "arm"), target_os = "linux"))] // Missing intrinsic in compiler-builtins
|
|
||||||
fn ptr_bitops_tagging() {
|
|
||||||
#[repr(align(16))]
|
|
||||||
--
|
|
||||||
2.21.0 (Apple Git-122)
|
|
@ -388,18 +388,25 @@ pub(crate) fn get_local_place(&mut self, local: Local) -> CPlace<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn create_stack_slot(&mut self, size: u32, align: u32) -> Pointer {
|
pub(crate) fn create_stack_slot(&mut self, size: u32, align: u32) -> Pointer {
|
||||||
if align <= 16 {
|
let abi_align = if self.tcx.sess.target.arch == "s390x" { 8 } else { 16 };
|
||||||
|
if align <= abi_align {
|
||||||
let stack_slot = self.bcx.create_sized_stack_slot(StackSlotData {
|
let stack_slot = self.bcx.create_sized_stack_slot(StackSlotData {
|
||||||
kind: StackSlotKind::ExplicitSlot,
|
kind: StackSlotKind::ExplicitSlot,
|
||||||
// FIXME Don't force the size to a multiple of 16 bytes once Cranelift gets a way to
|
// FIXME Don't force the size to a multiple of <abi_align> bytes once Cranelift gets
|
||||||
// specify stack slot alignment.
|
// a way to specify stack slot alignment.
|
||||||
size: (size + 15) / 16 * 16,
|
size: (size + abi_align - 1) / abi_align * abi_align,
|
||||||
});
|
});
|
||||||
Pointer::stack_slot(stack_slot)
|
Pointer::stack_slot(stack_slot)
|
||||||
} else {
|
} else {
|
||||||
// Alignment is too big to handle using the above hack. Dynamically realign a stack slot
|
// Alignment is too big to handle using the above hack. Dynamically realign a stack slot
|
||||||
// instead. This wastes some space for the realignment.
|
// instead. This wastes some space for the realignment.
|
||||||
let base_ptr = self.create_stack_slot(size + align, 16).get_addr(self);
|
let stack_slot = self.bcx.create_sized_stack_slot(StackSlotData {
|
||||||
|
kind: StackSlotKind::ExplicitSlot,
|
||||||
|
// FIXME Don't force the size to a multiple of <abi_align> bytes once Cranelift gets
|
||||||
|
// a way to specify stack slot alignment.
|
||||||
|
size: (size + align) / abi_align * abi_align,
|
||||||
|
});
|
||||||
|
let base_ptr = self.bcx.ins().stack_addr(self.pointer_type, stack_slot, 0);
|
||||||
let misalign_offset = self.bcx.ins().urem_imm(base_ptr, i64::from(align));
|
let misalign_offset = self.bcx.ins().urem_imm(base_ptr, i64::from(align));
|
||||||
let realign_offset = self.bcx.ins().irsub_imm(misalign_offset, i64::from(align));
|
let realign_offset = self.bcx.ins().irsub_imm(misalign_offset, i64::from(align));
|
||||||
Pointer::new(self.bcx.ins().iadd(base_ptr, realign_offset))
|
Pointer::new(self.bcx.ins().iadd(base_ptr, realign_offset))
|
||||||
|
Loading…
Reference in New Issue
Block a user