From 3e841833530b35b0faec020d1dedf1bbc53b3c69 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 28 Apr 2021 14:49:39 -0400 Subject: [PATCH 1/4] Revert "address pr review comments" This reverts commit 05bf037fecfad619e140877769379a1d24952bad. --- compiler/rustc_middle/src/ty/layout.rs | 20 +------------------ compiler/rustc_mir_build/src/build/mod.rs | 18 +---------------- compiler/rustc_target/src/spec/abi.rs | 15 ++------------ .../src/language-features/c-unwind.md | 3 +-- 4 files changed, 5 insertions(+), 51 deletions(-) diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index 814581a6cf171..ee2dffd8baeb9 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -2595,25 +2595,7 @@ fn fn_can_unwind( C { unwind } | Stdcall { unwind } | System { unwind } | Thiscall { unwind } => { unwind } - Cdecl - | Fastcall - | Vectorcall - | Aapcs - | Win64 - | SysV64 - | PtxKernel - | Msp430Interrupt - | X86Interrupt - | AmdGpuKernel - | EfiApi - | AvrInterrupt - | AvrNonBlockingInterrupt - | CCmseNonSecureCall - | RustIntrinsic - | PlatformIntrinsic - | Unadjusted => false, - // In the `if` above, we checked for functions with the Rust calling convention. - Rust | RustCall => unreachable!(), + _ => false, } } } diff --git a/compiler/rustc_mir_build/src/build/mod.rs b/compiler/rustc_mir_build/src/build/mod.rs index 9f1de3349a56e..665e2e52d14e5 100644 --- a/compiler/rustc_mir_build/src/build/mod.rs +++ b/compiler/rustc_mir_build/src/build/mod.rs @@ -590,23 +590,7 @@ fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, abi: Abi) -> bo // Rust and `rust-call` functions are allowed to unwind, and should not abort. Rust | RustCall => false, // Other ABI's should abort. - Cdecl - | Fastcall - | Vectorcall - | Aapcs - | Win64 - | SysV64 - | PtxKernel - | Msp430Interrupt - | X86Interrupt - | AmdGpuKernel - | EfiApi - | AvrInterrupt - | AvrNonBlockingInterrupt - | CCmseNonSecureCall - | RustIntrinsic - | PlatformIntrinsic - | Unadjusted => true, + _ => true, } } } diff --git a/compiler/rustc_target/src/spec/abi.rs b/compiler/rustc_target/src/spec/abi.rs index 17eb33b8f2eaa..f7f9c30d3b7a6 100644 --- a/compiler/rustc_target/src/spec/abi.rs +++ b/compiler/rustc_target/src/spec/abi.rs @@ -107,7 +107,7 @@ impl Abi { // N.B., this ordering MUST match the AbiDatas array above. // (This is ensured by the test indices_are_correct().) use Abi::*; - let i = match self { + match self { // Cross-platform ABIs Rust => 0, C { unwind: false } => 1, @@ -138,18 +138,7 @@ impl Abi { RustCall => 24, PlatformIntrinsic => 25, Unadjusted => 26, - }; - debug_assert!( - AbiDatas - .iter() - .enumerate() - .find(|(_, AbiData { abi, .. })| *abi == self) - .map(|(index, _)| index) - .expect("abi variant has associated data") - == i, - "Abi index did not match `AbiDatas` ordering" - ); - i + } } #[inline] diff --git a/src/doc/unstable-book/src/language-features/c-unwind.md b/src/doc/unstable-book/src/language-features/c-unwind.md index 2801d9b5e7778..c1705d59acc21 100644 --- a/src/doc/unstable-book/src/language-features/c-unwind.md +++ b/src/doc/unstable-book/src/language-features/c-unwind.md @@ -6,8 +6,7 @@ The tracking issue for this feature is: [#74990] ------------------------ -Introduces four new ABI strings: "C-unwind", "stdcall-unwind", -"thiscall-unwind", and "system-unwind". These enable unwinding from other +Introduces a new ABI string, "C-unwind", to enable unwinding from other languages (such as C++) into Rust frames and from Rust into other languages. See [RFC 2945] for more information. From bfbcf87aacdf69533ee23b337a6617da603ad34a Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 28 Apr 2021 14:49:54 -0400 Subject: [PATCH 2/4] Revert "add integration tests, unwind across FFI boundary" This reverts commit baf227ea0c1e07fc54395a51e4b3881d701180cb. --- .../c-unwind-abi-catch-lib-panic/Makefile | 30 ------------- .../c-unwind-abi-catch-lib-panic/add.c | 12 ----- .../c-unwind-abi-catch-lib-panic/main.rs | 35 --------------- .../c-unwind-abi-catch-lib-panic/panic.rs | 12 ----- .../c-unwind-abi-catch-panic/Makefile | 5 --- .../c-unwind-abi-catch-panic/add.c | 12 ----- .../c-unwind-abi-catch-panic/main.rs | 44 ------------------- .../no_std-alloc-error-handler-custom.rs | 9 +--- .../no_std-alloc-error-handler-default.rs | 9 +--- src/test/ui/symbol-names/impl1.rs | 4 ++ 10 files changed, 6 insertions(+), 166 deletions(-) delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c delete mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile deleted file mode 100644 index a8515c533af57..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile +++ /dev/null @@ -1,30 +0,0 @@ --include ../tools.mk - -all: archive - # Compile `main.rs`, which will link into our library, and run it. - $(RUSTC) main.rs - $(call RUN,main) - -ifdef IS_MSVC -archive: add.o panic.o - # Now, create an archive using these two objects. - $(AR) crus $(TMPDIR)/add.lib $(TMPDIR)/add.o $(TMPDIR)/panic.o -else -archive: add.o panic.o - # Now, create an archive using these two objects. - $(AR) crus $(TMPDIR)/libadd.a $(TMPDIR)/add.o $(TMPDIR)/panic.o -endif - -# Compile `panic.rs` into an object file. -# -# Note that we invoke `rustc` directly, so we may emit an object rather -# than an archive. We'll do that later. -panic.o: - $(BARE_RUSTC) $(RUSTFLAGS) \ - --out-dir $(TMPDIR) \ - --emit=obj panic.rs - -# Compile `add.c` into an object file. -add.o: - $(call COMPILE_OBJ,$(TMPDIR)/add.o,add.c) - diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c deleted file mode 100644 index 444359451f6ec..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef _WIN32 -__declspec(dllexport) -#endif - -// An external function, defined in Rust. -extern void panic_if_greater_than_10(unsigned x); - -unsigned add_small_numbers(unsigned a, unsigned b) { - unsigned c = a + b; - panic_if_greater_than_10(c); - return c; -} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs deleted file mode 100644 index 78a71219c7811..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs +++ /dev/null @@ -1,35 +0,0 @@ -//! A test for calling `C-unwind` functions across foreign function boundaries. -//! -//! This test triggers a panic in a Rust library that our foreign function invokes. This shows -//! that we can unwind through the C code in that library, and catch the underlying panic. -#![feature(c_unwind)] - -use std::panic::{catch_unwind, AssertUnwindSafe}; - -fn main() { - // Call `add_small_numbers`, passing arguments that will NOT trigger a panic. - let (a, b) = (9, 1); - let c = unsafe { add_small_numbers(a, b) }; - assert_eq!(c, 10); - - // Call `add_small_numbers`, passing arguments that will trigger a panic, and catch it. - let caught_unwind = catch_unwind(AssertUnwindSafe(|| { - let (a, b) = (10, 1); - let _c = unsafe { add_small_numbers(a, b) }; - unreachable!("should have unwound instead of returned"); - })); - - // Assert that we did indeed panic, then unwrap and downcast the panic into the sum. - assert!(caught_unwind.is_err()); - let panic_obj = caught_unwind.unwrap_err(); - let msg = panic_obj.downcast_ref::().unwrap(); - assert_eq!(msg, "11"); -} - -#[link(name = "add", kind = "static")] -extern "C-unwind" { - /// An external function, defined in C. - /// - /// Returns the sum of two numbers, or panics if the sum is greater than 10. - fn add_small_numbers(a: u32, b: u32) -> u32; -} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs deleted file mode 100644 index a99a04d5c6f4b..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs +++ /dev/null @@ -1,12 +0,0 @@ -#![crate_type = "staticlib"] -#![feature(c_unwind)] - -/// This function will panic if `x` is greater than 10. -/// -/// This function is called by `add_small_numbers`. -#[no_mangle] -pub extern "C-unwind" fn panic_if_greater_than_10(x: u32) { - if x > 10 { - panic!("{}", x); // That is too big! - } -} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile deleted file mode 100644 index 9553b7aeeb983..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile +++ /dev/null @@ -1,5 +0,0 @@ --include ../tools.mk - -all: $(call NATIVE_STATICLIB,add) - $(RUSTC) main.rs - $(call RUN,main) || exit 1 diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c deleted file mode 100644 index 444359451f6ec..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef _WIN32 -__declspec(dllexport) -#endif - -// An external function, defined in Rust. -extern void panic_if_greater_than_10(unsigned x); - -unsigned add_small_numbers(unsigned a, unsigned b) { - unsigned c = a + b; - panic_if_greater_than_10(c); - return c; -} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs deleted file mode 100644 index 15d38d7216058..0000000000000 --- a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs +++ /dev/null @@ -1,44 +0,0 @@ -//! A test for calling `C-unwind` functions across foreign function boundaries. -//! -//! This test triggers a panic when calling a foreign function that calls *back* into Rust. -#![feature(c_unwind)] - -use std::panic::{catch_unwind, AssertUnwindSafe}; - -fn main() { - // Call `add_small_numbers`, passing arguments that will NOT trigger a panic. - let (a, b) = (9, 1); - let c = unsafe { add_small_numbers(a, b) }; - assert_eq!(c, 10); - - // Call `add_small_numbers`, passing arguments that will trigger a panic, and catch it. - let caught_unwind = catch_unwind(AssertUnwindSafe(|| { - let (a, b) = (10, 1); - let _c = unsafe { add_small_numbers(a, b) }; - unreachable!("should have unwound instead of returned"); - })); - - // Assert that we did indeed panic, then unwrap and downcast the panic into the sum. - assert!(caught_unwind.is_err()); - let panic_obj = caught_unwind.unwrap_err(); - let msg = panic_obj.downcast_ref::().unwrap(); - assert_eq!(msg, "11"); -} - -#[link(name = "add", kind = "static")] -extern "C-unwind" { - /// An external function, defined in C. - /// - /// Returns the sum of two numbers, or panics if the sum is greater than 10. - fn add_small_numbers(a: u32, b: u32) -> u32; -} - -/// This function will panic if `x` is greater than 10. -/// -/// This function is called by `add_small_numbers`. -#[no_mangle] -pub extern "C-unwind" fn panic_if_greater_than_10(x: u32) { - if x > 10 { - panic!("{}", x); // That is too big! - } -} diff --git a/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs b/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs index c9b4abbfd3fd3..4d40c7d0d2237 100644 --- a/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs +++ b/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs @@ -7,7 +7,7 @@ // compile-flags:-C panic=abort // aux-build:helper.rs -#![feature(start, rustc_private, new_uninit, panic_info_message, lang_items)] +#![feature(start, rustc_private, new_uninit, panic_info_message)] #![feature(alloc_error_handler)] #![no_std] @@ -84,13 +84,6 @@ fn panic(panic_info: &core::panic::PanicInfo) -> ! { } } -// Because we are compiling this code with `-C panic=abort`, this wouldn't normally be needed. -// However, `core` and `alloc` are both compiled with `-C panic=unwind`, which means that functions -// in these libaries will refer to `rust_eh_personality` if LLVM can not *prove* the contents won't -// unwind. So, for this test case we will define the symbol. -#[lang = "eh_personality"] -extern fn rust_eh_personality() {} - #[derive(Debug)] struct Page([[u64; 32]; 16]); diff --git a/src/test/ui/allocator/no_std-alloc-error-handler-default.rs b/src/test/ui/allocator/no_std-alloc-error-handler-default.rs index d6cd4a6af855f..4f8c44f1763c8 100644 --- a/src/test/ui/allocator/no_std-alloc-error-handler-default.rs +++ b/src/test/ui/allocator/no_std-alloc-error-handler-default.rs @@ -8,7 +8,7 @@ // aux-build:helper.rs // gate-test-default_alloc_error_handler -#![feature(start, rustc_private, new_uninit, panic_info_message, lang_items)] +#![feature(start, rustc_private, new_uninit, panic_info_message)] #![feature(default_alloc_error_handler)] #![no_std] @@ -71,13 +71,6 @@ fn panic(panic_info: &core::panic::PanicInfo) -> ! { } } -// Because we are compiling this code with `-C panic=abort`, this wouldn't normally be needed. -// However, `core` and `alloc` are both compiled with `-C panic=unwind`, which means that functions -// in these libaries will refer to `rust_eh_personality` if LLVM can not *prove* the contents won't -// unwind. So, for this test case we will define the symbol. -#[lang = "eh_personality"] -extern fn rust_eh_personality() {} - #[derive(Debug)] struct Page([[u64; 32]; 16]); diff --git a/src/test/ui/symbol-names/impl1.rs b/src/test/ui/symbol-names/impl1.rs index 771695330d8bd..d3f74c4a4b7b0 100644 --- a/src/test/ui/symbol-names/impl1.rs +++ b/src/test/ui/symbol-names/impl1.rs @@ -74,3 +74,7 @@ fn main() { } }; } + +// FIXME(katie): The 32-bit symbol hash probably needs updating as well, but I'm slightly unsure +// about how to do that. This comment is here so that we don't break the test due to error messages +// including incorrect line numbers. From a994dcc2fdaa2318332c3629ed2526f0dcd0361f Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 28 Apr 2021 14:50:06 -0400 Subject: [PATCH 3/4] Revert "implement unwinding abi's (RFC 2945)" This reverts commit 0f33e9f2816358a4d8afd02af35bd23a4d6d0857. --- compiler/rustc_middle/src/ty/layout.rs | 29 +++++++--------- compiler/rustc_mir_build/src/build/mod.rs | 22 +++---------- .../unwind-abis/c-unwind-abi-panic-abort.rs | 18 ---------- src/test/codegen/unwind-abis/c-unwind-abi.rs | 29 ---------------- .../codegen/unwind-abis/stdcall-unwind-abi.rs | 32 ------------------ .../codegen/unwind-abis/system-unwind-abi.rs | 29 ---------------- .../unwind-abis/thiscall-unwind-abi.rs | 33 ------------------- 7 files changed, 16 insertions(+), 176 deletions(-) delete mode 100644 src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs delete mode 100644 src/test/codegen/unwind-abis/c-unwind-abi.rs delete mode 100644 src/test/codegen/unwind-abis/stdcall-unwind-abi.rs delete mode 100644 src/test/codegen/unwind-abis/system-unwind-abi.rs delete mode 100644 src/test/codegen/unwind-abis/thiscall-unwind-abi.rs diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index ee2dffd8baeb9..2f5380861c495 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -2562,7 +2562,6 @@ fn fn_can_unwind( panic_strategy: PanicStrategy, codegen_fn_attr_flags: CodegenFnAttrFlags, call_conv: Conv, - abi: SpecAbi, ) -> bool { if panic_strategy != PanicStrategy::Unwind { // In panic=abort mode we assume nothing can unwind anywhere, so @@ -2587,16 +2586,17 @@ fn fn_can_unwind( // // 2. A Rust item using a non-Rust ABI (like `extern "C" fn foo() { ... }`). // - // In both of these cases, we should refer to the ABI to determine whether or not we - // should unwind. See Rust RFC 2945 for more information on this behavior, here: - // https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md - use SpecAbi::*; - match abi { - C { unwind } | Stdcall { unwind } | System { unwind } | Thiscall { unwind } => { - unwind - } - _ => false, - } + // Foreign items (case 1) are assumed to not unwind; it is + // UB otherwise. (At least for now; see also + // rust-lang/rust#63909 and Rust RFC 2753.) + // + // Items defined in Rust with non-Rust ABIs (case 2) are also + // not supposed to unwind. Whether this should be enforced + // (versus stating it is UB) and *how* it would be enforced + // is currently under discussion; see rust-lang/rust#58794. + // + // In either case, we mark item as explicitly nounwind. + false } } } @@ -2823,12 +2823,7 @@ where c_variadic: sig.c_variadic, fixed_count: inputs.len(), conv, - can_unwind: fn_can_unwind( - cx.tcx().sess.panic_strategy(), - codegen_fn_attr_flags, - conv, - sig.abi, - ), + can_unwind: fn_can_unwind(cx.tcx().sess.panic_strategy(), codegen_fn_attr_flags, conv), }; fn_abi.adjust_for_abi(cx, sig.abi); debug!("FnAbi::new_internal = {:?}", fn_abi); diff --git a/compiler/rustc_mir_build/src/build/mod.rs b/compiler/rustc_mir_build/src/build/mod.rs index 665e2e52d14e5..436be438edd7c 100644 --- a/compiler/rustc_mir_build/src/build/mod.rs +++ b/compiler/rustc_mir_build/src/build/mod.rs @@ -563,7 +563,7 @@ macro_rules! unpack { }}; } -fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, abi: Abi) -> bool { +fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, _abi: Abi) -> bool { // Validate `#[unwind]` syntax regardless of platform-specific panic strategy. let attrs = &tcx.get_attrs(fn_def_id.to_def_id()); let unwind_attr = attr::find_unwind_attr(&tcx.sess, attrs); @@ -573,26 +573,12 @@ fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, abi: Abi) -> bo return false; } + // This is a special case: some functions have a C abi but are meant to + // unwind anyway. Don't stop them. match unwind_attr { - // If an `#[unwind]` attribute was found, we should adhere to it. + None => false, // FIXME(#58794); should be `!(abi == Abi::Rust || abi == Abi::RustCall)` Some(UnwindAttr::Allowed) => false, Some(UnwindAttr::Aborts) => true, - // If no attribute was found and the panic strategy is `unwind`, then we should examine - // the function's ABI string to determine whether it should abort upon panic. - None => { - use Abi::*; - match abi { - // In the case of ABI's that have an `-unwind` equivalent, check whether the ABI - // permits unwinding. If so, we should not abort. Otherwise, we should. - C { unwind } | Stdcall { unwind } | System { unwind } | Thiscall { unwind } => { - !unwind - } - // Rust and `rust-call` functions are allowed to unwind, and should not abort. - Rust | RustCall => false, - // Other ABI's should abort. - _ => true, - } - } } } diff --git a/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs b/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs deleted file mode 100644 index afd65ff6741a6..0000000000000 --- a/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs +++ /dev/null @@ -1,18 +0,0 @@ -// compile-flags: -C panic=abort -C opt-level=0 - -// Test that `nounwind` atributes are applied to `C-unwind` extern functions when the -// code is compiled with `panic=abort`. We disable optimizations above to prevent LLVM from -// inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "C-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make sure that the LLVM attributes for this functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } diff --git a/src/test/codegen/unwind-abis/c-unwind-abi.rs b/src/test/codegen/unwind-abis/c-unwind-abi.rs deleted file mode 100644 index f157653675322..0000000000000 --- a/src/test/codegen/unwind-abis/c-unwind-abi.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C opt-level=0 - -// Test that `nounwind` atributes are correctly applied to exported `C` and `C-unwind` extern -// functions. `C-unwind` functions MUST NOT have this attribute. We disable optimizations above -// to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "C" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "C-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs b/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs deleted file mode 100644 index ed804ca278d2d..0000000000000 --- a/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs +++ /dev/null @@ -1,32 +0,0 @@ -// compile-flags: -C opt-level=0 -// ignore-arm stdcall isn't supported -// ignore-aarch64 stdcall isn't supported -// ignore-riscv64 stdcall isn't supported - -// Test that `nounwind` atributes are correctly applied to exported `stdcall` and `stdcall-unwind` -// extern functions. `stdcall-unwind` functions MUST NOT have this attribute. We disable -// optimizations above to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "stdcall" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "stdcall-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/system-unwind-abi.rs b/src/test/codegen/unwind-abis/system-unwind-abi.rs deleted file mode 100644 index c4d51328352c0..0000000000000 --- a/src/test/codegen/unwind-abis/system-unwind-abi.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C opt-level=0 - -// Test that `nounwind` atributes are correctly applied to exported `system` and `system-unwind` -// extern functions. `system-unwind` functions MUST NOT have this attribute. We disable -// optimizations above to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "system" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "system-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs b/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs deleted file mode 100644 index aaa63ae55c3ac..0000000000000 --- a/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs +++ /dev/null @@ -1,33 +0,0 @@ -// compile-flags: -C opt-level=0 -// ignore-arm thiscall isn't supported -// ignore-aarch64 thiscall isn't supported -// ignore-riscv64 thiscall isn't supported - -// Test that `nounwind` atributes are correctly applied to exported `thiscall` and -// `thiscall-unwind` extern functions. `thiscall-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(abi_thiscall)] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "thiscall" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "thiscall-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } From 6033ccad8f90fd766e02b2484c060758e48e3344 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 28 Apr 2021 14:51:31 -0400 Subject: [PATCH 4/4] Revert "rustc_target: add "unwind" payloads to `Abi`" This reverts commit df45c579de97777617b6f12c77a5e6224f54c897. --- compiler/rustc_ast_lowering/src/item.rs | 8 +-- compiler/rustc_ast_passes/src/feature_gate.rs | 32 --------- .../rustc_codegen_cranelift/src/abi/mod.rs | 7 +- compiler/rustc_feature/src/active.rs | 3 - compiler/rustc_middle/src/ty/layout.rs | 8 +-- .../rustc_mir/src/interpret/terminator.rs | 6 +- compiler/rustc_span/src/symbol.rs | 1 - compiler/rustc_symbol_mangling/src/v0.rs | 2 +- compiler/rustc_target/src/spec/abi.rs | 65 ++++--------------- compiler/rustc_target/src/spec/arm_base.rs | 11 +--- .../src/spec/mipsel_unknown_none.rs | 6 +- compiler/rustc_target/src/spec/mod.rs | 19 ++---- .../src/spec/nvptx64_nvidia_cuda.rs | 6 +- compiler/rustc_target/src/spec/riscv_base.rs | 6 +- compiler/rustc_typeck/src/collect.rs | 2 +- compiler/rustc_typeck/src/lib.rs | 21 +++--- .../src/language-features/c-unwind.md | 14 ---- src/test/ui/codemap_tests/unicode.stderr | 2 +- src/test/ui/parser/issue-8537.stderr | 2 +- src/test/ui/symbol-names/impl1.rs | 4 -- .../feature-gate-c-unwind-enabled.rs | 12 ---- .../ui/unwind-abis/feature-gate-c-unwind.rs | 9 --- .../unwind-abis/feature-gate-c-unwind.stderr | 12 ---- .../feature-gate-stdcall-unwind.rs | 13 ---- .../feature-gate-stdcall-unwind.stderr | 12 ---- .../unwind-abis/feature-gate-system-unwind.rs | 9 --- .../feature-gate-system-unwind.stderr | 12 ---- .../feature-gate-thiscall-unwind.rs | 13 ---- .../feature-gate-thiscall-unwind.stderr | 12 ---- 29 files changed, 52 insertions(+), 277 deletions(-) delete mode 100644 src/doc/unstable-book/src/language-features/c-unwind.md delete mode 100644 src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs delete mode 100644 src/test/ui/unwind-abis/feature-gate-c-unwind.rs delete mode 100644 src/test/ui/unwind-abis/feature-gate-c-unwind.stderr delete mode 100644 src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs delete mode 100644 src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr delete mode 100644 src/test/ui/unwind-abis/feature-gate-system-unwind.rs delete mode 100644 src/test/ui/unwind-abis/feature-gate-system-unwind.stderr delete mode 100644 src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs delete mode 100644 src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs index edd0c5fb9647e..7b043705c1e0e 100644 --- a/compiler/rustc_ast_lowering/src/item.rs +++ b/compiler/rustc_ast_lowering/src/item.rs @@ -319,10 +319,10 @@ impl<'hir> LoweringContext<'_, 'hir> { }, ItemKind::ForeignMod(ref fm) => { if fm.abi.is_none() { - self.maybe_lint_missing_abi(span, id, abi::Abi::C { unwind: false }); + self.maybe_lint_missing_abi(span, id, abi::Abi::C); } hir::ItemKind::ForeignMod { - abi: fm.abi.map_or(abi::Abi::C { unwind: false }, |abi| self.lower_abi(abi)), + abi: fm.abi.map_or(abi::Abi::C, |abi| self.lower_abi(abi)), items: self .arena .alloc_from_iter(fm.items.iter().map(|x| self.lower_foreign_item_ref(x))), @@ -1334,8 +1334,8 @@ impl<'hir> LoweringContext<'_, 'hir> { match ext { Extern::None => abi::Abi::Rust, Extern::Implicit => { - self.maybe_lint_missing_abi(span, id, abi::Abi::C { unwind: false }); - abi::Abi::C { unwind: false } + self.maybe_lint_missing_abi(span, id, abi::Abi::C); + abi::Abi::C } Extern::Explicit(abi) => self.lower_abi(abi), } diff --git a/compiler/rustc_ast_passes/src/feature_gate.rs b/compiler/rustc_ast_passes/src/feature_gate.rs index 0ca9c12f4c133..1b79eafe36109 100644 --- a/compiler/rustc_ast_passes/src/feature_gate.rs +++ b/compiler/rustc_ast_passes/src/feature_gate.rs @@ -164,38 +164,6 @@ impl<'a> PostExpansionVisitor<'a> { "C-cmse-nonsecure-call ABI is experimental and subject to change" ); } - "C-unwind" => { - gate_feature_post!( - &self, - c_unwind, - span, - "C-unwind ABI is experimental and subject to change" - ); - } - "stdcall-unwind" => { - gate_feature_post!( - &self, - c_unwind, - span, - "stdcall-unwind ABI is experimental and subject to change" - ); - } - "system-unwind" => { - gate_feature_post!( - &self, - c_unwind, - span, - "system-unwind ABI is experimental and subject to change" - ); - } - "thiscall-unwind" => { - gate_feature_post!( - &self, - c_unwind, - span, - "thiscall-unwind ABI is experimental and subject to change" - ); - } abi => self .sess .parse_sess diff --git a/compiler/rustc_codegen_cranelift/src/abi/mod.rs b/compiler/rustc_codegen_cranelift/src/abi/mod.rs index b158d73f3a1a8..c79889f8ca1da 100644 --- a/compiler/rustc_codegen_cranelift/src/abi/mod.rs +++ b/compiler/rustc_codegen_cranelift/src/abi/mod.rs @@ -476,11 +476,8 @@ pub(crate) fn codegen_terminator_call<'tcx>( // FIXME find a cleaner way to support varargs if fn_sig.c_variadic { - if !matches!(fn_sig.abi, Abi::C { .. }) { - fx.tcx.sess.span_fatal( - span, - &format!("Variadic call for non-C abi {:?}", fn_sig.abi), - ); + if fn_sig.abi != Abi::C { + fx.tcx.sess.span_fatal(span, &format!("Variadic call for non-C abi {:?}", fn_sig.abi)); } let sig_ref = fx.bcx.func.dfg.call_signature(call_inst).unwrap(); let abi_params = call_args diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 79ec9c264998c..a02117319cc13 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -644,9 +644,6 @@ declare_features! ( /// Allows associated types in inherent impls. (active, inherent_associated_types, "1.52.0", Some(8995), None), - /// Allows `extern "C-unwind" fn` to enable unwinding across ABI boundaries. - (active, c_unwind, "1.52.0", Some(74990), None), - // ------------------------------------------------------------------------- // feature-group-end: actual feature gates // ------------------------------------------------------------------------- diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index 2f5380861c495..6d2ab0e5f5a80 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -2654,14 +2654,14 @@ where RustIntrinsic | PlatformIntrinsic | Rust | RustCall => Conv::Rust, // It's the ABI's job to select this, not ours. - System { .. } => bug!("system abi should be selected elsewhere"), + System => bug!("system abi should be selected elsewhere"), EfiApi => bug!("eficall abi should be selected elsewhere"), - Stdcall { .. } => Conv::X86Stdcall, + Stdcall => Conv::X86Stdcall, Fastcall => Conv::X86Fastcall, Vectorcall => Conv::X86VectorCall, - Thiscall { .. } => Conv::X86ThisCall, - C { .. } => Conv::C, + Thiscall => Conv::X86ThisCall, + C => Conv::C, Unadjusted => Conv::C, Win64 => Conv::X86_64Win64, SysV64 => Conv::X86_64SysV, diff --git a/compiler/rustc_mir/src/interpret/terminator.rs b/compiler/rustc_mir/src/interpret/terminator.rs index 4aa1360d53539..0807949a2d91b 100644 --- a/compiler/rustc_mir/src/interpret/terminator.rs +++ b/compiler/rustc_mir/src/interpret/terminator.rs @@ -248,9 +248,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { }; if normalize_abi(caller_abi) != normalize_abi(callee_abi) { throw_ub_format!( - "calling a function with ABI {} using caller ABI {}", - callee_abi.name(), - caller_abi.name() + "calling a function with ABI {:?} using caller ABI {:?}", + callee_abi, + caller_abi ) } } diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index cd3dabb67950b..5aa6275a96166 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -330,7 +330,6 @@ symbols! { bridge, bswap, c_str, - c_unwind, c_variadic, call, call_mut, diff --git a/compiler/rustc_symbol_mangling/src/v0.rs b/compiler/rustc_symbol_mangling/src/v0.rs index 12c0a147990fa..bbf7ecc39cfd9 100644 --- a/compiler/rustc_symbol_mangling/src/v0.rs +++ b/compiler/rustc_symbol_mangling/src/v0.rs @@ -440,7 +440,7 @@ impl Printer<'tcx> for SymbolMangler<'tcx> { } match sig.abi { Abi::Rust => {} - Abi::C { unwind: false } => cx.push("KC"), + Abi::C => cx.push("KC"), abi => { cx.push("K"); let name = abi.name(); diff --git a/compiler/rustc_target/src/spec/abi.rs b/compiler/rustc_target/src/spec/abi.rs index f7f9c30d3b7a6..65e8a4e8db2ad 100644 --- a/compiler/rustc_target/src/spec/abi.rs +++ b/compiler/rustc_target/src/spec/abi.rs @@ -8,21 +8,24 @@ mod tests; #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Debug)] #[derive(HashStable_Generic, Encodable, Decodable)] pub enum Abi { + // N.B., this ordering MUST match the AbiDatas array below. + // (This is ensured by the test indices_are_correct().) + // Multiplatform / generic ABIs // // These ABIs come first because every time we add a new ABI, we // have to re-bless all the hashing tests. These are used in many // places, so giving them stable values reduces test churn. The // specific values are meaningless. - Rust, - C { unwind: bool }, + Rust = 0, + C = 1, // Single platform ABIs Cdecl, - Stdcall { unwind: bool }, + Stdcall, Fastcall, Vectorcall, - Thiscall { unwind: bool }, + Thiscall, Aapcs, Win64, SysV64, @@ -36,7 +39,7 @@ pub enum Abi { CCmseNonSecureCall, // Multiplatform / generic ABIs - System { unwind: bool }, + System, RustIntrinsic, RustCall, PlatformIntrinsic, @@ -58,16 +61,13 @@ pub struct AbiData { const AbiDatas: &[AbiData] = &[ // Cross-platform ABIs AbiData { abi: Abi::Rust, name: "Rust", generic: true }, - AbiData { abi: Abi::C { unwind: false }, name: "C", generic: true }, - AbiData { abi: Abi::C { unwind: true }, name: "C-unwind", generic: true }, + AbiData { abi: Abi::C, name: "C", generic: true }, // Platform-specific ABIs AbiData { abi: Abi::Cdecl, name: "cdecl", generic: false }, - AbiData { abi: Abi::Stdcall { unwind: false }, name: "stdcall", generic: false }, - AbiData { abi: Abi::Stdcall { unwind: true }, name: "stdcall-unwind", generic: false }, + AbiData { abi: Abi::Stdcall, name: "stdcall", generic: false }, AbiData { abi: Abi::Fastcall, name: "fastcall", generic: false }, AbiData { abi: Abi::Vectorcall, name: "vectorcall", generic: false }, - AbiData { abi: Abi::Thiscall { unwind: false }, name: "thiscall", generic: false }, - AbiData { abi: Abi::Thiscall { unwind: true }, name: "thiscall-unwind", generic: false }, + AbiData { abi: Abi::Thiscall, name: "thiscall", generic: false }, AbiData { abi: Abi::Aapcs, name: "aapcs", generic: false }, AbiData { abi: Abi::Win64, name: "win64", generic: false }, AbiData { abi: Abi::SysV64, name: "sysv64", generic: false }, @@ -84,8 +84,7 @@ const AbiDatas: &[AbiData] = &[ }, AbiData { abi: Abi::CCmseNonSecureCall, name: "C-cmse-nonsecure-call", generic: false }, // Cross-platform ABIs - AbiData { abi: Abi::System { unwind: false }, name: "system", generic: true }, - AbiData { abi: Abi::System { unwind: true }, name: "system-unwind", generic: true }, + AbiData { abi: Abi::System, name: "system", generic: true }, AbiData { abi: Abi::RustIntrinsic, name: "rust-intrinsic", generic: true }, AbiData { abi: Abi::RustCall, name: "rust-call", generic: true }, AbiData { abi: Abi::PlatformIntrinsic, name: "platform-intrinsic", generic: true }, @@ -104,41 +103,7 @@ pub fn all_names() -> Vec<&'static str> { impl Abi { #[inline] pub fn index(self) -> usize { - // N.B., this ordering MUST match the AbiDatas array above. - // (This is ensured by the test indices_are_correct().) - use Abi::*; - match self { - // Cross-platform ABIs - Rust => 0, - C { unwind: false } => 1, - C { unwind: true } => 2, - // Platform-specific ABIs - Cdecl => 3, - Stdcall { unwind: false } => 4, - Stdcall { unwind: true } => 5, - Fastcall => 6, - Vectorcall => 7, - Thiscall { unwind: false } => 8, - Thiscall { unwind: true } => 9, - Aapcs => 10, - Win64 => 11, - SysV64 => 12, - PtxKernel => 13, - Msp430Interrupt => 14, - X86Interrupt => 15, - AmdGpuKernel => 16, - EfiApi => 17, - AvrInterrupt => 18, - AvrNonBlockingInterrupt => 19, - CCmseNonSecureCall => 20, - // Cross-platform ABIs - System { unwind: false } => 21, - System { unwind: true } => 22, - RustIntrinsic => 23, - RustCall => 24, - PlatformIntrinsic => 25, - Unadjusted => 26, - } + self as usize } #[inline] @@ -157,8 +122,6 @@ impl Abi { impl fmt::Display for Abi { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - abi => write!(f, "\"{}\"", abi.name()), - } + write!(f, "\"{}\"", self.name()) } } diff --git a/compiler/rustc_target/src/spec/arm_base.rs b/compiler/rustc_target/src/spec/arm_base.rs index 01f573313c97f..b74d80dc6bb2b 100644 --- a/compiler/rustc_target/src/spec/arm_base.rs +++ b/compiler/rustc_target/src/spec/arm_base.rs @@ -2,14 +2,5 @@ use crate::spec::abi::Abi; // All the calling conventions trigger an assertion(Unsupported calling convention) in llvm on arm pub fn unsupported_abis() -> Vec { - vec![ - Abi::Stdcall { unwind: false }, - Abi::Stdcall { unwind: true }, - Abi::Fastcall, - Abi::Vectorcall, - Abi::Thiscall { unwind: false }, - Abi::Thiscall { unwind: true }, - Abi::Win64, - Abi::SysV64, - ] + vec![Abi::Stdcall, Abi::Fastcall, Abi::Vectorcall, Abi::Thiscall, Abi::Win64, Abi::SysV64] } diff --git a/compiler/rustc_target/src/spec/mipsel_unknown_none.rs b/compiler/rustc_target/src/spec/mipsel_unknown_none.rs index 110c8dd80ea77..0f9d3c3de1543 100644 --- a/compiler/rustc_target/src/spec/mipsel_unknown_none.rs +++ b/compiler/rustc_target/src/spec/mipsel_unknown_none.rs @@ -23,12 +23,10 @@ pub fn target() -> Target { panic_strategy: PanicStrategy::Abort, relocation_model: RelocModel::Static, unsupported_abis: vec![ - Abi::Stdcall { unwind: false }, - Abi::Stdcall { unwind: true }, + Abi::Stdcall, Abi::Fastcall, Abi::Vectorcall, - Abi::Thiscall { unwind: false }, - Abi::Thiscall { unwind: true }, + Abi::Thiscall, Abi::Win64, Abi::SysV64, ], diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index c9fffd213d768..09400a1d13066 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -1284,31 +1284,24 @@ impl Target { /// Given a function ABI, turn it into the correct ABI for this target. pub fn adjust_abi(&self, abi: Abi) -> Abi { match abi { - Abi::System { unwind } => { + Abi::System => { if self.is_like_windows && self.arch == "x86" { - Abi::Stdcall { unwind } + Abi::Stdcall } else { - Abi::C { unwind } + Abi::C } } // These ABI kinds are ignored on non-x86 Windows targets. // See https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions // and the individual pages for __stdcall et al. - Abi::Stdcall { unwind } | Abi::Thiscall { unwind } => { - if self.is_like_windows && self.arch != "x86" { Abi::C { unwind } } else { abi } - } - Abi::Fastcall | Abi::Vectorcall => { - if self.is_like_windows && self.arch != "x86" { - Abi::C { unwind: false } - } else { - abi - } + Abi::Stdcall | Abi::Fastcall | Abi::Vectorcall | Abi::Thiscall => { + if self.is_like_windows && self.arch != "x86" { Abi::C } else { abi } } Abi::EfiApi => { if self.arch == "x86_64" { Abi::Win64 } else { - Abi::C { unwind: false } + Abi::C } } abi => abi, diff --git a/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs b/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs index 15d8e4843f976..3c9c7d578fbd4 100644 --- a/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs +++ b/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs @@ -49,12 +49,10 @@ pub fn target() -> Target { // create the tests for this. unsupported_abis: vec![ Abi::Cdecl, - Abi::Stdcall { unwind: false }, - Abi::Stdcall { unwind: true }, + Abi::Stdcall, Abi::Fastcall, Abi::Vectorcall, - Abi::Thiscall { unwind: false }, - Abi::Thiscall { unwind: true }, + Abi::Thiscall, Abi::Aapcs, Abi::Win64, Abi::SysV64, diff --git a/compiler/rustc_target/src/spec/riscv_base.rs b/compiler/rustc_target/src/spec/riscv_base.rs index 5bcbb2e621bd0..64cf890037e51 100644 --- a/compiler/rustc_target/src/spec/riscv_base.rs +++ b/compiler/rustc_target/src/spec/riscv_base.rs @@ -5,12 +5,10 @@ use crate::spec::abi::Abi; pub fn unsupported_abis() -> Vec { vec![ Abi::Cdecl, - Abi::Stdcall { unwind: false }, - Abi::Stdcall { unwind: true }, + Abi::Stdcall, Abi::Fastcall, Abi::Vectorcall, - Abi::Thiscall { unwind: false }, - Abi::Thiscall { unwind: true }, + Abi::Thiscall, Abi::Aapcs, Abi::Win64, Abi::SysV64, diff --git a/compiler/rustc_typeck/src/collect.rs b/compiler/rustc_typeck/src/collect.rs index e5136355ca982..b445143415795 100644 --- a/compiler/rustc_typeck/src/collect.rs +++ b/compiler/rustc_typeck/src/collect.rs @@ -2678,7 +2678,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs { } else if tcx.sess.check_name(attr, sym::used) { codegen_fn_attrs.flags |= CodegenFnAttrFlags::USED; } else if tcx.sess.check_name(attr, sym::cmse_nonsecure_entry) { - if !matches!(tcx.fn_sig(id).abi(), abi::Abi::C { .. }) { + if tcx.fn_sig(id).abi() != abi::Abi::C { struct_span_err!( tcx.sess, attr.span, diff --git a/compiler/rustc_typeck/src/lib.rs b/compiler/rustc_typeck/src/lib.rs index 88b47bf5b9cdd..c8597408b51b3 100644 --- a/compiler/rustc_typeck/src/lib.rs +++ b/compiler/rustc_typeck/src/lib.rs @@ -118,19 +118,14 @@ use astconv::AstConv; use bounds::Bounds; fn require_c_abi_if_c_variadic(tcx: TyCtxt<'_>, decl: &hir::FnDecl<'_>, abi: Abi, span: Span) { - match (decl.c_variadic, abi) { - // The function has the correct calling convention, or isn't a "C-variadic" function. - (false, _) | (true, Abi::C { .. }) | (true, Abi::Cdecl) => {} - // The function is a "C-variadic" function with an incorrect calling convention. - (true, _) => { - let mut err = struct_span_err!( - tcx.sess, - span, - E0045, - "C-variadic function must have C or cdecl calling convention" - ); - err.span_label(span, "C-variadics require C or cdecl calling convention").emit(); - } + if decl.c_variadic && !(abi == Abi::C || abi == Abi::Cdecl) { + let mut err = struct_span_err!( + tcx.sess, + span, + E0045, + "C-variadic function must have C or cdecl calling convention" + ); + err.span_label(span, "C-variadics require C or cdecl calling convention").emit(); } } diff --git a/src/doc/unstable-book/src/language-features/c-unwind.md b/src/doc/unstable-book/src/language-features/c-unwind.md deleted file mode 100644 index c1705d59acc21..0000000000000 --- a/src/doc/unstable-book/src/language-features/c-unwind.md +++ /dev/null @@ -1,14 +0,0 @@ -# `c_unwind` - -The tracking issue for this feature is: [#74990] - -[#74990]: https://github.com/rust-lang/rust/issues/74990 - ------------------------- - -Introduces a new ABI string, "C-unwind", to 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 diff --git a/src/test/ui/codemap_tests/unicode.stderr b/src/test/ui/codemap_tests/unicode.stderr index b7ba4fa46d92b..61c3f4f1c9847 100644 --- a/src/test/ui/codemap_tests/unicode.stderr +++ b/src/test/ui/codemap_tests/unicode.stderr @@ -4,7 +4,7 @@ error[E0703]: invalid ABI: found `路濫狼á́́` LL | extern "路濫狼á́́" fn foo() {} | ^^^^^^^^^ invalid ABI | - = help: valid ABIs: Rust, C, C-unwind, cdecl, stdcall, stdcall-unwind, fastcall, vectorcall, thiscall, thiscall-unwind, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, system-unwind, rust-intrinsic, rust-call, platform-intrinsic, unadjusted + = help: valid ABIs: Rust, C, cdecl, stdcall, fastcall, vectorcall, thiscall, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, rust-intrinsic, rust-call, platform-intrinsic, unadjusted error: aborting due to previous error diff --git a/src/test/ui/parser/issue-8537.stderr b/src/test/ui/parser/issue-8537.stderr index 85e2b77d867b9..3f63c08021098 100644 --- a/src/test/ui/parser/issue-8537.stderr +++ b/src/test/ui/parser/issue-8537.stderr @@ -4,7 +4,7 @@ error[E0703]: invalid ABI: found `invalid-ab_isize` LL | "invalid-ab_isize" | ^^^^^^^^^^^^^^^^^^ invalid ABI | - = help: valid ABIs: Rust, C, C-unwind, cdecl, stdcall, stdcall-unwind, fastcall, vectorcall, thiscall, thiscall-unwind, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, system-unwind, rust-intrinsic, rust-call, platform-intrinsic, unadjusted + = help: valid ABIs: Rust, C, cdecl, stdcall, fastcall, vectorcall, thiscall, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, rust-intrinsic, rust-call, platform-intrinsic, unadjusted error: aborting due to previous error diff --git a/src/test/ui/symbol-names/impl1.rs b/src/test/ui/symbol-names/impl1.rs index d3f74c4a4b7b0..771695330d8bd 100644 --- a/src/test/ui/symbol-names/impl1.rs +++ b/src/test/ui/symbol-names/impl1.rs @@ -74,7 +74,3 @@ fn main() { } }; } - -// FIXME(katie): The 32-bit symbol hash probably needs updating as well, but I'm slightly unsure -// about how to do that. This comment is here so that we don't break the test due to error messages -// including incorrect line numbers. diff --git a/src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs b/src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs deleted file mode 100644 index 6ff5dbda2d560..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs +++ /dev/null @@ -1,12 +0,0 @@ -// Test that the "C-unwind" ABI is feature-gated, and *can* be used when the -// `c_unwind` feature gate is enabled. - -// check-pass - -#![feature(c_unwind)] - -extern "C-unwind" fn f() {} - -fn main() { - f(); -} diff --git a/src/test/ui/unwind-abis/feature-gate-c-unwind.rs b/src/test/ui/unwind-abis/feature-gate-c-unwind.rs deleted file mode 100644 index f02a368d4e097..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-c-unwind.rs +++ /dev/null @@ -1,9 +0,0 @@ -// Test that the "C-unwind" ABI is feature-gated, and cannot be used when the -// `c_unwind` feature gate is not used. - -extern "C-unwind" fn f() {} -//~^ ERROR C-unwind ABI is experimental and subject to change [E0658] - -fn main() { - f(); -} diff --git a/src/test/ui/unwind-abis/feature-gate-c-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-c-unwind.stderr deleted file mode 100644 index f4c785a235f67..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-c-unwind.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: C-unwind ABI is experimental and subject to change - --> $DIR/feature-gate-c-unwind.rs:4:8 - | -LL | extern "C-unwind" fn f() {} - | ^^^^^^^^^^ - | - = note: see issue #74990 for more information - = help: add `#![feature(c_unwind)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs b/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs deleted file mode 100644 index 7d4dc8c9343f1..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs +++ /dev/null @@ -1,13 +0,0 @@ -// ignore-arm stdcall isn't supported -// ignore-aarch64 stdcall isn't supported -// ignore-riscv64 stdcall isn't supported - -// Test that the "stdcall-unwind" ABI is feature-gated, and cannot be used when -// the `c_unwind` feature gate is not used. - -extern "stdcall-unwind" fn f() {} -//~^ ERROR stdcall-unwind ABI is experimental and subject to change [E0658] - -fn main() { - f(); -} diff --git a/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr deleted file mode 100644 index e3d569f464f87..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: stdcall-unwind ABI is experimental and subject to change - --> $DIR/feature-gate-stdcall-unwind.rs:8:8 - | -LL | extern "stdcall-unwind" fn f() {} - | ^^^^^^^^^^^^^^^^ - | - = note: see issue #74990 for more information - = help: add `#![feature(c_unwind)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/unwind-abis/feature-gate-system-unwind.rs b/src/test/ui/unwind-abis/feature-gate-system-unwind.rs deleted file mode 100644 index 26c2de4e81767..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-system-unwind.rs +++ /dev/null @@ -1,9 +0,0 @@ -// Test that the "system-unwind" ABI is feature-gated, and cannot be used when -// the `c_unwind` feature gate is not used. - -extern "system-unwind" fn f() {} -//~^ ERROR system-unwind ABI is experimental and subject to change [E0658] - -fn main() { - f(); -} diff --git a/src/test/ui/unwind-abis/feature-gate-system-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-system-unwind.stderr deleted file mode 100644 index 87877336475b4..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-system-unwind.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: system-unwind ABI is experimental and subject to change - --> $DIR/feature-gate-system-unwind.rs:4:8 - | -LL | extern "system-unwind" fn f() {} - | ^^^^^^^^^^^^^^^ - | - = note: see issue #74990 for more information - = help: add `#![feature(c_unwind)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs b/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs deleted file mode 100644 index 2f4cefccc1967..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs +++ /dev/null @@ -1,13 +0,0 @@ -// ignore-arm thiscall isn't supported -// ignore-aarch64 thiscall isn't supported -// ignore-riscv64 thiscall isn't supported - -// Test that the "thiscall-unwind" ABI is feature-gated, and cannot be used when -// the `c_unwind` feature gate is not used. - -extern "thiscall-unwind" fn f() {} -//~^ ERROR thiscall-unwind ABI is experimental and subject to change [E0658] - -fn main() { - f(); -} diff --git a/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr deleted file mode 100644 index b103bb8d56585..0000000000000 --- a/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: thiscall-unwind ABI is experimental and subject to change - --> $DIR/feature-gate-thiscall-unwind.rs:8:8 - | -LL | extern "thiscall-unwind" fn f() {} - | ^^^^^^^^^^^^^^^^^ - | - = note: see issue #74990 for more information - = help: add `#![feature(c_unwind)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`.