Patch for pascal-dynamic arrays
Jan Kratochvil
jan.kratochvil@redhat.com
Sat May 15 21:44:00 GMT 2010
On Sat, 15 May 2010 22:24:02 +0200, Joost van der Sluis wrote:
> But it works great.
Thanks, checked-in as:
b468b41f5c4cf1a5a55fc33402ce4695ace3579c
> Take a look a this bug-report
> (http://sourceware.org/bugzilla/show_bug.cgi?id=11492) about the
> identification of arrays. It has a better fix for that, and it avoids
> problems when merging this later.
OK, removed that part from the patch above. It will get merged again only
with new FSF GDB HEAD anyway.
> And when you do a 'print s' when the breakpoint is before line 80. (In
> arrays.pas) you get 'Object is not allocated'. In theory this is true,
> but unallocated strings in pascal are handled as empty strings (''). But
> that's a minor issue that's fixable in p-valprint only.
33:var StatArrInt: TStatArrInt;
44: s: string;
48:begin
80: s := 'test'#0'string';
I believe In such case the DWARF data should not use DW_AT_allocated at all.
<1><255>: Abbrev Number: 21 (DW_TAG_array_type)
<256> DW_AT_name : AnsiString
<261> DW_AT_data_location: 2 byte block: 97 6 (DW_OP_push_object_address; DW_OP_deref)
<264> DW_AT_allocated : 2 byte block: 97 6 (DW_OP_push_object_address; DW_OP_deref)
<267> DW_AT_type : <0x437>
<2><26b>: Abbrev Number: 22 (DW_TAG_subrange_type)
<26c> DW_AT_lower_bound : 1
<26d> DW_AT_upper_bound : 5 byte block: 97 6 38 1c 6 (DW_OP_push_object_address; DW_OP_deref; DW_OP_lit8; DW_OP_minus; DW_OP_deref)
In the case of Fortran the runtime crashes (on a NULL dereference) while
accessing non-allocated object. But if the "allocation" is just an internal
compiler issue which should be hidden by the same compiler at the DWARF level.
Therefore I would guess to use some:
drop DW_TAG_array_type -> DW_AT_allocated
DW_TAG_subrange_type -> DW_AT_upper_bound:
DW_OP_push_object_address
DW_OP_deref
DW_OP_dup
DW_OP_bra allocated
DW_OP_lit0
DW_OP_skip end
allocated:
DW_OP_lit8
DW_OP_minus
DW_OP_deref
end:
> The next challenge is to print individual items from the array. (print
> DynArrStr[3]). But that didn't work with my patch either. And I think
> that with your solution it's easier to implement this.
$1 = {'dstr0', 'dstr1', 'dstr2', 'dstr3', 'dstr4', 'dstr5', 'dstr6', 'dstr7', 'dstr8', 'dstr9', 'dstr10', 'dstr11', 'dstr12'}
$2 = '?`???'#127#0#0'0a??'
OK... hopefully some new similar patch would work.
Thanks,
Jan
More information about the Archer
mailing list