Class DIEAggregate
DebugInfoEntry records 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 DebugInfoEntry records under one interface so a fully
specified view of the program element can be presented.
-
Method Summary
Modifier and TypeMethodDescriptionstatic DIEAggregateCreates aDIEAggregatestarting from a 'head'DebugInfoEntryinstance.static DIEAggregateCreate 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.booleanlongevaluateLocation(DWARFLocation location) Evaluate the DWARFExpression located in the DWARFLocation object in the context of this DIEA.<T extends DWARFAttributeValue>
TfindAttributeInChildren(int attribute, int childTag, Class<T> clazz) Return an attribute that is present in thisDIEAggregate, or in any of its direct children (of a specific type)Return aDIEAggregatethat only contains the information present in the "abstract instance" (and lower) DIEs.getAsLocation(int attribute, DWARFRange range) Returns the location list info specified in the attribute.getAttribute(int attribute) <T extends DWARFAttributeValue>
TgetAttribute(int attribute, 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.getChildren(int childTag) Return a list of children that are of a specific DWARF type.Returns the DIE pointed to by a DW_AT_containing_type attribute.longintgetDepth()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.intReturns a function's parameter list, taking care to ensure that the params are well ordered (to avoid issues with concrete instance param ordering)Returns the firstDIEfragment, ie.ReturnsgetOffset()as a hex string.longReturns the value of the DW_AT_high_pc attribute, adjusted if necessary by the value of DW_AT_low_pc.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.getName()Returns the string value of thedw_at_nameattribute, or null if it is missing.longlong[]getRef(int attribute) getRefDIE(int attribute) Returns thedieinstance pointed to by the requested attribute, or null if the attribute does not exist.Returns the name of the source file this item was declared in (DW_AT_decl_file)Returns the string value of the requested attribute, or -defaultValue- if the attribute is missing or not the correct type.intgetTag()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.booleanReturns true if this DIE has a DW_AT_declaration attribute and does NOT have a matching inbound DW_AT_specification reference.booleanbooleanReturns true if the raw lowPc and highPc values are the same.booleanbooleanReturns true if the children of this DIE are within a new namespace.booleanReturns true if this DIE has a DW_AT_declaration attribute.booleanReturns 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.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.readRange(int attribute) Parses a range list from the debug_ranges section.toString()
-
Method Details
-
createFromHead
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
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
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
ReturnsgetOffset()as a hex string.- Returns:
-
getTag
public int getTag() -
getCompilationUnit
-
getProgram
-
getLastFragment
Returns the lastDIEfragment, ie. the decl DIE.- Returns:
-
getHeadFragment
Returns the firstDIEfragment, ie. the spec or abstract_origin DIE.- Returns:
-
getDeclParent
-
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:
-
findAttributeInChildren
public <T extends DWARFAttributeValue> T findAttributeInChildren(int attribute, int childTag, Class<T> clazz) Return an attribute that is present in thisDIEAggregate, or in any of its direct children (of a specific type)- Type Parameters:
T-- Parameters:
attribute- the attribute to findchildTag- the type of children to searchclazz- type of the attribute to return- Returns:
- attribute value, or null if not found
-
getAttribute
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
-
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
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
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
Returns thedieinstance pointed to by the requested attribute, or null if the attribute does not exist.- Parameters:
attribute-- Returns:
-
getRef
-
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
-
getSourceFile
Returns the name of the source file this item was declared in (DW_AT_decl_file)- Returns:
- name of file this item was declared in, or null if info not available
-
getChildren
Return a list of children that are of a specific DWARF type.- Parameters:
childTag- seeDWARFTag DW_TAG_* values- Returns:
- List of children DIEs that match the specified tag
-
hasAttribute
public boolean hasAttribute(int attribute) -
getAbstractInstance
Return aDIEAggregatethat only contains the information present in the "abstract instance" (and lower) DIEs.- Returns:
- a new
DIEAggregate, or null if this DIEA was not split into a concrete and abstract portion
-
parseInt
Returns the signed integer value of the requested attribute after resolving any DWARF expression opcodes.- Parameters:
attribute-defaultValue-- Returns:
- Throws:
IOExceptionDWARFExpressionException
-
parseUnsignedLong
public long parseUnsignedLong(int attribute, long defaultValue) throws IOException, DWARFExpressionException Returns the unsigned integer value of the requested attribute after resolving any DWARF expression opcodes.- Parameters:
attribute-defaultValue-- Returns:
- Throws:
IOExceptionDWARFExpressionException
-
parseDataMemberOffset
public int parseDataMemberOffset(int attribute, int defaultValue) throws IOException, DWARFExpressionException Returns the unsigned integer value of the requested attribute after resolving any DWARF expression opcodes.- Parameters:
attribute-defaultValue-- Returns:
- Throws:
IOExceptionDWARFExpressionException
-
getAsLocation
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- the attribute to evaluaterange- the address range the location covers (may be discarded if the attribute value is a location list with its own range values)- Returns:
- list of locations, empty if missing, never null
- Throws:
IOException
-
evaluateLocation
Evaluate the DWARFExpression located in the DWARFLocation object in the context of this DIEA.- Parameters:
location-- Returns:
- Throws:
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
-
parseDebugRange
Parses a range list from the debug_ranges section. See DWARF4 Section 2.17.3 (Non-Contiguous Address Ranges).The returned list of ranges is sorted.
- Parameters:
attribute- attribute ie.DWARFAttribute.DW_AT_ranges- Returns:
- list of ranges, in order
- Throws:
IOException- if an I/O error occurs
-
readRange
Parses a range list from the debug_ranges section. See DWARF4 Section 2.17.3 (Non-Contiguous Address Ranges).The returned list is not sorted.
- Parameters:
attribute- attribute ie.DWARFAttribute.DW_AT_ranges- Returns:
- list of ranges
- Throws:
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
Returns the value of the DW_AT_high_pc attribute, adjusted if necessary by the value of DW_AT_low_pc.- Returns:
- Throws:
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.
-
isLowPCEqualHighPC
public boolean isLowPCEqualHighPC()Returns true if the raw lowPc and highPc values are the same.This indicates an empty range, in which case the caller may want to take special steps to avoid issues with Ghidra ranges.
Only seen in extremely old gcc versions. Typically the low and high pc values are omitted if the CU is empty.
- Returns:
- boolean true if the LowPC and HighPC values are present and equal
-
getFunctionParamList
Returns a function's parameter list, taking care to ensure that the params are well ordered (to avoid issues with concrete instance param ordering)- Returns:
- list of params for this function
-
hashCode
public int hashCode() -
equals
-