Class SleighPcodeUseropDefinition<T>

java.lang.Object
ghidra.pcode.exec.SleighPcodeUseropDefinition<T>
Type Parameters:
T - no type in particular, except to match any executor
All Implemented Interfaces:
PcodeUseropLibrary.PcodeUseropDefinition<T>

public class SleighPcodeUseropDefinition<T> extends Object implements PcodeUseropLibrary.PcodeUseropDefinition<T>
A p-code userop defined using Sleigh source
  • Field Details

  • Constructor Details

  • Method Details

    • programFor

      public PcodeProgram programFor(Varnode outArg, List<Varnode> inArgs, PcodeUseropLibrary<?> library)
      Get the p-code program implementing this userop for the given arguments and library.

      This will compile and cache a program for each new combination of arguments seen.

      Parameters:
      outArg - the output operand, if applicable
      inArgs - the input operands
      library - the complete userop library
      Returns:
      the p-code program to be fed to the same executor as invoked this userop, but in a new frame
    • getName

      public String getName()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Get the name of the userop.

      This is the symbol assigned to the userop when compiling new Sleigh code. It cannot conflict with existing userops (except those declared, but not defined, by the executor's language) or other symbols of the executor's language. If this userop is to be used generically across many languages, choose an unlikely name. Conventionally, these start with two underscores __.

      Specified by:
      getName in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      the name of the userop
    • getInputCount

      public int getInputCount()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Get the number of input operands accepted by the userop.
      Specified by:
      getInputCount in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      the count or -1 if the userop is variadic
    • execute

      public void execute(PcodeExecutor<T> executor, PcodeUseropLibrary<T> library, Varnode outArg, List<Varnode> inArgs)
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Invoke/execute the userop.
      Specified by:
      execute in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Parameters:
      executor - the executor invoking this userop.
      library - the complete library for this execution. Note the library may have been composed from more than the one defining this userop.
      outArg - if invoked as an rval, the destination varnode for the userop's output. Otherwise, null.
      inArgs - the input varnodes as ordered in the source.
      See Also:
    • getInputs

      public List<String> getInputs()
      Get the names of the inputs in order
      Returns:
      the input names
    • getBody

      public String getBody()
      Get the Sleigh source that defines this userop
      Returns:
      the lines
    • isFunctional

      public boolean isFunctional()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Indicates whether this userop is a "pure function."

      This means all inputs are given in the arguments to the userop and the output, if applicable, is given via the return. Technically, this is only with respect to the emulated machine state. If the library carries its own state, and the userop is stateful with respect to the library, it is still okay to set this to true. When this is set to false, the underlying execution engine must ensure the machine state is consistent, because the userop may access any part of it directly. Functional userops ought to take primitive parameters and return primitives, and should receive neither the executor nor its state object.

      WARNING: The term "inputs" include disassembly context. Unfortunately, there is currently no way to access that context via p-code ops generated by Sleigh, so the only way to obtain it is to ask the emulator thread for it out of band. Userops that require this are not "pure functions."

      Specified by:
      isFunctional in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      true if a pure function.
      See Also:
    • hasSideEffects

      public boolean hasSideEffects()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Indicates whether this userop may have side effects.

      This means that the function may have an output or an effect other than returning a value. Even if PcodeUseropLibrary.PcodeUseropDefinition.isFunctional() is true, it is possible for a userop to have side effects, e.g., updating a field in a library or printing to the screen.

      Specified by:
      hasSideEffects in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      true if it has side effects.
      See Also:
    • canInlinePcode

      public boolean canInlinePcode()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Indicates whether or not this userop definition produces p-code suitable for inlining in place of its invocation.

      Generally, if all the userop definition does is feed additional p-code to the executor with the same userop library, then it is suitable for inlining. It is possible for the p-code to depend on other factors, but care must be taken, since the decision could be fixed by the underlying execution system at any time. E.g., if the p-code is translated to JVM byte code, then the userop may be inlined at translation time rather than execution time. Recommended factors include configuration, placement within surrounding instructions, static analysis, etc., but the p-code should probably not depend on the machine's dynamic run-time state.

      Specified by:
      canInlinePcode in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      true if inlining is possible, false otherwise.
      See Also:
    • getJavaMethod

      public Method getJavaMethod()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      If this userop is defined as a java callback, get the method
      Specified by:
      getJavaMethod in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      the method, or null
    • getDefiningLibrary

      public PcodeUseropLibrary<T> getDefiningLibrary()
      Description copied from interface: PcodeUseropLibrary.PcodeUseropDefinition
      Get the library that defines (or "owns") this userop

      A userop can become part of other composed libraries, so the library from which this userop was retrieved may not be the same as the one that defined it. This returns the one that defined it.

      As a special consideration, if this userop is a wrapper around another, and this wrapper returns the java method of the delegate, this must return the defining library of the delegate. If this is not defined by a java callback, this method (the defining library) may be null.

      Specified by:
      getDefiningLibrary in interface PcodeUseropLibrary.PcodeUseropDefinition<T>
      Returns:
      the defining library