-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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`
- Loading branch information
Showing
10 changed files
with
657 additions
and
233 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
use std::ptr::Alignment; | ||
|
||
/// Returns the ABI-required minimum alignment of a type in bytes. | ||
/// | ||
/// This is equivalent to [`mem::align_of`], but also works for some unsized | ||
/// types (e.g. slices or rustc's `List`s). | ||
/// | ||
/// [`mem::align_of`]: std::mem::align_of | ||
pub const fn align_of<T: ?Sized + Aligned>() -> Alignment { | ||
T::ALIGN | ||
} | ||
|
||
/// A type with a statically known alignment. | ||
/// | ||
/// # Safety | ||
/// | ||
/// `Self::ALIGN` must be equal to the alignment of `Self`. For sized types it | ||
/// is [`mem::align_of<Self>()`], for unsized types it depends on the type, for | ||
/// example `[T]` has alignment of `T`. | ||
/// | ||
/// [`mem::align_of<Self>()`]: std::mem::align_of | ||
pub unsafe trait Aligned { | ||
/// Alignment of `Self`. | ||
const ALIGN: Alignment; | ||
} | ||
|
||
unsafe impl<T> Aligned for T { | ||
const ALIGN: Alignment = Alignment::of::<Self>(); | ||
} | ||
|
||
unsafe impl<T> Aligned for [T] { | ||
const ALIGN: Alignment = Alignment::of::<T>(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.