blob: eff147ebe374da47692a6fe831d3f4be9010a462 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
"GNU Free Documentation License".
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Compiler Collection (GCC) Internals: GIMPLE Exception Handling</title>
<meta name="description" content="GNU Compiler Collection (GCC) Internals: GIMPLE Exception Handling">
<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: GIMPLE Exception Handling">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="GIMPLE.html#GIMPLE" rel="up" title="GIMPLE">
<link href="Temporaries.html#Temporaries" rel="next" title="Temporaries">
<link href="GIMPLE-instruction-set.html#GIMPLE-instruction-set" rel="prev" title="GIMPLE instruction set">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="GIMPLE-Exception-Handling"></a>
<div class="header">
<p>
Next: <a href="Temporaries.html#Temporaries" accesskey="n" rel="next">Temporaries</a>, Previous: <a href="GIMPLE-instruction-set.html#GIMPLE-instruction-set" accesskey="p" rel="prev">GIMPLE instruction set</a>, Up: <a href="GIMPLE.html#GIMPLE" accesskey="u" rel="up">GIMPLE</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>
</div>
<hr>
<a name="Exception-Handling-1"></a>
<h3 class="section">11.3 Exception Handling</h3>
<a name="index-GIMPLE-Exception-Handling"></a>
<p>Other exception handling constructs are represented using
<code>GIMPLE_TRY_CATCH</code>. <code>GIMPLE_TRY_CATCH</code> has two operands. The
first operand is a sequence of statements to execute. If executing
these statements does not throw an exception, then the second operand
is ignored. Otherwise, if an exception is thrown, then the second
operand of the <code>GIMPLE_TRY_CATCH</code> is checked. The second
operand may have the following forms:
</p>
<ol>
<li> A sequence of statements to execute. When an exception occurs,
these statements are executed, and then the exception is rethrown.
</li><li> A sequence of <code>GIMPLE_CATCH</code> statements. Each
<code>GIMPLE_CATCH</code> has a list of applicable exception types and
handler code. If the thrown exception matches one of the caught
types, the associated handler code is executed. If the handler
code falls off the bottom, execution continues after the original
<code>GIMPLE_TRY_CATCH</code>.
</li><li> A <code>GIMPLE_EH_FILTER</code> statement. This has a list of
permitted exception types, and code to handle a match failure. If the
thrown exception does not match one of the allowed types, the
associated match failure code is executed. If the thrown exception
does match, it continues unwinding the stack looking for the next
handler.
</li></ol>
<p>Currently throwing an exception is not directly represented in
GIMPLE, since it is implemented by calling a function. At some
point in the future we will want to add some way to express that
the call will throw an exception of a known type.
</p>
<p>Just before running the optimizers, the compiler lowers the
high-level EH constructs above into a set of &lsquo;<samp>goto</samp>&rsquo;s, magic
labels, and EH regions. Continuing to unwind at the end of a
cleanup is represented with a <code>GIMPLE_RESX</code>.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Temporaries.html#Temporaries" accesskey="n" rel="next">Temporaries</a>, Previous: <a href="GIMPLE-instruction-set.html#GIMPLE-instruction-set" accesskey="p" rel="prev">GIMPLE instruction set</a>, Up: <a href="GIMPLE.html#GIMPLE" accesskey="u" rel="up">GIMPLE</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>
</div>
</body>
</html>