public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Always allow instruction stepping through SteppingEngine. Fixes bug #5907.
@ 2008-03-19 23:25 mark
  0 siblings, 0 replies; only message in thread
From: mark @ 2008-03-19 23:25 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  6fa3545e8cdb22a71bc2dfbcc701cf2d232e4bc0 (commit)
      from  d24ca531c9232260facb01c95eecab0263f4d391 (commit)

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

- Log -----------------------------------------------------------------
commit 6fa3545e8cdb22a71bc2dfbcc701cf2d232e4bc0
Author: Mark Wielaard <mwielaard@redhat.com>
Date:   Thu Mar 20 00:06:34 2008 +0100

    Always allow instruction stepping through SteppingEngine. Fixes bug #5907.
    
    frysk-core/frysk/stepping/ChangeLog
    2008-03-19  Mark Wielaard  <mwielaard@redhat.com>
    
           * InstructionStepState.java (InstructionStepState): Take and set
           isLine argument.
           (handleUpdate): Only try skipping plt when line stepping.
           * LineStepState.java (handleUpdate): When no line info found act
           like an InstructionStepState.
           * SteppingEngine.java (stepInstruction): Create InstructionStepState
           for instruction stepping.
           (stepInstruction): Likewise.
           (stepLine): Create InstructionStepState for line stepping.
           (setUp): Create InstructionStepState using isLine.
           * TestStepping.java (testInstructionStepThroughSection): Just do one
           line step.

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

Summary of changes:
 frysk-core/frysk/stepping/ChangeLog                |   15 ++++++++++
 .../frysk/stepping/InstructionStepState.java       |   29 ++++++++++++++-----
 frysk-core/frysk/stepping/LineStepState.java       |   12 +++++---
 frysk-core/frysk/stepping/SteppingEngine.java      |    8 +++---
 frysk-core/frysk/stepping/TestStepping.java        |    7 -----
 5 files changed, 48 insertions(+), 23 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/stepping/ChangeLog b/frysk-core/frysk/stepping/ChangeLog
index 4c18972..5efeee7 100644
--- a/frysk-core/frysk/stepping/ChangeLog
+++ b/frysk-core/frysk/stepping/ChangeLog
@@ -1,3 +1,18 @@
+2008-03-19  Mark Wielaard  <mwielaard@redhat.com>
+
+	* InstructionStepState.java (InstructionStepState): Take and set
+	isLine argument.
+	(handleUpdate): Only try skipping plt when line stepping.
+	* LineStepState.java (handleUpdate): When no line info found act
+	like an InstructionStepState.
+	* SteppingEngine.java (stepInstruction): Create InstructionStepState
+	for instruction stepping.
+	(stepInstruction): Likewise.
+	(stepLine): Create InstructionStepState for line stepping.
+	(setUp): Create InstructionStepState using isLine.
+	* TestStepping.java (testInstructionStepThroughSection): Just do one
+	line step.
+
 2008-03-18  Andrew Cagney  <cagney@redhat.com>
 
 	* SteppingEngine.java: Block terminating tasks.
