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,
async_fut: 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 async_fut: None,
67 })
68 },
69 @call(mir_call, args) => {
70 self.parse_call(args)
71 },
72 @call(mir_tail_call, args) => {
73 self.parse_tail_call(args)
74 },
75 ExprKind::Match { scrutinee, arms, .. } => {
76 let discr = self.parse_operand(*scrutinee)?;
77 self.parse_match(arms, expr.span).map(|t| TerminatorKind::SwitchInt { discr, targets: t })
78 },
79 )
80 }
81
82 fn parse_unwind_terminate_reason(&self, expr_id: ExprId) -> PResult<UnwindTerminateReason> {
83 {
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:83",
"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(83u32),
::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(box 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(box 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",
84 @variant(mir_unwind_terminate_reason, Abi) => {
85 Ok(UnwindTerminateReason::Abi)
86 },
87 @variant(mir_unwind_terminate_reason, InCleanup) => {
88 Ok(UnwindTerminateReason::InCleanup)
89 },
90 )
91 }
92
93 fn parse_unwind_action(&self, expr_id: ExprId) -> PResult<UnwindAction> {
94 {
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:94",
"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(94u32),
::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",
95 @call(mir_unwind_continue, _args) => {
96 Ok(UnwindAction::Continue)
97 },
98 @call(mir_unwind_unreachable, _args) => {
99 Ok(UnwindAction::Unreachable)
100 },
101 @call(mir_unwind_terminate, args) => {
102 Ok(UnwindAction::Terminate(self.parse_unwind_terminate_reason(args[0])?))
103 },
104 @call(mir_unwind_cleanup, args) => {
105 Ok(UnwindAction::Cleanup(self.parse_block(args[0])?))
106 },
107 )
108 }
109
110 fn parse_return_to(&self, expr_id: ExprId) -> PResult<BasicBlock> {
111 {
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:111",
"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(111u32),
::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",
112 @call(mir_return_to, args) => {
113 self.parse_block(args[0])
114 },
115 )
116 }
117
118 fn parse_match(&self, arms: &[ArmId], span: Span) -> PResult<SwitchTargets> {
119 let Some((otherwise, rest)) = arms.split_last() else {
120 return Err(ParseError {
121 span,
122 item_description: "no arms".to_string(),
123 expected: "at least one arm".to_string(),
124 });
125 };
126
127 let otherwise = &self.thir[*otherwise];
128 let PatKind::Wild = otherwise.pattern.kind else {
129 return Err(ParseError {
130 span: otherwise.span,
131 item_description: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:?}", otherwise.pattern.kind))
})format!("{:?}", otherwise.pattern.kind),
132 expected: "wildcard pattern".to_string(),
133 });
134 };
135 let otherwise = self.parse_block(otherwise.body)?;
136
137 let mut values = Vec::new();
138 let mut targets = Vec::new();
139 for arm in rest {
140 let arm = &self.thir[*arm];
141 let value = match arm.pattern.kind {
142 PatKind::Constant { value } => value,
143 _ => {
144 return Err(ParseError {
145 span: arm.pattern.span,
146 item_description: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:?}", arm.pattern.kind))
})format!("{:?}", arm.pattern.kind),
147 expected: "constant pattern".to_string(),
148 });
149 }
150 };
151 values.push(value.to_leaf().to_bits_unchecked());
152 targets.push(self.parse_block(arm.body)?);
153 }
154
155 Ok(SwitchTargets::new(values.into_iter().zip(targets), otherwise))
156 }
157
158 fn parse_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
159 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:159",
"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(159u32),
::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",
160 ExprKind::Assign { lhs, rhs } => (*lhs, *rhs),
161 );
162 let destination = self.parse_place(destination)?;
163 let target = self.parse_return_to(args[1])?;
164 let unwind = self.parse_unwind_action(args[2])?;
165
166 {
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:166",
"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(166u32),
::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",
167 ExprKind::Call { fun, args, from_hir_call, fn_span, .. } => {
168 let fun = self.parse_operand(*fun)?;
169 let args = args
170 .iter()
171 .map(|arg|
172 Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
173 )
174 .collect::<PResult<Box<[_]>>>()?;
175 Ok(TerminatorKind::Call {
176 func: fun,
177 args,
178 destination,
179 target: Some(target),
180 unwind,
181 call_source: if *from_hir_call { CallSource::Normal } else {
182 CallSource::OverloadedOperator
183 },
184 fn_span: *fn_span,
185 })
186 },
187 )
188 }
189
190 fn parse_tail_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
191 {
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:191",
"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(191u32),
::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",
192 ExprKind::Call { fun, args, fn_span, .. } => {
193 let fun = self.parse_operand(*fun)?;
194 let args = args
195 .iter()
196 .map(|arg|
197 Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
198 )
199 .collect::<PResult<Box<[_]>>>()?;
200 Ok(TerminatorKind::TailCall {
201 func: fun,
202 args,
203 fn_span: *fn_span,
204 })
205 },
206 )
207 }
208
209 fn parse_rvalue(&self, expr_id: ExprId) -> PResult<Rvalue<'tcx>> {
210 {
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:210",
"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(210u32),
::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:226",
"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(226u32),
::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(box 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",
211 @call(mir_discriminant, args) => self.parse_place(args[0]).map(Rvalue::Discriminant),
212 @call(mir_cast_transmute, args) => {
213 let source = self.parse_operand(args[0])?;
214 Ok(Rvalue::Cast(CastKind::Transmute, source, expr.ty))
215 },
216 @call(mir_cast_ptr_to_ptr, args) => {
217 let source = self.parse_operand(args[0])?;
218 Ok(Rvalue::Cast(CastKind::PtrToPtr, source, expr.ty))
219 },
220 @call(mir_cast_unsize, args) => {
221 let source = self.parse_operand(args[0])?;
222 let kind = CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize, CoercionSource::AsCast);
223 Ok(Rvalue::Cast(kind, source, expr.ty))
224 },
225 @call(mir_checked, args) => {
226 parse_by_kind!(self, args[0], _, "binary op",
227 ExprKind::Binary { op, lhs, rhs } => {
228 if let Some(op_with_overflow) = op.wrapping_to_overflowing() {
229 Ok(Rvalue::BinaryOp(
230 op_with_overflow, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?))
231 ))
232 } else {
233 Err(self.expr_error(expr_id, "No WithOverflow form of this operator"))
234 }
235 },
236 )
237 },
238 @call(mir_offset, args) => {
239 let ptr = self.parse_operand(args[0])?;
240 let offset = self.parse_operand(args[1])?;
241 Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
242 },
243 @call(mir_ptr_metadata, args) => Ok(Rvalue::UnaryOp(UnOp::PtrMetadata, self.parse_operand(args[0])?)),
244 ExprKind::Borrow { borrow_kind, arg } => Ok(
245 Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
246 ),
247 ExprKind::RawBorrow { mutability, arg } => Ok(
248 Rvalue::RawPtr((*mutability).into(), self.parse_place(*arg)?)
249 ),
250 ExprKind::Binary { op, lhs, rhs } => Ok(
251 Rvalue::BinaryOp(*op, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?)))
252 ),
253 ExprKind::Unary { op, arg } => Ok(
254 Rvalue::UnaryOp(*op, self.parse_operand(*arg)?)
255 ),
256 ExprKind::Repeat { value, count } => Ok(
257 Rvalue::Repeat(self.parse_operand(*value)?, *count)
258 ),
259 ExprKind::Cast { source } => {
260 let source = self.parse_operand(*source)?;
261 let source_ty = source.ty(self.body.local_decls(), self.tcx);
262 let cast_kind = mir_cast_kind(source_ty, expr.ty);
263 Ok(Rvalue::Cast(cast_kind, source, expr.ty))
264 },
265 ExprKind::Tuple { fields } => Ok(
266 Rvalue::Aggregate(
267 Box::new(AggregateKind::Tuple),
268 fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
269 )
270 ),
271 ExprKind::Array { fields } => {
272 let elem_ty = expr.ty.builtin_index().expect("ty must be an array");
273 Ok(Rvalue::Aggregate(
274 Box::new(AggregateKind::Array(elem_ty)),
275 fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
276 ))
277 },
278 ExprKind::Adt(box AdtExpr { adt_def, variant_index, args, fields, .. }) => {
279 let is_union = adt_def.is_union();
280 let active_field_index = is_union.then(|| fields[0].name);
281
282 Ok(Rvalue::Aggregate(
283 Box::new(AggregateKind::Adt(adt_def.did(), *variant_index, args, None, active_field_index)),
284 fields.iter().map(|f| self.parse_operand(f.expr)).collect::<Result<_, _>>()?
285 ))
286 },
287 _ => self.parse_operand(expr_id).map(|op| Rvalue::Use(op, WithRetag::Yes)),
288 )
289 }
290
291 pub(crate) fn parse_operand(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
292 {
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:292",
"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(292u32),
::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",
293 @call(mir_move, args) => self.parse_place(args[0]).map(Operand::Move),
294 @call(mir_static, args) => self.parse_static(args[0]),
295 @call(mir_static_mut, args) => self.parse_static(args[0]),
296 ExprKind::Literal { .. }
297 | ExprKind::NamedConst { .. }
298 | ExprKind::NonHirLiteral { .. }
299 | ExprKind::ZstLiteral { .. }
300 | ExprKind::ConstParam { .. }
301 | ExprKind::ConstBlock { .. } => {
302 Ok(Operand::Constant(Box::new(
303 as_constant_inner(expr, |_| None, self.tcx)
304 )))
305 },
306 _ => self.parse_place(expr_id).map(Operand::Copy),
307 )
308 }
309
310 fn parse_place(&self, expr_id: ExprId) -> PResult<Place<'tcx>> {
311 self.parse_place_inner(expr_id).map(|(x, _)| x)
312 }
313
314 fn parse_place_inner(&self, expr_id: ExprId) -> PResult<(Place<'tcx>, PlaceTy<'tcx>)> {
315 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:315",
"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(315u32),
::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);
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",
316 @call(mir_field, args) => {
317 let (parent, place_ty) = self.parse_place_inner(args[0])?;
318 let field = FieldIdx::from_u32(self.parse_integer_literal(args[1])? as u32);
319 let field_ty = PlaceTy::field_ty(self.tcx, place_ty.ty, place_ty.variant_index, field);
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}