Skip to content

Commit

Permalink
interpret, codegen: tweak some comments and checks regarding Box with…
Browse files Browse the repository at this point in the history
… custom allocator
  • Loading branch information
RalfJung committed Aug 31, 2024
1 parent fa72f07 commit d0aedfb
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 6 deletions.
2 changes: 2 additions & 0 deletions compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
// need to make sure that we don't break existing debuginfo consumers
// by doing that (at least not without a warning period).
let layout_type = if ptr_type.is_box() {
// The assertion at the start of this function ensures we have a ZST allocator.
// We'll make debuginfo "skip" all ZST allocators, not just the default allocator.
Ty::new_mut_ptr(cx.tcx, pointee_type)
} else {
ptr_type
Expand Down
12 changes: 7 additions & 5 deletions compiler/rustc_const_eval/src/interpret/place.rs
Original file line number Diff line number Diff line change
Expand Up @@ -438,14 +438,16 @@ where
&self,
src: &impl Readable<'tcx, M::Provenance>,
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::Provenance>> {
if src.layout().ty.is_box() {
// Derefer should have removed all Box derefs.
// Some `Box` are not immediates (if they have a custom allocator)
// so the code below would fail.
bug!("dereferencing {}", src.layout().ty);
}

let val = self.read_immediate(src)?;
trace!("deref to {} on {:?}", val.layout.ty, *val);

if val.layout.ty.is_box() {
// Derefer should have removed all Box derefs
bug!("dereferencing {}", val.layout.ty);
}

let mplace = self.ref_to_mplace(&val)?;
Ok(mplace)
}
Expand Down
5 changes: 4 additions & 1 deletion compiler/rustc_middle/src/ty/sty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1149,7 +1149,10 @@ impl<'tcx> Ty<'tcx> {
}
}

/// Tests whether this is a Box using the global allocator.
/// Tests whether this is a Box definitely using the global allocator.
///
/// If the allocator is still generic, the answer is `false`, but it may
/// later turn out that it does use the global allocator.
#[inline]
pub fn is_box_global(self, tcx: TyCtxt<'tcx>) -> bool {
match self.kind() {
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_mir_transform/src/add_retag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ impl<'tcx> MirPass<'tcx> for AddRetag {
// Using `is_box_global` here is a bit sketchy: if this code is
// generic over the allocator, we'll not add a retag! This is a hack
// to make Stacked Borrows compatible with custom allocator code.
// It means the raw pointer inherits the tag of the box, which mostly works
// but can sometimes lead to unexpected aliasing errors.
// Long-term, we'll want to move to an aliasing model where "cast to
// raw pointer" is a complete NOP, and then this will no longer be
// an issue.
Expand Down

0 comments on commit d0aedfb

Please sign in to comment.