Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Tom Tromey <tom@tromey.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCHv3] gdb: remove attempted type de-duplication when building gdb-index
Date: Wed, 22 Oct 2025 17:13:19 +0100	[thread overview]
Message-ID: <87ikg6die8.fsf@redhat.com> (raw)
In-Reply-To: <87ldl3c4h4.fsf@redhat.com>

Andrew Burgess <aburgess@redhat.com> writes:

> Tom Tromey <tom@tromey.com> writes:
>
>>>>>>> "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.
>
> Thank you!  That exactly explains what's going on.  The test does
> specifically put just the destructor into a separate .cc file, which
> corresponds to the CU where we get the full type, with size.
>
>>
>> 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?
>
> I don't know.  I'll check, and if not open a new bug report, adding a
> 'Bug:' tag to the commit message of this patch before pushing.
>

OK, related bugs:

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

    CU expansion is slow.

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

   Best match, excessive CU expansion.

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

   Completion is slow due to CU expansion in general.

I propose to link to the second of these with a 'Bug:' tag in this
commit, but I don't think opening another bug is necessary.  Does that
sound OK to you?

Thanks,
Andrew


  reply	other threads:[~2025-10-22 16:14 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
2025-10-22 15:59       ` Andrew Burgess
2025-10-22 16:13         ` Andrew Burgess [this message]
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=87ikg6die8.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /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