Skip to content

Commit 625ad60

Browse files
committed
Check for occupied niches
1 parent 5baf1e1 commit 625ad60

38 files changed

+1775
-15
lines changed

compiler/rustc_codegen_ssa/src/common.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use rustc_hir::LangItem;
44
use rustc_middle::mir;
55
use rustc_middle::ty::Instance;
6-
use rustc_middle::ty::{self, layout::TyAndLayout, Ty, TyCtxt};
6+
use rustc_middle::ty::{self, layout::TyAndLayout, GenericArg, Ty, TyCtxt};
77
use rustc_span::Span;
88

99
use crate::base;
@@ -121,10 +121,15 @@ pub fn build_langcall<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
121121
bx: &Bx,
122122
span: Option<Span>,
123123
li: LangItem,
124+
generic: Option<GenericArg<'tcx>>,
124125
) -> (Bx::FnAbiOfResult, Bx::Value, Instance<'tcx>) {
125126
let tcx = bx.tcx();
126127
let def_id = tcx.require_lang_item(li, span);
127-
let instance = ty::Instance::mono(tcx, def_id);
128+
let instance = if let Some(arg) = generic {
129+
ty::Instance::new(def_id, tcx.mk_args(&[arg]))
130+
} else {
131+
ty::Instance::mono(tcx, def_id)
132+
};
128133
(bx.fn_abi_of_instance(instance, ty::List::empty()), bx.get_fn_addr(instance), instance)
129134
}
130135

compiler/rustc_codegen_ssa/src/mir/block.rs

+23-7
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
687687
}
688688
};
689689

690-
let (fn_abi, llfn, instance) = common::build_langcall(bx, Some(span), lang_item);
690+
let (fn_abi, llfn, instance) = common::build_langcall(bx, Some(span), lang_item, None);
691691

692692
// Codegen the actual panic invoke/call.
693693
let merging_succ =
@@ -707,7 +707,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
707707
self.set_debug_loc(bx, terminator.source_info);
708708

709709
// Obtain the panic entry point.
710-
let (fn_abi, llfn, instance) = common::build_langcall(bx, Some(span), reason.lang_item());
710+
let (fn_abi, llfn, instance) =
711+
common::build_langcall(bx, Some(span), reason.lang_item(), None);
711712

712713
// Codegen the actual panic invoke/call.
713714
let merging_succ = helper.do_call(
@@ -769,8 +770,12 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
769770
let msg = bx.const_str(&msg_str);
770771

771772
// Obtain the panic entry point.
772-
let (fn_abi, llfn, instance) =
773-
common::build_langcall(bx, Some(source_info.span), LangItem::PanicNounwind);
773+
let (fn_abi, llfn, instance) = common::build_langcall(
774+
bx,
775+
Some(source_info.span),
776+
LangItem::PanicNounwind,
777+
None,
778+
);
774779

775780
// Codegen the actual panic invoke/call.
776781
helper.do_call(
@@ -1289,6 +1294,17 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12891294
) -> MergingSucc {
12901295
debug!("codegen_terminator: {:?}", terminator);
12911296

1297+
if bx.tcx().may_insert_niche_checks() {
1298+
if let mir::TerminatorKind::Return = terminator.kind {
1299+
let op = mir::Operand::Copy(mir::Place::return_place());
1300+
let ty = op.ty(self.mir, bx.tcx());
1301+
let ty = self.monomorphize(ty);
1302+
if let Some(niche) = bx.layout_of(ty).largest_niche {
1303+
self.codegen_niche_check(bx, op, niche, terminator.source_info);
1304+
}
1305+
}
1306+
}
1307+
12921308
let helper = TerminatorCodegenHelper { bb, terminator };
12931309

12941310
let mergeable_succ = || {
@@ -1557,7 +1573,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
15571573
tuple.layout.fields.count()
15581574
}
15591575

1560-
fn get_caller_location(
1576+
pub fn get_caller_location(
15611577
&mut self,
15621578
bx: &mut Bx,
15631579
source_info: mir::SourceInfo,
@@ -1698,12 +1714,12 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
16981714

16991715
self.set_debug_loc(&mut bx, mir::SourceInfo::outermost(self.mir.span));
17001716

1701-
let (fn_abi, fn_ptr, instance) = common::build_langcall(&bx, None, reason.lang_item());
1717+
let (fn_abi, fn_ptr, instance) =
1718+
common::build_langcall(&bx, None, reason.lang_item(), None);
17021719
if is_call_from_compiler_builtins_to_upstream_monomorphization(bx.tcx(), instance) {
17031720
bx.abort();
17041721
} else {
17051722
let fn_ty = bx.fn_decl_backend_type(fn_abi);
1706-
17071723
let llret = bx.call(fn_ty, None, Some(fn_abi), fn_ptr, &[], funclet.as_ref(), None);
17081724
bx.apply_attrs_to_cleanup_callsite(llret);
17091725
}

compiler/rustc_codegen_ssa/src/mir/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub mod coverageinfo;
1818
pub mod debuginfo;
1919
mod intrinsic;
2020
mod locals;
21+
mod niche_check;
2122
pub mod operand;
2223
pub mod place;
2324
mod rvalue;

0 commit comments

Comments
 (0)