← Playground docs/dev/COMPILER_INTERNALS.md
raw

nurlc internals — the map of the fused walk and its global state

This is the document to read before changing the compiler. It states how compiler/nurlc.nu is organised, which process-global tables exist, who writes them, and which invariants keep the single fused pass honest. The critique this answers (critic M2) was fair: the type rules live inside the code generators, so without this map every change begins as archaeology. The map is the pragmatic first step; a real AST/IR boundary remains the long-term direction and is deliberately not attempted in one leap — the bootstrap fixed point makes big-bang refactors expensive and every incremental step here is gated (see §5).

1. Shape

compiler/nurlc.nu is one self-contained file (no $ imports — it defines its own string/symtab/lexer helpers so stage0 can build it from nurlc_lastgood.ll with nothing but clang). There is **no AST and no IR data structure**: parsing, type checking, borrow checking and code generation are one recursive descent (parse_program → gen_stmt / gen_expr / gen_*) that **emits LLVM IR text to stdout as it walks** (emit = nurl_print). What crosses statement/function boundaries is not a tree — it is the global state in §3.

Consequences to internalise before editing:

construct, next to the IR it emits. Changing a rule = finding every gen-site that encodes it.

a table now (that is what most globals are).

generic instantiations, drop thunks, DWARF metadata) are queued in tables and flushed at safe points.

2. Pipeline

main()
 ├─ CLI flags → g_borrowck / g_strict_borrowck / g_dbg_enabled / g_lint …
 ├─ allocate ~20 sym tables (fresh per process; nothing survives runs)
 ├─ nurl_print_buf_start            — the whole module is emitted into
 │                                    one buffering frame, not straight
 │                                    to stdout (see dce_emit_module)
 ├─ scan_type_names      (prepass)  — struct/enum names → kind table
 ├─ scan_generic_structs (prepass)  — generic struct templates → tables
 ├─ scan_fn_sigs         (prepass)  — explicit fn/method signatures + trait
 │                                    contracts, follows `$` imports
 ├─ read_type_layouts              — declared fields and enum payload storage
 ├─ resolve_trait_impls            — verify associated bindings and register
 │                                    defaults against the complete trait table
 ├─ emit_header                     — module preamble, runtime declares
 ├─ verify_super_obligations       — require each implemented supertrait
 ├─ scan_dyn_types       (prepass)  — %Trait dyn-object vtables needed
 ├─ lazy_reach                      — library functions (stdlib/, deps/)
 │                                    nothing reaches are skipped by the
 │                                    walk below (off under --no-dce,
 │                                    --lint, -g; NURL_LAZY_TRACE)
 ├─ parse_program                   — THE fused walk (parse + typecheck
 │                                    + borrowck + memdrop + IR emit,
 │                                    one function at a time; deferred
 │                                    closures/generics flushed between
 │                                    top-level items)
 ├─ emit_pending_drop_graphs        — drop definitions after complete layouts
 ├─ resolve_sink_summaries           — fixed point of parameter consumption
 ├─ emit_sink_flags                 — static ownership decisions for LLVM
 ├─ resolve_pending_escapes         — replay escape checks parked on
 │                                    forward/generic calls
 ├─ dbg_flush                       — queued !DI* metadata (--g)
 ├─ lint_report_unused_*            — --lint reports
 ├─ exit non-zero if g_err_count / g_bck_errors
 └─ dce_emit_module                 — stop the buffer; write out the
                                      globals plus the functions `main`
                                      can reach (--no-dce: all of them)

The scan_* prepasses and deferred trait resolution exist so the fused walk never needs a second look at the source: by the time parse_program runs, every signature, type name, template and dyn-trait requirement is already in a table.

The ordinary signature prepass records every inout parameter's position in g_fn_inout, just as generic template registration does. Forward calls and mutually recursive functions therefore use the same address ABI as calls after a definition. Never infer that ABI from definition order.

Function identities in semantic tables remain source names. LLVM emission uses llvm_source_fn for definitions and llvm_call_fn for references, after the signature prepass has recorded source functions and external declarations. Programs place ordinary functions in the __nurl_fn. namespace so names such as open and strlen cannot collide with libc or acquire its optimizer semantics. Explicit external declarations, --keep roots and no-main modules retain their external ABI; the existing main wrapper remains unchanged. Calls, function addresses, methods, deferred drop bodies and vtables must all use this boundary. Diagnostics and DWARF keep readable source names.

The borrow-checker records a defer block as a registration, with a synthetic arming slot in its existing ownership state. It skips the body on normal flow and checks definitely armed bodies in reverse order at each return and normal function exit. A consuming call in deferred cleanup must not mark its argument moved at registration. As with conditional moves, the default checker does not diagnose a cleanup whose arming state is uncertain after a branch join. After each body, the checker revisits the newest armed site: nested cleanup registered by that body runs before older defers. Code generation builds a child cleanup chain against the previous top and restores the parent's entry as the enclosing top; an unreached parent skips its entire child chain.

With --check, the complete fused walk and deferred checks still run; main unwinds the output buffer without making the final module copy or invoking DCE/splitting, then follows normal cleanup.

The frontend pipeline runs inside journalled recovery. Main owns its source, codegen state and global tables outside that recovery extent and releases them on both success and diagnostic failure. Lexers and scoped symbol tables are also linked into the compilation context (g_live_lexers, g_live_symtables): normal release unlinks an instance in constant time, and final cleanup drains instances abandoned by a diagnostic. Per-declaration recovery restarts the IR buffer after discarding incomplete output. Compiler error-path leak coverage is still incomplete; the outstanding failures are recorded in V1_HARDENING.md.

dce_emit_module is the only stage that looks at the emitted IR as text. It indexes every define … } block, marks the ones reachable from main (roots: main, plus anything named between blocks — a @__vt.… vtable constant names its thunks at module scope), and prints the live sub-sequence. Working on the finished text rather than a source-level call graph is what keeps it indifferent to how a function came to exist: closures, monomorphisations, drop glue and dyn thunks are all just @name references by then. Normal output only drops unreachable definitions. With --sanitize-address, __ir_write_function inserts the ASan function attribute as each indexed range is written. The same boundary writes split definitions, including replicas; it neither shifts the index nor allocates another module buffer. Dropping something still referenced surfaces as an undefined symbol at link time.

3. Global state — families and owners

Globals fall into the families below. The generated appendix (§6) lists every one with its writers; this section is the mental model. "Sym table" below = the compiler's own scoped string→string map (nurl_sym_new/def/get, push/pop for scopes; strdup on both def and get — returned values are owned copies).

