[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