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 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. - 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.
-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