src/share/vm/compiler/compileBroker.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/compiler/compileBroker.cpp

src/share/vm/compiler/compileBroker.cpp

Print this page
rev 9032 : 8137167: JEP165: Compiler Control: Implementation task
Summary: Compiler Control JEP
Reviewed-by: roland, twisti

*** 27,36 **** --- 27,37 ---- #include "classfile/vmSymbols.hpp" #include "code/codeCache.hpp" #include "compiler/compileBroker.hpp" #include "compiler/compileLog.hpp" #include "compiler/compilerOracle.hpp" + #include "compiler/directivesParser.hpp" #include "interpreter/linkResolver.hpp" #include "memory/allocation.inline.hpp" #include "oops/methodData.hpp" #include "oops/method.hpp" #include "oops/oop.inline.hpp"
*** 195,208 **** } }; static CompilationLog* _compilation_log = NULL; ! void compileBroker_init() { if (LogEvents) { _compilation_log = new CompilationLog(); } } CompileTaskWrapper::CompileTaskWrapper(CompileTask* task) { CompilerThread* thread = CompilerThread::current(); thread->set_task(task); --- 196,217 ---- } }; static CompilationLog* _compilation_log = NULL; ! bool compileBroker_init() { if (LogEvents) { _compilation_log = new CompilationLog(); } + + // init directives stack, adding default directive + DirectivesStack::init(); + + if (DirectivesParser::has_file()) { + return DirectivesParser::parse_from_flag(); + } + return true; } CompileTaskWrapper::CompileTaskWrapper(CompileTask* task) { CompilerThread* thread = CompilerThread::current(); thread->set_task(task);
*** 1141,1165 **** (!CICompileOSR || comp == NULL || !comp->supports_osr())) { method->set_not_osr_compilable(comp_level); return true; } // The method may be explicitly excluded by the user. - bool quietly; double scale; ! if (CompilerOracle::should_exclude(method, quietly) ! || (CompilerOracle::has_option_value(method, "CompileThresholdScaling", scale) && scale == 0)) { if (!quietly) { // This does not happen quietly... ResourceMark rm; tty->print("### Excluding %s:%s", method->is_native() ? "generation of native wrapper" : "compile", (method->is_static() ? " static" : "")); method->print_short_name(tty); tty->cr(); } ! method->set_not_compilable(CompLevel_all, !quietly, "excluded by CompileCommand"); } return false; } --- 1150,1178 ---- (!CICompileOSR || comp == NULL || !comp->supports_osr())) { method->set_not_osr_compilable(comp_level); return true; } + // Breaking the abstraction - directives are only used inside a compilation otherwise. + DirectiveSet* directive = DirectivesStack::getMatchingDirective(method, comp); + bool excluded = directive->ExcludeOption; + DirectivesStack::release(directive); + // The method may be explicitly excluded by the user. double scale; ! if (excluded || (CompilerOracle::has_option_value(method, "CompileThresholdScaling", scale) && scale == 0)) { ! bool quietly = CompilerOracle::should_exclude_quietly(); if (!quietly) { // This does not happen quietly... ResourceMark rm; tty->print("### Excluding %s:%s", method->is_native() ? "generation of native wrapper" : "compile", (method->is_static() ? " static" : "")); method->print_short_name(tty); tty->cr(); } ! method->set_not_compilable(comp_level, !quietly, "excluded by CompileCommand"); } return false; }
*** 1309,1319 **** // Switch back to VM state to do compiler initialization ThreadInVMfromNative tv(thread); ResetNoHandleMark rnhm; - if (!comp->is_shark()) { // Perform per-thread and global initializations comp->initialize(); } } --- 1322,1331 ----
*** 1556,1565 **** --- 1568,1581 ---- } ttyLocker ttyl; tty->print("%s", s.as_string()); } + int DirectivesStack::_depth = 0; + CompilerDirectives* DirectivesStack::_top = NULL; + CompilerDirectives* DirectivesStack::_bottom = NULL; + // ------------------------------------------------------------------ // CompileBroker::invoke_compiler_on_method // // Compile a method. //
*** 1582,1601 **** int osr_bci = task->osr_bci(); bool is_osr = (osr_bci != standard_entry_bci); bool should_log = (thread->log() != NULL); bool should_break = false; int task_level = task->comp_level(); { // create the handle inside it's own block so it can't // accidentally be referenced once the thread transitions to // native. The NoHandleMark before the transition should catch // any cases where this occurs in the future. methodHandle method(thread, task->method()); - should_break = check_break_at(method, compile_id, is_osr); - if (should_log && !CompilerOracle::should_log(method)) { - should_log = false; - } assert(!method->is_native(), "no longer compile natives"); // Save information about this method in case of failure. set_last_compile(thread, method, is_osr, task_level); --- 1598,1621 ---- int osr_bci = task->osr_bci(); bool is_osr = (osr_bci != standard_entry_bci); bool should_log = (thread->log() != NULL); bool should_break = false; int task_level = task->comp_level(); + + // Look up matching directives + DirectiveSet* directive = DirectivesStack::getMatchingDirective(task->method(), compiler(task_level)); + + should_break = directive->BreakAtExecuteOption || task->check_break_at_flags(); + if (should_log && !directive->LogOption) { + should_log = false; + } { // create the handle inside it's own block so it can't // accidentally be referenced once the thread transitions to // native. The NoHandleMark before the transition should catch // any cases where this occurs in the future. methodHandle method(thread, task->method()); assert(!method->is_native(), "no longer compile natives"); // Save information about this method in case of failure. set_last_compile(thread, method, is_osr, task_level);
*** 1645,1655 **** MonitorLockerEx locker(Compilation_lock, Mutex::_no_safepoint_check_flag); while (WhiteBox::compilation_locked) { locker.wait(Mutex::_no_safepoint_check_flag); } } ! comp->compile_method(&ci_env, target, osr_bci); } if (!ci_env.failing() && task->code() == NULL) { //assert(false, "compiler should always document failure"); // The compiler elected, without comment, not to register a result. --- 1665,1675 ---- MonitorLockerEx locker(Compilation_lock, Mutex::_no_safepoint_check_flag); while (WhiteBox::compilation_locked) { locker.wait(Mutex::_no_safepoint_check_flag); } } ! comp->compile_method(&ci_env, target, osr_bci, directive); } if (!ci_env.failing() && task->code() == NULL) { //assert(false, "compiler should always document failure"); // The compiler elected, without comment, not to register a result.
*** 1694,1703 **** --- 1714,1724 ---- event.set_codeSize((task->code() == NULL) ? 0 : task->code()->total_size()); event.set_inlinedBytes(task->num_inlined_bytecodes()); event.commit(); } } + DirectivesStack::release(directive); pop_jni_handle_block(); methodHandle method(thread, task->method()); DTRACE_METHOD_COMPILE_END_PROBE(method, compiler_name(task_level), task->is_success());
*** 1879,1903 **** thread->set_active_handles(java_handles); compile_handles->set_pop_frame_link(NULL); JNIHandleBlock::release_block(compile_handles, thread); // may block } - - // ------------------------------------------------------------------ - // CompileBroker::check_break_at - // - // Should the compilation break at the current compilation. - bool CompileBroker::check_break_at(methodHandle method, int compile_id, bool is_osr) { - if (CICountOSR && is_osr && (compile_id == CIBreakAtOSR)) { - return true; - } else if( CompilerOracle::should_break_at(method) ) { // break when compiling - return true; - } else { - return (compile_id == CIBreakAt); - } - } - // ------------------------------------------------------------------ // CompileBroker::collect_statistics // // Collect statistics about the compilation. --- 1900,1909 ----
*** 2073,2077 **** --- 2079,2084 ---- #ifndef PRODUCT st->print_cr("Compiler thread printing unimplemented."); st->cr(); #endif } +
src/share/vm/compiler/compileBroker.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File