Exemple #1
0
void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
#ifdef _LP64
  typedef Assembler::WhichOperand WhichOperand;
  WhichOperand which = (WhichOperand) format();
  // This format is imm but it is really disp32
  which = Assembler::disp32_operand;
  address orig_addr = old_addr_for(addr(), src, dest);
  NativeInstruction* oni = nativeInstruction_at(orig_addr);
  int32_t* orig_disp = (int32_t*) Assembler::locate_operand(orig_addr, which);
  // This poll_addr is incorrect by the size of the instruction it is irrelevant
  intptr_t poll_addr = (intptr_t)oni + *orig_disp;

  NativeInstruction* ni = nativeInstruction_at(addr());
  intptr_t new_disp = poll_addr - (intptr_t) ni;

  int32_t* disp = (int32_t*) Assembler::locate_operand(addr(), which);
  * disp = (int32_t)new_disp;
#endif // _LP64
}
Exemple #2
0
void poll_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
#ifdef _LP64
  typedef Assembler::WhichOperand WhichOperand;
  WhichOperand which = (WhichOperand) format();
#ifndef GRAAL
  assert((which == Assembler::disp32_operand) == !Assembler::is_polling_page_far(), "format not set correctly");
#endif
  if (which == Assembler::disp32_operand) {
    address orig_addr = old_addr_for(addr(), src, dest);
    NativeInstruction* oni = nativeInstruction_at(orig_addr);
    int32_t* orig_disp = (int32_t*) Assembler::locate_operand(orig_addr, which);
    // This poll_addr is incorrect by the size of the instruction it is irrelevant
    intptr_t poll_addr = (intptr_t)oni + *orig_disp;
    NativeInstruction* ni = nativeInstruction_at(addr());
    intptr_t new_disp = poll_addr - (intptr_t) ni;

    int32_t* disp = (int32_t*) Assembler::locate_operand(addr(), which);
    * disp = (int32_t)new_disp;
  }
#endif // _LP64
}
void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest)  {
  if (NativeInstruction::maybe_cpool_ref(addr())) {
    address old_addr = old_addr_for(addr(), src, dest);
    MacroAssembler::pd_patch_instruction(addr(), MacroAssembler::target_addr_for_insn(old_addr));
  }
}