mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
Attempt at adjusting processing of free stores
This commit is contained in:
parent
7dea6d1f41
commit
6a15520aa5
2 changed files with 30 additions and 9 deletions
|
@ -800,10 +800,15 @@ bool Heritage::protectFreeStores(AddrSpace *spc,vector<PcodeOp *> &freeStores)
|
||||||
++iter;
|
++iter;
|
||||||
if (op->isDead()) continue;
|
if (op->isDead()) continue;
|
||||||
Varnode *vn = op->getIn(1);
|
Varnode *vn = op->getIn(1);
|
||||||
if (vn->isWritten()) {
|
while (vn->isWritten()) {
|
||||||
PcodeOp *copyOp = vn->getDef();
|
PcodeOp *defOp = vn->getDef();
|
||||||
if (copyOp->code() == CPUI_COPY)
|
OpCode opc = defOp->code();
|
||||||
vn = copyOp->getIn(0);
|
if (opc == CPUI_COPY)
|
||||||
|
vn = defOp->getIn(0);
|
||||||
|
else if (opc == CPUI_INT_ADD && defOp->getIn(1)->isConstant())
|
||||||
|
vn = defOp->getIn(0);
|
||||||
|
else
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (vn->isFree() && vn->getSpace() == spc) {
|
if (vn->isFree() && vn->getSpace() == spc) {
|
||||||
fd->opMarkSpacebasePtr(op); // Mark op as spacebase STORE, even though we're not sure
|
fd->opMarkSpacebasePtr(op); // Mark op as spacebase STORE, even though we're not sure
|
||||||
|
@ -913,9 +918,18 @@ bool Heritage::discoverIndexedStackPointers(AddrSpace *spc,vector<PcodeOp *> &fr
|
||||||
}
|
}
|
||||||
case CPUI_STORE:
|
case CPUI_STORE:
|
||||||
{
|
{
|
||||||
|
if (op->getIn(1) == curNode.vn) { // Make sure the STORE pointer comes from our path
|
||||||
if (curNode.traversals != 0) {
|
if (curNode.traversals != 0) {
|
||||||
generateStoreGuard(curNode, op, spc);
|
generateStoreGuard(curNode, op, spc);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// If there were no traversals (of non-constant ADD or MULTIEQUAL) then the
|
||||||
|
// pointer is equal to the stackpointer plus a constant (through an indirect is possible)
|
||||||
|
// This will likely get resolved in the next heritage pass, but we leave the
|
||||||
|
// spacebaseptr mark on, so that that the indirects don't get removed
|
||||||
|
fd->opMarkSpacebasePtr(op);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -2932,11 +2932,18 @@ int4 RuleIndirectCollapse::applyOp(PcodeOp *op,Funcdata &data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (indop->usesSpacebasePtr()) {
|
else if (indop->usesSpacebasePtr()) {
|
||||||
|
if (indop->code() == CPUI_STORE) {
|
||||||
const LoadGuard *guard = data.getStoreGuard(indop);
|
const LoadGuard *guard = data.getStoreGuard(indop);
|
||||||
if (guard != (const LoadGuard *)0) {
|
if (guard != (const LoadGuard *)0) {
|
||||||
if (guard->isGuarded(op->getOut()->getAddr()))
|
if (guard->isGuarded(op->getOut()->getAddr()))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// A marked STORE that is not guarded should eventually get converted to a COPY
|
||||||
|
// so we keep the INDIRECT until that happens
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue