Issue 130318.1: DW_TAG_descriptor_type to describe descriptors
Section 5.14, pg
Applicable to Section 5.14 - Dynamic Type Properties
Overview:
Fortran objects are often accessed through a descriptor, with the address of the actual
raw data embedded within the descriptor. (A descriptor has often been called a dope vector
in other contexts, although it is often a structure of some kind rather than a simple vector).
This proposal adds a DW_TAG_descriptor_type to describe such descriptor.
Background:
Some languages, such as Fortran, provide types whose values may be dynamically allocated or
associated with a variable under explicit program control. Currently, these attributes, such
as DW_AT_allocated and DW_AT_associated are placed on the type DIE. This approach, in some
cases, forces creation of multiple type DIEs for a single Fortran type.
Consider this Fortran example with parameterized derived type:
program sample
type :: dt (l)
integer, len :: l
integer :: arr(l)
end type
integer :: n = 4
contains
subroutine s()
type (dt(n)) :: t1
type (dt(n)), pointer :: t2
type (dt(n)), allocatable :: t3, t4
end subroutine
end sample
t1, t2 and t3 all share the same type 'dt'. The current DWARF spec places all descriptor
related attributes (DW_AT_data_location, DW_AT_associated and DW_AT_allocated) on the
DW_TAG_structure_type DIE for 'dt'. Doing so would mean we have to generate 3 different
DW_TAG_structure_type DIEs to describe this program:
$21: DW_TAG_structure_type ! plain version
DW_AT_name (dt)
DW_AT_data_location (dwarf expression to locate raw data)
$21a: DW_TAG_member ...
$22: DW_TAG_structure_type ! 'pointer' version
DW_AT_name (dt)
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_associated (dwarf expression to test if associated)
$22a: DW_TAG_member ...
$23: DW_TAG_structure_type ! 'allocatable' version
DW_AT_name (dt)
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_allocated (dwarf expression to test is allocated)
$23a: DW_TAG_member ...
$24: DW_TAG_variable
DW_AT_name (t1)
DW_AT_type ($21)
DW_AT_location (dwarf expression to locate descriptor)
$25: DW_TAG_variable
DW_AT_name (t2)
DW_AT_type ($22)
DW_AT_location (dwarf expression to locate descriptor)
$26: DW_TAG_variable
DW_AT_name (t3)
DW_AT_type ($23)
DW_AT_location (dwarf expression to locate descriptor)
$27: DW_TAG_variable
DW_AT_name (t4)
DW_AT_type ($23)
DW_AT_location (dwarf expression to locate descriptor)
An alternative approach is to place the descriptor related attributes on
the variable, but doing so would cause t3 and t4 to have the same dynamic
type attributes, which is also less than optimal:
$31: DW_TAG_structure_type
DW_AT_name (dt)
$31a: DW_TAG_member ...
$32: DW_TAG_variable ! plain version
DW_AT_name (t1)
DW_AT_type ($31)
DW_AT_location (dwarf expression to locate descriptor)
DW_AT_data_location (dwarf expression to locate raw data)
$33: DW_TAG_variable ! 'pointer' version
DW_AT_name (t2)
DW_AT_type ($31)
DW_AT_location (dwarf expression to locate descriptor)
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_associated (dwarf expression to test if associated)
$34: DW_TAG_variable ! 'allocatable' version
DW_AT_name (t3)
DW_AT_type ($31)
DW_AT_location (dwarf expression to locate descriptor)
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_allocated (dwarf expression to test is allocated)
$35: DW_TAG_variable ! 'allocatable' version
DW_AT_name (t4)
DW_AT_type ($31)
DW_AT_location (dwarf expression to locate descriptor)
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_allocated (dwarf expression to test is allocated)
Proposal:
Revise Section 5.14: "Dynamic Type Properties"
*Some languages may represent objects using descriptors to hold information, including a
location and/or run-time parameters, about the data that reprsent the value for that object.*
A descriptor is represented by a debugging information entry with the tag
DW_TAG_descriptor_type. The descriptor type entry has a DW_AT_type attribute to describe
the type of object, whose additional attributes applies to. Any other attributes and/or
children debugging information entries on the descriptor type entry would behave
identically as if the attributes and/or children DIEs are attached to the referencing
type entry.
The new DWARF for the example program would look like:
$11: DW_TAG_structure_type
DW_AT_name (dt)
$11a: DW_TAG_member ...
$13: DW_TAG_descriptor_type ! plain version
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_type ($11)
$14: DW_TAG_descriptor_type ! 'pointer' version
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_associated (dwarf expression to test if associated)
DW_AT_type ($11)
$15: DW_TAG_descriptor_type ! 'allocatable' version
DW_AT_data_location (dwarf expression to locate raw data)
DW_AT_allocated (dwarf expression to test is allocated)
DW_AT_type ($11)
$16: DW_TAG_variable
DW_AT_name (t1)
DW_AT_type ($13)
DW_AT_location (dwarf expression to locate descriptor)
$17: DW_TAG_variable
DW_AT_name (t2)
DW_AT_type ($14)
DW_AT_location (dwarf expression to locate descriptor)
$18: DW_TAG_variable
DW_AT_name (t3)
DW_AT_type ($15)
DW_AT_location (dwarf expression to locate descriptor)
$19: DW_TAG_variable
DW_AT_name (t4)
DW_AT_type ($15)
DW_AT_location (dwarf expression to locate descriptor)
Appendix A:
Add to Figure 42: List of attributes allowed on DW_TAG_descriptor_type
DW_TAG_descriptor_type
DW_AT_allocated
DW_AT_associated
DW_AT_data_location
DW_AT_type
DW_AT_sibling
---
7/23/2013 - Accepted.
10/21/2013 - Updated to expand background and changes to standard Appendix A.