# HG changeset patch # User jiangli # Date 1367896278 25200 # Node ID 27d2d456cd96af6f72ff40f6cc3b912804df6359 # Parent 625ddb0052e1bd995ac2e9bfcb239c16040ace0b# Parent e60b3fce2b027f75bd9d62a46616fd53aa8f4266 Merge diff -r 625ddb0052e1 -r 27d2d456cd96 src/cpu/zero/vm/cppInterpreter_zero.cpp --- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri May 03 08:19:38 2013 -0700 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Mon May 06 20:11:18 2013 -0700 @@ -212,7 +212,13 @@ // Update the invocation counter if ((UseCompiler || CountCompiledCalls) && !method->is_synchronized()) { - InvocationCounter *counter = method->invocation_counter(); + MethodCounters* mcs = method->method_counters(); + if (mcs == NULL) { + CALL_VM_NOCHECK(mcs = InterpreterRuntime::build_method_counters(thread, method)); + if (HAS_PENDING_EXCEPTION) + goto unwind_and_return; + } + InvocationCounter *counter = mcs->invocation_counter(); counter->increment(); if (counter->reached_InvocationLimit()) { CALL_VM_NOCHECK( diff -r 625ddb0052e1 -r 27d2d456cd96 src/share/vm/interpreter/bytecodeInterpreter.cpp --- a/src/share/vm/interpreter/bytecodeInterpreter.cpp Fri May 03 08:19:38 2013 -0700 +++ b/src/share/vm/interpreter/bytecodeInterpreter.cpp Mon May 06 20:11:18 2013 -0700 @@ -32,6 +32,7 @@ #include "interpreter/interpreterRuntime.hpp" #include "memory/cardTableModRefBS.hpp" #include "memory/resourceArea.hpp" +#include "oops/methodCounters.hpp" #include "oops/objArrayKlass.hpp" #include "oops/oop.inline.hpp" #include "prims/jvmtiExport.hpp" @@ -304,11 +305,12 @@ #define METHOD istate->method() -#define INVOCATION_COUNT METHOD->invocation_counter() -#define BACKEDGE_COUNT METHOD->backedge_counter() - - -#define INCR_INVOCATION_COUNT INVOCATION_COUNT->increment() +#define GET_METHOD_COUNTERS(res) \ + res = METHOD->method_counters(); \ + if (res == NULL) { \ + CALL_VM(res = InterpreterRuntime::build_method_counters(THREAD, METHOD), handle_exception); \ + } + #define OSR_REQUEST(res, branch_pc) \ CALL_VM(res=InterpreterRuntime::frequency_counter_overflow(THREAD, branch_pc), handle_exception); /* @@ -325,10 +327,12 @@ #define DO_BACKEDGE_CHECKS(skip, branch_pc) \ if ((skip) <= 0) { \ + MethodCounters* mcs; \ + GET_METHOD_COUNTERS(mcs); \ if (UseLoopCounter) { \ bool do_OSR = UseOnStackReplacement; \ - BACKEDGE_COUNT->increment(); \ - if (do_OSR) do_OSR = BACKEDGE_COUNT->reached_InvocationLimit(); \ + mcs->backedge_counter()->increment(); \ + if (do_OSR) do_OSR = mcs->backedge_counter()->reached_InvocationLimit(); \ if (do_OSR) { \ nmethod* osr_nmethod; \ OSR_REQUEST(osr_nmethod, branch_pc); \ @@ -341,7 +345,7 @@ } \ } \ } /* UseCompiler ... */ \ - INCR_INVOCATION_COUNT; \ + mcs->invocation_counter()->increment(); \ SAFEPOINT; \ } @@ -618,11 +622,13 @@ // count invocations assert(initialized, "Interpreter not initialized"); if (_compiling) { + MethodCounters* mcs; + GET_METHOD_COUNTERS(mcs); if (ProfileInterpreter) { - METHOD->increment_interpreter_invocation_count(); + METHOD->increment_interpreter_invocation_count(THREAD); } - INCR_INVOCATION_COUNT; - if (INVOCATION_COUNT->reached_InvocationLimit()) { + mcs->invocation_counter()->increment(); + if (mcs->invocation_counter()->reached_InvocationLimit()) { CALL_VM((void)InterpreterRuntime::frequency_counter_overflow(THREAD, NULL), handle_exception); // We no longer retry on a counter overflow diff -r 625ddb0052e1 -r 27d2d456cd96 src/share/vm/oops/method.hpp --- a/src/share/vm/oops/method.hpp Fri May 03 08:19:38 2013 -0700 +++ b/src/share/vm/oops/method.hpp Mon May 06 20:11:18 2013 -0700 @@ -67,7 +67,7 @@ // | ConstMethod* (oop) | // |------------------------------------------------------| // | methodData (oop) | -// | interp_invocation_count | +// | methodCounters | // |------------------------------------------------------| // | access_flags | // | vtable_index | @@ -76,16 +76,6 @@ // |------------------------------------------------------| // | method_size | intrinsic_id| flags | // |------------------------------------------------------| -// | throwout_count | num_breakpoints | -// |------------------------------------------------------| -// | invocation_counter | -// | backedge_counter | -// |------------------------------------------------------| -// | prev_time (tiered only, 64 bit wide) | -// | | -// |------------------------------------------------------| -// | rate (tiered) | -// |------------------------------------------------------| // | code (pointer) | // | i2i (pointer) | // | adapter (pointer) |