From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19825 invoked by alias); 16 May 2010 17:06:01 -0000 Mailing-List: contact archer-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: List-Id: Received: (qmail 19433 invoked by uid 22791); 16 May 2010 17:05:56 -0000 X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Subject: Re: Patch for pascal-dynamic arrays From: Joost van der Sluis To: Jonas Maebe Cc: Project Archer , Jan Kratochvil In-Reply-To: <4719101D-98D9-4000-9794-838695CDA95D@elis.ugent.be> References: <1256751286.31305.24.camel@wsjoost.cnoc.lan> <20091030094726.GA29758@host0.dyn.jankratochvil.net> <1257630529.27675.26.camel@wsjoost.cnoc.lan> <1271071502.27845.15.camel@wsjoost.cnoc.lan> <20100412195106.GA32767@host0.dyn.jankratochvil.net> <1271241292.21465.18.camel@wsjoost.cnoc.lan> <20100506230504.GA21919@host0.dyn.jankratochvil.net> <1273874250.9996.33.camel@wsjoost.cnoc.lan> <20100514224613.GA3338@host0.dyn.jankratochvil.net> <1273955042.32006.31.camel@wsjoost.cnoc.lan> <20100515214421.GA9965@host0.dyn.jankratochvil.net> <4719101D-98D9-4000-9794-838695CDA95D@elis.ugent.be> Content-Type: multipart/mixed; boundary="=-Y3itte2TWqgjmZv5Avxk" Date: Sun, 16 May 2010 17:06:00 -0000 Message-Id: <1274029467.5331.24.camel@wsjoost.cnoc.lan> Mime-Version: 1.0 X-Spam-Scanned: InterNLnet Mail Scan System V2.03 X-SW-Source: 2010-q2/txt/msg00026.txt.bz2 --=-Y3itte2TWqgjmZv5Avxk Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1543 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. --=-Y3itte2TWqgjmZv5Avxk Content-Disposition: attachment; filename="fpc-dwarf3-arrstrupperbound2.patch" Content-Type: text/x-patch; name="fpc-dwarf3-arrstrupperbound2.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-length: 5270 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 --=-Y3itte2TWqgjmZv5Avxk--