@@ -195,9 +195,8 @@ pub(crate) fn codegen_const_value<'tcx>(
195
195
}
196
196
Scalar :: Ptr ( ptr, _size) => {
197
197
let ( alloc_id, offset) = ptr. into_parts ( ) ; // we know the `offset` is relative
198
- let alloc_kind = fx. tcx . get_global_alloc ( alloc_id) ;
199
- let base_addr = match alloc_kind {
200
- Some ( GlobalAlloc :: Memory ( alloc) ) => {
198
+ let base_addr = match fx. tcx . global_alloc ( alloc_id) {
199
+ GlobalAlloc :: Memory ( alloc) => {
201
200
let data_id = data_id_for_alloc_id (
202
201
& mut fx. constants_cx ,
203
202
fx. module ,
@@ -211,13 +210,27 @@ pub(crate) fn codegen_const_value<'tcx>(
211
210
}
212
211
fx. bcx . ins ( ) . global_value ( fx. pointer_type , local_data_id)
213
212
}
214
- Some ( GlobalAlloc :: Function ( instance) ) => {
213
+ GlobalAlloc :: Function ( instance) => {
215
214
let func_id = crate :: abi:: import_function ( fx. tcx , fx. module , instance) ;
216
215
let local_func_id =
217
216
fx. module . declare_func_in_func ( func_id, & mut fx. bcx . func ) ;
218
217
fx. bcx . ins ( ) . func_addr ( fx. pointer_type , local_func_id)
219
218
}
220
- Some ( GlobalAlloc :: Static ( def_id) ) => {
219
+ GlobalAlloc :: VTable ( ty, trait_ref) => {
220
+ let alloc_id = fx. tcx . vtable_allocation ( ( ty, trait_ref) ) ;
221
+ let alloc = fx. tcx . global_alloc ( alloc_id) . unwrap_memory ( ) ;
222
+ // FIXME: factor this common code with the `Memory` arm into a function?
223
+ let data_id = data_id_for_alloc_id (
224
+ & mut fx. constants_cx ,
225
+ fx. module ,
226
+ alloc_id,
227
+ alloc. inner ( ) . mutability ,
228
+ ) ;
229
+ let local_data_id =
230
+ fx. module . declare_data_in_func ( data_id, & mut fx. bcx . func ) ;
231
+ fx. bcx . ins ( ) . global_value ( fx. pointer_type , local_data_id)
232
+ }
233
+ GlobalAlloc :: Static ( def_id) => {
221
234
assert ! ( fx. tcx. is_static( def_id) ) ;
222
235
let data_id = data_id_for_static ( fx. tcx , fx. module , def_id, false ) ;
223
236
let local_data_id =
@@ -227,7 +240,6 @@ pub(crate) fn codegen_const_value<'tcx>(
227
240
}
228
241
fx. bcx . ins ( ) . global_value ( fx. pointer_type , local_data_id)
229
242
}
230
- None => bug ! ( "missing allocation {:?}" , alloc_id) ,
231
243
} ;
232
244
let val = if offset. bytes ( ) != 0 {
233
245
fx. bcx . ins ( ) . iadd_imm ( base_addr, i64:: try_from ( offset. bytes ( ) ) . unwrap ( ) )
@@ -361,10 +373,11 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
361
373
while let Some ( todo_item) = cx. todo . pop ( ) {
362
374
let ( data_id, alloc, section_name) = match todo_item {
363
375
TodoItem :: Alloc ( alloc_id) => {
364
- //println!("alloc_id {}", alloc_id);
365
- let alloc = match tcx. get_global_alloc ( alloc_id) . unwrap ( ) {
376
+ let alloc = match tcx. global_alloc ( alloc_id) {
366
377
GlobalAlloc :: Memory ( alloc) => alloc,
367
- GlobalAlloc :: Function ( _) | GlobalAlloc :: Static ( _) => unreachable ! ( ) ,
378
+ GlobalAlloc :: Function ( _) | GlobalAlloc :: Static ( _) | GlobalAlloc :: VTable ( ..) => {
379
+ unreachable ! ( )
380
+ }
368
381
} ;
369
382
let data_id = * cx. anon_allocs . entry ( alloc_id) . or_insert_with ( || {
370
383
module
@@ -428,7 +441,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
428
441
read_target_uint ( endianness, bytes) . unwrap ( )
429
442
} ;
430
443
431
- let reloc_target_alloc = tcx. get_global_alloc ( alloc_id) . unwrap ( ) ;
444
+ let reloc_target_alloc = tcx. global_alloc ( alloc_id) ;
432
445
let data_id = match reloc_target_alloc {
433
446
GlobalAlloc :: Function ( instance) => {
434
447
assert_eq ! ( addend, 0 ) ;
@@ -441,6 +454,10 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
441
454
GlobalAlloc :: Memory ( target_alloc) => {
442
455
data_id_for_alloc_id ( cx, module, alloc_id, target_alloc. inner ( ) . mutability )
443
456
}
457
+ GlobalAlloc :: VTable ( ty, trait_ref) => {
458
+ let alloc_id = tcx. vtable_allocation ( ( ty, trait_ref) ) ;
459
+ data_id_for_alloc_id ( cx, module, alloc_id, Mutability :: Not )
460
+ }
444
461
GlobalAlloc :: Static ( def_id) => {
445
462
if tcx. codegen_fn_attrs ( def_id) . flags . contains ( CodegenFnAttrFlags :: THREAD_LOCAL )
446
463
{
0 commit comments