Class DWARFDataTypeManager


  • public class DWARFDataTypeManager
    extends java.lang.Object
    Manages mappings between DWARF DIEs and Ghidra DataTypes.
    • Method Detail

      • doGetDataType

        public DataType doGetDataType​(DIEAggregate diea)
                               throws java.io.IOException,
                                      DWARFExpressionException
        Creates a DataType from the DWARF DIEA, or returns a pre-existing DataType created by the specified DIEA previously.

        Creating a new DataType happens in two stages, where the DataType is created as an 'impl' DataType first (possibly representing a large graph of referred-to datatypes), and then it is submitted to the DataTypeManager to be added to the database and converted to a 'db' object.

        Mapping from the DIEA's offset to the resultant 'db' DataType object is a two step process.

        A DataTypeGraphComparator is used to walk the 'impl' DataType object graph in lock-step with the resultant 'db' DataType object graph, and the mapping between the 'impl' object and its creator DIEA (held in #currentImplDataTypeToDIE) is used to create a mapping to the resultant 'db' DataType's path.

        Parameters:
        diea - DWARF DIEAggregate with datatype information that needs to be converted to a Ghidra DataType.
        Returns:
        DataType that is ready to use.
        Throws:
        java.io.IOException - if problem
        DWARFExpressionException - if problem
      • getImportedTypes

        public java.util.List<DataTypePath> getImportedTypes()
      • getDataType

        public DataType getDataType​(DIEAggregate diea,
                                    DataType defaultValue)
        Returns a Ghidra DataType corresponding to the specified DIEAggregate, or the specified defaultValue if the DIEA param is null or does not map to an already defined datatype (registered with #addType(long, DataType, DWARFImportSummary)).

        Parameters:
        diea - DIEAggregate that defines a data type
        defaultValue - Ghidra DataType to return if the specified DIEA is null or not already defined.
        Returns:
        Ghidra DataType
        Throws:
        DWARFExpressionException
        java.io.IOException
      • getDataType

        public DataType getDataType​(long dieOffset,
                                    DataType defaultValue)
        Returns a Ghidra DataType corresponding to the specified DIE (based on its offset), or the specified defaultValue if the DIE does not map to a defined datatype (registered with #addType(long, DataType, DWARFImportSummary)).

        Parameters:
        dieOffset - offset of a DIE record that defines a data type
        defaultValue - Ghidra DataType to return if the specified DIE not already defined.
        Returns:
        Ghidra DataType
      • getSpecificDataType

        public <T extends DataType> T getSpecificDataType​(DIEAggregate diea,
                                                          java.lang.Class<T> dataTypeClazz)
      • getPtrTo

        public DataType getPtrTo​(DataType dt)
        Returns a pointer to the specified data type.
        Parameters:
        dt - Ghidra DataType
        Returns:
        a Pointer that points to the specified datatype.
      • forAllConflicts

        public java.lang.Iterable<DataType> forAllConflicts​(DataTypePath dtp)
        Iterate all DataTypes that match the CategoryPath / name given in the DataTypePath parameter, including "conflict" datatypes that have a ".CONFLICTxx" suffix.
        Parameters:
        dtp -
        Returns:
      • getOffsetType

        public DataType getOffsetType​(int size)
        Returns a Ghidra datatype that corresponds to a type that can be used to represent an offset.

        Parameters:
        size -
        Returns:
      • getVoidType

        public DataType getVoidType()
        Returns the void type.
        Returns:
        void DataType
      • getUndefined1Type

        public DataType getUndefined1Type()
        Returns datatype to hold a 1 byte undefined value.
        Returns:
        undefined 1 byte DataType.
      • getBaseType

        public DataType getBaseType​(java.lang.String name)
        Returns a DWARF base data type based on its name, or null if it does not exist.
        Parameters:
        name - base type name
        Returns:
        DataType or null if base type does not exist
      • getBaseType

        public DataType getBaseType​(java.lang.String name,
                                    int dwarfSize,
                                    int dwarfEncoding,
                                    boolean isBigEndian)
        Returns a Ghidra datatype that corresponds to the DWARF named type.

        If there is no direct matching named Ghidra type, generic types of matching size will be returned for integer and floating numeric dwarf encoding types, boolean, and character types. Failing that, generic storage types of matching size (word, dword, etc) will be returned, and failing that, an array of the correct size will be returned.

        If the returned data type is not a direct named match, the returned data type will be wrapped in a Ghdira typedef using the dwarf type's name.

        Any newly created Ghidra data types will be cached and the same instance will be returned if the same DWARF named base type is requested again.

        Parameters:
        name -
        dwarfSize -
        dwarfEncoding -
        isBigEndian -
        Returns:
      • importAllDataTypes

        public void importAllDataTypes​(TaskMonitor monitor)
                                throws java.io.IOException,
                                       DWARFException,
                                       CancelledException
        Does the actual import work. Updates the summary object with information about the types imported and errors encountered.
        Parameters:
        TaskMonitor - monitor to watch for cancel
        Throws:
        java.io.IOException - if errors are encountered reading data
        DWARFException - if errors are encountered processing
        CancelledException - if the TaskMonitor is canceled by the user.