Skip to content

Commit 4aef101

Browse files
committed
Add #[rustc_no_mir_inline] for standard library UB checks
1 parent bc1b9e0 commit 4aef101

File tree

4 files changed

+11
-1
lines changed

4 files changed

+11
-1
lines changed

compiler/rustc_feature/src/builtin_attrs.rs

+4
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
788788
rustc_safe_intrinsic, Normal, template!(Word), WarnFollowing,
789789
"the `#[rustc_safe_intrinsic]` attribute is used internally to mark intrinsics as safe"
790790
),
791+
rustc_attr!(
792+
rustc_no_mir_inline, Normal, template!(Word), WarnFollowing,
793+
"#[rustc_no_mir_inline] prevents the MIR inliner from inlining a function while not affecting codegen"
794+
),
791795

792796
// ==========================================================================
793797
// Internal attributes, Testing:

compiler/rustc_mir_transform/src/inline.rs

+5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use rustc_middle::ty::TypeVisitableExt;
1313
use rustc_middle::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt};
1414
use rustc_session::config::OptLevel;
1515
use rustc_span::source_map::Spanned;
16+
use rustc_span::sym;
1617
use rustc_target::abi::FieldIdx;
1718
use rustc_target::spec::abi::Abi;
1819

@@ -279,6 +280,10 @@ impl<'tcx> Inliner<'tcx> {
279280
}
280281
}
281282

283+
if self.tcx.has_attr(callsite.callee.def_id(), sym::rustc_no_mir_inline) {
284+
return Err("found #[rustc_no_mir_inline] on callee");
285+
}
286+
282287
let old_blocks = caller_body.basic_blocks.next_index();
283288
self.inline_call(caller_body, callsite, callee_body);
284289
let new_blocks = old_blocks..caller_body.basic_blocks.next_index();

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1435,6 +1435,7 @@ symbols! {
14351435
rustc_mir,
14361436
rustc_must_implement_one_of,
14371437
rustc_never_returns_null_ptr,
1438+
rustc_no_mir_inline,
14381439
rustc_nonnull_optimization_guaranteed,
14391440
rustc_nounwind,
14401441
rustc_object_lifetime_default,

library/core/src/intrinsics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2640,7 +2640,7 @@ pub(crate) const fn debug_assertions() -> bool {
26402640
macro_rules! assert_unsafe_precondition {
26412641
($message:expr, ($($name:ident:$ty:ty = $arg:expr),*$(,)?) => $e:expr $(,)?) => {
26422642
{
2643-
#[inline(never)]
2643+
#[cfg_attr(not(bootstrap), rustc_no_mir_inline)]
26442644
#[rustc_nounwind]
26452645
fn precondition_check($($name:$ty),*) {
26462646
if !$e {

0 commit comments

Comments
 (0)