8047362: Add a version of CompiledIC_at that doesn't create a new RelocIterator
Reviewed-by: iveresov, mgerdin
--- a/hotspot/src/share/vm/code/codeCache.cpp Thu Jun 26 13:30:43 2014 -0700
+++ b/hotspot/src/share/vm/code/codeCache.cpp Tue Jul 01 09:03:55 2014 +0200
@@ -488,7 +488,7 @@
while(iter.next()) {
if (iter.type() == relocInfo::virtual_call_type) {
if (CompiledIC::is_icholder_call_site(iter.virtual_call_reloc())) {
- CompiledIC *ic = CompiledIC_at(iter.reloc());
+ CompiledIC *ic = CompiledIC_at(&iter);
if (TraceCompiledIC) {
tty->print("noticed icholder " INTPTR_FORMAT " ", p2i(ic->cached_icholder()));
ic->print();
--- a/hotspot/src/share/vm/code/compiledIC.cpp Thu Jun 26 13:30:43 2014 -0700
+++ b/hotspot/src/share/vm/code/compiledIC.cpp Tue Jul 01 09:03:55 2014 +0200
@@ -159,10 +159,24 @@
//-----------------------------------------------------------------------------
// High-level access to an inline cache. Guaranteed to be MT-safe.
+void CompiledIC::initialize_from_iter(RelocIterator* iter) {
+ assert(iter->addr() == _ic_call->instruction_address(), "must find ic_call");
+
+ if (iter->type() == relocInfo::virtual_call_type) {
+ virtual_call_Relocation* r = iter->virtual_call_reloc();
+ _is_optimized = false;
+ _value = nativeMovConstReg_at(r->cached_value());
+ } else {
+ assert(iter->type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
+ _is_optimized = true;
+ _value = NULL;
+ }
+}
+
CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
: _ic_call(call)
{
- address ic_call = call->instruction_address();
+ address ic_call = _ic_call->instruction_address();
assert(ic_call != NULL, "ic_call address must be set");
assert(nm != NULL, "must pass nmethod");
@@ -173,15 +187,21 @@
bool ret = iter.next();
assert(ret == true, "relocInfo must exist at this address");
assert(iter.addr() == ic_call, "must find ic_call");
- if (iter.type() == relocInfo::virtual_call_type) {
- virtual_call_Relocation* r = iter.virtual_call_reloc();
- _is_optimized = false;
- _value = nativeMovConstReg_at(r->cached_value());
- } else {
- assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
- _is_optimized = true;
- _value = NULL;
- }
+
+ initialize_from_iter(&iter);
+}
+
+CompiledIC::CompiledIC(RelocIterator* iter)
+ : _ic_call(nativeCall_at(iter->addr()))
+{
+ address ic_call = _ic_call->instruction_address();
+
+ nmethod* nm = iter->code();
+ assert(ic_call != NULL, "ic_call address must be set");
+ assert(nm != NULL, "must pass nmethod");
+ assert(nm->contains(ic_call), "must be in nmethod");
+
+ initialize_from_iter(iter);
}
bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS) {
--- a/hotspot/src/share/vm/code/compiledIC.hpp Thu Jun 26 13:30:43 2014 -0700
+++ b/hotspot/src/share/vm/code/compiledIC.hpp Tue Jul 01 09:03:55 2014 +0200
@@ -150,6 +150,9 @@
bool _is_optimized; // an optimized virtual call (i.e., no compiled IC)
CompiledIC(nmethod* nm, NativeCall* ic_call);
+ CompiledIC(RelocIterator* iter);
+
+ void initialize_from_iter(RelocIterator* iter);
static bool is_icholder_entry(address entry);
@@ -183,6 +186,7 @@
friend CompiledIC* CompiledIC_before(nmethod* nm, address return_addr);
friend CompiledIC* CompiledIC_at(nmethod* nm, address call_site);
friend CompiledIC* CompiledIC_at(Relocation* call_site);
+ friend CompiledIC* CompiledIC_at(RelocIterator* reloc_iter);
// This is used to release CompiledICHolder*s from nmethods that
// are about to be freed. The callsite might contain other stale
@@ -263,6 +267,13 @@
return c_ic;
}
+inline CompiledIC* CompiledIC_at(RelocIterator* reloc_iter) {
+ assert(reloc_iter->type() == relocInfo::virtual_call_type ||
+ reloc_iter->type() == relocInfo::opt_virtual_call_type, "wrong reloc. info");
+ CompiledIC* c_ic = new CompiledIC(reloc_iter);
+ c_ic->verify();
+ return c_ic;
+}
//-----------------------------------------------------------------------------
// The CompiledStaticCall represents a call to a static method in the compiled
--- a/hotspot/src/share/vm/code/nmethod.cpp Thu Jun 26 13:30:43 2014 -0700
+++ b/hotspot/src/share/vm/code/nmethod.cpp Tue Jul 01 09:03:55 2014 +0200
@@ -1146,7 +1146,7 @@
switch(iter.type()) {
case relocInfo::virtual_call_type:
case relocInfo::opt_virtual_call_type: {
- CompiledIC *ic = CompiledIC_at(iter.reloc());
+ CompiledIC *ic = CompiledIC_at(&iter);
// Ok, to lookup references to zombies here
CodeBlob *cb = CodeCache::find_blob_unsafe(ic->ic_destination());
if( cb != NULL && cb->is_nmethod() ) {
@@ -1632,7 +1632,7 @@
RelocIterator iter(this, low_boundary);
while(iter.next()) {
if (iter.type() == relocInfo::virtual_call_type) {
- CompiledIC *ic = CompiledIC_at(iter.reloc());
+ CompiledIC *ic = CompiledIC_at(&iter);
if (ic->is_icholder_call()) {
// The only exception is compiledICHolder oops which may
// yet be marked below. (We check this further below).
@@ -1741,7 +1741,7 @@
// compiled code is maintaining a link to dead metadata.
address static_call_addr = NULL;
if (iter.type() == relocInfo::opt_virtual_call_type) {
- CompiledIC* cic = CompiledIC_at(iter.reloc());
+ CompiledIC* cic = CompiledIC_at(&iter);
if (!cic->is_call_to_interpreted()) {
static_call_addr = iter.addr();
}
@@ -1793,7 +1793,7 @@
}
} else if (iter.type() == relocInfo::virtual_call_type) {
// Check compiledIC holders associated with this nmethod
- CompiledIC *ic = CompiledIC_at(iter.reloc());
+ CompiledIC *ic = CompiledIC_at(&iter);
if (ic->is_icholder_call()) {
CompiledICHolder* cichk = ic->cached_icholder();
f(cichk->holder_method());
@@ -2922,7 +2922,7 @@
case relocInfo::virtual_call_type:
case relocInfo::opt_virtual_call_type: {
VerifyMutexLocker mc(CompiledIC_lock);
- CompiledIC_at(iter.reloc())->print();
+ CompiledIC_at(&iter)->print();
break;
}
case relocInfo::static_call_type: