Search in sources :

Example 81 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _jump_cmp.

protected void _jump_cmp(BasicBlock target, ComparisonType type) {
    save_stack(false);
    Expr right = pop();
    Expr left = pop();
    _jump_cmp(target, type, left, right);
}
Also used : InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 82 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _dup_x2.

protected void _dup_x2() {
    int baseHeight = currentStack.height();
    save_stack(false);
    if (currentStack.peek(1).getType().getSize() == 2) {
        // prestack: var2, var0 (height = 3)
        // poststack: var3, var1, var0
        // assignments: var0 = var2(initial)
        // assignments: var1 = var0(initial)
        // assignments: var3 = var2(initial)
        currentStack.assertHeights(DUP_X2_64_HEIGHTS);
        Expr var2 = pop();
        Expr var0 = pop();
        // var4 = var0(initial)
        Type var4Type = assign_stack(baseHeight + 1, var0);
        // var0 = var2(initial)
        Type var0Type = assign_stack(baseHeight - 3, var2);
        // var3 = var2(initial)
        Type var3Type = assign_stack(baseHeight + 0, var2);
        // var1 = var4 = var0(initial)
        Type var1Type = assign_stack(baseHeight - 2, load_stack(baseHeight + 1, var4Type));
        // push var0
        push(load_stack(baseHeight - 3, var0Type));
        // push var1
        push(load_stack(baseHeight - 2, var1Type));
        // push var3
        push(load_stack(baseHeight + 0, var3Type));
    } else {
        // prestack: var2, var1, var0 (height = 3)
        // poststack: var3, var2, var1, var0
        // assignments: var0 = var2(initial)
        // assignments: var1 = var0(initial)
        // assignments: var2 = var1(initial)
        // assignments: var3 = var2(initial)
        currentStack.assertHeights(DUP_X2_32_HEIGHTS);
        Expr var2 = pop();
        Expr var1 = pop();
        Expr var0 = pop();
        // var4 = var0(initial)
        Type var4Type = assign_stack(baseHeight + 1, var0);
        // var5 = var1(initial)
        Type var5Type = assign_stack(baseHeight + 2, var1);
        // var0 = var2(initial)
        Type var0Type = assign_stack(baseHeight - 3, var2);
        // var3 = var2(initial)
        Type var3Type = assign_stack(baseHeight + 0, var2.copy());
        // var1 = var4 = var0(initial)
        Type var1Type = assign_stack(baseHeight - 2, load_stack(baseHeight + 1, var4Type));
        // var2 = var5 = var1(initial)
        Type var2Type = assign_stack(baseHeight - 1, load_stack(baseHeight + 2, var5Type));
        // push var0
        push(load_stack(baseHeight - 3, var0Type));
        // push var1
        push(load_stack(baseHeight - 2, var1Type));
        // push var2
        push(load_stack(baseHeight - 1, var2Type));
        // push var3
        push(load_stack(baseHeight + 0, var3Type));
    }
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 83 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _load_field.

protected void _load_field(int opcode, String owner, String name, String desc) {
    save_stack(false);
    if (opcode == GETFIELD || opcode == GETSTATIC) {
        Expr inst = null;
        if (opcode == GETFIELD) {
            inst = pop();
        }
        FieldLoadExpr fExpr = new FieldLoadExpr(inst, owner, name, desc);
        int index = currentStack.height();
        Type type = assign_stack(index, fExpr);
        push(load_stack(index, type));
    } else {
        throw new UnsupportedOperationException(Printer.OPCODES[opcode] + " " + owner + "." + name + "   " + desc);
    }
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 84 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _dynamic_call.

protected void _dynamic_call(Handle _bsm, Object[] _args, String name, String desc) {
    save_stack(false);
    Handle provider = new Handle(_bsm.getTag(), _bsm.getOwner(), _bsm.getName(), _bsm.getDesc());
    Object[] pArgs = new Object[_args.length];
    System.arraycopy(_args, 0, pArgs, 0, pArgs.length);
    // FIXME: can this end up as a virtual call
    Expr[] args = new Expr[Type.getArgumentTypes(desc).length];
    for (int i = args.length - 1; i >= 0; i--) {
        args[i] = pop();
    }
    DynamicInvocationExpr expr = new DynamicInvocationExpr(provider, pArgs, name, desc, args);
    if (expr.getType() == Type.VOID_TYPE) {
        addStmt(new PopStmt(expr));
    } else {
        int index = currentStack.height();
        Type type = assign_stack(index, expr);
        push(load_stack(index, type));
    }
// TODO: redo vm lambdas as static resolution calls/concrete calls.
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr) Handle(org.objectweb.asm.Handle)

Example 85 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _const.

protected void _const(Object o, Type type) {
    Expr e = new ConstantExpr(o, type, true);
    // int index = currentStack.height();
    // Type type = assign_stack(index, e);
    // push(load_stack(index, type));
    push(e);
}
Also used : InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Aggregations

Expr (org.mapleir.ir.code.Expr)87 VarExpr (org.mapleir.ir.code.expr.VarExpr)46 InvocationExpr (org.mapleir.ir.code.expr.invoke.InvocationExpr)45 BasicBlock (org.mapleir.ir.cfg.BasicBlock)32 PhiExpr (org.mapleir.ir.code.expr.PhiExpr)31 Stmt (org.mapleir.ir.code.Stmt)29 ConstantExpr (org.mapleir.ir.code.expr.ConstantExpr)26 AbstractCopyStmt (org.mapleir.ir.code.stmt.copy.AbstractCopyStmt)26 Local (org.mapleir.ir.locals.Local)22 Type (org.objectweb.asm.Type)21 VersionedLocal (org.mapleir.ir.locals.impl.VersionedLocal)20 CopyPhiStmt (org.mapleir.ir.code.stmt.copy.CopyPhiStmt)19 InitialisedObjectExpr (org.mapleir.ir.code.expr.invoke.InitialisedObjectExpr)17 ComparisonType (org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType)14 CopyVarStmt (org.mapleir.ir.code.stmt.copy.CopyVarStmt)14 ValueComparisonType (org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType)13 ArrayType (org.mapleir.ir.TypeUtils.ArrayType)12 HashSet (java.util.HashSet)11 ArithmeticExpr (org.mapleir.ir.code.expr.ArithmeticExpr)11 ControlFlowGraph (org.mapleir.ir.cfg.ControlFlowGraph)9