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: Re: [patch] Accept symbolic addresses in spin button, bug 4673.
Date: Wed, 19 Sep 2007 01:19:00 -0000	[thread overview]
Message-ID: <1190165163.24118.3.camel@linux-pzhao.site> (raw)
In-Reply-To: <17474866.1189604007745.JavaMail.oracle@acsmt303.oracle.com>

[-- Attachment #1: Type: text/plain, Size: 21140 bytes --]

Hi,
This is a new patch. It adds getSymbol(task, name) method to
SymbolFactory. The BreakpointManager and FunctionBreakpoint are changed
to use this method instead of using the one defined by themselves.

Any suggestions are welcomed.

Pearly
On Wed, 2007-09-12 at 08:33 -0500, PEARLY.ZHAO@oracle.com wrote:
> 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
> > 
> 

[-- Attachment #2: Type: text/x-patch, Size: 19600 bytes --]

Index: frysk-core/frysk/rt/BreakpointManager.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/rt/BreakpointManager.java,v
retrieving revision 1.12
diff -u -r1.12 BreakpointManager.java
--- frysk-core/frysk/rt/BreakpointManager.java	3 Sep 2007 21:34:31 -0000	1.12
+++ frysk-core/frysk/rt/BreakpointManager.java	14 Sep 2007 06:10:24 -0000
@@ -56,6 +56,7 @@
 import frysk.proc.TaskObserver;
 import frysk.stepping.SteppingEngine;
 import frysk.util.CountDownLatch;
+import frysk.symtab.SymbolFactory;
 import lib.dwfl.DwarfDie;
 
 /**
@@ -234,7 +235,7 @@
         managedProcs.add(proc);
 	// Assume that the Proc's main task is stopped.
         LinkedList sharedLibBptAddrs
-            = FunctionBreakpoint.addressesForSymbol("_dl_debug_state", task);
+            = SymbolFactory.getSymbol(task, "_dl_debug_state");
         if (sharedLibBptAddrs.size() == 0)
             return;
         long sharedLibBptAddr
Index: frysk-core/frysk/rt/FunctionBreakpoint.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/rt/FunctionBreakpoint.java,v
retrieving revision 1.11
diff -u -r1.11 FunctionBreakpoint.java
--- frysk-core/frysk/rt/FunctionBreakpoint.java	16 Jul 2007 22:11:35 -0000	1.11
+++ frysk-core/frysk/rt/FunctionBreakpoint.java	14 Sep 2007 06:10:24 -0000
@@ -46,12 +46,9 @@
 import java.util.ListIterator;
 
 import lib.dwfl.DwarfDie;
-import lib.dwfl.Dwfl;
-import lib.dwfl.DwflModule;
-import lib.dwfl.SymbolBuilder;
 import lib.dwfl.die.InlinedSubroutine;
 import frysk.proc.Task;
-import frysk.dwfl.DwflCache;
+import frysk.symtab.SymbolFactory;
 
 public class FunctionBreakpoint
   extends SourceBreakpoint
@@ -93,7 +90,7 @@
 	    return addrs;
 	}
 	else {
-	    return addressesForSymbol(name, task);
+	    return SymbolFactory.getSymbol(task, name);
 	}
     }
 
@@ -120,26 +117,4 @@
       writer.print("*");
     return writer;
   }
-
-    static LinkedList addressesForSymbol(String name, Task task)  {
-	Dwfl dwfl = DwflCache.getDwfl(task);
-	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;
-
-    }
 }
Index: frysk-core/frysk/symtab/SymbolFactory.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/symtab/SymbolFactory.java,v
retrieving revision 1.3
diff -u -r1.3 SymbolFactory.java
--- frysk-core/frysk/symtab/SymbolFactory.java	12 Sep 2007 14:35:54 -0000	1.3
+++ frysk-core/frysk/symtab/SymbolFactory.java	14 Sep 2007 06:10:24 -0000
@@ -40,10 +40,12 @@
 
 package frysk.symtab;
 
+import java.util.LinkedList;
 import frysk.proc.Task;
 import frysk.dwfl.DwflCache;
 import lib.dwfl.Dwfl;
 import lib.dwfl.DwflModule;
+import lib.dwfl.SymbolBuilder;
 
 /**
  * The object-file symbol.  Typically obtained by reading ELF
@@ -79,4 +81,31 @@
 
 	return symbol;
     }
+    
+    /**
+     * Get address list by symbol name
+     * @param task
+     * @param name
+     * @return address list
+     */
+    public static LinkedList getSymbol(Task task, String name) {
+	Dwfl dwfl = DwflCache.getDwfl(task);
+	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;
+    }
 }
Index: frysk-gui/frysk/gui/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
--- frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java	7 Sep 2007 03:18:50 -0000	1.31
+++ frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java	14 Sep 2007 06:10:24 -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;
@@ -81,6 +82,8 @@
 import frysk.proc.Task;
 import frysk.stepping.TaskStepEngine;
 import frysk.proc.MemoryMap;
+import frysk.symtab.Symbol;
+import frysk.symtab.SymbolFactory;
 
 import lib.opcodes.Disassembler;
 import lib.opcodes.Instruction;
@@ -379,28 +382,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 +433,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 +569,8 @@
       }
     this.refreshList();
   }
+  
+
   /**
    * return a boolean indicating whether or not this address is accessible.
    * 
@@ -640,16 +672,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 +694,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 +893,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 +931,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 = SymbolFactory.getSymbol(this.myTask, 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: frysk-gui/frysk/gui/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
--- frysk-gui/frysk/gui/memory/MemoryWindow.java	7 Sep 2007 03:18:50 -0000	1.46
+++ frysk-gui/frysk/gui/memory/MemoryWindow.java	14 Sep 2007 06:10:24 -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;
@@ -87,6 +88,8 @@
 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.opcodes.Disassembler;
@@ -511,28 +514,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 +564,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));        	    
+          	}       
               }
           }
       }
@@ -572,6 +606,7 @@
     
   }
   
+ 
   /**
    * return a boolean indicating whether or not this address is accessible.
    * 
@@ -612,6 +647,7 @@
     this.refreshLock = false;
   }
 
+
   /*****************************************************************************
    * Calculation, memory reading, and information display methods
    ****************************************************************************/
@@ -1011,6 +1047,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 = SymbolFactory.getSymbol(this.myTask, 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-19  1:19 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-12  8:05 Zhao Shujing
2007-09-12 13:33 ` PEARLY.ZHAO
2007-09-19  1:19   ` Zhao Shujing [this message]
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=1190165163.24118.3.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).