<div dir="ltr">Hi Björn,<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">I tried using your code and now it works! I'm happy and surprised!</blockquote><div><br><div>Oh - I missed that Will's code had fixed your issue. That's great. :)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Do you know if there is a way to directly load .obj-Files and resolve the references with own addresses? Like when somebody used printf in the generated obj-File, but I replace the address with my own printf? </blockquote><div><br></div><div class="gmail_extra">You can load precompiled object files by calling addObjectSet on the ObjectLayer.</div><div class="gmail_extra"><br></div><div class="gmail_extra">All external symbol references are resolved by the JITSymbolResolver that is created by createLambdaResolver. In your example the resolution process is two-step: First the JIT searches its own function definitions to see if there is a function called "printf" defined there (this is what the call to CompileLayer.findSymbol does):</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra"><font face="monospace, monospace">[&](const std::string &Name)  {</font></div><div class="gmail_extra"><font face="monospace, monospace">  printf("FLUSH :0\n");</font></div><div class="gmail_extra"><font face="monospace, monospace">  if (auto Sym = CompileLayer.findSymbol(Name, false))</font></div><div class="gmail_extra"><font face="monospace, monospace">    return Sym;</font></div><div class="gmail_extra"><font face="monospace, monospace">  return JITSymbol(nullptr);</font></div><div class="gmail_extra"><font face="monospace, monospace">}</font></div><div class="gmail_extra"><br></div><div class="gmail_extra">Then, if it doesn't find a definition there, it falls back to searching in the current process (this is what RTDyldMemoryManager::getSymbolAddressInProcess does):</div><div class="gmail_extra"><br></div><div class="gmail_extra"><font face="monospace, monospace">[](const std::string &S)  { </font></div><div class="gmail_extra"><font face="monospace, monospace">  printf("PLUSH :0\n"); </font></div><div class="gmail_extra"><font face="monospace, monospace">  if (auto SymAddr = <br></font></div><div class="gmail_extra"><font face="monospace, monospace">        RTDyldMemoryManager::getSymbolAddressInProcess(S)) </font></div><div class="gmail_extra"><font face="monospace, monospace">    return JITSymbol(SymAddr, JITSymbolFlags::Exported); </font></div><div class="gmail_extra"><font face="monospace, monospace">  return JITSymbol(nullptr); </font></div><div class="gmail_extra"><font face="monospace, monospace">}</font></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">If, for example, you wanted to redirect calls to printf to your own custom version (while resolving all other externals by the normal process) you could change the second lambda like so:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra"><font face="monospace, monospace">[](const std::string &S)  { </font></div><div class="gmail_extra"><font face="monospace, monospace">  printf("PLUSH :0\n");</font></div><div class="gmail_extra"><font face="monospace, monospace">  if (S == mangleName("printf"))</font></div><div class="gmail_extra"><font face="monospace, monospace">    return JITSymbol((JITSymbolAddress)&myCustomPrintf,</font></div><div class="gmail_extra"><font face="monospace, monospace">                     JITSymbolFlags::Exported);</font></div><div class="gmail_extra"><font face="monospace, monospace">  if (auto SymAddr = <br></font></div><div class="gmail_extra"><font face="monospace, monospace">        RTDyldMemoryManager::getSymbolAddressInProcess(S)) </font></div><div class="gmail_extra"><font face="monospace, monospace">    return JITSymbol(SymAddr, JITSymbolFlags::Exported); </font></div><div class="gmail_extra"><font face="monospace, monospace">  return JITSymbol(nullptr); </font></div><div class="gmail_extra"><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div></div></div><div class="gmail_extra">(You'll just have to pull the mangling logic from findSymbol out into its own "mangleName" function for this).</div><div class="gmail_extra"><br></div><div class="gmail_extra">Hope this helps.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Cheers,</div><div class="gmail_extra">Lang.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 23, 2017 at 11:08 PM,  <span dir="ltr"><<a href="mailto:bjoern.gaier@horiba.com" target="_blank">bjoern.gaier@horiba.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font size="2" face="sans-serif">Hello Mr. Dietz,</font>
<br>
<br><font size="2" face="sans-serif">I tried using your code and now it works!
I'm happy and surprised! I will now compare the codes and try to spot the
main difference! Thanks for your help!</font>
<br><font size="2" face="sans-serif">Do you know if there is a way to directly
load .obj-Files and resolve the references with own addresses? Like when
somebody used printf in the generated obj-File, but I replace the address
with my own printf?</font>
<br>
<br><font size="2" face="sans-serif">Kind regards</font>
<br><font size="2" face="sans-serif">Björn</font>
<br>
<br>
<br>
<br><font size="1" color="#5f5f5f" face="sans-serif">From:      
 </font><font size="1" face="sans-serif">Will Dietz <<a href="mailto:willdtz@gmail.com" target="_blank">willdtz@gmail.com</a>></font>
