@@ -56,8 +56,7 @@ impl Default for TargetDataLayout {
56
56
i16_align : Align :: from_bits ( 16 , 16 ) . unwrap ( ) ,
57
57
i32_align : Align :: from_bits ( 32 , 32 ) . unwrap ( ) ,
58
58
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 ( ) ,
61
60
f32_align : Align :: from_bits ( 32 , 32 ) . unwrap ( ) ,
62
61
f64_align : Align :: from_bits ( 64 , 64 ) . unwrap ( ) ,
63
62
pointer_size : Size :: from_bits ( 64 ) ,
@@ -102,6 +101,7 @@ impl TargetDataLayout {
102
101
} ;
103
102
104
103
let mut dl = TargetDataLayout :: default ( ) ;
104
+ let mut i128_align_src = 64 ;
105
105
for spec in sess. target . target . data_layout . split ( "-" ) {
106
106
match & spec. split ( ":" ) . collect :: < Vec < _ > > ( ) [ ..] {
107
107
& [ "e" ] => dl. endian = Endian :: Little ,
@@ -114,20 +114,28 @@ impl TargetDataLayout {
114
114
dl. pointer_align = align ( a, p) ;
115
115
}
116
116
& [ 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,
125
119
Err ( _) => {
126
120
size ( & s[ 1 ..] , "i" ) ; // For the user error.
127
121
continue ;
128
122
}
129
123
} ;
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
+ }
131
139
}
132
140
& [ s, ref a..] if s. starts_with ( "v" ) => {
133
141
let v_size = size ( & s[ 1 ..] , "v" ) ;
0 commit comments