[Dwarf-discuss] Representing vtables in DWARF for downcasting

Ben Woodard woodard@redhat.com
Wed May 7 13:25:51 GMT 2025


Can unions have virtual functions and thus vtables? My understanding is 
that unions can have member functions but I can't see how they can have 
virtual functions? What function would you call? Where would you put the 
vtable pointer?

This article on C++ reference suggests that they cannot have virtual 
functions at the source level 
https://en.cppreference.com/w/cpp/language/union#:~:text=A%20union%20can%20have%20member,have%20a%20default%20member%20initializer. 
and I can't see how a union with a vtable could be implemented.

So I think "A structure, union, or class type may have a 
DW_AT_vtable_location attribute," should only be "A structure, or class..."

-ben

On 5/6/25 6:19 PM, Cary Coutant via Dwarf-discuss 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 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.dwarfstd.org/pipermail/dwarf-discuss/attachments/20250507/9ceeae00/attachment-0001.htm>


More information about the Dwarf-discuss mailing list