S390: Fix internal error with stackless inferior
authorAndreas Arnez <arnez@linux.vnet.ibm.com>
Tue, 1 Mar 2016 11:43:55 +0000 (12:43 +0100)
committerAndreas Arnez <arnez@linux.vnet.ibm.com>
Tue, 1 Mar 2016 11:43:55 +0000 (12:43 +0100)
This fixes a GDB internal error that may occur when the inferior has no
valid stack pointer in r15.

gdb/testsuite/ChangeLog:

* gdb.arch/s390-stackless.S: New.
* gdb.arch/s390-stackless.exp: New.

gdb/ChangeLog:

* s390-linux-tdep.c (s390_backchain_frame_unwind_cache): Avoid
exception when attempting to access the inferior's backchain.

gdb/ChangeLog
gdb/s390-linux-tdep.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/s390-stackless.S [new file with mode: 0644]
gdb/testsuite/gdb.arch/s390-stackless.exp [new file with mode: 0644]

index a728959..75c9285 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-01  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       * s390-linux-tdep.c (s390_backchain_frame_unwind_cache): Avoid
+       exception when attempting to access the inferior's backchain.
+
 2016-02-29  Yao Qi  <yao.qi@linaro.org>
 
        * aarch64-linux-tdep.c (aarch64_canonicalize_syscall): Support
index 57e25b4..7f860b6 100644 (file)
@@ -2180,7 +2180,7 @@ s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR backchain;
   ULONGEST reg;
-  LONGEST sp;
+  LONGEST sp, tmp;
   int i;
 
   /* Set up ABI call-saved/call-clobbered registers.  */
@@ -2193,7 +2193,9 @@ s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
 
   /* Get the backchain.  */
   reg = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
-  backchain = read_memory_unsigned_integer (reg, word_size, byte_order);
+  if (!safe_read_memory_integer (reg, word_size, byte_order, &tmp))
+    tmp = 0;
+  backchain = (CORE_ADDR) tmp;
 
   /* A zero backchain terminates the frame chain.  As additional
      sanity check, let's verify that the spill slot for SP in the
index 6aa0713..84f963c 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-01  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       * gdb.arch/s390-stackless.S: New.
+       * gdb.arch/s390-stackless.exp: New.
+
 2016-02-28  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * gdb.dlang/circular.c: New file.
diff --git a/gdb/testsuite/gdb.arch/s390-stackless.S b/gdb/testsuite/gdb.arch/s390-stackless.S
new file mode 100644 (file)
index 0000000..77944ab
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright 2015-2016 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 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, see <http://www.gnu.org/licenses/>.  */
+
+       .text
+
+       .align  8
+       .globl  main
+       .type   main, @function
+       /* Ensure an invalid stack pointer and link register.  Don't
+       use zero, since that may be handled specially.  */
+main:  la      %r15,3(0,0)
+       la      %r14,1(0,0)
+       j       1f
+       .size   main, .-main
+
+       /* Outside any function.  */
+       .byte   0,1
+1:     st      %r15,0(%r15)
+       br      %r14
diff --git a/gdb/testsuite/gdb.arch/s390-stackless.exp b/gdb/testsuite/gdb.arch/s390-stackless.exp
new file mode 100644 (file)
index 0000000..b4aedb5
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright 2016 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, see <http://www.gnu.org/licenses/>.
+
+if {![istarget "s390*-*-*"]} then {
+    verbose "Skipping s390 stackless test."
+    return
+}
+
+standard_testfile .S
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+# Run until SIGSEGV.
+gdb_run_cmd
+
+set test "run until SIGSEGV"
+gdb_test_multiple "" $test {
+    -re "Program received signal SIGSEGV.*$gdb_prompt $" {
+       pass $test
+    }
+}
+
+# Ensure that 'info registers' works properly and does not generate
+# an internal-error.
+gdb_test "info registers" "r0.*" "info registers"