parent
e1a77a5ce6
commit
ba7cdf21be
@ -13,7 +13,11 @@ use crate::prelude::*;
|
|||||||
use rustc_ast::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};
|
use rustc_ast::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};
|
||||||
|
|
||||||
/// Returns whether an allocator shim was created
|
/// Returns whether an allocator shim was created
|
||||||
pub(crate) fn codegen(tcx: TyCtxt<'_>, module: &mut Module<impl Backend + 'static>) -> bool {
|
pub(crate) fn codegen(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
module: &mut Module<impl Backend + 'static>,
|
||||||
|
unwind_context: &mut UnwindContext<'_>,
|
||||||
|
) -> bool {
|
||||||
let any_dynamic_crate = tcx.dependency_formats(LOCAL_CRATE).iter().any(|(_, list)| {
|
let any_dynamic_crate = tcx.dependency_formats(LOCAL_CRATE).iter().any(|(_, list)| {
|
||||||
use rustc_middle::middle::dependency_format::Linkage;
|
use rustc_middle::middle::dependency_format::Linkage;
|
||||||
list.iter().any(|&linkage| linkage == Linkage::Dynamic)
|
list.iter().any(|&linkage| linkage == Linkage::Dynamic)
|
||||||
@ -21,14 +25,18 @@ pub(crate) fn codegen(tcx: TyCtxt<'_>, module: &mut Module<impl Backend + 'stati
|
|||||||
if any_dynamic_crate {
|
if any_dynamic_crate {
|
||||||
false
|
false
|
||||||
} else if let Some(kind) = tcx.allocator_kind() {
|
} else if let Some(kind) = tcx.allocator_kind() {
|
||||||
codegen_inner(module, kind);
|
codegen_inner(module, unwind_context, kind);
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_inner(module: &mut Module<impl Backend + 'static>, kind: AllocatorKind) {
|
fn codegen_inner(
|
||||||
|
module: &mut Module<impl Backend + 'static>,
|
||||||
|
unwind_context: &mut UnwindContext<'_>,
|
||||||
|
kind: AllocatorKind,
|
||||||
|
) {
|
||||||
let usize_ty = module.target_config().pointer_type();
|
let usize_ty = module.target_config().pointer_type();
|
||||||
|
|
||||||
for method in ALLOCATOR_METHODS {
|
for method in ALLOCATOR_METHODS {
|
||||||
@ -99,5 +107,6 @@ fn codegen_inner(module: &mut Module<impl Backend + 'static>, kind: AllocatorKin
|
|||||||
&mut ctx,
|
&mut ctx,
|
||||||
&mut cranelift_codegen::binemit::NullTrapSink {},
|
&mut cranelift_codegen::binemit::NullTrapSink {},
|
||||||
).unwrap();
|
).unwrap();
|
||||||
|
unwind_context.add_function(func_id, &ctx, module.isa());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ fn module_codegen(tcx: TyCtxt<'_>, cgu_name: rustc_span::Symbol) -> ModuleCodege
|
|||||||
let mut unwind_context = UnwindContext::new(tcx, &mut module);
|
let mut unwind_context = UnwindContext::new(tcx, &mut module);
|
||||||
|
|
||||||
super::codegen_mono_items(tcx, &mut module, debug.as_mut(), &mut unwind_context, mono_items);
|
super::codegen_mono_items(tcx, &mut module, debug.as_mut(), &mut unwind_context, mono_items);
|
||||||
crate::main_shim::maybe_create_entry_wrapper(tcx, &mut module);
|
crate::main_shim::maybe_create_entry_wrapper(tcx, &mut module, &mut unwind_context);
|
||||||
|
|
||||||
emit_module(
|
emit_module(
|
||||||
tcx,
|
tcx,
|
||||||
@ -185,19 +185,21 @@ pub(super) fn run_aot(
|
|||||||
tcx.sess.abort_if_errors();
|
tcx.sess.abort_if_errors();
|
||||||
|
|
||||||
let mut allocator_module = new_module(tcx, "allocator_shim".to_string());
|
let mut allocator_module = new_module(tcx, "allocator_shim".to_string());
|
||||||
let created_alloc_shim = crate::allocator::codegen(tcx, &mut allocator_module);
|
let mut allocator_unwind_context = UnwindContext::new(tcx, &mut allocator_module);
|
||||||
|
let created_alloc_shim = crate::allocator::codegen(
|
||||||
|
tcx,
|
||||||
|
&mut allocator_module,
|
||||||
|
&mut allocator_unwind_context,
|
||||||
|
);
|
||||||
|
|
||||||
let allocator_module = if created_alloc_shim {
|
let allocator_module = if created_alloc_shim {
|
||||||
// FIXME create .eh_frame for allocator shim
|
|
||||||
let unwind_context = UnwindContext::new(tcx, &mut allocator_module);
|
|
||||||
|
|
||||||
let ModuleCodegenResult(module, work_product) = emit_module(
|
let ModuleCodegenResult(module, work_product) = emit_module(
|
||||||
tcx,
|
tcx,
|
||||||
"allocator_shim".to_string(),
|
"allocator_shim".to_string(),
|
||||||
ModuleKind::Allocator,
|
ModuleKind::Allocator,
|
||||||
allocator_module,
|
allocator_module,
|
||||||
None,
|
None,
|
||||||
unwind_context,
|
allocator_unwind_context,
|
||||||
);
|
);
|
||||||
if let Some((id, product)) = work_product {
|
if let Some((id, product)) = work_product {
|
||||||
work_products.insert(id, product);
|
work_products.insert(id, product);
|
||||||
|
@ -57,8 +57,8 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>) -> ! {
|
|||||||
super::time(tcx, "codegen mono items", || {
|
super::time(tcx, "codegen mono items", || {
|
||||||
super::codegen_mono_items(tcx, &mut jit_module, None, &mut unwind_context, mono_items);
|
super::codegen_mono_items(tcx, &mut jit_module, None, &mut unwind_context, mono_items);
|
||||||
});
|
});
|
||||||
crate::main_shim::maybe_create_entry_wrapper(tcx, &mut jit_module);
|
crate::main_shim::maybe_create_entry_wrapper(tcx, &mut jit_module, &mut unwind_context);
|
||||||
crate::allocator::codegen(tcx, &mut jit_module);
|
crate::allocator::codegen(tcx, &mut jit_module, &mut unwind_context);
|
||||||
|
|
||||||
jit_module.finalize_definitions();
|
jit_module.finalize_definitions();
|
||||||
|
|
||||||
|
@ -2,7 +2,11 @@ use crate::prelude::*;
|
|||||||
|
|
||||||
/// Create the `main` function which will initialize the rust runtime and call
|
/// Create the `main` function which will initialize the rust runtime and call
|
||||||
/// users main function.
|
/// users main function.
|
||||||
pub(crate) fn maybe_create_entry_wrapper(tcx: TyCtxt<'_>, module: &mut Module<impl Backend + 'static>) {
|
pub(crate) fn maybe_create_entry_wrapper(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
module: &mut Module<impl Backend + 'static>,
|
||||||
|
unwind_context: &mut UnwindContext<'_>,
|
||||||
|
) {
|
||||||
use rustc_hir::lang_items::StartFnLangItem;
|
use rustc_hir::lang_items::StartFnLangItem;
|
||||||
use rustc_session::config::EntryFnType;
|
use rustc_session::config::EntryFnType;
|
||||||
|
|
||||||
@ -22,11 +26,12 @@ pub(crate) fn maybe_create_entry_wrapper(tcx: TyCtxt<'_>, module: &mut Module<im
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
create_entry_fn(tcx, module, main_def_id, use_start_lang_item);
|
create_entry_fn(tcx, module, unwind_context, main_def_id, use_start_lang_item);
|
||||||
|
|
||||||
fn create_entry_fn(
|
fn create_entry_fn(
|
||||||
tcx: TyCtxt<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
m: &mut Module<impl Backend + 'static>,
|
m: &mut Module<impl Backend + 'static>,
|
||||||
|
unwind_context: &mut UnwindContext<'_>,
|
||||||
rust_main_def_id: DefId,
|
rust_main_def_id: DefId,
|
||||||
use_start_lang_item: bool,
|
use_start_lang_item: bool,
|
||||||
) {
|
) {
|
||||||
@ -109,5 +114,6 @@ pub(crate) fn maybe_create_entry_wrapper(tcx: TyCtxt<'_>, module: &mut Module<im
|
|||||||
&mut ctx,
|
&mut ctx,
|
||||||
&mut cranelift_codegen::binemit::NullTrapSink {},
|
&mut cranelift_codegen::binemit::NullTrapSink {},
|
||||||
).unwrap();
|
).unwrap();
|
||||||
|
unwind_context.add_function(cmain_func_id, &ctx, m.isa());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user