mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-23 04:24:49 +02:00
Merge
This commit is contained in:
commit
5117e1a805
358 changed files with 58875 additions and 1800 deletions
|
@ -42,8 +42,11 @@
|
|||
#ifdef TARGET_ARCH_MODEL_arm
|
||||
# include "interp_masm_arm.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_ARCH_MODEL_ppc
|
||||
# include "interp_masm_ppc.hpp"
|
||||
#ifdef TARGET_ARCH_MODEL_ppc_32
|
||||
# include "interp_masm_ppc_32.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_ARCH_MODEL_ppc_64
|
||||
# include "interp_masm_ppc_64.hpp"
|
||||
#endif
|
||||
|
||||
// This file contains the platform-independent parts
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -66,27 +66,26 @@ union VMJavaVal64 {
|
|||
typedef class BytecodeInterpreter* interpreterState;
|
||||
|
||||
struct call_message {
|
||||
class Method* _callee; /* method to call during call_method request */
|
||||
address _callee_entry_point; /* address to jump to for call_method request */
|
||||
int _bcp_advance; /* size of the invoke bytecode operation */
|
||||
class Method* _callee; // method to call during call_method request
|
||||
address _callee_entry_point; // address to jump to for call_method request
|
||||
int _bcp_advance; // size of the invoke bytecode operation
|
||||
};
|
||||
|
||||
struct osr_message {
|
||||
address _osr_buf; /* the osr buffer */
|
||||
address _osr_entry; /* the entry to the osr method */
|
||||
address _osr_buf; // the osr buffer
|
||||
address _osr_entry; // the entry to the osr method
|
||||
};
|
||||
|
||||
struct osr_result {
|
||||
nmethod* nm; /* osr nmethod */
|
||||
address return_addr; /* osr blob return address */
|
||||
nmethod* nm; // osr nmethod
|
||||
address return_addr; // osr blob return address
|
||||
};
|
||||
|
||||
// Result returned to frame manager
|
||||
union frame_manager_message {
|
||||
call_message _to_call; /* describes callee */
|
||||
Bytecodes::Code _return_kind; /* i_return, a_return, ... */
|
||||
osr_message _osr; /* describes the osr */
|
||||
osr_result _osr_result; /* result of OSR request */
|
||||
call_message _to_call; // describes callee
|
||||
osr_message _osr; // describes the osr
|
||||
osr_result _osr_result; // result of OSR request
|
||||
};
|
||||
|
||||
class BytecodeInterpreter : StackObj {
|
||||
|
@ -115,7 +114,8 @@ public:
|
|||
more_monitors, // need a new monitor
|
||||
throwing_exception, // unwind stack and rethrow
|
||||
popping_frame, // unwind call and retry call
|
||||
do_osr // request this invocation be OSR's
|
||||
do_osr, // request this invocation be OSR's
|
||||
early_return // early return as commanded by jvmti
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -216,8 +216,6 @@ inline void set_osr_entry(address entry) { _result._osr._osr_entry = entry; }
|
|||
inline int bcp_advance() { return _result._to_call._bcp_advance; }
|
||||
inline void set_bcp_advance(int count) { _result._to_call._bcp_advance = count; }
|
||||
|
||||
inline void set_return_kind(Bytecodes::Code kind) { _result._return_kind = kind; }
|
||||
|
||||
inline interpreterState prev() { return _prev_link; }
|
||||
|
||||
inline intptr_t* stack() { return _stack; }
|
||||
|
|
|
@ -0,0 +1,308 @@
|
|||
/*
|
||||
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright 2012, 2013 SAP AG. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
// This file defines a set of macros which are used by the c++-interpreter
|
||||
// for updating a method's methodData object.
|
||||
|
||||
|
||||
#ifndef SHARE_VM_INTERPRETER_BYTECODEINTERPRETERPROFILING_HPP
|
||||
#define SHARE_VM_INTERPRETER_BYTECODEINTERPRETERPROFILING_HPP
|
||||
|
||||
|
||||
// Global settings /////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Enables profiling support.
|
||||
#if defined(COMPILER2)
|
||||
#define CC_INTERP_PROFILE
|
||||
#endif
|
||||
|
||||
// Enables assertions for profiling code (also works in product-builds).
|
||||
// #define CC_INTERP_PROFILE_WITH_ASSERTIONS
|
||||
|
||||
|
||||
#ifdef CC_INTERP
|
||||
|
||||
// Empty dummy implementations if profiling code is switched off. //////////////
|
||||
|
||||
#ifndef CC_INTERP_PROFILE
|
||||
|
||||
#define SET_MDX(mdx)
|
||||
|
||||
#define BI_PROFILE_GET_OR_CREATE_METHOD_DATA(exception_handler) \
|
||||
if (ProfileInterpreter) { \
|
||||
ShouldNotReachHere(); \
|
||||
}
|
||||
|
||||
#define BI_PROFILE_ALIGN_TO_CURRENT_BCI()
|
||||
|
||||
#define BI_PROFILE_UPDATE_JUMP()
|
||||
#define BI_PROFILE_UPDATE_BRANCH(is_taken)
|
||||
#define BI_PROFILE_UPDATE_RET(bci)
|
||||
#define BI_PROFILE_SUBTYPECHECK_FAILED(receiver)
|
||||
#define BI_PROFILE_UPDATE_CHECKCAST(null_seen, receiver)
|
||||
#define BI_PROFILE_UPDATE_INSTANCEOF(null_seen, receiver)
|
||||
#define BI_PROFILE_UPDATE_CALL()
|
||||
#define BI_PROFILE_UPDATE_FINALCALL()
|
||||
#define BI_PROFILE_UPDATE_VIRTUALCALL(receiver)
|
||||
#define BI_PROFILE_UPDATE_SWITCH(switch_index)
|
||||
|
||||
|
||||
#else
|
||||
|
||||
|
||||
// Non-dummy implementations ///////////////////////////////////////////////////
|
||||
|
||||
// Accessors for the current method data pointer 'mdx'.
|
||||
#define MDX() (istate->mdx())
|
||||
#define SET_MDX(mdx) \
|
||||
if (TraceProfileInterpreter) { \
|
||||
/* Let it look like TraceBytecodes' format. */ \
|
||||
tty->print_cr("[%d] %4d " \
|
||||
"mdx " PTR_FORMAT "(%d)" \
|
||||
" " \
|
||||
" \t-> " PTR_FORMAT "(%d)", \
|
||||
(int) THREAD->osthread()->thread_id(), \
|
||||
BCI(), \
|
||||
MDX(), \
|
||||
(MDX() == NULL \
|
||||
? 0 \
|
||||
: istate->method()->method_data()->dp_to_di((address)MDX())), \
|
||||
mdx, \
|
||||
istate->method()->method_data()->dp_to_di((address)mdx) \
|
||||
); \
|
||||
}; \
|
||||
istate->set_mdx(mdx);
|
||||
|
||||
|
||||
// Dumps the profiling method data for the current method.
|
||||
#ifdef PRODUCT
|
||||
#define BI_PROFILE_PRINT_METHOD_DATA()
|
||||
#else // PRODUCT
|
||||
#define BI_PROFILE_PRINT_METHOD_DATA() \
|
||||
{ \
|
||||
ttyLocker ttyl; \
|
||||
MethodData *md = istate->method()->method_data(); \
|
||||
tty->cr(); \
|
||||
tty->print("method data at mdx " PTR_FORMAT "(0) for", \
|
||||
md->data_layout_at(md->bci_to_di(0))); \
|
||||
istate->method()->print_short_name(tty); \
|
||||
tty->cr(); \
|
||||
if (md != NULL) { \
|
||||
md->print_data_on(tty); \
|
||||
address mdx = (address) MDX(); \
|
||||
if (mdx != NULL) { \
|
||||
tty->print_cr("current mdx " PTR_FORMAT "(%d)", \
|
||||
mdx, \
|
||||
istate->method()->method_data()->dp_to_di(mdx)); \
|
||||
} \
|
||||
} else { \
|
||||
tty->print_cr("no method data"); \
|
||||
} \
|
||||
}
|
||||
#endif // PRODUCT
|
||||
|
||||
|
||||
// Gets or creates the profiling method data and initializes mdx.
|
||||
#define BI_PROFILE_GET_OR_CREATE_METHOD_DATA(exception_handler) \
|
||||
if (ProfileInterpreter && MDX() == NULL) { \
|
||||
/* Mdx is not yet initialized for this activation. */ \
|
||||
MethodData *md = istate->method()->method_data(); \
|
||||
if (md == NULL) { \
|
||||
MethodCounters* mcs; \
|
||||
GET_METHOD_COUNTERS(mcs); \
|
||||
/* The profiling method data doesn't exist for this method, */ \
|
||||
/* create it if the counters have overflowed. */ \
|
||||
if (mcs->invocation_counter() \
|
||||
->reached_ProfileLimit(mcs->backedge_counter())) { \
|
||||
/* Must use CALL_VM, because an async exception may be pending. */ \
|
||||
CALL_VM((InterpreterRuntime::profile_method(THREAD)), \
|
||||
exception_handler); \
|
||||
md = istate->method()->method_data(); \
|
||||
if (md != NULL) { \
|
||||
if (TraceProfileInterpreter) { \
|
||||
BI_PROFILE_PRINT_METHOD_DATA(); \
|
||||
} \
|
||||
Method *m = istate->method(); \
|
||||
int bci = m->bci_from(pc); \
|
||||
jint di = md->bci_to_di(bci); \
|
||||
SET_MDX(md->data_layout_at(di)); \
|
||||
} \
|
||||
} \
|
||||
} else { \
|
||||
/* The profiling method data exists, align the method data pointer */ \
|
||||
/* mdx to the current bytecode index. */ \
|
||||
if (TraceProfileInterpreter) { \
|
||||
BI_PROFILE_PRINT_METHOD_DATA(); \
|
||||
} \
|
||||
SET_MDX(md->data_layout_at(md->bci_to_di(BCI()))); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
// Asserts that the current method data pointer mdx corresponds
|
||||
// to the current bytecode.
|
||||
#if defined(CC_INTERP_PROFILE_WITH_ASSERTIONS)
|
||||
#define BI_PROFILE_CHECK_MDX() \
|
||||
{ \
|
||||
MethodData *md = istate->method()->method_data(); \
|
||||
address mdx = (address) MDX(); \
|
||||
address mdx2 = (address) md->data_layout_at(md->bci_to_di(BCI())); \
|
||||
guarantee(md != NULL, "1"); \
|
||||
guarantee(mdx != NULL, "2"); \
|
||||
guarantee(mdx2 != NULL, "3"); \
|
||||
if (mdx != mdx2) { \
|
||||
BI_PROFILE_PRINT_METHOD_DATA(); \
|
||||
fatal3("invalid mdx at bci %d:" \
|
||||
" was " PTR_FORMAT \
|
||||
" but expected " PTR_FORMAT, \
|
||||
BCI(), \
|
||||
mdx, \
|
||||
mdx2); \
|
||||
} \
|
||||
}
|
||||
#else
|
||||
#define BI_PROFILE_CHECK_MDX()
|
||||
#endif
|
||||
|
||||
|
||||
// Aligns the method data pointer mdx to the current bytecode index.
|
||||
#define BI_PROFILE_ALIGN_TO_CURRENT_BCI() \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
MethodData *md = istate->method()->method_data(); \
|
||||
SET_MDX(md->data_layout_at(md->bci_to_di(BCI()))); \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for a jump.
|
||||
#define BI_PROFILE_UPDATE_JUMP() \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
JumpData::increment_taken_count_no_overflow(MDX()); \
|
||||
/* Remember last branch taken count. */ \
|
||||
mdo_last_branch_taken_count = JumpData::taken_count(MDX()); \
|
||||
SET_MDX(JumpData::advance_taken(MDX())); \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for a taken/not taken branch.
|
||||
#define BI_PROFILE_UPDATE_BRANCH(is_taken) \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
if (is_taken) { \
|
||||
BranchData::increment_taken_count_no_overflow(MDX()); \
|
||||
/* Remember last branch taken count. */ \
|
||||
mdo_last_branch_taken_count = BranchData::taken_count(MDX()); \
|
||||
SET_MDX(BranchData::advance_taken(MDX())); \
|
||||
} else { \
|
||||
BranchData::increment_not_taken_count_no_overflow(MDX()); \
|
||||
SET_MDX(BranchData::advance_not_taken(MDX())); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for a ret with given bci.
|
||||
#define BI_PROFILE_UPDATE_RET(bci) \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
MethodData *md = istate->method()->method_data(); \
|
||||
/* FIXME: there is more to do here than increment and advance(mdx)! */ \
|
||||
CounterData::increment_count_no_overflow(MDX()); \
|
||||
SET_MDX(RetData::advance(md, bci)); \
|
||||
}
|
||||
|
||||
// Decrement counter at checkcast if the subtype check fails (as template
|
||||
// interpreter does!).
|
||||
#define BI_PROFILE_SUBTYPECHECK_FAILED(receiver) \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
ReceiverTypeData::increment_receiver_count_no_overflow(MDX(), receiver); \
|
||||
ReceiverTypeData::decrement_count(MDX()); \
|
||||
}
|
||||
|
||||
// Updates profiling data for a checkcast (was a null seen? which receiver?).
|
||||
#define BI_PROFILE_UPDATE_CHECKCAST(null_seen, receiver) \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
if (null_seen) { \
|
||||
ReceiverTypeData::set_null_seen(MDX()); \
|
||||
} else { \
|
||||
/* Template interpreter doesn't increment count. */ \
|
||||
/* ReceiverTypeData::increment_count_no_overflow(MDX()); */ \
|
||||
ReceiverTypeData::increment_receiver_count_no_overflow(MDX(), receiver); \
|
||||
} \
|
||||
SET_MDX(ReceiverTypeData::advance(MDX())); \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for an instanceof (was a null seen? which receiver?).
|
||||
#define BI_PROFILE_UPDATE_INSTANCEOF(null_seen, receiver) \
|
||||
BI_PROFILE_UPDATE_CHECKCAST(null_seen, receiver)
|
||||
|
||||
|
||||
// Updates profiling data for a call.
|
||||
#define BI_PROFILE_UPDATE_CALL() \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
CounterData::increment_count_no_overflow(MDX()); \
|
||||
SET_MDX(CounterData::advance(MDX())); \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for a final call.
|
||||
#define BI_PROFILE_UPDATE_FINALCALL() \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
VirtualCallData::increment_count_no_overflow(MDX()); \
|
||||
SET_MDX(VirtualCallData::advance(MDX())); \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for a virtual call with given receiver Klass.
|
||||
#define BI_PROFILE_UPDATE_VIRTUALCALL(receiver) \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
VirtualCallData::increment_receiver_count_no_overflow(MDX(), receiver); \
|
||||
SET_MDX(VirtualCallData::advance(MDX())); \
|
||||
}
|
||||
|
||||
|
||||
// Updates profiling data for a switch (tabelswitch or lookupswitch) with
|
||||
// given taken index (-1 means default case was taken).
|
||||
#define BI_PROFILE_UPDATE_SWITCH(switch_index) \
|
||||
if (ProfileInterpreter && MDX() != NULL) { \
|
||||
BI_PROFILE_CHECK_MDX(); \
|
||||
MultiBranchData::increment_count_no_overflow(MDX(), switch_index); \
|
||||
SET_MDX(MultiBranchData::advance(MDX(), switch_index)); \
|
||||
}
|
||||
|
||||
|
||||
// The end /////////////////////////////////////////////////////////////////////
|
||||
|
||||
#endif // CC_INTERP_PROFILE
|
||||
|
||||
#endif // CC_INTERP
|
||||
|
||||
#endif // SHARE_VM_INTERPRETER_BYTECODECINTERPRETERPROFILING_HPP
|
|
@ -241,18 +241,15 @@ IRT_END
|
|||
//------------------------------------------------------------------------------------------------------------------------
|
||||
// Exceptions
|
||||
|
||||
// Assume the compiler is (or will be) interested in this event.
|
||||
// If necessary, create an MDO to hold the information, and record it.
|
||||
void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) {
|
||||
assert(ProfileTraps, "call me only if profiling");
|
||||
methodHandle trap_method(thread, method(thread));
|
||||
|
||||
void InterpreterRuntime::note_trap_inner(JavaThread* thread, int reason,
|
||||
methodHandle trap_method, int trap_bci, TRAPS) {
|
||||
if (trap_method.not_null()) {
|
||||
MethodData* trap_mdo = trap_method->method_data();
|
||||
if (trap_mdo == NULL) {
|
||||
Method::build_interpreter_method_data(trap_method, THREAD);
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
|
||||
assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())),
|
||||
"we expect only an OOM error here");
|
||||
CLEAR_PENDING_EXCEPTION;
|
||||
}
|
||||
trap_mdo = trap_method->method_data();
|
||||
|
@ -261,12 +258,42 @@ void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) {
|
|||
if (trap_mdo != NULL) {
|
||||
// Update per-method count of trap events. The interpreter
|
||||
// is updating the MDO to simulate the effect of compiler traps.
|
||||
int trap_bci = trap_method->bci_from(bcp(thread));
|
||||
Deoptimization::update_method_data_from_interpreter(trap_mdo, trap_bci, reason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Assume the compiler is (or will be) interested in this event.
|
||||
// If necessary, create an MDO to hold the information, and record it.
|
||||
void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) {
|
||||
assert(ProfileTraps, "call me only if profiling");
|
||||
methodHandle trap_method(thread, method(thread));
|
||||
int trap_bci = trap_method->bci_from(bcp(thread));
|
||||
note_trap_inner(thread, reason, trap_method, trap_bci, THREAD);
|
||||
}
|
||||
|
||||
#ifdef CC_INTERP
|
||||
// As legacy note_trap, but we have more arguments.
|
||||
IRT_ENTRY(void, InterpreterRuntime::note_trap(JavaThread* thread, int reason, Method *method, int trap_bci))
|
||||
methodHandle trap_method(method);
|
||||
note_trap_inner(thread, reason, trap_method, trap_bci, THREAD);
|
||||
IRT_END
|
||||
|
||||
// Class Deoptimization is not visible in BytecodeInterpreter, so we need a wrapper
|
||||
// for each exception.
|
||||
void InterpreterRuntime::note_nullCheck_trap(JavaThread* thread, Method *method, int trap_bci)
|
||||
{ if (ProfileTraps) note_trap(thread, Deoptimization::Reason_null_check, method, trap_bci); }
|
||||
void InterpreterRuntime::note_div0Check_trap(JavaThread* thread, Method *method, int trap_bci)
|
||||
{ if (ProfileTraps) note_trap(thread, Deoptimization::Reason_div0_check, method, trap_bci); }
|
||||
void InterpreterRuntime::note_rangeCheck_trap(JavaThread* thread, Method *method, int trap_bci)
|
||||
{ if (ProfileTraps) note_trap(thread, Deoptimization::Reason_range_check, method, trap_bci); }
|
||||
void InterpreterRuntime::note_classCheck_trap(JavaThread* thread, Method *method, int trap_bci)
|
||||
{ if (ProfileTraps) note_trap(thread, Deoptimization::Reason_class_check, method, trap_bci); }
|
||||
void InterpreterRuntime::note_arrayCheck_trap(JavaThread* thread, Method *method, int trap_bci)
|
||||
{ if (ProfileTraps) note_trap(thread, Deoptimization::Reason_array_check, method, trap_bci); }
|
||||
#endif // CC_INTERP
|
||||
|
||||
|
||||
static Handle get_preinitialized_exception(Klass* k, TRAPS) {
|
||||
// get klass
|
||||
InstanceKlass* klass = InstanceKlass::cast(k);
|
||||
|
|
|
@ -66,9 +66,15 @@ class InterpreterRuntime: AllStatic {
|
|||
|
||||
static ConstantPoolCacheEntry* cache_entry_at(JavaThread *thread, int i) { return method(thread)->constants()->cache()->entry_at(i); }
|
||||
static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return cache_entry_at(thread, Bytes::get_native_u2(bcp(thread) + 1)); }
|
||||
static void note_trap_inner(JavaThread* thread, int reason,
|
||||
methodHandle trap_method, int trap_bci, TRAPS);
|
||||
static void note_trap(JavaThread *thread, int reason, TRAPS);
|
||||
#ifdef CC_INTERP
|
||||
// Profile traps in C++ interpreter.
|
||||
static void note_trap(JavaThread* thread, int reason, Method *method, int trap_bci);
|
||||
#endif // CC_INTERP
|
||||
|
||||
// Inner work method for Interpreter's frequency counter overflow
|
||||
// Inner work method for Interpreter's frequency counter overflow.
|
||||
static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp);
|
||||
|
||||
public:
|
||||
|
@ -100,6 +106,17 @@ class InterpreterRuntime: AllStatic {
|
|||
#endif
|
||||
static void throw_pending_exception(JavaThread* thread);
|
||||
|
||||
#ifdef CC_INTERP
|
||||
// Profile traps in C++ interpreter.
|
||||
static void note_nullCheck_trap (JavaThread* thread, Method *method, int trap_bci);
|
||||
static void note_div0Check_trap (JavaThread* thread, Method *method, int trap_bci);
|
||||
static void note_rangeCheck_trap(JavaThread* thread, Method *method, int trap_bci);
|
||||
static void note_classCheck_trap(JavaThread* thread, Method *method, int trap_bci);
|
||||
static void note_arrayCheck_trap(JavaThread* thread, Method *method, int trap_bci);
|
||||
// A dummy for makros that shall not profile traps.
|
||||
static void note_no_trap(JavaThread* thread, Method *method, int trap_bci) {}
|
||||
#endif // CC_INTERP
|
||||
|
||||
// Statics & fields
|
||||
static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode);
|
||||
|
||||
|
|
|
@ -99,16 +99,24 @@ class InvocationCounter VALUE_OBJ_CLASS_SPEC {
|
|||
int get_BackwardBranchLimit() const { return InterpreterBackwardBranchLimit >> number_of_noncount_bits; }
|
||||
int get_ProfileLimit() const { return InterpreterProfileLimit >> number_of_noncount_bits; }
|
||||
|
||||
#ifdef CC_INTERP
|
||||
// Test counter using scaled limits like the asm interpreter would do rather than doing
|
||||
// the shifts to normalize the counter.
|
||||
|
||||
bool reached_InvocationLimit() const { return _counter >= (unsigned int) InterpreterInvocationLimit; }
|
||||
bool reached_BackwardBranchLimit() const { return _counter >= (unsigned int) InterpreterBackwardBranchLimit; }
|
||||
|
||||
// Do this just like asm interpreter does for max speed
|
||||
bool reached_ProfileLimit(InvocationCounter *back_edge_count) const {
|
||||
return (_counter && count_mask) + back_edge_count->_counter >= (unsigned int) InterpreterProfileLimit;
|
||||
// Checks sum of invocation_counter and backedge_counter as the template interpreter does.
|
||||
bool reached_InvocationLimit(InvocationCounter *back_edge_count) const {
|
||||
return (_counter & count_mask) + (back_edge_count->_counter & count_mask) >=
|
||||
(unsigned int) InterpreterInvocationLimit;
|
||||
}
|
||||
bool reached_BackwardBranchLimit(InvocationCounter *back_edge_count) const {
|
||||
return (_counter & count_mask) + (back_edge_count->_counter & count_mask) >=
|
||||
(unsigned int) InterpreterBackwardBranchLimit;
|
||||
}
|
||||
// Do this just like asm interpreter does for max speed.
|
||||
bool reached_ProfileLimit(InvocationCounter *back_edge_count) const {
|
||||
return (_counter & count_mask) + (back_edge_count->_counter & count_mask) >=
|
||||
(unsigned int) InterpreterProfileLimit;
|
||||
}
|
||||
#endif // CC_INTERP
|
||||
|
||||
void increment() { _counter += count_increment; }
|
||||
|
||||
|
|
|
@ -40,8 +40,11 @@
|
|||
#ifdef TARGET_ARCH_MODEL_arm
|
||||
# include "interp_masm_arm.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_ARCH_MODEL_ppc
|
||||
# include "interp_masm_ppc.hpp"
|
||||
#ifdef TARGET_ARCH_MODEL_ppc_32
|
||||
# include "interp_masm_ppc_32.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_ARCH_MODEL_ppc_64
|
||||
# include "interp_masm_ppc_64.hpp"
|
||||
#endif
|
||||
|
||||
#ifndef CC_INTERP
|
||||
|
@ -370,8 +373,8 @@ class TemplateTable: AllStatic {
|
|||
#ifdef TARGET_ARCH_MODEL_arm
|
||||
# include "templateTable_arm.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_ARCH_MODEL_ppc
|
||||
# include "templateTable_ppc.hpp"
|
||||
#ifdef TARGET_ARCH_MODEL_ppc_32
|
||||
# include "templateTable_ppc_32.hpp"
|
||||
#endif
|
||||
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue