]> git.lizzy.rs Git - rust.git/commitdiff
Let codegen_get_discriminant accept CValue instead of CPlace
authorbjorn3 <bjorn3@users.noreply.github.com>
Sun, 18 Aug 2019 14:19:33 +0000 (16:19 +0200)
committerbjorn3 <bjorn3@users.noreply.github.com>
Sun, 18 Aug 2019 14:19:33 +0000 (16:19 +0200)
src/base.rs
src/discriminant.rs
src/intrinsics.rs

index 51e6e44b59e98b249392313c6a3e9312e196789d..8064b83d728110593737e643d9281819ebccbd52 100644 (file)
@@ -367,10 +367,7 @@ fn is_fat_ptr<'a, 'tcx: 'a>(fx: &FunctionCx<'a, 'tcx, impl Backend>, ty: Ty<'tcx
                             _ => unreachable!("cast adt {} -> {}", from_ty, to_ty),
                         }
 
-                        // FIXME avoid forcing to stack
-                        let place =
-                            CPlace::for_addr(operand.force_stack(fx), operand.layout());
-                        let discr = crate::discriminant::codegen_get_discriminant(fx, place, fx.layout_of(to_ty));
+                        let discr = crate::discriminant::codegen_get_discriminant(fx, operand, fx.layout_of(to_ty));
                         lval.write_cvalue(fx, discr);
                     } else {
                         let to_clif_ty = fx.clif_type(to_ty).unwrap();
@@ -405,7 +402,8 @@ fn is_fat_ptr<'a, 'tcx: 'a>(fx: &FunctionCx<'a, 'tcx, impl Backend>, ty: Ty<'tcx
                 }
                 Rvalue::Discriminant(place) => {
                     let place = trans_place(fx, place);
-                    let discr = crate::discriminant::codegen_get_discriminant(fx, place, dest_layout);
+                    let value = place.to_cvalue(fx);
+                    let discr = crate::discriminant::codegen_get_discriminant(fx, value, dest_layout);
                     lval.write_cvalue(fx, discr);
                 }
                 Rvalue::Repeat(operand, times) => {
index 1a83b39fb09d918c4e49616d30c5d45ddca3326d..674486076de723ed3df115091480c450e60b0b3f 100644 (file)
@@ -58,10 +58,10 @@ pub fn codegen_set_discriminant<'tcx>(
 
 pub fn codegen_get_discriminant<'tcx>(
     fx: &mut FunctionCx<'_, 'tcx, impl Backend>,
-    place: CPlace<'tcx>,
+    value: CValue<'tcx>,
     dest_layout: TyLayout<'tcx>,
 ) -> CValue<'tcx> {
-    let layout = place.layout();
+    let layout = value.layout();
 
     if layout.abi == layout::Abi::Uninhabited {
         return trap_unreachable_ret_value(fx, dest_layout, "[panic] Tried to get discriminant for uninhabited type.");
@@ -82,7 +82,7 @@ pub fn codegen_get_discriminant<'tcx>(
         }
     };
 
-    let discr = place.place_field(fx, mir::Field::new(discr_index)).to_cvalue(fx);
+    let discr = value.value_field(fx, mir::Field::new(discr_index));
     let discr_ty = discr.layout().ty;
     let lldiscr = discr.load_scalar(fx);
     match discr_kind {
index 2dfa45c9dfb07a7119bac1d8580cf11f768a813b..580d79fb223cd8ef2910154265a7cbf1ed9c9c52 100644 (file)
@@ -374,10 +374,10 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
                 fx.bcx.call_memmove(fx.module.target_config(), dst, src, byte_amount);
             }
         };
-        discriminant_value, (c val) {
-            let pointee_layout = fx.layout_of(val.layout().ty.builtin_deref(true).unwrap().ty);
-            let place = CPlace::for_addr(val.load_scalar(fx), pointee_layout);
-            let discr = crate::discriminant::codegen_get_discriminant(fx, place, ret.layout());
+        discriminant_value, (c ptr) {
+            let pointee_layout = fx.layout_of(ptr.layout().ty.builtin_deref(true).unwrap().ty);
+            let val = CValue::by_ref(ptr.load_scalar(fx), pointee_layout);
+            let discr = crate::discriminant::codegen_get_discriminant(fx, val, ret.layout());
             ret.write_cvalue(fx, discr);
         };
         size_of, <T> () {