Update the example to show that an archive can contain llvm bitcode.
[oota-llvm.git] / docs / ExceptionHandling.html
index d3b157d155a129c4d0bf0ab3b2ac44db8236026b..56318a4aa63901c5f5c0457dcdc68d9347fce4fa 100644 (file)
@@ -31,6 +31,8 @@
        <li><a href="#llvm_eh_exception"><tt>llvm.eh.exception</tt></a></li>
        <li><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a></li>
        <li><a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a></li>
+       <li><a href="#llvm_eh_sjlj_setjmp"><tt>llvm.eh.sjlj.setjmp</tt></a></li>
+       <li><a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a></li>
   </ol></li>
   <li><a href="#asm">Asm Table Formats</a>
   <ol>
@@ -72,21 +74,20 @@ C/C++.</p>
 <p>Exception handling for most programming languages is designed to recover from
 conditions that rarely occur during general use of an application.  To that end,
 exception handling should not interfere with the main flow of an
-application&apos;s algorithm by performing checkpointing tasks such as saving
+application's algorithm by performing checkpointing tasks such as saving
 the current pc or register state.</p>
 
 <p>The Itanium ABI Exception Handling Specification defines a methodology for
 providing outlying data in the form of exception tables without inlining
-speculative exception handling code in the flow of an application&apos;s main
+speculative exception handling code in the flow of an application's main
 algorithm.  Thus, the specification is said to add "zero-cost" to the normal
 execution of an application.</p>
 
 <p>A more complete description of the Itanium ABI exception handling runtime
 support of can be found at <a
 href="http://www.codesourcery.com/cxx-abi/abi-eh.html">Itanium C++ ABI:
-Exception Handling.</a>  A description of the exception frame format can be
-found at <a
-href="http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-
+Exception Handling.</a> A description of the exception frame format can be found
+at <a href="http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-
 Core-generic/ehframechpt.html">Exception Frames</a>, with details of the Dwarf
 specification at <a href="http://www.eagercon.com/dwarf/dwarf3std.htm">Dwarf 3
 Standard.</a> A description for the C++ exception table formats can be found at
@@ -204,10 +205,9 @@ to the type info of the exception object.</p>
 pad to the back end.</p>
 
 <p><a href="#llvm_eh_exception"><tt>llvm.eh.exception</tt></a> takes no
-arguments and returns the exception structure reference.  The backend replaces
-this intrinsic with the code that accesses the first argument of a call.  The
-LLVM C++ front end generates code to save this value in an alloca location for
-further use in the landing pad and catch code.</p>
+arguments and returns a pointer to the exception structure.  This only returns a
+sensible value if called after an invoke has branched to a landing pad.  Due to
+codegen limitations, it must currently be called in the landing pad itself.</p>
 
 <p><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> takes a minimum of
 three arguments.  The first argument is the reference to the exception
@@ -221,8 +221,9 @@ The result of the <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> is a
 positive number if the exception matched a type info, a negative number if it matched
 a filter, and zero if it matched a cleanup.  If nothing is matched, the behaviour of
 the program is <a href="#restrictions">undefined</a>.
-The LLVM C++ front end generates code to save the selector value in an alloca
-location for further use in the landing pad and catch code.
+This only returns a sensible value if called after an invoke has branched to a
+landing pad.  Due to codegen limitations, it must currently be called in the
+landing pad itself.
 If a type info matched then the selector value is the index of the type info in
 the exception table, which can be obtained using the
 <a href="#llvm_eh_typeid_for"><tt>llvm.eh.typeid.for</tt></a> intrinsic.</p>
@@ -243,7 +244,7 @@ selector.</p>
 <p>Finally, the entry and exit of catch code is bracketed with calls to
 <tt>__cxa_begin_catch</tt> and <tt>__cxa_end_catch</tt>.
 <tt>__cxa_begin_catch</tt> takes a exception structure reference as an argument
-and returns the value of the exception object.</tt>  <tt>__cxa_end_catch</tt>
+and returns the value of the exception object. <tt>__cxa_end_catch</tt>
 takes a exception structure reference as an argument. This function clears the
 exception from the exception space.  Note: a rethrow from within the catch may
 replace this call with a <tt>__cxa_rethrow</tt>.</p>
@@ -277,17 +278,23 @@ instead.
 
 <div class="doc_text">
 
-<p>C++ allows the specification of which exception types that can be thrown from
+<p>C++ allows the specification of which exception types can be thrown from
 a function.  To represent this a top level landing pad may exist to filter out
 invalid types.  To express this in LLVM code the landing pad will call <a
