Don't ICE on unimplemented call convs
This commit is contained in:
parent
dffa6acf73
commit
ee05e4d5ab
@ -7,6 +7,7 @@ mod returning;
|
|||||||
use cranelift_module::ModuleError;
|
use cranelift_module::ModuleError;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::ty::layout::FnAbiOf;
|
use rustc_middle::ty::layout::FnAbiOf;
|
||||||
|
use rustc_session::Session;
|
||||||
use rustc_target::abi::call::{Conv, FnAbi};
|
use rustc_target::abi::call::{Conv, FnAbi};
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ fn clif_sig_from_fn_abi<'tcx>(
|
|||||||
default_call_conv: CallConv,
|
default_call_conv: CallConv,
|
||||||
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
|
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
|
||||||
) -> Signature {
|
) -> Signature {
|
||||||
let call_conv = conv_to_call_conv(fn_abi.conv, default_call_conv);
|
let call_conv = conv_to_call_conv(tcx.sess, fn_abi.conv, default_call_conv);
|
||||||
|
|
||||||
let inputs = fn_abi.args.iter().map(|arg_abi| arg_abi.get_abi_param(tcx).into_iter()).flatten();
|
let inputs = fn_abi.args.iter().map(|arg_abi| arg_abi.get_abi_param(tcx).into_iter()).flatten();
|
||||||
|
|
||||||
@ -33,24 +34,30 @@ fn clif_sig_from_fn_abi<'tcx>(
|
|||||||
Signature { params, returns, call_conv }
|
Signature { params, returns, call_conv }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn conv_to_call_conv(c: Conv, default_call_conv: CallConv) -> CallConv {
|
pub(crate) fn conv_to_call_conv(sess: &Session, c: Conv, default_call_conv: CallConv) -> CallConv {
|
||||||
match c {
|
match c {
|
||||||
Conv::Rust | Conv::C => default_call_conv,
|
Conv::Rust | Conv::C => default_call_conv,
|
||||||
Conv::RustCold => CallConv::Cold,
|
Conv::RustCold => CallConv::Cold,
|
||||||
Conv::X86_64SysV => CallConv::SystemV,
|
Conv::X86_64SysV => CallConv::SystemV,
|
||||||
Conv::X86_64Win64 => CallConv::WindowsFastcall,
|
Conv::X86_64Win64 => CallConv::WindowsFastcall,
|
||||||
Conv::ArmAapcs
|
|
||||||
| Conv::CCmseNonSecureCall
|
// Should already get a back compat warning
|
||||||
|
Conv::X86Fastcall | Conv::X86Stdcall | Conv::X86ThisCall | Conv::X86VectorCall => {
|
||||||
|
default_call_conv
|
||||||
|
}
|
||||||
|
|
||||||
|
Conv::X86Intr => sess.fatal("x86-interrupt call conv not yet implemented"),
|
||||||
|
|
||||||
|
Conv::ArmAapcs => sess.fatal("aapcs call conv not yet implemented"),
|
||||||
|
|
||||||
|
Conv::CCmseNonSecureCall
|
||||||
| Conv::Msp430Intr
|
| Conv::Msp430Intr
|
||||||
| Conv::PtxKernel
|
| Conv::PtxKernel
|
||||||
| Conv::X86Fastcall
|
|
||||||
| Conv::X86Intr
|
|
||||||
| Conv::X86Stdcall
|
|
||||||
| Conv::X86ThisCall
|
|
||||||
| Conv::X86VectorCall
|
|
||||||
| Conv::AmdGpuKernel
|
| Conv::AmdGpuKernel
|
||||||
| Conv::AvrInterrupt
|
| Conv::AvrInterrupt
|
||||||
| Conv::AvrNonBlockingInterrupt => todo!("{:?}", c),
|
| Conv::AvrNonBlockingInterrupt => {
|
||||||
|
unreachable!("tried to use {c:?} call conv which only exists on an unsupported target");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ pub(crate) fn maybe_create_entry_wrapper(
|
|||||||
],
|
],
|
||||||
returns: vec![AbiParam::new(m.target_config().pointer_type() /*isize*/)],
|
returns: vec![AbiParam::new(m.target_config().pointer_type() /*isize*/)],
|
||||||
call_conv: crate::conv_to_call_conv(
|
call_conv: crate::conv_to_call_conv(
|
||||||
|
tcx.sess,
|
||||||
tcx.sess.target.options.entry_abi,
|
tcx.sess.target.options.entry_abi,
|
||||||
m.target_config().default_call_conv,
|
m.target_config().default_call_conv,
|
||||||
),
|
),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user