59 id == StubId::shared_wrong_method_abstract_id ||
60 id == StubId::shared_ic_miss_id ||
61 id == StubId::shared_resolve_opt_virtual_call_id ||
62 id == StubId::shared_resolve_virtual_call_id ||
63 id == StubId::shared_resolve_static_call_id);
64 }
65 static bool is_polling_page_id(StubId id) {
66 return (id == StubId::shared_polling_page_vectors_safepoint_handler_id ||
67 id == StubId::shared_polling_page_safepoint_handler_id ||
68 id == StubId::shared_polling_page_return_handler_id);
69 }
70 static bool is_throw_id(StubId id) {
71 return (id == StubId::shared_throw_AbstractMethodError_id ||
72 id == StubId::shared_throw_IncompatibleClassChangeError_id ||
73 id == StubId::shared_throw_NullPointerException_at_call_id ||
74 id == StubId::shared_throw_StackOverflowError_id ||
75 id == StubId::shared_throw_delayed_StackOverflowError_id);
76 }
77 #endif
78
79 // cont_doYieldStub is not yet folded into the general model for
80 // shared stub/blob handling. It is actually a specially generated
81 // native wrapper for a specific native method, as also is it's
82 // counterpart the continuation do_enter method.
83 static nmethod* _cont_doYield_stub;
84
85 #ifndef PRODUCT
86 // Counters
87 static int64_t _nof_megamorphic_calls; // total # of megamorphic calls (through vtable)
88 #endif // !PRODUCT
89
90 private:
91 static SafepointBlob* generate_handler_blob(StubId id, address call_ptr);
92 static RuntimeStub* generate_resolve_blob(StubId id, address destination);
93 static RuntimeStub* generate_throw_exception(StubId id, address runtime_entry);
94 public:
95 static void generate_initial_stubs(void);
96 static void generate_stubs(void);
97 #if INCLUDE_JFR
98 static void generate_jfr_stubs(void);
99 // For c2: c_rarg0 is junk, call to runtime to write a checkpoint.
100 // It returns a jobject handle to the event writer.
101 // The handle is dereferenced and the return value is the event writer oop.
102 static RuntimeStub* generate_jfr_write_checkpoint();
103 // For c2: call to runtime to return a buffer lease.
104 static RuntimeStub* generate_jfr_return_lease();
252 return _wrong_method_abstract_blob->entry_point();
253 }
254
255 static address get_resolve_opt_virtual_call_stub() {
256 assert(_resolve_opt_virtual_call_blob != nullptr, "oops");
257 return _resolve_opt_virtual_call_blob->entry_point();
258 }
259 static address get_resolve_virtual_call_stub() {
260 assert(_resolve_virtual_call_blob != nullptr, "oops");
261 return _resolve_virtual_call_blob->entry_point();
262 }
263 static address get_resolve_static_call_stub() {
264 assert(_resolve_static_call_blob != nullptr, "oops");
265 return _resolve_static_call_blob->entry_point();
266 }
267
268 static SafepointBlob* polling_page_return_handler_blob() { return _polling_page_return_handler_blob; }
269 static SafepointBlob* polling_page_safepoint_handler_blob() { return _polling_page_safepoint_handler_blob; }
270 static SafepointBlob* polling_page_vectors_safepoint_handler_blob() { return _polling_page_vectors_safepoint_handler_blob; }
271
272 static nmethod* cont_doYield_stub() {
273 assert(_cont_doYield_stub != nullptr, "oops");
274 return _cont_doYield_stub;
275 }
276
277 // Implicit exceptions
278 static address throw_AbstractMethodError_entry() {
279 assert(_throw_AbstractMethodError_blob != nullptr, "");
280 return _throw_AbstractMethodError_blob->entry_point();
281 }
282 static address throw_IncompatibleClassChangeError_entry() {
283 assert(_throw_IncompatibleClassChangeError_blob != nullptr, "");
284 return _throw_IncompatibleClassChangeError_blob->entry_point();
285 }
286 static address throw_NullPointerException_at_call_entry() {
287 assert(_throw_NullPointerException_at_call_blob != nullptr, "");
288 return _throw_NullPointerException_at_call_blob->entry_point();
289 }
290 static address throw_StackOverflowError_entry() {
291 assert(_throw_StackOverflowError_blob != nullptr, "");
292 return _throw_StackOverflowError_blob->entry_point();
293 }
294 static address throw_delayed_StackOverflowError_entry() {
295 assert(_throw_delayed_StackOverflowError_blob != nullptr, "");
296 return _throw_delayed_StackOverflowError_blob->entry_point();
|
59 id == StubId::shared_wrong_method_abstract_id ||
60 id == StubId::shared_ic_miss_id ||
61 id == StubId::shared_resolve_opt_virtual_call_id ||
62 id == StubId::shared_resolve_virtual_call_id ||
63 id == StubId::shared_resolve_static_call_id);
64 }
65 static bool is_polling_page_id(StubId id) {
66 return (id == StubId::shared_polling_page_vectors_safepoint_handler_id ||
67 id == StubId::shared_polling_page_safepoint_handler_id ||
68 id == StubId::shared_polling_page_return_handler_id);
69 }
70 static bool is_throw_id(StubId id) {
71 return (id == StubId::shared_throw_AbstractMethodError_id ||
72 id == StubId::shared_throw_IncompatibleClassChangeError_id ||
73 id == StubId::shared_throw_NullPointerException_at_call_id ||
74 id == StubId::shared_throw_StackOverflowError_id ||
75 id == StubId::shared_throw_delayed_StackOverflowError_id);
76 }
77 #endif
78
79 #ifndef PRODUCT
80 // Counters
81 static int64_t _nof_megamorphic_calls; // total # of megamorphic calls (through vtable)
82 #endif // !PRODUCT
83
84 private:
85 static SafepointBlob* generate_handler_blob(StubId id, address call_ptr);
86 static RuntimeStub* generate_resolve_blob(StubId id, address destination);
87 static RuntimeStub* generate_throw_exception(StubId id, address runtime_entry);
88 public:
89 static void generate_initial_stubs(void);
90 static void generate_stubs(void);
91 #if INCLUDE_JFR
92 static void generate_jfr_stubs(void);
93 // For c2: c_rarg0 is junk, call to runtime to write a checkpoint.
94 // It returns a jobject handle to the event writer.
95 // The handle is dereferenced and the return value is the event writer oop.
96 static RuntimeStub* generate_jfr_write_checkpoint();
97 // For c2: call to runtime to return a buffer lease.
98 static RuntimeStub* generate_jfr_return_lease();
246 return _wrong_method_abstract_blob->entry_point();
247 }
248
249 static address get_resolve_opt_virtual_call_stub() {
250 assert(_resolve_opt_virtual_call_blob != nullptr, "oops");
251 return _resolve_opt_virtual_call_blob->entry_point();
252 }
253 static address get_resolve_virtual_call_stub() {
254 assert(_resolve_virtual_call_blob != nullptr, "oops");
255 return _resolve_virtual_call_blob->entry_point();
256 }
257 static address get_resolve_static_call_stub() {
258 assert(_resolve_static_call_blob != nullptr, "oops");
259 return _resolve_static_call_blob->entry_point();
260 }
261
262 static SafepointBlob* polling_page_return_handler_blob() { return _polling_page_return_handler_blob; }
263 static SafepointBlob* polling_page_safepoint_handler_blob() { return _polling_page_safepoint_handler_blob; }
264 static SafepointBlob* polling_page_vectors_safepoint_handler_blob() { return _polling_page_vectors_safepoint_handler_blob; }
265
266 // Implicit exceptions
267 static address throw_AbstractMethodError_entry() {
268 assert(_throw_AbstractMethodError_blob != nullptr, "");
269 return _throw_AbstractMethodError_blob->entry_point();
270 }
271 static address throw_IncompatibleClassChangeError_entry() {
272 assert(_throw_IncompatibleClassChangeError_blob != nullptr, "");
273 return _throw_IncompatibleClassChangeError_blob->entry_point();
274 }
275 static address throw_NullPointerException_at_call_entry() {
276 assert(_throw_NullPointerException_at_call_blob != nullptr, "");
277 return _throw_NullPointerException_at_call_blob->entry_point();
278 }
279 static address throw_StackOverflowError_entry() {
280 assert(_throw_StackOverflowError_blob != nullptr, "");
281 return _throw_StackOverflowError_blob->entry_point();
282 }
283 static address throw_delayed_StackOverflowError_entry() {
284 assert(_throw_delayed_StackOverflowError_blob != nullptr, "");
285 return _throw_delayed_StackOverflowError_blob->entry_point();
|