]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_codegen_ssa/src/mir/statement.rs
New upstream version 1.62.1+dfsg1
[rustc.git] / compiler / rustc_codegen_ssa / src / mir / statement.rs
CommitLineData
ba9703b0 1use rustc_middle::mir;
3157f602 2
2c00a5a8 3use super::FunctionCx;
3157f602 4use super::LocalRef;
dfeec247 5use crate::traits::BuilderMethods;
9fa01778 6use crate::traits::*;
92a42be0 7
dc9dc135 8impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
dfeec247 9 pub fn codegen_statement(&mut self, mut bx: Bx, statement: &mir::Statement<'tcx>) -> Bx {
94b46f34 10 debug!("codegen_statement(statement={:?})", statement);
92a42be0 11
a1dfa0c6 12 self.set_debug_loc(&mut bx, statement.source_info);
92a42be0 13 match statement.kind {
dfeec247 14 mir::StatementKind::Assign(box (ref place, ref rvalue)) => {
e74abb32
XL
15 if let Some(index) = place.as_local() {
16 match self.locals[index] {
dfeec247 17 LocalRef::Place(cg_dest) => self.codegen_rvalue(bx, cg_dest, rvalue),
b7449926
XL
18 LocalRef::UnsizedPlace(cg_indirect_dest) => {
19 self.codegen_rvalue_unsized(bx, cg_indirect_dest, rvalue)
20 }
3157f602 21 LocalRef::Operand(None) => {
e1599b0c 22 let (mut bx, operand) = self.codegen_rvalue_operand(bx, rvalue);
e74abb32
XL
23 self.locals[index] = LocalRef::Operand(Some(operand));
24 self.debug_introduce_local(&mut bx, index);
2c00a5a8 25 bx
3157f602 26 }
ff7c6d11
XL
27 LocalRef::Operand(Some(op)) => {
28 if !op.layout.is_zst() {
dfeec247
XL
29 span_bug!(
30 statement.source_info.span,
31 "operand {:?} already assigned",
32 rvalue
33 );
92a42be0 34 }
ff7c6d11
XL
35
36 // If the type is zero-sized, it's already been set here,
94b46f34
XL
37 // but we still need to make sure we codegen the operand
38 self.codegen_rvalue_operand(bx, rvalue).0
92a42be0
SL
39 }
40 }
3157f602 41 } else {
74b04a01 42 let cg_dest = self.codegen_place(&mut bx, place.as_ref());
94b46f34 43 self.codegen_rvalue(bx, cg_dest, rvalue)
92a42be0
SL
44 }
45 }
dfeec247 46 mir::StatementKind::SetDiscriminant { box ref place, variant_index } => {
74b04a01 47 self.codegen_place(&mut bx, place.as_ref())
a1dfa0c6 48 .codegen_set_discr(&mut bx, variant_index);
2c00a5a8 49 bx
5bcae85e 50 }
04454e1e
FG
51 mir::StatementKind::Deinit(..) => {
52 // For now, don't codegen this to anything. In the future it may be worth
53 // experimenting with what kind of information we can emit to LLVM without hurting
54 // perf here
55 bx
56 }
ea8adc8c 57 mir::StatementKind::StorageLive(local) => {
94b46f34 58 if let LocalRef::Place(cg_place) = self.locals[local] {
a1dfa0c6 59 cg_place.storage_live(&mut bx);
b7449926 60 } else if let LocalRef::UnsizedPlace(cg_indirect_place) = self.locals[local] {
a1dfa0c6 61 cg_indirect_place.storage_live(&mut bx);
ff7c6d11 62 }
2c00a5a8 63 bx
5bcae85e 64 }
ea8adc8c 65 mir::StatementKind::StorageDead(local) => {
94b46f34 66 if let LocalRef::Place(cg_place) = self.locals[local] {
a1dfa0c6 67 cg_place.storage_dead(&mut bx);
b7449926 68 } else if let LocalRef::UnsizedPlace(cg_indirect_place) = self.locals[local] {
a1dfa0c6 69 cg_indirect_place.storage_dead(&mut bx);
ff7c6d11 70 }
2c00a5a8 71 bx
5bcae85e 72 }
3dfed10e 73 mir::StatementKind::Coverage(box ref coverage) => {
6a06907d
XL
74 self.codegen_coverage(&mut bx, coverage.clone(), statement.source_info.scope);
75 bx
76 }
77 mir::StatementKind::CopyNonOverlapping(box mir::CopyNonOverlapping {
78 ref src,
79 ref dst,
80 ref count,
81 }) => {
82 let dst_val = self.codegen_operand(&mut bx, dst);
83 let src_val = self.codegen_operand(&mut bx, src);
84 let count = self.codegen_operand(&mut bx, count).immediate();
85 let pointee_layout = dst_val
86 .layout
3c0e092e 87 .pointee_info_at(&bx, rustc_target::abi::Size::ZERO)
6a06907d
XL
88 .expect("Expected pointer");
89 let bytes = bx.mul(count, bx.const_usize(pointee_layout.size.bytes()));
90
91 let align = pointee_layout.align;
92 let dst = dst_val.immediate();
93 let src = src_val.immediate();
94 bx.memcpy(dst, align, src, align, bytes, crate::MemFlags::empty());
3dfed10e
XL
95 bx
96 }
dfeec247
XL
97 mir::StatementKind::FakeRead(..)
98 | mir::StatementKind::Retag { .. }
99 | mir::StatementKind::AscribeUserType(..)
100 | mir::StatementKind::Nop => bx,
5bcae85e
SL
101 }
102 }
92a42be0 103}