[PATCH 2/2] Remove dwarf2_cu::language

Tom de Vries tdevries@suse.de
Thu Jun 10 22:35:04 GMT 2021


On 6/9/21 10:26 PM, Tom Tromey wrote:
> Simon> It's not totally clear to me why it's better to go this route, eliminate
> Simon> dwarf2_cu::language and keep dwarf2_per_cu_data::lang.  Because I find
> Simon> it a bit hard to follow that a dwarf2_per_cu_data is initialized by a
> Simon> dwarf2_cu being constructed.
> 
> I didn't give it much thought TBH - I was using dwarf2_per_cu_data::lang
> in my series, and I assumed that this was there for some other important
> reason.  However, I see that this member was added in commit 589902954d
> ("[gdb] Skip imports of c++ CUs"), and from what I can tell, it should
> be fine to switch that code to using dwarf2_cu::language instead.
> 
> Simon> So here, instead of referring to per_cu->lang, we could perhaps look up
> Simon> to see if a dwarf2_cu exists for `per_cu`, and lookup the language
> Simon> there?  The downside would be if a dwarf2_cu has existed but was then
> Simon> freed, then we won't see the language.  Whereas by storing the language
> Simon> in dwarf2_per_cu_data::lang, it will persist even if the dwarf2_cu gets
> Simon> freed.
> 
> Yeah, I arrived at this same conclusion...
> 
> But actually, I wonder whether that code even needs a language check.
> My thought is that an import of a DW_UT_compile / DW_TAG_compile_unit CU
> can always be skipped on the grounds that the CU is being scanned
> separately anyway.

It's about whether the language has global namespace or not.

In c++, it has, so, take an example CU A, and a CU B, each with two
function entries.

Now if CU A doesn't import CU B, the global namespace has four entries.
And if CU A does import CU B, the global namespace still has four
entries.  So, it's safe to ignore the import because semantically it
doesn't make a difference.

But with C, there's no global namespace so each CU declares its own
namespace.

Now if CU A doesn't import CU B, the namespace for CU A has two entries,
and the namespace for CU B has two entries.
And if CU A does import CU B, then the namespace for CU A has four
entries, and the CU B has two entries.  It's not safe to ignore the
import because semantically there is a difference.

Thanks,
- Tom


More information about the Gdb-patches mailing list