Search in sources :

Example 6 with LabelStmt

use of com.googlecode.dex2jar.ir.stmt.LabelStmt in project dex2jar by pxb1988.

the class RemoveLocalFromSSA method simplePhi.

private boolean simplePhi(List<LabelStmt> phiLabels, Map<Local, Local> toReplace, Set<Value> set) {
    boolean changed = false;
    if (phiLabels != null) {
        for (Iterator<LabelStmt> itLabel = phiLabels.iterator(); itLabel.hasNext(); ) {
            LabelStmt labelStmt = itLabel.next();
            for (Iterator<AssignStmt> it = labelStmt.phis.iterator(); it.hasNext(); ) {
                AssignStmt phi = it.next();
                set.addAll(Arrays.asList(phi.getOp2().getOps()));
                set.remove(phi.getOp1());
                if (set.size() == 1) {
                    it.remove();
                    changed = true;
                    toReplace.put((Local) phi.getOp1(), (Local) set.iterator().next());
                }
                set.clear();
            }
            if (labelStmt.phis.size() == 0) {
                labelStmt.phis = null;
                itLabel.remove();
            }
        }
    }
    return changed;
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt)

Example 7 with LabelStmt

use of com.googlecode.dex2jar.ir.stmt.LabelStmt in project dex2jar by pxb1988.

the class RemoveLocalFromSSA method simpleAssign.

private boolean simpleAssign(List<LabelStmt> phiLabels, List<AssignStmt> assignStmtList, Map<Local, Local> toReplace, StmtList stmts) {
    Set<Value> usedInPhi = new HashSet<>();
    if (phiLabels != null) {
        for (LabelStmt labelStmt : phiLabels) {
            for (AssignStmt phi : labelStmt.phis) {
                usedInPhi.addAll(Arrays.asList(phi.getOp2().getOps()));
            }
        }
    }
    boolean changed = false;
    for (Iterator<AssignStmt> it = assignStmtList.iterator(); it.hasNext(); ) {
        AssignStmt as = it.next();
        if (!usedInPhi.contains(as.getOp1())) {
            it.remove();
            stmts.remove(as);
            toReplace.put((Local) as.getOp1(), (Local) as.getOp2());
            changed = true;
        }
    }
    return changed;
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) Value(com.googlecode.dex2jar.ir.expr.Value)

Example 8 with LabelStmt

use of com.googlecode.dex2jar.ir.stmt.LabelStmt in project dex2jar by pxb1988.

the class UnSSATransformer method insertAssignPath.

private void insertAssignPath(IrMethod method, Collection<LabelStmt> phiLabels) {
    // FIXME the phi in Exception handler is buggy
    List<AssignStmt> buff = new ArrayList<>();
    for (LabelStmt labelStmt : phiLabels) {
        List<AssignStmt> phis = (List<AssignStmt>) labelStmt.phis;
        LiveV[] frame = (LiveV[]) labelStmt.frame;
        for (Stmt from : labelStmt._cfg_froms) {
            if (from.visited) {
                // at lease it is reached by cfg
                for (AssignStmt phi : phis) {
                    Local a = (Local) phi.getOp1();
                    LiveV v = frame[a._ls_index];
                    Local local = v.stmt2regMap.get(from);
                    if (local != a) {
                        buff.add(Stmts.nAssign(a, local));
                    }
                }
                insertAssignPath(method.stmts, from, labelStmt, buff);
                buff.clear();
            }
        }
    }
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) ArrayList(java.util.ArrayList) Local(com.googlecode.dex2jar.ir.expr.Local) StmtList(com.googlecode.dex2jar.ir.stmt.StmtList) ArrayList(java.util.ArrayList) List(java.util.List) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) JumpStmt(com.googlecode.dex2jar.ir.stmt.JumpStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt)

Example 9 with LabelStmt

use of com.googlecode.dex2jar.ir.stmt.LabelStmt in project dex2jar by pxb1988.

the class ZeroTransformer method transformReportChanged.

