[LLVMdev] Throwing exceptions to code that calls the ExecutionEngine.

Maarten Hoeben maarten.hoeben at avinity.net
Thu Oct 22 08:22:43 PDT 2009


Hi,

I'm developing an OpenGL shader-like language, using LLVM as the JIT engine.
For some circumstances or exceptions I would like to abort the script, by
throwing an exception back to the code that called the
ExecutionEngine::runFunction.

Initially I had problems throwing exceptions from functions called from the
JIT code, where the JIT code would handle the exceptions, but this was
solved by setting llvm::ExceptionHandling to true. However, now I'm trying
to abort the script all together, by throwing an (by the script) unhandled
exception.

As a proof-of-concept I used the online demo generator to generate C++ code
for the following script;

void test(void)
{
  throw -1;
}

I added llvm::ExceptionHandling = true, an ExecutionEngine and
try/catch(...) statements around the runFunction, and changed the
setTargetTriple to the correct value ("i386-apple-darwin"). The result is
the same to all my other experiments, in that it aborts with the message
"terminate called after throwing an instance of 'int'".

If I add a function that calls the same test() function (embraced by
try/catch(...)) from within the JIT, the exception is handled properly
within that function.

The questions are;

a) Is this a feasible way of aborting runnning JIT code,
b) Should it work, and if so, what am I doing wrong.
c) If not, are there any alternatives to abort running JIT code, even over
nested functions (apart from generating stubs function with try/catch
constructs to call the user-defined function.

Thanks in advance for your response,

Maarten Hoeben

PS: The stack backtrace is as follows;

#0  0x94586e42 in __kill ()
#1  0x94586e34 in kill$UNIX2003 ()
#2  0x945f923a in raise ()
#3  0x94605679 in abort ()
#4  0x91754005 in __gnu_cxx::__verbose_terminate_handler ()
#5  0x9175210c in __gxx_personality_v0 ()
#6  0x9175214b in std::terminate ()
#7  0x91752261 in __cxa_throw ()
#8  0x02080045 in ?? ()
#9  0x000056ef in main (argc=1, argv=0xbffff82c) at
/Users/mhoeben/Development/codecs/mule/src/main.cpp:52

PPS: I also tried to longjmp from the JIT code, back to my code, but this
ofcourse violates a lot of C++ stack cleanup rules.
-- 
View this message in context: http://www.nabble.com/Throwing-exceptions-to-code-that-calls-the-ExecutionEngine.-tp26011956p26011956.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.




More information about the llvm-dev mailing list