This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 0/3] Support for mandatory tail calls
- From: Jason Merrill <jason at redhat dot com>
- To: Basile Starynkevitch <basile at starynkevitch dot net>
- Cc: Jeff Law <law at redhat dot com>, David Malcolm <dmalcolm at redhat dot com>, gcc-patches List <gcc-patches at gcc dot gnu dot org>, jit at gcc dot gnu dot org
- Date: Thu, 19 May 2016 09:19:25 -0400
- Subject: Re: [PATCH 0/3] Support for mandatory tail calls
- Authentication-results: sourceware.org; auth=none
- References: <1463522492-43504-1-git-send-email-dmalcolm at redhat dot com> <01e0bf4f-c713-a84e-dc5d-d9c2ef43e09b at redhat dot com> <573D4182 dot 1020507 at starynkevitch dot net>
On Thu, May 19, 2016 at 12:30 AM, Basile Starynkevitch
<basile@starynkevitch.net> wrote:
> On 05/19/2016 12:12 AM, Jeff Law wrote:
>>
>> On 05/17/2016 04:01 PM, David Malcolm wrote:
>>>
>>> There have been requests [1] for libgccjit to better support
>>> functional programming by supporting the contination-passing style,
>>> in which every function "returns" by calling a "continuation"
>>> function pointer.
>>>
>>> These calls must be guaranteed to be implemented as a jump,
>>> otherwise the program could consume an arbitrary amount of stack
>>> space as it executed.
>>>
>>> This patch kit implements this.
>>>
>>> Patch 1 is a preliminary tweak to calls.c
>>>
>>> Patch 2 implements a new flag in tree.h: CALL_EXPR_MUST_TAIL_CALL,
>>> which makes calls.c try harder to implement a flagged call as a
>>> tail-call/sibling call, and makes it issue an error if
>>> the optimization is impossible. It doesn't implement any
>>> frontend support for setting the flag (instead using a plugin
>>> to test it). We had some discussion on the jit list about possibly
>>> introducing a new builtin for this, but the patch punts on this
>>> issue.
>>
>> I wonder if we should have an attribute so that the flag can be set for
>> C/C++ code. I've seen requests for forcing tail calls in C/C++ code several
>> times in the past, precisely to support continuations.
>
> Why an attribute? Attributes are on declarations. I think it should better
> be some pragma like _Pragma(GCC tail cail, foo(x,y)) or some builtin (or
> else some syntax extension like goto return foo(x,y); ...) because what we
> really want is to annotate a particular call to be tail-recursive.
C++11 attributes can apply to expression-statements as well, e.g.
[[gnu::tail_call]] fn();
though not to sub-expressions.
Jason