mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
llvm: make debuggers actually usable
`@llvm.dbg.value` is absolutely useless, adding a temporary alloca
to store the constant in will make it actually show up in debuggers.
The effect on performance should be minimal since there is only one
store and it the change is not applied to ReleaseSafe builds.
```zig
fn foo(a: u32, b: []const u8, c: bool, d: enum { yes, no }) void {
_ = a; _ = b; _ = c; _ = d;
}
```
before:
```
Breakpoint 1, a.foo (a=<optimized out>, b=..., c=<optimized out>, d=<optimized out>) at a.zig:18
18 _ = d;
```
after:
```
Breakpoint 1, a.foo (a=1, b=..., c=false, d=yes) at a.zig:15
15 _ = a; _ = b; _ = c; _ = d;
(gdb) p b
$1 = {ptr = 0x20854f <a.main.anon_3888> "bar", len = 3}
```
This commit is contained in:
parent
e4fd9acc2a
commit
fb4a5ccdee
@ -6088,6 +6088,12 @@ pub const FuncGen = struct {
|
||||
const insert_block = self.builder.getInsertBlock();
|
||||
if (isByRef(operand_ty)) {
|
||||
_ = dib.insertDeclareAtEnd(operand, di_local_var, debug_loc, insert_block);
|
||||
} else if (self.dg.module.comp.bin_file.options.optimize_mode == .Debug) {
|
||||
const alignment = operand_ty.abiAlignment(self.dg.module.getTarget());
|
||||
const alloca = self.buildAlloca(operand.typeOf(), alignment);
|
||||
const store_inst = self.builder.buildStore(operand, alloca);
|
||||
store_inst.setAlignment(alignment);
|
||||
_ = dib.insertDeclareAtEnd(alloca, di_local_var, debug_loc, insert_block);
|
||||
} else {
|
||||
_ = dib.insertDbgValueIntrinsicAtEnd(operand, di_local_var, debug_loc, insert_block);
|
||||
}
|
||||
@ -8026,6 +8032,12 @@ pub const FuncGen = struct {
|
||||
const insert_block = self.builder.getInsertBlock();
|
||||
if (isByRef(inst_ty)) {
|
||||
_ = dib.insertDeclareAtEnd(arg_val, di_local_var, debug_loc, insert_block);
|
||||
} else if (self.dg.module.comp.bin_file.options.optimize_mode == .Debug) {
|
||||
const alignment = inst_ty.abiAlignment(self.dg.module.getTarget());
|
||||
const alloca = self.buildAlloca(arg_val.typeOf(), alignment);
|
||||
const store_inst = self.builder.buildStore(arg_val, alloca);
|
||||
store_inst.setAlignment(alignment);
|
||||
_ = dib.insertDeclareAtEnd(alloca, di_local_var, debug_loc, insert_block);
|
||||
} else {
|
||||
_ = dib.insertDbgValueIntrinsicAtEnd(arg_val, di_local_var, debug_loc, insert_block);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user