< prev index next >

src/hotspot/share/ci/ciEnv.cpp

Print this page

        

*** 897,964 **** // Check for changes during compilation (e.g. class loads, evolution, // breakpoints, call site invalidation). void ciEnv::validate_compile_task_dependencies(ciMethod* target) { if (failing()) return; // no need for further checks ! // First, check non-klass dependencies as we might return early and ! // not check klass dependencies if the system dictionary ! // modification counter hasn't changed (see below). ! for (Dependencies::DepStream deps(dependencies()); deps.next(); ) { ! if (deps.is_klass_type()) continue; // skip klass dependencies ! Klass* witness = deps.check_dependency(); ! if (witness != NULL) { ! if (deps.type() == Dependencies::call_site_target_value) { _inc_decompile_count_on_failure = false; record_failure("call site target change"); ! } else { record_failure("invalid non-klass dependency"); ! } ! return; ! } ! } ! ! // Klass dependencies must be checked when the system dictionary ! // changes. If logging is enabled all violated dependences will be ! // recorded in the log. In debug mode check dependencies even if ! // the system dictionary hasn't changed to verify that no invalid ! // dependencies were inserted. Any violated dependences in this ! // case are dumped to the tty. ! bool counter_changed = system_dictionary_modification_counter_changed(); ! ! bool verify_deps = trueInDebug; ! if (!counter_changed && !verify_deps) return; ! ! int klass_violations = 0; ! for (Dependencies::DepStream deps(dependencies()); deps.next(); ) { ! if (!deps.is_klass_type()) continue; // skip non-klass dependencies ! Klass* witness = deps.check_dependency(); ! if (witness != NULL) { ! klass_violations++; ! if (!counter_changed) { ! // Dependence failed but counter didn't change. Log a message ! // describing what failed and allow the assert at the end to ! // trigger. ! deps.print_dependency(witness); ! } else if (xtty == NULL) { ! // If we're not logging then a single violation is sufficient, ! // otherwise we want to log all the dependences which were ! // violated. ! break; ! } ! } ! } ! ! if (klass_violations != 0) { ! #ifdef ASSERT ! if (!counter_changed && !PrintCompilation) { ! // Print out the compile task that failed ! _task->print_tty(); ! } ! #endif ! assert(counter_changed, "failed dependencies, but counter didn't change"); record_failure("concurrent class loading"); } } // ------------------------------------------------------------------ // ciEnv::register_method void ciEnv::register_method(ciMethod* target, --- 897,918 ---- // Check for changes during compilation (e.g. class loads, evolution, // breakpoints, call site invalidation). void ciEnv::validate_compile_task_dependencies(ciMethod* target) { if (failing()) return; // no need for further checks ! bool counter_changed = system_dictionary_modification_counter_changed(); ! Dependencies::DepType result = dependencies()->validate_dependencies(_task, counter_changed); ! if (result != Dependencies::end_marker) { ! if (result == Dependencies::call_site_target_value) { _inc_decompile_count_on_failure = false; record_failure("call site target change"); ! } else if (Dependencies::is_klass_type(result)) { record_failure("invalid non-klass dependency"); ! } else { record_failure("concurrent class loading"); } + } } // ------------------------------------------------------------------ // ciEnv::register_method void ciEnv::register_method(ciMethod* target,
< prev index next >