From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29832 invoked by alias); 27 Feb 2010 00:46:46 -0000 Received: (qmail 29818 invoked by uid 22791); 27 Feb 2010 00:46:45 -0000 X-SWARE-Spam-Status: No, hits=-7.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 27 Feb 2010 00:46:40 +0000 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o1R0kc7Y012094 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 26 Feb 2010 19:46:38 -0500 Received: from host0.dyn.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o1R0kaMr023951 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 26 Feb 2010 19:46:38 -0500 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.3/8.14.3) with ESMTP id o1R0kZgA011074 for ; Sat, 27 Feb 2010 01:46:35 +0100 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.3/8.14.3/Submit) id o1R0kYU3011069 for gdb-patches@sourceware.org; Sat, 27 Feb 2010 01:46:34 +0100 Date: Sat, 27 Feb 2010 00:46:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: Re: [patch] infcall: Remove gdb_assert ($sp underflow) Message-ID: <20100227004634.GA9742@host0.dyn.jankratochvil.net> References: <20100219224805.GA9681@host0.dyn.jankratochvil.net> <20100226225249.GA15019@caradoc.them.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100226225249.GA15019@caradoc.them.org> User-Agent: Mutt/1.5.20 (2009-08-17) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-02/txt/msg00665.txt.bz2 On Fri, 26 Feb 2010 23:52:52 +0100, Daniel Jacobowitz wrote: > On Fri, Feb 19, 2010 at 11:48:05PM +0100, Jan Kratochvil wrote: > > Unaware how inconvenient is an intentional crash of the testcase on some > > embedded/non-MMU systems. > > Maybe limit it at least by nosignals? It might still blow up uClinux > testing, I don't know offhand if there are other crashy tests. OK, used: if {![target_info exists gdb,nosignals] && ![istarget "*-*-uclinux*"]} { > > +foreach spval {0 -1} { > > + set old_ldprefix $pf_prefix > > + lappend pf_prefix "sp=$spval:" > > + > > + gdb_test {set $old_sp = $sp} > > + gdb_test "set \$sp = $spval" > > + > > + gdb_test "call doubleit (1)" > > + > > + gdb_test {set $sp = $old_sp} > > + set pf_prefix $old_ldprefix > > +} > > Because these tests run more than once, please give them unique names. The tests have been already producing: PASS: gdb.base/callfuncs.exp: sp=0: set $old_sp = $sp PASS: gdb.base/callfuncs.exp: sp=0: set $sp = 0 PASS: gdb.base/callfuncs.exp: sp=0: call doubleit (1) PASS: gdb.base/callfuncs.exp: sp=0: set $sp = $old_sp PASS: gdb.base/callfuncs.exp: sp=-1: set $old_sp = $sp PASS: gdb.base/callfuncs.exp: sp=-1: set $sp = -1 PASS: gdb.base/callfuncs.exp: sp=-1: call doubleit (1) PASS: gdb.base/callfuncs.exp: sp=-1: set $sp = $old_sp But OK, made now the tests code more obvious: PASS: gdb.base/callfuncs.exp: set $old_sp = $sp PASS: gdb.base/callfuncs.exp: set $sp = 0 PASS: gdb.base/callfuncs.exp: sp == 0: call doubleit (1) PASS: gdb.base/callfuncs.exp: set $sp = -1 PASS: gdb.base/callfuncs.exp: sp == -1: call doubleit (1) PASS: gdb.base/callfuncs.exp: set $sp = $old_sp Thanks, Jan gdb/ 2010-02-27 Jan Kratochvil * infcall.c (call_function_by_hand): Remove gdb_assert on sp and old_sp. New comment. gdb/testsuite/ 2010-02-27 Jan Kratochvil * gdb.base/callfuncs.exp: New tests for $spval 0 and -1. Remove return. --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -518,10 +518,9 @@ call_function_by_hand (struct value *function, int nargs, struct value **args) /* Stack grows up. */ sp = gdbarch_frame_align (gdbarch, old_sp + 1); } - gdb_assert ((gdbarch_inner_than (gdbarch, 1, 2) - && sp <= old_sp) - || (gdbarch_inner_than (gdbarch, 2, 1) - && sp >= old_sp)); + /* SP may have underflown address zero here from OLD_SP. Memory access + functions will probably fail in such case but that is a target's + problem. */ } else /* FIXME: cagney/2002-09-18: Hey, you loose! --- a/gdb/testsuite/gdb.base/callfuncs.exp +++ b/gdb/testsuite/gdb.base/callfuncs.exp @@ -469,5 +469,17 @@ if {$old_reg_content == $new_reg_content} then { fail "nested call dummies preserve register contents" } -return 0 +# GDB should not crash by internal error on $sp underflow during the inferior +# call. It is OK it will stop on some: Cannot access memory at address 0x$hex. +if {![target_info exists gdb,nosignals] && ![istarget "*-*-uclinux*"]} { + gdb_test {set $old_sp = $sp} + + gdb_test {set $sp = 0} + gdb_test {sp == 0: call doubleit (1)} + + gdb_test {set $sp = -1} + gdb_test {sp == -1: call doubleit (1)} + + gdb_test {set $sp = $old_sp} +}