ERR/E3.0 (slice 3a): embedded Frame trace resolution
Return-trace frames now resolve to real `func at file:line:col`
in-process — no DWARF, no symbolizer.
- New niladic, span-stamped `.trace_frame` IR op (mirrors is_comptime):
carries no operands; each backend derives the frame from context.
lower.zig's placeholderTraceFrame emits it; the existing
sx_trace_push call consumes it.
- emit_llvm: resolve the op's span + current function to
{file(basename), line, col, func}, build an interned Frame global
({string,i32,i32,string}, strings cached by content), push its
address (ptrtoint).
- interp: pack (func_id << 32 | span.start) for the comptime resolver
(slice 3b); never a pointer.
- sx_trace.c report_unhandled derefs SxFrame; trace.sx gains the Frame
struct, frame_at -> *Frame, and field-reading to_string. Layout
mirrored in 3 places with cross-ref comments.
Verified JIT + AOT. Snapshots 243/244/247 regenerated (placeholder ->
func at file:line:col). Gates: zig build, zig build test,
run_examples.sh -> 290 passed.
This commit is contained in:
@@ -13193,12 +13193,12 @@ pub const Lowering = struct {
|
||||
_ = self.builder.emit(.{ .call = .{ .callee = fids.clear, .args = &.{} } }, .void);
|
||||
}
|
||||
|
||||
/// A placeholder trace frame for a failure site (ERR E3.2). Until DWARF
|
||||
/// (E3.0) provides return-address PCs, push a nonzero constant so the buffer
|
||||
/// records that a frame occurred (the formatter notes "frame unavailable").
|
||||
/// Nonzero because frame value 0 is the buffer's out-of-range / empty marker.
|
||||
/// The trace frame value for a failure site (ERR E3.0 slice 3a). Emits the
|
||||
/// niladic `.trace_frame` op (span-stamped via `Builder.current_span`); each
|
||||
/// backend resolves it to a real frame — `emit_llvm` to a `Frame*`, `interp`
|
||||
/// to a packed `(func_id, offset)`. The result feeds `sx_trace_push`.
|
||||
fn placeholderTraceFrame(self: *Lowering) Ref {
|
||||
return self.builder.constInt(1, .u64);
|
||||
return self.builder.emit(.{ .trace_frame = {} }, .u64);
|
||||
}
|
||||
|
||||
/// When a namespaced import (`Ns :: #import "..."`) contains foreign-class
|
||||
|
||||
Reference in New Issue
Block a user