Class DIEAggregate
- java.lang.Object
-
- ghidra.app.util.bin.format.dwarf4.DIEAggregate
-
public class DIEAggregate extends java.lang.ObjectDIEAggregate groups relatedDebugInfoEntryrecords together in a single interface for querying attribute values.Information about program elements are written into the .debug_info as partial snapshots of the element, with later follow-up records that more fully specify the program element.
(For instance, a declaration-only DIE that introduces the name of a structure type will be found at the beginning of a compilation unit, followed later by a DIE that specifies the contents of the structure type)
A DIEAggregate groups these
DebugInfoEntryrecords under one interface so a fully specified view of the program element can be presented.
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static DIEAggregatecreateFromHead(DebugInfoEntry die)Creates aDIEAggregatestarting from a 'head'DebugInfoEntryinstance.static DIEAggregatecreateSingle(DebugInfoEntry die)Create aDIEAggregatefrom a singleDIE.static DIEAggregatecreateSkipHead(DIEAggregate source)Creates a newDIEAggregatefrom the contents of the specified DIEA, using all the source'sDebugInfoEntryfragments except for the head fragment which is skipped.booleanequals(java.lang.Object obj)longevaluateLocation(DWARFLocation location)Evaluate the DWARFExpression located in the DWARFLocation object in the context of this DIEA.java.util.List<DWARFLocation>getAsLocation(int attribute)Returns the location list info specified in the attribute.DWARFAttributeValuegetAttribute(int attribute)<T extends DWARFAttributeValue>
TgetAttribute(int attribute, java.lang.Class<T> clazz)Finds aattributewith a matchingDWARFAttributetypebooleangetBool(int attribute, boolean defaultValue)Returns the boolean value of the requested attribute, or -defaultValue- if the attribute is missing or not the correct type.DWARFCompilationUnitgetCompilationUnit()DIEAggregategetContainingTypeRef()Returns the DIE pointed to by a DW_AT_containing_type attribute.longgetDeclOffset()DIEAggregategetDeclParent()intgetDepth()Returns the depth of the head fragment, where depth is defined as the distance between the DIE and the root DIE of the owning compilation unit.intgetFragmentCount()DebugInfoEntrygetHeadFragment()Returns the firstDIEfragment, ie.java.lang.StringgetHexOffset()ReturnsgetOffset()as a hex string.longgetHighPC()Returns the value of the DW_AT_high_pc attribute, adjusted if necessary by the value of DW_AT_low_pc.DebugInfoEntrygetLastFragment()Returns the lastDIEfragment, ie.longgetLong(int attribute, long defaultValue)Returns the value of the requested attribute, or -defaultValue- if the attribute is missing.longgetLowPC(long defaultValue)Returns the value of the DW_AT_low_pc attribute, if it exists.java.lang.StringgetName()Returns the string value of thedw_at_nameattribute, or null if it is missing.longgetOffset()long[]getOffsets()DIEAggregategetParent()DWARFProgramgetProgram()DIEAggregategetRef(int attribute)DebugInfoEntrygetRefDIE(int attribute)Returns thedieinstance pointed to by the requested attribute, or null if the attribute does not exist.java.lang.StringgetString(int attribute, java.lang.String defaultValue)Returns the string value of the requested attribute, or -defaultValue- if the attribute is missing or not the correct type.intgetTag()DIEAggregategetTypeRef()longgetUnsignedLong(int attribute, long defaultValue)Returns the unsigned long integer value of the requested attribute, or -defaultValue- if the attribute is missing.booleanhasAttribute(int attribute)inthashCode()booleanhasOffset(long offset)Returns true if any of theDIEsthat makeup this aggregate have the specified offset.booleanisDanglingDeclaration()Returns true if this DIE has a DW_AT_declaration attribute and does NOT have a matching inbound DW_AT_specification reference.booleanisFuncDefType()booleanisNamedType()booleanisNameSpaceContainer()Returns true if the children of this DIE are within a new namespace.booleanisPartialDeclaration()Returns true if this DIE has a DW_AT_declaration attribute.booleanisStructureType()Returns true if this DIE defines a structure-like element (class, struct, interface, union).intparseDataMemberOffset(int attribute, int defaultValue)Returns the unsigned integer value of the requested attribute after resolving any DWARF expression opcodes.java.util.List<DWARFRange>parseDebugRange(int attribute)Parses a range list from the debug_ranges section.intparseInt(int attribute, int defaultValue)Returns the signed integer value of the requested attribute after resolving any DWARF expression opcodes.longparseUnsignedLong(int attribute, long defaultValue)Returns the unsigned integer value of the requested attribute after resolving any DWARF expression opcodes.java.lang.StringtoString()
-
-
-
Method Detail
-
createFromHead
public static DIEAggregate createFromHead(DebugInfoEntry die)
Creates aDIEAggregatestarting from a 'head'DebugInfoEntryinstance.DW_AT_abstract_origin and DW_AT_specification attributes are followed to find the previous
DebugInfoEntryinstances.- Parameters:
die- starting DIE record- Returns:
- new
DIEAggregatemade up of the starting DIE and all DIEs that it points to via abstract_origin and spec attributes.
-
createSkipHead
public static DIEAggregate createSkipHead(DIEAggregate source)
Creates a newDIEAggregatefrom the contents of the specified DIEA, using all the source'sDebugInfoEntryfragments except for the head fragment which is skipped.Used when a DIEA is composed of a head DIE with a different TAG type than the rest of the DIEs. (ie. a dw_tag_call_site -> dw_tag_sub DIEA)
- Parameters:
source-- Returns:
-
createSingle
public static DIEAggregate createSingle(DebugInfoEntry die)
Create aDIEAggregatefrom a singleDIE.Mainly useful early in the
DWARFCompilationUnit's bootstrapping process when it needs to read values from DIEs.- Parameters:
die-- Returns:
-
getFragmentCount
public int getFragmentCount()
-
getOffset
public long getOffset()
-
getOffsets
public long[] getOffsets()
-
hasOffset
public boolean hasOffset(long offset)
Returns true if any of theDIEsthat makeup this aggregate have the specified offset.- Parameters:
offset- DIE offset to search for- Returns:
- true if this
DIEAggregatehas a fragment DIE at that offset.
-
getDeclOffset
public long getDeclOffset()
-
getHexOffset
public java.lang.String getHexOffset()
ReturnsgetOffset()as a hex string.- Returns:
-
getTag
public int getTag()
-
getCompilationUnit
public DWARFCompilationUnit getCompilationUnit()
-
getProgram
public DWARFProgram getProgram()
-
getLastFragment
public DebugInfoEntry getLastFragment()
Returns the lastDIEfragment, ie. the decl DIE.- Returns:
-
getHeadFragment
public DebugInfoEntry getHeadFragment()
Returns the firstDIEfragment, ie. the spec or abstract_origin DIE.- Returns:
-
getDeclParent
public DIEAggregate getDeclParent()
-
getParent
public DIEAggregate getParent()
-
getDepth
public int getDepth()
Returns the depth of the head fragment, where depth is defined as the distance between the DIE and the root DIE of the owning compilation unit.The root die would return 0, the children of the root will return 1, etc.
This value matches the nesting value shown when dumping DWARF info using 'readelf'.
- Returns:
-
getAttribute
public <T extends DWARFAttributeValue> T getAttribute(int attribute, java.lang.Class<T> clazz)
Finds aattributewith a matchingDWARFAttributetypeReturns null if the attribute does not exist or is wrong java class type.
Attributes are searched for in each fragment in this aggregate, starting with the 'head' fragment, progressing toward the 'decl' fragment.
- Parameters:
attribute- SeeDWARFAttributeclazz- must be derived fromDWARFAttributeValue- Returns:
-
getAttribute
public DWARFAttributeValue getAttribute(int attribute)
-
getLong
public long getLong(int attribute, long defaultValue)Returns the value of the requested attribute, or -defaultValue- if the attribute is missing.- Parameters:
attribute-defaultValue-- Returns:
-
getBool
public boolean getBool(int attribute, boolean defaultValue)Returns the boolean value of the requested attribute, or -defaultValue- if the attribute is missing or not the correct type.- Parameters:
attribute-defaultValue-- Returns:
-
getString
public java.lang.String getString(int attribute, java.lang.String defaultValue)Returns the string value of the requested attribute, or -defaultValue- if the attribute is missing or not the correct type.- Parameters:
attribute-defaultValue-- Returns:
-
getName
public java.lang.String getName()
Returns the string value of thedw_at_nameattribute, or null if it is missing.- Returns:
-
getUnsignedLong
public long getUnsignedLong(int attribute, long defaultValue)Returns the unsigned long integer value of the requested attribute, or -defaultValue- if the attribute is missing.The 'unsigned'ness of this method refers to how the binary value is read from the dwarf information (ie. a value with the high bit set is not treated as signed).
The -defaultValue- parameter can accept a negative value.
- Parameters:
attribute-defaultValue-- Returns:
-
getRefDIE
public DebugInfoEntry getRefDIE(int attribute)
Returns thedieinstance pointed to by the requested attribute, or null if the attribute does not exist.- Parameters:
attribute-- Returns:
-
getRef
public DIEAggregate getRef(int attribute)
-
getContainingTypeRef
public DIEAggregate getContainingTypeRef()
Returns the DIE pointed to by a DW_AT_containing_type attribute.- Returns:
- DIEA pointed to by the DW_AT_containing_type attribute, or null if not present.
-
getTypeRef
public DIEAggregate getTypeRef()
-
hasAttribute
public boolean hasAttribute(int attribute)
-
parseInt
public int parseInt(int attribute, int defaultValue) throws java.io.IOException, DWARFExpressionExceptionReturns the signed integer value of the requested attribute after resolving any DWARF expression opcodes.- Parameters:
attribute-defaultValue-- Returns:
- Throws:
java.io.IOExceptionDWARFExpressionException
-
parseUnsignedLong
public long parseUnsignedLong(int attribute, long defaultValue) throws java.io.IOException, DWARFExpressionExceptionReturns the unsigned integer value of the requested attribute after resolving any DWARF expression opcodes.- Parameters:
attribute-defaultValue-- Returns:
- Throws:
java.io.IOExceptionDWARFExpressionException
-
parseDataMemberOffset
public int parseDataMemberOffset(int attribute, int defaultValue) throws java.io.IOException, DWARFExpressionExceptionReturns the unsigned integer value of the requested attribute after resolving any DWARF expression opcodes.- Parameters:
attribute-defaultValue-- Returns:
- Throws:
java.io.IOExceptionDWARFExpressionException
-
getAsLocation
public java.util.List<DWARFLocation> getAsLocation(int attribute) throws java.io.IOException
Returns the location list info specified in the attribute.Numeric attributes are treated as offsets into the debug_loc section.
Blob attributes are treated as a single location record for the current CU, using the blob bytes as the DWARF expression of the location record.
- Parameters:
attribute-- Returns:
- Throws:
java.io.IOException
-
evaluateLocation
public long evaluateLocation(DWARFLocation location) throws java.io.IOException, DWARFExpressionException
Evaluate the DWARFExpression located in the DWARFLocation object in the context of this DIEA.- Parameters:
location-- Returns:
- Throws:
java.io.IOExceptionDWARFExpressionException
-
isDanglingDeclaration
public boolean isDanglingDeclaration()
Returns true if this DIE has a DW_AT_declaration attribute and does NOT have a matching inbound DW_AT_specification reference.- Returns:
-
isPartialDeclaration
public boolean isPartialDeclaration()
Returns true if this DIE has a DW_AT_declaration attribute.- Returns:
-
isNamedType
public boolean isNamedType()
-
isNameSpaceContainer
public boolean isNameSpaceContainer()
Returns true if the children of this DIE are within a new namespace.Ie. Namespaces, subprogram, class, interface, struct, union, enum
- Returns:
-
isStructureType
public boolean isStructureType()
Returns true if this DIE defines a structure-like element (class, struct, interface, union).- Returns:
-
isFuncDefType
public boolean isFuncDefType()
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
parseDebugRange
public java.util.List<DWARFRange> parseDebugRange(int attribute) throws java.io.IOException
Parses a range list from the debug_ranges section. See DWARF4 Section 2.17.3 (Non-Contiguous Address Ranges).This method is similar to
DWARFLocation#parseLocationList(long, DebugInfoEntry)and may have the same gotchas that need to be ported over.- Parameters:
attribute- attribute ie.DWARFAttribute.DW_AT_rangesdebug_ranges- debug_ranges section byte provider- Returns:
- list of ranges
- Throws:
java.io.IOException- if an I/O error occurs
-
getLowPC
public long getLowPC(long defaultValue)
Returns the value of the DW_AT_low_pc attribute, if it exists.- Parameters:
defaultValue-- Returns:
-
getHighPC
public long getHighPC() throws java.io.IOExceptionReturns the value of the DW_AT_high_pc attribute, adjusted if necessary by the value of DW_AT_low_pc.- Returns:
- Throws:
java.io.IOException- if the DW_AT_high_pc attribute isn't a numeric attribute, or if the DW_AT_low_pc value is needed and is not present.
-
hashCode
public int hashCode()
- Overrides:
hashCodein classjava.lang.Object
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equalsin classjava.lang.Object
-
-