Package ghidra.program.model.pcode
Class HighFunctionDBUtil
- java.lang.Object
-
- ghidra.program.model.pcode.HighFunctionDBUtil
-
public class HighFunctionDBUtil extends java.lang.Object
HighFunctionDBUtil
provides various methods for updating the state of a function contained within a program database. It is important to note that the decompiler result state (e.g., HighFunction, HighParam, HighLocal, etc.) is not altered by any of these methods. A new decompiler result will need to be generated to reflect any changes made to the database. Care must be taken when making incremental changes to multiple elements (e.g., Variables)
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
AUTO_CAT
-
Constructor Summary
Constructors Constructor Description HighFunctionDBUtil()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static void
commitLocalNamesToDatabase(HighFunction highFunction, SourceType source)
Commit local variables from the decompiler's model of the function to the database.static void
commitParamsToDatabase(Function function, java.lang.String modelName, java.util.List<Parameter> params, boolean hasVarArgs, boolean renameConflicts, SourceType source)
Commit a specified set of parameters for the given function to the database.static void
commitParamsToDatabase(HighFunction highFunction, boolean useDataTypes, SourceType source)
Commit all parameters associated with HighFunction to the underlying database.static void
commitReturnToDatabase(HighFunction highFunction, SourceType source)
Commit the decompiler's version of the function return data-type to the database.static Address
getSpacebaseReferenceAddress(Program program, PcodeOp op)
Get the Address referred to by a spacebase reference.static DataTypeSymbol
readOverride(Symbol sym)
Read a call prototype override which corresponds to the specified override code symbolstatic void
updateDBVariable(HighSymbol highSymbol, java.lang.String name, DataType dataType, SourceType source)
Rename and/or retype the specified variable in the database.static void
writeOverride(Function function, Address callsite, FunctionSignature sig)
Commit an overriding prototype for a particular call site to the database.
-
-
-
Field Detail
-
AUTO_CAT
public static final java.lang.String AUTO_CAT
- See Also:
- Constant Field Values
-
-
Method Detail
-
commitReturnToDatabase
public static void commitReturnToDatabase(HighFunction highFunction, SourceType source)
Commit the decompiler's version of the function return data-type to the database. The decompiler's version of the prototype model is committed as well- Parameters:
highFunction
- is the decompiler's model of the functionsource
- is the desired SourceType for the commit
-
commitParamsToDatabase
public static void commitParamsToDatabase(HighFunction highFunction, boolean useDataTypes, SourceType source) throws DuplicateNameException, InvalidInputException
Commit all parameters associated with HighFunction to the underlying database.- Parameters:
highFunction
- is the associated HighFunctionuseDataTypes
- is true if the HighFunction's parameter data-types should be committedsource
- is the signature source type to set- Throws:
DuplicateNameException
- if commit of parameters caused conflict with other local variable/label.InvalidInputException
- if specified storage is invalid
-
commitParamsToDatabase
public static void commitParamsToDatabase(Function function, java.lang.String modelName, java.util.List<Parameter> params, boolean hasVarArgs, boolean renameConflicts, SourceType source) throws DuplicateNameException, InvalidInputException
Commit a specified set of parameters for the given function to the database. The name, data-type, and storage is committed for each parameter. The parameters are provided along with a formal PrototypeModel. If the parameters fit the model, they are committed using "dynamic" storage. Otherwise, they are committed using "custom" storage.- Parameters:
function
- is the Function being modifiedmodelName
- is the name of the underlying PrototypeModelparams
- is the formal list of parameter objectshasVarArgs
- is true if the prototype can take variable argumentsrenameConflicts
- if true any name conflicts will be resolved by renaming the conflicting local variable/labelsource
- source type- Throws:
DuplicateNameException
- if commit of parameters caused conflict with other local variable/label. Should not occur if renameConflicts is true.InvalidInputException
- for invalid variable names or for parameter data-types that aren't fixed lengthDuplicateNameException
- is there are collisions between variable names in the function's scope
-
commitLocalNamesToDatabase
public static void commitLocalNamesToDatabase(HighFunction highFunction, SourceType source)
Commit local variables from the decompiler's model of the function to the database. This does NOT include formal function parameters.- Parameters:
highFunction
- is the decompiler's model of the functionsource
- is the desired SourceType for the commit
-
updateDBVariable
public static void updateDBVariable(HighSymbol highSymbol, java.lang.String name, DataType dataType, SourceType source) throws InvalidInputException, DuplicateNameException
Rename and/or retype the specified variable in the database. All parameters may be flushed to the database if typed parameter inconsistency detected.- Parameters:
highSymbol
- is the symbol being updatedname
- new variable name or null to use retain current variable namedataType
- newly assigned data type or null to retain current variable datatype. Only a fixed-length data type may be specified. If size varies from the current size, an attempt will be made to grow/shrink the storage.source
- source type- Throws:
InvalidInputException
- if suitable data type was not specified, or unable to resize storage, or invalid name specifiedDuplicateNameException
- if name was specified and conflicts with another variable/label within the function's namespacejava.lang.UnsupportedOperationException
- if unsupported variable type is specified
-
writeOverride
public static void writeOverride(Function function, Address callsite, FunctionSignature sig) throws InvalidInputException
Commit an overriding prototype for a particular call site to the database. The override only applies to the function(s) containing the actual call site. Calls to the same function from other sites are unaffected. This is used typically either for indirect calls are for calls to a function with a variable number of parameters.- Parameters:
function
- is the Function whose call site is being overriddencallsite
- is the address of the calling instruction (the call site)sig
- is the overriding function signature- Throws:
InvalidInputException
- if there are problems committing the override symbol
-
readOverride
public static DataTypeSymbol readOverride(Symbol sym)
Read a call prototype override which corresponds to the specified override code symbol- Parameters:
sym
- special call override code symbol whose address corresponds to a call site- Returns:
- call prototype override DataTypeSymbol or null if associated function signature data-type could not be found
-
getSpacebaseReferenceAddress
public static Address getSpacebaseReferenceAddress(Program program, PcodeOp op)
Get the Address referred to by a spacebase reference. Address-of references are encoded in the p-code syntax tree as:vn = PTRSUB(<spacebase>, #const)
. This decodes the reference and returns the Address- Parameters:
program
- is the program containing the Addressop
- is the PTRSUB op encoding the reference- Returns:
- the recovered Address (or null if not correct form)
-
-