mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
6921352: JSR 292 needs its own deopt handler
We need to introduce a new MH deopt handler so we can easily determine if the deopt happened at a MH call site or not. Reviewed-by: never, jrose
This commit is contained in:
parent
8cc63249e9
commit
918c7a2e33
15 changed files with 253 additions and 133 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1997-2010 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,7 +107,11 @@ void RegisterMap::print() const {
|
|||
|
||||
address frame::raw_pc() const {
|
||||
if (is_deoptimized_frame()) {
|
||||
return ((nmethod*) cb())->deopt_handler_begin() - pc_return_offset;
|
||||
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;
|
||||
} else {
|
||||
return (pc() - pc_return_offset);
|
||||
}
|
||||
|
@ -269,10 +273,16 @@ void frame::deoptimize(JavaThread* thread, bool thread_is_known_safe) {
|
|||
} // NeedsDeoptSuspend
|
||||
|
||||
|
||||
address deopt = nm->deopt_handler_begin();
|
||||
// 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();
|
||||
|
||||
// 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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue