1
1
use super :: PlaceTy ;
2
- use crate :: {
3
- assembly:: MethodCompileCtx ,
4
- assert_morphic,
5
- r#type:: { fat_ptr_to, pointer_to_is_fat} ,
6
- } ;
2
+ use crate :: pointer_to_is_fat;
7
3
use cilly:: {
8
- call,
4
+ Assembly , Const , IntoAsmIndex , NodeIdx , Type , call,
9
5
cil_node:: CILNode ,
10
6
conv_usize, ld_field,
11
- v2:: { cilnode:: MethodKind , FieldDesc , Int , MethodRef } ,
12
- Assembly , Const , IntoAsmIndex , NodeIdx , Type ,
7
+ v2:: { FieldDesc , Int , MethodRef , cilnode:: MethodKind } ,
13
8
} ;
9
+ use rustc_codegen_clr_ctx:: MethodCompileCtx ;
10
+ use rustc_codegen_clr_type:: { adt:: { enum_field_descriptor, field_descrptor, FieldOffsetIterator } , r#type:: fat_ptr_to, GetTypeExt } ;
14
11
use rustc_middle:: {
15
12
mir:: PlaceElem ,
16
13
ty:: { Ty , TyKind } ,
@@ -55,7 +52,7 @@ pub fn address_last_dereference<'tcx>(
55
52
pointer_to_is_fat ( target_ty, ctx. tcx ( ) , ctx. instance ( ) ) ,
56
53
) {
57
54
( true , false ) => {
58
- let data_ptr_name = ctx. alloc_string ( crate :: DATA_PTR ) ;
55
+ let data_ptr_name = ctx. alloc_string ( cilly :: DATA_PTR ) ;
59
56
let void_ptr = ctx. nptr ( Type :: Void ) ;
60
57
CILNode :: LDIndPtr {
61
58
ptr : Box :: new ( CILNode :: LDField {
@@ -89,21 +86,22 @@ fn field_address<'a>(
89
86
let curr_type = ctx. monomorphize ( curr_type) ;
90
87
let field_ty = ctx. monomorphize ( field_type) ;
91
88
match (
92
- crate :: r#type :: pointer_to_is_fat ( curr_type, ctx. tcx ( ) , ctx. instance ( ) ) ,
93
- crate :: r#type :: pointer_to_is_fat ( field_ty, ctx. tcx ( ) , ctx. instance ( ) ) ,
89
+ pointer_to_is_fat ( curr_type, ctx. tcx ( ) , ctx. instance ( ) ) ,
90
+ pointer_to_is_fat ( field_ty, ctx. tcx ( ) , ctx. instance ( ) ) ,
94
91
) {
95
92
( false , false ) => {
96
- let field_desc = crate :: utilis :: field_descrptor ( curr_type, field_index, ctx) ;
97
- CILNode :: LDFieldAdress {
98
- addr : addr_calc. into ( ) ,
99
- field : ( field_desc) ,
100
- }
93
+ let field_desc = field_descrptor ( curr_type, field_index, ctx) ;
94
+ CILNode :: LDFieldAdress {
95
+ addr : addr_calc. into ( ) ,
96
+ field : ( field_desc) ,
97
+ }
101
98
}
102
- ( false , true ) => panic ! ( "Sized type {curr_type:?} contains an unsized field of type {field_ty}. This is a bug." ) ,
103
- ( true , false ) =>{
104
- let mut explicit_offset_iter = crate :: utilis:: adt:: FieldOffsetIterator :: fields (
105
- ctx. layout_of ( curr_type) . layout . 0 . 0 . clone ( ) ,
106
- ) ;
99
+ ( false , true ) => panic ! (
100
+ "Sized type {curr_type:?} contains an unsized field of type {field_ty}. This is a bug."
101
+ ) ,
102
+ ( true , false ) => {
103
+ let mut explicit_offset_iter =
104
+ FieldOffsetIterator :: fields ( ctx. layout_of ( curr_type) . layout . 0 . 0 . clone ( ) ) ;
107
105
let offset = explicit_offset_iter
108
106
. nth ( field_index as usize )
109
107
. expect ( "Field index not in field offset iterator" ) ;
@@ -112,19 +110,23 @@ fn field_address<'a>(
112
110
curr_type,
113
111
rustc_middle:: ty:: Mutability :: Mut ,
114
112
) ) ;
115
- let data_ptr_name = ctx. alloc_string ( crate :: DATA_PTR ) ;
113
+ let data_ptr_name = ctx. alloc_string ( cilly :: DATA_PTR ) ;
116
114
let void_ptr = ctx. nptr ( Type :: Void ) ;
117
- let addr_descr = ctx. alloc_field ( FieldDesc :: new ( curr_type_fat_ptr. as_class_ref ( ) . unwrap ( ) , data_ptr_name, void_ptr) ) ;
115
+ let addr_descr = ctx. alloc_field ( FieldDesc :: new (
116
+ curr_type_fat_ptr. as_class_ref ( ) . unwrap ( ) ,
117
+ data_ptr_name,
118
+ void_ptr,
119
+ ) ) ;
118
120
// Get the address of the unsized object.
119
- let obj_addr = ld_field ! ( addr_calc, addr_descr) ;
121
+ let obj_addr = ld_field ! ( addr_calc, addr_descr) ;
120
122
let obj = ctx. type_from_cache ( field_type) ;
121
123
// Add the offset to the object.
122
- ( obj_addr + CILNode :: V2 ( ctx. alloc_node ( Const :: USize ( u64:: from ( offset) ) ) ) ) . cast_ptr ( ctx . nptr ( obj ) )
123
- } ,
124
- ( true , true ) => {
125
- let mut explicit_offset_iter = crate :: utilis :: adt :: FieldOffsetIterator :: fields (
126
- ctx . layout_of ( curr_type ) . layout . 0 . 0 . clone ( ) ,
127
- ) ;
124
+ ( obj_addr + CILNode :: V2 ( ctx. alloc_node ( Const :: USize ( u64:: from ( offset) ) ) ) )
125
+ . cast_ptr ( ctx . nptr ( obj ) )
126
+ }
127
+ ( true , true ) => {
128
+ let mut explicit_offset_iter =
129
+ FieldOffsetIterator :: fields ( ctx . layout_of ( curr_type ) . layout . 0 . 0 . clone ( ) ) ;
128
130
let offset = explicit_offset_iter
129
131
. nth ( field_index as usize )
130
132
. expect ( "Field index not in field offset iterator" ) ;
@@ -133,29 +135,37 @@ fn field_address<'a>(
133
135
curr_type,
134
136
rustc_middle:: ty:: Mutability :: Mut ,
135
137
) ) ;
136
- let data_ptr_name = ctx. alloc_string ( crate :: DATA_PTR ) ;
137
- let metadata_name = ctx. alloc_string ( crate :: METADATA ) ;
138
- let void_ptr = ctx. nptr ( Type :: Void ) ;
138
+ let data_ptr_name = ctx. alloc_string ( cilly :: DATA_PTR ) ;
139
+ let metadata_name = ctx. alloc_string ( cilly :: METADATA ) ;
140
+ let void_ptr = ctx. nptr ( Type :: Void ) ;
139
141
140
- let addr_descr = ctx. alloc_field ( FieldDesc :: new ( curr_type_fat_ptr. as_class_ref ( ) . unwrap ( ) , data_ptr_name, void_ptr) ) ;
141
- // Get the address of the unsized object.
142
- let obj_addr = ld_field ! ( addr_calc. clone( ) , addr_descr) ;
143
- let metadata_descr = ctx. alloc_field ( FieldDesc :: new ( curr_type_fat_ptr. as_class_ref ( ) . unwrap ( ) , metadata_name, Type :: Int ( Int :: USize ) ) ) ;
144
- let metadata = ld_field ! ( addr_calc, metadata_descr) ;
145
- let ptr = obj_addr
146
- + CILNode :: V2 ( ctx. alloc_node ( Const :: USize ( u64:: from ( offset) ) ) ) ;
147
- let field_fat_ptr = ctx. type_from_cache ( Ty :: new_ptr (
148
- ctx. tcx ( ) ,
149
- field_ty,
150
- rustc_middle:: ty:: Mutability :: Mut ,
151
- ) ) ;
152
- CILNode :: create_slice ( field_fat_ptr. as_class_ref ( ) . unwrap ( ) , ctx, metadata, ptr)
142
+ let addr_descr = ctx. alloc_field ( FieldDesc :: new (
143
+ curr_type_fat_ptr. as_class_ref ( ) . unwrap ( ) ,
144
+ data_ptr_name,
145
+ void_ptr,
146
+ ) ) ;
147
+ // Get the address of the unsized object.
148
+ let obj_addr = ld_field ! ( addr_calc. clone( ) , addr_descr) ;
149
+ let metadata_descr = ctx. alloc_field ( FieldDesc :: new (
150
+ curr_type_fat_ptr. as_class_ref ( ) . unwrap ( ) ,
151
+ metadata_name,
152
+ Type :: Int ( Int :: USize ) ,
153
+ ) ) ;
154
+ let metadata = ld_field ! ( addr_calc, metadata_descr) ;
155
+ let ptr =
156
+ obj_addr + CILNode :: V2 ( ctx. alloc_node ( Const :: USize ( u64:: from ( offset) ) ) ) ;
157
+ let field_fat_ptr = ctx. type_from_cache ( Ty :: new_ptr (
158
+ ctx. tcx ( ) ,
159
+ field_ty,
160
+ rustc_middle:: ty:: Mutability :: Mut ,
161
+ ) ) ;
162
+ CILNode :: create_slice ( field_fat_ptr. as_class_ref ( ) . unwrap ( ) , ctx, metadata, ptr)
153
163
}
154
164
}
155
165
}
156
166
super :: PlaceTy :: EnumVariant ( enm, var_idx) => {
157
167
let owner = ctx. monomorphize ( enm) ;
158
- let field_desc = crate :: utilis :: enum_field_descriptor ( owner, field_index, var_idx, ctx) ;
168
+ let field_desc = enum_field_descriptor ( owner, field_index, var_idx, ctx) ;
159
169
CILNode :: LDFieldAdress {
160
170
addr : addr_calc. into ( ) ,
161
171
field : field_desc,
@@ -171,7 +181,6 @@ pub fn place_elem_adress<'tcx>(
171
181
addr_calc : CILNode ,
172
182
) -> CILNode {
173
183
let curr_type = curr_type. monomorphize ( ctx) ;
174
- assert_morphic ! ( curr_type) ;
175
184
176
185
match place_elem {
177
186
PlaceElem :: Deref => address_last_dereference ( place_ty, curr_type, ctx, addr_calc) ,
@@ -182,14 +191,14 @@ pub fn place_elem_adress<'tcx>(
182
191
let curr_ty = curr_type
183
192
. as_ty ( )
184
193
. expect ( "INVALID PLACE: Indexing into enum variant???" ) ;
185
- let index = crate :: place :: local_get ( index. as_usize ( ) , ctx. body ( ) , ctx) ;
194
+ let index = crate :: local_get ( index. as_usize ( ) , ctx. body ( ) , ctx) ;
186
195
match curr_ty. kind ( ) {
187
196
TyKind :: Slice ( inner) => {
188
197
let inner = ctx. monomorphize ( * inner) ;
189
198
let inner_type = ctx. type_from_cache ( inner) ;
190
199
let slice = fat_ptr_to ( inner, ctx) ;
191
200
192
- let data_ptr_name = ctx. alloc_string ( crate :: DATA_PTR ) ;
201
+ let data_ptr_name = ctx. alloc_string ( cilly :: DATA_PTR ) ;
193
202
let void_ptr = ctx. nptr ( Type :: Void ) ;
194
203
let desc = ctx. alloc_field ( FieldDesc :: new ( slice, data_ptr_name, void_ptr) ) ;
195
204
// This is a false positive
@@ -210,21 +219,21 @@ pub fn place_elem_adress<'tcx>(
210
219
call ! ( ctx. alloc_methodref( mref) , [ addr_calc, CILNode :: V2 ( index) ] )
211
220
}
212
221
_ => {
213
- todo ! ( "Can't index into {curr_ty}!" )
222
+ todo ! ( "Can't index into {curr_ty}!" )
214
223
}
215
224
}
216
225
}
217
226
PlaceElem :: Subslice { from, to, from_end } => {
218
227
let curr_type = fat_ptr_to ( curr_type. as_ty ( ) . expect ( "Can't index into an enum!" ) , ctx) ;
219
228
220
229
if * from_end {
221
- let metadata_name = ctx. alloc_string ( crate :: METADATA ) ;
230
+ let metadata_name = ctx. alloc_string ( cilly :: METADATA ) ;
222
231
let metadata_field = ctx. alloc_field ( FieldDesc :: new (
223
232
curr_type,
224
233
metadata_name,
225
234
Type :: Int ( Int :: USize ) ,
226
235
) ) ;
227
- let data_ptr_name = ctx. alloc_string ( crate :: DATA_PTR ) ;
236
+ let data_ptr_name = ctx. alloc_string ( cilly :: DATA_PTR ) ;
228
237
let void_ptr = ctx. nptr ( Type :: Void ) ;
229
238
let ptr_field = ctx. alloc_field ( FieldDesc :: new ( curr_type, data_ptr_name, void_ptr) ) ;
230
239
let metadata = CILNode :: Sub (
@@ -236,7 +245,7 @@ pub fn place_elem_adress<'tcx>(
236
245
CILNode :: create_slice ( curr_type, ctx, metadata, data_ptr)
237
246
} else {
238
247
let void_ptr = ctx. nptr ( Type :: Void ) ;
239
- let data_ptr = ctx. alloc_string ( crate :: DATA_PTR ) ;
248
+ let data_ptr = ctx. alloc_string ( cilly :: DATA_PTR ) ;
240
249
241
250
let ptr_field = ctx. alloc_field ( FieldDesc :: new ( curr_type, data_ptr, void_ptr) ) ;
242
251
let metadata = CILNode :: V2 ( ctx. alloc_node ( Const :: USize ( to - from) ) ) ;
@@ -264,9 +273,9 @@ pub fn place_elem_adress<'tcx>(
264
273
let inner_type = ctx. type_from_cache ( inner) ;
265
274
let slice = fat_ptr_to ( Ty :: new_slice ( ctx. tcx ( ) , inner) , ctx) ;
266
275
let void_ptr = ctx. nptr ( Type :: Void ) ;
267
- let data_ptr = ctx. alloc_string ( crate :: DATA_PTR ) ;
276
+ let data_ptr = ctx. alloc_string ( cilly :: DATA_PTR ) ;
268
277
let desc = ctx. alloc_field ( FieldDesc :: new ( slice, data_ptr, void_ptr) ) ;
269
- let metadata = ctx. alloc_string ( crate :: METADATA ) ;
278
+ let metadata = ctx. alloc_string ( cilly :: METADATA ) ;
270
279
let len =
271
280
ctx. alloc_field ( FieldDesc :: new ( slice, metadata, Type :: Int ( Int :: USize ) ) ) ;
272
281
let index = if * from_end {
0 commit comments