<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">This is the second version of a patch, which I recently attached to bug <span class="Apple-style-span" style="font-family: sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><a href="http://llvm.org/bugs/show_bug.cgi?id=2606" style="color: rgb(102, 51, 102); ">2606</a>, whose original version was</span><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">modified to reflect the lists comments. Also please note the comment at the end of this email, which basically</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">questions whether this bug is really a bug.<br></span></font><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">1) To solve the foreign Module GlobalVariable problem, I modified JIT::getOrEmitGlobalVariable(...) to </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space:pre">        </span>directly attempt to map a found "external" GlobalVariable. </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">2) To solve the foreign Module Function problem, </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space:pre">    </span>I modified JIT.{h,cpp} to emit a stub for a found "external" Function instance, when that foreign Module </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space:pre">   </span>defined Function has not yet been compiled.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">All areas of interest are marked with // GMV Mod:</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Again I invite those members of the list that have time, to review this proposal for comments/changes.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Major mods:</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">JIT.{h,cpp}:</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">1)<span class="Apple-tab-span" style="white-space: pre; ">  </span>I included Module.h.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">2)<span class="Apple-tab-span" style="white-space: pre; "> </span>JIT::<span class="Apple-tab-span" style="white-space: pre; ">getPointerToFunction</span>(...) was modified to search for a non-mapped function in all "other" modules.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">     </span>If found a stub is emitted in the same manner as other in module functions found. This stub gets re-emitted, </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space:pre">      </span>toward the end of the JIT cycle.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">  </span>One issue here is that functions that are external to all modules, have their mappings delayed by the</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>above loop. I also kept the hasAvailableExternallyLinkage() the same as before, as I'm not sure if this</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; "> </span>should also go through the same module procedure. The stub emission will only take place for function</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>definitions that are marked with external linkage. Should other cases be allowed? Should visibility also </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">       </span>be considered?</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">3)<span class="Apple-tab-span" style="white-space: pre; ">       JIT::getOrEmitGlobalVariable</span>(...) was modified to search for non-mapped global variables in all "other"</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">    </span>modules. If found, the address of the foreign global variable is requested, and mapped. There is no</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">  </span>delay here.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">    </span>An attempt is first made to find the global outside of all modules, before attempting to find the function</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">   </span>in the known modules. This is the reverse of logic used in #2. On searching, unlike for functions, a linkage </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">   </span>check was not made. Also the global variable declaration and definition must have the exact same type. </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">    </span>Is this the correct approach?</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">4)    The declaration of void* forceEmitFunctionStub(Function *F) was added to the class JIT. This is </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span class="Apple-tab-span" style="white-space: pre; ">    </span>implemented in JITEmitter.cpp.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><span class="Apple-style-span" style="font-family: sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">JITEmitter.cpp:</span></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">1)<span class="Apple-tab-span" style="white-space: pre; ">     JIT::forceEmitFunctionStub</span>(...) was added. It turns around and calls <span class="Apple-style-span" style="font-family: Helvetica; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><span class="Apple-style-span" style="font-family: sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">JITResolver::getLazyFunctionStub(...) which</span></span></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><span class="Apple-tab-span" style="white-space:pre"> </span>emits the foreign function as a stub.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Beyond any issues with the patch, there is a question, in my mind, as to whether <a href="http://llvm.org/bugs/show_bug.cgi?id=2606" style="color: rgb(102, 51, 102); ">2606</a> is really a bug. Sure its resolution makes </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">using the JIT simpler for cross module behavior, but current manual solutions may be more fined grained in their approach in</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">deciding how to treat such functions. If true a fix to <a href="http://llvm.org/bugs/show_bug.cgi?id=2606" style="color: rgb(102, 51, 102); ">2606</a> would circumvent such handling. Should we instead add a new </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">semantic to EngineBuilder which would configure the JIT, or whatever else, to handle such cross module linkage, if such behavior</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">is warranted? By linkage I mean mapping variables, and functions found in "external" modules, into the execution engine. For example, </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">one could devise a new function pass style metaphor which would be setup in the EngineBuilder instance. If it exists, the resulting</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">JIT instance would use this new pass style to determine what to do with "foreign functions, and variables". However the first question </span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">is, whether or not <a href="http://llvm.org/bugs/show_bug.cgi?id=2606" style="color: rgb(102, 51, 102); ">2606</a> is a bug in the first place?</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Thanks again for any time spent on this</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Garrison</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "></span></font></div></div></body></html>