[lldb] [clang] Reland "[clang][DebugInfo] Emit global variable definitions for static data members with constant initializers" (PR #71780)

Michael Buch via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 15 14:10:43 PST 2023


Michael137 wrote:

> Hi @Michael137, we are seeing a failure in one of our internal tests that I bisected back to this change. Consider the following code:
> 
> ```c++
> struct X
> {
>     static const int constant = 1;
>     int x;
> 
>     X() { x = constant; }
> };
> const int X::constant;
> 
> int main()
> {
>     X x;
>     x.x = X::constant;
>     x.x = X::constant;
>     x.x = X::constant;
>     x.x = X::constant;
>     x.x = X::constant;
>     return 0;
> }
> ```
> 
> Prior to your change, the compiler would generate the following DWARF for the constant value:
> 
> ```
> 0x0000003a:     DW_TAG_member
>                   DW_AT_name    ("constant")
>                   DW_AT_type    (0x00000057 "const int")
>                   DW_AT_decl_file       ("/home/dyung/sandbox/test.cpp")
>                   DW_AT_decl_line       (3)
>                   DW_AT_external        (true)
>                   DW_AT_declaration     (true)
>                   DW_AT_const_value     (1)
> ```
> 
> After your change, the DW_AT_const_value is gone from this DW_TAG_member group, but doesn't appear anywhere else in the DWARF output which seems to indicate that it was dropped completely which does not seem to be correct. Is this intended or am I missing something?



> Hi @Michael137, we are seeing a failure in one of our internal tests that I bisected back to this change. Consider the following code:
> 
> ```c++
> struct X
> {
>     static const int constant = 1;
>     int x;
> 
>     X() { x = constant; }
> };
> const int X::constant;
> 
> int main()
> {
>     X x;
>     x.x = X::constant;
>     x.x = X::constant;
>     x.x = X::constant;
>     x.x = X::constant;
>     x.x = X::constant;
>     return 0;
> }
> ```
> 
> Prior to your change, the compiler would generate the following DWARF for the constant value:
> 
> ```
> 0x0000003a:     DW_TAG_member
>                   DW_AT_name    ("constant")
>                   DW_AT_type    (0x00000057 "const int")
>                   DW_AT_decl_file       ("/home/dyung/sandbox/test.cpp")
>                   DW_AT_decl_line       (3)
>                   DW_AT_external        (true)
>                   DW_AT_declaration     (true)
>                   DW_AT_const_value     (1)
> ```
> 
> After your change, the DW_AT_const_value is gone from this DW_TAG_member group, but doesn't appear anywhere else in the DWARF output which seems to indicate that it was dropped completely which does not seem to be correct. Is this intended or am I missing something?

Right, we stopped putting the `DW_AT_const_value` on the declaration. Instead we put either the location or the constant on the definition, depending on what's available. In your example you define the variable out-of-class which would generate a `DW_TAG_variable` with a location, so we don't emit the constant for it on the definition. What's the nature of the failure? Would you instead be able to read the value out of the definition?

CC @dwblaikie 

https://github.com/llvm/llvm-project/pull/71780


More information about the cfe-commits mailing list