Rollup merge of #133931 - bjorn3:even_stricter_fn_abi_sanity_checking, r=nnethercote
Only allow PassMode::Direct for aggregates on wasm when using the C ABI For the Rust ABI we don't have any ABI compat reasons to allow PassMode::Direct for aggregates.
This commit is contained in:
commit
875df6c59c
1 changed files with 20 additions and 10 deletions
|
@ -473,20 +473,30 @@ fn fn_abi_sanity_check<'tcx>(
|
||||||
// This really shouldn't happen even for sized aggregates, since
|
// This really shouldn't happen even for sized aggregates, since
|
||||||
// `immediate_llvm_type` will use `layout.fields` to turn this Rust type into an
|
// `immediate_llvm_type` will use `layout.fields` to turn this Rust type into an
|
||||||
// LLVM type. This means all sorts of Rust type details leak into the ABI.
|
// LLVM type. This means all sorts of Rust type details leak into the ABI.
|
||||||
// However wasm sadly *does* currently use this mode so we have to allow it --
|
// However wasm sadly *does* currently use this mode for it's "C" ABI so we
|
||||||
// but we absolutely shouldn't let any more targets do that.
|
// have to allow it -- but we absolutely shouldn't let any more targets do
|
||||||
// (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 unstable abi `PtxKernel` also uses Direct for now.
|
||||||
// It needs to switch to something else before stabilization can happen.
|
// It needs to switch to something else before stabilization can happen.
|
||||||
// (See issue: https://github.com/rust-lang/rust/issues/117271)
|
// (See issue: https://github.com/rust-lang/rust/issues/117271)
|
||||||
assert!(
|
//
|
||||||
matches!(&*tcx.sess.target.arch, "wasm32" | "wasm64")
|
// And finally the unadjusted ABI is ill specified and uses Direct for all
|
||||||
|| matches!(spec_abi, ExternAbi::PtxKernel | ExternAbi::Unadjusted),
|
// args, but unfortunately we need it for calling certain LLVM intrinsics.
|
||||||
"`PassMode::Direct` for aggregates only allowed for \"unadjusted\" and \"ptx-kernel\" functions and on wasm\n\
|
|
||||||
Problematic type: {:#?}",
|
match spec_abi {
|
||||||
arg.layout,
|
ExternAbi::Unadjusted => {}
|
||||||
);
|
ExternAbi::PtxKernel => {}
|
||||||
|
ExternAbi::C { unwind: _ }
|
||||||
|
if matches!(&*tcx.sess.target.arch, "wasm32" | "wasm64") => {}
|
||||||
|
_ => {
|
||||||
|
panic!(
|
||||||
|
"`PassMode::Direct` for aggregates only allowed for \"unadjusted\" and \"ptx-kernel\" functions and on wasm\n\
|
||||||
|
Problematic type: {:#?}",
|
||||||
|
arg.layout,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue