Skip to content

Commit 441699d

Browse files
committed
Auto merge of #134232 - bjorn3:naked_asm_improvements, r=<try>
Share the naked asm impl between cg_ssa and cg_clif This was introduced in #128004. try-job: x86_64-apple-1
2 parents d2eadb7 + 3e174d4 commit 441699d

File tree

15 files changed

+333
-397
lines changed

15 files changed

+333
-397
lines changed

compiler/rustc_codegen_cranelift/src/base.rs

+2-37
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ use rustc_ast::InlineAsmOptions;
88
use rustc_codegen_ssa::base::is_call_from_compiler_builtins_to_upstream_monomorphization;
99
use rustc_data_structures::profiling::SelfProfilerRef;
1010
use rustc_index::IndexVec;
11-
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
12-
use rustc_middle::mir::InlineAsmMacro;
1311
use rustc_middle::ty::TypeVisitableExt;
1412
use rustc_middle::ty::adjustment::PointerCoercion;
1513
use rustc_middle::ty::layout::{FnAbiOf, HasTypingEnv};
@@ -18,7 +16,6 @@ use rustc_middle::ty::print::with_no_trimmed_paths;
1816
use crate::constant::ConstantCx;
1917
use crate::debuginfo::{FunctionDebugContext, TypeDebugContext};
2018
use crate::enable_verifier;
21-
use crate::inline_asm::codegen_naked_asm;
2219
use crate::prelude::*;
2320
use crate::pretty_clif::CommentWriter;
2421

@@ -37,7 +34,7 @@ pub(crate) fn codegen_fn<'tcx>(
3734
cached_func: Function,
3835
module: &mut dyn Module,
3936
instance: Instance<'tcx>,
40-
) -> Option<CodegenedFunction> {
37+
) -> CodegenedFunction {
4138
debug_assert!(!instance.args.has_infer());
4239

4340
let symbol_name = tcx.symbol_name(instance).name.to_string();
@@ -54,38 +51,6 @@ pub(crate) fn codegen_fn<'tcx>(
5451
String::from_utf8_lossy(&buf).into_owned()
5552
});
5653

57-
if tcx.codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED) {
58-
assert_eq!(mir.basic_blocks.len(), 1);
59-
assert!(mir.basic_blocks[START_BLOCK].statements.is_empty());
60-
61-
match &mir.basic_blocks[START_BLOCK].terminator().kind {
62-
TerminatorKind::InlineAsm {
63-
asm_macro: InlineAsmMacro::NakedAsm,
64-
template,
65-
operands,
66-
options,
67-
line_spans: _,
68-
targets: _,
69-
unwind: _,
70-
} => {
71-
codegen_naked_asm(
72-
tcx,
73-
cx,
74-
module,
75-
instance,
76-
mir.basic_blocks[START_BLOCK].terminator().source_info.span,
77-
&symbol_name,
78-
template,
79-
operands,
80-
*options,
81-
);
82-
}
83-
_ => unreachable!(),
84-
}
85-
86-
return None;
87-
}
88-
8954
// Declare function
9055
let sig = get_function_sig(tcx, module.target_config().default_call_conv, instance);
9156
let func_id = module.declare_function(&symbol_name, Linkage::Local, &sig).unwrap();
@@ -166,7 +131,7 @@ pub(crate) fn codegen_fn<'tcx>(
166131
// Verify function
167132
verify_func(tcx, &clif_comments, &func);
168133

169-
Some(CodegenedFunction { symbol_name, func_id, func, clif_comments, func_debug_cx })
134+
CodegenedFunction { symbol_name, func_id, func, clif_comments, func_debug_cx }
170135
}
171136

172137
pub(crate) fn compile_fn(

compiler/rustc_codegen_cranelift/src/driver/aot.rs

+32-10
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@ 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::mir::mono::{CodegenUnit, MonoItem};
25+
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
26+
use rustc_middle::mir::mono::{
27+
CodegenUnit, Linkage as RLinkage, MonoItem, MonoItemData, Visibility,
28+
};
2629
use rustc_session::Session;
2730
use rustc_session::config::{DebugInfo, OutFileName, OutputFilenames, OutputType};
2831

2932
use crate::CodegenCx;
3033
use crate::base::CodegenedFunction;
3134
use crate::concurrency_limiter::{ConcurrencyLimiter, ConcurrencyLimiterToken};
3235
use crate::debuginfo::TypeDebugContext;
33-
use crate::global_asm::GlobalAsmConfig;
36+
use crate::global_asm::{GlobalAsmConfig, GlobalAsmContext};
3437
use crate::prelude::*;
3538
use crate::unwind_module::UnwindModule;
3639

@@ -530,19 +533,35 @@ fn codegen_cgu_content(
530533
let mut type_dbg = TypeDebugContext::default();
531534
super::predefine_mono_items(tcx, module, &mono_items);
532535
let mut codegened_functions = vec![];
533-
for (mono_item, _) in mono_items {
536+
for (mono_item, item_data) in mono_items {
534537
match mono_item {
535-
MonoItem::Fn(inst) => {
536-
if let Some(codegened_function) = crate::base::codegen_fn(
538+
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+
}
556+
let codegened_function = crate::base::codegen_fn(
537557
tcx,
538558
&mut cx,
539559
&mut type_dbg,
540560
Function::new(),
541561
module,
542-
inst,
543-
) {
544-
codegened_functions.push(codegened_function);
545-
}
562+
instance,
563+
);
564+
codegened_functions.push(codegened_function);
546565
}
547566
MonoItem::Static(def_id) => {
548567
let data_id = crate::constant::codegen_static(tcx, module, def_id);
@@ -551,7 +570,10 @@ fn codegen_cgu_content(
551570
}
552571
}
553572
MonoItem::GlobalAsm(item_id) => {
554-
crate::global_asm::codegen_global_asm_item(tcx, &mut cx.global_asm, item_id);
573+
rustc_codegen_ssa::base::codegen_global_asm(
574+
&mut GlobalAsmContext { tcx, global_asm: &mut cx.global_asm },
575+
item_id,
576+
);
555577
}
556578
}
557579
}

compiler/rustc_codegen_cranelift/src/driver/jit.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ pub(crate) fn codegen_and_compile_fn<'tcx>(
126126
module: &mut dyn Module,
127127
instance: Instance<'tcx>,
128128
) {
129+
if tcx.codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED) {
130+
tcx.dcx()
131+
.span_fatal(tcx.def_span(instance.def_id()), "Naked asm is not supported in JIT mode");
132+
}
133+
129134
cranelift_codegen::timing::set_thread_profiler(Box::new(super::MeasuremeProfiler(
130135
tcx.prof.clone(),
131136
)));
@@ -135,16 +140,15 @@ pub(crate) fn codegen_and_compile_fn<'tcx>(
135140
crate::PrintOnPanic(|| format!("{:?} {}", instance, tcx.symbol_name(instance).name));
136141

137142
let cached_func = std::mem::replace(&mut cached_context.func, Function::new());
138-
if let Some(codegened_func) = crate::base::codegen_fn(
143+
let codegened_func = crate::base::codegen_fn(
139144
tcx,
140145
cx,
141146
&mut TypeDebugContext::default(),
142147
cached_func,
143148
module,
144149
instance,
145-
) {
146-
crate::base::compile_fn(cx, &tcx.prof, cached_context, module, codegened_func);
147-
}
150+
);
151+
crate::base::compile_fn(cx, &tcx.prof, cached_context, module, codegened_func);
148152
});
149153
}
150154

0 commit comments

Comments
 (0)