Auto merge of #116088 - nbdd0121:unwind, r=Amanieu,RalfJung

Stabilise `c_unwind`

Fix #74990
Fix #115285 (that's also where FCP is happening)

Marking as draft PR for now due to `compiler_builtins` issues

r? `@Amanieu`
This commit is contained in:
bors 2024-06-20 11:22:59 +00:00
commit 1aaab8b9f8
64 changed files with 54 additions and 188 deletions

View File

@ -80,6 +80,8 @@ declare_features! (
(accepted, braced_empty_structs, "1.8.0", Some(29720)), (accepted, braced_empty_structs, "1.8.0", Some(29720)),
/// Allows `c"foo"` literals. /// Allows `c"foo"` literals.
(accepted, c_str_literals, "1.77.0", Some(105723)), (accepted, c_str_literals, "1.77.0", Some(105723)),
/// Allows `extern "C-unwind" fn` to enable unwinding across ABI boundaries and treat `extern "C" fn` as nounwind.
(accepted, c_unwind, "CURRENT_RUSTC_VERSION", Some(74990)),
/// Allows `#[cfg_attr(predicate, multiple, attributes, here)]`. /// Allows `#[cfg_attr(predicate, multiple, attributes, here)]`.
(accepted, cfg_attr_multi, "1.33.0", Some(54881)), (accepted, cfg_attr_multi, "1.33.0", Some(54881)),
/// Allows the use of `#[cfg(doctest)]`, set when rustdoc is collecting doctests. /// Allows the use of `#[cfg(doctest)]`, set when rustdoc is collecting doctests.

View File

@ -363,8 +363,6 @@ declare_features! (
(unstable, async_for_loop, "1.77.0", Some(118898)), (unstable, async_for_loop, "1.77.0", Some(118898)),
/// Allows builtin # foo() syntax /// Allows builtin # foo() syntax
(unstable, builtin_syntax, "1.71.0", Some(110680)), (unstable, builtin_syntax, "1.71.0", Some(110680)),
/// Treat `extern "C"` function as nounwind.
(unstable, c_unwind, "1.52.0", Some(74990)),
/// Allows using C-variadics. /// Allows using C-variadics.
(unstable, c_variadic, "1.34.0", Some(44930)), (unstable, c_variadic, "1.34.0", Some(44930)),
/// Allows the use of `#[cfg(overflow_checks)` to check if integer overflow behaviour. /// Allows the use of `#[cfg(overflow_checks)` to check if integer overflow behaviour.

View File

@ -1182,37 +1182,6 @@ pub fn fn_can_unwind(tcx: TyCtxt<'_>, fn_def_id: Option<DefId>, abi: SpecAbi) ->
// ABIs have such an option. Otherwise the only other thing here is Rust // ABIs have such an option. Otherwise the only other thing here is Rust
// itself, and those ABIs are determined by the panic strategy configured // itself, and those ABIs are determined by the panic strategy configured
// for this compilation. // for this compilation.
//
// Unfortunately at this time there's also another caveat. Rust [RFC
// 2945][rfc] has been accepted and is in the process of being implemented
// and stabilized. In this interim state we need to deal with historical
// rustc behavior as well as plan for future rustc behavior.
//
// Historically functions declared with `extern "C"` were marked at the
// codegen layer as `nounwind`. This happened regardless of `panic=unwind`
// or not. This is UB for functions in `panic=unwind` mode that then
// actually panic and unwind. Note that this behavior is true for both
// externally declared functions as well as Rust-defined function.
//
// To fix this UB rustc would like to change in the future to catch unwinds
// from function calls that may unwind within a Rust-defined `extern "C"`
// function and forcibly abort the process, thereby respecting the
// `nounwind` attribute emitted for `extern "C"`. This behavior change isn't
// ready to roll out, so determining whether or not the `C` family of ABIs
// unwinds is conditional not only on their definition but also whether the
// `#![feature(c_unwind)]` feature gate is active.
//
// Note that this means that unlike historical compilers rustc now, by
// default, unconditionally thinks that the `C` ABI may unwind. This will
// prevent some optimization opportunities, however, so we try to scope this
// change and only assume that `C` unwinds with `panic=unwind` (as opposed
// to `panic=abort`).
//
// Eventually the check against `c_unwind` here will ideally get removed and
// this'll be a little cleaner as it'll be a straightforward check of the
// ABI.
//
// [rfc]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md
use SpecAbi::*; use SpecAbi::*;
match abi { match abi {
C { unwind } C { unwind }
@ -1224,10 +1193,7 @@ pub fn fn_can_unwind(tcx: TyCtxt<'_>, fn_def_id: Option<DefId>, abi: SpecAbi) ->
| Thiscall { unwind } | Thiscall { unwind }
| Aapcs { unwind } | Aapcs { unwind }
| Win64 { unwind } | Win64 { unwind }
| SysV64 { unwind } => { | SysV64 { unwind } => unwind,
unwind
|| (!tcx.features().c_unwind && tcx.sess.panic_strategy() == PanicStrategy::Unwind)
}
PtxKernel PtxKernel
| Msp430Interrupt | Msp430Interrupt
| X86Interrupt | X86Interrupt

View File

@ -11,38 +11,6 @@ use rustc_target::spec::PanicStrategy;
use crate::errors; use crate::errors;
/// Some of the functions declared as "may unwind" by `fn_can_unwind` can't actually unwind. In
/// particular, `extern "C"` is still considered as can-unwind on stable, but we need to consider
/// it cannot-unwind here. So below we check `fn_can_unwind() && abi_can_unwind()` before concluding
/// that a function call can unwind.
fn abi_can_unwind(abi: Abi) -> bool {
use Abi::*;
match abi {
C { unwind }
| System { unwind }
| Cdecl { unwind }
| Stdcall { unwind }
| Fastcall { unwind }
| Vectorcall { unwind }
| Thiscall { unwind }
| Aapcs { unwind }
| Win64 { unwind }
| SysV64 { unwind } => unwind,
PtxKernel
| Msp430Interrupt
| X86Interrupt
| EfiApi
| AvrInterrupt
| AvrNonBlockingInterrupt
| RiscvInterruptM
| RiscvInterruptS
| CCmseNonSecureCall
| Wasm
| Unadjusted => false,
RustIntrinsic | Rust | RustCall | RustCold => unreachable!(), // these ABIs are already skipped earlier
}
}
// Check if the body of this def_id can possibly leak a foreign unwind into Rust code. // Check if the body of this def_id can possibly leak a foreign unwind into Rust code.
fn has_ffi_unwind_calls(tcx: TyCtxt<'_>, local_def_id: LocalDefId) -> bool { fn has_ffi_unwind_calls(tcx: TyCtxt<'_>, local_def_id: LocalDefId) -> bool {
debug!("has_ffi_unwind_calls({local_def_id:?})"); debug!("has_ffi_unwind_calls({local_def_id:?})");
@ -103,7 +71,7 @@ fn has_ffi_unwind_calls(tcx: TyCtxt<'_>, local_def_id: LocalDefId) -> bool {
_ => bug!("invalid callee of type {:?}", ty), _ => bug!("invalid callee of type {:?}", ty),
}; };
if layout::fn_can_unwind(tcx, fn_def_id, sig.abi()) && abi_can_unwind(sig.abi()) { if layout::fn_can_unwind(tcx, fn_def_id, sig.abi()) {
// We have detected a call that can possibly leak foreign unwind. // We have detected a call that can possibly leak foreign unwind.
// //
// Because the function body itself can unwind, we are not aborting this function call // Because the function body itself can unwind, we are not aborting this function call

View File

@ -165,12 +165,12 @@
// //
// Language features: // Language features:
// tidy-alphabetical-start // tidy-alphabetical-start
#![cfg_attr(bootstrap, feature(c_unwind))]
#![cfg_attr(not(test), feature(coroutine_trait))] #![cfg_attr(not(test), feature(coroutine_trait))]
#![cfg_attr(test, feature(panic_update_hook))] #![cfg_attr(test, feature(panic_update_hook))]
#![cfg_attr(test, feature(test))] #![cfg_attr(test, feature(test))]
#![feature(allocator_internals)] #![feature(allocator_internals)]
#![feature(allow_internal_unstable)] #![feature(allow_internal_unstable)]
#![feature(c_unwind)]
#![feature(cfg_sanitize)] #![feature(cfg_sanitize)]
#![feature(const_mut_refs)] #![feature(const_mut_refs)]
#![feature(const_precise_live_drops)] #![feature(const_precise_live_drops)]

View File

@ -199,13 +199,13 @@
// //
// Language features: // Language features:
// tidy-alphabetical-start // tidy-alphabetical-start
#![cfg_attr(bootstrap, feature(c_unwind))]
#![feature(abi_unadjusted)] #![feature(abi_unadjusted)]
#![feature(adt_const_params)] #![feature(adt_const_params)]
#![feature(allow_internal_unsafe)] #![feature(allow_internal_unsafe)]
#![feature(allow_internal_unstable)] #![feature(allow_internal_unstable)]
#![feature(asm_const)] #![feature(asm_const)]
#![feature(auto_traits)] #![feature(auto_traits)]
#![feature(c_unwind)]
#![feature(cfg_sanitize)] #![feature(cfg_sanitize)]
#![feature(cfg_target_has_atomic)] #![feature(cfg_target_has_atomic)]
#![feature(cfg_target_has_atomic_equal_alignment)] #![feature(cfg_target_has_atomic_equal_alignment)]

View File

@ -14,7 +14,7 @@
#![feature(std_internals)] #![feature(std_internals)]
#![feature(staged_api)] #![feature(staged_api)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![feature(c_unwind)] #![cfg_attr(bootstrap, feature(c_unwind))]
#![allow(internal_features)] #![allow(internal_features)]
#[cfg(target_os = "android")] #[cfg(target_os = "android")]

View File

@ -24,7 +24,7 @@
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![panic_runtime] #![panic_runtime]
#![feature(panic_runtime)] #![feature(panic_runtime)]
#![feature(c_unwind)] #![cfg_attr(bootstrap, feature(c_unwind))]
// `real_imp` is unused with Miri, so silence warnings. // `real_imp` is unused with Miri, so silence warnings.
#![cfg_attr(miri, allow(dead_code))] #![cfg_attr(miri, allow(dead_code))]
#![allow(internal_features)] #![allow(internal_features)]

View File

@ -119,7 +119,9 @@ impl Write for Buffer {
} }
impl Drop for Buffer { impl Drop for Buffer {
#[inline] // HACK(nbdd0121): Hack to prevent LLVM < 17.0.4 from misoptimising,
// change to `#[inline]` if fixed.
#[inline(never)]
fn drop(&mut self) { fn drop(&mut self) {
let b = self.take(); let b = self.take();
(b.drop)(b); (b.drop)(b);

View File

@ -273,12 +273,12 @@
// //
// Language features: // Language features:
// tidy-alphabetical-start // tidy-alphabetical-start
#![cfg_attr(bootstrap, feature(c_unwind))]
#![feature(alloc_error_handler)] #![feature(alloc_error_handler)]
#![feature(allocator_internals)] #![feature(allocator_internals)]
#![feature(allow_internal_unsafe)] #![feature(allow_internal_unsafe)]
#![feature(allow_internal_unstable)] #![feature(allow_internal_unstable)]
#![feature(asm_experimental_arch)] #![feature(asm_experimental_arch)]
#![feature(c_unwind)]
#![feature(cfg_sanitizer_cfi)] #![feature(cfg_sanitizer_cfi)]
#![feature(cfg_target_thread_local)] #![feature(cfg_target_thread_local)]
#![feature(cfi_encoding)] #![feature(cfi_encoding)]

View File

@ -2,7 +2,7 @@
#![unstable(feature = "panic_unwind", issue = "32837")] #![unstable(feature = "panic_unwind", issue = "32837")]
#![feature(link_cfg)] #![feature(link_cfg)]
#![feature(staged_api)] #![feature(staged_api)]
#![feature(c_unwind)] #![cfg_attr(bootstrap, feature(c_unwind))]
#![feature(strict_provenance)] #![feature(strict_provenance)]
#![cfg_attr(target_arch = "wasm64", feature(simd_wasm64))] #![cfg_attr(target_arch = "wasm64", feature(simd_wasm64))]
#![cfg_attr(not(target_env = "msvc"), feature(libc))] #![cfg_attr(not(target_env = "msvc"), feature(libc))]

View File

@ -1,26 +0,0 @@
# `c_unwind`
The tracking issue for this feature is: [#74990]
[#74990]: https://github.com/rust-lang/rust/issues/74990
------------------------
Introduces new ABI strings:
- "C-unwind"
- "cdecl-unwind"
- "stdcall-unwind"
- "fastcall-unwind"
- "vectorcall-unwind"
- "thiscall-unwind"
- "aapcs-unwind"
- "win64-unwind"
- "sysv64-unwind"
- "system-unwind"
These enable unwinding from other languages (such as C++) into Rust frames and
from Rust into other languages.
See [RFC 2945] for more information.
[RFC 2945]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md

View File

@ -1,5 +1,3 @@
#![feature(c_unwind)]
#[no_mangle] #[no_mangle]
extern "C-unwind" fn unwind() { extern "C-unwind" fn unwind() {
panic!(); panic!();

View File

@ -4,7 +4,7 @@
//@normalize-stderr-test: "\n +[0-9]+:[^\n]+" -> "" //@normalize-stderr-test: "\n +[0-9]+:[^\n]+" -> ""
//@normalize-stderr-test: "\n +at [^\n]+" -> "" //@normalize-stderr-test: "\n +at [^\n]+" -> ""
//@[definition,both]error-in-other-file: aborted execution //@[definition,both]error-in-other-file: aborted execution
#![feature(rustc_attrs, c_unwind)] #![feature(rustc_attrs)]
#[cfg_attr(any(definition, both), rustc_nounwind)] #[cfg_attr(any(definition, both), rustc_nounwind)]
#[no_mangle] #[no_mangle]

View File

@ -1,5 +1,3 @@
#![feature(c_unwind)]
//! Unwinding when the caller ABI is "C" (without "-unwind") is UB. //! Unwinding when the caller ABI is "C" (without "-unwind") is UB.
// The opposite version (callee does not allow unwinding) is impossible to // The opposite version (callee does not allow unwinding) is impossible to
// even write: MIR validation catches functions that have `UnwindContinue` but // even write: MIR validation catches functions that have `UnwindContinue` but

View File

@ -7,8 +7,6 @@
// Enable MIR inlining to ensure that `TerminatorKind::UnwindTerminate` is generated // Enable MIR inlining to ensure that `TerminatorKind::UnwindTerminate` is generated
// instead of just `UnwindAction::Terminate`. // instead of just `UnwindAction::Terminate`.
#![feature(c_unwind)]
struct Foo; struct Foo;
impl Drop for Foo { impl Drop for Foo {

View File

@ -3,8 +3,6 @@
//@normalize-stderr-test: "\| +\^+" -> "| ^" //@normalize-stderr-test: "\| +\^+" -> "| ^"
//@normalize-stderr-test: "\n +[0-9]+:[^\n]+" -> "" //@normalize-stderr-test: "\n +[0-9]+:[^\n]+" -> ""
//@normalize-stderr-test: "\n +at [^\n]+" -> "" //@normalize-stderr-test: "\n +at [^\n]+" -> ""
#![feature(c_unwind)]
extern "C" fn panic_abort() { extern "C" fn panic_abort() {
panic!() panic!()
} }

View File

@ -2,7 +2,7 @@
// found in this form" errors works without `-C prefer-dynamic` (`panic!` calls foreign function // found in this form" errors works without `-C prefer-dynamic` (`panic!` calls foreign function
// `__rust_start_panic`). // `__rust_start_panic`).
// no-prefer-dynamic // no-prefer-dynamic
#![feature(c_unwind, unboxed_closures)] #![feature(unboxed_closures)]
use std::panic; use std::panic;

View File

@ -1,5 +1,5 @@
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: -O //@ compile-flags: -O -C panic=abort
//@ compile-flags: --target aarch64-unknown-linux-gnu //@ compile-flags: --target aarch64-unknown-linux-gnu
//@ needs-llvm-components: aarch64 //@ needs-llvm-components: aarch64

View File

@ -1,5 +1,5 @@
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: -O //@ compile-flags: -O -C panic=abort
//@ compile-flags: --target armv7-unknown-linux-gnueabihf //@ compile-flags: --target armv7-unknown-linux-gnueabihf
//@ compile-flags: -C target-feature=+neon //@ compile-flags: -C target-feature=+neon
//@ needs-llvm-components: arm //@ needs-llvm-components: arm

View File

@ -1,6 +1,6 @@
//@ revisions: x86_64 i686 //@ revisions: x86_64 i686
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: -O //@ compile-flags: -O -C panic=abort
//@[x86_64] compile-flags: --target x86_64-unknown-linux-gnu //@[x86_64] compile-flags: --target x86_64-unknown-linux-gnu
//@[x86_64] needs-llvm-components: x86 //@[x86_64] needs-llvm-components: x86
//@[i686] compile-flags: --target i686-unknown-linux-gnu //@[i686] compile-flags: --target i686-unknown-linux-gnu

View File

@ -11,7 +11,7 @@
//@ [aarch64] needs-llvm-components: aarch64 //@ [aarch64] needs-llvm-components: aarch64
//@ [aarch64] min-llvm-version: 18.0 //@ [aarch64] min-llvm-version: 18.0
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -4,7 +4,7 @@
//@ [x86-avx512] needs-llvm-components: x86 //@ [x86-avx512] needs-llvm-components: x86
//@ [x86-avx512] min-llvm-version: 18.0 //@ [x86-avx512] min-llvm-version: 18.0
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -6,7 +6,7 @@
//@ [x86-avx512] compile-flags: -C target-feature=+avx512f,+avx512vl,+avx512bw,+avx512dq //@ [x86-avx512] compile-flags: -C target-feature=+avx512f,+avx512vl,+avx512bw,+avx512dq
//@ [x86-avx512] needs-llvm-components: x86 //@ [x86-avx512] needs-llvm-components: x86
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -8,7 +8,7 @@
//@ [aarch64] needs-llvm-components: aarch64 //@ [aarch64] needs-llvm-components: aarch64
//@ [aarch64] min-llvm-version: 18.0 //@ [aarch64] min-llvm-version: 18.0
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -6,7 +6,7 @@
//@ [x86-avx512] compile-flags: -C target-feature=+avx512f,+avx512vl,+avx512bw,+avx512dq //@ [x86-avx512] compile-flags: -C target-feature=+avx512f,+avx512vl,+avx512bw,+avx512dq
//@ [x86-avx512] needs-llvm-components: x86 //@ [x86-avx512] needs-llvm-components: x86
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -4,7 +4,7 @@
//@ [x86-avx512] needs-llvm-components: x86 //@ [x86-avx512] needs-llvm-components: x86
//@ [x86-avx512] min-llvm-version: 18.0 //@ [x86-avx512] min-llvm-version: 18.0
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -9,7 +9,7 @@
//@ [aarch64] needs-llvm-components: aarch64 //@ [aarch64] needs-llvm-components: aarch64
//@ [aarch64] min-llvm-version: 18.0 //@ [aarch64] min-llvm-version: 18.0
//@ assembly-output: emit-asm //@ assembly-output: emit-asm
//@ compile-flags: --crate-type=lib -O //@ compile-flags: --crate-type=lib -O -C panic=abort
#![feature(no_core, lang_items, repr_simd, intrinsics)] #![feature(no_core, lang_items, repr_simd, intrinsics)]
#![no_core] #![no_core]

View File

@ -6,12 +6,12 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(core_intrinsics)] #![feature(core_intrinsics)]
#![feature(rustc_attrs)]
extern "C-unwind" {
fn may_panic();
}
extern "C" { extern "C" {
fn may_panic();
#[rustc_nounwind]
fn log_number(number: usize); fn log_number(number: usize);
} }

View File

@ -1,9 +1,9 @@
// ignore-tidy-linelength // ignore-tidy-linelength
//@ revisions:i686-linux x86_64-linux //@ revisions:i686-linux x86_64-linux
//@[i686-linux] compile-flags: --target i686-unknown-linux-gnu //@[i686-linux] compile-flags: --target i686-unknown-linux-gnu -C panic=abort
//@[i686-linux] needs-llvm-components: x86 //@[i686-linux] needs-llvm-components: x86
//@[x86_64-linux] compile-flags: --target x86_64-unknown-linux-gnu //@[x86_64-linux] compile-flags: --target x86_64-unknown-linux-gnu -C panic=abort
//@[x86_64-linux] needs-llvm-components: x86 //@[x86_64-linux] needs-llvm-components: x86
// Tests that we correctly copy arguments into allocas when the alignment of the byval argument // Tests that we correctly copy arguments into allocas when the alignment of the byval argument

View File

@ -1,4 +1,4 @@
//@ compile-flags: -O --target=avr-unknown-gnu-atmega328 --crate-type=rlib //@ compile-flags: -O --target=avr-unknown-gnu-atmega328 --crate-type=rlib -C panic=abort
//@ needs-llvm-components: avr //@ needs-llvm-components: avr
// This test validates that function pointers can be stored in global variables // This test validates that function pointers can be stored in global variables

View File

@ -14,7 +14,6 @@
//@ ignore-loongarch64 FIXME //@ ignore-loongarch64 FIXME
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
extern "C" { extern "C" {
fn bar(); fn bar();

View File

@ -4,7 +4,6 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_variadic)] #![feature(c_variadic)]
#![feature(c_unwind)]
#![no_std] #![no_std]
use core::ffi::VaList; use core::ffi::VaList;

View File

@ -1,4 +1,4 @@
//@ compile-flags: -g -O //@ compile-flags: -g -O -C panic=abort
// Check that each inline call site for the same function uses the same "sub-program" so that LLVM // Check that each inline call site for the same function uses the same "sub-program" so that LLVM
// can correctly merge the debug info if it merges the inlined code (e.g., for merging of tail // can correctly merge the debug info if it merges the inlined code (e.g., for merging of tail

View File

@ -1,4 +1,4 @@
//@ compile-flags: --target riscv64gc-unknown-linux-gnu -O -C no-prepopulate-passes //@ compile-flags: --target riscv64gc-unknown-linux-gnu -O -C no-prepopulate-passes -C panic=abort
//@ needs-llvm-components: riscv //@ needs-llvm-components: riscv
#![crate_type = "lib"] #![crate_type = "lib"]

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: arm //@ needs-llvm-components: arm
//@ compile-flags: --target=armv7-unknown-linux-gnueabihf --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=armv7-unknown-linux-gnueabihf --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind)] #![feature(no_core, lang_items)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -4,7 +4,6 @@
// when the code is compiled with `panic=abort`. // when the code is compiled with `panic=abort`.
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
// CHECK: @rust_item_that_can_unwind() unnamed_addr [[ATTR0:#[0-9]+]] // CHECK: @rust_item_that_can_unwind() unnamed_addr [[ATTR0:#[0-9]+]]
#[no_mangle] #[no_mangle]

View File

@ -6,7 +6,6 @@
// to prevent LLVM from inferring the attribute. // to prevent LLVM from inferring the attribute.
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { // CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 {
#[no_mangle] #[no_mangle]

View File

@ -6,7 +6,6 @@
// disable optimizations above to prevent LLVM from inferring the attribute. // disable optimizations above to prevent LLVM from inferring the attribute.
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { // CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 {
#[no_mangle] #[no_mangle]

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: x86 //@ needs-llvm-components: x86
//@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind)] #![feature(no_core, lang_items)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -1,17 +0,0 @@
//@ compile-flags: -C opt-level=0
//@ needs-unwind
#![crate_type = "lib"]
// We disable optimizations to prevent LLVM from inferring the attribute.
extern "C" {
fn bar();
}
// CHECK-NOT: Function Attrs:{{.*}}nounwind
pub unsafe extern "C" fn foo() {
bar();
}
// Note that this test will get removed when `C-unwind` is fully stabilized

View File

@ -2,7 +2,6 @@
//@ needs-unwind //@ needs-unwind
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
// We disable optimizations to prevent LLVM from inferring the attribute. // We disable optimizations to prevent LLVM from inferring the attribute.

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: x86 //@ needs-llvm-components: x86
//@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind)] #![feature(no_core, lang_items)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -6,7 +6,6 @@
// optimizations above to prevent LLVM from inferring the attribute. // optimizations above to prevent LLVM from inferring the attribute.
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { // CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 {
#[no_mangle] #[no_mangle]

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: x86 //@ needs-llvm-components: x86
//@ compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind)] #![feature(no_core, lang_items)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: x86 //@ needs-llvm-components: x86
//@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind)] #![feature(no_core, lang_items)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: x86 //@ needs-llvm-components: x86
//@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind, abi_vectorcall)] #![feature(no_core, lang_items, abi_vectorcall)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -1,7 +1,7 @@
//@ needs-llvm-components: x86 //@ needs-llvm-components: x86
//@ compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib -Cno-prepopulate-passes //@ compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib -Cno-prepopulate-passes
#![no_core] #![no_core]
#![feature(no_core, lang_items, c_unwind)] #![feature(no_core, lang_items)]
#[lang = "sized"] #[lang = "sized"]
trait Sized {} trait Sized {}

View File

@ -1,7 +1,6 @@
//@ compile-flags: -C panic=abort //@ compile-flags: -C panic=abort
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
extern "C-unwind" { extern "C-unwind" {
fn bar(); fn bar();

View File

@ -2,7 +2,6 @@
//@ needs-unwind //@ needs-unwind
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
// Make sure these all do *not* get the attribute. // Make sure these all do *not* get the attribute.
// We disable optimizations to prevent LLVM from inferring the attribute. // We disable optimizations to prevent LLVM from inferring the attribute.

View File

@ -2,7 +2,6 @@
//@ needs-unwind //@ needs-unwind
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(c_unwind)]
extern "C" { extern "C" {
// CHECK: Function Attrs:{{.*}}nounwind // CHECK: Function Attrs:{{.*}}nounwind

View File

@ -3,12 +3,12 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(core_intrinsics)] #![feature(core_intrinsics)]
#![feature(rustc_attrs)]
extern "C-unwind" {
fn may_panic();
}
extern "C" { extern "C" {
fn may_panic();
#[rustc_nounwind]
fn log_number(number: usize); fn log_number(number: usize);
} }

View File

@ -1,5 +1,5 @@
Function name: abort::main Function name: abort::main
Raw bytes (89): 0x[01, 01, 0a, 01, 27, 05, 09, 03, 0d, 22, 11, 03, 0d, 03, 0d, 22, 15, 03, 0d, 03, 0d, 05, 09, 0d, 01, 0e, 01, 01, 1b, 03, 02, 0b, 00, 18, 22, 01, 0c, 00, 19, 11, 00, 1a, 02, 0a, 0e, 02, 0a, 00, 0b, 22, 02, 0c, 00, 19, 15, 00, 1a, 00, 31, 1a, 00, 31, 00, 32, 22, 04, 0c, 00, 19, 05, 00, 1a, 00, 31, 09, 00, 31, 00, 32, 27, 01, 09, 00, 17, 0d, 02, 05, 01, 02] Raw bytes (89): 0x[01, 01, 0a, 01, 27, 05, 09, 03, 0d, 22, 11, 03, 0d, 03, 0d, 22, 15, 03, 0d, 03, 0d, 05, 09, 0d, 01, 0d, 01, 01, 1b, 03, 02, 0b, 00, 18, 22, 01, 0c, 00, 19, 11, 00, 1a, 02, 0a, 0e, 02, 0a, 00, 0b, 22, 02, 0c, 00, 19, 15, 00, 1a, 00, 31, 1a, 00, 31, 00, 32, 22, 04, 0c, 00, 19, 05, 00, 1a, 00, 31, 09, 00, 31, 00, 32, 27, 01, 09, 00, 17, 0d, 02, 05, 01, 02]
Number of files: 1 Number of files: 1
- file 0 => global file 1 - file 0 => global file 1
Number of expressions: 10 Number of expressions: 10
@ -14,7 +14,7 @@ Number of expressions: 10
- expression 8 operands: lhs = Expression(0, Add), rhs = Counter(3) - expression 8 operands: lhs = Expression(0, Add), rhs = Counter(3)
- expression 9 operands: lhs = Counter(1), rhs = Counter(2) - expression 9 operands: lhs = Counter(1), rhs = Counter(2)
Number of file 0 mappings: 13 Number of file 0 mappings: 13
- Code(Counter(0)) at (prev + 14, 1) to (start + 1, 27) - Code(Counter(0)) at (prev + 13, 1) to (start + 1, 27)
- Code(Expression(0, Add)) at (prev + 2, 11) to (start + 0, 24) - Code(Expression(0, Add)) at (prev + 2, 11) to (start + 0, 24)
= (c0 + (c1 + c2)) = (c0 + (c1 + c2))
- Code(Expression(8, Sub)) at (prev + 1, 12) to (start + 0, 25) - Code(Expression(8, Sub)) at (prev + 1, 12) to (start + 0, 25)
@ -36,13 +36,13 @@ Number of file 0 mappings: 13
- Code(Counter(3)) at (prev + 2, 5) to (start + 1, 2) - Code(Counter(3)) at (prev + 2, 5) to (start + 1, 2)
Function name: abort::might_abort Function name: abort::might_abort
Raw bytes (21): 0x[01, 01, 01, 01, 05, 03, 01, 04, 01, 01, 14, 05, 02, 09, 01, 24, 02, 02, 0c, 03, 02] Raw bytes (21): 0x[01, 01, 01, 01, 05, 03, 01, 03, 01, 01, 14, 05, 02, 09, 01, 24, 02, 02, 0c, 03, 02]
Number of files: 1 Number of files: 1
- file 0 => global file 1 - file 0 => global file 1
Number of expressions: 1 Number of expressions: 1
- expression 0 operands: lhs = Counter(0), rhs = Counter(1) - expression 0 operands: lhs = Counter(0), rhs = Counter(1)
Number of file 0 mappings: 3 Number of file 0 mappings: 3
- Code(Counter(0)) at (prev + 4, 1) to (start + 1, 20) - Code(Counter(0)) at (prev + 3, 1) to (start + 1, 20)
- Code(Counter(1)) at (prev + 2, 9) to (start + 1, 36) - Code(Counter(1)) at (prev + 2, 9) to (start + 1, 36)
- Code(Expression(0, Sub)) at (prev + 2, 12) to (start + 3, 2) - Code(Expression(0, Sub)) at (prev + 2, 12) to (start + 3, 2)
= (c0 - c1) = (c0 - c1)

View File

@ -1,4 +1,3 @@
LL| |#![feature(c_unwind)]
LL| |#![allow(unused_assignments)] LL| |#![allow(unused_assignments)]
LL| | LL| |
LL| 12|extern "C" fn might_abort(should_abort: bool) { LL| 12|extern "C" fn might_abort(should_abort: bool) {

View File

@ -1,4 +1,3 @@
#![feature(c_unwind)]
#![allow(unused_assignments)] #![allow(unused_assignments)]
extern "C" fn might_abort(should_abort: bool) { extern "C" fn might_abort(should_abort: bool) {

View File

@ -1,6 +1,5 @@
// Tests that forced unwind through POF Rust frames wouldn't trigger our terminating guards. // Tests that forced unwind through POF Rust frames wouldn't trigger our terminating guards.
#![feature(c_unwind)]
#![no_main] #![no_main]
extern "C-unwind" { extern "C-unwind" {

View File

@ -16,7 +16,7 @@ impl Drop for Foo<'_> {
} }
} }
extern "C" fn panicky() { extern "C-unwind" fn panicky() {
resume_unwind(Box::new(())); resume_unwind(Box::new(()));
} }

View File

@ -16,7 +16,7 @@ impl Drop for Foo<'_> {
} }
} }
extern "C" fn panicky() { extern "C-unwind" fn panicky() {
resume_unwind(Box::new(())); resume_unwind(Box::new(()));
} }

View File

@ -1,4 +1,4 @@
#![feature(c_unwind, const_extern_fn)] #![feature(const_extern_fn)]
const extern "C" fn foo() { const extern "C" fn foo() {
panic!() //~ ERROR evaluation of constant value failed panic!() //~ ERROR evaluation of constant value failed

View File

@ -1,6 +1,6 @@
//@ check-pass //@ check-pass
#![feature(c_unwind, const_extern_fn)] #![feature(const_extern_fn)]
// We don't unwind in const-eval anyways. // We don't unwind in const-eval anyways.
const extern "C" fn foo() { const extern "C" fn foo() {

View File

@ -4,7 +4,6 @@
//@[next] compile-flags: -Znext-solver //@[next] compile-flags: -Znext-solver
#![allow(unused_must_use)] #![allow(unused_must_use)]
#![feature(c_unwind)]
#![feature(panic_always_abort)] #![feature(panic_always_abort)]
// Since we mark some ABIs as "nounwind" to LLVM, we must make sure that // Since we mark some ABIs as "nounwind" to LLVM, we must make sure that
// we never unwind through them. // we never unwind through them.

View File

@ -7,7 +7,6 @@
//@ normalize-stderr-test: "(core/src/panicking\.rs):[0-9]+:[0-9]+" -> "$1:$$LINE:$$COL" //@ normalize-stderr-test: "(core/src/panicking\.rs):[0-9]+:[0-9]+" -> "$1:$$LINE:$$COL"
//@ needs-unwind //@ needs-unwind
//@ ignore-emscripten "RuntimeError" junk in output //@ ignore-emscripten "RuntimeError" junk in output
#![feature(c_unwind)]
extern "C" fn panic_in_ffi() { extern "C" fn panic_in_ffi() {
panic!("Test"); panic!("Test");

View File

@ -1,4 +1,4 @@
thread 'main' panicked at $DIR/panic-in-ffi.rs:13:5: thread 'main' panicked at $DIR/panic-in-ffi.rs:12:5:
Test Test
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'main' panicked at library/core/src/panicking.rs:$LINE:$COL: thread 'main' panicked at library/core/src/panicking.rs:$LINE:$COL:

View File

@ -1,4 +0,0 @@
//@ ignore-test
// After partial stabilisation, `c_unwind` only contains codegen behaviour changes
// and are tested in `src/test/codegen/unwind-abis`