diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-12-14 18:34:23 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-12-14 18:34:23 +0000 |
| commit | bbfc7219ef121d345784b0c080a268beb051c736 (patch) | |
| tree | df2b7b2e6f57615a58d0d86aef7fa03081649176 /llvm/docs/ExceptionHandling.rst | |
| parent | feeefb214dfa398df4cec92b1e9f3e3219d3944f (diff) | |
| download | bcm5719-llvm-bbfc7219ef121d345784b0c080a268beb051c736.tar.gz bcm5719-llvm-bbfc7219ef121d345784b0c080a268beb051c736.zip | |
[IR] Remove terminatepad
It turns out that terminatepad gives little benefit over a cleanuppad
which calls the termination function. This is not sufficient to
implement fully generic filters but MSVC doesn't support them which
makes terminatepad a little over-designed.
Depends on D15478.
Differential Revision: http://reviews.llvm.org/D15479
llvm-svn: 255522
Diffstat (limited to 'llvm/docs/ExceptionHandling.rst')
| -rw-r--r-- | llvm/docs/ExceptionHandling.rst | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/llvm/docs/ExceptionHandling.rst b/llvm/docs/ExceptionHandling.rst index f89e3027d5d..74827c02a27 100644 --- a/llvm/docs/ExceptionHandling.rst +++ b/llvm/docs/ExceptionHandling.rst @@ -615,15 +615,11 @@ purposes. The following new instructions are considered "exception handling pads", in that they must be the first non-phi instruction of a basic block that may be the unwind destination of an EH flow edge: -``catchswitch``, ``catchpad``, ``cleanuppad``, and ``terminatepad``. +``catchswitch``, ``catchpad``, and ``cleanuppad``. As with landingpads, when entering a try scope, if the frontend encounters a call site that may throw an exception, it should emit an invoke that unwinds to a ``catchswitch`` block. Similarly, inside the scope of a -C++ object with a destructor, invokes should unwind to a ``cleanuppad``. The -``terminatepad`` instruction exists to represent ``noexcept`` and throw -specifications with one combined instruction. All potentially throwing calls in -a ``noexcept`` function should transitively unwind to a terminateblock. Throw -specifications are not implemented by MSVC, and are not yet supported. +C++ object with a destructor, invokes should unwind to a ``cleanuppad``. New instructions are also used to mark the points where control is transferred out of a catch/cleanup handler (which will correspond to exits from the @@ -634,9 +630,9 @@ by normal execution executes a ``cleanupret`` instruction, which is a terminator indicating where the active exception will unwind to next. Each of these new EH pad instructions has a way to identify which action should -be considered after this action. The ``catchswitch`` and ``terminatepad`` -instructions are terminators, and have a unwind destination operand analogous -to the unwind destination of an invoke. The ``cleanuppad`` instruction is not +be considered after this action. The ``catchswitch`` instruction is a terminator +and has an unwind destination operand analogous to the unwind destination of an +invoke. The ``cleanuppad`` instruction is not a terminator, so the unwind destination is stored on the ``cleanupret`` instruction instead. Successfully executing a catch handler should resume normal control flow, so neither ``catchpad`` nor ``catchret`` instructions can @@ -707,7 +703,9 @@ all of the new IR instructions: catchret from %catch to label %return lpad.terminate: ; preds = %catch.body, %lpad.catch - terminatepad within none [void ()* @"\01?terminate@@YAXXZ"] unwind to caller + cleanuppad within none [] + call void @"\01?terminate@@YAXXZ" + unreachable } Funclet parent tokens @@ -725,8 +723,7 @@ The ``catchswitch`` instruction does not create a funclet, but it produces a token that is always consumed by its immediate successor ``catchpad`` instructions. This ensures that every catch handler modelled by a ``catchpad`` belongs to exactly one ``catchswitch``, which models the dispatch point after a -C++ try. The ``terminatepad`` instruction cannot contain lexically nested -funclets inside the termination action, so it does not produce a token. +C++ try. Here is an example of what this nesting looks like using some hypothetical C++ code: |

