Index: disassembler/DisassemblyWindow.java =================================================================== RCS file: /cvs/frysk/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java,v retrieving revision 1.31 diff -u -r1.31 DisassemblyWindow.java --- disassembler/DisassemblyWindow.java 7 Sep 2007 03:18:50 -0000 1.31 +++ disassembler/DisassemblyWindow.java 12 Sep 2007 07:43:28 -0000 @@ -42,6 +42,7 @@ package frysk.gui.disassembler; import java.util.prefs.Preferences; +import java.util.LinkedList; import java.util.List; import java.util.Iterator; import java.util.ListIterator; @@ -74,6 +75,7 @@ import org.gnu.gtk.event.SpinEvent; import org.gnu.gtk.event.SpinListener; +import frysk.dwfl.DwflCache; import frysk.gui.common.IconManager; import frysk.gui.prefs.PreferenceManager; import frysk.gui.monitor.Saveable; @@ -81,7 +83,12 @@ import frysk.proc.Task; import frysk.stepping.TaskStepEngine; import frysk.proc.MemoryMap; +import frysk.symtab.Symbol; +import frysk.symtab.SymbolFactory; +import lib.dwfl.Dwfl; +import lib.dwfl.DwflModule; +import lib.dwfl.SymbolBuilder; import lib.opcodes.Disassembler; import lib.opcodes.Instruction; @@ -379,28 +386,42 @@ return; String str = fromBox.getText(); - str = str.substring(2); - try + + if (str.startsWith("0x")) { - double d = (double) Long.parseLong(str, 16); - if (!addressAccessible((long)d)) - fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); - else - { - if (d > lastKnownTo) + str = str.substring(2); + try + { + double d = (double) Long.parseLong(str, 16); + if (!addressAccessible((long)d)) + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + else { - if (lastKnownTo == lastKnownFrom) - handleFromSpin(lastKnownTo); + if (d > lastKnownTo) + { + if (lastKnownTo == lastKnownFrom) + handleFromSpin(lastKnownTo); + else + fromSpin.setValue(lastKnownTo); + } else - fromSpin.setValue(lastKnownTo); + fromSpin.setValue(d); } - else - fromSpin.setValue(d); - } + } + catch (NumberFormatException nfe) + { + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + } } - catch (NumberFormatException nfe) - { - fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + else + { + try + { + handleSymbol(str); + } + catch (RuntimeException e){ + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + } } } } @@ -416,28 +437,41 @@ return; String str = toBox.getText(); - str = str.substring(2); - try + if (str.startsWith("0x")) { - double d = (double) Long.parseLong(str, 16); - if (!(addressAccessible((long)d))) - toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); - else - { - if (d < lastKnownFrom) + str = str.substring(2); + try + { + double d = (double) Long.parseLong(str, 16); + if (!(addressAccessible((long)d))) + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + else { - if (lastKnownFrom == lastKnownTo) - handleToSpin(lastKnownFrom); + if (d < lastKnownFrom) + { + if (lastKnownFrom == lastKnownTo) + handleToSpin(lastKnownFrom); + else + toSpin.setValue(lastKnownFrom); + } else - toSpin.setValue(lastKnownFrom); + toSpin.setValue(d); } - else - toSpin.setValue(d); - } + } + catch (NumberFormatException nfe) + { + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + } } - catch (NumberFormatException nfe) - { - toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + else + { + try + { + handleSymbol(str); + } + catch (RuntimeException e){ + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + } } } } @@ -539,6 +573,32 @@ } this.refreshList(); } + + /** + * Get the address list from symbol name; + * @param name + * @return address list + */ + private LinkedList addressesForSymbol(String name) { + Dwfl dwfl = DwflCache.getDwfl(this.myTask); + DwflModule[] modules = dwfl.getModules(); + final LinkedList addrs = new LinkedList(); + SymbolBuilder builder = new SymbolBuilder() { + public void symbol(String name, long value, long size, + int type, int bind, int visibility) { + addrs.add(new Long(value)); + } + }; + for (int i = 0; i < modules.length; i++) + { + DwflModule module = modules[i]; + module.getSymbolByName(name, builder); + } + if (addrs.size() == 0) + throw new RuntimeException("Couldn't find symbol " + name); + else + return addrs; + } /** * return a boolean indicating whether or not this address is accessible. * @@ -640,16 +700,17 @@ * By default append rows to the end. * * @param i The address to be displayed + * @param numIns The Instructions that maybe be added * @param iter The TreeIter representing the row to be added. */ - public synchronized void rowAppend (long i, TreeIter iter) + public synchronized void rowAppend (long i, int numIns, TreeIter iter) { // if (iter == null) // iter = model.appendRow(); List instructionsList = diss.disassembleInstructions((long) this.lastKnownTo, - numInstructions); + numInstructions+numIns); Iterator li = instructionsList.listIterator(0); Instruction ins = (Instruction) li.next(); @@ -661,8 +722,10 @@ this.lastPath.next(); if (ins != null) { - if (li.hasNext()) + if (li.hasNext()){ ins = (Instruction) li.next(); + this.numInstructions++; + } else { this.toSpin.setValue((double) ins.address); @@ -858,10 +921,11 @@ if (val > this.lastKnownTo) { - for (long i = (long) lastKnownTo + 1; i < val + 1; i++) - ++this.numInstructions; + int numIns = 0; + for (long i = (long) lastKnownTo + 1; i < val + 1; i++) + ++numIns; - rowAppend((long) val, null); + rowAppend((long) val, numIns, null); return; } @@ -895,6 +959,48 @@ refreshList(); } } + + /** + * When the box is inputed a symbol, update the displayed information to the symbol. + * @param symbolName + */ + private synchronized void handleSymbol(String symbolName) + { + LinkedList addressList = addressesForSymbol(symbolName); + long startAddress = ((Long)addressList.getFirst()).longValue(); + Symbol symbol = SymbolFactory.getSymbol(this.myTask, startAddress); + long endAddress = symbol.getAddress() + symbol.getSize(); + + List instructionsList + = diss.disassembleInstructionsStartEnd((long)startAddress, (long)endAddress); + Iterator li = instructionsList.listIterator(0); + int insnum = 1; + Instruction ins = (Instruction)li.next(); + this.lastKnownFrom = (double)ins.address; + while (li.hasNext()){ + ins = (Instruction)li.next(); + insnum++; + } + this.lastKnownTo = (double)ins.address; + + TreeIter iter = this.model.getFirstIter(); + while (insnum < numInstructions) + { + this.model.removeRow(iter); + this.lastPath.previous(); + numInstructions--; + } + while(insnum > numInstructions) + { + this.model.appendRow(); + this.lastPath.next(); + numInstructions++; + } + + refreshList(); + fromBox.setText("0x" + Long.toHexString((long)lastKnownFrom)); + fromSpin.setValue(lastKnownFrom); + } /**************************************************************************** * Save and Load Index: memory/MemoryWindow.java =================================================================== RCS file: /cvs/frysk/frysk-gui/frysk/gui/memory/MemoryWindow.java,v retrieving revision 1.46 diff -u -r1.46 MemoryWindow.java --- memory/MemoryWindow.java 7 Sep 2007 03:18:50 -0000 1.46 +++ memory/MemoryWindow.java 12 Sep 2007 07:43:29 -0000 @@ -42,6 +42,7 @@ package frysk.gui.memory; import java.util.prefs.Preferences; +import java.util.LinkedList; import java.util.List; import java.util.Iterator; import java.util.Observable; @@ -78,6 +79,7 @@ import org.gnu.gtk.event.SpinEvent; import org.gnu.gtk.event.SpinListener; +import frysk.dwfl.DwflCache; import frysk.gui.common.IconManager; import frysk.gui.prefs.PreferenceManager; import frysk.gui.monitor.GuiObject; @@ -87,8 +89,13 @@ import frysk.proc.Proc; import frysk.proc.Task; import frysk.stepping.TaskStepEngine; +import frysk.symtab.Symbol; +import frysk.symtab.SymbolFactory; import frysk.proc.MemoryMap; +import lib.dwfl.Dwfl; +import lib.dwfl.DwflModule; +import lib.dwfl.SymbolBuilder; import lib.opcodes.Disassembler; import lib.opcodes.Instruction; @@ -511,28 +518,41 @@ return; String str = fromBox.getText(); - str = str.substring(2); - try + if (str.startsWith("0x")) { - double d = (double) Long.parseLong(str, 16); - if (!addressAccessible((long)d)) - fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); - else - { - if (d > lastKnownTo) + str = str.substring(2); + try + { + double d = (double) Long.parseLong(str, 16); + if (!addressAccessible((long)d)) + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + else { - if (lastKnownTo == lastKnownFrom) - handleFromSpin(lastKnownTo); + if (d > lastKnownTo) + { + if (lastKnownTo == lastKnownFrom) + handleFromSpin(lastKnownTo); + else + fromSpin.setValue(lastKnownTo); + } else - fromSpin.setValue(lastKnownTo); + fromSpin.setValue(d); } - else - fromSpin.setValue(d); - } + } + catch (NumberFormatException nfe) + { + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + } } - catch (NumberFormatException nfe) - { - fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + else + { + try + { + handleSymbol(str); + } + catch (RuntimeException e){ + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + } } } } @@ -548,23 +568,41 @@ return; String str = toBox.getText(); - str = str.substring(2); - try + if (str.startsWith("0x")) { - double d = (double) Long.parseLong(str, 16); - if (d < lastKnownFrom) - { - if (lastKnownFrom == lastKnownTo) - handleToSpin(lastKnownFrom); - else - toSpin.setValue(lastKnownFrom); - } - else - toSpin.setValue(d); + str = str.substring(2); + try + { + double d = (double) Long.parseLong(str, 16); + if (!(addressAccessible((long)d))) + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + else + { + if (d < lastKnownFrom) + { + if (lastKnownFrom == lastKnownTo) + handleToSpin(lastKnownFrom); + else + toSpin.setValue(lastKnownFrom); + } + else + toSpin.setValue(d); + } + } + catch (NumberFormatException nfe) + { + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + } } - catch (NumberFormatException nfe) - { - toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + else + { + try + { + handleSymbol(str); + } + catch (RuntimeException e){ + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + } } } } @@ -573,6 +611,32 @@ } /** + * Get the address list from symbol name; + * @param name + * @return address list + */ + private LinkedList addressesForSymbol(String name) { + Dwfl dwfl = DwflCache.getDwfl(this.myTask); + DwflModule[] modules = dwfl.getModules(); + final LinkedList addrs = new LinkedList(); + SymbolBuilder builder = new SymbolBuilder() { + public void symbol(String name, long value, long size, + int type, int bind, int visibility) { + addrs.add(new Long(value)); + } + }; + for (int i = 0; i < modules.length; i++) + { + DwflModule module = modules[i]; + module.getSymbolByName(name, builder); + } + if (addrs.size() == 0) + throw new RuntimeException("Couldn't find symbol " + name); + else + return addrs; + } + + /** * return a boolean indicating whether or not this address is accessible. * * @return whether or not this address is accessible @@ -612,6 +676,7 @@ this.refreshLock = false; } + /***************************************************************************** * Calculation, memory reading, and information display methods ****************************************************************************/ @@ -1011,6 +1076,47 @@ this.lastKnownTo = val; refreshList(); } + + /** + * When the box is inputed a symbol, update the displayed information to the symbol. + * @param symbolName + */ + private synchronized void handleSymbol(String symbolName) + { + LinkedList addressList = addressesForSymbol(symbolName); + long startAddress = ((Long)addressList.getFirst()).longValue(); + Symbol symbol = SymbolFactory.getSymbol(this.myTask, startAddress); + long endAddress = symbol.getAddress() + symbol.getSize(); + long size = endAddress - startAddress + 1; + long modelSize = (long)lastKnownTo - (long)lastKnownFrom + 1; + TreeIter iter = this.model.getFirstIter(); + while (size < modelSize) + { + this.model.removeRow(iter); + this.lastPath.previous(); + modelSize--; + } + while(size > modelSize) + { + this.model.appendRow(); + this.lastPath.next(); + modelSize++; + } + this.lastKnownFrom = (double)startAddress; + this.lastKnownTo = (double)endAddress; + iter = this.model.getFirstIter(); + this.lastPath = iter.getPath(); + for(long i= startAddress; i < endAddress+1; i++) + { + rowAppend(i, iter); + iter = iter.getNextIter(); + } + refreshList(); + fromBox.setText("0x" + Long.toHexString((long)lastKnownFrom)); + fromSpin.setValue(lastKnownFrom); + toBox.setText("0x" + Long.toHexString((long)lastKnownTo)); + toSpin.setValue(lastKnownTo); + } /**************************************************************************** * Save and Load