<div dir="ltr">I am trying to use LLVM 3.9 exceptions in my language. I have modeled the IL using C++ as the reference. My IL works correctly when the exception is thrown in the same function catching the exception, but fails when it needs to unwind. I am running the code using JIT.<div><br></div><div>Is there a doc, that explains this is in more detail. I have already read through:</div><div><a href="http://llvm.org/docs/ExceptionHandling.html">http://llvm.org/docs/ExceptionHandling.html</a></div><div><a href="http://blog.llvm.org/2011/11/llvm-30-exception-handling-redesign.html">http://blog.llvm.org/2011/11/llvm-30-exception-handling-redesign.html</a></div><div><a href="https://llvm.org/svn/llvm-project/llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp">https://llvm.org/svn/llvm-project/llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp</a></div><div><div><br></div><div>Here is my IL:</div><div><div>; ModuleID = 'sj'</div><div>source_filename = "sj"</div><div>target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"</div><div><br></div><div>@sjExceptionType = constant { i32 } { i32 999 }</div><div>@_ZTIPv = external constant i8*</div><div>@0 = private unnamed_addr constant [24 x i8] c"CAUGHT EXCEPTION global\00"</div><div><br></div><div>; Function Attrs: nounwind readnone</div><div>declare i32 @llvm.eh.typeid.for(i8*) #0</div><div><br></div><div>define void @global() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {</div><div>entry:</div><div>  br label %body</div><div><br></div><div>body:                                             ; preds = %entry</div><div>  invoke void @foo()</div><div>          to label %0 unwind label %catch</div><div><br></div><div>; <label>:0:                                      ; preds = %body</div><div>  ret void</div><div><br></div><div>catch:                                            ; preds = %body</div><div>  %1 = landingpad { i8*, i32 }</div><div>          catch i8* bitcast (i8** @_ZTIPv to i8*)</div><div>  %2 = extractvalue { i8*, i32 } %1, 0</div><div>  %3 = extractvalue { i8*, i32 } %1, 1</div><div>  %4 = call i8* @__cxa_begin_catch(i8* %2)</div><div>  %5 = sext i32 %3 to i64</div><div>  call void @debugFunction(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @0, i32 0, i32 0), i8* %4, i64 %5)</div><div>  call void @throwException()</div><div>  call void @__cxa_end_catch()</div><div>  ret void</div><div>}</div><div><br></div><div>declare i32 @__gxx_personality_v0(...)</div><div><br></div><div>define private void @foo() {</div><div>entry:</div><div>  br label %body</div><div><br></div><div>body:                                             ; preds = %entry</div><div>  call void @raiseException(i64 1)</div><div>  ret void</div><div>}</div><div><br></div><div>; Function Attrs: noreturn</div><div>declare void @raiseException(i64) #1</div><div><br></div><div>declare i8* @__cxa_begin_catch(i8*)</div><div><br></div><div>declare void @debugFunction(i8*, i8*, i64)</div><div><br></div><div>declare void @throwException()</div><div><br></div><div>declare void @__cxa_end_catch()</div><div><br></div><div>attributes #0 = { nounwind readnone }</div><div>attributes #1 = { noreturn }</div></div><div><br></div><div><br></div><div>---</div><div>throwException is being linked from C, here is the code:</div><div><div>extern "C" void raiseException(int64_t type) {</div><div>    auto t = new SJException();</div><div>    throw (void*)t;</div><div>}</div></div></div></div>