RFR (XS): 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
Volker Simonis
volker.simonis at gmail.com
Wed Apr 3 05:06:38 PDT 2013
Hi Roland,
this issue is almost the same as:
8002087 : JSR 292: max_stack issues in interpreter code after JSR-292 merge
(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8002087)
I think besides the oop map problem (in OopMapForCacheEntry::compute_map)
your change fixes all other issues described there.
On Fri, Mar 29, 2013 at 7:22 PM, Roland Westrelin <
roland.westrelin at oracle.com> wrote:
> Thanks for reviewing this.
>
> > Good. It's time to get rid of the //6815692// stuff. The extra_stack
> variables (always zero now) can go away too.
>
> I'm not sure what to do with this:
> guarantee(!EnableInvokeDynamic, "no support yet for
> java.lang.invoke.MethodHandle"); //6815692
> //6815692//if (EnableInvokeDynamic)
> //6815692// __ inc(O3, Method::extra_stack_entries());
>
> in cppInterpreter_sparc.cpp
>
>
Well, it wouldn't work anyway if running with 'EnableInvokeDynamic'
enabled.
But you have:
1217 __ lduh(O3, in_bytes(ConstMethod::max_stack_offset()), O3);
1218 guarantee(!EnableInvokeDynamic, "no support yet for
java.lang.invoke.MethodHandle"); //6815692
1219 //6815692//if (EnableInvokeDynamic)
1220 //6815692// __ inc(O3, Method::extra_stack_entries());
and now, after your change, max_stack automatically accounts for the extra
stack entries, so I'd delete the lines:
1219 //6815692//if (EnableInvokeDynamic)
1220 //6815692// __ inc(O3, Method::extra_stack_entries());
Just for the case that somebody ever wants to implement
'EnableInvokeDynamic' for the CPP-interpreter on SPARC. Maybe you could
also remove the guarantee and hope for the best..
For our ppc-port (
http://hg.openjdk.java.net/ppc-aix-port/jdk7u/hotspot/file/tip/src/cpu/ppc/vm/cppInterpreter_ppc.cpp)
I've fixed this by inserting:
__ ppc_lhz(max_stack, method_(max_stack));
if (EnableInvokeDynamic) {
// Take into account 'extra_stack_entries' needed by method
handles (see method.hpp)
__ ppc_addi(max_stack, max_stack, methodOopDesc::extra_stack_entries());
}
but that's not necessary anymore, after your change.
> > I think extra_stack_words can be deleted, and extra_stack_entries can be
> made private to Method.
> >
> > This line of code is redundant in
> src/cpu/x86/vm/templateInterpreter_x86_{32,64}.cpp:
> > const int extra_stack = Method::extra_stack_entries();
>
> I applied Christian's suggestions and yours and found a reference to
> Method::extra_stack_entries() in c2 that I assume can be removed. Here is a
> new webrev:
>
> http://cr.openjdk.java.net/~roland/8010460/webrev.01/
>
> Roland.
You may also consider to fix another problem which only occurs if you use a
hsx24 or later with pre-hsx24 class library (i.e. if building hsx24/hsx25
with a pre-hsx24 bootstrap JDK). It is an assertion in
bytecodeInterpreter.cpp:
// We have a problem here if we are running with a pre-hsx24 JDK
(for example during bootstrap)
// because in that case, EnableInvokeDynamic is true by default
but will be later switched off
// if java_lang_invoke_MethodHandle::compute_offsets() detects
that the JDK only has the classes
// for the old JSR292 implementation.
// This leads to a situation where 'istate->_stack_limit' always
accounts for
// methodOopDesc::extra_stack_entries() because it is computed in
// CppInterpreterGenerator::generate_compute_interpreter_state()
which was generated while
// EnableInvokeDynamic was still true. On the other hand,
istate->_method->max_stack() doesn't
// account for extra_stack_entries() anymore because at the time
when it is called
// EnableInvokeDynamic was already set to false.
// So we have a second version of the assertion which handles the
case where EnableInvokeDynamic was
// switched off because of the wrong classes.
if (EnableInvokeDynamic || FLAG_IS_CMDLINE(EnableInvokeDynamic)) {
assert(labs(istate->_stack_base - istate->_stack_limit) ==
(istate->_method->max_stack() + 1), "bad stack limit");
}
else {
const int extra_stack_entries = 2; // MUST match the value in
methodOopDesc::extra_stack_entries()
assert(labs(istate->_stack_base - istate->_stack_limit) ==
(istate->_method->max_stack() + extra_stack_entries
+ 1), "bad stack limit");
}
You can see the actual patch we did at:
http://hg.openjdk.java.net/ppc-aix-port/jdk7u/hotspot/diff/61615792f0fe/src/share/vm/interpreter/bytecodeInterpreter.cpp
Regards,
Volker
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20130403/940bba24/attachment.html
More information about the hotspot-compiler-dev
mailing list