public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: swagiaal@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: swagiaal: Break points and List command now use ObjectDeclaration. Date: Mon, 21 Apr 2008 20:50:00 -0000 [thread overview] Message-ID: <20080421205047.6838.qmail@sourceware.org> (raw) The branch, master has been updated via 25c50d7c90d78aeb0260139293eeab2b8d1eec5c (commit) from c9b6156e7b4d4ab4ccb29024e22625901595c15b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 25c50d7c90d78aeb0260139293eeab2b8d1eec5c Author: Sami Wagiaalla <swagiaal@redhat.com> Date: Mon Apr 21 16:50:29 2008 -0400 swagiaal: Break points and List command now use ObjectDeclaration. frysk-core/frysk/debuginfo/ChangeLog +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * ObjectDeclarationSearchEngine.java(getSymbolDie): now + returns ObjectDeclaration. + frysk-core/frysk/hpd/ChangeLog +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * BreakpointCommand.java: Now understands ObjectDeclaration. + * ListCommand.java: Ditto. + frysk-core/frysk/rt/ChangeLog +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * FunctionBreakpoint.java: Now uses ObjectDeclaration. + * BreakpointManager.java: Ditto. + frysk-core/frysk/scopes/ChangeLog +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * ConcreteInlinedFunction.java: New class. + * TestScopeFactory.java: Test handling of concrete inlined + instances. + * ScopeFactory.java: Handle concrete inlined instances. + * OutOfLineFunction.java: implemented BreakPointLocation interface. + * InlinedSubroutine.java: implemented getInlinedInstances(). + frysk-core/frysk/value/ChangeLog +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * BreakPointLocation.java: New interface. + frysk-sys/lib/dwfl/ChangeLog +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * DwarfDie.java: wrapped getEntryPC() + ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/debuginfo/ChangeLog | 5 ++ .../debuginfo/ObjectDeclarationSearchEngine.java | 30 +++++++-- frysk-core/frysk/hpd/BreakpointCommand.java | 4 +- frysk-core/frysk/hpd/ChangeLog | 5 ++ frysk-core/frysk/hpd/ListCommand.java | 71 +++++++++++--------- frysk-core/frysk/rt/BreakpointManager.java | 5 +- frysk-core/frysk/rt/ChangeLog | 5 ++ frysk-core/frysk/rt/FunctionBreakpoint.java | 36 ++++++++++ frysk-core/frysk/scopes/ChangeLog | 9 +++ ...ubroutine.java => ConcreteInlinedFunction.java} | 10 ++- frysk-core/frysk/scopes/Function.java | 20 +++--- frysk-core/frysk/scopes/InlinedSubroutine.java | 15 ++++ frysk-core/frysk/scopes/OutOfLineFunction.java | 13 +++- frysk-core/frysk/scopes/ScopeFactory.java | 16 +++-- frysk-core/frysk/scopes/TestScopeFactory.java | 14 +++- .../BreakPointLocation.java} | 12 +--- frysk-core/frysk/value/ChangeLog | 4 + frysk-sys/lib/dwfl/ChangeLog | 4 + frysk-sys/lib/dwfl/DwarfDie.java | 7 ++ 19 files changed, 206 insertions(+), 79 deletions(-) copy frysk-core/frysk/scopes/{InlinedSubroutine.java => ConcreteInlinedFunction.java} (88%) copy frysk-core/frysk/{scopes/InlinedSubroutine.java => value/BreakPointLocation.java} (89%) First 500 lines of diff: diff --git a/frysk-core/frysk/debuginfo/ChangeLog b/frysk-core/frysk/debuginfo/ChangeLog index 9858055..54398b0 100644 --- a/frysk-core/frysk/debuginfo/ChangeLog +++ b/frysk-core/frysk/debuginfo/ChangeLog @@ -1,3 +1,8 @@ +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * ObjectDeclarationSearchEngine.java(getSymbolDie): now + returns ObjectDeclaration. + 2008-04-18 Mark Wielaard <mwielaard@redhat.com> * TestDebugInfoStackTrace.java (testBacktrace): Resolved bug #4468. diff --git a/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java b/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java index e1524cf..5eaa273 100644 --- a/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java +++ b/frysk-core/frysk/debuginfo/ObjectDeclarationSearchEngine.java @@ -63,6 +63,8 @@ import frysk.isa.registers.Registers; import frysk.isa.registers.RegistersFactory; import frysk.proc.Task; import frysk.scopes.Scope; +import frysk.scopes.ScopeFactory; +import frysk.scopes.Variable; import frysk.symtab.SymbolObjectDeclaration; import frysk.value.ObjectDeclaration; import frysk.value.Value; @@ -93,15 +95,31 @@ public class ObjectDeclarationSearchEngine implements ExprSymTab{ * - return ObjectDeclaration * ... */ - public DwarfDie getSymbolDie(String input) { + public ObjectDeclaration getSymbolDie(String name) { + + ObjectDeclaration result; + Elf elf = new Elf(new File(task.getProc().getExeFile().getSysRootedPath()), ElfCommand.ELF_C_READ); Dwarf dwarf = new Dwarf(elf, DwarfCommand.READ, null); - DwarfDie result = DwarfDie.getDecl(dwarf, input); - if (result == null) - throw new RuntimeException("symbol " + input + " not found."); - else - return result; + DwarfDie resultDie = DwarfDie.getDecl(dwarf, name); + TypeFactory typeFactory = new TypeFactory(task.getISA()); + + if (resultDie == null) + throw new RuntimeException("symbol " + name + " not found."); + + + 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; } /** diff --git a/frysk-core/frysk/hpd/BreakpointCommand.java b/frysk-core/frysk/hpd/BreakpointCommand.java index f364fbb..efe1ee0 100644 --- a/frysk-core/frysk/hpd/BreakpointCommand.java +++ b/frysk-core/frysk/hpd/BreakpointCommand.java @@ -45,7 +45,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import lib.dwfl.DwarfDie; import frysk.debuginfo.DebugInfoFrame; import frysk.debuginfo.DebugInfoStackFactory; import frysk.debuginfo.ObjectDeclarationSearchEngine; @@ -57,6 +56,7 @@ import frysk.rt.FunctionBreakpoint; import frysk.rt.LineBreakpoint; import frysk.rt.SourceBreakpoint; import frysk.rt.SourceBreakpointObserver; +import frysk.value.ObjectDeclaration; class BreakpointCommand extends ParameterizedCommand { @@ -145,7 +145,7 @@ class BreakpointCommand extends ParameterizedCommand { ObjectDeclarationSearchEngine declarationSearchEngine = new ObjectDeclarationSearchEngine(frame); if (declarationSearchEngine != null) { - DwarfDie die; + ObjectDeclaration die; try { die = declarationSearchEngine.getSymbolDie(breakpt); } catch (RuntimeException e) { diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog index 5a769e9..bf0caf2 100644 --- a/frysk-core/frysk/hpd/ChangeLog +++ b/frysk-core/frysk/hpd/ChangeLog @@ -1,3 +1,8 @@ +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * BreakpointCommand.java: Now understands ObjectDeclaration. + * ListCommand.java: Ditto. + 2008-04-18 Mark Wielaard <mwielaard@redhat.com> * TestEvalCommands.java (testPrintLocationFails): Enable test diff --git a/frysk-core/frysk/hpd/ListCommand.java b/frysk-core/frysk/hpd/ListCommand.java index 79b5fd5..5e54527 100644 --- a/frysk-core/frysk/hpd/ListCommand.java +++ b/frysk-core/frysk/hpd/ListCommand.java @@ -40,23 +40,22 @@ package frysk.hpd; import java.io.File; -import java.util.List; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; - -import frysk.scopes.SourceLocation; - import java.util.Iterator; -import lib.dwfl.DwarfDie; -import lib.dwfl.DwTag; +import java.util.List; + import lib.dwfl.DwflLine; import frysk.debuginfo.DebugInfoFrame; +import frysk.debuginfo.ObjectDeclarationNotFoundException; import frysk.debuginfo.ObjectDeclarationSearchEngine; import frysk.dwfl.DwflCache; +import frysk.proc.Task; +import frysk.scopes.Function; +import frysk.scopes.SourceLocation; import frysk.sysroot.SysRoot; import frysk.sysroot.SysRootCache; -import frysk.proc.Task; /** * Implement the "list" source command. @@ -208,33 +207,39 @@ class ListCommand extends ParameterizedCommand { if ((cmdParm).compareTo("$EXEC") == 0) return frame.getLine().getLine(); - else { - DwarfDie funcDie = null; - - ObjectDeclarationSearchEngine declarationSearchEngine = new ObjectDeclarationSearchEngine(frame); - - if (declarationSearchEngine != null) { - funcDie = declarationSearchEngine - .getSymbolDie(cmdParm); - } - if (funcDie.getTag().hashCode() == DwTag.SUBPROGRAM_) { - DwflLine dwflLine = DwflCache.getDwfl(frame.getTask()) - .getSourceLine(frame.getAdjustedAddress()); - if (dwflLine != null) { - SysRoot sysRoot = new SysRoot(SysRootCache.getSysRoot(frame.getTask())); - file = sysRoot.getSourcePathViaSysRoot - (new File(dwflLine.getCompilationDir()), - funcDie.getDeclFile()).getSysRootedFile(); - } - else - file = funcDie.getDeclFile(); - return (int)funcDie.getDeclLine(); - } - else { - cli.addMessage("function " + cmdParm + " not found.", - Message.TYPE_ERROR); - return line; + + Function function = null; + + ObjectDeclarationSearchEngine declarationSearchEngine = new ObjectDeclarationSearchEngine(frame); + + try { + function = (Function) declarationSearchEngine.getSymbolDie(cmdParm); + } catch (ObjectDeclarationNotFoundException e) { + function = null; + }catch (ClassCastException e) { + function = null; + } + + if (function != null ) { + DwflLine dwflLine = DwflCache.getDwfl(frame.getTask()) + .getSourceLine(frame.getAdjustedAddress()); + if (dwflLine != null) { + SysRoot sysRoot = new SysRoot(SysRootCache.getSysRoot(frame + .getTask())); + file = sysRoot.getSourcePathViaSysRoot( + new File(dwflLine.getCompilationDir()), + function.getSourceLocation().getFile()) + .getSysRootedFile(); + } else { + file = function.getSourceLocation().getFile(); } + return (int) function.getSourceLocation().getLine(); + + } else { + cli.addMessage("function " + cmdParm + " not found.", + Message.TYPE_ERROR); + return line; + } } } diff --git a/frysk-core/frysk/rt/BreakpointManager.java b/frysk-core/frysk/rt/BreakpointManager.java index bf4233d..8582d3c 100644 --- a/frysk-core/frysk/rt/BreakpointManager.java +++ b/frysk-core/frysk/rt/BreakpointManager.java @@ -58,8 +58,7 @@ import frysk.symtab.DwflSymbol; import frysk.symtab.PLTEntry; import frysk.symtab.SymbolFactory; import frysk.util.CountDownLatch; - -import lib.dwfl.DwarfDie; +import frysk.value.ObjectDeclaration; /** * Class for managing user breakpoints. In particular it defers @@ -197,7 +196,7 @@ public class BreakpointManager extends Observable { * performed. * @return FunctionBreakpoint object */ - public FunctionBreakpoint addFunctionBreakpoint(String name, DwarfDie die) { + public FunctionBreakpoint addFunctionBreakpoint(String name, ObjectDeclaration die) { FunctionBreakpoint sourceBreakpoint = new FunctionBreakpoint(CountManager.getNextId(), name, die); addBreakpoint(sourceBreakpoint); diff --git a/frysk-core/frysk/rt/ChangeLog b/frysk-core/frysk/rt/ChangeLog index 5f2319f..fe65348 100644 --- a/frysk-core/frysk/rt/ChangeLog +++ b/frysk-core/frysk/rt/ChangeLog @@ -1,3 +1,8 @@ +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * FunctionBreakpoint.java: Now uses ObjectDeclaration. + * BreakpointManager.java: Ditto. + 2008-04-16 Andrew Cagney <cagney@redhat.com> * LineBreakpoint.java (LineBreakpoint(int,File,int,int)): New. diff --git a/frysk-core/frysk/rt/FunctionBreakpoint.java b/frysk-core/frysk/rt/FunctionBreakpoint.java index ca3fd44..84198a2 100644 --- a/frysk-core/frysk/rt/FunctionBreakpoint.java +++ b/frysk-core/frysk/rt/FunctionBreakpoint.java @@ -42,13 +42,18 @@ package frysk.rt; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; import lib.dwfl.DwarfDie; import lib.dwfl.die.InlinedSubroutine; import frysk.proc.Task; +import frysk.scopes.ConcreteInlinedFunction; +import frysk.scopes.Function; +import frysk.scopes.OutOfLineFunction; import frysk.symtab.SymbolFactory; +import frysk.value.ObjectDeclaration; public class FunctionBreakpoint extends SourceBreakpoint { @@ -56,6 +61,7 @@ public class FunctionBreakpoint protected final DwarfDie die; private boolean containsInlineInstances = false; + private Function function; /** * Set a breakpoint based on a DwarfDie or just a name. @@ -66,7 +72,37 @@ public class FunctionBreakpoint this.die = die; } + public FunctionBreakpoint(int id, String name, ObjectDeclaration function) { + super(id); + this.name = name; + this.function = (Function) function; + this.die = null; + } + public LinkedList getBreakpointRawAddresses(Task task) { + + if (function != null) { + if (function instanceof OutOfLineFunction) { + long address = ((OutOfLineFunction) function).getBreakPointAddress(); + LinkedList addrs = new LinkedList(); + addrs.add(new Long(address)); + return addrs; + } + + if (function instanceof frysk.scopes.InlinedSubroutine) { + LinkedList inlinedInstances = ((frysk.scopes.InlinedSubroutine)function).getInlinedInstances(); + Iterator iterator = inlinedInstances.iterator(); + LinkedList addrs = new LinkedList(); + while (iterator.hasNext()) { + ConcreteInlinedFunction concreteInlinedFunction = (ConcreteInlinedFunction) iterator.next(); + addrs.add(new Long(concreteInlinedFunction.getBreakPointAddress())); + } + return addrs; + } + + + } + if (die != null) { ArrayList entryAddrs = die.getEntryBreakpoints(); ArrayList inlineDies = null; diff --git a/frysk-core/frysk/scopes/ChangeLog b/frysk-core/frysk/scopes/ChangeLog index 0d06053..98d86cb 100644 --- a/frysk-core/frysk/scopes/ChangeLog +++ b/frysk-core/frysk/scopes/ChangeLog @@ -1,3 +1,12 @@ +2008-04-21 Sami Wagiaalla <swagiaal@redhat.com> + + * ConcreteInlinedFunction.java: New class. + * TestScopeFactory.java: Test handling of concrete inlined + instances. + * ScopeFactory.java: Handle concrete inlined instances. + * OutOfLineFunction.java: implemented BreakPointLocation interface. + * InlinedSubroutine.java: implemented getInlinedInstances(). + 2008-04-16 Andrew Cagney <cagney@redhat.com> * TestDie.java: Use frysk.config.Prefix. diff --git a/frysk-core/frysk/scopes/InlinedSubroutine.java b/frysk-core/frysk/scopes/ConcreteInlinedFunction.java similarity index 88% copy from frysk-core/frysk/scopes/InlinedSubroutine.java copy to frysk-core/frysk/scopes/ConcreteInlinedFunction.java index 0b0086f..c3e350c 100644 --- a/frysk-core/frysk/scopes/InlinedSubroutine.java +++ b/frysk-core/frysk/scopes/ConcreteInlinedFunction.java @@ -41,11 +41,17 @@ package frysk.scopes; import lib.dwfl.DwarfDie; import frysk.debuginfo.TypeFactory; +import frysk.value.BreakPointLocation; -public class InlinedSubroutine extends Function{ +public class ConcreteInlinedFunction extends InlinedSubroutine implements BreakPointLocation{ - public InlinedSubroutine(DwarfDie die, TypeFactory typeFactory) { + public ConcreteInlinedFunction(DwarfDie die, TypeFactory typeFactory) { super(die, typeFactory); } + public long getBreakPointAddress() { + return getDie().getLowPC(); + } + + } diff --git a/frysk-core/frysk/scopes/Function.java b/frysk-core/frysk/scopes/Function.java index 39c9036..89c225f 100644 --- a/frysk-core/frysk/scopes/Function.java +++ b/frysk-core/frysk/scopes/Function.java @@ -170,17 +170,20 @@ public class Function extends NamedScope { * - a regular funciton which has been inlined by the compiler */ public boolean isInlined(){ + DwTag dwTag = getDie().getTag(); - long inlineAttribute = getDie().getAttrConstant(DwAt.INLINE); - // Declared inlined and inlined by compiler - if(dwTag.equals(DwTag.INLINED_SUBROUTINE) && inlineAttribute == DwInl.DECLARED_INLINED_){ + // Concrete inlined instance + if(dwTag.equals(DwTag.INLINED_SUBROUTINE)){ return true; } - // Declared inlined and inlined by compiler... but has INLINED attribute instead - // of DECLARED_INLINED_ - if(dwTag.equals(DwTag.INLINED_SUBROUTINE) && inlineAttribute == DwInl.INLINED_){ + long inlineAttribute = getDie().getAttrConstant(DwAt.INLINE); + + // Declared inlined and inlined by compiler + // but has DW_TAG_SUBPROGRAM + // this is an abstract instance of an inlineable function + if(dwTag.equals(DwTag.SUBPROGRAM) && inlineAttribute == DwInl.DECLARED_INLINED_){ return true; } @@ -189,11 +192,6 @@ public class Function extends NamedScope { return true; } - // Declared inlined and not inlined by compiler - if(dwTag.equals(DwTag.INLINED_SUBROUTINE) && inlineAttribute == DwInl.DECLARED_NOT_INLINED_){ - return false; - } - // Declared regular and not inlined by compiler if(dwTag.equals(DwTag.SUBPROGRAM) && inlineAttribute == DwInl.NOT_INLINED_){ return false; diff --git a/frysk-core/frysk/scopes/InlinedSubroutine.java b/frysk-core/frysk/scopes/InlinedSubroutine.java index 0b0086f..149af91 100644 --- a/frysk-core/frysk/scopes/InlinedSubroutine.java +++ b/frysk-core/frysk/scopes/InlinedSubroutine.java @@ -39,6 +39,10 @@ package frysk.scopes; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; + import lib.dwfl.DwarfDie; import frysk.debuginfo.TypeFactory; @@ -48,4 +52,15 @@ public class InlinedSubroutine extends Function{ super(die, typeFactory); } + public LinkedList getInlinedInstances(){ + LinkedList inlinedInstances = new LinkedList(); + + ArrayList arrayList = getDie().getInlinedInstances(); + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()) { + DwarfDie die = (DwarfDie) iterator.next(); + inlinedInstances.add(ScopeFactory.theFactory.getScope(die, typeFactory)); + } + return inlinedInstances; + } } diff --git a/frysk-core/frysk/scopes/OutOfLineFunction.java b/frysk-core/frysk/scopes/OutOfLineFunction.java index 6c76dc6..4b71275 100644 --- a/frysk-core/frysk/scopes/OutOfLineFunction.java +++ b/frysk-core/frysk/scopes/OutOfLineFunction.java @@ -45,15 +45,24 @@ package frysk.scopes; import lib.dwfl.DwarfDie; import frysk.debuginfo.TypeFactory; +import frysk.value.BreakPointLocation; /** - * A Subprogram refers to a concrete (not inlined) instance of a function. + * This refers to a concrete (not inlined) instance of a function. */ -public class OutOfLineFunction extends Function +public class OutOfLineFunction extends Function implements BreakPointLocation { + DwarfDie die; + public OutOfLineFunction(DwarfDie die, TypeFactory typeFactory) { super(die, typeFactory); + this.die = die; + } + + public long getBreakPointAddress() { +// return die.getEntryPc(); + return ((Long)die.getEntryBreakpoints().get(0)).longValue(); } } diff --git a/frysk-core/frysk/scopes/ScopeFactory.java b/frysk-core/frysk/scopes/ScopeFactory.java index 4cd54e0..b8750a2 100644 --- a/frysk-core/frysk/scopes/ScopeFactory.java +++ b/frysk-core/frysk/scopes/ScopeFactory.java @@ -63,26 +63,28 @@ public class ScopeFactory { // the die that is constant. // Or DwarfDieFactory should prevent creation of // redundant Die objects - Scope scope = (Scope) scopes.get(die); - + + Object key = die; + Scope scope = (Scope) scopes.get(key); if (scope == null) { scope = createScope(die, typeFactory); - this.scopes.put(die, scope); + this.scopes.put(key, scope); } return scope; } private Scope createScope(DwarfDie die, TypeFactory typeFactory) { - + switch (die.getTag().hashCode()) { case DwTag.INLINED_SUBROUTINE_: + return new ConcreteInlinedFunction(die, typeFactory); case DwTag.SUBPROGRAM_: - OutOfLineFunction subprogram = new OutOfLineFunction(die, typeFactory); - if(subprogram.isInlined()){ + Function function = new Function(die, typeFactory); + if(function.isInlined()){ return new InlinedSubroutine(die,typeFactory); } - return subprogram; + return new OutOfLineFunction(die,typeFactory); case DwTag.LEXICAL_BLOCK_: return new LexicalBlock(die, typeFactory); case DwTag.COMPILE_UNIT_: hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-04-21 20:50 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080421205047.6838.qmail@sourceware.org \ --to=swagiaal@sourceware.org \ --cc=frysk-cvs@sourceware.org \ --cc=frysk@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).