提交 6d387463 编写于 作者: J John Kåre Alsaker

Remove GlobalArenas and use Arena instead

上级 3ade426e
...@@ -19,6 +19,14 @@ ...@@ -19,6 +19,14 @@
macro_rules! arena_types { macro_rules! arena_types {
($macro:path, $args:tt, $tcx:lifetime) => ( ($macro:path, $args:tt, $tcx:lifetime) => (
$macro!($args, [ $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<rustc::mir::Body<$tcx>>,
[] mir: rustc::mir::Body<$tcx>,
[] tables: rustc::ty::TypeckTables<$tcx>,
[] const_allocs: rustc::mir::interpret::Allocation,
[] vtable_method: Option<( [] vtable_method: Option<(
rustc::hir::def_id::DefId, rustc::hir::def_id::DefId,
rustc::ty::subst::SubstsRef<$tcx> rustc::ty::subst::SubstsRef<$tcx>
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
load_cached(tcx, id) { load_cached(tcx, id) {
let generics: Option<ty::Generics> = tcx.queries.on_disk_cache let generics: Option<ty::Generics> = tcx.queries.on_disk_cache
.try_load_query_result(tcx, id); .try_load_query_result(tcx, id);
generics.map(|x| tcx.alloc_generics(x)) generics.map(|x| &*tcx.arena.alloc(x))
} }
} }
...@@ -118,7 +118,7 @@ ...@@ -118,7 +118,7 @@
load_cached(tcx, id) { load_cached(tcx, id) {
let mir: Option<crate::mir::Body<'tcx>> = tcx.queries.on_disk_cache let mir: Option<crate::mir::Body<'tcx>> = tcx.queries.on_disk_cache
.try_load_query_result(tcx, id); .try_load_query_result(tcx, id);
mir.map(|x| tcx.alloc_mir(x)) mir.map(|x| &*tcx.arena.alloc(x))
} }
} }
} }
...@@ -353,7 +353,7 @@ ...@@ -353,7 +353,7 @@
.queries.on_disk_cache .queries.on_disk_cache
.try_load_query_result(tcx, id); .try_load_query_result(tcx, id);
typeck_tables.map(|tables| tcx.alloc_tables(tables)) typeck_tables.map(|tables| &*tcx.arena.alloc(tables))
} }
} }
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
use rustc_data_structures::stable_hasher::{HashStable, hash_stable_hashmap, use rustc_data_structures::stable_hasher::{HashStable, hash_stable_hashmap,
StableHasher, StableHasherResult, StableHasher, StableHasherResult,
StableVec}; StableVec};
use arena::{TypedArena, SyncDroplessArena}; use arena::SyncDroplessArena;
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use rustc_data_structures::sync::{Lrc, Lock, WorkerLocal}; use rustc_data_structures::sync::{Lrc, Lock, WorkerLocal};
use std::any::Any; use std::any::Any;
...@@ -79,37 +79,18 @@ ...@@ -79,37 +79,18 @@
use crate::hir; use crate::hir;
pub struct AllArenas<'tcx> { pub struct AllArenas {
pub global: WorkerLocal<GlobalArenas<'tcx>>,
pub interner: SyncDroplessArena, pub interner: SyncDroplessArena,
} }
impl<'tcx> AllArenas<'tcx> { impl AllArenas {
pub fn new() -> Self { pub fn new() -> Self {
AllArenas { AllArenas {
global: WorkerLocal::new(|_| GlobalArenas::default()),
interner: SyncDroplessArena::default(), interner: SyncDroplessArena::default(),
} }
} }
} }
/// Internal storage
#[derive(Default)]
pub struct GlobalArenas<'tcx> {
// internings
layout: TypedArena<LayoutDetails>,
// references
generics: TypedArena<ty::Generics>,
trait_def: TypedArena<ty::TraitDef>,
adt_def: TypedArena<ty::AdtDef>,
steal_mir: TypedArena<Steal<Body<'tcx>>>,
mir: TypedArena<Body<'tcx>>,
tables: TypedArena<ty::TypeckTables<'tcx>>,
/// miri allocations
const_allocs: TypedArena<interpret::Allocation>,
}
type InternedSet<'tcx, T> = Lock<FxHashMap<Interned<'tcx, T>, ()>>; type InternedSet<'tcx, T> = Lock<FxHashMap<Interned<'tcx, T>, ()>>;
pub struct CtxtInterners<'tcx> { pub struct CtxtInterners<'tcx> {
...@@ -1043,7 +1024,7 @@ fn deref(&self) -> &Self::Target { ...@@ -1043,7 +1024,7 @@ fn deref(&self) -> &Self::Target {
pub struct GlobalCtxt<'tcx> { pub struct GlobalCtxt<'tcx> {
pub arena: WorkerLocal<Arena<'tcx>>, pub arena: WorkerLocal<Arena<'tcx>>,
global_arenas: &'tcx WorkerLocal<GlobalArenas<'tcx>>,
global_interners: CtxtInterners<'tcx>, global_interners: CtxtInterners<'tcx>,
cstore: &'tcx CrateStoreDyn, cstore: &'tcx CrateStoreDyn,
...@@ -1150,24 +1131,8 @@ pub fn hir(self) -> &'a hir_map::Map<'gcx> { ...@@ -1150,24 +1131,8 @@ pub fn hir(self) -> &'a hir_map::Map<'gcx> {
&self.hir_map &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<Body<'gcx>> { pub fn alloc_steal_mir(self, mir: Body<'gcx>) -> &'gcx Steal<Body<'gcx>> {
self.global_arenas.steal_mir.alloc(Steal::new(mir)) self.arena.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)
} }
pub fn alloc_adt_def(self, pub fn alloc_adt_def(self,
...@@ -1177,12 +1142,12 @@ pub fn alloc_adt_def(self, ...@@ -1177,12 +1142,12 @@ pub fn alloc_adt_def(self,
repr: ReprOptions) repr: ReprOptions)
-> &'gcx ty::AdtDef { -> &'gcx ty::AdtDef {
let def = ty::AdtDef::new(self, did, kind, variants, repr); 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 { pub fn intern_const_alloc(self, alloc: Allocation) -> &'gcx Allocation {
self.allocation_interner.borrow_mut().intern(alloc, |alloc| { self.allocation_interner.borrow_mut().intern(alloc, |alloc| {
self.global_arenas.const_allocs.alloc(alloc) self.arena.alloc(alloc)
}) })
} }
...@@ -1196,13 +1161,13 @@ pub fn allocate_bytes(self, bytes: &[u8]) -> interpret::AllocId { ...@@ -1196,13 +1161,13 @@ pub fn allocate_bytes(self, bytes: &[u8]) -> interpret::AllocId {
pub fn intern_stability(self, stab: attr::Stability) -> &'gcx attr::Stability { pub fn intern_stability(self, stab: attr::Stability) -> &'gcx attr::Stability {
self.stability_interner.borrow_mut().intern(stab, |stab| { 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 { pub fn intern_layout(self, layout: LayoutDetails) -> &'gcx LayoutDetails {
self.layout_interner.borrow_mut().intern(layout, |layout| { self.layout_interner.borrow_mut().intern(layout, |layout| {
self.global_arenas.layout.alloc(layout) self.arena.alloc(layout)
}) })
} }
...@@ -1250,7 +1215,7 @@ pub fn create_global_ctxt( ...@@ -1250,7 +1215,7 @@ pub fn create_global_ctxt(
cstore: &'tcx CrateStoreDyn, cstore: &'tcx CrateStoreDyn,
local_providers: ty::query::Providers<'tcx>, local_providers: ty::query::Providers<'tcx>,
extern_providers: ty::query::Providers<'tcx>, extern_providers: ty::query::Providers<'tcx>,
arenas: &'tcx AllArenas<'tcx>, arenas: &'tcx AllArenas,
resolutions: ty::Resolutions, resolutions: ty::Resolutions,
hir: hir_map::Map<'tcx>, hir: hir_map::Map<'tcx>,
on_disk_query_result_cache: query::OnDiskCache<'tcx>, on_disk_query_result_cache: query::OnDiskCache<'tcx>,
...@@ -1319,7 +1284,6 @@ pub fn create_global_ctxt( ...@@ -1319,7 +1284,6 @@ pub fn create_global_ctxt(
sess: s, sess: s,
cstore, cstore,
arena: WorkerLocal::new(|_| Arena::default()), arena: WorkerLocal::new(|_| Arena::default()),
global_arenas: &arenas.global,
global_interners: interners, global_interners: interners,
dep_graph, dep_graph,
common, common,
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
pub use self::binding::BindingMode; pub use self::binding::BindingMode;
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::{Lift, TypeckTables, CtxtInterners, GlobalCtxt};
pub use self::context::{ pub use self::context::{
UserTypeAnnotationIndex, UserType, CanonicalUserType, UserTypeAnnotationIndex, UserType, CanonicalUserType,
......
...@@ -94,7 +94,7 @@ fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) } ...@@ -94,7 +94,7 @@ fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) }
provide! { <'tcx> tcx, def_id, other, cdata, provide! { <'tcx> tcx, def_id, other, cdata,
type_of => { cdata.get_type(def_id.index, tcx) } type_of => { cdata.get_type(def_id.index, tcx) }
generics_of => { 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_of => { tcx.arena.alloc(cdata.get_predicates(def_id.index, tcx)) }
predicates_defined_on => { predicates_defined_on => {
...@@ -102,7 +102,7 @@ fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) } ...@@ -102,7 +102,7 @@ fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) }
} }
super_predicates_of => { tcx.arena.alloc(cdata.get_super_predicates(def_id.index, tcx)) } super_predicates_of => { tcx.arena.alloc(cdata.get_super_predicates(def_id.index, tcx)) }
trait_def => { 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_def => { cdata.get_adt_def(def_id.index, tcx) }
adt_destructor => { adt_destructor => {
...@@ -129,7 +129,7 @@ fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) } ...@@ -129,7 +129,7 @@ fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) }
bug!("get_optimized_mir: missing MIR for `{:?}`", def_id) bug!("get_optimized_mir: missing MIR for `{:?}`", def_id)
}); });
let mir = tcx.alloc_mir(mir); let mir = tcx.arena.alloc(mir);
mir mir
} }
......
...@@ -125,7 +125,7 @@ fn make_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ...@@ -125,7 +125,7 @@ fn make_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
debug!("make_shim({:?}) = {:?}", instance, result); debug!("make_shim({:?}) = {:?}", instance, result);
tcx.alloc_mir(result) tcx.arena.alloc(result)
} }
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]
......
...@@ -290,5 +290,5 @@ fn optimized_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ...@@ -290,5 +290,5 @@ fn optimized_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx
&add_call_guards::CriticalCallEdges, &add_call_guards::CriticalCallEdges,
&dump_mir::Marker("PreCodegen"), &dump_mir::Marker("PreCodegen"),
]); ]);
tcx.alloc_mir(mir) tcx.arena.alloc(mir)
} }
...@@ -81,7 +81,7 @@ pub fn resolve_type_vars_in_body(&self, body: &'gcx hir::Body) -> &'gcx ty::Type ...@@ -81,7 +81,7 @@ pub fn resolve_type_vars_in_body(&self, body: &'gcx hir::Body) -> &'gcx ty::Type
item_def_id, wbcx.tables item_def_id, wbcx.tables
); );
self.tcx.alloc_tables(wbcx.tables) self.tcx.arena.alloc(wbcx.tables)
} }
} }
......
...@@ -763,7 +763,7 @@ fn trait_def<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty:: ...@@ -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 is_marker = tcx.has_attr(def_id, sym::marker);
let def_path_hash = tcx.def_path_hash(def_id); 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); 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>( 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 ...@@ -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)) .map(|param| (param.def_id, param.index))
.collect(); .collect();
tcx.alloc_generics(ty::Generics { tcx.arena.alloc(ty::Generics {
parent: parent_def_id, parent: parent_def_id,
parent_count, parent_count,
params, params,
......
...@@ -111,7 +111,7 @@ pub fn find_unwind_attr(diagnostic: Option<&Handler>, attrs: &[Attribute]) -> Op ...@@ -111,7 +111,7 @@ pub fn find_unwind_attr(diagnostic: Option<&Handler>, attrs: &[Attribute]) -> Op
} }
/// Represents the #[stable], #[unstable], #[rustc_{deprecated,const_unstable}] attributes. /// 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 struct Stability {
pub level: StabilityLevel, pub level: StabilityLevel,
pub feature: Symbol, pub feature: Symbol,
...@@ -127,7 +127,7 @@ pub struct Stability { ...@@ -127,7 +127,7 @@ pub struct Stability {
} }
/// The available stability levels. /// 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 { pub enum StabilityLevel {
// Reason for the current stability level and the relevant rust-lang issue // Reason for the current stability level and the relevant rust-lang issue
Unstable { reason: Option<Symbol>, issue: u32 }, Unstable { reason: Option<Symbol>, issue: u32 },
...@@ -151,7 +151,7 @@ pub fn is_stable(&self) -> bool { ...@@ -151,7 +151,7 @@ pub fn is_stable(&self) -> bool {
} }
} }
#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Clone, Debug, Eq, Hash)] #[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Copy, Clone, Debug, Eq, Hash)]
pub struct RustcDeprecation { pub struct RustcDeprecation {
pub since: Symbol, pub since: Symbol,
pub reason: Symbol, pub reason: Symbol,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册