From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9399 invoked by alias); 3 Dec 2004 18:11:02 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 9361 invoked from network); 3 Dec 2004 18:10:54 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 3 Dec 2004 18:10:54 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iB3IAhGb012273 for ; Fri, 3 Dec 2004 13:10:49 -0500 Received: from localhost.redhat.com (vpn50-46.rdu.redhat.com [172.16.50.46]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iB3IAcr18993; Fri, 3 Dec 2004 13:10:38 -0500 Received: from [127.0.0.1] (localhost.localdomain [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 5E9DD969F2; Fri, 3 Dec 2004 13:09:16 -0500 (EST) Message-ID: <41B0ABC7.4020806@gnu.org> Date: Fri, 03 Dec 2004 18:11:00 -0000 From: Andrew Cagney User-Agent: Mozilla Thunderbird 0.8 (X11/20041020) MIME-Version: 1.0 To: Randolph Chung Cc: gdb-patches@sources.redhat.com Subject: Re: [patch/RFA] multiarch INSTRUCTION_NULLIFIED References: <20041129033013.GJ6359@tausq.org> <41AB3C1D.80509@gnu.org> <20041130065620.GT6359@tausq.org> <41AC88B2.5070501@gnu.org> <20041130164401.GV6359@tausq.org> <41ACA6BE.5080603@gnu.org> <20041130173841.GW6359@tausq.org> <41AE3759.3030503@gnu.org> <20041201223243.GK6359@tausq.org> <41AE5434.9050901@gnu.org> <20041202052417.GM6359@tausq.org> In-Reply-To: <20041202052417.GM6359@tausq.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2004-12/txt/msg00070.txt.bz2 Randolph Chung wrote: >>PPS: A gdb.arch/ addition to tickle the basic edge case would be a >>helpful way of capturing this knowledge. > > > how about this... my first gdb testcase, so hopefully i didn't do > anything too wrong :) > > 74 PASSes, 3 FAILs with the old code (assuming the instruction_nullified > logic is removed). 77 PASSes with my previous patch. > > randolph > > > 2004-12-01 Randolph Chung > > * gdb.arch/pa-nullify.exp: New file. > * gdb.arch/pa-nullify.c: New file. > +send_gdb "print foo\n" > +gdb_expect { > + -re ".* = {int \\(int\\)} ($hex) .*$gdb_prompt $" { > + set baddr $expect_out(1,string) > + verbose "Breakpoint address at $baddr" > + pass "print foo = $baddr" > + } > + default { > + fail "print foo" > + gdb_suppress_tests > + } timeout { > + fail "cannot get address of foo (timed out)." > + gdb_suppress_tests > + } > +} I'd use gdb_test_multiple: it's more robust and handles more cases when things go wrong; and we're trying to eliminate the old style (yes, there is no marker to warn you of this, sigh). It should be a drop-in replacement and easy to fix. Anyway, more relevant, and as daniel asked, can it be done in assember? A starting point for that might be the gdb.asm test case which uses assembly source code. Andrew > +gdb_breakpoint "*$baddr" > + > +gdb_test "display /i \$pc" "1: x/i +\\\$pc.*" "display /i \$pc" > +gdb_test "continue" ".*Breakpoint \[0-9\], foo \\(x=1\\) at .*pa-nullify.c:23.*" "break at first insn of foo" > + > +set done 0 > +set iter 0 > +while { $done == 0 && $iter < 20 } { > + send_gdb "backtrace\n" > + gdb_expect { > + -re ".*foo \\(x=.*\\).* main \\(.*\\).*$gdb_prompt $" { > + pass "backtrace from foo" > + } > + -re "$gdb_prompt $" { > + fail "backtrace from foo" > + gdb_suppress_tests > + } > + timeout { > + fail "(timeout) backtrace from foo" > + gdb_suppress_tests > + } > + } > + > + send_gdb "stepi\n" > + gdb_expect { > + -re ".*: x/i +\\\$pc.*:\[ \t\]+(.*)\r.*$gdb_prompt $" { > + set insn $expect_out(1,string) > + pass "x/i \$pc = $insn" > + } timeout { > + fail "(timeout) x/i \$pc" > + gdb_suppress_tests > + break > + } > + } > + > + incr iter > + > + if { $insn == "bv,n r0(rp)" } { > + pass "found bv,n insn" > + set done 1 > + } > +} > + > +send_gdb "stepi\n" > +gdb_expect { > + -re ".*bv,n r0\\(rp\\)\r.*$gdb_prompt $" { > + pass "restep on nullified instruction" > + } > + -re ".*bar.*\r.*x/i.*bar.*\r.*$gdb_prompt $" { > + fail "step on nullification instruction ended in next function" > + } > + timeout { > + fail "(timeout) restep on nullified instruction" > + } > +} > +incr iter > + > +# Lastly, we do a single step through each instruction and generate a core file. > +# Then, load the core file and verify that we can get a proper backtrace. > + > +if ![isnative] then { > + verbose "skipping core file tests on non-native configuration" > + return > +} > + > +send_gdb "undisplay 1\n" > + > +proc do_core_test { count } { > + global gcorefile > + global gdb_prompt > + global hex > + > + if { ! [ runto_main ] } then { gdb_suppress_tests; } > + > + set baddr "0" > + send_gdb "print foo\n" > + gdb_expect { > + -re ".* = {int \\(int\\)} ($hex) .*$gdb_prompt $" { > + set baddr $expect_out(1,string) > + verbose "Breakpoint address at $baddr" > + pass "print foo = $baddr #$count" > + } > + default { > + fail "print foo #$count" > + gdb_suppress_tests > + } > + timeout { > + fail "cannot get address of foo (timed out). #$count" > + gdb_suppress_tests > + } > + } > + gdb_breakpoint "*$baddr" > + > + gdb_test "continue" ".*Breakpoint \[0-9\]*, foo \\(x=1\\) at .*pa-nullify.c:23.*" "break at first insn of foo #$count" > + > + gdb_test "si $count" > + > + set gcore_works 0 > + set escapedfilename [string_to_regexp $gcorefile] > + gdb_test_multiple "gcore $gcorefile" "gcore" { > + -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" { > + pass "gcore #$count" > + set gcore_works 1 > + } > + -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" { > + unsupported "gcore" > + } > + } > + > + if { $gcore_works } { > + gdb_test "core $gcorefile" "Core was generated by.*" \ > + "load core file #$count" "A program is being debugged already.*" "y" > + > + send_gdb "backtrace\n" > + gdb_expect { > + -re ".*foo \\(x=.*\\).* main \\(.*\\).*$gdb_prompt $" { > + pass "backtrace from foo #$count" > + } > + -re "$gdb_prompt $" { > + fail "backtrace from foo #$count" > + gdb_suppress_tests > + } > + timeout { > + fail "(timeout) backtrace from foo in gcore #$count" > + gdb_suppress_tests > + } > + } > + } > +} > + > +for { set i 1 } { $i <= $iter } {incr i} { > + do_core_test $i > +} > --- /dev/null 2004-08-25 14:59:25.000000000 -0700 > +++ pa-nullify.c 2004-12-01 21:19:51.324347136 -0800 > @@ -0,0 +1,30 @@ > +/* PA nullification test program. > + > + Copyright 2004 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 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, write to the Free Software > + Foundation, Inc., 59 Temple Place - Suite 330, > + Boston, MA 02111-1307, USA. */ > + > +int foo(int x) > +{ return x; } > + > +void bar(void) { } > + > +int main(int argc, char **argv) > +{ > + return foo(argc); > +} >