joeq.Compiler.Quad
Class BytecodeToQuad

java.lang.Object
  extended by joeq.Compiler.BytecodeAnalysis.BytecodeVisitor
      extended by joeq.Compiler.Quad.BytecodeToQuad
All Implemented Interfaces:
jq_ClassFileConstants, CompilationConstants

public class BytecodeToQuad
extends BytecodeVisitor

Converts stack-based Java bytecode to Quad intermediate format. This utilizes the ControlFlowGraph in the BytecodeAnalysis package to build up a control flow graph, then iterates over the graph to generate the Quad code.

Version:
$Id: BytecodeToQuad.java 2465 2006-06-07 23:03:17Z joewhaley $
Author:
John Whaley
See Also:
BytecodeVisitor, ControlFlowGraph

Nested Class Summary
 class BytecodeToQuad.AbstractState
          Class used to store the abstract state of the bytecode-to-quad converter.
static class BytecodeToQuad.jq_ReturnAddressType
           
 
Field Summary
static Utf8 address32
           
static Utf8 addressOf
           
static Utf8 align
           
static Utf8 alloca
           
static boolean ALWAYS_TRACE
           
static Utf8 asObject
           
static Utf8 asReferenceType
           
static Utf8 atomicAdd
           
static Utf8 atomicAnd
           
static Utf8 atomicCas4
           
static Utf8 atomicCas8
           
static Utf8 atomicSub
           
static Utf8 difference
           
static boolean ELIM_NULL_CHECKS
           
static Utf8 getBasePointer
           
static Utf8 getNull
           
static Utf8 getStackPointer
           
static Utf8 isNull
           
static Utf8 max
           
static Utf8 min
           
static Utf8 offset
           
static Utf8 peek
           
static Utf8 peek1
           
static Utf8 peek2
           
static Utf8 peek4
           
static Utf8 peek8
           
static Utf8 poke
           
static Utf8 poke1
           
static Utf8 poke2
           
static Utf8 poke4
           
static Utf8 poke8
           
static Utf8 size
           
static Utf8 stringRep
           
static Utf8 to32BitValue
           
 
Fields inherited from class joeq.Compiler.BytecodeAnalysis.BytecodeVisitor
bcs, BINOP_ADD, BINOP_AND, BINOP_DIV, BINOP_MUL, BINOP_OR, BINOP_REM, BINOP_SUB, BINOP_XOR, binopnames, clazz, CMP_AE, CMP_EQ, CMP_G, CMP_GE, CMP_GT, CMP_L, CMP_LE, CMP_LT, CMP_NE, CMP_UNCOND, cmpopnames, fcmpopnames, i_end, i_start, INVOKE_INTERFACE, INVOKE_SPECIAL, INVOKE_STATIC, INVOKE_VIRTUAL, invokeopnames, method, MONITOR_ENTER, MONITOR_EXIT, monitoropnames, out, SHIFT_LEFT, SHIFT_RIGHT, SHIFT_URIGHT, shiftopnames, state, TRACE, UNOP_NEG, unopnames
 
