Class DefaultAssemblyResolvedPatterns
- All Implemented Interfaces:
AssemblyResolution
,AssemblyResolvedPatterns
,Comparable<AssemblyResolution>
AssemblyResolution
indicating successful application of a constructor
This is almost analogous to DisjointPattern
, in that is joins an instruction AssemblyPatternBlock
with a
corresponding context AssemblyPatternBlock
. However, this object is mutable, and it
collects backfill records, as well as forbidden patterns.
When the applied constructor is from the "instruction" subtable, this represents a fully-
constructed instruction with required context. All backfill records ought to be resolved and
applied before the final result is given to the user, i.e., passed into the
AssemblySelector
. If at any time during the resolution or backfill process, the result
becomes confined to one of the forbidden patterns, it must be dropped, since the encoding will
actually invoke a more specific SLEIGH constructor.
-
Field Summary
Modifier and TypeFieldDescriptionprotected final Set
<AssemblyResolvedBackfill> protected final Constructor
protected final AssemblyPatternBlock
protected static final String
protected final Set
<AssemblyResolvedPatterns> protected final AssemblyPatternBlock
protected static final String
protected static final Pattern
protected static final String
Fields inherited from class ghidra.app.plugin.assembler.sleigh.sem.AbstractAssemblyResolution
children, description, factory, right
-
Constructor Summary
ModifierConstructorDescriptionprotected
DefaultAssemblyResolvedPatterns
(AbstractAssemblyResolutionFactory<?, ?> factory, String description, Constructor cons, List<? extends AssemblyResolution> children, AssemblyResolution right, AssemblyPatternBlock ins, AssemblyPatternBlock ctx, Set<AssemblyResolvedBackfill> backfills, Set<AssemblyResolvedPatterns> forbids) -
Method Summary
Modifier and TypeMethodDescriptionbackfill
(RecursiveDescentSolver solver, Map<String, Long> vals) Apply as many backfill records as possibleboolean
Check if this and another resolution have equal encodingsCheck if the current encoding is forbidden by one of the attached patternsprotected String
childrenToString
(String indent) Get the child portion ofAbstractAssemblyResolution.toString()
Combine the given backfill record into this resolutionCombine the encodings and backfills of the given resolution into this oneCombine a backfill resultprotected int
copyAppendDescription
(String append) Duplicate this resolution, with additional description text appendedcopyAppendDescriptionBuilder
(String append) Used for testing and diagnostics: list the constructor line numbers used to resolve this encodingboolean
boolean
Check if this assembled construct state is the same as the given dis-assembled construct state.Get the backfill records for this resolution, if anyGet the context blockint
Get the length of the instruction encoding, excluding trailing undefined bytesGet the forbidden patterns for this resolutionGet the instruction blockint
Get the length of the instruction encodingprotected static int
getOpIndex
(String piece) protected static ConstructState
getPureRecursion
(ConstructState state) If the construct state is a^instruction
or other purely-recursive constructor, get its single child.int
Count the number of bits specified in the resolution patternsboolean
Check if this resolution has pending backfills to applyboolean
Check if this record has childrenboolean
Check if this record describes a backfillboolean
isError()
Check if this record describes an errorDisplay the resolution result in one line (omitting child details)Set all bits read by a given context operation to unknownmaskOutBuilder
(ContextOp cop) Generate a new nop right this resolution to its right.Get this same resolution, pushing its right siblings down to its childrenparentBuilder
(String description, int opCount) protected boolean
Iterable
<byte[]> possibleInsVals
(AssemblyPatternBlock forCtx) Get an iterable over all the possible fillings of the instruction pattern given a contextreadContext
(int start, int len) Decode a portion of the context blockreadContextOp
(ContextOp cop) Decode the value from the context located where the given context operation would writereadInstruction
(int start, int len) Decode a portion of the instruction blockshift
(int amt) Shift the resolution's instruction pattern to the right, if applicableshiftBuilder
(int amt) Solve and apply context changes in reverse to forbidden patternstruncate
(int amt) Truncate (unshift) the resolved instruction pattern from the left NOTE: This drops all backfill and forbidden pattern records, since this method is typically used to read token fields rather than passed around for resolution.truncateBuilder
(int amt) withConstructor
(Constructor cons) Create a copy of this resolution with a replaced constructorwithDescription
(String description) Create a copy of this resolution with a new descriptionwithDescriptionBuilder
(String description) Create a new resolution from this one with the given forbidden patterns recordedwithRight
(AssemblyResolution right) Get this same resolution, but with the given right siblingwriteContextOp
(ContextOp cop, MaskedLong val) Encode the given value into the context block as specified by an operationwriteContextOpBuilder
(ContextOp cop, MaskedLong val) Methods inherited from class ghidra.app.plugin.assembler.sleigh.sem.AbstractAssemblyResolution
collectAllRight, compareTo, getAllRight, getChildren, getDescription, getRight, hashCode, toString, toString, withoutRight
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface ghidra.app.plugin.assembler.sleigh.sem.AssemblyResolution
collectAllRight, getChildren, getDescription, getRight, toString, toString
Methods inherited from interface java.lang.Comparable
compareTo
-
Field Details
-
INS
- See Also:
-
CTX
- See Also:
-
SEP
- See Also:
-
cons
-
ins
-
ctx
-
backfills
-
forbids
-
pat
-
-
Constructor Details
-
DefaultAssemblyResolvedPatterns
protected DefaultAssemblyResolvedPatterns(AbstractAssemblyResolutionFactory<?, ?> factory, String description, Constructor cons, List<? extends AssemblyResolution> children, AssemblyResolution right, AssemblyPatternBlock ins, AssemblyPatternBlock ctx, Set<AssemblyResolvedBackfill> backfills, Set<AssemblyResolvedPatterns> forbids)
-
-
Method Details
-
computeHash
protected int computeHash()- Specified by:
computeHash
in classAbstractAssemblyResolution
-
partsEqual
-
equals
-
shiftBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> shiftBuilder(int amt) -
shift
Description copied from interface:AssemblyResolution
Shift the resolution's instruction pattern to the right, if applicableThis also shifts any backfill and forbidden pattern records.
- Specified by:
shift
in interfaceAssemblyResolution
- Specified by:
shift
in interfaceAssemblyResolvedPatterns
- Specified by:
shift
in classAbstractAssemblyResolution
- Parameters:
amt
- the number of bytes to shift.- Returns:
- the result
-
truncateBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> truncateBuilder(int amt) -
truncate
Description copied from interface:AssemblyResolvedPatterns
Truncate (unshift) the resolved instruction pattern from the left NOTE: This drops all backfill and forbidden pattern records, since this method is typically used to read token fields rather than passed around for resolution.- Specified by:
truncate
in interfaceAssemblyResolvedPatterns
- Parameters:
amt
- the number of bytes to remove from the left- Returns:
- the result
-
checkNotForbiddenBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolutionBuilder<?,?> checkNotForbiddenBuilder() -
checkNotForbidden
Description copied from interface:AssemblyResolvedPatterns
Check if the current encoding is forbidden by one of the attached patternsThe pattern becomes forbidden if this encoding's known bits are an overset of any forbidden pattern's known bits.
- Specified by:
checkNotForbidden
in interfaceAssemblyResolvedPatterns
- Returns:
- false if the pattern is forbidden (and thus in error), true if permitted
-
bitsEqual
Description copied from interface:AssemblyResolvedPatterns
Check if this and another resolution have equal encodingsThis is like
Object.equals(Object)
, but it ignores backfill records and forbidden patterns.- Specified by:
bitsEqual
in interfaceAssemblyResolvedPatterns
- Parameters:
that
- the other resolution- Returns:
- true if both have equal encodings
-
combineBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> combineBuilder(AssemblyResolvedPatterns that) -
combineLessBackfillBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> combineLessBackfillBuilder(AssemblyResolvedPatterns that, AssemblyResolvedBackfill bf) -
combine
Description copied from interface:AssemblyResolvedPatterns
Combine the encodings and backfills of the given resolution into this oneThis combines corresponding pattern blocks (assuming they agree), collects backfill records, and collects forbidden patterns.
- Specified by:
combine
in interfaceAssemblyResolvedPatterns
- Parameters:
that
- the other resolution- Returns:
- the result if successful, or null
-
combineLessBackfill
public AssemblyResolvedPatterns combineLessBackfill(AssemblyResolvedPatterns that, AssemblyResolvedBackfill bf) Combine a backfill resultWhen a backfill is successful, the result should be combined with the owning resolution. In addition, for bookkeeping's sake, the resolved record should be removed from the list of backfills.
- Specified by:
combineLessBackfill
in interfaceAssemblyResolvedPatterns
- Parameters:
that
- the result from backfillingbf
- the resolved backfilled record- Returns:
- the result if successful, or null
-
combineBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> combineBuilder(AssemblyResolvedBackfill bf) -
combine
Description copied from interface:AssemblyResolvedPatterns
Combine the given backfill record into this resolution- Specified by:
combine
in interfaceAssemblyResolvedPatterns
- Parameters:
bf
- the backfill record- Returns:
- the result
-
withForbidsBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> withForbidsBuilder(Set<AssemblyResolvedPatterns> more) -
withForbids
Description copied from interface:AssemblyResolvedPatterns
Create a new resolution from this one with the given forbidden patterns recorded- Specified by:
withForbids
in interfaceAssemblyResolvedPatterns
- Parameters:
more
- the additional forbidden patterns to record- Returns:
- the new resolution
-
withDescriptionBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> withDescriptionBuilder(String description) -
withDescription
Description copied from interface:AssemblyResolvedPatterns
Create a copy of this resolution with a new description- Specified by:
withDescription
in interfaceAssemblyResolvedPatterns
- Parameters:
description
- the new description- Returns:
- the copy
-
withConstructorBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> withConstructorBuilder(Constructor cons) -
withConstructor
Description copied from interface:AssemblyResolvedPatterns
Create a copy of this resolution with a replaced constructor- Specified by:
withConstructor
in interfaceAssemblyResolvedPatterns
- Parameters:
cons
- the new constructor- Returns:
- the copy
-
writeContextOpBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> writeContextOpBuilder(ContextOp cop, MaskedLong val) -
writeContextOp
Description copied from interface:AssemblyResolvedPatterns
Encode the given value into the context block as specified by an operationThis is the forward (as in disassembly) direction of applying context operations. The pattern expression is evaluated, and the result is written as specified.
- Specified by:
writeContextOp
in interfaceAssemblyResolvedPatterns
- Parameters:
cop
- the context operation specifying the location of the value to encodeval
- the masked value to encode- Returns:
- the result
-
readContextOp
Description copied from interface:AssemblyResolvedPatterns
Decode the value from the context located where the given context operation would writeThis is used to read the value from the left-hand-side "variable" of a context operation. It seems backward, because it is. When assembling, the right-hand-side expression of a context operation must be solved. This means the "variable" is known from the context(s) of the resolved children constructors. The value read is then used as the goal in solving the expression.
- Specified by:
readContextOp
in interfaceAssemblyResolvedPatterns
- Parameters:
cop
- the context operation whose "variable" to read.- Returns:
- the masked result.
-
copyAppendDescriptionBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> copyAppendDescriptionBuilder(String append) -
copyAppendDescription
Duplicate this resolution, with additional description text appended- Parameters:
append
- the text to append- Returns:
- the duplicate NOTE: An additional separator
": "
is inserted
-
withRightBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> withRightBuilder(AssemblyResolution right) -
withRight
Description copied from class:AbstractAssemblyResolution
Get this same resolution, but with the given right sibling- Specified by:
withRight
in interfaceAssemblyResolvedPatterns
- Specified by:
withRight
in classAbstractAssemblyResolution
- Parameters:
right
- the right sibling- Returns:
- the resolution
-
nopLeftSiblingBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> nopLeftSiblingBuilder() -
nopLeftSibling
Description copied from interface:AssemblyResolvedPatterns
Generate a new nop right this resolution to its right.Alternatively phrased: append a nop to the left of this list of siblings, returning the new head.
- Specified by:
nopLeftSibling
in interfaceAssemblyResolvedPatterns
- Returns:
- the nop resolution
-
parentBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> parentBuilder(String description, int opCount) -
parent
Description copied from interface:AssemblyResolution
Get this same resolution, pushing its right siblings down to its children- Specified by:
parent
in interfaceAssemblyResolution
- Specified by:
parent
in interfaceAssemblyResolvedPatterns
-
maskOutBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> maskOutBuilder(ContextOp cop) -
maskOut
Description copied from interface:AssemblyResolvedPatterns
Set all bits read by a given context operation to unknown- Specified by:
maskOut
in interfaceAssemblyResolvedPatterns
- Parameters:
cop
- the context operation- Returns:
- the result
- See Also:
-
backfill
Description copied from interface:AssemblyResolvedPatterns
Apply as many backfill records as possibleEach backfill record is resolved in turn, if the record cannot be resolved, it remains listed. If the record can be resolved, but it conflicts, an error record is returned. Each time a record is resolved and combined successfully, all remaining records are tried again. The result is the combined resolved backfills, with only the unresolved backfill records listed.
- Specified by:
backfill
in interfaceAssemblyResolvedPatterns
- Parameters:
solver
- the solver, usually the same as the original attempt to solve.vals
- the values.- Returns:
- the result, or an error.
-
lineToString
Description copied from interface:AssemblyResolution
Display the resolution result in one line (omitting child details)- Specified by:
lineToString
in interfaceAssemblyResolution
- Returns:
- the display description
-
hasBackfills
public boolean hasBackfills()Description copied from interface:AssemblyResolvedPatterns
Check if this resolution has pending backfills to apply- Specified by:
hasBackfills
in interfaceAssemblyResolvedPatterns
- Returns:
- true if there are backfills
-
solveContextChangesForForbidsBuilder
protected AbstractAssemblyResolutionFactory.AbstractAssemblyResolvedPatternsBuilder<?> solveContextChangesForForbidsBuilder(AssemblyConstructorSemantic sem, Map<String, Long> vals) -
solveContextChangesForForbids
public AssemblyResolvedPatterns solveContextChangesForForbids(AssemblyConstructorSemantic sem, Map<String, Long> vals) Description copied from interface:AssemblyResolvedPatterns
Solve and apply context changes in reverse to forbidden patternsTo avoid circumstances where a context change during disassembly would invoke a more specific sub-constructor than was used to assembly the instruction, we must solve the forbidden patterns in tandem with the overall resolution. If the context of any forbidden pattern cannot be solved, we simply drop the forbidden pattern -- the lack of a solution implies there is no way the context change could produce the forbidden pattern.
- Specified by:
solveContextChangesForForbids
in interfaceAssemblyResolvedPatterns
- Parameters:
sem
- the constructor whose context changes to solvevals
- any defined symbols- Returns:
- the result
- See Also:
-
getInstructionLength
public int getInstructionLength()Description copied from interface:AssemblyResolvedPatterns
Get the length of the instruction encodingThis is used to ensure each operand is encoded at the correct offset
NOTE: this DOES include the offset
NOTE: this DOES include pending backfills- Specified by:
getInstructionLength
in interfaceAssemblyResolvedPatterns
- Returns:
- the length of the instruction block
-
getDefinedInstructionLength
public int getDefinedInstructionLength()Description copied from interface:AssemblyResolvedPatterns
Get the length of the instruction encoding, excluding trailing undefined bytesNOTE: this DOES include the offset
NOTE: this DOES NOT include pending backfills- Specified by:
getDefinedInstructionLength
in interfaceAssemblyResolvedPatterns
- Returns:
- the length of the defined bytes in the instruction block
-
getInstruction
Description copied from interface:AssemblyResolvedPatterns
Get the instruction block- Specified by:
getInstruction
in interfaceAssemblyResolvedPatterns
- Returns:
- the instruction block
-
getContext
Description copied from interface:AssemblyResolvedPatterns
Get the context block- Specified by:
getContext
in interfaceAssemblyResolvedPatterns
- Returns:
- the context block
-
readInstruction
Description copied from interface:AssemblyResolvedPatterns
Decode a portion of the instruction block- Specified by:
readInstruction
in interfaceAssemblyResolvedPatterns
- Parameters:
start
- the first byte to decodelen
- the number of bytes to decode- Returns:
- the read masked value
- See Also:
-
readContext
Description copied from interface:AssemblyResolvedPatterns
Decode a portion of the context block- Specified by:
readContext
in interfaceAssemblyResolvedPatterns
- Parameters:
start
- the first byte to decodelen
- the number of bytes to decode- Returns:
- the read masked value
- See Also:
-
isError
public boolean isError()Description copied from interface:AssemblyResolution
Check if this record describes an error- Specified by:
isError
in interfaceAssemblyResolution
- Returns:
- true if the record is an error
-
isBackfill
public boolean isBackfill()Description copied from interface:AssemblyResolution
Check if this record describes a backfill- Specified by:
isBackfill
in interfaceAssemblyResolution
- Returns:
- true if the record is a backfill
-
hasChildren
public boolean hasChildren()Description copied from interface:AssemblyResolution
Check if this record has childrenIf a subclass has another, possibly additional, notion of children that it would like to include in
AssemblyResolution.toString()
, it must override this method to return true when such children are present.- Specified by:
hasChildren
in interfaceAssemblyResolution
- Overrides:
hasChildren
in classAbstractAssemblyResolution
- Returns:
- true if this record has children
-
childrenToString
Description copied from class:AbstractAssemblyResolution
Get the child portion ofAbstractAssemblyResolution.toString()
If a subclass has another, possible additional, notion of children that it would like to include in
AbstractAssemblyResolution.toString()
, it must override this method.- Overrides:
childrenToString
in classAbstractAssemblyResolution
- Parameters:
indent
- the current indentation- Returns:
- the indented description for each child on its own line
- See Also:
-
dumpConstructorTree
Description copied from interface:AssemblyResolvedPatterns
Used for testing and diagnostics: list the constructor line numbers used to resolve this encodingThis includes braces to describe the tree structure
- Specified by:
dumpConstructorTree
in interfaceAssemblyResolvedPatterns
- Returns:
- the constructor tree
- See Also:
-
getSpecificity
public int getSpecificity()Count the number of bits specified in the resolution patternsTotals the specificity of the instruction and context pattern blocks.
- Returns:
- the number of bits in the resulting patterns
- See Also:
-
possibleInsVals
Description copied from interface:AssemblyResolvedPatterns
Get an iterable over all the possible fillings of the instruction pattern given a contextThis is meant to be used idiomatically, as in an enhanced for loop:
for (byte[] ins : rcon.possibleInsVals(ctx)) { System.out.println(format(ins)); }
This is similar to calling
AssemblyResolvedPatterns.getInstruction()
.AssemblyPatternBlock.possibleVals()
, but with forbidden patterns removed. A context is required so that only those forbidden patterns matching the given context are actually removed. This method should always be preferred to the sequence mentioned above, sinceAssemblyPatternBlock.possibleVals()
on its own may yield bytes that do not produce the desired instruction.NOTE: The implementation is based on
AssemblyPatternBlock.possibleVals()
, so be aware that a single array is reused for each iterate. You should not retain a pointer to the array, but rather make a copy.- Specified by:
possibleInsVals
in interfaceAssemblyResolvedPatterns
- Parameters:
forCtx
- the context at the assembly address- Returns:
- the iterable
-
getOpIndex
-
getPureRecursion
If the construct state is a^instruction
or other purely-recursive constructor, get its single child.- Parameters:
state
- the parent state- Returns:
- the child state if recursive, or null
-
equivalentConstructState
Description copied from interface:AssemblyResolvedPatterns
Check if this assembled construct state is the same as the given dis-assembled construct state.- Specified by:
equivalentConstructState
in interfaceAssemblyResolvedPatterns
-
getConstructor
-
getBackfills
Description copied from interface:AssemblyResolvedPatterns
Get the backfill records for this resolution, if any- Specified by:
getBackfills
in interfaceAssemblyResolvedPatterns
- Returns:
- the backfills
-
getForbids
Description copied from interface:AssemblyResolvedPatterns
Get the forbidden patterns for this resolutionThese represent patterns included in the current resolution that would actually get matched by a more specific constructor somewhere in the resolved tree, and thus are subtracted.
- Specified by:
getForbids
in interfaceAssemblyResolvedPatterns
- Returns:
- the forbidden patterns
-