From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 105457 invoked by alias); 26 Mar 2019 17:01:40 -0000 Mailing-List: contact dwz-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: dwz-owner@sourceware.org Received: (qmail 105383 invoked by uid 48); 26 Mar 2019 17:01:36 -0000 From: "vries at gcc dot gnu.org" To: dwz@sourceware.org Subject: [Bug default/24198] [dwz, c++] Merge odr type definitions Date: Tue, 01 Jan 2019 00:00:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: dwz X-Bugzilla-Component: default X-Bugzilla-Version: unspecified X-Bugzilla-Keywords: X-Bugzilla-Severity: enhancement X-Bugzilla-Who: vries at gcc dot gnu.org X-Bugzilla-Status: NEW X-Bugzilla-Resolution: X-Bugzilla-Priority: P2 X-Bugzilla-Assigned-To: nobody at sourceware dot org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://sourceware.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2019-q1/txt/msg00157.txt.bz2 https://sourceware.org/bugzilla/show_bug.cgi?id=3D24198 --- Comment #2 from Tom de Vries --- (In reply to Tom de Vries from comment #1) > Created attachment 11704 [details] > Proof of concept patch Rationale not visible in all views, so posting it here: ... [proof-of-concept] Implement odr for DW_TAG_structure_type This merges a struct declaration in one CU with a struct definition with the same name in another CU, based on the c++ one-definition-rule. So, for an executable build from these c++ sources: ... $ cat odr.h struct aaa {struct bbb *b; struct ccc *c; }; $ cat odr.cc struct bbb; struct ccc { int c; }; //struct aaa { // struct bbb *b; //Pointer to declared type. // struct ccc *c; //Pointer to defined type. //}; $ cat odr2.cc struct bbb { int b; }; struct ccc; //struct aaa { // struct bbb *b; //Pointer to defined type. // struct ccc *c; //Pointer to declared type. //}; ... we manage to get a partial unit containing dwarf describing: ... struct bbb { int b; }; struct ccc { int c; } struct aaa { struct bbb *b; //Pointer to defined type. struct ccc *c; //Pointer to defined type. } ... So, one definition of aaa with both fields pointing to definitions of bbb a= nd ccc. The size reduction with current (ecd2704) master is 14%: ... $ diff.sh odr odr.dwz.master .debug_info red: 18% 980 805 .debug_abbrev red: 33% 610 413 .debug_str red: 0% 1232 1232 total red: 14% 2822 2450 ... And with this patch, we get 10%: ... $ ../diff.sh odr odr.dwz.patch .debug_info red: 15% 980 835 .debug_abbrev red: 22% 610 481 .debug_str red: 0% 1232 1232 total red: 10% 2822 2548 ... which AFAICT is due to PR24388: in the 14% variant, we have no partial unit= s, in the 10% variant, we do. This is to be fixed: ... $ gdb -batch -ex "info types" --args odr.dwz.master \ | egrep -B1 'aaa|bbb|ccc' File odr-2.cc: 1: bbb; -- File odr.cc: 2: ccc; -- File odr.h: 1: aaa; $ gdb -batch -ex "info types" --args odr.dwz.patch \ | egrep -B1 'aaa|bbb|ccc' File odr.cc: 1: bbb; 2: ccc; -- File odr.h: 1: aaa; ... The file for bbb should remain odr-2.cc. Todo: - check for c++ language - try out example with class: handle DW_TAG_class_type - try out example with union: handle DW_TAG_union_type - try out .debug_types example (die_struct_decl_p has DEBUG_INFO hardcoded) - fix code in copy_die_tree breaking invariant that new_die points to reference die, which points to all other duplicate dies. - check whether replacing declaration with definition in copy_die_tree is the right point to do this substitution. - handle DIEs where DW_AT_name is not the first attribute 2019-03-26 Tom de Vries PR dwz/24198 * dwz.c (checksum_die, checksum_ref_die, die_eq_1): Honour odr for DW_TAG_structure_type. (die_struct_decl_p): New function. (copy_die_tree): Copy definition rather than declaration. * Makefile (TEST_EXECS): Add odr. (odr): New target. * testsuite/dwz.tests/odr.sh: New test. * testsuite/dwz.tests/odr-2.cc: New test source. * testsuite/dwz.tests/odr.cc: Same. * testsuite/dwz.tests/odr.h: Same. --- Makefile | 5 ++- dwz.c | 101 +++++++++++++++++++++++++++++++++++++++= ++-- testsuite/dwz.tests/odr-2.cc | 8 ++++ testsuite/dwz.tests/odr.cc | 13 ++++++ testsuite/dwz.tests/odr.h | 5 +++ testsuite/dwz.tests/odr.sh | 24 ++++++++++ 6 files changed, 151 insertions(+), 5 deletions(-) ... --=20 You are receiving this mail because: You are on the CC list for the bug.