familykey globalsrole & lifetime
input snapshotsg_input_source, g_input_key, g_source_snapshotsstdin overlay borrows main's live source/key; ordinary reads cache their first bytes by canonical path for this invocation; compiler_read_source returns owned copies to every replay/diagnostic reader, and main frees the cache
diagnosticsg_err_count, g_diag_recover_activeerror count + multi-error recovery mode; whole run
codegen cursorg_str_idx, g_did_ret, g_ret_forbidden, g_in_match_arm, g_defer_count, g_stmt_line/col/bare_*per-statement/-function flags; must be reset on the boundaries that own them (grep their writers before trusting a reset)
last-type channelg_last_type_ptrthe expression walk's implicit return value: every gen_expr sets it; the caller reads it. Signedness is carried in the type string itself (u8/u16/… stay distinct from i8/i16/… in this channel; readers use ty_is_unsigned, emission normalises via nurl_llty) — the former separate unsigned flag was removed in the A1 rework; see the comment at nurl_set_last_type
string literalsg_str_syms, g_str_idxinterned literal metadata, flushed as module constants
genericsg_generic_syms, g_generic_struct_syms, g_struct_inst_symsstored templates (token streams) + emitted-instantiation dedupe; whole run
traits/implsg_trait_syms, g_impl_{ret,name,trait,pos}_symsmethod dispatch keys method##llvm_type → return type / mangle / owning trait / declaration site (coherence)
pending trait contractsg_trait_pendingone record per source impl, effective source snapshots and per-file diagnostic cursors; resolved after scan_fn_sigs, snapshots/cursors released before body emission; seen keys dedupe import replay
dyn traitsg_dyn_needed, g_dyn_flat_*, g_super_obligationsaccumulator strings (not tables): vtables to emit + supertrait proof obligations
closuresg_closure_defs/types, g_func_count, g_type_count, g_*_emit_basedeferred closure bodies/types; the emit_base watermarks make the between-items flush idempotent
result typesg_res_type_syms! T E lowering metadata for try-propagation checking
borrow checkerg_bck (per-fn record list + warnset + ml_* lines), g_bck_depth, g_bck_closure_depth, g_bck_errorsstatements are RECORDED during the walk, analysed at function end (bck_analyze → bck_walk_seq over a byte-per-binding lattice array; names are interned to dense ids at bck_explode, rv_<id> is the reverse map for diagnostics)
escape analysisg_fn_inout/sink/escapes/invoke_only/ret_param, g_pending_escapeinterprocedural summaries; g_pending_escape holds checks parked on forward/generic calls, replayed by resolve_pending_escapes
auto-dropmem_* journal (function-local handles) + g_auto_drop_stringsowned-resource journal driving scope-exit frees
DWARFg_dbg_*metadata id allocator + queued !DI* blobs; only live under --g
lintg_lint*usage recording; only under --lint
visibility/modulesg_vis_syms, g_pending_pubimport graph + pub tracking for cross-file access checks
module emissiong_dce_*, g_split_*, g_sanitize_addressbuffered module, live-function index, partitioning and ASan attribute policy; whole run, written at final emission

Reset discipline: everything is initialised in main() and the process compiles exactly one program — there is no reuse between files except via $ imports walked in the same run. If you add a global, initialise it in main() next to its family and document the writer set in the appendix (regenerate it — §6).

4. Memory discipline

Address ownership now has a compilation-owned dependency graph (origin_*). Each binding has a stable node; assignments add edges, so a loop backedge does not lose a dependency whose parameter origins are still unknown. Calls add conditional edges gated by a callee's returned-root or consuming parameter. A worklist propagates inline 64-bit sets with sparse overflow words for larger arities. Lifted closure parameters and hidden capture inputs have their own index domain. Root-buffer identity is separate from embedded-reference facts: releasing a new closure environment does not release the objects it references. The existing diagnostic implications and graph facts converge together before emitting private argument-drop constants. LLVM folds those constants at normal optimization levels. Graph nodes, edges and overflow words are released by the compilation context on successful and rejected compilations.

Temporary consumers have no helper-name whitelist. Each argument's sink, returned-address, embedded-reference and unverified-call facts decide whether the caller may release it. An aggregate result does not itself retain its inputs; a scalar result does not prove that it discarded their addresses. Unknown foreign and indirect calls propagate retention through source wrappers in the lifetime-only g_fn_unverified summary, independently of diagnostic escape contracts.

Primitive effects are read from the actual emitted LLVM declarations. Pointer parameters need nocapture and nofree; a readonly function may instead return an alias, which is recorded in the address graph. Terminal calls such as nurl_panic use the unwind journal and do not promise nofree. These attributes use the LLVM 15 contracts. The custom function attribute "nurl.value-only"="1 3" records zero-based scalar argument positions whose audited primitive role is data, such as a length or allocation size. An integer type alone grants no such contract: it can carry an address. Source definitions do not inherit a same-named primitive's effects; user FFI declarations remain unverified unless an actual primitive contract applies. This metadata does not add source-language FFI syntax.

A mutable string initialized from a proved owned local receives its own copy, so later assignments can release replacements and joins can preserve previous values. Borrowed parameters, guarded results and opaque casts retain their identity; the spelling s alone does not authorize copying an address as text.

The compiler used to allocate arena-style — temporaries were simply not freed. As of 0.30.0 the self-compile leaks nothing, and tools/leakgate.sh (CI, zero tolerance) is what holds that. The invariant that made the arena era safe still holds and still must not be broken:

fresh owned allocation**. Emitted auto-drop frees a string temp that is passed directly as a call argument, so returning a borrowed pointer (e.g. a suffix of the input) is a use-after-free / invalid free waiting to happen. This was measured, attempted and reverted — see the M1 commit; nurl_llty's comment documents the same hazard.

strings by index instead of re-slicing remainders, through a pointer hoisted once and a length measured once (: *u txt_p # *u txt, then the compiler-local ( nurl_str_at txt_p n i ), in an unsafe function; __norm_int_lit is the pattern). nurl_str_get in a loop re-measures the string from its start on every call, which is quadratic; nurlc warns when that string is a binding made outside the loop. Build outputs in one exact-size buffer instead of concat-accumulating.

rather than abandoned, which is a property of its **ownership summary**. Three ways to lose it, all of which cost real memory before: returning ^ # s ( strdup … ) so the cast hides freshness from return-site inference (declare the function __ret_owned); losing a forward call's dynamic ownership proof before its consumer captures it; and a mixed join — a borrowed parameter on one arm, a tracked local on the other — which vetoes the marker for the whole function. If you add a string-returning helper, check leakgate before you check the clock.

state-map rewrite) → 125 MB → 115.9 MB (lattice-array rewrite) → 18.5 MB (ownership campaign) → 24 MB (the module buffer the dead-function pass needs). tools/memgate.sh (CI) keeps it from regressing; if the gate fires on your PR, instrument first — per-site counters over nurl_str_slice/str_skip_word call sites found the last one in two runs.

