171 // Shared stub locations |
171 // Shared stub locations |
172 static address get_poll_stub(address pc); |
172 static address get_poll_stub(address pc); |
173 |
173 |
174 static address get_ic_miss_stub() { |
174 static address get_ic_miss_stub() { |
175 assert(_ic_miss_blob!= NULL, "oops"); |
175 assert(_ic_miss_blob!= NULL, "oops"); |
176 return _ic_miss_blob->instructions_begin(); |
176 return _ic_miss_blob->entry_point(); |
177 } |
177 } |
178 |
178 |
179 static address get_handle_wrong_method_stub() { |
179 static address get_handle_wrong_method_stub() { |
180 assert(_wrong_method_blob!= NULL, "oops"); |
180 assert(_wrong_method_blob!= NULL, "oops"); |
181 return _wrong_method_blob->instructions_begin(); |
181 return _wrong_method_blob->entry_point(); |
182 } |
182 } |
183 |
183 |
184 #ifdef COMPILER2 |
184 #ifdef COMPILER2 |
185 static void generate_uncommon_trap_blob(void); |
185 static void generate_uncommon_trap_blob(void); |
186 static UncommonTrapBlob* uncommon_trap_blob() { return _uncommon_trap_blob; } |
186 static UncommonTrapBlob* uncommon_trap_blob() { return _uncommon_trap_blob; } |
187 #endif // COMPILER2 |
187 #endif // COMPILER2 |
188 |
188 |
189 static address get_resolve_opt_virtual_call_stub(){ |
189 static address get_resolve_opt_virtual_call_stub(){ |
190 assert(_resolve_opt_virtual_call_blob != NULL, "oops"); |
190 assert(_resolve_opt_virtual_call_blob != NULL, "oops"); |
191 return _resolve_opt_virtual_call_blob->instructions_begin(); |
191 return _resolve_opt_virtual_call_blob->entry_point(); |
192 } |
192 } |
193 static address get_resolve_virtual_call_stub() { |
193 static address get_resolve_virtual_call_stub() { |
194 assert(_resolve_virtual_call_blob != NULL, "oops"); |
194 assert(_resolve_virtual_call_blob != NULL, "oops"); |
195 return _resolve_virtual_call_blob->instructions_begin(); |
195 return _resolve_virtual_call_blob->entry_point(); |
196 } |
196 } |
197 static address get_resolve_static_call_stub() { |
197 static address get_resolve_static_call_stub() { |
198 assert(_resolve_static_call_blob != NULL, "oops"); |
198 assert(_resolve_static_call_blob != NULL, "oops"); |
199 return _resolve_static_call_blob->instructions_begin(); |
199 return _resolve_static_call_blob->entry_point(); |
200 } |
200 } |
201 |
201 |
202 static SafepointBlob* polling_page_return_handler_blob() { return _polling_page_return_handler_blob; } |
202 static SafepointBlob* polling_page_return_handler_blob() { return _polling_page_return_handler_blob; } |
203 static SafepointBlob* polling_page_safepoint_handler_blob() { return _polling_page_safepoint_handler_blob; } |
203 static SafepointBlob* polling_page_safepoint_handler_blob() { return _polling_page_safepoint_handler_blob; } |
204 |
204 |
546 // Implementation of AdapterHandlerLibrary |
546 // Implementation of AdapterHandlerLibrary |
547 // |
547 // |
548 // This library manages argument marshaling adapters and native wrappers. |
548 // This library manages argument marshaling adapters and native wrappers. |
549 // There are 2 flavors of adapters: I2C and C2I. |
549 // There are 2 flavors of adapters: I2C and C2I. |
550 // |
550 // |
551 // The I2C flavor takes a stock interpreted call setup, marshals the arguments |
551 // The I2C flavor takes a stock interpreted call setup, marshals the |
552 // for a Java-compiled call, and jumps to Rmethod-> code()-> |
552 // arguments for a Java-compiled call, and jumps to Rmethod-> code()-> |
553 // instructions_begin(). It is broken to call it without an nmethod assigned. |
553 // code_begin(). It is broken to call it without an nmethod assigned. |
554 // The usual behavior is to lift any register arguments up out of the stack |
554 // The usual behavior is to lift any register arguments up out of the |
555 // and possibly re-pack the extra arguments to be contigious. I2C adapters |
555 // stack and possibly re-pack the extra arguments to be contigious. |
556 // will save what the interpreter's stack pointer will be after arguments are |
556 // I2C adapters will save what the interpreter's stack pointer will be |
557 // popped, then adjust the interpreter's frame size to force alignment and |
557 // after arguments are popped, then adjust the interpreter's frame |
558 // possibly to repack the arguments. After re-packing, it jumps to the |
558 // size to force alignment and possibly to repack the arguments. |
559 // compiled code start. There are no safepoints in this adapter code and a GC |
559 // After re-packing, it jumps to the compiled code start. There are |
560 // cannot happen while marshaling is in progress. |
560 // no safepoints in this adapter code and a GC cannot happen while |
|
561 // marshaling is in progress. |
561 // |
562 // |
562 // The C2I flavor takes a stock compiled call setup plus the target method in |
563 // The C2I flavor takes a stock compiled call setup plus the target method in |
563 // Rmethod, marshals the arguments for an interpreted call and jumps to |
564 // Rmethod, marshals the arguments for an interpreted call and jumps to |
564 // Rmethod->_i2i_entry. On entry, the interpreted frame has not yet been |
565 // Rmethod->_i2i_entry. On entry, the interpreted frame has not yet been |
565 // setup. Compiled frames are fixed-size and the args are likely not in the |
566 // setup. Compiled frames are fixed-size and the args are likely not in the |