78 #endif |
78 #endif |
79 #ifdef COMPILER1 |
79 #ifdef COMPILER1 |
80 #include "c1/c1_Runtime1.hpp" |
80 #include "c1/c1_Runtime1.hpp" |
81 #endif |
81 #endif |
82 |
82 |
|
83 // Shared stub locations |
|
84 RuntimeStub* SharedRuntime::_wrong_method_blob; |
|
85 RuntimeStub* SharedRuntime::_ic_miss_blob; |
|
86 RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob; |
|
87 RuntimeStub* SharedRuntime::_resolve_virtual_call_blob; |
|
88 RuntimeStub* SharedRuntime::_resolve_static_call_blob; |
|
89 |
|
90 DeoptimizationBlob* SharedRuntime::_deopt_blob; |
|
91 RicochetBlob* SharedRuntime::_ricochet_blob; |
|
92 |
|
93 SafepointBlob* SharedRuntime::_polling_page_safepoint_handler_blob; |
|
94 SafepointBlob* SharedRuntime::_polling_page_return_handler_blob; |
|
95 |
|
96 #ifdef COMPILER2 |
|
97 UncommonTrapBlob* SharedRuntime::_uncommon_trap_blob; |
|
98 #endif // COMPILER2 |
|
99 |
|
100 |
|
101 //----------------------------generate_stubs----------------------------------- |
|
102 void SharedRuntime::generate_stubs() { |
|
103 _wrong_method_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method), "wrong_method_stub"); |
|
104 _ic_miss_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss), "ic_miss_stub"); |
|
105 _resolve_opt_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C), "resolve_opt_virtual_call"); |
|
106 _resolve_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C), "resolve_virtual_call"); |
|
107 _resolve_static_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C), "resolve_static_call"); |
|
108 |
|
109 _polling_page_safepoint_handler_blob = generate_handler_blob(CAST_FROM_FN_PTR(address, SafepointSynchronize::handle_polling_page_exception), false); |
|
110 _polling_page_return_handler_blob = generate_handler_blob(CAST_FROM_FN_PTR(address, SafepointSynchronize::handle_polling_page_exception), true); |
|
111 |
|
112 generate_ricochet_blob(); |
|
113 generate_deopt_blob(); |
|
114 |
|
115 #ifdef COMPILER2 |
|
116 generate_uncommon_trap_blob(); |
|
117 #endif // COMPILER2 |
|
118 } |
|
119 |
|
120 //----------------------------generate_ricochet_blob--------------------------- |
|
121 void SharedRuntime::generate_ricochet_blob() { |
|
122 if (!EnableInvokeDynamic) return; // leave it as a null |
|
123 |
|
124 #ifndef TARGET_ARCH_NYI_6939861 |
|
125 // allocate space for the code |
|
126 ResourceMark rm; |
|
127 // setup code generation tools |
|
128 CodeBuffer buffer("ricochet_blob", 256 LP64_ONLY(+ 256), 256); // XXX x86 LP64L: 512, 512 |
|
129 MacroAssembler* masm = new MacroAssembler(&buffer); |
|
130 |
|
131 int bounce_offset = -1, exception_offset = -1, frame_size_in_words = -1; |
|
132 MethodHandles::RicochetFrame::generate_ricochet_blob(masm, &bounce_offset, &exception_offset, &frame_size_in_words); |
|
133 |
|
134 // ------------- |
|
135 // make sure all code is generated |
|
136 masm->flush(); |
|
137 |
|
138 // failed to generate? |
|
139 if (bounce_offset < 0 || exception_offset < 0 || frame_size_in_words < 0) { |
|
140 assert(false, "bad ricochet blob"); |
|
141 return; |
|
142 } |
|
143 |
|
144 _ricochet_blob = RicochetBlob::create(&buffer, bounce_offset, exception_offset, frame_size_in_words); |
|
145 #endif |
|
146 } |
|
147 |
|
148 |
83 #include <math.h> |
149 #include <math.h> |
84 |
150 |
85 HS_DTRACE_PROBE_DECL4(hotspot, object__alloc, Thread*, char*, int, size_t); |
151 HS_DTRACE_PROBE_DECL4(hotspot, object__alloc, Thread*, char*, int, size_t); |
86 HS_DTRACE_PROBE_DECL7(hotspot, method__entry, int, |
152 HS_DTRACE_PROBE_DECL7(hotspot, method__entry, int, |
87 char*, int, char*, int, char*, int); |
153 char*, int, char*, int, char*, int); |
88 HS_DTRACE_PROBE_DECL7(hotspot, method__return, int, |
154 HS_DTRACE_PROBE_DECL7(hotspot, method__return, int, |
89 char*, int, char*, int, char*, int); |
155 char*, int, char*, int, char*, int); |
90 |
|
91 RicochetBlob* SharedRuntime::_ricochet_blob = NULL; |
|
92 |
156 |
93 // Implementation of SharedRuntime |
157 // Implementation of SharedRuntime |
94 |
158 |
95 #ifndef PRODUCT |
159 #ifndef PRODUCT |
96 // For statistics |
160 // For statistics |