5. Changing the compiler safely

The ownership walk's dense state string also has a control-flow bottom value, !, meaning no continuing path. bck_walk_seq produces it on a return and stops that path. bck_join_state excludes it, so a release followed by return cannot become a loop-carried move. Explicit conditional else edges and match arm boundaries cover both bare expressions and brace blocks. Match ownership remains isolated per arm to avoid conflating payload bindings; only all-arm termination propagates to its caller.

  1. ./check.sh compiler/nurlc.nu — fast frontend syntax/type gate.
  2. Build and self-compare: the OLD binary and your NEW binary must emit

byte-identical IR for the same source unless your change is supposed to alter codegen (then goldens move and you explain why).

  1. ./build.sh — bootstrap fixed point (stage1 ≡ stage2) + the full

golden corpus. Borrow-checker changes: the borrow_* goldens are the behavioural spec.

  1. ./tools/memgate.sh — the peak-RSS budget.
  2. ./tools/dcegate.sh — proves the dead-function pass still drops

unreachable code AND still keeps the indirect routes (dyn vtable thunks, % Drop, closures, monomorphs). The corpus catches only the second half: a pass that kept everything would stay green.

  1. ./tools/leakgate.sh — the self-compile must leak nothing. Needs a

./build.sh --san --no-tests first; zero tolerance, no budget.

  1. Sanitizers run in CI (build.sh --san + run_san_tests.sh) — run

locally when touching drop/ownership codegen.

6. Appendix — every global and its writers (generated)

Regenerate after adding/renaming globals: python3 tools/gen_globals_map.py (rewrites this section in place).

