From 6d387463aa074982c8c6427a708cd9a18a6f58dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Fri, 31 May 2019 09:25:34 +0200 Subject: [PATCH] Remove GlobalArenas and use Arena instead --- src/librustc/arena.rs | 8 ++++ src/librustc/query/mod.rs | 6 +-- src/librustc/ty/context.rs | 56 +++++--------------------- src/librustc/ty/mod.rs | 2 +- src/librustc_metadata/cstore_impl.rs | 6 +-- src/librustc_mir/shim.rs | 2 +- src/librustc_mir/transform/mod.rs | 2 +- src/librustc_typeck/check/writeback.rs | 2 +- src/librustc_typeck/collect.rs | 4 +- src/libsyntax/attr/builtin.rs | 6 +-- 10 files changed, 33 insertions(+), 61 deletions(-) diff --git a/src/librustc/arena.rs b/src/librustc/arena.rs index c179b05683d..4a89bf3313b 100644 --- a/src/librustc/arena.rs +++ b/src/librustc/arena.rs @@ -19,6 +19,14 @@ use smallvec::SmallVec; macro_rules! arena_types { ($macro:path, $args:tt, $tcx:lifetime) => ( $macro!($args, [ + [] layouts: rustc::ty::layout::LayoutDetails, + [] generics: rustc::ty::Generics, + [] trait_def: rustc::ty::TraitDef, + [] adt_def: rustc::ty::AdtDef, + [] steal_mir: rustc::ty::steal::Steal>, + [] mir: rustc::mir::Body<$tcx>, + [] tables: rustc::ty::TypeckTables<$tcx>, + [] const_allocs: rustc::mir::interpret::Allocation, [] vtable_method: Option<( rustc::hir::def_id::DefId, rustc::ty::subst::SubstsRef<$tcx> diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index 81aa8d434d3..6df0323c1bf 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -42,7 +42,7 @@ rustc_queries! { load_cached(tcx, id) { let generics: Option = tcx.queries.on_disk_cache .try_load_query_result(tcx, id); - generics.map(|x| tcx.alloc_generics(x)) + generics.map(|x| &*tcx.arena.alloc(x)) } } @@ -118,7 +118,7 @@ rustc_queries! { load_cached(tcx, id) { let mir: Option> = tcx.queries.on_disk_cache .try_load_query_result(tcx, id); - mir.map(|x| tcx.alloc_mir(x)) + mir.map(|x| &*tcx.arena.alloc(x)) } } } @@ -353,7 +353,7 @@ rustc_queries! { .queries.on_disk_cache .try_load_query_result(tcx, id); - typeck_tables.map(|tables| tcx.alloc_tables(tables)) + typeck_tables.map(|tables| &*tcx.arena.alloc(tables)) } } } diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index ff218911ffb..b4823db9920 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -53,7 +53,7 @@ use smallvec::SmallVec; use rustc_data_structures::stable_hasher::{HashStable, hash_stable_hashmap, StableHasher, StableHasherResult, StableVec}; -use arena::{TypedArena, SyncDroplessArena}; +use arena::SyncDroplessArena; use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::sync::{Lrc, Lock, WorkerLocal}; use std::any::Any; @@ -79,37 +79,18 @@ use syntax_pos::Span; use crate::hir; -pub struct AllArenas<'tcx> { - pub global: WorkerLocal>, +pub struct AllArenas { pub interner: SyncDroplessArena, } -impl<'tcx> AllArenas<'tcx> { +impl AllArenas { pub fn new() -> Self { AllArenas { - global: WorkerLocal::new(|_| GlobalArenas::default()), interner: SyncDroplessArena::default(), } } } -/// Internal storage -#[derive(Default)] -pub struct GlobalArenas<'tcx> { - // internings - layout: TypedArena, - - // references - generics: TypedArena, - trait_def: TypedArena, - adt_def: TypedArena, - steal_mir: TypedArena>>, - mir: TypedArena>, - tables: TypedArena>, - /// miri allocations - const_allocs: TypedArena, -} - type InternedSet<'tcx, T> = Lock, ()>>; pub struct CtxtInterners<'tcx> { @@ -1043,7 +1024,7 @@ impl<'gcx> Deref for TyCtxt<'_, 'gcx, '_> { pub struct GlobalCtxt<'tcx> { pub arena: WorkerLocal>, - global_arenas: &'tcx WorkerLocal>, + global_interners: CtxtInterners<'tcx>, cstore: &'tcx CrateStoreDyn, @@ -1150,24 +1131,8 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { &self.hir_map } - pub fn alloc_generics(self, generics: ty::Generics) -> &'gcx ty::Generics { - self.global_arenas.generics.alloc(generics) - } - pub fn alloc_steal_mir(self, mir: Body<'gcx>) -> &'gcx Steal> { - self.global_arenas.steal_mir.alloc(Steal::new(mir)) - } - - pub fn alloc_mir(self, mir: Body<'gcx>) -> &'gcx Body<'gcx> { - self.global_arenas.mir.alloc(mir) - } - - pub fn alloc_tables(self, tables: ty::TypeckTables<'gcx>) -> &'gcx ty::TypeckTables<'gcx> { - self.global_arenas.tables.alloc(tables) - } - - pub fn alloc_trait_def(self, def: ty::TraitDef) -> &'gcx ty::TraitDef { - self.global_arenas.trait_def.alloc(def) + self.arena.alloc(Steal::new(mir)) } pub fn alloc_adt_def(self, @@ -1177,12 +1142,12 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { repr: ReprOptions) -> &'gcx ty::AdtDef { let def = ty::AdtDef::new(self, did, kind, variants, repr); - self.global_arenas.adt_def.alloc(def) + self.arena.alloc(def) } pub fn intern_const_alloc(self, alloc: Allocation) -> &'gcx Allocation { self.allocation_interner.borrow_mut().intern(alloc, |alloc| { - self.global_arenas.const_allocs.alloc(alloc) + self.arena.alloc(alloc) }) } @@ -1196,13 +1161,13 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { pub fn intern_stability(self, stab: attr::Stability) -> &'gcx attr::Stability { self.stability_interner.borrow_mut().intern(stab, |stab| { - self.global_interners.arena.alloc(stab) + self.arena.alloc(stab) }) } pub fn intern_layout(self, layout: LayoutDetails) -> &'gcx LayoutDetails { self.layout_interner.borrow_mut().intern(layout, |layout| { - self.global_arenas.layout.alloc(layout) + self.arena.alloc(layout) }) } @@ -1250,7 +1215,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { cstore: &'tcx CrateStoreDyn, local_providers: ty::query::Providers<'tcx>, extern_providers: ty::query::Providers<'tcx>, - arenas: &'tcx AllArenas<'tcx>, + arenas: &'tcx AllArenas, resolutions: ty::Resolutions, hir: hir_map::Map<'tcx>, on_disk_query_result_cache: query::OnDiskCache<'tcx>, @@ -1319,7 +1284,6 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { sess: s, cstore, arena: WorkerLocal::new(|_| Arena::default()), - global_arenas: &arenas.global, global_interners: interners, dep_graph, common, diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 0cbc0112a8e..094e1d05aeb 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -75,7 +75,7 @@ pub use self::sty::TyKind::*; pub use self::binding::BindingMode; pub use self::binding::BindingMode::*; -pub use self::context::{TyCtxt, FreeRegionInfo, GlobalArenas, AllArenas, tls, keep_local}; +pub use self::context::{TyCtxt, FreeRegionInfo, AllArenas, tls, keep_local}; pub use self::context::{Lift, TypeckTables, CtxtInterners, GlobalCtxt}; pub use self::context::{ UserTypeAnnotationIndex, UserType, CanonicalUserType, diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index cc79f7b077e..ea977e93cf6 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -94,7 +94,7 @@ impl IntoArgs for (CrateNum, DefId) { provide! { <'tcx> tcx, def_id, other, cdata, type_of => { cdata.get_type(def_id.index, tcx) } generics_of => { - tcx.alloc_generics(cdata.get_generics(def_id.index, tcx.sess)) + tcx.arena.alloc(cdata.get_generics(def_id.index, tcx.sess)) } predicates_of => { tcx.arena.alloc(cdata.get_predicates(def_id.index, tcx)) } predicates_defined_on => { @@ -102,7 +102,7 @@ provide! { <'tcx> tcx, def_id, other, cdata, } super_predicates_of => { tcx.arena.alloc(cdata.get_super_predicates(def_id.index, tcx)) } trait_def => { - tcx.alloc_trait_def(cdata.get_trait_def(def_id.index, tcx.sess)) + tcx.arena.alloc(cdata.get_trait_def(def_id.index, tcx.sess)) } adt_def => { cdata.get_adt_def(def_id.index, tcx) } adt_destructor => { @@ -129,7 +129,7 @@ provide! { <'tcx> tcx, def_id, other, cdata, bug!("get_optimized_mir: missing MIR for `{:?}`", def_id) }); - let mir = tcx.alloc_mir(mir); + let mir = tcx.arena.alloc(mir); mir } diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 087f8779b69..0cefc8c3a92 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -125,7 +125,7 @@ fn make_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, debug!("make_shim({:?}) = {:?}", instance, result); - tcx.alloc_mir(result) + tcx.arena.alloc(result) } #[derive(Copy, Clone, Debug, PartialEq)] diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 22b96a9db47..82193d98655 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -290,5 +290,5 @@ fn optimized_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx &add_call_guards::CriticalCallEdges, &dump_mir::Marker("PreCodegen"), ]); - tcx.alloc_mir(mir) + tcx.arena.alloc(mir) } diff --git a/src/librustc_typeck/check/writeback.rs b/src/librustc_typeck/check/writeback.rs index a856013b719..9e60bff200e 100644 --- a/src/librustc_typeck/check/writeback.rs +++ b/src/librustc_typeck/check/writeback.rs @@ -81,7 +81,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { item_def_id, wbcx.tables ); - self.tcx.alloc_tables(wbcx.tables) + self.tcx.arena.alloc(wbcx.tables) } } diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 3806fd0998b..c516fbc3bb9 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -763,7 +763,7 @@ fn trait_def<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty:: let is_marker = tcx.has_attr(def_id, sym::marker); let def_path_hash = tcx.def_path_hash(def_id); let def = ty::TraitDef::new(def_id, unsafety, paren_sugar, is_auto, is_marker, def_path_hash); - tcx.alloc_trait_def(def) + tcx.arena.alloc(def) } fn has_late_bound_regions<'a, 'tcx>( @@ -1110,7 +1110,7 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty .map(|param| (param.def_id, param.index)) .collect(); - tcx.alloc_generics(ty::Generics { + tcx.arena.alloc(ty::Generics { parent: parent_def_id, parent_count, params, diff --git a/src/libsyntax/attr/builtin.rs b/src/libsyntax/attr/builtin.rs index b96f13335b2..bf6eab4ec91 100644 --- a/src/libsyntax/attr/builtin.rs +++ b/src/libsyntax/attr/builtin.rs @@ -111,7 +111,7 @@ pub fn find_unwind_attr(diagnostic: Option<&Handler>, attrs: &[Attribute]) -> Op } /// Represents the #[stable], #[unstable], #[rustc_{deprecated,const_unstable}] attributes. -#[derive(RustcEncodable, RustcDecodable, Clone, Debug, PartialEq, Eq, Hash)] +#[derive(RustcEncodable, RustcDecodable, Copy, Clone, Debug, PartialEq, Eq, Hash)] pub struct Stability { pub level: StabilityLevel, pub feature: Symbol, @@ -127,7 +127,7 @@ pub struct Stability { } /// The available stability levels. -#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Clone, Debug, Eq, Hash)] +#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Copy, Clone, Debug, Eq, Hash)] pub enum StabilityLevel { // Reason for the current stability level and the relevant rust-lang issue Unstable { reason: Option, issue: u32 }, @@ -151,7 +151,7 @@ impl StabilityLevel { } } -#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Clone, Debug, Eq, Hash)] +#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Copy, Clone, Debug, Eq, Hash)] pub struct RustcDeprecation { pub since: Symbol, pub reason: Symbol,