From: Simon Marchi <simark@simark.ca>
To: Tom de Vries <tdevries@suse.de>, Tom Tromey <tom@tromey.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v2] [gdb/symtab] Fix dwarf version of DWO TU
Date: Mon, 3 Mar 2025 16:22:41 -0500 [thread overview]
Message-ID: <f9f7276d-0758-4066-94c4-3bc23e03490d@simark.ca> (raw)
In-Reply-To: <86d6f8f6-8fad-46ad-ae37-9fbbadb6586f@simark.ca>
On 3/3/25 3:44 PM, Simon Marchi wrote:
> On 3/3/25 3:02 PM, Simon Marchi wrote:
>> On 1/21/25 10:09 AM, Tom de Vries wrote:
>>> On 1/21/25 14:32, Tom Tromey wrote:
>>>>>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
>>>>
>>>> Tom> When running test-case gdb.ada/access_tagged_param.exp with target board
>>>> Tom> fission, we run into:
>>>> Tom> ...
>>>> Tom> (gdb) break pck.adb:19^M
>>>> Tom> gdb/dwarf2/read.h:289: internal-error: version: \
>>>> Tom> Assertion `m_dwarf_version != 0' failed.^M
>>>> Tom> ...
>>>>
>>>> Tom> - && (cu->per_cu->version () == 2
>>>> Tom> + && (cu->header.version == 2
>>>>
>>>> All the stuff in this area seems kind of horrible to me. Like, first of
>>>> all, how can this even fail? It seems like the CU version should be set
>>>> when setting up the reader.
>>>
>>> Hi Tom,
>>>
>>> thanks for the review.
>>>
>>> The v1 ( https://sourceware.org/pipermail/gdb-patches/2024-October/212676.html ) takes the approach of making sure "cu->per_cu->version ()" is set.
>>>
>>> Do you prefer that one?
>>>
>>> Thanks,
>>> - Tom
>>>
>>>> And if not, what's gone wrong there?
>>>> Relatedly, can the other callers of version() fail in the same way?
>>>> Finally there aren't really that many callers of this method so I wonder
>>>> if it can be removed, maybe making this code less fragile. Looking at
>>>> it, I feel pretty sure if I needed a version check I'd probably write
>>>> code to call this method but ... maybe that's unsafe?
>>>>
>>>> Tom
>>>
>>
>> My understanding of what Tom T said is that the
>> dwarf2_per_cu_data::version method could be removed. Callers could use
>> the dwarf2_cu::header::version field, since they do have access to a
>> dwarf2_cu anyway. I will give that a shot.
>
> I spoke too soon, there are uses of dwarf2_per_cu_data::version in loc.c
> that my indexer hadn't picked up yet for some reason. When those run,
> the dwarf2_cu is probably gone.
>
> It would be nice if we could ensure that the DWARF is set at the
> creation of any dwarf2_per_cu_data, but it doesn't seem possible. When
> we read a .gdb_index index, we create some dwarf2_per_cu_data objects
> out of it, but we don't know the DWARF version of those. We will only
> know when reading them with a cutu_reader.
>
> So I see 3 options on the table:
>
> 1. Tom's first patch would obtain the DWARF version of the from the
> skeleton unit, and pass it when creating the signatured_type object for
> the type unit that is stored in the dwo file
>
> 2. A patch proposed in the bug just sets the field in the "type unit in
> dwo file" code path, like we do for other kinds of units.
>
> 3. Another option would be to save the DWARF version in
> dwarf2_loclist_baton (those are the users of the version in loc.c I
> referred to above). That would duplicate the value, versus having it
> in dwarf2_per_cu_data alone. But it would make it so we never have a
> possibly uninitialized version field, which is easier to reason about.
>
> When first looking at the problem, I independently arrived at solution
> #2. It means we can still have a gap of time between the creation of a
> dwarf2_per_cu_data object and when we read its header where the DWARF
> version is unknown (and the version field is unset), but it seems
> inevitable. We just need to ensure that in all paths where we read its
> header, we set the field.
>
> If prefer the peace of mind of knowing the version field can never be
> "unset", then solution #3 is good I guess.
Actually, dwarf2_loclist_baton has some wasted space (padding) at the
end, so now I vote for option #3 for simplicity - not thread safety
issue, no field possible left unset. Patch here:
https://inbox.sourceware.org/gdb-patches/20250303212126.728156-1-simon.marchi@efficios.com/T/#u
Simon
prev parent reply other threads:[~2025-03-03 21:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-20 8:57 Tom de Vries
2025-01-21 13:32 ` Tom Tromey
2025-01-21 15:09 ` Tom de Vries
2025-03-03 20:02 ` Simon Marchi
2025-03-03 20:44 ` Simon Marchi
2025-03-03 21:22 ` Simon Marchi [this message]
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=f9f7276d-0758-4066-94c4-3bc23e03490d@simark.ca \
--to=simark@simark.ca \
--cc=gdb-patches@sourceware.org \
--cc=tdevries@suse.de \
--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