Attempt at adjusting processing of free stores

This commit is contained in:
caheckman 2020-03-31 14:06:27 -04:00
parent 7dea6d1f41
commit 6a15520aa5
2 changed files with 30 additions and 9 deletions

View file

@ -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:

View file

@ -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;