<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>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?<br>
</p>
<p>This article on C++ reference suggests that they cannot have
virtual functions at the source level
<a class="moz-txt-link-freetext" href="https://en.cppreference.com/w/cpp/language/union#:~:text=A%20union%20can%20have%20member,have%20a%20default%20member%20initializer">https://en.cppreference.com/w/cpp/language/union#:~:text=A%20union%20can%20have%20member,have%20a%20default%20member%20initializer</a>.
and I can't see how a union with a vtable could be implemented.<br>
</p>
<p>So I think "A structure, union, or class type may have a
DW_AT_vtable_location attribute," should only be "A structure, or
class..."</p>
<p>-ben<br>
</p>
<div class="moz-cite-prefix">On 5/6/25 6:19 PM, Cary Coutant via
Dwarf-discuss wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAJimCsFf6FiX+3+m+uUstseyX1noF_CBw6f+paTa9Hw3=drVZA@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">
<div dir="ltr">
<div><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">I've
written a three-part proposal to address these issues:</span></div>
<div>
<ul>
<li><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">The
first part,<span class="gmail-Apple-converted-space"> </span></span><a
href="https://dwarfstd.org/issues/250506.1.html"
style="font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif"
moz-do-not-send="true">250506.1</a><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">,
proposes a standard mechanism for locating the virtual
function table (vtable) given an object of a
polymorphic class.</span></li>
<li><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">The
second part,<span class="gmail-Apple-converted-space"> </span></span><a
href="https://dwarfstd.org/issues/250506.2.html"
style="font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif"
moz-do-not-send="true">250506.2</a><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">,
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. </span></li>
<li><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">The
third part,<span class="gmail-Apple-converted-space"> </span></span><a
href="https://dwarfstd.org/issues/250506.3.html"
style="font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif"
moz-do-not-send="true">250506.3</a><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium">,
proposes a fix to the </span><code>DW_AT_vtable_elem_location</code><span
style="color:rgb(0,0,0);font-family:"Nunito Sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Lucida,sans-serif;font-size:medium"><span
class="gmail-Apple-converted-space"> </span>attribute,
which appears to be incorrectly implemented in
compilers today.</span></li>
</ul>
<div><font color="#000000"
face="Nunito Sans, Lucida Grande, Lucida Sans Unicode, Lucida Sans, Lucida, sans-serif"
size="3"><span style="caret-color: rgb(0, 0, 0);">-cary</span></font></div>
</div>
</div>
<div><br>
</div>
<br>
<div class="gmail_quote gmail_quote_container">
<div dir="ltr" class="gmail_attr">On Fri, May 2, 2025 at
1:31 PM Todd Allen via Dwarf-discuss <<a
href="mailto:dwarf-discuss@lists.dwarfstd.org"
moz-do-not-send="true" class="moz-txt-link-freetext">dwarf-discuss@lists.dwarfstd.org</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div>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:<br>
</div>
<blockquote>
<div><font face="monospace">DW_AT_vtable_location
[DW_OP_plus_uconst 0; DW_OP_deref]<br>
</font></div>
<div><font face="monospace">DW_AT_type_vtable_location
[DW_OP_addr 0x12345678]</font></div>
</blockquote>
<div>The first was a description of how to obtain the
address of the vtable tag from an object.</div>
<div>The second was a description of the address of the
vtable tag from just the type.</div>
<div><br>
</div>
<div>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?<br>
</div>
<div><br>
</div>
<div>We do still have logic in our debugger to use them,
too. In addition to the mangling-based approaches.<br>
</div>
<div><br>
</div>
<div>It does require walking the whole DWARF tree to find
them.</div>
<div><br>
</div>
<div>Todd<br>
</div>
<div><br>
</div>
<div>On 4/25/25 09:49, Jeremy Morse via Dwarf-discuss
wrote:<br>
</div>
<blockquote type="cite">
<div>
<div dir="ltr">Hi all,<br>
<br>
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.<br>
<br>
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:<br>
<br>
<font face="monospace">0x00000082: DW_TAG_variable</font><br>
<font face="monospace">
DW_AT_specification (0x000000b6 "_vtable$")</font><br>
<font face="monospace">
DW_AT_alignment (8)</font><br>
<font face="monospace">
DW_AT_location (DW_OP_addrx 0x1)</font><br>
<br>
<font face="arial, sans-serif">[Then deeper into the
DIE tree,]</font>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">0x0000008b:
DW_TAG_structure_type<br>
DW_AT_containing_type
(0x00000034 "CBase")<br>
DW_AT_calling_convention
(DW_CC_pass_by_reference)<br>
DW_AT_name ("CDerived")<br>
DW_AT_decl_file ("vtables.cpp")<br>
DW_AT_decl_line (6)</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace"> [...]<br>
<br>
0x000000b6: DW_TAG_variable<br>
DW_AT_name ("_vtable$")<br>
DW_AT_type (0x00000081
"void *")<br>
DW_AT_external (true)<br>
DW_AT_declaration (true)<br>
DW_AT_artificial (true)<br>
DW_AT_accessibility
(DW_ACCESS_private)</font><br>
<br>
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.</div>
<div><br>
</div>
<div>I've no opinion on the <span
style="font-family:monospace">DW_AT_vtable_elem_location
</span><font face="arial, sans-serif">behaviours,
although we can consider it a separate issue.</font><br>
<br>
[0] <a
href="https://github.com/llvm/llvm-project/pull/130255" target="_blank"
moz-do-not-send="true"
class="moz-txt-link-freetext">
https://github.com/llvm/llvm-project/pull/130255</a></div>
<div><br>
</div>
<div>--</div>
<div>Thanks,</div>
<div>Jeremy</div>
<div><br>
</div>
</div>
</div>
<br>
<fieldset></fieldset>
</blockquote>
<p><br>
</p>
</div>
-- <br>
Dwarf-discuss mailing list<br>
<a href="mailto:Dwarf-discuss@lists.dwarfstd.org"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">Dwarf-discuss@lists.dwarfstd.org</a><br>
<a
href="https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss"
rel="noreferrer" target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss</a><br>
</blockquote>
</div>
</div>
<br>
<fieldset class="moz-mime-attachment-header"></fieldset>
</blockquote>
</body>
</html>