本文整理汇总了C++中LLVMState::end_method_update方法的典型用法代码示例。如果您正苦于以下问题:C++ LLVMState::end_method_update方法的具体用法?C++ LLVMState::end_method_update怎么用?C++ LLVMState::end_method_update使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LLVMState
的用法示例。
在下文中一共展示了LLVMState::end_method_update方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: deoptimize
// If +disable+ is set, then the method is tagged as not being
// available for JIT.
void MachineCode::deoptimize(STATE, CompiledCode* original,
jit::RuntimeDataHolder* rd,
bool disable)
{
#ifdef ENABLE_LLVM
LLVMState* ls = LLVMState::get(state);
ls->start_method_update();
bool still_others = false;
for(int i = 0; i < cMaxSpecializations; i++) {
if(!rd) {
specializations[i].class_id = 0;
specializations[i].execute = 0;
specializations[i].jit_data = 0;
} else if(specializations[i].jit_data == rd) {
specializations[i].class_id = 0;
specializations[i].execute = 0;
specializations[i].jit_data = 0;
} else if(specializations[i].jit_data) {
still_others = true;
}
}
if(!rd || original->jit_data() == rd) {
unspecialized = 0;
original->set_jit_data(0);
}
if(original->jit_data()) still_others = true;
if(!still_others) {
execute_status_ = eInterpret;
// This resets execute to use the interpreter
original->set_executor(fallback);
}
if(disable) {
execute_status_ = eJITDisable;
original->set_executor(fallback);
} else if(execute_status_ == eJITDisable && still_others) {
execute_status_ = eJIT;
}
if(original->execute == CompiledCode::specialized_executor) {
bool found = false;
for(int i = 0; i < cMaxSpecializations; i++) {
if(specializations[i].execute) found = true;
}
if(unspecialized) found = true;
if(!found) rubinius::bug("no specializations!");
}
ls->end_method_update();
#endif
}
示例2: perform
//.........这里部分代码省略.........
if(cls && !cls->nil_p()) {
spec_id = cls->class_id();
}
void* func = 0;
{
timer::Running<1000000> timer(ls_->shared().stats.jit_time_spent);
jit.compile(req);
func = jit.generate_function();
}
// We were unable to compile this function, likely
// because it's got something we don't support.
if(!func) {
if(ls_->config().jit_show_compiling) {
CompiledCode* code = req->method();
llvm::outs() << "[[[ JIT error background compiling "
<< ls_->enclosure_name(code) << "#" << ls_->symbol_debug_str(code->name())
<< (req->is_block() ? " (block)" : " (method)")
<< " ]]]\n";
}
// If someone was waiting on this, wake them up.
if(utilities::thread::Condition* cond = req->waiter()) {
cond->signal();
}
current_req_ = 0;
current_compiler_ = 0;
pending_requests_.pop_front();
delete req;
// We don't depend on the GC here, so let it run independent
// of us.
ls_->gc_independent();
continue;
}
if(show_machine_code_) {
jit.show_machine_code();
}
// If the method has had jit'ing request disabled since we started
// JIT'ing it, discard our work.
if(!req->machine_code()->jit_disabled()) {
jit::RuntimeDataHolder* rd = ctx.runtime_data_holder();
atomic::memory_barrier();
ls_->start_method_update();
if(!req->is_block()) {
if(spec_id) {
req->method()->add_specialized(spec_id, reinterpret_cast<executor>(func), rd);
} else {
req->method()->set_unspecialized(reinterpret_cast<executor>(func), rd);
}
} else {
req->method()->set_unspecialized(reinterpret_cast<executor>(func), rd);
}
req->machine_code()->clear_compiling();
// assert(req->method()->jit_data());
ls_->end_method_update();
rd->run_write_barrier(ls_->write_barrier(), req->method());
ls_->shared().stats.jitted_methods++;
if(ls_->config().jit_show_compiling) {
CompiledCode* code = req->method();
llvm::outs() << "[[[ JIT finished background compiling "
<< ls_->enclosure_name(code) << "#" << ls_->symbol_debug_str(code->name())
<< (req->is_block() ? " (block)" : " (method)")
<< " ]]]\n";
}
}
// If someone was waiting on this, wake them up.
if(utilities::thread::Condition* cond = req->waiter()) {
cond->signal();
}
current_req_ = 0;
current_compiler_ = 0;
pending_requests_.pop_front();
delete req;
// We don't depend on the GC here, so let it run independent
// of us.
ls_->gc_independent();
}
halt:
RUBINIUS_THREAD_STOP(thread_name, ls_->thread_id(), 1);
}