void SnapshotWriter::addSlot(const Register &type, const Register &payload) { IonSpew(IonSpew_Snapshots, " slot %u: value (t=%s, d=%s)", slotsWritten_, type.name(), payload.name()); writeSlotHeader(JSVAL_TYPE_MAGIC, NUNBOX32_REG_REG); writer_.writeByte(type.code()); writer_.writeByte(payload.code()); }
void SnapshotWriter::addSlot(const Register &value) { IonSpew(IonSpew_Snapshots, " slot %u: value (reg %s)", slotsWritten_, value.name()); writeSlotHeader(JSVAL_TYPE_MAGIC, value.code()); }
void SnapshotWriter::addSlot(JSValueType type, const Register ®) { IonSpew(IonSpew_Snapshots, " slot %u: %s (%s)", slotsWritten_, ValTypeToString(type), reg.name()); JS_ASSERT(type != JSVAL_TYPE_DOUBLE); writeSlotHeader(type, reg.code()); }
void SnapshotWriter::addSlot(int32_t typeStackIndex, const Register &payload) { IonSpew(IonSpew_Snapshots, " slot %u: value (t=%d, d=%s)", slotsWritten_, typeStackIndex, payload.name()); writeSlotHeader(JSVAL_TYPE_MAGIC, NUNBOX32_STACK_REG); writer_.writeSigned(typeStackIndex); writer_.writeByte(payload.code()); }
void SnapshotWriter::addSlot(const Register &type, int32_t payloadStackIndex) { IonSpew(IonSpew_Snapshots, " slot %u: value (t=%s, d=%d)", slotsWritten_, type.name(), payloadStackIndex); writeSlotHeader(JSVAL_TYPE_MAGIC, NUNBOX32_REG_STACK); writer_.writeByte(type.code()); writer_.writeSigned(payloadStackIndex); }
void SharedInfo::set_regName() { Register reg = GR0; for (uint i = 0; i < RegisterImpl::number_of_registers; ++i, reg = reg->successor()) { regName[i] = reg->name(); } #ifdef COMPILER1 uint fbase = RegisterImpl::number_of_registers; FloatRegister freg = FR0; for (uint i = 0; i < FloatRegisterImpl::number_of_registers; ++i, freg = freg->successor()) { regName[fbase+i] = freg->name(); } uint pbase = RegisterImpl::number_of_registers + FloatRegisterImpl::number_of_registers; PredicateRegister preg = PR0; for (uint i = 0; i < PredicateRegisterImpl::number_of_registers; ++i, preg = preg->successor()) { regName[pbase+i] = preg->name(); } uint bbase = RegisterImpl::number_of_registers + FloatRegisterImpl::number_of_registers + PredicateRegisterImpl::number_of_registers; BranchRegister breg = BR0; for (uint i = 0; i < BranchRegisterImpl::number_of_registers; ++i, breg = breg->successor()) { regName[bbase+i] = breg->name(); } uint abase = RegisterImpl::number_of_registers + FloatRegisterImpl::number_of_registers + PredicateRegisterImpl::number_of_registers + BranchRegisterImpl::number_of_registers; ApplicationRegister areg = AR0; for (uint i = 0; i < ApplicationRegisterImpl::number_of_registers; ++i, areg = areg->successor()) { regName[abase+i] = areg->name(); } #endif }
void VMRegImpl::set_regName() { Register reg = ::as_Register(0); int i; for (i = 0; i < ConcreteRegisterImpl::max_gpr ; ) { regName[i++ ] = reg->name(); regName[i++ ] = reg->name(); reg = reg->successor(); } FloatRegister freg = ::as_FloatRegister(0); for ( ; i < ConcreteRegisterImpl::max_fpr ; ) { regName[i++] = freg->name(); regName[i++] = freg->name(); freg = freg->successor(); } for ( ; i < ConcreteRegisterImpl::number_of_registers ; i++ ) { regName[i] = "NON-GPR-FPR"; } }
void trace_method_handle_stub(const char* adaptername, oopDesc* mh, intptr_t* entry_sp, intptr_t* saved_regs) { bool has_mh = (strstr(adaptername, "/static") == NULL && strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH const char* mh_reg_name = has_mh ? "R23_method_handle" : "G23"; tty->print_cr("MH %s %s="INTPTR_FORMAT " sp=" INTPTR_FORMAT, adaptername, mh_reg_name, p2i(mh), p2i(entry_sp)); if (Verbose) { tty->print_cr("Registers:"); const int abi_offset = frame::abi_reg_args_size / 8; for (int i = R3->encoding(); i <= R12->encoding(); i++) { Register r = as_Register(i); int count = i - R3->encoding(); // The registers are stored in reverse order on the stack (by save_volatile_gprs(R1_SP, abi_reg_args_size)). tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[abi_offset + count]); if ((count + 1) % 4 == 0) { tty->cr(); } else { tty->print(", "); } } tty->cr(); { // dumping last frame with frame::describe JavaThread* p = JavaThread::active(); ResourceMark rm; PRESERVE_EXCEPTION_MARK; // may not be needed by safer and unexpensive here FrameValues values; // Note: We want to allow trace_method_handle from any call site. // While trace_method_handle creates a frame, it may be entered // without a PC on the stack top (e.g. not just after a call). // Walking that frame could lead to failures due to that invalid PC. // => carefully detect that frame when doing the stack walking // Current C frame frame cur_frame = os::current_frame(); // Robust search of trace_calling_frame (independant of inlining). // Assumes saved_regs comes from a pusha in the trace_calling_frame. assert(cur_frame.sp() < saved_regs, "registers not saved on stack ?"); frame trace_calling_frame = os::get_sender_for_C_frame(&cur_frame); while (trace_calling_frame.fp() < saved_regs) { trace_calling_frame = os::get_sender_for_C_frame(&trace_calling_frame); } // Safely create a frame and call frame::describe. intptr_t *dump_sp = trace_calling_frame.sender_sp(); frame dump_frame = frame(dump_sp); dump_frame.describe(values, 1); values.describe(-1, saved_regs, "raw top of stack"); tty->print_cr("Stack layout:"); values.print(p); } if (has_mh && mh->is_oop()) { mh->print(); if (java_lang_invoke_MethodHandle::is_instance(mh)) { if (java_lang_invoke_MethodHandle::form_offset_in_bytes() != 0) java_lang_invoke_MethodHandle::form(mh)->print(); } } } }
void trace_method_handle_stub(const char* adaptername, oop mh, intptr_t* saved_regs, intptr_t* entry_sp) { // called as a leaf from native code: do not block the JVM! bool has_mh = (strstr(adaptername, "/static") == NULL && strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH const char* mh_reg_name = has_mh ? "rcx_mh" : "rcx"; tty->print_cr("MH %s %s="PTR_FORMAT" sp="PTR_FORMAT, adaptername, mh_reg_name, mh, entry_sp); if (Verbose) { tty->print_cr("Registers:"); const int saved_regs_count = RegisterImpl::number_of_registers; for (int i = 0; i < saved_regs_count; i++) { Register r = as_Register(i); // The registers are stored in reverse order on the stack (by pusha). tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]); if ((i + 1) % 4 == 0) { tty->cr(); } else { tty->print(", "); } } tty->cr(); { // dumping last frame with frame::describe JavaThread* p = JavaThread::active(); ResourceMark rm; PRESERVE_EXCEPTION_MARK; // may not be needed by safer and unexpensive here FrameValues values; // Note: We want to allow trace_method_handle from any call site. // While trace_method_handle creates a frame, it may be entered // without a PC on the stack top (e.g. not just after a call). // Walking that frame could lead to failures due to that invalid PC. // => carefully detect that frame when doing the stack walking // Current C frame frame cur_frame = os::current_frame(); // Robust search of trace_calling_frame (independant of inlining). // Assumes saved_regs comes from a pusha in the trace_calling_frame. assert(cur_frame.sp() < saved_regs, "registers not saved on stack ?"); frame trace_calling_frame = os::get_sender_for_C_frame(&cur_frame); while (trace_calling_frame.fp() < saved_regs) { trace_calling_frame = os::get_sender_for_C_frame(&trace_calling_frame); } // safely create a frame and call frame::describe intptr_t *dump_sp = trace_calling_frame.sender_sp(); intptr_t *dump_fp = trace_calling_frame.link(); bool walkable = has_mh; // whether the traced frame shoud be walkable if (walkable) { // The previous definition of walkable may have to be refined // if new call sites cause the next frame constructor to start // failing. Alternatively, frame constructors could be // modified to support the current or future non walkable // frames (but this is more intrusive and is not considered as // part of this RFE, which will instead use a simpler output). frame dump_frame = frame(dump_sp, dump_fp); dump_frame.describe(values, 1); } else { // Stack may not be walkable (invalid PC above FP): // Add descriptions without building a Java frame to avoid issues values.describe(-1, dump_fp, "fp for #1 <not parsed, cannot trust pc>"); values.describe(-1, dump_sp, "sp for #1"); } values.describe(-1, entry_sp, "raw top of stack"); tty->print_cr("Stack layout:"); values.print(p); } if (has_mh && mh->is_oop()) { mh->print(); if (java_lang_invoke_MethodHandle::is_instance(mh)) { if (java_lang_invoke_MethodHandle::form_offset_in_bytes() != 0) java_lang_invoke_MethodHandle::form(mh)->print(); } } } }