On Fri, Oct 10, 2014 at 6:06 PM, Peter Collingbourne <p...@google.com> wrote:
> On Fri, Oct 10, 2014 at 5:33 PM, 'Ian Lance Taylor' via gofrontend-dev
> <gofrontend-...@googlegroups.com> wrote:
>>
>> On Fri, Oct 10, 2014 at 1:42 PM, Richard Henderson <r...@redhat.com> wrote:
>> >
>> > This is awful syntax, and therefore contains no documentation.
>> > But we'll need to be able to set the static chain on a few calls
>> > within the Go runtime, so we need to expose this by some means.
>> >
>> > It currently looks like
>> >
>> >         function(args...) __builtin_call_chain(pointer)
>> >
>> > because that was easy to parse.
>>
>> How crazy would it be to move __builtin_call_chain into the function
>> arguments, as in
>>     function(a1, a2, __builtin_call_chain(pointer))
>> This __builtin_call_chain call would be removed from the argument list
>> so type checking would only look at a1, a2.  It would just set the
>> static chain value.  That at least puts the call_chain in the right
>> place, which is a special kind of function argument.
>
>
> Clang will need to be able to parse this syntax too, so let's not do
> anything that diverges too much from the standard.
>
> Can we perhaps make this look like a new calling convention? So e.g. you
> could do:
>
> (((void (__attribute__((chaincall)) *)(void *, int, int)))function)(pointer,
> a1, a2);

A colleague has suggested a perhaps nicer syntax:

__builtin_call_chain(pointer, call) where call must be a call expression

Peter

Reply via email to