RFR (XS): 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
Christian Thalinger
christian.thalinger at oracle.com
Wed Apr 3 12:33:36 PDT 2013
On Apr 3, 2013, at 5:06 AM, Volker Simonis <volker.simonis at gmail.com> wrote:
> 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");
>
> }
Oh boy. I'm not sure if that bootstrap problem still exists. Could someone verify that?
-- Chris
> 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/cb768a39/attachment.html
More information about the hotspot-compiler-dev
mailing list