(hopefully this doesn't get too lost in all the other discussion in this
thread - maybe best to spin things out under separate subject
lines/subthreads?)

(I'm looking into this more in the context of LLVM trying to solve the
downcasting part of this, motivated by Sony's SCE debugger but also with
interest from LLDB & some perspective on GDB provided by Tom Tromey and
much appreciated: https://github.com/llvm/llvm-project/pull/130255 )

On Tue, May 6, 2025 at 6:20 PM Cary Coutant via Dwarf-discuss <
dwarf-discuss@lists.dwarfstd.org> wrote:

> I've written a three-part proposal to address these issues:
>
>    - The first part, 250506.1 <https://dwarfstd.org/issues/250506.1.html>,
>    proposes a standard mechanism for locating the virtual function table
>    (vtable) given an object of a polymorphic class.
>
> The proposed mechanism is a single attribute on the type with the location
description of the vtable (given a pointer to the object), yeah? I wouldn't
think this would address one of the discussed/requested needs, which is to
know where/how much space it takes up in the layout/that the gap is not
padding, right? If you wanted to know the layout, you'd have to partially
evaluate the expression to get to the pointer - whereas the expression when
fully evaluated would give you the vtable itself, having passed through the
vtable pointer already.
Is there a use case where there isn't a vtable pointer in the layout that
can be described like another member? (admittedly encoding a member takes
more bytes of DWARF than a single location attribute)

>
>    - The second part, 250506.2 <https://dwarfstd.org/issues/250506.2.html>,
>    proposes a standard mechanism for identifying the most-derived class of an
>    object, given its vtable location, in order to support downcasting of
>    pointers while debugging.
>
> Introducing such a niche list to the CU feels a bit awkward - if vtables
were encoded as artificial static member variables (with some more
DWARF-supported attribute to distinguish them) then perhaps we could
introduce DW_AT_data_ranges to the CU for data ranges more generally, and
lookup vtables by address through that? It'd address the gap that
aranges->CU ranges left and this specific vtable use case as well.

>
>    - The third part, 250506.3 <https://dwarfstd.org/issues/250506.3.html>,
>    proposes a fix to the DW_AT_vtable_elem_location attribute, which
>    appears to be incorrectly implemented in compilers today.
>
> This sounds OK to me - yeah, GCC and LLVM can move to the constant
encoding and then maybe, one day, eventually, GDB and LLDB could drop
support for the mis-implemented expression-evaluated-to-constant-offset.


> -cary
>
>
> On Fri, May 2, 2025 at 1:31 PM Todd Allen via Dwarf-discuss <
> dwarf-discuss@lists.dwarfstd.org> wrote:
>
>> FWIW, when we at Concurrent were in the compiler business, our C++
>> compilers generated two vendor-defined attributes, both hanging off the
>> DW_TAG_{structure,class}_type.  Here are a couple with some sample
>> locations:
>>
>> DW_AT_vtable_location [DW_OP_plus_uconst 0; DW_OP_deref]
>> DW_AT_type_vtable_location [DW_OP_addr 0x12345678]
>>
>> The first was a description of how to obtain the address of the vtable
>> tag from an object.
>> The second was a description of the address of the vtable tag from just
>> the type.
>>
>> As we characterized them internally, they didn't have to be the address
>> of the vtable proper.  They just had to be something that could be compared
>> as a positive identification of the actual type.  I believe they always
>> were the actual vtable addresses, though.  Because why not?
>>
>> We do still have logic in our debugger to use them, too.  In addition to
>> the mangling-based approaches.
>>
>> It does require walking the whole DWARF tree to find them.
>>
>> Todd
>>
>> On 4/25/25 09:49, Jeremy Morse via Dwarf-discuss wrote:
>>
>> Hi all,
>>
>> The LLVM discussion linked [0] happens to be us Sony folks, and it's
>> supporting the use-case Kyle described of automatic downcasting, i.e.
>> identifying the most-derived-class of an object from its vtable pointer.
>> Having to demangle the symbol table is a real pain (Tom, CC'd knows more)
>> especially with things like anonymous namespaces.
>>
>> Right now the approach is to have a top-level nameless global variable
>> with the location set to the vtable address, and a DW_AT_specification
>> linking into the class definition:
>>
>> 0x00000082:   DW_TAG_variable
>>                 DW_AT_specification     (0x000000b6 "_vtable$")
>>                 DW_AT_alignment (8)
>>                 DW_AT_location  (DW_OP_addrx 0x1)
>>
>> [Then deeper into the DIE tree,]
>>
>> 0x0000008b:   DW_TAG_structure_type
>>                 DW_AT_containing_type   (0x00000034 "CBase")
>>                 DW_AT_calling_convention        (DW_CC_pass_by_reference)
>>                 DW_AT_name      ("CDerived")
>>                 DW_AT_decl_file ("vtables.cpp")
>>                 DW_AT_decl_line (6)
>>
>>                 [...]
>>
>> 0x000000b6:     DW_TAG_variable
>>                   DW_AT_name    ("_vtable$")
>>                   DW_AT_type    (0x00000081 "void *")
>>                   DW_AT_external        (true)
>>                   DW_AT_declaration     (true)
>>                   DW_AT_artificial      (true)
>>                   DW_AT_accessibility   (DW_ACCESS_private)
>>
>> This works well enough for our own debugger use-cases; I agree with Cary
>> that it's hacky to rely on the name of a variable to signify important
>> information like this and an officially blessed way could help.
>>
>> I've no opinion on the  DW_AT_vtable_elem_location behaviours, although
>> we can consider it a separate issue.
>>
>> [0] https://github.com/llvm/llvm-project/pull/130255
>>
>> --
>> Thanks,
>> Jeremy
>>
>>
>>
>> --
>> Dwarf-discuss mailing list
>> Dwarf-discuss@lists.dwarfstd.org
>> https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss
>>
> --
> Dwarf-discuss mailing list
> Dwarf-discuss@lists.dwarfstd.org
> https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss
>
-- 
Dwarf-discuss mailing list
Dwarf-discuss@lists.dwarfstd.org
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss

Reply via email to