Auto merge of #110243 - WaffleLapkin:bless_tagged_pointers🙏, r=Nilstrieb
Tagged pointers, now with strict provenance! This is a big refactor of tagged pointers in rustc, with three main goals: 1. Porting the code to the strict provenance 2. Cleanup the code 3. Document the code (and safety invariants) better This PR has grown quite a bit (almost a complete rewrite at this point...), so I'm not sure what's the best way to review this, but reviewing commit-by-commit should be fine. r? `@Nilstrieb`
This commit is contained in:
commit
7908a1d654
10 changed files with 665 additions and 241 deletions
|
@ -59,6 +59,7 @@
|
|||
#![feature(result_option_inspect)]
|
||||
#![feature(const_option)]
|
||||
#![feature(trait_alias)]
|
||||
#![feature(ptr_alignment_type)]
|
||||
#![recursion_limit = "512"]
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use crate::arena::Arena;
|
||||
use rustc_data_structures::aligned::{align_of, Aligned};
|
||||
use rustc_serialize::{Encodable, Encoder};
|
||||
use std::alloc::Layout;
|
||||
use std::cmp::Ordering;
|
||||
|
@ -198,22 +199,17 @@ impl<'a, T: Copy> IntoIterator for &'a List<T> {
|
|||
|
||||
unsafe impl<T: Sync> Sync for List<T> {}
|
||||
|
||||
unsafe impl<'a, T: 'a> rustc_data_structures::tagged_ptr::Pointer for &'a List<T> {
|
||||
const BITS: usize = std::mem::align_of::<usize>().trailing_zeros() as usize;
|
||||
// Safety:
|
||||
// Layouts of `Equivalent<T>` and `List<T>` are the same, modulo opaque tail,
|
||||
// thus aligns of `Equivalent<T>` and `List<T>` must be the same.
|
||||
unsafe impl<T> Aligned for List<T> {
|
||||
const ALIGN: ptr::Alignment = {
|
||||
#[repr(C)]
|
||||
struct Equivalent<T> {
|
||||
_len: usize,
|
||||
_data: [T; 0],
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn into_usize(self) -> usize {
|
||||
self as *const List<T> as usize
|
||||
}
|
||||
|
||||
#[inline]
|
||||
unsafe fn from_usize(ptr: usize) -> &'a List<T> {
|
||||
&*(ptr as *const List<T>)
|
||||
}
|
||||
|
||||
unsafe fn with_ref<R, F: FnOnce(&Self) -> R>(ptr: usize, f: F) -> R {
|
||||
// `Self` is `&'a List<T>` which impls `Copy`, so this is fine.
|
||||
let ptr = Self::from_usize(ptr);
|
||||
f(&ptr)
|
||||
}
|
||||
align_of::<Equivalent<T>>()
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1627,7 +1627,8 @@ struct ParamTag {
|
|||
}
|
||||
|
||||
unsafe impl rustc_data_structures::tagged_ptr::Tag for ParamTag {
|
||||
const BITS: usize = 2;
|
||||
const BITS: u32 = 2;
|
||||
|
||||
#[inline]
|
||||
fn into_usize(self) -> usize {
|
||||
match self {
|
||||
|
@ -1637,6 +1638,7 @@ unsafe impl rustc_data_structures::tagged_ptr::Tag for ParamTag {
|
|||
Self { reveal: traits::Reveal::All, constness: hir::Constness::Const } => 3,
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
unsafe fn from_usize(ptr: usize) -> Self {
|
||||
match ptr {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue