Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <yao@codesourcery.com>
To: Pedro Alves <palves@redhat.com>
Cc: <gdb-patches@sourceware.org>
Subject: Re: [PATCH] Compute the function length instead of hard coding it
Date: Fri, 25 Apr 2014 01:36:00 -0000	[thread overview]
Message-ID: <5359BB87.7080905@codesourcery.com> (raw)
In-Reply-To: <535919EB.3050409@redhat.com>

On 04/24/2014 10:04 PM, Pedro Alves wrote:
> if { $main_length == "" } {
>   return -1
> }
> 
> after gdb_test_multiple, as $main_length is unknown on e.g., internal
> error or timeout too.

OK, let's do the check like this.

> 
>> > +}
>> > +# Calculate the size of the last instruction.  Single instruction
>> > +# shouldn't be longer than 10 bytes.
> x86 has instructions longer than that, though it's not likely
> we'll see them as last instruction.  You want to disassemble two
> instructions.  So instead of having to hard code some number and
> having to explain it in a comment, how about just asking GDB what
> we want, with x/i ?  That is:
> 
> (gdb) x /2i main+72
>    0x45d854 <main+72>:  retq
>    0x45d855:    nopl   (%rax)
> 

"x /2i" is good to me.  Here is the updated patch.

-- 
Yao (齐尧)

gdb/testsuite:

2014-04-25  Yao Qi  <yao@codesourcery.com>

	* gdb.dwarf2/dwz.exp: Compile main.c to object.  Restart GDB
	and compute the length of function main.  Save it in
	$main_length.
	(Dwarf::assemble): Use $main_length instead of hard-coded 10.
	(top-level): Use gdb_compile to compile objects into
	executable and restart GDB.  Remove invocation to
	prepare_for_testing.
---
 gdb/testsuite/gdb.dwarf2/dwz.exp | 62 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 59 insertions(+), 3 deletions(-)

diff --git a/gdb/testsuite/gdb.dwarf2/dwz.exp b/gdb/testsuite/gdb.dwarf2/dwz.exp
index aa0ea7d..6872bde 100644
--- a/gdb/testsuite/gdb.dwarf2/dwz.exp
+++ b/gdb/testsuite/gdb.dwarf2/dwz.exp
@@ -22,10 +22,60 @@ if {![dwarf2_support]} {
 
 standard_testfile main.c dwz.S
 
+if  {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
+	  object {nodebug}] != ""} {
+    return -1
+}
+
+# Start GDB and load object file, compute the function length which is
+# needed in the Dwarf Assembler below.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}1.o
+
+set main_length ""
+set test "disassemble main"
+gdb_test_multiple $test $test {
+    -re ".*$hex <\\+($decimal)>:\[^\r\n\]+\r\nEnd of assembler dump\.\r\n$gdb_prompt $" {
+	set main_length $expect_out(1,string)
+	pass $test
+    }
+}
+
+if { $main_length == "" } {
+    # Bail out here, because we can't do the following tests if
+    # $main_length is unknown.
+    return -1
+}
+
+# Compute the size of the last instruction.
+
+set test "x/2i main+$main_length"
+gdb_test_multiple $test $test {
+    -re ".*($hex) <main\\+$main_length>:\[^\r\n\]+\r\n\[ \]+($hex).*\.\r\n$gdb_prompt $" {
+	set start $expect_out(1,string)
+	set end $expect_out(2,string)
+
+	set main_length [expr $main_length + $end - $start]
+	pass $test
+    }
+}
+
+if { $main_length == "" } {
+    # Bail out here, because we can't do the following tests if
+    # $main_length is unknown.
+    return -1
+}
+
+gdb_exit
+
 # Create the DWARF.
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
     declare_labels partial_label int_label int_label2
+    global main_length
 
     extern main
 
@@ -34,7 +84,7 @@ Dwarf::assemble $asm_file {
 	    subprogram {
 		{name main}
 		{low_pc main addr}
-		{high_pc "main + 10" addr}
+		{high_pc "main + $main_length" addr}
 	    }
 	}
     }
@@ -82,11 +132,17 @@ Dwarf::assemble $asm_file {
     }
 }
 
-if { [prepare_for_testing ${testfile}.exp ${testfile} \
-	  [list $srcfile $asm_file] {nodebug}] } {
+if  {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} {
+    return -1
+}
+
+if  {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \
+	  "${binfile}" executable {}] != ""} {
     return -1
 }
 
+clean_restart ${testfile}
+
 if ![runto_main] {
     return -1
 }
-- 
1.9.0


  reply	other threads:[~2014-04-25  1:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-24 12:46 Yao Qi
2014-04-24 14:04 ` Pedro Alves
2014-04-25  1:36   ` Yao Qi [this message]
2014-04-25 10:37     ` Pedro Alves
2014-04-26  2:50       ` Yao Qi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5359BB87.7080905@codesourcery.com \
    --to=yao@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox