<div dir="ltr"><div>On Alex's advice I am switching from MCJIT to the Orc API to compile and execute functions. Starting from the new clang-interpreter example in the source code (top of the tree!), I am able to execute my functions all right... as long as there are no constructors and destructors to call.</div><div><br></div><div>My question: is there a simple way, with the Orc API, to run a module's constructors and destructors? I see how OrcMCJITReplacement does it, calling getConstructors() and getDestructors() when a module is added, and running them later using a layer, but is there maybe a simpler way that I am missing? I would prefer to avoid having to invent secret names for constructors, play with their linkage and visibility, and generally get involved in things I don't understand...</div><div><br></div><div>Thanks,</div><div>Geoff<br></div><div><div><br><div class="gmail_quote"><div dir="ltr">On Fri, 15 Jun 2018 at 11:23, Alex Denisov <<a href="mailto:1101.debian@gmail.com">1101.debian@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Geoff,<br>
<br>
I hit the same problem some time ago.<br>
The problem that atexit handlers are registered from the JITted code, and the handlers point to the memory allocated by JIT.<br>
When the host program exits it calls the atexit handlers, but the memory is already deallocated by JIT.<br>
That's basically the reason of the crash.<br>
<br>
>From what I see ExecutionEngine and MCJIT do not provide any helpful API for this case.<br>
I can only recommend switching to Orc APIs in this case: there you can use custom symbol resolver and redirect atexit functions to your own function(s).<br>
That function would record atexit handlers, which you can call manually after running your program.<br>
Orc APIs even provide a class for that: orc::LocalCXXRuntimeOverrides.<br>
<br>
I think this is the right place to ask such questions.<br>
Otherwise, feel free to ping me on #llvm (AlexDenisov) if you need some hints on how to JIT native code using Orc APIs.<br>
<br>
I hope it helps.<br>
<br>
Cheers,<br>
Alex.<br>
<br>
> On 14. Jun 2018, at 12:44, Geoff Levner via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> <br>
> Greetings, LLVM wizards.<br>
> <br>
> I am using clang to compile a C++ module, and an ExecutionEngine (MCJIT) to execute a function it defines. That works (or pretends to). However, if I call the module's constructors first:<br>
> <br>
> exec_engine->runStaticConstructorsDestructors(false);<br>
> exec_engine->runFunctionAsMain(function, argvec, NULL);<br>
> <br>
> execution still works, but my program crashes when it exits, in __run_exit_handlers(). I can't tell from gdb what exit handler is crashing, but no calls are made to atexit() or on_exit(); all exit handlers are installed via __cxa_atexit().<br>
> <br>
> This may or may not be meaningful, but I am forced to compile with -fno-use-cxa-atexit, otherwise clang complains that __dso_handle could not be resolved.<br>
> <br>
> Any guidance would be MUCH appreciated. I am at a loss... Also, if you know of a better place to look for help than this mailing list, that would be appreciated, too.<br>
> <br>
> Thanks,<br>
> Geoff<br>
</blockquote></div></div></div></div>