From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14294 invoked by alias); 4 Apr 2008 00:29:40 -0000 Received: (qmail 14262 invoked by uid 9697); 4 Apr 2008 00:29:38 -0000 Date: Fri, 04 Apr 2008 00:29:00 -0000 Message-ID: <20080404002938.14247.qmail@sourceware.org> From: pmachata@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Rename SymbolFactory.getSymbol to getAddresses X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ae7d5f2086a6fcd8f18e74223c6075476db0e0bb X-Git-Newrev: 73baf44bbc8df85147fc09136607a327e2c9eeb3 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00041.txt.bz2 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 Date: Tue Apr 1 23:19:36 2008 +0200 Rename SymbolFactory.getSymbol to getAddresses commit 9004c27a7ea3560c399e5d17d0f6cd813192ead4 Author: Petr Machata Date: Thu Mar 27 14:52:27 2008 +0100 Allow creating breakpoint from DwflSymbol commit 0809770046b2f78401f6a5d80a6fb346a565715a Author: Petr Machata Date: Fri Mar 21 20:26:50 2008 +0100 Record symbol type at Symbol classes commit 6ba88f88a3247f6391404928bf3eeec8ed3cc270 Author: Petr Machata 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 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 + + * FunctionBreakpoint.java: Call getAddresses instead of getSymbol. + * BreakpointManager.java: Likewise. + +2008-03-27 Petr Machata + + * BreakpointManager.java + (addFunctionBreakpoint(DwflSymbol)): New method. + 2008-03-20 Andrew Cagney * 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 + + * SymbolFactory.java (getSymbol): rename to getAddresses + +2008-03-21 Petr Machata + * 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 + + * 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 * 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<DwflSymbol> + */ + 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 + + * disassembler/DisassemblyWindow.java: Call getAddresses instead of getSymbol. + * memory/MemoryWindow.java: Likewise. + 2008-03-17 Sami Wagiaalla * 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 + * 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 + + * 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 + * 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