Don't force relaxation of AdvanceLoc instructions on OS X. gdb is happy with
[oota-llvm.git] / docs / ExceptionHandling.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2                       "http://www.w3.org/TR/html4/strict.dtd">
3 <html>
4 <head>
5   <title>Exception Handling in LLVM</title>
6   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
7   <meta name="description"
8         content="Exception Handling in LLVM.">
9   <link rel="stylesheet" href="llvm.css" type="text/css">
10 </head>
11
12 <body>
13
14 <h1>Exception Handling in LLVM</h1>
15
16 <table class="layout" style="width:100%">
17   <tr class="layout">
18     <td class="left">
19 <ul>
20   <li><a href="#introduction">Introduction</a>
21   <ol>
22     <li><a href="#itanium">Itanium ABI Zero-cost Exception Handling</a></li>
23     <li><a href="#sjlj">Setjmp/Longjmp Exception Handling</a></li>
24     <li><a href="#overview">Overview</a></li>
25   </ol></li>
26   <li><a href="#codegen">LLVM Code Generation</a>
27   <ol>
28     <li><a href="#throw">Throw</a></li>
29     <li><a href="#try_catch">Try/Catch</a></li>
30     <li><a href="#cleanups">Cleanups</a></li>
31     <li><a href="#throw_filters">Throw Filters</a></li>
32     <li><a href="#restrictions">Restrictions</a></li>
33   </ol></li>
34   <li><a href="#format_common_intrinsics">Exception Handling Intrinsics</a>
35   <ol>
36         <li><a href="#llvm_eh_exception"><tt>llvm.eh.exception</tt></a></li>
37         <li><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a></li>
38         <li><a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a></li>
39         <li><a href="#llvm_eh_sjlj_setjmp"><tt>llvm.eh.sjlj.setjmp</tt></a></li>
40         <li><a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a></li>
41         <li><a href="#llvm_eh_sjlj_lsda"><tt>llvm.eh.sjlj.lsda</tt></a></li>
42         <li><a href="#llvm_eh_sjlj_callsite"><tt>llvm.eh.sjlj.callsite</tt></a></li>
43         <li><a href="#llvm_eh_sjlj_dispatchsetup"><tt>llvm.eh.sjlj.dispatchsetup</tt></a></li>
44   </ol></li>
45   <li><a href="#asm">Asm Table Formats</a>
46   <ol>
47     <li><a href="#unwind_tables">Exception Handling Frame</a></li>
48     <li><a href="#exception_tables">Exception Tables</a></li>
49   </ol></li>
50   <li><a href="#todo">ToDo</a></li>
51 </ul>
52 </td>
53 </tr></table>
54
55 <div class="doc_author">
56   <p>Written by <a href="mailto:jlaskey@mac.com">Jim Laskey</a></p>
57 </div>
58
59
60 <!-- *********************************************************************** -->
61 <h2><a name="introduction">Introduction</a></h2>
62 <!-- *********************************************************************** -->
63
64 <div>
65
66 <p>This document is the central repository for all information pertaining to
67    exception handling in LLVM.  It describes the format that LLVM exception
68    handling information takes, which is useful for those interested in creating
69    front-ends or dealing directly with the information.  Further, this document
70    provides specific examples of what exception handling information is used for
71    in C/C++.</p>
72
73 <!-- ======================================================================= -->
74 <h3>
75   <a name="itanium">Itanium ABI Zero-cost Exception Handling</a>
76 </h3>
77
78 <div>
79
80 <p>Exception handling for most programming languages is designed to recover from
81    conditions that rarely occur during general use of an application.  To that
82    end, exception handling should not interfere with the main flow of an
83    application's algorithm by performing checkpointing tasks, such as saving the
84    current pc or register state.</p>
85
86 <p>The Itanium ABI Exception Handling Specification defines a methodology for
87    providing outlying data in the form of exception tables without inlining
88    speculative exception handling code in the flow of an application's main
89    algorithm.  Thus, the specification is said to add "zero-cost" to the normal
90    execution of an application.</p>
91
92 <p>A more complete description of the Itanium ABI exception handling runtime
93    support of can be found at
94    <a href="http://www.codesourcery.com/cxx-abi/abi-eh.html">Itanium C++ ABI:
95    Exception Handling</a>. A description of the exception frame format can be
96    found at
97    <a href="http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html">Exception
98    Frames</a>, with details of the DWARF 3 specification at
99    <a href="http://www.eagercon.com/dwarf/dwarf3std.htm">DWARF 3 Standard</a>.
100    A description for the C++ exception table formats can be found at
101    <a href="http://www.codesourcery.com/cxx-abi/exceptions.pdf">Exception Handling
102    Tables</a>.</p>
103
104 </div>
105
106 <!-- ======================================================================= -->
107 <h3>
108   <a name="sjlj">Setjmp/Longjmp Exception Handling</a>
109 </h3>
110
111 <div>
112
113 <p>Setjmp/Longjmp (SJLJ) based exception handling uses LLVM intrinsics
114    <a href="#llvm_eh_sjlj_setjmp"><tt>llvm.eh.sjlj.setjmp</tt></a> and
115    <a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a> to
116    handle control flow for exception handling.</p>
117
118 <p>For each function which does exception processing, be it try/catch blocks
119    or cleanups, that function registers itself on a global frame list. When
120    exceptions are being unwound, the runtime uses this list to identify which
121    functions need processing.<p>
122
123 <p>Landing pad selection is encoded in the call site entry of the function
124    context. The runtime returns to the function via
125    <a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a>, where
126    a switch table transfers control to the appropriate landing pad based on
127    the index stored in the function context.</p>
128
129 <p>In contrast to DWARF exception handling, which encodes exception regions
130    and frame information in out-of-line tables, SJLJ exception handling
131    builds and removes the unwind frame context at runtime. This results in
132    faster exception handling at the expense of slower execution when no
133    exceptions are thrown. As exceptions are, by their nature, intended for
134    uncommon code paths, DWARF exception handling is generally preferred to
135    SJLJ.</p>
136 </div>
137
138 <!-- ======================================================================= -->
139 <h3>
140   <a name="overview">Overview</a>
141 </h3>
142
143 <div>
144
145 <p>When an exception is thrown in LLVM code, the runtime does its best to find a
146    handler suited to processing the circumstance.</p>
147
148 <p>The runtime first attempts to find an <i>exception frame</i> corresponding to
149    the function where the exception was thrown.  If the programming language
150    (e.g. C++) supports exception handling, the exception frame contains a
151    reference to an exception table describing how to process the exception.  If
152    the language (e.g. C) does not support exception handling, or if the
153    exception needs to be forwarded to a prior activation, the exception frame
154    contains information about how to unwind the current activation and restore
155    the state of the prior activation.  This process is repeated until the
156    exception is handled.  If the exception is not handled and no activations
157    remain, then the application is terminated with an appropriate error
158    message.</p>
159
160 <p>Because different programming languages have different behaviors when
161    handling exceptions, the exception handling ABI provides a mechanism for
162    supplying <i>personalities.</i> An exception handling personality is defined
163    by way of a <i>personality function</i> (e.g. <tt>__gxx_personality_v0</tt>
164    in C++), which receives the context of the exception, an <i>exception
165    structure</i> containing the exception object type and value, and a reference
166    to the exception table for the current function.  The personality function
167    for the current compile unit is specified in a <i>common exception
168    frame</i>.</p>
169
170 <p>The organization of an exception table is language dependent.  For C++, an
171    exception table is organized as a series of code ranges defining what to do
172    if an exception occurs in that range.  Typically, the information associated
173    with a range defines which types of exception objects (using C++ <i>type
174    info</i>) that are handled in that range, and an associated action that
175    should take place.  Actions typically pass control to a <i>landing
176    pad</i>.</p>
177
178 <p>A landing pad corresponds to the code found in the <i>catch</i> portion of
179    a <i>try</i>/<i>catch</i> sequence.  When execution resumes at a landing
180    pad, it receives the exception structure and a selector corresponding to
181    the <i>type</i> of exception thrown.  The selector is then used to determine
182    which <i>catch</i> should actually process the exception.</p>
183
184 </div>
185
186 </div>
187
188 <!-- ======================================================================= -->
189 <h2>
190   <a name="codegen">LLVM Code Generation</a>
191 </h2>
192
193 <div>
194
195 <p>At the time of this writing, only C++ exception handling support is available
196    in LLVM.  So the remainder of this document will be somewhat C++-centric.</p>
197
198 <p>From the C++ developers perspective, exceptions are defined in terms of the
199    <tt>throw</tt> and <tt>try</tt>/<tt>catch</tt> statements.  In this section
200    we will describe the implementation of LLVM exception handling in terms of
201    C++ examples.</p>
202
203 <!-- ======================================================================= -->
204 <h3>
205   <a name="throw">Throw</a>
206 </h3>
207
208 <div>
209
210 <p>Languages that support exception handling typically provide a <tt>throw</tt>
211    operation to initiate the exception process.  Internally, a throw operation
212    breaks down into two steps.  First, a request is made to allocate exception
213    space for an exception structure.  This structure needs to survive beyond the
214    current activation.  This structure will contain the type and value of the
215    object being thrown.  Second, a call is made to the runtime to raise the
216    exception, passing the exception structure as an argument.</p>
217
218 <p>In C++, the allocation of the exception structure is done by
219    the <tt>__cxa_allocate_exception</tt> runtime function.  The exception
220    raising is handled by <tt>__cxa_throw</tt>.  The type of the exception is
221    represented using a C++ RTTI structure.</p>
222
223 </div>
224
225 <!-- ======================================================================= -->
226 <h3>
227   <a name="try_catch">Try/Catch</a>
228 </h3>
229
230 <div>
231
232 <p>A call within the scope of a <i>try</i> statement can potentially raise an
233    exception.  In those circumstances, the LLVM C++ front-end replaces the call
234    with an <tt>invoke</tt> instruction.  Unlike a call, the <tt>invoke</tt> has
235    two potential continuation points: where to continue when the call succeeds
236    as per normal; and where to continue if the call raises an exception, either
237    by a throw or the unwinding of a throw.</p>
238
239 <p>The term used to define a the place where an <tt>invoke</tt> continues after
240    an exception is called a <i>landing pad</i>.  LLVM landing pads are
241    conceptually alternative function entry points where an exception structure
242    reference and a type info index are passed in as arguments.  The landing pad
243    saves the exception structure reference and then proceeds to select the catch
244    block that corresponds to the type info of the exception object.</p>
245
246 <p>Two LLVM intrinsic functions are used to convey information about the landing
247    pad to the back end.</p>
248
249 <ol>
250   <li><a href="#llvm_eh_exception"><tt>llvm.eh.exception</tt></a> takes no
251       arguments and returns a pointer to the exception structure.  This only
252       returns a sensible value if called after an <tt>invoke</tt> has branched
253       to a landing pad.  Due to code generation limitations, it must currently
254       be called in the landing pad itself.</li>
255
256   <li><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> takes a minimum
257       of three arguments.  The first argument is the reference to the exception
258       structure. The second argument is a reference to the personality function
259       to be used for this <tt>try</tt>/<tt>catch</tt> sequence. Each of the
260       remaining arguments is either a reference to the type info for
261       a <tt>catch</tt> statement, a <a href="#throw_filters">filter</a>
262       expression, or the number zero (<tt>0</tt>) representing
263       a <a href="#cleanups">cleanup</a>.  The exception is tested against the
264       arguments sequentially from first to last.  The result of
265       the <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> is a
266       positive number if the exception matched a type info, a negative number if
267       it matched a filter, and zero if it matched a cleanup.  If nothing is
268       matched, the behaviour of the program
269       is <a href="#restrictions">undefined</a>.  This only returns a sensible
270       value if called after an <tt>invoke</tt> has branched to a landing pad.
271       Due to codegen limitations, it must currently be called in the landing pad
272       itself.  If a type info matched, then the selector value is the index of
273       the type info in the exception table, which can be obtained using the
274       <a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a>
275       intrinsic.</li>
276 </ol>
277
278 <p>Once the landing pad has the type info selector, the code branches to the
279    code for the first catch.  The catch then checks the value of the type info
280    selector against the index of type info for that catch.  Since the type info
281    index is not known until all the type info have been gathered in the backend,
282    the catch code will call the
283    <a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a> intrinsic
284    to determine the index for a given type info.  If the catch fails to match
285    the selector then control is passed on to the next catch. Note: Since the
286    landing pad will not be used if there is no match in the list of type info on
287    the call to <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>, then
288    neither the last catch nor <i>catch all</i> need to perform the check
289    against the selector.</p>
290
291 <p>Finally, the entry and exit of catch code is bracketed with calls
292    to <tt>__cxa_begin_catch</tt> and <tt>__cxa_end_catch</tt>.</p>
293
294 <ul>
295   <li><tt>__cxa_begin_catch</tt> takes a exception structure reference as an
296       argument and returns the value of the exception object.</li>
297
298   <li><tt>__cxa_end_catch</tt> takes no arguments. This function:<br><br>
299     <ol>
300       <li>Locates the most recently caught exception and decrements its handler
301           count,</li>
302       <li>Removes the exception from the "caught" stack if the handler count
303           goes to zero, and</li>
304       <li>Destroys the exception if the handler count goes to zero, and the
305           exception was not re-thrown by throw.</li>
306     </ol>
307     <p>Note: a rethrow from within the catch may replace this call with
308        a <tt>__cxa_rethrow</tt>.</p></li>
309 </ul>
310
311 </div>
312
313 <!-- ======================================================================= -->
314 <h3>
315   <a name="cleanups">Cleanups</a>
316 </h3>
317
318 <div>
319
320 <p>To handle destructors and cleanups in <tt>try</tt> code, control may not run
321    directly from a landing pad to the first catch.  Control may actually flow
322    from the landing pad to clean up code and then to the first catch.  Since the
323    required clean up for each <tt>invoke</tt> in a <tt>try</tt> may be different
324    (e.g. intervening constructor), there may be several landing pads for a given
325    try.  If cleanups need to be run, an <tt>i32 0</tt> should be passed as the
326    last <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> argument.
327    However, when using DWARF exception handling with C++, a <tt>i8* null</tt>
328    <a href="#restrictions">must</a> be passed instead.</p>
329
330 </div>
331
332 <!-- ======================================================================= -->
333 <h3>
334   <a name="throw_filters">Throw Filters</a>
335 </h3>
336
337 <div>
338
339 <p>C++ allows the specification of which exception types can be thrown from a
340    function.  To represent this a top level landing pad may exist to filter out
341    invalid types.  To express this in LLVM code the landing pad will
342    call <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>.  The
343    arguments are a reference to the exception structure, a reference to the
344    personality function, the length of the filter expression (the number of type
345    infos plus one), followed by the type infos themselves.
346    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> will return a
347    negative value if the exception does not match any of the type infos.  If no
348    match is found then a call to <tt>__cxa_call_unexpected</tt> should be made,
349    otherwise <tt>_Unwind_Resume</tt>.  Each of these functions requires a
350    reference to the exception structure.  Note that the most general form of an
351    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> call can contain
352    any number of type infos, filter expressions and cleanups (though having more
353    than one cleanup is pointless).  The LLVM C++ front-end can generate such
354    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> calls due to
355    inlining creating nested exception handling scopes.</p>
356
357 </div>
358
359 <!-- ======================================================================= -->
360 <h3>
361   <a name="restrictions">Restrictions</a>
362 </h3>
363
364 <div>
365
366 <p>The semantics of the invoke instruction require that any exception that
367    unwinds through an invoke call should result in a branch to the invoke's
368    unwind label.  However such a branch will only happen if the
369    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> matches. Thus in
370    order to ensure correct operation, the front-end must only generate
371    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> calls that are
372    guaranteed to always match whatever exception unwinds through the invoke.
373    For most languages it is enough to pass zero, indicating the presence of
374    a <a href="#cleanups">cleanup</a>, as the
375    last <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> argument.
376    However for C++ this is not sufficient, because the C++ personality function
377    will terminate the program if it detects that unwinding the exception only
378    results in matches with cleanups.  For C++ a <tt>null i8*</tt> should be
379    passed as the last <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>
380    argument instead.  This is interpreted as a catch-all by the C++ personality
381    function, and will always match.</p>
382
383 </div>
384
385 </div>
386
387 <!-- ======================================================================= -->
388 <h2>
389   <a name="format_common_intrinsics">Exception Handling Intrinsics</a>
390 </h2>
391
392 <div>
393
394 <p>LLVM uses several intrinsic functions (name prefixed with "llvm.eh") to
395    provide exception handling information at various points in generated
396    code.</p>
397
398 <!-- ======================================================================= -->
399 <h4>
400   <a name="llvm_eh_exception">llvm.eh.exception</a>
401 </h4>
402
403 <div>
404
405 <pre>
406   i8* %<a href="#llvm_eh_exception">llvm.eh.exception</a>()
407 </pre>
408
409 <p>This intrinsic returns a pointer to the exception structure.</p>
410
411 </div>
412
413 <!-- ======================================================================= -->
414 <h4>
415   <a name="llvm_eh_selector">llvm.eh.selector</a>
416 </h4>
417
418 <div>
419
420 <pre>
421   i32 %<a href="#llvm_eh_selector">llvm.eh.selector</a>(i8*, i8*, ...)
422 </pre>
423
424 <p>This intrinsic is used to compare the exception with the given type infos,
425    filters and cleanups.</p>
426
427 <p><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> takes a minimum of
428    three arguments.  The first argument is the reference to the exception
429    structure. The second argument is a reference to the personality function to
430    be used for this try catch sequence. Each of the remaining arguments is
431    either a reference to the type info for a catch statement,
432    a <a href="#throw_filters">filter</a> expression, or the number zero
433    representing a <a href="#cleanups">cleanup</a>.  The exception is tested
434    against the arguments sequentially from first to last.  The result of
435    the <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> is a positive
436    number if the exception matched a type info, a negative number if it matched
437    a filter, and zero if it matched a cleanup.  If nothing is matched, the
438    behaviour of the program is <a href="#restrictions">undefined</a>.  If a type
439    info matched then the selector value is the index of the type info in the
440    exception table, which can be obtained using the
441    <a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a> intrinsic.</p>
442
443 </div>
444
445 <!-- ======================================================================= -->
446 <h4>
447   <a name="llvm_eh_typeid_for">llvm.eh.typeid.for</a>
448 </h4>
449
450 <div>
451
452 <pre>
453   i32 %<a href="#llvm_eh_typeid_for">llvm.eh.typeid.for</a>(i8*)
454 </pre>
455
456 <p>This intrinsic returns the type info index in the exception table of the
457    current function.  This value can be used to compare against the result
458    of <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>.  The single
459    argument is a reference to a type info.</p>
460
461 </div>
462
463 <!-- ======================================================================= -->
464 <h4>
465   <a name="llvm_eh_sjlj_setjmp">llvm.eh.sjlj.setjmp</a>
466 </h4>
467
468 <div>
469
470 <pre>
471   i32 %<a href="#llvm_eh_sjlj_setjmp">llvm.eh.sjlj.setjmp</a>(i8*)
472 </pre>
473
474 <p>The SJLJ exception handling uses this intrinsic to force register saving for
475    the current function and to store the address of the following instruction
476    for use as a destination address by <a href="#llvm_eh_sjlj_longjmp">
477    <tt>llvm.eh.sjlj.longjmp</tt></a>. The buffer format and the overall
478    functioning of this intrinsic is compatible with the GCC
479    <tt>__builtin_setjmp</tt> implementation, allowing code built with the
480    two compilers to interoperate.</p>
481
482 <p>The single parameter is a pointer to a five word buffer in which the calling
483    context is saved. The front end places the frame pointer in the first word,
484    and the target implementation of this intrinsic should place the destination
485    address for a
486    <a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a> in the
487    second word. The following three words are available for use in a
488    target-specific manner.</p>
489
490 </div>
491
492 <!-- ======================================================================= -->
493 <h4>
494   <a name="llvm_eh_sjlj_longjmp">llvm.eh.sjlj.longjmp</a>
495 </h4>
496
497 <div>
498
499 <pre>
500   void %<a href="#llvm_eh_sjlj_longjmp">llvm.eh.sjlj.setjmp</a>(i8*)
501 </pre>
502
503 <p>The <a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a>
504    intrinsic is used to implement <tt>__builtin_longjmp()</tt> for SJLJ
505    style exception handling. The single parameter is a pointer to a
506    buffer populated by <a href="#llvm_eh_sjlj_setjmp">
507      <tt>llvm.eh.sjlj.setjmp</tt></a>. The frame pointer and stack pointer
508    are restored from the buffer, then control is transferred to the
509    destination address.</p>
510
511 </div>
512 <!-- ======================================================================= -->
513 <h4>
514   <a name="llvm_eh_sjlj_lsda">llvm.eh.sjlj.lsda</a>
515 </h4>
516
517 <div>
518
519 <pre>
520   i8* %<a href="#llvm_eh_sjlj_lsda">llvm.eh.sjlj.lsda</a>()
521 </pre>
522
523 <p>Used for SJLJ based exception handling, the <a href="#llvm_eh_sjlj_lsda">
524    <tt>llvm.eh.sjlj.lsda</tt></a> intrinsic returns the address of the Language
525    Specific Data Area (LSDA) for the current function. The SJLJ front-end code
526    stores this address in the exception handling function context for use by the
527    runtime.</p>
528
529 </div>
530
531 <!-- ======================================================================= -->
532 <h4>
533   <a name="llvm_eh_sjlj_callsite">llvm.eh.sjlj.callsite</a>
534 </h4>
535
536 <div>
537
538 <pre>
539   void %<a href="#llvm_eh_sjlj_callsite">llvm.eh.sjlj.callsite</a>(i32)
540 </pre>
541
542 <p>For SJLJ based exception handling, the <a href="#llvm_eh_sjlj_callsite">
543   <tt>llvm.eh.sjlj.callsite</tt></a> intrinsic identifies the callsite value
544   associated with the following invoke instruction. This is used to ensure
545   that landing pad entries in the LSDA are generated in the matching order.</p>
546
547 </div>
548
549 <!-- ======================================================================= -->
550 <h4>
551   <a name="llvm_eh_sjlj_dispatchsetup">llvm.eh.sjlj.dispatchsetup</a>
552 </h4>
553
554 <div>
555
556 <pre>
557   void %<a href="#llvm_eh_sjlj_dispatchsetup">llvm.eh.sjlj.dispatchsetup</a>(i32)
558 </pre>
559
560 <p>For SJLJ based exception handling, the <a href="#llvm_eh_sjlj_dispatchsetup">
561   <tt>llvm.eh.sjlj.dispatchsetup</tt></a> intrinsic is used by targets to do
562   any unwind-edge setup they need. By default, no action is taken.  </p>
563
564 </div>
565
566 </div>
567
568 <!-- ======================================================================= -->
569 <h2>
570   <a name="asm">Asm Table Formats</a>
571 </h2>
572
573 <div>
574
575 <p>There are two tables that are used by the exception handling runtime to
576    determine which actions should take place when an exception is thrown.</p>
577
578 <!-- ======================================================================= -->
579 <h3>
580   <a name="unwind_tables">Exception Handling Frame</a>
581 </h3>
582
583 <div>
584
585 <p>An exception handling frame <tt>eh_frame</tt> is very similar to the unwind
586    frame used by dwarf debug info.  The frame contains all the information
587    necessary to tear down the current frame and restore the state of the prior
588    frame.  There is an exception handling frame for each function in a compile
589    unit, plus a common exception handling frame that defines information common
590    to all functions in the unit.</p>
591
592 <p>Todo - Table details here.</p>
593
594 </div>
595
596 <!-- ======================================================================= -->
597 <h3>
598   <a name="exception_tables">Exception Tables</a>
599 </h3>
600
601 <div>
602
603 <p>An exception table contains information about what actions to take when an
604    exception is thrown in a particular part of a function's code.  There is one
605    exception table per function except leaf routines and functions that have
606    only calls to non-throwing functions will not need an exception table.</p>
607
608 <p>Todo - Table details here.</p>
609
610 </div>
611
612 </div>
613
614 <!-- ======================================================================= -->
615 <h2>
616   <a name="todo">ToDo</a>
617 </h2>
618
619 <div>
620
621 <ol>
622
623   <li>Testing/Testing/Testing.</li>
624
625 </ol>
626
627 </div>
628
629 <!-- *********************************************************************** -->
630
631 <hr>
632 <address>
633   <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
634   src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
635   <a href="http://validator.w3.org/check/referer"><img
636   src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
637
638   <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
639   <a href="http://llvm.org/">LLVM Compiler Infrastructure</a><br>
640   Last modified: $Date$
641 </address>
642
643 </body>
644 </html>