<div dir="ltr">+"Lang Hames, Linker of Linkers"<br><br>(Lang developed the ORC JIT you seem to be using & can provide more context than I have)</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 13, 2015 at 12:43 PM, Andy Somogyi via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="color:rgb(0,0,0);font-family:Courier;font-size:12px">Hi</span><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px">I’ve previously used the ExecutionEngine::addGlobalMapping to make existing functions available to my JITed code. </div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px">I’m currently using ORC, as MCJIT does not appear to be maintained any longer (the kaleidoscope examples have not worked for some time with MCJIT). </div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px">I’m using just the basic ORC CompileLayer directly. </div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px">So, I’ve essentially copied the ExecutionEngine::addGlobalMapping related function to my JIT context, and I create a lambda resolver as such:</div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px">JITContext::addModule(…) {</div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px"><div style="margin:0px"><span style="color:rgb(147,26,104)">auto</span> Resolver = createLambdaResolver(</div><div style="margin:0px"><span style="white-space:pre-wrap">         </span>[&](<span style="color:rgb(147,26,104)">const</span> std::<span style="color:rgb(0,97,65)">string</span> &name) {</div><div style="margin:0px"><br></div><div style="margin:0px;min-height:15px"><span style="white-space:pre-wrap">       </span><span style="color:rgb(78,144,114)">// look up first in JIT'ed code</span></div><div style="margin:0px"><span style="white-space:pre-wrap">        </span><span style="color:rgb(147,26,104)">if</span> (<span style="color:rgb(147,26,104)">auto</span> sym = findMangledSymbol(name)) {</div><div style="margin:0px"><span style="white-space:pre-wrap">               </span><span style="color:rgb(147,26,104)">return</span> <span style="color:rgb(0,97,65)">RuntimeDyld</span>::<span style="color:rgb(0,97,65)">SymbolInfo</span>(sym.getAddress(),</div><div style="margin:0px"><span style="white-space:pre-wrap">                              </span>sym.getFlags());</div><div style="margin:0px;color:rgb(0,97,65)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap">          </span></span><span style="color:rgb(147,26,104)">return</span><span style="color:rgb(0,0,0)"> </span>RuntimeDyld<span style="color:rgb(0,0,0)">::</span>SymbolInfo<span style="color:rgb(0,0,0)">(</span><span style="color:rgb(147,26,104)">nullptr</span><span style="color:rgb(0,0,0)">);</span></div><div style="margin:0px"><span style="white-space:pre-wrap">    </span>}</div><div style="margin:0px;min-height:15px"><br></div><div style="margin:0px;color:rgb(78,144,114)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap">        </span></span>// look up in added globals</div><div style="margin:0px"><span style="white-space:pre-wrap">    </span><span style="color:rgb(147,26,104)">if</span> (<span style="color:rgb(147,26,104)">auto</span> addr = getPointerToGlobalMapping(name)) {</div><div style="margin:0px"><span style="white-space:pre-wrap">              </span><span style="color:rgb(147,26,104)">return</span> <span style="color:rgb(0,97,65)">RuntimeDyld</span>::<span style="color:rgb(0,97,65)">SymbolInfo</span>(addr, JITSymbolFlags::<span style="color:rgb(3,38,204)">Exported</span>);</div><div style="margin:0px"><span style="white-space:pre-wrap">        </span>}</div><div style="margin:0px;min-height:15px"><br></div><div style="margin:0px;color:rgb(78,144,114)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap">        </span></span>// finally try to look up existing process symbols, note</div><div style="margin:0px;color:rgb(78,144,114)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap">  </span></span>// this works for symbols loaded in shared libraries, but</div><div style="margin:0px;color:rgb(78,144,114)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap"> </span></span>// does NOT seem to find symbols declared in the executable.</div><div style="margin:0px"><span style="white-space:pre-wrap">   </span><span style="color:rgb(147,26,104)">if</span> (<span style="color:rgb(147,26,104)">auto</span> Addr =</div><div style="margin:0px;color:rgb(121,61,147)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap">                    </span></span><span style="color:rgb(0,97,65)">RTDyldMemoryManager</span><span style="color:rgb(0,0,0)">::</span>getSymbolAddressInProcess<span style="color:rgb(0,0,0)">(name)) {</span></div><div style="margin:0px"><span style="white-space:pre-wrap">          </span><span style="color:rgb(147,26,104)">return</span> <span style="color:rgb(0,97,65)">RuntimeDyld</span>::<span style="color:rgb(0,97,65)">SymbolInfo</span>(Addr, JITSymbolFlags::<span style="color:rgb(3,38,204)">Exported</span>);</div><div style="margin:0px"><span style="white-space:pre-wrap">        </span>}</div><div style="margin:0px">},</div><div style="margin:0px">[](<span style="color:rgb(147,26,104)">const</span> std::<span style="color:rgb(0,97,65)">string</span> &S) { <span style="color:rgb(147,26,104)">return</span> <span style="color:rgb(147,26,104)">nullptr</span>; }</div><div style="margin:0px">);</div></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px">}</div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px">Here the getPointerToGlobalMapping function looks in a uint64 StringMap into which values are added via the addGlobalMapping functions. </div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px">This approach seems to be working, but my question is do you suppose there any are issues with such an approach? </div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px">The troubling thing is why doesn’t  <span style="color:rgb(0,97,65)">RTDyldMemoryManager</span>::<span style="color:rgb(121,61,147)">getSymbolAddressInProcess</span>(name)) return an address for a symbol that is defined in either a static library, or in the executable itself. </div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px"><br></div><div style="color:rgb(0,0,0);font-family:Courier;font-size:12px;margin:0px">If this approach is correct, in adding the global values to the context, and looking them up the lambda resolver, in addition to looking up external symbols, and considering that the ORC kaleidoscope examples do in fact allow external function calls (which are broken currently), should they be fixed with this approach?</div></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>