X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=docs%2FExceptionHandling.rst;fp=docs%2FExceptionHandling.rst;h=25248568b612fec4652421a06ffa023346b511eb;hp=74827c02a272963a6e2b704a20d30700544d7055;hb=fe9953a02c963403dd2e2fbda2f4c596cd6a4704;hpb=748e8f493ab4e6f4b346a95cfcb8f05b0a40bc3b diff --git a/docs/ExceptionHandling.rst b/docs/ExceptionHandling.rst index 74827c02a27..25248568b61 100644 --- a/docs/ExceptionHandling.rst +++ b/docs/ExceptionHandling.rst @@ -775,3 +775,46 @@ C++ code: The "inner" ``catchswitch`` consumes ``%1`` which is produced by the outer catchswitch. + +.. _wineh-constraints: + +Funclet transitions +----------------------- + +The EH tables for personalities that use funclets make implicit use of the +funclet nesting relationship to encode unwind destinations, and so are +constrained in the set of funclet transitions they can represent. The related +LLVM IR instructions accordingly have constraints that ensure encodability of +the EH edges in the flow graph. + +A ``catchswitch``, ``catchpad``, or ``cleanuppad`` is said to be "entered" +when it executes. It may subsequently be "exited" by any of the following +means: + +* A ``catchswitch`` is immediately exited when none of its constituent + ``catchpad``\ s are appropriate for the in-flight exception and it unwinds + to its unwind destination or the caller. +* A ``catchpad`` and its parent ``catchswitch`` are both exited when a + ``catchret`` from the ``catchpad`` is executed. +* A ``cleanuppad`` is exited when a ``cleanupret`` from it is executed. +* Any of these pads is exited when control unwinds to the function's caller, + either by a ``call`` which unwinds all the way to the function's caller, + a nested ``catchswitch`` marked "``unwinds to caller``", or a nested + ``cleanuppad``\ 's ``cleanupret`` marked "``unwinds to caller"``. +* Any of these pads is exited when an unwind edge (from an ``invoke``, + nested ``catchswitch``, or nested ``cleanuppad``\ 's ``cleanupret``) + unwinds to a destination pad that is not a descendant of the given pad. + +Note that the ``ret`` instruction is *not* a valid way to exit a funclet pad; +it is undefined behavior to execute a ``ret`` when a pad has been entered but +not exited. + +A single unwind edge may exit any number of pads (with the restrictions that +the edge from a ``catchswitch`` must exit at least itself, and the edge from +a ``cleanupret`` must exit at least its ``cleanuppad``), and then must enter +exactly one pad, which must be distinct from all the exited pads. The parent +of the pad that an unwind edge enters must be the most-recently-entered +not-yet-exited pad (after exiting from any pads that the unwind edge exits), +or "none" if there is no such pad. This ensures that the stack of executing +funclets at run-time always corresponds to some path in the funclet pad tree +that the parent tokens encode.