[fpc-devel] Incorrect dwarf for shortstring

Martin lazarus at mfriebe.de
Sun Oct 20 23:59:20 CEST 2013

using dwarf2
   var s: string[5]
will generate info as shown at the end of this mail

The array "st" is at
   DW_AT_data_member_location: 2 byte block: 23 1 (DW_OP_plus_uconst: 1)
That means, the array does not contain the length.

Yet the bounds of the array are 0 to 5.
That is one to much. It also leads to gdb showing the wrong char for 
"s[1]". Should show first, but does show 2nd

While on the subject. Is there any better way to encode ansistrings? 
(currently simply as pointer to char). I hoped it was only gdb 
shortcoming  that they are indistinguishable from pchar (0 based idx vs 
1 based). But actually fpc, encodes them as the same thing. (even dwarf2 
has DW_TAG_string_type / I dont know about gdb...) DW_TAG_string_type 
allows even for a length. It does not have a start index...

  <2><1b5>: Abbrev Number: 6 (DW_TAG_structure_type)
     <1b6>   DW_AT_name        : ShortString
     <1c2>   DW_AT_byte_size   : 6
  <3><1c3>: Abbrev Number: 7 (DW_TAG_member)
     <1c4>   DW_AT_name        : length
     <1cb>   DW_AT_data_member_location: 2 byte block: 23 0      
(DW_OP_plus_uconst: 0)
     <1ce>   DW_AT_type        : <0x230>
  <3><1d2>: Abbrev Number: 7 (DW_TAG_member)
     <1d3>   DW_AT_name        : st
     <1d6>   DW_AT_data_member_location: 2 byte block: 23 1      
(DW_OP_plus_uconst: 1)
     <1d9>   DW_AT_type        : <0x1de>
  <2><1de>: Abbrev Number: 8 (DW_TAG_array_type)
     <1df>   DW_AT_byte_size   : 6
     <1e0>   DW_AT_stride      : 1
     <1e1>   DW_AT_type        : <0x2a0>
  <3><1e5>: Abbrev Number: 9 (DW_TAG_subrange_type)
     <1e6>   DW_AT_lower_bound : 0
     <1e7>   DW_AT_upper_bound : 5
     <1e8>   DW_AT_type        : <0x230>

More information about the fpc-devel mailing list