< prev index next >

src/cpu/aarch32/vm/nativeInst_aarch32.cpp

Print this page

        

*** 36,45 **** --- 36,48 ---- #include "utilities/ostream.hpp" #ifdef COMPILER1 #include "c1/c1_Runtime1.hpp" #endif + // LIRAssembler fills patching site with nops up to NativeCall::instruction_size + static const int patching_copy_buff_len = NativeCall::instruction_size; + NativeInstruction* NativeInstruction::from(address addr) { return (NativeInstruction*) addr; } //-------------------------------------------------------------------
*** 559,577 **** ICache::invalidate_range(code_pos, instruction_size); } // MT-safe patching of a long jump instruction. void NativeGeneralJump::replace_mt_safe(address instr_addr, address code_buffer) { ! // FIXME NativeCall from patching_epilog nops filling ! const int bytes_to_copy = NativeCall::instruction_size; ! const address patching_switch_addr = code_buffer + bytes_to_copy; NativeImmJump* patching_switch = NativeImmJump::from(patching_switch_addr); assert(patching_switch->destination() == patching_switch_addr + NativeInstruction::arm_insn_sz, "switch should be branch to next instr at this point"); ! patching_switch->set_destination(instr_addr + bytes_to_copy); ICache::invalidate_word(patching_switch_addr); NativeImmJump* nj = NativeImmJump::from(instr_addr); // checking that it is a jump nj->set_destination(code_buffer); ICache::invalidate_word(instr_addr); } --- 562,591 ---- ICache::invalidate_range(code_pos, instruction_size); } // MT-safe patching of a long jump instruction. void NativeGeneralJump::replace_mt_safe(address instr_addr, address code_buffer) { ! const address patching_switch_addr = code_buffer + patching_copy_buff_len; NativeImmJump* patching_switch = NativeImmJump::from(patching_switch_addr); + assert(!NativeInstruction::from(instr_addr)->is_patched_already(), "not patched yet"); assert(patching_switch->destination() == patching_switch_addr + NativeInstruction::arm_insn_sz, "switch should be branch to next instr at this point"); ! patching_switch->set_destination(instr_addr + patching_copy_buff_len); ICache::invalidate_word(patching_switch_addr); NativeImmJump* nj = NativeImmJump::from(instr_addr); // checking that it is a jump nj->set_destination(code_buffer); ICache::invalidate_word(instr_addr); + assert(NativeInstruction::from(instr_addr)->is_patched_already(), "should patched already"); + } + + bool NativeInstruction::is_patched_already() const { + if (NativeImmJump::is_at(addr())) { + address maybe_copy_buff = NativeImmJump::from(addr())->destination(); + address maybe_patching_switch = maybe_copy_buff + patching_copy_buff_len; + if (NativeImmJump::is_at(maybe_patching_switch)) { + return NativeImmJump::from(maybe_patching_switch)->destination() == addr() + patching_copy_buff_len; + } + } + return false; }
< prev index next >