]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
http://sourceware.org/ml/gdb-patches/2010-12/msg00300.html
authorAndrew Burgess <aburgess@broadcom.com>
Thu, 3 Feb 2011 14:45:37 +0000 (14:45 +0000)
committerAndrew Burgess <aburgess@broadcom.com>
Thu, 3 Feb 2011 14:45:37 +0000 (14:45 +0000)
Improve the ordering of line table entries when dealing with the end
of sequence markers.  This will allow us to disassemble over the border
between two compile units while also displaying source code information.

gdb/ChangeLog
gdb/disasm.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/disasm-end-cu-1.c [new file with mode: 0644]
gdb/testsuite/gdb.base/disasm-end-cu-2.c [new file with mode: 0644]
gdb/testsuite/gdb.base/disasm-end-cu.exp [new file with mode: 0644]

index 1c467ea938544681e7c65d96d921fe7c5c3e538e..7e1511849ac9d3f97e0109a749e34433dd0225f1 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-03  Andrew Burgess  <aburgess@broadcom.com>
+
+       * disasm.c (compare_lines): Handle the end of sequence markers
+       within the line table to better support disassembling over
+       compilation unit boundaries.
+
 2011-02-02  Ulrich Weigand  <ulrich.weigand@linaro.org>
 
        * arm-tdep.c (skip_prologue_function): Add GDBARCH and IS_THUMB
index 9180bc578ed46ec935b50167e9b4516f0ff2e817..ee19f70c0389ec87ed7d9ecfc61bad013d890693 100644 (file)
@@ -77,12 +77,21 @@ compare_lines (const void *mle1p, const void *mle2p)
   mle1 = (struct dis_line_entry *) mle1p;
   mle2 = (struct dis_line_entry *) mle2p;
 
-  val = mle1->line - mle2->line;
-
-  if (val != 0)
-    return val;
-
-  return mle1->start_pc - mle2->start_pc;
+  /* End of sequence markers have a line number of 0 but don't want to
+     be sorted to the head of the list, instead sort by PC.  */
+  if (mle1->line == 0 || mle2->line == 0)
+    {
+      val = mle1->start_pc - mle2->start_pc;
+      if (val == 0)
+        val = mle1->line - mle2->line;
+    }
+  else
+    {
+      val = mle1->line - mle2->line;
+      if (val == 0)
+        val = mle1->start_pc - mle2->start_pc;
+    }
+  return val;
 }
 
 static int
index 0b6095c8d1c29be1b9afbaf8b42e7a51ed1e61ef..a287e4b862e314ee6e53bbf4e374662227bc2ebe 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-03  Andrew Burgess  <aburgess@broadcom.com>
+
+       * gdb.base/disasm-end-cu-1.c, gdb.base/disasm-end-cu-2.c,
+       gdb.base/disasm-end-cu.exp: New test for disassembling over the
+       boundary between two compilation units.
+
 2011-02-02  Pedro Alves  <pedro@codesourcery.com>
 
        * gdb.cp/virtbase.cc (VirtualBase, VirtualMiddleA, VirtualMiddleB)
diff --git a/gdb/testsuite/gdb.base/disasm-end-cu-1.c b/gdb/testsuite/gdb.base/disasm-end-cu-1.c
new file mode 100644 (file)
index 0000000..194b8b1
--- /dev/null
@@ -0,0 +1,28 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright (C) 2010, 2011 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
+dummy_1 (int a, int b, int c)
+{
+  return a + b + c;
+}
+
+int
+main ()
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/disasm-end-cu-2.c b/gdb/testsuite/gdb.base/disasm-end-cu-2.c
new file mode 100644 (file)
index 0000000..be716e7
--- /dev/null
@@ -0,0 +1,28 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright (C) 2010, 2011 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
+dummy_2 (int a, int b, int c)
+{
+  return a + b + c;
+}
+
+int
+dummy_3 (int a, int b, int c)
+{
+  return a - b - c;
+}
diff --git a/gdb/testsuite/gdb.base/disasm-end-cu.exp b/gdb/testsuite/gdb.base/disasm-end-cu.exp
new file mode 100644 (file)
index 0000000..5184f11
--- /dev/null
@@ -0,0 +1,49 @@
+# Copyright (C) 2010, 2011 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/>.
+
+# This test tries to disassemble over the boundary between two compilation
+# units displaying source lines.  This checks that the disassemble routine
+# can handle our use of line number 0 to mark the end of sequence.
+
+if { [prepare_for_testing disasm-end-cu.exp "disasm-end-cu" {disasm-end-cu-1.c disasm-end-cu-2.c} {debug}] } {
+    return -1
+}
+
+if ![runto_main] {
+    return -1
+}
+
+set main_addr [get_hexadecimal_valueof "&main" "0"]
+set dummy_3_addr [get_hexadecimal_valueof "&dummy_3" "0"]
+
+if {$main_addr == 0 || $dummy_3_addr == 0 || $dummy_3_addr <= $main_addr} {
+    fail "Unable to extract required addresses, or addresses out of order"
+    return -1
+}
+
+gdb_test_multiple "disassemble /m ${main_addr},${dummy_3_addr}" "Disassemble address range with source" {
+    -re "Dump of assembler code from ${main_addr} to ${dummy_3_addr}:\r\nEnd of assembler dump\." {
+        fail "No output from the disassemble command"
+    }
+    -re "Line number 0 out of range;.* has $decimal lines\." {
+        fail "The disassemble command failed"
+    }
+    -re "Dump of assembler code from ${main_addr} to ${dummy_3_addr}:\r\n.*main.*End of assembler dump\." {
+        pass "disassemble command returned some output"
+    }
+    -re ".*$gdb_prompt $" {
+        fail "Unexpected output from disassemble command"
+    }
+}