mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-15 20:45:45 +03:00
Rollup merge of #49030 - Zoxc:misc, r=michaelwoerister
Misc changes from my parallel rustc branch r? @michaelwoerister
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
use syntax_pos::Span;
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::rc::Rc;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
|
||||
pub type EvalResult<'tcx> = Result<&'tcx ty::Const<'tcx>, ConstEvalErr<'tcx>>;
|
||||
|
||||
@@ -52,7 +52,7 @@ pub fn unwrap_u64(&self) -> u64 {
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ConstEvalErr<'tcx> {
|
||||
pub span: Span,
|
||||
pub kind: Rc<ErrKind<'tcx>>,
|
||||
pub kind: Lrc<ErrKind<'tcx>>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
use traits::query::CanonicalTyGoal;
|
||||
use ty::{self, Ty, TyCtxt};
|
||||
use ty::subst::Kind;
|
||||
use std::rc::Rc;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
|
||||
impl<'cx, 'gcx, 'tcx> At<'cx, 'gcx, 'tcx> {
|
||||
/// Given a type `ty` of some value being dropped, computes a set
|
||||
@@ -183,13 +183,13 @@ impl<'a, 'tcx> Lift<'tcx> for DropckOutlivesResult<'a> {
|
||||
|
||||
impl<'gcx: 'tcx, 'tcx> Canonicalize<'gcx, 'tcx> for QueryResult<'tcx, DropckOutlivesResult<'tcx>> {
|
||||
// we ought to intern this, but I'm too lazy just now
|
||||
type Canonicalized = Rc<Canonical<'gcx, QueryResult<'gcx, DropckOutlivesResult<'gcx>>>>;
|
||||
type Canonicalized = Lrc<Canonical<'gcx, QueryResult<'gcx, DropckOutlivesResult<'gcx>>>>;
|
||||
|
||||
fn intern(
|
||||
_gcx: TyCtxt<'_, 'gcx, 'gcx>,
|
||||
value: Canonical<'gcx, Self::Lifted>,
|
||||
) -> Self::Canonicalized {
|
||||
Rc::new(value)
|
||||
Lrc::new(value)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
use infer::canonical::{Canonical, Canonicalize, QueryResult};
|
||||
use middle::const_val::ConstVal;
|
||||
use mir::interpret::GlobalId;
|
||||
use std::rc::Rc;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use traits::{Obligation, ObligationCause, PredicateObligation, Reveal};
|
||||
use traits::query::CanonicalProjectionGoal;
|
||||
use traits::project::Normalized;
|
||||
@@ -259,13 +259,13 @@ fn intern(
|
||||
|
||||
impl<'gcx: 'tcx, 'tcx> Canonicalize<'gcx, 'tcx> for QueryResult<'tcx, NormalizationResult<'tcx>> {
|
||||
// we ought to intern this, but I'm too lazy just now
|
||||
type Canonicalized = Rc<Canonical<'gcx, QueryResult<'gcx, NormalizationResult<'gcx>>>>;
|
||||
type Canonicalized = Lrc<Canonical<'gcx, QueryResult<'gcx, NormalizationResult<'gcx>>>>;
|
||||
|
||||
fn intern(
|
||||
_gcx: TyCtxt<'_, 'gcx, 'gcx>,
|
||||
value: Canonical<'gcx, Self::Lifted>,
|
||||
) -> Self::Canonicalized {
|
||||
Rc::new(value)
|
||||
Lrc::new(value)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+17
-15
@@ -161,12 +161,12 @@ fn intern_ty(&self, st: TypeVariants<'tcx>,
|
||||
-> Ty<'tcx> {
|
||||
let ty = {
|
||||
let mut interner = self.type_.borrow_mut();
|
||||
let global_interner = global_interners.map(|interners| {
|
||||
interners.type_.borrow_mut()
|
||||
});
|
||||
if let Some(&Interned(ty)) = interner.get(&st) {
|
||||
return ty;
|
||||
}
|
||||
let global_interner = global_interners.map(|interners| {
|
||||
interners.type_.borrow_mut()
|
||||
});
|
||||
if let Some(ref interner) = global_interner {
|
||||
if let Some(&Interned(ty)) = interner.get(&st) {
|
||||
return ty;
|
||||
@@ -1010,17 +1010,16 @@ pub fn reserve(
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> GlobalCtxt<'tcx> {
|
||||
impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
/// Get the global TyCtxt.
|
||||
pub fn global_tcx<'a>(&'a self) -> TyCtxt<'a, 'tcx, 'tcx> {
|
||||
#[inline]
|
||||
pub fn global_tcx(self) -> TyCtxt<'a, 'gcx, 'gcx> {
|
||||
TyCtxt {
|
||||
gcx: self,
|
||||
interners: &self.global_interners
|
||||
gcx: self.gcx,
|
||||
interners: &self.gcx.global_interners,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn alloc_generics(self, generics: ty::Generics) -> &'gcx ty::Generics {
|
||||
self.global_arenas.generics.alloc(generics)
|
||||
}
|
||||
@@ -1081,12 +1080,13 @@ pub fn intern_const_alloc(
|
||||
self,
|
||||
alloc: interpret::Allocation,
|
||||
) -> &'gcx interpret::Allocation {
|
||||
if let Some(alloc) = self.interpret_interner.inner.borrow().allocs.get(&alloc) {
|
||||
let allocs = &mut self.interpret_interner.inner.borrow_mut().allocs;
|
||||
if let Some(alloc) = allocs.get(&alloc) {
|
||||
return alloc;
|
||||
}
|
||||
|
||||
let interned = self.global_arenas.const_allocs.alloc(alloc);
|
||||
if let Some(prev) = self.interpret_interner.inner.borrow_mut().allocs.replace(interned) {
|
||||
if let Some(prev) = allocs.replace(interned) {
|
||||
bug!("Tried to overwrite interned Allocation: {:#?}", prev)
|
||||
}
|
||||
interned
|
||||
@@ -1113,24 +1113,26 @@ pub fn allocate_cached(self, bytes: &[u8]) -> interpret::AllocId {
|
||||
}
|
||||
|
||||
pub fn intern_stability(self, stab: attr::Stability) -> &'gcx attr::Stability {
|
||||
if let Some(st) = self.stability_interner.borrow().get(&stab) {
|
||||
let mut stability_interner = self.stability_interner.borrow_mut();
|
||||
if let Some(st) = stability_interner.get(&stab) {
|
||||
return st;
|
||||
}
|
||||
|
||||
let interned = self.global_interners.arena.alloc(stab);
|
||||
if let Some(prev) = self.stability_interner.borrow_mut().replace(interned) {
|
||||
if let Some(prev) = stability_interner.replace(interned) {
|
||||
bug!("Tried to overwrite interned Stability: {:?}", prev)
|
||||
}
|
||||
interned
|
||||
}
|
||||
|
||||
pub fn intern_layout(self, layout: LayoutDetails) -> &'gcx LayoutDetails {
|
||||
if let Some(layout) = self.layout_interner.borrow().get(&layout) {
|
||||
let mut layout_interner = self.layout_interner.borrow_mut();
|
||||
if let Some(layout) = layout_interner.get(&layout) {
|
||||
return layout;
|
||||
}
|
||||
|
||||
let interned = self.global_arenas.layout.alloc(layout);
|
||||
if let Some(prev) = self.layout_interner.borrow_mut().replace(interned) {
|
||||
if let Some(prev) = layout_interner.replace(interned) {
|
||||
bug!("Tried to overwrite interned Layout: {:?}", prev)
|
||||
}
|
||||
interned
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
|
||||
use rustc_data_structures::accumulate_vec::AccumulateVec;
|
||||
use rustc_data_structures::indexed_vec::{IndexVec, Idx};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use mir::interpret;
|
||||
|
||||
use std::rc::Rc;
|
||||
@@ -465,7 +466,7 @@ fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lif
|
||||
tcx.lift(&*self.kind).map(|kind| {
|
||||
ConstEvalErr {
|
||||
span: self.span,
|
||||
kind: Rc::new(kind),
|
||||
kind: Lrc::new(kind),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -76,6 +76,14 @@
|
||||
pub mod sync;
|
||||
pub mod owning_ref;
|
||||
|
||||
pub struct OnDrop<F: Fn()>(pub F);
|
||||
|
||||
impl<F: Fn()> Drop for OnDrop<F> {
|
||||
fn drop(&mut self) {
|
||||
(self.0)();
|
||||
}
|
||||
}
|
||||
|
||||
// See comments in src/librustc/lib.rs
|
||||
#[doc(hidden)]
|
||||
pub fn __noop_fix_for_27438() {}
|
||||
|
||||
@@ -26,11 +26,6 @@
|
||||
//!
|
||||
//! `MTLock` is a mutex which disappears if cfg!(parallel_queries) is false.
|
||||
//!
|
||||
//! `rustc_global!` gives us a way to declare variables which are intended to be
|
||||
//! global for the current rustc session. This currently maps to thread-locals,
|
||||
//! since rustdoc uses the rustc libraries in multiple threads.
|
||||
//! These globals should eventually be moved into the `Session` structure.
|
||||
//!
|
||||
//! `rustc_erase_owner!` erases a OwningRef owner into Erased or Erased + Send + Sync
|
||||
//! depending on the value of cfg!(parallel_queries).
|
||||
|
||||
@@ -228,31 +223,6 @@ pub fn assert_sync<T: ?Sized + Sync>() {}
|
||||
pub fn assert_send_val<T: ?Sized + Send>(_t: &T) {}
|
||||
pub fn assert_send_sync_val<T: ?Sized + Sync + Send>(_t: &T) {}
|
||||
|
||||
#[macro_export]
|
||||
#[allow_internal_unstable]
|
||||
macro_rules! rustc_global {
|
||||
// empty (base case for the recursion)
|
||||
() => {};
|
||||
|
||||
// process multiple declarations
|
||||
($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => (
|
||||
thread_local!($(#[$attr])* $vis static $name: $t = $init);
|
||||
rustc_global!($($rest)*);
|
||||
);
|
||||
|
||||
// handle a single declaration
|
||||
($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr) => (
|
||||
thread_local!($(#[$attr])* $vis static $name: $t = $init);
|
||||
);
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! rustc_access_global {
|
||||
($name:path, $callback:expr) => {
|
||||
$name.with($callback)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Copy + Debug> Debug for LockCell<T> {
|
||||
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
||||
f.debug_struct("LockCell")
|
||||
@@ -363,6 +333,13 @@ pub fn borrow_mut(&self) -> LockGuard<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Default> Default for Lock<T> {
|
||||
#[inline]
|
||||
fn default() -> Self {
|
||||
Lock::new(T::default())
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Probably a bad idea
|
||||
impl<T: Clone> Clone for Lock<T> {
|
||||
#[inline]
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
use std::fmt;
|
||||
use std::error::Error;
|
||||
use std::rc::Rc;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
|
||||
pub fn mk_borrowck_eval_cx<'a, 'mir, 'tcx>(
|
||||
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
@@ -485,7 +485,7 @@ pub fn const_eval_provider<'a, 'tcx>(
|
||||
// Do match-check before building MIR
|
||||
if tcx.check_match(def_id).is_err() {
|
||||
return Err(ConstEvalErr {
|
||||
kind: Rc::new(CheckMatchError),
|
||||
kind: Lrc::new(CheckMatchError),
|
||||
span,
|
||||
});
|
||||
}
|
||||
@@ -497,7 +497,7 @@ pub fn const_eval_provider<'a, 'tcx>(
|
||||
// Do not continue into miri if typeck errors occurred; it will fail horribly
|
||||
if tables.tainted_by_errors {
|
||||
return Err(ConstEvalErr {
|
||||
kind: Rc::new(TypeckError),
|
||||
kind: Lrc::new(TypeckError),
|
||||
span,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
use rustc::ty::{self, ParamEnvAnd, Ty, TyCtxt};
|
||||
use rustc::ty::subst::Subst;
|
||||
use rustc::util::nodemap::FxHashSet;
|
||||
use std::rc::Rc;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use syntax::codemap::{Span, DUMMY_SP};
|
||||
use util;
|
||||
|
||||
crate fn dropck_outlives<'tcx>(
|
||||
tcx: TyCtxt<'_, 'tcx, 'tcx>,
|
||||
goal: CanonicalTyGoal<'tcx>,
|
||||
) -> Result<Rc<Canonical<'tcx, QueryResult<'tcx, DropckOutlivesResult<'tcx>>>>, NoSolution> {
|
||||
) -> Result<Lrc<Canonical<'tcx, QueryResult<'tcx, DropckOutlivesResult<'tcx>>>>, NoSolution> {
|
||||
debug!("dropck_outlives(goal={:#?})", goal);
|
||||
|
||||
tcx.infer_ctxt().enter(|ref infcx| {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
use rustc::traits::query::{CanonicalProjectionGoal, NoSolution, normalize::NormalizationResult};
|
||||
use rustc::ty::{ParamEnvAnd, TyCtxt};
|
||||
use rustc::util::common::CellUsizeExt;
|
||||
use std::rc::Rc;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use syntax::ast::DUMMY_NODE_ID;
|
||||
use syntax_pos::DUMMY_SP;
|
||||
use util;
|
||||
@@ -22,7 +22,7 @@
|
||||
crate fn normalize_projection_ty<'tcx>(
|
||||
tcx: TyCtxt<'_, 'tcx, 'tcx>,
|
||||
goal: CanonicalProjectionGoal<'tcx>,
|
||||
) -> Result<Rc<Canonical<'tcx, QueryResult<'tcx, NormalizationResult<'tcx>>>>, NoSolution> {
|
||||
) -> Result<Lrc<Canonical<'tcx, QueryResult<'tcx, NormalizationResult<'tcx>>>>, NoSolution> {
|
||||
debug!("normalize_provider(goal={:#?})", goal);
|
||||
|
||||
tcx.sess.perf_stats.normalize_projection_ty.increment();
|
||||
|
||||
@@ -184,8 +184,12 @@ pub fn with_ctxt(&self, ctxt: SyntaxContext) -> Span {
|
||||
}
|
||||
}
|
||||
|
||||
// The interner in thread-local, so `Span` shouldn't move between threads.
|
||||
// The interner is pointed to by a thread local value which is only set on the main thread
|
||||
// with parallelization is disabled. So we don't allow Span to transfer between threads
|
||||
// to avoid panics and other errors, even though it would be memory safe to do so.
|
||||
#[cfg(not(parallel_queries))]
|
||||
impl !Send for Span {}
|
||||
#[cfg(not(parallel_queries))]
|
||||
impl !Sync for Span {}
|
||||
|
||||
impl PartialOrd for Span {
|
||||
|
||||
@@ -83,8 +83,12 @@ fn decode<D: Decoder>(d: &mut D) -> Result<Ident, D::Error> {
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub struct Symbol(u32);
|
||||
|
||||
// The interner in thread-local, so `Symbol` shouldn't move between threads.
|
||||
// The interner is pointed to by a thread local value which is only set on the main thread
|
||||
// with parallelization is disabled. So we don't allow Symbol to transfer between threads
|
||||
// to avoid panics and other errors, even though it would be memory safe to do so.
|
||||
#[cfg(not(parallel_queries))]
|
||||
impl !Send for Symbol { }
|
||||
#[cfg(not(parallel_queries))]
|
||||
impl !Sync for Symbol { }
|
||||
|
||||
impl Symbol {
|
||||
|
||||
@@ -20,8 +20,7 @@
|
||||
use syntax::parse::ParseSess;
|
||||
use syntax::codemap::{FilePathMapping, dummy_spanned};
|
||||
use syntax::print::pprust::expr_to_string;
|
||||
use syntax::ast::{Expr, ExprKind, LitKind, StrStyle, RangeLimits};
|
||||
use syntax::symbol::Symbol;
|
||||
use syntax::ast::{ExprKind, LitKind, RangeLimits};
|
||||
use syntax::ptr::P;
|
||||
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
|
||||
Reference in New Issue
Block a user