1use rustc_abi::{FieldIdx, VariantIdx};
2use rustc_middle::mir::interpret::Scalar;
3use rustc_middle::mir::*;
4use rustc_middle::thir::*;
5use rustc_middle::ty;
6use rustc_middle::ty::cast::mir_cast_kind;
7use rustc_span::{Span, Spanned};
8
9use super::{PResult, ParseCtxt, parse_by_kind};
10use crate::builder::custom::ParseError;
11use crate::builder::expr::as_constant::as_constant_inner;
12
13impl<'a, 'tcx> ParseCtxt<'a, 'tcx> {
14 pub(crate) fn parse_statement(&self, expr_id: ExprId) -> PResult<StatementKind<'tcx>> {
15 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:15",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(15u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "statement") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_storage_live,
*did)
}
_ => false,
}
} => {
Ok(StatementKind::StorageLive(self.parse_local(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_storage_dead,
*did)
}
_ => false,
}
} => {
Ok(StatementKind::StorageDead(self.parse_local(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_assume,
*did)
}
_ => false,
}
} => {
let op = self.parse_operand(args[0])?;
Ok(StatementKind::Intrinsic(Box::new(NonDivergingIntrinsic::Assume(op))))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_set_discriminant,
*did)
}
_ => false,
}
} => {
let place = self.parse_place(args[0])?;
let var = self.parse_integer_literal(args[1])? as u32;
Ok(StatementKind::SetDiscriminant {
place: Box::new(place),
variant_index: VariantIdx::from_u32(var),
})
}
ExprKind::Assign { lhs, rhs } => {
let lhs = self.parse_place(*lhs)?;
let rhs = self.parse_rvalue(*rhs)?;
Ok(StatementKind::Assign(Box::new((lhs, rhs))))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "statement")),
}
}parse_by_kind!(self, expr_id, _, "statement",
16 @call(mir_storage_live, args) => {
17 Ok(StatementKind::StorageLive(self.parse_local(args[0])?))
18 },
19 @call(mir_storage_dead, args) => {
20 Ok(StatementKind::StorageDead(self.parse_local(args[0])?))
21 },
22 @call(mir_assume, args) => {
23 let op = self.parse_operand(args[0])?;
24 Ok(StatementKind::Intrinsic(Box::new(NonDivergingIntrinsic::Assume(op))))
25 },
26 @call(mir_set_discriminant, args) => {
27 let place = self.parse_place(args[0])?;
28 let var = self.parse_integer_literal(args[1])? as u32;
29 Ok(StatementKind::SetDiscriminant {
30 place: Box::new(place),
31 variant_index: VariantIdx::from_u32(var),
32 })
33 },
34 ExprKind::Assign { lhs, rhs } => {
35 let lhs = self.parse_place(*lhs)?;
36 let rhs = self.parse_rvalue(*rhs)?;
37 Ok(StatementKind::Assign(Box::new((lhs, rhs))))
38 },
39 )
40 }
41
42 pub(crate) fn parse_terminator(&self, expr_id: ExprId) -> PResult<TerminatorKind<'tcx>> {
43 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:43",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(43u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "terminator") as &dyn Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_return,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Return)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_goto, *did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Goto { target: self.parse_block(args[0])? })
}
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unreachable,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Unreachable)
}
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_resume,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::UnwindResume)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::UnwindTerminate(self.parse_unwind_terminate_reason(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_drop, *did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Drop {
place: self.parse_place(args[0])?,
target: self.parse_return_to(args[1])?,
unwind: self.parse_unwind_action(args[2])?,
replace: false,
drop: None,
})
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_call, *did)
}
_ => false,
}
} => {
self.parse_call(args)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_tail_call,
*did)
}
_ => false,
}
} => {
self.parse_tail_call(args)
}
ExprKind::Match { scrutinee, arms, .. } => {
let discr = self.parse_operand(*scrutinee)?;
self.parse_match(arms,
expr.span).map(|t|
TerminatorKind::SwitchInt { discr, targets: t })
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "terminator")),
}
}parse_by_kind!(self, expr_id, expr, "terminator",
44 @call(mir_return, _args) => {
45 Ok(TerminatorKind::Return)
46 },
47 @call(mir_goto, args) => {
48 Ok(TerminatorKind::Goto { target: self.parse_block(args[0])? } )
49 },
50 @call(mir_unreachable, _args) => {
51 Ok(TerminatorKind::Unreachable)
52 },
53 @call(mir_unwind_resume, _args) => {
54 Ok(TerminatorKind::UnwindResume)
55 },
56 @call(mir_unwind_terminate, args) => {
57 Ok(TerminatorKind::UnwindTerminate(self.parse_unwind_terminate_reason(args[0])?))
58 },
59 @call(mir_drop, args) => {
60 Ok(TerminatorKind::Drop {
61 place: self.parse_place(args[0])?,
62 target: self.parse_return_to(args[1])?,
63 unwind: self.parse_unwind_action(args[2])?,
64 replace: false,
65 drop: None,
66 })
67 },
68 @call(mir_call, args) => {
69 self.parse_call(args)
70 },
71 @call(mir_tail_call, args) => {
72 self.parse_tail_call(args)
73 },
74 ExprKind::Match { scrutinee, arms, .. } => {
75 let discr = self.parse_operand(*scrutinee)?;
76 self.parse_match(arms, expr.span).map(|t| TerminatorKind::SwitchInt { discr, targets: t })
77 },
78 )
79 }
80
81 fn parse_unwind_terminate_reason(&self, expr_id: ExprId) -> PResult<UnwindTerminateReason> {
82 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:82",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(82u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "unwind terminate reason") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate_reason,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::Abi
} => {
Ok(UnwindTerminateReason::Abi)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate_reason,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::InCleanup
} => {
Ok(UnwindTerminateReason::InCleanup)
}
#[allow(unreachable_patterns)]
_ =>
return Err(self.expr_error(expr_id, "unwind terminate reason")),
}
}parse_by_kind!(self, expr_id, _, "unwind terminate reason",
83 @variant(mir_unwind_terminate_reason, Abi) => {
84 Ok(UnwindTerminateReason::Abi)
85 },
86 @variant(mir_unwind_terminate_reason, InCleanup) => {
87 Ok(UnwindTerminateReason::InCleanup)
88 },
89 )
90 }
91
92 fn parse_unwind_action(&self, expr_id: ExprId) -> PResult<UnwindAction> {
93 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:93",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(93u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "unwind action") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_continue,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Continue)
}
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_unreachable,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Unreachable)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Terminate(self.parse_unwind_terminate_reason(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_cleanup,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Cleanup(self.parse_block(args[0])?))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "unwind action")),
}
}parse_by_kind!(self, expr_id, _, "unwind action",
94 @call(mir_unwind_continue, _args) => {
95 Ok(UnwindAction::Continue)
96 },
97 @call(mir_unwind_unreachable, _args) => {
98 Ok(UnwindAction::Unreachable)
99 },
100 @call(mir_unwind_terminate, args) => {
101 Ok(UnwindAction::Terminate(self.parse_unwind_terminate_reason(args[0])?))
102 },
103 @call(mir_unwind_cleanup, args) => {
104 Ok(UnwindAction::Cleanup(self.parse_block(args[0])?))
105 },
106 )
107 }
108
109 fn parse_return_to(&self, expr_id: ExprId) -> PResult<BasicBlock> {
110 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:110",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(110u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "return block") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_return_to,
*did)
}
_ => false,
}
} => {
self.parse_block(args[0])
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "return block")),
}
}parse_by_kind!(self, expr_id, _, "return block",
111 @call(mir_return_to, args) => {
112 self.parse_block(args[0])
113 },
114 )
115 }
116
117 fn parse_match(&self, arms: &[ArmId], span: Span) -> PResult<SwitchTargets> {
118 let Some((otherwise, rest)) = arms.split_last() else {
119 return Err(ParseError {
120 span,
121 item_description: "no arms".to_string(),
122 expected: "at least one arm".to_string(),
123 });
124 };
125
126 let otherwise = &self.thir[*otherwise];
127 let PatKind::Wild = otherwise.pattern.kind else {
128 return Err(ParseError {
129 span: otherwise.span,
130 item_description: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:?}", otherwise.pattern.kind))
})format!("{:?}", otherwise.pattern.kind),
131 expected: "wildcard pattern".to_string(),
132 });
133 };
134 let otherwise = self.parse_block(otherwise.body)?;
135
136 let mut values = Vec::new();
137 let mut targets = Vec::new();
138 for arm in rest {
139 let arm = &self.thir[*arm];
140 let value = match arm.pattern.kind {
141 PatKind::Constant { value } => value,
142 _ => {
143 return Err(ParseError {
144 span: arm.pattern.span,
145 item_description: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:?}", arm.pattern.kind))
})format!("{:?}", arm.pattern.kind),
146 expected: "constant pattern".to_string(),
147 });
148 }
149 };
150 values.push(value.to_leaf().to_bits_unchecked());
151 targets.push(self.parse_block(arm.body)?);
152 }
153
154 Ok(SwitchTargets::new(values.into_iter().zip(targets), otherwise))
155 }
156
157 fn parse_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
158 let (destination, call) = {
let expr_id = self.preparse(args[0]);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:158",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(158u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "function call") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Assign { lhs, rhs } =>
(*lhs,
*rhs),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "function call")),
}
}parse_by_kind!(self, args[0], _, "function call",
159 ExprKind::Assign { lhs, rhs } => (*lhs, *rhs),
160 );
161 let destination = self.parse_place(destination)?;
162 let target = self.parse_return_to(args[1])?;
163 let unwind = self.parse_unwind_action(args[2])?;
164
165 {
let expr_id = self.preparse(call);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:165",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(165u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "function call") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { fun, args, from_hir_call, fn_span, .. } => {
let fun = self.parse_operand(*fun)?;
let args =
args.iter().map(|arg|
Ok(Spanned {
node: self.parse_operand(*arg)?,
span: self.thir.exprs[*arg].span,
})).collect::<PResult<Box<[_]>>>()?;
Ok(TerminatorKind::Call {
func: fun,
args,
destination,
target: Some(target),
unwind,
call_source: if *from_hir_call {
CallSource::Normal
} else { CallSource::OverloadedOperator },
fn_span: *fn_span,
})
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "function call")),
}
}parse_by_kind!(self, call, _, "function call",
166 ExprKind::Call { fun, args, from_hir_call, fn_span, .. } => {
167 let fun = self.parse_operand(*fun)?;
168 let args = args
169 .iter()
170 .map(|arg|
171 Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
172 )
173 .collect::<PResult<Box<[_]>>>()?;
174 Ok(TerminatorKind::Call {
175 func: fun,
176 args,
177 destination,
178 target: Some(target),
179 unwind,
180 call_source: if *from_hir_call { CallSource::Normal } else {
181 CallSource::OverloadedOperator
182 },
183 fn_span: *fn_span,
184 })
185 },
186 )
187 }
188
189 fn parse_tail_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
190 {
let expr_id = self.preparse(args[0]);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:190",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(190u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "tail call") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { fun, args, fn_span, .. } => {
let fun = self.parse_operand(*fun)?;
let args =
args.iter().map(|arg|
Ok(Spanned {
node: self.parse_operand(*arg)?,
span: self.thir.exprs[*arg].span,
})).collect::<PResult<Box<[_]>>>()?;
Ok(TerminatorKind::TailCall {
func: fun,
args,
fn_span: *fn_span,
})
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "tail call")),
}
}parse_by_kind!(self, args[0], _, "tail call",
191 ExprKind::Call { fun, args, fn_span, .. } => {
192 let fun = self.parse_operand(*fun)?;
193 let args = args
194 .iter()
195 .map(|arg|
196 Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
197 )
198 .collect::<PResult<Box<[_]>>>()?;
199 Ok(TerminatorKind::TailCall {
200 func: fun,
201 args,
202 fn_span: *fn_span,
203 })
204 },
205 )
206 }
207
208 fn parse_rvalue(&self, expr_id: ExprId) -> PResult<Rvalue<'tcx>> {
209 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:209",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(209u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "rvalue") as &dyn Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_discriminant,
*did)
}
_ => false,
}
} => self.parse_place(args[0]).map(Rvalue::Discriminant),
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_transmute,
*did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
Ok(Rvalue::Cast(CastKind::Transmute, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_to_ptr,
*did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
Ok(Rvalue::Cast(CastKind::PtrToPtr, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_unsize,
*did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
let kind =
CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize,
CoercionSource::AsCast);
Ok(Rvalue::Cast(kind, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_checked,
*did)
}
_ => false,
}
} => {
{
let expr_id = self.preparse(args[0]);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:225",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(225u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "binary op") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Binary { op, lhs, rhs } => {
if let Some(op_with_overflow) = op.wrapping_to_overflowing()
{
Ok(Rvalue::BinaryOp(op_with_overflow,
Box::new((self.parse_operand(*lhs)?,
self.parse_operand(*rhs)?))))
} else {
Err(self.expr_error(expr_id,
"No WithOverflow form of this operator"))
}
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "binary op")),
}
}
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_offset,
*did)
}
_ => false,
}
} => {
let ptr = self.parse_operand(args[0])?;
let offset = self.parse_operand(args[1])?;
Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_ptr_metadata,
*did)
}
_ => false,
}
} =>
Ok(Rvalue::UnaryOp(UnOp::PtrMetadata,
self.parse_operand(args[0])?)),
ExprKind::Borrow { borrow_kind, arg } =>
Ok(Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind,
self.parse_place(*arg)?)),
ExprKind::RawBorrow { mutability, arg } =>
Ok(Rvalue::RawPtr((*mutability).into(), self.parse_place(*arg)?)),
ExprKind::Binary { op, lhs, rhs } =>
Ok(Rvalue::BinaryOp(*op,
Box::new((self.parse_operand(*lhs)?,
self.parse_operand(*rhs)?)))),
ExprKind::Unary { op, arg } =>
Ok(Rvalue::UnaryOp(*op, self.parse_operand(*arg)?)),
ExprKind::Repeat { value, count } =>
Ok(Rvalue::Repeat(self.parse_operand(*value)?, *count)),
ExprKind::Cast { source } => {
let source = self.parse_operand(*source)?;
let source_ty = source.ty(self.body.local_decls(), self.tcx);
let cast_kind = mir_cast_kind(source_ty, expr.ty);
Ok(Rvalue::Cast(cast_kind, source, expr.ty))
}
ExprKind::Tuple { fields } =>
Ok(Rvalue::Aggregate(Box::new(AggregateKind::Tuple),
fields.iter().map(|e|
self.parse_operand(*e)).collect::<Result<_, _>>()?)),
ExprKind::Array { fields } => {
let elem_ty =
expr.ty.builtin_index().expect("ty must be an array");
Ok(Rvalue::Aggregate(Box::new(AggregateKind::Array(elem_ty)),
fields.iter().map(|e|
self.parse_operand(*e)).collect::<Result<_, _>>()?))
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, args, fields, .. }) =>
{
let is_union = adt_def.is_union();
let active_field_index = is_union.then(|| fields[0].name);
Ok(Rvalue::Aggregate(Box::new(AggregateKind::Adt(adt_def.did(),
*variant_index, args, None, active_field_index)),
fields.iter().map(|f|
self.parse_operand(f.expr)).collect::<Result<_, _>>()?))
}
_ =>
self.parse_operand(expr_id).map(|op|
Rvalue::Use(op,
WithRetag::Yes)),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "rvalue")),
}
}parse_by_kind!(self, expr_id, expr, "rvalue",
210 @call(mir_discriminant, args) => self.parse_place(args[0]).map(Rvalue::Discriminant),
211 @call(mir_cast_transmute, args) => {
212 let source = self.parse_operand(args[0])?;
213 Ok(Rvalue::Cast(CastKind::Transmute, source, expr.ty))
214 },
215 @call(mir_cast_ptr_to_ptr, args) => {
216 let source = self.parse_operand(args[0])?;
217 Ok(Rvalue::Cast(CastKind::PtrToPtr, source, expr.ty))
218 },
219 @call(mir_cast_unsize, args) => {
220 let source = self.parse_operand(args[0])?;
221 let kind = CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize, CoercionSource::AsCast);
222 Ok(Rvalue::Cast(kind, source, expr.ty))
223 },
224 @call(mir_checked, args) => {
225 parse_by_kind!(self, args[0], _, "binary op",
226 ExprKind::Binary { op, lhs, rhs } => {
227 if let Some(op_with_overflow) = op.wrapping_to_overflowing() {
228 Ok(Rvalue::BinaryOp(
229 op_with_overflow, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?))
230 ))
231 } else {
232 Err(self.expr_error(expr_id, "No WithOverflow form of this operator"))
233 }
234 },
235 )
236 },
237 @call(mir_offset, args) => {
238 let ptr = self.parse_operand(args[0])?;
239 let offset = self.parse_operand(args[1])?;
240 Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
241 },
242 @call(mir_ptr_metadata, args) => Ok(Rvalue::UnaryOp(UnOp::PtrMetadata, self.parse_operand(args[0])?)),
243 ExprKind::Borrow { borrow_kind, arg } => Ok(
244 Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
245 ),
246 ExprKind::RawBorrow { mutability, arg } => Ok(
247 Rvalue::RawPtr((*mutability).into(), self.parse_place(*arg)?)
248 ),
249 ExprKind::Binary { op, lhs, rhs } => Ok(
250 Rvalue::BinaryOp(*op, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?)))
251 ),
252 ExprKind::Unary { op, arg } => Ok(
253 Rvalue::UnaryOp(*op, self.parse_operand(*arg)?)
254 ),
255 ExprKind::Repeat { value, count } => Ok(
256 Rvalue::Repeat(self.parse_operand(*value)?, *count)
257 ),
258 ExprKind::Cast { source } => {
259 let source = self.parse_operand(*source)?;
260 let source_ty = source.ty(self.body.local_decls(), self.tcx);
261 let cast_kind = mir_cast_kind(source_ty, expr.ty);
262 Ok(Rvalue::Cast(cast_kind, source, expr.ty))
263 },
264 ExprKind::Tuple { fields } => Ok(
265 Rvalue::Aggregate(
266 Box::new(AggregateKind::Tuple),
267 fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
268 )
269 ),
270 ExprKind::Array { fields } => {
271 let elem_ty = expr.ty.builtin_index().expect("ty must be an array");
272 Ok(Rvalue::Aggregate(
273 Box::new(AggregateKind::Array(elem_ty)),
274 fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
275 ))
276 },
277 ExprKind::Adt(AdtExpr { adt_def, variant_index, args, fields, .. }) => {
278 let is_union = adt_def.is_union();
279 let active_field_index = is_union.then(|| fields[0].name);
280
281 Ok(Rvalue::Aggregate(
282 Box::new(AggregateKind::Adt(adt_def.did(), *variant_index, args, None, active_field_index)),
283 fields.iter().map(|f| self.parse_operand(f.expr)).collect::<Result<_, _>>()?
284 ))
285 },
286 _ => self.parse_operand(expr_id).map(|op| Rvalue::Use(op, WithRetag::Yes)),
287 )
288 }
289
290 pub(crate) fn parse_operand(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
291 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:291",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(291u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "operand") as &dyn Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_move, *did)
}
_ => false,
}
} => self.parse_place(args[0]).map(Operand::Move),
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_static,
*did)
}
_ => false,
}
} => self.parse_static(args[0]),
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_static_mut,
*did)
}
_ => false,
}
} => self.parse_static(args[0]),
ExprKind::Literal { .. } | ExprKind::NamedConst { .. } |
ExprKind::NonHirLiteral { .. } | ExprKind::ZstLiteral { .. } |
ExprKind::ConstParam { .. } | ExprKind::ConstBlock { .. } => {
Ok(Operand::Constant(Box::new(as_constant_inner(expr, |_| None,
self.tcx))))
}
_ =>
self.parse_place(expr_id).map(Operand::Copy),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "operand")),
}
}parse_by_kind!(self, expr_id, expr, "operand",
292 @call(mir_move, args) => self.parse_place(args[0]).map(Operand::Move),
293 @call(mir_static, args) => self.parse_static(args[0]),
294 @call(mir_static_mut, args) => self.parse_static(args[0]),
295 ExprKind::Literal { .. }
296 | ExprKind::NamedConst { .. }
297 | ExprKind::NonHirLiteral { .. }
298 | ExprKind::ZstLiteral { .. }
299 | ExprKind::ConstParam { .. }
300 | ExprKind::ConstBlock { .. } => {
301 Ok(Operand::Constant(Box::new(
302 as_constant_inner(expr, |_| None, self.tcx)
303 )))
304 },
305 _ => self.parse_place(expr_id).map(Operand::Copy),
306 )
307 }
308
309 fn parse_place(&self, expr_id: ExprId) -> PResult<Place<'tcx>> {
310 self.parse_place_inner(expr_id).map(|(x, _)| x)
311 }
312
313 fn parse_place_inner(&self, expr_id: ExprId) -> PResult<(Place<'tcx>, PlaceTy<'tcx>)> {
314 let (parent, proj) = {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:314",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(314u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "place") as &dyn Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_field,
*did)
}
_ => false,
}
} => {
let (parent, place_ty) = self.parse_place_inner(args[0])?;
let field =
FieldIdx::from_u32(self.parse_integer_literal(args[1])? as
u32);
let field_ty =
PlaceTy::field_ty(self.tcx, place_ty.ty,
place_ty.variant_index, field).skip_norm_wip();
let proj = PlaceElem::Field(field, field_ty);
let place = parent.project_deeper(&[proj], self.tcx);
return Ok((place, PlaceTy::from_ty(field_ty)));
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_variant,
*did)
}
_ => false,
}
} => {
(args[0],
PlaceElem::Downcast(None,
VariantIdx::from_u32(self.parse_integer_literal(args[1])? as
u32)))
}
ExprKind::Deref { arg } => {
{
let expr_id = self.preparse(*arg);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:331",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(331u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "does not matter") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_make_place,
*did)
}
_ => false,
}
} => return self.parse_place_inner(args[0]),
_ =>
(*arg,
PlaceElem::Deref),
#[allow(unreachable_patterns)]
_ =>
return Err(self.expr_error(expr_id, "does not matter")),
}
}
}
ExprKind::Index { lhs, index } =>
(*lhs, PlaceElem::Index(self.parse_local(*index)?)),
ExprKind::Field { lhs, name: field, .. } =>
(*lhs, PlaceElem::Field(*field, expr.ty)),
_ => {
let place = self.parse_local(expr_id).map(Place::from)?;
return Ok((place, PlaceTy::from_ty(expr.ty)))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "place")),
}
}parse_by_kind!(self, expr_id, expr, "place",
315 @call(mir_field, args) => {
316 let (parent, place_ty) = self.parse_place_inner(args[0])?;
317 let field = FieldIdx::from_u32(self.parse_integer_literal(args[1])? as u32);
318 let field_ty = PlaceTy::field_ty(self.tcx, place_ty.ty, place_ty.variant_index, field)
319 .skip_norm_wip();
320 let proj = PlaceElem::Field(field, field_ty);
321 let place = parent.project_deeper(&[proj], self.tcx);
322 return Ok((place, PlaceTy::from_ty(field_ty)));
323 },
324 @call(mir_variant, args) => {
325 (args[0], PlaceElem::Downcast(
326 None,
327 VariantIdx::from_u32(self.parse_integer_literal(args[1])? as u32)
328 ))
329 },
330 ExprKind::Deref { arg } => {
331 parse_by_kind!(self, *arg, _, "does not matter",
332 @call(mir_make_place, args) => return self.parse_place_inner(args[0]),
333 _ => (*arg, PlaceElem::Deref),
334 )
335 },
336 ExprKind::Index { lhs, index } => (*lhs, PlaceElem::Index(self.parse_local(*index)?)),
337 ExprKind::Field { lhs, name: field, .. } => (*lhs, PlaceElem::Field(*field, expr.ty)),
338 _ => {
339 let place = self.parse_local(expr_id).map(Place::from)?;
340 return Ok((place, PlaceTy::from_ty(expr.ty)))
341 },
342 );
343 let (parent, ty) = self.parse_place_inner(parent)?;
344 let place = parent.project_deeper(&[proj], self.tcx);
345 let ty = ty.projection_ty(self.tcx, proj);
346 Ok((place, ty))
347 }
348
349 fn parse_local(&self, expr_id: ExprId) -> PResult<Local> {
350 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:350",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(350u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "local") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::VarRef { id } =>
Ok(self.local_map[id]),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "local")),
}
}parse_by_kind!(self, expr_id, _, "local",
351 ExprKind::VarRef { id } => Ok(self.local_map[id]),
352 )
353 }
354
355 fn parse_block(&self, expr_id: ExprId) -> PResult<BasicBlock> {
356 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:356",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(356u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "basic block") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::VarRef { id } =>
Ok(self.block_map[id]),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "basic block")),
}
}parse_by_kind!(self, expr_id, _, "basic block",
357 ExprKind::VarRef { id } => Ok(self.block_map[id]),
358 )
359 }
360
361 fn parse_static(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
362 let expr_id = {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:362",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(362u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "static") as &dyn Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Deref { arg } =>
*arg,
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "static")),
}
}parse_by_kind!(self, expr_id, _, "static",
363 ExprKind::Deref { arg } => *arg,
364 );
365
366 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:366",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(366u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "static") as &dyn Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::StaticRef { alloc_id, ty, .. } => {
let const_val =
ConstValue::Scalar(Scalar::from_pointer((*alloc_id).into(),
&self.tcx));
let const_ = Const::Val(const_val, *ty);
Ok(Operand::Constant(Box::new(ConstOperand {
span: expr.span,
user_ty: None,
const_,
})))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "static")),
}
}parse_by_kind!(self, expr_id, expr, "static",
367 ExprKind::StaticRef { alloc_id, ty, .. } => {
368 let const_val =
369 ConstValue::Scalar(Scalar::from_pointer((*alloc_id).into(), &self.tcx));
370 let const_ = Const::Val(const_val, *ty);
371
372 Ok(Operand::Constant(Box::new(ConstOperand {
373 span: expr.span,
374 user_ty: None,
375 const_
376 })))
377 },
378 )
379 }
380
381 fn parse_integer_literal(&self, expr_id: ExprId) -> PResult<u128> {
382 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:382",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(382u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "constant") as &dyn Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Literal { .. } | ExprKind::NamedConst { .. } |
ExprKind::NonHirLiteral { .. } | ExprKind::ConstBlock { .. } =>
Ok({
let value = as_constant_inner(expr, |_| None, self.tcx);
value.const_.eval_bits(self.tcx, self.typing_env)
}),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "constant")),
}
}parse_by_kind!(self, expr_id, expr, "constant",
383 ExprKind::Literal { .. }
384 | ExprKind::NamedConst { .. }
385 | ExprKind::NonHirLiteral { .. }
386 | ExprKind::ConstBlock { .. } => Ok({
387 let value = as_constant_inner(expr, |_| None, self.tcx);
388 value.const_.eval_bits(self.tcx, self.typing_env)
389 }),
390 )
391 }
392}