Fields inherited from interface joeq.Class.jq_ClassFileConstants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_Long, CONSTANT_MethodRef, CONSTANT_NameAndType, CONSTANT_ResolvedClass, CONSTANT_ResolvedIFieldRef, CONSTANT_ResolvedIMethodRef, CONSTANT_ResolvedSFieldRef, CONSTANT_ResolvedSMethodRef, CONSTANT_String, CONSTANT_Utf8, CONSUME_STACK, ILLEGAL_OPCODE, ILLEGAL_TYPE, jbc_AALOAD, jbc_AASTORE, jbc_ACONST_NULL, jbc_ALOAD, jbc_ALOAD_0, jbc_ALOAD_1, jbc_ALOAD_2, jbc_ALOAD_3, jbc_ANEWARRAY, jbc_ARETURN, jbc_ARRAYLENGTH, jbc_ASTORE, jbc_ASTORE_0, jbc_ASTORE_1, jbc_ASTORE_2, jbc_ASTORE_3, jbc_ATHROW, jbc_BALOAD, jbc_BASTORE, jbc_BIPUSH, jbc_BREAKPOINT, jbc_CALOAD, jbc_CASTORE, jbc_CHECKCAST, jbc_D2F, jbc_D2I, jbc_D2L, jbc_DADD, jbc_DALOAD, jbc_DASTORE, jbc_DCMPG, jbc_DCMPL, jbc_DCONST_0, jbc_DCONST_1, jbc_DDIV, jbc_DLOAD, jbc_DLOAD_0, jbc_DLOAD_1, jbc_DLOAD_2, jbc_DLOAD_3, jbc_DMUL, jbc_DNEG, jbc_DREM, jbc_DRETURN, jbc_DSTORE, jbc_DSTORE_0, jbc_DSTORE_1, jbc_DSTORE_2, jbc_DSTORE_3, jbc_DSUB, jbc_DUP, jbc_DUP_X1, jbc_DUP_X2, jbc_DUP2, jbc_DUP2_X1, jbc_DUP2_X2, jbc_F2D, jbc_F2I, jbc_F2L, jbc_FADD, jbc_FALOAD, jbc_FASTORE, jbc_FCMPG, jbc_FCMPL, jbc_FCONST_0, jbc_FCONST_1, jbc_FCONST_2, jbc_FDIV, jbc_FLOAD, jbc_FLOAD_0, jbc_FLOAD_1, jbc_FLOAD_2, jbc_FLOAD_3, jbc_FMUL, jbc_FNEG, jbc_FREM, jbc_FRETURN, jbc_FSTORE, jbc_FSTORE_0, jbc_FSTORE_1, jbc_FSTORE_2, jbc_FSTORE_3, jbc_FSUB, jbc_GETFIELD, jbc_GETSTATIC, jbc_GOTO, jbc_GOTO_W, jbc_I2B, jbc_I2C, jbc_I2D, jbc_I2F, jbc_I2L, jbc_I2S, jbc_IADD, jbc_IALOAD, jbc_IAND, jbc_IASTORE, jbc_ICONST_0, jbc_ICONST_1, jbc_ICONST_2, jbc_ICONST_3, jbc_ICONST_4, jbc_ICONST_5, jbc_ICONST_M1, jbc_IDIV, jbc_IF_ACMPEQ, jbc_IF_ACMPNE, jbc_IF_ICMPEQ, jbc_IF_ICMPGE, jbc_IF_ICMPGT, jbc_IF_ICMPLE, jbc_IF_ICMPLT, jbc_IF_ICMPNE, jbc_IFEQ, jbc_IFGE, jbc_IFGT, jbc_IFLE, jbc_IFLT, jbc_IFNE, jbc_IFNONNULL, jbc_IFNULL, jbc_IINC, jbc_ILOAD, jbc_ILOAD_0, jbc_ILOAD_1, jbc_ILOAD_2, jbc_ILOAD_3, jbc_IMUL, jbc_INEG, jbc_INSTANCEOF, jbc_INT2BYTE, jbc_INT2CHAR, jbc_INT2SHORT, jbc_INVOKEINTERFACE, jbc_INVOKENONVIRTUAL, jbc_INVOKESPECIAL, jbc_INVOKESTATIC, jbc_INVOKEVIRTUAL, jbc_IOR, jbc_IREM, jbc_IRETURN, jbc_ISHL, jbc_ISHR, jbc_ISTORE, jbc_ISTORE_0, jbc_ISTORE_1, jbc_ISTORE_2, jbc_ISTORE_3, jbc_ISUB, jbc_IUSHR, jbc_IXOR, jbc_JSR, jbc_JSR_W, jbc_L2D, jbc_L2F, jbc_L2I, jbc_LADD, jbc_LALOAD, jbc_LAND, jbc_LASTORE, jbc_LCMP, jbc_LCONST_0, jbc_LCONST_1, jbc_LDC, jbc_LDC_W, jbc_LDC2_W, jbc_LDIV, jbc_LLOAD, jbc_LLOAD_0, jbc_LLOAD_1, jbc_LLOAD_2, jbc_LLOAD_3, jbc_LMUL, jbc_LNEG, jbc_LOOKUPSWITCH, jbc_LOR, jbc_LREM, jbc_LRETURN, jbc_LSHL, jbc_LSHR, jbc_LSTORE, jbc_LSTORE_0, jbc_LSTORE_1, jbc_LSTORE_2, jbc_LSTORE_3, jbc_LSUB, jbc_LUSHR, jbc_LXOR, jbc_MONITORENTER, jbc_MONITOREXIT, jbc_MULTIANEWARRAY, jbc_NEW, jbc_NEWARRAY, jbc_NOP, jbc_POP, jbc_POP2, jbc_PUTFIELD, jbc_PUTSTATIC, jbc_RET, jbc_RETURN, jbc_SALOAD, jbc_SASTORE, jbc_SIPUSH, jbc_SWAP, jbc_TABLESWITCH, jbc_WIDE, NO_OF_OPERANDS, OPCODE_NAMES, PRODUCE_STACK, RESERVED, STATE_CLSINITERROR, STATE_CLSINITIALIZED, STATE_CLSINITIALIZING, STATE_CLSINITRUNNING, STATE_COMPILED, STATE_COMPILING, STATE_LOADED, STATE_LOADERROR, STATE_LOADING1, STATE_LOADING2, STATE_LOADING3, STATE_PREPARED, STATE_PREPAREERROR, STATE_PREPARING, STATE_SFINITERROR, STATE_SFINITIALIZED, STATE_SFINITIALIZING, STATE_UNLOADED, STATE_VERIFIED, STATE_VERIFYERROR, STATE_VERIFYING, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TC_ARRAY, TC_BOOLEAN, TC_BYTE, TC_CHAR, TC_CLASS, TC_CLASSEND, TC_DOUBLE, TC_FLOAT, TC_INT, TC_LONG, TC_PARAM, TC_PARAMEND, TC_SHORT, TC_VOID, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE
 
