void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
  if (!TraceMethodHandles) return;

  BLOCK_COMMENT("trace_method_handle {");

  int nbytes_save = 10 * 8;             // 10 volatile gprs
  __ save_LR_CR(R0);
  __ mr(R0, R1_SP);                     // saved_sp
  assert(Assembler::is_simm(-nbytes_save, 16), "Overwriting R0");
  // Push_frame_reg_args only uses R0 if nbytes_save is wider than 16 bit.
  __ push_frame_reg_args(nbytes_save, R0);
  __ save_volatile_gprs(R1_SP, frame::abi_reg_args_size); // Except R0.

  __ load_const(R3_ARG1, (address)adaptername);
  __ mr(R4_ARG2, R23_method_handle);
  __ mr(R5_ARG3, R0);        // saved_sp
  __ mr(R6_ARG4, R1_SP);
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub));

  __ restore_volatile_gprs(R1_SP, 112); // Except R0.
  __ pop_frame();
  __ restore_LR_CR(R0);

  BLOCK_COMMENT("} trace_method_handle");
}
Exemplo n.º 2
0
void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
  if (!TraceMethodHandles) return;

  BLOCK_COMMENT("trace_method_handle {");

  const Register tmp = R11; // Will be preserved.
  const int nbytes_save = 11*8; // volatile gprs except R0
  __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
  __ save_LR_CR(tmp); // save in old frame

  __ mr(R5_ARG3, R1_SP);     // saved_sp
  __ push_frame_reg_args(nbytes_save, tmp);

  __ load_const_optimized(R3_ARG1, (address)adaptername, tmp);
  __ mr(R4_ARG2, R23_method_handle);
  __ mr(R6_ARG4, R1_SP);
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub));

  __ pop_frame();
  __ restore_LR_CR(tmp);
  __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0

  BLOCK_COMMENT("} trace_method_handle");
}