gdb unable to print alias variable

kamlesh kumar kamleshbhalui@gmail.com
Sun Jun 27 03:10:27 GMT 2021


David,
I haven't updated the llvm review yet, but here is the diff I have used
https://reviews.llvm.org/differential/diff/354719/

On Sun, Jun 27, 2021 at 7:19 AM David Blaikie <dblaikie@gmail.com> wrote:
>
> imported declaration can also be used to bring a single name from a namespace:
>
> namespace ns {
>
>   int i = 32;
>
> }
>
> using ns::i;
>
> int main() {
>
> }
>
> 0x0000002a:   DW_TAG_namespace
>
>                 DW_AT_name      ("ns")
>
>
> 0x0000002f:     DW_TAG_variable
>
>                   DW_AT_name    ("i")
>
>                   DW_AT_type    (0x00000045 "int")
>
>                   DW_AT_external        (true)
>
>                   DW_AT_decl_file       ("/usr/local/google/home/blaikie/dev/scratch/import.cpp")
>
>                   DW_AT_decl_line       (2)
>
>                   DW_AT_location        (DW_OP_addr 0x404028)
> ...
>
>
> 0x0000004c:   DW_TAG_imported_declaration
>
>                 DW_AT_decl_file ("/usr/local/google/home/blaikie/dev/scratch/import.cpp")
>
>                 DW_AT_decl_line (4)
>
>                 DW_AT_import    (0x0000002f)
>
>
> Which looks closer to the alias situation - I would guess the only reason the alias imported_declaration isn't working as intended is that maybe GDB looks at the symbol table first and since it finds a symbol with that name it favors the symbol (but finds no debug info describing it and complains about that)
>
> Let's see if I hand modify the DWARF so there's no symbol, but otherwise an imported declaration that looks pretty close to what would be produced in the alias situation...
>
> Hmm, that seems to work correctly for me. Let me try Kamlesh's original patch...
>
> Yeah, using the example code below, and the D103131 patch... hmm, OK the current version of the patch only does DW_TAG_variables, and the first version of the patch does DW_TAG_variables /and/ a DW_TAG_imported_declaration without a name - that doesn't look like the DWARF shown at the start of this thread.
>
> Kamlesh - which version of the patch are you testing that produced the DWARF shown in the start of this thread? Because hand-crafted DWARF/file that I tried that used an imported declaration as shown above, seemed to work OK for me with lldb. So I'm not sure what's making your experience different from mine.
>
> - Dave
>
> On Fri, Jun 25, 2021 at 7:50 PM Simon Marchi via Gdb <gdb@sourceware.org> wrote:
>>
>>
>>
>> On 2021-06-23 8:34 p.m., kamlesh kumar via Gdb wrote:
>> > Hi Devs,
>> > Currently clang does not produce debug info for alias variables, I am
>> > working on this feature, by having DW_TAG_imported_declaration for
>> > alias variable but gdb does not work with this.
>> > below is demonstration
>> >
>> > consider this testcase,
>> > -----------
>> > int oldname = 1;
>> > extern int newname attribute((alias("oldname")));
>> > int main(){}
>> > ---------------------
>> > $clang test.c -g
>> > $gdb a.out
>> > (gdb) pt oldname
>> > type = int
>> > (gdb) pt newname
>> > type = <data variable, no debug info>
>> > (gdb) p newname
>> > 'newname' has unknown type; cast it to its declared type
>> >
>> > Here is debug info in ./a.out by clang
>> > dumped debug info (using llvm-dwarfdump)
>> >  test.o: file format elf64-x86-64
>> >
>> >  .debug_info contents:
>> >  0x00000000: Compile Unit: length = 0x00000067, format = DWARF32,
>> > version = 0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at
>> > 0x0000006b)
>> >
>> >  0x0000000b: DW_TAG_compile_unit
>> >                DW_AT_producer    ("clang version 13.0.0
>> > (git@github.com:llvm/llvm-project.git
>> > 4cd7169f5517167ef456e82c6dcae669bde6c725)")
>> >                DW_AT_language    (DW_LANG_C99)
>> >                DW_AT_name        ("test.c")
>> >                DW_AT_stmt_list   (0x00000000)
>> >                DW_AT_comp_dir    ("/folk/kkumar/tcllvm/llvm-build-lldb-rel/bin")
>> >                DW_AT_low_pc      (0x0000000000000000)
>> >                DW_AT_high_pc     (0x0000000000000008)
>> >
>> >  0x0000002a:   DW_TAG_variable
>> >                  DW_AT_name      ("oldname")
>> >                  DW_AT_type      (0x0000003f "int")
>> >                  DW_AT_external  (true)
>> >                  DW_AT_decl_file
>> > ("/folk/kkumar/tcllvm/llvm-build-lldb-rel/bin/test.c")
>> >                  DW_AT_decl_line (1)
>> >                  DW_AT_location  (DW_OP_addr 0x0)
>> >
>> >  0x0000003f:   DW_TAG_base_type
>> >                  DW_AT_name      ("int")
>> >                  DW_AT_encoding  (DW_ATE_signed)
>> >                  DW_AT_byte_size (0x04)
>> >
>> >  0x00000046:   DW_TAG_imported_declaration
>> >                  DW_AT_decl_file
>> > ("/folk/kkumar/tcllvm/llvm-build-lldb-rel/bin/test.c")
>> >                  DW_AT_decl_line (2)
>> >                  DW_AT_import    (0x0000002a)
>> >                  DW_AT_name      ("newname")
>> >
>> >  0x00000051:   DW_TAG_subprogram
>> >                  DW_AT_low_pc    (0x0000000000000000)
>> >                  DW_AT_high_pc   (0x0000000000000008)
>> >                  DW_AT_frame_base        (DW_OP_reg6 RBP)
>> >                  DW_AT_name      ("main")
>> >                  DW_AT_decl_file
>> > ("/folk/kkumar/tcllvm/llvm-build-lldb-rel/bin/test.c")
>> >                  DW_AT_decl_line (3)
>> >                  DW_AT_type      (0x0000003f "int")
>> >                  DW_AT_external  (true)
>> >
>> >  0x0000006a:   NULL
>> >
>> > Even though the newname has desired info, gdb is unable to print the
>> > value or type of the newname.
>> > I would like to know whether this is a bug in gdb, or debug info
>> > itself is wrong(because of  DW_TAG_imported_declaration for newname)?
>> > Any other viable path to address alias variable debugging will be appreciated.
>>
>> My intuition, from looking at where DW_TAG_imported_declaration can be
>> found in dwarf2/read.c, is that support for DW_TAG_imported_declaration
>> was done with namespace imports in mind.  For example, with this code:
>>
>>     namespace foo
>>     {
>>       int x = 11;
>>     };
>>
>>     namespace bar = foo;
>>
>>     int main() {
>>         return bar::x;
>>     }
>>
>> we get:
>>
>>     0x0000002a:   DW_TAG_namespace
>>                     DW_AT_name [DW_FORM_strp]       ("foo")
>>
>>     ...
>>
>>     0x00000050:   DW_TAG_imported_declaration
>>                     DW_AT_decl_file [DW_FORM_data1] ("/home/simark/build/binutils-gdb/gdb/test.cpp")
>>                     DW_AT_decl_line [DW_FORM_data1] (6)
>>                     DW_AT_import [DW_FORM_ref4]     (0x0000002a)
>>                     DW_AT_name [DW_FORM_strp]       ("bar")
>>
>>
>> And GDB is able to use bar:
>>
>>     (gdb) p bar::x
>>     $1 = 11
>>
>> If DW_TAG_imported_declaration is ever used to describe variable
>> aliasing, then I don't see why that couldn't be supported in GDB, it
>> would just be a matter of implementing it (which may or may not be
>> difficult).
>>
>> Simon


More information about the Gdb mailing list