Fields inherited from interface joeq.Compiler.CompilationConstants
MAYBE, NO, YES
 
Constructor Summary
BytecodeToQuad(CompilationState state, jq_Method method)
          Initializes the conversion from bytecode to quad format for the given method.
BytecodeToQuad(jq_Method method)
          Initializes the conversion from bytecode to quad format for the given method.
 
Method Summary
 ControlFlowGraph convert()
          Perform conversion process from bytecode to quad.
 boolean isLocal(Operand op, int index, jq_Type type)
           
 String toString()
          Returns a string with the name of the pass and the method being converted.
 void traverseBB(BasicBlock bc_bb)
           
 void UNOPhelper(Operator.Unary operator, jq_Type tr, jq_Type t1)
           
 void visitAALOAD()
           
 void visitAASTORE()
           
 void visitACONST(Object s)
           
 void visitAGETFIELD(jq_InstanceField f)
           
 void visitAGETSTATIC(jq_StaticField f)
           
 void visitAINVOKE(byte op, jq_Method f)
           
 void visitALOAD(int i)
           
 void visitAPUTFIELD(jq_InstanceField f)
           
 void visitAPUTSTATIC(jq_StaticField f)
           
 void visitARETURN()
           
 void visitARRAYLENGTH()
           
 void visitASTORE(int i)
           
 void visitATHROW()
           
 void visitBALOAD()
           
 void visitBASTORE()
           
 void visitBGETFIELD(jq_InstanceField f)
           
 void visitBGETSTATIC(jq_StaticField f)
           
 void visitBPUTFIELD(jq_InstanceField f)
           
 void visitBPUTSTATIC(jq_StaticField f)
           
 void visitCALOAD()
           
 void visitCASTORE()
           
 void visitCGETFIELD(jq_InstanceField f)
           
 void visitCGETSTATIC(jq_StaticField f)
           
 void visitCHECKCAST(jq_Type f)
           
 void visitCPUTFIELD(jq_InstanceField f)
           
 void visitCPUTSTATIC(jq_StaticField f)
           
 void visitD2F()
           
 void visitD2I()
           
 void visitD2L()
           
 void visitDALOAD()
           
 void visitDASTORE()
           
 void visitDBINOP(byte op)
           
 void visitDCMP2(byte op)
           
 void visitDCONST(double c)
           
 void visitDGETFIELD(jq_InstanceField f)
           
 void visitDGETSTATIC(jq_StaticField f)
           
 void visitDINVOKE(byte op, jq_Method f)
           
 void visitDLOAD(int i)
           
 void visitDPUTFIELD(jq_InstanceField f)
           
 void visitDPUTSTATIC(jq_StaticField f)
           
 void visitDRETURN()
           
 void visitDSTORE(int i)
           
 void visitDUNOP(byte op)
           
 void visitDUP_x1()
           
 void visitDUP_x2()
           
 void visitDUP()
           
 void visitDUP2_x1()
           
 void visitDUP2_x2()
           
 void visitDUP2()
           
 void visitF2D()
           
 void visitF2I()
           
 void visitF2L()
           
 void visitFALOAD()
           
 void visitFASTORE()
           
 void visitFBINOP(byte op)
           
 void visitFCMP2(byte op)
           
 void visitFCONST(float c)
           
 void visitFGETFIELD(jq_InstanceField f)
           
 void visitFGETSTATIC(jq_StaticField f)
           
 void visitFINVOKE(byte op, jq_Method f)
           
 void visitFLOAD(int i)
           
 void visitFPUTFIELD(jq_InstanceField f)
           
 void visitFPUTSTATIC(jq_StaticField f)
           
 void visitFRETURN()
           
 void visitFSTORE(int i)
           
 void visitFUNOP(byte op)
           
 void visitGOTO(int target)
           
 void visitI2B()
           
 void visitI2C()
           
 void visitI2D()
           
 void visitI2F()
           
 void visitI2L()
           
 void visitI2S()
           
 void visitIALOAD()
           
 void visitIASTORE()
           
 void visitIBINOP(byte op)
           
 void visitICONST(int c)
           
 void visitIF(byte op, int target)
           
 void visitIFCMP(byte op, int target)
           
 void visitIFREF(byte op, int target)
           
 void visitIFREFCMP(byte op, int target)
           
 void visitIGETFIELD(jq_InstanceField f)
           
 void visitIGETSTATIC(jq_StaticField f)
           
 void visitIINC(int i, int v)
           
 void visitIINVOKE(byte op, jq_Method f)
           
 void visitILOAD(int i)
           
 void visitINSTANCEOF(jq_Type f)
           
 void visitIPUTFIELD(jq_InstanceField f)
           
 void visitIPUTSTATIC(jq_StaticField f)
           
 void visitIRETURN()
           
 void visitISHIFT(byte op)
           
 void visitISTORE(int i)
           
 void visitIUNOP(byte op)
           
 void visitJSR(int target)
           
 void visitL2D()
           
 void visitL2F()
           
 void visitL2I()
           
 void visitLALOAD()
           
 void visitLASTORE()
           
 void visitLBINOP(byte op)
           
 void visitLCMP2()
           
 void visitLCONST(long c)
           
 void visitLGETFIELD(jq_InstanceField f)
           
 void visitLGETSTATIC(jq_StaticField f)
           
 void visitLINVOKE(byte op, jq_Method f)
           
 void visitLLOAD(int i)
           
 void visitLOOKUPSWITCH(int default_target, int[] values, int[] targets)
           
 void visitLPUTFIELD(jq_InstanceField f)
           
 void visitLPUTSTATIC(jq_StaticField f)
           
 void visitLRETURN()
           
 void visitLSHIFT(byte op)
           
 void visitLSTORE(int i)
           
 void visitLUNOP(byte op)
           
 void visitMONITOR(byte op)
           
 void visitMULTINEWARRAY(jq_Type f, char dim)
           
 void visitNEW(jq_Type f)
           
 void visitNEWARRAY(jq_Array f)
           
 void visitNOP()
           
 void visitPOP()
           
 void visitPOP2()
           
 void visitRET(int i)
           
 void visitSALOAD()
           
 void visitSASTORE()
           
 void visitSGETFIELD(jq_InstanceField f)
           
 void visitSGETSTATIC(jq_StaticField f)
           
 void visitSPUTFIELD(jq_InstanceField f)
           
 void visitSPUTSTATIC(jq_StaticField f)
           
 void visitSWAP()
           
 void visitTABLESWITCH(int default_target, int low, int high, int[] targets)
           
 void visitVINVOKE(byte op, jq_Method f)
           
 void visitVRETURN()
           
 void visitZGETFIELD(jq_InstanceField f)
           
 void visitZGETSTATIC(jq_StaticField f)
           
 void visitZPUTFIELD(jq_InstanceField f)
           
 void visitZPUTSTATIC(jq_StaticField f)
           
 
