Propagation of foreign c++ exceptions (msvc, x64, llvm 3.7.1, MCJIT) through IR code

Hi all,

I have the following code:

[use llvm to generate ir_func() ]

in side the ir_func() there’s a call to a native cpp function that throws an exception.
(Just imagine changing the fibonacci example and calling a native c++ func that throws inside the fibonacci body)

I can’t seem to catch “foreign” exception or any exception using the following pseudo code:

try {
// cast function ptr and execute
} catch (const myEx&) {
} catch (…) {

Looking at:

Build LLVM with exception-handling support. This is necessary if you wish to link against LLVM libraries and make use of C++ exceptions in your own code that need to propagate through LLVM code. Defaults to OFF.
It seems to be exactly what I require.
I enabled LLVM_ENABLE_EH and LLVM_ENABLE_RTTI but it doesn't seems to work. I also tested it with /EHs /EHsc in msvc. It makes no difference

I also looked at the ExceptionDemo.cpp, but it seems to be unsupported under windows. Do I need to try catch and retrhow in my ir_func() ?


This sounds like

I remembered it working on an older prototype version that I used.
I’ve checked the old version (it also uses mcjit, llvm 3.5 or 3.6, x64) and found the following:

try {
engine->runFunction(func, args); // exception is caught
auto f = (double (*)())engine->getPointerToFunction(func);
auto d = f(); // exception is not caught
catch (const MyEx& e) {
std::cout << " eval exp handler " << std::endl;
catch (…) {
std::cout << " unknown exp handler " << std::endl;

If you use the runFunction(), the exception does not get lost.
If you cast it and run the func ptr, the exception gets thrown but the exception is not caught.

For me I could make runFunction to work with my case, but whats the difference?

Ok, I did some more digging.
I’ve adjusted the runFunction to also allow my cases and it works in 3.6.2
The same changes does not work on 3.7.1

I did see that 3.7.1 has some ABI changes, so might be that only 3.7.1 broke it. (
I guessing that the runFunction is working, since it has the xdata (generated during compile time) and is somehow able to
catch exception thrown in the jitted code it is running. Still puzzled why it works, but this work around seems to be good enough for my project.