diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java index f1d66aa32206c7ce8cab44f9734ee9c7f5c3020d..9bead4395cc3ebbd18b7ee3040b3b5a6b517305a 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java @@ -42,8 +42,8 @@ import java.util.Stack; import com.amd.aparapi.BranchSet.CompoundLogicalExpressionNode; import com.amd.aparapi.BranchSet.LogicalExpressionNode; import com.amd.aparapi.BranchSet.SimpleLogicalExpressionNode; -import com.amd.aparapi.ClassModel.ConstantPool.MethodEntry; import com.amd.aparapi.ClassModel.LocalVariableInfo; +import com.amd.aparapi.ClassModel.ConstantPool.MethodEntry; import com.amd.aparapi.InstructionSet.AccessArrayElement; import com.amd.aparapi.InstructionSet.AccessField; import com.amd.aparapi.InstructionSet.AccessInstanceField; diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java index 26a1d05c8a2d04d37c26fd34b12b47fb2f6ec815..41fc4ef07e9e897b20c9164f25353b701346b86d 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java @@ -499,8 +499,8 @@ class ClassModel{ } } if (inMethod) { - methodDescription = new MethodDescription(className, methodName, stringStack.toArray(new String[0])[0], - methodStack.toArray(new String[0])); + methodDescription = new MethodDescription(className, methodName, stringStack.toArray(new String[0])[0], methodStack + .toArray(new String[0])); } else { System.out.println("can't convert to a description"); } @@ -548,7 +548,8 @@ class ClassModel{ METHODHANDLE, //15 METHODTYPE, //16 UNUSED17, - INVOKEDYNAMIC//18 + INVOKEDYNAMIC + //18 }; enum Access { @@ -1903,7 +1904,7 @@ class ClassModel{ } } - class LocalVariableTypeTableEntry extends AttributePoolEntry{ + class LocalVariableTypeTableEntry extends AttributePoolEntry{ private byte[] bytes; LocalVariableTypeTableEntry(ByteReader _byteReader, int _nameIndex, int _length) { @@ -1920,7 +1921,6 @@ class ClassModel{ } } - class SourceFileEntry extends AttributePoolEntry{ private int sourceFileIndex; @@ -2386,6 +2386,10 @@ class ClassModel{ return (getAttributePool().codeEntry.codeEntryAttributePool.localVariableTableEntry); } + void setLocalVariableTableEntry(LocalVariableTableEntry _localVariableTableEntry) { + getAttributePool().codeEntry.codeEntryAttributePool.localVariableTableEntry = _localVariableTableEntry; + } + LocalVariableInfo getLocalVariable(int _pc, int _index) { return (getLocalVariableTableEntry().getVariable(_pc, _index)); } diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/Entrypoint.java b/com.amd.aparapi/src/java/com/amd/aparapi/Entrypoint.java index e9b7608a49a7bcc5e9f319d6283d2087077107c0..38bdbdf101588b961451ca1ddba493305812f5da 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/Entrypoint.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/Entrypoint.java @@ -346,8 +346,8 @@ class Entrypoint{ ArrayList<FieldEntry> structMemberSet = superCandidate.getStructMembers(); for (FieldEntry f : structMemberSet) { if (f.getNameAndTypeEntry().getNameUTF8Entry().getUTF8().equals(accessedFieldName) - && f.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8() - .equals(field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8())) { + && f.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8().equals( + field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8())) { if (logger.isLoggable(Level.FINE)) { logger.fine("Found match: " + accessedFieldName + " class: " + field.getClassEntry().getNameUTF8Entry().getUTF8() @@ -377,8 +377,8 @@ class Entrypoint{ ArrayList<FieldEntry> structMemberSet = memberClassModel.getStructMembers(); for (FieldEntry f : structMemberSet) { if (f.getNameAndTypeEntry().getNameUTF8Entry().getUTF8().equals(accessedFieldName) - && f.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8() - .equals(field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8())) { + && f.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8().equals( + field.getNameAndTypeEntry().getDescriptorUTF8Entry().getUTF8())) { found = true; } } @@ -467,8 +467,8 @@ class Entrypoint{ // Look for a intra-object call in a object member if (m == null) { for (ClassModel c : allFieldsClasses.values()) { - if (c.getClassWeAreModelling().getName() - .equals(methodEntry.getClassEntry().getNameUTF8Entry().getUTF8().replace('/', '.'))) { + if (c.getClassWeAreModelling().getName().equals( + methodEntry.getClassEntry().getNameUTF8Entry().getUTF8().replace('/', '.'))) { m = c.getMethod(methodEntry, (methodCall instanceof I_INVOKESPECIAL) ? true : false); assert m != null; break; diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java b/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java index 79a39e4f8db6bbfbcd584e9adb5165456cc8e133..7322f52203373ea27cff1a58cca4cf2a14769799 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java @@ -758,7 +758,8 @@ class ExpressionList{ LocalVariableTableEntry<LocalVariableInfo> localVariableTable = methodModel.getMethod().getLocalVariableTableEntry(); int startPc = Short.MAX_VALUE; if (Config.enableAllowMissingLocalVariableTable && localVariableTable == null) { - logger.warning("class does not contain a LocalVariableTable - but enableAllowMissingLocalVariableTable is set so we are ignoring"); + logger + .warning("class does not contain a LocalVariableTable - but enableAllowMissingLocalVariableTable is set so we are ignoring"); } else { for (LocalVariableInfo localVariableInfo : localVariableTable) { diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java b/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java index a9777fa033ae49b47d32989e270febc577a5cdcc..270df2647e112b026f86722e17098c07d8571085 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java @@ -41,14 +41,34 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import com.amd.aparapi.ClassModel.ConstantPool; +import com.amd.aparapi.ClassModel.LocalVariableInfo; +import com.amd.aparapi.ClassModel.LocalVariableTableEntry; import com.amd.aparapi.ClassModel.ConstantPool.Entry; import com.amd.aparapi.ClassModel.ConstantPool.FieldEntry; import com.amd.aparapi.ClassModel.ConstantPool.MethodEntry; -import com.amd.aparapi.ClassModel.LocalVariableInfo; -import com.amd.aparapi.ClassModel.LocalVariableTableEntry; class InstructionSet{ + static enum LoadSpec { + NONE, // + F, // Float + D, // Double + I, // Integer + L, // Long + A, // Array + O, // Object + } + + static enum StoreSpec { + NONE, // + F, // Float + D, // Double + I, // Integer + L, // Long + A, // Array + O, // Object + } + static enum TypeSpec { NONE("none", "none", 0, 0), // Z("Z", "boolean", 4, 1), // Note 'Z' is the java code for 'boolean' type @@ -314,7 +334,7 @@ class InstructionSet{ static enum ByteCode { // name, operation type, immediateOperands, pop operands, push operands - NOP(null, ImmediateSpec.NONE, PopSpec.NONE, PushSpec.NONE, Operator.NONE), // + NOP(null, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, PopSpec.NONE, PushSpec.NONE, Operator.NONE), // ACONST_NULL(I_ACONST_NULL.class, PushSpec.N), // ICONST_M1(I_ICONST_M1.class, PushSpec.I), // ICONST_0(I_ICONST_0.class, PushSpec.I), // @@ -335,31 +355,31 @@ class InstructionSet{ LDC(I_LDC.class, ImmediateSpec.Bcpci, PushSpec.IorForS), // LDC_W(I_LDC_W.class, ImmediateSpec.Scpci, PushSpec.IorForS), // LDC2_W(I_LDC2_W.class, ImmediateSpec.Scpci, PushSpec.LorD), // - ILOAD(I_ILOAD.class, ImmediateSpec.Blvti, PushSpec.I), // - LLOAD(I_LLOAD.class, ImmediateSpec.Blvti, PushSpec.L), // - FLOAD(I_FLOAD.class, ImmediateSpec.Blvti, PushSpec.F), // - DLOAD(I_DLOAD.class, ImmediateSpec.Blvti, PushSpec.D), // - ALOAD(I_ALOAD.class, ImmediateSpec.Blvti, PushSpec.O), // - ILOAD_0(I_ILOAD_0.class, PushSpec.I), // - ILOAD_1(I_ILOAD_1.class, PushSpec.I), // - ILOAD_2(I_ILOAD_2.class, PushSpec.I), // - ILOAD_3(I_ILOAD_3.class, PushSpec.I), // - LLOAD_0(I_LLOAD_0.class, PushSpec.L), // - LLOAD_1(I_LLOAD_1.class, PushSpec.L), // - LLOAD_2(I_LLOAD_2.class, PushSpec.L), // - LLOAD_3(I_LLOAD_3.class, PushSpec.L), // - FLOAD_0(I_FLOAD_0.class, PushSpec.F), // - FLOAD_1(I_FLOAD_1.class, PushSpec.F), // - FLOAD_2(I_FLOAD_2.class, PushSpec.F), // - FLOAD_3(I_FLOAD_3.class, PushSpec.F), // - DLOAD_0(I_DLOAD_0.class, PushSpec.D), // - DLOAD_1(I_DLOAD_1.class, PushSpec.D), // - DLOAD_2(I_DLOAD_2.class, PushSpec.D), // - DLOAD_3(I_DLOAD_3.class, PushSpec.D), // - ALOAD_0(I_ALOAD_0.class, PushSpec.O), // - ALOAD_1(I_ALOAD_1.class, PushSpec.O), // - ALOAD_2(I_ALOAD_2.class, PushSpec.O), // - ALOAD_3(I_ALOAD_3.class, PushSpec.O), // + ILOAD(I_ILOAD.class, LoadSpec.I, ImmediateSpec.Blvti, PushSpec.I), // + LLOAD(I_LLOAD.class, LoadSpec.L, ImmediateSpec.Blvti, PushSpec.L), // + FLOAD(I_FLOAD.class, LoadSpec.F, ImmediateSpec.Blvti, PushSpec.F), // + DLOAD(I_DLOAD.class, LoadSpec.F, ImmediateSpec.Blvti, PushSpec.D), // + ALOAD(I_ALOAD.class, LoadSpec.A, ImmediateSpec.Blvti, PushSpec.O), // + ILOAD_0(I_ILOAD_0.class, LoadSpec.I, PushSpec.I), // + ILOAD_1(I_ILOAD_1.class, LoadSpec.I, PushSpec.I), // + ILOAD_2(I_ILOAD_2.class, LoadSpec.I, PushSpec.I), // + ILOAD_3(I_ILOAD_3.class, LoadSpec.I, PushSpec.I), // + LLOAD_0(I_LLOAD_0.class, LoadSpec.L, PushSpec.L), // + LLOAD_1(I_LLOAD_1.class, LoadSpec.L, PushSpec.L), // + LLOAD_2(I_LLOAD_2.class, LoadSpec.L, PushSpec.L), // + LLOAD_3(I_LLOAD_3.class, LoadSpec.L, PushSpec.L), // + FLOAD_0(I_FLOAD_0.class, LoadSpec.F, PushSpec.F), // + FLOAD_1(I_FLOAD_1.class, LoadSpec.F, PushSpec.F), // + FLOAD_2(I_FLOAD_2.class, LoadSpec.F, PushSpec.F), // + FLOAD_3(I_FLOAD_3.class, LoadSpec.F, PushSpec.F), // + DLOAD_0(I_DLOAD_0.class, LoadSpec.D, PushSpec.D), // + DLOAD_1(I_DLOAD_1.class, LoadSpec.D, PushSpec.D), // + DLOAD_2(I_DLOAD_2.class, LoadSpec.D, PushSpec.D), // + DLOAD_3(I_DLOAD_3.class, LoadSpec.D, PushSpec.D), // + ALOAD_0(I_ALOAD_0.class, LoadSpec.A, PushSpec.O), // + ALOAD_1(I_ALOAD_1.class, LoadSpec.A, PushSpec.O), // + ALOAD_2(I_ALOAD_2.class, LoadSpec.A, PushSpec.O), // + ALOAD_3(I_ALOAD_3.class, LoadSpec.A, PushSpec.O), // IALOAD(I_IALOAD.class, PopSpec.AI, PushSpec.I), // LALOAD(I_LALOAD.class, PopSpec.AI, PushSpec.L), // FALOAD(I_FALOAD.class, PopSpec.AI, PushSpec.F), // @@ -368,31 +388,31 @@ class InstructionSet{ BALOAD(I_BALOAD.class, PopSpec.AI, PushSpec.I), // CALOAD(I_CALOAD.class, PopSpec.AI, PushSpec.I), // SALOAD(I_SALOAD.class, PopSpec.AI, PushSpec.I), // - ISTORE(I_ISTORE.class, ImmediateSpec.Blvti, PopSpec.I), // - LSTORE(I_LSTORE.class, ImmediateSpec.Blvti, PopSpec.L), // - FSTORE(I_FSTORE.class, ImmediateSpec.Blvti, PopSpec.F), // - DSTORE(I_DSTORE.class, ImmediateSpec.Blvti, PopSpec.D), // - ASTORE(I_ASTORE.class, ImmediateSpec.Blvti, PopSpec.O), // - ISTORE_0(I_ISTORE_0.class, PopSpec.I), // - ISTORE_1(I_ISTORE_1.class, PopSpec.I), // - ISTORE_2(I_ISTORE_2.class, PopSpec.I), // - ISTORE_3(I_ISTORE_3.class, PopSpec.I), // - LSTORE_0(I_LSTORE_0.class, PopSpec.L), // - LSTORE_1(I_LSTORE_1.class, PopSpec.L), // - LSTORE_2(I_LSTORE_2.class, PopSpec.L), // - LSTORE_3(I_LSTORE_3.class, PopSpec.L), // - FSTORE_0(I_FSTORE_0.class, PopSpec.F), // - FSTORE_1(I_FSTORE_1.class, PopSpec.F), // - FSTORE_2(I_FSTORE_2.class, PopSpec.F), // - FSTORE_3(I_FSTORE_3.class, PopSpec.F), // - DSTORE_0(I_DSTORE_0.class, PopSpec.D), // - DSTORE_1(I_DSTORE_1.class, PopSpec.D), // - DSTORE_2(I_DSTORE_2.class, PopSpec.D), // - DSTORE_3(I_DSTORE_3.class, PopSpec.D), // - ASTORE_0(I_ASTORE_0.class, PopSpec.O), // - ASTORE_1(I_ASTORE_1.class, PopSpec.O), // - ASTORE_2(I_ASTORE_2.class, PopSpec.O), // - ASTORE_3(I_ASTORE_3.class, PopSpec.O), // + ISTORE(I_ISTORE.class, StoreSpec.I, ImmediateSpec.Blvti, PopSpec.I), // + LSTORE(I_LSTORE.class, StoreSpec.L, ImmediateSpec.Blvti, PopSpec.L), // + FSTORE(I_FSTORE.class, StoreSpec.F, ImmediateSpec.Blvti, PopSpec.F), // + DSTORE(I_DSTORE.class, StoreSpec.D, ImmediateSpec.Blvti, PopSpec.D), // + ASTORE(I_ASTORE.class, StoreSpec.A, ImmediateSpec.Blvti, PopSpec.O), // + ISTORE_0(I_ISTORE_0.class, StoreSpec.I, PopSpec.I), // + ISTORE_1(I_ISTORE_1.class, StoreSpec.I, PopSpec.I), // + ISTORE_2(I_ISTORE_2.class, StoreSpec.I, PopSpec.I), // + ISTORE_3(I_ISTORE_3.class, StoreSpec.I, PopSpec.I), // + LSTORE_0(I_LSTORE_0.class, StoreSpec.L, PopSpec.L), // + LSTORE_1(I_LSTORE_1.class, StoreSpec.L, PopSpec.L), // + LSTORE_2(I_LSTORE_2.class, StoreSpec.L, PopSpec.L), // + LSTORE_3(I_LSTORE_3.class, StoreSpec.L, PopSpec.L), // + FSTORE_0(I_FSTORE_0.class, StoreSpec.F, PopSpec.F), // + FSTORE_1(I_FSTORE_1.class, StoreSpec.F, PopSpec.F), // + FSTORE_2(I_FSTORE_2.class, StoreSpec.F, PopSpec.F), // + FSTORE_3(I_FSTORE_3.class, StoreSpec.F, PopSpec.F), // + DSTORE_0(I_DSTORE_0.class, StoreSpec.D, PopSpec.D), // + DSTORE_1(I_DSTORE_1.class, StoreSpec.D, PopSpec.D), // + DSTORE_2(I_DSTORE_2.class, StoreSpec.D, PopSpec.D), // + DSTORE_3(I_DSTORE_3.class, StoreSpec.D, PopSpec.D), // + ASTORE_0(I_ASTORE_0.class, StoreSpec.A, PopSpec.O), // + ASTORE_1(I_ASTORE_1.class, StoreSpec.A, PopSpec.O), // + ASTORE_2(I_ASTORE_2.class, StoreSpec.A, PopSpec.O), // + ASTORE_3(I_ASTORE_3.class, StoreSpec.A, PopSpec.O), // IASTORE(I_IASTORE.class, PopSpec.AII), // LASTORE(I_LASTORE.class, PopSpec.AIL), // FASTORE(I_FASTORE.class, PopSpec.AIF), // @@ -492,28 +512,34 @@ class InstructionSet{ FRETURN(I_FRETURN.class, PopSpec.F), // DRETURN(I_DRETURN.class, PopSpec.D), // ARETURN(I_ARETURN.class, PopSpec.O), // - RETURN(I_RETURN.class, ImmediateSpec.NONE, PopSpec.NONE, PushSpec.NONE, Operator.NONE), // + RETURN(I_RETURN.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, PopSpec.NONE, PushSpec.NONE, Operator.NONE), // GETSTATIC(I_GETSTATIC.class, ImmediateSpec.Scpfi, PushSpec.UNKNOWN), // PUTSTATIC(I_PUTSTATIC.class, ImmediateSpec.Scpfi, PopSpec.UNKNOWN), // - GETFIELD(I_GETFIELD.class, ImmediateSpec.Scpfi, PopSpec.O, PushSpec.UNKNOWN, Operator.NONE), // + GETFIELD(I_GETFIELD.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Scpfi, PopSpec.O, PushSpec.UNKNOWN, Operator.NONE), // PUTFIELD(I_PUTFIELD.class, ImmediateSpec.Scpfi, PopSpec.OUNKNOWN), // - INVOKEVIRTUAL(I_INVOKEVIRTUAL.class, ImmediateSpec.Scpmi, PopSpec.OARGS, PushSpec.UNKNOWN, Operator.NONE), // - INVOKESPECIAL(I_INVOKESPECIAL.class, ImmediateSpec.Scpmi, PopSpec.OARGS, PushSpec.UNKNOWN, Operator.NONE), // - INVOKESTATIC(I_INVOKESTATIC.class, ImmediateSpec.Scpmi, PopSpec.ARGS, PushSpec.UNKNOWN, Operator.NONE), // - INVOKEINTERFACE(I_INVOKEINTERFACE.class, ImmediateSpec.ScpmiBB, PopSpec.OARGS, PushSpec.UNKNOWN, Operator.NONE), // - INVOKEDYNAMIC(I_INVOKEDYNAMIC.class, ImmediateSpec.ScpmiBB, PopSpec.OARGS, PushSpec.UNKNOWN, Operator.NONE), // + INVOKEVIRTUAL(I_INVOKEVIRTUAL.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Scpmi, PopSpec.OARGS, PushSpec.UNKNOWN, + Operator.NONE), // + INVOKESPECIAL(I_INVOKESPECIAL.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Scpmi, PopSpec.OARGS, PushSpec.UNKNOWN, + Operator.NONE), // + INVOKESTATIC(I_INVOKESTATIC.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Scpmi, PopSpec.ARGS, PushSpec.UNKNOWN, + Operator.NONE), // + INVOKEINTERFACE(I_INVOKEINTERFACE.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.ScpmiBB, PopSpec.OARGS, + PushSpec.UNKNOWN, Operator.NONE), // + INVOKEDYNAMIC(I_INVOKEDYNAMIC.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.ScpmiBB, PopSpec.OARGS, PushSpec.UNKNOWN, + Operator.NONE), // NEW(I_NEW.class, ImmediateSpec.Scpci, PushSpec.O), // - NEWARRAY(I_NEWARRAY.class, ImmediateSpec.Bconst, PopSpec.I, PushSpec.A, Operator.NONE), // - ANEWARRAY(I_ANEWARRAY.class, ImmediateSpec.Sconst, PopSpec.I, PushSpec.A, Operator.NONE), // 189 + NEWARRAY(I_NEWARRAY.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Bconst, PopSpec.I, PushSpec.A, Operator.NONE), // + ANEWARRAY(I_ANEWARRAY.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Sconst, PopSpec.I, PushSpec.A, Operator.NONE), // 189 ARRAYLENGTH(I_ARRAYLENGTH.class, PopSpec.A, PushSpec.I), // 190 ATHROW(I_ATHROW.class, PopSpec.O, PushSpec.O), // 191 - CHECKCAST(I_CHECKCAST.class, ImmediateSpec.Scpci, PopSpec.O, PushSpec.O, Operator.NONE), // 192 - INSTANCEOF(I_INSTANCEOF.class, ImmediateSpec.Scpci, PopSpec.O, PushSpec.I, Operator.NONE), // 193 + CHECKCAST(I_CHECKCAST.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Scpci, PopSpec.O, PushSpec.O, Operator.NONE), // 192 + INSTANCEOF(I_INSTANCEOF.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.Scpci, PopSpec.O, PushSpec.I, Operator.NONE), // 193 MONITORENTER(I_MONITORENTER.class, PopSpec.O), // 194 MONITOREXIT(I_MONITOREXIT.class, PopSpec.O), // 195 - WIDE(I_WIDE.class, ImmediateSpec.UNKNOWN, PopSpec.UNKNOWN, PushSpec.UNKNOWN, Operator.NONE), // 196 - MULTIANEWARRAY(I_MULTIANEWARRAY.class, ImmediateSpec.ScpciBdim, PopSpec.UNKNOWN, PushSpec.A, Operator.NONE), // 197 + WIDE(I_WIDE.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.UNKNOWN, PopSpec.UNKNOWN, PushSpec.UNKNOWN, Operator.NONE), // 196 + MULTIANEWARRAY(I_MULTIANEWARRAY.class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.ScpciBdim, PopSpec.UNKNOWN, PushSpec.A, + Operator.NONE), // 197 IFNULL(I_IFNULL.class, ImmediateSpec.Spc, PopSpec.O, Operator.EqualNULL), // 198 IFNONNULL(I_IFNONNULL.class, ImmediateSpec.Spc, PopSpec.O, Operator.NotEqualNULL), // 199 GOTO_W(I_GOTO_W.class, ImmediateSpec.Ipc), // 200 @@ -599,51 +625,71 @@ class InstructionSet{ private Operator operator; - private ByteCode(Class<?> _class, ImmediateSpec _immediate, PopSpec _pop, PushSpec _push, Operator _operator) { + private LoadSpec loadSpec; + + private StoreSpec storeSpec; + + private ByteCode(Class<?> _class, LoadSpec _loadSpec, StoreSpec _storeSpec, ImmediateSpec _immediate, PopSpec _pop, + PushSpec _push, Operator _operator) { clazz = _class; immediate = _immediate; push = _push; pop = _pop; operator = _operator; - - // clazz = ByteCode.class.forName("com.amd.javalabs.classparser.InstructionSet$I_"+getName().toUpperCase(), true, ByteCode.class.getClassLoader()); - + loadSpec = _loadSpec; + storeSpec = _storeSpec; } private ByteCode(Class<?> _class, ImmediateSpec _immediate) { - this(_class, _immediate, PopSpec.NONE, PushSpec.NONE, Operator.NONE); + this(_class, LoadSpec.NONE, StoreSpec.NONE, _immediate, PopSpec.NONE, PushSpec.NONE, Operator.NONE); } private ByteCode(Class<?> _class, PushSpec _push) { - this(_class, ImmediateSpec.NONE, PopSpec.NONE, _push, Operator.NONE); + this(_class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, PopSpec.NONE, _push, Operator.NONE); + } + + private ByteCode(Class<?> _class, StoreSpec _store, ImmediateSpec _immediate, PopSpec _pop) { + this(_class, LoadSpec.NONE, _store, _immediate, _pop, PushSpec.NONE, Operator.NONE); + } + + private ByteCode(Class<?> _class, StoreSpec _store, PopSpec _pop) { + this(_class, LoadSpec.NONE, _store, ImmediateSpec.NONE, _pop, PushSpec.NONE, Operator.NONE); } private ByteCode(Class<?> _class, ImmediateSpec _immediate, PopSpec _pop) { - this(_class, _immediate, _pop, PushSpec.NONE, Operator.NONE); + this(_class, LoadSpec.NONE, StoreSpec.NONE, _immediate, _pop, PushSpec.NONE, Operator.NONE); } private ByteCode(Class<?> _class, ImmediateSpec _immediate, PopSpec _pop, Operator _operator) { - this(_class, _immediate, _pop, PushSpec.NONE, _operator); + this(_class, LoadSpec.NONE, StoreSpec.NONE, _immediate, _pop, PushSpec.NONE, _operator); + } + + private ByteCode(Class<?> _class, LoadSpec _load, ImmediateSpec _immediate, PushSpec _push) { + this(_class, _load, StoreSpec.NONE, _immediate, PopSpec.NONE, _push, Operator.NONE); + } + + private ByteCode(Class<?> _class, LoadSpec _load, PushSpec _push) { + this(_class, _load, StoreSpec.NONE, ImmediateSpec.NONE, PopSpec.NONE, _push, Operator.NONE); } private ByteCode(Class<?> _class, ImmediateSpec _immediate, PushSpec _push) { - this(_class, _immediate, PopSpec.NONE, _push, Operator.NONE); + this(_class, LoadSpec.NONE, StoreSpec.NONE, _immediate, PopSpec.NONE, _push, Operator.NONE); } private ByteCode(Class<?> _class, PopSpec _pop, PushSpec _push) { - this(_class, ImmediateSpec.NONE, _pop, _push, Operator.NONE); + this(_class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, _pop, _push, Operator.NONE); } private ByteCode(Class<?> _class, PopSpec _pop, PushSpec _push, Operator _operator) { - this(_class, ImmediateSpec.NONE, _pop, _push, _operator); + this(_class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, _pop, _push, _operator); } private ByteCode(Class<?> _class, PopSpec _pop) { - this(_class, ImmediateSpec.NONE, _pop, PushSpec.NONE, Operator.NONE); + this(_class, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, _pop, PushSpec.NONE, Operator.NONE); } private ByteCode() { - this(null, ImmediateSpec.NONE, PopSpec.NONE, PushSpec.NONE, Operator.NONE); + this(null, LoadSpec.NONE, StoreSpec.NONE, ImmediateSpec.NONE, PopSpec.NONE, PushSpec.NONE, Operator.NONE); } int getCode() { @@ -731,6 +777,14 @@ class InstructionSet{ Operator getOperator() { return (operator); } + + public LoadSpec getLoad() { + return (loadSpec); + } + + public StoreSpec getStore() { + return (storeSpec); + } } static class CompositeInstruction extends Instruction{ diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/InstructionViewer.java b/com.amd.aparapi/src/java/com/amd/aparapi/InstructionViewer.java index ed9d7b8bf7e96b2275f1b33852da24c3b2a7c295..0f1dd65514238bd6f361a5fc305926bc91b96e3a 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/InstructionViewer.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/InstructionViewer.java @@ -219,8 +219,8 @@ public class InstructionViewer implements Config.InstructionListener{ panel.add(newComponent); layout.putConstraint(SpringLayout.NORTH, newComponent, INSET, (last == panel) ? SpringLayout.NORTH : SpringLayout.SOUTH, last); - layout.putConstraint(SpringLayout.WEST, newComponent, INSET, SpringLayout.EAST, - fieldToLabelMap.get(fieldWithWidestLabel)); + layout.putConstraint(SpringLayout.WEST, newComponent, INSET, SpringLayout.EAST, fieldToLabelMap + .get(fieldWithWidestLabel)); layout.putConstraint(SpringLayout.EAST, newComponent, INSET, SpringLayout.EAST, panel); } last = newComponent; diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/KernelWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/KernelWriter.java index ef9146b62da9fce379f252e658939f72ee1d763e..1abf219bfddd9c356d84740938e88b9bfbcc4194 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/KernelWriter.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/KernelWriter.java @@ -43,13 +43,13 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import com.amd.aparapi.ClassModel.ClassModelField; +import com.amd.aparapi.ClassModel.LocalVariableInfo; +import com.amd.aparapi.ClassModel.LocalVariableTableEntry; import com.amd.aparapi.ClassModel.AttributePool.RuntimeAnnotationsEntry; import com.amd.aparapi.ClassModel.AttributePool.RuntimeAnnotationsEntry.AnnotationInfo; -import com.amd.aparapi.ClassModel.ClassModelField; import com.amd.aparapi.ClassModel.ConstantPool.FieldEntry; import com.amd.aparapi.ClassModel.ConstantPool.MethodEntry; -import com.amd.aparapi.ClassModel.LocalVariableInfo; -import com.amd.aparapi.ClassModel.LocalVariableTableEntry; import com.amd.aparapi.InstructionSet.AccessArrayElement; import com.amd.aparapi.InstructionSet.AssignToArrayElement; import com.amd.aparapi.InstructionSet.AssignToField; diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java index a3948c075b560fbe685cc0d4e602ab02fcab55e1..b976eda8d3418a3ed7a671afb91e5678bf65b27a 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java @@ -44,18 +44,19 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import com.amd.aparapi.ClassModel.ClassModelMethod; import com.amd.aparapi.ClassModel.ConstantPool; +import com.amd.aparapi.ClassModel.LocalVariableInfo; +import com.amd.aparapi.ClassModel.LocalVariableTableEntry; +import com.amd.aparapi.ClassModel.AttributePool.CodeEntry; import com.amd.aparapi.ClassModel.ConstantPool.FieldEntry; import com.amd.aparapi.ClassModel.ConstantPool.MethodReferenceEntry; import com.amd.aparapi.ClassModel.ConstantPool.MethodReferenceEntry.Arg; -import com.amd.aparapi.ClassModel.LocalVariableInfo; -import com.amd.aparapi.ClassModel.LocalVariableTableEntry; import com.amd.aparapi.InstructionPattern.InstructionMatch; import com.amd.aparapi.InstructionSet.AccessArrayElement; import com.amd.aparapi.InstructionSet.AccessField; @@ -92,10 +93,12 @@ import com.amd.aparapi.InstructionSet.I_PUTSTATIC; import com.amd.aparapi.InstructionSet.I_TABLESWITCH; import com.amd.aparapi.InstructionSet.IncrementInstruction; import com.amd.aparapi.InstructionSet.InlineAssignInstruction; +import com.amd.aparapi.InstructionSet.LoadSpec; import com.amd.aparapi.InstructionSet.MethodCall; import com.amd.aparapi.InstructionSet.MultiAssignInstruction; import com.amd.aparapi.InstructionSet.New; import com.amd.aparapi.InstructionSet.Return; +import com.amd.aparapi.InstructionSet.StoreSpec; class MethodModel{ static Logger logger = Logger.getLogger(Config.getLoggerName()); @@ -1452,6 +1455,164 @@ class MethodModel{ init(_method); } + public static class FakeLocalVariableTableEntry implements LocalVariableTableEntry<LocalVariableInfo>{ + + public static class FakeLocalVariableInfo implements LocalVariableInfo{ + + @Override public int getEnd() { + // TODO Auto-generated method stub + return 0; + } + + @Override public int getStart() { + // TODO Auto-generated method stub + return 0; + } + + @Override public String getVariableDescriptor() { + // TODO Auto-generated method stub + return null; + } + + @Override public int getVariableIndex() { + // TODO Auto-generated method stub + return 0; + } + + @Override public String getVariableName() { + // TODO Auto-generated method stub + return null; + } + + @Override public boolean isArray() { + // TODO Auto-generated method stub + return false; + } + + } + + List<LocalVariableInfo> list = new ArrayList<LocalVariableInfo>(); + + public static class SlotTable{ + Slot[] slots; + + public SlotTable(int _numberOfSlots, int _size) { + slots = new Slot[_numberOfSlots]; + for (int i = 0; i < _numberOfSlots; i++) { + slots[i] = new Slot(_size); + } + } + + public static class Slot{ + public Slot(int _size) { + entries = new Entry[_size]; + for (int i = 0; i < _size; i++) { + entries[i] = new Entry(i); + } + } + + int number; + + public static class Entry{ + int slotNumber; + + public Entry(int _slotNumber) { + slotNumber = _slotNumber; + } + + LoadSpec loadSpec = LoadSpec.NONE; + + StoreSpec storeSpec = StoreSpec.NONE; + + public String toString() { + if (loadSpec == LoadSpec.NONE && storeSpec == StoreSpec.NONE) { + return (" "); + } else if (loadSpec != LoadSpec.NONE) { + return ("L" + loadSpec); + } else { + return ("S" + storeSpec); + } + } + } + + Entry[] entries; + + public Entry getEntry(int _row) { + return entries[_row]; + } + + public void setLoad(int pc, LoadSpec _loadSpec) { + entries[pc].loadSpec = _loadSpec; + + } + + public void setStore(int pc, StoreSpec _storeSpec) { + entries[pc].storeSpec = _storeSpec; + + } + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int row = 0; row < slots[0].entries.length; row++) { + for (Slot slot : slots) { + sb.append(slot.getEntry(row) + "|"); + } + sb.append("\n"); + } + + return (sb.toString()); + + } + + public void setLoad(int slot, int pc, LoadSpec _loadSpec) { + slots[slot].setLoad(pc, _loadSpec); + + } + + public void setStore(int slot, int pc, StoreSpec _storeSpec) { + slots[slot].setStore(pc, _storeSpec); + + } + } + + public FakeLocalVariableTableEntry(Map<Integer, Instruction> _pcMap, CodeEntry _codeEntry) { + int numberOfSlots = _codeEntry.getMaxLocals(); + // System.out.println("slots= " + numberOfSlots); + SlotTable slotTable = new SlotTable(numberOfSlots, _pcMap.size()); + // System.out.println(slotTable); + for (Entry<Integer, Instruction> entry : _pcMap.entrySet()) { + int pc = entry.getKey(); + Instruction instruction = entry.getValue(); + LoadSpec loadSpec = instruction.getByteCode().getLoad(); + StoreSpec storeSpec = instruction.getByteCode().getStore(); + if (loadSpec != LoadSpec.NONE) { + slotTable.setLoad(((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex(), pc, + loadSpec); + + } + if (storeSpec != StoreSpec.NONE) { + slotTable.setStore(((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex(), pc, + storeSpec); + } + + // System.out.println(" Instruction " + entry.getValue()); + } + // System.out.println(slotTable); + + } + + @Override public LocalVariableInfo getVariable(int pc, int index) { + // TODO Auto-generated method stub + return null; + } + + @Override public Iterator<LocalVariableInfo> iterator() { + return list.iterator(); + } + + } + private void init(ClassModelMethod _method) throws AparapiException { try { method = _method; @@ -1475,11 +1636,18 @@ class MethodModel{ LocalVariableTableEntry<LocalVariableInfo> localVariableTableEntry = method.getLocalVariableTableEntry(); if (Config.enableAllowMissingLocalVariableTable && localVariableTableEntry == null) { - logger.warning("class does not contain a LocalVariableTable - but enableAllowMissingLocalVariableTable is set so we are ignoring"); + logger + .warning("class does not contain a LocalVariableTable - but enableAllowMissingLocalVariableTable is set so we are ignoring"); } else { if (localVariableTableEntry == null) { - System.out.println("create local variable table"); - throw new ClassParseException(ClassParseException.TYPE.MISSINGLOCALVARIABLETABLE); + //System.out.println("create local variable table"); + localVariableTableEntry = new FakeLocalVariableTableEntry(pcMap, method.getCodeEntry()); + method.setLocalVariableTableEntry(localVariableTableEntry); + localVariableTableEntry = method.getLocalVariableTableEntry(); + if (localVariableTableEntry == null) { + System.out.println("damn!"); + } + //throw new ClassParseException(ClassParseException.TYPE.MISSINGLOCALVARIABLETABLE); } for (LocalVariableInfo localVariableInfo : localVariableTableEntry) { // TODO: What was the thinking here?