From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5748 invoked by alias); 9 May 2008 20:02:50 -0000 Received: (qmail 5723 invoked by uid 9561); 9 May 2008 20:02:50 -0000 Date: Fri, 09 May 2008 20:02:00 -0000 Message-ID: <20080509200250.5708.qmail@sourceware.org> From: swagiaal@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: swagiaal: Added support for [file#]name lookup X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 3a67b7fb24ac50fc6ad63b2672084c5691526fb6 X-Git-Newrev: 88dee672fef4050c808116f20e45765bf5c231d8 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/msg00219.txt.bz2 The branch, master has been updated via 88dee672fef4050c808116f20e45765bf5c231d8 (commit) from 3a67b7fb24ac50fc6ad63b2672084c5691526fb6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 88dee672fef4050c808116f20e45765bf5c231d8 Author: Sami Wagiaalla Date: Fri May 9 15:08:40 2008 -0400 swagiaal: Added support for [file#]name lookup frysk-core/ChangeLog +2008-05-09 Sami Wagiaalla + + * Makefile.am: Corred rule for compiling + funit-scopes-multi-file + frysk-core/frysk/debuginfo/ChangeLog +2008-05-09 Sami Wagiaalla + + * ObjectDeclarationSearchEngine.java (getObject): Added support + for [file#]name lookup + * TestObjectDeclarationSearchEngineTopDown.java + (testGetObjectHashFileHashSymbol): enabled test. + frysk-core/frysk/scopes/ChangeLog +2008-05-09 Sami Wagiaalla + + * Scope.java (getDeclaredObjectByNameRecursive): Added + support for recursive search. + frysk-sys/lib/dwfl/ChangeLog +2008-05-09 Sami Wagiaalla + + * cni/Dwarf.cxx (Dwarf::get_cu_by_name): New. + +2008-05-09 Sami Wagiaalla + + * Dwarf.java (getCUByName): New. + ----------------------------------------------------------------------- Summary of changes: frysk-core/ChangeLog | 5 ++ frysk-core/Makefile.am | 7 ++- frysk-core/frysk/debuginfo/ChangeLog | 7 +++ .../debuginfo/ObjectDeclarationSearchEngine.java | 56 +++++++++++++++----- .../TestObjectDeclarationSearchEngineTopDown.java | 10 ++-- frysk-core/frysk/scopes/ChangeLog | 5 ++ frysk-core/frysk/scopes/Scope.java | 46 +++++++++++++++- frysk-sys/lib/dwfl/ChangeLog | 8 +++ frysk-sys/lib/dwfl/Dwarf.java | 19 ++++++- frysk-sys/lib/dwfl/cni/Dwarf.cxx | 45 +++++++++++++++- 10 files changed, 181 insertions(+), 27 deletions(-) First 500 lines of diff: diff --git a/frysk-core/ChangeLog b/frysk-core/ChangeLog index c038034..9e44b4a 100644 --- a/frysk-core/ChangeLog +++ b/frysk-core/ChangeLog @@ -1,3 +1,8 @@ +2008-05-09 Sami Wagiaalla + + * Makefile.am: Corred rule for compiling + funit-scopes-multi-file + 2008-05-02 Rick Moseley * Makefile.am: Remove CDTParser. diff --git a/frysk-core/Makefile.am b/frysk-core/Makefile.am index 7894a50..6c41855 100644 --- a/frysk-core/Makefile.am +++ b/frysk-core/Makefile.am @@ -323,8 +323,9 @@ frysk/pkglibdir/FunitSimpleInterfaceTest: # The following links two files into one executable -frysk_pkglibdir_funit_scopes_multi_file_a_LINK = $(LINK) $(srcdir)/frysk/pkglibdir/funit-scopes-multi-file-b.c -DNO_MAIN -frysk_pkglibdir_funit_scopes_multi_file_b_LINK = $(LINK) $(srcdir)/frysk/pkglibdir/funit-scopes-multi-file-b.c -DNO_MAIN - +pkglib_PROGRAMS += frysk/pkglibdir/funit-scopes-multi-file +frysk_pkglibdir_funit_scopes_multi_file_SOURCES = +frysk/pkglibdir/funit-scopes-multi-file: + gcc -g $(srcdir)/frysk/pkglibdir/funit-scopes-multi-file-a.c $(srcdir)/frysk/pkglibdir/funit-scopes-multi-file-b.c -o frysk/pkglibdir/funit-scopes-multi-file diff --git a/frysk-core/frysk/debuginfo/ChangeLog b/frysk-core/frysk/debuginfo/ChangeLog index 9b5432c..f444ac0 100644 --- a/frysk-core/frysk/debuginfo/ChangeLog +++ b/frysk-core/frysk/debuginfo/ChangeLog @@ -1,3 +1,10 @@ +2008-05-09 Sami Wagiaalla + + * ObjectDeclarationSearchEngine.java (getObject): Added support + for [file#]name lookup + * TestObjectDeclarationSearchEngineTopDown.java + (testGetObjectHashFileHashSymbol): enabled test. + 2008-04-30 Stan Cox * TypeFactory.java (getGccStructOrClassType): Set dieHash. diff --git a/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java b/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java index 0f172e7..0efe281 100644 --- a/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java +++ b/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java @@ -92,33 +92,63 @@ public class ObjectDeclarationSearchEngine implements ExprSymTab{ * should be modified to * - use frysk search ({@link ObjectDeclarationSearchEngine}) * - handle # syntax - * ... + * ... + * handles: + * [file#]name + * */ public ObjectDeclaration getObject(String name) { - ObjectDeclaration result; + ObjectDeclaration result = null; + + DwarfDie cu; + String symbol; Elf elf = new Elf(new File(task.getProc().getExeFile().getSysRootedPath()), ElfCommand.ELF_C_READ); Dwarf dwarf = new Dwarf(elf, DwarfCommand.READ, null); - - DwarfDie resultDie = DwarfDie.getDecl(dwarf, name); TypeFactory typeFactory = new TypeFactory(task.getISA()); - if (resultDie == null) - throw new ObjectDeclarationNotFoundException(name); + String[] names = name.split("#"); + if(names.length == 2){ + LinkedList cuDies = dwarf.getCUByName(names[0]); + + if(cuDies.size() == 0){ + throw new ObjectDeclarationNotFoundException(names[0]); + }else{ + //XXX: modify this to use the entire list. + cu = (DwarfDie) cuDies.getFirst(); + } + + symbol = names[1]; + + Scope scope = ScopeFactory.theFactory.getScope(cu, typeFactory); + result = scope.getDeclaredObjectByNameRecursive(symbol); + } - try { - result = (ObjectDeclaration) ScopeFactory.theFactory.getScope(resultDie, typeFactory); - } catch (IllegalArgumentException e) { - try { - result = new Variable(resultDie); - } catch (Exception e2) { + if (names.length == 1) { + DwarfDie resultDie = DwarfDie.getDecl(dwarf, name); + + if (resultDie == null) throw new ObjectDeclarationNotFoundException(name); + + try { + result = (ObjectDeclaration) ScopeFactory.theFactory.getScope( + resultDie, typeFactory); + } catch (IllegalArgumentException e) { + try { + result = new Variable(resultDie); + } catch (Exception e2) { + throw new ObjectDeclarationNotFoundException(name); + } } } - return (ObjectDeclaration)result; + if (result == null) { + throw new ObjectDeclarationNotFoundException(name); + } + + return result; } /** diff --git a/frysk-core/frysk/debuginfo/TestObjectDeclarationSearchEngineTopDown.java b/frysk-core/frysk/debuginfo/TestObjectDeclarationSearchEngineTopDown.java index 7ac0c05..8764737 100644 --- a/frysk-core/frysk/debuginfo/TestObjectDeclarationSearchEngineTopDown.java +++ b/frysk-core/frysk/debuginfo/TestObjectDeclarationSearchEngineTopDown.java @@ -72,12 +72,10 @@ public class TestObjectDeclarationSearchEngineTopDown extends TestLib { } public void testGetObjectHashFileHashSymbol() { - if (unresolved(6459)) { - return; - } - String objectName = "#funit-scopes-multi-file-b.c#first"; + + String objectName = "funit-scopes-multi-file-b.c#first"; String objectToken = "*this*"; - String fileName = "funit-scopes-multi-file-a"; + String fileName = "funit-scopes-multi-file"; File srcPath = getSrc("funit-scopes-multi-file-b.c"); verifyObjectFound(objectName, objectToken, fileName, srcPath); @@ -98,7 +96,7 @@ public class TestObjectDeclarationSearchEngineTopDown extends TestLib { .getObject(objectName); assertNotNull("Variable found", objectDeclaration); - assertEquals("Correct name", objectName, objectDeclaration.getName()); + assertTrue("Correct name", objectName.endsWith(objectDeclaration.getName())); assertEquals("Found the correct variable on the correct line ", objectLine, objectDeclaration.getSourceLocation().getLine()); diff --git a/frysk-core/frysk/scopes/ChangeLog b/frysk-core/frysk/scopes/ChangeLog index 7903933..2cfcdfb 100644 --- a/frysk-core/frysk/scopes/ChangeLog +++ b/frysk-core/frysk/scopes/ChangeLog @@ -1,3 +1,8 @@ +2008-05-09 Sami Wagiaalla + + * Scope.java (getDeclaredObjectByNameRecursive): Added + support for recursive search. + 2008-04-22 Sami Wagiaalla * Scope.java: Now looks at NameScopes as well diff --git a/frysk-core/frysk/scopes/Scope.java b/frysk-core/frysk/scopes/Scope.java index d7afa2e..a3e993b 100644 --- a/frysk-core/frysk/scopes/Scope.java +++ b/frysk-core/frysk/scopes/Scope.java @@ -86,7 +86,6 @@ public class Scope public Scope(DwarfDie die, TypeFactory typeFactory){ this.die = die; - this.scopes = new LinkedList(); this.typeFactory = typeFactory; this.sourceLocation = SourceLocationFactory.getSourceLocation(die); } @@ -105,7 +104,22 @@ public class Scope } public LinkedList getScopes(){ - return this.scopes; + + if (this.scopes == null) { + this.scopes = new LinkedList(); + DwarfDie die = this.die.getChild(); + + while (die != null) { + try{ + Scope scope = ScopeFactory.theFactory.getScope(die, typeFactory); + this.scopes.add(scope); + } catch (IllegalArgumentException e) { + // not a scope + } + die = die.getSibling(); + } + } + return scopes; } protected DwarfDie getDie(){ @@ -195,6 +209,7 @@ public class Scope } public ObjectDeclaration getDeclaredObjectByName(String name){ + ObjectDeclaration objectDeclaration = null; Iterator iterator = this.getObjectDeclarations().iterator(); @@ -219,6 +234,33 @@ public class Scope return null; } + /** + * Searches child scopes for the given name + * @param name + * @return + */ + public ObjectDeclaration getDeclaredObjectByNameRecursive(String name){ + + ObjectDeclaration objectDeclaration = this.getDeclaredObjectByName(name); + + if(objectDeclaration != null){ + return objectDeclaration; + } + + Iterator iterator = this.getScopes().iterator(); + while (iterator.hasNext()) { + Scope scope = (Scope) iterator.next(); + objectDeclaration = scope.getDeclaredObjectByNameRecursive(name); + + if(objectDeclaration != null){ + return objectDeclaration; + } + } + + + return null; + } + public void toPrint(DebugInfoFrame frame, PrintWriter writer, String indentString){ Iterator iterator = this.getVariables().iterator(); diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog index b3d4c99..8b97a0f 100644 --- a/frysk-sys/lib/dwfl/ChangeLog +++ b/frysk-sys/lib/dwfl/ChangeLog @@ -1,3 +1,11 @@ +2008-05-09 Sami Wagiaalla + + * cni/Dwarf.cxx (Dwarf::get_cu_by_name): New. + +2008-05-09 Sami Wagiaalla + + * Dwarf.java (getCUByName): New. + 2008-05-07 Andrew Cagney * jni/DwarfDie.cxx: Include jni.hxx. diff --git a/frysk-sys/lib/dwfl/Dwarf.java b/frysk-sys/lib/dwfl/Dwarf.java index 1727439..b3a8ba5 100644 --- a/frysk-sys/lib/dwfl/Dwarf.java +++ b/frysk-sys/lib/dwfl/Dwarf.java @@ -39,10 +39,10 @@ package lib.dwfl; -import lib.dwfl.Elf; -import lib.dwfl.ElfSection; import gnu.gcj.RawData; +import java.util.LinkedList; + public class Dwarf { private long pointer; @@ -94,9 +94,24 @@ public class Dwarf { public String[] getSourceFiles(){ return get_source_files(); } + + /** + * Returns a list of compilation units matching + * the given name. + * If a full path is give only one cu is likely + * to be returned. + * + * @param name + * @return + */ + public LinkedList getCUByName(String name){ + return this.get_cu_by_name(name); + } + protected native void dwarf_begin_elf(RawData elf, int command, long section); protected native void dwarf_begin(String file, int command); protected native String[] get_source_files(); + protected native LinkedList get_cu_by_name(String name); protected native int dwarf_end(); // protected native long[] dwarf_get_functions(); // protected native long dwarf_addrdie(long addr); diff --git a/frysk-sys/lib/dwfl/cni/Dwarf.cxx b/frysk-sys/lib/dwfl/cni/Dwarf.cxx index 4f26966..e8892ab 100644 --- a/frysk-sys/lib/dwfl/cni/Dwarf.cxx +++ b/frysk-sys/lib/dwfl/cni/Dwarf.cxx @@ -41,8 +41,15 @@ #include #include #include +#include #include "lib/dwfl/Dwarf.h" +#include "lib/dwfl/DwarfDie.h" +#include "lib/dwfl/DwarfDieFactory.h" + +#include +#include +#include #define DWARF_POINTER (::Dwarf *) this->pointer @@ -67,6 +74,43 @@ lib::dwfl::Dwarf::dwarf_begin(jstring file, jint command){ this->pointer = (jlong) ::dwarf_begin(fd, (::Dwarf_Cmd) command); } + +java::util::LinkedList* +lib::dwfl::Dwarf::get_cu_by_name(java::lang::String* name) +{ + + java::util::LinkedList* list = new java::util::LinkedList(); + + Dwarf_Off offset = 0; + Dwarf_Off old_offset; + Dwarf_Die cudie_mem; + size_t hsize; + + while (dwarf_nextcu ((::Dwarf *)this->pointer, old_offset = offset, &offset, + &hsize, NULL, NULL, NULL) == 0) + { + + Dwarf_Die *cudie = dwarf_offdie ((::Dwarf *)this->pointer, old_offset + hsize, &cudie_mem); + const char *die_name = dwarf_diename (cudie); + java::lang::String* die_name_string = JvNewStringLatin1 (die_name); + + if(die_name_string->endsWith(name)){ + + Dwarf_Die *die = (Dwarf_Die*)JvMalloc(sizeof(Dwarf_Die)); + + memcpy(die, cudie, sizeof(*die)); + lib::dwfl::DwarfDie* cuDie = lib::dwfl::DwarfDieFactory::getFactory()->makeDie((jlong)die, NULL); + cuDie->setManageDie(true); + + list->add(cuDie); + } + + } + + return list; +} + + JArray* lib::dwfl::Dwarf::get_source_files() { @@ -125,7 +169,6 @@ lib::dwfl::Dwarf::get_source_files() return jfiles; } - jint lib::dwfl::Dwarf::dwarf_end(){ return ::dwarf_end(DWARF_POINTER); hooks/post-receive -- frysk system monitor/debugger