public inbox for frysk@sourceware.org
 help / color / mirror / Atom feed
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

             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).