decompiler
1.0.0
|
Build p-code from a pre-parsed instruction. More...
#include <sleigh.hh>
Public Member Functions | |
SleighBuilder (ParserWalker *w, DisassemblyCache *dcache, PcodeCacher *pc, AddrSpace *cspc, AddrSpace *uspc, uint4 umask) | |
Constructor. More... | |
virtual void | appendBuild (OpTpl *bld, int4 secnum) |
virtual void | delaySlot (OpTpl *op) |
virtual void | setLabel (OpTpl *op) |
virtual void | appendCrossBuild (OpTpl *bld, int4 secnum) |
Private Member Functions | |
virtual void | dump (OpTpl *op) |
void | buildEmpty (Constructor *ct, int4 secnum) |
Build a named p-code section of a constructor that contains only implied BUILD directives. More... | |
void | generateLocation (const VarnodeTpl *vntpl, VarnodeData &vn) |
Generate a concrete VarnodeData object from the given template (VarnodeTpl) More... | |
AddrSpace * | generatePointer (const VarnodeTpl *vntpl, VarnodeData &vn) |
Generate a pointer VarnodeData from a dynamic template (VarnodeTpl) More... | |
void | generatePointerAdd (PcodeData *op, const VarnodeTpl *vntpl) |
void | setUniqueOffset (const Address &addr) |
Set uniquifying bits for the current instruction. More... | |
Private Attributes | |
AddrSpace * | const_space |
The constant address space. | |
AddrSpace * | uniq_space |
The unique address space. | |
uintb | uniquemask |
Mask of address bits to use to uniquify temporary registers. | |
uintb | uniqueoffset |
Uniquifier bits for this instruction. | |
DisassemblyCache * | discache |
Cache of disassembled instructions. | |
PcodeCacher * | cache |
Cache accumulating p-code data for the instruction. | |
Build p-code from a pre-parsed instruction.
Through the build() method, this walks the parse tree and prepares data for final emission as p-code. (The final emitting is done separately through the PcodeCacher.emit() method). Generally, only p-code for one instruction is prepared. But, through the delay-slot mechanism, build() may recursively visit additional instructions.
ghidra::SleighBuilder::SleighBuilder | ( | ParserWalker * | w, |
DisassemblyCache * | dcache, | ||
PcodeCacher * | pc, | ||
AddrSpace * | cspc, | ||
AddrSpace * | uspc, | ||
uint4 | umask | ||
) |
Constructor.
w | is the parsed instruction |
dcache | is a cache of nearby instruction parses |
pc | will hold the PcodeData and VarnodeData objects produced by this builder |
cspc | is the constant address space |
uspc | is the unique address space |
umask | is the mask to use to find unique bits within an Address |
References ghidra::PcodeCacher::addLabel(), buildEmpty(), cache, const_space, discache, ghidra::DisassemblyCache::getParserContext(), setUniqueOffset(), uniq_space, uniquemask, uniqueoffset, and ghidra::AddrSpace::wrapOffset().
|
private |
Build a named p-code section of a constructor that contains only implied BUILD directives.
If a named section of a constructor is empty, we still need to walk through any subtables that might contain p-code in their named sections. This method treats each subtable operand as an implied build directive, in the otherwise empty section.
ct | is the matching currently Constructor being built |
secnum | is the particular named section number to build |
Referenced by SleighBuilder().
|
private |
Generate a concrete VarnodeData object from the given template (VarnodeTpl)
vntpl | is the template to reference |
vn | is the object to fill in with concrete values |
References ghidra::calc_mask(), ghidra::VarnodeData::offset, ghidra::VarnodeData::size, ghidra::VarnodeData::space, and ghidra::AddrSpace::wrapOffset().
|
private |
Generate a pointer VarnodeData from a dynamic template (VarnodeTpl)
The symbol represents a value referenced through a dynamic pointer. This method generates the varnode representing the pointer itself and also returns the address space in anticipation of generating the LOAD or STORE that actually manipulates the value.
vntpl | is the dynamic template to reference |
vn | is the object to fill with concrete values |
References ghidra::calc_mask(), ghidra::CPUI_INT_ADD, ghidra::CPUI_LOAD, ghidra::CPUI_STORE, ghidra::PcodeData::invar, ghidra::PcodeData::isize, ghidra::VarnodeData::offset, ghidra::PcodeData::opc, ghidra::PcodeData::outvar, ghidra::Translate::RUNTIME_BITRANGE_EA, ghidra::VarnodeData::size, ghidra::VarnodeData::space, and ghidra::AddrSpace::wrapOffset().
|
private |
Set uniquifying bits for the current instruction.
Bits used to make temporary registers unique across multiple instructions are generated based on the given address.
addr | is the given Address |
References ghidra::Address::getOffset().
Referenced by SleighBuilder().