mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
populate HighFunctionShellSymbol in GlobalSymbolMap
This commit is contained in:
parent
97b43b9470
commit
7b407f1965
11 changed files with 104 additions and 42 deletions
|
@ -572,10 +572,12 @@ void FunctionSymbol::saveXml(ostream &s) const
|
|||
|
||||
{
|
||||
if (fd != (Funcdata *)0)
|
||||
fd->saveXml(s,false); // Save the function itself
|
||||
fd->saveXml(s,symbolId,false); // Save the function itself
|
||||
else {
|
||||
s << "<functionshell";
|
||||
a_v(s,"name",name);
|
||||
if (symbolId != 0)
|
||||
a_v_u(s,"id",symbolId);
|
||||
s << "/>\n";
|
||||
}
|
||||
}
|
||||
|
@ -585,7 +587,7 @@ void FunctionSymbol::restoreXml(const Element *el)
|
|||
{
|
||||
if (el->getName() == "function") {
|
||||
fd = new Funcdata("",scope,Address());
|
||||
fd->restoreXml(el);
|
||||
symbolId = fd->restoreXml(el);
|
||||
name = fd->getName();
|
||||
if (consumeSize < fd->getSize()) {
|
||||
if ((fd->getSize()>1)&&(fd->getSize() <= 8))
|
||||
|
@ -593,7 +595,17 @@ void FunctionSymbol::restoreXml(const Element *el)
|
|||
}
|
||||
}
|
||||
else { // functionshell
|
||||
name = el->getAttributeValue("name");
|
||||
symbolId = 0;
|
||||
for(int4 i=0;i<el->getNumAttributes();++i) {
|
||||
const string &attrName(el->getAttributeName(i));
|
||||
if (attrName == "name")
|
||||
name = el->getAttributeValue(i);
|
||||
else if (attrName == "id") {
|
||||
istringstream s(el->getAttributeValue(i));
|
||||
s.unsetf(ios::dec | ios::hex | ios::oct);
|
||||
s >> symbolId;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -682,11 +682,14 @@ void Funcdata::saveXmlTree(ostream &s) const
|
|||
/// If indicated by the caller, a description of the entire PcodeOp and Varnode
|
||||
/// tree is also emitted.
|
||||
/// \param s is the output stream
|
||||
/// \param id is the unique id associated with the function symbol
|
||||
/// \param savetree is \b true if the p-code tree should be emitted
|
||||
void Funcdata::saveXml(ostream &s,bool savetree) const
|
||||
void Funcdata::saveXml(ostream &s,uint8 id,bool savetree) const
|
||||
|
||||
{
|
||||
s << "<function";
|
||||
if (id != 0)
|
||||
a_v_u(s, "id", id);
|
||||
a_v(s,"name",name);
|
||||
a_v_i(s,"size",size);
|
||||
if (hasNoCode())
|
||||
|
@ -712,22 +715,30 @@ void Funcdata::saveXml(ostream &s,bool savetree) const
|
|||
/// From an XML \<function> tag, recover the name, address, prototype, symbol,
|
||||
/// jump-table, and override information for \b this function.
|
||||
/// \param el is the root \<function> tag
|
||||
void Funcdata::restoreXml(const Element *el)
|
||||
/// \return the symbol id associated with the function
|
||||
uint8 Funcdata::restoreXml(const Element *el)
|
||||
|
||||
{
|
||||
// clear(); // Shouldn't be needed
|
||||
name.clear();
|
||||
size = -1;
|
||||
uint8 id = 0;
|
||||
AddrSpace *stackid = glb->getStackSpace();
|
||||
for(int4 i=0;i<el->getNumAttributes();++i) {
|
||||
if (el->getAttributeName(i) == "name")
|
||||
const string &attrName(el->getAttributeName(i));
|
||||
if (attrName == "name")
|
||||
name = el->getAttributeValue(i);
|
||||
else if (el->getAttributeName(i) == "size") {
|
||||
else if (attrName == "size") {
|
||||
istringstream s( el->getAttributeValue(i));
|
||||
s.unsetf(ios::dec | ios::hex | ios::oct);
|
||||
s >> size;
|
||||
}
|
||||
else if (el->getAttributeName(i) == "nocode") {
|
||||
else if (attrName == "id") {
|
||||
istringstream s( el->getAttributeValue(i));
|
||||
s.unsetf(ios::dec | ios::hex | ios::oct);
|
||||
s >> id;
|
||||
}
|
||||
else if (attrName == "nocode") {
|
||||
if (xml_readbool(el->getAttributeValue(i)))
|
||||
flags |= no_code;
|
||||
}
|
||||
|
@ -779,6 +790,7 @@ void Funcdata::restoreXml(const Element *el)
|
|||
funcp.setScope(localmap,baseaddr+ -1);
|
||||
}
|
||||
localmap->resetLocalWindow();
|
||||
return id;
|
||||
}
|
||||
|
||||
/// \brief Inject p-code from a \e payload into \b this live function
|
||||
|
|
|
@ -171,8 +171,8 @@ public:
|
|||
void printVarnodeTree(ostream &s) const; ///< Print a description of all Varnodes to a stream
|
||||
void printBlockTree(ostream &s) const; ///< Print a description of control-flow structuring to a stream
|
||||
void printLocalRange(ostream &s) const; ///< Print description of memory ranges associated with local scopes
|
||||
void saveXml(ostream &s,bool savetree) const; ///< Emit an XML description of \b this function to stream
|
||||
void restoreXml(const Element *el); ///< Restore the state of \b this function from an XML description
|
||||
void saveXml(ostream &s,uint8 id,bool savetree) const; ///< Emit an XML description of \b this function to stream
|
||||
uint8 restoreXml(const Element *el); ///< Restore the state of \b this function from an XML description
|
||||
void saveXmlJumpTable(ostream &s) const; ///< Emit an XML description of jump-tables to stream
|
||||
void restoreXmlJumpTable(const Element *el); ///< Restore jump-tables from an XML description
|
||||
void saveXmlTree(ostream &s) const; ///< Save an XML description of the p-code tree to stream
|
||||
|
|
|
@ -314,7 +314,7 @@ void DecompileAt::rawAction(void)
|
|||
ParamIDAnalysis pidanalysis( fd, false );
|
||||
pidanalysis.saveXml( sout, true );
|
||||
}
|
||||
fd->saveXml(sout,ghidra->getSendSyntaxTree());
|
||||
fd->saveXml(sout,0,ghidra->getSendSyntaxTree());
|
||||
if (ghidra->getSendCCode()&&
|
||||
(ghidra->allacts.getCurrentName() == "decompile"))
|
||||
ghidra->print->docFunction(fd);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue