Class AbstractBinaryExpressionSolver<T extends BinaryExpression>
- java.lang.Object
-
- ghidra.app.plugin.assembler.sleigh.expr.AbstractExpressionSolver<T>
-
- ghidra.app.plugin.assembler.sleigh.expr.AbstractBinaryExpressionSolver<T>
-
- Type Parameters:
T
- the type of expression solved (the operator)
- Direct Known Subclasses:
AndExpressionSolver
,DivExpressionSolver
,LeftShiftExpressionSolver
,MultExpressionSolver
,OrExpressionSolver
,PlusExpressionSolver
,RightShiftExpressionSolver
,SubExpressionSolver
,XorExpressionSolver
public abstract class AbstractBinaryExpressionSolver<T extends BinaryExpression> extends AbstractExpressionSolver<T>
A solver that handles expressions of the form A [OP] B
-
-
Field Summary
-
Fields inherited from class ghidra.app.plugin.assembler.sleigh.expr.AbstractExpressionSolver
dbg, solver
-
-
Constructor Summary
Constructors Constructor Description AbstractBinaryExpressionSolver(java.lang.Class<T> tcls)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description abstract MaskedLong
compute(MaskedLong lval, MaskedLong rval)
Compute the result of applying the operator to the two given valuesabstract MaskedLong
computeLeft(MaskedLong rval, MaskedLong goal)
Compute the left-hand-side value given that the result and the right are knownMaskedLong
computeRight(MaskedLong lval, MaskedLong goal)
Compute the right-hand-side value given that the result and the left are known NOTE: Assumes commutativity by defaultint
getInstructionLength(T exp, java.util.Map<java.lang.Integer,java.lang.Object> res)
Determines the length of the subconstructor that would be returned had the expression not depended on an undefined symbol.MaskedLong
getValue(T exp, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur)
Attempt to get a constant value for the expressionAssemblyResolution
solve(T exp, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description)
Attempt to solve an expression for a given valueprotected AssemblyResolution
solveLeftSide(PatternExpression lexp, MaskedLong rval, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description)
protected AssemblyResolution
solveRightSide(PatternExpression rexp, MaskedLong lval, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description)
protected AssemblyResolution
solveTwoSided(T exp, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description)
MaskedLong
valueForResolution(T exp, AssemblyResolvedConstructor rc)
Compute the value of the expression given the (possibly-intermediate) resolution-
Methods inherited from class ghidra.app.plugin.assembler.sleigh.expr.AbstractExpressionSolver
register
-
-
-
-
Constructor Detail
-
AbstractBinaryExpressionSolver
public AbstractBinaryExpressionSolver(java.lang.Class<T> tcls)
-
-
Method Detail
-
solve
public AssemblyResolution solve(T exp, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description) throws NeedsBackfillException
Description copied from class:AbstractExpressionSolver
Attempt to solve an expression for a given value- Specified by:
solve
in classAbstractExpressionSolver<T extends BinaryExpression>
- Parameters:
exp
- the expression to solvegoal
- the desired value of the expressionvals
- values of defined symbolsres
- the results of subconstructor resolutions (used for lengths)hints
- describes techniques applied by calling solversdescription
- the description to give to resolved solutions- Returns:
- the resolution
- Throws:
NeedsBackfillException
- if the expression refers to an undefined symbol
-
solveLeftSide
protected AssemblyResolution solveLeftSide(PatternExpression lexp, MaskedLong rval, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description) throws NeedsBackfillException, SolverException
-
solveRightSide
protected AssemblyResolution solveRightSide(PatternExpression rexp, MaskedLong lval, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description) throws NeedsBackfillException, SolverException
-
solveTwoSided
protected AssemblyResolution solveTwoSided(T exp, MaskedLong goal, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur, java.util.Set<SolverHint> hints, java.lang.String description) throws NeedsBackfillException, SolverException
-
getValue
public MaskedLong getValue(T exp, java.util.Map<java.lang.String,java.lang.Long> vals, java.util.Map<java.lang.Integer,java.lang.Object> res, AssemblyResolvedConstructor cur) throws NeedsBackfillException
Description copied from class:AbstractExpressionSolver
Attempt to get a constant value for the expression- Specified by:
getValue
in classAbstractExpressionSolver<T extends BinaryExpression>
- Parameters:
exp
- the expressionvals
- values of defined symbolsres
- the results of subconstructor resolutions (used for lengths)- Returns:
- the constant value, or null if it depends on a variable
- Throws:
NeedsBackfillException
- if the expression refers to an undefined symbol
-
computeLeft
public abstract MaskedLong computeLeft(MaskedLong rval, MaskedLong goal) throws SolverException
Compute the left-hand-side value given that the result and the right are known- Parameters:
rval
- the right-hand-side valuegoal
- the result- Returns:
- the left-hand-side value solution
- Throws:
SolverException
- if the expression cannot be solved
-
computeRight
public MaskedLong computeRight(MaskedLong lval, MaskedLong goal) throws SolverException
Compute the right-hand-side value given that the result and the left are known NOTE: Assumes commutativity by default- Parameters:
lval
- the left-hand-side valuegoal
- the result- Returns:
- the right-hand-side value solution
- Throws:
SolverException
- if the expression cannot be solved
-
compute
public abstract MaskedLong compute(MaskedLong lval, MaskedLong rval)
Compute the result of applying the operator to the two given values- Parameters:
lval
- the left-hand-side valuerval
- the right-hand-side value- Returns:
- the result
-
getInstructionLength
public int getInstructionLength(T exp, java.util.Map<java.lang.Integer,java.lang.Object> res)
Description copied from class:AbstractExpressionSolver
Determines the length of the subconstructor that would be returned had the expression not depended on an undefined symbol. This is used by the backfilling process to ensure values are written to the correct offset- Specified by:
getInstructionLength
in classAbstractExpressionSolver<T extends BinaryExpression>
- Parameters:
exp
- the expressionres
- the results of subconstructor resolutions (used for lengths)- Returns:
- the length of filled in token field(s).
-
valueForResolution
public MaskedLong valueForResolution(T exp, AssemblyResolvedConstructor rc)
Description copied from class:AbstractExpressionSolver
Compute the value of the expression given the (possibly-intermediate) resolution- Specified by:
valueForResolution
in classAbstractExpressionSolver<T extends BinaryExpression>
- Parameters:
exp
- the expression to evaluaterc
- the resolution on which to evaluate it- Returns:
- the result
-
-