From ff9a0650aba92f93f50da4bdb23831741f27505a Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 17:20:17 +0100 Subject: [PATCH 1/3] Give up if `ensure_sufficient_stack` is called more than 1000 times Something has definitely gone wrong at this point. This is over 5 million stack frames, certainly more than we'd ever hit in successful code. It's actually too many stack frames for the default panic handler, or GDB, or LLDB, to print. Instead add a manual stack overflow handler which only prints the first and last hundred stack frames. We can't even have a normal `println!("{backtrace}")` because symbolizing that many frames too long. Instead, resolve the frame lazily. --- compiler/rustc_data_structures/src/lib.rs | 1 + compiler/rustc_data_structures/src/stack.rs | 35 ++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_data_structures/src/lib.rs b/compiler/rustc_data_structures/src/lib.rs index 0cfa8dd90d533..cc0cfe61a298f 100644 --- a/compiler/rustc_data_structures/src/lib.rs +++ b/compiler/rustc_data_structures/src/lib.rs @@ -21,6 +21,7 @@ #![feature(dropck_eyepatch)] #![feature(extend_one)] #![feature(file_buffered)] +#![feature(likely_unlikely)] #![feature(map_try_insert)] #![feature(min_specialization)] #![feature(negative_impls)] diff --git a/compiler/rustc_data_structures/src/stack.rs b/compiler/rustc_data_structures/src/stack.rs index 3d6d000348324..ff95e7368bc7e 100644 --- a/compiler/rustc_data_structures/src/stack.rs +++ b/compiler/rustc_data_structures/src/stack.rs @@ -1,3 +1,6 @@ +use std::cell::Cell; +use std::hint::{likely, unlikely}; + // This is the amount of bytes that need to be left on the stack before increasing the size. // It must be at least as large as the stack required by any code that does not call // `ensure_sufficient_stack`. @@ -11,6 +14,18 @@ const STACK_PER_RECURSION: usize = 1024 * 1024; // 1MB #[cfg(target_os = "aix")] const STACK_PER_RECURSION: usize = 16 * 1024 * 1024; // 16MB +thread_local! { + static TIMES_GROWN: Cell = const { Cell::new(0) }; +} + +/// Give up if we expand the stack this many times and are still trying to recurse deeper. +const MAX_STACK_GROWTH: u32 = 1000; +/// Estimate number of frames used per call to `grow`. +/// +/// This is only used on platforms where we can't tell how much stack we have left, so we `grow` +/// unconditionally. +const ESTIMATED_FRAME_SIZE: u32 = 10000; + /// Grows the stack on demand to prevent stack overflow. Call this in strategic locations /// to "break up" recursive calls. E.g. almost any call to `visit_expr` or equivalent can benefit /// from this. @@ -18,5 +33,23 @@ const STACK_PER_RECURSION: usize = 16 * 1024 * 1024; // 16MB /// Should not be sprinkled around carelessly, as it causes a little bit of overhead. #[inline] pub fn ensure_sufficient_stack(f: impl FnOnce() -> R) -> R { - stacker::maybe_grow(RED_ZONE, STACK_PER_RECURSION, f) + // if we can't guess the remaining stack (unsupported on some platforms) we immediately grow + // the stack and then cache the new stack size (which we do know now because we allocated it. + let (enough_space, max_stack) = match stacker::remaining_stack() { + Some(remaining) => (remaining >= RED_ZONE, MAX_STACK_GROWTH), + None => (false, MAX_STACK_GROWTH * ESTIMATED_FRAME_SIZE), + }; + if likely(enough_space) { + f() + } else { + let times = TIMES_GROWN.get(); + if unlikely(times > max_stack) { + // something is *definitely* wrong. + panic!("still not enough stack after {MAX_STACK_GROWTH} expansions of dynamic stack; infinite recursion?"); + } + TIMES_GROWN.set(times + 1); + let out = stacker::grow(STACK_PER_RECURSION, f); + TIMES_GROWN.set(times); + out + } } From 5b90906b9ce8a9427845590721ca0f960f57d629 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 18:35:43 +0100 Subject: [PATCH 2/3] Don't just cause follow-on errors on unwind; abort the whole process This shows the following stack trace: ``` still not enough stack after 1000 expansions of dynamic stack; infinite recursion? first hundred frames: 0: trace at /Users/jyn/.local/lib/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-0.3.75/src/backtrace/libunwind.rs:117:9 1: trace_unsynchronized at /Users/jyn/.local/lib/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-0.3.75/src/backtrace/mod.rs:66:14 2: trace at /Users/jyn/.local/lib/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-0.3.75/src/backtrace/mod.rs:53:14 3: create at /Users/jyn/.local/lib/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-0.3.75/src/capture.rs:294:9 4: report_too_much_stack at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:68:21 5: call_once !, ()> at /Users/jyn/work/rust-upstream/library/core/src/ops/function.rs:250:5 6: ___rust_try at 7: catch_unwind !> at /Users/jyn/work/rust-upstream/library/std/src/panicking.rs:544:19 8: catch_unwind !, !> at /Users/jyn/work/rust-upstream/library/std/src/panic.rs:359:14 9: too_much_stack at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:54:18 10: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:44:13 11: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 12: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 13: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 14: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 15: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 16: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 17: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 18: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 19: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 20: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 21: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 22: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 23: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 24: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 25: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 26: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 27: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 28: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 29: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 30: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 31: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 32: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 33: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 34: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 35: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 36: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 37: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 38: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 39: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 40: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 41: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 42: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 43: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 44: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 45: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 46: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 47: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 48: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 49: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 50: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 51: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 52: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 53: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 54: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 55: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 56: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 57: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 58: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 59: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 60: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 61: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 62: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 63: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 64: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 65: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 66: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 67: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 68: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 69: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 70: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 71: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 72: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 73: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 74: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 75: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 76: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 77: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 78: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 79: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 80: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 81: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 82: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 83: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 84: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 85: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 86: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 87: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 88: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 89: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 90: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 91: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 92: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 93: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 94: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 95: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 96: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 97: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 98: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 99: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 100: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 101: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 102: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 103: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 104: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 105: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 106: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 107: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 108: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 109: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 110: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 111: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 112: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 113: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 114: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 115: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 116: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 117: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 118: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 119: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 120: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 121: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 122: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 123: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 124: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 125: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 126: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 127: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 128: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 129: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 130: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 131: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 132: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 133: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 134: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 135: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 136: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 137: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 138: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 139: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 140: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 141: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 142: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 143: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 144: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 145: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 146: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 147: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 148: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 149: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 150: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 151: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 152: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 153: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 154: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 155: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 156: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 157: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 158: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 ... last hundred frames: 4637037: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 4637038: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 4637039: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 4637040: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637041: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637042: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637043: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637044: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637045: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637046: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637047: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 4637048: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 4637049: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 4637050: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 4637051: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 4637052: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 4637053: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 4637054: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637055: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637056: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637057: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637058: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637059: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637060: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637061: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 4637062: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 4637063: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 4637064: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 4637065: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 4637066: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 4637067: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 4637068: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637069: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637070: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637071: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637072: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637073: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637074: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637075: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 4637076: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 4637077: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 4637078: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 4637079: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 4637080: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 4637081: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 4637082: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637083: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637084: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637085: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637086: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637087: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637088: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637089: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 4637090: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 4637091: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 4637092: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:460:37 4637093: handle_cycle, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 4637094: find_and_handle_cycle, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 4637095: try_execute_query, rustc_middle::dep_graph::graph::DepNodeIndex>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 4637096: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637097: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637098: execute_query_non_incr_inner, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637099: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637100: query_ensure_ok_or_done, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:63:13 4637101: lower_delayed_owner at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:621:21 4637102: owner at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/hir/mod.rs:73:31 4637103: {closure#0} at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/hir/mod.rs:475:78 4637104: call_once at /Users/jyn/work/rust-upstream/library/core/src/ops/function.rs:250:5 4637105: __rust_begin_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:116:46 4637106: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:59 4637107: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637108: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637109: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637110: enter_context, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637111: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:74:9 4637112: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:36 4637113: with_context_opt, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:75:18 4637114: with_context, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:5 4637115: start_query, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:61:5 4637116: execute_job_non_incr, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:17 4637117: try_execute_query, rustc_middle::dep_graph::graph::DepNodeIndex>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:307:17 4637118: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637119: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637120: execute_query_non_incr_inner, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637121: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637122: query_get_at, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637123: local_def_id_to_hir_id at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637124: local_def_id_to_hir_id at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637125: {closure#5} at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/hir/mod.rs:488:57 4637126: call_once at /Users/jyn/work/rust-upstream/library/core/src/ops/function.rs:250:5 4637127: __rust_begin_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:110:29 4637128: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:59 4637129: {closure#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637130: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637131: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637132: enter_context>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637133: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:74:9 4637134: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:36 4637135: with_context_opt, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:75:18 4637136: with_context, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:5 4637137: start_query, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:61:5 4637138: execute_job_non_incr>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:17 4637139: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:307:17 4637140: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637141: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637142: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637143: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637144: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637145: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637146: def_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637147: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:141:13 4637148: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/keys.rs:129:26 4637149: default_span at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:448:29 4637150: create_cycle_error at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/job.rs:474:37 4637151: handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:117:17 4637152: find_and_handle_cycle>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:211:6 4637153: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:337:25 4637154: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637155: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637156: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637157: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637158: rustc_middle[95cb20ab0b0ff780]::query::inner::query_get_at::>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637159: ::hir_crate_items at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637160: ::hir_crate_items at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637161: ::config::{closure#0}::{closure#0} at /Users/jyn/work/loopy/src/main.rs:20:29 4637162: <::config::{closure#0}::{closure#0} as core[d920faf4c96bc488]::ops::function::FnOnce<(rustc_middle[95cb20ab0b0ff780]::ty::context::TyCtxt, rustc_span[e4b3c3db7c294ad9]::def_id::LocalDefId)>>::call_once at /Users/jyn/work/rust-upstream/library/core/src/ops/function.rs:250:5 4637163: __rust_begin_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:110:29 4637164: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:59 4637165: {closure#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637166: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637167: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637168: enter_context>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637169: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:74:9 4637170: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:36 4637171: with_context_opt, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:75:18 4637172: with_context, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:5 4637173: start_query, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:61:5 4637174: execute_job_non_incr>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:17 4637175: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:307:17 4637176: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637177: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637178: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637179: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637180: query_get_at>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:45:17 4637181: codegen_fn_attrs at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:572:46 4637182: codegen_fn_attrs at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:560:39 4637183: lower_delegation_sig at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/delegation.rs:334:33 4637184: lower_delegation at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/delegation.rs:162:32 4637185: lower_impl_item at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/item.rs:1296:47 4637186: lower_assoc_item at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/item.rs:770:47 4637187: {closure#2} at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/item.rs:115:57 4637188: {closure#0}> at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/item.rs:84:46 4637189: with_hir_id_owner>> at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/lib.rs:803:20 4637190: with_lctx> at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/item.rs:84:14 4637191: lower_node at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/item.rs:115:26 4637192: lower_delayed_owner at /Users/jyn/work/rust-upstream/compiler/rustc_ast_lowering/src/lib.rs:679:13 4637193: __rust_begin_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:116:46 4637194: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:59 4637195: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637196: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 0]>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637197: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 0]>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637198: enter_context, rustc_middle::dep_graph::graph::DepNodeIndex>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637199: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:74:9 4637200: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:36 4637201: with_context_opt, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>>, rustc_middle::query::erase::ErasedData<[u8; 0]>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:75:18 4637202: with_context, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:5 4637203: start_query, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:61:5 4637204: execute_job_non_incr, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:17 4637205: try_execute_query, rustc_middle::dep_graph::graph::DepNodeIndex>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:307:17 4637206: {closure#0}, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637207: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}, rustc_middle::dep_graph::graph::DepNodeIndex>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637208: execute_query_non_incr_inner, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637209: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637210: query_ensure_ok_or_done, rustc_middle::dep_graph::graph::DepNodeIndex>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:63:13 4637211: lower_delayed_owner at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:621:21 4637212: force_delayed_owners_lowering at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/hir/map.rs:1251:27 4637213: hir_crate_items at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/hir/map.rs:1265:5 4637214: __rust_begin_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:116:46 4637215: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:59 4637216: {closure#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637217: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637218: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637219: enter_context>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637220: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:74:9 4637221: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:36 4637222: with_context_opt, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:75:18 4637223: with_context, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 8]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:5 4637224: start_query, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:61:5 4637225: execute_job_non_incr>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:17 4637226: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:307:17 4637227: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637228: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637229: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637230: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637231: query_ensure_ok_or_done>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:63:13 4637232: hir_crate_items at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:621:21 4637233: run_required_analyses at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/passes.rs:1042:23 4637234: analysis at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/passes.rs:1129:5 4637235: __rust_begin_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:116:46 4637236: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:59 4637237: {closure#0}>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637238: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 0]>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637239: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}>>, rustc_middle::query::erase::ErasedData<[u8; 0]>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637240: enter_context>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637241: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:74:9 4637242: {closure#0}, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:36 4637243: with_context_opt, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 0]>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:75:18 4637244: with_context, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>>, rustc_middle::query::erase::ErasedData<[u8; 0]>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:86:5 4637245: start_query, rustc_query_impl::execution::execute_job_non_incr::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/plumbing.rs:61:5 4637246: execute_job_non_incr>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:399:17 4637247: try_execute_query>, false> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:307:17 4637248: {closure#0}>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:32 4637249: ensure_sufficient_stack, rustc_query_impl::execution::execute_query_non_incr_inner::{closure_env#0}>>> at /Users/jyn/work/rust-upstream/compiler/rustc_data_structures/src/stack.rs:40:9 4637250: execute_query_non_incr_inner>> at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/execution.rs:600:5 4637251: __rust_end_short_backtrace at /Users/jyn/work/rust-upstream/compiler/rustc_query_impl/src/query_impl.rs:80:30 4637252: query_ensure_ok_or_done>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/inner.rs:63:13 4637253: analysis at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/query/plumbing.rs:587:21 4637254: {closure#2} at /Users/jyn/work/rust-upstream/compiler/rustc_driver_impl/src/lib.rs:325:29 4637255: {closure#2}, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/passes.rs:1019:23 4637256: {closure#1}, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>, core::option::Option> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context.rs:863:37 4637257: {closure#0}, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>, core::option::Option>, core::option::Option> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:56:9 4637258: try_with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>, core::option::Option>, core::option::Option>, core::option::Option> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:462:12 4637259: with, rustc_middle::ty::context::tls::enter_context::{closure_env#0}, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>, core::option::Option>, core::option::Option>, core::option::Option> at /Users/jyn/work/rust-upstream/library/std/src/thread/local.rs:426:20 4637260: enter_context, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>, core::option::Option>, core::option::Option> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context/tls.rs:53:9 4637261: enter, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>, core::option::Option> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context.rs:863:9 4637262: create_global_ctxt, rustc_interface::passes::create_and_enter_global_ctxt::{closure_env#2}, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}>> at /Users/jyn/work/rust-upstream/compiler/rustc_middle/src/ty/context.rs:1072:13 4637263: create_and_enter_global_ctxt, rustc_driver_impl::run_compiler::{closure#0}::{closure_env#2}> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/passes.rs:986:5 4637264: {closure#0} at /Users/jyn/work/rust-upstream/compiler/rustc_driver_impl/src/lib.rs:298:22 4637265: {closure#0}<(), rustc_driver_impl::run_compiler::{closure_env#0}> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/interface.rs:500:80 4637266: call_once<(), rustc_interface::interface::run_compiler::{closure#1}::{closure_env#0}<(), rustc_driver_impl::run_compiler::{closure_env#0}>> at /Users/jyn/work/rust-upstream/library/core/src/panic/unwind_safe.rs:275:9 4637267: do_call>, ()> at /Users/jyn/work/rust-upstream/library/std/src/panicking.rs:581:40 4637268: catch_unwind<(), core::panic::unwind_safe::AssertUnwindSafe>> at /Users/jyn/work/rust-upstream/library/std/src/panicking.rs:544:19 4637269: catch_unwind>, ()> at /Users/jyn/work/rust-upstream/library/std/src/panic.rs:359:14 4637270: {closure#1}<(), rustc_driver_impl::run_compiler::{closure_env#0}> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/interface.rs:500:23 4637271: {closure#0}, ()> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/util.rs:203:17 4637272: {closure#0}, ()>, ()> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/util.rs:159:24 4637273: set, ()>, ()>, ()> at /Users/jyn/.local/lib/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/scoped-tls-1.0.1/src/lib.rs:137:9 4637274: create_session_globals_then<(), rustc_interface::util::run_in_thread_with_globals::{closure#0}::{closure#0}::{closure_env#0}, ()>, ()>> at /Users/jyn/work/rust-upstream/compiler/rustc_span/src/lib.rs:153:21 4637275: {closure#0}, ()>, ()> at /Users/jyn/work/rust-upstream/compiler/rustc_interface/src/util.rs:155:17 4637276: __rust_begin_short_backtrace, ()>, ()>, ()> at /Users/jyn/work/rust-upstream/library/std/src/sys/backtrace.rs:166:18 4637277: {closure#0}, ()>, ()>, ()> at /Users/jyn/work/rust-upstream/library/std/src/thread/lifecycle.rs:91:13 4637278: call_once<(), std::thread::lifecycle::spawn_unchecked::{closure#1}::{closure_env#0}, ()>, ()>, ()>> at /Users/jyn/work/rust-upstream/library/core/src/panic/unwind_safe.rs:275:9 4637279: do_call, ()>, ()>, ()>>, ()> at /Users/jyn/work/rust-upstream/library/std/src/panicking.rs:581:40 4637280: catch_unwind<(), core::panic::unwind_safe::AssertUnwindSafe, ()>, ()>, ()>>> at /Users/jyn/work/rust-upstream/library/std/src/panicking.rs:544:19 4637281: catch_unwind, ()>, ()>, ()>>, ()> at /Users/jyn/work/rust-upstream/library/std/src/panic.rs:359:14 4637282: {closure#1}, ()>, ()>, ()> at /Users/jyn/work/rust-upstream/library/std/src/thread/lifecycle.rs:89:26 4637283: call_once, ()>, ()>, ()>, ()> at /Users/jyn/work/rust-upstream/library/core/src/ops/function.rs:250:5 4637284: ::new::thread_start at 4637285: __pthread_cond_wait at ``` --- Cargo.lock | 1 + compiler/rustc_data_structures/Cargo.toml | 1 + compiler/rustc_data_structures/src/stack.rs | 64 ++++++++++++++++++++- src/tools/tidy/src/deps.rs | 2 + 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 53cff99b4a199..d3fef007957ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3763,6 +3763,7 @@ name = "rustc_data_structures" version = "0.0.0" dependencies = [ "arrayvec", + "backtrace", "bitflags", "either", "elsa", diff --git a/compiler/rustc_data_structures/Cargo.toml b/compiler/rustc_data_structures/Cargo.toml index c428810e54117..de4f3fc37fe78 100644 --- a/compiler/rustc_data_structures/Cargo.toml +++ b/compiler/rustc_data_structures/Cargo.toml @@ -6,6 +6,7 @@ edition = "2024" [dependencies] # tidy-alphabetical-start arrayvec = { version = "0.7", default-features = false } +backtrace = "0.3.75" bitflags = "2.4.1" either = "1.0" elsa = "1.11.0" diff --git a/compiler/rustc_data_structures/src/stack.rs b/compiler/rustc_data_structures/src/stack.rs index ff95e7368bc7e..d13cf64719bcf 100644 --- a/compiler/rustc_data_structures/src/stack.rs +++ b/compiler/rustc_data_structures/src/stack.rs @@ -1,5 +1,8 @@ use std::cell::Cell; use std::hint::{likely, unlikely}; +use std::io::{self, Write}; + +use backtrace::{Backtrace, BacktraceFrame}; // This is the amount of bytes that need to be left on the stack before increasing the size. // It must be at least as large as the stack required by any code that does not call @@ -44,8 +47,7 @@ pub fn ensure_sufficient_stack(f: impl FnOnce() -> R) -> R { } else { let times = TIMES_GROWN.get(); if unlikely(times > max_stack) { - // something is *definitely* wrong. - panic!("still not enough stack after {MAX_STACK_GROWTH} expansions of dynamic stack; infinite recursion?"); + too_much_stack(); } TIMES_GROWN.set(times + 1); let out = stacker::grow(STACK_PER_RECURSION, f); @@ -53,3 +55,61 @@ pub fn ensure_sufficient_stack(f: impl FnOnce() -> R) -> R { out } } + +#[cold] +fn too_much_stack() -> ! { + let Err(e) = std::panic::catch_unwind(report_too_much_stack); + let mut stderr = io::stderr(); + let _ = writeln!(stderr, "ensure_sufficient_stack: panicked while handling stack overflow!"); + if let Ok(s) = e.downcast::() { + let _ = writeln!(stderr, "{s}"); + } + std::process::abort(); +} + +#[cold] +fn report_too_much_stack() -> ! { + // something is *definitely* wrong. + eprintln!( + "still not enough stack after {MAX_STACK_GROWTH} expansions of dynamic stack; infinite recursion?" + ); + + let backtrace = Backtrace::new_unresolved(); + let frames = backtrace.frames(); + eprintln!("first hundred frames:"); + print_frames(0, &frames[..100]); + + eprintln!("...\nlast hundred frames:"); + let start = frames.len() - 100; + print_frames(start, &frames[start..]); + std::process::abort(); +} + +#[cold] +fn print_frames(mut i: usize, frames: &[BacktraceFrame]) { + for frame in frames { + let mut frame = frame.clone(); + frame.resolve(); + for symbol in frame.symbols() { + eprint!("{i}: "); + match symbol.name() { + Some(sym) => eprint!("{sym}"), + None => eprint!(""), + } + eprint!("\n\t\tat "); + if let Some(file) = symbol.filename() { + eprint!("{}", file.display()); + if let Some(line) = symbol.lineno() { + eprint!(":{line}"); + if let Some(col) = symbol.colno() { + eprint!(":{col}"); + } + } + } else { + eprint!(""); + } + eprintln!(); + i += 1; + } + } +} diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index 1d12456d2bb23..3620d9f76abe4 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -275,6 +275,7 @@ const PERMITTED_RUSTC_DEPS_LOCATION: ListLocation = location!(+6); /// rustc. Please check with the compiler team before adding an entry. const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ // tidy-alphabetical-start + "addr2line", "adler2", "aho-corasick", "allocator-api2", // FIXME: only appears in Cargo.lock due to https://github.com/rust-lang/cargo/issues/10801 @@ -287,6 +288,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "ar_archive_writer", "arrayref", "arrayvec", + "backtrace", "bitflags", "blake3", "block-buffer", From 5cfaeeb789f107b630c1d589faf189f5a047ab44 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 19:24:37 +0100 Subject: [PATCH 3/3] Add some logging to query cycles ``` rustc_query_impl::execution::try_execute_query query="hir_crate_items" ... rustc_query_impl::execution::try_execute_query query="lower_delayed_owner" ... rustc_query_impl::execution::try_execute_query query="asyncness" rustc_query_impl::execution::try_execute_query query="codegen_fn_attrs" rustc_query_impl::execution::try_execute_query query="hir_crate_items" 0ms INFO rustc_query_impl::execution hit a query cycle evaluating hir_crate_items! rustc_middle::queries::default_span self=hir_crate_items(()) rustc_middle::queries::default_span self=lower_delayed_owner(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="lower_delayed_owner" 0ms INFO rustc_query_impl::execution hit a query cycle evaluating lower_delayed_owner! rustc_middle::queries::default_span self=lower_delayed_owner(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" 0ms INFO rustc_query_impl::execution hit a query cycle evaluating def_span! rustc_middle::queries::default_span self=def_span(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="opt_hir_owner_nodes" rustc_middle::queries::default_span self=local_def_id_to_hir_id(DefId(0:14 ~ bad_resolve[0a7b]::{impl#1}::bar)) rustc_query_impl::execution::try_execute_query query="def_span" ``` --- compiler/rustc_middle/src/query/plumbing.rs | 1 + compiler/rustc_query_impl/src/execution.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/compiler/rustc_middle/src/query/plumbing.rs b/compiler/rustc_middle/src/query/plumbing.rs index fe3054dc18e65..0f8c3cfcd9192 100644 --- a/compiler/rustc_middle/src/query/plumbing.rs +++ b/compiler/rustc_middle/src/query/plumbing.rs @@ -454,6 +454,7 @@ macro_rules! define_callbacks { } /// Returns the default span for this query if `span` is a dummy span. + #[tracing::instrument(level = "debug", skip(tcx, span))] pub fn default_span(&self, tcx: TyCtxt<'tcx>, span: Span) -> Span { if !span.is_dummy() { return span diff --git a/compiler/rustc_query_impl/src/execution.rs b/compiler/rustc_query_impl/src/execution.rs index ed9ad8c7a0a68..92f29a6ed2c49 100644 --- a/compiler/rustc_query_impl/src/execution.rs +++ b/compiler/rustc_query_impl/src/execution.rs @@ -223,6 +223,8 @@ fn find_and_handle_cycle<'tcx, C: QueryCache>( try_execute: QueryJobId, span: Span, ) -> (C::Value, Option) { + tracing::info!("hit a query cycle evaluating {}!", query.name); + // Ensure there were no errors collecting all active jobs. // We need the complete map to ensure we find a cycle to break. let job_map = collect_active_query_jobs(tcx, CollectActiveJobsKind::FullNoContention); @@ -278,6 +280,7 @@ fn wait_for_query<'tcx, C: QueryCache>( /// Shared main part of both [`execute_query_incr_inner`] and [`execute_query_non_incr_inner`]. #[inline(never)] +#[tracing::instrument(level = "debug", skip_all, fields(query = query.name, key))] fn try_execute_query<'tcx, C: QueryCache, const INCR: bool>( query: &'tcx QueryVTable<'tcx, C>, tcx: TyCtxt<'tcx>,