RFA: add E500 prologue analysis tests

Jim Blandy
2004-05-19T05:36:00Z

Here are some test scripts that run the PPC prologue analyzer against
some prologues containing instructions specific to the PPC E500.

I'm not really sure how to detect when to run this test or not. The
native E500 Linux system just identifies itself as
powerpc-unknown-linux-gnu, so the target triple isn't too helpful.
What I do for now is just try to compile it, and if the compile fails,
I call the test script "unsupported". Is there a more graceful
solution?

2004-05-14 Jim Blandy <jimb@redhat.com>

* gdb.arch/e500-prologue.exp, gdb.arch/e500-prologue.c: New tests.

Index: gdb/testsuite/gdb.arch/e500-prologue.c
===================================================================
RCS file: gdb/testsuite/gdb.arch/e500-prologue.c
diff -N gdb/testsuite/gdb.arch/e500-prologue.c
*** gdb/testsuite/gdb.arch/e500-prologue.c 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.arch/e500-prologue.c 19 May 2004 05:32:28 -0000
***************
*** 0 ****
--- 1,54 ----
+ /* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2004 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+ void arg_passing_test2 (void);
+
+ int
+ main (void)
+ {
+ arg_passing_test2 ();
+ return 0;
+ }
+
+
+ /* Asm for procedure arg_passing_test2.
+
+ The challenge here is getting past the 'mr 0,3' and 'stb'
+ instructions. */
+
+ asm (" .section \".text\"\n"
+ " .align 2\n"
+ " .globl arg_passing_test2\n"
+ " .type arg_passing_test2, @function\n"
+ "arg_passing_test2:\n"
+ " stwu 1,-64(1)\n"
+ " stw 31,60(1)\n"
+ " mr 31,1\n"
+ " mr 0,3\n"
+ " evstdd 4,16(31)\n"
+ " stw 5,24(31)\n"
+ " stw 7,32(31)\n"
+ " stw 8,36(31)\n"
+ " stw 9,40(31)\n"
+ " stb 0,8(31)\n"
+ " lwz 11,0(1)\n"
+ " lwz 31,-4(11)\n"
+ " mr 1,11\n"
+ " blr\n"
+ " .size arg_passing_test2, .-arg_passing_test2\n");
Index: gdb/testsuite/gdb.arch/e500-prologue.exp
===================================================================
RCS file: gdb/testsuite/gdb.arch/e500-prologue.exp
diff -N gdb/testsuite/gdb.arch/e500-prologue.exp
*** gdb/testsuite/gdb.arch/e500-prologue.exp 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.arch/e500-prologue.exp 19 May 2004 05:32:28 -0000
***************
*** 0 ****
--- 1,82 ----
+ # Copyright 2004 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 2 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, write to the Free Software
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ #
+ # This file is part of the gdb testsuite.
+
+ if $tracelevel {
+ strace $tracelevel
+ }
+
+ # Test PowerPC E500 prologue analyzer.
+
+ set prms_id 0
+ set bug_id 0
+
+ if ![istarget "powerpc-*"] then {
+ verbose "Skipping powerpc E500 prologue tests."
+ return
+ }
+
+ set testfile "e500-prologue"
+ set srcfile ${testfile}.c
+ set binfile ${objdir}/${subdir}/${testfile}
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {
+ unsupported "Testcase compile failed."
+ return -1
+ }
+
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+
+ # Insert a breakpoint in FUNCTION and verifies that the breakpoint was
+ # inserted at the expected location. EXPECTED_LOCATION should be an
+ # offset relative to the function start address.
+ proc insert_breakpoint {function expected_location} {
+ global gdb_prompt
+ global expect_out
+ global hex
+
+ set address ""
+
+ # Insert a breakpoint using the given function name, and extract
+ # the breakpoint address for the output.
+ gdb_test_multiple "break $function" "set breakpoint in $function" {
+ -re "Breakpoint 1 at ($hex).*$gdb_prompt $" {
+ set address $expect_out(1,string)
+ }
+ default {
+ fail "set breakpoint in $function"
+ }
+ }
+
+ # If we managed to get the breakpoing address, then check that
+ # we inserted it at the expected location by examining the
+ # instruction at that address (we're not interested in the insn
+ # itself, but rather at the address printed at the begining of
+ # the instruction).
+ if { $address != "" } then {
+ gdb_test "x /i $address" \
+ ".*<$function\\+$expected_location>.*" \
+ "check $function breakpoint address"
+ } else {
+ fail "unable to compute breakpoint address"
+ }
+
+ }
+
+ insert_breakpoint "arg_passing_test2" 40