From: Edjunior Barbosa Machado Date: Fri, 12 Sep 2014 12:20:25 +0000 (-0300) Subject: PR tdep/17379: Fix internal-error when stack pointer is invalid. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d9bf2df89db515958b429a1aeb1db38884ba488;p=binutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 56f676dc118..0ec71d48029 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +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. + 2014-09-12 Gary Benson * nat/linux-waitpid.c: Include common-defs.h. diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 730afe7eaf1..dabf448aa8a 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -3190,9 +3190,14 @@ rs6000_frame_cache (struct frame_info *this_frame, void **this_cache) } 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); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 46ffa75d26b..a5d7446ac1e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-09-12 Edjunior Barbosa Machado + + PR tdep/17379 + * gdb.arch/powerpc-stackless.S: New file. + * gdb.arch/powerpc-stackless.exp: New file. + 2014-09-12 Jan Kratochvil * gdb.base/attach.c: Include unistd.h. diff --git a/gdb/testsuite/gdb.arch/powerpc-stackless.S b/gdb/testsuite/gdb.arch/powerpc-stackless.S new file mode 100644 index 00000000000..bbf92bb7e38 --- /dev/null +++ b/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) diff --git a/gdb/testsuite/gdb.arch/powerpc-stackless.exp b/gdb/testsuite/gdb.arch/powerpc-stackless.exp new file mode 100644 index 00000000000..420bcbcb618 --- /dev/null +++ b/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"