mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-3613 Support for return storage on stack
This commit is contained in:
parent
22e5c1a48b
commit
e9b5be17c1
11 changed files with 345 additions and 62 deletions
|
@ -55,6 +55,8 @@ void IfaceDecompCapability::registerCommands(IfaceStatus *status)
|
|||
status->registerCom(new IfcCleararch(),"clear","architecture");
|
||||
status->registerCom(new IfcMapaddress(),"map","address");
|
||||
status->registerCom(new IfcMaphash(),"map","hash");
|
||||
status->registerCom(new IfcMapParam(),"map","param");
|
||||
status->registerCom(new IfcMapReturn(),"map","return");
|
||||
status->registerCom(new IfcMapfunction(),"map","function");
|
||||
status->registerCom(new IfcMapexternalref(),"map","externalref");
|
||||
status->registerCom(new IfcMaplabel(),"map","label");
|
||||
|
@ -598,6 +600,49 @@ void IfcMaphash::execute(istream &s)
|
|||
sym->getScope()->setAttribute(sym,Varnode::namelock|Varnode::typelock);
|
||||
}
|
||||
|
||||
/// \class IfcMapParam
|
||||
/// \brief Map a parameter symbol for the current function: `map param #i <address> <typedeclaration>`
|
||||
///
|
||||
/// The position of the parameter in the input list is parsed as an integer, starting at 0.
|
||||
/// The address range used for parameter is explicitly set. The data-type and name of the parameter
|
||||
/// are parsed from the type declaration. The parameter is treated as name and type locked.
|
||||
void IfcMapParam::execute(istream &s)
|
||||
|
||||
{
|
||||
if (dcp->fd == (Funcdata *)0)
|
||||
throw IfaceExecutionError("No function loaded");
|
||||
int4 i;
|
||||
string name;
|
||||
int4 size;
|
||||
ParameterPieces piece;
|
||||
s >> dec >> i; // Position of the parameter
|
||||
piece.addr = parse_machaddr(s,size,*dcp->conf->types); // Starting address of parameter
|
||||
piece.type = parse_type(s,name,dcp->conf);
|
||||
piece.flags = ParameterPieces::typelock | ParameterPieces::namelock;
|
||||
|
||||
dcp->fd->getFuncProto().setParam(i, name, piece);
|
||||
}
|
||||
|
||||
/// \class IfcMapReturn
|
||||
/// \brief Map the return storage for the current function: `map return <address> <typedeclaration>`
|
||||
///
|
||||
/// The address range used for return storage is explicitly set, and the return value is set to the
|
||||
/// parsed data-type. The function's output is considered locked.
|
||||
void IfcMapReturn::execute(istream &s)
|
||||
|
||||
{
|
||||
if (dcp->fd == (Funcdata *)0)
|
||||
throw IfaceExecutionError("No function loaded");
|
||||
string name;
|
||||
int4 size;
|
||||
ParameterPieces piece;
|
||||
piece.addr = parse_machaddr(s,size,*dcp->conf->types); // Starting address of return storage
|
||||
piece.type = parse_type(s,name,dcp->conf);
|
||||
piece.flags = ParameterPieces::typelock;
|
||||
|
||||
dcp->fd->getFuncProto().setOutput(piece);
|
||||
}
|
||||
|
||||
/// \class IfcMapfunction
|
||||
/// \brief Create a new function: `map function <address> [<functionname>] [nocode]`
|
||||
///
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue