From 090a145d449c48ccc00a1a15269d618068354e93 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 10 Jan 2025 15:17:07 +0100 Subject: [PATCH] Use `strict_provenance` --- Cargo.lock | 7 ------- Cargo.toml | 2 +- crates/intern/Cargo.toml | 1 - crates/intern/src/symbol.rs | 37 +++++++------------------------------ 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f92668a6a978..2dfca7c4803e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -846,7 +846,6 @@ dependencies = [ "dashmap", "hashbrown", "rustc-hash 2.0.0", - "sptr", "triomphe", ] @@ -1927,12 +1926,6 @@ dependencies = [ "vfs", ] -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - [[package]] name = "stdx" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index 1029844cd3ab..c42ae171d866 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ exclude = ["crates/proc-macro-srv/proc-macro-test/imp"] resolver = "2" [workspace.package] -rust-version = "1.83" +rust-version = "1.84" edition = "2021" license = "MIT OR Apache-2.0" authors = ["rust-analyzer team"] diff --git a/crates/intern/Cargo.toml b/crates/intern/Cargo.toml index 5e7ee54c6af7..c0358ef929b4 100644 --- a/crates/intern/Cargo.toml +++ b/crates/intern/Cargo.toml @@ -19,7 +19,6 @@ dashmap.workspace = true hashbrown.workspace = true rustc-hash.workspace = true triomphe.workspace = true -sptr = "0.3.2" [lints] workspace = true diff --git a/crates/intern/src/symbol.rs b/crates/intern/src/symbol.rs index 200b14027f80..b3bf285edfb1 100644 --- a/crates/intern/src/symbol.rs +++ b/crates/intern/src/symbol.rs @@ -13,7 +13,6 @@ use std::{ use dashmap::{DashMap, SharedValue}; use hashbrown::{hash_map::RawEntryMut, HashMap}; use rustc_hash::FxHasher; -use sptr::Strict; use triomphe::Arc; pub mod symbols; @@ -84,7 +83,7 @@ impl TaggedArcPtr { #[inline] pub(crate) unsafe fn try_as_arc_owned(self) -> Option>>> { // Unpack the tag from the alignment niche - let tag = Strict::addr(self.packed.as_ptr()) & Self::BOOL_BITS; + let tag = self.packed.as_ptr().addr() & Self::BOOL_BITS; if tag != 0 { // Safety: We checked that the tag is non-zero -> true, so we are pointing to the data offset of an `Arc` Some(ManuallyDrop::new(unsafe { @@ -99,40 +98,18 @@ impl TaggedArcPtr { fn pack_arc(ptr: NonNull<*const str>) -> NonNull<*const str> { let packed_tag = true as usize; - // can't use this strict provenance stuff here due to trait methods not being const - // unsafe { - // // Safety: The pointer is derived from a non-null - // NonNull::new_unchecked(Strict::map_addr(ptr.as_ptr(), |addr| { - // // Safety: - // // - The pointer is `NonNull` => it's address is `NonZero` - // // - `P::BITS` least significant bits are always zero (`Pointer` contract) - // // - `T::BITS <= P::BITS` (from `Self::ASSERTION`) - // // - // // Thus `addr >> T::BITS` is guaranteed to be non-zero. - // // - // // `{non_zero} | packed_tag` can't make the value zero. - - // (addr >> Self::BOOL_BITS) | packed_tag - // })) - // } - // so what follows is roughly what the above looks like but inlined - - let self_addr = ptr.as_ptr() as *const *const str as usize; - let addr = self_addr | packed_tag; - let dest_addr = addr as isize; - let offset = dest_addr.wrapping_sub(self_addr as isize); - - // SAFETY: The resulting pointer is guaranteed to be NonNull as we only modify the niche bytes - unsafe { NonNull::new_unchecked(ptr.as_ptr().cast::().wrapping_offset(offset).cast()) } + unsafe { + // Safety: The pointer is derived from a non-null and bit-oring it with true (1) will + // not make it null. + NonNull::new_unchecked(ptr.as_ptr().map_addr(|addr| addr | packed_tag)) + } } #[inline] pub(crate) fn pointer(self) -> NonNull<*const str> { // SAFETY: The resulting pointer is guaranteed to be NonNull as we only modify the niche bytes unsafe { - NonNull::new_unchecked(Strict::map_addr(self.packed.as_ptr(), |addr| { - addr & !Self::BOOL_BITS - })) + NonNull::new_unchecked(self.packed.as_ptr().map_addr(|addr| addr & !Self::BOOL_BITS)) } }