@@ -20,40 +20,40 @@ fn codegen_field<'a, 'tcx: 'a>(
20
20
21
21
/// A read-only value
22
22
#[ derive( Debug , Copy , Clone ) ]
23
- pub enum CValue < ' tcx > {
24
- ByRef ( Value , TyLayout < ' tcx > ) ,
25
- ByVal ( Value , TyLayout < ' tcx > ) ,
26
- ByValPair ( Value , Value , TyLayout < ' tcx > ) ,
23
+ pub struct CValue < ' tcx > ( CValueInner , TyLayout < ' tcx > ) ;
24
+
25
+ #[ derive( Debug , Copy , Clone ) ]
26
+ enum CValueInner {
27
+ ByRef ( Value ) ,
28
+ ByVal ( Value ) ,
29
+ ByValPair ( Value , Value ) ,
27
30
}
28
31
29
32
impl < ' tcx > CValue < ' tcx > {
30
33
pub fn by_ref ( value : Value , layout : TyLayout < ' tcx > ) -> CValue < ' tcx > {
31
- CValue :: ByRef ( value, layout)
34
+ CValue ( CValueInner :: ByRef ( value) , layout)
32
35
}
33
36
34
37
pub fn by_val ( value : Value , layout : TyLayout < ' tcx > ) -> CValue < ' tcx > {
35
- CValue :: ByVal ( value, layout)
38
+ CValue ( CValueInner :: ByVal ( value) , layout)
36
39
}
37
40
38
41
pub fn by_val_pair ( value : Value , extra : Value , layout : TyLayout < ' tcx > ) -> CValue < ' tcx > {
39
- CValue :: ByValPair ( value, extra, layout)
42
+ CValue ( CValueInner :: ByValPair ( value, extra) , layout)
40
43
}
41
44
42
45
pub fn layout ( & self ) -> TyLayout < ' tcx > {
43
- match * self {
44
- CValue :: ByRef ( _, layout)
45
- | CValue :: ByVal ( _, layout)
46
- | CValue :: ByValPair ( _, _, layout) => layout,
47
- }
46
+ self . 1
48
47
}
49
48
50
49
pub fn force_stack < ' a > ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > ) -> Value
51
50
where
52
51
' tcx : ' a ,
53
52
{
54
- match self {
55
- CValue :: ByRef ( value, _layout) => value,
56
- CValue :: ByVal ( value, layout) => {
53
+ let layout = self . 1 ;
54
+ match self . 0 {
55
+ CValueInner :: ByRef ( value) => value,
56
+ CValueInner :: ByVal ( value) => {
57
57
let stack_slot = fx. bcx . create_stack_slot ( StackSlotData {
58
58
kind : StackSlotKind :: ExplicitSlot ,
59
59
size : layout. size . bytes ( ) as u32 ,
@@ -63,7 +63,7 @@ impl<'tcx> CValue<'tcx> {
63
63
fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , value, addr, 0 ) ;
64
64
addr
65
65
}
66
- CValue :: ByValPair ( value, extra, layout ) => {
66
+ CValueInner :: ByValPair ( value, extra) => {
67
67
let stack_slot = fx. bcx . create_stack_slot ( StackSlotData {
68
68
kind : StackSlotKind :: ExplicitSlot ,
69
69
size : layout. size . bytes ( ) as u32 ,
@@ -84,17 +84,18 @@ impl<'tcx> CValue<'tcx> {
84
84
where
85
85
' tcx : ' a ,
86
86
{
87
- match self {
88
- CValue :: ByRef ( addr, layout) => {
87
+ let layout = self . 1 ;
88
+ match self . 0 {
89
+ CValueInner :: ByRef ( addr) => {
89
90
let scalar = match layout. abi {
90
91
layout:: Abi :: Scalar ( ref scalar) => scalar. clone ( ) ,
91
92
_ => unreachable ! ( ) ,
92
93
} ;
93
94
let clif_ty = scalar_to_clif_type ( fx. tcx , scalar) ;
94
95
fx. bcx . ins ( ) . load ( clif_ty, MemFlags :: new ( ) , addr, 0 )
95
96
}
96
- CValue :: ByVal ( value, _layout ) => value,
97
- CValue :: ByValPair ( _, _, _layout ) => bug ! ( "Please use load_scalar_pair for ByValPair" ) ,
97
+ CValueInner :: ByVal ( value) => value,
98
+ CValueInner :: ByValPair ( _, _) => bug ! ( "Please use load_scalar_pair for ByValPair" ) ,
98
99
}
99
100
}
100
101
@@ -103,8 +104,9 @@ impl<'tcx> CValue<'tcx> {
103
104
where
104
105
' tcx : ' a ,
105
106
{
106
- match self {
107
- CValue :: ByRef ( addr, layout) => {
107
+ let layout = self . 1 ;
108
+ match self . 0 {
109
+ CValueInner :: ByRef ( addr) => {
108
110
let ( a, b) = match & layout. abi {
109
111
layout:: Abi :: ScalarPair ( a, b) => ( a. clone ( ) , b. clone ( ) ) ,
110
112
_ => unreachable ! ( ) ,
@@ -120,8 +122,8 @@ impl<'tcx> CValue<'tcx> {
120
122
) ;
121
123
( val1, val2)
122
124
}
123
- CValue :: ByVal ( _, _layout ) => bug ! ( "Please use load_scalar for ByVal" ) ,
124
- CValue :: ByValPair ( val1, val2, _layout ) => ( val1, val2) ,
125
+ CValueInner :: ByVal ( _) => bug ! ( "Please use load_scalar for ByVal" ) ,
126
+ CValueInner :: ByValPair ( val1, val2) => ( val1, val2) ,
125
127
}
126
128
}
127
129
@@ -133,13 +135,14 @@ impl<'tcx> CValue<'tcx> {
133
135
where
134
136
' tcx : ' a ,
135
137
{
136
- let ( base, layout) = match self {
137
- CValue :: ByRef ( addr, layout) => ( addr, layout) ,
138
+ let layout = self . 1 ;
139
+ let base = match self . 0 {
140
+ CValueInner :: ByRef ( addr) => addr,
138
141
_ => bug ! ( "place_field for {:?}" , self ) ,
139
142
} ;
140
143
141
144
let ( field_ptr, field_layout) = codegen_field ( fx, base, layout, field) ;
142
- CValue :: ByRef ( field_ptr, field_layout)
145
+ CValue :: by_ref ( field_ptr, field_layout)
143
146
}
144
147
145
148
pub fn unsize_value < ' a > ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
@@ -156,15 +159,11 @@ impl<'tcx> CValue<'tcx> {
156
159
{
157
160
let clif_ty = fx. clif_type ( ty) . unwrap ( ) ;
158
161
let layout = fx. layout_of ( ty) ;
159
- CValue :: ByVal ( fx. bcx . ins ( ) . iconst ( clif_ty, const_val) , layout)
162
+ CValue :: by_val ( fx. bcx . ins ( ) . iconst ( clif_ty, const_val) , layout)
160
163
}
161
164
162
165
pub fn unchecked_cast_to ( self , layout : TyLayout < ' tcx > ) -> Self {
163
- match self {
164
- CValue :: ByRef ( addr, _) => CValue :: ByRef ( addr, layout) ,
165
- CValue :: ByVal ( val, _) => CValue :: ByVal ( val, layout) ,
166
- CValue :: ByValPair ( val, extra, _) => CValue :: ByValPair ( val, extra, layout) ,
167
- }
166
+ CValue ( self . 0 , layout)
168
167
}
169
168
}
170
169
@@ -229,16 +228,16 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> {
229
228
230
229
pub fn to_cvalue ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > ) -> CValue < ' tcx > {
231
230
match self {
232
- CPlace :: Var ( var, layout) => CValue :: ByVal ( fx. bcx . use_var ( mir_var ( var) ) , layout) ,
231
+ CPlace :: Var ( var, layout) => CValue :: by_val ( fx. bcx . use_var ( mir_var ( var) ) , layout) ,
233
232
CPlace :: Addr ( addr, extra, layout) => {
234
233
assert ! ( extra. is_none( ) , "unsized values are not yet supported" ) ;
235
- CValue :: ByRef ( addr, layout)
234
+ CValue :: by_ref ( addr, layout)
236
235
}
237
- CPlace :: Stack ( stack_slot, layout) => CValue :: ByRef (
236
+ CPlace :: Stack ( stack_slot, layout) => CValue :: by_ref (
238
237
fx. bcx . ins ( ) . stack_addr ( fx. pointer_type , stack_slot, 0 ) ,
239
238
layout,
240
239
) ,
241
- CPlace :: NoPlace ( layout) => CValue :: ByRef (
240
+ CPlace :: NoPlace ( layout) => CValue :: by_ref (
242
241
fx. bcx
243
242
. ins ( )
244
243
. iconst ( fx. pointer_type , fx. pointer_type . bytes ( ) as i64 ) ,
@@ -353,24 +352,25 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> {
353
352
CPlace :: Addr ( _, _, _) => bug ! ( "Can't write value to unsized place {:?}" , self ) ,
354
353
} ;
355
354
356
- match from {
357
- CValue :: ByVal ( val, _src_layout ) => {
355
+ match from. 0 {
356
+ CValueInner :: ByVal ( val) => {
358
357
fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , val, addr, 0 ) ;
359
358
}
360
- CValue :: ByValPair ( val1, val2, _src_layout ) => {
359
+ CValueInner :: ByValPair ( val1, val2) => {
361
360
let val1_offset = dst_layout. fields . offset ( 0 ) . bytes ( ) as i32 ;
362
361
let val2_offset = dst_layout. fields . offset ( 1 ) . bytes ( ) as i32 ;
363
362
fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , val1, addr, val1_offset) ;
364
363
fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , val2, addr, val2_offset) ;
365
364
}
366
- CValue :: ByRef ( from, src_layout) => {
365
+ CValueInner :: ByRef ( from_addr) => {
366
+ let src_layout = from. 1 ;
367
367
let size = dst_layout. size . bytes ( ) ;
368
368
let src_align = src_layout. align . abi . bytes ( ) as u8 ;
369
369
let dst_align = dst_layout. align . abi . bytes ( ) as u8 ;
370
370
fx. bcx . emit_small_memcpy (
371
371
fx. module . target_config ( ) ,
372
372
addr,
373
- from ,
373
+ from_addr ,
374
374
size,
375
375
dst_align,
376
376
src_align,
@@ -446,7 +446,7 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> {
446
446
447
447
pub fn write_place_ref ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
448
448
if !self . layout ( ) . is_unsized ( ) {
449
- let ptr = CValue :: ByVal ( self . to_addr ( fx) , dest. layout ( ) ) ;
449
+ let ptr = CValue :: by_val ( self . to_addr ( fx) , dest. layout ( ) ) ;
450
450
dest. write_cvalue ( fx, ptr) ;
451
451
} else {
452
452
let ( value, extra) = self . to_addr_maybe_unsized ( fx) ;
0 commit comments