[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug default/24198] New: [dwz, c++] Merge odr type definitions



https://sourceware.org/bugzilla/show_bug.cgi?id=24198

            Bug ID: 24198
           Summary: [dwz, c++] Merge odr type definitions
           Product: dwz
           Version: unspecified
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: default
          Assignee: nobody at sourceware dot org
          Reporter: vries at gcc dot gnu.org
                CC: dwz at sourceware dot org
  Target Milestone: ---

Consider this test-case with this:
...
$ cat test.c
struct bbb;
struct ccc {
  int c;
};
#include "aaa.h"

extern void foo (struct aaa *);

int
main (void)
{
  struct aaa *p = (struct aaa *)0;
  foo (p);
  return 0;
}
...

and this file:
...
$ cat test2.c
struct bbb
{
  int b;
};
struct ccc;
#include "aaa.h"

void
foo (struct aaa *p)
{
}
...

and this header file:
...
$ cat aaa.h
struct aaa
{
  struct bbb *b;
  struct ccc *c;
};
...

Compiled for c++:
...
$ g++ test.c test2.c -g -c
$ g++ test.o test2.o -g
...

This results in two DWARF definitions of aaa.

This one, with ccc a complete type and bbb an incomplete one:
...
 <1><f4>: Abbrev Number: 2 (DW_TAG_structure_type)
    <f5>   DW_AT_name        : ccc
    <f9>   DW_AT_byte_size   : 4
    <fa>   DW_AT_decl_file   : 1
    <fb>   DW_AT_decl_line   : 2
    <fc>   DW_AT_decl_column : 8
    <fd>   DW_AT_sibling     : <0x10d>
 <1><114>: Abbrev Number: 2 (DW_TAG_structure_type)
    <115>   DW_AT_name        : aaa
    <119>   DW_AT_byte_size   : 16
    <11a>   DW_AT_decl_file   : 2
    <11b>   DW_AT_decl_line   : 1
    <11c>   DW_AT_decl_column : 8
    <11d>   DW_AT_sibling     : <0x138>
 <2><121>: Abbrev Number: 3 (DW_TAG_member)
    <122>   DW_AT_name        : b
    <124>   DW_AT_decl_file   : 2
    <125>   DW_AT_decl_line   : 3
    <126>   DW_AT_decl_column : 15
    <127>   DW_AT_type        : <0x13d>
    <12b>   DW_AT_data_member_location: 0
 <2><12c>: Abbrev Number: 3 (DW_TAG_member)
    <12d>   DW_AT_name        : c
    <12f>   DW_AT_decl_file   : 2
    <130>   DW_AT_decl_line   : 4
    <131>   DW_AT_decl_column : 15
    <132>   DW_AT_type        : <0x143>
    <136>   DW_AT_data_member_location: 8
 <1><138>: Abbrev Number: 5 (DW_TAG_structure_type)
    <139>   DW_AT_name        : bbb
    <13d>   DW_AT_declaration : 1
 <1><13d>: Abbrev Number: 6 (DW_TAG_pointer_type)
    <13e>   DW_AT_byte_size   : 8
    <13f>   DW_AT_type        : <0x138>
 <1><143>: Abbrev Number: 6 (DW_TAG_pointer_type)
    <144>   DW_AT_byte_size   : 8
    <145>   DW_AT_type        : <0xf4>
...

And this one, with bbb a complete type and ccc an incomplete one:
...
 <1><1ad>: Abbrev Number: 2 (DW_TAG_structure_type)
    <1ae>   DW_AT_name        : bbb
    <1b2>   DW_AT_byte_size   : 4
    <1b3>   DW_AT_decl_file   : 1
    <1b4>   DW_AT_decl_line   : 1
    <1b5>   DW_AT_decl_column : 8
    <1b6>   DW_AT_sibling     : <0x1c6>
 <1><1cd>: Abbrev Number: 2 (DW_TAG_structure_type)
    <1ce>   DW_AT_name        : aaa
    <1d2>   DW_AT_byte_size   : 16
    <1d3>   DW_AT_decl_file   : 2
    <1d4>   DW_AT_decl_line   : 1
    <1d5>   DW_AT_decl_column : 8
    <1d6>   DW_AT_sibling     : <0x1f1>
 <2><1da>: Abbrev Number: 3 (DW_TAG_member)
    <1db>   DW_AT_name        : b
    <1dd>   DW_AT_decl_file   : 2
    <1de>   DW_AT_decl_line   : 3
    <1df>   DW_AT_decl_column : 15
    <1e0>   DW_AT_type        : <0x1f1>
    <1e4>   DW_AT_data_member_location: 0
 <2><1e5>: Abbrev Number: 3 (DW_TAG_member)
    <1e6>   DW_AT_name        : c
    <1e8>   DW_AT_decl_file   : 2
    <1e9>   DW_AT_decl_line   : 4
    <1ea>   DW_AT_decl_column : 15
    <1eb>   DW_AT_type        : <0x1fc>
    <1ef>   DW_AT_data_member_location: 8
 <1><1f1>: Abbrev Number: 5 (DW_TAG_pointer_type)
    <1f2>   DW_AT_byte_size   : 8
    <1f3>   DW_AT_type        : <0x1ad>
 <1><1f7>: Abbrev Number: 6 (DW_TAG_structure_type)
    <1f8>   DW_AT_name        : ccc
    <1fc>   DW_AT_declaration : 1
 <1><1fc>: Abbrev Number: 5 (DW_TAG_pointer_type)
    <1fd>   DW_AT_byte_size   : 8
    <1fe>   DW_AT_type        : <0x1f7>
...

Using the C++ one-definition-rule, we can merge the two definitions.

-- 
You are receiving this mail because:
You are on the CC list for the bug.