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

koffie drinker via llvm-dev llvm-dev at lists.llvm.org
Fri Jan 22 07:30:28 PST 2016


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. (http://llvm.org/releases/3.7.1/docs/ReleaseNotes.html)
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.





On Fri, Jan 22, 2016 at 1:38 PM, koffie drinker <gekkekoe at gmail.com> wrote:

> 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?
>
> On Thu, Jan 21, 2016 at 7:15 PM, Reid Kleckner <rnk at google.com> wrote:
>
>> This sounds like https://llvm.org/bugs/show_bug.cgi?id=24233.
>>
>> On Thu, Jan 21, 2016 at 6:21 AM, koffie drinker via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>>> 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
>>>    ir_func();
>>> } catch (const myEx&) {
>>> } catch (...) {
>>> }
>>>
>>> Looking at:
>>> *LLVM_ENABLE_EH:BOOL*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() ?
>>>
>>> Regards,
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160122/dca480c6/attachment.html>


More information about the llvm-dev mailing list