mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-06 03:50:02 +02:00
Fix for setting input varnodes and inserting MULTIEQUAL
This commit is contained in:
parent
9762c86a5a
commit
1415a41432
1 changed files with 35 additions and 19 deletions
|
@ -119,8 +119,12 @@ void TransformOp::createReplacement(Funcdata *fd)
|
||||||
fd->opSetOpcode(replacement, opc);
|
fd->opSetOpcode(replacement, opc);
|
||||||
if (output != (TransformVar *)0)
|
if (output != (TransformVar *)0)
|
||||||
output->createReplacement(fd);
|
output->createReplacement(fd);
|
||||||
if (follow == (TransformOp *)0) // Can be inserted immediately
|
if (follow == (TransformOp *)0) { // Can be inserted immediately
|
||||||
fd->opInsertBefore(replacement, op);
|
if (opc == CPUI_MULTIEQUAL)
|
||||||
|
fd->opInsertBegin(replacement, op->getParent());
|
||||||
|
else
|
||||||
|
fd->opInsertBefore(replacement, op);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +135,10 @@ bool TransformOp::attemptInsertion(Funcdata *fd)
|
||||||
{
|
{
|
||||||
if (follow != (TransformOp *)0) {
|
if (follow != (TransformOp *)0) {
|
||||||
if (follow->follow == (TransformOp *)0) { // Check if the follow is inserted
|
if (follow->follow == (TransformOp *)0) { // Check if the follow is inserted
|
||||||
fd->opInsertBefore(replacement,follow->replacement);
|
if (opc == CPUI_MULTIEQUAL)
|
||||||
|
fd->opInsertBegin(replacement, follow->replacement->getParent());
|
||||||
|
else
|
||||||
|
fd->opInsertBefore(replacement,follow->replacement);
|
||||||
follow = (TransformOp *)0; // Mark that this has been inserted
|
follow = (TransformOp *)0; // Mark that this has been inserted
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -501,27 +508,36 @@ void TransformManager::removeOld(void)
|
||||||
void TransformManager::transformInputVarnodes(void)
|
void TransformManager::transformInputVarnodes(void)
|
||||||
|
|
||||||
{
|
{
|
||||||
list<TransformVar>::iterator iter;
|
map<int4,TransformVar *>::iterator iter;
|
||||||
vector<Varnode *> deadList;
|
vector<TransformVar *> deadList;
|
||||||
|
|
||||||
for(iter=newVarnodes.begin();iter!=newVarnodes.end();++iter) {
|
for(iter=pieceMap.begin();iter!=pieceMap.end();++iter) {
|
||||||
TransformVar &rvn(*iter);
|
TransformVar *vArray = (*iter).second;
|
||||||
if (rvn.type == TransformVar::piece && rvn.def == (TransformOp *)0) {
|
for(int4 i=0;;++i) {
|
||||||
if (!rvn.vn->isMark()) {
|
TransformVar *rvn = vArray + i;
|
||||||
rvn.vn->setMark();
|
if (rvn->type == TransformVar::piece) {
|
||||||
deadList.push_back(rvn.vn);
|
Varnode *vn = rvn->vn;
|
||||||
|
if (vn->isInput()) {
|
||||||
|
deadList.push_back(rvn);
|
||||||
|
if (vn->isMark()) {
|
||||||
|
rvn->vn = (Varnode *)0; // Zero out if more than one TransformVar referencing input
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vn->setMark();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if ((rvn->flags & TransformVar::split_terminator)!=0)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int4 i=0;i<deadList.size();++i)
|
for(int4 i=0;i<deadList.size();++i) {
|
||||||
fd->deleteVarnode(deadList[i]);
|
TransformVar *rvn = deadList[i];
|
||||||
|
Varnode *vn = rvn->vn;
|
||||||
for(iter=newVarnodes.begin();iter!=newVarnodes.end();++iter) {
|
if (vn != (Varnode *)0)
|
||||||
TransformVar &rvn(*iter);
|
fd->deleteVarnode(vn);
|
||||||
if (rvn.type == TransformVar::piece && rvn.def == (TransformOp *)0) {
|
rvn->replacement = fd->setInputVarnode(rvn->replacement);
|
||||||
rvn.replacement = fd->setInputVarnode(rvn.replacement);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue