Skip to content

Commit 95182bb

Browse files
author
katelyn a. martin
committed
rustc_target: add "unwind" payloads to Abi
### Overview This commit begins the implementation work for RFC 2945. For more information, see the rendered RFC [1] and tracking issue [2]. 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]. ### Feature Gate and Unstable Book 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. ### Further Work To Be Done This commit does not proceed to implement the new unwinding ABIs, and is intentionally scoped specifically to *defining* the ABIs and their feature flag. ### One Note on Test Churn This will lead to some test churn, in re-blessing hash tests, as the deleted comment in `src/librustc_target/spec/abi.rs` mentioned, because we can no longer guarantee the ordering of the `Abi` variants. While this is a downside, this decision was made bearing in mind that RFC 2945 states the following, in the "Other `unwind` Strings" section [3]: > More unwind variants of existing ABI strings may be introduced, > with the same semantics, without an additional RFC. Adding a new variant for each of these cases, rather than specifying a payload for a given ABI, would quickly become untenable, and make working with the `Abi` enum prone to mistakes. This approach encodes the unwinding information *into* a given ABI, to account for the future possibility of other `-unwind` ABI strings. ### Ignore Directives `ignore-*` directives are used in two of our `*-unwind` ABI test cases. Specifically, the `stdcall-unwind` and `thiscall-unwind` test cases ignore architectures that do not support `stdcall` and `thiscall`, respectively. These directives are cribbed from `src/test/ui/c-variadic/variadic-ffi-1.rs` for `stdcall`, and `src/test/ui/extern/extern-thiscall.rs` for `thiscall`. This would otherwise fail on some targets, see: rust-lang-ci@fcf697f ### Footnotes [1]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md [2]: rust-lang#74990 [3]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md#other-unwind-abi-strings
1 parent 7f02020 commit 95182bb

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)