Update to rustc-rayon 0.3.1
This pulls in rust-lang/rustc-rayon#8 to fix #81425. (h/t @ammaraskar) That revealed weak constraints on `rustc_arena::DropArena`, because its `DropType` was holding type-erased raw pointers to generic `T`. We can implement `Send` for `DropType` (under `cfg(parallel_compiler)`) by requiring all `T: Send` before they're type-erased.
This commit is contained in:
parent
f98721f886
commit
f7e75a2124
34
Cargo.lock
34
Cargo.lock
@ -844,15 +844,6 @@ dependencies = [
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-queue"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
|
||||
dependencies = [
|
||||
"crossbeam-utils 0.6.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-queue"
|
||||
version = "0.2.3"
|
||||
@ -864,16 +855,6 @@ dependencies = [
|
||||
"maybe-uninit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.6.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.7.2"
|
||||
@ -3013,7 +2994,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-queue 0.2.3",
|
||||
"crossbeam-queue",
|
||||
"crossbeam-utils 0.7.2",
|
||||
"lazy_static",
|
||||
"num_cpus",
|
||||
@ -3581,9 +3562,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustc-rayon"
|
||||
version = "0.3.0"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f32767f90d938f1b7199a174ef249ae1924f6e5bbdb9d112fea141e016f25b3a"
|
||||
checksum = "ed7d6a39f8bfd4421ce720918234d1e672b83824c91345b47c93746839cf1629"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"either",
|
||||
@ -3592,13 +3573,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustc-rayon-core"
|
||||
version = "0.3.0"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3"
|
||||
checksum = "e94187d9ea3e8c38fafdbc38acb94eafa7ce155867f6ccb13830466a0d0db8c6"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-queue 0.1.2",
|
||||
"crossbeam-utils 0.6.6",
|
||||
"crossbeam-queue",
|
||||
"crossbeam-utils 0.7.2",
|
||||
"lazy_static",
|
||||
"num_cpus",
|
||||
]
|
||||
@ -3661,6 +3642,7 @@ dependencies = [
|
||||
name = "rustc_arena"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"rustc_data_structures",
|
||||
"smallvec 1.6.1",
|
||||
]
|
||||
|
||||
|
@ -5,4 +5,5 @@ version = "0.0.0"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
smallvec = { version = "1.6.1", features = ["union", "may_dangle"] }
|
||||
|
@ -17,6 +17,7 @@
|
||||
#![feature(min_specialization)]
|
||||
#![cfg_attr(test, feature(test))]
|
||||
|
||||
use rustc_data_structures::sync;
|
||||
use smallvec::SmallVec;
|
||||
|
||||
use std::alloc::Layout;
|
||||
@ -556,8 +557,19 @@ struct DropType {
|
||||
obj: *mut u8,
|
||||
}
|
||||
|
||||
unsafe fn drop_for_type<T>(to_drop: *mut u8) {
|
||||
std::ptr::drop_in_place(to_drop as *mut T)
|
||||
// SAFETY: we require `T: Send` before type-erasing into `DropType`.
|
||||
#[cfg(parallel_compiler)]
|
||||
unsafe impl sync::Send for DropType {}
|
||||
|
||||
impl DropType {
|
||||
#[inline]
|
||||
unsafe fn new<T: sync::Send>(obj: *mut T) -> Self {
|
||||
unsafe fn drop_for_type<T>(to_drop: *mut u8) {
|
||||
std::ptr::drop_in_place(to_drop as *mut T)
|
||||
}
|
||||
|
||||
DropType { drop_fn: drop_for_type::<T>, obj: obj as *mut u8 }
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for DropType {
|
||||
@ -585,21 +597,26 @@ pub struct DropArena {
|
||||
|
||||
impl DropArena {
|
||||
#[inline]
|
||||
pub unsafe fn alloc<T>(&self, object: T) -> &mut T {
|
||||
pub unsafe fn alloc<T>(&self, object: T) -> &mut T
|
||||
where
|
||||
T: sync::Send,
|
||||
{
|
||||
let mem = self.arena.alloc_raw(Layout::new::<T>()) as *mut T;
|
||||
// Write into uninitialized memory.
|
||||
ptr::write(mem, object);
|
||||
let result = &mut *mem;
|
||||
// Record the destructor after doing the allocation as that may panic
|
||||
// and would cause `object`'s destructor to run twice if it was recorded before.
|
||||
self.destructors
|
||||
.borrow_mut()
|
||||
.push(DropType { drop_fn: drop_for_type::<T>, obj: result as *mut T as *mut u8 });
|
||||
self.destructors.borrow_mut().push(DropType::new(result));
|
||||
result
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn alloc_from_iter<T, I: IntoIterator<Item = T>>(&self, iter: I) -> &mut [T] {
|
||||
pub unsafe fn alloc_from_iter<T, I>(&self, iter: I) -> &mut [T]
|
||||
where
|
||||
T: sync::Send,
|
||||
I: IntoIterator<Item = T>,
|
||||
{
|
||||
let mut vec: SmallVec<[_; 8]> = iter.into_iter().collect();
|
||||
if vec.is_empty() {
|
||||
return &mut [];
|
||||
@ -620,8 +637,7 @@ pub unsafe fn alloc_from_iter<T, I: IntoIterator<Item = T>>(&self, iter: I) -> &
|
||||
// Record the destructors after doing the allocation as that may panic
|
||||
// and would cause `object`'s destructor to run twice if it was recorded before.
|
||||
for i in 0..len {
|
||||
destructors
|
||||
.push(DropType { drop_fn: drop_for_type::<T>, obj: start_ptr.add(i) as *mut u8 });
|
||||
destructors.push(DropType::new(start_ptr.add(i)));
|
||||
}
|
||||
|
||||
slice::from_raw_parts_mut(start_ptr, len)
|
||||
|
@ -19,8 +19,8 @@ rustc_graphviz = { path = "../rustc_graphviz" }
|
||||
cfg-if = "0.1.2"
|
||||
crossbeam-utils = { version = "0.7", features = ["nightly"] }
|
||||
stable_deref_trait = "1.0.0"
|
||||
rayon = { version = "0.3.0", package = "rustc-rayon" }
|
||||
rayon-core = { version = "0.3.0", package = "rustc-rayon-core" }
|
||||
rayon = { version = "0.3.1", package = "rustc-rayon" }
|
||||
rayon-core = { version = "0.3.1", package = "rustc-rayon-core" }
|
||||
rustc-hash = "1.1.0"
|
||||
smallvec = { version = "1.6.1", features = ["union", "may_dangle"] }
|
||||
rustc_index = { path = "../rustc_index", package = "rustc_index" }
|
||||
|
@ -10,8 +10,8 @@ doctest = false
|
||||
[dependencies]
|
||||
libc = "0.2"
|
||||
tracing = "0.1"
|
||||
rustc-rayon-core = "0.3.0"
|
||||
rayon = { version = "0.3.0", package = "rustc-rayon" }
|
||||
rustc-rayon-core = "0.3.1"
|
||||
rayon = { version = "0.3.1", package = "rustc-rayon" }
|
||||
smallvec = { version = "1.6.1", features = ["union", "may_dangle"] }
|
||||
rustc_ast = { path = "../rustc_ast" }
|
||||
rustc_attr = { path = "../rustc_attr" }
|
||||
|
@ -11,7 +11,7 @@ doctest = false
|
||||
rustc_arena = { path = "../rustc_arena" }
|
||||
bitflags = "1.2.1"
|
||||
tracing = "0.1"
|
||||
rustc-rayon-core = "0.3.0"
|
||||
rustc-rayon-core = "0.3.1"
|
||||
polonius-engine = "0.12.0"
|
||||
rustc_apfloat = { path = "../rustc_apfloat" }
|
||||
rustc_attr = { path = "../rustc_attr" }
|
||||
|
@ -9,7 +9,7 @@ doctest = false
|
||||
|
||||
[dependencies]
|
||||
measureme = "9.0.0"
|
||||
rustc-rayon-core = "0.3.0"
|
||||
rustc-rayon-core = "0.3.1"
|
||||
tracing = "0.1"
|
||||
rustc_ast = { path = "../rustc_ast" }
|
||||
rustc_attr = { path = "../rustc_attr" }
|
||||
|
@ -10,7 +10,7 @@ doctest = false
|
||||
[dependencies]
|
||||
rustc_arena = { path = "../rustc_arena" }
|
||||
tracing = "0.1"
|
||||
rustc-rayon-core = "0.3.0"
|
||||
rustc-rayon-core = "0.3.1"
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
|
Loading…
Reference in New Issue
Block a user