Mercurial > hg > graal-compiler
diff agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SymbolIterator.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SymbolIterator.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,614 @@ +/* + * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package sun.jvm.hotspot.debugger.win32.coff; + +import java.util.*; + +/** Provides iteration-style access to the symbols in the sstGlobalSym + (and possibly other) subsections of the VC++ 5.0 debug + information. Clients should walk down these platform-dependent + symbols and transform them into the platform-independent + interfaces described in the package sun.jvm.hotspot.debugger.csym. */ + +public interface DebugVC50SymbolIterator + extends DebugVC50SymbolTypes, DebugVC50SymbolEnums { + + /** Indicates whether this iterator has processed all of the + available symbols. */ + public boolean done(); + + /** Go to the next symbol. NOTE that the iterator is pointing at the + first symbol initially, so one should use a while (!iter.done()) + { ... iter.next(); } construct. + + @throw NoSuchElementException if the iterator is already done + and next() is called. */ + public void next() throws NoSuchElementException; + + /** Length of record, in bytes, excluding the length field. */ + public short getLength(); + + /** The type enumeration is defined in {@link + sun.jvm.hotspot.debugger.win32.coff.DebugVC50SymbolTypes} */ + public int getType(); + + /** For debugging: returns the file offset of the current symbol. */ + public int getOffset(); + + ///////////////////////// + // S_COMPILE accessors // + ///////////////////////// + + /** Machine enumeration specifying target processor; see + DebugVC50SymbolEnums. */ + public byte getCompilerTargetProcessor(); + + /** Compile flags; see DebugVC50SymbolEnums. */ + public int getCompilerFlags(); + + /** Length-prefixed string specifying language processor version. + Language processors can place additional data in version string + if desired. */ + public String getComplierVersion(); + + ////////////////////////// + // S_REGISTER accessors // + ////////////////////////// + + /** Type of the symbol which is in the register */ + public int getRegisterSymbolType(); + + /** Enumerate of the registers in which the symbol is stored. The + high and low bytes are treated independently for values split + across two registers (i.e., 64-bit values on a 32-bit machine.) */ + public short getRegisterEnum(); + + /** Length-prefixed name of the symbol stored in the register. */ + public String getRegisterSymbolName(); + + // Note: register tracking elided as it is not implemented in the + // Microsoft compilers. + + ////////////////////////// + // S_CONSTANT accessors // + ////////////////////////// + + /** Type of symbol or containing enum. This record is used to output + constants and C enumerations. If used to output an enumeration, + then the type index refers to the containing enum. */ + public int getConstantType(); + + /** Numeric leaf containing the value of the symbol as an int */ + public int getConstantValueAsInt() throws DebugVC50WrongNumericTypeException; + + /** Numeric leaf containing the value of the symbol as a long */ + public long getConstantValueAsLong() throws DebugVC50WrongNumericTypeException; + + /** Numeric leaf containing the value of the symbol as a float */ + public float getConstantValueAsFloat() throws DebugVC50WrongNumericTypeException; + + /** Numeric leaf containing the value of the symbol as a double */ + public double getConstantValueAsDouble() throws DebugVC50WrongNumericTypeException; + + /** Length-prefixed name of the symbol */ + public String getConstantName(); + + ///////////////////// + // S_UDT accessors // + ///////////////////// + + /** Type of symbol. This specifies a C typedef or user-defined type, + such as classes, structures, unions, or enums. */ + public int getUDTType(); + + /** Length-prefixed name of the user defined type. */ + public String getUDTName(); + + ///////////////////////// + // S_SSEARCH accessors // + ///////////////////////// + + // FIXME: Add more documentation and understand what this does + + /** $$SYMBOL offset of the procedure or thunk record for this module + that has the lowest offset for the specified segment. */ + public int getSearchSymbolOffset(); + + /** Segment (PE section) that this Start Search refers to. */ + public short getSearchSegment(); + + ///////////////////// + // S_END accessors // + ///////////////////// + + // (No accessors) + // Closes the scope of the nearest preceding Block Start, Global + // Procedure Start, Local Procedure Start, With Start, or Thunk + // Start definition. + + ////////////////////// + // S_SKIP accessors // + ////////////////////// + + // (No accessors) + // Use the length field, available in every symbol, to skip over + // these records. + + /////////////////////////// + // S_CVRESERVE accessors // + /////////////////////////// + + // (No accessors) + + ///////////////////////// + // S_OBJNAME accessors // + ///////////////////////// + + /** Signature used to determine whether changes in precompiled types + defined in this module require a recompilation of users of those + types. This does not have much meaning given that the algorithm + for computing the signature is unspecified. */ + public int getObjectCodeViewSignature(); + + /** Length prefixed name of the object file without any path + information prepended to the name. */ + public String getObjectName(); + + //////////////////////// + // S_ENDARG accessors // + //////////////////////// + + // (No accessors) + + ////////////////////////// + // S_COBOLUDT accessors // + ////////////////////////// + + // (Elided as they are irrelevant) + + ///////////////////////// + // S_MANYREG accessors // + ///////////////////////// + + /** Type index of the symbol. This record is used to specify that a + symbol is stored in a set of registers. */ + public int getManyRegType(); + + /** Count of the register enumerates that follow. */ + public byte getManyRegCount(); + + /** Get the <i>i</i>th register (0..getManyRegCount() - 1). The + registers are listed high order register first. */ + public byte getManyRegRegister(int i); + + /** Name of the symbol. */ + public String getManyRegName(); + + //////////////////////// + // S_RETURN accessors // + //////////////////////// + + /** Logical or of FUNCRET_VARARGS_LEFT_TO_RIGHT_MASK (push varargs + left to right if set) and FUNCRET_RETURNEE_STACK_CLEANUP_MASK + (returnee cleans up stack if true). */ + public short getReturnFlags(); + + /** Function return style; see constants in {@link + sun.jvm.hotspot.debugger.win32.coff.DebugVC50SymbolEnums}. */ + public byte getReturnStyle(); + + /** Get count of registers containing return value; only valid for + FUNCRET_IN_REGISTERS return style. */ + public byte getReturnRegisterCount(); + + /** Get <i>i</i>th register (0..getReturnRegisterCount() - 1) + containing return value, high order first; only valid for + FUNCRET_IN_REGISTERS return style. */ + public byte getReturnRegister(int i); + + /////////////////////////// + // S_ENTRYTHIS accessors // + /////////////////////////// + + /** Advance this iterator to the symbol (which actually describes + the <b>this</b> pointer) contained within the S_ENTRYTHIS + symbol. */ + public void advanceToEntryThisSymbol(); + + /////////////////////////////////////////////////////////////////////// + // // + // // + // Symbols for (Intel) 16:32 Segmented and 32-bit Flat Architectures // + // // + // // + /////////////////////////////////////////////////////////////////////// + + ///////////////////////// + // S_BPREL32 accessors // + ///////////////////////// + + // This symbol specifies symbols that are allocated on the stack for + // a procedure. For C/C++, these include the actual parameters to a + // function and the local nonstatic variables of functions. + + /** Signed offset relative to BP. If 0, then the symbol was assigned + to a register or never instantiated by the optimizer and cannot + be evaluated because its location is unknown. */ + public int getBPRelOffset(); + + /** Type of the symbol. */ + public int getBPRelType(); + + /** Length-prefixed name of the symbol. */ + public String getBPRelName(); + + /////////////////////////////////////// + // S_LDATA32 and S_GDATA32 accessors // + /////////////////////////////////////// + + // FIXME: consider documenting this as covering S_PUB32 symbols as + // well + + // The formats of S_LDATA32 and S_GDATA32 symbols match; the only + // difference is the type tag. + // + // LDATA32 symbols are used for data that is not exported from a + // module. In C/C++, symbols that are declared static are emitted as + // Local Data symbols. Symbols that are emitted as Local Data cannot + // be moved by CVPACK into the global symbol table for the + // executable file. + // + // GDATA32 records have the same format as the Local Data 16:32 + // except that the record type is S_GDATA32. For C/C++, symbols that + // are not specifically declared static are emitted as Global Data + // Symbols and can be compacted by CVPACK into the global symbol + // table. + + /** Type index of the symbol. */ + public int getLGDataType(); + + /** Offset portion of the symbol address. */ + public int getLGDataOffset(); + + /** Segment portion of the symbol address. */ + public short getLGDataSegment(); + + /** Length-prefixed name of symbol. */ + public String getLGDataName(); + + /////////////////////// + // S_PUB32 accessors // + /////////////////////// + + // FIXME: has the same format as the above; consider updating + // documentation. No separate accessors provided. + + /////////////////////////////////////// + // S_LPROC32 and S_GPROC32 accessors // + /////////////////////////////////////// + + // LPROC32 and GPROC32 symbols have the same format, differing only + // in the type tag. + // + // The LPROC32 symbol record defines a local (file static) procedure + // definition. For C/C++, functions that are declared static to a + // module are emitted as Local Procedure symbols. Functions not + // specifically declared static are emitted as Global Procedures. + // + // GPROC32 records are used for procedures that are not specifically + // declared static to a module. The format is the same as the Local + // Procedure Start 16:32 symbol. + + /** Creates a new symbol iterator pointing to the symbol opening the + enclosing lexical scope of this function (if any); returns null + if there is no enclosing scope. */ + public DebugVC50SymbolIterator getLGProcParent(); + + /** Gets the absolute file offset of the parent symbol, or 0 if + none. This is useful for constructing and resolving types in a + lazy fashion. */ + public int getLGProcParentOffset(); + + /** Creates a new symbol iterator pointing to the block end symbol + terminating the lexical scope, or NULL if there is no containing + lexical scope. */ + public DebugVC50SymbolIterator getLGProcEnd(); + + /** Gets the absolute file offset of the end symbol. This is useful + for constructing and resolving types in a lazy fashion. */ + public int getLGProcEndOffset(); + + /** Creates a new symbol iterator pointing to the next outermost + scope symbol in the segment (if any); returns null if this is + the last outermost scope for the current segment. (See the + documentation for more information.) */ + public DebugVC50SymbolIterator getLGProcNext(); + + /** Gets the absolute file offset of the next symbol, or 0 if none. + This is useful for constructing and resolving types in a lazy + fashion. */ + public int getLGProcNextOffset(); + + /** Length in bytes of this procedure. */ + public int getLGProcLength(); + + /** Offset in bytes from the start of the procedure to the point + where the stack frame has been set up. Parameter and frame + variables can be viewed at this point. */ + public int getLGProcDebugStart(); + + /** Offset in bytes from the start of the procedure to the point + where the procedure is ready to return and has calculated its + return value, if any. Frame and register variables can still be + viewed. */ + public int getLGProcDebugEnd(); + + /** Type of the procedure type record. */ + public int getLGProcType(); + + /** Offset portion of the procedure address. */ + public int getLGProcOffset(); + + /** Segment portion of the procedure address. */ + public short getLGProcSegment(); + + /** Value defined by bitwise or of the the PROCFLAGS enumeration in + {@link + sun.jvm.hotspot.debugger.win32.coff.DebugVC50SymbolEnums}. */ + public byte getLGProcFlags(); + + /** Length-prefixed name of procedure. */ + public String getLGProcName(); + + ///////////////////////// + // S_THUNK32 accessors // + ///////////////////////// + + // This record is used to specify any piece of code that exists + // outside a procedure. It is followed by an End record. The thunk + // record is intended for small code fragments. and a two byte + // length field is sufficient for its intended purpose. + + /** Creates a new symbol iterator pointing to the symbol opening the + enclosing lexical scope of this thunk (if any); returns null if + there is no enclosing scope. */ + public DebugVC50SymbolIterator getThunkParent(); + + /** Gets the absolute file offset of the parent symbol, or 0 if + none. This is useful for constructing and resolving types in a + lazy fashion. */ + public int getThunkParentOffset(); + + /** Creates a new symbol iterator pointing to the block end symbol + terminating the lexical scope, or NULL if there is no containing + lexical scope. */ + public DebugVC50SymbolIterator getThunkEnd(); + + /** Gets the absolute file offset of the end symbol. This is useful + for constructing and resolving types in a lazy fashion. */ + public int getThunkEndOffset(); + + /** Creates a new symbol iterator pointing to the next outermost + scope symbol in the segment (if any); returns null if this is + the last outermost scope for the current segment. (See the + documentation for more information.) */ + public DebugVC50SymbolIterator getThunkNext(); + + /** Gets the absolute file offset of the next symbol, or 0 if none. + This is useful for constructing and resolving types in a lazy + fashion. */ + public int getThunkNextOffset(); + + /** Offset portion of the thunk address. */ + public int getThunkOffset(); + + /** Segment portion of the procedure address. */ + public short getThunkSegment(); + + /** Length in bytes of this thunk. */ + public short getThunkLength(); + + /** Ordinal specifying the type of thunk; see THUNK enumeration in + {@link + sun.jvm.hotspot.debugger.win32.coff.DebugVC50SymbolEnums}. */ + public byte getThunkType(); + + /** Length-prefixed name of thunk. */ + public String getThunkName(); + + /** Delta to be added to "this" pointer; only valid if thunk type is + "adjustor". */ + public short getThunkAdjustorThisDelta(); + + /** Length-prefixed name of target function; only valid if thunk type is + "adjustor". */ + public String getThunkAdjustorTargetName(); + + /** Displacement into the virtual table; only valid if thunk type is + "vcall". */ + public short getThunkVCallDisplacement(); + + /** Offset of p-code entry point; only valid if thunk type is + "pcode". */ + public int getThunkPCodeOffset(); + + /** Segment of p-code entry point; only valid if thunk type is + "pcode". */ + public short getThunkPCodeSegment(); + + ///////////////////////// + // S_BLOCK32 accessors // + ///////////////////////// + + // This symbol specifies the start of an inner block of lexically + // scoped symbols. The lexical scope is terminated by a matching + // S_END symbol. + + /** Creates a new symbol iterator pointing to the symbol opening the + enclosing lexical scope of this scope (if any); returns null if + there is no enclosing scope. */ + public DebugVC50SymbolIterator getBlockParent(); + + /** Gets the absolute file offset of the parent symbol, or 0 if + none. This is useful for constructing and resolving types in a + lazy fashion. */ + public int getBlockParentOffset(); + + /** Creates a new symbol iterator pointing to the block end symbol + terminating this scope. */ + public DebugVC50SymbolIterator getBlockEnd(); + + /** Gets the absolute file offset of the end symbol. This is useful + for constructing and resolving types in a lazy fashion. */ + public int getBlockEndOffset(); + + /** Length in bytes of the scope of this block. */ + public int getBlockLength(); + + /** Offset portion of the segmented procedure address. */ + public int getBlockOffset(); + + /** Segment portion of the segmented procedure address. */ + public short getBlockSegment(); + + /** Length-prefixed name of the block. */ + public String getBlockName(); + + //////////////////////// + // S_WITH32 accessors // + //////////////////////// + + // FIXME: this is a Pascal construct; ignored for now + + ///////////////////////// + // S_LABEL32 accessors // + ///////////////////////// + + /** Offset portion of the segmented address of the start of the + block. */ + public int getLabelOffset(); + + /** Segment portion of the segmented address of the start of the + block. */ + public short getLabelSegment(); + + /** Label flags. These are the same as the PROCFLAGS enumeration. */ + public byte getLabelFlags(); + + /** Length prefixed name of label. */ + public String getLabelName(); + + //////////////////////////// + // S_CEXMODEL32 accessors // + //////////////////////////// + + // This record is used to notify the debugger that, starting at the + // given code offset and until the address specified by the next + // Change Execution Model record, the execution model is of the + // specified type. The native execution model is assumed in the + // absence of Change Execution Model records. + + /** Offset portion of start of the block where the change occurs. */ + public int getChangeOffset(); + + /** Segment portion of start of the block where the change occurs. */ + public short getChangeSegment(); + + /** The execution model, enumerated in EXMODEL constants in {@link + sun.jvm.hotspot.debugger.win32.coff.DebugVC50SymbolEnums}. */ + public short getChangeModel(); + + // FIXME: figure out how to deal with variant (or whether it is + // necessary) + + //////////////////////////// + // S_VFTTABLE32 accessors // + //////////////////////////// + + // This record is used to describe the base class path for the + // virtual function table descriptor. + + /** The type index of the class at the root of the path. */ + public int getVTableRoot(); + + /** Type index of the record describing the base class path from the + root to the leaf class for the virtual function table. */ + public int getVTablePath(); + + /** Offset portion of start of the virtual function table. */ + public int getVTableOffset(); + + /** Segment portion of the virtual function table. */ + public short getVTableSegment(); + + ////////////////////////// + // S_REGREL32 accessors // + ////////////////////////// + + // This symbol specifies symbols that are allocated relative to a + // register. + + /** Signed offset relative to register. */ + public int getRegRelOffset(); + + /** Type of the symbol. */ + public int getRegRelType(); + + /** Register enumerates on which the symbol is based. Note that the + register field can specify a pair of register such as ES:EBX. */ + public short getRegRelRegister(); + + /** Length-prefixed name of the symbol. */ + public String getRegRelName(); + + /////////////////////////////////////////// + // S_LTHREAD32 and S_GTHREAD32 accessors // + /////////////////////////////////////////// + + // These symbols are used for data declared with the __thread + // storage attribute that is not exported from a module. In C/C++, + // __thread symbols that are declared static are emitted as Local + // Thread Storage 16:32 symbols. Symbols that are emitted as Local + // Thread Storage 16:32 cannot be moved by CVPACK into the global + // symbol table for the executable file. __thread symbols that are + // not specifically declared static are emitted as Global Thread + // Storage 16:32 symbols and can be compacted by CVPACK into the + // global symbol table. + + /** Type index. */ + public int getLThreadType(); + + /** Offset into thread local storage. */ + public int getLThreadOffset(); + + /** Segment of thread local storage. */ + public short getLThreadSegment(); + + /** Length prefixed name. */ + public String getLThreadName(); + + // NOTE: accessors for all other kinds of symbols (i.e., MIPS) + // elided for now (FIXME) +}