libctf: dedup: conflicting CU names and merging into the parent

The last two dedup changes are, firstly, to use ctf_add_conflicting() to
arrange that conflicting types that are hidden because they are added to the
same dict as the types they conflict with (e.g. conflicting types in
modules) are properly marked with the CU name that the type comes from.
This could of course not be done with the old non-root flag, but now that we
have proper prefix types, we can record it, and consumers can find out what
CU any type comes from via ctf_type_conflicting (or, for non-kernel CTF
generated by GNU ld, via the ctf_cuname of the per-cu dict).

Secondly, we add a new kind of CU mapping for cu-mapped (two-stage) links
(as a reminder, these carry out a second stage of dedupping in which they
squash specific CUs down to a named set of child dicts, fusing named inputs
into particular named outputs: the kernel linker uses this to make child
dicts that represent modules rather than translation units). You can now map
any CU name to "" (the null string).  This indicates that types that would
land in the CU in question should not be emitted into any sort of per-module
dict but should instead just be emitted into the shared dict, possibly being
marked conflicting as they do so.  The usual popcount mechanism will be used
to pick the type which is left unhidden.  The usual forwarding stubs you
would expect to find for conflicting structs and unions will not be emitted:
instead, real structs and unions will take their place.  Consumers must take
care when chasing parent types that point to tagged structs to make sure
that there isn't a correspondingly-named struct in the child they're looking
at (but this is generally a problem with type chasing in children anyway,
which I have a TODO open to find some sort of solution to: this should be
being done automatically, and isn't).
This commit is contained in:
Nick Alcock
2025-04-25 20:49:26 +01:00
parent f38832b398
commit 7bea1097ec
3 changed files with 27 additions and 6 deletions

View File

@@ -369,7 +369,11 @@ ctf_create_per_cu (ctf_dict_t *fp, ctf_dict_t *input, const char *cu_name)
We forcibly add a dict named TO in every case, even though it may well
wind up empty, because clients that use this facility usually expect to find
every TO dict present, even if empty, and malfunction otherwise. */
every TO dict present, even if empty, and malfunction otherwise.
The TO mapping named "" is special: types in this are merged directly and
unconditionally into the shared parent dict, and are hidden (marked conflicting) if
they clash, rather than being moved into child dicts. */
int
ctf_link_add_cu_mapping (ctf_dict_t *fp, const char *from, const char *to)