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.

116 satır
5.1KB

  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>Blocks (GNU Compiler Collection (GCC) Internals)</title>
  21. <meta name="description" content="Blocks (GNU Compiler Collection (GCC) Internals)">
  22. <meta name="keywords" content="Blocks (GNU Compiler Collection (GCC) Internals)">
  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="Statements.html#Statements" rel="up" title="Statements">
  30. <link href="Statement-Sequences.html#Statement-Sequences" rel="next" title="Statement Sequences">
  31. <link href="Basic-Statements.html#Basic-Statements" rel="prev" title="Basic Statements">
  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="Blocks"></a>
  62. <div class="header">
  63. <p>
  64. Next: <a href="Statement-Sequences.html#Statement-Sequences" accesskey="n" rel="next">Statement Sequences</a>, Previous: <a href="Basic-Statements.html#Basic-Statements" accesskey="p" rel="prev">Basic Statements</a>, Up: <a href="Statements.html#Statements" accesskey="u" rel="up">Statements</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="Blocks-1"></a>
  68. <h4 class="subsection">11.7.2 Blocks</h4>
  69. <a name="index-Blocks"></a>
  70. <p>Block scopes and the variables they declare in GENERIC are
  71. expressed using the <code>BIND_EXPR</code> code, which in previous
  72. versions of GCC was primarily used for the C statement-expression
  73. extension.
  74. </p>
  75. <p>Variables in a block are collected into <code>BIND_EXPR_VARS</code> in
  76. declaration order through their <code>TREE_CHAIN</code> field. Any runtime
  77. initialization is moved out of <code>DECL_INITIAL</code> and into a
  78. statement in the controlled block. When gimplifying from C or C++,
  79. this initialization replaces the <code>DECL_STMT</code>. These variables
  80. will never require cleanups. The scope of these variables is just the
  81. body
  82. </p>
  83. <p>Variable-length arrays (VLAs) complicate this process, as their size
  84. often refers to variables initialized earlier in the block and their
  85. initialization involves an explicit stack allocation. To handle this,
  86. we add an indirection and replace them with a pointer to stack space
  87. allocated by means of <code>alloca</code>. In most cases, we also arrange
  88. for this space to be reclaimed when the enclosing <code>BIND_EXPR</code> is
  89. exited, the exception to this being when there is an explicit call to
  90. <code>alloca</code> in the source code, in which case the stack is left
  91. depressed on exit of the <code>BIND_EXPR</code>.
  92. </p>
  93. <p>A C++ program will usually contain more <code>BIND_EXPR</code>s than
  94. there are syntactic blocks in the source code, since several C++
  95. constructs have implicit scopes associated with them. On the
  96. other hand, although the C++ front end uses pseudo-scopes to
  97. handle cleanups for objects with destructors, these don&rsquo;t
  98. translate into the GIMPLE form; multiple declarations at the same
  99. level use the same <code>BIND_EXPR</code>.
  100. </p>
  101. </body>
  102. </html>