RFR(M) 7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked

Christian Thalinger christian.thalinger at oracle.com
Tue May 28 10:32:31 PDT 2013

On May 28, 2013, at 8:23 AM, Roland Westrelin <roland.westrelin at oracle.com> wrote:

> C1 bails out when compiling an invokedynamic/invokehandle that cannot be linked because it cannot determine whether there's an appendix argument and if there is one, what it is. C1 should use patching instead: prepare the instructions to load an unknown appendix, call the runtime, do the call resolution, backpatch the runtime call with the instructions that load the correct appendix.
> http://cr.openjdk.java.net/~roland/7199175/webrev.00/


Don't we also need something like this on x86 as on SPARC?

+  } else if (_id == load_mirror_id || _id == load_appendix_id) {


+  Values* args = state()->pop_arguments(target->arg_size_no_receiver() + extra_arg);

Could you rename extra_arg to maybe unlinked_appendix_arg or patching_appendix_arg?


+PatchingStub::PatchID LIR_Assembler::jobject2reg_patching_id(CodeEmitInfo* info) {

I don't think that's a good method name.  It does not produce any to-register moves; it only returns an id.


+      default: Unimplemented();

A fatal would be better; there is nothing to be implemented here.  In general, we should not add new ShouldNotReachHere or Unimplemented calls.  Adding fatals with a useful message is the preferred way.


+  develop(bool, C1PatchInvokeDynamic, true,                                 \

Do we really want to turn if off?  During development I'm sure it was helpful but after that?


+ciInstance* ciEnv::unloaded_ciinstance() {
+  GUARDED_VM_ENTRY(return _factory->get_unloaded_object_constant();)

Can we rename that method to unloaded_object_constant?


-      is_invokedynamic()  // An invokedynamic is always a MethodHandle call site.

Why did you remove this?  Did it cause problems?

-- Chris

> Roland.

More information about the hotspot-compiler-dev mailing list