use crate::prelude::*;
+use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use rustc_ast::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};
-use rustc_span::symbol::sym;
/// Returns whether an allocator shim was created
pub(crate) fn codegen(
tcx: TyCtxt<'_>,
module: &mut impl Module,
- unwind_context: &mut UnwindContext<'_>,
+ unwind_context: &mut UnwindContext,
) -> bool {
- let any_dynamic_crate = tcx.dependency_formats(LOCAL_CRATE).iter().any(|(_, list)| {
+ let any_dynamic_crate = tcx.dependency_formats(()).iter().any(|(_, list)| {
use rustc_middle::middle::dependency_format::Linkage;
list.iter().any(|&linkage| linkage == Linkage::Dynamic)
});
if any_dynamic_crate {
false
- } else if let Some(kind) = tcx.allocator_kind() {
- codegen_inner(module, unwind_context, kind);
+ } else if let Some(kind) = tcx.allocator_kind(()) {
+ codegen_inner(module, unwind_context, kind, tcx.lang_items().oom().is_some());
true
} else {
false
fn codegen_inner(
module: &mut impl Module,
- unwind_context: &mut UnwindContext<'_>,
+ unwind_context: &mut UnwindContext,
kind: AllocatorKind,
+ has_alloc_error_handler: bool,
) {
let usize_ty = module.target_config().pointer_type();
let caller_name = format!("__rust_{}", method.name);
let callee_name = kind.fn_name(method.name);
- //eprintln!("Codegen allocator shim {} -> {} ({:?} -> {:?})", caller_name, callee_name, sig.params, sig.returns);
- let func_id = module
- .declare_function(&caller_name, Linkage::Export, &sig)
- .unwrap();
+ let func_id = module.declare_function(&caller_name, Linkage::Export, &sig).unwrap();
- let callee_func_id = module
- .declare_function(&callee_name, Linkage::Import, &sig)
- .unwrap();
+ let callee_func_id = module.declare_function(&callee_name, Linkage::Import, &sig).unwrap();
let mut ctx = Context::new();
ctx.func = Function::with_name_signature(ExternalName::user(0, 0), sig.clone());
bcx.finalize();
}
module
- .define_function(
- func_id,
- &mut ctx,
- &mut cranelift_codegen::binemit::NullTrapSink {},
- )
+ .define_function(func_id, &mut ctx, &mut NullTrapSink {}, &mut NullStackMapSink {})
.unwrap();
unwind_context.add_function(func_id, &ctx, module.isa());
}
returns: vec![],
};
- let callee_name = kind.fn_name(sym::oom);
- //eprintln!("Codegen allocator shim {} -> {} ({:?} -> {:?})", caller_name, callee_name, sig.params, sig.returns);
+ let callee_name = if has_alloc_error_handler { "__rg_oom" } else { "__rdl_oom" };
- let func_id = module
- .declare_function("__rust_alloc_error_handler", Linkage::Export, &sig)
- .unwrap();
+ let func_id =
+ module.declare_function("__rust_alloc_error_handler", Linkage::Export, &sig).unwrap();
- let callee_func_id = module
- .declare_function(&callee_name, Linkage::Import, &sig)
- .unwrap();
+ let callee_func_id = module.declare_function(callee_name, Linkage::Import, &sig).unwrap();
let mut ctx = Context::new();
- ctx.func = Function::with_name_signature(ExternalName::user(0, 0), sig.clone());
+ ctx.func = Function::with_name_signature(ExternalName::user(0, 0), sig);
{
let mut func_ctx = FunctionBuilderContext::new();
let mut bcx = FunctionBuilder::new(&mut ctx.func, &mut func_ctx);
let block = bcx.create_block();
bcx.switch_to_block(block);
let args = (&[usize_ty, usize_ty])
- .into_iter()
+ .iter()
.map(|&ty| bcx.append_block_param(block, ty))
.collect::<Vec<Value>>();
bcx.finalize();
}
module
- .define_function(
- func_id,
- &mut ctx,
- &mut cranelift_codegen::binemit::NullTrapSink {},
- )
+ .define_function(func_id, &mut ctx, &mut NullTrapSink {}, &mut NullStackMapSink {})
.unwrap();
unwind_context.add_function(func_id, &ctx, module.isa());
}