# HG changeset patch # User kvn # Date 1591997600 25200 # Node ID e5a0eb0db9e1f4b515fc3453104a1cecc70df841 # Parent 00cfc1d8196b7b2a9d832b0b4ed1651ce8128319 8247350: [aarch64] assert(false) failed: wrong size of mach node Summary: use movptr() to load address of string Reviewed-by: adinn, azeemj, aph diff -r 00cfc1d8196b -r e5a0eb0db9e1 src/cpu/aarch64/vm/macroAssembler_aarch64.cpp --- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Fri Apr 09 09:32:43 2021 +0800 +++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Fri Jun 12 14:33:20 2020 -0700 @@ -1262,7 +1262,7 @@ stp(rscratch2, lr, Address(pre(sp, -2 * wordSize))); mov(r0, reg); - mov(rscratch1, (address)b); + movptr(rscratch1, (uintptr_t)(address)b); // call indirectly to solve generation ordering problem lea(rscratch2, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); @@ -1298,7 +1298,7 @@ } else { ldr(r0, addr); } - mov(rscratch1, (address)b); + movptr(rscratch1, (uintptr_t)(address)b); // call indirectly to solve generation ordering problem lea(rscratch2, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); @@ -1993,8 +1993,8 @@ void MacroAssembler::stop(const char* msg) { address ip = pc(); pusha(); - mov(c_rarg0, (address)msg); - mov(c_rarg1, (address)ip); + movptr(c_rarg0, (uintptr_t)(address)msg); + movptr(c_rarg1, (uintptr_t)(address)ip); mov(c_rarg2, sp); mov(c_rarg3, CAST_FROM_FN_PTR(address, MacroAssembler::debug64)); blr(c_rarg3); diff -r 00cfc1d8196b -r e5a0eb0db9e1 src/share/vm/opto/output.cpp --- a/src/share/vm/opto/output.cpp Fri Apr 09 09:32:43 2021 +0800 +++ b/src/share/vm/opto/output.cpp Fri Jun 12 14:33:20 2020 -0700 @@ -28,6 +28,7 @@ #include "code/debugInfo.hpp" #include "code/debugInfoRec.hpp" #include "compiler/compileBroker.hpp" +#include "compiler/disassembler.hpp" #include "compiler/oopMap.hpp" #include "memory/allocation.inline.hpp" #include "opto/callnode.hpp" @@ -1510,8 +1511,17 @@ } #ifdef ASSERT - if (n->size(_regalloc) < (current_offset-instr_offset)) { + uint n_size = n->size(_regalloc); + if (n_size < (current_offset-instr_offset)) { + MachNode* mach = n->as_Mach(); n->dump(); + mach->dump_format(_regalloc, tty); + tty->print_cr(" n_size (%d), current_offset (%d), instr_offset (%d)", n_size, current_offset, instr_offset); + Disassembler::decode(cb->insts_begin() + instr_offset, cb->insts_begin() + current_offset + 1, tty); + tty->print_cr(" ------------------- "); + BufferBlob* blob = this->scratch_buffer_blob(); + address blob_begin = blob->content_begin(); + Disassembler::decode(blob_begin, blob_begin + n_size + 1, tty); assert(false, "wrong size of mach node"); } #endif