Support R_SPARC_WDISP10 and R_SPARC_H34.
[external/binutils.git] / gdb / testsuite / gdb.base / define.exp
index 1cd06a9..889eca8 100644 (file)
@@ -1,43 +1,44 @@
-# Copyright (C) 1998 Free Software Foundation, Inc.
+# Copyright 1998-1999, 2001, 2003-2004, 2007-2012 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # This file was written by Elena Zannoni. (ezannoni@cygnus.com)
 
-if $tracelevel then {
-       strace $tracelevel
-       }
-
-global usestubs
-
 
 #
 # test running programs
 #
-set prms_id 0
-set bug_id 0
 
 set testfile "break"
 set srcfile ${testfile}.c
+set srcfile1 ${testfile}1.c
 set binfile ${objdir}/${subdir}/${testfile}
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } {
-    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } {
+     untested define.exp
+     return -1
+}
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } {
+     untested define.exp
+     return -1
+}
+
+if  { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } {
+     untested define.exp
+     return -1
 }
 
 gdb_exit
@@ -45,73 +46,44 @@ gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
 
+set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
+set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
+
 if ![runto_main] then { fail "define tests suppressed" }
 
 # Verify that GDB allows a user to define their very own commands.
 #
-send_gdb "define nextwhere\n"
-gdb_expect {
-  -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\
-          {send_gdb "next\nbt\nend\n"
-           gdb_expect {
-             -re "$gdb_prompt $"\
-                     {pass "define user command: nextwhere"}
-             timeout {fail "(timeout) define user command: nextwhere"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "define user command: nextwhere"}
-  timeout {fail "(timeout) define user command: nextwhere"}
+gdb_test_multiple "define nextwhere" "define user command: nextwhere" {
+    -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "next\nbt\nend" "" \
+           "define user command: nextwhere"
+    }
 }
 
 # Verify that those commands work as gdb_expected.
 #
-send_gdb "nextwhere\n"
-gdb_expect {
-  -re ".*64\[ \t\]*printf.*#0\[ \t\]*main.*:64.*$gdb_prompt $"\
-          {pass "use user command: nextwhere"}
-  -re "$gdb_prompt $"\
-          {fail "use user command: nextwhere"}
-  timeout {fail "(timeout) use user command: nextwhere"}
-}
+gdb_test "nextwhere" \
+    "$bp_location1\[ \t\]*printf.*#0\[ \t\]*main.*:$bp_location1.*" \
+    "use user command: nextwhere"
 
 # Verify that a user can define a command whose spelling is a
 # proper substring of another user-defined command.
 #
-send_gdb "define nextwh\n"
-gdb_expect {
-  -re "Type commands for definition of \"nextwh\".\r\nEnd with a line saying just \"end\".\r\n>$"\
-          {send_gdb "next 2\nbt\nend\n"
-           gdb_expect {
-             -re "$gdb_prompt $"\
-                     {pass "define user command: nextwh"}
-             timeout {fail "(timeout) define user command: nextwh"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "define user command: nextwh"}
-  timeout {fail "(timeout) define user command: nextwh"}
+gdb_test_multiple "define nextwh" "define user command: nextwh" {
+    -re "Type commands for definition of \"nextwh\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "next 2\nbt\nend" "" \
+           "define user command: nextwh"
+    }
 }
 
 # Verify that a user can redefine their commands.  (Test both the
 # confirmed and unconfirmed cases.)
 #
-send_gdb "define nextwhere\n"
-gdb_expect {
-  -re "Redefine command \"nextwhere\".*y or n. $"\
-          {send_gdb "n\n"
-           gdb_expect {
-             -re "Command \"nextwhere\" not redefined.*$gdb_prompt $"\
-                     {pass "redefine user command aborted: nextwhere"}
-             -re "$gdb_prompt $"\
-                     {fail "redefine user command aborted: nextwhere"}
-             timeout {fail "(timeout) redefine user command aborted: nextwhere"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "redefine user command aborted: nextwhere"}
-  timeout {fail "(timeout) redefine user command aborted: nextwhere"}
-}
+gdb_test "define nextwhere" \
+    "Command \"nextwhere\" not redefined.*" \
+    "redefine user command aborted: nextwhere" \
+    "Redefine command \"nextwhere\".*y or n. $" \
+    "n"
 
 send_gdb "define nextwhere\n"
 gdb_expect {
@@ -137,120 +109,112 @@ gdb_expect {
 # Verify that GDB gracefully handles an attempt to redefine the
 # help text for a builtin command.
 #
-send_gdb "document step\n"
-gdb_expect {
-  -re "Command \"step\" is built-in..*$gdb_prompt $"\
-          {pass "redocumenting builtin command disallowed"}
-  -re "$gdb_prompt $"\
-          {fail "redocumenting builtin command disallowed"}
-  timeout {fail "(timeout) redocumenting builtin command disallowed"}
-}
+gdb_test "document step" "Command \"step\" is built-in.*" \
+    "redocumenting builtin command disallowed"
 
 # Verify that a user can document their own commands.  (And redocument
 # them.)
 #
-send_gdb "document nextwhere\n"
-gdb_expect {
-  -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\
-          {send_gdb "A next command that frist shows you where you're stepping from.\nend\n"
-           gdb_expect {
-             -re "$gdb_prompt $"\
-                     {pass "document user command: nextwhere"}
-             timeout {fail "(timeout) document user command: nextwhere"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "documenting user command: nextwhere"}
-  timeout {fail "(timeout) documenting user command: nextwhere"}
+gdb_test_multiple "document nextwhere" "document user command: nextwhere" {
+    -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "A next command that first shows you where you're stepping from.\nend" \
+           "" \
+           "document user command: nextwhere"
+    }
 }
 
-send_gdb "document nextwhere\n"
-gdb_expect {
-  -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\
-          {send_gdb "A next command that first shows you where you're stepping from.\nend\n"
-           gdb_expect {
-             -re "$gdb_prompt $"\
-                     {pass "document user command: nextwhere"}
-             timeout {fail "(timeout) document user command: nextwhere"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "documenting user command: nextwhere"}
-  timeout {fail "(timeout) documenting user command: nextwhere"}
+gdb_test_multiple "document nextwhere" "re-document user command: nextwhere" {
+    -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "A next command that first shows you where you're stepping from.\nend" \
+           "" \
+           "re-document user command: nextwhere"
+    }
 }
 
-send_gdb "help nextwhere\n"
-gdb_expect {
-  -re "A next command that first shows you where you're stepping from.\r\n$gdb_prompt $"\
-          {pass "help user command: nextwhere"}
-  -re "$gdb_prompt $"\
-          {fail "help user command: nextwhere"}
-  timeout {fail "(timeout) help user command: nextwhere"}
+gdb_test "help nextwhere" \
+    "A next command that first shows you where you're stepping from.*" \
+    "help user command: nextwhere"
+
+# Verify that the document command preserves whitespace in the beginning of the line.
+#
+gdb_test_multiple "document nextwhere" "set up whitespace in help string" {
+    -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "   A next command that first shows you where you're stepping from.\nend" \
+           "" \
+           "set up whitespace in help string"
+    }
+}
+
+gdb_test "help nextwhere" \
+    "   A next command that first shows you where you're stepping from.*" \
+    "preserve whitespace in help string"
+
+# Verify that the command parser doesn't require a space after an 'if'
+# command in a user defined function.
+#
+gdb_test_multiple "define ifnospace" "define user command: ifnospace" \
+{
+  -re "Type commands for definition of \"ifnospace\".\r\nEnd with a line saying just \"end\".\r\n>$" \
+    {
+      gdb_test_multiple "if(3<4)\nprint \"hi there\\n\"\nend\nend" "send body of ifnospace"  \
+        {
+         -re "$gdb_prompt $"\
+                 {pass "define user command: ifnospace"}
+        }
+    }
+}
+
+gdb_test "ifnospace" ".*hi there.*" "test ifnospace is parsed correctly"
+
+# Verify that the command parser doesn't require a space after an 'while'
+# command in a user defined function.
+#
+gdb_test_multiple "define whilenospace" "define user command: whilenospace" \
+{
+  -re "Type commands for definition of \"whilenospace\".\r\nEnd with a line saying just \"end\".\r\n>$" \
+    {
+      gdb_test_multiple "set \$i=1\nwhile(\$i<2)\nset \$i=2\nprint \"hi there\\n\"\nend\nend" "send body of whilenospace" \
+         {
+           -re "$gdb_prompt $" \
+                   {pass "define user command: whilenospace"}
+         }
+    }
 }
 
+gdb_test "whilenospace" ".*hi there.*" "test whilenospace is parsed correctly"
+
 # Verify that the user can "hook" a builtin command.  We choose to
 # hook the "stop" pseudo command, and we'll define it to use a user-
 # define command.
 #
-send_gdb "define user-bt\n"
-gdb_expect {
-  -re "Type commands for definition of \"user-bt\".\r\nEnd with a line saying just \"end\".\r\n>$"\
-          {send_gdb "bt\nend\n"
-           gdb_expect {
-             -re "$gdb_prompt $"\
-                       {pass "define user command: user-bt"}
-             timeout {fail "(timeout) define user command: user-bt"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "define user command: user-bt"}
-  timeout {fail "(timeout) define user command: user-bt"}
+gdb_test_multiple "define user-bt" "define user command: user-bt" {
+    -re "Type commands for definition of \"user-bt\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "bt\nend" \
+           "" \
+           "define user command: user-bt"
+    }
 }
 
-send_gdb "define hook-stop\n"
-gdb_expect {
-  -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$"\
-          {send_gdb "user-b\nend\n"
-           gdb_expect {
-             -re "$gdb_prompt $"\
-                       {pass "define hook-stop command"}
-             timeout {fail "(timeout) define hook-stop command"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "define hook-stop command"}
-  timeout {fail "(timeout) define hook-stop command"}
+gdb_test_multiple "define hook-stop" "define hook-stop command" {
+    -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "user-b\nend" \
+           "" \
+           "define hook-stop command"
+    }
 }
 
-send_gdb "next\n"
-gdb_expect {
-  -re "#0\[ \t\]*main.*:66.*$gdb_prompt $"\
-          {pass "use hook-stop command"}
-  -re "$gdb_prompt $"\
-          {fail "use hook-stop command"}
-  timeout {fail "(timeout) use hook-stop command"}
-}
+gdb_test "next" "#0\[ \t\]*main.*:$bp_location11.*" \
+    "use hook-stop command"
 
 # Verify that GDB responds gracefully to an attempt to define a "hook
 # command" which doesn't exist.  (Test both the confirmed and unconfirmed
 # cases.)
 #
-send_gdb "define hook-bar\n"
-gdb_expect {
-  -re "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $"\
-          {send_gdb "n\n"
-           gdb_expect {
-             -re "Not confirmed.*$gdb_prompt $"\
-                     {pass "define hook undefined command aborted: bar"}
-             -re "$gdb_prompt $"\
-                     {fail "define hook undefined command aborted: bar"}
-             timeout {fail "(timeout) define hook undefined command aborted: bar"}
-           }
-          }
-  -re "$gdb_prompt $"\
-          {fail "define hook undefined command aborted: bar"}
-  timeout {fail "(timeout) define hook undefined command aborted: bar"}
-}
+gdb_test "define hook-bar" \
+    "Not confirmed.*" \
+    "define hook undefined command aborted: bar" \
+    "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $" \
+    "n"
 
 send_gdb "define hook-bar\n"
 gdb_expect {
@@ -275,30 +239,51 @@ gdb_expect {
   timeout {fail "(timeout) define hook undefined command: bar"}
 }
 
-# This is a quasi-define command: Verify that the user can redefine
-# GDB's gdb_prompt.
-#
-send_gdb "set prompt \\(blah\\) \n"
-gdb_expect {
-  -re "\\(blah\\) $"\
-          {pass "set gdb_prompt"}
-  -re "$gdb_prompt $"\
-          {fail "set gdb_prompt"}
-  timeout {fail "(timeout) set gdb_prompt"}
+# Test creation of an additional target subcommand.
+gdb_test_multiple "define target testsuite" "" {
+    -re "Type commands for definition of \"target testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "printf \"hello\\n\"\nend" "" "define target testsuite"
+    }
 }
-
-send_gdb "set prompt \\(gdb\\) \n"
-gdb_expect {
-  -re "$gdb_prompt $"\
-          {pass "reset gdb_prompt"}
-  timeout {fail "(timeout) reset gdb_prompt"}
+gdb_test_multiple "document target testsuite" "" {
+    -re "Type documentation for \"target testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "A test target.\nend" "" "document target testsuite"
+    }
 }
 
-gdb_exit
-return 0
+gdb_test "help target" ".*A test target.*"
+gdb_test "target testsuite" "hello"
+gdb_test "show user target testsuite" "User command \"target testsuite\":\r\n  printf \"hello\\\\n\"\r\n"
 
+# We should even be able to hook subcommands.
+gdb_test_multiple "define target hook-testsuite" "" {
+    -re "Type commands for definition of \"target hook-testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "printf \"one\\n\"\nend" "" "define target hook-testsuite"
+    }
+}
 
+gdb_test_multiple "define target hookpost-testsuite" "" {
+    -re "Type commands for definition of \"target hookpost-testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" {
+       gdb_test "printf \"two\\n\"\nend" "" "define target hookpost-testsuite"
+    }
+}
 
+gdb_test "target testsuite" "one\r\nhello\r\ntwo" "target testsuite with hooks"
 
+# This is a quasi-define command: Verify that the user can redefine
+# GDB's gdb_prompt.
+#
+gdb_test_multiple "set prompt \\(blah\\) " "set gdb_prompt" {
+    -re "\\(blah\\) $" {
+       pass "set gdb_prompt"
+    }
+}
 
+gdb_test_multiple "set prompt \\(gdb\\) " "reset gdb_prompt" {
+    -re "$gdb_prompt $" {
+       pass "reset gdb_prompt"
+    }
+}
 
+gdb_exit
+return 0