[PATCH] Combine location with block using block_locations
Xinliang David Li
davidxl@google.com
Wed Sep 12 05:18:00 GMT 2012
Can you make definition of location_adhoc_data available in both
libcpp and gcc? In gcc side, the data structure will be annotated
with GTY(). The root global variables should also be visible in gcc
side.
David
On Tue, Sep 11, 2012 at 10:06 PM, Dehao Chen <dehao@google.com> wrote:
> Now I think we are facing a more complex problem. The data structure
> we use to store the location_adhoc_data are file-static in linemap.c
> in libcpp. These data structures are not guarded by GTY(()).
> Meanwhile, as we have removed the block data structure from
> gimple.gsbase as well as tree.exp (encoding them into an location_t).
> This could cause block being GCed and the LOCATION_BLOCK becoming
> dangling pointers.
>
> I tried to manipulate GTY to make it recognize the LOCATION_BLOCK from
> gimple.gsbase.location. However, neigher nested_ptr nor mark_hook can
> help me.
>
> Another approach would be guard the location_adhoc_data and related
> data structures in GTY(()). However, this is non-trivial because tree
> is not visible in libcpp. At the same time, my implementation heavily
> relies on hashtable to make the code efficient, thus it's quite tricky
> to make "param_is" and "use_params" work.
>
> The final approach, which I'll try tomorrow, would be move all my
> implementation from libcpp to gcc, and guard them with GTY(()). I
> still haven't thought of any potential problem of this approach. Any
> comments?
>
> Thanks,
> Dehao
>
> On Tue, Sep 11, 2012 at 9:00 AM, Dehao Chen <dehao@google.com> wrote:
>> I saw comments in tree-streamer-out.c:
>>
>> /* Do not stream BLOCK_SOURCE_LOCATION. We cannot handle debug information
>> for early inlining so drop it on the floor instead of ICEing in
>> dwarf2out.c. */
>> streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
>>
>> However, what the code is doing seemed contradictory with the comment.
>> Or am I missing something?
>>
>>
>>
>> On Tue, Sep 11, 2012 at 8:32 AM, Michael Matz <matz@suse.de> wrote:
>>> Hi,
>>>
>>> On Tue, 11 Sep 2012, Dehao Chen wrote:
>>>
>>>> Looks like we have two choices:
>>>>
>>>> 1. Stream out block info, and use LTO_SET_PREVAIL for TREE_CHAIN(t)
>>>
>>> This will actually not work correctly in some cases. The problem is, if
>>> the prevailing decl is already part of another chain (say in another
>>> block_var list) you would break the current chain. Hence block vars need
>>> special handling in the lto streamer (another reason why tree_chain is not
>>> the most clever think to use for this chain). This problem area needs to
>>> be solved somehow if block info is to be preserved correctly.
>>>
>>>> 2. Don't stream out block info for LTO, and still call LTO_NO_PREVAIL
>>>> (TREE_CHAIN (t)).
>>>
>>> That's also a large hammer as it basically will mean no debug info after
>>> LTO :-/ Sigh, at this point I have no good solution that doesn't involve
>>> quite some work, perhaps your hack is good enough for the time being,
>>> though I hate it :)
>>
>> I got it. Then I'll keep the patch as it is (remove the
>> LTO_NO_PREVAIL), and work with Honza to resolve the issue he had, and
>> then we should be good to check in?
>>
>> Thanks,
>> Dehao
>>
>>>
>>>
>>> Ciao,
>>> Michael.
More information about the Gcc-patches
mailing list