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 9bead4395cc3ebbd18b7ee3040b3b5a6b517305a..f1d66aa32206c7ce8cab44f9734ee9c7f5c3020d 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.LocalVariableInfo; import com.amd.aparapi.ClassModel.ConstantPool.MethodEntry; +import com.amd.aparapi.ClassModel.LocalVariableInfo; 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 41fc4ef07e9e897b20c9164f25353b701346b86d..ae756bffa81b7828b2255156e4b8c469af0042f0 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"); } 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 38bdbdf101588b961451ca1ddba493305812f5da..e9b7608a49a7bcc5e9f319d6283d2087077107c0 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 7322f52203373ea27cff1a58cca4cf2a14769799..79a39e4f8db6bbfbcd584e9adb5165456cc8e133 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java @@ -758,8 +758,7 @@ 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 270df2647e112b026f86722e17098c07d8571085..4ef003c2ad97c549d14a9e37c188523e363dd68d 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java @@ -41,11 +41,11 @@ 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{ 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 0f1dd65514238bd6f361a5fc305926bc91b96e3a..ed9d7b8bf7e96b2275f1b33852da24c3b2a7c295 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 1abf219bfddd9c356d84740938e88b9bfbcc4194..ef9146b62da9fce379f252e658939f72ee1d763e 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 fa7579cfac383664c326ee2626128eae27b81a4b..93ba0e510d319aaae4e007e648909e8ab6bbceec 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java @@ -41,23 +41,23 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; 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.MethodDescription; -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.ClassModel.MethodDescription; import com.amd.aparapi.InstructionPattern.InstructionMatch; import com.amd.aparapi.InstructionSet.AccessArrayElement; import com.amd.aparapi.InstructionSet.AccessField; @@ -1460,59 +1460,90 @@ class MethodModel{ public static class FakeLocalVariableInfo implements LocalVariableInfo{ + int start; + + int end; + + String name; + + String descriptor; + + boolean isArray; + + int variableIndex; + + public FakeLocalVariableInfo(int _variableIndex, int _start, int _end, String _variableName, String _variableDescriptor, + boolean _isArray) { + variableIndex = _variableIndex; + start = _start; + end = _end; + name = _variableName; + descriptor = _variableDescriptor; + isArray = _isArray; + } + @Override public int getEnd() { - // TODO Auto-generated method stub - return 0; + return (end); } @Override public int getStart() { - // TODO Auto-generated method stub - return 0; + return (start); } @Override public String getVariableDescriptor() { - // TODO Auto-generated method stub - return null; + return (descriptor); } @Override public int getVariableIndex() { - // TODO Auto-generated method stub - return 0; + throw new IllegalStateException(); + } @Override public String getVariableName() { - // TODO Auto-generated method stub - return null; + + return (name); } @Override public boolean isArray() { - // TODO Auto-generated method stub - return false; + + return (isArray); } } List<LocalVariableInfo> list = new ArrayList<LocalVariableInfo>(); - public static class SlotTable{ + public class SlotTable{ Slot[] slots; + int slotSize; + + Map.Entry<Integer, Instruction> pcMapEntries[]; + StoreSpec[] argsAsStoreSlots; - public SlotTable(StoreSpec[] _argsAsStoreSlots, int _numberOfSlots, int _size) { + public SlotTable(StoreSpec[] _argsAsStoreSlots, int _numberOfSlots, Map<Integer, Instruction> _pcMap) { + slotSize = _pcMap.size(); + pcMapEntries = new Map.Entry[slotSize]; + int count = 0; + for (Map.Entry<Integer, Instruction> entry : _pcMap.entrySet()) { + pcMapEntries[count++] = entry; + } + argsAsStoreSlots = _argsAsStoreSlots; slots = new Slot[_numberOfSlots]; for (int i = 0; i < _numberOfSlots; i++) { - slots[i] = new Slot(i < argsAsStoreSlots.length ? argsAsStoreSlots[i] : StoreSpec.NONE, _size); + slots[i] = new Slot(i < argsAsStoreSlots.length ? argsAsStoreSlots[i] : StoreSpec.NONE, slotSize); } } - public static class Slot{ + public class Slot{ + public Slot(StoreSpec _defaultStoreSpec, int _size) { defaultStoreSpec = _defaultStoreSpec; - entries = new Entry[_size]; - for (int i = 0; i < _size; i++) { - entries[i] = new Entry(i); + entries = new LinkedHashMap<Integer, Entry>(); + for (Map.Entry<Integer, Instruction> pcMapEntry : pcMapEntries) { + entries.put(pcMapEntry.getKey(), new Entry(pcMapEntry.getKey())); } } @@ -1520,11 +1551,12 @@ class MethodModel{ int number; - public static class Entry{ + public class Entry{ int slotNumber; public Entry(int _slotNumber) { slotNumber = _slotNumber; + } LoadSpec loadSpec = LoadSpec.NONE; @@ -1542,25 +1574,56 @@ class MethodModel{ } } - Entry[] entries; + Map<Integer, Entry> entries; - public Entry getEntry(int _row) { - return entries[_row]; + public Entry getEntry(int _pc) { + return entries.get(_pc); } - public void setLoad(int pc, LoadSpec _loadSpec) { - entries[pc].loadSpec = _loadSpec; + public void setLoad(int _pc, LoadSpec _loadSpec) { + entries.get(_pc).loadSpec = _loadSpec; } - public void setStore(int pc, StoreSpec _storeSpec) { - entries[pc].storeSpec = _storeSpec; + public void setStore(int _pc, StoreSpec _storeSpec) { + entries.get(_pc).storeSpec = _storeSpec; } public StoreSpec getDefaultStoreSpec() { return (defaultStoreSpec); } + + public LocalVariableInfo createLocalVariableInfo(int _index) { + StoreSpec storeSpec = defaultStoreSpec; + int variableIndex = 0; + int start = 0; + int end = 0; + String variableName = null; + String variableDescription = null; + + String state = storeSpec == StoreSpec.NONE ? "NONE" : "STARTED"; + + int count = 0; + for (Map.Entry<Integer, Entry> entry : entries.entrySet()) { + + if (entry.getValue().storeSpec != StoreSpec.NONE) { + if (state.equals("NONE")) { + storeSpec = entry.getValue().storeSpec; + state = "STARTED"; + start = end = entry.getKey(); + } else if (storeSpec != entry.getValue().storeSpec) { + storeSpec = entry.getValue().storeSpec; + state = "STARTED"; + start = end = entry.getKey(); + } + + } + count++; + } + return ((LocalVariableInfo) new FakeLocalVariableInfo(variableIndex, start, end, variableName, variableDescription, + false)); + } } public String toString() { @@ -1580,10 +1643,12 @@ class MethodModel{ sb.append("--|"); } sb.append("\n"); - for (int row = 0; row < slots[0].entries.length; row++) { + for (Map.Entry<Integer, Instruction> pcMapEntry : pcMapEntries) { + for (Slot slot : slots) { - sb.append(slot.getEntry(row) + "|"); + sb.append(slot.getEntry(pcMapEntry.getKey()) + "|"); } + sb.append(" " + pcMapEntry.getValue()); sb.append("\n"); } @@ -1602,6 +1667,8 @@ class MethodModel{ } } + SlotTable slotTable; + public FakeLocalVariableTableEntry(Map<Integer, Instruction> _pcMap, ClassModelMethod _method) { int numberOfSlots = _method.getCodeEntry().getMaxLocals(); @@ -1617,7 +1684,7 @@ class MethodModel{ } // System.out.println("slots= " + numberOfSlots); - SlotTable slotTable = new SlotTable(argsAsStoreSpecs, numberOfSlots, _pcMap.size()); + slotTable = new SlotTable(argsAsStoreSpecs, numberOfSlots, _pcMap); // System.out.println(slotTable); for (Entry<Integer, Instruction> entry : _pcMap.entrySet()) { int pc = entry.getKey(); @@ -1635,15 +1702,14 @@ class MethodModel{ storeSpec); } - System.out.println(" Instruction " + entry.getValue()); + // 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 LocalVariableInfo getVariable(int _pc, int _index) { + return (slotTable.slots[_index].createLocalVariableInfo(_index)); } @Override public Iterator<LocalVariableInfo> iterator() { @@ -1675,8 +1741,7 @@ 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");