Ghidra Decompiler Analysis Engine
Public Types | Public Member Functions | Static Public Member Functions | List of all members
Override Class Reference

A container of commands that override the decompiler's default behavior for a single function. More...

#include <override.hh>

Public Types

enum  {
  NONE = 0, BRANCH = 1, CALL = 2, CALL_RETURN = 3,
  RETURN = 4
}
 Enumeration of possible branch overrides. More...
 

Public Member Functions

void insertForceGoto (const Address &targetpc, const Address &destpc)
 Force a specific branch instruction to be an unstructured goto. More...
 
void insertDeadcodeDelay (AddrSpace *spc, int4 delay)
 Override the number of passes that are executed before dead-code elimination starts. More...
 
bool hasDeadcodeDelay (AddrSpace *spc) const
 Check if a delay override is already installed for an address space. More...
 
void insertIndirectOverride (const Address &callpoint, const Address &directcall)
 Override an indirect call turning it into a direct call. More...
 
void insertProtoOverride (const Address &callpoint, FuncProto *p)
 Override the assumed function prototype at a specific call site. More...
 
void insertMultistageJump (const Address &addr)
 Flag an indirect jump for multistage analysis. More...
 
void insertFlowOverride (const Address &addr, uint4 type)
 Mark a branch instruction with a different flow type. More...
 
void applyPrototype (Funcdata &data, FuncCallSpecs &fspecs) const
 Look for and apply a function prototype override. More...
 
void applyIndirect (Funcdata &data, FuncCallSpecs &fspecs) const
 Look for and apply destination overrides of indirect calls. More...
 
bool queryMultistageJumptable (const Address &addr) const
 Check for a multistage marker for a specific indirect jump. More...
 
void applyDeadCodeDelay (Funcdata &data) const
 Apply any dead-code delay overrides. More...
 
void applyForceGoto (Funcdata &data) const
 Push all the force-goto overrides into the function. More...
 
uint4 getFlowOverride (const Address &addr) const
 Return the particular flow override at a given address. More...
 
void printRaw (ostream &s, Architecture *glb) const
 Dump a description of the overrides to stream. More...
 
void generateOverrideMessages (vector< string > &messagelist, Architecture *glb) const
 Create warning messages that describe current overrides. More...
 
void saveXml (ostream &s, Architecture *glb) const
 Write the override commands to an XML stream. More...
 
void restoreXml (const Element *el, Architecture *glb)
 Read in override commands from XML. More...
 

Static Public Member Functions

static string typeToString (uint4 tp)
 Convert a flow override type to a string. More...
 
static uint4 stringToType (const string &nm)
 Convert a string to a flow override type. More...
 

Detailed Description

A container of commands that override the decompiler's default behavior for a single function.

Information about a particular function that can be overridden includes:

Commands exist independently of the main data-flow, control-flow, and symbol structures and survive decompilation restart. A few analyses, mid transformation, insert a new command to fix a problem that was discovered too late and then force a restart via Funcdata::setRestartPending()

The class accept new commands via the insert* methods. The decompiler applies them by calling the apply* or get* methods.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum

Enumeration of possible branch overrides.

Enumerator
NONE 

No override.

BRANCH 

Replace primary CALL or RETURN with suitable BRANCH operation.

CALL 

Replace primary BRANCH or RETURN with suitable CALL operation.

CALL_RETURN 

Replace primary BRANCH or RETURN with suitable CALL/RETURN operation.

RETURN 

Replace primary BRANCH or CALL with a suitable RETURN operation.

Member Function Documentation

◆ applyDeadCodeDelay()

void Override::applyDeadCodeDelay ( Funcdata data) const

Apply any dead-code delay overrides.

Look for delays of each address space and apply them to the Heritage object

Parameters
datais the function

◆ applyForceGoto()

void Override::applyForceGoto ( Funcdata data) const

Push all the force-goto overrides into the function.

Parameters
datais the function

◆ applyIndirect()

void Override::applyIndirect ( Funcdata data,
FuncCallSpecs fspecs 
) const

Look for and apply destination overrides of indirect calls.

Given an indirect call, look for any overrides, then copy in the overriding target address of the direct call

Parameters
datais (calling) function
fspecsis a reference to the call specification

