Skip to content

Commit f8ee261

Browse files
committed
Make build_codegen_mir return a Cow.
1 parent 4b3a52f commit f8ee261

22 files changed

Lines changed: 74 additions & 60 deletions

File tree

Cargo.lock

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3835,7 +3835,6 @@ dependencies = [
38353835
"rustc_macros",
38363836
"rustc_metadata",
38373837
"rustc_middle",
3838-
"rustc_mir_transform",
38393838
"rustc_serialize",
38403839
"rustc_session",
38413840
"rustc_span",

compiler/rustc_codegen_cranelift/src/base.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_ast::InlineAsmOptions;
88
use rustc_codegen_ssa::base::is_call_from_compiler_builtins_to_upstream_monomorphization;
99
use rustc_data_structures::profiling::SelfProfilerRef;
1010
use rustc_index::IndexVec;
11+
use rustc_middle::mono::{InstantiationMode, MonoItem};
1112
use rustc_middle::ty::TypeVisitableExt;
1213
use rustc_middle::ty::adjustment::PointerCoercion;
1314
use rustc_middle::ty::layout::{FnAbiOf, HasTypingEnv as _};
@@ -45,6 +46,10 @@ pub(crate) fn codegen_fn<'tcx>(
4546
let _timer = tcx.prof.generic_activity_with_arg("codegen fn", &*symbol_name);
4647

4748
let mir = tcx.build_codegen_mir(instance);
49+
let mir = match MonoItem::Fn(instance).instantiation_mode(tcx) {
50+
InstantiationMode::LocalCopy => &*mir.borrow(),
51+
InstantiationMode::GloballyShared { .. } => &*mir.steal(),
52+
};
4853
let _mir_guard = crate::PrintOnPanic(|| {
4954
let mut buf = Vec::new();
5055
with_no_trimmed_paths!({

compiler/rustc_codegen_cranelift/src/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ pub(crate) fn create_wrapper_function(
266266
module.define_function(wrapper_func_id, &mut ctx).unwrap();
267267
}
268268

269-
pub(crate) struct FunctionCx<'m, 'clif, 'tcx: 'm> {
269+
pub(crate) struct FunctionCx<'m, 'clif, 'tcx> {
270270
pub(crate) module: &'m mut dyn Module,
271271
pub(crate) debug_context: Option<&'clif mut DebugContext>,
272272
pub(crate) tcx: TyCtxt<'tcx>,
@@ -278,7 +278,7 @@ pub(crate) struct FunctionCx<'m, 'clif, 'tcx: 'm> {
278278
pub(crate) cgu_name: Symbol,
279279
pub(crate) instance: Instance<'tcx>,
280280
pub(crate) symbol_name: String,
281-
pub(crate) mir: &'tcx Body<'tcx>,
281+
pub(crate) mir: &'m Body<'tcx>,
282282
pub(crate) fn_abi: &'tcx FnAbi<'tcx, Ty<'tcx>>,
283283

284284
pub(crate) bcx: FunctionBuilder<'clif>,

compiler/rustc_codegen_ssa/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ rustc_lint_defs = { path = "../rustc_lint_defs" }
2727
rustc_macros = { path = "../rustc_macros" }
2828
rustc_metadata = { path = "../rustc_metadata" }
2929
rustc_middle = { path = "../rustc_middle" }
30-
rustc_mir_transform = { path = "../rustc_mir_transform" }
3130
rustc_serialize = { path = "../rustc_serialize" }
3231
rustc_session = { path = "../rustc_session" }
3332
rustc_span = { path = "../rustc_span" }

compiler/rustc_codegen_ssa/src/mir/analyze.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use super::FunctionCx;
1515
use crate::traits::*;
1616

1717
pub(crate) fn non_ssa_locals<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
18-
fx: &FunctionCx<'a, 'tcx, Bx>,
18+
fx: &FunctionCx<'_, 'a, 'tcx, Bx>,
1919
traversal_order: &[mir::BasicBlock],
2020
) -> DenseBitSet<mir::Local> {
2121
let mir = fx.mir;
@@ -65,13 +65,13 @@ enum LocalKind {
6565
SSA(DefLocation),
6666
}
6767

68-
struct LocalAnalyzer<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> {
69-
fx: &'a FunctionCx<'b, 'tcx, Bx>,
68+
struct LocalAnalyzer<'a, 'mir, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> {
69+
fx: &'a FunctionCx<'mir, 'b, 'tcx, Bx>,
7070
dominators: &'a Dominators<mir::BasicBlock>,
7171
locals: IndexVec<mir::Local, LocalKind>,
7272
}
7373

74-
impl<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> LocalAnalyzer<'a, 'b, 'tcx, Bx> {
74+
impl<'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> LocalAnalyzer<'_, '_, 'b, 'tcx, Bx> {
7575
fn define(&mut self, local: mir::Local, location: DefLocation) {
7676
let fx = self.fx;
7777
let kind = &mut self.locals[local];
@@ -166,7 +166,7 @@ impl<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> LocalAnalyzer<'a, 'b, 'tcx, Bx>
166166
}
167167
}
168168

169-
impl<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> Visitor<'tcx> for LocalAnalyzer<'a, 'b, 'tcx, Bx> {
169+
impl<'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> Visitor<'tcx> for LocalAnalyzer<'_, '_, 'b, 'tcx, Bx> {
170170
fn visit_assign(
171171
&mut self,
172172
place: &mir::Place<'tcx>,

compiler/rustc_codegen_ssa/src/mir/block.rs

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,17 @@ enum CallKind {
4646

4747
/// Used by `FunctionCx::codegen_terminator` for emitting common patterns
4848
/// e.g., creating a basic block, calling a function, etc.
49-
struct TerminatorCodegenHelper<'tcx> {
49+
struct TerminatorCodegenHelper<'mir, 'tcx> {
5050
bb: mir::BasicBlock,
51-
terminator: &'tcx mir::Terminator<'tcx>,
51+
terminator: &'mir mir::Terminator<'tcx>,
5252
}
5353

54-
impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
54+
impl<'a, 'tcx> TerminatorCodegenHelper<'_, 'tcx> {
5555
/// Returns the appropriate `Funclet` for the current funclet, if on MSVC,
5656
/// either already previously cached, or newly created, by `landing_pad_for`.
5757
fn funclet<'b, Bx: BuilderMethods<'a, 'tcx>>(
5858
&self,
59-
fx: &'b mut FunctionCx<'a, 'tcx, Bx>,
59+
fx: &'b mut FunctionCx<'_, 'a, 'tcx, Bx>,
6060
) -> Option<&'b Bx::Funclet> {
6161
let cleanup_kinds = fx.cleanup_kinds.as_ref()?;
6262
let funclet_bb = cleanup_kinds[self.bb].funclet_bb(self.bb)?;
@@ -82,7 +82,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
8282
/// stuff in it or next to it.
8383
fn llbb_with_cleanup<Bx: BuilderMethods<'a, 'tcx>>(
8484
&self,
85-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
85+
fx: &mut FunctionCx<'_, 'a, 'tcx, Bx>,
8686
target: mir::BasicBlock,
8787
) -> Bx::BasicBlock {
8888
let (needs_landing_pad, is_cleanupret) = self.llbb_characteristics(fx, target);
@@ -106,7 +106,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
106106

107107
fn llbb_characteristics<Bx: BuilderMethods<'a, 'tcx>>(
108108
&self,
109-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
109+
fx: &mut FunctionCx<'_, 'a, 'tcx, Bx>,
110110
target: mir::BasicBlock,
111111
) -> (bool, bool) {
112112
if let Some(ref cleanup_kinds) = fx.cleanup_kinds {
@@ -131,7 +131,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
131131

132132
fn funclet_br<Bx: BuilderMethods<'a, 'tcx>>(
133133
&self,
134-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
134+
fx: &mut FunctionCx<'_, 'a, 'tcx, Bx>,
135135
bx: &mut Bx,
136136
target: mir::BasicBlock,
137137
mergeable_succ: bool,
@@ -160,7 +160,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
160160
/// return destination `destination` and the unwind action `unwind`.
161161
fn do_call<Bx: BuilderMethods<'a, 'tcx>>(
162162
&self,
163-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
163+
fx: &mut FunctionCx<'_, 'a, 'tcx, Bx>,
164164
bx: &mut Bx,
165165
fn_abi: &'tcx FnAbi<'tcx, Ty<'tcx>>,
166166
fn_ptr: Bx::Value,
@@ -302,7 +302,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
302302
/// Generates inline assembly with optional `destination` and `unwind`.
303303
fn do_inlineasm<Bx: BuilderMethods<'a, 'tcx>>(
304304
&self,
305-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
305+
fx: &mut FunctionCx<'_, 'a, 'tcx, Bx>,
306306
bx: &mut Bx,
307307
template: &[InlineAsmTemplatePiece],
308308
operands: &[InlineAsmOperandRef<'tcx, Bx>],
@@ -369,9 +369,13 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
369369
}
370370

371371
/// Codegen implementations for some terminator variants.
372-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
372+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'_, 'a, 'tcx, Bx> {
373373
/// Generates code for a `Resume` terminator.
374-
fn codegen_resume_terminator(&mut self, helper: TerminatorCodegenHelper<'tcx>, bx: &mut Bx) {
374+
fn codegen_resume_terminator(
375+
&mut self,
376+
helper: TerminatorCodegenHelper<'_, 'tcx>,
377+
bx: &mut Bx,
378+
) {
375379
if let Some(funclet) = helper.funclet(self) {
376380
bx.cleanup_ret(funclet, None);
377381
} else {
@@ -388,7 +392,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
388392

389393
fn codegen_switchint_terminator(
390394
&mut self,
391-
helper: TerminatorCodegenHelper<'tcx>,
395+
helper: TerminatorCodegenHelper<'_, 'tcx>,
392396
bx: &mut Bx,
393397
discr: &mir::Operand<'tcx>,
394398
targets: &SwitchTargets,
@@ -600,7 +604,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
600604
#[tracing::instrument(level = "trace", skip(self, helper, bx))]
601605
fn codegen_drop_terminator(
602606
&mut self,
603-
helper: TerminatorCodegenHelper<'tcx>,
607+
helper: TerminatorCodegenHelper<'_, 'tcx>,
604608
bx: &mut Bx,
605609
source_info: &mir::SourceInfo,
606610
location: mir::Place<'tcx>,
@@ -698,7 +702,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
698702

699703
fn codegen_assert_terminator(
700704
&mut self,
701-
helper: TerminatorCodegenHelper<'tcx>,
705+
helper: TerminatorCodegenHelper<'_, 'tcx>,
702706
bx: &mut Bx,
703707
terminator: &mir::Terminator<'tcx>,
704708
cond: &mir::Operand<'tcx>,
@@ -799,7 +803,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
799803

800804
fn codegen_terminate_terminator(
801805
&mut self,
802-
helper: TerminatorCodegenHelper<'tcx>,
806+
helper: TerminatorCodegenHelper<'_, 'tcx>,
803807
bx: &mut Bx,
804808
terminator: &mir::Terminator<'tcx>,
805809
reason: UnwindTerminateReason,
@@ -830,7 +834,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
830834
/// Returns `Some` if this is indeed a panic intrinsic and codegen is done.
831835
fn codegen_panic_intrinsic(
832836
&mut self,
833-
helper: &TerminatorCodegenHelper<'tcx>,
837+
helper: &TerminatorCodegenHelper<'_, 'tcx>,
834838
bx: &mut Bx,
835839
intrinsic: ty::IntrinsicDef,
836840
instance: Instance<'tcx>,
@@ -897,7 +901,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
897901

898902
fn codegen_call_terminator(
899903
&mut self,
900-
helper: TerminatorCodegenHelper<'tcx>,
904+
helper: TerminatorCodegenHelper<'_, 'tcx>,
901905
bx: &mut Bx,
902906
terminator: &mir::Terminator<'tcx>,
903907
func: &mir::Operand<'tcx>,
@@ -1399,7 +1403,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
13991403

14001404
fn codegen_asm_terminator(
14011405
&mut self,
1402-
helper: TerminatorCodegenHelper<'tcx>,
1406+
helper: TerminatorCodegenHelper<'_, 'tcx>,
14031407
bx: &mut Bx,
14041408
asm_macro: InlineAsmMacro,
14051409
terminator: &mir::Terminator<'tcx>,
@@ -1524,7 +1528,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
15241528
&mut self,
15251529
bx: &mut Bx,
15261530
bb: mir::BasicBlock,
1527-
terminator: &'tcx mir::Terminator<'tcx>,
1531+
terminator: &mir::Terminator<'tcx>,
15281532
) -> MergingSucc {
15291533
debug!("codegen_terminator: {:?}", terminator);
15301534

compiler/rustc_codegen_ssa/src/mir/constant.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::errors;
99
use crate::mir::operand::OperandRef;
1010
use crate::traits::*;
1111

12-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'_, 'a, 'tcx, Bx> {
1313
pub(crate) fn eval_mir_constant_to_operand(
1414
&self,
1515
bx: &mut Bx,

compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_middle::mir::coverage::CoverageKind;
44
use super::FunctionCx;
55
use crate::traits::*;
66

7-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
7+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'_, 'a, 'tcx, Bx> {
88
pub(crate) fn codegen_coverage(&self, bx: &mut Bx, kind: &CoverageKind, scope: SourceScope) {
99
// Determine the instance that coverage data was originally generated for.
1010
let instance = if let Some(inlined) = scope.inlined_instance(&self.mir.source_scopes) {

compiler/rustc_codegen_ssa/src/mir/debuginfo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ fn calculate_debuginfo_offset<
214214
DebugInfoOffset { direct_offset, indirect_offsets, result: place }
215215
}
216216

217-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
217+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'_, 'a, 'tcx, Bx> {
218218
pub fn set_debug_loc(&self, bx: &mut Bx, source_info: mir::SourceInfo) {
219219
bx.set_span(source_info.span);
220220
if let Some(dbg_loc) = self.dbg_loc(source_info) {

compiler/rustc_codegen_ssa/src/mir/intrinsic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fn memset_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
5252
bx.memset(dst, val, size, align, flags);
5353
}
5454

55-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
55+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'_, 'a, 'tcx, Bx> {
5656
/// In the `Fallback` case, returns the instance that should be called instead.
5757
pub fn codegen_intrinsic_call(
5858
&mut self,

0 commit comments

Comments
 (0)