Class DWARFUtil


  • public class DWARFUtil
    extends java.lang.Object
    • Constructor Detail

      • DWARFUtil

        public DWARFUtil()
    • Method Detail

      • toString

        public static java.lang.String toString​(java.lang.Class<?> clazz,
                                                int value)
        Converts a integer value to its corresponding symbolic name from the set of "public static final" member variables in a class.

        This is a bit of a hack and probably originated from pre-java Enum days.

        Parameters:
        clazz - The Class to search for the matching static value.
        value - the integer value to search for
        Returns:
        the String name of the matching field.
      • toString

        public static java.lang.String toString​(java.lang.Class<?> clazz,
                                                long value)
        Returns the field name of a final static variable in class clazz which holds a specific value.

        Can be thought of as an enum numeric value to to name lookup.

        Parameters:
        clazz -
        value -
        Returns:
      • getStaticFinalFieldWithValue

        public static java.lang.reflect.Field getStaticFinalFieldWithValue​(java.lang.Class<?> clazz,
                                                                           long value)
        Searches a Class for a final static variable that has a specific numeric value.
        Parameters:
        clazz - Class to search.
        value - numeric value to search for
        Returns:
        Java reflection Field that has the specified value or null
      • getContainerTypeName

        public static java.lang.String getContainerTypeName​(DIEAggregate diea)
        Returns a string that describes what kind of object is specified by the DIEAggregate.

        Used to create a name for anonymous types.

        Parameters:
        diea - DIEAggregate
        Returns:
        String describing the type of the DIEA.
      • getSymbolTypeFromDIE

        public static SymbolType getSymbolTypeFromDIE​(DIEAggregate diea)
        Returns the SymbolType that corresponds to the specified DIEAggregate.

        The mapping between DIE type and SymbolType is not exact. There is no matching SymbolType for a DWARF static variable, so "LOCAL_VAR" is used currently.

        This mainly is used in constructing a NamespacePath, and the only critical usage there is Namespace vs. Class vs. everything else.

        Parameters:
        diea - DIEAggregate to query
        Returns:
        SymbolType
      • parseMangledNestings

        public static java.util.List<java.lang.String> parseMangledNestings​(java.lang.String s)
        A lightweight attempt to get nesting (ie. namespaces and such) information from gnu mangled name strings.

        For example, "_ZN19class1_inline_funcs3fooEv" -> [19 chars]'class1_inline_funcs', [3 chars]'foo'

        Parameters:
        s -
        Returns:
      • findLinkageNameInChildren

        public static java.util.List<java.lang.String> findLinkageNameInChildren​(DebugInfoEntry die)
        Try to find gnu mangled name nesting info in a DIE's children's linkage strings.

        Parameters:
        die -
        Returns:
        a list of string of nesting names, ending with what should be the DIE parameter's name.
      • getTemplateBaseName

        public static java.lang.String getTemplateBaseName​(java.lang.String name)
        Determines if a name is a C++ style templated name. If so, returns just the base portion of the name. The name must have a start and end angle bracket: '<' and '>'.

        operator<() and operator<<() are handled so their angle brackets don't trigger the template start/end angle bracket incorrectly.

        Parameters:
        name - symbol name with C++ template portions
        Returns:
        base portion of the symbol name without template portion
      • getAnonNameForMeFromParentContext

        public static java.lang.String getAnonNameForMeFromParentContext​(DIEAggregate diea)
        Creates a name for anon types based on their position in their parent's childList.

        Parameters:
        diea - the die aggregate.
        Returns:
        the anonymous name of the die aggregate.
      • getAnonNameForMeFromParentContext2

        public static java.lang.String getAnonNameForMeFromParentContext2​(DIEAggregate diea)
        Creates a name for anon types based on the names of sibling entries that are using the anon type.

        Example: "anon_struct_for_field1_field2"

        Falls back to getAnonNameForMeFromParentContext(DIEAggregate) if no siblings found.

        Parameters:
        diea - the die aggregate.
        Returns:
        the anonymous name of the die aggregate.
      • getLexicalBlockName

        public static java.lang.String getLexicalBlockName​(DIEAggregate diea)
        Create a name for a lexical block, with "_" separated numbers indicating nesting information of the lexical block.
        Parameters:
        diea - DIEAggregate pointing to a lexical block entry.
        Returns:
        string, ie. "lexical_block_1_2_3"
      • getMyPositionInParent

        public static int getMyPositionInParent​(DebugInfoEntry die)
        Returns the ordinal position of this DebugInfoEntry in it's parent.
        Parameters:
        die - DebugInfoEntry
        Returns:
        int index of ourself in our parent, or -1 if not found in parent.
      • appendDescription

        public static void appendDescription​(DataType dt,
                                             java.lang.String description,
                                             java.lang.String sep)
        Append a string to a DataType's description.
        Parameters:
        dt - DataType
        description - string to append, if null or empty nothing happens.
        sep - characters to place after previous description to separate it from the new portion.
      • appendDescription

        public static void appendDescription​(DataTypeComponent dtc,
                                             java.lang.String description,
                                             java.lang.String sep)
        Append a string to a description of a field in a structure.
        Parameters:
        dtc - the field in a struct
        description - string to append, if null or empty nothing happens.
        sep - characters to place after previous description to separate it from the new portion.
      • readOffsetByDWARFformat

        public static long readOffsetByDWARFformat​(BinaryReader reader,
                                                   int dwarfFormat)
                                            throws java.io.IOException
        Read an offset value who's size depends on the DWARF format: 32 vs 64.

        Parameters:
        reader - BinaryReader pointing to the value to read
        dwarfFormat - - See DWARFCompilationUnit.DWARF_32 and DWARFCompilationUnit.DWARF_64.
        Returns:
        the offset value
        Throws:
        java.io.IOException - if an I/O error occurs or bad dwarfFormat value
      • readVarSizedULong

        public static long readVarSizedULong​(BinaryReader reader,
                                             int pointerSize)
                                      throws java.io.IOException
        Read a variable-sized unsigned integer and return it as a java signed long.

        Parameters:
        reader - BinaryReader to read the data from
        pointerSize - number of bytes the value is stored in, must be 1, 2, 4, or 8.
        Returns:
        unsigned long integer value.
        Throws:
        java.io.IOException - if error
      • readVarSizedUInt

        public static int readVarSizedUInt​(BinaryReader reader,
                                           int size)
                                    throws java.io.IOException
        Read a variable-sized unsigned integer and return it as a java signed int.

        Unsigned 32 bit int values larger than java's signed Integer.MAX_VALUE are not supported and will throw an IOException.

        Parameters:
        reader - BinaryReader to read the data from
        size - number of bytes the integer value is stored in, must be 1, 2 or 4.
        Returns:
        unsigned integer value.
        Throws:
        java.io.IOException - if error
      • readAddress

        public static java.lang.Number readAddress​(BinaryReader reader,
                                                   byte pointerSize)
                                            throws java.io.IOException
        Read the value of an address.
        Parameters:
        reader - BinaryReader pointing to the value to read
        pointerSize - the size of a pointer
        Returns:
        the address value
        Throws:
        java.io.IOException - if an I/O error occurs
        java.lang.IllegalArgumentException - if an unknown pointer size is given
      • readAddressAsLong

        public static long readAddressAsLong​(BinaryReader reader,
                                             byte pointerSize)
                                      throws java.io.IOException
        Reads a variable-sized unsigned 'address' value from a BinaryReader and returns it as a 64 bit java long.

        The valid pointerSizes are 1, 2, 4, and 8.

        Parameters:
        reader - BinaryReader to read the data from
        pointerSize - number of bytes the value is stored in, must be 1, 2, 4, or 8.
        Returns:
        unsigned long value.
        Throws:
        java.io.IOException - if error
      • isThisParam

        public static boolean isThisParam​(DIEAggregate paramDIEA)
      • getReferringTypedef

        public static DIEAggregate getReferringTypedef​(DIEAggregate diea)
        Returns the DIEAggregate of a typedef that points to the specified datatype.

        Returns null if there is no typedef pointing to the specified DIEA or if there are multiple.

        Parameters:
        diea - DIEAggregate of a data type that might be the target of typedefs.
        Returns:
        DIEAggregate of the singular typedef that points to the arg, otherwise null if none or multiple found.