<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Bjoern,<div><br></div><div>Sounds like you want the removable code feature that's under development in the orcv1-removal branch of <a href="https://github.com/lhames/llvm-project.git">https://github.com/lhames/llvm-project.git</a>. I will be aiming to merge this work back into the mainline some time in the next couple of weeks.</div><div><br></div><div>I have not added a "removeJITDylib" method to ExecutionSession with this feature yet, but will try to design and publish that tomorrow. Then you should be able to do exactly what you want.</div><div><br></div><div>In the new system you can also perform fine grained removal: It is possible to track and remove individual modules from within a JITDylib. For an example of this see: <a href="https://github.com/lhames/llvm-project/blob/7ec9f8930f68760953a483157e010d0ff88285cd/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/toy.cpp#L1148">https://github.com/lhames/llvm-project/blob/7ec9f8930f68760953a483157e010d0ff88285cd/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/toy.cpp#L1148</a>, from lines 1148 to line 1161.</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Also a related but different question:<br>When using llvm::parseIRFile I need to pass it a LLVMContext - should this be a unique one for every module I pass or can I use a global one?</blockquote></div><div><br></div><div>It depends on whether you want to be able to compile concurrently in the JIT process. If you do want to compile concurrently then each module should get its own context. If you are happy to stick to single threaded compilation you can load all modules on the same context, potentially saving some memory.</div><div><br></div><div>-- Lang.</div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 17, 2020 at 11:59 PM Gaier, Bjoern <<a href="mailto:Bjoern.Gaier@horiba.com">Bjoern.Gaier@horiba.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">





<div lang="DE">
<div class="gmail-m_-5356015699936992133WordSection1">
<p class="MsoNormal"><span lang="EN-GB">Hello everyone and Lang,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">I have another design or "how-to" question about the ORC JIT. Sorry for having so many about them, to me this is a really complicated yet fascinating subject...<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">How would I design an ORC JIT with the following requirements?
<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">At any time it should be possible to load a LLVM Module, every Module is independent and is not allowed to be linked with the other modules, every module can be removed at any time.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">My first idea was to have an ORC JIT for every module I load, but then I wondered if I could use a single ORC JIT for it.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">So, I would create an ORC JIT:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- using llvm::orc::LLJITBuilder<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- configurating it<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- adding a custom memory manager that requests the entire memory size<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Then I would call "getMainJITDylib" and fill it with symbols that are valid for every module:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- adding printf, strlen, usw. <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Now when I get a request to load a module:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- load module <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- get symbols I want to look up<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">- create new DyLib and add module to that<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Now I would do a lookup on that module, plus the main module to get symbol addresses and stuff<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">If a new module is added, it goes to a new DyLib as well and so on.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">-----<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">However, now I want to delete a module again. Killing the memory is fairly easy with my custom memory manager, but I still have my DyLib of the now dead code... Can I get rid of it without dumping the others or the entire
 ORC JIT?<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Or is there a different approach to do this? My goal with this is to speed up the setup phase for a module and also to reduce dynamic memory usage.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Also a related but different question: <u></u>
<u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">When using llvm::parseIRFile I need to pass it a LLVMContext - should this be a unique one for every module I pass or can I use a global one?<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Kind greetings and thank you all again,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-GB">Björn<u></u><u></u></span></p>
</div>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Junichi Tajika, Ergin Cansiz.
</div>

</blockquote></div>