When extracting SEME regions of code, the extractor needs to update the dominator...
[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 <div class="doc_title">Exception Handling in LLVM</div>
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   </ol></li>
43   <li><a href="#asm">Asm Table Formats</a>
44   <ol>
45     <li><a href="#unwind_tables">Exception Handling Frame</a></li>
46     <li><a href="#exception_tables">Exception Tables</a></li>
47   </ol></li>
48   <li><a href="#todo">ToDo</a></li>
49 </ul>
50 </td>
51 </tr></table>
52
53 <div class="doc_author">
54   <p>Written by <a href="mailto:jlaskey@mac.com">Jim Laskey</a></p>
55 </div>
56
57
58 <!-- *********************************************************************** -->
59 <div class="doc_section"><a name="introduction">Introduction</a></div> 
60 <!-- *********************************************************************** -->
61
62 <div class="doc_text">
63
64 <p>This document is the central repository for all information pertaining to
65    exception handling in LLVM.  It describes the format that LLVM exception
66    handling information takes, which is useful for those interested in creating
67    front-ends or dealing directly with the information.  Further, this document
68    provides specific examples of what exception handling information is used for
69    in C/C++.</p>
70
71 </div>
72
73 <!-- ======================================================================= -->
74 <div class="doc_subsection">
75   <a name="itanium">Itanium ABI Zero-cost Exception Handling</a>
76 </div>
77
78 <div class="doc_text">
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 <div class="doc_subsection">
108   <a name="sjlj">Setjmp/Longjmp Exception Handling</a>
109 </div>
110
111 <div class="doc_text">
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 <div class="doc_subsection">
140   <a name="overview">Overview</a>
141 </div>
142
143 <div class="doc_text">
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 <!-- ======================================================================= -->
187 <div class="doc_section">
188   <a name="codegen">LLVM Code Generation</a>
189 </div>
190
191 <div class="doc_text">
192
193 <p>At the time of this writing, only C++ exception handling support is available
194    in LLVM.  So the remainder of this document will be somewhat C++-centric.</p>
195
196 <p>From the C++ developers perspective, exceptions are defined in terms of the
197    <tt>throw</tt> and <tt>try</tt>/<tt>catch</tt> statements.  In this section
198    we will describe the implementation of LLVM exception handling in terms of
199    C++ examples.</p>
200
201 </div>
202
203 <!-- ======================================================================= -->
204 <div class="doc_subsection">
205   <a name="throw">Throw</a>
206 </div>
207
208 <div class="doc_text">
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 <div class="doc_subsection">
227   <a name="try_catch">Try/Catch</a>
228 </div>
229
230 <div class="doc_text">
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 a exception structure reference as an
299       argument. This function clears the exception from the exception space.
300       Note: a rethrow from within the catch may replace this call with
301       a <tt>__cxa_rethrow</tt>.</li>
302 </ul>
303
304 </div>
305
306 <!-- ======================================================================= -->
307 <div class="doc_subsection">
308   <a name="cleanups">Cleanups</a>
309 </div>
310
311 <div class="doc_text">
312
313 <p>To handle destructors and cleanups in <tt>try</tt> code, control may not run
314    directly from a landing pad to the first catch.  Control may actually flow
315    from the landing pad to clean up code and then to the first catch.  Since the
316    required clean up for each <tt>invoke</tt> in a <tt>try</tt> may be different
317    (e.g. intervening constructor), there may be several landing pads for a given
318    try.  If cleanups need to be run, an <tt>i32 0</tt> should be passed as the
319    last <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> argument.
320    However, when using DWARF exception handling with C++, a <tt>i8* null</tt>
321    <a href="#restrictions">must</a> be passed instead.</p>
322
323 </div>
324
325 <!-- ======================================================================= -->
326 <div class="doc_subsection">
327   <a name="throw_filters">Throw Filters</a>
328 </div>
329
330 <div class="doc_text">
331
332 <p>C++ allows the specification of which exception types can be thrown from a
333    function.  To represent this a top level landing pad may exist to filter out
334    invalid types.  To express this in LLVM code the landing pad will
335    call <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>.  The
336    arguments are a reference to the exception structure, a reference to the
337    personality function, the length of the filter expression (the number of type
338    infos plus one), followed by the type infos themselves.
339    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> will return a
340    negative value if the exception does not match any of the type infos.  If no
341    match is found then a call to <tt>__cxa_call_unexpected</tt> should be made,
342    otherwise <tt>_Unwind_Resume</tt>.  Each of these functions requires a
343    reference to the exception structure.  Note that the most general form of an
344    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> call can contain
345    any number of type infos, filter expressions and cleanups (though having more
346    than one cleanup is pointless).  The LLVM C++ front-end can generate such
347    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> calls due to
348    inlining creating nested exception handling scopes.</p>
349
350 </div>
351
352 <!-- ======================================================================= -->
353 <div class="doc_subsection">
354   <a name="restrictions">Restrictions</a>
355 </div>
356
357 <div class="doc_text">
358
359 <p>The semantics of the invoke instruction require that any exception that
360    unwinds through an invoke call should result in a branch to the invoke's
361    unwind label.  However such a branch will only happen if the
362    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> matches. Thus in
363    order to ensure correct operation, the front-end must only generate
364    <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> calls that are
365    guaranteed to always match whatever exception unwinds through the invoke.
366    For most languages it is enough to pass zero, indicating the presence of
367    a <a href="#cleanups">cleanup</a>, as the
368    last <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> argument.
369    However for C++ this is not sufficient, because the C++ personality function
370    will terminate the program if it detects that unwinding the exception only
371    results in matches with cleanups.  For C++ a <tt>null i8*</tt> should be
372    passed as the last <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>
373    argument instead.  This is interpreted as a catch-all by the C++ personality
374    function, and will always match.</p>
375
376 </div>
377
378 <!-- ======================================================================= -->
379 <div class="doc_section">
380   <a name="format_common_intrinsics">Exception Handling Intrinsics</a>
381 </div>
382
383 <div class="doc_text">
384
385 <p>LLVM uses several intrinsic functions (name prefixed with "llvm.eh") to
386    provide exception handling information at various points in generated
387    code.</p>
388
389 </div>
390
391 <!-- ======================================================================= -->
392 <div class="doc_subsubsection">
393   <a name="llvm_eh_exception">llvm.eh.exception</a>
394 </div>
395
396 <div class="doc_text">
397
398 <pre>
399   i8* %<a href="#llvm_eh_exception">llvm.eh.exception</a>( )
400 </pre>
401
402 <p>This intrinsic returns a pointer to the exception structure.</p>
403
404 </div>
405
406 <!-- ======================================================================= -->
407 <div class="doc_subsubsection">
408   <a name="llvm_eh_selector">llvm.eh.selector</a>
409 </div>
410
411 <div class="doc_text">
412
413 <pre>
414   i32 %<a href="#llvm_eh_selector">llvm.eh.selector.i32</a>(i8*, i8*, i8*, ...)
415   i64 %<a href="#llvm_eh_selector">llvm.eh.selector.i64</a>(i8*, i8*, i8*, ...)
416 </pre>
417
418 <p>This intrinsic is used to compare the exception with the given type infos,
419    filters and cleanups.</p>
420
421 <p><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> takes a minimum of
422    three arguments.  The first argument is the reference to the exception
423    structure. The second argument is a reference to the personality function to
424    be used for this try catch sequence. Each of the remaining arguments is
425    either a reference to the type info for a catch statement,
426    a <a href="#throw_filters">filter</a> expression, or the number zero
427    representing a <a href="#cleanups">cleanup</a>.  The exception is tested
428    against the arguments sequentially from first to last.  The result of
429    the <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> is a positive
430    number if the exception matched a type info, a negative number if it matched
431    a filter, and zero if it matched a cleanup.  If nothing is matched, the
432    behaviour of the program is <a href="#restrictions">undefined</a>.  If a type
433    info matched then the selector value is the index of the type info in the
434    exception table, which can be obtained using the
435    <a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a> intrinsic.</p>
436
437 </div>
438
439 <!-- ======================================================================= -->
440 <div class="doc_subsubsection">
441   <a name="llvm_eh_typeid_for">llvm.eh.typeid.for</a>
442 </div>
443
444 <div class="doc_text">
445
446 <pre>
447   i32 %<a href="#llvm_eh_typeid_for">llvm.eh.typeid.for.i32</a>(i8*)
448   i64 %<a href="#llvm_eh_typeid_for">llvm.eh.typeid.for.i64</a>(i8*)
449 </pre>
450
451 <p>This intrinsic returns the type info index in the exception table of the
452    current function.  This value can be used to compare against the result
453    of <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>.  The single
454    argument is a reference to a type info.</p>
455
456 </div>
457
458 <!-- ======================================================================= -->
459 <div class="doc_subsubsection">
460   <a name="llvm_eh_sjlj_setjmp">llvm.eh.sjlj.setjmp</a>
461 </div>
462
463 <div class="doc_text">
464
465 <pre>
466   i32 %<a href="#llvm_eh_sjlj_setjmp">llvm.eh.sjlj.setjmp</a>(i8*)
467 </pre>
468
469 <p>The SJLJ exception handling uses this intrinsic to force register saving for
470    the current function and to store the address of the following instruction
471    for use as a destination address by <a href="#llvm_eh_sjlj_longjmp">
472    <tt>llvm.eh.sjlj.longjmp</tt></a>. The buffer format and the overall
473    functioning of this intrinsic is compatible with the GCC
474    <tt>__builtin_setjmp</tt> implementation, allowing code built with the
475    two compilers to interoperate.</p>
476
477 <p>The single parameter is a pointer to a five word buffer in which the calling
478    context is saved. The front end places the frame pointer in the first word,
479    and the target implementation of this intrinsic should place the destination
480    address for a
481    <a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a> in the
482    second word. The following three words are available for use in a
483    target-specific manner.</p>
484
485 </div>
486
487 <!-- ======================================================================= -->
488 <div class="doc_subsubsection">
489   <a name="llvm_eh_sjlj_lsda">llvm.eh.sjlj.lsda</a>
490 </div>
491
492 <div class="doc_text">
493
494 <pre>
495   i8* %<a href="#llvm_eh_sjlj_lsda">llvm.eh.sjlj.lsda</a>( )
496 </pre>
497
498 <p>Used for SJLJ based exception handling, the <a href="#llvm_eh_sjlj_lsda">
499    <tt>llvm.eh.sjlj.lsda</tt></a> intrinsic returns the address of the Language
500    Specific Data Area (LSDA) for the current function. The SJLJ front-end code
501    stores this address in the exception handling function context for use by the
502    runtime.</p>
503
504 </div>
505
506 <!-- ======================================================================= -->
507 <div class="doc_section">
508   <a name="asm">Asm Table Formats</a>
509 </div>
510
511 <div class="doc_text">
512
513 <p>There are two tables that are used by the exception handling runtime to
514    determine which actions should take place when an exception is thrown.</p>
515
516 </div>
517
518 <!-- ======================================================================= -->
519 <div class="doc_subsection">
520   <a name="unwind_tables">Exception Handling Frame</a>
521 </div>
522
523 <div class="doc_text">
524
525 <p>An exception handling frame <tt>eh_frame</tt> is very similar to the unwind
526    frame used by dwarf debug info.  The frame contains all the information
527    necessary to tear down the current frame and restore the state of the prior
528    frame.  There is an exception handling frame for each function in a compile
529    unit, plus a common exception handling frame that defines information common
530    to all functions in the unit.</p>
531
532 <p>Todo - Table details here.</p>
533
534 </div>
535
536 <!-- ======================================================================= -->
537 <div class="doc_subsection">
538   <a name="exception_tables">Exception Tables</a>
539 </div>
540
541 <div class="doc_text">
542
543 <p>An exception table contains information about what actions to take when an
544    exception is thrown in a particular part of a function's code.  There is one
545    exception table per function except leaf routines and functions that have
546    only calls to non-throwing functions will not need an exception table.</p>
547
548 <p>Todo - Table details here.</p>
549
550 </div>
551
552 <!-- ======================================================================= -->
553 <div class="doc_section">
554   <a name="todo">ToDo</a>
555 </div>
556
557 <div class="doc_text">
558
559 <ol>
560
561   <li>Testing/Testing/Testing.</li>
562
563 </ol>
564
565 </div>
566
567 <!-- *********************************************************************** -->
568
569 <hr>
570 <address>
571   <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
572   src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
573   <a href="http://validator.w3.org/check/referer"><img
574   src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
575
576   <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
577   <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br>
578   Last modified: $Date$
579 </address>
580
581 </body>
582 </html>