From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23530 invoked by alias); 12 Sep 2007 08:05:40 -0000 Received: (qmail 23517 invoked by uid 22791); 12 Sep 2007 08:05:37 -0000 X-Spam-Status: No, hits=0.1 required=5.0 tests=AWL,BAYES_50,DK_POLICY_SIGNSOME,TW_DW X-Spam-Check-By: sourceware.org Received: from rgminet01.oracle.com (HELO rgminet01.oracle.com) (148.87.113.118) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 12 Sep 2007 08:05:31 +0000 Received: from rgmgw1.us.oracle.com (rgmgw1.us.oracle.com [138.1.186.110]) by rgminet01.oracle.com (Switch-3.2.4/Switch-3.1.6) with ESMTP id l8C85RLU029371 for ; Wed, 12 Sep 2007 02:05:28 -0600 Received: from dhcp-beijing-cdc-10-182-121-20.cn.oracle.com (dhcp-beijing-cdc-10-182-121-20.cn.oracle.com [10.182.121.20]) by rgmgw1.us.oracle.com (Switch-3.2.4/Switch-3.2.4) with ESMTP id l8C85Kic009117 for ; Wed, 12 Sep 2007 02:05:21 -0600 Subject: [patch] Accept symbolic addresses in spin button, bug 4673. From: Zhao Shujing Reply-To: pearly.zhao@oracle.com To: Frysk Mailing List Content-Type: multipart/mixed; boundary="=-deC86nq1iTD5BszHnHum" Organization: Oracle Date: Wed, 12 Sep 2007 08:05:00 -0000 Message-Id: <1189584690.4843.23.camel@linux-pzhao.site> Mime-Version: 1.0 X-Mailer: Evolution 2.6.0 X-Brightmail-Tracker: AAAAAQAAAAI= X-Brightmail-Tracker: AAAAAA== X-Whitelist: TRUE X-Whitelist: TRUE X-Virus-Checked: Checked by ClamAV on sourceware.org X-IsSubscribed: yes Mailing-List: contact frysk-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-owner@sourceware.org X-SW-Source: 2007-q3/txt/msg00392.txt.bz2 --=-deC86nq1iTD5BszHnHum Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 625 Hi, This patch can make the disassembly/memory window accept symbol name in spin Button. Here is what it does: - When input a available symbol name at fromBox, the window would display the disassembly/memory of this symbol. The fromBox/fromSpin would be set the start address of this symbol and the toBox/toSpin would be set the end address of this symbol. - When input a available symbol name at toBox, it would do as same as when input at fromBox. - When input a unavailable symbol name, the fromBox/fromSpin or toBox/toSpin would be reset to the lastKnownFrom or lastKnownTo. Any suggestions are welcomed. Pearly Zhao --=-deC86nq1iTD5BszHnHum Content-Description: Content-Disposition: inline; filename=4673.patch Content-Type: text/x-patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 17554 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 --=-deC86nq1iTD5BszHnHum--