Message-Id: <1410525085-29172-1-git-send-email-emachado@linux.vnet.ibm.com> commit 9d9bf2df89db515958b429a1aeb1db38884ba488 Author: Edjunior Barbosa Machado Date: Fri Sep 12 09:20:25 2014 -0300 PR tdep/17379: Fix internal-error when stack pointer is invalid. The problem is that rs6000_frame_cache attempts to read the stack backchain via read_memory_unsigned_integer, which throws an exception if the stack pointer is invalid. With this patch, it calls safe_read_memory_integer instead, which doesn't throw an exception and allows for safe handling of that situation. gdb/ChangeLog 2014-09-12 Edjunior Barbosa Machado Ulrich Weigand  PR tdep/17379 * rs6000-tdep.c (rs6000_frame_cache): Use safe_read_memory_integer instead of read_memory_unsigned_integer. gdb/testcase/ChangeLog 2014-09-12 Edjunior Barbosa Machado PR tdep/17379 * gdb.arch/powerpc-stackless.S: New file. * gdb.arch/powerpc-stackless.exp: New file. Index: gdb-7.6.1/gdb/rs6000-tdep.c =================================================================== --- gdb-7.6.1.orig/gdb/rs6000-tdep.c +++ gdb-7.6.1/gdb/rs6000-tdep.c @@ -3241,9 +3241,14 @@ rs6000_frame_cache (struct frame_info *t } if (!fdata.frameless) - /* Frameless really means stackless. */ - cache->base - = read_memory_unsigned_integer (cache->base, wordsize, byte_order); + { + /* Frameless really means stackless. */ + LONGEST backchain; + + if (safe_read_memory_integer (cache->base, wordsize, + byte_order, &backchain)) + cache->base = (CORE_ADDR) backchain; + } trad_frame_set_value (cache->saved_regs, gdbarch_sp_regnum (gdbarch), cache->base); Index: gdb-7.6.1/gdb/testsuite/gdb.arch/powerpc-stackless.S =================================================================== --- /dev/null +++ gdb-7.6.1/gdb/testsuite/gdb.arch/powerpc-stackless.S @@ -0,0 +1,24 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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 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 . */ + +#include + +FUNC_START(main) + li sp,0 + mtlr sp + blr +FUNC_END(main) Index: gdb-7.6.1/gdb/testsuite/gdb.arch/powerpc-stackless.exp =================================================================== --- /dev/null +++ gdb-7.6.1/gdb/testsuite/gdb.arch/powerpc-stackless.exp @@ -0,0 +1,42 @@ +# Copyright 2014 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 . + +# Testcase for PR tdep/17379. + +if {![istarget "powerpc*-*-*"]} then { + verbose "Skipping powerpc-stackless.exp" + return +} + +standard_testfile .S + +if { [prepare_for_testing $testfile.exp $testfile $srcfile] } { + untested powerpc-stackless.exp + 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"