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.