[llvm-dev] [ORC JIT] -Resolving cross references in a multi-process scenario

Gaier, Bjoern via llvm-dev llvm-dev at lists.llvm.org
Tue Mar 17 00:34:27 PDT 2020


Hello LLVM-Mailing-List and Lang,

I played around with this problem a bit and found a way of doing this - however I'm not sure about the consequences and if this is really a good idea.

I went trough all of the global symbols and functions being defined in the llvm::Module and set for each of them a new section name (based on there name). With this approach the memorymanager could tell me already the addresses of my symbols, which I could then share with the other process. However, this approach needed to load the module two times, first to get the future address and in a second run to use the addresses to resolve the symbols.

The only disadvantage I noticed so far was that the overall size of the emitted code was bigger then having the regular sections. Are there any other risks I might have overseen?

Kind greetings
Björn


From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of Gaier, Bjoern via llvm-dev
Sent: 06 March 2020 14:24
To: LLVM Developers Mailing List <llvm-dev at lists.llvm.org>; Lang Hames <lhames at gmail.com>
Subject: [llvm-dev] [ORC JIT] -Resolving cross references in a multi-process scenario

Hello LLVM-Mailing-List and Lang,

I have a very weird (or strict?) scenario and was curious if the ORC  JIT can help me with it. Soo here it comes:

I have currently a windows process ("Runtime") which does nothing but creating a shared memory with read, write and execute rights - and also writing some function addresses like from printf to it.
Then I have two or more processes which are using the ORC JIT to load modules to this shared memory, in "perspective" of the process I mentioned above ("Runtime"). The sections are remapped from the other processes to be correct for "Runtime", also they resolve the undefined references for "Runtime" - like for printf and so on.
This works quite well so far! Wuhuhu x3

However, there is one issue about it. Given that those two (or more processes) are now loading modules that reference each other. Like Module A is using a function of Module B - but Module B also uses a function of Module A. How could I resolve those modules when they are loaded from different processes? Normally I would use llvm-link to link those modules but in my current scenario this is sadly not possible.

Can the ORC JIT help me with that? Can I solve this problem differently? Like replacing all the functions of Module A that rely on Module B with function pointers? Is something like that possible?

I know this situation is pretty uncommon but sadly I ran into that issue.

Kind greetings
Björn

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, Takeshi Fukushima. Junichi Tajika
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, Takeshi Fukushima. Junichi Tajika
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200317/0b15202c/attachment.html>


More information about the llvm-dev mailing list