On Mon, Jul 5, 2010 at 5:57 PM, Tom de Vries <tjvr...@xs4all.nl> wrote:
> 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?

Or make sure to walk all if_marked roots last (isn't the problem an
ordering one only?)

Richard.

> Regards
>  Tom
>

Reply via email to