Skip to content

Commit 3e61e7f

Browse files
committed
Use cg_ssa's version of codegen_naked_asm in cg_clif
1 parent 4700c4e commit 3e61e7f

File tree

5 files changed

+260
-283
lines changed

5 files changed

+260
-283
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

+28-9
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

@@ -520,19 +523,35 @@ fn codegen_cgu_content(
520523
let mut type_dbg = TypeDebugContext::default();
521524
super::predefine_mono_items(tcx, module, &mono_items);
522525
let mut codegened_functions = vec![];
523-
for (mono_item, _) in mono_items {
526+
for (mono_item, item_data) in mono_items {
524527
match mono_item {
525-
MonoItem::Fn(inst) => {
526-
if let Some(codegened_function) = crate::base::codegen_fn(
528+
MonoItem::Fn(instance) => {
529+
if tcx.codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED)
530+
{
531+
rustc_codegen_ssa::mir::naked_asm::codegen_naked_asm(
532+
&mut GlobalAsmContext { tcx, global_asm: &mut cx.global_asm },
533+
instance,
534+
MonoItemData {
535+
linkage: RLinkage::External,
536+
visibility: if item_data.linkage == RLinkage::Internal {
537+
Visibility::Hidden
538+
} else {
539+
item_data.visibility
540+
},
541+
..item_data
542+
},
543+
);
544+
continue;
545+
}
546+
let codegened_function = crate::base::codegen_fn(
527547
tcx,
528548
&mut cx,
529549
&mut type_dbg,
530550
Function::new(),
531551
module,
532-
inst,
533-
) {
534-
codegened_functions.push(codegened_function);
535-
}
552+
instance,
553+
);
554+
codegened_functions.push(codegened_function);
536555
}
537556
MonoItem::Static(def_id) => {
538557
let data_id = crate::constant::codegen_static(tcx, module, def_id);

compiler/rustc_codegen_cranelift/src/driver/jit.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@ pub(crate) fn codegen_and_compile_fn<'tcx>(
203203
module: &mut dyn Module,
204204
instance: Instance<'tcx>,
205205
) {
206+
if tcx.codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED) {
207+
tcx.dcx()
208+
.span_fatal(tcx.def_span(instance.def_id()), "Naked asm is not supported in JIT mode");
209+
}
210+
206211
cranelift_codegen::timing::set_thread_profiler(Box::new(super::MeasuremeProfiler(
207212
tcx.prof.clone(),
208213
)));
@@ -212,16 +217,15 @@ pub(crate) fn codegen_and_compile_fn<'tcx>(
212217
crate::PrintOnPanic(|| format!("{:?} {}", instance, tcx.symbol_name(instance).name));
213218

214219
let cached_func = std::mem::replace(&mut cached_context.func, Function::new());
215-
if let Some(codegened_func) = crate::base::codegen_fn(
220+
let codegened_func = crate::base::codegen_fn(
216221
tcx,
217222
cx,
218223
&mut TypeDebugContext::default(),
219224
cached_func,
220225
module,
221226
instance,
222-
) {
223-
crate::base::compile_fn(cx, &tcx.prof, cached_context, module, codegened_func);
224-
}
227+
);
228+
crate::base::compile_fn(cx, &tcx.prof, cached_context, module, codegened_func);
225229
});
226230
}
227231

0 commit comments

Comments
 (0)