From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14684 invoked by alias); 1 Apr 2008 16:29:56 -0000 Received: (qmail 14654 invoked by uid 9697); 1 Apr 2008 16:29:56 -0000 Date: Tue, 01 Apr 2008 16:29:00 -0000 Message-ID: <20080401162955.14639.qmail@sourceware.org> From: pmachata@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Straighten dataflow in symtab package X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ff5c661252807c07e2bd8a43b0bb10a063aa6604 X-Git-Newrev: 89357dc08ace444dcd728b44da5985eb6b5f2406 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/msg00005.txt.bz2 The branch, master has been updated via 89357dc08ace444dcd728b44da5985eb6b5f2406 (commit) via 525f9102034e7598e68b2124042fe67bc814c429 (commit) via 15d74182a68f23a3b1bc86cd1fe950e5b8fbbb9d (commit) from ff5c661252807c07e2bd8a43b0bb10a063aa6604 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 89357dc08ace444dcd728b44da5985eb6b5f2406 Author: Petr Machata Date: Fri Mar 21 14:47:29 2008 +0100 Straighten dataflow in symtab package commit 525f9102034e7598e68b2124042fe67bc814c429 Author: Petr Machata Date: Thu Mar 20 23:34:16 2008 +0100 Use dedicated types for type/binding/visibility in SymbolBuilder commit 15d74182a68f23a3b1bc86cd1fe950e5b8fbbb9d Author: Petr Machata Date: Fri Mar 21 13:43:03 2008 +0100 Add new logging functions ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/proc/ChangeLog | 5 ++ frysk-core/frysk/proc/TestInstructions.java | 4 +- frysk-core/frysk/proc/dead/ChangeLog | 5 ++ frysk-core/frysk/proc/dead/TestLinuxCore.java | 4 +- frysk-core/frysk/proc/live/ChangeLog | 14 ++++ .../frysk/proc/live/TestTaskObserverCode.java | 4 +- frysk-core/frysk/symtab/ChangeLog | 15 ++++ frysk-core/frysk/symtab/DwflSymbol.java | 9 +-- frysk-core/frysk/symtab/Symbol.java | 16 +--- frysk-core/frysk/symtab/SymbolFactory.java | 47 +++++++++--- frysk-core/frysk/symtab/UnknownSymbol.java | 2 +- frysk-sys/frysk/rsl/ChangeLog | 16 ++++ frysk-sys/frysk/rsl/Log.java | 22 ++++++- frysk-sys/lib/dwfl/ChangeLog | 11 +++ frysk-sys/lib/dwfl/SymbolBuilder.java | 6 +- frysk-sys/lib/dwfl/cni/DwflModule.cxx | 73 ++++++++++++-------- 16 files changed, 188 insertions(+), 65 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/proc/ChangeLog b/frysk-core/frysk/proc/ChangeLog index f9653af..6a11424 100644 --- a/frysk-core/frysk/proc/ChangeLog +++ b/frysk-core/frysk/proc/ChangeLog @@ -19,6 +19,11 @@ * StressAttachDetachRapidlyForkingMainTask.java: Update. * TestProcTasksObserver.java: Update. +2008-03-20 Petr Machata + + * TestInstructions.java (Symbol): Pass type, bind, visibility as + full-fledged objects. + 2008-03-17 Andrew Cagney * TestTaskObserver.java (attachDieingTask(int,boolean)): Do not diff --git a/frysk-core/frysk/proc/TestInstructions.java b/frysk-core/frysk/proc/TestInstructions.java index 698de98..c91eb3d 100644 --- a/frysk-core/frysk/proc/TestInstructions.java +++ b/frysk-core/frysk/proc/TestInstructions.java @@ -111,7 +111,9 @@ public class TestInstructions } public void symbol(String name, long value, long size, - int type, int bind, int visibility) + ElfSymbolType type, + ElfSymbolBinding bind, + ElfSymbolVisibility visibility) { if (name.equals(this.name)) { diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog index 78157b4..38def17 100644 --- a/frysk-core/frysk/proc/dead/ChangeLog +++ b/frysk-core/frysk/proc/dead/ChangeLog @@ -21,6 +21,11 @@ (createProc): Likewise. * LinuxCoreProc.java (getExeFile): New. +2008-03-20 Petr Machata + + * TestLinuxCore.java (Symbol): Pass type, bind, visibility as + full-fledged objects. + 2008-03-17 Andrew Cagney * DeadProc.java (requestRefresh()): Delete. diff --git a/frysk-core/frysk/proc/dead/TestLinuxCore.java b/frysk-core/frysk/proc/dead/TestLinuxCore.java index 4e272f4..3102867 100644 --- a/frysk-core/frysk/proc/dead/TestLinuxCore.java +++ b/frysk-core/frysk/proc/dead/TestLinuxCore.java @@ -487,7 +487,9 @@ public class TestLinuxCore extends TestLib { } public void symbol(String name, long value, long size, - int type, int bind, int visibility) + lib.dwfl.ElfSymbolType type, + lib.dwfl.ElfSymbolBinding bind, + lib.dwfl.ElfSymbolVisibility visibility) { if (name.equals(this.name)) { diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog index 1a63ddd..916c297 100644 --- a/frysk-core/frysk/proc/live/ChangeLog +++ b/frysk-core/frysk/proc/live/ChangeLog @@ -6,6 +6,20 @@ * LinuxPtraceProc.java (getExeFile): New. +2008-03-26 Phil Muldoon + + * Isa.java (setWatchpoint): New Interface + (deleteWatchpoint): Ditto. + (getWatchpointCount): Ditto. + * LinuxX8664.java: Add above interfaces. + * LinuxIA32.java: Ditto. + * IsaPowerPC.java: Ditto. + +2008-03-20 Petr Machata + + * TestTaskObserverCode.java (Symbol): Pass type, bind, visibility + as full-fledged objects. + 2008-03-18 Andrew Cagney * LinuxPtraceHost.java (removeProc(LinuxPtraceProc)): Replace diff --git a/frysk-core/frysk/proc/live/TestTaskObserverCode.java b/frysk-core/frysk/proc/live/TestTaskObserverCode.java index dbb9922..62108f2 100644 --- a/frysk-core/frysk/proc/live/TestTaskObserverCode.java +++ b/frysk-core/frysk/proc/live/TestTaskObserverCode.java @@ -355,7 +355,9 @@ public class TestTaskObserverCode extends TestLib } public void symbol(String name, long value, long size, - int type, int bind, int visibility) + lib.dwfl.ElfSymbolType type, + lib.dwfl.ElfSymbolBinding bind, + lib.dwfl.ElfSymbolVisibility visibility) { if (name.equals(this.name)) { diff --git a/frysk-core/frysk/symtab/ChangeLog b/frysk-core/frysk/symtab/ChangeLog index d04147d..1617f89 100644 --- a/frysk-core/frysk/symtab/ChangeLog +++ b/frysk-core/frysk/symtab/ChangeLog @@ -1,3 +1,18 @@ +2008-03-21 Petr Machata + + * Symbol.java: Straighten dataflow here: internal data are set via + ctor and are final, instead of using "symbol" method for that. + (symbol): Two methods of that name erased. + * DwflSymbol.java: Don't implement SymbolBuilder. + * SymbolFactory.java (getSymbol): Implement builder locally. + * UnknownSymbol.java: Call super ctor instead of super.symbol. + +2008-03-20 Petr Machata + + * DwflSymbol.java: Pass type, bind, visibility as full-fledged + objects. + * SymbolFactory.java (getSymbol): Likewise. + 2008-03-14 Tim Moore * TestSymbol.java (testLocalInGlobal, testNoSymbolAfterGlobal diff --git a/frysk-core/frysk/symtab/DwflSymbol.java b/frysk-core/frysk/symtab/DwflSymbol.java index b6035c1..eab98cf 100644 --- a/frysk-core/frysk/symtab/DwflSymbol.java +++ b/frysk-core/frysk/symtab/DwflSymbol.java @@ -39,8 +39,6 @@ package frysk.symtab; -import lib.dwfl.SymbolBuilder; - /** * A dwfl based symbol. * @@ -50,10 +48,9 @@ import lib.dwfl.SymbolBuilder; class DwflSymbol extends Symbol - implements SymbolBuilder { - public void symbol(String name, long value, long size, int type, - int bind, int visibility) { - super.symbol(value, size, name); + // package private constructor. + DwflSymbol(long address, long size, String name) { + super (address, size, name); } } diff --git a/frysk-core/frysk/symtab/Symbol.java b/frysk-core/frysk/symtab/Symbol.java index 617ec8e..767ac5e 100644 --- a/frysk-core/frysk/symtab/Symbol.java +++ b/frysk-core/frysk/symtab/Symbol.java @@ -52,25 +52,17 @@ import lib.stdcpp.Demangler; public class Symbol { // The symbol's fields. - private long address; - private long size; - private String name; + private final long address; + private final long size; + private final String name; private String demangledName; // package private constructor. - Symbol() { - } - - void symbol(long address, long size, String name) { + Symbol(long address, long size, String name) { this.address = address; this.size = size; this.name = name; } - void symbol(long address, String name) { - this.address = address; - this.size = 0; - this.name = name; - } /** * Return the address of the symbol. diff --git a/frysk-core/frysk/symtab/SymbolFactory.java b/frysk-core/frysk/symtab/SymbolFactory.java index 70ecf22..81e4f9e 100644 --- a/frysk-core/frysk/symtab/SymbolFactory.java +++ b/frysk-core/frysk/symtab/SymbolFactory.java @@ -41,8 +41,12 @@ package frysk.symtab; import java.util.LinkedList; -import frysk.proc.Task; + import frysk.dwfl.DwflCache; +import frysk.proc.Task; +import frysk.rsl.Log; +import frysk.rsl.LogFactory; + import lib.dwfl.Dwfl; import lib.dwfl.DwflModule; import lib.dwfl.SymbolBuilder; @@ -57,6 +61,8 @@ import lib.dwfl.SymbolBuilder; public class SymbolFactory { + private static final Log warning = LogFactory.warning(SymbolFactory.class); + /** * A special unknown symbol. */ @@ -74,14 +80,29 @@ public class SymbolFactory if (module == null) return UNKNOWN; - DwflSymbol symbol = new DwflSymbol(); - module.getSymbol(address, symbol); - if (symbol.getName() == null) + class Builder implements SymbolBuilder { + public DwflSymbol symbol = null; + public void symbol(String name, long value, long size, + lib.dwfl.ElfSymbolType type, + lib.dwfl.ElfSymbolBinding bind, + lib.dwfl.ElfSymbolVisibility visibility) + { + if (symbol != null) + 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); + } + } + Builder builder = new Builder(); + + module.getSymbol(address, builder); + if (builder.symbol == null) return UNKNOWN; - return symbol; + return builder.symbol; } - + /** * Get address list by symbol name. * @param task @@ -94,14 +115,16 @@ public class SymbolFactory 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)); - } + lib.dwfl.ElfSymbolType type, + lib.dwfl.ElfSymbolBinding bind, + lib.dwfl.ElfSymbolVisibility visibility) + { + addrs.add(new Long(value)); + } }; - for (int i = 0; i < modules.length; i++) - { + for (int i = 0; i < modules.length; i++) { DwflModule module = modules[i]; - module.getSymbolByName(name, builder); + module.getSymbolByName(name, builder); } if (addrs.size() == 0) throw new RuntimeException("Couldn't find symbol " + name); diff --git a/frysk-core/frysk/symtab/UnknownSymbol.java b/frysk-core/frysk/symtab/UnknownSymbol.java index 13ca331..314c437 100644 --- a/frysk-core/frysk/symtab/UnknownSymbol.java +++ b/frysk-core/frysk/symtab/UnknownSymbol.java @@ -47,7 +47,7 @@ class UnknownSymbol extends Symbol { UnknownSymbol() { - super.symbol(0, -1, "[unknown]"); + super(0, -1, "[unknown]"); } public String getDemangledName () { return "[unknown]"; diff --git a/frysk-sys/frysk/rsl/ChangeLog b/frysk-sys/frysk/rsl/ChangeLog index 9389696..27d3ded 100644 --- a/frysk-sys/frysk/rsl/ChangeLog +++ b/frysk-sys/frysk/rsl/ChangeLog @@ -1,3 +1,19 @@ +2008-03-31 Petr Machata + + * Log.java (log(String,Object,String,long,String,long)): New. + +2008-03-28 Petr Machata + + * Log.java (log(String,Object,String,Object,String,long)): New. + +2008-03-21 Petr Machata + + * Log.java (log(String,int,String)): New. + +2008-03-21 Petr Machata + + * Log.java (log(String,Object,String,long,String,Object)): New. + 2008-03-17 Andrew Cagney * Log.java (log(String,Object,String,Object,String,int)): New. diff --git a/frysk-sys/frysk/rsl/Log.java b/frysk-sys/frysk/rsl/Log.java index 2ceaac4..1c5d705 100644 --- a/frysk-sys/frysk/rsl/Log.java +++ b/frysk-sys/frysk/rsl/Log.java @@ -389,6 +389,11 @@ public final class Log { } // static 3 parameters + public void log(String p1, int p2, String p3) { + if (!logging) + return; + prefix().print(p1).print(p2).print(p3).suffix(); + } public void log(String p1, Object p2, String p3) { if (!logging) return; @@ -447,6 +452,21 @@ public final class Log { return; prefix().print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).suffix(); } + public void log(String p1, Object p2, String p3, Object p4, String p5, long p6) { + if (!logging) + return; + prefix().print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).suffix(); + } + public void log(String p1, Object p2, String p3, long p4, String p5, Object p6) { + if (!logging) + return; + prefix().print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).suffix(); + } + public void log(String p1, Object p2, String p3, long p4, String p5, long p6) { + if (!logging) + return; + prefix().print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).suffix(); + } // static 8 parameters public void log(String p1, int p2, String p3, Object p4, String p5, Object p6, String p7, int p8) { @@ -469,7 +489,7 @@ public final class Log { return; prefix().print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).print(p7).print(p8).suffix(); } - + // Non-static log methods; first parameter is the object. // dynamic 1 parameter diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog index d7fe24a..92193b0 100644 --- a/frysk-sys/lib/dwfl/ChangeLog +++ b/frysk-sys/lib/dwfl/ChangeLog @@ -3,6 +3,17 @@ * cni/DwflLine.cxx (DwflLine::dwfl_linecomp_dir): added NULL check. +2008-03-20 Petr Machata + + * SymbolBuilder.java: Pass type, bind, visibility as full-fledged + objects. + * cni/DwflModule.cxx (builder_callout): New function, calls + builder with the right arguments. + (getSymbol): Reindent, call builder_callout + (getSymbolByName): call builder_callout + (callback): Rename to each_pubname + (get_pubnames): Adjust to above + 2008-03-13 Tim Moore * cni/Dwfl.cxx: Add declaration for elfutils' diff --git a/frysk-sys/lib/dwfl/SymbolBuilder.java b/frysk-sys/lib/dwfl/SymbolBuilder.java index d98cb35..9b7e8d1 100644 --- a/frysk-sys/lib/dwfl/SymbolBuilder.java +++ b/frysk-sys/lib/dwfl/SymbolBuilder.java @@ -41,6 +41,8 @@ package lib.dwfl; public interface SymbolBuilder { - void symbol (String name, long value, long size, int type, int bind, - int visibility); + void symbol (String name, long value, long size, + ElfSymbolType type, + ElfSymbolBinding bind, + ElfSymbolVisibility visibility); } diff --git a/frysk-sys/lib/dwfl/cni/DwflModule.cxx b/frysk-sys/lib/dwfl/cni/DwflModule.cxx index 5cfdd09..e76aef2 100644 --- a/frysk-sys/lib/dwfl/cni/DwflModule.cxx +++ b/frysk-sys/lib/dwfl/cni/DwflModule.cxx @@ -51,6 +51,9 @@ #include "lib/dwfl/ModuleElfBias.h" #include "lib/dwfl/SymbolBuilder.h" #include "lib/dwfl/Elf.h" +#include "lib/dwfl/ElfSymbolBinding.h" +#include "lib/dwfl/ElfSymbolType.h" +#include "lib/dwfl/ElfSymbolVisibility.h" #include "lib/dwfl/DwarfDieFactory.h" #include "lib/dwfl/Dwfl.h" #include "lib/dwfl/DwException.h" @@ -112,29 +115,47 @@ lib::dwfl::DwflModule::getLines(jstring filename, jint lineno, jint column) return array; } return 0; -} +} + +namespace { + void builder_callout(lib::dwfl::SymbolBuilder *symbolBuilder, + jstring name, ::GElf_Sym sym) + { + using lib::dwfl::ElfSymbolType; + using lib::dwfl::ElfSymbolBinding; + using lib::dwfl::ElfSymbolVisibility; + + ElfSymbolType * type + = ElfSymbolType::intern(ELF64_ST_TYPE(sym.st_info)); + ElfSymbolBinding * bind + = ElfSymbolBinding::intern(ELF64_ST_BIND(sym.st_info)); + ElfSymbolVisibility * visibility + = ElfSymbolVisibility::intern(ELF64_ST_VISIBILITY(sym.st_other)); + + symbolBuilder->symbol(name, + sym.st_value, + sym.st_size, + type, bind, visibility); + } +} void -lib::dwfl::DwflModule::getSymbol(jlong address, lib::dwfl::SymbolBuilder* symbolBuilder) +lib::dwfl::DwflModule::getSymbol(jlong address, + lib::dwfl::SymbolBuilder *symbolBuilder) { - Dwarf_Addr addr = (Dwarf_Addr) address; - GElf_Sym closest_sym; - - const char* methName = dwfl_module_addrsym(DWFL_MODULE_POINTER, addr, - &closest_sym, NULL); - - jstring jMethodName; - if (methName == NULL) - jMethodName = NULL; - else - jMethodName = JvNewStringUTF(methName); - - symbolBuilder->symbol(jMethodName, - closest_sym.st_value, - closest_sym.st_size, - ELF64_ST_TYPE(closest_sym.st_info), - ELF64_ST_BIND(closest_sym.st_info), - closest_sym.st_other); + Dwarf_Addr addr = (Dwarf_Addr) address; + GElf_Sym closest_sym; + + const char* methName = dwfl_module_addrsym(DWFL_MODULE_POINTER, addr, + &closest_sym, NULL); + + jstring jMethodName; + if (methName == NULL) + jMethodName = NULL; + else + jMethodName = JvNewStringUTF(methName); + + ::builder_callout(symbolBuilder, jMethodName, closest_sym); } void @@ -151,12 +172,7 @@ lib::dwfl::DwflModule::getSymbolByName(jstring name, GElf_Sym sym; const char *symName = dwfl_module_getsym(DWFL_MODULE_POINTER, i, &sym, 0); if (!::strcmp(rawName, symName)) - symbolBuilder->symbol(JvNewStringUTF(symName), - sym.st_value, - sym.st_size, - ELF64_ST_TYPE(sym.st_info), - ELF64_ST_BIND(sym.st_info), - sym.st_other); + ::builder_callout (symbolBuilder, JvNewStringUTF(symName), sym); } } @@ -205,7 +221,7 @@ lib::dwfl::DwflModule::getDebuginfo() } static int -callback (Dwarf *dwarf, Dwarf_Global *gl, void* thisObject) +each_pubname (Dwarf *dwarf, Dwarf_Global *gl, void* thisObject) { lib::dwfl::DwflModule* dwflModule = (lib::dwfl::DwflModule*)thisObject; @@ -230,7 +246,8 @@ lib::dwfl::DwflModule::get_pubnames() Dwarf_Addr bias; ::Dwarf* dwarf = dwfl_module_getdwarf ((Dwfl_Module*)this->pointer, &bias); hooks/post-receive -- frysk system monitor/debugger