move new c abi abort behavior behind feature gate#84158
move new c abi abort behavior behind feature gate#84158bors merged 1 commit intorust-lang:masterfrom
Conversation
### Background
In rust-lang#76570, new ABI strings including `C-unwind` were introduced.
Their behavior is specified in RFC 2945 [1].
However, it was reported in the #ffi-unwind stream of the Rust
community Zulip that this had altered the way that `extern "C"`
functions behaved even when the `c_unwind` feature gate was not
active. [2]
### Overview
This makes a small patch to
`rustc_mir_build::build::should_abort_on_panic`, so that the same
behavior from before is in place when the `c_unwind` gate is not
active.
`rustc_middle::ty::layout::fn_can_unwind` is not touched, as the
visible behavior should not differ before/after rust-lang#76570. [3]
### Footnotes
[1]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md
[2]: https://rust-lang.zulipchat.com/#narrow/stream/210922-project-ffi-unwind/topic/Is.20unwinding.20through.20extern.20C.20UB.3F/near/230112325
[3]: https://github.com/rust-lang/rust/pull/76570/files#diff-b0320c2b8868f325d83c027fc5d71732636e9763551e35895488f30fe057c6e9L2599-R2617
|
r? @varkor (rust-highfive has picked a reviewer for you, use r? to override) |
|
Does |
Hi! I want to make sure that we're not mixed up here; I realize the distinctions between "should abort" and "can unwind" are not initially intuitive and aren't quite the direct inverses that I initially believed them to be. First, to answer your original question, yes But, I want to highlight that this UB exists on stable today, unless I'm mistaken. If we take this file... #![crate_type = "lib"]
pub extern "C" fn huhu() {}and compile it like so... $: rustc --version
rustc 1.51.0 (2fd73fabe 2021-03-23)
$: rustc --edition=2018 --emit=llvm-ir -C opt-level=0 extern-c-example.rs
$: /bin/cat extern-c-example.ll
; ModuleID = 'extern_c_example.3a1fbbbh-cgu.0'
source_filename = "extern_c_example.3a1fbbbh-cgu.0"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; extern_c_example::huhu
; Function Attrs: nounwind nonlazybind uwtable
define void @_ZN16extern_c_example4huhu17h914345848a8b0e88E() unnamed_addr #0 {
start:
ret void
}
attributes #0 = { nounwind nonlazybind uwtable "probe-stack"="__rust_probestack" "target-cpu"="x86-64" }
!llvm.module.flags = !{!0, !1}
!0 = !{i32 7, !"PIC Level", i32 2}
!1 = !{i32 2, !"RtLibUseGOT", i32 1}...we'll see the same
So to get to this second part of your question @BatmanAoD, I believe we should keep the Does that make sense? |
|
Yes, that makes sense. You're right that the UB exists today, but it would
be better to eliminate it as soon as possible, I think; that's the main
reason to land a patch rather than revert the original change.
…On Tue, Apr 13, 2021, 7:30 PM katelyn martin ***@***.***> wrote:
Does rustc_middle::ty::layout::fn_can_unwind control whether the nounwind
attribute is emitted? If possible, we should *not* emit that for "C" when
the "C-unwind" feature is not enabled, because it's the source of the UB.
Hi! I want to make sure that we're not mixed up here; I realize the
distinctions between "*should abort*" and "*can unwind*" are not
initially intuitive and aren't quite the direct inverses that I initially
believed them to be.
First, to answer your original question, *yes*
rustc_middle::ty::layout::fn_can_unwind controls whether the nounwind
attribute is emitted. You can see that happen here
<https://github.com/cratelyn/rust/blob/1284da34da56a17ae368e4673920ec4120562cbd/compiler/rustc_codegen_llvm/src/abi.rs#L444-L447>
specifically, in <FnAbi<'tcx, Ty<'tcx>> as
FnAbiLlvmExt<'tcx>>::apply_attrs_llfn.
*But*, I want to highlight that this UB exists on stable today, unless
I'm mistaken. If we take this file...
#![crate_type = "lib"]pub extern "C" fn huhu() {}
and compile it like so...
$: rustc --version
rustc 1.51.0 (2fd73fa 2021-03-23)
$: rustc --edition=2018 --emit=llvm-ir -C opt-level=0 extern-c-example.rs
$: /bin/cat extern-c-example.ll; ModuleID = 'extern_c_example.3a1fbbbh-cgu.0'
source_filename = "extern_c_example.3a1fbbbh-cgu.0"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; extern_c_example::huhu; Function Attrs: nounwind nonlazybind uwtable
define void @_ZN16extern_c_example4huhu17h914345848a8b0e88E() unnamed_addr #0 {
start:
ret void
}
attributes #0 = { nounwind nonlazybind uwtable "probe-stack"="__rust_probestack" "target-cpu"="x86-64" }
!llvm.module.flags = !{!0, !1}
!0 = !{i32 7, !"PIC Level", i32 2}!1 = !{i32 2, !"RtLibUseGOT", i32 1}
...we'll see the same nounwind. The behavior that's changed in the wake
of #76570 <#76570> is whether or
not an extern "C" function will abort on panic, which you can see in this
<https://github.com/rust-lang/rust/pull/76570/files#diff-596bb4000aae6e6b37927544992b2bdf7e7ac5bad13ea2becadb4cc2638fa2acL561-L564>
particular part of that diff.
we should *not* emit that for "C" when the "C-unwind" feature is not
enabled, because it's the source of the UB.
So to get to this second part of your question @BatmanAoD
<https://github.com/BatmanAoD>, I believe we should keep the nounwind
emission the same as it is today, as it matches the current behavior of
stable w.r.t extern "C" functions.
Does that make sense?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#84158 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AARU4T7JOYBHH4R2GNMOKLLTITV2BANCNFSM423OCVZQ>
.
|
|
@bors r+ |
|
📌 Commit 3e16d23 has been approved by |
|
☀️ Test successful - checks-actions |
|
beta-nominating, because I believe our intention was for this to get into 1.52 in order to avoid bugs like #83541 hitting stable. |
|
Seconding, that was exactly the intention 🙂 |
Beta is currently broken because of rust-lang/rust#84158
|
We discussed this in the compiler team triage meeting this morning and the consensus was that we would like to try reverting #76570 on beta first. If that proves complicated, then we will backport this PR instead. |
…t-of-84158, r=Mark-Simulacrum backport: move new c abi abort behavior behind feature gate This is a backport of PR rust-lang#84158 to the beta branch. The original T-compiler plan was to revert PR rust-lang#76570 in its entirety, as was attempted in PR rust-lang#84672. But the revert did not go smoothly (details below). Therefore, we are backporting PR rust-lang#84158 instead, which was our established backup plan if a revert did not go smoothly. I have manually confirmed that this backport fixes the luajit issue described on issue rust-lang#83541 <details> <summary>Click for details as to why revert of PR rust-lang#76570 did not go smoothly.</summary> It turns out that Miri had been subsequently updated to reflect changes to `rustc_target` that landed in PR rust-lang#76570. This meant that the attempt to land PR rust-lang#84672 broke Miri builds. Normally we allow tools to break when landing PR's (and just expect follow-up PR's to fix the tools), but we don't allow it for tools in the run-up to a release. (We shouldn't be using that uniform policy for all tools. Miri should be allow to break during the week before a release; but currently we cannot express that, due to issue rust-lang#74709.) Therefore, its a lot of pain to try to revert PR rust-lang#76570. And we're going with the backup plan. </details> Original commit message follows: ---- *Background* In rust-lang#76570, new ABI strings including `C-unwind` were introduced. Their behavior is specified in RFC 2945 <sup>[1]</sup>. However, it was reported in the #ffi-unwind stream of the Rust community Zulip that this had altered the way that `extern "C"` functions behaved even when the `c_unwind` feature gate was not active. <sup>[2]</sup> *Overview* This makes a small patch to `rustc_mir_build::build::should_abort_on_panic`, so that the same behavior from before is in place when the `c_unwind` gate is not active. `rustc_middle::ty::layout::fn_can_unwind` is not touched, as the visible behavior should not differ before/after rust-lang#76570. <sup>[3]</sup> ### Footnotes 1.: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md 2.: https://rust-lang.zulipchat.com/#narrow/stream/210922-project-ffi-unwind/topic/Is.20unwinding.20through.20extern.20C.20UB.3F/near/230112325 3.: https://github.com/rust-lang/rust/pull/76570/files#diff-b0320c2b8868f325d83c027fc5d71732636e9763551e35895488f30fe057c6e9L2599-R2617 [1]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md [2]: https://rust-lang.zulipchat.com/#narrow/stream/210922-project-ffi-unwind/topic/Is.20unwinding.20through.20extern.20C.20UB.3F/near/230112325 [3]: https://github.com/rust-lang/rust/pull/76570/files#diff-b0320c2b8868f325d83c027fc5d71732636e9763551e35895488f30fe057c6e9L2599-R2617
Background
In #76570, new ABI strings including
C-unwindwere introduced. Theirbehavior is specified in RFC 2945 1.
However, it was reported in the #ffi-unwind stream of the Rust community Zulip
that this had altered the way that
extern "C"functions behaved even when thec_unwindfeature gate was not active. 2Overview
This makes a small patch to
rustc_mir_build::build::should_abort_on_panic, sothat the same behavior from before is in place when the
c_unwindgate is notactive.
rustc_middle::ty::layout::fn_can_unwindis not touched, as the visiblebehavior should not differ before/after #76570. 3
1: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md
2: https://rust-lang.zulipchat.com/#narrow/stream/210922-project-ffi-unwind/topic/Is.20unwinding.20through.20extern.20C.20UB.3F/near/230112325
3: https://github.com/rust-lang/rust/pull/76570/files#diff-b0320c2b8868f325d83c027fc5d71732636e9763551e35895488f30fe057c6e9L2599-R2617