Skip to content

Commit c87f1ba

Browse files
committed
const eval: respect target.min_global_align
1 parent 845b15d commit c87f1ba

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

compiler/rustc_const_eval/src/interpret/memory.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
894894
// # Global allocations
895895
if let Some(global_alloc) = self.tcx.try_get_global_alloc(id) {
896896
let (size, align) = global_alloc.size_and_align(*self.tcx, self.typing_env);
897+
let align = Ord::max(align, self.tcx.sess.target.min_global_align);
897898
let mutbl = global_alloc.mutability(*self.tcx, self.typing_env);
898899
let kind = match global_alloc {
899900
GlobalAlloc::Static { .. } | GlobalAlloc::Memory { .. } => AllocKind::LiveData,
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Test that miri respects the `target.min_global_align` value for the target.
2+
// E.g. on s390x, statics have, in practice, a minimum alignment of 2.
3+
4+
static T0: bool = true;
5+
static T1: bool = true;
6+
static T2: bool = true;
7+
static T3: bool = true;
8+
static T4: bool = true;
9+
static T5: bool = true;
10+
static T6: bool = true;
11+
static T7: bool = true;
12+
static T8: bool = true;
13+
static T9: bool = true;
14+
15+
static F0: bool = false;
16+
static F1: bool = false;
17+
static F2: bool = false;
18+
static F3: bool = false;
19+
static F4: bool = false;
20+
static F5: bool = false;
21+
static F6: bool = false;
22+
static F7: bool = false;
23+
static F8: bool = false;
24+
static F9: bool = false;
25+
26+
fn main() {
27+
let min_align = if cfg!(target_arch = "s390x") { 2 } else { 1 };
28+
29+
assert!(((&T0) as *const _ as usize).is_multiple_of(min_align));
30+
assert!(((&T1) as *const _ as usize).is_multiple_of(min_align));
31+
assert!(((&T2) as *const _ as usize).is_multiple_of(min_align));
32+
assert!(((&T3) as *const _ as usize).is_multiple_of(min_align));
33+
assert!(((&T4) as *const _ as usize).is_multiple_of(min_align));
34+
assert!(((&T5) as *const _ as usize).is_multiple_of(min_align));
35+
assert!(((&T6) as *const _ as usize).is_multiple_of(min_align));
36+
assert!(((&T7) as *const _ as usize).is_multiple_of(min_align));
37+
assert!(((&T8) as *const _ as usize).is_multiple_of(min_align));
38+
assert!(((&T9) as *const _ as usize).is_multiple_of(min_align));
39+
40+
assert!(((&F0) as *const _ as usize).is_multiple_of(min_align));
41+
assert!(((&F1) as *const _ as usize).is_multiple_of(min_align));
42+
assert!(((&F2) as *const _ as usize).is_multiple_of(min_align));
43+
assert!(((&F3) as *const _ as usize).is_multiple_of(min_align));
44+
assert!(((&F4) as *const _ as usize).is_multiple_of(min_align));
45+
assert!(((&F5) as *const _ as usize).is_multiple_of(min_align));
46+
assert!(((&F6) as *const _ as usize).is_multiple_of(min_align));
47+
assert!(((&F7) as *const _ as usize).is_multiple_of(min_align));
48+
assert!(((&F8) as *const _ as usize).is_multiple_of(min_align));
49+
assert!(((&F9) as *const _ as usize).is_multiple_of(min_align));
50+
}

0 commit comments

Comments
 (0)