Issue 250130.1: Allow alternate encoding of DW_AT_object_pointer as a variable index
| Author: | Michael Buch |
|---|---|
| Champion: | David Blaikie |
| Date submitted: | 2025-01-30 |
| Date revised: | |
| Date closed: | 2025-03-03 |
| Type: | Enhancement |
| Status: | Accepted |
| DWARF version: | 6 |
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_pointerattribute 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_pointerattribute 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.
2025-03-03: Accepted as written. Alternative new form for DIE-relative offset could be a separate proposal if deemed useful.