Skip to content

Commit 398f192

Browse files
committed
Use a separate MonoItem variant for naked functions
1 parent a7ab8b9 commit 398f192

File tree

8 files changed

+65
-60
lines changed

8 files changed

+65
-60
lines changed

compiler/rustc_codegen_cranelift/src/driver/aot.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use rustc_data_structures::sync::{IntoDynSyncSend, par_map};
2222
use rustc_metadata::EncodedMetadata;
2323
use rustc_metadata::fs::copy_to_stdout;
2424
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
25-
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
2625
use rustc_middle::mir::mono::{
2726
CodegenUnit, Linkage as RLinkage, MonoItem, MonoItemData, Visibility,
2827
};
@@ -536,23 +535,6 @@ fn codegen_cgu_content(
536535
for (mono_item, item_data) in mono_items {
537536
match mono_item {
538537
MonoItem::Fn(instance) => {
539-
if tcx.codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED)
540-
{
541-
rustc_codegen_ssa::mir::naked_asm::codegen_naked_asm(
542-
&mut GlobalAsmContext { tcx, global_asm: &mut cx.global_asm },
543-
instance,
544-
MonoItemData {
545-
linkage: RLinkage::External,
546-
visibility: if item_data.linkage == RLinkage::Internal {
547-
Visibility::Hidden
548-
} else {
549-
item_data.visibility
550-
},
551-
..item_data
552-
},
553-
);
554-
continue;
555-
}
556538
let codegened_function = crate::base::codegen_fn(
557539
tcx,
558540
&mut cx,
@@ -563,6 +545,21 @@ fn codegen_cgu_content(
563545
);
564546
codegened_functions.push(codegened_function);
565547
}
548+
MonoItem::NakedFn(instance) => {
549+
rustc_codegen_ssa::mir::naked_asm::codegen_naked_asm(
550+
&mut GlobalAsmContext { tcx, global_asm: &mut cx.global_asm },
551+
instance,
552+
MonoItemData {
553+
linkage: RLinkage::External,
554+
visibility: if item_data.linkage == RLinkage::Internal {
555+
Visibility::Hidden
556+
} else {
557+
item_data.visibility
558+
},
559+
..item_data
560+
},
561+
);
562+
}
566563
MonoItem::Static(def_id) => {
567564
let data_id = crate::constant::codegen_static(tcx, module, def_id);
568565
if let Some(debug_context) = &mut cx.debug_context {

compiler/rustc_codegen_cranelift/src/driver/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
//! [`codegen_static`]: crate::constant::codegen_static
66
77
use rustc_data_structures::profiling::SelfProfilerRef;
8-
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
98
use rustc_middle::mir::mono::{MonoItem, MonoItemData};
109

1110
use crate::prelude::*;
@@ -34,17 +33,20 @@ fn predefine_mono_items<'tcx>(
3433
data.visibility,
3534
is_compiler_builtins,
3635
);
37-
let is_naked = tcx
38-
.codegen_fn_attrs(instance.def_id())
39-
.flags
40-
.contains(CodegenFnAttrFlags::NAKED);
36+
module.declare_function(name, linkage, &sig).unwrap();
37+
}
38+
MonoItem::NakedFn(instance) => {
39+
let name = tcx.symbol_name(instance).name;
40+
let _inst_guard = crate::PrintOnPanic(|| format!("{:?} {}", instance, name));
41+
let sig =
42+
get_function_sig(tcx, module.target_config().default_call_conv, instance);
4143
module
4244
.declare_function(
4345
name,
4446
// Naked functions are defined in a separate object
4547
// file from the codegen unit rustc expects them to
4648
// be defined in.
47-
if is_naked { Linkage::Import } else { linkage },
49+
Linkage::Import,
4850
&sig,
4951
)
5052
.unwrap();

compiler/rustc_codegen_llvm/src/coverageinfo/mapgen/unused.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ fn prepare_usage_sets<'tcx>(tcx: TyCtxt<'tcx>) -> UsageSets<'tcx> {
109109
.iter()
110110
.flat_map(|cgu| cgu.items().keys())
111111
.filter_map(|item| match item {
112-
mir::mono::MonoItem::Fn(instance) => Some(instance),
112+
mir::mono::MonoItem::Fn(instance) | mir::mono::MonoItem::NakedFn(instance) => {
113+
Some(instance)
114+
}
113115
mir::mono::MonoItem::Static(_) | mir::mono::MonoItem::GlobalAsm(_) => None,
114116
})
115117
// We only need one arbitrary instance per definition.

compiler/rustc_codegen_ssa/src/mono_item.rs

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
21
use rustc_middle::mir::mono::{Linkage, MonoItem, MonoItemData, Visibility};
32
use rustc_middle::ty::layout::HasTyCtxt;
43
use tracing::debug;
@@ -41,16 +40,10 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
4140
base::codegen_global_asm(cx, item_id);
4241
}
4342
MonoItem::Fn(instance) => {
44-
if cx
45-
.tcx()
46-
.codegen_fn_attrs(instance.def_id())
47-
.flags
48-
.contains(CodegenFnAttrFlags::NAKED)
49-
{
50-
naked_asm::codegen_naked_asm::<Bx::CodegenCx>(cx, instance, item_data);
51-
} else {
52-
base::codegen_instance::<Bx>(cx, instance);
53-
}
43+
base::codegen_instance::<Bx>(cx, instance);
44+
}
45+
MonoItem::NakedFn(instance) => {
46+
naked_asm::codegen_naked_asm::<Bx::CodegenCx>(cx, instance, item_data);
5447
}
5548
}
5649

@@ -75,15 +68,9 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
7568
cx.predefine_static(def_id, linkage, visibility, symbol_name);
7669
}
7770
MonoItem::Fn(instance) => {
78-
let attrs = cx.tcx().codegen_fn_attrs(instance.def_id());
79-
80-
if attrs.flags.contains(CodegenFnAttrFlags::NAKED) {
81-
// do not define this function; it will become a global assembly block
82-
} else {
83-
cx.predefine_fn(instance, linkage, visibility, symbol_name);
84-
};
71+
cx.predefine_fn(instance, linkage, visibility, symbol_name);
8572
}
86-
MonoItem::GlobalAsm(..) => {}
73+
MonoItem::NakedFn(..) | MonoItem::GlobalAsm(..) => {}
8774
}
8875

