[PATCH] Fix handling of #include files during prologue skipping

Tiago Stürmer Daitx
2013-01-23T20:34:22Z

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;