void set_parent_info(JITMethodInfo& info) { parent_info_ = &info; vm_ = info.vm(); out_args_ = info.out_args(); counter_ = info.counter(); set_function(info.function()); }
JITMethodInfo* home_info() { JITMethodInfo* nfo = creator_info_; if(!nfo) return 0; while(JITMethodInfo* nxt = nfo->creator_info()) { nfo = nxt; } return nfo; }
llvm::Value* top_parent_call_frame() { if(!parent_info_) return call_frame(); JITMethodInfo* info = parent_info_; while(info->parent_info()) { info = info->parent_info(); } return info->call_frame(); }
llvm::Value* parent_call_frame() { if(parent_info_) { return parent_info_->call_frame(); } return 0; }
void Compiler::compile_builder(JITMethodInfo& info, jit::Builder& work) { function_ = info.function(); if(!work.generate_body()) { function_ = NULL; // This is too noisy to report // llvm::outs() << "not supported yet.\n"; return; } // Hook up the return pad and return phi. work.generate_hard_return(); }
void Compiler::compile_builder(jit::Context& ctx, LLVMState* ls, JITMethodInfo& info, jit::Builder& work) { llvm::Function* func = info.function(); if(!work.generate_body()) { function_ = NULL; // This is too noisy to report // llvm::outs() << "not supported yet.\n"; return; } // Hook up the return pad and return phi. work.generate_hard_return(); if(ls->jit_dump_code() & cSimple) { llvm::outs() << "[[[ LLVM Simple IR ]]]\n"; llvm::outs() << *func << "\n"; } std::vector<BasicBlock*> to_remove; bool Broken = false; for(Function::iterator I = func->begin(), E = func->end(); I != E; ++I) { if(I->empty()) { BasicBlock& bb = *I; // No one jumps to it.... if(llvm::pred_begin(&bb) == llvm::pred_end(&bb)) { to_remove.push_back(&bb); } else { llvm::outs() << "Basic Block is empty and used!\n"; } } else if(!I->back().isTerminator()) { llvm::errs() << "Basic Block does not have terminator!\n"; llvm::errs() << *I << "\n"; llvm::errs() << "\n"; Broken = true; } } for(std::vector<BasicBlock*>::iterator i = to_remove.begin(); i != to_remove.end(); ++i) { (*i)->eraseFromParent(); } if(Broken or llvm::verifyFunction(*func, PrintMessageAction)) { llvm::outs() << "ERROR: complication error detected.\n"; llvm::outs() << "ERROR: Please report the above message and the\n"; llvm::outs() << " code below to http://github.com/rubinius/rubinius/issues\n"; llvm::outs() << *func << "\n"; function_ = NULL; return; } ls->passes()->run(*func); if(ls->jit_dump_code() & cOptimized) { llvm::outs() << "[[[ LLVM Optimized IR: " << ls->symbol_cstr(info.method()->name()) << " ]]]\n"; llvm::outs() << *func << "\n"; } function_ = func; generate_function(ls); // Inject the RuntimeData objects used into the original CompiledMethod // Do this way after we've validated the IR so things are consistent. ctx.runtime_data_holder()->set_function(func, mci_->address(), mci_->size()); info.method()->set_jit_data(ctx.runtime_data_holder()); ls->shared().om->add_code_resource(ctx.runtime_data_holder()); }