2 use rustc_errors
::struct_span_err
;
6 use super::OperandValue
;
7 use crate::traits
::BuilderMethods
;
10 impl<'a
, 'tcx
, Bx
: BuilderMethods
<'a
, 'tcx
>> FunctionCx
<'a
, 'tcx
, Bx
> {
11 pub fn codegen_statement(&mut self, mut bx
: Bx
, statement
: &mir
::Statement
<'tcx
>) -> Bx
{
12 debug
!("codegen_statement(statement={:?})", statement
);
14 self.set_debug_loc(&mut bx
, statement
.source_info
);
15 match statement
.kind
{
16 mir
::StatementKind
::Assign(box (ref place
, ref rvalue
)) => {
17 if let Some(index
) = place
.as_local() {
18 match self.locals
[index
] {
19 LocalRef
::Place(cg_dest
) => self.codegen_rvalue(bx
, cg_dest
, rvalue
),
20 LocalRef
::UnsizedPlace(cg_indirect_dest
) => {
21 self.codegen_rvalue_unsized(bx
, cg_indirect_dest
, rvalue
)
23 LocalRef
::Operand(None
) => {
24 let (mut bx
, operand
) = self.codegen_rvalue_operand(bx
, rvalue
);
25 self.locals
[index
] = LocalRef
::Operand(Some(operand
));
26 self.debug_introduce_local(&mut bx
, index
);
29 LocalRef
::Operand(Some(op
)) => {
30 if !op
.layout
.is_zst() {
32 statement
.source_info
.span
,
33 "operand {:?} already assigned",
38 // If the type is zero-sized, it's already been set here,
39 // but we still need to make sure we codegen the operand
40 self.codegen_rvalue_operand(bx
, rvalue
).0
44 let cg_dest
= self.codegen_place(&mut bx
, &place
.as_ref());
45 self.codegen_rvalue(bx
, cg_dest
, rvalue
)
48 mir
::StatementKind
::SetDiscriminant { box ref place, variant_index }
=> {
49 self.codegen_place(&mut bx
, &place
.as_ref())
50 .codegen_set_discr(&mut bx
, variant_index
);
53 mir
::StatementKind
::StorageLive(local
) => {
54 if let LocalRef
::Place(cg_place
) = self.locals
[local
] {
55 cg_place
.storage_live(&mut bx
);
56 } else if let LocalRef
::UnsizedPlace(cg_indirect_place
) = self.locals
[local
] {
57 cg_indirect_place
.storage_live(&mut bx
);
61 mir
::StatementKind
::StorageDead(local
) => {
62 if let LocalRef
::Place(cg_place
) = self.locals
[local
] {
63 cg_place
.storage_dead(&mut bx
);
64 } else if let LocalRef
::UnsizedPlace(cg_indirect_place
) = self.locals
[local
] {
65 cg_indirect_place
.storage_dead(&mut bx
);
69 mir
::StatementKind
::InlineAsm(ref asm
) => {
73 .map(|output
| self.codegen_place(&mut bx
, &output
.as_ref()))
76 let input_vals
= asm
.inputs
.iter().fold(
77 Vec
::with_capacity(asm
.inputs
.len()),
78 |mut acc
, (span
, input
)| {
79 let op
= self.codegen_operand(&mut bx
, input
);
80 if let OperandValue
::Immediate(_
) = op
.val
{
81 acc
.push(op
.immediate());
87 "invalid value for constraint in inline assembly"
95 if input_vals
.len() == asm
.inputs
.len() {
96 let res
= bx
.codegen_inline_asm(
100 statement
.source_info
.span
,
105 statement
.source_info
.span
,
107 "malformed inline assembly"
114 mir
::StatementKind
::FakeRead(..)
115 | mir
::StatementKind
::Retag { .. }
116 | mir
::StatementKind
::AscribeUserType(..)
117 | mir
::StatementKind
::Nop
=> bx
,