[Dwarf-Discuss] PROPOSAL: DW_OP_implicit_pointer
Jakub Jelinek
jakub@redhat.com
Sun Aug 15 19:01:58 GMT 2010
On Sun, Aug 15, 2010 at 02:52:04PM -0400, Ron Brender wrote:
> Finally, as described, it appears that this operator neither uses
> any values that are expected to be on the DEBUG stack nor has any
> effect (pushes/pops/whatever) on the DEBUG stack--is that correct?
It is a terminal, similarly to e.g. DW_OP_reg*, it can appear just
in the same contexts as DW_OP_reg*.
For:
int
bar (int i)
{
int *j = &i;
int **k = &j;
int ***l = &k;
i++;
return i;
}
GCC generates:
.uleb128 0x3 # (DIE (0x4e) DW_TAG_formal_parameter)
.ascii "i\0" # DW_AT_name
.byte 0x1 # DW_AT_decl_file (qqq.c)
.byte 0x2 # DW_AT_decl_line
.long 0x8c # DW_AT_type
.uleb128 0x3 # DW_AT_location
.byte 0x75 # DW_OP_breg5
.sleb128 1
.byte 0x9f # DW_OP_stack_value
.uleb128 0x4 # (DIE (0x5b) DW_TAG_variable)
.ascii "j\0" # DW_AT_name
.byte 0x1 # DW_AT_decl_file (qqq.c)
.byte 0x4 # DW_AT_decl_line
.long 0x93 # DW_AT_type
.uleb128 0x6 # DW_AT_location
.byte 0xf2 # DW_OP_GNU_implicit_pointer
.long .Ldebug_info0+78 # ref to DIE 0x4e
.sleb128 0
.uleb128 0x4 # (DIE (0x6b) DW_TAG_variable)
.ascii "k\0" # DW_AT_name
.byte 0x1 # DW_AT_decl_file (qqq.c)
.byte 0x5 # DW_AT_decl_line
.long 0x99 # DW_AT_type
.uleb128 0x6 # DW_AT_location
.byte 0xf2 # DW_OP_GNU_implicit_pointer
.long .Ldebug_info0+91 # ref to DIE 0x5b
.sleb128 0
.uleb128 0x4 # (DIE (0x7b) DW_TAG_variable)
.ascii "l\0" # DW_AT_name
.byte 0x1 # DW_AT_decl_file (qqq.c)
.byte 0x6 # DW_AT_decl_line
.long 0x9f # DW_AT_type
.uleb128 0x6 # DW_AT_location
.byte 0xf2 # DW_OP_GNU_implicit_pointer
.long .Ldebug_info0+107 # ref to DIE 0x6b
.sleb128 0
So, if the debugger wants to
print j
it knows that the value is implicit pointer and can print something like
<optimized out pointer>
but for
print *j
it sees it is a implicit pointer to DIE 0x4e with offset 0 and
that DIE has reg5 + 1 value, so it prints that value.
Jakub
More information about the Dwarf-discuss
mailing list