mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
Refactoring based on HighSymbol
This commit is contained in:
parent
d552aa4b82
commit
76d0f12bd3
28 changed files with 631 additions and 470 deletions
|
@ -393,7 +393,7 @@ void DynamicHash::uniqueHash(const Varnode *root,Funcdata *fd)
|
|||
/// \param addr is the given address
|
||||
/// \param h is the hash
|
||||
/// \return the matching Varnode or NULL
|
||||
Varnode *DynamicHash::findVarnode(Funcdata *fd,const Address &addr,uint8 h)
|
||||
Varnode *DynamicHash::findVarnode(const Funcdata *fd,const Address &addr,uint8 h)
|
||||
|
||||
{
|
||||
uint4 method = getMethodFromHash(h);
|
||||
|
@ -423,7 +423,7 @@ Varnode *DynamicHash::findVarnode(Funcdata *fd,const Address &addr,uint8 h)
|
|||
/// \param fd is the function holding the data-flow
|
||||
/// \param addr is the given address
|
||||
/// \param h is the given hash
|
||||
void DynamicHash::gatherFirstLevelVars(vector<Varnode *> &varlist,Funcdata *fd,const Address &addr,uint8 h)
|
||||
void DynamicHash::gatherFirstLevelVars(vector<Varnode *> &varlist,const Funcdata *fd,const Address &addr,uint8 h)
|
||||
|
||||
{
|
||||
OpCode opc = getOpCodeFromHash(h);
|
||||
|
|
|
@ -79,11 +79,11 @@ public:
|
|||
void clear(void); ///< Called for each additional hash (after the first)
|
||||
void calcHash(const Varnode *root,uint4 method); ///< Calculate the hash for given Varnode and method
|
||||
void uniqueHash(const Varnode *root,Funcdata *fd); ///< Select a unique hash for the given Varnode
|
||||
Varnode *findVarnode(Funcdata *fd,const Address &addr,uint8 h);
|
||||
Varnode *findVarnode(const Funcdata *fd,const Address &addr,uint8 h);
|
||||
uint8 getHash(void) const { return hash; } ///< Get the (current) hash
|
||||
|
||||
const Address &getAddress(void) const { return addrresult; } ///< Get the (current) address
|
||||
static void gatherFirstLevelVars(vector<Varnode *> &varlist,Funcdata *fd,const Address &addr,uint8 h);
|
||||
static void gatherFirstLevelVars(vector<Varnode *> &varlist,const Funcdata *fd,const Address &addr,uint8 h);
|
||||
static int4 getSlotFromHash(uint8 h); ///< Retrieve the encoded slot from a hash
|
||||
static uint4 getMethodFromHash(uint8 h); ///< Retrieve the encoded method from a hash
|
||||
static OpCode getOpCodeFromHash(uint8 h); ///< Retrieve the encoded op-code from a hash
|
||||
|
|
|
@ -607,7 +607,6 @@ void Funcdata::saveVarnodeXml(ostream &s,VarnodeLocSet::const_iterator iter,Varn
|
|||
void Funcdata::saveXmlHigh(ostream &s) const
|
||||
|
||||
{
|
||||
int4 j;
|
||||
Varnode *vn;
|
||||
HighVariable *high;
|
||||
|
||||
|
@ -620,32 +619,7 @@ void Funcdata::saveXmlHigh(ostream &s) const
|
|||
high = vn->getHigh();
|
||||
if (high->isMark()) continue;
|
||||
high->setMark();
|
||||
vn = high->getNameRepresentative(); // Get representative varnode
|
||||
s << "<high ";
|
||||
// a_v(s,"name",high->getName());
|
||||
a_v_u(s,"repref",vn->getCreateIndex());
|
||||
if (high->isSpacebase()||high->isImplied()) // This is a special variable
|
||||
a_v(s,"class",string("other"));
|
||||
else if (high->isPersist()&&high->isAddrTied()) // Global variable
|
||||
a_v(s,"class",string("global"));
|
||||
else if (high->isConstant())
|
||||
a_v(s,"class",string("constant"));
|
||||
else if (!high->isPersist())
|
||||
a_v(s,"class",string("local"));
|
||||
else
|
||||
a_v(s,"class",string("other"));
|
||||
if (high->isTypeLock())
|
||||
a_v_b(s,"typelock",true);
|
||||
if (high->getSymbol() != (Symbol *)0)
|
||||
a_v_u(s,"symref",high->getSymbol()->getId());
|
||||
s << '>';
|
||||
high->getType()->saveXml(s);
|
||||
for(j=0;j<high->numInstances();++j) {
|
||||
s << "<addr ";
|
||||
a_v_u(s,"ref",high->getInstance(j)->getCreateIndex());
|
||||
s << "/>";
|
||||
}
|
||||
s << "</high>";
|
||||
high->saveXml(s);
|
||||
}
|
||||
for(iter=beginLoc();iter!=endLoc();++iter) {
|
||||
vn = *iter;
|
||||
|
|
|
@ -314,7 +314,15 @@ HighVariable *Funcdata::findHigh(const string &name) const
|
|||
if (symList.empty()) return (HighVariable *)0;
|
||||
Symbol *sym = symList[0];
|
||||
SymbolEntry *entry = sym->getFirstWholeMap();
|
||||
|
||||
|
||||
if (entry->isDynamic()) {
|
||||
DynamicHash dhash;
|
||||
Varnode *vn = dhash.findVarnode(this, entry->getFirstUseAddress(), entry->getHash());
|
||||
if (vn == (Varnode *)0 || vn->isAnnotation())
|
||||
return (HighVariable *)0;
|
||||
return vn->getHigh();
|
||||
}
|
||||
|
||||
VarnodeLocSet::const_iterator iter,enditer;
|
||||
HighVariable *high;
|
||||
|
||||
|
|
|
@ -359,6 +359,46 @@ int4 HighVariable::instanceIndex(const Varnode *vn) const
|
|||
return -1;
|
||||
}
|
||||
|
||||
/// \param s is the output stream to write XML to
|
||||
void HighVariable::saveXml(ostream &s) const
|
||||
|
||||
{
|
||||
Varnode *vn = getNameRepresentative(); // Get representative varnode
|
||||
s << "<high ";
|
||||
// a_v(s,"name",high->getName());
|
||||
a_v_u(s,"repref",vn->getCreateIndex());
|
||||
if (isSpacebase()||isImplied()) // This is a special variable
|
||||
a_v(s,"class",string("other"));
|
||||
else if (isPersist()&&isAddrTied()) // Global variable
|
||||
a_v(s,"class",string("global"));
|
||||
else if (isConstant())
|
||||
a_v(s,"class",string("constant"));
|
||||
else if (!isPersist() && (symbol != (Symbol *)0)) {
|
||||
if (symbol->getCategory() == 0)
|
||||
a_v(s,"class",string("param"));
|
||||
else
|
||||
a_v(s,"class",string("local"));
|
||||
}
|
||||
else {
|
||||
a_v(s,"class",string("other"));
|
||||
}
|
||||
if (isTypeLock())
|
||||
a_v_b(s,"typelock",true);
|
||||
if (symbol != (Symbol *)0) {
|
||||
a_v_u(s,"symref",symbol->getId());
|
||||
if (symboloffset >= 0)
|
||||
a_v_i(s, "offset", symboloffset);
|
||||
}
|
||||
s << '>';
|
||||
getType()->saveXml(s);
|
||||
for(int4 j=0;j<inst.size();++j) {
|
||||
s << "<addr ";
|
||||
a_v_u(s,"ref",inst[j]->getCreateIndex());
|
||||
s << "/>";
|
||||
}
|
||||
s << "</high>";
|
||||
}
|
||||
|
||||
#ifdef MERGEMULTI_DEBUG
|
||||
/// \brief Check that there are no internal Cover intersections within \b this
|
||||
///
|
||||
|
|
|
@ -129,6 +129,7 @@ public:
|
|||
bool isUnattached(void) const { return inst.empty(); } ///< Return \b true if \b this has no member Varnode
|
||||
bool isTypeLock(void) const { updateType(); return ((flags & Varnode::typelock)!=0); } ///< Return \b true if \b this is \e typelocked
|
||||
bool isNameLock(void) const { updateFlags(); return ((flags & Varnode::namelock)!=0); } ///< Return \b true if \b this is \e namelocked
|
||||
void saveXml(ostream &s) const; ///< Save the variable to stream as an XML \<high\> tag
|
||||
#ifdef MERGEMULTI_DEBUG
|
||||
void verifyCover(void) const;
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue