Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] Fix handling of #include files during prologue skipping
@ 2013-01-23 20:34 Tiago Stürmer Daitx
  2013-01-23 20:44 ` Tom Tromey
  2013-01-24  0:52 ` Yao Qi
  0 siblings, 2 replies; 16+ messages in thread
From: Tiago Stürmer Daitx @ 2013-01-23 20:34 UTC (permalink / raw)
  To: gdb-patches; +Cc: emachado, Ulrich.Weigand

In symtab.c:skip_prologue_using_sal, the code goes through the SAL markers 
starting from the beginning of the function, and checks for markers with the 
same (or increasing line numbers). The idea behind this is that if one gets 
decreasing line numbers, than one probably have the case where the optimizer 
scheduled code from later in the function into the prologue.

However, the problem was that this code was simply comparing the line
*numbers* -- even if they refered to a different file! That's why the
presence of the comment makes a difference, because it makes the line
number in t.c larger (or smaller) than the line number in t.h.

This patch simply considers a change in file equivalent to an
increasing line number.

Before the fix:

$ gdb prologue-include
[snip]
(gdb) break main
Breakpoint 1 at 0x10000594: file prologue-include.h, line 2.

After the fix:
$ gdb prologue-include
[snip]
(gdb) break main
Breakpoint 1 at 0x1000058c: file prologue-include.h, line 1.


No regressions detected on PPC32, PPC64, and AMD64.

Regards,
Tiago Daitx


---

gdb/ChangeLog

2013-01-23  Ulrich Weigand  <uweigand@de.ibm.com>

	* symtab.c (skip_prologue_using_sal): Consider a file
	change the same as an increased line number

gdb/testsuite/ChangeLog

2013-01-23  Tiago Stürmer Daitx  <tdaitx@linux.vnet.ibm.com>

	* gdb.base/prologue-include.c: New file.
	* gdb.base/prologue-include.exp: New file.
	* gdb.base/prologue-include.h: New file.


diff --git a/gdb/symtab.c b/gdb/symtab.c
index d40436a..b200b36 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4905,6 +4905,10 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr)
 	     line mark the prologue -> body transition.  */
 	  if (sal.line >= prologue_sal.line)
 	    break;
+	  /* Likewise if we are in a different symtab altogether
+	     (e.g. within a file included via #include).  */
+	  if (sal.symtab != prologue_sal.symtab)
+	    break;
 
 	  /* The line number is smaller.  Check that it's from the
 	     same function, not something inlined.  If it's inlined,
diff --git a/gdb/testsuite/gdb.base/prologue-include.c b/gdb/testsuite/gdb.base/prologue-include.c
new file mode 100644
index 0000000..b39e24d
--- /dev/null
+++ b/gdb/testsuite/gdb.base/prologue-include.c
@@ -0,0 +1,25 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2012-2013 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+main (void)
+{
+  int i, j;
+#include "prologue-include.h"
+  return 0;
+}
+
diff --git a/gdb/testsuite/gdb.base/prologue-include.exp b/gdb/testsuite/gdb.base/prologue-include.exp
new file mode 100644
index 0000000..89fdc1f
--- /dev/null
+++ b/gdb/testsuite/gdb.base/prologue-include.exp
@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
+    return -1
+}
+
+gdb_test "break main" \
+    "Breakpoint.*at.* file .*$testfile.h, line 1\\." \
+    "breakpoint main"
diff --git a/gdb/testsuite/gdb.base/prologue-include.h b/gdb/testsuite/gdb.base/prologue-include.h
new file mode 100644
index 0000000..34b920c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/prologue-include.h
@@ -0,0 +1,2 @@
+  i = 2;
+  j = 2;


^ permalink raw reply	[flat|nested] 16+ messages in thread
* [PATCH] Fix handling of #include files during prologue skipping
@ 2013-01-23 18:39 Tiago Stürmer Daitx
  2013-01-23 19:30 ` Ulrich Weigand
  2013-01-23 19:38 ` Tom Tromey
  0 siblings, 2 replies; 16+ messages in thread
From: Tiago Stürmer Daitx @ 2013-01-23 18:39 UTC (permalink / raw)
  To: gdb-patches; +Cc: emachado, Ulrich.Weigand

In symtab.c:skip_prologue_using_sal, the code goes through the SAL markers 
starting from the beginning of the function, and checks for markers with the 
same (or increasing line numbers). The idea behind this is that if one gets 
decreasing line numbers, than one probably have the case where the optimizer 
scheduled code from later in the function into the prologue.

However, the problem was that this code was simply comparing the line
*numbers* -- even if they refered to a different file! That's why the
presence of the comment makes a difference, because it makes the line
number in t.c larger (or smaller) than the line number in t.h.

This patch simply considers a change in file equivalent to an
increasing line number.

Before the fix:

$ gdb prologue-include
[snip]
(gdb) break main
Breakpoint 1 at 0x10000594: file prologue-include.h, line 2.

After the fix:
$ gdb prologue-include
[snip]
(gdb) break main
Breakpoint 1 at 0x1000058c: file prologue-include.h, line 1.


No regressions detected on PPC32, PPC64, and AMD64.

Regards,
Tiago Daitx



gdb/ChangeLog

2012-11-01  Ulrich Weigand  <uweigand@de.ibm.com>

    * symtab.c (skip_prologue_using_sal): Consider a file
    change the same as an increased file number

gdb/testsuite/ChangeLog

2012-11-01  Tiago Stürmer Daitx  <tdaitx@linux.vnet.ibm.com>
   
    * gdb.base/prologue-include.c: New file.
    * gdb.base/prologue-include.exp: New file.
    * gdb.base/prologue-include.h: New file.


diff --git a/gdb/symtab.c b/gdb/symtab.c
index d40436a..b200b36 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4905,6 +4905,10 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr)
 	     line mark the prologue -> body transition.  */
 	  if (sal.line >= prologue_sal.line)
 	    break;
