From 1fe0d4e3839883bb88777173cd7775425a251085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Fri, 30 Nov 2018 19:55:11 +0100 Subject: [PATCH] Update mir_const_qualif --- src/librustc/arena.rs | 1 + src/librustc/query/mod.rs | 2 +- src/librustc_metadata/cstore_impl.rs | 2 +- src/librustc_mir/transform/qualify_consts.rs | 11 ++++------- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/librustc/arena.rs b/src/librustc/arena.rs index b8677280b10..af212741e9f 100644 --- a/src/librustc/arena.rs +++ b/src/librustc/arena.rs @@ -18,6 +18,7 @@ macro_rules! arena_types { [decode] specialization_graph: rustc::traits::specialization_graph::Graph, [] region_scope_tree: rustc::middle::region::ScopeTree, [] item_local_set: rustc::util::nodemap::ItemLocalSet, + [decode] mir_const_qualif: rustc_data_structures::bit_set::BitSet, ], $tcx); ) } diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index 18c977c43a7..d7e37862b88 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -91,7 +91,7 @@ rustc_queries! { /// Maps DefId's that have an associated Mir to the result /// of the MIR qualify_consts pass. The actual meaning of /// the value isn't known except to the pass itself. - query mir_const_qualif(key: DefId) -> (u8, Lrc>) { + query mir_const_qualif(key: DefId) -> (u8, &'tcx BitSet) { cache { key.is_local() } } diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 1a1b933ccf3..53f06baaa9d 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -131,7 +131,7 @@ provide! { <'tcx> tcx, def_id, other, cdata, mir } mir_const_qualif => { - (cdata.mir_const_qualif(def_id.index), Lrc::new(BitSet::new_empty(0))) + (cdata.mir_const_qualif(def_id.index), tcx.arena.alloc(BitSet::new_empty(0))) } fn_sig => { cdata.fn_sig(def_id.index, tcx) } inherent_impls => { Lrc::new(cdata.get_inherent_implementations_for_type(def_id.index)) } diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index bbcdd2c1812..18ad89be3c3 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -7,7 +7,6 @@ use rustc_data_structures::bit_set::BitSet; use rustc_data_structures::indexed_vec::IndexVec; use rustc_data_structures::fx::FxHashSet; -use rustc_data_structures::sync::Lrc; use rustc_target::spec::abi::Abi; use rustc::hir; use rustc::hir::def_id::DefId; @@ -833,7 +832,7 @@ impl<'a, 'tcx> Checker<'a, 'tcx> { } /// Check a whole const, static initializer or const fn. - fn check_const(&mut self) -> (u8, Lrc>) { + fn check_const(&mut self) -> (u8, &'tcx BitSet) { debug!("const-checking {} {:?}", self.mode, self.def_id); let mir = self.mir; @@ -907,8 +906,6 @@ impl<'a, 'tcx> Checker<'a, 'tcx> { } } - let promoted_temps = Lrc::new(promoted_temps); - let mut qualifs = self.qualifs_in_local(RETURN_PLACE); // Account for errors in consts by using the @@ -917,7 +914,7 @@ impl<'a, 'tcx> Checker<'a, 'tcx> { qualifs = self.qualifs_in_any_value_of_ty(mir.return_ty()); } - (qualifs.encode_to_bits(), promoted_temps) + (qualifs.encode_to_bits(), self.tcx.arena.alloc(promoted_temps)) } } @@ -1433,7 +1430,7 @@ pub fn provide(providers: &mut Providers<'_>) { fn mir_const_qualif<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) - -> (u8, Lrc>) { + -> (u8, &'tcx BitSet) { // N.B., this `borrow()` is guaranteed to be valid (i.e., the value // cannot yet be stolen), because `mir_validated()`, which steals // from `mir_const(), forces this query to execute before @@ -1442,7 +1439,7 @@ fn mir_const_qualif<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, if mir.return_ty().references_error() { tcx.sess.delay_span_bug(mir.span, "mir_const_qualif: Mir had errors"); - return (1 << IsNotPromotable::IDX, Lrc::new(BitSet::new_empty(0))); + return (1 << IsNotPromotable::IDX, tcx.arena.alloc(BitSet::new_empty(0))); } Checker::new(tcx, def_id, mir, Mode::Const).check_const()