From 193126af4ecb7e13881c620776608449154777f7 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 17:20:17 +0100 Subject: [PATCH 1/7] 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/stack.rs | 28 ++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_data_structures/src/stack.rs b/compiler/rustc_data_structures/src/stack.rs index 3d6d000348324..1a0cfb6abd302 100644 --- a/compiler/rustc_data_structures/src/stack.rs +++ b/compiler/rustc_data_structures/src/stack.rs @@ -1,3 +1,5 @@ +use std::sync::atomic::{AtomicU16, Ordering}; + // 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 +13,13 @@ 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: AtomicU16 = const { AtomicU16::new(0) }; +} + +// Give up if we expand the stack this many times and are still trying to recurse deeper. +const MAX_STACK_GROWTH: u16 = 2000; + /// 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 +27,22 @@ 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 = match stacker::remaining_stack() { + Some(remaining) => remaining >= RED_ZONE, + None => false, + }; + if enough_space { + f() + } else { + let times = TIMES_GROWN.with(|times| times.fetch_add(1, Ordering::Relaxed)); + if times > MAX_STACK_GROWTH { + // something is *definitely* wrong. + panic!("still not enough stack after {MAX_STACK_GROWTH} expansions of dynamic stack; infinite recursion?"); + } + let out = stacker::grow(STACK_PER_RECURSION, f); + TIMES_GROWN.with(|times| times.fetch_sub(1, Ordering::Relaxed)); + out + } } From bcb26217f75275aae771d6ea1b612bfccabbabc9 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 18:35:43 +0100 Subject: [PATCH 2/7] 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/lib.rs | 1 + compiler/rustc_data_structures/src/stack.rs | 72 +++++++++++++++++++-- src/tools/tidy/src/deps.rs | 2 + 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85997e1886f1e..d25fb00851248 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3800,6 +3800,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 0332ff6810828..0d714ca40f2bf 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/lib.rs b/compiler/rustc_data_structures/src/lib.rs index de086085c4cb2..9fbe9b7f99a6d 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 1a0cfb6abd302..44a9824260ed6 100644 --- a/compiler/rustc_data_structures/src/stack.rs +++ b/compiler/rustc_data_structures/src/stack.rs @@ -1,5 +1,9 @@ +use std::hint::{likely, unlikely}; +use std::io::{self, Write}; use std::sync::atomic::{AtomicU16, Ordering}; +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 // `ensure_sufficient_stack`. @@ -18,14 +22,13 @@ thread_local! { } // Give up if we expand the stack this many times and are still trying to recurse deeper. -const MAX_STACK_GROWTH: u16 = 2000; +const MAX_STACK_GROWTH: u16 = 1000; /// 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. /// /// 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 { // 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. @@ -33,16 +36,73 @@ pub fn ensure_sufficient_stack(f: impl FnOnce() -> R) -> R { Some(remaining) => remaining >= RED_ZONE, None => false, }; - if enough_space { + if likely(enough_space) { f() } else { let times = TIMES_GROWN.with(|times| times.fetch_add(1, Ordering::Relaxed)); - if times > MAX_STACK_GROWTH { - // something is *definitely* wrong. - panic!("still not enough stack after {MAX_STACK_GROWTH} expansions of dynamic stack; infinite recursion?"); + if unlikely(times > MAX_STACK_GROWTH) { + too_much_stack(); } let out = stacker::grow(STACK_PER_RECURSION, f); TIMES_GROWN.with(|times| times.fetch_sub(1, Ordering::Relaxed)); 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 9e9d463acdb3b..a578b88888b9a 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 4d128c0a7b1b030a32cc9872cf7d5298e6ad9146 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 19:24:37 +0100 Subject: [PATCH 3/7] 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 ef6259b1a0c1a..a9090d4c7f63f 100644 --- a/compiler/rustc_middle/src/query/plumbing.rs +++ b/compiler/rustc_middle/src/query/plumbing.rs @@ -432,6 +432,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 8844d40f49cf3..ff427919eded9 100644 --- a/compiler/rustc_query_impl/src/execution.rs +++ b/compiler/rustc_query_impl/src/execution.rs @@ -201,6 +201,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); @@ -256,6 +258,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>, From 95308ca859c648fa126dc395fd6355d11c4c8614 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Wed, 25 Mar 2026 16:33:38 +0100 Subject: [PATCH 4/7] Don't hang forever if a query cycle occurs in `def_span` WIP: desc ``` rustc_query_impl::execution::try_execute_query query="lower_delayed_owner" rustc_query_impl::execution::try_execute_query query="local_def_id_to_hir_id" rustc_query_impl::execution::try_execute_query query="hir_attr_map" rustc_query_impl::execution::try_execute_query query="associated_item" rustc_query_impl::execution::try_execute_query query="opt_hir_owner_nodes" rustc_query_impl::execution::try_execute_query query="fn_arg_idents" rustc_query_impl::execution::try_execute_query query="fn_sig" rustc_query_impl::execution::try_execute_query query="late_bound_vars_map" rustc_query_impl::execution::try_execute_query query="resolve_bound_vars" rustc_query_impl::execution::try_execute_query query="generics_of" 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_query_impl::execution::try_execute_query query="generics_of" 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_middle::queries::default_span self=codegen_fn_attrs(DefId(0:5 ~ bad_resolve[0a7b]::Trait::bar)) rustc_query_impl::execution::try_execute_query query="def_span" error[E0391]: cycle detected when looking up span for `::bar` | = note: ...which requires getting HIR ID of `::bar`... = note: ...which again requires looking up span for `::bar`, completing the cycle note: cycle used when computing codegen attributes of `Trait::bar` --> bad-resolve.rs:6:5 | 6 | fn bar() {} | ^^^^^^^^ ``` --- compiler/rustc_middle/src/hir/mod.rs | 3 +++ compiler/rustc_middle/src/query/plumbing.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_middle/src/hir/mod.rs b/compiler/rustc_middle/src/hir/mod.rs index ad56e462d2934..52012f3ab3bae 100644 --- a/compiler/rustc_middle/src/hir/mod.rs +++ b/compiler/rustc_middle/src/hir/mod.rs @@ -485,6 +485,9 @@ pub fn provide(providers: &mut Providers) { }; providers.opt_ast_lowering_delayed_lints = |tcx, id| tcx.hir_crate(()).owner(tcx, id.def_id).as_owner().map(|o| &o.delayed_lints); + // WARNING: this provider is used in `create_query_cycle` to detect the span where a cycle + // occurred. You *must* update `rustc_middle::query::plumbing::TaggedQueryKey::default_span` if + // you update this implementation to use additional queries. providers.def_span = |tcx, def_id| tcx.hir_span(tcx.local_def_id_to_hir_id(def_id)); providers.def_ident_span = |tcx, def_id| { let hir_id = tcx.local_def_id_to_hir_id(def_id); diff --git a/compiler/rustc_middle/src/query/plumbing.rs b/compiler/rustc_middle/src/query/plumbing.rs index a9090d4c7f63f..49aa740a7b0ce 100644 --- a/compiler/rustc_middle/src/query/plumbing.rs +++ b/compiler/rustc_middle/src/query/plumbing.rs @@ -437,7 +437,7 @@ macro_rules! define_callbacks { if !span.is_dummy() { return span } - if let TaggedQueryKey::def_span(..) = self { + if let TaggedQueryKey::def_span(..) | TaggedQueryKey::local_def_id_to_hir_id(..) = self { // The `def_span` query is used to calculate `default_span`, // so exit to avoid infinite recursion. return DUMMY_SP From f33621398416322d51abac0ce93032cb2aefaf9e Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Thu, 26 Mar 2026 14:41:18 +0100 Subject: [PATCH 5/7] Bless query cycle tests The new cycles seem much more informative to me. --- .../ui/query-system/query-cycle-printing-issue-151358.rs | 2 +- .../query-system/query-cycle-printing-issue-151358.stderr | 8 +++++--- tests/ui/resolve/query-cycle-issue-124901.rs | 2 +- tests/ui/resolve/query-cycle-issue-124901.stderr | 8 +++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/ui/query-system/query-cycle-printing-issue-151358.rs b/tests/ui/query-system/query-cycle-printing-issue-151358.rs index 04d8664420be8..50288f6db602c 100644 --- a/tests/ui/query-system/query-cycle-printing-issue-151358.rs +++ b/tests/ui/query-system/query-cycle-printing-issue-151358.rs @@ -1,4 +1,4 @@ -//~ ERROR: cycle detected when looking up span for `Default` +//~ ERROR: cycle detected when getting the resolver for lowering trait Default {} use std::num::NonZero; fn main() { diff --git a/tests/ui/query-system/query-cycle-printing-issue-151358.stderr b/tests/ui/query-system/query-cycle-printing-issue-151358.stderr index 9c1d7b1de33a5..a3f460781723a 100644 --- a/tests/ui/query-system/query-cycle-printing-issue-151358.stderr +++ b/tests/ui/query-system/query-cycle-printing-issue-151358.stderr @@ -1,7 +1,9 @@ -error[E0391]: cycle detected when looking up span for `Default` +error[E0391]: cycle detected when getting the resolver for lowering | - = note: ...which immediately requires looking up span for `Default` again - = note: cycle used when perform lints prior to AST lowering + = note: ...which requires getting HIR ID of `Default`... + = note: ...which requires getting the crate HIR... + = note: ...which requires perform lints prior to AST lowering... + = note: ...which again requires getting the resolver for lowering, completing the cycle = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information error: aborting due to 1 previous error diff --git a/tests/ui/resolve/query-cycle-issue-124901.rs b/tests/ui/resolve/query-cycle-issue-124901.rs index 6cb1e58b6258f..0575f168c372f 100644 --- a/tests/ui/resolve/query-cycle-issue-124901.rs +++ b/tests/ui/resolve/query-cycle-issue-124901.rs @@ -1,4 +1,4 @@ -//~ ERROR: cycle detected when looking up span for `Default` +//~ ERROR: cycle detected when getting the resolver for lowering trait Default { type Id; diff --git a/tests/ui/resolve/query-cycle-issue-124901.stderr b/tests/ui/resolve/query-cycle-issue-124901.stderr index 9c1d7b1de33a5..a3f460781723a 100644 --- a/tests/ui/resolve/query-cycle-issue-124901.stderr +++ b/tests/ui/resolve/query-cycle-issue-124901.stderr @@ -1,7 +1,9 @@ -error[E0391]: cycle detected when looking up span for `Default` +error[E0391]: cycle detected when getting the resolver for lowering | - = note: ...which immediately requires looking up span for `Default` again - = note: cycle used when perform lints prior to AST lowering + = note: ...which requires getting HIR ID of `Default`... + = note: ...which requires getting the crate HIR... + = note: ...which requires perform lints prior to AST lowering... + = note: ...which again requires getting the resolver for lowering, completing the cycle = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information error: aborting due to 1 previous error From c1fa3f228da244ab5d6e6f137fecbb55bbef4cb9 Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Thu, 26 Mar 2026 14:55:40 +0100 Subject: [PATCH 6/7] fixup! Give up if `ensure_sufficient_stack` is called more than 1000 times --- compiler/rustc_data_structures/src/stack.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_data_structures/src/stack.rs b/compiler/rustc_data_structures/src/stack.rs index 44a9824260ed6..078d3f706201e 100644 --- a/compiler/rustc_data_structures/src/stack.rs +++ b/compiler/rustc_data_structures/src/stack.rs @@ -1,6 +1,6 @@ +use std::cell::Cell; use std::hint::{likely, unlikely}; use std::io::{self, Write}; -use std::sync::atomic::{AtomicU16, Ordering}; use backtrace::{Backtrace, BacktraceFrame}; @@ -18,7 +18,7 @@ const STACK_PER_RECURSION: usize = 1024 * 1024; // 1MB const STACK_PER_RECURSION: usize = 16 * 1024 * 1024; // 16MB thread_local! { - static TIMES_GROWN: AtomicU16 = const { AtomicU16::new(0) }; + 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. @@ -39,12 +39,13 @@ pub fn ensure_sufficient_stack(f: impl FnOnce() -> R) -> R { if likely(enough_space) { f() } else { - let times = TIMES_GROWN.with(|times| times.fetch_add(1, Ordering::Relaxed)); + let times = TIMES_GROWN.get(); if unlikely(times > MAX_STACK_GROWTH) { too_much_stack(); } + TIMES_GROWN.set(times + 1); let out = stacker::grow(STACK_PER_RECURSION, f); - TIMES_GROWN.with(|times| times.fetch_sub(1, Ordering::Relaxed)); + TIMES_GROWN.set(times); out } } From 55ee14aea762cbd149f54c5cd309b6f4c67a719f Mon Sep 17 00:00:00 2001 From: Jynn Nelson Date: Thu, 26 Mar 2026 16:00:29 +0100 Subject: [PATCH 7/7] fixup! Give up if `ensure_sufficient_stack` is called more than 1000 times --- compiler/rustc_data_structures/src/stack.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_data_structures/src/stack.rs b/compiler/rustc_data_structures/src/stack.rs index 078d3f706201e..dce11ba8cdc6c 100644 --- a/compiler/rustc_data_structures/src/stack.rs +++ b/compiler/rustc_data_structures/src/stack.rs @@ -18,11 +18,16 @@ const STACK_PER_RECURSION: usize = 1024 * 1024; // 1MB const STACK_PER_RECURSION: usize = 16 * 1024 * 1024; // 16MB thread_local! { - static TIMES_GROWN: Cell = const { Cell::new(0) }; + 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: u16 = 1000; +/// 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 @@ -32,15 +37,15 @@ const MAX_STACK_GROWTH: u16 = 1000; pub fn ensure_sufficient_stack(f: impl FnOnce() -> R) -> R { // 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 = match stacker::remaining_stack() { - Some(remaining) => remaining >= RED_ZONE, - None => false, + 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_GROWTH) { + if unlikely(times > max_stack) { too_much_stack(); } TIMES_GROWN.set(times + 1);