Methods inherited from class joeq.Compiler.BytecodeAnalysis.BytecodeVisitor
forwardTraversal, tryResolve, tryResolve, tryResolve, tryResolve, tryResolve, updateCPIndex, updateMemberReference, visitBytecode, visitPEI
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

ALWAYS_TRACE

public static boolean ALWAYS_TRACE

peek

public static final Utf8 peek

peek1

public static final Utf8 peek1

peek2

public static final Utf8 peek2

peek4

public static final Utf8 peek4

peek8

public static final Utf8 peek8

poke

public static final Utf8 poke

poke1

public static final Utf8 poke1

poke2

public static final Utf8 poke2

poke4

public static final Utf8 poke4

poke8

public static final Utf8 poke8

offset

public static final Utf8 offset

align

public static final Utf8 align

difference

public static final Utf8 difference

isNull

public static final Utf8 isNull

addressOf

public static final Utf8 addressOf

address32

public static final Utf8 address32

asObject

public static final Utf8 asObject

asReferenceType

public static final Utf8 asReferenceType

to32BitValue

public static final Utf8 to32BitValue

stringRep

public static final Utf8 stringRep

getNull

public static final Utf8 getNull

size

public static final Utf8 size

getBasePointer

public static final Utf8 getBasePointer

getStackPointer

