DWARF Standard

No way to describe Fortran derived types with deferred length components

Error

Open

Jakub Jelinek

Section 5.11, pg 126
When the producer implements Fortran derived type components with deferred length, e.g.
type t
integer :: j
character(len=:), allocatable :: f
integer :: i
end type
like in C:
struct t
{
int j;
void *f;
int i;
int _f_length; // The string length *f points to.
};
the current DWARF doesn't really allow to express this, at least not in the type
DIEs and their children (basically, for each variable of such type one would have
to create a new distinct set of type DIEs where the DW_AT_string_length attribute
would use a particular location expression specific to the particular variable.
The problem is that the string length is not stored in the CHARACTER(len=:)
objects themselves, but is shared by all the elements of the array. The
DW_AT_string_length must appear on the DW_TAG_string_type DIE, so
DW_OP_push_object_address on it pushes the address of a particular array
element. Where one can evaluate the string length is the DW_TAG_array_type,
where one could DW_OP_push_object_address, and is used for DW_AT_data_location
etc. We could e.g. allow DW_AT_string_length on DW_AT_array_type and have some
form of DW_AT_string_length or some new attribute on DW_TAG_string_type say that
DW_AT_string_length location isn't provided here, but on the parent (or grand
parent etc.) DW_TAG_array_type. Or have some DW_OP_* that would push address
of the containing array object instead of the current object's address.
--
12/06/2016 -- Defer to DWARF Version 6.