277 void push_frame(Register bytes, Register tmp); |
277 void push_frame(Register bytes, Register tmp); |
278 |
278 |
279 // Push a frame of size `bytes'. No abi space provided. |
279 // Push a frame of size `bytes'. No abi space provided. |
280 void push_frame(unsigned int bytes, Register tmp); |
280 void push_frame(unsigned int bytes, Register tmp); |
281 |
281 |
282 // Push a frame of size `bytes' plus abi112 on top. |
282 // Push a frame of size `bytes' plus abi_reg_args on top. |
283 void push_frame_abi112(unsigned int bytes, Register tmp); |
283 void push_frame_reg_args(unsigned int bytes, Register tmp); |
284 |
284 |
285 // Setup up a new C frame with a spill area for non-volatile GPRs and additional |
285 // Setup up a new C frame with a spill area for non-volatile GPRs and additional |
286 // space for local variables |
286 // space for local variables |
287 void push_frame_abi112_nonvolatiles(unsigned int bytes, Register tmp); |
287 void push_frame_reg_args_nonvolatiles(unsigned int bytes, Register tmp); |
288 |
288 |
289 // pop current C frame |
289 // pop current C frame |
290 void pop_frame(); |
290 void pop_frame(); |
291 |
291 |
292 // |
292 // |
294 // |
294 // |
295 |
295 |
296 private: |
296 private: |
297 address _last_calls_return_pc; |
297 address _last_calls_return_pc; |
298 |
298 |
|
299 #if defined(ABI_ELFv2) |
|
300 // Generic version of a call to C function. |
|
301 // Updates and returns _last_calls_return_pc. |
|
302 address branch_to(Register function_entry, bool and_link); |
|
303 #else |
299 // Generic version of a call to C function via a function descriptor |
304 // Generic version of a call to C function via a function descriptor |
300 // with variable support for C calling conventions (TOC, ENV, etc.). |
305 // with variable support for C calling conventions (TOC, ENV, etc.). |
301 // updates and returns _last_calls_return_pc. |
306 // updates and returns _last_calls_return_pc. |
302 address branch_to(Register function_descriptor, bool and_link, bool save_toc_before_call, |
307 address branch_to(Register function_descriptor, bool and_link, bool save_toc_before_call, |
303 bool restore_toc_after_call, bool load_toc_of_callee, bool load_env_of_callee); |
308 bool restore_toc_after_call, bool load_toc_of_callee, bool load_env_of_callee); |
|
309 #endif |
304 |
310 |
305 public: |
311 public: |
306 |
312 |
307 // Get the pc where the last call will return to. returns _last_calls_return_pc. |
313 // Get the pc where the last call will return to. returns _last_calls_return_pc. |
308 inline address last_calls_return_pc(); |
314 inline address last_calls_return_pc(); |
309 |
315 |
|
316 #if defined(ABI_ELFv2) |
|
317 // Call a C function via a function descriptor and use full C |
|
318 // calling conventions. Updates and returns _last_calls_return_pc. |
|
319 address call_c(Register function_entry); |
|
320 // For tail calls: only branch, don't link, so callee returns to caller of this function. |
|
321 address call_c_and_return_to_caller(Register function_entry); |
|
322 address call_c(address function_entry, relocInfo::relocType rt); |
|
323 #else |
310 // Call a C function via a function descriptor and use full C |
324 // Call a C function via a function descriptor and use full C |
311 // calling conventions. Updates and returns _last_calls_return_pc. |
325 // calling conventions. Updates and returns _last_calls_return_pc. |
312 address call_c(Register function_descriptor); |
326 address call_c(Register function_descriptor); |
313 // For tail calls: only branch, don't link, so callee returns to caller of this function. |
327 // For tail calls: only branch, don't link, so callee returns to caller of this function. |
314 address call_c_and_return_to_caller(Register function_descriptor); |
328 address call_c_and_return_to_caller(Register function_descriptor); |
315 address call_c(const FunctionDescriptor* function_descriptor, relocInfo::relocType rt); |
329 address call_c(const FunctionDescriptor* function_descriptor, relocInfo::relocType rt); |
316 address call_c_using_toc(const FunctionDescriptor* function_descriptor, relocInfo::relocType rt, |
330 address call_c_using_toc(const FunctionDescriptor* function_descriptor, relocInfo::relocType rt, |
317 Register toc); |
331 Register toc); |
|
332 #endif |
318 |
333 |
319 protected: |
334 protected: |
320 |
335 |
321 // It is imperative that all calls into the VM are handled via the |
336 // It is imperative that all calls into the VM are handled via the |
322 // call_VM macros. They make sure that the stack linkage is setup |
337 // call_VM macros. They make sure that the stack linkage is setup |
647 |
662 |
648 // TODO: verify method and klass metadata (compare against vptr?) |
663 // TODO: verify method and klass metadata (compare against vptr?) |
649 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {} |
664 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {} |
650 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line) {} |
665 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line) {} |
651 |
666 |
|
667 // Convenience method returning function entry. For the ELFv1 case |
|
668 // creates function descriptor at the current address and returs |
|
669 // the pointer to it. For the ELFv2 case returns the current address. |
|
670 inline address function_entry(); |
|
671 |
652 #define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__) |
672 #define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__) |
653 #define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__) |
673 #define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__) |
654 |
674 |
655 private: |
675 private: |
656 |
676 |