GP-1204: Make overridable execute{U,Bi}naryOp methods

This commit is contained in:
Dan 2021-08-19 15:54:51 -04:00
parent 888f2635b4
commit 451e5f65d3

View file

@ -102,23 +102,11 @@ public class PcodeExecutor<T> {
throw new LowlevelError("Unsupported pcode op" + op);
}
if (b instanceof UnaryOpBehavior) {
Varnode in1Var = op.getInput(0);
Varnode outVar = op.getOutput();
T in1 = state.getVar(in1Var);
T out = arithmetic.unaryOp((UnaryOpBehavior) b, outVar.getSize(),
in1Var.getSize(), in1);
state.setVar(outVar, out);
executeUnaryOp(op, (UnaryOpBehavior) b);
return;
}
if (b instanceof BinaryOpBehavior) {
Varnode in1Var = op.getInput(0);
Varnode in2Var = op.getInput(1);
Varnode outVar = op.getOutput();
T in1 = state.getVar(in1Var);
T in2 = state.getVar(in2Var);
T out = arithmetic.binaryOp((BinaryOpBehavior) b, outVar.getSize(),
in1Var.getSize(), in1, in2Var.getSize(), in2);
state.setVar(outVar, out);
executeBinaryOp(op, (BinaryOpBehavior) b);
return;
}
switch (op.getOpcode()) {
@ -172,6 +160,26 @@ public class PcodeExecutor<T> {
return (int) vn.getAddress().getOffset();
}
public void executeUnaryOp(PcodeOp op, UnaryOpBehavior b) {
Varnode in1Var = op.getInput(0);
Varnode outVar = op.getOutput();
T in1 = state.getVar(in1Var);
T out = arithmetic.unaryOp(b, outVar.getSize(),
in1Var.getSize(), in1);
state.setVar(outVar, out);
}
public void executeBinaryOp(PcodeOp op, BinaryOpBehavior b) {
Varnode in1Var = op.getInput(0);
Varnode in2Var = op.getInput(1);
Varnode outVar = op.getOutput();
T in1 = state.getVar(in1Var);
T in2 = state.getVar(in2Var);
T out = arithmetic.binaryOp(b, outVar.getSize(),
in1Var.getSize(), in1, in2Var.getSize(), in2);
state.setVar(outVar, out);
}
public void executeLoad(PcodeOp op) {
int spaceID = getIntConst(op.getInput(0));
AddressSpace space = language.getAddressFactory().getAddressSpace(spaceID);