Skip to content

Commit

Permalink
Make THIR building a stealable query
Browse files Browse the repository at this point in the history
  • Loading branch information
LeSeulArtichaut committed May 22, 2021
1 parent bd80018 commit 6f64eb1
Show file tree
Hide file tree
Showing 20 changed files with 60 additions and 42 deletions.
1 change: 1 addition & 0 deletions compiler/rustc_middle/src/arena.rs
Expand Up @@ -14,6 +14,7 @@ macro_rules! arena_types {
[] layouts: rustc_target::abi::Layout,
// AdtDef are interned and compared by address
[] adt_def: rustc_middle::ty::AdtDef,
[] steal_thir: rustc_data_structures::steal::Steal<rustc_middle::thir::Thir<$tcx>>,
[] steal_mir: rustc_data_structures::steal::Steal<rustc_middle::mir::Body<$tcx>>,
[decode] mir: rustc_middle::mir::Body<$tcx>,
[] steal_promoted:
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_middle/src/dep_graph/dep_node.rs
Expand Up @@ -285,7 +285,7 @@ pub type DepNode = rustc_query_system::dep_graph::DepNode<DepKind>;
// required that their size stay the same, but we don't want to change
// it inadvertently. This assert just ensures we're aware of any change.
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
static_assert_size!(DepNode, 17);
static_assert_size!(DepNode, 18);

#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
static_assert_size!(DepNode, 24);
Expand Down
5 changes: 5 additions & 0 deletions compiler/rustc_middle/src/query/mod.rs
Expand Up @@ -220,6 +220,11 @@ rustc_queries! {
desc { "checking if the crate is_panic_runtime" }
}

/// Fetch the THIR for a given body.
query thir_body(key: ty::WithOptConstParam<LocalDefId>) -> (&'tcx Steal<thir::Thir<'tcx>>, thir::ExprId) {
desc { |tcx| "building THIR for `{}`", tcx.def_path_str(key.did.to_def_id()) }
}

/// Set of all the `DefId`s in this crate that have MIR associated with
/// them. This includes all the body owners, but also things like struct
/// constructors.
Expand Down
44 changes: 24 additions & 20 deletions compiler/rustc_middle/src/thir.rs
Expand Up @@ -24,25 +24,29 @@ use std::fmt;
use std::ops::Index;

newtype_index! {
#[derive(HashStable)]
pub struct ArmId {
DEBUG_FORMAT = "a{}"
}
}

newtype_index! {
#[derive(HashStable)]
pub struct ExprId {
DEBUG_FORMAT = "e{}"
}
}

newtype_index! {
#[derive(HashStable)]
pub struct StmtId {
DEBUG_FORMAT = "s{}"
}
}

macro_rules! thir_with_elements {
($($name:ident: $id:ty => $value:ty,)*) => {
#[derive(Debug, HashStable)]
pub struct Thir<'tcx> {
$(
pub $name: IndexVec<$id, $value>,
Expand Down Expand Up @@ -76,13 +80,13 @@ thir_with_elements! {
stmts: StmtId => Stmt<'tcx>,
}

#[derive(Copy, Clone, Debug)]
#[derive(Copy, Clone, Debug, HashStable)]
pub enum LintLevel {
Inherited,
Explicit(hir::HirId),
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub struct Block {
pub targeted_by_break: bool,
pub region_scope: region::Scope,
Expand All @@ -93,21 +97,21 @@ pub struct Block {
pub safety_mode: BlockSafety,
}

#[derive(Copy, Clone, Debug)]
#[derive(Copy, Clone, Debug, HashStable)]
pub enum BlockSafety {
Safe,
ExplicitUnsafe(hir::HirId),
PushUnsafe,
PopUnsafe,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub struct Stmt<'tcx> {
pub kind: StmtKind<'tcx>,
pub opt_destruction_scope: Option<region::Scope>,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub enum StmtKind<'tcx> {
Expr {
/// scope for this statement; may be used as lifetime of temporaries
Expand Down Expand Up @@ -157,7 +161,7 @@ rustc_data_structures::static_assert_size!(Expr<'_>, 144);
/// MIR simplifications are already done in the impl of `Thir`. For
/// example, method calls and overloaded operators are absent: they are
/// expected to be converted into `Expr::Call` instances.
#[derive(Debug)]
#[derive(Debug, HashStable)]
pub struct Expr<'tcx> {
/// type of this expression
pub ty: Ty<'tcx>,
Expand All @@ -173,7 +177,7 @@ pub struct Expr<'tcx> {
pub kind: ExprKind<'tcx>,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub enum ExprKind<'tcx> {
Scope {
region_scope: region::Scope,
Expand Down Expand Up @@ -363,19 +367,19 @@ pub enum ExprKind<'tcx> {
},
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub struct FieldExpr {
pub name: Field,
pub expr: ExprId,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub struct FruInfo<'tcx> {
pub base: ExprId,
pub field_types: Box<[Ty<'tcx>]>,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub struct Arm<'tcx> {
pub pattern: Pat<'tcx>,
pub guard: Option<Guard<'tcx>>,
Expand All @@ -385,19 +389,19 @@ pub struct Arm<'tcx> {
pub span: Span,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub enum Guard<'tcx> {
If(ExprId),
IfLet(Pat<'tcx>, ExprId),
}

#[derive(Copy, Clone, Debug)]
#[derive(Copy, Clone, Debug, HashStable)]
pub enum LogicalOp {
And,
Or,
}

#[derive(Debug)]
#[derive(Debug, HashStable)]
pub enum InlineAsmOperand<'tcx> {
In {
reg: InlineAsmRegOrRegClass,
Expand Down Expand Up @@ -431,19 +435,19 @@ pub enum InlineAsmOperand<'tcx> {
},
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub enum BindingMode {
ByValue,
ByRef(BorrowKind),
}

#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, HashStable)]
pub struct FieldPat<'tcx> {
pub field: Field,
pub pattern: Pat<'tcx>,
}

#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, HashStable)]
pub struct Pat<'tcx> {
pub ty: Ty<'tcx>,
pub span: Span,
Expand All @@ -456,7 +460,7 @@ impl<'tcx> Pat<'tcx> {
}
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub struct PatTyProj<'tcx> {
pub user_ty: CanonicalUserType<'tcx>,
}
Expand All @@ -483,7 +487,7 @@ impl<'tcx> PatTyProj<'tcx> {
}
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub struct Ascription<'tcx> {
pub user_ty: PatTyProj<'tcx>,
/// Variance to use when relating the type `user_ty` to the **type of the value being
Expand All @@ -508,7 +512,7 @@ pub struct Ascription<'tcx> {
pub user_ty_span: Span,
}

#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, HashStable)]
pub enum PatKind<'tcx> {
Wild,

Expand Down Expand Up @@ -586,7 +590,7 @@ pub enum PatKind<'tcx> {
},
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub struct PatRange<'tcx> {
pub lo: &'tcx ty::Const<'tcx>,
pub hi: &'tcx ty::Const<'tcx>,
Expand Down
5 changes: 5 additions & 0 deletions compiler/rustc_middle/src/ty/context.rs
Expand Up @@ -13,6 +13,7 @@ use crate::middle::resolve_lifetime::{self, LifetimeScopeForPath, ObjectLifetime
use crate::middle::stability;
use crate::mir::interpret::{self, Allocation, ConstValue, Scalar};
use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
use crate::thir::Thir;
use crate::traits;
use crate::ty::query::{self, OnDiskCache, TyCtxtAt};
use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts};
Expand Down Expand Up @@ -1041,6 +1042,10 @@ impl<'tcx> TyCtxt<'tcx> {
}
}

pub fn alloc_steal_thir(self, thir: Thir<'tcx>) -> &'tcx Steal<Thir<'tcx>> {
self.arena.alloc(Steal::new(thir))
}

pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> {
self.arena.alloc(Steal::new(mir))
}
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_middle/src/ty/query/mod.rs
Expand Up @@ -18,6 +18,7 @@ use crate::mir::interpret::GlobalId;
use crate::mir::interpret::{ConstAlloc, LitToConstError, LitToConstInput};
use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult};
use crate::mir::mono::CodegenUnit;
use crate::thir;
use crate::traits::query::{
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_middle/src/ty/sty.rs
Expand Up @@ -669,7 +669,7 @@ impl<'tcx> GeneratorSubsts<'tcx> {
}
}

#[derive(Debug, Copy, Clone)]
#[derive(Debug, Copy, Clone, HashStable)]
pub enum UpvarSubsts<'tcx> {
Closure(SubstsRef<'tcx>),
Generator(SubstsRef<'tcx>),
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/block.rs
@@ -1,8 +1,8 @@
use crate::build::matches::ArmHasGuard;
use crate::build::ForGuard::OutsideGuard;
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use rustc_middle::thir::*;
use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_session::lint::builtin::UNSAFE_OP_IN_UNSAFE_FN;
use rustc_session::lint::Level;
use rustc_span::Span;
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/as_constant.rs
@@ -1,8 +1,8 @@
//! See docs in build/expr/mod.rs

use crate::build::Builder;
use rustc_middle::thir::*;
use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::CanonicalUserTypeAnnotation;

impl<'a, 'tcx> Builder<'a, 'tcx> {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/as_operand.rs
Expand Up @@ -2,9 +2,9 @@

use crate::build::expr::category::Category;
use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_middle::middle::region;
use rustc_middle::mir::*;
use rustc_middle::thir::*;

impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Returns an operand suitable for use until the end of the current
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/as_place.rs
Expand Up @@ -3,13 +3,13 @@
use crate::build::expr::category::Category;
use crate::build::ForGuard::{OutsideGuard, RefWithinGuard};
use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_hir::def_id::DefId;
use rustc_hir::HirId;
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
use rustc_middle::middle::region;
use rustc_middle::mir::AssertKind::BoundsCheck;
use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::AdtDef;
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance};
use rustc_span::Span;
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/as_rvalue.rs
Expand Up @@ -5,11 +5,11 @@ use rustc_index::vec::Idx;
use crate::build::expr::as_place::PlaceBase;
use crate::build::expr::category::{Category, RvalueFunc};
use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_middle::middle::region;
use rustc_middle::mir::AssertKind;
use rustc_middle::mir::Place;
use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::{self, Ty, UpvarSubsts};
use rustc_span::Span;

Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/as_temp.rs
Expand Up @@ -2,10 +2,10 @@

use crate::build::scope::DropKind;
use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_middle::middle::region;
use rustc_middle::mir::*;
use rustc_middle::thir::*;

impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Compile `expr` into a fresh temporary. This is used when building
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/into.rs
Expand Up @@ -2,13 +2,13 @@

use crate::build::expr::category::{Category, RvalueFunc};
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use rustc_middle::thir::*;
use rustc_ast::InlineAsmOptions;
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_hir as hir;
use rustc_index::vec::Idx;
use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
use std::iter;

Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/build/expr/stmt.rs
@@ -1,8 +1,8 @@
use crate::build::scope::BreakableTarget;
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use rustc_middle::thir::*;
use rustc_middle::middle::region;
use rustc_middle::mir::*;
use rustc_middle::thir::*;

impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Builds a block of MIR statements to evaluate the THIR `expr`.
Expand Down
8 changes: 4 additions & 4 deletions compiler/rustc_mir_build/src/build/mod.rs
@@ -1,7 +1,6 @@
use crate::build;
use crate::build::expr::as_place::PlaceBuilder;
use crate::build::scope::DropKind;
use crate::thir::build_thir;
use crate::thir::pattern::pat_from_hir;
use rustc_attr::{self as attr, UnwindAttr};
use rustc_errors::ErrorReported;
Expand Down Expand Up @@ -106,7 +105,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
};

let body = tcx.hir().body(body_id);
let (thir, expr) = build_thir(tcx, def, &body.value);
let (thir, expr) = tcx.thir_body(def);
let thir = thir.steal();
let ty = tcx.type_of(fn_def_id);
let mut abi = fn_sig.abi;
let implicit_argument = match ty.kind() {
Expand Down Expand Up @@ -214,8 +214,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_

let return_ty = typeck_results.node_type(id);

let ast_expr = &tcx.hir().body(body_id).value;
let (thir, expr) = build_thir(tcx, def, ast_expr);
let (thir, expr) = tcx.thir_body(def);
let thir = thir.steal();

build::construct_const(&thir, &infcx, expr, def, id, return_ty, return_ty_span)
};
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_mir_build/src/lib.rs
Expand Up @@ -31,4 +31,5 @@ pub fn provide(providers: &mut Providers) {
providers.mir_built = build::mir_built;
providers.thir_check_unsafety = check_unsafety::thir_check_unsafety;
providers.thir_check_unsafety_for_const_arg = check_unsafety::thir_check_unsafety_for_const_arg;
providers.thir_body = thir::cx::thir_body;
}

0 comments on commit 6f64eb1

Please sign in to comment.