Skip to content

Commit 2c12cd5

Browse files
committed
Check for occupied niches
1 parent 0157da4 commit 2c12cd5

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
@@ -689,7 +689,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
689689
}
690690
};
691691

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

694694
// Codegen the actual panic invoke/call.
695695
let merging_succ =
@@ -709,7 +709,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
709709
self.set_debug_loc(bx, terminator.source_info);
710710

711711
// Obtain the panic entry point.
712-
let (fn_abi, llfn, instance) = common::build_langcall(bx, Some(span), reason.lang_item());
712+
let (fn_abi, llfn, instance) =
713+
common::build_langcall(bx, Some(span), reason.lang_item(), None);
713714

714715
// Codegen the actual panic invoke/call.
715716
let merging_succ = helper.do_call(
@@ -771,8 +772,12 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
771772
let msg = bx.const_str(&msg_str);
772773

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

777782
// Codegen the actual panic invoke/call.
778783
helper.do_call(
@@ -1291,6 +1296,17 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12911296
) -> MergingSucc {
12921297
debug!("codegen_terminator: {:?}", terminator);
12931298

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

12961312
let mergeable_succ = || {
@@ -1559,7 +1575,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
15591575
tuple.layout.fields.count()
15601576
}
15611577

1562-
fn get_caller_location(
1578+
pub fn get_caller_location(
15631579
&mut self,
15641580
bx: &mut Bx,
15651581
source_info: mir::SourceInfo,
@@ -1700,12 +1716,12 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
17001716

17011717
self.set_debug_loc(&mut bx, mir::SourceInfo::outermost(self.mir.span));
17021718

1703-
let (fn_abi, fn_ptr, instance) = common::build_langcall(&bx, None, reason.lang_item());
1719+
let (fn_abi, fn_ptr, instance) =
1720+
common::build_langcall(&bx, None, reason.lang_item(), None);
17041721
if is_call_from_compiler_builtins_to_upstream_monomorphization(bx.tcx(), instance) {
17051722
bx.abort();
17061723
} else {
17071724
let fn_ty = bx.fn_decl_backend_type(fn_abi);
1708-
17091725
let llret = bx.call(fn_ty, None, Some(fn_abi), fn_ptr, &[], funclet.as_ref(), None);
17101726
bx.apply_attrs_to_cleanup_callsite(llret);
17111727
}

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)