You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
6.6KB

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2020 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  20. <title>Nonlocal Gotos (Using the GNU Compiler Collection (GCC))</title>
  21. <meta name="description" content="Nonlocal Gotos (Using the GNU Compiler Collection (GCC))">
  22. <meta name="keywords" content="Nonlocal Gotos (Using the GNU Compiler Collection (GCC))">
  23. <meta name="resource-type" content="document">
  24. <meta name="distribution" content="global">
  25. <meta name="Generator" content="makeinfo">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="C-Extensions.html#C-Extensions" rel="up" title="C Extensions">
  30. <link href="Constructing-Calls.html#Constructing-Calls" rel="next" title="Constructing Calls">
  31. <link href="Nested-Functions.html#Nested-Functions" rel="prev" title="Nested Functions">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.indentedblock {margin-right: 0em}
  36. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  37. blockquote.smallquotation {font-size: smaller}
  38. div.display {margin-left: 3.2em}
  39. div.example {margin-left: 3.2em}
  40. div.lisp {margin-left: 3.2em}
  41. div.smalldisplay {margin-left: 3.2em}
  42. div.smallexample {margin-left: 3.2em}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style: oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nolinebreak {white-space: nowrap}
  54. span.roman {font-family: initial; font-weight: normal}
  55. span.sansserif {font-family: sans-serif; font-weight: normal}
  56. ul.no-bullet {list-style: none}
  57. -->
  58. </style>
  59. </head>
  60. <body lang="en">
  61. <a name="Nonlocal-Gotos"></a>
  62. <div class="header">
  63. <p>
  64. Next: <a href="Constructing-Calls.html#Constructing-Calls" accesskey="n" rel="next">Constructing Calls</a>, Previous: <a href="Nested-Functions.html#Nested-Functions" accesskey="p" rel="prev">Nested Functions</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  65. </div>
  66. <hr>
  67. <a name="Nonlocal-Gotos-1"></a>
  68. <h3 class="section">6.5 Nonlocal Gotos</h3>
  69. <a name="index-nonlocal-gotos"></a>
  70. <p>GCC provides the built-in functions <code>__builtin_setjmp</code> and
  71. <code>__builtin_longjmp</code> which are similar to, but not interchangeable
  72. with, the C library functions <code>setjmp</code> and <code>longjmp</code>.
  73. The built-in versions are used internally by GCC&rsquo;s libraries
  74. to implement exception handling on some targets. You should use the
  75. standard C library functions declared in <code>&lt;setjmp.h&gt;</code> in user code
  76. instead of the builtins.
  77. </p>
  78. <p>The built-in versions of these functions use GCC&rsquo;s normal
  79. mechanisms to save and restore registers using the stack on function
  80. entry and exit. The jump buffer argument <var>buf</var> holds only the
  81. information needed to restore the stack frame, rather than the entire
  82. set of saved register values.
  83. </p>
  84. <p>An important caveat is that GCC arranges to save and restore only
  85. those registers known to the specific architecture variant being
  86. compiled for. This can make <code>__builtin_setjmp</code> and
  87. <code>__builtin_longjmp</code> more efficient than their library
  88. counterparts in some cases, but it can also cause incorrect and
  89. mysterious behavior when mixing with code that uses the full register
  90. set.
  91. </p>
  92. <p>You should declare the jump buffer argument <var>buf</var> to the
  93. built-in functions as:
  94. </p>
  95. <div class="smallexample">
  96. <pre class="smallexample">#include &lt;stdint.h&gt;
  97. intptr_t <var>buf</var>[5];
  98. </pre></div>
  99. <dl>
  100. <dt><a name="index-_005f_005fbuiltin_005fsetjmp"></a>Built-in Function: <em>int</em> <strong>__builtin_setjmp</strong> <em>(intptr_t *<var>buf</var>)</em></dt>
  101. <dd><p>This function saves the current stack context in <var>buf</var>.
  102. <code>__builtin_setjmp</code> returns 0 when returning directly,
  103. and 1 when returning from <code>__builtin_longjmp</code> using the same
  104. <var>buf</var>.
  105. </p></dd></dl>
  106. <dl>
  107. <dt><a name="index-_005f_005fbuiltin_005flongjmp"></a>Built-in Function: <em>void</em> <strong>__builtin_longjmp</strong> <em>(intptr_t *<var>buf</var>, int <var>val</var>)</em></dt>
  108. <dd><p>This function restores the stack context in <var>buf</var>,
  109. saved by a previous call to <code>__builtin_setjmp</code>. After
  110. <code>__builtin_longjmp</code> is finished, the program resumes execution as
  111. if the matching <code>__builtin_setjmp</code> returns the value <var>val</var>,
  112. which must be 1.
  113. </p>
  114. <p>Because <code>__builtin_longjmp</code> depends on the function return
  115. mechanism to restore the stack context, it cannot be called
  116. from the same function calling <code>__builtin_setjmp</code> to
  117. initialize <var>buf</var>. It can only be called from a function called
  118. (directly or indirectly) from the function calling <code>__builtin_setjmp</code>.
  119. </p></dd></dl>
  120. <hr>
  121. <div class="header">
  122. <p>
  123. Next: <a href="Constructing-Calls.html#Constructing-Calls" accesskey="n" rel="next">Constructing Calls</a>, Previous: <a href="Nested-Functions.html#Nested-Functions" accesskey="p" rel="prev">Nested Functions</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  124. </div>
  125. </body>
  126. </html>