Package ghidra.app.util.bin.format.dwarf4.next

# Class DWARFDataTypeManager

java.lang.Object
ghidra.app.util.bin.format.dwarf4.next.DWARFDataTypeManager

public class DWARFDataTypeManager extends Object
Manages mappings between DWARF DIEs and Ghidra DataTypes.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `DWARFDataTypeManager(DWARFProgram prog, DataTypeManager dataTypeManager)`
  Creates a new `DWARFDataTypeManager` instance.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addDataType(long offset, DataType dataType, DWARFSourceInfo dsi)`
  `DataType`
  `doGetDataType(DIEAggregate diea)`
  Creates a `DataType` from the DWARF `DIEA`, or returns a pre-existing `DataType` created by the specified DIEA previously.
  `Iterable<DataType>`
  `forAllConflicts(DataTypePath dtp)`
  Iterate all `DataType`s that match the CategoryPath / name given in the `DataTypePath` parameter, including "conflict" datatypes that have a ".CONFLICTxx" suffix.
  `DataType`
  `getBaseType(String name)`
  Returns a DWARF base data type based on its name, or null if it does not exist.
  `DataType`
  `getBaseType(String name, int dwarfSize, int dwarfEncoding, boolean isBigEndian, boolean isExplictSize)`
  Returns a Ghidra `datatype` that corresponds to the DWARF named type.
  `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 `addDataType(long, DataType, DWARFSourceInfo)`).
  `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 `addDataType(long, DataType, DWARFSourceInfo)`).
  `DataType`
  `getDataTypeForVariable(DIEAggregate diea)`
  `FunctionDefinition`
  `getFunctionSignature(DIEAggregate diea)`
  Construct a temporary 'impl' `FunctionDefinition` DataType using the information found in the specified `DIEAggregate`.
  `List<DataTypePath>`
  `getImportedTypes()`
  `DataType`
  `getOffsetType(int size)`
  Returns a Ghidra `datatype` that corresponds to a type that can be used to represent an offset.
  `DataType`
  `getPtrTo(DataType dt)`
  Returns a pointer to the specified data type.
  `DataType`
  `getPtrTo(DataType dt, int ptrSize)`
  `DWARFSourceInfo`
  `getSourceInfo(DataType dataType)`
  `<T extends DataType>
  T`
  `getSpecificDataType(DIEAggregate diea, Class<T> dataTypeClazz)`
  `DataType`
  `getUndefined1Type()`
  Returns datatype to hold a 1 byte undefined value.
  `DataType`
  `getVoidType()`
  Returns the void type.
  `void`
  `importAllDataTypes(TaskMonitor monitor)`
  Does the actual import work.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### DWARFDataTypeManager

    public DWARFDataTypeManager(DWARFProgram prog, DataTypeManager dataTypeManager)
    Creates a new `DWARFDataTypeManager` instance.
    Parameters:
      `prog` - `DWARFProgram` that holds the Ghidra `Program` being imported.
      `dataTypeManager` - `DataTypeManager` of the Ghidra Program.

- ## Method Details

  - ### doGetDataType

    public DataType doGetDataType(DIEAggregate diea) throws 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 `DWARFDataTypeImporter.DWARFDataType`) 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:
      `IOException` - if problem
      `DWARFExpressionException` - if problem

  - ### addDataType

    public void addDataType(long offset, DataType dataType, DWARFSourceInfo dsi)

  - ### getImportedTypes

    public List<DataTypePath> getImportedTypes()

  - ### getSourceInfo

    public DWARFSourceInfo getSourceInfo(DataType dataType)

  - ### 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 `addDataType(long, DataType, DWARFSourceInfo)`).

    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`

  - ### 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 `addDataType(long, DataType, DWARFSourceInfo)`).

    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, Class<T> dataTypeClazz)

  - ### getDataTypeForVariable

    public DataType getDataTypeForVariable(DIEAggregate diea)

  - ### 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.

  - ### getPtrTo

    public DataType getPtrTo(DataType dt, int ptrSize)

  - ### forAllConflicts

    public Iterable<DataType> forAllConflicts(DataTypePath dtp)
    Iterate all `DataType`s 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(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(String name, int dwarfSize, int dwarfEncoding, boolean isBigEndian, boolean isExplictSize)
    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 Ghidra 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` -
      `isExplictSize` - boolean flag, if true the returned data type will not be linked to the dataOrganization's compiler specified data types (eg. if type is something like int32_t, the returned type should never change size, even if the dataOrg changes). If false, the returned type will be linked to the dataOrg's compiler specified data types if possible, except for data types that have a name that include a bitsize in the name, such as "int64_t".
    Returns:

  - ### importAllDataTypes

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

  - ### getFunctionSignature

    public FunctionDefinition getFunctionSignature(DIEAggregate diea)
    Construct a temporary 'impl' `FunctionDefinition` DataType using the information found in the specified `DIEAggregate`.
    Parameters:
      `diea` - `DIEAggregate` of a subprogram, callsite, etc.
    Returns:
      `FunctionDefinition` impl (not saved to the DB) or null if not a valid DIEA.