Package ghidra.app.decompiler
Class DecompileCallback
- java.lang.Object
-
- ghidra.app.decompiler.DecompileCallback
-
public class DecompileCallback extends java.lang.Object
Routines that the decompiler invokes to gather info during decompilation of a function.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
DecompileCallback.StringData
Data returned for a query about strings
-
Field Summary
Fields Modifier and Type Field Description static int
MAX_SYMBOL_COUNT
-
Constructor Summary
Constructors Constructor Description DecompileCallback(Program prog, Language language, CompilerSpec compilerSpec, PcodeDataTypeManager dt)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static java.lang.String
buildInstruction(PcodeOp[] ops, int fallthruoffset, int paramshift, AddressFactory addrFactory)
Build an XML representation of all the pcode op's a given Instruction is defined to perform.byte[]
getBytes(java.lang.String addrxml)
java.lang.String
getComments(java.lang.String addrstring, java.lang.String types)
Collect any/all comments for the function starting at the indicated addressjava.lang.String
getCPoolRef(long[] refs)
java.lang.String
getExternalRefXML(java.lang.String addrstring)
java.lang.String
getMappedSymbolsXML(java.lang.String addrstring)
Called by the native decompiler to query the GHIDRA database about any symbols at the given address.java.lang.String
getNamespacePath(long id)
Return an XML description of the formal namespace path to the given namespacejava.lang.String
getNativeMessage()
java.lang.String
getPcodeInject(java.lang.String nm, java.lang.String context, int type)
PackedBytes
getPcodePacked(java.lang.String addrstring)
java.lang.String
getRegister(java.lang.String name)
java.lang.String
getRegisterName(java.lang.String addrstring)
DecompileCallback.StringData
getStringData(java.lang.String addrString, java.lang.String dtName, java.lang.String dtId)
Check for a string at an address and return a UTF8 encoded byte array.java.lang.String
getSymbol(java.lang.String addrstring)
java.lang.String
getTrackedRegisters(java.lang.String addrstring)
java.lang.String
getType(java.lang.String name, java.lang.String idstr)
java.lang.String
getUserOpName(java.lang.String indexStr)
boolean
isNameUsed(java.lang.String name, long startId, long stopId)
Decide if a given name is used by any namespace between a starting namespace and a stopping namespace.java.util.ArrayList<java.lang.String>
readXMLNameList(java.lang.String xml)
void
setFunction(Function func, Address entry, DecompileDebug dbg)
Establish function and debug context for next decompilation
-
-
-
Field Detail
-
MAX_SYMBOL_COUNT
public static final int MAX_SYMBOL_COUNT
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
DecompileCallback
public DecompileCallback(Program prog, Language language, CompilerSpec compilerSpec, PcodeDataTypeManager dt)
-
-
Method Detail
-
setFunction
public void setFunction(Function func, Address entry, DecompileDebug dbg)
Establish function and debug context for next decompilation- Parameters:
func
- is the function to be decompiledentry
- is the function's entry addressdbg
- is the debugging context (or null)
-
getNativeMessage
public java.lang.String getNativeMessage()
- Returns:
- the last message from the decompiler
-
readXMLNameList
public java.util.ArrayList<java.lang.String> readXMLNameList(java.lang.String xml) throws PcodeXMLException
- Throws:
PcodeXMLException
-
getBytes
public byte[] getBytes(java.lang.String addrxml)
-
getComments
public java.lang.String getComments(java.lang.String addrstring, java.lang.String types)
Collect any/all comments for the function starting at the indicated address- Parameters:
addrstring
- is the XML rep of function addresstypes
- is the string encoding of the comment type flags- Returns:
- XML document describing comments
-
getPcodePacked
public PackedBytes getPcodePacked(java.lang.String addrstring)
-
buildInstruction
public static java.lang.String buildInstruction(PcodeOp[] ops, int fallthruoffset, int paramshift, AddressFactory addrFactory)
Build an XML representation of all the pcode op's a given Instruction is defined to perform.- Parameters:
ops
- pcode opsfallthruoffset
- number of bytes after instruction start that pcode flow falls intoparamshift
- special instructions for injection useaddrFactory
- is the address factory for recovering address space names- Returns:
- XML document as string representing all the p-code
-
getPcodeInject
public java.lang.String getPcodeInject(java.lang.String nm, java.lang.String context, int type)
-
getCPoolRef
public java.lang.String getCPoolRef(long[] refs) throws java.io.IOException
- Throws:
java.io.IOException
-
getSymbol
public java.lang.String getSymbol(java.lang.String addrstring)
-
isNameUsed
public boolean isNameUsed(java.lang.String name, long startId, long stopId)
Decide if a given name is used by any namespace between a starting namespace and a stopping namespace. I.e. check for a name collision along a specific namespace path. Currently, Ghidra is inefficient at calculating this perfectly, so this routine calculates an approximation that can occasionally indicate a collision when there isn't.- Parameters:
name
- is the given name to check for collisionsstartId
- is the id specifying the starting namespacestopId
- is the id specifying the stopping namespace- Returns:
- true if the name (likely) occurs in one of the namespaces on the path
-
getNamespacePath
public java.lang.String getNamespacePath(long id)
Return an XML description of the formal namespace path to the given namespace- Parameters:
id
- is the ID of the given namespace- Returns:
- a parent XML tag
-
getMappedSymbolsXML
public java.lang.String getMappedSymbolsXML(java.lang.String addrstring)
Called by the native decompiler to query the GHIDRA database about any symbols at the given address.- Parameters:
addrstring
- XML encoded address to query- Returns:
- XML encoded result. Either function, reference, datatype, or hole
-
getExternalRefXML
public java.lang.String getExternalRefXML(java.lang.String addrstring)
-
getType
public java.lang.String getType(java.lang.String name, java.lang.String idstr)
-
getRegister
public java.lang.String getRegister(java.lang.String name)
-
getRegisterName
public java.lang.String getRegisterName(java.lang.String addrstring)
-
getTrackedRegisters
public java.lang.String getTrackedRegisters(java.lang.String addrstring)
-
getUserOpName
public java.lang.String getUserOpName(java.lang.String indexStr)
-
getStringData
public DecompileCallback.StringData getStringData(java.lang.String addrString, java.lang.String dtName, java.lang.String dtId)
Check for a string at an address and return a UTF8 encoded byte array. If there is already data present at the address, use this to determine the string encoding. Otherwise use the data-type info passed in to determine the encoding. Check that the bytes at the address represent a valid string encoding that doesn't exceed the maximum character limit passed in. Return null if the string is invalid. Return the string translated into a UTF8 byte array otherwise. A (valid) empty string is returned as a zero length array.- Parameters:
addrString
- is the XML encoded address and maximum byte limitdtName
- is the name of a character data-typedtId
- is the id associated with the character data-type- Returns:
- the UTF8 encoded byte array or null
-
-