◆ applyPrototype()

void Override::applyPrototype ( Funcdata data,
FuncCallSpecs fspecs 
) const

Look for and apply a function prototype override.

Given a call point, look for a prototype override and copy the call specification in

Parameters
datais the (calling) function
fspecsis a reference to the call specification

◆ generateOverrideMessages()

void Override::generateOverrideMessages ( vector< string > &  messagelist,
Architecture glb 
) const

Create warning messages that describe current overrides.

Message are designed to be displayed in the function header comment

Parameters
messagelistwill hold the generated list of messages
glbis the Architecture

◆ getFlowOverride()

uint4 Override::getFlowOverride ( const Address addr) const

Return the particular flow override at a given address.

Parameters
addris the address of a branch instruction
Returns
the override type

◆ hasDeadcodeDelay()

bool Override::hasDeadcodeDelay ( AddrSpace spc) const

Check if a delay override is already installed for an address space.

Parameters
spcis the address space
Returns
true if an override has already been installed

◆ insertDeadcodeDelay()

void Override::insertDeadcodeDelay ( AddrSpace spc,
int4  delay 
)

Override the number of passes that are executed before dead-code elimination starts.

Every address space has an assigned delay (which may be zero) before a PcodeOp involving a Varnode in that address space can be eliminated. This command allows the delay for a specific address space to be increased so that new Varnode accesses can be discovered.

Parameters
spcis the address space to modify
delayis the size of the delay (in passes)

◆ insertFlowOverride()

void Override::insertFlowOverride ( const Address addr,
uint4  type 
)

Mark a branch instruction with a different flow type.

Change the interpretation of a BRANCH, CALL, or RETURN

Parameters
addris the address of the branch instruction
typeis the type of flow that should be forced

◆ insertForceGoto()

void Override::insertForceGoto ( const Address targetpc,
const Address destpc 
)

Force a specific branch instruction to be an unstructured goto.

The command is specified as the address of the branch instruction and the destination address of the branch. The decompiler will automatically mark this as a unstructured, when trying to structure the control-flow

Parameters
targetpcis the address of the branch instruction
destpcis the destination address of the branch

◆ insertIndirectOverride()

void Override::insertIndirectOverride ( const Address callpoint,
const Address directcall 
)

Override an indirect call turning it into a direct call.

The command consists of the address of the indirect call instruction and the target address of the direct address

Parameters
callpointis the address of the indirect call
directcallis the target address of the direct call

◆ insertMultistageJump()

void Override::insertMultistageJump ( const Address addr)

Flag an indirect jump for multistage analysis.

Parameters
addris the address of the indirect jump

◆ insertProtoOverride()

void Override::insertProtoOverride ( const Address callpoint,
FuncProto p 
)

Override the assumed function prototype at a specific call site.

The exact input and output storage locations are overridden for a specific call instruction (direct or indirect).

Parameters
callpointis the address of the call instruction
pis the overriding function prototype

◆ printRaw()

void Override::printRaw ( ostream &  s,
Architecture glb 
) const

Dump a description of the overrides to stream.

Give a description of each override, one per line, that is suitable for debug

Parameters
sis the output stream
glbis the Architecture

◆ queryMultistageJumptable()

bool Override::queryMultistageJumptable ( const Address addr) const

Check for a multistage marker for a specific indirect jump.

Given the address of an indirect jump, look for the multistate command

Parameters
addris the address of the indirect jump

◆ restoreXml()

void Override::restoreXml ( const Element el,
Architecture glb 
)

Read in override commands from XML.

Parameters
elis the root <override> element
glbis the Architecture

◆ saveXml()

void Override::saveXml ( ostream &  s,
Architecture glb 
) const

Write the override commands to an XML stream.

All the commands are written as sub-tags of a root <override> tag.

Parameters
sis the output stream
glbis the Architecture

◆ stringToType()

uint4 Override::stringToType ( const string &  nm)
static

Convert a string to a flow override type.

Parameters
nmis the override name
Returns
the override enumeration type

◆ typeToString()

string Override::typeToString ( uint4  tp)
static

Convert a flow override type to a string.

Parameters
tpis the override type
Returns
the corresponding name string

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