[LLVMdev] Getting exceptions to work?
Talin
viridia at gmail.com
Sun May 17 23:54:09 PDT 2009
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
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ExTest.ll
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090517/6b2e2a8c/attachment.ksh>
More information about the llvm-dev
mailing list