Make THIR building a stealable query
This commit is contained in:
parent
bd80018159
commit
6f64eb1fe6
20 changed files with 60 additions and 42 deletions
|
@ -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;
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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;
|
||||
|
@ -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() {
|
||||
|
@ -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)
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -2,10 +2,11 @@
|
|||
//! structures into the THIR. The `builder` is generally ignorant of the tcx,
|
||||
//! 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::util::UserAnnotatedTyHelpers;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_data_structures::steal::Steal;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::Node;
|
||||
|
@ -15,14 +16,15 @@ use rustc_middle::thir::*;
|
|||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_span::Span;
|
||||
|
||||
pub fn build_thir<'tcx>(
|
||||
crate fn thir_body<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
owner_def: ty::WithOptConstParam<LocalDefId>,
|
||||
expr: &'tcx hir::Expr<'tcx>,
|
||||
) -> (Thir<'tcx>, ExprId) {
|
||||
) -> (&'tcx Steal<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 expr = cx.mirror_expr(expr);
|
||||
(cx.thir, expr)
|
||||
let expr = cx.mirror_expr(&body.value);
|
||||
(tcx.alloc_steal_thir(cx.thir), expr)
|
||||
}
|
||||
|
||||
struct Cx<'tcx> {
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
crate mod constant;
|
||||
|
||||
crate mod cx;
|
||||
pub use cx::build_thir;
|
||||
|
||||
crate mod pattern;
|
||||
|
||||
|
|
|
@ -292,8 +292,8 @@ use rustc_data_structures::fx::FxHashMap;
|
|||
use rustc_arena::TypedArena;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::HirId;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_middle::thir::{Pat, PatKind};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_span::Span;
|
||||
|
||||
use smallvec::{smallvec, SmallVec};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue