This commit is contained in:
bjorn3 2024-07-09 10:08:02 +00:00
commit 29bc1a5cc0
4 changed files with 22 additions and 6 deletions

View File

@ -371,9 +371,14 @@ pub(crate) fn codegen_terminator_call<'tcx>(
// Handle special calls like intrinsics and empty drop glue. // Handle special calls like intrinsics and empty drop glue.
let instance = if let ty::FnDef(def_id, fn_args) = *func.layout().ty.kind() { let instance = if let ty::FnDef(def_id, fn_args) = *func.layout().ty.kind() {
let instance = let instance = ty::Instance::expect_resolve(
ty::Instance::expect_resolve(fx.tcx, ty::ParamEnv::reveal_all(), def_id, fn_args) fx.tcx,
.polymorphize(fx.tcx); ty::ParamEnv::reveal_all(),
def_id,
fn_args,
source_info.span,
)
.polymorphize(fx.tcx);
if is_call_from_compiler_builtins_to_upstream_monomorphization(fx.tcx, instance) { if is_call_from_compiler_builtins_to_upstream_monomorphization(fx.tcx, instance) {
if target.is_some() { if target.is_some() {

View File

@ -491,6 +491,11 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
) )
}); });
} }
// FIXME(explicit_tail_calls): add support for tail calls to the cranelift backend, once cranelift supports tail calls
TerminatorKind::TailCall { fn_span, .. } => span_bug!(
*fn_span,
"tail calls are not yet supported in `rustc_codegen_cranelift` backend"
),
TerminatorKind::InlineAsm { TerminatorKind::InlineAsm {
template, template,
operands, operands,

View File

@ -155,7 +155,7 @@ pub(crate) fn codegen_const_value<'tcx>(
fx.bcx.ins().global_value(fx.pointer_type, local_data_id) fx.bcx.ins().global_value(fx.pointer_type, local_data_id)
} }
} }
GlobalAlloc::Function(instance) => { GlobalAlloc::Function { instance, .. } => {
let func_id = crate::abi::import_function(fx.tcx, fx.module, instance); let func_id = crate::abi::import_function(fx.tcx, fx.module, instance);
let local_func_id = let local_func_id =
fx.module.declare_func_in_func(func_id, &mut fx.bcx.func); fx.module.declare_func_in_func(func_id, &mut fx.bcx.func);
@ -351,7 +351,9 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
TodoItem::Alloc(alloc_id) => { TodoItem::Alloc(alloc_id) => {
let alloc = match tcx.global_alloc(alloc_id) { let alloc = match tcx.global_alloc(alloc_id) {
GlobalAlloc::Memory(alloc) => alloc, GlobalAlloc::Memory(alloc) => alloc,
GlobalAlloc::Function(_) | GlobalAlloc::Static(_) | GlobalAlloc::VTable(..) => { GlobalAlloc::Function { .. }
| GlobalAlloc::Static(_)
| GlobalAlloc::VTable(..) => {
unreachable!() unreachable!()
} }
}; };
@ -443,7 +445,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
let reloc_target_alloc = tcx.global_alloc(alloc_id); let reloc_target_alloc = tcx.global_alloc(alloc_id);
let data_id = match reloc_target_alloc { let data_id = match reloc_target_alloc {
GlobalAlloc::Function(instance) => { GlobalAlloc::Function { instance, .. } => {
assert_eq!(addend, 0); assert_eq!(addend, 0);
let func_id = let func_id =
crate::abi::import_function(tcx, module, instance.polymorphize(tcx)); crate::abi::import_function(tcx, module, instance.polymorphize(tcx));
@ -593,6 +595,7 @@ pub(crate) fn mir_operand_get_const_val<'tcx>(
{ {
return None; return None;
} }
TerminatorKind::TailCall { .. } => return None,
TerminatorKind::Call { .. } => {} TerminatorKind::Call { .. } => {}
} }
} }

View File

@ -4,6 +4,7 @@
use rustc_middle::ty::GenericArg; use rustc_middle::ty::GenericArg;
use rustc_session::config::{sigpipe, EntryFnType}; use rustc_session::config::{sigpipe, EntryFnType};
use rustc_span::symbol::Ident; use rustc_span::symbol::Ident;
use rustc_span::DUMMY_SP;
use crate::prelude::*; use crate::prelude::*;
@ -119,6 +120,7 @@ fn create_entry_fn(
ParamEnv::reveal_all(), ParamEnv::reveal_all(),
report.def_id, report.def_id,
tcx.mk_args(&[GenericArg::from(main_ret_ty)]), tcx.mk_args(&[GenericArg::from(main_ret_ty)]),
DUMMY_SP,
) )
.polymorphize(tcx); .polymorphize(tcx);
@ -144,6 +146,7 @@ fn create_entry_fn(
ParamEnv::reveal_all(), ParamEnv::reveal_all(),
start_def_id, start_def_id,
tcx.mk_args(&[main_ret_ty.into()]), tcx.mk_args(&[main_ret_ty.into()]),
DUMMY_SP,
) )
.polymorphize(tcx); .polymorphize(tcx);
let start_func_id = import_function(tcx, m, start_instance); let start_func_id = import_function(tcx, m, start_instance);