The below proposal is with reference to
https://lists.dwarfstd.org/pipermail/dwarf-discuss/2026-April/002809.html
https://lists.dwarfstd.org/pipermail/dwarf-discuss/2026-April/002808.html
For current FreePascal such a ref-count would at least need to apply to
* DW_TAG_string_type
* DW_TAG_array_type
I listed more types, since the concept may apply to other types in
futures. Also other language may have ref-counts too.
I wasn't sure if to also add DW_TAG_reference_type?
------------------------------------------
# Proposal to implement DW_AT_refcount (e.g. for Pascal strings and
dynamic array)
## Background
Pascal (examples for FreePascal / similar in Delphi) has some types that
are ref-counted by compiler generated code.
The compiler internally adds a ref-count field to the memory of those
types. Those are currently
* Some string types like AnsiStrings. But not ShortString
* Dynamic arrays (arrays with variable length, controlled at runtime).
But not static (fixed size) array.
Those ref-counts are not accessible to user-code. They are fully managed
by the compiler.
The refcount may be needed:
* for inspection by the user during debugging
* for the debugger to modify/create/release such data on the users request.
A debugger would still need to know the producer, in order to know how
to handle such data. E.g. calling special methods to increase/decrease
the value.
Also with Pascal the special value -1 exists for constant data (that can
not decrease its reference, and not be freed).
But even if a debugger does not know how to modify ref-counts, it may
still use the information to reject requests to modify the data.
## Proposed Changes for types
Add new attributes
* DW_AT_ref_count (location, reference, constant, flag)
* DW_AT_ref_count_size, DW_AT_ref_count_bit_size
If DW_AT_ref_count is a flag then it indicates the presence of a
refcount for which the value is not known.
This may have been optimised away. Individual data-tags may provide
values as specified below.
Those attributes should be allowe with any TAG that defines a type.
* DW_TAG_string_type
* DW_TAG_array_type
* DW_TAG_base_type
* DW_TAG_class_type
* DW_TAG_interface_type
* DW_TAG_structure_type
* DW_TAG_pointer_type
* DW_TAG_enumeration_type
* DW_TAG_set_type
* DW_TAG_file_type
* DW_TAG_subrange_type
* DW_TAG_subroutine_type
* DW_TAG_thrown_type
* DW_TAG_pointer_to_member
* DW_TAG_dynamic_type
* DW_TAG_union_type
## Proposed Changes for data
Data may not always be hold in memory. (DW_AT_const_value /
DW_op_implicit_value). In such cases a ref value may not be encoded into
the constant data.
It would be good, if those value would still be able to use the same
type declaration.
The following tags should therefore support the new DW_AT_ref_count,
DW_AT_ref_count_size, DW_AT_ref_count_bit_size:
* DW_TAG_formal_parameter
* DW_TAG_variable
* DW_TAG_constant
* type
If they specify a refcount then the value given overrides the value in
the type.
* For those tags, the presence of those attribute should only be allowed
if the type has at least a type.
* If any of those tags specifies such an override, then all ref-count
related attributes in the type are ignored. Therefore the type
DW_AT_ref_count must then be present on this type.
* If DW_AT_ref_count for such a tag is a flag, it should be expected to
be true, as the type demands the presence of a ref-count. types should
be interpreted as, there is a ref-count, but its value is not type
## type
1$: DW_TAG_string_type
DW_AT_type(reference to chartype)
DW_AT_data_location(expression= ! Get raw data address
DW_OP_push_object_address
DW_OP_deref)
DW_AT_string_length (n)
DW_AT_ref_count (expression= ! Get raw data address
DW_OP_push_object_address
DW_OP_deref
DW_OP_lit1
DW_OP_minus)
DW_AT_ref_count_size (1) ! byte sized
2$ DW_TAG_variable
DW_AT_name
DW_AT_location
DW_AT_type($1)
3$ DW_TAG_constant
DW_AT_name
DW_AT_const_value ! The const_value starts with the first char
of the string
DW_AT_type($1)
DW_AT_ref_count (-1) ! constant, the location "1 byte before
the string-data can not be accessed in the const_value
--
Dwarf-discuss mailing list
[email protected]
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss