From e2789cb7154f9884c6ccd392d6b66ff6ef777c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= <john.kare.alsaker@gmail.com> Date: Thu, 27 Jul 2023 23:25:54 +0200 Subject: [PATCH] Keep inline(always) in multiple CGUs --- compiler/rustc_middle/src/mir/mono.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_middle/src/mir/mono.rs b/compiler/rustc_middle/src/mir/mono.rs index 43e02f5a70c94..f484844ad4210 100644 --- a/compiler/rustc_middle/src/mir/mono.rs +++ b/compiler/rustc_middle/src/mir/mono.rs @@ -1,5 +1,6 @@ use crate::dep_graph::{DepNode, WorkProduct, WorkProductId}; use crate::ty::{GenericArgs, Instance, InstanceDef, SymbolName, TyCtxt}; +use rustc_attr::InlineAttr; use rustc_data_structures::base_n; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::FxHashMap; @@ -117,7 +118,15 @@ impl<'tcx> MonoItem<'tcx> { return InstantiationMode::LocalCopy; } - return InstantiationMode::GloballyShared { may_conflict: true }; + // Finally, if this is `#[inline(always)]` we're sure to respect + // that with an inline copy per CGU, but otherwise we'll be + // creating one copy of this `#[inline]` function which may + // conflict with upstream crates as it could be an exported + // symbol. + match tcx.codegen_fn_attrs(instance.def_id()).inline { + InlineAttr::Always => InstantiationMode::LocalCopy, + _ => InstantiationMode::GloballyShared { may_conflict: true }, + } } MonoItem::Static(..) | MonoItem::GlobalAsm(..) => { InstantiationMode::GloballyShared { may_conflict: false }