Hi,
The tree_map_base_marked_p checks ggc_marked_p on the from field.
During
ggc_scan_cache_tab, if the from field is live, also the to field
is marked
live.
I wrote some code to do sanity testing and found a similar
scenario as
before:
- a register attribute is not marked live during root marking
- reg_attrs_htab is traversed, and the hash table entry
corresponding to the
register attribute is removed
- value_expr_for_decl is traversed, a from field is found live, so
the to
field is also marked live, marking the register attribute live.
Is this valid use of the garbage collector?
Originally the if_marked hook was supposed to be used only for
caching purposes. So it doesn't matter whether an element is
collected or not for correctness. If we now have accumulated other
uses we indeed have to worry about this scenario (and I think it
won't work very well there).
Richard.
For my understanding: is it correct if I translate 'to be used only
for caching purposes' to 'the compiler is free to ignore the
if_marked function and remove all if_marked hash table entries'?
I just tried that in a bootstrap build, and that breaks already in
stage 1.
From looking at all the if_marked functions in gcc, a typical use
case seems to be the one of uniqueness (also the use case described
in the docs): making sure there is only a single object with certain
properties, such that a test for structural equality can be replaced
with a pointer equality comparison. This is well supported by the
current implementation, but correctness does depend on whether a hash
table element is collected or not.
What is not well supported, is marking live something else than hash
table entries during ggc_scan_cache_tab. Following the scenario I
mention above, we can end up with 2 structurally equal objects, while
the code assumes that's not possible, and tests structural equality
by pointer comparison. This is the scenario I worry about.
I can image a few ways to go from here:
- leave as is, fix this when it really bothers us (risk: exchange a
known problem for unknown hard-to-debug and/or hard-to-reproduce
problems)
- instrument if_marked functions like the one for value_expr_for_decl
to assert if the from field is live and the to field is not live,
and fix the asserts
- extend garbage colllector to handle the problematic case (problem:
more runtime and/or memory usage for garbage collection)
Any suggestions on which way to go?
Regards
Tom