[LLVMdev] Getting exceptions to work?
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon May 18 00:31:30 PDT 2009
Hi Talin,
You're not using the llvm intrinsics for exception handling, so your
code won't work. Using _Unwind_RaiseException should be OK, but your
main function must at least use llvm.eh.exception,
llvm.eh.selector.i32/64 and probably __cxa_begin_catch and __cxa_end_catch.
Nicolas
Talin wrote:
> I've been struggling for several days, trying to get native exceptions
> to work in my code. I managed to boil down the IR to the simplest
> possible example that I can think of.
>
> If anyone on this list can tell me what changes I need to make to the
> following code to get it to work (i.e. return 0 instead of a bus
> error), it would make my life immensely better.
>
> ; ModuleID = 'ExceptionTest'
> %Object = type {}
> %UnwindInfo = type { i64, void (i32, %UnwindInfo *)*, i16, i16 }
> %Throwable = type { %Object, %UnwindInfo }
>
> define i32 @main(i32, i8**) nounwind {
> entry:
> invoke fastcc void @throwSomething() to label %nounwind unwind
> label %catch
>
> catch:
> ret i32 0
>
> nounwind:
> ret i32 -1
> }
>
> define internal fastcc void @throwSomething() noreturn {
> entry:
> %throwable = malloc %Throwable
> call fastcc void @Throwable.construct(%Throwable* %throwable)
> %unwindInfo = getelementptr %Throwable* %throwable, i32 0, i32 1
> %throw = call i32 @_Unwind_RaiseException(%UnwindInfo*
> %unwindInfo)
> unreachable
> }
>
> define internal fastcc void @Throwable.construct(%Throwable* %self)
> nounwind {
> entry:
> %exceptionClass = getelementptr %Throwable* %self, i32 0, i32 1,
> i32 0
> store i64 0, i64* %exceptionClass
> %exceptionCleanup = getelementptr %Throwable* %self, i32 0, i32
> 1, i32 1
> store void (i32, %UnwindInfo *)* @exceptionCleanupFn, void (i32,
> %UnwindInfo *)** %exceptionCleanup
> %private1 = getelementptr %Throwable* %self, i32 0, i32 1, i32 2
> store i16 0, i16* %private1
> %private2 = getelementptr %Throwable* %self, i32 0, i32 1, i32 3
> store i16 0, i16* %private2
> ret void
> }
>
> define internal void @exceptionCleanupFn(i32 %reason, %UnwindInfo *
> %exc) {
> ret void
> }
>
> declare i32 @_Unwind_RaiseException(%UnwindInfo*) noreturn
>
> -- 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