[PATCH] c++/70594 debug info differences

Nathan Sidwell nathan@acm.org
Tue Apr 12 20:59:00 GMT 2016


Well, I had a patch all ready, but when writing it up, I discovered the logic 
behind comment #26 is wrong.  Specifically, Jason's proto-patch makes the 
fn_copy_table GCable, but keeps the constexpr_call_table GC-deletable.  The 
logic is that if we need to recreate a particular constexpr call, we'll have a 
body available  so not need to do another copy.  But  consider a constexpr such as:

   constexpr int Foo (int i) { return i ? Foo (i - 1) : 0; }

Then the following evaluations:
   Foo (0)
   <possible GC>
   Foo (1)

If the GC does not happen, we'll have cached the evaluation of 'Foo(0)', and so 
not need to reevaluate it during the 'Foo(1)' call. The evaluation of 'Foo(1)' 
will use the single cached body of Foo for it's own evaluation, so no additional 
cloning will happen.

However, if the GC does happen, we'll need to evaluate 'Foo(0)' again, but 
there'll be no cached body of Foo available (it being in use for 'Foo(1)'). So 
we will observe a UID change.

I think that means the constexpr_call_table must be preserved too. Something 
along the lines of the size checking I posted yesterday? (but with the GTY stuff 
done better).

nathan



More information about the Gcc-patches mailing list