@@ -253,12 +253,14 @@ pub struct TargetDataLayout {
253
253
pub vector_align : Vec < ( Size , AbiAlign ) > ,
254
254
255
255
pub default_address_space : AddressSpace ,
256
+ pub default_address_space_info : AddressSpaceInfo ,
256
257
257
258
/// The address space informations relative to all the known address spaces.
258
259
///
259
260
/// # Note
260
- /// The first item (`address_space_info[0]`) in the vector should always be the informations
261
- /// related to the default address space.
261
+ ///
262
+ /// This vector does not contain the [`AddressSpaceInfo`] relative to the default address space,
263
+ /// which instead lives in [`Self::default_address_space_info`].
262
264
address_space_info : Vec < ( AddressSpace , AddressSpaceInfo ) > ,
263
265
264
266
pub instruction_address_space : AddressSpace ,
@@ -291,14 +293,12 @@ impl Default for TargetDataLayout {
291
293
( Size :: from_bits( 128 ) , AbiAlign :: new( align( 128 ) ) ) ,
292
294
] ,
293
295
default_address_space : AddressSpace :: ZERO ,
294
- address_space_info : vec ! [ (
295
- AddressSpace :: ZERO ,
296
- AddressSpaceInfo {
297
- pointer_size: Size :: from_bits( 64 ) ,
298
- pointer_align: AbiAlign :: new( align( 64 ) ) ,
299
- pointer_index: Size :: from_bits( 64 ) ,
300
- } ,
301
- ) ] ,
296
+ default_address_space_info : AddressSpaceInfo {
297
+ pointer_size : Size :: from_bits ( 64 ) ,
298
+ pointer_align : AbiAlign :: new ( align ( 64 ) ) ,
299
+ pointer_index : Size :: from_bits ( 64 ) ,
300
+ } ,
301
+ address_space_info : vec ! [ ] ,
302
302
instruction_address_space : AddressSpace :: ZERO ,
303
303
c_enum_min_size : Integer :: I32 ,
304
304
}
@@ -313,7 +313,6 @@ pub enum TargetDataLayoutErrors<'a> {
313
313
InconsistentTargetArchitecture { dl : & ' a str , target : & ' a str } ,
314
314
InconsistentTargetPointerWidth { pointer_size : u64 , target : u32 } ,
315
315
InvalidBitsSize { err : String } ,
316
- MissingAddressSpaceInfo { addr_space : AddressSpace } ,
317
316
}
318
317
319
318
impl TargetDataLayout {
@@ -395,12 +394,12 @@ impl TargetDataLayout {
395
394
pointer_size,
396
395
pointer_align : parse_align ( a, p) ?,
397
396
} ;
398
- match dl . address_space_info . iter_mut ( ) . find ( | ( a , _ ) | * a == addr_space ) {
399
- Some ( e ) => e . 1 = info,
400
- None => {
401
- if addr_space == default_address_space {
402
- dl . address_space_info . insert ( 0 , ( addr_space , info) ) ;
403
- } else {
397
+ if addr_space == default_address_space {
398
+ dl . default_address_space_info = info;
399
+ } else {
400
+ match dl . address_space_info . iter_mut ( ) . find ( | ( a , _ ) | * a == addr_space ) {
401
+ Some ( e ) => e . 1 = info,
402
+ None => {
404
403
dl. address_space_info . push ( ( addr_space, info) ) ;
405
404
}
406
405
}
@@ -423,12 +422,12 @@ impl TargetDataLayout {
423
422
pointer_index : parse_size ( i, p) ?,
424
423
} ;
425
424
426
- match dl . address_space_info . iter_mut ( ) . find ( | ( a , _ ) | * a == addr_space ) {
427
- Some ( e ) => e . 1 = info,
428
- None => {
429
- if addr_space == default_address_space {
430
- dl . address_space_info . insert ( 0 , ( addr_space , info) ) ;
431
- } else {
425
+ if addr_space == default_address_space {
426
+ dl . default_address_space_info = info;
427
+ } else {
428
+ match dl . address_space_info . iter_mut ( ) . find ( | ( a , _ ) | * a == addr_space ) {
429
+ Some ( e ) => e . 1 = info,
430
+ None => {
432
431
dl. address_space_info . push ( ( addr_space, info) ) ;
433
432
}
434
433
}
@@ -470,26 +469,17 @@ impl TargetDataLayout {
470
469
}
471
470
}
472
471
473
- if dl. address_space_info . iter ( ) . find ( |( a, _) | * a == default_address_space) . is_none ( ) {
474
- return Err ( TargetDataLayoutErrors :: MissingAddressSpaceInfo {
475
- addr_space : default_address_space,
476
- } ) ;
477
- }
478
-
479
472
// Inherit, if not given, address space informations for specific LLVM elements from the
480
473
// default data address space.
481
-
482
- if dl. address_space_info . iter ( ) . find ( |( a, _) | * a == dl. instruction_address_space ) . is_none ( )
474
+ if ( dl. instruction_address_space != dl. default_address_space )
475
+ && dl
476
+ . address_space_info
477
+ . iter ( )
478
+ . find ( |( a, _) | * a == dl. instruction_address_space )
479
+ . is_none ( )
483
480
{
484
- dl. address_space_info . push ( (
485
- dl. instruction_address_space ,
486
- dl. address_space_info
487
- . iter ( )
488
- . find ( |( a, _) | * a == default_address_space)
489
- . unwrap ( )
490
- . 1
491
- . clone ( ) ,
492
- ) ) ;
481
+ dl. address_space_info
482
+ . push ( ( dl. instruction_address_space , dl. default_address_space_info . clone ( ) ) ) ;
493
483
}
494
484
495
485
Ok ( dl)
@@ -576,12 +566,16 @@ impl TargetDataLayout {
576
566
/// Get the pointer size in the default data address space.
577
567
#[ inline]
578
568
pub fn pointer_size ( & self ) -> Size {
579
- self . address_space_info [ 0 ] . 1 . pointer_size
569
+ self . default_address_space_info . pointer_size
580
570
}
581
571
582
572
/// Get the pointer size in a specific address space.
583
573
#[ inline]
584
574
pub fn pointer_size_in ( & self , c : AddressSpace ) -> Size {
575
+ if c == self . default_address_space {
576
+ return self . default_address_space_info . pointer_size ;
577
+ }
578
+
585
579
if let Some ( e) = self . address_space_info . iter ( ) . find ( |( a, _) | a == & c) {
586
580
e. 1 . pointer_size
587
581
} else {
@@ -592,12 +586,16 @@ impl TargetDataLayout {
592
586
/// Get the pointer index in the default data address space.
593
587
#[ inline]
594
588
pub fn pointer_index ( & self ) -> Size {
595
- self . address_space_info [ 0 ] . 1 . pointer_index
589
+ self . default_address_space_info . pointer_index
596
590
}
597
591
598
592
/// Get the pointer index in a specific address space.
599
593
#[ inline]
600
594
pub fn pointer_index_in ( & self , c : AddressSpace ) -> Size {
595
+ if c == self . default_address_space {
596
+ return self . default_address_space_info . pointer_index ;
597
+ }
598
+
601
599
if let Some ( e) = self . address_space_info . iter ( ) . find ( |( a, _) | a == & c) {
602
600
e. 1 . pointer_index
603
601
} else {
@@ -608,12 +606,16 @@ impl TargetDataLayout {
608
606
/// Get the pointer alignment in the default data address space.
609
607
#[ inline]
610
608
pub fn pointer_align ( & self ) -> AbiAlign {
611
- self . address_space_info [ 0 ] . 1 . pointer_align
609
+ self . default_address_space_info . pointer_align
612
610
}
613
611
614
612
/// Get the pointer alignment in a specific address space.
615
613
#[ inline]
616
614
pub fn pointer_align_in ( & self , c : AddressSpace ) -> AbiAlign {
615
+ if c == self . default_address_space {
616
+ return self . default_address_space_info . pointer_align ;
617
+ }
618
+
617
619
if let Some ( e) = self . address_space_info . iter ( ) . find ( |( a, _) | a == & c) {
618
620
e. 1 . pointer_align
619
621
} else {
0 commit comments