1
Fork 0

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:
Matthias Krüger 2024-12-06 09:27:41 +01:00 committed by GitHub
commit 875df6c59c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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,
);
}
}
} }
} }
} }