Skip to content

Commit 90c65e4

Browse files
committed
Fix i128 alignment calculation
1 parent b4ab3ec commit 90c65e4

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

src/librustc/ty/layout.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ impl Default for TargetDataLayout {
5656
i16_align: Align::from_bits(16, 16).unwrap(),
5757
i32_align: Align::from_bits(32, 32).unwrap(),
5858
i64_align: Align::from_bits(32, 64).unwrap(),
59-
// FIXME: i128 is correct?
60-
i128_align: Align::from_bits(64, 128).unwrap(),
59+
i128_align: Align::from_bits(32, 64).unwrap(),
6160
f32_align: Align::from_bits(32, 32).unwrap(),
6261
f64_align: Align::from_bits(64, 64).unwrap(),
6362
pointer_size: Size::from_bits(64),
@@ -102,6 +101,7 @@ impl TargetDataLayout {
102101
};
103102

104103
let mut dl = TargetDataLayout::default();
104+
let mut i128_align_src = 64;
105105
for spec in sess.target.target.data_layout.split("-") {
106106
match &spec.split(":").collect::<Vec<_>>()[..] {
107107
&["e"] => dl.endian = Endian::Little,
@@ -114,20 +114,28 @@ impl TargetDataLayout {
114114
dl.pointer_align = align(a, p);
115115
}
116116
&[s, ref a..] if s.starts_with("i") => {
117-
let ty_align = match s[1..].parse::<u64>() {
118-
Ok(1) => &mut dl.i8_align,
119-
Ok(8) => &mut dl.i8_align,
120-
Ok(16) => &mut dl.i16_align,
121-
Ok(32) => &mut dl.i32_align,
122-
Ok(64) => &mut dl.i64_align,
123-
Ok(128) => &mut dl.i128_align,
124-
Ok(_) => continue,
117+
let bits = match s[1..].parse::<u64>() {
118+
Ok(bits) => bits,
125119
Err(_) => {
126120
size(&s[1..], "i"); // For the user error.
127121
continue;
128122
}
129123
};
130-
*ty_align = align(a, s);
124+
let a = align(a, s);
125+
match bits {
126+
1 => dl.i1_align = a,
127+
8 => dl.i8_align = a,
128+
16 => dl.i16_align = a,
129+
32 => dl.i32_align = a,
130+
64 => dl.i64_align = a,
131+
_ => {}
132+
}
133+
if bits >= i128_align_src && bits <= 128 {
134+
// Default alignment for i128 is decided by taking the alignment of
135+
// largest-sized i{64...128}.
136+
i128_align_src = bits;
137+
dl.i128_align = a;
138+
}
131139
}
132140
&[s, ref a..] if s.starts_with("v") => {
133141
let v_size = size(&s[1..], "v");

0 commit comments

Comments
 (0)