[LLVMdev] x86 unwind support[MESSAGE NOT SCANNED]

Nick Johnson nicholas.paul.johnson at gmail.com
Mon Jul 20 05:38:08 PDT 2009


> In languages without stack-allocated objects (ie. most languages that
> support exceptions) there is no need to unwind frame-by-frame, the
> unwind simply needs to make a single jump to the invoke instruction and
> restore the context (which in x86 is just 6 registers).
>

No.  Java, C#, Ruby and Python all support the finally/ensure block;
C# supports the using( IDisposable x =...) {} construct.  Both
constructs require support for a frame-by-frame unwind; as these
construct can be nested, a single throw may visit many landing pads
(which may come from different compilation units).

It doesn't have anything to do with stack-allocated vs heap-allocated,
but rather with the language's guarantees about exceptions.


> It is possible to implement invoke/unwind in such a way that both invoke
>  *and* unwind are fast, when  unwind just unwinds and doesn't perform
> any magic behind-the-scenes operations.
>

Why?  Exceptions are supposed to occur in exceptional situations.  In
general, one should try to optimize for the common case, which does
not include invoke/unwind.

One should certainly not slow down a function call which never throws
just because other functions may throw.  Paraphrasing Bjarne
Stroustrup, "If you don't use it, you shouldn't pay for it."


Nick




More information about the llvm-dev mailing list