make it more clear which functions create fresh AllocId

This commit is contained in:
Ralf Jung 2023-09-12 08:42:36 +02:00
parent a5b81faef0
commit 90d894e122

View File

@ -3,7 +3,7 @@
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use rustc_middle::mir::interpret::{ use rustc_middle::mir::interpret::{
read_target_uint, AllocId, ConstAllocation, ConstValue, ErrorHandled, GlobalAlloc, Scalar, read_target_uint, AllocId, ConstValue, ErrorHandled, GlobalAlloc, Scalar,
}; };
use cranelift_module::*; use cranelift_module::*;
@ -200,17 +200,14 @@ pub(crate) fn codegen_const_value<'tcx>(
CValue::by_val(val, layout) CValue::by_val(val, layout)
} }
}, },
ConstValue::Indirect { alloc_id, offset } => { ConstValue::Indirect { alloc_id, offset } => CValue::by_ref(
let alloc = fx.tcx.global_alloc(alloc_id).unwrap_memory(); pointer_for_allocation(fx, alloc_id)
// FIXME: avoid creating multiple allocations for the same AllocId? .offset_i64(fx, i64::try_from(offset.bytes()).unwrap()),
CValue::by_ref( layout,
pointer_for_allocation(fx, alloc) ),
.offset_i64(fx, i64::try_from(offset.bytes()).unwrap()),
layout,
)
}
ConstValue::Slice { data, start, end } => { ConstValue::Slice { data, start, end } => {
let ptr = pointer_for_allocation(fx, data) let alloc_id = fx.tcx.reserve_and_set_memory_alloc(data);
let ptr = pointer_for_allocation(fx, alloc_id)
.offset_i64(fx, i64::try_from(start).unwrap()) .offset_i64(fx, i64::try_from(start).unwrap())
.get_addr(fx); .get_addr(fx);
let len = fx let len = fx
@ -224,9 +221,9 @@ pub(crate) fn codegen_const_value<'tcx>(
fn pointer_for_allocation<'tcx>( fn pointer_for_allocation<'tcx>(
fx: &mut FunctionCx<'_, '_, 'tcx>, fx: &mut FunctionCx<'_, '_, 'tcx>,
alloc: ConstAllocation<'tcx>, alloc_id: AllocId,
) -> crate::pointer::Pointer { ) -> crate::pointer::Pointer {
let alloc_id = fx.tcx.create_memory_alloc(alloc); let alloc = fx.tcx.global_alloc(alloc_id).unwrap_memory();
let data_id = data_id_for_alloc_id( let data_id = data_id_for_alloc_id(
&mut fx.constants_cx, &mut fx.constants_cx,
&mut *fx.module, &mut *fx.module,
@ -357,6 +354,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
unreachable!() unreachable!()
} }
}; };
// FIXME: should we have a cache so we don't do this multiple times for the same `ConstAllocation`?
let data_id = *cx.anon_allocs.entry(alloc_id).or_insert_with(|| { let data_id = *cx.anon_allocs.entry(alloc_id).or_insert_with(|| {
module.declare_anonymous_data(alloc.inner().mutability.is_mut(), false).unwrap() module.declare_anonymous_data(alloc.inner().mutability.is_mut(), false).unwrap()
}); });