[llvm-dev] Exception handling support for a target
John Reagan via llvm-dev
llvm-dev at lists.llvm.org
Fri Jan 19 12:00:13 PST 2018
OpenVMS' non-call exception support on Alpha & Itanium does have some
restrictions. We'll do some study and attempt to address the concerns
when I post the doc next week.
However, our primary focus is precise exception modelling in the
prologue/epilogue of routines. You need precise info on the register
saves, stack pointer save/restore, etc. that the unwinder can use. On
OpenVMS, we don't invoke a routine's personality routine if we're in the
prologue but the prologue isn't finished. We go up a frame and start
searching there. This level of support is needed in our system code (C
and BLISS) as well in customer code in Fortran, Pascal, BASIC, COBOL, etc.
On 1/19/18 2:27 PM, Reid Kleckner wrote:
> I think it's valuable to have precise / asynchronous unwind
> information without adding support for non-call exceptions. Profilers
> and debuggers need to be able to unwind the stack from arbitrary
> instruction boundaries, but they don't need to run exception handlers.
> We can still declare that outside the model. Speaking of which,
> barring bugs, we do support precise unwind info on Win64.
>
> Even if we were to support non-call exceptions, we would enumerate the
> set of supported potentially trapping operations that we support, i.e.
> load, store, div, FP ops, etc. The edges would either be explicit, as
> they are today, or implicit. We already have implicit unwind edges out
> of the function from non-nounwind calls, so this isn't as crazy as it
> sounds.
>
> We would definitely say that ADDs, PHIs, and other things don't trap,
> so in your example it wouldn't matter if the value of 'i' was 1 or 0
> if the exception gets raised at 'b'. There would be no
> control-dependent, possibly-unwinding instruction, either unwinding to
> the caller or choosing to run the catch handler would be correct. It's
> equivalent to the asynchronous exception arriving a little sooner or a
> little later, which the outside observer has no way to control.
>
> On Fri, Jan 19, 2018 at 7:06 AM, David Chisnall via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
> On 19 Jan 2018, at 14:48, John Reagan via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
> >
> > OpenVMS' EH model is for full asynchronous prologue/epilogue
> EH. We do more
> > than just program-level EH, but have to deal with OS events
> (timers going off,
> > asynch I/O completion, mailboxes filled with data, etc.) which
> could result in
> > an unwind occurring.
> >
> > We're just about finished with our proposal for extending the
> x86 compact EH data
> > format to cover all the cases plus the desire to create the
> additional .cfi directives.
> > Feedback and pointers will be most helpful. Look for this as a
> new thread sometime
> > early next week (we're having our final review on Monday before
> I post it).
>
> Are you planning on extending LLVM to add support for non-call
> exceptions? Currently, LLVM is not able to produce correct unwind
> tables for arbitrary exception points because it does not split
> basic blocks in such a way that values that are created in a basic
> block will be visible in at the end. For example, if I do
>
> int i = 0;
> try {
> i++;
> foo();
> i++;
> } catch (…) {
> return i;
> }
>
> The SSA form of this will look something more like this:
>
> int i0 = 0;
> try {
> i1 = 1;
> foo();
> i2 = 2;
> } catch (…) {
> return 1;
> }
>
> But if you are allowed to throw exceptions on any instruction,
> then you end up with something more like:
>
> int i0 = 0;
> try {
> a:
> i1 = 1;
> b:
> foo();
> c:
> i2 = 2;
> } catch (…) {
> return phi({a,0},{b, i1},{c,i2});
> }
>
> With the current structure of LLVM’s exception handling, the fact
> that i may be incremented after the only invoke instruction is not
> visible.
>
> I’ve never been entirely happy with how LLVM models exceptions, as
> calls with two possible returns, but extending that model to
> properly support unwinds through arbitrary instructions will leave
> us in the degenerate case of having single-instruction basic
> blocks. I’d much rather that we split blocks on places where
> values visible in an exception handler change, rather than on
> specific places where exceptions are known to be thrown, but this
> will require moving to a region-based representation of
> exceptions, which is a lot of work. Without this, it’s easy to
> unwind from arbitrary exceptions, unless you care about having the
> right values in your handlers.
>
> David
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180119/2bede3e3/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180119/2bede3e3/attachment.sig>
More information about the llvm-dev
mailing list