Ghidra 11.3.2
Ghidra internal decompiler documentation.
Loading...
Searching...
No Matches
ghidra::UserOpManage Class Reference

Manager/container for description objects (UserPcodeOp) of user defined p-code ops. More...

#include <userop.hh>

Collaboration diagram for ghidra::UserOpManage:
[legend]

Public Member Functions

 UserOpManage (void)
 Construct an empty manager.
 
 ~UserOpManage (void)
 Destructor.
 
void initialize (Architecture *g)
 Initialize description objects for all user defined ops.
 
int4 numSegmentOps (void) const
 Number of segment operations supported.
 
UserPcodeOpgetOp (uint4 i) const
 Retrieve a user-op description object by index.
 
UserPcodeOpgetOp (const string &nm) const
 Retrieve description by name.
 
UserPcodeOpregisterBuiltin (uint4 i)
 Make sure an active record exists for the given built-in op.
 
SegmentOpgetSegmentOp (int4 i) const
 
void decodeSegmentOp (Decoder &decoder, Architecture *glb)
 Parse a <segmentop> element.
 
void decodeVolatile (Decoder &decoder, Architecture *glb)
 Parse a <volatile> element.
 
void decodeCallOtherFixup (Decoder &decoder, Architecture *glb)
 Parse a <callotherfixup> element.
 
void decodeJumpAssist (Decoder &decoder, Architecture *glb)
 Parse a <jumpassist> element.
 
void manualCallOtherFixup (const string &useropname, const string &outname, const vector< string > &inname, const string &snippet, Architecture *glb)
 Manually install an InjectedUserOp given just names of the user defined op and the p-code snippet.
 

Private Member Functions

void registerOp (UserPcodeOp *op)
 Insert a new UserPcodeOp description object in the map(s)
 

Private Attributes

Architectureglb
 Architecture this manager is associated with.
 
vector< UserPcodeOp * > useroplist
 Description objects indexed by CALLOTHER constant id.
 
map< uint4, UserPcodeOp * > builtinmap
 Map from builtin ids to description objects.
 
map< string, UserPcodeOp * > useropmap
 A map from the name of the user defined operation to a description object.
 
vector< SegmentOp * > segmentop
 Segment operations supported by this Architecture.
 

Detailed Description

Manager/container for description objects (UserPcodeOp) of user defined p-code ops.

The description objects are referenced by the CALLOTHER constant id, (or by name during initialization). During initialize(), every user defined p-code op presented by the Architecture is assigned a default UnspecializedPcodeOp description. Further processing of the .cspec or .pspec may reassign a more specialized description object by parsing specific tags using on of this class's parse* methods.

Member Function Documentation

◆ decodeCallOtherFixup()

void ghidra::UserOpManage::decodeCallOtherFixup ( Decoder decoder,
Architecture glb 
)

Parse a <callotherfixup> element.

Create an InjectedUserOp description object based on the element and register it with this manager.

Parameters
decoderis the stream decoder
glbis the owning Architecture

References ghidra::InjectedUserOp::decode(), glb, and registerOp().

Referenced by ghidra::Architecture::parseCompilerConfig().

◆ decodeJumpAssist()

void ghidra::UserOpManage::decodeJumpAssist ( Decoder decoder,
Architecture glb 
)

Parse a <jumpassist> element.

Create a JumpAssistOp description object based on the element and register it with this manager.

Parameters
decoderis the stream decoder
glbis the owning Architecture

References ghidra::JumpAssistOp::decode(), glb, and registerOp().

Referenced by ghidra::Architecture::parseProcessorConfig().

◆ decodeSegmentOp()

void ghidra::UserOpManage::decodeSegmentOp ( Decoder decoder,
Architecture glb 
)

Parse a <segmentop> element.

Create a SegmentOp description object based on the element and register it with this manager.

Parameters
decoderis the stream decoder
glbis the owning Architecture

References ghidra::SegmentOp::decode(), glb, registerOp(), and useroplist.

Referenced by ghidra::Architecture::parseCompilerConfig(), and ghidra::Architecture::parseProcessorConfig().

◆ decodeVolatile()

void ghidra::UserOpManage::decodeVolatile ( Decoder decoder,
Architecture glb 
)

Parse a <volatile> element.

Create either a VolatileReadOp or VolatileWriteOp description object based on the element and register it with this manager.

Parameters
decoderis the stream decoder
glbis the owning Architecture

References ghidra::UserPcodeOp::BUILTIN_VOLATILE_READ, ghidra::UserPcodeOp::BUILTIN_VOLATILE_WRITE, builtinmap, ghidra::Decoder::getNextAttributeId(), glb, and ghidra::Decoder::readString().

Referenced by ghidra::Architecture::decodeVolatile().

◆ getOp() [1/2]

UserPcodeOp * ghidra::UserOpManage::getOp ( const string &  nm) const

Retrieve description by name.

Parameters
nmis the low-level operation name
Returns
the matching description object or NULL

References useropmap.

◆ getOp() [2/2]

◆ getSegmentOp()

SegmentOp * ghidra::UserOpManage::getSegmentOp ( int4  i) const
inline

Retrieve a segment-op description object by index

Parameters
iis the index
Returns
the indicated segment-op description

References segmentop.

Referenced by ghidra::ActionSegmentize::apply(), ghidra::RuleSegment::applyOp(), ghidra::Funcdata::createStackRef(), ghidra::EmulatePcodeOp::executeSegmentOp(), ghidra::Architecture::getSegmentOp(), and ghidra::Architecture::initializeSegments().

◆ initialize()

void ghidra::UserOpManage::initialize ( Architecture g)

Initialize description objects for all user defined ops.

Every user defined p-code op is initially assigned an UnspecializedPcodeOp description, which may get overridden later.

Parameters
gis the Architecture from which to draw user defined operations

References ghidra::Translate::getUserOpNames(), glb, registerOp(), and ghidra::Architecture::translate.

Referenced by ghidra::Architecture::restoreFromSpec().

◆ manualCallOtherFixup()

void ghidra::UserOpManage::manualCallOtherFixup ( const string &  useropname,
const string &  outname,
const vector< string > &  inname,
const string &  snippet,
Architecture glb 
)

Manually install an InjectedUserOp given just names of the user defined op and the p-code snippet.

An alternate way to attach a call-fixup to user defined p-code ops, without using XML. The p-code to inject is presented as a raw string to be handed to the p-code parser.

Parameters
useropnameis the name of the user defined op
outnameis the name of the output variable in the snippet
innameis the list of input variable names in the snippet
snippetis the raw p-code source snippet
glbis the owning Architecture

References ghidra::UserPcodeOp::getIndex(), getOp(), glb, ghidra::PcodeInjectLibrary::manualCallOtherFixup(), ghidra::Architecture::pcodeinjectlib, and registerOp().

◆ registerBuiltin()

◆ registerOp()

void ghidra::UserOpManage::registerOp ( UserPcodeOp op)
private

Insert a new UserPcodeOp description object in the map(s)

Add the description to the mapping by index and the mapping by name. Make same basic sanity checks for conflicting values and duplicate operations and throw an exception if there's a problem.

Parameters
opis the new description object

References ghidra::AddrSpace::getIndex(), ghidra::UserPcodeOp::getIndex(), ghidra::UserPcodeOp::getName(), ghidra::SegmentOp::getSpace(), segmentop, useroplist, and useropmap.

Referenced by decodeCallOtherFixup(), decodeJumpAssist(), decodeSegmentOp(), initialize(), and manualCallOtherFixup().


The documentation for this class was generated from the following files: