mirror of
https://github.com/EmbarkStudios/rust-gpu.git
synced 2024-11-22 06:45:13 +00:00
Get the default panic hook for ICEs, from std::panic::set_hook
.
This commit is contained in:
parent
ee3d5afe63
commit
2d5b8e6b0e
@ -623,7 +623,39 @@ fn get_env_dump_dir(env_var: &str) -> Option<PathBuf> {
|
|||||||
pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
|
pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
|
||||||
// Override rustc's panic hook with our own to override the ICE error
|
// Override rustc's panic hook with our own to override the ICE error
|
||||||
// message, and direct people to `rust-gpu`.
|
// message, and direct people to `rust-gpu`.
|
||||||
std::panic::set_hook(Box::new(|panic_info| {
|
let _rustc_hook = std::panic::take_hook();
|
||||||
|
let default_hook = std::panic::take_hook();
|
||||||
|
{
|
||||||
|
// NOTE(eddyb) the reason we can get access to the default panic hook,
|
||||||
|
// is that `std::panic::take_hook` has this phrase in its documentation:
|
||||||
|
//
|
||||||
|
// > If no custom hook is registered, the default hook will be returned.
|
||||||
|
//
|
||||||
|
// But just in case (races with other threads?), we can do it a few more
|
||||||
|
// times, and require that we get the same "boxed" ZST every time.
|
||||||
|
let more_hooks = [
|
||||||
|
std::panic::take_hook(),
|
||||||
|
std::panic::take_hook(),
|
||||||
|
std::panic::take_hook(),
|
||||||
|
std::panic::take_hook(),
|
||||||
|
];
|
||||||
|
assert_eq!(
|
||||||
|
std::mem::size_of_val(&*default_hook),
|
||||||
|
0,
|
||||||
|
"failed to acquire default panic hook using `std::panic::take_hook`, \
|
||||||
|
or default panic hook not a ZST anymore"
|
||||||
|
);
|
||||||
|
#[allow(clippy::vtable_address_comparisons)]
|
||||||
|
for other_hook in more_hooks {
|
||||||
|
assert!(
|
||||||
|
std::ptr::eq(&*default_hook, &*other_hook),
|
||||||
|
"failed to acquire default panic hook using `std::panic::take_hook`, \
|
||||||
|
or `std::panic::set_hook` was used on another thread"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::panic::set_hook(Box::new(move |panic_info| {
|
||||||
|
default_hook(panic_info);
|
||||||
rustc_driver::report_ice(
|
rustc_driver::report_ice(
|
||||||
panic_info,
|
panic_info,
|
||||||
"https://github.com/EmbarkStudios/rust-gpu/issues/new",
|
"https://github.com/EmbarkStudios/rust-gpu/issues/new",
|
||||||
|
Loading…
Reference in New Issue
Block a user