Search in sources :

Example 51 with Expr

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

the class PoolLocalValueResolver method checkRecursive.

private void checkRecursive(Local l) {
    Set<Local> visited = new HashSet<>();
    Queue<Local> worklist = new LinkedList<>();
    worklist.add(l);
    while (!worklist.isEmpty()) {
        l = worklist.poll();
        AbstractCopyStmt copy = pool.defs.get(l);
        Set<Local> set = new HashSet<>();
        Expr rhs = copy.getExpression();
        if (rhs.getOpcode() == Opcode.LOCAL_LOAD) {
            set.add(((VarExpr) rhs).getLocal());
        } else if (rhs.getOpcode() == Opcode.PHI) {
            for (Expr e : ((PhiExpr) rhs).getArguments().values()) {
                set.add(((VarExpr) e).getLocal());
            }
        }
        for (Local v : set) {
            if (visited.contains(v)) {
                System.err.println(copy.getBlock().getGraph());
                System.err.printf("visited: %s%n", visited);
                System.err.printf(" copy: %s%n", copy);
                System.err.printf("  dup: %s%n", v);
                throw new RuntimeException();
            }
        }
        worklist.addAll(set);
        visited.addAll(set);
    }
}
Also used : VarExpr(org.mapleir.ir.code.expr.VarExpr) Expr(org.mapleir.ir.code.Expr) PhiExpr(org.mapleir.ir.code.expr.PhiExpr) PhiExpr(org.mapleir.ir.code.expr.PhiExpr) Local(org.mapleir.ir.locals.Local) AbstractCopyStmt(org.mapleir.ir.code.stmt.copy.AbstractCopyStmt) VarExpr(org.mapleir.ir.code.expr.VarExpr) LinkedList(java.util.LinkedList) HashSet(java.util.HashSet)

Example 52 with Expr

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

the class DynamicInvocationExpr method copy.

@Override
public Expr copy() {
    Expr[] arguments = new Expr[args.length];
    for (int i = 0; i < arguments.length; i++) {
        arguments[i] = args[i].copy();
    }
    Object[] pargs = new Object[providerArgs.length];
    System.arraycopy(providerArgs, 0, pargs, 0, pargs.length);
    return new DynamicInvocationExpr(new Handle(provider.getTag(), provider.getOwner(), provider.getName(), provider.getDesc()), pargs, name, desc, arguments);
}
Also used : Expr(org.mapleir.ir.code.Expr) Handle(org.objectweb.asm.Handle)

Example 53 with Expr

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

the class NewArrayExpr method onChildUpdated.

@Override
public void onChildUpdated(int ptr) {
    if (ptr >= 0 && ptr < bounds.length) {
        Expr e;
        if (children[ptr] == null) {
            e = null;
        } else {
            e = read(ptr);
        }
        updateLength(ptr, e, true);
    }
}
Also used : Expr(org.mapleir.ir.code.Expr)

Example 54 with Expr

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

the class PhiExpr method equivalent.

@Override
public boolean equivalent(CodeUnit s) {
    if (s instanceof PhiExpr) {
        PhiExpr phi = (PhiExpr) s;
        Set<BasicBlock> sources = new HashSet<>();
        sources.addAll(arguments.keySet());
        sources.addAll(phi.arguments.keySet());
        if (sources.size() != arguments.size()) {
            return false;
        }
        for (BasicBlock b : sources) {
            Expr e1 = arguments.get(b);
            Expr e2 = phi.arguments.get(b);
            if (e1 == null || e2 == null) {
                return false;
            }
            if (!e1.equivalent(e2)) {
                return false;
            }
        }
        return true;
    }
    return false;
}
Also used : Expr(org.mapleir.ir.code.Expr) BasicBlock(org.mapleir.ir.cfg.BasicBlock) HashSet(java.util.HashSet)

Example 55 with Expr

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

the class InitialisedObjectExpr method onChildUpdated.

@Override
public void onChildUpdated(int ptr) {
    Expr argument = read(ptr);
    if (ptr < 0 || (ptr) >= args.length) {
        throw new ArrayIndexOutOfBoundsException();
    }
    args[ptr] = argument;
    overwrite(argument, ptr);
}
Also used : 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