Auto merge of #122662 - Mark-Simulacrum:optional-drop, r=bjorn3
Omit non-needs_drop drop_in_place in vtables This replaces the drop_in_place reference with null in vtables. On librustc_driver.so, this drops about ~17k (11%) dynamic relocations from the output, since many vtables can now be placed in read-only memory, rather than having a relocated pointer included. This makes a tradeoff by adding a null check at vtable call sites. I'm not sure that's readily avoidable without changing the vtable format (e.g., so that we can use a pc-relative relocation instead of an absolute address, and avoid the dynamic relocation that way). But it seems likely that the check is cheap at runtime. Accepted MCP: https://github.com/rust-lang/compiler-team/issues/730
This commit is contained in:
commit
8c4db851a7
7 changed files with 203 additions and 116 deletions
|
@ -84,10 +84,14 @@ pub(super) fn vtable_allocation_provider<'tcx>(
|
|||
let idx: u64 = u64::try_from(idx).unwrap();
|
||||
let scalar = match entry {
|
||||
VtblEntry::MetadataDropInPlace => {
|
||||
let instance = ty::Instance::resolve_drop_in_place(tcx, ty);
|
||||
let fn_alloc_id = tcx.reserve_and_set_fn_alloc(instance);
|
||||
let fn_ptr = Pointer::from(fn_alloc_id);
|
||||
Scalar::from_pointer(fn_ptr, &tcx)
|
||||
if ty.needs_drop(tcx, ty::ParamEnv::reveal_all()) {
|
||||
let instance = ty::Instance::resolve_drop_in_place(tcx, ty);
|
||||
let fn_alloc_id = tcx.reserve_and_set_fn_alloc(instance);
|
||||
let fn_ptr = Pointer::from(fn_alloc_id);
|
||||
Scalar::from_pointer(fn_ptr, &tcx)
|
||||
} else {
|
||||
Scalar::from_maybe_pointer(Pointer::null(), &tcx)
|
||||
}
|
||||
}
|
||||
VtblEntry::MetadataSize => Scalar::from_uint(size, ptr_size),
|
||||
VtblEntry::MetadataAlign => Scalar::from_uint(align, ptr_size),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue