Avoid using make_direct_deprecated() in extern "ptx-kernel"
This method will be removed in the future as it produces a broken ABI that depends on cg_llvm implementation details. After this PR wasm32-unknown-unknown is the only remaining user of make_direct_deprecated().
This commit is contained in:
parent
d9b4598d7e
commit
062bc02dc7
3 changed files with 28 additions and 42 deletions
|
@ -1,5 +1,5 @@
|
||||||
use super::{ArgAttribute, ArgAttributes, ArgExtension, CastTarget};
|
use super::{ArgAttribute, ArgAttributes, ArgExtension, CastTarget};
|
||||||
use crate::abi::call::{ArgAbi, FnAbi, PassMode, Reg, Size, Uniform};
|
use crate::abi::call::{ArgAbi, FnAbi, Reg, Size, Uniform};
|
||||||
use crate::abi::{HasDataLayout, TyAbiInterface};
|
use crate::abi::{HasDataLayout, TyAbiInterface};
|
||||||
|
|
||||||
fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
|
fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
|
||||||
|
@ -53,22 +53,29 @@ where
|
||||||
Ty: TyAbiInterface<'a, C> + Copy,
|
Ty: TyAbiInterface<'a, C> + Copy,
|
||||||
C: HasDataLayout,
|
C: HasDataLayout,
|
||||||
{
|
{
|
||||||
if matches!(arg.mode, PassMode::Pair(..)) && (arg.layout.is_adt() || arg.layout.is_tuple()) {
|
match arg.mode {
|
||||||
let align_bytes = arg.layout.align.abi.bytes();
|
super::PassMode::Ignore | super::PassMode::Direct(_) => return,
|
||||||
|
super::PassMode::Pair(_, _) => {}
|
||||||
let unit = match align_bytes {
|
super::PassMode::Cast { .. } => unreachable!(),
|
||||||
1 => Reg::i8(),
|
super::PassMode::Indirect { .. } => {}
|
||||||
2 => Reg::i16(),
|
|
||||||
4 => Reg::i32(),
|
|
||||||
8 => Reg::i64(),
|
|
||||||
16 => Reg::i128(),
|
|
||||||
_ => unreachable!("Align is given as power of 2 no larger than 16 bytes"),
|
|
||||||
};
|
|
||||||
arg.cast_to(Uniform::new(unit, Size::from_bytes(2 * align_bytes)));
|
|
||||||
} else {
|
|
||||||
// FIXME: find a better way to do this. See https://github.com/rust-lang/rust/issues/117271.
|
|
||||||
arg.make_direct_deprecated();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME only allow structs and wide pointers here
|
||||||
|
// panic!(
|
||||||
|
// "`extern \"ptx-kernel\"` doesn't allow passing types other than primitives and structs"
|
||||||
|
// );
|
||||||
|
|
||||||
|
let align_bytes = arg.layout.align.abi.bytes();
|
||||||
|
|
||||||
|
let unit = match align_bytes {
|
||||||
|
1 => Reg::i8(),
|
||||||
|
2 => Reg::i16(),
|
||||||
|
4 => Reg::i32(),
|
||||||
|
8 => Reg::i64(),
|
||||||
|
16 => Reg::i128(),
|
||||||
|
_ => unreachable!("Align is given as power of 2 no larger than 16 bytes"),
|
||||||
|
};
|
||||||
|
arg.cast_to(Uniform::new(unit, arg.layout.size));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn compute_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) {
|
pub(crate) fn compute_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) {
|
||||||
|
|
|
@ -489,21 +489,16 @@ fn fn_abi_sanity_check<'tcx>(
|
||||||
// have to allow it -- but we absolutely shouldn't let any more targets do
|
// have to allow it -- but we absolutely shouldn't let any more targets do
|
||||||
// that. (Also see <https://github.com/rust-lang/rust/issues/115666>.)
|
// that. (Also see <https://github.com/rust-lang/rust/issues/115666>.)
|
||||||
//
|
//
|
||||||
// The unstable abi `PtxKernel` also uses Direct for now.
|
// The unadjusted ABI also uses Direct for all args and is ill-specified,
|
||||||
// It needs to switch to something else before stabilization can happen.
|
// but unfortunately we need it for calling certain LLVM intrinsics.
|
||||||
// (See issue: https://github.com/rust-lang/rust/issues/117271)
|
|
||||||
//
|
|
||||||
// And finally the unadjusted ABI is ill specified and uses Direct for all
|
|
||||||
// args, but unfortunately we need it for calling certain LLVM intrinsics.
|
|
||||||
|
|
||||||
match spec_abi {
|
match spec_abi {
|
||||||
ExternAbi::Unadjusted => {}
|
ExternAbi::Unadjusted => {}
|
||||||
ExternAbi::PtxKernel => {}
|
|
||||||
ExternAbi::C { unwind: _ }
|
ExternAbi::C { unwind: _ }
|
||||||
if matches!(&*tcx.sess.target.arch, "wasm32" | "wasm64") => {}
|
if matches!(&*tcx.sess.target.arch, "wasm32" | "wasm64") => {}
|
||||||
_ => {
|
_ => {
|
||||||
panic!(
|
panic!(
|
||||||
"`PassMode::Direct` for aggregates only allowed for \"unadjusted\" and \"ptx-kernel\" functions and on wasm\n\
|
"`PassMode::Direct` for aggregates only allowed for \"unadjusted\" functions and on wasm\n\
|
||||||
Problematic type: {:#?}",
|
Problematic type: {:#?}",
|
||||||
arg.layout,
|
arg.layout,
|
||||||
);
|
);
|
||||||
|
|
|
@ -166,7 +166,7 @@ pub unsafe extern "ptx-kernel" fn f_f32_arg(_a: f32) {}
|
||||||
pub unsafe extern "ptx-kernel" fn f_f64_arg(_a: f64) {}
|
pub unsafe extern "ptx-kernel" fn f_f64_arg(_a: f64) {}
|
||||||
|
|
||||||
// CHECK: .visible .entry f_single_u8_arg(
|
// CHECK: .visible .entry f_single_u8_arg(
|
||||||
// CHECK: .param .align 1 .b8 f_single_u8_arg_param_0[1]
|
// CHECK: .param .u8 f_single_u8_arg_param_0
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "ptx-kernel" fn f_single_u8_arg(_a: SingleU8) {}
|
pub unsafe extern "ptx-kernel" fn f_single_u8_arg(_a: SingleU8) {}
|
||||||
|
|
||||||
|
@ -242,22 +242,6 @@ pub unsafe extern "ptx-kernel" fn f_float_array_arg(_a: [f32; 5]) {}
|
||||||
//pub unsafe extern "ptx-kernel" fn f_u128_array_arg(_a: [u128; 5]) {}
|
//pub unsafe extern "ptx-kernel" fn f_u128_array_arg(_a: [u128; 5]) {}
|
||||||
|
|
||||||
// CHECK: .visible .entry f_u32_slice_arg(
|
// CHECK: .visible .entry f_u32_slice_arg(
|
||||||
// CHECK: .param .u64 f_u32_slice_arg_param_0
|
// CHECK: .param .align 8 .b8 f_u32_slice_arg_param_0[16]
|
||||||
// CHECK: .param .u64 f_u32_slice_arg_param_1
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "ptx-kernel" fn f_u32_slice_arg(_a: &[u32]) {}
|
pub unsafe extern "ptx-kernel" fn f_u32_slice_arg(_a: &[u32]) {}
|
||||||
|
|
||||||
// CHECK: .visible .entry f_tuple_u8_u8_arg(
|
|
||||||
// CHECK: .param .align 1 .b8 f_tuple_u8_u8_arg_param_0[2]
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_arg(_a: (u8, u8)) {}
|
|
||||||
|
|
||||||
// CHECK: .visible .entry f_tuple_u32_u32_arg(
|
|
||||||
// CHECK: .param .align 4 .b8 f_tuple_u32_u32_arg_param_0[8]
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "ptx-kernel" fn f_tuple_u32_u32_arg(_a: (u32, u32)) {}
|
|
||||||
|
|
||||||
// CHECK: .visible .entry f_tuple_u8_u8_u32_arg(
|
|
||||||
// CHECK: .param .align 4 .b8 f_tuple_u8_u8_u32_arg_param_0[8]
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_u32_arg(_a: (u8, u8, u32)) {}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue