[Dwarf-discuss] [Proposal] Allow alternate encoding of DW_AT_object_pointer as a variable index instead of DIE reference
Michael Buch
michaelbuch12@gmail.com
Thu Jan 30 12:00:18 GMT 2025
# Allow alternate encoding of DW_AT_object_pointer as a variable index
instead of DIE reference
## Background
`DW_AT_object_pointer` is used by LLDB to conveniently determine the
CV-qualifiers
and storage class of C++ member functions when reconstructing types from DWARF.
GCC currently emits `DW_AT_object_pointer` on both declaration and
definition DIEs [1].
Clang does not emit them on declarations, making the LLDB heuristics
to find the object
parameter fragile. We tried attaching `DW_AT_object_pointer` to
declarations in Clang
too [2], but that came at the cost of a ~5-10% increase in the
`.debug_info` section size
for some users, so we reverted it. This proposal describes an
alternate encoding of the
`DW_AT_object_pointer` which allows us to add it to declaration DIEs without
incurring such size overheads.
## Overview
The idea is to encode the index of the `DW_TAG_formal_parameter` that is the
object parameter instead of a DIE reference. This index could then be of form
`DW_FORM_implicit_const`, so we don't pay the 4 bytes for each reference,
but instead pay for it once in the abbreviation.
The implementation in Clang for this is currently being discussed in [3].
The DWARF spec currently only mentions `reference` as the attribute class
of `DW_AT_object_pointer`. So consumers may be surprised by this alternate
encoding. Hence we thought it'd be good to run this past the committee.
An alternative solution could be a new attribute describing the object
parameter index (e.g., `DW_AT_object_pointer_index` with a `constant`
attribute class).
## Proposed Changes
In chapter "7.5.4 Attribute Encodings", change the "Table 7.5:
Attribute encodings"
table as follows:
[ORIGINAL TEXT]
>>>>>>>>>>>>>>>
Attribute Name | Value | Classes
-----------------------------------------------------------------------
...
DW_AT_object_pointer | 0x64 | reference
...
[NEW TEXT]
==========
Attribute Name | Value | Classes
-----------------------------------------------------------------------
...
DW_AT_object_pointer | 0x64 | reference, constant
...
<<<<<<<<<<<<<<<
In chapter "5.7.8 Member Function Entries", extend the attribute class
recommendation
as follows:
[ORIGINAL TEXT]
>>>>>>>>>>>>>>>
If the member function entry describes a non-static member function, then that
entry has a DW_AT_object_pointer attribute whose value is a reference to the
formal parameter entry that corresponds to the object for which the function is
called.
[NEW TEXT]
==========
If the member function entry describes a non-static member function, then that
entry has a DW_AT_object_pointer attribute whose value is a reference to the
formal parameter entry that corresponds to the object for which the function is
called. A producer may also choose to represent it as a constant whose value is
the zero-based index of the formal parameter that corresponds to the object
parameter.
<<<<<<<<<<<<<<<
## References
* [1]: https://godbolt.org/z/3TWjTfWon
* [2]: https://github.com/llvm/llvm-project/pull/122742
* [3]: https://github.com/llvm/llvm-project/pull/124790
More information about the Dwarf-discuss
mailing list