[Lldb-commits] [PATCH] D40283: lldb: Use the DWARF linkage name when importing C++ methods

Nelson Elhage via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Nov 27 10:42:08 PST 2017


nelhage added a comment.

In https://reviews.llvm.org/D40283#936088, @clayborg wrote:

> Jim will need to ok this. A few concerns follow. Most of the time when we don't get the DWARF -> AST conversion right, it can mean that we might code gen incorrect code. Is there not enough information for the GNU abi_tag in the DWARF to actually re-create these classes correctly in the AST?


Correct, as far as I can tell. Looking at a symbol definition from the test program on the issue via `llvm-dwarfdump`, I see

  0x00000076:     DW_TAG_subprogram
                    DW_AT_linkage_name    ("_ZN1A16helloWorld_cxx11B5cxx11Ev")
                    DW_AT_name    ("helloWorld_cxx11")
                    DW_AT_decl_file       ("/tmp/test_abi_tag.cc")
                    DW_AT_decl_line       (5)
                    DW_AT_declaration     (true)
                    DW_AT_external        (true)
                    DW_AT_accessibility   (DW_ACCESS_public)
  
  0x00000082:       DW_TAG_formal_parameter
                      DW_AT_type  (cu + 0x009b "A*")
                      DW_AT_artificial    (true)
  
  0x00000087:       NULL

The function of the `abi_tag` annotation is to append the `B5cxx11` to the mangled name; I can't find any other indication in the DWARF of the ABI tag.

You can read more about `abi_tag` here:
https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
Or an explanation of why it exists and how it is used here:
https://davmac.wordpress.com/2015/07/19/tale-of-two-abis/

The effect of this patch on the code generated by `expression` is to change the names we emit into the LLVM IR; Previously, we would emit a call to `_ZN1A16helloWorld_cxx11Ev`, which would then fail when resolving symbols. Now we (correctly) emit a call to `_ZN1A16helloWorld_cxx11B5cxx11Ev`.

The test case I added in this patch also demonstrates that GCC and clang both support arbitrarily overriding a symbol's mangled name in the source using `asm("new_name")`. I can't recall having ever encountered a use of that in the wild, so I don't care strongly about supporting it, but if we want to I think this general approach is almost certainly the only approach that would do so.


https://reviews.llvm.org/D40283





More information about the lldb-commits mailing list