This is the mail archive of the frysk@sourceware.org mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Accept symbolic addresses in spin button, bug 4673.


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
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]