[llvm-commits] CVS: llvm/www/docs/LangRef.html
Chris Lattner
lattner at cs.uiuc.edu
Thu Aug 28 17:13:01 PDT 2003
Changes in directory llvm/www/docs:
LangRef.html updated: 1.26 -> 1.27
---
Log message:
Document the llvm.unwind intrinsic.
Clarify the documentation for the invoke instruction
---
Diffs of the changes:
Index: llvm/www/docs/LangRef.html
diff -u llvm/www/docs/LangRef.html:1.26 llvm/www/docs/LangRef.html:1.27
--- llvm/www/docs/LangRef.html:1.26 Mon Jul 14 12:20:40 2003
+++ llvm/www/docs/LangRef.html Thu Aug 28 17:12:25 2003
@@ -81,6 +81,7 @@
<li><a href="#i_va_start">'<tt>llvm.va_start</tt>' Intrinsic</a>
<li><a href="#i_va_end" >'<tt>llvm.va_end</tt>' Intrinsic</a>
<li><a href="#i_va_copy" >'<tt>llvm.va_copy</tt>' Intrinsic</a>
+ <li><a href="#i_unwind" >'<tt>llvm.unwind</tt>' Intrinsic</a>
</ol>
</ol>
@@ -741,13 +742,14 @@
<h5>Overview:</h5>
-The '<tt>invoke</tt>' instruction is used to cause control flow to transfer to a
-specified function, with the possibility of control flow transfer to either the
-'<tt>normal label</tt>' label or the '<tt>exception label</tt>'. The '<tt><a
-href="#i_call">call</a></tt>' instruction is closely related, but guarantees
-that control flow either never returns from the called function, or that it
-returns to the instruction following the '<tt><a href="#i_call">call</a></tt>'
-instruction.<p>
+The '<tt>invoke</tt>' instruction causes control to transfer to a specified
+function, with the possibility of control flow transfer to either the
+'<tt>normal label</tt>' label or the '<tt>exception label</tt>'. If the callee
+function invokes the "<tt><a href="#i_ret">ret</a></tt>" instruction, control
+flow will return to the "normal" label. If the callee (or any indirect callees)
+calls the "<a href="#i_unwind"><tt>llvm.unwind</tt></a>" intrinsic, control is
+interrupted, and continued at the "except" label.<p>
+
<h5>Arguments:</h5>
@@ -757,7 +759,7 @@
<li>'<tt>ptr to function ty</tt>': shall be the signature of the pointer to
function value being invoked. In most cases, this is a direct function
invocation, but indirect <tt>invoke</tt>s are just as possible, branching off
-an arbitrary pointer to function value.<p>
+an arbitrary pointer to function value.
<li>'<tt>function ptr val</tt>': An LLVM value containing a pointer to a
function to be invoked.
@@ -769,26 +771,26 @@
<li>'<tt>normal label</tt>': the label reached when the called function executes
a '<tt><a href="#i_ret">ret</a></tt>' instruction.
-<li>'<tt>exception label</tt>': the label reached when an exception is thrown.
+<li>'<tt>exception label</tt>': the label reached when a callee calls the <a
+href="#i_unwind"><tt>llvm.unwind</tt></a> intrinsic.
</ol>
<h5>Semantics:</h5>
This instruction is designed to operate as a standard '<tt><a
href="#i_call">call</a></tt>' instruction in most regards. The primary
-difference is that it associates a label with the function invocation that may
-be accessed via the runtime library provided by the execution environment. This
-instruction is used in languages with destructors to ensure that proper cleanup
-is performed in the case of either a <tt>longjmp</tt> or a thrown exception.
-Additionally, this is important for implementation of '<tt>catch</tt>' clauses
-in high-level languages that support them.<p>
+difference is that it establishes an association with a label, which is used by the runtime library to unwind the stack.<p>
-<!-- For a more comprehensive explanation of how this instruction is used, look in the llvm/docs/2001-05-18-ExceptionHandling.txt document.<p> -->
+This instruction is used in languages with destructors to ensure that proper
+cleanup is performed in the case of either a <tt>longjmp</tt> or a thrown
+exception. Additionally, this is important for implementation of
+'<tt>catch</tt>' clauses in high-level languages that support them.<p>
<h5>Example:</h5>
<pre>
%retval = invoke int %Test(int 15)
- to label %Continue except label %TestCleanup <i>; {int}:retval set</i>
+ to label %Continue
+ except label %TestCleanup <i>; {int}:retval set</i>
</pre>
@@ -1801,6 +1803,32 @@
arbitrarily complex and require memory allocation, for example.<p>
+<!-- _______________________________________________________________________ -->
+</ul><a name="i_unwind"><h4><hr size=0>'<tt>llvm.unwind</tt>' Intrinsic</h4><ul>
+
+<h5>Syntax:</h5>
+<pre>
+ call void (void)* %llvm.unwind()
+</pre>
+
+<h5>Overview:</h5>
+
+The '<tt>llvm.unwind</tt>' intrinsic unwinds the stack, continuing control flow
+at the first callee in the dynamic call stack which used an <a
+href="#i_invoke"><tt>invoke</tt></a> instruction to perform the call. This is
+primarily used to implement exception handling.
+
+<h5>Semantics:</h5>
+
+The '<tt>llvm.unwind</tt>' intrinsic causes execution of the current function to
+immediately halt. The dynamic call stack is then searched for the first <a
+href="#i_invoke"><tt>invoke</tt></a> instruction on the call stack. Once found,
+execution continues at the "exceptional" destination block specified by the
+invoke instruction. If there is no <tt>invoke</tt> instruction in the dynamic
+call chain, undefined behavior results.
+
+
+
<!-- *********************************************************************** -->
</ul>
<!-- *********************************************************************** -->
@@ -1811,7 +1839,7 @@
<address><a href="mailto:sabre at nondot.org">Chris Lattner</a></address>
<!-- Created: Tue Jan 23 15:19:28 CST 2001 -->
<!-- hhmts start -->
-Last modified: Mon Jul 14 12:12:22 CDT 2003
+Last modified: Thu Aug 28 17:11:50 CDT 2003
<!-- hhmts end -->
</font>
</body></html>
More information about the llvm-commits
mailing list