From: Zhao Shujing <pearly.zhao@oracle.com>
To: Frysk Mailing List <frysk@sourceware.org>
Subject: [patch] Accept symbolic addresses in spin button, bug 4673.
Date: Wed, 12 Sep 2007 08:05:00 -0000 [thread overview]
Message-ID: <1189584690.4843.23.camel@linux-pzhao.site> (raw)
[-- Attachment #1: Type: text/plain, Size: 625 bytes --]
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
[-- Attachment #2: Type: text/x-patch, Size: 17554 bytes --]
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
next reply other threads:[~2007-09-12 8:05 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-12 8:05 Zhao Shujing [this message]
2007-09-12 13:33 ` PEARLY.ZHAO
2007-09-19 1:19 ` Zhao Shujing
2007-09-21 21:53 ` Andrew Cagney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1189584690.4843.23.camel@linux-pzhao.site \
--to=pearly.zhao@oracle.com \
--cc=frysk@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).