From: Tom Tromey <tom@tromey.com>
To: Andrew Burgess <aburgess@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCHv3] gdb: remove attempted type de-duplication when building gdb-index
Date: Wed, 22 Oct 2025 09:17:24 -0600 [thread overview]
Message-ID: <87cy6fkltn.fsf@tromey.com> (raw)
In-Reply-To: <bd98eba33a373708587453e58018ba48c5f9eebf.1761054080.git.aburgess@redhat.com> (Andrew Burgess's message of "Tue, 21 Oct 2025 14:45:16 +0100")
>>>>> "Andrew" == Andrew Burgess <aburgess@redhat.com> writes:
Andrew> In v3:
Andrew> - Fixed test failure in gdb.cp/stub-array-size.exp when using
Andrew> cc-with-gdb-index, using more recent versions of gcc. This did
Andrew> require additional changes in dwarf2/read-gdb-index.c, and removal
Andrew> of a test that is now out of date. The commit message has been
Andrew> updated with a full description.
Thanks. I think this is ok. See below for commentary but there's
nothing you need to change.
Approved-By: Tom Tromey <tom@tromey.com>
Andrew> NOTE: Obviously a program doing this (defining a type differently in
Andrew> different CUs) would need to be mindful of the One Definition Rule,
Andrew> but so long as the type doesn't escape outside of a single CU then
Andrew> reusing a type name isn't, as I understand it, wrong. And even if
Andrew> it is, the fact that it compiles, and could be a source of bugs,
Andrew> means (in my opinion) that GDB should handle this case to enable
Andrew> debugging of it.
Also ODR only applies to C++ and in C it's ok to have different
definitions of an opaque type in different CUs. gdb itself used to use
this technique.
Andrew> This test has two CUs, and a type 'A'. The test description says:
Andrew> Test size of arrays of stubbed types (structures where the full
Andrew> definition is not immediately available).
Andrew> Which I don't really understand given the test's source code.
I think the relevant difference in the DWARF is:
Andrew> <1><4a>: Abbrev Number: 8 (DW_TAG_structure_type)
Andrew> <4b> DW_AT_name : A
Andrew> <4d> DW_AT_declaration : 1
Andrew> <4d> DW_AT_sibling : <0x6d>
Andrew> while in the second CU, the type looks like this:
Andrew> <1><178>: Abbrev Number: 4 (DW_TAG_structure_type)
Andrew> <179> DW_AT_name : A
Andrew> <17b> DW_AT_byte_size : 8
... that the second one has the size.
Andrew> So, for reasons that I don't understand, the type, despite (as far as
Andrew> I can see) having its full definition available, is recorded only as
Andrew> declared in one CU.
I think this is something the C++ compilers do, which is only emit the
full definition when the "key method" (in this case the destructor) is
also being emitted.
I don't really recall the details. Basically it's a workaround /
optimization to avoid exploding the debuginfo due to the separate
compilation/header file model.
Andrew> To be clear; the performance issue mentioned in PR gold/15646 is now
Andrew> back again. But my claim is that gold was right all along to include
Andrew> the duplicate index entries, and any performance hit we see as a
Andrew> result, though unfortunate, is just a consequence of doing it right.
Yes. To some extent I think this was a workaround for the broken C
parser and best_symbol behavior. I.e., addressing a symptom of
excessive CU expansion rather than the (admittedly much more difficult)
cause.
For the completion issue you pointed out:
Andrew> The problem specifically called out in the bug report is that
Andrew> namespaces can appear in multiple CUs, and that trying to complete
Andrew> 'ns::misspelled' would expand every CU containing namespace 'ns' due
Andrew> to the duplicate 'ns' type symbols.
... do we have a bug for this?
This also seems like something that could be fixed. For instance
completion could be done from the index as first pass.
Tom
next prev parent reply other threads:[~2025-10-22 15:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-02 9:36 [PATCH] " Andrew Burgess
2025-10-16 18:11 ` [PATCHv2] " Andrew Burgess
2025-10-21 13:45 ` [PATCHv3] " Andrew Burgess
2025-10-22 15:17 ` Tom Tromey [this message]
2025-10-22 15:59 ` Andrew Burgess
2025-10-22 16:13 ` Andrew Burgess
2025-10-22 17:21 ` Tom Tromey
2025-11-04 14:23 ` Andrew Burgess
2025-10-22 17:21 ` Tom Tromey
2025-11-13 16:32 ` Andrew Burgess
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87cy6fkltn.fsf@tromey.com \
--to=tom@tromey.com \
--cc=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox