Skip to content

Commit 90741d3

Browse files
committed
Auto merge of rust-lang#121114 - Nilstrieb:no-inline!, r=<try>
Add `#[rustc_no_mir_inline]` for standard library UB checks should help with rust-lang#121110 and also with rust-lang#120848 I am not entirely sure whether this is the correct solution and I haven't validated it, I just quickly threw it together before going to sleep. r? `@saethlin`
2 parents ee9c7c9 + 749d7e2 commit 90741d3

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

@@ -413,6 +414,10 @@ impl<'tcx> Inliner<'tcx> {
413414
callee_attrs: &CodegenFnAttrs,
414415
cross_crate_inlinable: bool,
415416
) -> Result<(), &'static str> {
417+
if self.tcx.has_attr(callsite.callee.def_id(), sym::rustc_no_mir_inline) {
418+
return Err("#[rustc_no_mir_inline]");
419+
}
420+
416421
if let InlineAttr::Never = callee_attrs.inline {
417422
return Err("never inline hint");
418423
}

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, inline)]
26442644
#[rustc_nounwind]
26452645
fn precondition_check($($name:$ty),*) {
26462646
if !$e {

0 commit comments

Comments
 (0)