1
1
//! Adapted from https://github.com/rust-lang/rust/blob/d760df5aea483aae041c9a241e7acacf48f75035/src/librustc_codegen_ssa/mir/place.rs
2
2
3
- use rustc_target:: abi:: { DiscriminantKind , Int , Variants } ;
3
+ use rustc_target:: abi:: { TagEncoding , Int , Variants } ;
4
4
5
5
use crate :: prelude:: * ;
6
6
@@ -18,12 +18,12 @@ pub(crate) fn codegen_set_discriminant<'tcx>(
18
18
assert_eq ! ( index, variant_index) ;
19
19
}
20
20
Variants :: Multiple {
21
- discr : _,
22
- discr_index ,
23
- discr_kind : DiscriminantKind :: Tag ,
21
+ tag : _,
22
+ tag_field ,
23
+ tag_encoding : TagEncoding :: Direct ,
24
24
variants : _,
25
25
} => {
26
- let ptr = place. place_field ( fx, mir:: Field :: new ( discr_index ) ) ;
26
+ let ptr = place. place_field ( fx, mir:: Field :: new ( tag_field ) ) ;
27
27
let to = layout
28
28
. ty
29
29
. discriminant_for_variant ( fx. tcx , variant_index)
@@ -33,18 +33,18 @@ pub(crate) fn codegen_set_discriminant<'tcx>(
33
33
ptr. write_cvalue ( fx, discr) ;
34
34
}
35
35
Variants :: Multiple {
36
- discr : _,
37
- discr_index ,
38
- discr_kind :
39
- DiscriminantKind :: Niche {
36
+ tag : _,
37
+ tag_field ,
38
+ tag_encoding :
39
+ TagEncoding :: Niche {
40
40
dataful_variant,
41
41
ref niche_variants,
42
42
niche_start,
43
43
} ,
44
44
variants : _,
45
45
} => {
46
46
if variant_index != dataful_variant {
47
- let niche = place. place_field ( fx, mir:: Field :: new ( discr_index ) ) ;
47
+ let niche = place. place_field ( fx, mir:: Field :: new ( tag_field ) ) ;
48
48
let niche_value = variant_index. as_u32 ( ) - niche_variants. start ( ) . as_u32 ( ) ;
49
49
let niche_value = u128:: from ( niche_value) . wrapping_add ( niche_start) ;
50
50
let niche_llval = CValue :: const_val ( fx, niche. layout ( ) , niche_value) ;
@@ -69,7 +69,7 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
69
69
) ;
70
70
}
71
71
72
- let ( discr_scalar , discr_index , discr_kind ) = match & layout. variants {
72
+ let ( tag_scalar , tag_field , tag_encoding ) = match & layout. variants {
73
73
Variants :: Single { index } => {
74
74
let discr_val = layout
75
75
. ty
@@ -78,30 +78,30 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
78
78
return CValue :: const_val ( fx, dest_layout, discr_val) ;
79
79
}
80
80
Variants :: Multiple {
81
- discr ,
82
- discr_index ,
83
- discr_kind ,
81
+ tag ,
82
+ tag_field ,
83
+ tag_encoding ,
84
84
variants : _,
85
- } => ( discr , * discr_index , discr_kind ) ,
85
+ } => ( tag , * tag_field , tag_encoding ) ,
86
86
} ;
87
87
88
88
let cast_to = fx. clif_type ( dest_layout. ty ) . unwrap ( ) ;
89
89
90
90
// Read the tag/niche-encoded discriminant from memory.
91
- let encoded_discr = value. value_field ( fx, mir:: Field :: new ( discr_index ) ) ;
92
- let encoded_discr = encoded_discr . load_scalar ( fx) ;
91
+ let tag = value. value_field ( fx, mir:: Field :: new ( tag_field ) ) ;
92
+ let tag = tag . load_scalar ( fx) ;
93
93
94
94
// Decode the discriminant (specifically if it's niche-encoded).
95
- match * discr_kind {
96
- DiscriminantKind :: Tag => {
97
- let signed = match discr_scalar . value {
95
+ match * tag_encoding {
96
+ TagEncoding :: Direct => {
97
+ let signed = match tag_scalar . value {
98
98
Int ( _, signed) => signed,
99
99
_ => false ,
100
100
} ;
101
- let val = clif_intcast ( fx, encoded_discr , cast_to, signed) ;
102
- return CValue :: by_val ( val, dest_layout) ;
101
+ let val = clif_intcast ( fx, tag , cast_to, signed) ;
102
+ CValue :: by_val ( val, dest_layout)
103
103
}
104
- DiscriminantKind :: Niche {
104
+ TagEncoding :: Niche {
105
105
dataful_variant,
106
106
ref niche_variants,
107
107
niche_start,
@@ -119,12 +119,12 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
119
119
// that might not fit in the same type, on top of needing an extra
120
120
// comparison (see also the comment on `let niche_discr`).
121
121
let relative_discr = if niche_start == 0 {
122
- encoded_discr
122
+ tag
123
123
} else {
124
124
// FIXME handle niche_start > i64::MAX
125
125
fx. bcx
126
126
. ins ( )
127
- . iadd_imm ( encoded_discr , -i64:: try_from ( niche_start) . unwrap ( ) )
127
+ . iadd_imm ( tag , -i64:: try_from ( niche_start) . unwrap ( ) )
128
128
} ;
129
129
let relative_max = niche_variants. end ( ) . as_u32 ( ) - niche_variants. start ( ) . as_u32 ( ) ;
130
130
let is_niche = {
0 commit comments