[llvm-commits] [llvm-gcc-4.2] r63087 - /llvm-gcc-4.2/trunk/gcc/tree-nested.c

Dale Johannesen dalej at apple.com
Tue Jan 27 10:30:46 PST 2009


On Jan 27, 2009, at 10:26 AMPST, Duncan Sands wrote:

> Hi Dale,
>>
>>> It is here
>>> because I had to add a bunch of code to fix a long
>>> standing tree-nested bug in which nested function bodies
>>> and callers have different opinions as to whether
>>> the function takes a static chain parameter or not.
>>> This doesn't matter much for gcc because the parameter
>>> is passed out of line, but it is rather horrible for
>>> llvm-gcc because it is added as an explicit parameter
>>> to the function.  I never got round to pushing this
>>> upstream, but I really should.  Anyway, the assertion
>>> is checking that a nested subroutine (the root->outer
>>> check ensures that this is a nested subroutine) takes
>>> an extra parameter for passing variables belonging to
>>> the parent (the "static chain") if and only if either
>>> it itself accesses a variable belonging to its parent
>>> (in which case root->chain_field is not null) or one
>>> of its child nested subroutines does (in which case
>>> root->chain_decl is not null).
>>>
>>>> -      gcc_assert (!root->outer ||
>>>> -                  DECL_NO_STATIC_CHAIN (root->context) ==
>>>> -                  !(root->chain_decl || root->chain_field));
>>>
>>> If the assertion is failing, it seems to me that something
>>> bad is going on.
>>
>> You may be right, or this may be another case where ObjC isn't doing
>> what you expect (which you would probably consider abuse).  I
>> concluded it was the latter, but  you seem to understand what this
>> code is doing better than I, maybe you could look at the testcase?
>
> I will.  Sadly I do understand the horror that is tree-nested, at
> least I used to.  I had to in order to implement support for nested
> functions in llvm-gcc :( :)

OK.  I've also got a question in the guy who implemented the "blocks"  
stuff in ObjC, who fortunately is still here:)  He can probably  
clarify what ObjC is doing.




More information about the llvm-commits mailing list