re PR c/59039 (Undocumented __builtin_longjmp/__builtin_setjmp)

2018-12-03  Sandra Loosemore  <sandra@codesourcery.com>

	PR c/59039

	gcc/
	* doc/extend.texi (Nonlocal gotos): New section.

From-SVN: r266770
This commit is contained in:
Sandra Loosemore 2018-12-03 23:22:37 -05:00 committed by Sandra Loosemore
parent d1c3e06f2c
commit 4b8caa08fe
2 changed files with 61 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2018-12-03 Sandra Loosemore <sandra@codesourcery.com>
PR c/59039
* doc/extend.texi (Nonlocal gotos): New section.
2018-12-03 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sse.md (vec_concatv2df): Change (v,xm,C)

View File

@ -27,6 +27,7 @@ extensions, accepted by GCC in C90 mode and in C++.
* Local Labels:: Labels local to a block.
* Labels as Values:: Getting pointers to labels, and computed gotos.
* Nested Functions:: Nested function in GNU C.
* Nonlocal Gotos:: Nonlocal gotos.
* Constructing Calls:: Dispatching a call to another function.
* Typeof:: @code{typeof}: referring to the type of an expression.
* Conditionals:: Omitting the middle operand of a @samp{?:} expression.
@ -520,6 +521,61 @@ bar (int *array, int offset, int size)
@}
@end smallexample
@node Nonlocal Gotos
@section Nonlocal Gotos
@cindex nonlocal gotos
GCC provides the built-in functions @code{__builtin_setjmp} and
@code{__builtin_longjmp} which are similar to, but not interchangeable
with, the C library functions @code{setjmp} and @code{longjmp}.
The built-in versions are used internally by GCC's libraries
to implement exception handling on some targets. You should use the
standard C library functions declared in @code{<setjmp.h>} in user code
instead of the builtins.
The built-in versions of these functions use GCC's normal
mechanisms to save and restore registers using the stack on function
entry and exit. The jump buffer argument @var{buf} holds only the
information needed to restore the stack frame, rather than the entire
set of saved register values.
An important caveat is that GCC arranges to save and restore only
those registers known to the specific architecture variant being
compiled for. This can make @code{__builtin_setjmp} and
@code{__builtin_longjmp} more efficient than their library
counterparts in some cases, but it can also cause incorrect and
mysterious behavior when mixing with code that uses the full register
set.
You should declare the jump buffer argument @var{buf} to the
built-in functions as:
@smallexample
#include <stdint.h>
intptr_t @var{buf}[5];
@end smallexample
@deftypefn {Built-in Function} {int} __builtin_setjmp (intptr_t *@var{buf})
This function saves the current stack context in @var{buf}.
@code{__builtin_setjmp} returns 0 when returning directly,
and 1 when returning from @code{__builtin_longjmp} using the same
@var{buf}.
@end deftypefn
@deftypefn {Built-in Function} {void} __builtin_longjmp (intptr_t *@var{buf}, int @var{val})
This function restores the stack context in @var{buf},
saved by a previous call to @code{__builtin_setjmp}. After
@code{__builtin_longjmp} is finished, the program resumes execution as
if the matching @code{__builtin_setjmp} returns the value @var{val},
which must be 1.
Because @code{__builtin_longjmp} depends on the function return
mechanism to restore the stack context, it cannot be called
from the same function calling @code{__builtin_setjmp} to
initialize @var{buf}. It can only be called from a function called
(directly or indirectly) from the function calling @code{__builtin_setjmp}.
@end deftypefn
@node Constructing Calls
@section Constructing Function Calls
@cindex constructing calls