@@ -47,7 +47,6 @@ use std::ops::{Add, AddAssign, Deref, Mul, RangeInclusive, Sub};
47
47
use std:: str:: FromStr ;
48
48
49
49
use bitflags:: bitflags;
50
- use rustc_data_structures:: fx:: FxHashMap ;
51
50
#[ cfg( feature = "nightly" ) ]
52
51
use rustc_data_structures:: stable_hasher:: StableOrd ;
53
52
use rustc_hashes:: Hash64 ;
@@ -254,7 +253,7 @@ pub struct TargetDataLayout {
254
253
pub vector_align : Vec < ( Size , AbiAlign ) > ,
255
254
256
255
pub default_address_space : AddressSpace ,
257
- pub address_space_info : FxHashMap < AddressSpace , AddressSpaceInfo > ,
256
+ pub address_space_info : Vec < ( AddressSpace , AddressSpaceInfo ) > ,
258
257
259
258
pub instruction_address_space : AddressSpace ,
260
259
@@ -286,14 +285,14 @@ impl Default for TargetDataLayout {
286
285
( Size :: from_bits( 128 ) , AbiAlign :: new( align( 128 ) ) ) ,
287
286
] ,
288
287
default_address_space : AddressSpace :: ZERO ,
289
- address_space_info : FxHashMap :: from_iter ( [ (
288
+ address_space_info : vec ! [ (
290
289
AddressSpace :: ZERO ,
291
290
AddressSpaceInfo {
292
291
pointer_size: Size :: from_bits( 64 ) ,
293
292
pointer_align: AbiAlign :: new( align( 64 ) ) ,
294
293
pointer_index: Size :: from_bits( 64 ) ,
295
294
} ,
296
- ) ] ) ,
295
+ ) ] ,
297
296
instruction_address_space : AddressSpace :: ZERO ,
298
297
c_enum_min_size : Integer :: I32 ,
299
298
}
@@ -388,11 +387,10 @@ impl TargetDataLayout {
388
387
pointer_size,
389
388
pointer_align : parse_align ( a, p) ?,
390
389
} ;
391
-
392
- dl. address_space_info
393
- . entry ( addr_space)
394
- . and_modify ( |v| * v = info)
395
- . or_insert ( info) ;
390
+ match dl. address_space_info . iter_mut ( ) . find ( |( a, _) | * a == addr_space) {
391
+ Some ( e) => e. 1 = info,
392
+ None => dl. address_space_info . push ( ( addr_space, info) ) ,
393
+ }
396
394
}
397
395
[ p, s, _pr, i, a @ ..] if p. starts_with ( "p" ) => {
398
396
let p = p. strip_prefix ( char:: is_alphabetic) . unwrap_or_default ( ) ;
@@ -409,10 +407,10 @@ impl TargetDataLayout {
409
407
pointer_index : parse_size ( i, p) ?,
410
408
} ;
411
409
412
- dl. address_space_info
413
- . entry ( addr_space )
414
- . and_modify ( |v| * v = info)
415
- . or_insert ( info ) ;
410
+ match dl. address_space_info . iter_mut ( ) . find ( | ( a , _ ) | * a == addr_space ) {
411
+ Some ( e ) => e . 1 = info ,
412
+ None => dl . address_space_info . push ( ( addr_space , info) ) ,
413
+ }
416
414
}
417
415
418
416
[ s, a @ ..] if s. starts_with ( 'i' ) => {
@@ -450,7 +448,7 @@ impl TargetDataLayout {
450
448
}
451
449
}
452
450
453
- if ! dl. address_space_info . contains_key ( & default_address_space) {
451
+ if dl. address_space_info . iter ( ) . find ( | ( a , _ ) | * a == default_address_space) . is_none ( ) {
454
452
return Err ( TargetDataLayoutErrors :: MissingAddressSpaceInfo {
455
453
addr_space : default_address_space,
456
454
} ) ;
@@ -459,11 +457,17 @@ impl TargetDataLayout {
459
457
// Inherit, if not given, address space informations for specific LLVM elements from the
460
458
// default data address space.
461
459
462
- if !dl. address_space_info . contains_key ( & dl. instruction_address_space ) {
463
- dl. address_space_info . insert (
460
+ if dl. address_space_info . iter ( ) . find ( |( a, _) | * a == dl. instruction_address_space ) . is_none ( )
461
+ {
462
+ dl. address_space_info . push ( (
464
463
dl. instruction_address_space ,
465
- dl. address_space_info . get ( & default_address_space) . unwrap ( ) . clone ( ) ,
466
- ) ;
464
+ dl. address_space_info
465
+ . iter ( )
466
+ . find ( |( a, _) | * a == default_address_space)
467
+ . unwrap ( )
468
+ . 1
469
+ . clone ( ) ,
470
+ ) ) ;
467
471
}
468
472
469
473
Ok ( dl)
@@ -545,8 +549,8 @@ impl TargetDataLayout {
545
549
/// Get the pointer size in a specific address space.
546
550
#[ inline]
547
551
pub fn pointer_size_in ( & self , c : AddressSpace ) -> Size {
548
- if let Some ( c ) = self . address_space_info . get ( & c) {
549
- c . pointer_size
552
+ if let Some ( e ) = self . address_space_info . iter ( ) . find ( | ( a , _ ) | a == & c) {
553
+ e . 1 . pointer_size
550
554
} else {
551
555
panic ! ( "Use of unknown address space {c:?}" ) ;
552
556
}
@@ -561,8 +565,8 @@ impl TargetDataLayout {
561
565
/// Get the pointer index in a specific address space.
562
566
#[ inline]
563
567
pub fn pointer_index_in ( & self , c : AddressSpace ) -> Size {
564
- if let Some ( c ) = self . address_space_info . get ( & c) {
565
- c . pointer_index
568
+ if let Some ( e ) = self . address_space_info . iter ( ) . find ( | ( a , _ ) | a == & c) {
569
+ e . 1 . pointer_index
566
570
} else {
567
571
panic ! ( "Use of unknown address space {c:?}" ) ;
568
572
}
@@ -577,8 +581,8 @@ impl TargetDataLayout {
577
581
/// Get the pointer alignment in a specific address space.
578
582
#[ inline]
579
583
pub fn pointer_align_in ( & self , c : AddressSpace ) -> AbiAlign {
580
- if let Some ( c ) = self . address_space_info . get ( & c) {
581
- c . pointer_align
584
+ if let Some ( e ) = self . address_space_info . iter ( ) . find ( | ( a , _ ) | a == & c) {
585
+ e . 1 . pointer_align
582
586
} else {
583
587
panic ! ( "Use of unknown address space {c:?}" ) ;
584
588
}
0 commit comments