39 #endif |
39 #endif |
40 #ifdef COMPILER2 |
40 #ifdef COMPILER2 |
41 #include "opto/runtime.hpp" |
41 #include "opto/runtime.hpp" |
42 #endif |
42 #endif |
43 |
43 |
44 DeoptimizationBlob *SharedRuntime::_deopt_blob; |
44 #define __ masm-> |
45 #ifdef COMPILER2 |
|
46 UncommonTrapBlob *SharedRuntime::_uncommon_trap_blob; |
|
47 ExceptionBlob *OptoRuntime::_exception_blob; |
|
48 #endif // COMPILER2 |
|
49 |
|
50 SafepointBlob *SharedRuntime::_polling_page_safepoint_handler_blob; |
|
51 SafepointBlob *SharedRuntime::_polling_page_return_handler_blob; |
|
52 RuntimeStub* SharedRuntime::_wrong_method_blob; |
|
53 RuntimeStub* SharedRuntime::_ic_miss_blob; |
|
54 RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob; |
|
55 RuntimeStub* SharedRuntime::_resolve_virtual_call_blob; |
|
56 RuntimeStub* SharedRuntime::_resolve_static_call_blob; |
|
57 |
45 |
58 const int StackAlignmentInSlots = StackAlignmentInBytes / VMRegImpl::stack_slot_size; |
46 const int StackAlignmentInSlots = StackAlignmentInBytes / VMRegImpl::stack_slot_size; |
59 |
|
60 #define __ masm-> |
|
61 |
47 |
62 class SimpleRuntimeFrame { |
48 class SimpleRuntimeFrame { |
63 |
49 |
64 public: |
50 public: |
65 |
51 |
2528 uint SharedRuntime::out_preserve_stack_slots() { |
2514 uint SharedRuntime::out_preserve_stack_slots() { |
2529 return 0; |
2515 return 0; |
2530 } |
2516 } |
2531 |
2517 |
2532 |
2518 |
2533 //----------------------------generate_ricochet_blob--------------------------- |
|
2534 void SharedRuntime::generate_ricochet_blob() { |
|
2535 if (!EnableInvokeDynamic) return; // leave it as a null |
|
2536 |
|
2537 // allocate space for the code |
|
2538 ResourceMark rm; |
|
2539 // setup code generation tools |
|
2540 CodeBuffer buffer("ricochet_blob", 512, 512); |
|
2541 MacroAssembler* masm = new MacroAssembler(&buffer); |
|
2542 |
|
2543 int frame_size_in_words = -1, bounce_offset = -1, exception_offset = -1; |
|
2544 MethodHandles::RicochetFrame::generate_ricochet_blob(masm, &frame_size_in_words, &bounce_offset, &exception_offset); |
|
2545 |
|
2546 // ------------- |
|
2547 // make sure all code is generated |
|
2548 masm->flush(); |
|
2549 |
|
2550 // failed to generate? |
|
2551 if (frame_size_in_words < 0 || bounce_offset < 0 || exception_offset < 0) { |
|
2552 assert(false, "bad ricochet blob"); |
|
2553 return; |
|
2554 } |
|
2555 |
|
2556 _ricochet_blob = RicochetBlob::create(&buffer, bounce_offset, exception_offset, frame_size_in_words); |
|
2557 } |
|
2558 |
|
2559 //------------------------------generate_deopt_blob---------------------------- |
2519 //------------------------------generate_deopt_blob---------------------------- |
2560 void SharedRuntime::generate_deopt_blob() { |
2520 void SharedRuntime::generate_deopt_blob() { |
2561 // Allocate space for the code |
2521 // Allocate space for the code |
2562 ResourceMark rm; |
2522 ResourceMark rm; |
2563 // Setup code generation tools |
2523 // Setup code generation tools |
3044 //------------------------------generate_handler_blob------ |
3004 //------------------------------generate_handler_blob------ |
3045 // |
3005 // |
3046 // Generate a special Compile2Runtime blob that saves all registers, |
3006 // Generate a special Compile2Runtime blob that saves all registers, |
3047 // and setup oopmap. |
3007 // and setup oopmap. |
3048 // |
3008 // |
3049 static SafepointBlob* generate_handler_blob(address call_ptr, bool cause_return) { |
3009 SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, bool cause_return) { |
3050 assert(StubRoutines::forward_exception_entry() != NULL, |
3010 assert(StubRoutines::forward_exception_entry() != NULL, |
3051 "must be generated before"); |
3011 "must be generated before"); |
3052 |
3012 |
3053 ResourceMark rm; |
3013 ResourceMark rm; |
3054 OopMapSet *oop_maps = new OopMapSet(); |
3014 OopMapSet *oop_maps = new OopMapSet(); |
3130 // Generate a stub that calls into vm to find out the proper destination |
3090 // Generate a stub that calls into vm to find out the proper destination |
3131 // of a java call. All the argument registers are live at this point |
3091 // of a java call. All the argument registers are live at this point |
3132 // but since this is generic code we don't know what they are and the caller |
3092 // but since this is generic code we don't know what they are and the caller |
3133 // must do any gc of the args. |
3093 // must do any gc of the args. |
3134 // |
3094 // |
3135 static RuntimeStub* generate_resolve_blob(address destination, const char* name) { |
3095 RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const char* name) { |
3136 assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before"); |
3096 assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before"); |
3137 |
3097 |
3138 // allocate space for the code |
3098 // allocate space for the code |
3139 ResourceMark rm; |
3099 ResourceMark rm; |
3140 |
3100 |
3204 masm->flush(); |
3164 masm->flush(); |
3205 |
3165 |
3206 // return the blob |
3166 // return the blob |
3207 // frame_size_words or bytes?? |
3167 // frame_size_words or bytes?? |
3208 return RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_in_words, oop_maps, true); |
3168 return RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_in_words, oop_maps, true); |
3209 } |
|
3210 |
|
3211 |
|
3212 void SharedRuntime::generate_stubs() { |
|
3213 |
|
3214 _wrong_method_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method), |
|
3215 "wrong_method_stub"); |
|
3216 _ic_miss_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss), |
|
3217 "ic_miss_stub"); |
|
3218 _resolve_opt_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C), |
|
3219 "resolve_opt_virtual_call"); |
|
3220 |
|
3221 _resolve_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C), |
|
3222 "resolve_virtual_call"); |
|
3223 |
|
3224 _resolve_static_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C), |
|
3225 "resolve_static_call"); |
|
3226 _polling_page_safepoint_handler_blob = |
|
3227 generate_handler_blob(CAST_FROM_FN_PTR(address, |
|
3228 SafepointSynchronize::handle_polling_page_exception), false); |
|
3229 |
|
3230 _polling_page_return_handler_blob = |
|
3231 generate_handler_blob(CAST_FROM_FN_PTR(address, |
|
3232 SafepointSynchronize::handle_polling_page_exception), true); |
|
3233 |
|
3234 generate_ricochet_blob(); |
|
3235 |
|
3236 generate_deopt_blob(); |
|
3237 |
|
3238 #ifdef COMPILER2 |
|
3239 generate_uncommon_trap_blob(); |
|
3240 #endif // COMPILER2 |
|
3241 } |
3169 } |
3242 |
3170 |
3243 |
3171 |
3244 #ifdef COMPILER2 |
3172 #ifdef COMPILER2 |
3245 // This is here instead of runtime_x86_64.cpp because it uses SimpleRuntimeFrame |
3173 // This is here instead of runtime_x86_64.cpp because it uses SimpleRuntimeFrame |