[LLVMdev] 2nd attempt for a working patch for bug 2606

Garrison Venn gvenn.cfe.dev at gmail.com
Fri Feb 19 08:21:08 PST 2010


This is the second version of a patch, which I recently attached to bug 2606, whose original version was
modified to reflect the lists comments. Also please note the comment at the end of this email, which basically
questions whether this bug is really a bug.

1) To solve the foreign Module GlobalVariable problem, I modified JIT::getOrEmitGlobalVariable(...) to 
	directly attempt to map a found "external" GlobalVariable. 
2) To solve the foreign Module Function problem, 
	I modified JIT.{h,cpp} to emit a stub for a found "external" Function instance, when that foreign Module 
	defined Function has not yet been compiled.

All areas of interest are marked with // GMV Mod:

Again I invite those members of the list that have time, to review this proposal for comments/changes.

Major mods:

JIT.{h,cpp}:

1)	I included Module.h.

2)	JIT::getPointerToFunction(...) was modified to search for a non-mapped function in all "other" modules.
	If found a stub is emitted in the same manner as other in module functions found. This stub gets re-emitted, 
	toward the end of the JIT cycle.

	One issue here is that functions that are external to all modules, have their mappings delayed by the
	above loop. I also kept the hasAvailableExternallyLinkage() the same as before, as I'm not sure if this
	should also go through the same module procedure. The stub emission will only take place for function
	definitions that are marked with external linkage. Should other cases be allowed? Should visibility also 
	be considered?

3)	JIT::getOrEmitGlobalVariable(...) was modified to search for non-mapped global variables in all "other"
	modules. If found, the address of the foreign global variable is requested, and mapped. There is no
	delay here.

	An attempt is first made to find the global outside of all modules, before attempting to find the function
	in the known modules. This is the reverse of logic used in #2. On searching, unlike for functions, a linkage 
	check was not made. Also the global variable declaration and definition must have the exact same type. 
	Is this the correct approach?

4)    The declaration of void* forceEmitFunctionStub(Function *F) was added to the class JIT. This is 
	implemented in JITEmitter.cpp.

JITEmitter.cpp:

1)	JIT::forceEmitFunctionStub(...) was added. It turns around and calls JITResolver::getLazyFunctionStub(...) which
	emits the foreign function as a stub.

Beyond any issues with the patch, there is a question, in my mind, as to whether 2606 is really a bug. Sure its resolution makes 
using the JIT simpler for cross module behavior, but current manual solutions may be more fined grained in their approach in
deciding how to treat such functions. If true a fix to 2606 would circumvent such handling. Should we instead add a new 
semantic to EngineBuilder which would configure the JIT, or whatever else, to handle such cross module linkage, if such behavior
is warranted? By linkage I mean mapping variables, and functions found in "external" modules, into the execution engine. For example, 
one could devise a new function pass style metaphor which would be setup in the EngineBuilder instance. If it exists, the resulting
JIT instance would use this new pass style to determine what to do with "foreign functions, and variables". However the first question 
is, whether or not 2606 is a bug in the first place?

Thanks again for any time spent on this

Garrison



	

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100219/316ad368/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PR2606.proposal.patch
Type: application/octet-stream
Size: 6962 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100219/316ad368/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100219/316ad368/attachment-0001.html>


More information about the llvm-dev mailing list