Enum Class FoldedArithmetic

java.lang.Object
java.lang.Enum<FoldedArithmetic>
ghidra.pcode.emu.jit.folding.FoldedArithmetic
All Implemented Interfaces:
PcodeArithmetic<MaskedBytes>, Serializable, Comparable<FoldedArithmetic>, Constable

public enum FoldedArithmetic extends Enum<FoldedArithmetic> implements PcodeArithmetic<MaskedBytes>
The arithmetic for computing folded constants

For the most part, the result of any operation is only known if all inputs are known. In that case, the result is equivalent to applying BytesPcodeArithmetic. Otherwise, the result is completely unknown. Special treatment is given to bitwise boolean operators, extension operators, and shift operators. We also give some special treatment for operators that only modify the sign bit, e.g., PcodeOp.FLOAT_ABS.

  • Enum Constant Details

  • Method Details

    • values

      public static FoldedArithmetic[] values()
      Returns an array containing the constants of this enum class, in the order they are declared.
      Returns:
      an array containing the constants of this enum class, in the order they are declared
    • valueOf

      public static FoldedArithmetic valueOf(String name)
      Returns the enum constant of this class with the specified name. The string must match exactly an identifier used to declare an enum constant in this class. (Extraneous whitespace characters are not permitted.)
      Parameters:
      name - the name of the enum constant to be returned.
      Returns:
      the enum constant with the specified name
      Throws:
      IllegalArgumentException - if this enum class has no constant with the specified name
      NullPointerException - if the argument is null
    • forEndian

      public static FoldedArithmetic forEndian(Endian endian)
      Returns the instance for the given endian.
      Parameters:
      endian - the endian
      Returns:
      the instance for the given endian
    • forLanguage

      public static FoldedArithmetic forLanguage(Language language)
      Returns the instance for the given language.
      Parameters:
      language - the language
      Returns:
      the instance for the given language
    • getDomain

      public Class<MaskedBytes> getDomain()
      Description copied from interface: PcodeArithmetic
      Get the type of values over which this arithmetic operates.
      Specified by:
      getDomain in interface PcodeArithmetic<MaskedBytes>
      Returns:
      the domain
    • getEndian

      public Endian getEndian()
      Description copied from interface: PcodeArithmetic
      Get the endianness of this arithmetic

      Often T is a byte array, or at least represents one abstractly. Ideally, it is an array where each element is an abstraction of a byte. If that is the case, then the arithmetic likely has to interpret those bytes as integral values according to an endianness. This should return that endianness.

      If the abstraction has no notion of endianness, return null. In that case, the both PcodeArithmetic.fromConst(BigInteger, int, boolean) and PcodeArithmetic.fromConst(long, int) must be overridden. Furthermore, unless PcodeArithmetic.toConcrete(Object, Purpose) is guaranteed to throw an exception, then PcodeArithmetic.toBigInteger(Object, Purpose) and PcodeArithmetic.toLong(Object, Purpose) must also be overridden.

      Specified by:
      getEndian in interface PcodeArithmetic<MaskedBytes>
      Returns:
      the endianness or null
    • unaryOp

      public MaskedBytes unaryOp(int opcode, int sizeout, int sizein1, MaskedBytes in1)
      Description copied from interface: PcodeArithmetic
      Apply a unary operator to the given input

      Note the sizes of variables are given, because values don't necessarily have an intrinsic size. For example, a BigInteger may have a minimum encoding size, but that does not necessarily reflect the size of the variable from which is was read.

      Specified by:
      unaryOp in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      opcode - the p-code opcode
      sizeout - the size (in bytes) of the output variable
      sizein1 - the size (in bytes) of the input variable
      in1 - the input value
      Returns:
      the output value
    • binaryOp

      public MaskedBytes binaryOp(int opcode, int sizeout, int sizein1, MaskedBytes in1, int sizein2, MaskedBytes in2)
      Description copied from interface: PcodeArithmetic
      Apply a binary operator to the given inputs

      Note the sizes of variables are given, because values don't necessarily have an intrinsic size. For example, a BigInteger may have a minimum encoding size, but that does not necessarily reflect the size of the variable from which is was read.

      Specified by:
      binaryOp in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      opcode - the operation's opcode. See PcodeOp.
      sizeout - the size (in bytes) of the output variable
      sizein1 - the size (in bytes) of the first (left) input variable
      in1 - the first (left) input value
      sizein2 - the size (in bytes) of the second (right) input variable
      in2 - the second (right) input value
      Returns:
      the output value
    • modBeforeStore

      public MaskedBytes modBeforeStore(int sizeinOffset, AddressSpace space, MaskedBytes inOffset, int sizeinValue, MaskedBytes inValue)
      Description copied from interface: PcodeArithmetic
      Apply any modifications before a value is stored

      This implements any abstractions associated with PcodeOp.STORE. This is called on the offset and the value before the value is actually stored into the state. NOTE: STORE ops always quantize the offset.

      Specified by:
      modBeforeStore in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      sizeinOffset - the size (in bytes) of the variable used for indirection
      space - the address space
      inOffset - the value used as the address (or offset)
      sizeinValue - the size (in bytes) of the variable to store and of the output variable
      inValue - the value to store
      Returns:
      the modified value to store
    • modAfterLoad

      public MaskedBytes modAfterLoad(int sizeinOffset, AddressSpace space, MaskedBytes inOffset, int sizeinValue, MaskedBytes inValue)
      Description copied from interface: PcodeArithmetic
      Apply any modifications after a value is loaded

      This implements any abstractions associated with PcodeOp.LOAD. This is called on the address/offset and the value after the value is actually loaded from the state. NOTE: LOAD ops always quantize the offset.

      Specified by:
      modAfterLoad in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      sizeinOffset - the size (in bytes) of the variable used for indirection
      space - the address space
      inOffset - the value used as the offset
      sizeinValue - the size (in bytes) of the variable loaded and of the output variable
      inValue - the value loaded
      Returns:
      the modified value loaded
    • fromConst

      public MaskedBytes fromConst(byte[] value)
      Description copied from interface: PcodeArithmetic
      Convert the given constant concrete value to type T having the same size.
      Specified by:
      fromConst in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      value - the constant value
      Returns:
      the value as a T
    • toConcrete

      public byte[] toConcrete(MaskedBytes value, PcodeArithmetic.Purpose purpose)
      Description copied from interface: PcodeArithmetic
      Convert, if possible, the given abstract value to a concrete byte array
      Specified by:
      toConcrete in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      value - the abstract value
      purpose - the purpose for which the emulator needs a concrete value
      Returns:
      the array
    • sizeOf

      public long sizeOf(MaskedBytes value)
      Description copied from interface: PcodeArithmetic
      Get the size in bytes, if possible, of the given abstract value

      If the abstract value does not conceptually have a size, throw an exception.

      Specified by:
      sizeOf in interface PcodeArithmetic<MaskedBytes>
      Parameters:
      value - the abstract value
      Returns:
      the size in bytes