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