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