[prev in list] [next in list] [prev in thread] [next in thread] 

List:       llvm-dev
Subject:    Re: [llvm-dev] JIT client - late cross references
From:       "Gaier, Bjoern via llvm-dev" <llvm-dev () lists ! llvm ! org>
Date:       2018-08-31 12:28:09
Message-ID: TY1PR01MB0254B4C02D427D3F915DC9EEE20F0 () TY1PR01MB0254 ! jpnprd01 ! prod ! outlook ! com
[Download RAW message or body]

Hello Alex,

Thank you! This will help me a lot. Can you judge if my idea with the individual \
sections would work too? (Mentioned some mails before)

Kind greetings
Björn

-----Original Message-----
From: Alex Denisov <1101.debian@gmail.com> 
Sent: Donnerstag, 30. August 2018 16:13
To: Gaier, Bjoern <Bjoern.Gaier@horiba.com>
Cc: Lang Hames <lhames@gmail.com>; LLVM Developers Mailing List \
                <llvm-dev@lists.llvm.org>
Subject: Re: [llvm-dev] JIT client - late cross references

Hi Björn,

> I understand the basic idea but sadly... My skills in handling the IR are not very \
> high, so I can't imagine where and when to replace the calls to b() with the \
> trampoline. The only thing I can handle would be creating that trampoline variable.

Here are some links to a very similar code, it's experimental and very dirty, but you \
can see the idea there: Changing bitcode:
https://github.com/mull-project/mull/blob/d961b5e494c3bf5937c101338e470b71eee97c0e/lib/MullModule.cpp#L84


Dealing with resolvers:

https://github.com/mull-project/mull/blob/d961b5e494c3bf5937c101338e470b71eee97c0e/lib/Parallelization/Tasks/MutantExecutionTask.cpp#L38
 https://github.com/mull-project/mull/blob/d961b5e494c3bf5937c101338e470b71eee97c0e/lib/Toolchain/Resolvers/MutationResolver.cpp#L23



> Also will this approach be a problem for really time critical tasks? Since I \
> replace the call to an address ( b() ) with an call to a function pointer?

There is obviously an overhead, but you better measure it and see if it's significant \
or not.