8976
debug!("END PREDEFINING '{} ({})' in cgu {}", self, self.to_raw_string(), cgu_name);
@@ -94,6 +81,9 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
9481
MonoItem::Fn(instance) => {
9582
format!("Fn({:?}, {})", instance.def, instance.args.as_ptr().addr())
9683
}
84+
MonoItem::NakedFn(instance) => {
85+
format!("NakedFn({:?}, {})", instance.def, instance.args.as_ptr().addr())
86+
}
9787
MonoItem::Static(id) => format!("Static({id:?})"),
9888
MonoItem::GlobalAsm(id) => format!("GlobalAsm({id:?})"),
9989
}

compiler/rustc_middle/src/mir/mono.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ pub enum InstantiationMode {
5151
#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash, HashStable, TyEncodable, TyDecodable)]
5252
pub enum MonoItem<'tcx> {
5353
Fn(Instance<'tcx>),
54+
NakedFn(Instance<'tcx>),
5455
Static(DefId),
5556
GlobalAsm(ItemId),
5657
}
@@ -92,16 +93,18 @@ impl<'tcx> MonoItem<'tcx> {
9293
/// Returns `true` if the mono item is user-defined (i.e. not compiler-generated, like shims).
9394
pub fn is_user_defined(&self) -> bool {
9495
match *self {
95-
MonoItem::Fn(instance) => matches!(instance.def, InstanceKind::Item(..)),
96-
MonoItem::Static(..) | MonoItem::GlobalAsm(..) => true,
96+
MonoItem::Fn(instance) => {
97+
matches!(instance.def, InstanceKind::Item(..))
98+
}
99+
MonoItem::NakedFn(..) | MonoItem::Static(..) | MonoItem::GlobalAsm(..) => true,
97100
}
98101
}
99102

100103
// Note: if you change how item size estimates work, you might need to
101104
// change NON_INCR_MIN_CGU_SIZE as well.
102105
pub fn size_estimate(&self, tcx: TyCtxt<'tcx>) -> usize {
103106
match *self {
104-
MonoItem::Fn(instance) => tcx.size_estimate(instance),
107+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => tcx.size_estimate(instance),
105108
// Conservatively estimate the size of a static declaration or
106109
// assembly item to be 1.
107110
MonoItem::Static(_) | MonoItem::GlobalAsm(_) => 1,
@@ -110,14 +113,16 @@ impl<'tcx> MonoItem<'tcx> {
110113

111114
pub fn is_generic_fn(&self) -> bool {
112115
match self {
113-
MonoItem::Fn(instance) => instance.args.non_erasable_generics().next().is_some(),
116+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => {
117+
instance.args.non_erasable_generics().next().is_some()
118+
}
114119
MonoItem::Static(..) | MonoItem::GlobalAsm(..) => false,
115120
}
116121
}
117122

118123
pub fn symbol_name(&self, tcx: TyCtxt<'tcx>) -> SymbolName<'tcx> {
119124
match *self {
120-
MonoItem::Fn(instance) => tcx.symbol_name(instance),
125+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => tcx.symbol_name(instance),
121126
MonoItem::Static(def_id) => tcx.symbol_name(Instance::mono(tcx, def_id)),
122127
MonoItem::GlobalAsm(item_id) => {
123128
SymbolName::new(tcx, &format!("global_asm_{:?}", item_id.owner_id))
@@ -135,7 +140,7 @@ impl<'tcx> MonoItem<'tcx> {
135140

136141
// Statics and global_asm! must be instantiated exactly once.
137142
let instance = match *self {
138-
MonoItem::Fn(instance) => instance,
143+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => instance,
139144
MonoItem::Static(..) | MonoItem::GlobalAsm(..) => {
140145
return InstantiationMode::GloballyShared { may_conflict: false };
141146
}
@@ -234,7 +239,7 @@ impl<'tcx> MonoItem<'tcx> {
234239

235240
pub fn explicit_linkage(&self, tcx: TyCtxt<'tcx>) -> Option<Linkage> {
236241
let def_id = match *self {
237-
MonoItem::Fn(ref instance) => instance.def_id(),
242+
MonoItem::Fn(ref instance) | MonoItem::NakedFn(ref instance) => instance.def_id(),
238243
MonoItem::Static(def_id) => def_id,
239244
MonoItem::GlobalAsm(..) => return None,
240245
};
@@ -271,7 +276,9 @@ impl<'tcx> MonoItem<'tcx> {
271276
pub fn is_instantiable(&self, tcx: TyCtxt<'tcx>) -> bool {
272277
debug!("is_instantiable({:?})", self);
273278
let (def_id, args) = match *self {
274-
MonoItem::Fn(ref instance) => (instance.def_id(), instance.args),
279+
MonoItem::Fn(ref instance) | MonoItem::NakedFn(ref instance) => {
280+
(instance.def_id(), instance.args)
281+
}
275282
MonoItem::Static(def_id) => (def_id, GenericArgs::empty()),
276283
// global asm never has predicates
277284
MonoItem::GlobalAsm(..) => return true,
@@ -282,7 +289,9 @@ impl<'tcx> MonoItem<'tcx> {
282289

283290
pub fn local_span(&self, tcx: TyCtxt<'tcx>) -> Option<Span> {
284291
match *self {
285-
MonoItem::Fn(Instance { def, .. }) => def.def_id().as_local(),
292+
MonoItem::Fn(Instance { def, .. }) | MonoItem::NakedFn(Instance { def, .. }) => {
293+
def.def_id().as_local()
294+
}
286295
MonoItem::Static(def_id) => def_id.as_local(),
287296
MonoItem::GlobalAsm(item_id) => Some(item_id.owner_id.def_id),
288297
}
@@ -297,7 +306,7 @@ impl<'tcx> MonoItem<'tcx> {
297306
/// Returns the item's `CrateNum`
298307
pub fn krate(&self) -> CrateNum {
299308
match self {
300-
MonoItem::Fn(instance) => instance.def_id().krate,
309+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => instance.def_id().krate,
301310
MonoItem::Static(def_id) => def_id.krate,
302311
MonoItem::GlobalAsm(..) => LOCAL_CRATE,
303312
}
@@ -306,7 +315,9 @@ impl<'tcx> MonoItem<'tcx> {
306315
/// Returns the item's `DefId`
307316
pub fn def_id(&self) -> DefId {
308317
match *self {
309-
MonoItem::Fn(Instance { def, .. }) => def.def_id(),
318+
MonoItem::Fn(Instance { def, .. }) | MonoItem::NakedFn(Instance { def, .. }) => {
319+
def.def_id()
320+
}
310321
MonoItem::Static(def_id) => def_id,
311322
MonoItem::GlobalAsm(item_id) => item_id.owner_id.to_def_id(),
312323
}
@@ -317,6 +328,7 @@ impl<'tcx> fmt::Display for MonoItem<'tcx> {
317328
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
318329
match *self {
319330
MonoItem::Fn(instance) => write!(f, "fn {instance}"),
331+
MonoItem::NakedFn(instance) => write!(f, "naked_fn {instance}"),
320332
MonoItem::Static(def_id) => {
321333
write!(f, "static {}", Instance::new_raw(def_id, GenericArgs::empty()))
322334
}
@@ -512,7 +524,7 @@ impl<'tcx> CodegenUnit<'tcx> {
512524
fn item_sort_key<'tcx>(tcx: TyCtxt<'tcx>, item: MonoItem<'tcx>) -> ItemSortKey<'tcx> {
513525
ItemSortKey(
514526
match item {
515-
MonoItem::Fn(ref instance) => {
527+
MonoItem::Fn(ref instance) | MonoItem::NakedFn(ref instance) => {
516528
match instance.def {
517529
// We only want to take HirIds of user-defined
518530
// instances into account. The others don't matter for

compiler/rustc_monomorphize/src/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ fn collect_items_rec<'tcx>(
456456
// optimized, and if they did then the const-eval interpreter would have to worry about
457457
// mentioned_items.
458458
}
459-
MonoItem::Fn(instance) => {
459+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => {
460460
// Sanity check whether this ended up being collected accidentally
461461
debug_assert!(tcx.should_codegen_locally(instance));
462462

compiler/rustc_monomorphize/src/partitioning.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ fn characteristic_def_id_of_mono_item<'tcx>(
631631
mono_item: MonoItem<'tcx>,
632632
) -> Option<DefId> {
633633
match mono_item {
634-
MonoItem::Fn(instance) => {
634+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => {
635635
let def_id = match instance.def {
636636
ty::InstanceKind::Item(def) => def,
637637
ty::InstanceKind::VTableShim(..)
@@ -787,7 +787,7 @@ fn mono_item_visibility<'tcx>(
787787
) -> Visibility {
788788
let instance = match mono_item {
789789
// This is pretty complicated; see below.
790-
MonoItem::Fn(instance) => instance,
790+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => instance,
791791

792792
// Misc handling for generics and such, but otherwise:
793793
MonoItem::Static(def_id) => return static_visibility(tcx, can_be_internalized, *def_id),

compiler/rustc_smir/src/rustc_smir/convert/mir.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,9 @@ impl<'tcx> Stable<'tcx> for MonoItem<'tcx> {
806806
fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
807807
use stable_mir::mir::mono::MonoItem as StableMonoItem;
808808
match self {
809-
MonoItem::Fn(instance) => StableMonoItem::Fn(instance.stable(tables)),
809+
MonoItem::Fn(instance) | MonoItem::NakedFn(instance) => {
810+
StableMonoItem::Fn(instance.stable(tables))
811+
}
810812
MonoItem::Static(def_id) => StableMonoItem::Static(tables.static_def(*def_id)),
811813
MonoItem::GlobalAsm(item_id) => StableMonoItem::GlobalAsm(opaque(item_id)),
812814
}

0 commit comments

Comments
 (0)