use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class StmtSearcher method travel.
public void travel(Value op) {
switch(op.et) {
case E0:
break;
case E1:
travel(op.getOp());
break;
case E2:
travel(op.getOp1());
travel(op.getOp2());
break;
case En:
Value[] ops = op.getOps();
for (Value op1 : ops) {
travel(op1);
}
break;
}
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class AggTransformer method localCanExecFirst.
/**
* dfs find find local and the first locationInsensitive Value
* // TODO if can not merge, try adjust the stmt to fit the local
*/
private static void localCanExecFirst(Local local, Stmt target) throws MergeResult {
switch(target.et) {
// impossible
case E0:
case // no EnStmt yet
En:
throw FAIL;
case E1:
localCanExecFirst(local, target.getOp());
break;
case E2:
AssignStmt as = (AssignStmt) target;
Value op1 = as.getOp1();
Value op2 = as.getOp2();
switch(op1.vt) {
case LOCAL:
localCanExecFirst(local, op2);
break;
case FIELD:
localCanExecFirst(local, op1.getOp());
// pass through
case STATIC_FIELD:
localCanExecFirst(local, op2);
break;
case ARRAY:
localCanExecFirst(local, op1.getOp1());
localCanExecFirst(local, op1.getOp2());
localCanExecFirst(local, op2);
break;
default:
}
break;
}
throw FAIL;
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class AggTransformer method modReplace.
private void modReplace(Map<Local, Value> toReplace, Cfg.TravelCallBack tcb) {
for (Map.Entry<Local, Value> e : toReplace.entrySet()) {
Value v = e.getValue();
if (v.vt == Value.VT.LOCAL) {
while (true) {
Value v2 = toReplace.get(v);
if (v2 == null) {
break;
}
v = v2;
if (v.vt != Value.VT.LOCAL) {
break;
}
}
e.setValue(v);
} else {
Cfg.travelMod(v, tcb);
}
}
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class ArrayNullPointerTransformer method replaceNPE.
private void replaceNPE(StmtList stmts, List<Local> locals, Stmt p) {
List<Value> values = new ArrayList<Value>();
switch(p.et) {
case E1:
tryAdd(((E1Stmt) p).op.trim(), values);
break;
case E2:
E2Stmt e2 = (E2Stmt) p;
switch(e2.op1.trim().vt) {
case LOCAL:
tryAdd(e2.op2.trim(), values);
break;
case ARRAY:
ArrayExpr ae = (ArrayExpr) e2.op1.trim();
if (tryAdd(ae.op1.trim(), values)) {
if (tryAdd(ae.op2.trim(), values)) {
tryAdd(e2.op2.trim(), values);
}
}
break;
case // putfield
FIELD:
FieldExpr fe = (FieldExpr) e2.op1.trim();
if (fe.op == null || fe.op.trim() == null || tryAdd(fe.op.trim(), values)) {
tryAdd(e2.op2.trim(), values);
}
break;
default:
if (tryAdd(e2.op2.trim(), values)) {
tryAdd(e2.op1.trim(), values);
}
}
default:
}
for (Value value : values) {
switch(value.vt) {
case CONSTANT:
case LOCAL:
break;
default:
Local n = Exprs.nLocal("xxx");
locals.add(n);
stmts.insertBefore(p, Stmts.nAssign(n, value));
}
}
stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[0], new String[0], "Ljava/lang/NullPointerException;")));
stmts.remove(p);
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class UnSSATransformer method fixPhi.
/**
* there is somewhere both a and its possible x is both live, insert a=x, will change the meaning for example
*
* <pre>
* L0:
* a = phi(b, ... )
* b = 234;
* if a>0 goto L0: // a, b both live here
* ...
* </pre>
*
* after insert a=b before the if stmt, the programe change to
*
* <pre>
* L0:
* // a = phi(b, ... )
* b = 234;
* a = b
* if a>0 goto L0:
* ...
* </pre>
*
* the solution is by introduce a new local x
*
* <pre>
* L0:
* x = phi(b, ... )
* a = x
* b = 234;
* if a>0 goto L0: // a, b both live here
* ...
* </pre>
*
* insert x = b is ok now
*
* <pre>
* L0:
* // x = phi(b, ... )
* a = x
* b = 234;
* x = b
* if a>0 goto L0: // a, b both live here
* ...
* </pre>
*
* @param phiLabels
*/
private void fixPhi(IrMethod method, Collection<LabelStmt> phiLabels) {
for (LabelStmt labelStmt : phiLabels) {
List<AssignStmt> phis = (List<AssignStmt>) labelStmt.phis;
for (AssignStmt phi : phis) {
Local a = (Local) phi.getOp1();
PhiExpr b = (PhiExpr) phi.getOp2();
boolean introduceNewLocal = false;
RegAssign aReg = (RegAssign) a.tag;
for (Value op : b.getOps()) {
RegAssign bReg = (RegAssign) ((Local) op).tag;
if (aReg.excludes.contains(bReg)) {
introduceNewLocal = true;
break;
}
}
if (introduceNewLocal) {
Local newLocal = (Local) a.clone();
if (DEBUG) {
newLocal.debugName = "x" + method.locals.size();
}
phi.op1 = newLocal;
RegAssign newRegAssign = new RegAssign();
newLocal.tag = newRegAssign;
method.locals.add(newLocal);
Stmt newAssigStmt = Stmts.nAssign(a, newLocal);
Stmt next = labelStmt.getNext();
if (next != null && next.st == ST.IDENTITY && next.getOp2().vt == VT.EXCEPTION_REF) {
// it's a handler, insert after the exception ref
method.stmts.insertAfter(next, newAssigStmt);
} else {
method.stmts.insertAfter(labelStmt, newAssigStmt);
}
LiveV[] frame = (LiveV[]) labelStmt.frame;
if (DEBUG) {
LiveV[] copy = frame.clone();
LiveV n = new LiveV();
n.local = a;
n.used = true;
copy[a._ls_index] = new LiveV();
newAssigStmt.frame = copy;
}
LiveV thePhi = frame[a._ls_index];
thePhi.local = newLocal;
for (LiveV v : frame) {
if (v != null && v.used) {
RegAssign s = (RegAssign) v.local.tag;
s.excludes.add(newRegAssign);
newRegAssign.excludes.add(s);
}
}
}
}
}
}
Aggregations