[all-commits] [llvm/llvm-project] 490981: [clang][DebugInfo] Emit global variable definition...
Michael Buch via All-commits
all-commits at lists.llvm.org
Mon Nov 6 02:23:39 PST 2023
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 4909814c08fdf4ec8bd9dad4f157d03de7c3c800
https://github.com/llvm/llvm-project/commit/4909814c08fdf4ec8bd9dad4f157d03de7c3c800
Author: Michael Buch <michaelbuch12 at gmail.com>
Date: 2023-11-06 (Mon, 06 Nov 2023)
Changed paths:
M clang/lib/CodeGen/CGDebugInfo.cpp
M clang/lib/CodeGen/CGDebugInfo.h
M clang/test/CodeGenCXX/debug-info-class.cpp
A clang/test/CodeGenCXX/debug-info-static-inline-member.cpp
M clang/test/CodeGenCXX/debug-info-static-member.cpp
M lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py
M lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
Log Message:
-----------
[clang][DebugInfo] Emit global variable definitions for static data members with constant initializers (#70639)
When an LLDB user asks for the value of a static data member, LLDB
starts by
searching the Names accelerator table for the corresponding variable
definition
DIE. For static data members with out-of-class definitions that works
fine,
because those get represented as global variables with a location and
making them
eligible to be added to the Names table. However, in-class definitions
won’t get
indexed because we usually don't emit global variables for them. So in
DWARF
we end up with a single `DW_TAG_member` that usually holds the constant
initializer.
But we don't get a corresponding CU-level `DW_TAG_variable` like we do
for
out-of-class definitions.
To make it more convenient for debuggers to get to the value of inline
static data members,
this patch makes sure we emit definitions for static variables with
constant initializers
the same way we do for other static variables. This also aligns Clang
closer to GCC, which
produces CU-level definitions for inline statics and also emits these
into `.debug_pubnames`.
The implementation keeps track of newly created static data members.
Then in
`CGDebugInfo::finalize`, we emit a global `DW_TAG_variable` with a
`DW_AT_const_value` for
any of those declarations that didn't end up with a definition in the
`DeclCache`.
The newly emitted `DW_TAG_variable` will look as follows:
```
0x0000007b: DW_TAG_structure_type
DW_AT_calling_convention (DW_CC_pass_by_value)
DW_AT_name ("Foo")
...
0x0000008d: DW_TAG_member
DW_AT_name ("i")
DW_AT_type (0x00000062 "const int")
DW_AT_external (true)
DW_AT_declaration (true)
DW_AT_const_value (4)
Newly added
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
0x0000009a: DW_TAG_variable
DW_AT_specification (0x0000008d "i")
DW_AT_const_value (4)
DW_AT_linkage_name ("_ZN2t2IiE1iIfEE")
```
This patch also drops the `DW_AT_const_value` off of the declaration since we now always have it on the definition. This ensures that the `DWARFParallelLinker` can type-merge class with static members where we couldn't attach the constant on the declaration in some CUs.
More information about the All-commits
mailing list