@@ -8,7 +8,6 @@ use ir::layout::Layout;
8
8
use ir:: ty:: { Type , TypeKind } ;
9
9
use quote;
10
10
use std:: cmp;
11
- use std:: mem;
12
11
13
12
/// Trace the layout of struct.
14
13
#[ derive( Debug ) ]
@@ -101,7 +100,7 @@ impl<'a> StructLayoutTracker<'a> {
101
100
pub fn saw_vtable ( & mut self ) {
102
101
debug ! ( "saw vtable for {}" , self . name) ;
103
102
104
- let ptr_size = mem :: size_of :: < * mut ( ) > ( ) ;
103
+ let ptr_size = self . ctx . target_pointer_size ( ) ;
105
104
self . latest_offset += ptr_size;
106
105
self . latest_field_layout = Some ( Layout :: new ( ptr_size, ptr_size) ) ;
107
106
self . max_field_align = ptr_size;
@@ -165,15 +164,13 @@ impl<'a> StructLayoutTracker<'a> {
165
164
// can support.
166
165
//
167
166
// This means that the structs in the array are super-unsafe to
168
- // access, since they won't be properly aligned, but *shrug*.
169
- if let Some ( layout) = self . ctx . resolve_type ( inner) . layout (
170
- self . ctx ,
171
- )
172
- {
173
- if layout. align > mem:: size_of :: < * mut ( ) > ( ) {
174
- field_layout. size = align_to ( layout. size , layout. align ) *
175
- len;
176
- field_layout. align = mem:: size_of :: < * mut ( ) > ( ) ;
167
+ // access, since they won't be properly aligned, but there's not too
168
+ // much we can do about it.
169
+ if let Some ( layout) = self . ctx . resolve_type ( inner) . layout ( self . ctx ) {
170
+ if layout. align > self . ctx . target_pointer_size ( ) {
171
+ field_layout. size =
172
+ align_to ( layout. size , layout. align ) * len;
173
+ field_layout. align = self . ctx . target_pointer_size ( ) ;
177
174
}
178
175
}
179
176
}
@@ -193,7 +190,7 @@ impl<'a> StructLayoutTracker<'a> {
193
190
194
191
// Otherwise the padding is useless.
195
192
let need_padding = padding_bytes >= field_layout. align ||
196
- field_layout. align > mem :: size_of :: < * mut ( ) > ( ) ;
193
+ field_layout. align > self . ctx . target_pointer_size ( ) ;
197
194
198
195
self . latest_offset += padding_bytes;
199
196
@@ -215,7 +212,7 @@ impl<'a> StructLayoutTracker<'a> {
215
212
if need_padding && padding_bytes != 0 {
216
213
Some ( Layout :: new (
217
214
padding_bytes,
218
- cmp:: min ( field_layout. align , mem :: size_of :: < * mut ( ) > ( ) ) ,
215
+ cmp:: min ( field_layout. align , self . ctx . target_pointer_size ( ) )
219
216
) )
220
217
} else {
221
218
None
@@ -267,15 +264,15 @@ impl<'a> StructLayoutTracker<'a> {
267
264
( self . last_field_was_bitfield &&
268
265
padding_bytes >=
269
266
self . latest_field_layout . unwrap ( ) . align ) ||
270
- layout. align > mem :: size_of :: < * mut ( ) > ( ) )
267
+ layout. align > self . ctx . target_pointer_size ( ) )
271
268
{
272
269
let layout = if self . is_packed {
273
270
Layout :: new ( padding_bytes, 1 )
274
271
} else if self . last_field_was_bitfield ||
275
- layout. align > mem :: size_of :: < * mut ( ) > ( )
272
+ layout. align > self . ctx . target_pointer_size ( )
276
273
{
277
274
// We've already given up on alignment here.
278
- Layout :: for_size ( padding_bytes)
275
+ Layout :: for_size ( self . ctx , padding_bytes)
279
276
} else {
280
277
Layout :: new ( padding_bytes, layout. align )
281
278
} ;
@@ -290,7 +287,7 @@ impl<'a> StructLayoutTracker<'a> {
290
287
291
288
pub fn requires_explicit_align ( & self , layout : Layout ) -> bool {
292
289
self . max_field_align < layout. align &&
293
- layout. align <= mem :: size_of :: < * mut ( ) > ( )
290
+ layout. align <= self . ctx . target_pointer_size ( )
294
291
}
295
292
296
293
fn padding_bytes ( & self , layout : Layout ) -> usize {
0 commit comments