<br><font size="1" color="#5f5f5f" face="sans-serif">To:      
 </font><font size="1" face="sans-serif"><a href="mailto:bjoern.gaier@horiba.com" target="_blank">bjoern.gaier@horiba.com</a></font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Cc:      
 </font><font size="1" face="sans-serif">Lang Hames <<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>>,
Clang Dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Date:      
 </font><font size="1" face="sans-serif">21.04.2017 21:50</font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Subject:    
   </font><font size="1" face="sans-serif">Re: [cfe-dev]
JIT doens't resolve address</font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Sent by:    
   </font><font size="1" face="sans-serif"><a href="mailto:w@wdtz.org" target="_blank">w@wdtz.org</a></font>
<br>
<hr noshade>
<br>
<br>
<br><font size="3">Hmm, I tried using your code (copy+pasted and then mass-dumped
headers to fix includes), and it seems to work fine for me:</font>
<br>
<br><a href="https://gist.github.com/dtzWill/df84b64a73001532e3fcfe73a2cffbb9#file-test-log" target="_blank"><font size="3" color="blue"><u>https://gist.github.com/<wbr>dtzWill/<wbr>df84b64a73001532e3fcfe73a2cffb<wbr>b9#file-test-log</u></font></a>
<br>
<br><font size="3">Do you get different results when using your LLVM? If
not, can you identify the differences between your code and what I constructed
from your snippets?</font>
<br>
<br><font size="3">I noticed "PAUSE", are you on Windows? I'm not
sure what the functionality/status of the JIT on Windows is, perhaps someone
else can comment on that.</font>
<br>
<br><font size="3">~Will</font>
<br>
<br><font size="3">On Fri, Apr 21, 2017 at 1:03 AM, via cfe-dev <</font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="3" color="blue"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3">>
wrote:</font>
<br><font size="2" face="sans-serif">Hello Lang,</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
the Code for my jit_main is a normal printf-HelloWorld program. I opended
the file with notepad and found the following:</font><font size="3"> <br>
</font>
<table width="100%" style="border-collapse:collapse">
<tbody><tr valign="top" height="8">
<td width="100%" style="border:1px solid rgb(0,0,0);padding:1px"><font size="2" face="sans-serif">;
Function Attrs: noinline norecurse uwtable</font><font size="3"> </font><font size="2" face="sans-serif"><br>
define i32 @main() #0 {</font><font size="3"> </font><font size="2" face="sans-serif"><br>
entry:</font><font size="3"> </font><font size="2" face="sans-serif"><br>
  %retval = alloca i32, align 4</font><font size="3"> </font><font size="2" face="sans-serif"><br>
  store i32 0, i32* %retval, align 4</font><font size="3"> </font><font size="2" face="sans-serif"><br>
  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([35
x i8], [35 x i8]* @"\01??_C@_0CD@CMJEAMCD@<wbr>Planschbeckilein?5sagt?<wbr>5Halloilein@",
i32 0, i32 0))</font><font size="3"> </font><font size="2" face="sans-serif"><br>
  %call1 = call i32 @system(i8* getelementptr inbounds ([6 x i8],
[6 x i8]* @"\01??_C@_05DIAHPDGL@PAUSE?$<wbr>AA@", i32 0, i32 0))</font><font size="3">
</font><font size="2" face="sans-serif"><br>
  ret i32 0</font><font size="3"> </font><font size="2" face="sans-serif"><br>
}</font></td></tr></tbody></table>
<br><font size="3"><br>
</font><font size="2" face="sans-serif"><br>
So... there is a main... Anyway! The code for the main is this one:</font><font size="3">
</font>
<table width="100%" style="border-collapse:collapse">
<tbody><tr valign="top" height="8">
<td width="100%" style="border:1px solid rgb(0,0,0);padding:1px"><font size="1" color="#808080">#include</font><font size="1">
</font><font size="1" color="#a11f12"><stdio.h></font><font size="3"> </font><font size="1" color="#808080"><br>
#include</font><font size="1"> </font><font size="1" color="#a11f12"><stdlib.h></font><font size="3">
<br>
</font><font size="1" color="blue"><br>
int</font><font size="1"> main()</font><font size="3"> </font><font size="1"><br>
{</font><font size="3"> </font><font size="1"><br>
        printf(</font><font size="1" color="#a11f12">"Planschbeckilein
sagt Halloilein!\n"</font><font size="1">);</font><font size="3"> </font><font size="1"><br>
        system(</font><font size="1" color="#a11f12">"PAUSE"</font><font size="1">);</font><font size="3">
<br>
</font><font size="1"><br>
        </font><font size="1" color="blue">return</font><font size="1">
0;</font><font size="3"> </font><font size="1"><br>
}</font></td></tr></tbody></table>
<br><font size="3"><br>
</font><font size="2" face="sans-serif"><br>
Kind regards</font><font size="3"> </font><font size="2" face="sans-serif"><br>
Björn</font><font size="3"> <br>
<br>
<br>
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
From:        </font><font size="1" face="sans-serif">Lang
Hames <</font><a href="mailto:lhames@gmail.com" target="_blank"><font size="1" color="blue" face="sans-serif"><u>lhames@gmail.com</u></font></a><font size="1" face="sans-serif">></font><font size="3">
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
To:        </font><a href="mailto:bjoern.gaier@horiba.com" target="_blank"><font size="1" color="blue" face="sans-serif"><u>bjoern.gaier@horiba.com</u></font></a><font size="3">
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Cc:        </font><font size="1" face="sans-serif">Clang
Dev <</font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="1" color="blue" face="sans-serif"><u>cfe-dev@lists.llvm.org</u></font></a><font size="1" face="sans-serif">></font><font size="3">
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Date:        </font><font size="1" face="sans-serif">20.04.2017
22:54</font><font size="3"> </font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Subject:        </font><font size="1" face="sans-serif">Re:
[cfe-dev] JIT doens't resolve address</font><font size="3"> <br>
</font>
<hr noshade>
<br><font size="3"><br>
<br>
<br>
Hi Bjoern, <br>
<br>
Sorry - I just noticed that the address for your "main" function
has come back as '0'. In this case the answer is even simpler: The JIT
never found the function at all, and so definitely didn't have any external
symbols to resolve, so it never called the resolver. <br>
<br>
A failure to find main has three likely causes: <br>
<br>
(1) jit_main.ll does not define main, <br>
(2) jit_main.ll defines main with private/internal linkage (the JIT can't
see private/internal symbols in general) <br>
(3) jit_main.ll defines main with external linkage, but a system mangling
is applied (e.g. on MacOSX 'main' is mangled to '_main'). The mangler
code in your findSymbol function *should* correct for this, but this
may fail if the default data layout for your TargetMachine varies from
the Module's DataLayout. <br>
<br>
Can you share the contents of your jit_main.ll Module? <br>
<br>
Cheers, <br>
Lang. <br>
    <br>
<br>
On Thu, Apr 20, 2017 at 1:35 PM, Lang Hames <</font><a href="mailto:lhames@gmail.com" target="_blank"><font size="3" color="blue"><u>lhames@gmail.com</u></font></a><font size="3">>
wrote: <br>
HI Bjoern, <br>
<br>
There are two kinds of symbol lookup in the JIT: <br>
<br>
(1) You want to find a symbol defined JIT'd code. This is what "findSymbol"
on the JIT class does. <br>
<br>
(2) The JIT wants to fix up a module that contains references to symbols
defined elsewhere (either in your program, or in other JIT'd code). This
is the SymbolResolver's job. <br>
<br>
So assuming your main function in main.ll is trivial, e.g. <br>
</font><tt><font size="3"><br>
int main() {</font></tt><font size="3"> </font><tt><font size="3"><br>
  return 0;</font></tt><font size="3"> </font><tt><font size="3"><br>
}</font></tt><font size="3"> <br>
<br>
then your findSymbol call will return the address of the JIT'd main without
ever needing to look anything up in the resolver. <br>
<br>
If, on the other hand, your main function contains an external reference,
e.g. <br>
</font><tt><font size="3"><br>
int main() {</font></tt><font size="3"> </font><tt><font size="3"><br>
  printf("Hello, World!"); // Reference to externally defined
function printf.</font></tt><font size="3"> </font><tt><font size="3"><br>
  return 0;</font></tt><font size="3"> </font><tt><font size="3"><br>
}</font></tt><font size="3"> <br>
<br>
Then you'll receive a call back on your resolver looking for the address
of printf. <br>
<br>
Hope this helps! <br>
<br>
Cheers, <br>
Lang. <br>
<br>
On Thu, Apr 20, 2017 at 6:43 AM, via cfe-dev <</font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="3" color="blue"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3">>
wrote: </font><font size="2" face="sans-serif"><br>
Hello LLVM-World,</font><font size="3"> </font><font size="2" face="sans-serif"><br>
<br>
I was following the "Building a JIT in LLVM"-Tutorial and tried
to load a normal main. My code is the following:</font><font size="3"> </font>
<table width="100%" style="border-collapse:collapse">
<tbody><tr valign="top" height="8">
<td width="100%" style="border:1px solid rgb(0,0,0);padding:1px"><font size="1" color="blue">class</font><font size="1">
</font><font size="1" color="#4181c0">Jitter</font><font size="3"> </font><font size="1"><br>
{</font><font size="3"> </font><font size="1" color="blue"><br>
private</font><font size="1">:</font><font size="3"> </font><font size="1"><br>
  std::</font><font size="1" color="#4181c0">unique_ptr</font><font size="1"><</font><font size="1" color="#4181c0">TargetMachine</font><font size="1">>
TM;</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="blue">const</font><font size="1"> </font><font size="1" color="#4181c0">DataLayout</font><font size="1">
DL;</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#4181c0">ObjectLinkingLayer</font><font size="1"><>
ObjectLayer;</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#4181c0">IRCompileLayer</font><font size="1"><</font><font size="1" color="blue">decltype</font><font size="1">(<wbr>ObjectLayer)>
CompileLayer;</font><font size="3"> </font><font size="1" color="blue"><br>
<br>
public</font><font size="1">:</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="blue">typedef</font><font size="1"> </font><font size="1" color="blue">decltype</font><font size="1">(CompileLayer)::</font><font size="1" color="#4181c0">Module<wbr>SetHandleT</font><font size="1">
</font><font size="1" color="#4181c0">ModuleHandle</font><font size="1">;</font><font size="3">
</font><font size="1"><br>
<br>
  Jitter() : TM(</font><font size="1" color="#4181c0">EngineBuilder</font><font size="1">().<wbr>selectTarget()),
DL(TM</font><font size="1" color="#008080">-></font><font size="1">createDataLayout()),</font><font size="3">
</font><font size="1"><br>
      CompileLayer(ObjectLayer, </font><font size="1" color="#4181c0">SimpleCompiler</font><font size="1">(</font><font size="1" color="#008080">*</font><font size="1">TM))
<br>
  {printf(</font><font size="1" color="#a11f12">"!"</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
        llvm::sys::</font><font size="1" color="#4181c0">DynamicLibrary</font><font size="1">::<wbr>LoadLibraryPermanently(</font><font size="1" color="blue">nullptr</font><font size="1"><wbr>);</font><font size="3">
</font><font size="1"><br>
  }</font><font size="3"> </font><font size="1"><br>
<br>
  </font><font size="1" color="#4181c0">TargetMachine</font><font size="1">
&getTargetMachine() { </font><font size="1" color="blue">return</font><font size="1">
</font><font size="1" color="#008080">*</font><font size="1">TM; }</font><font size="3">
</font><font size="1"><br>
<br>
  </font><font size="1" color="#4181c0">ModuleHandle</font><font size="1">
addModule(std::</font><font size="1" color="#4181c0">unique_ptr</font><font size="1"><</font><font size="1" color="#4181c0">Modu<wbr>le</font><font size="1">>
&&</font><font size="1" color="#808080">M</font><font size="1">) {</font><font size="3">
</font><font size="1"><br>
  </font><font size="1" color="#008000">// Build our symbol resolver:</font><font size="3">
</font><font size="1"><br>
  </font><font size="1" color="#008000">// Lambda 1: Look back into the
JIT itself to find symbols that are part of</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#008000">//        
  the same "logical dylib".</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#008000">// Lambda 2: Search for external
symbols in the host process.</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="blue">auto</font><font size="1"> Resolver
= createLambdaResolver(</font><font size="3"> </font><font size="1"><br>
      [&](</font><font size="1" color="blue">const</font><font size="1">
std::</font><font size="1" color="#4181c0">string</font><font size="1"> &</font><font size="1" color="#808080">Name</font><font size="1">)
<br>
      {</font><font size="3"> </font><font size="1"><br>
                printf(</font><font size="1" color="#a11f12">"FLUSH
:0\n"</font><font size="1">);</font><font size="3"> </font><font size="1"><br>
<br>
        </font><font size="1" color="blue">if</font><font size="1">
(</font><font size="1" color="blue">auto</font><font size="1"> Sym = CompileLayer.findSymbol(</font><font size="1" color="#808080">Name</font><font size="1">,
</font><font size="1" color="blue">false</font><font size="1">))</font><font size="3">
</font><font size="1"><br>
          </font><font size="1" color="blue">return</font><font size="1">
Sym;</font><font size="3"> </font><font size="1"><br>
        </font><font size="1" color="blue">return</font><font size="1">
</font><font size="1" color="#4181c0">JITSymbol</font><font size="1">(</font><font size="1" color="blue">nullptr</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
      },</font><font size="3"> </font><font size="1"><br>
      [](</font><font size="1" color="blue">const</font><font size="1">
std::</font><font size="1" color="#4181c0">string</font><font size="1"> &</font><font size="1" color="#808080">S</font><font size="1">)
<br>
          {</font><font size="3"> </font><font size="1"><br>
                  printf(</font><font size="1" color="#a11f12">"PLUSH
:0\n"</font><font size="1">);</font><font size="3"> </font><font size="1"><br>
<br>
        </font><font size="1" color="blue">if</font><font size="1">
(</font><font size="1" color="blue">auto</font><font size="1"> SymAddr =</font><font size="3">
</font><font size="1"><br>
              </font><font size="1" color="#4181c0">RTDyldMemoryManager</font><font size="1">::<wbr>getSymbolAddressInProcess(</font><font size="1" color="#808080">S</font><font size="1">))</font><font size="3">
</font><font size="1"><br>
          </font><font size="1" color="blue">return</font><font size="1">
</font><font size="1" color="#4181c0">JITSymbol</font><font size="1">(SymAddr,
</font><font size="1" color="#4181c0">JITSymbolFlags</font><font size="1">::</font><font size="1" color="#37605e">Exported</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
        </font><font size="1" color="blue">return</font><font size="1">
</font><font size="1" color="#4181c0">JITSymbol</font><font size="1">(</font><font size="1" color="blue">nullptr</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
      });</font><font size="3"> </font><font size="1"><br>
<br>
  </font><font size="1" color="#008000">// Build a singleton module set
to hold our module.</font><font size="3"> </font><font size="1"><br>
  std::</font><font size="1" color="#4181c0">vector</font><font size="1"><std::</font><font size="1" color="#4181c0">unique_ptr</font><font size="1"><</font><font size="1" color="#4181c0">Mo<wbr>dule</font><font size="1">>>
Ms;</font><font size="3"> </font><font size="1"><br>
  Ms.push_back(std::move(</font><font size="1" color="#808080">M</font><font size="1">));</font><font size="3">
</font><font size="1"><br>
<br>
  </font><font size="1" color="#008000">// Add the set to the JIT with
the resolver we created above and a newly</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#008000">// created SectionMemoryManager.</font><font size="3">
</font><font size="1"><br>
  </font><font size="1" color="blue">return</font><font size="1"> CompileLayer.addModuleSet(std:<wbr>:move(Ms),</font><font size="3">
</font><font size="1"><br>
                     
             make_unique<</font><font size="1" color="#4181c0">SectionMemoryMana<wbr>ger</font><font size="1">>(),</font><font size="3">
</font><font size="1"><br>
                     
             std::move(Resolver));</font><font size="3">
</font><font size="1"><br>
}</font><font size="3"> </font><font size="1" color="#4181c0"><br>
<br>
JITSymbol</font><font size="1"> findSymbol(</font><font size="1" color="blue">const</font><font size="1">
std::</font><font size="1" color="#4181c0">string</font><font size="1"> </font><font size="1" color="#808080">Name</font><font size="1">)
{</font><font size="3"> </font><font size="1"><br>
  std::</font><font size="1" color="#4181c0">string</font><font size="1">
MangledName;</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#4181c0">raw_string_ostream</font><font size="1">
MangledNameStream(MangledName)<wbr>;</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="#4181c0">Mangler</font><font size="1">::getNameWithPrefix(<wbr>MangledNameStream,
</font><font size="1" color="#808080">Name</font><font size="1">, DL);</font><font size="3">
</font><font size="1"><br>
  printf(</font><font size="1" color="#a11f12">"Tzearch for: %s\n\n"</font><font size="1">,
MangledNameStream.str());</font><font size="3"> </font><font size="1"><br>
  </font><font size="1" color="blue">return</font><font size="1"> CompileLayer.findSymbol(<wbr>MangledNameStream.str(),
</font><font size="1" color="blue">false</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
}</font><font size="3"> </font><font size="1" color="blue"><br>
<br>
void</font><font size="1"> removeModule(</font><font size="1" color="#4181c0">ModuleHandle</font><font size="1">
</font><font size="1" color="#808080">H</font><font size="1">) {</font><font size="3">
</font><font size="1"><br>
  CompileLayer.removeModuleSet(</font><font size="1" color="#808080">H</font><font size="1"><wbr>);</font><font size="3">
</font><font size="1"><br>
}</font><font size="3"> </font><font size="1"><br>
<br>
};</font></td></tr></tbody></table>
<br><font size="2" face="sans-serif"><br>
<br>
<br>
And calling from main with:</font>
<table width="100%" style="border-collapse:collapse">
<tbody><tr valign="top" height="8">
<td width="100%" style="border:1px solid rgb(0,0,0);padding:1px"><font size="1" color="blue">int</font><font size="1">
main()</font><font size="3"> </font><font size="1"><br>
{</font><font size="3"> </font><font size="1"><br>
        llvm::InitializeNativeTarget()<wbr>;</font><font size="3">
</font><font size="1"><br>
        llvm::<wbr>InitializeNativeTargetAsmPrint<wbr>er();</font><font size="3">
</font><font size="1"><br>
        llvm::<wbr>InitializeNativeTargetAsmParse<wbr>r();</font><font size="3">
</font><font size="1"><br>
<br>
        llvm::</font><font size="1" color="#4181c0">LLVMContext</font><font size="1">
context;</font><font size="3"> </font><font size="1"><br>
        llvm::</font><font size="1" color="#4181c0">SMDiagnostic</font><font size="1">
dia;</font><font size="3"> </font><font size="1"><br>
<br>
        std::</font><font size="1" color="#4181c0">unique_ptr</font><font size="1"><llvm::</font><font size="1" color="#4181c0">Module</font><font size="1">>
M = llvm::parseIRFile(</font><font size="1" color="#a11f12">"./jit_main.<wbr>ll"</font><font size="1">,
dia, context);</font><font size="3"> </font><font size="1"><br>
        </font><font size="1" color="#4181c0">Jitter</font><font size="1">
jit;</font><font size="3"> </font><font size="1"><br>
        printf(</font><font size="1" color="#a11f12">"Wuff?"</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
        </font><font size="1" color="#4181c0">Jitter</font><font size="1">::</font><font size="1" color="#4181c0">ModuleHandle</font><font size="1">
h = jit.addModule(std::move(M));</font><font size="3"> </font><font size="1"><br>
        printf(</font><font size="1" color="#a11f12">"KNUFF!\n"</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
<br>
        printf(</font><font size="1" color="#a11f12">"Kuchen!
0x%p\n"</font><font size="1">, jit.findSymbol(</font><font size="1" color="#a11f12">"main"</font><font size="1">).<wbr>getAddress());</font><font size="3">
</font><font size="1"><br>
<br>
        system(</font><font size="1" color="#a11f12">"PAUSE"</font><font size="1">);</font><font size="3">
</font><font size="1"><br>
        </font><font size="1" color="blue">return</font><font size="1">
0;</font><font size="3"> </font><font size="1"><br>
}</font></td></tr></tbody></table>
<br><font size="2" face="sans-serif"><br>
<br>
The Code runs without a fail, but when the programm tries to resolve "main"
the address is 0. The strange thing: the printf "</font><font size="1" color="#a11f12">FLUSH
:0\n</font><font size="2" face="sans-serif">" and "</font><font size="1" color="#a11f12">PLUSH
:0\n</font><font size="2" face="sans-serif">" are never called, so did
the code never compiled? What I'm doing wrong?</font><font size="3"> </font><font size="2" face="sans-serif"><br>
<br>
Kind regards</font><font size="3"> </font><font size="2" face="sans-serif"><br>
Björn<br>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr.
DE 114 165 789<br>
Geschäftsführer: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.</font><font size="3"> <br>
______________________________<wbr>_________________<br>
cfe-dev mailing list</font><font size="3" color="blue"><u><br>
</u></font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="3" color="blue"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3" color="blue"><u><br>
</u></font><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank"><font size="3" color="blue"><u>http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</u></font></a><font size="3"><br>
<br>
<br>
<br>
</font><font size="2" face="sans-serif"><br>
<br>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr.
DE 114 165 789<br>
Geschäftsführer: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.</font>
<br><font size="3"><br>
______________________________<wbr>_________________<br>
cfe-dev mailing list</font><font size="3" color="blue"><u><br>
</u></font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="3" color="blue"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3" color="blue"><u><br>
</u></font><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank"><font size="3" color="blue"><u>http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</u></font></a><font size="3"><br>
</font>
<br>
<br>
<br><font size="2" face="sans-serif"><br>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr.
DE 114 165 789<br>
Geschäftsführer: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.</font></blockquote></div><br></div></div></div>