@@ -107,6 +107,50 @@ impl<'tcx> CValue<'tcx> {
107
107
}
108
108
}
109
109
110
+ // FIXME remove
111
+ // Forces the data value of a dyn* value to the stack and returns a pointer to it as well as the
112
+ // vtable pointer.
113
+ pub ( crate ) fn dyn_star_force_data_on_stack (
114
+ self ,
115
+ fx : & mut FunctionCx < ' _ , ' _ , ' tcx > ,
116
+ ) -> ( Value , Value ) {
117
+ assert ! ( self . 1 . ty. is_dyn_star( ) ) ;
118
+
119
+ match self . 0 {
120
+ CValueInner :: ByRef ( ptr, None ) => {
121
+ let ( a_scalar, b_scalar) = match self . 1 . abi {
122
+ Abi :: ScalarPair ( a, b) => ( a, b) ,
123
+ _ => unreachable ! ( "dyn_star_force_data_on_stack({:?})" , self ) ,
124
+ } ;
125
+ let b_offset = scalar_pair_calculate_b_offset ( fx. tcx , a_scalar, b_scalar) ;
126
+ let clif_ty2 = scalar_to_clif_type ( fx. tcx , b_scalar) ;
127
+ let mut flags = MemFlags :: new ( ) ;
128
+ flags. set_notrap ( ) ;
129
+ let vtable = ptr. offset ( fx, b_offset) . load ( fx, clif_ty2, flags) ;
130
+ ( ptr. get_addr ( fx) , vtable)
131
+ }
132
+ CValueInner :: ByValPair ( data, vtable) => {
133
+ let stack_slot = fx. bcx . create_sized_stack_slot ( StackSlotData {
134
+ kind : StackSlotKind :: ExplicitSlot ,
135
+ // FIXME Don't force the size to a multiple of 16 bytes once Cranelift gets a way to
136
+ // specify stack slot alignment.
137
+ size : ( u32:: try_from ( fx. target_config . pointer_type ( ) . bytes ( ) ) . unwrap ( ) + 15 )
138
+ / 16
139
+ * 16 ,
140
+ } ) ;
141
+ let data_ptr = Pointer :: stack_slot ( stack_slot) ;
142
+ let mut flags = MemFlags :: new ( ) ;
143
+ flags. set_notrap ( ) ;
144
+ data_ptr. store ( fx, data, flags) ;
145
+
146
+ ( data_ptr. get_addr ( fx) , vtable)
147
+ }
148
+ CValueInner :: ByRef ( _, Some ( _) ) | CValueInner :: ByVal ( _) => {
149
+ unreachable ! ( "dyn_star_force_data_on_stack({:?})" , self )
150
+ }
151
+ }
152
+ }
153
+
110
154
pub ( crate ) fn try_to_ptr ( self ) -> Option < ( Pointer , Option < Value > ) > {
111
155
match self . 0 {
112
156
CValueInner :: ByRef ( ptr, meta) => Some ( ( ptr, meta) ) ,
0 commit comments