/**
   * Creates a new SSA basic block from a ROP form basic block.
   *
   * @param rmeth original method
   * @param basicBlockIndex index this block will have
   * @param parent method of this block predecessor set will be updated
   * @return new instance
   */
  public static SsaBasicBlock newFromRop(
      RopMethod rmeth, int basicBlockIndex, final SsaMethod parent) {
    BasicBlockList ropBlocks = rmeth.getBlocks();
    BasicBlock bb = ropBlocks.get(basicBlockIndex);
    SsaBasicBlock result = new SsaBasicBlock(basicBlockIndex, bb.getLabel(), parent);
    InsnList ropInsns = bb.getInsns();

    result.insns.ensureCapacity(ropInsns.size());

    for (int i = 0, sz = ropInsns.size(); i < sz; i++) {
      result.insns.add(new NormalSsaInsn(ropInsns.get(i), result));
    }

    result.predecessors =
        SsaMethod.bitSetFromLabelList(ropBlocks, rmeth.labelToPredecessors(bb.getLabel()));

    result.successors = SsaMethod.bitSetFromLabelList(ropBlocks, bb.getSuccessors());

    result.successorList = SsaMethod.indexListFromLabelList(ropBlocks, bb.getSuccessors());

    if (result.successorList.size() != 0) {
      int primarySuccessor = bb.getPrimarySuccessor();

      result.primarySuccessor =
          (primarySuccessor < 0) ? -1 : ropBlocks.indexOfLabel(primarySuccessor);
    }

    return result;
  }
Exemple #2
0
  /**
   * Does a registerizing dump.
   *
   * @param meth {@code non-null;} method data to dump
   */
  private void ropDump(ConcreteMethod meth) {
    TranslationAdvice advice = DexTranslationAdvice.THE_ONE;
    BytecodeArray code = meth.getCode();
    ByteArray bytes = code.getBytes();
    RopMethod rmeth = Ropper.convert(meth, advice);
    StringBuffer sb = new StringBuffer(2000);

    if (optimize) {
      boolean isStatic = AccessFlags.isStatic(meth.getAccessFlags());
      int paramWidth = computeParamWidth(meth, isStatic);
      rmeth = new Optimizer().optimize(rmeth, paramWidth, isStatic, true, advice);
    }

    BasicBlockList blocks = rmeth.getBlocks();
    int[] order = blocks.getLabelsInOrder();

    sb.append("first " + Hex.u2(rmeth.getFirstLabel()) + "\n");

    for (int label : order) {
      BasicBlock bb = blocks.get(blocks.indexOfLabel(label));
      sb.append("block ");
      sb.append(Hex.u2(label));
      sb.append("\n");

      IntList preds = rmeth.labelToPredecessors(label);
      int psz = preds.size();
      for (int i = 0; i < psz; i++) {
        sb.append("  pred ");
        sb.append(Hex.u2(preds.get(i)));
        sb.append("\n");
      }

      InsnList il = bb.getInsns();
      int ilsz = il.size();
      for (int i = 0; i < ilsz; i++) {
        Insn one = il.get(i);
        sb.append("  ");
        sb.append(il.get(i).toHuman());
        sb.append("\n");
      }

      IntList successors = bb.getSuccessors();
      int ssz = successors.size();
      if (ssz == 0) {
        sb.append("  returns\n");
      } else {
        int primary = bb.getPrimarySuccessor();
        for (int i = 0; i < ssz; i++) {
          int succ = successors.get(i);
          sb.append("  next ");
          sb.append(Hex.u2(succ));

          if ((ssz != 1) && (succ == primary)) {
            sb.append(" *");
          }

          sb.append("\n");
        }
      }
    }

    suppressDump = false;
    setAt(bytes, 0);
    parsed(bytes, 0, bytes.size(), sb.toString());
    suppressDump = true;
  }