--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -357,7 +357,7 @@
}
-int LIR_Assembler::emit_exception_handler() {
+void LIR_Assembler::emit_exception_handler() {
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
@@ -373,10 +373,13 @@
if (handler_base == NULL) {
// not enough space left for the handler
bailout("exception handler overflow");
- return -1;
+ return;
}
-
+#ifdef ASSERT
int offset = code_offset();
+#endif // ASSERT
+ compilation()->offsets()->set_value(CodeOffsets::Exceptions, code_offset());
+
if (compilation()->has_exception_handlers() || compilation()->env()->jvmti_can_post_exceptions()) {
__ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type);
@@ -387,13 +390,11 @@
__ delayed()->nop();
debug_only(__ stop("should have gone to the caller");)
assert(code_offset() - offset <= exception_handler_size, "overflow");
+
__ end_a_stub();
-
- return offset;
}
-
-int LIR_Assembler::emit_deopt_handler() {
+void LIR_Assembler::emit_deopt_handler() {
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
@@ -407,18 +408,23 @@
if (handler_base == NULL) {
// not enough space left for the handler
bailout("deopt handler overflow");
- return -1;
+ return;
}
-
+#ifdef ASSERT
int offset = code_offset();
+#endif // ASSERT
+ compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset());
+
AddressLiteral deopt_blob(SharedRuntime::deopt_blob()->unpack());
+
__ JUMP(deopt_blob, G3_scratch, 0); // sethi;jmp
__ delayed()->nop();
+
assert(code_offset() - offset <= deopt_handler_size, "overflow");
+
debug_only(__ stop("should have gone to the caller");)
+
__ end_a_stub();
-
- return offset;
}
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2008 Sun Microsystems, Inc. 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
@@ -366,9 +366,8 @@
// as get_original_pc() needs correct value for unextended_sp()
if (_pc != NULL) {
_cb = CodeCache::find_blob(_pc);
- address original_pc = nmethod::get_deopt_original_pc(this);
- if (original_pc != NULL) {
- _pc = original_pc;
+ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
+ _pc = ((nmethod*)_cb)->get_original_pc(this);
_deopt_state = is_deoptimized;
} else {
_deopt_state = not_deoptimized;
@@ -520,9 +519,9 @@
_cb = CodeCache::find_blob(pc);
*O7_addr() = pc - pc_return_offset;
_cb = CodeCache::find_blob(_pc);
- address original_pc = nmethod::get_deopt_original_pc(this);
- if (original_pc != NULL) {
- assert(original_pc == _pc, "expected original to be stored before patching");
+ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
+ address orig = ((nmethod*)_cb)->get_original_pc(this);
+ assert(orig == _pc, "expected original to be stored before patching");
_deopt_state = is_deoptimized;
} else {
_deopt_state = not_deoptimized;
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -418,12 +418,13 @@
}
-int LIR_Assembler::emit_exception_handler() {
+void LIR_Assembler::emit_exception_handler() {
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
// failures when searching for the corresponding bci => add a nop
// (was bug 5/14/1999 - gri)
+
__ nop();
// generate code for exception handler
@@ -431,10 +432,13 @@
if (handler_base == NULL) {
// not enough space left for the handler
bailout("exception handler overflow");
- return -1;
+ return;
}
-
+#ifdef ASSERT
int offset = code_offset();
+#endif // ASSERT
+
+ compilation()->offsets()->set_value(CodeOffsets::Exceptions, code_offset());
// if the method does not have an exception handler, then there is
// no reason to search for one
@@ -470,19 +474,19 @@
// unwind activation and forward exception to caller
// rax,: exception
__ jump(RuntimeAddress(Runtime1::entry_for(Runtime1::unwind_exception_id)));
+
assert(code_offset() - offset <= exception_handler_size, "overflow");
+
__ end_a_stub();
-
- return offset;
}
-
-int LIR_Assembler::emit_deopt_handler() {
+void LIR_Assembler::emit_deopt_handler() {
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
// failures when searching for the corresponding bci => add a nop
// (was bug 5/14/1999 - gri)
+
__ nop();
// generate code for exception handler
@@ -490,17 +494,23 @@
if (handler_base == NULL) {
// not enough space left for the handler
bailout("deopt handler overflow");
- return -1;
+ return;
}
-
+#ifdef ASSERT
int offset = code_offset();
+#endif // ASSERT
+
+ compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset());
+
InternalAddress here(__ pc());
__ pushptr(here.addr());
+
__ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack()));
+
assert(code_offset() - offset <= deopt_handler_size, "overflow");
+
__ end_a_stub();
- return offset;
}
--- a/hotspot/src/cpu/x86/vm/frame_x86.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -222,9 +222,9 @@
}
((address *)sp())[-1] = pc;
_cb = CodeCache::find_blob(pc);
- address original_pc = nmethod::get_deopt_original_pc(this);
- if (original_pc != NULL) {
- assert(original_pc == _pc, "expected original PC to be stored before patching");
+ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
+ address orig = (((nmethod*)_cb)->get_original_pc(this));
+ assert(orig == _pc, "expected original to be stored before patching");
_deopt_state = is_deoptimized;
// leave _pc as is
} else {
@@ -323,39 +323,19 @@
return fr;
}
-
-//------------------------------------------------------------------------------
-// frame::sender_for_interpreter_frame
frame frame::sender_for_interpreter_frame(RegisterMap* map) const {
- // SP is the raw SP from the sender after adapter or interpreter
- // extension.
- intptr_t* sender_sp = this->sender_sp();
+ // sp is the raw sp from the sender after adapter or interpreter extension
+ intptr_t* sp = (intptr_t*) addr_at(sender_sp_offset);
// This is the sp before any possible extension (adapter/locals).
intptr_t* unextended_sp = interpreter_frame_sender_sp();
- // Stored FP.
- intptr_t* saved_fp = link();
-
address sender_pc = this->sender_pc();
CodeBlob* sender_cb = CodeCache::find_blob_unsafe(sender_pc);
assert(sender_cb, "sanity");
nmethod* sender_nm = sender_cb->as_nmethod_or_null();
-
- if (sender_nm != NULL) {
- // If the sender PC is a deoptimization point, get the original
- // PC. For MethodHandle call site the unextended_sp is stored in
- // saved_fp.
- if (sender_nm->is_deopt_mh_entry(sender_pc)) {
- DEBUG_ONLY(verify_deopt_mh_original_pc(sender_nm, saved_fp));
- unextended_sp = saved_fp;
- }
- else if (sender_nm->is_deopt_entry(sender_pc)) {
- DEBUG_ONLY(verify_deopt_original_pc(sender_nm, unextended_sp));
- }
- else if (sender_nm->is_method_handle_return(sender_pc)) {
- unextended_sp = saved_fp;
- }
+ if (sender_nm != NULL && sender_nm->is_method_handle_return(sender_pc)) {
+ unextended_sp = (intptr_t*) at(link_offset);
}
// The interpreter and compiler(s) always save EBP/RBP in a known
@@ -379,51 +359,40 @@
}
#endif // AMD64
}
-#endif // COMPILER2
-
- return frame(sender_sp, unextended_sp, saved_fp, sender_pc);
+#endif /* COMPILER2 */
+ return frame(sp, unextended_sp, link(), sender_pc);
}
-//------------------------------------------------------------------------------
-// frame::sender_for_compiled_frame
+//------------------------------sender_for_compiled_frame-----------------------
frame frame::sender_for_compiled_frame(RegisterMap* map) const {
assert(map != NULL, "map must be set");
+ const bool c1_compiled = _cb->is_compiled_by_c1();
// frame owned by optimizing compiler
+ intptr_t* sender_sp = NULL;
+
assert(_cb->frame_size() >= 0, "must have non-zero frame size");
- intptr_t* sender_sp = unextended_sp() + _cb->frame_size();
- intptr_t* unextended_sp = sender_sp;
+ sender_sp = unextended_sp() + _cb->frame_size();
// On Intel the return_address is always the word on the stack
address sender_pc = (address) *(sender_sp-1);
- // This is the saved value of EBP which may or may not really be an FP.
- // It is only an FP if the sender is an interpreter frame (or C1?).
- intptr_t* saved_fp = (intptr_t*) *(sender_sp - frame::sender_sp_offset);
+ // This is the saved value of ebp which may or may not really be an fp.
+ // it is only an fp if the sender is an interpreter frame (or c1?)
+
+ intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
- // If we are returning to a compiled MethodHandle call site, the
- // saved_fp will in fact be a saved value of the unextended SP. The
- // simplest way to tell whether we are returning to such a call site
- // is as follows:
+ intptr_t* unextended_sp = sender_sp;
+ // If we are returning to a compiled method handle call site,
+ // the saved_fp will in fact be a saved value of the unextended SP.
+ // The simplest way to tell whether we are returning to such a call
+ // site is as follows:
CodeBlob* sender_cb = CodeCache::find_blob_unsafe(sender_pc);
assert(sender_cb, "sanity");
nmethod* sender_nm = sender_cb->as_nmethod_or_null();
-
- if (sender_nm != NULL) {
- // If the sender PC is a deoptimization point, get the original
- // PC. For MethodHandle call site the unextended_sp is stored in
- // saved_fp.
- if (sender_nm->is_deopt_mh_entry(sender_pc)) {
- DEBUG_ONLY(verify_deopt_mh_original_pc(sender_nm, saved_fp));
- unextended_sp = saved_fp;
- }
- else if (sender_nm->is_deopt_entry(sender_pc)) {
- DEBUG_ONLY(verify_deopt_original_pc(sender_nm, unextended_sp));
- }
- else if (sender_nm->is_method_handle_return(sender_pc)) {
- unextended_sp = saved_fp;
- }
+ if (sender_nm != NULL && sender_nm->is_method_handle_return(sender_pc)) {
+ unextended_sp = saved_fp;
}
if (map->update_map()) {
@@ -434,7 +403,7 @@
if (_cb->oop_maps() != NULL) {
OopMapSet::update_register_map(this, map);
}
- // Since the prolog does the save and restore of EBP there is no oopmap
+ // Since the prolog does the save and restore of epb there is no oopmap
// for it so we must fill in its location as if there was an oopmap entry
// since if our caller was compiled code there could be live jvm state in it.
map->set_location(rbp->as_VMReg(), (address) (sender_sp - frame::sender_sp_offset));
@@ -453,9 +422,6 @@
return frame(sender_sp, unextended_sp, saved_fp, sender_pc);
}
-
-//------------------------------------------------------------------------------
-// frame::sender
frame frame::sender(RegisterMap* map) const {
// Default is we done have to follow them. The sender_for_xxx will
// update it accordingly
--- a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -35,35 +35,32 @@
_deopt_state = unknown;
}
-inline frame::frame(intptr_t* sp, intptr_t* fp, address pc) {
+inline frame:: frame(intptr_t* sp, intptr_t* fp, address pc) {
_sp = sp;
_unextended_sp = sp;
_fp = fp;
_pc = pc;
assert(pc != NULL, "no pc?");
_cb = CodeCache::find_blob(pc);
-
- address original_pc = nmethod::get_deopt_original_pc(this);
- if (original_pc != NULL) {
- _pc = original_pc;
+ _deopt_state = not_deoptimized;
+ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
+ _pc = (((nmethod*)_cb)->get_original_pc(this));
_deopt_state = is_deoptimized;
} else {
_deopt_state = not_deoptimized;
}
}
-inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc) {
+inline frame:: frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc) {
_sp = sp;
_unextended_sp = unextended_sp;
_fp = fp;
_pc = pc;
assert(pc != NULL, "no pc?");
_cb = CodeCache::find_blob(pc);
-
- address original_pc = nmethod::get_deopt_original_pc(this);
- if (original_pc != NULL) {
- _pc = original_pc;
- assert(((nmethod*)_cb)->code_contains(_pc), "original PC must be in nmethod");
+ _deopt_state = not_deoptimized;
+ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
+ _pc = (((nmethod*)_cb)->get_original_pc(this));
_deopt_state = is_deoptimized;
} else {
_deopt_state = not_deoptimized;
@@ -89,9 +86,9 @@
_cb = CodeCache::find_blob(_pc);
- address original_pc = nmethod::get_deopt_original_pc(this);
- if (original_pc != NULL) {
- _pc = original_pc;
+ _deopt_state = not_deoptimized;
+ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
+ _pc = (((nmethod*)_cb)->get_original_pc(this));
_deopt_state = is_deoptimized;
} else {
_deopt_state = not_deoptimized;
--- a/hotspot/src/share/vm/asm/codeBuffer.hpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/asm/codeBuffer.hpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2008 Sun Microsystems, Inc. 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
@@ -39,7 +39,6 @@
Dtrace_trap = OSR_Entry, // dtrace probes can never have an OSR entry so reuse it
Exceptions, // Offset where exception handler lives
Deopt, // Offset where deopt handler lives
- DeoptMH, // Offset where MethodHandle deopt handler lives
max_Entries };
// special value to note codeBlobs where profile (forte) stack walking is
@@ -52,13 +51,12 @@
public:
CodeOffsets() {
- _values[Entry ] = 0;
+ _values[Entry] = 0;
_values[Verified_Entry] = 0;
_values[Frame_Complete] = frame_never_safe;
- _values[OSR_Entry ] = 0;
- _values[Exceptions ] = -1;
- _values[Deopt ] = -1;
- _values[DeoptMH ] = -1;
+ _values[OSR_Entry] = 0;
+ _values[Exceptions] = -1;
+ _values[Deopt] = -1;
}
int value(Entries e) { return _values[e]; }
--- a/hotspot/src/share/vm/c1/c1_Compilation.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/c1/c1_Compilation.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -205,8 +205,6 @@
void Compilation::emit_code_epilog(LIR_Assembler* assembler) {
CHECK_BAILOUT();
- CodeOffsets* code_offsets = assembler->offsets();
-
// generate code or slow cases
assembler->emit_slow_case_stubs();
CHECK_BAILOUT();
@@ -215,18 +213,10 @@
assembler->emit_exception_entries(exception_info_list());
CHECK_BAILOUT();
- // Generate code for exception handler.
- code_offsets->set_value(CodeOffsets::Exceptions, assembler->emit_exception_handler());
+ // generate code for exception handler
+ assembler->emit_exception_handler();
CHECK_BAILOUT();
-
- // Generate code for deopt handler.
- code_offsets->set_value(CodeOffsets::Deopt, assembler->emit_deopt_handler());
- CHECK_BAILOUT();
-
- // Generate code for MethodHandle deopt handler. We can use the
- // same code as for the normal deopt handler, we just need a
- // different entry point address.
- code_offsets->set_value(CodeOffsets::DeoptMH, assembler->emit_deopt_handler());
+ assembler->emit_deopt_handler();
CHECK_BAILOUT();
// done
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2008 Sun Microsystems, Inc. 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
@@ -133,9 +133,9 @@
void add_call_info_here(CodeEmitInfo* info) { add_call_info(code_offset(), info); }
// code patterns
- int emit_exception_handler();
+ void emit_exception_handler();
void emit_exception_entries(ExceptionInfoList* info_list);
- int emit_deopt_handler();
+ void emit_deopt_handler();
void emit_code(BlockList* hir);
void emit_block(BlockBegin* block);
--- a/hotspot/src/share/vm/code/nmethod.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/code/nmethod.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -592,7 +592,6 @@
// values something that will never match a pc like the nmethod vtable entry
_exception_offset = 0;
_deoptimize_offset = 0;
- _deoptimize_mh_offset = 0;
_orig_pc_offset = 0;
#ifdef HAVE_DTRACE_H
_trap_offset = 0;
@@ -683,7 +682,6 @@
// values something that will never match a pc like the nmethod vtable entry
_exception_offset = 0;
_deoptimize_offset = 0;
- _deoptimize_mh_offset = 0;
_trap_offset = offsets->value(CodeOffsets::Dtrace_trap);
_orig_pc_offset = 0;
_stub_offset = data_offset();
@@ -796,7 +794,6 @@
// Exception handler and deopt handler are in the stub section
_exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions);
_deoptimize_offset = _stub_offset + offsets->value(CodeOffsets::Deopt);
- _deoptimize_mh_offset = _stub_offset + offsets->value(CodeOffsets::DeoptMH);
_consts_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->consts()->start());
_scopes_data_offset = data_offset();
_scopes_pcs_offset = _scopes_data_offset + round_to(debug_info->data_size (), oopSize);
@@ -2034,21 +2031,9 @@
guarantee(nm->_lock_count >= 0, "unmatched nmethod lock/unlock");
}
-
-// -----------------------------------------------------------------------------
-// nmethod::get_deopt_original_pc
-//
-// Return the original PC for the given PC if:
-// (a) the given PC belongs to a nmethod and
-// (b) it is a deopt PC
-address nmethod::get_deopt_original_pc(const frame* fr) {
- if (fr->cb() == NULL) return NULL;
-
- nmethod* nm = fr->cb()->as_nmethod_or_null();
- if (nm != NULL && nm->is_deopt_pc(fr->pc()))
- return nm->get_original_pc(fr);
-
- return NULL;
+bool nmethod::is_deopt_pc(address pc) {
+ bool ret = pc == deopt_handler_begin();
+ return ret;
}
@@ -2419,8 +2404,6 @@
if (block_begin == verified_entry_point()) stream->print_cr("[Verified Entry Point]");
if (block_begin == exception_begin()) stream->print_cr("[Exception Handler]");
if (block_begin == stub_begin()) stream->print_cr("[Stub Code]");
- if (block_begin == deopt_handler_begin()) stream->print_cr("[Deopt Handler Code]");
- if (block_begin == deopt_mh_handler_begin()) stream->print_cr("[Deopt MH Handler Code]");
if (block_begin == consts_begin()) stream->print_cr("[Constants]");
if (block_begin == entry_point()) {
methodHandle m = method();
--- a/hotspot/src/share/vm/code/nmethod.hpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/code/nmethod.hpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -145,12 +145,8 @@
// Offsets for different nmethod parts
int _exception_offset;
- // All deoptee's will resume execution at this location described by
- // this offset.
+ // All deoptee's will resume execution at this location described by this offset
int _deoptimize_offset;
- // All deoptee's at a MethodHandle call site will resume execution
- // at this location described by this offset.
- int _deoptimize_mh_offset;
#ifdef HAVE_DTRACE_H
int _trap_offset;
#endif // def HAVE_DTRACE_H
@@ -333,25 +329,24 @@
bool is_compiled_by_c2() const;
// boundaries for different parts
- address code_begin () const { return _entry_point; }
- address code_end () const { return header_begin() + _stub_offset ; }
- address exception_begin () const { return header_begin() + _exception_offset ; }
- address deopt_handler_begin () const { return header_begin() + _deoptimize_offset ; }
- address deopt_mh_handler_begin() const { return header_begin() + _deoptimize_mh_offset ; }
- address stub_begin () const { return header_begin() + _stub_offset ; }
- address stub_end () const { return header_begin() + _consts_offset ; }
- address consts_begin () const { return header_begin() + _consts_offset ; }
- address consts_end () const { return header_begin() + _scopes_data_offset ; }
- address scopes_data_begin () const { return header_begin() + _scopes_data_offset ; }
- address scopes_data_end () const { return header_begin() + _scopes_pcs_offset ; }
- PcDesc* scopes_pcs_begin () const { return (PcDesc*)(header_begin() + _scopes_pcs_offset ); }
- PcDesc* scopes_pcs_end () const { return (PcDesc*)(header_begin() + _dependencies_offset) ; }
- address dependencies_begin () const { return header_begin() + _dependencies_offset ; }
- address dependencies_end () const { return header_begin() + _handler_table_offset ; }
- address handler_table_begin () const { return header_begin() + _handler_table_offset ; }
- address handler_table_end () const { return header_begin() + _nul_chk_table_offset ; }
- address nul_chk_table_begin () const { return header_begin() + _nul_chk_table_offset ; }
- address nul_chk_table_end () const { return header_begin() + _nmethod_end_offset ; }
+ address code_begin () const { return _entry_point; }
+ address code_end () const { return header_begin() + _stub_offset ; }
+ address exception_begin () const { return header_begin() + _exception_offset ; }
+ address deopt_handler_begin() const { return header_begin() + _deoptimize_offset ; }
+ address stub_begin () const { return header_begin() + _stub_offset ; }
+ address stub_end () const { return header_begin() + _consts_offset ; }
+ address consts_begin () const { return header_begin() + _consts_offset ; }
+ address consts_end () const { return header_begin() + _scopes_data_offset ; }
+ address scopes_data_begin () const { return header_begin() + _scopes_data_offset ; }
+ address scopes_data_end () const { return header_begin() + _scopes_pcs_offset ; }
+ PcDesc* scopes_pcs_begin () const { return (PcDesc*)(header_begin() + _scopes_pcs_offset ); }
+ PcDesc* scopes_pcs_end () const { return (PcDesc*)(header_begin() + _dependencies_offset); }
+ address dependencies_begin () const { return header_begin() + _dependencies_offset ; }
+ address dependencies_end () const { return header_begin() + _handler_table_offset ; }
+ address handler_table_begin() const { return header_begin() + _handler_table_offset ; }
+ address handler_table_end () const { return header_begin() + _nul_chk_table_offset ; }
+ address nul_chk_table_begin() const { return header_begin() + _nul_chk_table_offset ; }
+ address nul_chk_table_end () const { return header_begin() + _nmethod_end_offset ; }
int code_size () const { return code_end () - code_begin (); }
int stub_size () const { return stub_end () - stub_begin (); }
@@ -520,7 +515,7 @@
private:
ScopeDesc* scope_desc_in(address begin, address end);
- address* orig_pc_addr(const frame* fr) { return (address*) ((address)fr->unextended_sp() + _orig_pc_offset); }
+ address* orig_pc_addr(const frame* fr ) { return (address*) ((address)fr->unextended_sp() + _orig_pc_offset); }
PcDesc* find_pc_desc_internal(address pc, bool approximate);
@@ -543,17 +538,13 @@
void copy_scopes_pcs(PcDesc* pcs, int count);
void copy_scopes_data(address buffer, int size);
- // Deopt
- // Return true is the PC is one would expect if the frame is being deopted.
- bool is_deopt_pc (address pc) { return is_deopt_entry(pc) || is_deopt_mh_entry(pc); }
- bool is_deopt_entry (address pc) { return pc == deopt_handler_begin(); }
- bool is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin(); }
+ // deopt
+ // return true is the pc is one would expect if the frame is being deopted.
+ bool is_deopt_pc(address pc);
// Accessor/mutator for the original pc of a frame before a frame was deopted.
address get_original_pc(const frame* fr) { return *orig_pc_addr(fr); }
void set_original_pc(const frame* fr, address pc) { *orig_pc_addr(fr) = pc; }
- static address get_deopt_original_pc(const frame* fr);
-
// MethodHandle
bool is_method_handle_return(address return_pc);
--- a/hotspot/src/share/vm/opto/output.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/opto/output.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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
@@ -1430,10 +1430,6 @@
_code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb));
// Emit the deopt handler code.
_code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb));
- // Emit the MethodHandle deopt handler code. We can use the same
- // code as for the normal deopt handler, we just need a different
- // entry point address.
- _code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb));
}
// One last check for failed CodeBuffer::expand:
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -235,12 +235,6 @@
assert(cb->frame_size() >= 0, "Unexpected frame size");
intptr_t* unpack_sp = stub_frame.sp() + cb->frame_size();
- // If the deopt call site is a MethodHandle invoke call site we have
- // to adjust the unpack_sp.
- nmethod* deoptee_nm = deoptee.cb()->as_nmethod_or_null();
- if (deoptee_nm != NULL && deoptee_nm->is_method_handle_return(deoptee.pc()))
- unpack_sp = deoptee.unextended_sp();
-
#ifdef ASSERT
assert(cb->is_deoptimization_stub() || cb->is_uncommon_trap_stub(), "just checking");
Events::log("fetch unroll sp " INTPTR_FORMAT, unpack_sp);
--- a/hotspot/src/share/vm/runtime/frame.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/runtime/frame.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -107,11 +107,7 @@
address frame::raw_pc() const {
if (is_deoptimized_frame()) {
- nmethod* nm = cb()->as_nmethod_or_null();
- if (nm->is_method_handle_return(pc()))
- return nm->deopt_mh_handler_begin() - pc_return_offset;
- else
- return nm->deopt_handler_begin() - pc_return_offset;
+ return ((nmethod*) cb())->deopt_handler_begin() - pc_return_offset;
} else {
return (pc() - pc_return_offset);
}
@@ -273,16 +269,10 @@
} // NeedsDeoptSuspend
- // If the call site is a MethodHandle call site use the MH deopt
- // handler.
- address deopt = nm->is_method_handle_return(pc()) ?
- nm->deopt_mh_handler_begin() :
- nm->deopt_handler_begin();
-
+ address deopt = nm->deopt_handler_begin();
// Save the original pc before we patch in the new one
nm->set_original_pc(this, pc());
patch_pc(thread, deopt);
-
#ifdef ASSERT
{
RegisterMap map(thread, false);
@@ -311,29 +301,6 @@
return result;
}
-
-//------------------------------------------------------------------------------
-// frame::verify_deopt_original_pc
-//
-// Verifies the calculated original PC of a deoptimization PC for the
-// given unextended SP. The unextended SP might also be the saved SP
-// for MethodHandle call sites.
-#if ASSERT
-void frame::verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return) {
- frame fr;
-
- // This is ugly but it's better than to change {get,set}_original_pc
- // to take an SP value as argument. And it's only a debugging
- // method anyway.
- fr._unextended_sp = unextended_sp;
-
- address original_pc = nm->get_original_pc(&fr);
- assert(nm->code_contains(original_pc), "original PC must be in nmethod");
- assert(nm->is_method_handle_return(original_pc) == is_method_handle_return, "must be");
-}
-#endif
-
-
// Note: called by profiler - NOT for current thread
frame frame::profile_find_Java_sender_frame(JavaThread *thread) {
// If we don't recognize this frame, walk back up the stack until we do
--- a/hotspot/src/share/vm/runtime/frame.hpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/runtime/frame.hpp Fri Jan 29 08:33:24 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -141,14 +141,6 @@
frame sender_for_interpreter_frame(RegisterMap* map) const;
frame sender_for_native_frame(RegisterMap* map) const;
-#if ASSERT
- // Used in frame::sender_for_{interpreter,compiled}_frame
- static void verify_deopt_original_pc( nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return = false);
- static void verify_deopt_mh_original_pc(nmethod* nm, intptr_t* unextended_sp) {
- verify_deopt_original_pc(nm, unextended_sp, true);
- }
-#endif
-
// All frames:
// A low-level interface for vframes:
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Fri Jan 29 12:13:05 2010 +0100
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Fri Jan 29 08:33:24 2010 -0800
@@ -1033,20 +1033,10 @@
address sender_pc = caller_frame.pc();
CodeBlob* sender_cb = caller_frame.cb();
nmethod* sender_nm = sender_cb->as_nmethod_or_null();
- bool is_mh_invoke_via_adapter = false; // Direct c2c call or via adapter?
- if (sender_nm != NULL && sender_nm->is_method_handle_return(sender_pc)) {
- // If the callee_target is set, then we have come here via an i2c
- // adapter.
- methodOop callee = thread->callee_target();
- if (callee != NULL) {
- assert(callee->is_method(), "sanity");
- is_mh_invoke_via_adapter = true;
- }
- }
if (caller_frame.is_interpreted_frame() ||
- caller_frame.is_entry_frame() ||
- is_mh_invoke_via_adapter) {
+ caller_frame.is_entry_frame() ||
+ (sender_nm != NULL && sender_nm->is_method_handle_return(sender_pc))) {
methodOop callee = thread->callee_target();
guarantee(callee != NULL && callee->is_method(), "bad handshake");
thread->set_vm_result(callee);
@@ -1427,7 +1417,7 @@
if (callee == cb || callee->is_adapter_blob()) {
// static call or optimized virtual
if (TraceCallFixup) {
- tty->print("fixup callsite at " INTPTR_FORMAT " to compiled code for", caller_pc);
+ tty->print("fixup callsite at " INTPTR_FORMAT " to compiled code for", caller_pc);
moop->print_short_name(tty);
tty->print_cr(" to " INTPTR_FORMAT, entry_point);
}
@@ -1443,7 +1433,7 @@
}
} else {
if (TraceCallFixup) {
- tty->print("already patched callsite at " INTPTR_FORMAT " to compiled code for", caller_pc);
+ tty->print("already patched callsite at " INTPTR_FORMAT " to compiled code for", caller_pc);
moop->print_short_name(tty);
tty->print_cr(" to " INTPTR_FORMAT, entry_point);
}