[LLVMdev] Unwinds gone missing

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Dec 27 06:42:28 PST 2008


Hi Talin,

Talin wrote:
> Can you point out to me where in the VMKit code I should be looking?

The compilation of an exception table in Java is in 
lib/JnJVM/VMCore/JavaJIT.cpp, function "readExceptionTable".
The interaction with the libgcc runtime is in 
lib/JnJVM/VMCore/JavaThread.cpp.
>
> I spent some additional time reading the docs, and I have some 
> specific questions:
>
> 1) I'm trying to figure out the relationship between the __cxa_throw 
> function, and the _Unwind_RaiseException function mentioned in the ABI 
> doc. My guess is that _Unwind_RaiseException is the language-neutral 
> implementation of stack unwinding, and __cxa_throw is the C++ 
> exception semantics that are implemented on top of it. If that is the 
> case, should I be calling _Unwind_RaiseException since my exceptions 
> are more like Java than C++ exceptions?
>

I don't know... Last time I use __cxa_throw, because it's allocating an 
exception object and setting the correct values in the header of this 
exception.  _Unwind_RaiseException  just takes an exception object as 
parameter and if it's not filled correctly, some other functions may not 
work.
 
> 2) How portable is _Unwind_RaiseException and similar functions? In 
> particular, if I call those functions, will I be limiting myself to a 
> subset of the platforms that LLVM supports? (The same question can be 
> asked of __cxa_throw).

I think __cxa_throw is fairly portable. That's what g++ uses to assembly 
generate exception throwing. So it depends on libgcc being implemented 
on multiple platforms. I have no idea though for _Unwind_RaiseException.

>
> Although _Unwind_RaiseException is mentioned as part of the Itanium 
> ABI, it is apparently used on many more platform types than just that 
> one processor. A code search shows that it is in fact part of the 
> standard gcc-provided runtime libs 
> (see http://www.google.com/codesearch/p?hl=en#47R7EH5FbNk/trunk/gcc/gcc/unwind-generic.h&q=_Unwind_RaiseException%20lang:c 
> <http://www.google.com/codesearch/p?hl=en#47R7EH5FbNk/trunk/gcc/gcc/unwind-generic.h&q=_Unwind_RaiseException%20lang:c>). 
> There is also a mention of "libunwind". Is libunwind a portable 
> implementation of the Itanium unwinding ABI?
>

You'd have to ask the libunwind developers: 
http://www.nongnu.org/libunwind/people.html. Apparently, i runs on ia64, 
x86, x86-64, ppc64. I have no idea of how well libunwind fits with libgcc.

> 3) I really like the "invoke/unwind" abstraction that LLVM provides, 
> as it divorces the mechanism of unwinding from the creation of an 
> exception object. However, looking at the Itanium unwinding API, I 
> don't see how you can implement LLVM invoke/unwind on top of it, since 
> the API functions take an exception object as a parameter. (I suppose 
> you could use a dummy exception to satisfy the ABI, and then implement 
> your own, separate exception object, but this destroys some of the 
> efficiency of the unwinding implementation.)
>

Yeah, I don't think both match very well. VMKit uses a dummy exception.

> Also, the Itanium ABI appears to offer some interesting features that 
> aren't exposed by the invoke/unwind mechanism which would be useful. 
> For example, the fact that the stack frames are traversed in two 
> passes seems like it might make it possible to implement 
> human-readable stack dumps, which would be difficult with invoke/unwind.
>

What's a human-readable stack dump? ;-) I don't see how invoke/unwind 
would limit this.

> All this suggests to me that, as nice as the invoke/unwind abstraction 
> is, it might not be a good fit for the capabilities that are actually 
> available. Of course, I'm talking out of total ignorance here...
>
> Thanks in advance, and expect more questions after this :)
>
> -- Talin
>
>
> On Fri, Dec 19, 2008 at 12:21 AM, Nicolas Geoffray 
> <nicolas.geoffray at lip6.fr <mailto:nicolas.geoffray at lip6.fr>> wrote:
>
>     Hi Talin,
>
>     Talin wrote:
>     > After much delay, I have finally reached the point in my work
>     where I
>     > need to implement some kind of exception handling. I understand that
>     > "unwind" is currently unimplemented and will remain so for the
>     > forseeable future.
>     >
>     > In the mean time, are there any examples available for
>     implementing Java
>     > or Python-style exceptions using __cxa_throw or something
>     similar? I've
>     > read and re-read the various docs on exception handling and I'm not
>     > attaining understanding.
>     >
>     >
>
>     VMKit's your friend! Unfortunately, there's no documentation. Note
>     that
>     the unwinding part is done by libgcc, like llvm-gcc.
>     Also, VMKit uses the same scheme than llvm-gcc for exceptions, so I'm
>     not sure what more info you need apart from the docs and what llvm-gcc
>     provides. The dwarf output makes it all work magically :)
>
>     Nicolas
>
>     _______________________________________________
>     LLVM Developers mailing list
>     LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>        
>     http://llvm.cs.uiuc.edu
>     http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
> -- 
> -- Talin
> ------------------------------------------------------------------------
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>   




More information about the llvm-dev mailing list