# HG changeset patch # User iveresov # Date 1410468964 0 # Node ID a98dd542cd25a58c26f5d8adbe57f26d4145fc82 # Parent 64156d22e49d98199c2e8f4ec9133ee9be869dac# Parent 0d78074d2444aaa1a27b8034beb901762ef2cf8a Merge diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/classfile/systemDictionary.cpp --- a/src/share/vm/classfile/systemDictionary.cpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/classfile/systemDictionary.cpp Thu Sep 11 20:56:04 2014 +0000 @@ -51,6 +51,7 @@ #include "oops/typeArrayKlass.hpp" #include "prims/jvmtiEnvBase.hpp" #include "prims/methodHandles.hpp" +#include "runtime/arguments.hpp" #include "runtime/biasedLocking.hpp" #include "runtime/fieldType.hpp" #include "runtime/handles.inline.hpp" @@ -2277,7 +2278,11 @@ m = Method::make_method_handle_intrinsic(iid, signature, CHECK_(empty)); CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_highest_tier, methodHandle(), CompileThreshold, "MH", CHECK_(empty)); - + // Check if we need to have compiled code but we don't. + if (!Arguments::is_interpreter_only() && !m->has_compiled_code()) { + THROW_MSG_(vmSymbols::java_lang_VirtualMachineError(), + "out of space in CodeCache for method handle intrinsic", empty); + } // Now grab the lock. We might have to throw away the new method, // if a racing thread has managed to install one at the same time. { @@ -2291,7 +2296,7 @@ } assert(spe != NULL && spe->method() != NULL, ""); - assert(!UseCompiler || (spe->method()->has_compiled_code() && + assert(Arguments::is_interpreter_only() || (spe->method()->has_compiled_code() && spe->method()->code()->entry_point() == spe->method()->from_compiled_entry()), "MH intrinsic invariant"); return spe->method(); diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/oops/method.cpp --- a/src/share/vm/oops/method.cpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/oops/method.cpp Thu Sep 11 20:56:04 2014 +0000 @@ -1636,34 +1636,34 @@ } int Method::highest_comp_level() const { - const MethodData* mdo = method_data(); - if (mdo != NULL) { - return mdo->highest_comp_level(); + const MethodCounters* mcs = method_counters(); + if (mcs != NULL) { + return mcs->highest_comp_level(); } else { return CompLevel_none; } } int Method::highest_osr_comp_level() const { - const MethodData* mdo = method_data(); - if (mdo != NULL) { - return mdo->highest_osr_comp_level(); + const MethodCounters* mcs = method_counters(); + if (mcs != NULL) { + return mcs->highest_osr_comp_level(); } else { return CompLevel_none; } } void Method::set_highest_comp_level(int level) { - MethodData* mdo = method_data(); - if (mdo != NULL) { - mdo->set_highest_comp_level(level); + MethodCounters* mcs = method_counters(); + if (mcs != NULL) { + mcs->set_highest_comp_level(level); } } void Method::set_highest_osr_comp_level(int level) { - MethodData* mdo = method_data(); - if (mdo != NULL) { - mdo->set_highest_osr_comp_level(level); + MethodCounters* mcs = method_counters(); + if (mcs != NULL) { + mcs->set_highest_osr_comp_level(level); } } diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/oops/methodCounters.cpp --- a/src/share/vm/oops/methodCounters.cpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/oops/methodCounters.cpp Thu Sep 11 20:56:04 2014 +0000 @@ -34,4 +34,40 @@ backedge_counter()->reset(); set_interpreter_throwout_count(0); set_interpreter_invocation_count(0); +#ifdef TIERED + set_prev_time(0); + set_rate(0); + set_highest_comp_level(0); + set_highest_osr_comp_level(0); +#endif } + + +int MethodCounters::highest_comp_level() const { +#ifdef TIERED + return _highest_comp_level; +#else + return CompLevel_none; +#endif +} + +void MethodCounters::set_highest_comp_level(int level) { +#ifdef TIERED + _highest_comp_level = level; +#endif +} + +int MethodCounters::highest_osr_comp_level() const { +#ifdef TIERED + return _highest_osr_comp_level; +#else + return CompLevel_none; +#endif +} + +void MethodCounters::set_highest_osr_comp_level(int level) { +#ifdef TIERED + _highest_osr_comp_level = level; +#endif +} + diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/oops/methodCounters.hpp --- a/src/share/vm/oops/methodCounters.hpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/oops/methodCounters.hpp Thu Sep 11 20:56:04 2014 +0000 @@ -39,6 +39,8 @@ #ifdef TIERED float _rate; // Events (invocation and backedge counter increments) per millisecond + u1 _highest_comp_level; // Highest compile level this method has ever seen. + u1 _highest_osr_comp_level; // Same for OSR level jlong _prev_time; // Previous time the rate was acquired #endif @@ -47,6 +49,8 @@ _number_of_breakpoints(0) #ifdef TIERED , _rate(0), + _highest_comp_level(0), + _highest_osr_comp_level(0), _prev_time(0) #endif { @@ -100,6 +104,11 @@ void set_rate(float rate) { _rate = rate; } #endif + int highest_comp_level() const; + void set_highest_comp_level(int level); + int highest_osr_comp_level() const; + void set_highest_osr_comp_level(int level); + // invocation counter InvocationCounter* invocation_counter() { return &_invocation_counter; } InvocationCounter* backedge_counter() { return &_backedge_counter; } diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/oops/methodData.cpp --- a/src/share/vm/oops/methodData.cpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/oops/methodData.cpp Thu Sep 11 20:56:04 2014 +0000 @@ -1153,8 +1153,6 @@ _backedge_counter_start = 0; _num_loops = 0; _num_blocks = 0; - _highest_comp_level = 0; - _highest_osr_comp_level = 0; _would_profile = true; #if INCLUDE_RTM_OPT diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/oops/methodData.hpp --- a/src/share/vm/oops/methodData.hpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/oops/methodData.hpp Thu Sep 11 20:56:04 2014 +0000 @@ -2098,10 +2098,6 @@ // time with C1. It is used to determine if method is trivial. short _num_loops; short _num_blocks; - // Highest compile level this method has ever seen. - u1 _highest_comp_level; - // Same for OSR level - u1 _highest_osr_comp_level; // Does this method contain anything worth profiling? bool _would_profile; @@ -2275,11 +2271,6 @@ void set_would_profile(bool p) { _would_profile = p; } bool would_profile() const { return _would_profile; } - int highest_comp_level() const { return _highest_comp_level; } - void set_highest_comp_level(int level) { _highest_comp_level = level; } - int highest_osr_comp_level() const { return _highest_osr_comp_level; } - void set_highest_osr_comp_level(int level) { _highest_osr_comp_level = level; } - int num_loops() const { return _num_loops; } void set_num_loops(int n) { _num_loops = n; } int num_blocks() const { return _num_blocks; } diff -r 64156d22e49d -r a98dd542cd25 src/share/vm/runtime/arguments.hpp --- a/src/share/vm/runtime/arguments.hpp Thu Sep 11 11:55:30 2014 -0700 +++ b/src/share/vm/runtime/arguments.hpp Thu Sep 11 20:56:04 2014 +0000 @@ -601,7 +601,9 @@ static void fix_appclasspath(); // Operation modi - static Mode mode() { return _mode; } + static Mode mode() { return _mode; } + static bool is_interpreter_only() { return mode() == _int; } + // Utility: copies src into buf, replacing "%%" with "%" and "%p" with pid. static bool copy_expand_pid(const char* src, size_t srclen, char* buf, size_t buflen);