// This method is called while executing the raw bytecodes, so none of // the adjustments that BytecodeStream performs applies. void trace(methodHandle method, address bcp, uintptr_t tos, uintptr_t tos2) { MutexLocker ml(BytecodeTrace_lock); ResourceMark rm; if (_current_method != method()) { // Note 1: This code will not work as expected with true MT/MP. // Need an explicit lock or a different solution. tty->cr(); tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id()); method->print_name(tty); tty->cr(); _current_method = method(); } Bytecodes::Code code; if (is_wide()) { // bcp wasn't advanced if previous bytecode was _wide. code = Bytecodes::cast(*(bcp+1)); } else { code = Bytecodes::cast(*bcp); } int bci = bcp - method->code_base(); tty->print("[%d] ", (int) Thread::current()->osthread()->thread_id()); if (Verbose) { tty->print("%8d %4d " INTPTR_FORMAT " " INTPTR_FORMAT " %s", BytecodeCounter::counter_value(), bci, tos, tos2, Bytecodes::name(code)); } else { tty->print("%8d %4d %s", BytecodeCounter::counter_value(), bci, Bytecodes::name(code)); } _next_pc = is_wide() ? bcp+2 : bcp+1; print_attributes(code, bci); // Set is_wide for the next one, since the caller of this doesn't skip // the next bytecode. _is_wide = (code == Bytecodes::_wide); }
// Used for methodOop::print_codes(). The input bcp comes from // BytecodeStream, which will skip wide bytecodes. void trace(methodHandle method, address bcp, outputStream* st) { _current_method = method(); ResourceMark rm; Bytecodes::Code code = Bytecodes::code_at(bcp); // Set is_wide _is_wide = (code == Bytecodes::_wide); if (is_wide()) { code = Bytecodes::code_at(bcp+1); } int bci = bcp - method->code_base(); // Print bytecode index and name if (is_wide()) { st->print("%d %s_w", bci, Bytecodes::name(code)); } else { st->print("%d %s", bci, Bytecodes::name(code)); } _next_pc = is_wide() ? bcp+2 : bcp+1; print_attributes(code, bci, st); bytecode_epilog(bci, st); }
// This method is called while executing the raw bytecodes, so none of // the adjustments that BytecodeStream performs applies. void trace(methodHandle method, address bcp, uintptr_t tos, uintptr_t tos2, outputStream* st) { ResourceMark rm; if (_current_method != method()) { // Note 1: This code will not work as expected with true MT/MP. // Need an explicit lock or a different solution. // It is possible for this block to be skipped, if a garbage // _current_method pointer happens to have the same bits as // the incoming method. We could lose a line of trace output. // This is acceptable in a debug-only feature. st->cr(); st->print("[%ld] ", (long) Thread::current()->osthread()->thread_id()); method->print_name(st); st->cr(); _current_method = method(); } Bytecodes::Code code; if (is_wide()) { // bcp wasn't advanced if previous bytecode was _wide. code = Bytecodes::code_at(method(), bcp+1); } else { code = Bytecodes::code_at(method(), bcp); } _code = code; int bci = bcp - method->code_base(); st->print("[%ld] ", (long) Thread::current()->osthread()->thread_id()); if (Verbose) { st->print("%8d %4d " INTPTR_FORMAT " " INTPTR_FORMAT " %s", BytecodeCounter::counter_value(), bci, tos, tos2, Bytecodes::name(code)); } else { st->print("%8d %4d %s", BytecodeCounter::counter_value(), bci, Bytecodes::name(code)); } _next_pc = is_wide() ? bcp+2 : bcp+1; print_attributes(bci); // Set is_wide for the next one, since the caller of this doesn't skip // the next bytecode. _is_wide = (code == Bytecodes::_wide); _code = Bytecodes::_illegal; }