diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/Config.java b/com.amd.aparapi/src/java/com/amd/aparapi/Config.java index f1e479d3c3eb50f0926a6dd8822c330832673396..dad7ffb41ae8c7174cbfd412d26c260230bc4195 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/Config.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/Config.java @@ -155,9 +155,7 @@ class Config{ static final boolean enableSWITCH = Boolean.getBoolean(propPkgName + ".enable.SWITCH"); - // Lambda testing requires this because static lambda methods currently do not have localvariabletables. This may change when Java8 if finalized - static final boolean enableAllowMissingLocalVariableTable = Boolean.getBoolean(propPkgName - + ".enableAllowMissingLocalVariableTable"); + public static boolean enableShowFakeLocalVariableTable = Boolean.getBoolean(propPkgName + ".enableShowFakeLocalVariableTable"); // Logging setup private static final String logPropName = propPkgName + ".logLevel"; 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 80437f1904ec563fc3b4002b4569f84e2ca9a10d..01e227303c832c4774df11536fc40453a425daa0 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java @@ -757,21 +757,19 @@ class ExpressionList{ // might be end of arbitrary scope 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"); - } else { - for (LocalVariableInfo localVariableInfo : localVariableTable) { - if (localVariableInfo.getEnd() == _instruction.getThisPC()) { - logger.fine(localVariableInfo.getVariableName() + " scope " + localVariableInfo.getStart() + " ," - + localVariableInfo.getEnd()); - if (localVariableInfo.getStart() < startPc) { - startPc = localVariableInfo.getStart(); - } - } + for (LocalVariableInfo localVariableInfo : localVariableTable) { + if (localVariableInfo.getEnd() == _instruction.getThisPC()) { + logger.fine(localVariableInfo.getVariableName() + " scope " + localVariableInfo.getStart() + " ," + + localVariableInfo.getEnd()); + if (localVariableInfo.getStart() < startPc) { + startPc = localVariableInfo.getStart(); + } } + } + if (startPc < Short.MAX_VALUE) { logger.fine("Scope block from " + startPc + " to " + (tail.getThisPC() + tail.getLength())); System.out.println("Scope block from " + startPc + " to " + (tail.getThisPC() + tail.getLength())); 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 c871ace4ac0861b1b3c86612a345a3240211d584..755a45db48ae748f4395be4a3af01e71a50d9904 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/InstructionSet.java @@ -1283,7 +1283,8 @@ class InstructionSet{ } @Override public boolean isDeclaration() { - LocalVariableInfo lvi = method.getLocalVariableTableEntry().getVariable(getThisPC() + getLength(), getLocalVariableTableIndex()); + LocalVariableInfo lvi = method.getLocalVariableTableEntry().getVariable(getThisPC() + getLength(), + getLocalVariableTableIndex()); return (lvi.getStart() == getThisPC() + getLength()); } @@ -1302,7 +1303,7 @@ class InstructionSet{ } @Override public final LocalVariableInfo getLocalVariableInfo() { - + return (method.getLocalVariableTableEntry().getVariable(getThisPC() + getLength(), getLocalVariableTableIndex())); } } 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 b7de1d4264adc6e6fdb2eb96d664106c11868486..e84715fd3bca6ff02ce384416f97d21d90b37790 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java @@ -38,12 +38,11 @@ under those regulations, please refer to the U.S. Bureau of Industry and Securit package com.amd.aparapi; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -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; @@ -96,7 +95,6 @@ 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; @@ -225,7 +223,7 @@ class MethodModel{ * @return Map<Integer, Instruction> the returned pc to Instruction map */ Map<Integer, Instruction> createListOfInstructions() throws ClassParseException { - Map<Integer, Instruction> pcMap = new HashMap<Integer, Instruction>(); + Map<Integer, Instruction> pcMap = new LinkedHashMap<Integer, Instruction>(); byte[] code = method.getCode(); // We create a byteReader for reading the bytes from the code array @@ -1480,8 +1478,11 @@ class MethodModel{ startPc = _startPc; if (_storeSpec.equals(StoreSpec.A)) { name = "arr_" + _slotIndex; + descriptor = "/* arg */"; } else { name = _storeSpec.toString().toLowerCase() + "_" + _slotIndex; + descriptor = _storeSpec.toString(); + } } @@ -1534,78 +1535,53 @@ class MethodModel{ MethodDescription description = ClassModel.getMethodDescription(_method.getDescriptor()); String[] args = description.getArgs(); + int thisOffset = _method.isStatic() ? 0 : 1; + Var[] vars = new Var[numberOfSlots + thisOffset]; StoreSpec[] argsAsStoreSpecs = new StoreSpec[args.length + thisOffset]; if (thisOffset == 1) { argsAsStoreSpecs[0] = StoreSpec.O; vars[0] = new Var(argsAsStoreSpecs[0], 0, 0, true, list.size()); list.add(vars[0]); + } - for (int i = thisOffset; i < args.length + thisOffset; i++) { + for (int i = 0; i < args.length; i++) { if (args[i].startsWith("[")) { - argsAsStoreSpecs[i] = StoreSpec.A; + argsAsStoreSpecs[i + thisOffset] = StoreSpec.A; } else { - argsAsStoreSpecs[i] = StoreSpec.valueOf(args[i].substring(0, 1)); + argsAsStoreSpecs[i + thisOffset] = StoreSpec.valueOf(args[i].substring(0, 1)); } - vars[i] = new Var(argsAsStoreSpecs[i], i, 0, true, list.size()); - list.add(vars[i]); + vars[i + thisOffset] = new Var(argsAsStoreSpecs[i + thisOffset], i + thisOffset, 0, true, list.size()); + list.add(vars[i + thisOffset]); } for (int i = args.length + thisOffset; i < numberOfSlots + thisOffset; i++) { vars[i] = new Var(); } - // System.out.println("slots= " + numberOfSlots); - // slotTable = new SlotTable(argsAsStoreSpecs, numberOfSlots, _pcMap); - // System.out.println(slotTable); - int pc = 0; + Instruction instruction = null; for (Entry<Integer, Instruction> entry : _pcMap.entrySet()) { pc = entry.getKey(); - Instruction instruction = entry.getValue(); - LoadSpec loadSpec = instruction.getByteCode().getLoad(); + instruction = entry.getValue(); StoreSpec storeSpec = instruction.getByteCode().getStore(); - int slotIndex = -1; - - if (loadSpec != LoadSpec.NONE) { - slotIndex = ((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex(); - // slotTable.setLoad(slotIndex, pc, - // loadSpec); - if (vars[slotIndex].endPc <= pc) { - vars[slotIndex].endPc = pc; - } - - } if (storeSpec != StoreSpec.NONE) { - - slotIndex = ((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex(); - // slotTable.setStore(slotIndex, pc, - // storeSpec); - Var var = new Var(storeSpec, slotIndex, pc + 1, false, list.size()); // will get collected - if (!vars[slotIndex].equals(var)) { + int slotIndex = ((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex(); + Var prevVar = vars[slotIndex]; + Var var = new Var(storeSpec, slotIndex, pc + instruction.getLength(), false, list.size()); // will get collected + if (!prevVar.equals(var)) { + prevVar.endPc = pc; vars[slotIndex] = var; list.add(vars[slotIndex]); } } - // for (int i = 0; i < numberOfSlots; i++) { - - // System.out.print(vars[i] + "|"); - // } - // System.out.println(" Instruction " + entry.getValue() + " " + slotIndex); } for (int i = 0; i < numberOfSlots + thisOffset; i++) { - vars[i].endPc = pc + 1; + vars[i].endPc = pc + instruction.getLength(); } - Arrays.sort(vars, new Comparator<Var>(){ - - @Override public int compare(Var o1, Var o2) { - - return o1.startPc - o2.startPc; - } - }); Collections.sort(list, new Comparator<LocalVariableInfo>(){ @@ -1614,29 +1590,31 @@ class MethodModel{ return o1.getStart() - o2.getStart(); } }); - System.out.println(" LocalVariableTable:"); - System.out.println(" Start Length Slot Name Signature"); + + int i = 0; for (LocalVariableInfo lvi : list) { Var var = (Var) lvi; - // if (var.arg) { - // var.endPc = pc+1; - // } - - System.out.println(String.format("%4d %4d %4d %8s %s", var.startPc, var.getLength(), var.variableIndex, var.name, - var.descriptor)); - // System.out.println(lvi); + var.variableIndex = i++; + } + if (Config.enableShowFakeLocalVariableTable) { + System.out.println("FakeLocalVariableTable:"); + System.out.println(" Start Length Slot Name Signature"); + for (LocalVariableInfo lvi : list) { + Var var = (Var) lvi; + System.out.println(String.format(" %5d %5d %4d %8s %s", var.startPc, var.getLength(), var.variableIndex, + var.name, var.descriptor)); + } } - // System.out.println(slotTable); } @Override public LocalVariableInfo getVariable(int _pc, int _index) { LocalVariableInfo returnValue = null; - // System.out.println("pc = " + _pc + " index = " + _index); + // System.out.println("pc = " + _pc + " index = " + _index); for (LocalVariableInfo localVariableInfo : list) { - // System.out.println(" start=" + localVariableInfo.getStart() + " length=" + localVariableInfo.getLength() - // + " varidx=" + localVariableInfo.getVariableIndex()); + // System.out.println(" start=" + localVariableInfo.getStart() + " length=" + localVariableInfo.getLength() + // + " varidx=" + localVariableInfo.getVariableIndex()); if (_pc >= localVariableInfo.getStart() - 1 && _pc <= (localVariableInfo.getStart() + localVariableInfo.getLength()) && _index == localVariableInfo.getVariableIndex()) { returnValue = localVariableInfo; @@ -1685,25 +1663,15 @@ class MethodModel{ Map<Integer, Instruction> pcMap = createListOfInstructions(); 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"); - } else { - if (localVariableTableEntry == null) { - //System.out.println("create local variable table"); - - localVariableTableEntry = new FakeLocalVariableTableEntry(pcMap, method); - method.setLocalVariableTableEntry(localVariableTableEntry); + if (localVariableTableEntry == null) { + localVariableTableEntry = new FakeLocalVariableTableEntry(pcMap, method); - //throw new ClassParseException(ClassParseException.TYPE.MISSINGLOCALVARIABLETABLE); - } - for (LocalVariableInfo localVariableInfo : localVariableTableEntry) { - // TODO: What was the thinking here? - final boolean DISALLOWARRAYLOCALVAR = false; - if (DISALLOWARRAYLOCALVAR && localVariableInfo.isArray()) { - throw new ClassParseException(ClassParseException.TYPE.ARRAYLOCALVARIABLE); - } - } + method.setLocalVariableTableEntry(localVariableTableEntry); + logger.warning("Method " + + method.getName() + + method.getDescriptor() + + " does not contain a LocalVariableTable entry (source not compiled with -g) aparapi will attempt to create a synthetic table based on bytecode. This is experimental!!"); } // pass #2 build branch graph