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/
src/cpu/x86/vm/c1_CodeStubs_x86.cpp:
Don't we also need something like this on x86 as on SPARC?
+  } else if (_id == load_mirror_id || _id == load_appendix_id) {
src/share/vm/c1/c1_GraphBuilder.cpp:
+  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?
src/share/vm/c1/c1_LIRAssembler.cpp:
+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.
src/share/vm/c1/c1_Runtime1.cpp:
+      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.
src/share/vm/c1/c1_globals.hpp:
+  develop(bool, C1PatchInvokeDynamic, true,                                 \
Do we really want to turn if off?  During development I'm sure it was helpful but after that?
src/share/vm/ci/ciEnv.cpp:
+ciInstance* ciEnv::unloaded_ciinstance() {
+  GUARDED_VM_ENTRY(return _factory->get_unloaded_object_constant();)
+}
Can we rename that method to unloaded_object_constant?
src/share/vm/c1/c1_LIR.hpp:
-      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