aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-intl.h
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2025-04-25 20:41:14 +0100
committerNick Alcock <nick.alcock@oracle.com>2025-04-25 21:23:07 +0100
commitf38832b3985d6a91c5ca51d46f3e6ce468f188a0 (patch)
treec6f827df38391ffbd25f780393e0ddb1c293e786 /libctf/ctf-intl.h
parentbf735030ac448b1e60d3f01fb88f205de3153656 (diff)
downloadbinutils-f38832b3985d6a91c5ca51d46f3e6ce468f188a0.zip
binutils-f38832b3985d6a91c5ca51d46f3e6ce468f188a0.tar.gz
binutils-f38832b3985d6a91c5ca51d46f3e6ce468f188a0.tar.bz2
libctf: dedup: decl tag support.
Decl tags to types and to functions and function arguments are relatively straightforward, as are decl tags to structures as a whole or to members of untagged structures; but decl tags to specific members of tagged structs and unions have two separate nasty problems, entirely down to the use of tagged structures to break cycles in the type graph. The first is that we have to mark decl tags conflicting if their associated struct is conflicting, but traversal from types to their parents halts at tagged structs and unions, because the type graph is sharded via stubs at those points and conflictedness ceases. But we don't want to do that here: a decl_tag to member 10 of some struct is only valid if that struct *has* ten members, and if the struct is conflicted, some may have only one. The decl tag is only valid for the specific struct-with-ten-members it was originally pointing at, anyway: other structs-with-ten-members may have entirely different members there, which are not tagged or which are tagged with something else. So we track this by keeping track of the only thing that is knowable about struct/union stubs: their decorated name. The citers graph gains mappings from decorated SoU names to decl tags (where the decl tag has a component_idx), and conflictedness marking chases that and marks accordingly, via the new ctf_dedup_mark_conflicting_hash_citers. The second problem is that we have to emit decl tags to struct members of all kinds after the members are emitted, but the members are emitted later than core type deduplication because they might refer to any types in the dict, including types added after the struct was added. So we need to accumulate decl tags to struct members in a new hashtab (cd_emission_struct_decl_tags) and add yet *another* pass that traverses that and emits all the decl tags in it. (If it turns out that decl tags to other things can similarly appear before the type they refer to, we'll either have to sort them earlier or emit them at the end as well -- but this seems unlikely.) None of this complexity is properly tested, because we're not yet emitting decl tags (as far as I know). But at least it doesn't break anything else, and it's somewhere to start.
Diffstat (limited to 'libctf/ctf-intl.h')
0 files changed, 0 insertions, 0 deletions