@@ -20,40 +20,40 @@ fn codegen_field<'a, 'tcx: 'a>(
2020
2121/// A read-only value
2222#[ 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 ) ,
2730}
2831
2932impl < ' tcx > CValue < ' tcx > {
3033 pub fn by_ref ( value : Value , layout : TyLayout < ' tcx > ) -> CValue < ' tcx > {
31- CValue :: ByRef ( value, layout)
34+ CValue ( CValueInner :: ByRef ( value) , layout)
3235 }
3336
3437 pub fn by_val ( value : Value , layout : TyLayout < ' tcx > ) -> CValue < ' tcx > {
35- CValue :: ByVal ( value, layout)
38+ CValue ( CValueInner :: ByVal ( value) , layout)
3639 }
3740
3841 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)
4043 }
4144
4245 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
4847 }
4948
5049 pub fn force_stack < ' a > ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > ) -> Value
5150 where
5251 ' tcx : ' a ,
5352 {
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) => {
5757 let stack_slot = fx. bcx . create_stack_slot ( StackSlotData {
5858 kind : StackSlotKind :: ExplicitSlot ,
5959 size : layout. size . bytes ( ) as u32 ,
@@ -63,7 +63,7 @@ impl<'tcx> CValue<'tcx> {
6363 fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , value, addr, 0 ) ;
6464 addr
6565 }
66- CValue :: ByValPair ( value, extra, layout ) => {
66+ CValueInner :: ByValPair ( value, extra) => {
6767 let stack_slot = fx. bcx . create_stack_slot ( StackSlotData {
6868 kind : StackSlotKind :: ExplicitSlot ,
6969 size : layout. size . bytes ( ) as u32 ,
@@ -84,17 +84,18 @@ impl<'tcx> CValue<'tcx> {
8484 where
8585 ' tcx : ' a ,
8686 {
87- match self {
88- CValue :: ByRef ( addr, layout) => {
87+ let layout = self . 1 ;
88+ match self . 0 {
89+ CValueInner :: ByRef ( addr) => {
8990 let scalar = match layout. abi {
9091 layout:: Abi :: Scalar ( ref scalar) => scalar. clone ( ) ,
9192 _ => unreachable ! ( ) ,
9293 } ;
9394 let clif_ty = scalar_to_clif_type ( fx. tcx , scalar) ;
9495 fx. bcx . ins ( ) . load ( clif_ty, MemFlags :: new ( ) , addr, 0 )
9596 }
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" ) ,
9899 }
99100 }
100101
@@ -103,8 +104,9 @@ impl<'tcx> CValue<'tcx> {
103104 where
104105 ' tcx : ' a ,
105106 {
106- match self {
107- CValue :: ByRef ( addr, layout) => {
107+ let layout = self . 1 ;
108+ match self . 0 {
109+ CValueInner :: ByRef ( addr) => {
108110 let ( a, b) = match & layout. abi {
109111 layout:: Abi :: ScalarPair ( a, b) => ( a. clone ( ) , b. clone ( ) ) ,
110112 _ => unreachable ! ( ) ,
@@ -120,8 +122,8 @@ impl<'tcx> CValue<'tcx> {
120122 ) ;
121123 ( val1, val2)
122124 }
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) ,
125127 }
126128 }
127129
@@ -133,13 +135,14 @@ impl<'tcx> CValue<'tcx> {
133135 where
134136 ' tcx : ' a ,
135137 {
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,
138141 _ => bug ! ( "place_field for {:?}" , self ) ,
139142 } ;
140143
141144 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)
143146 }
144147
145148 pub fn unsize_value < ' a > ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
@@ -156,15 +159,11 @@ impl<'tcx> CValue<'tcx> {
156159 {
157160 let clif_ty = fx. clif_type ( ty) . unwrap ( ) ;
158161 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)
160163 }
161164
162165 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)
168167 }
169168}
170169
@@ -229,16 +228,16 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> {
229228
230229 pub fn to_cvalue ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > ) -> CValue < ' tcx > {
231230 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) ,
233232 CPlace :: Addr ( addr, extra, layout) => {
234233 assert ! ( extra. is_none( ) , "unsized values are not yet supported" ) ;
235- CValue :: ByRef ( addr, layout)
234+ CValue :: by_ref ( addr, layout)
236235 }
237- CPlace :: Stack ( stack_slot, layout) => CValue :: ByRef (
236+ CPlace :: Stack ( stack_slot, layout) => CValue :: by_ref (
238237 fx. bcx . ins ( ) . stack_addr ( fx. pointer_type , stack_slot, 0 ) ,
239238 layout,
240239 ) ,
241- CPlace :: NoPlace ( layout) => CValue :: ByRef (
240+ CPlace :: NoPlace ( layout) => CValue :: by_ref (
242241 fx. bcx
243242 . ins ( )
244243 . iconst ( fx. pointer_type , fx. pointer_type . bytes ( ) as i64 ) ,
@@ -353,24 +352,25 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> {
353352 CPlace :: Addr ( _, _, _) => bug ! ( "Can't write value to unsized place {:?}" , self ) ,
354353 } ;
355354
356- match from {
357- CValue :: ByVal ( val, _src_layout ) => {
355+ match from. 0 {
356+ CValueInner :: ByVal ( val) => {
358357 fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , val, addr, 0 ) ;
359358 }
360- CValue :: ByValPair ( val1, val2, _src_layout ) => {
359+ CValueInner :: ByValPair ( val1, val2) => {
361360 let val1_offset = dst_layout. fields . offset ( 0 ) . bytes ( ) as i32 ;
362361 let val2_offset = dst_layout. fields . offset ( 1 ) . bytes ( ) as i32 ;
363362 fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , val1, addr, val1_offset) ;
364363 fx. bcx . ins ( ) . store ( MemFlags :: new ( ) , val2, addr, val2_offset) ;
365364 }
366- CValue :: ByRef ( from, src_layout) => {
365+ CValueInner :: ByRef ( from_addr) => {
366+ let src_layout = from. 1 ;
367367 let size = dst_layout. size . bytes ( ) ;
368368 let src_align = src_layout. align . abi . bytes ( ) as u8 ;
369369 let dst_align = dst_layout. align . abi . bytes ( ) as u8 ;
370370 fx. bcx . emit_small_memcpy (
371371 fx. module . target_config ( ) ,
372372 addr,
373- from ,
373+ from_addr ,
374374 size,
375375 dst_align,
376376 src_align,
@@ -446,7 +446,7 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> {
446446
447447 pub fn write_place_ref ( self , fx : & mut FunctionCx < ' a , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
448448 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 ( ) ) ;
450450 dest. write_cvalue ( fx, ptr) ;
451451 } else {
452452 let ( value, extra) = self . to_addr_maybe_unsized ( fx) ;
0 commit comments