globaldeclaredwritten byholds
g_arcp_any:1813__arcp_noteWhether any callee takes an Arc (arcp##, §6.5), and whether the function being compiled has handled one (gen
g_arg_ident_log:1397mem_arg_consumption, store_global--strict-borrowck only: every binding NAME read while generating the current call argument, including reads ne
g_at:56540__ext_calls_back── Which functions run inside a recover extent ─────────────────
g_auto_drop_strings:2636nurlc_print_helpPhase 2B auto-drop-strings feature flag. Default ON. Compiler's own source uses patterns (strings stored via n
g_bck:1485nurlc_print_help
g_bck_ab_any:1829bck_analyze, bck_borrow_beginWhether any borrow of this function's walk is one of a payload (ab_).
g_bck_bind_scalar:24060bck_flush_movesSet by bck_record_binding for its row: 1 when the binding holds no heap value and no address (a scalar), so no
g_bck_bind_sown:24068__ptr_src_of, bck_flush_moves…and 1 when it is an s that owns the buffer it points at (field 5 o): a tracked owned string, every assign
g_bck_bind_wview:24062bck_flush_moves…and 1 when that view owns nothing (field 5 w, bck_record_binding).
g_bck_cap_names:1419__clo_bind_escapes, bck_clear_cap_name, bck_fn_beginNames of :-bound closures in the CURRENT function whose capture list is non-empty — the allocation-free pre-
g_bck_cap_via:1430__clo_bind_escapes, bck_defer_fn, bck_fn_begin, bck_opaque_param_run<handle> <closure> pairs for the current function: which closure binding made a captured handle reachable at
g_bck_close:26910bck_kill_stored_in_dThe close marker of every open marker, found once per walk with a stack per bracket kind: the walk asks for th
g_bck_closure_depth:1538__clo_bind_escapes
g_bck_depth:1488__clo_bind_escapes, bck_block_enter, bck_block_exit, bck_fn_begindata (statement list etc.); allocated in main() only when --borrowck is set
g_bck_dser:2814bck_alias_step
g_bck_end_eonly:2758bck_borrow_sweepSet while a borrow end comes from elements dropped or replaced (not the value itself): an owner holding a clos
g_bck_errors:1542__ptr_stale_warn, __ptr_stale_warn_at, bck_kill_stored_in_dcapture hooks no-op so closure statements do not inline into the enclosing function's list (so closure scopes
g_bck_fevar:1609bck_block_enter, bck_fn_begin, gen_foreachA ~ x xs loop's element binding is waiting for its body's block row (pending_fevar in g_bck names it).
g_bck_gen:1510bck_analyze
g_bck_has_borrow:25956bck_analyze, bck_borrow_begin, bck_dep_add, bck_walk_seqSet once a function records a borrow: only then does the walk compare states row by row to end borrows whose s
g_bck_has_deps:2754bck_analyze, bck_dep_addWhether this function's walk has recorded any view dependency (bck_dep_add), and statement vpass rows pendin
g_bck_has_paths:25958bck_alias_step, bck_analyzeSet once a function interns a field path (s.items, bck_intern).
g_bck_inew:2815bck_alias_step
g_bck_inn:1514bck_alias_step, bck_analyzeintern table — bumped per bck_analyze so entries from earlier functions read as misses without any table clear
g_bck_let_sx_last:1496__ptr_src_ofThe last let's right-hand source expression (g_bck_rhs_sx), kept past its row: a join it bound is followed b
g_bck_match_sx:1831bck_record, emit_or_chainThe source expression of the call a match row matches (gen_match).
g_bck_nrows:25965bck_kill_stored_in_d
g_bck_own_params:162bck_defer_fn
g_bck_ownerless:1508bck_flush_moves, bck_stash_store, bck_take_owner_stores
g_bck_pcap:25971bck_alias_step
g_bck_pm_slot:12989__strget_loop_warn
g_bck_pn:25970bck_alias_step
g_bck_pr:25969bck_alias_stepPer id of the function analysed now: the binding it belongs to (itself unless a field path) and a path's spell
g_bck_pvpass_n:2759bck_flush_vpass, bck_side_lists_put, bck_side_lists_take, bck_stash_arcx +2
g_bck_rcap:25966bck_kill_stored_in_d
g_bck_rcty:168bck_defer_fn, bck_elem_keeper, bck_fn_beginThe bindings and field paths of the function being walked that hold an Rc handle, as name=type words (bck_
g_bck_rd_slot:12988__strget_loop_warnByte length of one of g_bck's statement lists (reads, pmoves) in O(1): g_bck is one flat scope that never
g_bck_rec_off:1525(init only)>0 while the borrow checker's capture hooks must not record. Used to be spelled g_bck_closure_depth != 0, wh
g_bck_ret_dep:2800mem_check_ret_clo_lend
g_bck_ret_sx:2799mem_check_ret_clo_lendThe source expression of a returned view (field 8 of its ret row), and 1 when it is an owner returned by nam
g_bck_rhs_callee:24074__ptr_src_ofThe call a let / assign binds the result of (field 6 of its row): a lend the walk learns from the callee's
g_bck_rhs_lend:24448__ptr_src_ofSet by a binding whose right-hand side is a call: the sources a borrow of its result has (bck_call_lend_srcs);
g_bck_rhs_sx:24077__ptr_src_ofThe source expression of a let / assign's right-hand side (field 8 of a view's row, g_srcx_on): its source
g_bck_rk:25964bck_kill_stored_in_d…and each row's kind code (bck_kind_code).
g_bck_rlen:25962bck_kill_stored_in_d
g_bck_rows:25961bck_kill_stored_in_dThe rows of the function being walked (bck_explode / bck_rec): copies and their lengths.
g_bck_sc:2820bck_ids_end
g_bck_sc_cap:2819bck_ids_end
g_bck_sc_n:2818bck_ids_end, bck_walk_seqThe blocks the walk is in, innermost last (bck_scope_push): rows [lo, hi) of each, and whether it is a loop's
g_bck_sx_gen:1509bck_walk_seq
g_bck_view_reads:24070bck_flush_movesWhat a view binding's right-hand side read (bck_record_binding).
g_bcls_memo:2748nurlc_print_helpA binding class per LLVM type (bck_bind_class), and the trusted-file answer for the current source file (bck_u
g_blk_depth:1839__blk_enter
g_blk_lets:1838__blk_enter, __blk_tail_sxWhat the bindings declared in value-position blocks hold (h216): words D:name=sx (a let at block depth D),
g_blk_scalar_let:1612__ptr_src_of, gen_block_exprThe : binding the next block initialises is a number or a flag (gen_let_or_struct → gen_block_expr, consumed
g_blk_tail_lit_col:5475gen_block_expr, gen_block_ret
g_blk_tail_lit_line:5474emit_or_chain, gen_block_expr, gen_block_ret, gen_block_stmts +1g_blk_tail_lit_line/col — the dangling-literal exemption's escape hatch, closed. A bare literal as a value blo
g_blk_val_depth:1840__blk_enter
g_body_ends:10498body_ends_resetWhere each brace block ends: "<text identity> <offset of a '{'>" → the offset just past its matching '}'. Ever
g_borrowck:1445nurlc_print_help── Borrow-checker state ───────────────────────────────────────── g_borrowck is 1 (ON) by default; `--no-borro
g_call_lend_roots:2739mem_arg_consumption
g_call_roots:2738mem_arg_consumptionThe call just generated, when one of its arguments was a field path (. b items): its arguments with that fie
g_cast_fresh_in:1532__gen_cast_body, is_ptr_ty
g_clo_assigned:1606__clo_bind_escapesThe : ~ scalars the closure being built assigns (simple_capture_analysis finds them; __gen_closure_expr publ
g_clo_bind_name:1636__clo_bind_escapes, __ptr_src_of
g_clo_caps_now:2795__clo_bind_escapesWhile a closure body is compiled: what it captured (g_clo_caps_now) and the calls it hands one of them — or a
g_clo_detach:1625__clo_bind_escapes, mem_arg_consumptionSet by a call compiling a closure literal as the closure a thread or a fiber runs, or by a : binding of one
g_clo_detach_shared:1619__clo_bind_escapesThe detached closure's captures taken by share (__clo_detach_moves); consumed by gen_closure_expr like the mov
g_clo_lend_set:1507mem_arg_consumption
g_clo_scan_assigned:1613str_contains
g_clo_tmp:1710mem_retclo_own_resultThe owned closure temporary most recently produced, as <value> <env> (docs/MEMORY.md §7.4): published by a c
g_clolend_n:1506mem_note_clo_lend
g_closure_consumed:1409__clo_bind_escapes, bck_assign_alias, resolve_clo_nc_retsNames a closure BODY consumed. bck_stash_move drops its records while inside a closure — the body's statements
g_closure_defs:1431nurlc_print_help
g_closure_effects:2796__clo_bind_escapes, bck_cap_via_of
g_closure_emit_base:1435emit_closure_globals, nurlc_print_help
g_closure_types:1432nurlc_print_help
g_cond_depth:1483gen_loop, mem_join_heads_stmtNesting depth of "we are parsing an enclosing construct's CONDITION". The arity check above fires when a { f
g_coverage_link_ir:1906nurlc_print_help
g_coverage_meta_id:1907dbg_flush
g_coverage_notes:1905nurlc_print_help
g_coverage_prefix:1904nurlc_print_help
g_cpu_dispatch:2837nurlc_print_helpWhich wider ISA the simd prefix dispatches to. 1 = x86-64-v3 (AVX2 + BMI2 + FMA), 0 = no dispatch, emit the
g_cur_params:2791gen_fn_decl
g_cur_ret_llty:153gen_fn_declLLVM return type of the function whose body is currently being generated. Diagnostics-only: gen_field_store co
g_dbg_blob_syms:1910dbg_initmodule-flag id we might add later
g_dbg_cu_id:1913dbg_init
g_dbg_current_file_id:1942gen_fn_decldefining path for the mono being emitted (the mono's lexer filename is the synthetic <generic …>). Set/resto
g_dbg_current_loc:1916__clo_bind_escapes, dbg_synth_begin, dbg_synth_end, emit_dbg_line_eol +5(0 outside any function)
g_dbg_current_subprogram:1914__clo_bind_escapes, dbg_synth_begin, dbg_synth_end, gen_fn_decl
g_dbg_enabled:1903nurlc_print_help── DWARF debug-info state ─────────────────────────────────────── All zero/empty when --g is OFF; emit helpers
g_dbg_file_id:1912dbg_initflushed at end-of-module by dbg_flush
g_dbg_file_syms:1931dbg_inituses this instead of nurl_lex_line for the !DISubprogram source line. Set by emit_one_instantiation so per-m
g_dbg_next_id:1908dbg_alloc_id
g_dbg_override_file:1936gen_fn_decl_or_lazy, gen_import_declevery source file gets its own !DIFile and a subprogram debug-attributes to the file that DEFINES it (imports,
g_dbg_override_line:1925gen_fn_decl_or_lazy, gen_import_declthe type for every local until Phase 6 lays down per-LLVM-type DIBasicType entries indexed by vt.
g_dbg_placeholder_ty:1921dbg_initdbg_init and reused for every fn. Phase 6 will replace with per-fn signature types.
g_dbg_subroutine_ty:1918dbg_initemit_dbg_eol then omits , !dbg !N)
g_dbg_type_syms:1969dbg_init
g_dce:56057nurlc_print_help
g_dce_at:56124__sp_parts
g_dce_end:56120__sp_parts
g_dce_keep:56068nurlc_print_help--keep=a,b,c — extra DCE roots. The pass's root set is main plus whatever module-scope constants name. Th
g_dce_live:56121__sp_parts
g_dce_map:56125__sp_parts
g_dce_mod:56118__sp_partsThe module text, as an integer cast of a BORROWED s. Deliberately not a : ~ s global: a mutable string glo
g_dce_qn:56123__dce_ident_byte, __sp_parts
g_dce_queue:56122__sp_parts
g_dce_start:56119__sp_parts
g_dead_arm:2713__ice_report, mem_join_heads_stmt--unsafe-report: the program's own unsafe functions (outside the standard library), one file:line name p
g_dead_payload:33503__gen_cast_bodySet while the payload of a None literal is generated, when that payload is a cast (gen_agg_lit): the one cast
g_defer_count:1261gen_defer, gen_fn_decl
g_deferred_bck:1755nurlc_print_helpFunctions whose borrow-check walk is parked until the whole module has compiled (see borrowck_fn_end). n is
g_diag_ctx:144dyn_sig_parts, emit_lit_check, gen_import_decl, scan_method_signature +2Diagnostic context suffix, appended to every die/warn message while non-empty. Set (and saved/restored — insta
g_diag_recover_active:135__ice_report, nurlc_print_help
g_did_ret:1217__clo_bind_escapes, __close_dead_block, __handle_unreachable_stmt, __tail_noreturn_close +9
g_drop_base:2785nurlc_print_helpWhich parameters each safe function may drop or replace the elements of (bck_callee_drops_elems): witnessed wh
g_drop_edges:2787nurlc_print_help
g_drop_glue_ty:157__clo_bind_escapes, gen_dyn_construct, gen_fn_declThe LLVM type of the value a % Drop impl's drop is being compiled for (%R), or — while set, every exi
g_dyn_dtout:1371dyn_method_slotdyn_method_decltrait's result rides a global too: its callers sit ABOVE its definition, so an owned return wou
g_dyn_flat_out:1365__dyn_flat_resetScratch accumulators for dyn_flat_methods (a NURL fn returns one value, so the recursive supertrait walk threa
g_dyn_flat_seen:1366__dyn_flat_reset
g_dyn_needed:1362__dyn_unslugDynamic trait objects (%Trait, docs/spec.md §4.9). Space-separated set of trait names that appear as a `%Tra
g_env_moved:1616__clo_bind_escapes…and, for one that a thread or a fiber will run, the captures it takes over from bindings the function no long
g_env_owns_handles:1587__clo_bind_escapesSet around a returned closure literal's env generation: its String / Vec / owning-struct captures move into (a
g_env_released:1590__clo_bind_escapes…and, for a closure that releases some captures itself, which (their env field is not dropped again).
g_env_shared:1621__clo_bind_escapes…and the same set while that closure's env is built and described.
g_err_count:134__diag_abort
g_ext:56537__ext_calls_back
g_ext_glob:56545__ext_calls_back
g_ext_mlen:56546__ext_calls_back
g_ext_q:56541__ext_calls_back
g_ext_qn:56542__dce_ident_byte, __ext_calls_back
g_ext_sig:56544__ext_calls_back, __ext_types
g_ff_any:1491gen_fn_decl, mem_ff_slot
g_ff_gen:1490gen_fn_decl
g_ff_mark:1499mem_emit_gated_drop
g_ffi_host_imports:1452nurlc_print_helpg_ffi_host_imports is 1 when --ffi-host-imports is passed: external &-FFI libraries are then satisfied by
g_ffx_n:1500__ffx_expand
g_fn_arcseen:1821gen_fn_decl, mem_arg_consumption
g_fn_compiled:1774nurlc_print_helpNames of functions whose body has been compiled — the "is the inline summary trustworthy for this callee?" tes
g_fn_drops:2788nurlc_print_help
g_fn_escapes:1674nurlc_print_helpPer-function escaping-parameter map. g_fn_escapes[fname] is the space-separated list of 0-based indices of p
g_fn_handkeeps:1655nurlc_print_helpThe kept parameters whose value this function keeps ONLY in a struct the program manages by hand through a poi
g_fn_inout:1557nurlc_print_helpPer-function inout-parameter map. g_fn_inout[fname] is the space-separated list of 0-based indices of `inout
g_fn_invoke_only:1701nurlc_print_helpPer-function invoke-only parameter map (closure-env reclamation, docs/MEMORY.md §7.4). `g_fn_invoke_only[fna
g_fn_keeps:1575nurlc_print_helpPer-function KEPT-parameter map (docs/MEMORY.md §7.6): indices of parameters whose value the body stores somew
g_fn_link_exports:1310nurlc_print_help
g_fn_link_sources:1309nurlc_print_helpSource identities stay unmangled in semantic tables and diagnostics. Only their LLVM linkage names enter the p
g_fn_mutates:1809nurlc_print_helpPer-function container-mutation summary (docs/MEMORY.md §2.5). g_fn_mutates[fname] lists the 0-based paramet
g_fn_mutates_witness:1810__clo_bind_escapes, gen_fn_decl, mem_arg_consumption
g_fn_noreturn:1882nurlc_print_helpNoreturn registry. g_fn_noreturn[fname] is 1 when a call to fname never returns to its caller. Seeded with
g_fn_pos_syms:1305nurlc_print_help
g_fn_reallocs:1855nurlc_print_helpg_fn_reallocs[fname]: the parameters whose BUFFER the function may move or release (a reallocation, a free)
g_fn_reallocs_witness:1856__clo_bind_escapes, gen_fn_decl
g_fn_replaces:1863nurlc_print_helpg_fn_replaces[fname]: the inout parameters an owned field of which (or the whole value) the function may r
g_fn_replaces_witness:1864__clo_bind_escapes, emit_rawdrop_thunk, gen_fn_decl
g_fn_ret_alias:1800nurlc_print_helpPer-function returned-HANDLE map — the ownership dual of g_fn_ret_param, and deliberately a separate map rathe
g_fn_ret_count:1887gen_fn_decl, mem_check_ret_clo_lendCount of ^ statements seen while compiling the current function body (closure bodies included — that over-co
g_fn_ret_param:1786nurlc_print_helpPer-function returned-parameter map. g_fn_ret_param[fname] is the space-separated list of 0-based indices of
g_fn_ret_view:1687nurlc_print_helpPer-function RETURNS-A-VIEW map. g_fn_ret_view[fname] is set when the body builds an aggregate one of whose
g_fn_safe:2789nurlc_print_help
g_fn_safe_list:2790gen_fn_decl
g_fn_sink:1565nurlc_print_helpPer-function sink-parameter map: space-separated parameter indices from explicit signatures and consuming call
g_fn_slice_decls:1259gen_fn_decl, mem_slice_decl_addCheap per-function gate for the Phase 2D slice machinery: most functions declare no owned slices at all, and t
g_fn_stores:1648nurlc_print_helpThe kept parameters whose value ends up somewhere the compiler drops — a literal, a local struct, a container
g_fn_strp:159__own_sink_str_params
g_fn_unverified:1659nurlc_print_helpRetention through an unverified foreign or indirect call. Lifetime-only facts; kept separate from diagnostic e
g_fold_cap:56329__fold_kind
g_fold_end:56336__ext_calls_back, __fold_reg
g_fold_fcap:56335__fold_kind
g_fold_flags:56322__sp_parts── Late flag folding ──────────────────────────────────────────── Whether a callee takes a parameter over (si
g_fold_flist:56333__fold_kind
g_fold_fn_end:56337__fold_arg_false
g_fold_k:56338__fold_operand
g_fold_map:56328__fold_kindSix words per register: 0 kind (0 none, 1 i1 constant, 2 text alias), 1-2 the constant or the alias's byte ran
g_fold_nf:56334__fold_arg_false, __fold_kind
g_fold_nt:56331__fold_kind
g_fold_tcap:56332__fold_kind
g_fold_touched:56330__fold_kind
g_fold_x:56339__fold_last_arg, __fold_operand, __fold_store_flag
g_fold_y:56340__fold_last_arg, __fold_operand, __fold_store_flag
g_frozen_impls:1818__coherence_registerWhether the program declares any % Frozen impl (gen_call asks only then).
g_frz_memo:1820__lty_frozen__ty_lend_frozen's answers, per lowered type (0 / 1 / 2).
g_frzp_any:1816__arcp_noteWhether any callee takes a % Frozen handle (frzp##): what it lends is frozen as an Arc's payload is, and r
g_func_count:1434__clo_bind_escapes, gen_call_kwargs, nurlc_print_help, store_closure_func
g_generic_struct_syms:1263nurlc_print_help
g_generic_syms:1262nurlc_print_help
g_hmemo_depth:46584__is_owned_struct_ty
g_hmemo_log:46583__is_owned_struct_ty── Coinductive memo for the handle predicates ───────────────────── __is_owned_struct_ty and `__clone_suppo
g_impl_name_syms:1268nurlc_print_help
g_impl_pos_syms:1334nurlc_print_help@ fname scan registration. Two files are free to each have a private __get-style helper IN THEIR OWN HEADS
g_impl_ret_syms:1267nurlc_print_help
g_impl_trait_syms:1269nurlc_print_help
g_in_cap:9435__sym_hash_n
g_in_chunk:9437__sym_hash_n
g_in_end:9439__sym_hash_n
g_in_match_arm:1249emit_or_chainNon-zero while parsing a ?? match-arm body. The XOR-confusion warning in gen_ret keys off "a non-terminator
g_in_n:9436__sym_hash_n
g_in_pos:9438__sym_hash_n
g_in_tab:9434__sym_hash_n── Interned strings ────────────────────────────────────────────── Every key and every plain value the symbol
g_in_unsafe:2724gen_fn_decl1 while the body of an unsafe function (or of a closure inside one) is being compiled.
g_init_globals:1232const_eval_intGlobals set once at program start (: ( Locked T ) g ( make )), as <name> <function> <type>; triples: the e
g_init_terminated:2876__ptr_src_ofg_init_terminated — 1 while a : binding's own INITIALISER terminated the block and the statement's remaining
g_input_key:56257nurlc_print_help
g_input_source:56256nurlc_print_helpBorrowed aliases to main's live source/key bindings when --stdin supplies an overlay. Every source read (inclu
g_inst_done:51052flush_deferred_instantiationsflush_deferred_instantiations: emit all queued generic instantiations. Re-reads count each iteration so transi
g_inst_tmpl:2734gen_import_declThe template a generic instance is being compiled from (its unsafe-ness).
g_last_alloc_reg:1531__clo_bind_escapes, __ptr_src_of, gen_fn_decl, is_ptr_ty +1The register a fresh allocation's address is in (nurl_alloc, nurl_zalloc, malloc, calloc, alloc, zalloc — thro
g_last_alloc_size:1537__clo_bind_escapes, gen_fn_decl, is_ptr_ty, mem_arg_consumption…and its byte count, when that memory is not zeroed (nurl_alloc, nurl_malloc, malloc): a cast of it to a struc
g_last_cast_direct:1219__gen_cast_body1 when the last cast cast a binding (gen_cast; gen_agg_lit reads it)
g_last_closure_cs:1399__clo_bind_escapes
g_last_closure_nonsend:1382__clo_bind_escapesrecord per impl block, verified after scan_fn_sigs once every impl across the program (incl. imports) is regis
g_last_type_ptr:9291nurl_str_cmp
g_lazy:43547nurlc_print_help
g_lazy_edges:43562lazy_reach, nurlc_print_helpThe program's reference graph, collected while scan_fn_sigs walks every file (0 when lazy compilation cannot r
g_lazy_force:43549gen_fn_decl_or_lazy, gen_import_decl, verify_super_obligations
g_lazy_live:43564lazy_reachThe functions lazy_reach found reachable from the roots: compiled in place.
g_lazy_queue:43551gen_fn_decl_or_lazy
g_lazy_root:43548nurlc_print_help
g_lazy_scan:43550gen_fn_decl_or_lazy
g_lazy_trace:43552nurlc_print_help
g_lib_kind_memo:2786nurlc_print_help
g_lint:2861nurlc_print_helpUnused-symbol lint (opt-in via --lint). Default OFF so ordinary builds — and the compiler's own bootstrap, w
g_lint_fpend:2867lint_initg_lint_fpend — the redundant-free lint's pending release calls (see lint_free_cand).
g_lint_gen:2868lint_fn_begin
g_lint_reads:2864lint_init
g_lint_recording:2883nurlc_print_help1 only during the main parse_program pass. Cleared before flush_deferred_instantiations so synthetic generic m
g_lint_syms:2862lint_init
g_lint_used:2863lint_init
g_live_lexers:9644__lx_is_space
g_live_symtables:9643__sym_hash_n
g_lm_calls:1764__gen_cast_body, mem_arg_consumptionWhile an aggregate literal is built (g_lm_depth > 0): every bare identifier a call in it hands to its callee,
g_lm_depth:1766__gen_cast_body
g_lm_inner:1765__gen_cast_body
g_lm_pend:1767__lm_moved_names
g_lm_pend_n:1768__lm_moved_names
g_loop_break_used:1898nurlc_print_helpg_loop_break_used[serial] is 1 when a break targeting the loop numbered serial (g_loop_serial, which n
g_loop_nest:1498gen_foreach, gen_loop
g_loop_serial:1626gen_foreach, gen_loop
g_lsrc_imemo:2744bck_defer_fn…and as bits per callee (mem_fn_lends_arg).
g_lsrc_memo:2742bck_defer_fnWhat each callee lends (mem_fn_lend_sources), once every summary is final: the deferred walks' memo, 0 outside
g_match_ser:1497emit_or_chain
g_maybe_moved:1463nurlc_print_help
g_member_obj:1502__gen_cast_body, mem_arg_consumption, store_global
g_member_path:2765__gen_cast_body
g_member_path_on:2764__gen_cast_body, __ptr_src_of, mem_arg_consumption, mem_check_ret_clo_lend +1The field path the last member read named (. . s a h → s.a.h; an element read through a pointer is the poi
g_mono_tparam_tys:1959gen_import_declSpace-separated list of the concrete type-arguments substituted for a generic function's type parameters in th
g_mp:56362__dce_ident_byte, __ext_calls_back── Journal elision ───────────────────────────────────────────────── A temporary registered with the panic jou
g_nc_flag_caps:1596__clo_bind_escapesThe captures of the closure being built that cannot be copied, owned by a binding of the enclosing frame, in a
g_nc_own_caps:1601__clo_bind_escapes…and those of a closure returned from the frame: the env owns them under a flag of its own, which the body cle
g_nl_buf:42623collect_fn_bodyN newlines — the re-lex padding that maps a template buffer's line 1 onto the template's real source line (see
g_noaddr_visiting:1489__ty_no_address_enum
g_open_bind_col:1635__ptr_src_of
g_open_bind_line:1634__ptr_src_of
g_open_bind_name:1633__ptr_src_ofThe binding whose initialiser is being generated (name, and where its : statement starts), "" outside one. A
g_origin_functions:40230nurlc_print_help
g_origin_named:40228bck_record_inferred_escape, origin_expr
g_origin_nodes:40227bck_record_inferred_escape, origin_exprReturn-escape inference (docs/MEMORY.md §2.8): record that the enclosing function may RETURN this bare-identif
g_origin_returns:40231nurlc_print_help
g_origin_work:40229bck_record_inferred_escape, origin_expr
g_owned_globals:1227const_eval_intNames of the mutable string globals that own their buffer (each has a compiler-emitted <name>__nurlown flag)
g_pending_escape:1727nurlc_print_helpDeferred interprocedural-escape checks (docs/MEMORY.md §3 forward / generic boundary). A stack reference passe
g_pending_impl:1749nurlc_print_helpDeferred summary IMPLICATIONS (docs/MEMORY.md §2.7 / §2.8). A summary is inferred as each body compiles, so a
g_pending_inline:2662gen_fn_decl, parse_toplevel_decl, scan_fn_sigsg_pending_inline is the inline prefix's counterpart to g_pending_simd: set when the parser consumes a TT_INL
g_pending_pub:2651parse_toplevel_decl, scan_fn_sigs, vis_take_pending_pubVisibility (grammar v2.0). Tracks the source-file of every @-defined function and per-file strict-mode opt-in.
g_pending_raw:2671scan_fn_sigs
g_pending_rawrep:2675gen_struct_decl, parse_toplevel_declraw : Name { … }: the struct's fields carry an invariant its API keeps (a device address that must stay insi
g_pending_simd:2657gen_fn_decl, parse_toplevel_decl, scan_fn_sigsg_pending_simd is the simd prefix's counterpart to g_pending_pub: set when the parser consumes a TT_SIMD ahe
g_pending_unsafe:2664gen_ffi_decl, gen_fn_decl, parse_toplevel_decl, scan_fn_sigsThe unsafe prefix parsed ahead of the next declaration.
g_pkgver_memo:10631__lx_is_space── ( pkg_version ) ─────────────────────────────────────────── ( pkg_version ) is the version of the pa
g_priv_file_count:1301priv_file_id
g_priv_file_ids:1300nurlc_print_help??/? arms). Consumers that NEED a value (a cast, a let/assign) die with this appended, so "produced no val
g_priv_owner_files:1303nurlc_print_help
g_priv_owner_ids:1302nurlc_print_help
g_priv_warned:1304nurlc_print_help
g_pt_star:736parse_type_paren, parse_type_ptrRaw-pointer types parse_type has read (*T anywhere but inside a closure type): a struct field whose type mov
g_ptr_own_n:1501__ptr_own_set, gen_fn_decl
g_ptrtab:1484nurlc_print_help
g_raw_fns:2670scan_fn_sigsraw @ f … (grammar v2.9): f's body may use raw memory, as an unsafe one's may, and f's CALLER must vouch f
g_rawlit_n:1504gen_fn_decl, mem_note_rawlit
g_rawlit_pending:1503__gen_cast_body, gen_fn_decl, mem_note_rawlit, mem_rawlit_unclaimed
g_rawret_memo:24267__fn_raw_ret
g_repl_checks:1866mem_arg_consumption
g_repl_edges:1865mem_arg_consumption
g_res_type_syms:508nurlc_print_help── Res-type NURL tracking (must be declared before parse_type_res) ── g_res_type_syms is initialized to a new
g_ret_forbidden:1243gen_logical_or_bitwise_and, gen_logical_or_bitwise_or, gen_operand, gen_stmt +1Cascade guard: 1 while parsing a VALUE OPERAND (a binary/unary/cast/ member operand, a call argument, a ?/`?
g_retclo_n:1505gen_fn_decl
g_root_syms:1579nurlc_print_helpThe module's root symbol table, for the type questions asked where no table is at hand (__is_handle_ty on a st
g_rpg_cur:24511bck_owning_reads
g_rpg_cur_id:24512bck_owning_reads
g_rpg_cur_pfx:24513bck_owning_reads
g_rpg_ecap:24528resolve_pending_ret_escapes
g_rpg_edge:24526resolve_pending_ret_escapes
g_rpg_f:24523bck_owning_readsA function's row, RPG_FW words: 0 its name (a copy), 1 1 when it has records, 2 what its other summaries say i
g_rpg_fcap:24525bck_owning_reads
g_rpg_fid:24514bck_owning_reads
g_rpg_list:41555__raw_writerThe records of function f, in order: g_rpg_list[ row 11 .. next ).
g_rpg_me_id:24530gen_fn_decl, resolve_pending_ret_escapes
g_rpg_me_self:24529gen_fn_decl
g_rpg_names:24510bck_owning_reads
g_rpg_nedge:24527resolve_pending_ret_escapes
g_rpg_nfn:24524bck_owning_reads
g_rpg_nrec:24503bck_owning_reads
g_rpg_nslot:24508bck_owning_reads
g_rpg_on:2732gen_fn_decl…and its graph is recorded (g_rpg): raw code with a parameter that can hold storage. Without one, nothing the
g_rpg_rcap:24504bck_owning_reads
g_rpg_rec:24502bck_owning_reads
g_rpg_scap:24509bck_owning_reads
g_rpg_sname:24507bck_owning_reads
g_rpg_tmp:24769__rprov_lend_exprA returned pointer (or a returned literal's pointer field) whose expression read reads: bound to a name of i
g_rpg_u:24506bck_owning_reads
g_rpg_v:24505bck_owning_reads
g_rprov_on:2728gen_fn_declRaw provenance is followed in this body (__rprov_note): it is raw code, an unsafe function or the trusted st
g_sanitize_address:56249nurlc_print_helpEmission policy, set by main's --sanitize-address flag.
g_simd_fns:2826__ffx_expandEvery simd function emit_multiversion has written, by its IR name (__nurl_fn.f), space-separated. The spli
g_sound:25940bck_soundThe sound-and-complete rules (docs/SOUND_COMPLETE_PLAN.md): moves and borrows. Under development they run when
g_source_snapshots:56258__dce_ident_byte, nurlc_print_help
g_sp_pin:58599__sp_whole
g_sp_pq:58600__sp_whole
g_sp_pqn:58601__sp_whole
g_sp_rchg:56096__sp_whole
g_split_fh:56114__sp_emit_global
g_split_fill:56092__sp_whole
g_split_max:56088nurlc_print_help
g_split_min:56089nurlc_print_help
g_split_n:56087__sp_parts, __sp_wholePartitioned emission — see "Partitioned emission" below.
g_split_out:56090nurlc_print_help
g_split_part:56091__sp_whole
g_split_priv:56093__sp_whole
g_split_rep:56094__sp_whole
g_split_repmask:56095__sp_whole
g_srcx_on:2778gen_fn_declSource expressions (srcx): where a view's value came from, as an expression the walk evaluates once every summ
g_stmt_bare_lit:5461gen_stmtg_stmt_bare_lit — set by gen_stmt to 1 when the statement it just parsed was a bare numeric/string LITERAL in
g_stmt_bare_value:5488gen_stmtg_stmt_bare_value — the literal flag's general sibling (critic A2, the last silent prefix-arity cascade): set
g_stmt_col:5304gen_block_ret, gen_stmtg_stmt_col — column of the current statement's first token, captured alongside g_stmt_line. die_stmt anchors
g_stmt_line:5297gen_block_ret, gen_stmtg_stmt_line — source line of the statement gen_stmt is currently parsing. Read by gen_ident's "unexpected toke
g_str_idx:1215emit_deferred_cstr, emit_str_global, gen_str_lit
g_str_syms:1216nurlc_print_help
g_strict_arity:1474nurlc_print_helpstrict-arity: the n-ary &/`\` arity trap is an ERROR by default. The trap is the language's one documented f
g_strict_borrowck:1462nurlc_print_help--strict-borrowck (off by default) enables three additional checks: (1) aliased mutation through `. obj fiel
g_struct_inst_syms:1266nurlc_print_help<sname>__stparams → space-separated type-var names (e.g. "T" or "K V") <sname>__sbody → raw body source inc
g_struct_tmp:1715__clo_bind_escapes, gen_fn_decl, mem_arg_consumption, mem_clo_drop_discardedThe struct temporary with owned fields most recently returned by a call, as `<value> <%Type> <owned-field toke
g_summaries_final:1492mem_emit_arg_flags
g_super_obligations:1372__coherence_register
g_sx:2803__sx_enter
g_sx_at:2802__sx_enter
g_sx_n:2801__sx_enter
g_sxe_arc:1827bck_arc_frozen_check, bck_borrow_begin, bck_sx_name, bck_take_plend +1At the borrow walk: whether the value of the source expression being evaluated is a view of an Arc's payload —
g_sxe_pos:27212__src_mark, bck_sx_arg_sources, bck_sx_name, bck_sx_sources── Source expressions in the walk ── The cursor of the evaluation in progress (bck_sx_sources), and whether it
g_tf_body:57922__ir_write_range
g_tf_en:57921__ir_write_range
g_tf_map:57924__ir_write_range
g_tf_olen:57926__ir_write_range
g_tf_out:57925__ir_write_range
g_tf_st:57920__ir_write_range── Type definitions first ────────────────────────────────────────── A named struct is printed where the gene
g_tf_state:57923__ir_write_range
g_trait_pending:1355nurlc_print_help<Trait>__tparam → trait's generic type-var name (e.g. "T") <Trait>__defaults → space-separat
g_trait_syms:1341nurlc_print_helpfirst registration. A $-imported impl is scanned once per importer, so the SAME (method, type) is registered
g_trust_memo:24147__trust_root── Raw memory and unsafe (docs/SOUND_COMPLETE_PLAN.md, P1) ─────── The stdlib is the vouched-for base: its
g_trust_roots:24148__trust_root
g_type_count:1433nurlc_print_help, store_closure_type
g_type_emit_base:1436nurlc_print_help
g_type_layouts:1663nurlc_print_helpType layout metadata precedes cleanup decisions; IR definitions retain their source ordering. This table owns
g_udrop_noinit:1640__ptr_src_of, __sb, emit_or_chainSet by a : binding just before registering its value: the binding rule stores the drop flag itself, so regis
g_unsafe_fns:2666gen_dyn_construct, scan_fn_sigsThe functions declared unsafe (name → 1; 0 until the first one).
g_unsafe_list:2715mem_velem_tag
g_unsafe_report:2714nurlc_print_help
g_use_argxfer:1583mem_emit_string_arg_transfers, mem_sink_str_arg
g_use_clear_if:1582mem_udrop_flag_clear_ifWhether this module calls the drop-flag helpers (emitted at module end).
g_use_hown:1584emit_dyn_method_thunk, mem_capture_hown, mem_publish_hown
g_use_ownstr:161mem_check_ret_clo_lend, mem_clo_ret_own_str
g_use_sinkstr:158mem_sink_str_arg
g_user_drop_seen:172__coherence_register, emit_dyn_drop_fn1 once the program declares a % Drop impl of its own (scan_impl_decl): until then no type has one, and the q
g_ut_gen:2750bck_unsafe_ctx
g_vctl_seen:2694gen_fn_decl, mem_arg_consumption, mem_note_velemSet by a call to nurl_vctl_data; the let that binds its result marks the pointer __velem (its element access
g_vis_file_gen:2749vis_set_current_src_file
g_vis_inst_targs:1962__die_if_generic_arityThe type arguments of the generic struct being instantiated (its field types are parsed in a pseudo-file); see
g_vis_syms:2652nurlc_print_help
g_void_reason:1270__void_reason_clear, emit_or_chain, int_width, mem_join_heads_stmt
g_xl_cap:2812bck_xl_resolve
g_xl_depth:2808bck_xl_declare, bck_xl_resolveThe frame depth and renames of the lexical scopes the borrow walk's rows are translated in (bck_xl_declare_id)
g_xl_nser:2813bck_xl_declare, bck_xl_resolve
g_xl_op:2811bck_xl_resolve
g_xl_ren:2809bck_xl_resolve
g_xl_ss:2810bck_xl_resolve