diff options
| author | Yuki Okushi <jtitor@2k36.org> | 2021-08-07 01:46:35 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-07 01:46:35 +0900 |
| commit | c5202b3779eabf0421dc9c162eb5a21ce45a0698 (patch) | |
| tree | a4cbcc14386d994f48a319c1f9f99c133e39ed95 | |
| parent | a4262cc9841d91d48ef994b36eab323e615a7083 (diff) | |
| parent | 7520ea9046de23d04829db40687a7fdde5034530 (diff) | |
| download | rust-c5202b3779eabf0421dc9c162eb5a21ce45a0698.tar.gz rust-c5202b3779eabf0421dc9c162eb5a21ce45a0698.zip | |
Rollup merge of #87787 - hyd-dev:c-unwind, r=RalfJung
Use `C-unwind` ABI for `__rust_start_panic` in `panic_abort`
The function originally has `C` ABI but is called using `C-unwind` ABI in `std`:
https://github.com/rust-lang/rust/blob/d4ad1cfc63ba5824196bfb2370451ddb5af2e020/library/std/src/panicking.rs#L49-L54
Which might be [problematic](https://github.com/rust-lang/miri/pull/1745#discussion_r596096876) and triggers this [Miri error](https://github.com/rust-lang/rust/issues/87778#issuecomment-893306222):
```
error: Undefined Behavior: calling a function with ABI C using caller ABI C-unwind
--> /home/hyd-dev/.rustup/toolchains/miri/lib/rustlib/src/rust/library/std/src/panicking.rs:672:9
|
672 | __rust_start_panic(obj)
| ^^^^^^^^^^^^^^^^^^^^^^^ calling a function with ABI C using caller ABI C-unwind
|
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
```
Changing the ABI of the function to `C-unwind` fixes the error above.
| -rw-r--r-- | library/panic_abort/src/lib.rs | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/library/panic_abort/src/lib.rs b/library/panic_abort/src/lib.rs index d95ea6530c2..4580f9a7758 100644 --- a/library/panic_abort/src/lib.rs +++ b/library/panic_abort/src/lib.rs @@ -15,6 +15,7 @@ #![feature(staged_api)] #![feature(rustc_attrs)] #![feature(asm)] +#![feature(c_unwind)] #[cfg(target_os = "android")] mod android; @@ -30,7 +31,7 @@ pub unsafe extern "C" fn __rust_panic_cleanup(_: *mut u8) -> *mut (dyn Any + Sen // "Leak" the payload and shim to the relevant abort on the platform in question. #[rustc_std_internal_symbol] -pub unsafe extern "C" fn __rust_start_panic(_payload: *mut &mut dyn BoxMeUp) -> u32 { +pub unsafe extern "C-unwind" fn __rust_start_panic(_payload: *mut &mut dyn BoxMeUp) -> u32 { // Android has the ability to attach a message as part of the abort. #[cfg(target_os = "android")] android::android_set_abort_message(_payload); |
