[all-commits] [llvm/llvm-project] f74aac: [lldb][DWARFASTParserClang] Check DW_AT_declaratio...

Michael Buch via All-commits all-commits at lists.llvm.org
Fri Oct 6 01:07:33 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: f74aaca63202cabb512c78fe19196ff348d436a8
      https://github.com/llvm/llvm-project/commit/f74aaca63202cabb512c78fe19196ff348d436a8
  Author: Michael Buch <michaelbuch12 at gmail.com>
  Date:   2023-10-06 (Fri, 06 Oct 2023)

  Changed paths:
    M lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
    A lldb/test/API/lang/cpp/union-static-data-members/Makefile
    A lldb/test/API/lang/cpp/union-static-data-members/TestCppUnionStaticMembers.py
    A lldb/test/API/lang/cpp/union-static-data-members/main.cpp

  Log Message:
  -----------
  [lldb][DWARFASTParserClang] Check DW_AT_declaration to determine static data members (#68300)

**Background**

Prior to DWARFv4, there was no clear normative text on how to handle
static data members. Non-normative text suggested that compilers should
use `DW_AT_external` to mark static data members of structrues/unions.
Clang does this consistently. However, GCC doesn't, e.g., when the
structure/union is in an anonymous namespace (which is C++ standard
conformant). Additionally, GCC never emits `DW_AT_data_member_location`s
for union members (regardless of storage linkage and storage duration).

Since DWARFv5 (issue 161118.1), static data members get emitted as
`DW_TAG_variable`.

LLDB used to differentiate between static and non-static members by
checking the `DW_AT_external` flag and the absence of
`DW_AT_data_member_location`. With
[D18008](https://reviews.llvm.org/D18008) LLDB started to pretend that
union members always have a `0` `DW_AT_data_member_location` by default
(because GCC never emits these locations).

In [D124409](https://reviews.llvm.org/D124409) LLDB stopped checking the
`DW_AT_external` flag to account for the case where GCC doesn't emit the
flag for types in anonymous namespaces; instead we only check for
presence of `DW_AT_data_member_location`s.

The combination of these changes then meant that LLDB would never
correctly detect that a union has static data members.

**Solution**

Instead of unconditionally initializing the `member_byte_offset` to `0`
specifically for union members, this patch proposes to check for both
the absence of `DW_AT_data_member_location` and `DW_AT_declaration`,
which consistently gets emitted for static data members on GCC and
Clang.

We initialize the `member_byte_offset` to `0` anyway if we determine it
wasn't a static. So removing the special case for unions makes this code
simpler to reason about.

Long-term, we should just use DWARFv5's new representation for static
data members.

Fixes #68135




More information about the All-commits mailing list