+	  /* Likewise if we are in a different symtab altogether
+	     (e.g. within a file included via #include).  */
+	  if (sal.symtab != prologue_sal.symtab)
+	    break;
 
 	  /* The line number is smaller.  Check that it's from the
 	     same function, not something inlined.  If it's inlined,
diff --git a/gdb/testsuite/gdb.base/prologue-include.c b/gdb/testsuite/gdb.base/prologue-include.c
new file mode 100644
index 0000000..b39e24d
--- /dev/null
+++ b/gdb/testsuite/gdb.base/prologue-include.c
@@ -0,0 +1,25 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2012-2013 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+main (void)
+{
+  int i, j;
+#include "prologue-include.h"
+  return 0;
+}
+
diff --git a/gdb/testsuite/gdb.base/prologue-include.exp b/gdb/testsuite/gdb.base/prologue-include.exp
new file mode 100644
index 0000000..aa30439
--- /dev/null
+++ b/gdb/testsuite/gdb.base/prologue-include.exp
@@ -0,0 +1,31 @@
+# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
+    return -1
+}
+
+#if ![runto callee] {
+#    return 0
+#}
+
+set test "break main"
+gdb_test_multiple $test $test {
+    -re "\r\nBreakpoint \[0-9\]+ at .*: file .*/$testfile.h, line 1\\.\r\n$gdb_prompt $" {
+	pass $test
+    }
+}
diff --git a/gdb/testsuite/gdb.base/prologue-include.h b/gdb/testsuite/gdb.base/prologue-include.h
new file mode 100644
index 0000000..34b920c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/prologue-include.h
@@ -0,0 +1,2 @@
+  i = 2;
+  j = 2;


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2013-01-24 20:43 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-23 20:34 [PATCH] Fix handling of #include files during prologue skipping Tiago Stürmer Daitx
2013-01-23 20:44 ` Tom Tromey
2013-01-24  0:52 ` Yao Qi
2013-01-24  3:19   ` Tiago Stürmer Daitx
2013-01-24  3:42     ` Yao Qi
2013-01-24  6:23     ` Joel Brobecker
2013-01-24 11:13       ` Pedro Alves
2013-01-24 12:56     ` Ulrich Weigand
2013-01-24 13:11       ` Tiago Stürmer Daitx
2013-01-24 14:28         ` Tiago Stürmer Daitx
2013-01-24 15:01           ` Tiago Stürmer Daitx
2013-01-24 15:12             ` Tom Tromey
2013-01-24 20:43               ` Tiago Stürmer Daitx
  -- strict thread matches above, loose matches on Subject: below --
2013-01-23 18:39 Tiago Stürmer Daitx
2013-01-23 19:30 ` Ulrich Weigand
2013-01-23 19:38 ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox