<div dir="ltr">I haven't dug into your example, but I would say exceptions don't work on Windows yet.<div><br></div><div>I don't know why it doesn't work on Mac.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 20, 2015 at 9:33 AM, Anil Can Akay <span dir="ltr"><<a href="mailto:anilck@gmail.com" target="_blank">anilck@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><p class="MsoNormal"><span lang="TR">Hi,</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">I am trying to
implement a scenario similar to running ExceptionDemo.cpp with parameter -1
(where the JITed code calls the C++ function which throws an exception)</span></p>

<p class="MsoNormal"><span lang="TR">Different from
the given example I am using IRParser instead of IRBuilder. I can successfully
catch the exception in Linux but the program crashes in Mac and Windows.</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">The code is
similar to as follows:</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">### The test.cpp
: (clang++ -O0 -S -emit-llvm test.cpp –c)</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">extern void
test() ;</span></p>

<p class="MsoNormal"><span lang="TR">extern
"C" void exec(void*) {</span></p>

<p class="MsoNormal"><span lang="TR">       
test();</span></p>

<p class="MsoNormal"><span lang="TR">}</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">### main.cpp</span></p>

<p class="MsoNormal"><span lang="TR">// necessary
includes here....</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">static void
test() {</span></p>

<p class="MsoNormal"><span lang="TR">   
throw 1;</span></p>

<p class="MsoNormal"><span lang="TR">}</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">int main(int,
const char **) {</span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::InitializeNativeTarget();</span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::InitializeNativeTargetAsmPrinter();</span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::InitializeNativeTargetAsmParser();</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::LLVMContext &Context = llvm::getGlobalContext();</span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::SMDiagnostic Err;</span></p>

<p class="MsoNormal"><span lang="TR">   
std::unique_ptr<llvm::Module> Mod =
llvm::parseIRFile("test.ll", Err, Context);</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal">    std::string triple = llvm::sys::getProcessTriple();<br></p>

<p class="MsoNormal">    Mod->setTargetTriple(triple);<br></p>

<p class="MsoNormal"><span lang="TR">   
llvm::Function* f = Mod->getFunction("exec");</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::TargetOptions Opts;</span></p>

<p class="MsoNormal">    Opts.NoFramePointerElim = true;<br></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
// Build engine with JIT</span></p>

<p class="MsoNormal"><span lang="TR">   
std::unique_ptr<llvm::RTDyldMemoryManager> MemMgr(new
llvm::SectionMemoryManager());</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
std::string err;</span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::EngineBuilder factory(std::move(Mod));</span></p>

<p class="MsoNormal"><span lang="TR">   
factory.setErrorStr(&err);</span></p>

<p class="MsoNormal"><span lang="TR">   
factory.setEngineKind(llvm::EngineKind::JIT);</span></p>

<p class="MsoNormal"><span lang="TR">   
factory.setTargetOptions(Opts);</span></p>

<p class="MsoNormal"><span lang="TR">   
factory.setMCJITMemoryManager(std::move(MemMgr));</span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::ExecutionEngine* EE = factory.create();</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
llvm::sys::DynamicLibrary::AddSymbol("_Z4testv",
reinterpret_cast<void*>(test));</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
EE->finalizeObject();</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
void* poi = EE->getPointerToFunction(f);</span></p>

<p class="MsoNormal"><span lang="TR">   
void (*exec)(void*) = reinterpret_cast<void (*)(void*)>(poi); </span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">   
try {</span></p>

<p class="MsoNormal"><span lang="TR">       
exec(NULL);</span></p>

<p class="MsoNormal"><span lang="TR">   
} catch (int e) {</span></p>

<p class="MsoNormal"><span lang="TR">       
std::cout << "catched " << e << std::endl;</span></p>

<p class="MsoNormal"><span lang="TR">   
}</span></p>

<p class="MsoNormal"><span lang="TR">   
return 0;</span></p>

<p class="MsoNormal"><span lang="TR">}</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">###</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">Crash like below:</span></p>

<p class="MsoNormal"><span lang="TR">libc++abi.dylib:
terminating with uncaught exception of type int</span></p>

<p class="MsoNormal"><span lang="TR">[1]   
15639 abort (core dumped)  ./main</span></p>

<p class="MsoNormal"><span lang="TR"> </span></p>

<p class="MsoNormal"><span lang="TR">What can be the
reason for the different behaviour in different platforms? In order to make it
work, do I need to wrap the llvm::Function* f with the unwindResume and
externalException blocks ? Any other suggestions ? By the way I use LLVM 3.6.0 compiled with LLVM_ENABLE_EH and RTTI enabled.</span></p>

<p class="MsoNormal"><span lang="TR">Thanks in advance
for your help.</span></p></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br></div>