Re: [PATCH] testsuite: asm-source.exp: add powerpc64 support

Mark Kettenis
2010-11-10T07:45:37Z

> 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
>
>