-href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>.  The arguments are the
-length of the filter expression (the number of type infos plus one), followed by
-the type infos themselves.
+href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a>.  The arguments are a
+reference to the exception structure, a reference to the personality function,
+the length of the filter expression (the number of type infos plus one),
+followed by the type infos themselves.
 <a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> will return a negative
 value if the exception does not match any of the type infos.  If no match is
 found then a call to <tt>__cxa_call_unexpected</tt> should be made, otherwise
-<tt>_Unwind_Resume</tt>.  Each of these functions require a reference to the
-exception structure.</p>
+<tt>_Unwind_Resume</tt>.  Each of these functions requires a reference to the
+exception structure.  Note that the most general form of an
+<a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> call can contain
+any number of type infos, filter expressions and cleanups (though having more
+than one cleanup is pointless).  The LLVM C++ front-end can generate such
+<a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> calls due to inlining
+creating nested exception handling scopes.</p>
 
 </div>
 
@@ -341,10 +348,7 @@ provide exception handling information at various points in generated code.</p>
   i8* %<a href="#llvm_eh_exception">llvm.eh.exception</a>( )
 </pre>
 
-<p>This intrinsic indicates that the exception structure is available at this
-point in the code.  The backend will replace this intrinsic with code to fetch
-the first argument of a call.  The effect is that the intrinsic result is the
-exception structure reference.</p>
+<p>This intrinsic returns a pointer to the exception structure.</p>
 
 </div>
 
@@ -359,10 +363,8 @@ exception structure reference.</p>
   i64 %<a href="#llvm_eh_selector">llvm.eh.selector.i64</a>(i8*, i8*, i8*, ...)
 </pre>
 
-<p>This intrinsic indicates that the exception selector is available at this
-point in the code.  The backend will replace this intrinsic with code to fetch
-the second argument of a call.  The effect is that the intrinsic result is the
-exception selector.</p>
+<p>This intrinsic is used to compare the exception with the given type infos,
+filters and cleanups.</p>
 
 <p><a href="#llvm_eh_selector"><tt>llvm.eh.selector</tt></a> takes a minimum of
 three arguments.  The first argument is the reference to the exception
@@ -400,6 +402,30 @@ a reference to a type info.</p>
 
 </div>
 
+<!-- ======================================================================= -->
+<div class="doc_subsubsection">
+  <a name="llvm_eh_sjlj_setjmp">llvm.eh.sjlj.setjmp</a>
+</div>
+
+<div class="doc_text">
+<pre>
+  i32 %<a href="#llvm_eh_sjlj_setjmp">llvm.eh.sjlj.setjmp</a>(i8*)
+</pre>
+
+<p>The SJLJ exception handling uses this intrinsic to force register saving
+for the current function and to store the address of the following instruction
+for use as a destination address by <a href="#llvm_eh_sjlj_setjmp">
+<tt>llvm.eh.sjlj.longjmp</tt></a>. The buffer format and the overall functioning
+of this intrinsic is compatible with the GCC <tt>__builtin_setjmp</tt> 
+implementation, allowing code built with the two compilers to interoperate.</p>
+
+<p>The single parameter is a pointer to a five word buffer in which the
+calling context is saved. The front end places the frame pointer in the
+first word, and the target implementation of this intrinsic should place the
+destination address for a <a href="#llvm_eh_sjlj_longjmp"><tt>
+llvm.eh.sjlj.longjmp</tt></a> in the second word. The following three words
+are available for use in a target-specific manner.</p>
+
 <!-- ======================================================================= -->
 <div class="doc_section">
   <a name="asm">Asm Table Formats</a>
@@ -438,7 +464,7 @@ all functions in the unit.</p>
 <div class="doc_text">
 
 <p>An exception table contains information about what actions to take when an
-exception is thrown in a particular part of a function&apos;s code.  There is
+exception is thrown in a particular part of a function's code.  There is
 one exception table per function except leaf routines and functions that have
 only calls to non-throwing functions will not need an exception table.</p>
 
@@ -455,7 +481,7 @@ only calls to non-throwing functions will not need an exception table.</p>
 
 <ol>
 
-<li><p>Testing/Testing/Testing.</li></p>
+<li><p>Testing/Testing/Testing.</p></li>
 
 </ol>
 
@@ -466,9 +492,9 @@ only calls to non-throwing functions will not need an exception table.</p>
 <hr>
 <address>
   <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
-  src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
+  src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
   <a href="http://validator.w3.org/check/referer"><img
-  src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+  src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
 
   <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
   <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br>