Search in sources :

Example 1 with JAssignStmt

use of soot.jimple.internal.JAssignStmt in project soot by Sable.

the class MoveResultInstruction method jimplify.

@Override
public void jimplify(DexBody body) {
    // if (local != null && expr != null)
    // throw new RuntimeException("Both local and expr are set to move.");
    int dest = ((OneRegisterInstruction) instruction).getRegisterA();
    // if (local != null)
    // assign = Jimple.v().newAssignStmt(body.getRegisterLocal(dest), local);
    // else if (expr != null)
    // assign = Jimple.v().newAssignStmt(body.getRegisterLocal(dest), expr);
    // else
    // throw new RuntimeException("Neither local and expr are set to move.");
    AssignStmt assign = Jimple.v().newAssignStmt(body.getRegisterLocal(dest), body.getStoreResultLocal());
    setUnit(assign);
    addTags(assign);
    body.add(assign);
    if (IDalvikTyper.ENABLE_DVKTYPER) {
        JAssignStmt jassign = (JAssignStmt) assign;
        DalvikTyper.v().addConstraint(assign.getLeftOpBox(), assign.getRightOpBox());
    }
}
Also used : OneRegisterInstruction(org.jf.dexlib2.iface.instruction.OneRegisterInstruction) JAssignStmt(soot.jimple.internal.JAssignStmt) AssignStmt(soot.jimple.AssignStmt) JAssignStmt(soot.jimple.internal.JAssignStmt)

Example 2 with JAssignStmt

use of soot.jimple.internal.JAssignStmt in project soot by Sable.

the class CmpInstruction method jimplify.

@Override
public void jimplify(DexBody body) {
    if (!(instruction instanceof Instruction23x))
        throw new IllegalArgumentException("Expected Instruction23x but got: " + instruction.getClass());
    Instruction23x cmpInstr = (Instruction23x) instruction;
    int dest = cmpInstr.getRegisterA();
    Local first = body.getRegisterLocal(cmpInstr.getRegisterB());
    Local second = body.getRegisterLocal(cmpInstr.getRegisterC());
    // Expr cmpExpr;
    // Type type = null
    Opcode opcode = instruction.getOpcode();
    Expr cmpExpr = null;
    Type type = null;
    switch(opcode) {
        case CMPL_DOUBLE:
            setTag(new DoubleOpTag());
            type = DoubleType.v();
            cmpExpr = Jimple.v().newCmplExpr(first, second);
            break;
        case CMPL_FLOAT:
            setTag(new FloatOpTag());
            type = FloatType.v();
            cmpExpr = Jimple.v().newCmplExpr(first, second);
            break;
        case CMPG_DOUBLE:
            setTag(new DoubleOpTag());
            type = DoubleType.v();
            cmpExpr = Jimple.v().newCmpgExpr(first, second);
            break;
        case CMPG_FLOAT:
            setTag(new FloatOpTag());
            type = FloatType.v();
            cmpExpr = Jimple.v().newCmpgExpr(first, second);
            break;
        case CMP_LONG:
            setTag(new LongOpTag());
            type = LongType.v();
            cmpExpr = Jimple.v().newCmpExpr(first, second);
            break;
        default:
            throw new RuntimeException("no opcode for CMP: " + opcode);
    }
    AssignStmt assign = Jimple.v().newAssignStmt(body.getRegisterLocal(dest), cmpExpr);
    assign.addTag(getTag());
    setUnit(assign);
    addTags(assign);
    body.add(assign);
    if (IDalvikTyper.ENABLE_DVKTYPER) {
        getTag().getName();
        BinopExpr bexpr = (BinopExpr) cmpExpr;
        DalvikTyper.v().setType(bexpr.getOp1Box(), type, true);
        DalvikTyper.v().setType(bexpr.getOp2Box(), type, true);
        DalvikTyper.v().setType(((JAssignStmt) assign).leftBox, IntType.v(), false);
    }
}
Also used : JAssignStmt(soot.jimple.internal.JAssignStmt) AssignStmt(soot.jimple.AssignStmt) Local(soot.Local) Opcode(org.jf.dexlib2.Opcode) LongOpTag(soot.dexpler.tags.LongOpTag) FloatOpTag(soot.dexpler.tags.FloatOpTag) DoubleOpTag(soot.dexpler.tags.DoubleOpTag) DoubleType(soot.DoubleType) FloatType(soot.FloatType) IntType(soot.IntType) Type(soot.Type) LongType(soot.LongType) Expr(soot.jimple.Expr) BinopExpr(soot.jimple.BinopExpr) Instruction23x(org.jf.dexlib2.iface.instruction.formats.Instruction23x) BinopExpr(soot.jimple.BinopExpr)

Aggregations

AssignStmt (soot.jimple.AssignStmt)2 JAssignStmt (soot.jimple.internal.JAssignStmt)2 Opcode (org.jf.dexlib2.Opcode)1 OneRegisterInstruction (org.jf.dexlib2.iface.instruction.OneRegisterInstruction)1 Instruction23x (org.jf.dexlib2.iface.instruction.formats.Instruction23x)1 DoubleType (soot.DoubleType)1 FloatType (soot.FloatType)1 IntType (soot.IntType)1 Local (soot.Local)1 LongType (soot.LongType)1 Type (soot.Type)1 DoubleOpTag (soot.dexpler.tags.DoubleOpTag)1 FloatOpTag (soot.dexpler.tags.FloatOpTag)1 LongOpTag (soot.dexpler.tags.LongOpTag)1 BinopExpr (soot.jimple.BinopExpr)1 Expr (soot.jimple.Expr)1