public static final Utf8 getStackPointer

alloca

public static final Utf8 alloca

atomicAdd

public static final Utf8 atomicAdd

atomicSub

public static final Utf8 atomicSub

atomicCas4

public static final Utf8 atomicCas4

atomicCas8

public static final Utf8 atomicCas8

atomicAnd

public static final Utf8 atomicAnd

min

public static final Utf8 min

max

public static final Utf8 max

ELIM_NULL_CHECKS

public static final boolean ELIM_NULL_CHECKS
See Also:
Constant Field Values
Constructor Detail

BytecodeToQuad

public BytecodeToQuad(jq_Method method)
Initializes the conversion from bytecode to quad format for the given method.

Parameters:
method - the method to convert.

BytecodeToQuad

public BytecodeToQuad(CompilationState state,
                      jq_Method method)
Initializes the conversion from bytecode to quad format for the given method.

Parameters:
method - the method to convert.
Method Detail

toString

public String toString()
Returns a string with the name of the pass and the method being converted.

Overrides:
toString in class Object
Returns:
a string with the name of the pass and the method being converted.

convert

public ControlFlowGraph convert()
Perform conversion process from bytecode to quad.

Returns:
the control flow graph of the resulting quad representation.

traverseBB

public void traverseBB(BasicBlock bc_bb)
Parameters:
bc_bb -

isLocal

public boolean isLocal(Operand op,
                       int index,
                       jq_Type type)

visitNOP

public void visitNOP()
Overrides:
visitNOP in class BytecodeVisitor

visitACONST

public void visitACONST(Object s)
Overrides:
visitACONST in class BytecodeVisitor

visitICONST

public void visitICONST(int c)
Overrides:
visitICONST in class BytecodeVisitor

visitLCONST

public void visitLCONST(long c)
Overrides:
visitLCONST in class BytecodeVisitor

visitFCONST

public void visitFCONST(float c)
Overrides:
visitFCONST in class BytecodeVisitor

visitDCONST

public void visitDCONST(double c)
Overrides:
visitDCONST in class BytecodeVisitor

visitILOAD

public void visitILOAD(int i)
Overrides:
visitILOAD in class BytecodeVisitor

visitLLOAD

public void visitLLOAD(int i)
Overrides:
visitLLOAD in class BytecodeVisitor

visitFLOAD

public void visitFLOAD(int i)
Overrides:
visitFLOAD in class BytecodeVisitor

visitDLOAD

public void visitDLOAD(int i)
Overrides:
visitDLOAD in class BytecodeVisitor

visitALOAD

public void visitALOAD(int i)
Overrides:
visitALOAD in class BytecodeVisitor

visitISTORE

public void visitISTORE(int i)
Overrides:
visitISTORE in class BytecodeVisitor

visitLSTORE

public void visitLSTORE(int i)
Overrides:
visitLSTORE in class BytecodeVisitor

visitFSTORE

public void visitFSTORE(int i)
Overrides:
visitFSTORE in class BytecodeVisitor

visitDSTORE

public void visitDSTORE(int i)
Overrides:
visitDSTORE in class BytecodeVisitor

visitASTORE

public void visitASTORE(int i)
Overrides:
visitASTORE in class BytecodeVisitor

visitIALOAD

public void visitIALOAD()
Overrides:
visitIALOAD in class BytecodeVisitor</