public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Rename SymbolFactory.getSymbol to getAddresses
@ 2008-04-04  0:29 pmachata
  0 siblings, 0 replies; only message in thread
From: pmachata @ 2008-04-04  0:29 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  73baf44bbc8df85147fc09136607a327e2c9eeb3 (commit)
       via  9004c27a7ea3560c399e5d17d0f6cd813192ead4 (commit)
       via  0809770046b2f78401f6a5d80a6fb346a565715a (commit)
       via  6ba88f88a3247f6391404928bf3eeec8ed3cc270 (commit)
       via  2a726658dbb4cf553e89af73ae91f764f4b39d26 (commit)
      from  ae7d5f2086a6fcd8f18e74223c6075476db0e0bb (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 73baf44bbc8df85147fc09136607a327e2c9eeb3
Author: Petr Machata <pmachata@redhat.com>
Date:   Tue Apr 1 23:19:36 2008 +0200

    Rename SymbolFactory.getSymbol to getAddresses

commit 9004c27a7ea3560c399e5d17d0f6cd813192ead4
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Mar 27 14:52:27 2008 +0100

    Allow creating breakpoint from DwflSymbol

commit 0809770046b2f78401f6a5d80a6fb346a565715a
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Mar 21 20:26:50 2008 +0100

    Record symbol type at Symbol classes

commit 6ba88f88a3247f6391404928bf3eeec8ed3cc270
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Mar 21 19:09:30 2008 +0100

    SymbolFactory can load symbols from symbol tables
    
    * Uses new DwflModule interface to create a single list of symbols, some
      of whose may have Dwarf die attached.

commit 2a726658dbb4cf553e89af73ae91f764f4b39d26
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Mar 21 17:20:51 2008 +0100

    DwflModule can now load symbol tables

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/rt/BreakpointManager.java         |   12 ++++-
 frysk-core/frysk/rt/ChangeLog                      |   10 ++++
 frysk-core/frysk/rt/FunctionBreakpoint.java        |    2 +-
 frysk-core/frysk/symtab/ChangeLog                  |   20 +++++++
 frysk-core/frysk/symtab/DwflSymbol.java            |   30 ++++++++---
 frysk-core/frysk/symtab/Symbol.java                |    9 +++-
 frysk-core/frysk/symtab/SymbolFactory.java         |   56 +++++++++++++++++++-
 frysk-core/frysk/symtab/UnknownSymbol.java         |    4 +-
 frysk-gui/frysk/gui/ChangeLog                      |    5 ++
 .../frysk/gui/disassembler/DisassemblyWindow.java  |    2 +-
 frysk-gui/frysk/gui/memory/MemoryWindow.java       |    2 +-
 frysk-sys/lib/dwfl/ChangeLog                       |   14 +++++
 frysk-sys/lib/dwfl/DwflModule.java                 |   16 +++++-
 frysk-sys/lib/dwfl/ElfSymbol.java                  |   13 ++++-
 frysk-sys/lib/dwfl/cni/DwflModule.cxx              |   21 +++++++
 15 files changed, 197 insertions(+), 19 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/rt/BreakpointManager.java b/frysk-core/frysk/rt/BreakpointManager.java
index 228496d..38ba58b 100644
--- a/frysk-core/frysk/rt/BreakpointManager.java
+++ b/frysk-core/frysk/rt/BreakpointManager.java
@@ -55,6 +55,7 @@ import frysk.proc.TaskObserver;
 import frysk.stepping.SteppingEngine;
 import frysk.util.CountDownLatch;
 import frysk.symtab.SymbolFactory;
+import frysk.symtab.DwflSymbol;
 import lib.dwfl.DwarfDie;
 
 /**
@@ -146,6 +147,15 @@ public class BreakpointManager extends Observable {
 
     /**
      * Create a function breakpoint not associated with any process
+     * @param symbol the symbol to breakpoint at
+     * @return FunctionBreakpoint object
+     */
+    public FunctionBreakpoint addFunctionBreakpoint(DwflSymbol symbol) {
+	return addFunctionBreakpoint(symbol.getName(), symbol.getDie());
+    }
+
+    /**
+     * Create a function breakpoint not associated with any process
      * @param name the name of the function
      * @param die a DwarfDie representing the function or inlined
      * instance. If null, a lookup against the Elf symbol name is
@@ -231,7 +241,7 @@ public class BreakpointManager extends Observable {
         managedProcs.add(proc);
 	// Assume that the Proc's main task is stopped.
         LinkedList sharedLibBptAddrs
-            = SymbolFactory.getSymbol(task, "_dl_debug_state");
+            = SymbolFactory.getAddresses(task, "_dl_debug_state");
         if (sharedLibBptAddrs.size() == 0)
             return;
         long sharedLibBptAddr
diff --git a/frysk-core/frysk/rt/ChangeLog b/frysk-core/frysk/rt/ChangeLog
index 57dd0f3..0e45ade 100644
--- a/frysk-core/frysk/rt/ChangeLog
+++ b/frysk-core/frysk/rt/ChangeLog
@@ -1,3 +1,13 @@
+2008-04-01  Petr Machata  <pmachata@redhat.com>
+
+	* FunctionBreakpoint.java: Call getAddresses instead of getSymbol.
+	* BreakpointManager.java: Likewise.
+
+2008-03-27  Petr Machata  <pmachata@redhat.com>
+
+	* BreakpointManager.java
+	(addFunctionBreakpoint(DwflSymbol)): New method.
+
 2008-03-20  Andrew Cagney  <cagney@redhat.com>
 
 	* BreakpointManager.java: Use ProcTasksAction and
diff --git a/frysk-core/frysk/rt/FunctionBreakpoint.java b/frysk-core/frysk/rt/FunctionBreakpoint.java
index 4f1355b..89b9596 100644
--- a/frysk-core/frysk/rt/FunctionBreakpoint.java
+++ b/frysk-core/frysk/rt/FunctionBreakpoint.java
@@ -89,7 +89,7 @@ public class FunctionBreakpoint
 	}
 	else {
             // Filter any null values that have sneaked in.
-            LinkedList addrs = SymbolFactory.getSymbol(task, name);
+            LinkedList addrs = SymbolFactory.getAddresses(task, name);
             Long nullVal = new Long(0);
             while (addrs.remove(nullVal)) {
             }
diff --git a/frysk-core/frysk/symtab/ChangeLog b/frysk-core/frysk/symtab/ChangeLog
index 1617f89..239d98e 100644
--- a/frysk-core/frysk/symtab/ChangeLog
+++ b/frysk-core/frysk/symtab/ChangeLog
@@ -1,3 +1,23 @@
+2008-04-01  Petr Machata  <pmachata@redhat.com>
+
+	* SymbolFactory.java (getSymbol): rename to getAddresses
+
+2008-03-21  Petr Machata  <pmachata@redhat.com>
+	* Symbol.java: Ctor takes new parameter, elf symbol type.
+	(isFunctionSymbol): New method.
+	* DwflSymbol.java: publish the class
+	(DwflSymbol): Both ctors now get ElfSymbolType argument
+	* SymbolFactory.java: Adjust to above.
+	* UnknownSymbol.java: Likewise.
+
+2008-03-21  Petr Machata  <pmachata@redhat.com>
+
+	* DwflSymbol.java
+	(dwarfDie): New field.
+	(DwflSymbol(long, long, String, DwarfDie)): New method.
+	(getDie): New method.
+	* SymbolFactory.java (getSymbols): New method.
+
 2008-03-21  Petr Machata  <pmachata@redhat.com>
 
 	* Symbol.java: Straighten dataflow here: internal data are set via
diff --git a/frysk-core/frysk/symtab/DwflSymbol.java b/frysk-core/frysk/symtab/DwflSymbol.java
index eab98cf..c7bb022 100644
--- a/frysk-core/frysk/symtab/DwflSymbol.java
+++ b/frysk-core/frysk/symtab/DwflSymbol.java
@@ -40,17 +40,33 @@
 package frysk.symtab;
 
 /**
- * A dwfl based symbol.
- *
- * Do not confuse this with higher-level symbolic information, such as
- * function names, obtained from debug information such as DWARF.
+ * A dwfl based symbol -- a symbol that, in addition to "simple" elf
+ * portion, optionally carries over dwarf die portion.
  */
 
-class DwflSymbol
+import lib.dwfl.DwarfDie;
+import lib.dwfl.ElfSymbolType;
+
+public class DwflSymbol
     extends Symbol
 {
+    private final DwarfDie dwarfDie;
+
     // package private constructor.
-    DwflSymbol(long address, long size, String name) {
-	super (address, size, name);
+    DwflSymbol(long address, long size, String name, ElfSymbolType type) {
+	super (address, size, name, type);
+	this.dwarfDie = null;
+    }
+
+    // package private constructor.
+    DwflSymbol(long address, long size, String name,
+	       ElfSymbolType type, DwarfDie dw)
+    {
+	super (address, size, name, type);
+	this.dwarfDie = dw;
+    }
+
+    public DwarfDie getDie() {
+	return this.dwarfDie;
     }
 }
diff --git a/frysk-core/frysk/symtab/Symbol.java b/frysk-core/frysk/symtab/Symbol.java
index fae9612..246b711 100644
--- a/frysk-core/frysk/symtab/Symbol.java
+++ b/frysk-core/frysk/symtab/Symbol.java
@@ -40,6 +40,7 @@
 package frysk.symtab;
 
 import lib.stdcpp.Demangler;
+import lib.dwfl.ElfSymbolType;
 
 /**
  * The object-file symbol.  Typically obtained by reading ELF
@@ -55,12 +56,14 @@ public class Symbol {
     private final long size;
     private final String name;
     protected String demangledName = null;
+    private final ElfSymbolType type;
 
     // package private constructor.
-    Symbol(long address, long size, String name) {
+    Symbol(long address, long size, String name, ElfSymbolType type) {
 	this.address = address;
 	this.size = size;
 	this.name = name;
+	this.type = type;
     }
 
     /**
@@ -103,4 +106,8 @@ public class Symbol {
     public String toString () {
 	return name + "@" + Long.toHexString (address) + ":" + size;
     }
+
+    public boolean isFunctionSymbol() {
+	return this.type == ElfSymbolType.ELF_STT_FUNC;
+    }
 }
diff --git a/frysk-core/frysk/symtab/SymbolFactory.java b/frysk-core/frysk/symtab/SymbolFactory.java
index 81e4f9e..8474407 100644
--- a/frysk-core/frysk/symtab/SymbolFactory.java
+++ b/frysk-core/frysk/symtab/SymbolFactory.java
@@ -40,13 +40,20 @@
 
 package frysk.symtab;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import frysk.dwfl.DwflCache;
 import frysk.proc.Task;
 import frysk.rsl.Log;
 import frysk.rsl.LogFactory;
 
+import lib.dwfl.ElfSymbol;
+import lib.dwfl.DwarfDie;
 import lib.dwfl.Dwfl;
 import lib.dwfl.DwflModule;
 import lib.dwfl.SymbolBuilder;
@@ -61,6 +68,7 @@ import lib.dwfl.SymbolBuilder;
 
 public class SymbolFactory
 {
+    private static final Log fine = LogFactory.fine(SymbolFactory.class);
     private static final Log warning = LogFactory.warning(SymbolFactory.class);
 
     /**
@@ -91,7 +99,7 @@ public class SymbolFactory
 		    warning.log("Symbol", name, "reported on address", value,
 				"where symbol was already reported:", symbol.getName());
 		else if (name != null)
-		    symbol = new DwflSymbol (value, size, name);
+		    symbol = new DwflSymbol (value, size, name, type);
 	    }
 	}
 	Builder builder = new Builder();
@@ -103,13 +111,57 @@ public class SymbolFactory
 	return builder.symbol;
     }
 
+
+    /**
+     * Return symbols in given DwflModule.
+     * @return List&lt;DwflSymbol&gt;
+     */
+    public static List getSymbols(DwflModule module) {
+	Map dwSymbols = new HashMap();
+	for (Iterator it = module.getPubNames().iterator(); it.hasNext(); ) {
+	    DwarfDie die = (DwarfDie)it.next();
+	    dwSymbols.put(die.getName(), die);
+	}
+
+	LinkedList symbols = new LinkedList();
+	Map elfSymbols = new HashMap();
+	for (Iterator it = module.getSymtab().iterator(); it.hasNext(); ) {
+	    ElfSymbol sym = (ElfSymbol)it.next();
+	    DwarfDie die = (DwarfDie)dwSymbols.get(sym.getName());
+	    symbols.add(new DwflSymbol(sym.getAddress(), sym.getSize(),
+				       sym.getName(), sym.getType(), die));
+	    elfSymbols.put(sym.getName(), sym);
+	}
+	fine.log("Got", symbols.size(), "symbols after sweep over symtabs.");
+
+	// This will probably not add anything, but just to make sure...
+	for (Iterator it = dwSymbols.entrySet().iterator(); it.hasNext(); ) {
+	    Map.Entry entry = (Map.Entry)it.next();
+	    String name = (String)entry.getKey();
+	    if (!elfSymbols.containsKey(name)) {
+		DwarfDie die = (DwarfDie)entry.getValue();
+		ArrayList entries = die.getEntryBreakpoints();
+		if (entries != null) {
+		    long addr = ((Long)entries.get(0)).longValue();
+		    long size = die.getHighPC() - die.getLowPC();
+		    lib.dwfl.ElfSymbolType type = null; // XXX fixme
+		    symbols.add(new DwflSymbol(addr, size, die.getName(),
+					       type, die));
+		}
+	    }
+	}
+	fine.log("Got", symbols.size(), "symbols after sweep over debuginfo.");
+
+	return symbols;
+    }
+
     /**
      * Get address list by symbol name.
      * @param task
      * @param name
      * @return address list
      */
-    public static LinkedList getSymbol(Task task, String name) {
+    public static LinkedList getAddresses(Task task, String name) {
 	Dwfl dwfl = DwflCache.getDwfl(task);
 	DwflModule[] modules = dwfl.getModules();
 	final LinkedList addrs = new LinkedList();
diff --git a/frysk-core/frysk/symtab/UnknownSymbol.java b/frysk-core/frysk/symtab/UnknownSymbol.java
index 13b1933..eb8b5b6 100644
--- a/frysk-core/frysk/symtab/UnknownSymbol.java
+++ b/frysk-core/frysk/symtab/UnknownSymbol.java
@@ -39,6 +39,8 @@
 
 package frysk.symtab;
 
+import lib.dwfl.ElfSymbolType;
+
 /**
  * An unknown-symbol; a singleton.
  */
@@ -47,7 +49,7 @@ class UnknownSymbol
     extends Symbol
 {
     UnknownSymbol() {
-	super(0, -1, "[unknown]");
+	super(0, -1, "[unknown]", ElfSymbolType.ELF_STT_NOTYPE);
 	demangledName = getName();
     }
 }
diff --git a/frysk-gui/frysk/gui/ChangeLog b/frysk-gui/frysk/gui/ChangeLog
index c4ab86a..509718b 100644
--- a/frysk-gui/frysk/gui/ChangeLog
+++ b/frysk-gui/frysk/gui/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-01  Petr Machata  <pmachata@redhat.com>
+
+	* disassembler/DisassemblyWindow.java: Call getAddresses instead of getSymbol.
+	* memory/MemoryWindow.java: Likewise.
+
 2008-03-17  Sami Wagiaalla  <swagiaal@redhat.com>
 
 	* test/StressTestJGMemory.java: New test.
diff --git a/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java b/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java
index 3160ad4..7fae8f1 100644
--- a/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java
+++ b/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java
@@ -1023,7 +1023,7 @@ public class DisassemblyWindow
    */
   private synchronized void handleSymbol(String symbolName)
   {
-      LinkedList addressList = SymbolFactory.getSymbol(this.myTask, symbolName);
+      LinkedList addressList = SymbolFactory.getAddresses(this.myTask, symbolName);
       long startAddress = ((Long)addressList.getFirst()).longValue();
       Symbol symbol = SymbolFactory.getSymbol(this.myTask, startAddress);
       long endAddress = symbol.getAddress() + symbol.getSize();
diff --git a/frysk-gui/frysk/gui/memory/MemoryWindow.java b/frysk-gui/frysk/gui/memory/MemoryWindow.java
index a7d711b..5c3d19a 100644
--- a/frysk-gui/frysk/gui/memory/MemoryWindow.java
+++ b/frysk-gui/frysk/gui/memory/MemoryWindow.java
@@ -954,7 +954,7 @@ public class MemoryWindow
    */
   private synchronized void handleSymbol(String symbolName)
   {
-      LinkedList addressList = SymbolFactory.getSymbol(this.myTask, symbolName);
+      LinkedList addressList = SymbolFactory.getAddresses(this.myTask, symbolName);
       long startAddress = ((Long)addressList.getFirst()).longValue();
       fromSpin.setValue((double)startAddress);
   }  
diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog
index 4aaa042..ce686b5 100644
--- a/frysk-sys/lib/dwfl/ChangeLog
+++ b/frysk-sys/lib/dwfl/ChangeLog
@@ -5,6 +5,20 @@
 
 2008-03-21  Petr Machata  <pmachata@redhat.com>
 
+	* ElfSymbol.java (type): New field.
+	(DwflSymbol): Ctor now gets ElfSymbolType argument
+	(getType): New accessor method.
+	* cni/DwflModule.cxx (get_symbol_table): Adjust to above.
+
+2008-03-21  Petr Machata  <pmachata@redhat.com>
+
+	* DwflModule.java (getSymtab): New method.
+	(symbolTable): New field.
+	(get_symbol_table): New native method...
+	* cni/DwflModule.cxx (get_symbol_table): ... and its implementation.
+
+2008-03-21  Petr Machata  <pmachata@redhat.com>
+
 	* cni/DwflModule.cxx (builder_callout): Pass GElf_Sym as pointer.
 	(getSymbol, getSymbolByName): Adjust.
 
diff --git a/frysk-sys/lib/dwfl/DwflModule.java b/frysk-sys/lib/dwfl/DwflModule.java
index 6ddf2c1..e411599 100644
--- a/frysk-sys/lib/dwfl/DwflModule.java
+++ b/frysk-sys/lib/dwfl/DwflModule.java
@@ -48,6 +48,7 @@ public class DwflModule
 {
 
     protected LinkedList pubNames;
+    protected LinkedList symbolTable;
     
     protected long bias;
   
@@ -92,11 +93,20 @@ public class DwflModule
 	return pubNames;
     }
     private native void get_pubnames();
-    
-    
+
+    public LinkedList getSymtab() {
+	if (this.symbolTable == null) {
+	    this.symbolTable = new LinkedList();
+	    get_symbol_table();
+	}
+	return symbolTable;
+    }
+    private native void get_symbol_table();
+
+
     protected DwarfDie getDieByOffset(long offset){
 	return offdie(this.getPointer(), offset);
-    }    
+    }
     private native DwarfDie offdie(long die, long offset);
 
     
diff --git a/frysk-sys/lib/dwfl/ElfSymbol.java b/frysk-sys/lib/dwfl/ElfSymbol.java
index 5c846bb..1e18c0e 100644
--- a/frysk-sys/lib/dwfl/ElfSymbol.java
+++ b/frysk-sys/lib/dwfl/ElfSymbol.java
@@ -56,11 +56,14 @@ public class ElfSymbol {
     private final long address;
     private final long size;
     private final String name;
+    private final ElfSymbolType type;
 
-    protected ElfSymbol(long address, long size, String name) {
+    protected ElfSymbol(long address, long size, String name,
+			ElfSymbolType type) {
 	this.address = address;
 	this.size = size;
 	this.name = name;
+	this.type = type;
     }
 
     /**
@@ -89,6 +92,14 @@ public class ElfSymbol {
     }
 
     /**
+     * Return the symbol type.
+     */
+    public ElfSymbolType getType ()
+    {
+	return type;
+    }
+
+    /**
      * Dump the symbol's contents.
      */
     public String toString ()
diff --git a/frysk-sys/lib/dwfl/cni/DwflModule.cxx b/frysk-sys/lib/dwfl/cni/DwflModule.cxx
index 317637a..b089125 100644
--- a/frysk-sys/lib/dwfl/cni/DwflModule.cxx
+++ b/frysk-sys/lib/dwfl/cni/DwflModule.cxx
@@ -51,6 +51,7 @@
 #include "lib/dwfl/ModuleElfBias.h"
 #include "lib/dwfl/SymbolBuilder.h"
 #include "lib/dwfl/Elf.h"
+#include "lib/dwfl/ElfSymbol.h"
 #include "lib/dwfl/ElfSymbolBinding.h"
 #include "lib/dwfl/ElfSymbolType.h"
 #include "lib/dwfl/ElfSymbolVisibility.h"
@@ -159,6 +160,26 @@ lib::dwfl::DwflModule::getSymbol(jlong address,
 }
 
 void
+lib::dwfl::DwflModule::get_symbol_table()
+{
+  Dwfl_Module *module = (Dwfl_Module *)this->pointer;
+  int count = ::dwfl_module_getsymtab (module);
+  if (count < 0)
+    return;
+
+  for (int i = 0; i < count; ++i)
+    {
+      ::GElf_Sym sym;
+      char const* name = ::dwfl_module_getsym (module, i, &sym, NULL);
+      ElfSymbolType * type
+	= ElfSymbolType::intern(ELF64_ST_TYPE(sym.st_info));
+      lib::dwfl::ElfSymbol *elf_symbol
+	= new ElfSymbol(sym.st_value, sym.st_size, JvNewStringUTF(name), type);
+      this->symbolTable->add(elf_symbol);
+    }
+}
+
+void
 lib::dwfl::DwflModule::getSymbolByName(jstring name,
 				     lib::dwfl::SymbolBuilder* symbolBuilder)
 {


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-04-04  0:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-04-04  0:29 [SCM] master: Rename SymbolFactory.getSymbol to getAddresses pmachata

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