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] testsuite: asm-source.exp: add powerpc64 support


> From: Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>
> Date: Wed, 10 Nov 2010 05:29:42 -0200
> 
> Hi,
> 
> this patch intents to add powerpc64 support to the asm-source.exp
> testcase. It contains a new include file (powerpc64.inc) which
> defines macros for ppc64 asm.  As some architectures (like ppc64)
> can have one or more instructions after the subroutine call, the
> testcase was modified in order to expect the caller line again as
> well as the next line when issuing "finish" or "return" (as
> mentioned at http://sourceware.org/ml/gdb/2010-11/msg00032.html).
> It also has other minor changes, such as expect '.' prefixing
> ppc64's symbols and call 'sys_exit' sequence on gdbasm_exit0 macro
> for ppc32.
> 
> Tested on x86, ppc32 and ppc64.
> 
> Is that ok?

Why are you making the distinction based on is_lp64_target and not on
the target tuple (powerpc64*-*-* vs. powerpc*-*-*)?

> gdb/testsuite/
> 2010-11-10  Edjunior Machado  <emachado@br.ibm.com>
> 
>  	* asm-source.exp: Add new target "powerpc64"; expect leading `.'
>  	on ppc64's symbols; "finish" and "return" commands must accept to
>  	show the caller line again as well as the line after.
>  	* powerpc64.inc: New file
>  	* powerpc.inc: Use 'sys_exit'
> 
> ---
>  gdb/testsuite/gdb.asm/asm-source.exp |   44 ++++++++++++++++++++++---
>  gdb/testsuite/gdb.asm/powerpc.inc    |    6 ++--
>  gdb/testsuite/gdb.asm/powerpc64.inc  |   57 ++++++++++++++++++++++++++++++++++
>  3 files changed, 98 insertions(+), 9 deletions(-)
>  create mode 100644 gdb/testsuite/gdb.asm/powerpc64.inc
> 
> diff --git a/gdb/testsuite/gdb.asm/asm-source.exp b/gdb/testsuite/gdb.asm/asm-source.exp
> index ca342bd..9053711 100644
> --- a/gdb/testsuite/gdb.asm/asm-source.exp
> +++ b/gdb/testsuite/gdb.asm/asm-source.exp
> @@ -101,7 +101,15 @@ switch -glob -- [istarget] {
>          set asm-arch mips
>      }
>      "powerpc*-*" {
> -        set asm-arch powerpc
> +        if { [is_lp64_target] } {
> +            set asm-arch powerpc64
> +            set asm-flags "-a64 -I${srcdir}/${subdir} -I${objdir}/${subdir}"
> +            append link-flags " -m elf64ppc"
> +        } else {
> +            set asm-arch powerpc
> +            set asm-flags "-a32 -I${srcdir}/${subdir} -I${objdir}/${subdir}"
> +            append link-flags " -m elf32ppc"
> +        }
>      }
>      "sh*-*-*" {
>          set asm-arch sh
> @@ -362,8 +370,19 @@ gdb_test "info source" \
>  	"info source asmsrc1.s"
>  
>  # Try 'finishing' from foo3
> -gdb_test "finish" "Run till exit from.*\[\r\n\]$line_call_foo3_again\[ \t\]+gdbasm_call foo3" \
> -	"finish from foo3"
> +# Some architectures will have one or more instructions after the
> +# call instruction which still is part of the call sequence, so we
> +# must be prepared for a "finish" to show us the caller line
> +# again as well as the statement after.
> +gdb_test_multiple "finish" "finish from foo3" {
> +    -re "Run till exit from.*\[\r\n\]$line_call_foo3\[ \t\]+gdbasm_call foo3.*$gdb_prompt $" {
> +        pass "finish from foo3"
> +        gdb_test "s" ".*" "s after finish"
> +    }
> +    -re "Run till exit from.*\[\r\n\]$line_call_foo3_again\[ \t\]+gdbasm_call foo3.*$gdb_prompt $" {
> +        pass "finish from foo3"
> +    }
> +}
>  
>  # Try 'info source' from asmsrc2.s
>  gdb_test "info source" \
> @@ -400,15 +419,28 @@ gdb_test_multiple "info sources" "info sources" {
>  
>  # Try 'info line'
>  gdb_test "info line" \
> -	"Line $line_call_foo3_again of.*asmsrc2.s.*starts at.*<foo2+.*> and ends at.*<foo2+.*>." \
> +	"Line $line_call_foo3_again of.*asmsrc2.s.*starts at.*<\\.?foo2+.*> and ends at.*<\\.?foo2+.*>." \
>  	"info line"
>  
>  # Try 'nexting' over next call to foo3
>  gdb_test "next" "$line_foo2_leave\[ \t\]+gdbasm_leave" "next over foo3"
>  
>  # Try 'return' from foo2
> -gdb_test "return" "\#0  main .*$line_main_exit\[ \t\]+gdbasm_exit0" "return from foo2" \
> -	"Make (foo2|selected stack frame) return now\?.*" "y"
> +# Like "finish", "return" command also can return to the caller
> +# line again or the statement after, depending on the architecture.
> +gdb_test_multiple "return" "return from foo2" {
> +    -re "Make (foo2|selected stack frame) return now\?.*" {
> +        send_gdb "y\n"
> +        exp_continue
> +    }
> +    -re "\#0.*main .*$line_call_foo2\[ \t\]+gdbasm_call foo2.*$gdb_prompt $" {
> +        pass "return from foo2"
> +        gdb_test "s" ".*" "s after return"
> +    }
> +    -re "\#0.*main .*$line_main_exit\[ \t\]+gdbasm_exit0.*$gdb_prompt $" {
> +        pass "return from foo2"
> +    }
> +}
>  
>  # Disassemble something, check the output
>  proc test_dis { command var } {
> diff --git a/gdb/testsuite/gdb.asm/powerpc.inc b/gdb/testsuite/gdb.asm/powerpc.inc
> index a0797bf..ab700c2 100644
> --- a/gdb/testsuite/gdb.asm/powerpc.inc
> +++ b/gdb/testsuite/gdb.asm/powerpc.inc
> @@ -29,9 +29,9 @@
>  
>  	comment "exit (0)"
>  	.macro gdbasm_exit0
> -	comment "Don't know how to exit, but this will certainly halt..."
> -	li	0, 0
> -	lwz 	0, 0(0)
> +	comment "sys_exit"
> +	li	0, 1
> +	sc
>  	.endm
>  
>  	comment "crt0 startup"
> diff --git a/gdb/testsuite/gdb.asm/powerpc64.inc b/gdb/testsuite/gdb.asm/powerpc64.inc
> new file mode 100644
> index 0000000..7265c07
> --- /dev/null
> +++ b/gdb/testsuite/gdb.asm/powerpc64.inc
> @@ -0,0 +1,57 @@
> +        comment "subroutine declare"
> +        .purgem gdbasm_declare
> +        .macro gdbasm_declare name
> +	.section	".opd","aw"
> +\name:
> +	.quad .\name, .TOC.@tocbase, 0
> +	.section	".text"
> +	.type	\name, @function
> +.\name:
> +        .endm
> +
> +	comment "subroutine prologue"
> +	.macro gdbasm_enter
> +	stdu 1, -112(1)
> +	mflr 0
> +	std 0, 128(1)
> +	.endm
> +
> +	comment "subroutine epilogue"
> +	.macro gdbasm_leave
> +	ld 0, 128(1)
> +	mtlr 0
> +	ld 1, 0(1)
> +	blr
> +	.endm
> +
> +	.macro gdbasm_call subr
> +	bl \subr
> +	nop
> +	.endm
> +
> +	.macro gdbasm_several_nops
> +	nop
> +	nop
> +	nop
> +	nop
> +	.endm
> +
> +	comment "exit (0)"
> +	.macro gdbasm_exit0
> +	comment "sys_exit"
> +	li	0, 1
> +	sc
> +	.endm
> +
> +	comment "crt0 startup"
> +	.macro gdbasm_startup
> +	.p2align 2
> +	.endm
> +
> +	comment "Declare a data variable"
> +	.purgem gdbasm_datavar
> +	.macro gdbasm_datavar name value
> +	.section	".data"
> +\name:
> +	.long \value
> +	.endm
> -- 
> 1.7.1
> 
> 


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