Skip to content

Commit e864f0f

Browse files
committed
Sync from rust b45dd71
2 parents 66d2f6b + 23f12ff commit e864f0f

5 files changed

Lines changed: 200 additions & 289 deletions

File tree

‎src/base.rs‎

Lines changed: 2 additions & 37 deletions
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
usecrate::constant::ConstantCx;
1917
usecrate::debuginfo::{FunctionDebugContext,TypeDebugContext};
2018
usecrate::enable_verifier;
21-
usecrate::inline_asm::codegen_naked_asm;
2219
usecrate::prelude::*;
2320
usecrate::pretty_clif::CommentWriter;
2421

@@ -37,7 +34,7 @@ pub(crate) fn codegen_fn<'tcx>(
3734
cached_func:Function,
3835
module:&mutdynModule,
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-
returnNone;
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)fncompile_fn(

‎src/driver/aot.rs‎

Lines changed: 32 additions & 10 deletions
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,LinkageasRLinkage,MonoItem,MonoItemData,Visibility,
28+
};
2629
use rustc_session::Session;
2730
use rustc_session::config::{DebugInfo,OutFileName,OutputFilenames,OutputType};
2831

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

@@ -530,19 +533,35 @@ fn codegen_cgu_content(
530533
letmut type_dbg = TypeDebugContext::default();
531534
super::predefine_mono_items(tcx, module,&mono_items);
532535
letmut 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-
ifletSome(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+
&mutGlobalAsmContext{ 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+
&mutGlobalAsmContext{ tcx,global_asm:&mut cx.global_asm},
575+
item_id,
576+
);
555577
}
556578
}
557579
}

‎src/driver/jit.rs‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ fn codegen_and_compile_fn<'tcx>(
126126
module:&mutdynModule,
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 @@ 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-
ifletSome(codegened_func) = crate::base::codegen_fn(
143+
let codegened_func = crate::base::codegen_fn(
139144
tcx,
140145
cx,
141146
&mutTypeDebugContext::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)