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 <de...@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 <m...@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.