From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8706 invoked by alias); 12 Sep 2007 13:33:47 -0000 Received: (qmail 8678 invoked by uid 22791); 12 Sep 2007 13:33:41 -0000 X-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00,DK_POLICY_SIGNSOME,FROM_NO_LOWER,NO_REAL_NAME,TW_DW X-Spam-Check-By: sourceware.org Received: from agminet01.oracle.com (HELO agminet01.oracle.com) (141.146.126.228) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 12 Sep 2007 13:33:33 +0000 Received: from agmgw1.us.oracle.com (agmgw1.us.oracle.com [152.68.180.212]) by agminet01.oracle.com (Switch-3.2.4/Switch-3.1.7) with ESMTP id l8CDXTME022785 for ; Wed, 12 Sep 2007 08:33:29 -0500 Received: from acsmt303.oracle.com (acsmt303.oracle.com [141.146.40.140]) by agmgw1.us.oracle.com (Switch-3.2.0/Switch-3.2.0) with ESMTP id l8CDXSH6001620; Wed, 12 Sep 2007 07:33:28 -0600 Message-ID: <17474866.1189604007745.JavaMail.oracle@acsmt303.oracle.com> Date: Wed, 12 Sep 2007 13:33:00 -0000 From: PEARLY.ZHAO@ORACLE.COM To: Frysk Mailing List , pearly.zhao@ORACLE.COM Subject: Re: [patch] Accept symbolic addresses in spin button, bug 4673. In-Reply-To: <1189584690.4843.23.camel@linux-pzhao.site> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit References: <1189584690.4843.23.camel@linux-pzhao.site> X-Priority: 3 X-Mailer: Oracle Webmail Client(UIX) Content-Language: zh-CN Accept-Language: zh-CN X-Brightmail-Tracker: AAAAAQAAAAI= X-Brightmail-Tracker: AAAAAQAAAAI= X-Whitelist: TRUE X-Whitelist: TRUE 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/msg00393.txt.bz2 Actually, retrieving symbol addresses in the classes implementing the disssembly and memory windows is a wrong way to implement this functionality. Maybe it should be designed at core. The classes handling the windows merely use it to obtain the information. Pearly > 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 > > --------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 >