This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Disassemble over end of line table sequence.


On 31/01/2011 02:41, Joel Brobecker wrote:

I think we're almost there. The disasm.c change looks good to me. But I still have a couple of requests for the testcase.

+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see<http://www.gnu.org/licenses/>.  */
+
+#include<stdio.h>

Can you make your testcase not depend on stdio.h? IO is not always available, particularly on bareboard targets, so it'd be nice to be able to build the example on these platforms too... This should be easily doable by just having another unit that provides a function with the same signature.

Removed, I only included the call to printf to make sure that the functions had some content, some simple arithmetic does the job fine.



+# 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.

Just a nit: missing second space after the period on the second line.

Fixed.



+gdb_test_multiple "disassemble /m ${main_addr},${dummy_3_addr}" "Disassemble address range with source" {
[...]
+    timeout {
+        fail "(timeout) waiting for output of disassemble command"

The "timeout" branch is unnecessary (it's already handled by gdb_test_multiple).


Removed.


New patch is below.

As always, thanks for the review,
Andrew


gdb/ChangeLog 2011-02-02 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.

gdb/testsuite/ChangeLog

2011-02-02 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.

diff --git a/gdb/disasm.c b/gdb/disasm.c
index c51f0bf..f2428b5 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -77,12 +77,22 @@ 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;
+ /* 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 mle1->start_pc - mle2->start_pc;
+ return val;
}
static int
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
index 0000000..194b8b1
--- /dev/null
+++ b/gdb/testsuite/gdb.base/disasm-end-cu-1.c
@@ -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
index 0000000..be716e7
--- /dev/null
+++ b/gdb/testsuite/gdb.base/disasm-end-cu-2.c
@@ -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
index 0000000..5184f11
--- /dev/null
+++ b/gdb/testsuite/gdb.base/disasm-end-cu.exp
@@ -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"
+ }
+}




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]