public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug debug/110439] New: Missing DW_TAG_typedef for variable with attribute of typedef'd type
@ 2023-06-27 18:32 david.faust at oracle dot com
  2023-06-27 18:39 ` [Bug debug/110439] " pinskia at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: david.faust at oracle dot com @ 2023-06-27 18:32 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110439

            Bug ID: 110439
           Summary: Missing DW_TAG_typedef for variable with attribute of
                    typedef'd type
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: david.faust at oracle dot com
  Target Milestone: ---

$ cat typedef-skip-1.c
typedef int foo;
foo __attribute__((may_alias)) attr_foo;
foo plain_foo;

DW_AT_type in the variable DIE for 'attr_foo' refers to the base int type,
while for 'plain_foo' it refers to the typedef DIE I would expect: 

$ gcc -g -c typedef-skip-1.c
$ readelf -wi typedef-skip-1.o

 <0><c>: Abbrev Number: 2 (DW_TAG_compile_unit)
    <d>   DW_AT_producer    : (indirect string, offset: 0): GNU C17 12.2.0
-mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables
    <11>   DW_AT_language    : 29       (C11)
    <12>   DW_AT_name        : (indirect line string, offset: 0):
typedef-skip-1.c
    <16>   DW_AT_comp_dir    : (indirect line string, offset: 0x11):
/home/dfaust/playpen
    <1a>   DW_AT_stmt_list   : 0
 <1><1e>: Abbrev Number: 3 (DW_TAG_typedef)
    <1f>   DW_AT_name        : foo
    <23>   DW_AT_decl_file   : 1
    <24>   DW_AT_decl_line   : 1
    <25>   DW_AT_decl_column : 13
    <26>   DW_AT_type        : <0x2a>
 <1><2a>: Abbrev Number: 4 (DW_TAG_base_type)
    <2b>   DW_AT_byte_size   : 4
    <2c>   DW_AT_encoding    : 5        (signed)
    <2d>   DW_AT_name        : int
 <1><31>: Abbrev Number: 1 (DW_TAG_variable)
    <32>   DW_AT_name        : (indirect string, offset: 0x4c): attr_foo
    <36>   DW_AT_decl_file   : 1
    <36>   DW_AT_decl_line   : 2
    <37>   DW_AT_decl_column : 32
    <38>   DW_AT_type        : <0x2a>
    <3c>   DW_AT_external    : 1
    <3c>   DW_AT_location    : 9 byte block: 3 0 0 0 0 0 0 0 0  (DW_OP_addr: 0)
 <1><46>: Abbrev Number: 1 (DW_TAG_variable)
    <47>   DW_AT_name        : (indirect string, offset: 0x55): plain_foo
    <4b>   DW_AT_decl_file   : 1
    <4b>   DW_AT_decl_line   : 3
    <4c>   DW_AT_decl_column : 5
    <4d>   DW_AT_type        : <0x1e>
    <51>   DW_AT_external    : 1
    <51>   DW_AT_location    : 9 byte block: 3 4 0 0 0 0 0 0 0  (DW_OP_addr: 4)
 <1><5b>: Abbrev Number: 0

DWARF output by clang has the DW_TAG_typedef DIE in DW_AT_type for both
variables:

$ clang -c -g typedef-skip-1.c -o typedef-skip-1.o.clang
$ readelf -wi typedef-skip-1.o.clang

 <1><1e>: Abbrev Number: 2 (DW_TAG_variable)
    <1f>   DW_AT_name        : (indexed string: 0x3): attr_foo
    <20>   DW_AT_type        : <0x29>
    <24>   DW_AT_external    : 1
    <24>   DW_AT_decl_file   : 0
    <25>   DW_AT_decl_line   : 2
    <26>   DW_AT_location    :  (DW_OP_addrx <0>)
 <1><29>: Abbrev Number: 3 (DW_TAG_typedef)
    <2a>   DW_AT_type        : <0x31>
    <2e>   DW_AT_name        : (indexed string: 0x5): foo
    <2f>   DW_AT_decl_file   : 0
    <30>   DW_AT_decl_line   : 1
 <1><31>: Abbrev Number: 4 (DW_TAG_base_type)
    <32>   DW_AT_name        : (indexed string: 0x4): int
    <33>   DW_AT_encoding    : 5        (signed)
    <34>   DW_AT_byte_size   : 4
 <1><35>: Abbrev Number: 2 (DW_TAG_variable)
    <36>   DW_AT_name        : (indexed string: 0x6): plain_foo
    <37>   DW_AT_type        : <0x29>
    <3b>   DW_AT_external    : 1
    <3b>   DW_AT_decl_file   : 0
    <3c>   DW_AT_decl_line   : 3
    <3d>   DW_AT_location    :  (DW_OP_addrx <0x1>)
 <1><40>: Abbrev Number: 0


Note this isn't strictly related to 'may_alias', I just found it to be a
reliable
reproducer.  I tripped on this while working on a patch to support a BPF
feature,
the btf_type_tag attribute.


I think this happens because this lookup in modified_type_die:

  /* If we do, then we can just use its DIE, if it exists.  */
  if (qualified_type)
    {
      mod_type_die = lookup_type_die (qualified_type);

finds the typedef DIE for the un-__attribute__-ed use 'foo', but
returns NULL for the __attribute__-ed use of 'foo':

Breakpoint 6, modified_type_die (type=<integer_type 0x7ffff77adf18 foo>,
cv_quals=0, reverse=false, 
    context_die=<dw_die_ref 0x7ffff762d190 DW_TAG_compile_unit>) at
../../../gcc/gcc/dwarf2out.cc:13631
(gdb) pt type
 <integer_type 0x7ffff77ad690 foo asm_written SI
    size <integer_cst 0x7ffff7602fd8 type <integer_type 0x7ffff76210a8
bitsizetype> constant 32>
    unit-size <integer_cst 0x7ffff7625000 type <integer_type 0x7ffff7621000
sizetype> constant 4>
    align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff76215e8
    attributes <tree_list 0x7ffff77ae348
        purpose <identifier_node 0x7ffff77c0e10 may_alias>> precision:32 min
<integer_cst 0x7ffff7602f90 -2147483648> max <integer_cst 0x7ffff7602fa8
2147483647>>
...
13699     if (qualified_type)
(gdb) 
13701         mod_type_die = lookup_type_die (qualified_type);
(gdb) 
13706         if (mod_type_die
(gdb) p mod_type_die
$1 = <dw_die_ref 0x0>

Then recurses with

  return modified_type_die (DECL_ORIGINAL_TYPE (name), cv_quals,
                                      reverse, context_die);

Where DECL_ORIGINAL_TYPE (name) is a plain integer type:

 <integer_type 0x7ffff76215e8 int public SI
    size <integer_cst 0x7ffff7602fd8 type <integer_type 0x7ffff76210a8
bitsizetype> constant 32>
    unit-size <integer_cst 0x7ffff7625000 type <integer_type 0x7ffff7621000
sizetype> constant 4>
    align:32 warn_if_not_align:0 symtab:-142864960 alias-set -1 canonical-type
0x7ffff76215e8 precision:32 min <integer_cst 0x7ffff7602f90 -2147483648> max
<integer_cst 0x7ffff7602fa8 2147483647>
    pointer_to_this <pointer_type 0x7ffff7629b28>>


I am not 100% sure whether the GCC output is "strictly incorrect" DWARF, but at
the least
it is an inconsistency between clang and GCC.

Observed with gcc (Debian 12.2.0-14) 12.2.0 and git master (GCC) 14.0.0
20230627 (experimental) on x86_64

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-06-28  7:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-27 18:32 [Bug debug/110439] New: Missing DW_TAG_typedef for variable with attribute of typedef'd type david.faust at oracle dot com
2023-06-27 18:39 ` [Bug debug/110439] " pinskia at gcc dot gnu.org
2023-06-27 18:45 ` david.faust at oracle dot com
2023-06-28  7:54 ` rguenth at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).