Make THIR building a stealable query
This commit is contained in:
parent
bd80018159
commit
6f64eb1fe6
20 changed files with 60 additions and 42 deletions
|
@ -14,6 +14,7 @@ macro_rules! arena_types {
|
||||||
[] layouts: rustc_target::abi::Layout,
|
[] layouts: rustc_target::abi::Layout,
|
||||||
// AdtDef are interned and compared by address
|
// AdtDef are interned and compared by address
|
||||||
[] adt_def: rustc_middle::ty::AdtDef,
|
[] 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>>,
|
[] steal_mir: rustc_data_structures::steal::Steal<rustc_middle::mir::Body<$tcx>>,
|
||||||
[decode] mir: rustc_middle::mir::Body<$tcx>,
|
[decode] mir: rustc_middle::mir::Body<$tcx>,
|
||||||
[] steal_promoted:
|
[] steal_promoted:
|
||||||
|
|
|
@ -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
|
// 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.
|
// it inadvertently. This assert just ensures we're aware of any change.
|
||||||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
#[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")))]
|
#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
|
||||||
static_assert_size!(DepNode, 24);
|
static_assert_size!(DepNode, 24);
|
||||||
|
|
|
@ -220,6 +220,11 @@ rustc_queries! {
|
||||||
desc { "checking if the crate is_panic_runtime" }
|
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
|
/// 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
|
/// them. This includes all the body owners, but also things like struct
|
||||||
/// constructors.
|
/// constructors.
|
||||||
|
|
|
@ -24,18 +24,21 @@ use std::fmt;
|
||||||
use std::ops::Index;
|
use std::ops::Index;
|
||||||
|
|
||||||
newtype_index! {
|
newtype_index! {
|
||||||
|
#[derive(HashStable)]
|
||||||
pub struct ArmId {
|
pub struct ArmId {
|
||||||
DEBUG_FORMAT = "a{}"
|
DEBUG_FORMAT = "a{}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newtype_index! {
|
newtype_index! {
|
||||||
|
#[derive(HashStable)]
|
||||||
pub struct ExprId {
|
pub struct ExprId {
|
||||||
DEBUG_FORMAT = "e{}"
|
DEBUG_FORMAT = "e{}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newtype_index! {
|
newtype_index! {
|
||||||
|
#[derive(HashStable)]
|
||||||
pub struct StmtId {
|
pub struct StmtId {
|
||||||
DEBUG_FORMAT = "s{}"
|
DEBUG_FORMAT = "s{}"
|
||||||
}
|
}
|
||||||
|
@ -43,6 +46,7 @@ newtype_index! {
|
||||||
|
|
||||||
macro_rules! thir_with_elements {
|
macro_rules! thir_with_elements {
|
||||||
($($name:ident: $id:ty => $value:ty,)*) => {
|
($($name:ident: $id:ty => $value:ty,)*) => {
|
||||||
|
#[derive(Debug, HashStable)]
|
||||||
pub struct Thir<'tcx> {
|
pub struct Thir<'tcx> {
|
||||||
$(
|
$(
|
||||||
pub $name: IndexVec<$id, $value>,
|
pub $name: IndexVec<$id, $value>,
|
||||||
|
@ -76,13 +80,13 @@ thir_with_elements! {
|
||||||
stmts: StmtId => Stmt<'tcx>,
|
stmts: StmtId => Stmt<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug, HashStable)]
|
||||||
pub enum LintLevel {
|
pub enum LintLevel {
|
||||||
Inherited,
|
Inherited,
|
||||||
Explicit(hir::HirId),
|
Explicit(hir::HirId),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub struct Block {
|
pub struct Block {
|
||||||
pub targeted_by_break: bool,
|
pub targeted_by_break: bool,
|
||||||
pub region_scope: region::Scope,
|
pub region_scope: region::Scope,
|
||||||
|
@ -93,7 +97,7 @@ pub struct Block {
|
||||||
pub safety_mode: BlockSafety,
|
pub safety_mode: BlockSafety,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug, HashStable)]
|
||||||
pub enum BlockSafety {
|
pub enum BlockSafety {
|
||||||
Safe,
|
Safe,
|
||||||
ExplicitUnsafe(hir::HirId),
|
ExplicitUnsafe(hir::HirId),
|
||||||
|
@ -101,13 +105,13 @@ pub enum BlockSafety {
|
||||||
PopUnsafe,
|
PopUnsafe,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub struct Stmt<'tcx> {
|
pub struct Stmt<'tcx> {
|
||||||
pub kind: StmtKind<'tcx>,
|
pub kind: StmtKind<'tcx>,
|
||||||
pub opt_destruction_scope: Option<region::Scope>,
|
pub opt_destruction_scope: Option<region::Scope>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub enum StmtKind<'tcx> {
|
pub enum StmtKind<'tcx> {
|
||||||
Expr {
|
Expr {
|
||||||
/// scope for this statement; may be used as lifetime of temporaries
|
/// scope for this statement; may be used as lifetime of temporaries
|
||||||
|
@ -157,7 +161,7 @@ rustc_data_structures::static_assert_size!(Expr<'_>, 144);
|
||||||
/// MIR simplifications are already done in the impl of `Thir`. For
|
/// MIR simplifications are already done in the impl of `Thir`. For
|
||||||
/// example, method calls and overloaded operators are absent: they are
|
/// example, method calls and overloaded operators are absent: they are
|
||||||
/// expected to be converted into `Expr::Call` instances.
|
/// expected to be converted into `Expr::Call` instances.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub struct Expr<'tcx> {
|
pub struct Expr<'tcx> {
|
||||||
/// type of this expression
|
/// type of this expression
|
||||||
pub ty: Ty<'tcx>,
|
pub ty: Ty<'tcx>,
|
||||||
|
@ -173,7 +177,7 @@ pub struct Expr<'tcx> {
|
||||||
pub kind: ExprKind<'tcx>,
|
pub kind: ExprKind<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub enum ExprKind<'tcx> {
|
pub enum ExprKind<'tcx> {
|
||||||
Scope {
|
Scope {
|
||||||
region_scope: region::Scope,
|
region_scope: region::Scope,
|
||||||
|
@ -363,19 +367,19 @@ pub enum ExprKind<'tcx> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub struct FieldExpr {
|
pub struct FieldExpr {
|
||||||
pub name: Field,
|
pub name: Field,
|
||||||
pub expr: ExprId,
|
pub expr: ExprId,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub struct FruInfo<'tcx> {
|
pub struct FruInfo<'tcx> {
|
||||||
pub base: ExprId,
|
pub base: ExprId,
|
||||||
pub field_types: Box<[Ty<'tcx>]>,
|
pub field_types: Box<[Ty<'tcx>]>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub struct Arm<'tcx> {
|
pub struct Arm<'tcx> {
|
||||||
pub pattern: Pat<'tcx>,
|
pub pattern: Pat<'tcx>,
|
||||||
pub guard: Option<Guard<'tcx>>,
|
pub guard: Option<Guard<'tcx>>,
|
||||||
|
@ -385,19 +389,19 @@ pub struct Arm<'tcx> {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub enum Guard<'tcx> {
|
pub enum Guard<'tcx> {
|
||||||
If(ExprId),
|
If(ExprId),
|
||||||
IfLet(Pat<'tcx>, ExprId),
|
IfLet(Pat<'tcx>, ExprId),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug, HashStable)]
|
||||||
pub enum LogicalOp {
|
pub enum LogicalOp {
|
||||||
And,
|
And,
|
||||||
Or,
|
Or,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, HashStable)]
|
||||||
pub enum InlineAsmOperand<'tcx> {
|
pub enum InlineAsmOperand<'tcx> {
|
||||||
In {
|
In {
|
||||||
reg: InlineAsmRegOrRegClass,
|
reg: InlineAsmRegOrRegClass,
|
||||||
|
@ -431,19 +435,19 @@ pub enum InlineAsmOperand<'tcx> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
|
||||||
pub enum BindingMode {
|
pub enum BindingMode {
|
||||||
ByValue,
|
ByValue,
|
||||||
ByRef(BorrowKind),
|
ByRef(BorrowKind),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq, HashStable)]
|
||||||
pub struct FieldPat<'tcx> {
|
pub struct FieldPat<'tcx> {
|
||||||
pub field: Field,
|
pub field: Field,
|
||||||
pub pattern: Pat<'tcx>,
|
pub pattern: Pat<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq, HashStable)]
|
||||||
pub struct Pat<'tcx> {
|
pub struct Pat<'tcx> {
|
||||||
pub ty: Ty<'tcx>,
|
pub ty: Ty<'tcx>,
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
|
@ -456,7 +460,7 @@ impl<'tcx> Pat<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
|
||||||
pub struct PatTyProj<'tcx> {
|
pub struct PatTyProj<'tcx> {
|
||||||
pub user_ty: CanonicalUserType<'tcx>,
|
pub user_ty: CanonicalUserType<'tcx>,
|
||||||
}
|
}
|
||||||
|
@ -483,7 +487,7 @@ impl<'tcx> PatTyProj<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
|
||||||
pub struct Ascription<'tcx> {
|
pub struct Ascription<'tcx> {
|
||||||
pub user_ty: PatTyProj<'tcx>,
|
pub user_ty: PatTyProj<'tcx>,
|
||||||
/// Variance to use when relating the type `user_ty` to the **type of the value being
|
/// Variance to use when relating the type `user_ty` to the **type of the value being
|
||||||
|
@ -508,7 +512,7 @@ pub struct Ascription<'tcx> {
|
||||||
pub user_ty_span: Span,
|
pub user_ty_span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq, HashStable)]
|
||||||
pub enum PatKind<'tcx> {
|
pub enum PatKind<'tcx> {
|
||||||
Wild,
|
Wild,
|
||||||
|
|
||||||
|
@ -586,7 +590,7 @@ pub enum PatKind<'tcx> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq, HashStable)]
|
||||||
pub struct PatRange<'tcx> {
|
pub struct PatRange<'tcx> {
|
||||||
pub lo: &'tcx ty::Const<'tcx>,
|
pub lo: &'tcx ty::Const<'tcx>,
|
||||||
pub hi: &'tcx ty::Const<'tcx>,
|
pub hi: &'tcx ty::Const<'tcx>,
|
||||||
|
|
|
@ -13,6 +13,7 @@ use crate::middle::resolve_lifetime::{self, LifetimeScopeForPath, ObjectLifetime
|
||||||
use crate::middle::stability;
|
use crate::middle::stability;
|
||||||
use crate::mir::interpret::{self, Allocation, ConstValue, Scalar};
|
use crate::mir::interpret::{self, Allocation, ConstValue, Scalar};
|
||||||
use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
|
use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
|
||||||
|
use crate::thir::Thir;
|
||||||
use crate::traits;
|
use crate::traits;
|
||||||
use crate::ty::query::{self, OnDiskCache, TyCtxtAt};
|
use crate::ty::query::{self, OnDiskCache, TyCtxtAt};
|
||||||
use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts};
|
use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts};
|
||||||
|
@ -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>> {
|
pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> {
|
||||||
self.arena.alloc(Steal::new(mir))
|
self.arena.alloc(Steal::new(mir))
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ use crate::mir::interpret::GlobalId;
|
||||||
use crate::mir::interpret::{ConstAlloc, LitToConstError, LitToConstInput};
|
use crate::mir::interpret::{ConstAlloc, LitToConstError, LitToConstInput};
|
||||||
use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult};
|
use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult};
|
||||||
use crate::mir::mono::CodegenUnit;
|
use crate::mir::mono::CodegenUnit;
|
||||||
|
use crate::thir;
|
||||||
use crate::traits::query::{
|
use crate::traits::query::{
|
||||||
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
|
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
|
||||||
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,
|
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,
|
||||||
|
|
|
@ -669,7 +669,7 @@ impl<'tcx> GeneratorSubsts<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone, HashStable)]
|
||||||
pub enum UpvarSubsts<'tcx> {
|
pub enum UpvarSubsts<'tcx> {
|
||||||
Closure(SubstsRef<'tcx>),
|
Closure(SubstsRef<'tcx>),
|
||||||
Generator(SubstsRef<'tcx>),
|
Generator(SubstsRef<'tcx>),
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::build::matches::ArmHasGuard;
|
use crate::build::matches::ArmHasGuard;
|
||||||
use crate::build::ForGuard::OutsideGuard;
|
use crate::build::ForGuard::OutsideGuard;
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
use rustc_session::lint::builtin::UNSAFE_OP_IN_UNSAFE_FN;
|
use rustc_session::lint::builtin::UNSAFE_OP_IN_UNSAFE_FN;
|
||||||
use rustc_session::lint::Level;
|
use rustc_session::lint::Level;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
//! See docs in build/expr/mod.rs
|
//! See docs in build/expr/mod.rs
|
||||||
|
|
||||||
use crate::build::Builder;
|
use crate::build::Builder;
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::CanonicalUserTypeAnnotation;
|
use rustc_middle::ty::CanonicalUserTypeAnnotation;
|
||||||
|
|
||||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
use crate::build::expr::category::Category;
|
use crate::build::expr::category::Category;
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
|
|
||||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
/// Returns an operand suitable for use until the end of the current
|
/// Returns an operand suitable for use until the end of the current
|
||||||
|
|
|
@ -3,13 +3,13 @@
|
||||||
use crate::build::expr::category::Category;
|
use crate::build::expr::category::Category;
|
||||||
use crate::build::ForGuard::{OutsideGuard, RefWithinGuard};
|
use crate::build::ForGuard::{OutsideGuard, RefWithinGuard};
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
|
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
use rustc_middle::mir::AssertKind::BoundsCheck;
|
use rustc_middle::mir::AssertKind::BoundsCheck;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::AdtDef;
|
use rustc_middle::ty::AdtDef;
|
||||||
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance};
|
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
|
@ -5,11 +5,11 @@ use rustc_index::vec::Idx;
|
||||||
use crate::build::expr::as_place::PlaceBase;
|
use crate::build::expr::as_place::PlaceBase;
|
||||||
use crate::build::expr::category::{Category, RvalueFunc};
|
use crate::build::expr::category::{Category, RvalueFunc};
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
use rustc_middle::mir::AssertKind;
|
use rustc_middle::mir::AssertKind;
|
||||||
use rustc_middle::mir::Place;
|
use rustc_middle::mir::Place;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::{self, Ty, UpvarSubsts};
|
use rustc_middle::ty::{self, Ty, UpvarSubsts};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
|
|
||||||
use crate::build::scope::DropKind;
|
use crate::build::scope::DropKind;
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
|
|
||||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
/// Compile `expr` into a fresh temporary. This is used when building
|
/// Compile `expr` into a fresh temporary. This is used when building
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
|
|
||||||
use crate::build::expr::category::{Category, RvalueFunc};
|
use crate::build::expr::category::{Category, RvalueFunc};
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_ast::InlineAsmOptions;
|
use rustc_ast::InlineAsmOptions;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_index::vec::Idx;
|
use rustc_index::vec::Idx;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
|
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::build::scope::BreakableTarget;
|
use crate::build::scope::BreakableTarget;
|
||||||
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
||||||
use rustc_middle::thir::*;
|
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
|
use rustc_middle::thir::*;
|
||||||
|
|
||||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
/// Builds a block of MIR statements to evaluate the THIR `expr`.
|
/// Builds a block of MIR statements to evaluate the THIR `expr`.
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use crate::build;
|
use crate::build;
|
||||||
use crate::build::expr::as_place::PlaceBuilder;
|
use crate::build::expr::as_place::PlaceBuilder;
|
||||||
use crate::build::scope::DropKind;
|
use crate::build::scope::DropKind;
|
||||||
use crate::thir::build_thir;
|
|
||||||
use crate::thir::pattern::pat_from_hir;
|
use crate::thir::pattern::pat_from_hir;
|
||||||
use rustc_attr::{self as attr, UnwindAttr};
|
use rustc_attr::{self as attr, UnwindAttr};
|
||||||
use rustc_errors::ErrorReported;
|
use rustc_errors::ErrorReported;
|
||||||
|
@ -106,7 +105,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
|
||||||
};
|
};
|
||||||
|
|
||||||
let body = tcx.hir().body(body_id);
|
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 ty = tcx.type_of(fn_def_id);
|
||||||
let mut abi = fn_sig.abi;
|
let mut abi = fn_sig.abi;
|
||||||
let implicit_argument = match ty.kind() {
|
let implicit_argument = match ty.kind() {
|
||||||
|
@ -214,8 +214,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
|
||||||
|
|
||||||
let return_ty = typeck_results.node_type(id);
|
let return_ty = typeck_results.node_type(id);
|
||||||
|
|
||||||
let ast_expr = &tcx.hir().body(body_id).value;
|
let (thir, expr) = tcx.thir_body(def);
|
||||||
let (thir, expr) = build_thir(tcx, def, ast_expr);
|
let thir = thir.steal();
|
||||||
|
|
||||||
build::construct_const(&thir, &infcx, expr, def, id, return_ty, return_ty_span)
|
build::construct_const(&thir, &infcx, expr, def, id, return_ty, return_ty_span)
|
||||||
};
|
};
|
||||||
|
|
|
@ -31,4 +31,5 @@ pub fn provide(providers: &mut Providers) {
|
||||||
providers.mir_built = build::mir_built;
|
providers.mir_built = build::mir_built;
|
||||||
providers.thir_check_unsafety = check_unsafety::thir_check_unsafety;
|
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_check_unsafety_for_const_arg = check_unsafety::thir_check_unsafety_for_const_arg;
|
||||||
|
providers.thir_body = thir::cx::thir_body;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
//! structures into the THIR. The `builder` is generally ignorant of the tcx,
|
//! structures into the THIR. The `builder` is generally ignorant of the tcx,
|
||||||
//! etc., and instead goes through the `Cx` for most of its work.
|
//! etc., and instead goes through the `Cx` for most of its work.
|
||||||
|
|
||||||
use crate::thir::util::UserAnnotatedTyHelpers;
|
|
||||||
use crate::thir::pattern::pat_from_hir;
|
use crate::thir::pattern::pat_from_hir;
|
||||||
|
use crate::thir::util::UserAnnotatedTyHelpers;
|
||||||
|
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
|
use rustc_data_structures::steal::Steal;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::Node;
|
use rustc_hir::Node;
|
||||||
|
@ -15,14 +16,15 @@ use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
pub fn build_thir<'tcx>(
|
crate fn thir_body<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
owner_def: ty::WithOptConstParam<LocalDefId>,
|
owner_def: ty::WithOptConstParam<LocalDefId>,
|
||||||
expr: &'tcx hir::Expr<'tcx>,
|
) -> (&'tcx Steal<Thir<'tcx>>, ExprId) {
|
||||||
) -> (Thir<'tcx>, ExprId) {
|
let hir = tcx.hir();
|
||||||
|
let body = hir.body(hir.body_owned_by(hir.local_def_id_to_hir_id(owner_def.did)));
|
||||||
let mut cx = Cx::new(tcx, owner_def);
|
let mut cx = Cx::new(tcx, owner_def);
|
||||||
let expr = cx.mirror_expr(expr);
|
let expr = cx.mirror_expr(&body.value);
|
||||||
(cx.thir, expr)
|
(tcx.alloc_steal_thir(cx.thir), expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Cx<'tcx> {
|
struct Cx<'tcx> {
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
crate mod constant;
|
crate mod constant;
|
||||||
|
|
||||||
crate mod cx;
|
crate mod cx;
|
||||||
pub use cx::build_thir;
|
|
||||||
|
|
||||||
crate mod pattern;
|
crate mod pattern;
|
||||||
|
|
||||||
|
|
|
@ -292,8 +292,8 @@ use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_arena::TypedArena;
|
use rustc_arena::TypedArena;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
|
||||||
use rustc_middle::thir::{Pat, PatKind};
|
use rustc_middle::thir::{Pat, PatKind};
|
||||||
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue