diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-03-12 19:55:48 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-13 03:41:31 -0400 |
| commit | 0bc96354909c0828b7fd36ce0be5705b7b21d63c (patch) | |
| tree | 2b544abbf34776414478cb5fe4b8baad661337b3 /src/codegen/c.zig | |
| parent | 7ec2261dbf7a85f5c215f2dac22b80fca7de1e0f (diff) | |
| download | zig-0bc96354909c0828b7fd36ce0be5705b7b21d63c.tar.gz zig-0bc96354909c0828b7fd36ce0be5705b7b21d63c.zip | |
stage2: add debug info for locals in the LLVM backend
Adds 2 new AIR instructions:
* dbg_var_ptr
* dbg_var_val
Sema no longer emits dbg_stmt AIR instructions when strip=true.
LLVM backend: fixed lowerPtrToVoid when calling ptrAlignment on
the element type is problematic.
LLVM backend: fixed alloca instructions improperly getting debug
location annotated, causing chaotic debug info behavior.
zig_llvm.cpp: fixed incorrect bindings for a function that should use
unsigned integers for line and column.
A bunch of C test cases regressed because the new dbg_var AIR
instructions caused their operands to be alive, exposing latent bugs.
Mostly it's just a problem that the C backend lowers mutable
and const slices to the same C type, so we need to represent that in the
C backend instead of printing two duplicate typedefs.
Diffstat (limited to 'src/codegen/c.zig')
| -rw-r--r-- | src/codegen/c.zig | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index f1da1fdc0c..5ab84520a4 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1721,6 +1721,10 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO .union_init => try airUnionInit(f, inst), .prefetch => try airPrefetch(f, inst), + .dbg_var_ptr, + .dbg_var_val, + => try airDbgVar(f, inst), + .call => try airCall(f, inst, .auto), .call_always_tail => try airCall(f, inst, .always_tail), .call_never_tail => try airCall(f, inst, .never_tail), @@ -2651,6 +2655,16 @@ fn airDbgStmt(f: *Function, inst: Air.Inst.Index) !CValue { return CValue.none; } +fn airDbgVar(f: *Function, inst: Air.Inst.Index) !CValue { + const pl_op = f.air.instructions.items(.data)[inst].pl_op; + const name = f.air.nullTerminatedString(pl_op.payload); + const operand = try f.resolveInst(pl_op.operand); + _ = operand; + const writer = f.object.writer(); + try writer.print("/* var:{s} */\n", .{name}); + return CValue.none; +} + fn airBlock(f: *Function, inst: Air.Inst.Index) !CValue { const ty_pl = f.air.instructions.items(.data)[inst].ty_pl; const extra = f.air.extraData(Air.Block, ty_pl.payload); |
