libjvm_db.c revision 1123
844N/A * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 0N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 0N/A * CA 95054 USA or visit www.sun.com if you need additional information or 0N/A * have any questions. 0N/A#
endif /* COMPILER2 */ 0N/A short vf_cnt;
/* number of recognized java vframes */ 0N/A short bci;
/* current frame method byte code index */ 0N/A int line;
/* current frame method source line */ 0N/A char locinf;
/* indicates there is valid location info */ 0N/A const char *
typeName;
/* The type name containing the given field (example: "Klass") */ 0N/A const char *
fieldName;
/* The field name within the type (example: "_name") */ 0N/A /* ("offset" can not be reused because of apparent SparcWorks compiler bug */ 0N/A /* in generation of initializer data) */ 0N/A/* Prototyping inlined methods */ 0N/A char *
buf,
/* caller's buffer */ 0N/A /* make sure the code cache is up to date */ 0N/A#
endif /* X86_COMPILER2 */ 0N/A // Initialize the initial previous frame 642N/A // If UseCompressedOops, this was a compressed oop. 0N/A /* To get name string */ 0N/A /* To get signature string */ 0N/A /* To get klass string */ 0N/A fprintf(
stderr,
"\t nmethod_info: scopes_data_beg: %#x, scopes_data_end: %#x\n",
0N/A // Constants for UNSIGNED5 coding of Pack200 0N/A // Read maximum of 5 total bytes (we've already read 1). 0N/A // See CompressedReadStream::read_int_mb 0N/A for ( i = 0; i <
4; i++) {
0N/A return 1;
/* stream terminated */ 0N/A /* Escape character, regular compression used */ 0N/A /* Single byte compression used */ 0N/A fprintf(
stderr,
"\t line_number_from_bci: BEGIN, method name: %s, targ bci: %d\n",
0N/A /* The line numbers are a short array of 2-tuples [start_pc, line_number]. 0N/A * Not necessarily sorted and not necessarily one-to-one. 0N/A /* inlined_table_start() */ 0N/A/* Finds a PcDesc with real-pc equal to N->pc */ 0N/A /* In general, this fragment should work */ 0N/A /* This fragment is to be able to find out an appropriate 0N/A * pc_desc entry even if pc_desc info is inaccurate. 0N/A /* check for a deoptimized frame */ 0N/A fprintf(
stderr,
"name_for_nmethod: found deoptimized frame converting pc from %#8llx to %#8llx\n",
0N/A fprintf(
stderr,
"name_for_codecache: start: %#8llx, pc: %#8llx, methodOop: %#8llx \n",
0N/A * Temporary usage of string "Interpreter". 0N/A * We need some other way to distinguish "StubRoutines" 0N/A * and regular interpreted frames. 0N/A // frame_size is in words, we want bytes. 0N/A Because c2 doesn't use FP as a framepointer the value of sp/fp we receive 0N/A in the initial entry to a set of stack frames containing server frames 0N/A will pretty much be nonsense. We can detect that nonsense by looking to 0N/A see if the PC we received is correct if we look at the expected storage 0N/A location in relation to the FP (ie. POINTER_SIZE(FP) ) 0N/A // Either we couldn't even read at the "fp" or the pc didn't match 0N/A // both are sure clues that the fp is bogus. We no search the stack 0N/A // for a reasonable number of words trying to find the bogus fp 0N/A // and the current pc in adjacent words. The we will be able to 0N/A // deduce an approximation of the frame pointer and actually get 0N/A // the correct stack pointer. Which we can then unwind for the 0N/A // real_sp is the sp we should have received for this frame 0N/A // +POINTER_SIZE because callee owns the return address so caller's sp is +1 word 0N/A /* A prototype to workaround FP absence */ 0N/A * frame_size can be 0 for StubRoutines (1) frame. 0N/A * In this case it should work with fp as usual. 0N/A#
endif /* X86_COMPILER2 */ 0N/A /* arguments given to read_pointer need to be worst case sized */ 0N/A /* The following workaround is for SPARC. CALL instruction occupates 8 bytes. 0N/A * In the pcDesc structure return pc offset is recorded for CALL instructions. 0N/A * regs[R_PC] contains a CALL instruction pc offset. 0N/A fprintf(
stderr,
"\nregs[R_I1]=%lx, regs[R_I2]=%lx, regs[R_I5]=%lx, regs[R_L1]=%lx, regs[R_L2]=%lx\n",
0N/A /* A workaround for top java frames */ 0N/A#
endif /* COMPILER2 */ 0N/A /* On x86 with C2 JVM: native frame may have wrong regs[R_FP] 0N/A * For example: JVM_SuspendThread frame poins to the top interpreted frame. 0N/A * If we call is_methodOop(J, methodOopPtr) before codecache_contains(J, pc) 0N/A * then we go over and omit both: nmethod and I2CAdapter frames. 0N/A * Note, that regs[R_PC] is always correct if frame defined correctly. 0N/A * So it is better to call codecache_contains(J, pc) from the beginning. 0N/A /* If the methodOopPtr is a method then this is highly likely to be 0N/A an interpreter frame */ 0N/A#
endif /* ! X86_COMPILER2 */ 0N/A /* If the methodOopPtr is a method then this is highly likely to be 0N/A an interpreter frame */ 0N/A#
endif /* X86_COMPILER2 */ 0N/A // This seems dubious 0N/A printf(
"Jlookup_by_regs: (update pc) jframe->new_fp: %#llx, jframe->new_pc: %#llx\n",
0N/A#
endif /* X86_COMPILER2 */ 0N/A * A workaround for java C2 frames with unconventional FP. 0N/A * may have to modify regset with new values for FP/PC/SP when needed. 0N/A // *((uintptr_t *) &gregs[R_SP]) = (uintptr_t) gregs[R_FP] + 2 * POINTER_SIZE; 0N/A#
endif /* X86_COMPILER2 */ 0N/A * Iterates over java frames at current location given by 'gregs'. 0N/A * Returns -1 if no java frames are present or if an error is encountered. 0N/A * Returns the result of calling 'func' if the return value is non-zero. 0N/A * Returns 0 otherwise. 0N/A#
endif /* X86_COMPILER2 */