@Override
public boolean transformReportChanged(IrMethod method) {
    boolean changed = false;
    List<AssignStmt> assignStmtList = new ArrayList<>();
    for (Stmt p = method.stmts.getFirst(); p != null; p = p.getNext()) {
        if (p.st == Stmt.ST.ASSIGN) {
            AssignStmt as = (AssignStmt) p;
            if (as.getOp1().vt == Value.VT.LOCAL && as.getOp2().vt == Value.VT.CONSTANT) {
                Constant cst = (Constant) as.getOp2();
                Object value = cst.value;
                if (value instanceof Number && !((value instanceof Long) || (value instanceof Double))) {
                    int v = ((Number) value).intValue();
                    if (v == 0 || v == 1) {
                        assignStmtList.add(as);
                    }
                }
            }
        }
    }
    if (assignStmtList.size() == 0) {
        return false;
    }
    List<LabelStmt> phiLabels = method.phiLabels;
    if (phiLabels != null) {
        for (AssignStmt as : assignStmtList) {
            Local local = (Local) as.getOp1();
            boolean first = true;
            for (LabelStmt labelStmt : phiLabels) {
                for (AssignStmt phi : labelStmt.phis) {
                    Value[] vs = phi.getOp2().getOps();
                    for (int i = 0; i < vs.length; i++) {
                        Value v = vs[i];
                        if (v == local) {
                            if (first) {
                                first = false;
                            } else {
                                Local nLocal = Exprs.nLocal(-1);
                                method.locals.add(nLocal);
                                changed = true;
                                method.stmts.insertBefore(as, Stmts.nAssign(nLocal, as.getOp2().clone()));
                                vs[i] = nLocal;
                            }
                        }
                    }
                }
            }
        }
    }
    return changed;
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) Constant(com.googlecode.dex2jar.ir.expr.Constant) ArrayList(java.util.ArrayList) Local(com.googlecode.dex2jar.ir.expr.Local) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt) Value(com.googlecode.dex2jar.ir.expr.Value)

Example 10 with LabelStmt

use of com.googlecode.dex2jar.ir.stmt.LabelStmt in project dex2jar by pxb1988.

the class UnSSATransformerTransformerTest method test04OneInPhi.

@Test
public void test04OneInPhi() {
    initMethod(true, "V");
    Local a = addLocal("a");
    Local b = addLocal("b");
    Local phi = addLocal("p");
    LabelStmt L1 = newLabel();
    Stmt s1 = addStmt(nAssign(a, nString("123")));
    Stmt j = addStmt(nIf(niGt(nInt(100), nInt(0)), L1));
    Stmt s2 = addStmt(nAssign(b, nString("456")));
    addStmt(L1);
    attachPhi(L1, nAssign(phi, nPhi(a)));
    addStmt(nReturn(phi));
    transform();
    Assert.assertTrue("p=a should inserted", j.getPre() != s1);
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) Local(com.googlecode.dex2jar.ir.expr.Local) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt) Test(org.junit.Test)

Aggregations

LabelStmt (com.googlecode.dex2jar.ir.stmt.LabelStmt)39 Local (com.googlecode.dex2jar.ir.expr.Local)26 Stmt (com.googlecode.dex2jar.ir.stmt.Stmt)22 AssignStmt (com.googlecode.dex2jar.ir.stmt.AssignStmt)17 Test (org.junit.Test)14 Value (com.googlecode.dex2jar.ir.expr.Value)8 ArrayList (java.util.ArrayList)7 Trap (com.googlecode.dex2jar.ir.Trap)4 JumpStmt (com.googlecode.dex2jar.ir.stmt.JumpStmt)4 StmtList (com.googlecode.dex2jar.ir.stmt.StmtList)4 List (java.util.List)3 StmtTraveler (com.googlecode.dex2jar.ir.StmtTraveler)2 PhiExpr (com.googlecode.dex2jar.ir.expr.PhiExpr)2 Cfg (com.googlecode.dex2jar.ir.ts.Cfg)2 HashSet (java.util.HashSet)2 IR2JConverter (com.googlecode.d2j.converter.IR2JConverter)1 DexFileNode (com.googlecode.d2j.node.DexFileNode)1 DexMethodNode (com.googlecode.d2j.node.DexMethodNode)1 IrMethod (com.googlecode.dex2jar.ir.IrMethod)1 LabelAndLocalMapper (com.googlecode.dex2jar.ir.LabelAndLocalMapper)1