Skip to content

Commit 1b1f6ea

Browse files
committed
Auto merge of rust-lang#76570 - cratelyn:implement-rfc-2945-c-unwind-abi, r=Amanieu
Implement RFC 2945: "C-unwind" ABI ## Implement RFC 2945: "C-unwind" ABI This branch implements [RFC 2945]. The tracking issue for this RFC is rust-lang#74990. The feature gate for the issue is `#![feature(c_unwind)]`. This RFC was created as part of the ffi-unwind project group tracked at rust-lang/lang-team#19. ### Changes Further details will be provided in commit messages, but a high-level overview of the changes follows: * A boolean `unwind` payload is added to the `C`, `System`, `Stdcall`, and `Thiscall` variants, marking whether unwinding across FFI boundaries is acceptable. The cases where each of these variants' `unwind` member is true correspond with the `C-unwind`, `system-unwind`, `stdcall-unwind`, and `thiscall-unwind` ABI strings introduced in RFC 2945 [3]. * This commit adds a `c_unwind` feature gate for the new ABI strings. Tests for this feature gate are included in `src/test/ui/c-unwind/`, which ensure that this feature gate works correctly for each of the new ABIs. A new language features entry in the unstable book is added as well. * We adjust the `rustc_middle::ty::layout::fn_can_unwind` function, used to compute whether or not a `FnAbi` object represents a function that should be able to unwind when `panic=unwind` is in use. * Changes are also made to `rustc_mir_build::build::should_abort_on_panic` so that the function ABI is used to determind whether it should abort, assuming that the `panic=unwind` strategy is being used, and no explicit unwind attribute was provided. [RFC 2945]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md
2 parents d674d3d + 95182bb commit 1b1f6ea

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/abi/mod.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -476,8 +476,11 @@ pub(crate) fn codegen_terminator_call<'tcx>(
476476

477477
// FIXME find a cleaner way to support varargs
478478
if fn_sig.c_variadic {
479-
if fn_sig.abi != Abi::C {
480-
fx.tcx.sess.span_fatal(span, &format!("Variadic call for non-C abi {:?}", fn_sig.abi));
479+
if !matches!(fn_sig.abi, Abi::C { .. }) {
480+
fx.tcx.sess.span_fatal(
481+
span,
482+
&format!("Variadic call for non-C abi {:?}", fn_sig.abi),
483+
);
481484
}
482485
let sig_ref = fx.bcx.func.dfg.call_signature(call_inst).unwrap();
483486
let abi_params = call_args

0 commit comments

Comments
 (0)