<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="moz-cite-prefix">In 250506.2, the use of a rnglist is throwing me.  I would expect the lifetime of a vtable to be the whole program.  Or did you envision the rnglist to be the range of data/rodata addresses of the vtable object?  2.17 clarifies
 that they're code addresses (i.e. text), though.<br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">We did have a discussion sometime in the last year about describing data/rodata address ranges, but that was in .debug_aranges (RIP).  And, IIRC, no actual compiler was generating data/rodata address there either.<br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">On 5/6/25 19:19, Cary Coutant wrote:<br>
</div>
<blockquote type="cite" cite="mid:CAJimCsFf6FiX+3+m+uUstseyX1noF_CBw6f+paTa9Hw3=drVZA@mail.gmail.com">
<div>
<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" originalsrc="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" originalsrc="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" originalsrc="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" originalsrc="https://github.com/llvm/llvm-project/pull/130255" target="_blank" moz-do-not-send="true">
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" originalsrc="https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss" rel="noreferrer" target="_blank" moz-do-not-send="true">https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss</a><br>
</blockquote>
</div>
</div>
</div>
</blockquote>
<p><br>
</p>
</body>
</html>