<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hi Julius, I had similar questions a while ago. First of all: the
GlobalMappingLayer is used for explicit mappings from strings to
function pointers, so that your generated code can access these
functions. It doesn't do much more.<br>
<br>
I didn't inspect your attached example, but I think you can look at
one of my examples to find out how I wire it up. Maybe that helps:<br>
<a class="moz-txt-link-freetext" href="https://github.com/weliveindetail/JitFromScratch/commit/70277db033d75599eff24ccd802cdf7fdfbcde99">https://github.com/weliveindetail/JitFromScratch/commit/70277db033d75599eff24ccd802cdf7fdfbcde99</a><br>
<br>
<blockquote type="cite">The problem I have with that conceptually
is: The name seems to matter. The abstraction I'd like is that I
get an llvm::Function*, and that is mapped to &somefunc, the
name "bla" I gave it should be irrelevant.</blockquote>
Just query the name of your llvm::Function and pass it also to the
GlobalMappingLayer (if you want to use it).<br>
<br>
<blockquote type="cite">(And that's what I'd like that to be like
for all functions and function calls and whatnot: The name I give
them is irrelevant, only the llvm::Function*/llvm::Value*
matters.) Am I using the wrong API and there is a way to do this
without the names, without any symbol resolution at all? (I don't
want to use symbols from the current executable or anywhere else,
either.)
</blockquote>
I think the ExecutionEngine just did the query and pass on
implicitly.<br>
<br>
<blockquote type="cite">The problem I have with that
implementationally: It just doesn't work. I get a LLVM ERROR:
Undefined temporary symbol from the ELFObjectWriter (and the error
is actually about that symbol I'm trying to map)</blockquote>
Query your mapping during symbol resolution like this:<br>
<a class="moz-txt-link-freetext" href="https://github.com/weliveindetail/JitFromScratch/commit/70277db033d75599eff24ccd802cdf7fdfbcde99#diff-db46172f086b2c8918df9eea96b799c2R165">https://github.com/weliveindetail/JitFromScratch/commit/70277db033d75599eff24ccd802cdf7fdfbcde99#diff-db46172f086b2c8918df9eea96b799c2R165</a><br>
<br>
If you want your generated code to have implicit access to functions
in your binary, then have a look at these two lines:<br>
<a class="moz-txt-link-freetext" href="https://github.com/weliveindetail/JitFromScratch/commit/860bec7e7fae1a1f31ef794bf78d191c44355c4c#diff-db46172f086b2c8918df9eea96b799c2R22">https://github.com/weliveindetail/JitFromScratch/commit/860bec7e7fae1a1f31ef794bf78d191c44355c4c#diff-db46172f086b2c8918df9eea96b799c2R22</a><br>
<a class="moz-txt-link-freetext" href="https://github.com/weliveindetail/JitFromScratch/commit/860bec7e7fae1a1f31ef794bf78d191c44355c4c#diff-db46172f086b2c8918df9eea96b799c2R64">https://github.com/weliveindetail/JitFromScratch/commit/860bec7e7fae1a1f31ef794bf78d191c44355c4c#diff-db46172f086b2c8918df9eea96b799c2R64</a><br>
<br>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<span class="blob-code-inner">It registers your binary as dynamic
library and resolves symbols from within your process. In order to
avoid C++ mangling trouble, the functions that get used may be
extern "C" qualified. If you use a frontend like Clang to generate
your code, take care about compatible settings, e.g. debug vs.
release and ABI-related compile flags like exceptions and RTTI.<br>
<br>
Cheers,<br>
Stefan<br>
</span><br>
<div class="moz-cite-prefix">Am 07.11.16 um 11:47 schrieb Julius
Michaelis via llvm-dev:<br>
</div>
<blockquote cite="mid:20161107104717.GA6991@liftm.de" type="cite">Hi,
<br>
<br>
I have migrated an LLVM front-end from LLVM 3.5 to 3.8 and now to
3.9 and ORC, and there is a concept which I could not transfer.
Consider:
<br>
<br>
extern "C" { void somefunc() {} }
<br>
…
<br>
auto llvmfunc = llvm::Function::Create(type,
llvmFunction::PrivateLinkage, "bla", module));
<br>
executionengine.addGlobalMapping(llvmfunc, &somefunc);
<br>
// now I have llvmfunc to work with and don't need to consider
anything else
<br>
<br>
The GlobalMappingLayer class seems to provide the functionality I
want. I oriented myself on the example from
<a class="moz-txt-link-freetext" href="https://github.com/AndySomogyi/cayman/blob/aaa809c/src/llvm_orc_initial.cpp#L1172">https://github.com/AndySomogyi/cayman/blob/aaa809c/src/llvm_orc_initial.cpp#L1172</a>
(just oriented, because at least on 3.9, I can not stack the
GlobalMappingLayer on the ObjectLinkingLayer. I have to put it
onto the IRCompileLayer. One question I'd have: How does that
order matter?)
<br>
<br>
The problem I have with that conceptually is: The name seems to
matter. The abstraction I'd like is that I get an llvm::Function*,
and that is mapped to &somefunc, the name "bla" I gave it
should be irrelevant. (And that's what I'd like that to be like
for all functions and function calls and whatnot: The name I give
them is irrelevant, only the llvm::Function*/llvm::Value*
matters.) Am I using the wrong API and there is a way to do this
without the names, without any symbol resolution at all? (I don't
want to use symbols from the current executable or anywhere else,
either.)
<br>
<br>
The problem I have with that implementationally: It just doesn't
work. I get a LLVM ERROR: Undefined temporary symbol from the
ELFObjectWriter (and the error is actually about that symbol I'm
trying to map), none of the llvm assertions fail. I compiled a
minimal example of what I'm doing and attached it. The curious
part is that the lambda resolver does not even get invoked… Can
anybody tell me what I am doing wrong?
<br>
<br>
Thank you
<br>
Julius
<br>
<br>
<br>
PS: Related thread:
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/pipermail/llvm-dev/2015-August/thread.html#89230">http://lists.llvm.org/pipermail/llvm-dev/2015-August/thread.html#89230</a>
<br>
<br>
PPS:
<br>
The whole thing I'm building is supposed to be a script engine for
a game. As the scripts aren't supposed to have any access outside
the game, I'd like as little linking magic as possible.
<br>
It's still in early stages.
<a class="moz-txt-link-freetext" href="https://git.openclonk.org/jcaesar/experimental.git/blob/7be141ce667f4689428943592bae0a7568134213:/src/script/C4AulCompiler.cpp">https://git.openclonk.org/jcaesar/experimental.git/blob/7be141ce667f4689428943592bae0a7568134213:/src/script/C4AulCompiler.cpp</a><br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
<a class="moz-txt-link-freetext" href="https://about.me/stefan.graenitz">https://about.me/stefan.graenitz</a></pre>
</body>
</html>