> On 29. Aug 2018, at 16:22, Gaier, Bjoern <Bjoern.Gaier@horiba.com> wrote:
> 
> Hello Alex,
> 
> This is an interesting approach! Thank you for that!
> I understand the basic idea but sadly... My skills in handling the IR are not very \
> high, so I can't imagine where and when to replace the calls to b() with the \
> trampoline. The only thing I can handle would be creating that trampoline variable. \
>  Also will this approach be a problem for really time critical tasks? Since I \
> replace the call to an address ( b() ) with an call to a function pointer? 
> Kind greetings
> Björn
> 
> -----Original Message-----
> From: Alex Denisov <1101.debian@gmail.com>
> Sent: Mittwoch, 29. August 2018 10:40
> To: Gaier, Bjoern <Bjoern.Gaier@horiba.com>
> Cc: Lang Hames <lhames@gmail.com>; LLVM Developers Mailing List \
>                 <llvm-dev@lists.llvm.org>
> Subject: Re: [llvm-dev] JIT client - late cross references
> 
> Hi Björn,
> 
> Not sure if I got it right, but I hope it gives you a hint.
> 
> Assuming that you have the following setup:
> 
> Module A has function a()
> Module B has function b()
> 
> a() calls b()
> 
> You are loading only module A, but it fails because it cannot resolve function b(), \
> right? If so, then you can try this approach:
> 
> Create a global variable in the module A of type "pointer to b()" named, e.g., \
> b_trampoline. Replace call instruction with the load+call instructions, as \
> described in pseudocode: 
> Before:
> 
> declare b(...)
> define a(): {
> ...
> call b(%1, %2, %3)
> ...
> }
> 
> After:
> 
> @b_trampoline = <pointer to b()>
> declare b(...)
> define a(): {
> ...
> %ptr = load @b_trampoline
> call %ptr(%1, %2, %3)
> ...
> }
> 
> Then, when you load module A SymbolResolver will ask for an address of \
> b_trampoline, you can give back an address of a heap-allocated storage, i.e.: 
> ...
> uint64_t *trampolineStorage = new uint64_t; ...
> 
> SymbolResolver::findSymbol(const std::string &name) {
> if (name == "b_trampoline") {
> JITSymbolInfo((uint64_t) trampolineStorage, JITSymbolFlags::Exported)
> }
> ...
> }
> 
> Later on, when everything is loaded and you are ready to execute JITed code you can \
> fill in the trampolineStorage with the actual address, i.e.: 
> *trampolineStorage = jit.getSymbol("b").getAddress();
> 
> That should do the trick.
> 
> I still hope I got your problem right and it helps ;)
> 
> Cheers,
> Alex.
> 
> > On 29. Aug 2018, at 07:38, Gaier, Bjoern via llvm-dev <llvm-dev@lists.llvm.org> \
> > wrote: 
> > Hello Lang,
> > 
> > thank you for your response!
> > 
> > So the use case would be some kind of wrapping or just taking control.
> > Taking that Module 'A' has function a() and Module 'B' has function b() and c() - \
> > also a() calls b(). The normal resolving process would resolve the function call \
> > correct. But for some reason (like having a wrapper) I would prefer to resolve \
> > calls to b() with a call to c(), but only for module 'A'. 
> > For my own hobby-project I tried working with custom section names. When I came \
> > to allocating the memory for these sections I just kept the address and used it. \
> > Would this be suitable way too? That I allocate 'points of interest' in their own \
> > sections and keep the address? Or could it happen that these sections merge into \
> > one? Would this have negative consequences? Like using more memory or so? 
> > Kind greetings
> > Björn
> > 
> > From: Lang Hames <lhames@gmail.com>
> > Sent: Dienstag, 21. August 2018 17:49
> > To: Gaier, Bjoern <Bjoern.Gaier@horiba.com>
> > Cc: LLVM Developers Mailing List <llvm-dev@lists.llvm.org>
> > Subject: Re: [llvm-dev] JIT client - late cross references
> > 
> > Hi Bjoern,
> > 
> > I do not think there is any practical way to do this yourself, short of writing \
> > your own RuntimeDyld implementation. 
> > The reason is that you cannot resolve a symbol to an address until you have \
> > compiled it down to an object file, but in the case of circular reference you \
> > would need to compile both IR Modules to object files before either could be \
> > patched up, and by that stage it is too late to patch either up at the IR level. 
> > What is the use case for trying to resolve these references yourself, rather than \
> > letting RuntimeDyld do it for you? 
> > Cheers,
> > Lang.
> > 
> > On Mon, Aug 6, 2018 at 4:20 AM Gaier, Bjoern via llvm-dev \
> > <llvm-dev@lists.llvm.org> wrote: Hello everyone,
> > 
> > I'm still a beginner with the LLVM and the process of jitting a BC file at \
> > runtime as a JIT client - but I'm really interested into this subject. 
> > In my current use case I have two BC files which have cross references to each \
> > other, normally I could just add them both to the llvm::ExecutionEngine and they \
> > will be resolved. But I would like to resolve these cross references by myself, \
> > through the llvm::JITSymbolResolver but I see no way for this, since both files \
> > references each other. 
> > If I jit A, it will reach the undefined function from file B. So at this point I \
> > would have to jit B, but B references a function from A, which isn't completely \
> > resolved yet. Is there a way to get the addresses of the functions before the jit \
> > process is completed? Maybe via the section addresses and some kind of offset or \
> > so? 
> > Thank you for any response!
> > 
> > Kind greetings
> > Björn
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev@lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev@lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> 
> --
> AlexDenisov
> Software Engineer, https://lowlevelbits.org
> 

_______________________________________________
LLVM Developers mailing list
llvm-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic