[MacRuby-devel] info on MacRuby's JIT (Roxor compiler for LLVM)
Ernest N. Prabhakar, Ph.D.
prabhaka at apple.com
Mon Dec 7 14:55:27 PST 2009
Hi Ravenex,
On Dec 7, 2009, at 8:36 AM, ravenex wrote:
>
> Greetings. New to this list, and to MacRuby. I was just skimming over the source code from trunk, but wasn't able to find a document that describes the current design of Roxor. I only found requirements, build instructions, coding styles and the like.
I don't have any answers either, but let me try to collect the relevant information, if only to improve my own understanding.
> The thing I find very confusing is that in vm.cpp, RoxorCore::RoxorCore(), there's a call to ee->DisableLazyCompilation(). This disables LLVM JIT's lazy compilation. Is it the case that Roxor compiles every method called by the toplevel script? Or how is Roxor feeding stuff into the JIT?
>
> Any pointers to documents, blog posts or mails would be truely appreciated.
As I understand it, the MacRuby compiler is known as Roxor and is defined in:
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/compiler.h
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/compiler.cpp
Roxor depends on some language facilities, e.g.:
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/llvm.h
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/objc.h
But mostly on the VM (which is essential for breaking the Global Interpreter Lock):
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm.h
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm.cpp
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm_eval.c
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm_method.c
> It seems to me that in main.cpp, main() calls ruby_options(), where the whole source file gets parsed into MRI's Ruby AST. That AST is supposed to go into RoxorCompiler::compile_main_method(), and out comes LLVM IR. And then after optimizations passes, GETCORE()->compile() puts the JIT in action, turns LLVM IR into native code, and then invoke the IMP. I must have missed something...but if Roxor JIT compiles a method upon first invocation, where is this behavior implemented.
In terms of front-ends, there is both an AOT and JIT compiler. It looks like both are called from:
http://svn.macosforge.org/repository/ruby/MacRuby/trunk/main.cpp
With the AOT compiler called via: rb_vm_aot_compile -> RoxorAOTCompiler::compile_main_function
and the JIT invoked from: ruby_run_node -> RoxorCompiler::compile_main_function
If I understand your question, it is what method explicitly does the compilation during JIT? That would seem to be: compile_node
* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/compiler.cpp
> Function *
> RoxorCompiler::compile_main_function(NODE *node)
> {
> current_instance_method = true;
>
> Value *val = compile_node(node);
If so, then the question becomes "Where is implemented, compile_node and does it cache pre-compiled methods"?
I don't know, but hopefully this gives you somewhere to look; or will inspire someone who knows more to provide a better answer....
-- Ernie P.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-devel/attachments/20091207/4714d6be/attachment-0001.html>
More information about the MacRuby-devel
mailing list