[PATCH] dwarf2loc.c: Perform a pointer to address conversion for DWARF_VALUE_MEMORY
Pedro Alves
palves@redhat.com
Wed Dec 9 11:20:00 GMT 2015
On 11/25/2015 06:17 AM, Kevin Buettner wrote:
> This patch fixes the following failures for rl78-elf:
>
> FAIL: gdb.base/vla-datatypes.exp: print int_vla
> FAIL: gdb.base/vla-datatypes.exp: print unsigned_int_vla
> FAIL: gdb.base/vla-datatypes.exp: print double_vla
> FAIL: gdb.base/vla-datatypes.exp: print float_vla
> FAIL: gdb.base/vla-datatypes.exp: print long_vla
> FAIL: gdb.base/vla-datatypes.exp: print unsigned_long_vla
> FAIL: gdb.base/vla-datatypes.exp: print char_vla
> FAIL: gdb.base/vla-datatypes.exp: print short_vla
> FAIL: gdb.base/vla-datatypes.exp: print unsigned_short_vla
> FAIL: gdb.base/vla-datatypes.exp: print unsigned_char_vla
> FAIL: gdb.base/vla-datatypes.exp: print foo_vla
> FAIL: gdb.base/vla-datatypes.exp: print bar_vla
> FAIL: gdb.base/vla-datatypes.exp: print vla_struct_object
> FAIL: gdb.base/vla-datatypes.exp: print vla_union_object
> FAIL: gdb.base/vla-ptr.exp: print td_vla
> FAIL: gdb.mi/mi-vla-c99.exp: evaluate complete vla
>
> The first failure in this bunch occurs due to printing an incorrect
> result for a variable length array:
>
> print int_vla
> $1 = {-1, -1, -1, -1, -1}
>
> The result should actually be this:
>
> $1 = {0, 2, 4, 6, 8}
>
> When I started examining this bug, I found that printing an
> individual array element worked correctly. E.g. "print int_vla[2]"
> resulted in 4 being printed. I have not looked closely to see why
> this is the case.
>
> I found that evaluation of the location expression for int_vla was
> causing problems. This is the relevant DWARF entry for int_vla:
>
> <2><15a>: Abbrev Number: 10 (DW_TAG_variable)
> <15b> DW_AT_name : (indirect string, offset: 0xbf): int_vla
> <15f> DW_AT_decl_file : 1
> <160> DW_AT_decl_line : 35
> <161> DW_AT_type : <0x393>
> <165> DW_AT_location : 4 byte block: 86 7a 94 2 (DW_OP_breg22 (r22): -6; DW_OP_deref_size: 2)
>
> I found that DW_OP_breg22 was providing a correct result.
> DW_OP_deref_size was fetching the correct value from memory. However,
> the value being fetched should be considered a pointer.
> DW_OP_deref_size zero extends the fetched value prior to pushing
> it onto the evaluation stack. (The DWARF-4 document specifies this
> action; so GDB is faithfully implementing the DWARF-4 specification.)
>
> However, zero extending the pointer is not sufficient for converting
> that value to an address for rl78 and (perhaps) other architectures
> which define a `pointer_to_address' method. (I suspect that m32c
> would have the same problem.)
>
> Ideally, we would perform the pointer to address conversion in
> DW_OP_deref_size. We don't, however, know the type of the object
> that the address refers to in DW_OP_deref_size. I can't think
> of a way to infer the type at that point in the code.
I'd think this would be another case of old-style untyped-dwarf, so
should be handled with dwarf_expr_address_type. But that doesn't
distinguish data / code pointers types, only sizes, which isn't sufficient.
In that case, this seems reasonable to me.
Thanks,
Pedro Alves
More information about the Gdb-patches
mailing list