Jode 1.90-CVS
Build Aug 6, 2004

net.sf.jode.obfuscator.modules
Class LocalOptimizer

java.lang.Object
  extended bynet.sf.jode.obfuscator.modules.LocalOptimizer
All Implemented Interfaces:
CodeTransformer, Opcodes

public class LocalOptimizer
extends java.lang.Object
implements Opcodes, CodeTransformer

This class takes some bytecode and tries to minimize the number of locals used. It will also remove unnecessary stores.
This class can only work on verified code. There should also be no dead code, since the verifier doesn't check that dead code behaves okay.
This is done in two phases. First we determine which locals are the same, and which locals have a overlapping life time. In the second phase we will then redistribute the locals with a coloring graph algorithm.
The idea for the first phase is: For each read we follow the instruction flow backward to find the corresponding writes. We can also merge with another control flow that has a different read, in this case we merge with that read, too.
The tricky part is the subroutine handling. We follow the local that is used in a ret and find the corresponding jsr target (there must be only one, if the verifier should accept this class). While we do this we remember in the info of the ret, which locals are used in that subroutine.
When we know the jsr target<->ret correlation, we promote from the nextByAddr of every jsr the locals that are accessed by the subroutine to the corresponding ret and the others to the jsr. Also we will promote all reads from the jsr targets to the jsr.
If you think this might be to complicated, keep in mind that jsr's are not only left by the ret instructions, but also "spontanously" (by not reading the return address again).


Field Summary
 
Fields inherited from interface net.sf.jode.bytecode.Opcodes
constants, newArrayTypes, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_breakpoint, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_impdep1, opc_impdep2, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, opcodeString
 
Constructor Summary
LocalOptimizer()
           
 
Method Summary
 void calcLocalInfo()
           
 void distributeLocals()
           
 void dumpLocals()
           
 void stripLocals()
           
 void transformCode(BasicBlocks bb)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

LocalOptimizer

public LocalOptimizer()
Method Detail

calcLocalInfo

public void calcLocalInfo()

stripLocals

public void stripLocals()

distributeLocals

public void distributeLocals()

dumpLocals

public void dumpLocals()

transformCode

public void transformCode(BasicBlocks bb)
Specified by:
transformCode in interface CodeTransformer

Jode 1.90-CVS
Build Aug 6, 2004

Copyright © 1998-2004 by Jochen Hoenicke.