This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
Re: Patch for pascal-dynamic arrays
On Sun, 2010-05-16 at 14:04 +0200, Jonas Maebe wrote:
> On 15 May 2010, at 23:44, Jan Kratochvil wrote:
>
> > 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:
>
> I agree. Joost, I've attached a patch for FPC's DWARF writer to fix it. I can't test whether it works (the dumped DWARF info looks ok though), because I can't get gdb/F-13 to build:
It doesn't work.
That's because type_length_get() (gdbtypes.c) does not return 0 when the
high and low-bound are equal to each other. Instead it returns the
element-size. Then allocate_value_lazy tries to read element-size bytes
from the base-address (being 0x0) -> av.
I think that type_length_get() not returning 0 is a bug, (also because
there is a comment in the function that some part of the code doesn't
handle count=0 right. But I think that should be count=1) but it could
be that it's on purpose for Fortran. Jan, can you comment on this?
There's also a second problem. The lower bound is 1 for strings. With
Jonas' patch for fpc the upper bound of strings is 0 when not allocated.
Leading to a size of -1. An easy fix, new patch is attached.
Joost.
Index: dbgdwarf.pas
===================================================================
--- dbgdwarf.pas (revision 15284)
+++ dbgdwarf.pas (working copy)
@@ -3558,9 +3558,6 @@
]);
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_push_object_address)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
- append_block1(DW_AT_allocated,2);
- current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_push_object_address)));
- current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
append_labelentry_ref(DW_AT_type,def_dwarf_lab(def.elementdef));
finish_entry;
@@ -3568,10 +3565,19 @@
append_entry(DW_TAG_subrange_type,false,[
DW_AT_byte_stride,DW_FORM_udata,def.elesize,
DW_AT_lower_bound,DW_FORM_udata,0,
- DW_AT_upper_bound,DW_FORM_block1,5
+ DW_AT_upper_bound,DW_FORM_block1,13
]);
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_push_object_address)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_dup)));
+ { pointer = nil? }
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_bra)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_16bit(4));
+ { yes -> length = 0 }
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_lit0)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_skip)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_16bit(3));
+ { no -> load length }
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_lit0)+sizeof(ptrint)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_minus)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
@@ -3607,13 +3613,6 @@
we point to address of the string
}
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
-
- { also add how to detect whether or not the string is allocated: if the pointer is 0
- then it isn't, otherwise it is
- }
- append_block1(DW_AT_allocated,2);
- current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_push_object_address)));
- current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
end
else
begin
@@ -3630,9 +3629,9 @@
if deref then
begin
if (chardef.size=1) then
- upperopcodes:=5
+ upperopcodes:=13
else
- upperopcodes:=7;
+ upperopcodes:=15;
{ lower bound is always 1, upper bound (length) needs to be calculated }
append_entry(DW_TAG_subrange_type,false,[
DW_AT_lower_bound,DW_FORM_udata,1,
@@ -3642,14 +3641,24 @@
{ high(string) is stored sizeof(ptrint) bytes before the string data }
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_push_object_address)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_dup)));
+ { pointer = nil? }
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_bra)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_16bit(4));
+ { yes -> length = 0 }
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_lit1)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_skip)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_16bit(3));
+ { no -> load length }
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_lit0)+sizeof(ptrint)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_minus)));
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_deref)));
+
{ for widestrings, the length is specified in bytes, so divide by two }
- if (upperopcodes=7) then
+ if (upperopcodes=15) then
begin
current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_lit1)));
- current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_shra)));
+ current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_shr)));
end;
end
else