diff --git a/frysk-core/frysk/stepping/InstructionStepState.java b/frysk-core/frysk/stepping/InstructionStepState.java
index 4baea23..6e20c2f 100644
--- a/frysk-core/frysk/stepping/InstructionStepState.java
+++ b/frysk-core/frysk/stepping/InstructionStepState.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2007, 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -49,8 +49,15 @@ public class InstructionStepState extends State {
     private ElfSectionCache elfCache;
     private final String PLT_DL_FIXUP = "_dl_fixup";
 
-    public InstructionStepState(Task task) {
+    /**
+     * Indicates that this is a step (into) line, if true then plt
+     * entries are skipped.
+     */
+    private final boolean isLine;
+
+    public InstructionStepState(Task task, boolean isLine) {
 	this.task = task;
+	this.isLine = isLine;
     }
 
     /**
@@ -64,14 +71,20 @@ public class InstructionStepState extends State {
      */
     public State handleUpdate(TaskStepEngine tse) {
 
+      if (isLine) {
 	long addr = this.task.getPC();
 	this.elfCache = new ElfSectionCache(this.task);
 	ElfSectionHeader header = this.elfCache.getSectionHeader(".plt", addr);
 
-	/* If the user steps into a function call, the following catches the .plt section of the program, and
-	 * ensures that Frysk steps past it, so that the user is landed back into their own code after the call. */
-	if ((header != null && header.addr <= addr && (header.addr + header.offset) >= addr)
-		&& (header.type == ElfSectionHeader.ELF_SHT_PROGBITS || header.type == ElfSectionHeader.ELF_SHT_NOBITS)) {
+	/* If the user steps into a function call, the following
+	 * catches the .plt section of the program, and ensures that
+	 * Frysk steps past it, so that the user is landed back into
+	 * their own code after the call. */
+	if (header != null
+	    && header.addr <= addr
+	    && (header.addr + header.offset) >= addr
+	    && (header.type == ElfSectionHeader.ELF_SHT_PROGBITS
+		|| header.type == ElfSectionHeader.ELF_SHT_NOBITS)) {
 
 	    DwflLine line = tse.getDwflLine();
 
@@ -80,8 +93,8 @@ public class InstructionStepState extends State {
 		return new InstructionStepThroughState(task, PLT_DL_FIXUP);
 	    }
 	}
-
-	return new StoppedState(this.task);
+      }
+      return new StoppedState(this.task);
     }
 
     public boolean isStopped() {
diff --git a/frysk-core/frysk/stepping/LineStepState.java b/frysk-core/frysk/stepping/LineStepState.java
index 59d9539..f95a996 100644
--- a/frysk-core/frysk/stepping/LineStepState.java
+++ b/frysk-core/frysk/stepping/LineStepState.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2007, 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -62,9 +62,13 @@ public class LineStepState extends State {
 	if (line == null) /* We're in no-debuginfo land */
 	{
 	    tse.setLine(0);
-	    /* Returned a StoppedState because line-stepping has no meaning
-	     * when there is no debug information to relate the 'lines' to. */
-	    return new StoppedState(this.task);
+	    // Pretend we are an InstructionStepState because
+	    // line-stepping has no meaning when there is no debug
+	    // information to relate the 'lines' to.  And
+	    // InstructionStepState with isLine set to true will
+	    // return StoppedState, but not before it went through a
+	    // plt section first.
+	    return new InstructionStepState(task, true).handleUpdate(tse);
 	} else
 	    lineNum = line.getLineNum();
 
diff --git a/frysk-core/frysk/stepping/SteppingEngine.java b/frysk-core/frysk/stepping/SteppingEngine.java
index 2b5d91d..6fa9b3e 100644
--- a/frysk-core/frysk/stepping/SteppingEngine.java
+++ b/frysk-core/frysk/stepping/SteppingEngine.java
@@ -198,7 +198,7 @@ public class SteppingEngine {
 	if (!tse.isStopped())
 	    return false;
 
-	tse.setState(new InstructionStepState(task));
+	tse.setState(new InstructionStepState(task, false));
 	this.steppingObserver.notifyNotBlocked(tse);
 	this.contextMap.put(task.getProc(), new Integer(1));
 
@@ -228,7 +228,7 @@ public class SteppingEngine {
 	while (iter.hasNext()) {
 	    t = (Task) iter.next();
 	    TaskStepEngine tse = (TaskStepEngine) this.taskStateMap.get(t);
-	    tse.setState(new InstructionStepState(t));
+	    tse.setState(new InstructionStepState(t, false));
 	    this.steppingObserver.notifyNotBlocked(tse);
 	    continueForStepping(t, true);
 	}
@@ -258,7 +258,7 @@ public class SteppingEngine {
 	    DwflLine line = tse.getDwflLine();
 
 	    if (line == null) {
-		tse.setState(new InstructionStepState(task));
+	        tse.setState(new InstructionStepState(task, true));
 		if (continueForStepping(task, true)) {
 		    this.steppingObserver.notifyNotBlocked(tse);
 		}
@@ -321,7 +321,7 @@ public class SteppingEngine {
 		 * from the Task at this point. If not, there's no point in doing
 		 * 'line stepping' since there are no 'lines' to step. */
 		if (line == null) {
-		    tse.setState(new InstructionStepState(t));
+		    tse.setState(new InstructionStepState(t, isLine));
 		} else {
 		    tse.setLine(line.getLineNum());
 		    tse.setState(new LineStepState(t));
diff --git a/frysk-core/frysk/stepping/TestStepping.java b/frysk-core/frysk/stepping/TestStepping.java
index fd0431f..b14c4f3 100644
--- a/frysk-core/frysk/stepping/TestStepping.java
+++ b/frysk-core/frysk/stepping/TestStepping.java
@@ -1017,7 +1017,6 @@ public class TestStepping extends TestLib {
 
 	    Task testTask = null;
 	    String callingFrame = "foo";
-	    boolean first = true;
 	    int endLine = 0;
 	    
 	    public InstructionStepThroughSectionTest(Task task, int lineNum) {
@@ -1032,12 +1031,6 @@ public class TestStepping extends TestLib {
 	
 		String s = frame.getSymbol().getDemangledName();
 		
-		if (first) {
-		    se.stepLine(this.testTask);
-		    this.first = false;
-		    return;
-		}
-		
 		assertEquals("calling frame", callingFrame, s);
 		assertEquals("line number", endLine, frame.getLine().getLine());
 		Manager.eventLoop.requestStop();


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


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

only message in thread, other threads:[~2008-03-19 23:25 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-03-19 23:25 [SCM] master: Always allow instruction stepping through SteppingEngine. Fixes bug #5907 mark

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