提交 9948d281 编写于 作者: I iveresov

Merge

......@@ -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 @@ methodHandle SystemDictionary::find_method_handle_intrinsic(vmIntrinsics::ID iid
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 @@ methodHandle SystemDictionary::find_method_handle_intrinsic(vmIntrinsics::ID iid
}
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();
......
......@@ -1636,34 +1636,34 @@ int Method::backedge_count() {
}
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);
}
}
......
......@@ -34,4 +34,40 @@ void MethodCounters::clear_counters() {
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
}
......@@ -39,6 +39,8 @@ class MethodCounters: public MetaspaceObj {
#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 @@ class MethodCounters: public MetaspaceObj {
_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 @@ class MethodCounters: public MetaspaceObj {
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; }
......
......@@ -1153,8 +1153,6 @@ void MethodData::init() {
_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
......
......@@ -2098,10 +2098,6 @@ private:
// 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 @@ public:
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; }
......
......@@ -601,7 +601,9 @@ class Arguments : AllStatic {
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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册