Issue 161109.1: No way to describe Fortran derived types with deferred length components
Author: | Jakub Jelinek |
---|---|
Champion: | Jakub Jelinek |
Date submitted: | 2016-11-09 |
Date revised: | |
Date closed: | |
Type: | Error |
Status: | Incomplete |
DWARF Version: | 6 |
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.