From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30691 invoked by alias); 17 Oct 2014 13:20:14 -0000 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 Received: (qmail 30638 invoked by uid 89); 17 Oct 2014 13:20:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 17 Oct 2014 13:20:09 +0000 Received: from svr-orw-fem-02x.mgc.mentorg.com ([147.34.96.206] helo=SVR-ORW-FEM-02.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1Xf7Ru-0003Qq-Du from Yao_Qi@mentor.com ; Fri, 17 Oct 2014 06:20:06 -0700 Received: from GreenOnly (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.3.181.6; Fri, 17 Oct 2014 06:20:05 -0700 From: Yao Qi To: Pedro Alves CC: Subject: Re: [PATCH] Skip argv0-symlink.exp on target argv[0] isn't available References: <1413440712-3645-1-git-send-email-yao@codesourcery.com> <54400505.6070908@redhat.com> <87lhofkvr8.fsf@codesourcery.com> <5440FA3F.4000805@redhat.com> Date: Fri, 17 Oct 2014 13:20:00 -0000 In-Reply-To: <5440FA3F.4000805@redhat.com> (Pedro Alves's message of "Fri, 17 Oct 2014 12:15:11 +0100") Message-ID: <874mv2ltut.fsf@codesourcery.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes X-SW-Source: 2014-10/txt/msg00473.txt.bz2 Pedro Alves writes: > So how about instead of silently skipping the tests, call > unsupported, like: > > global has_argv0 > set test "verify dereferenced value" > if { $has_argv0 } { > gdb_test "python print (arg0)" "0x.*$testfile\"" $test > } else { > unsupported $test > } > OK, fixed in the updated patch. > etc. > >> +gdb_caching_proc gdb_has_argv0 { >> + set result 0 > ... >> + # Helper proc. >> + proc gdb_has_argv0_1 { exe } { > ... >> + set result [gdb_has_argv0_1 $exe] > > And then in addition, add an assert here for the main OSs > we support, like so: > > if { !$result > && ([istarget *-*-linux*] > || [istarget *-*-gnu*] > || [istarget *-*-cygwin*] > || [istarget *-*-mingw*] > || [istarget *-*-darwin*] > || [istarget *-*-bsd*] > || [istarget *-*-solaris*] > || [istarget *-*-msdosdjgpp*] > || [istarget *-*-go32*] > || [istarget *-*-aix*] > || [istarget *-*-hpux*]) } { > fail "argv[0] should be available on this target" > } > OK, I list all OSes GDB supports (extracted from configure.tgt and configur= e.ac). >> + # Helper proc. >> + proc gdb_has_argv0_1 { exe } { >> + global srcdir subdir >> + global gdb_prompt hex decimal >> + >> + gdb_exit >> + gdb_start >> + gdb_reinitialize_dir $srcdir/$subdir >> + gdb_load "$exe" > > BTW, use clean_restart here? (if so, I think 'global srcdir subdir' > becomes unnecessary too) Unfortunately we can't. clean_restart loads file from $objdir/$subdir, but $exe is in $objdir or $objdir/temp. --=20 Yao (=E9=BD=90=E5=B0=A7) Subject: [PATCH] Skip testing argv[0] on target argv[0] isn't available I see the following two fails on arm-none-eabi target, because argv[0] isn't available. print argv[0]^M $1 =3D 0x1f78 "/dev/null"^M (gdb) FAIL: gdb.base/argv0-symlink.exp: kept file symbolic link name print argv[0]^M $1 =3D 0x1f78 "/dev/null"^M (gdb) FAIL: gdb.base/argv0-symlink.exp: kept directory symbolic link name My first thought is to check [target_info exists noargs], and skip the test if it returns true. However, noargs is set in gdbserver board files, so argv0-symlink.exp will be skipped on gdbserver board file. The change is too aggressive. When the program is running with gdbserver, argv[1] to argv[N] aren't available, but argv[0] is. Fortunately, argv0-symlink.exp only requires argv[0]. argv0-symlink.exp can be run with gdbserver board file, as what we do now. What we need to check is whether argv[0] is available, so I add a new proc gdb_has_argv0 to do so by starting a program, and check argc/argv[0] to see whether argv[0] is available. Dan fixed the similar problem by checking noargs, which is too strong. https://sourceware.org/ml/gdb-patches/2010-02/msg00398.html as a result, the test is skipped on gdbserver. This patch fixed it too. gdb/testsuite: 2014-10-17 Yao Qi * gdb.base/argv0-symlink.exp: Check argv[0] value if gdb_has_argv0 return true. * gdb.guile/scm-value.exp (test_value_in_inferior): Don't check [target_info exists noargs], check [gdb_has_argv0] instead. * gdb.python/py-value.exp (test_value_in_inferior): Likewise. * lib/gdb.exp (gdb_has_argv0, gdb_has_argv0_1): New procedures. diff --git a/gdb/testsuite/gdb.base/argv0-symlink.exp b/gdb/testsuite/gdb.b= ase/argv0-symlink.exp index d849b4c..cd459bb 100644 --- a/gdb/testsuite/gdb.base/argv0-symlink.exp +++ b/gdb/testsuite/gdb.base/argv0-symlink.exp @@ -15,6 +15,8 @@ =20 standard_testfile =20 +set has_argv0 [gdb_has_argv0] + if { [build_executable ${testfile}.exp ${testfile} ${srcfile}] =3D=3D -1 }= { return -1 } @@ -39,7 +41,11 @@ if ![runto_main] { gdb_test_no_output "set print repeats 10000" gdb_test_no_output "set print elements 10000" =20 -gdb_test {print argv[0]} "/$filelink\"" $test +if { $has_argv0 } { + gdb_test {print argv[0]} "/$filelink\"" $test +} else { + unsupported $test +} =20 # For a link named /PATH/TO/DIR/LINK, we want to check the output # against "/DIR/LINK", but computed in a way that doesn't make @@ -73,9 +79,14 @@ if ![runto_main] { gdb_test_no_output "set print repeats 10000" gdb_test_no_output "set print elements 10000" =20 -# gdbserver does not have this issue. -if ![is_remote target] { - setup_kfail "*-*-*" gdb/15934 +if { $has_argv0 } { + # gdbserver does not have this issue. + if ![is_remote target] { + setup_kfail "*-*-*" gdb/15934 + } + gdb_test {print argv[0]} "/$dirlink/$filelink\"" $test +} else { + unsupported $test } -gdb_test {print argv[0]} "/$dirlink/$filelink\"" $test + gdb_test "info inferiors" "/$lastdir/$filelink *" "$test for info inferior= s" diff --git a/gdb/testsuite/gdb.guile/scm-value.exp b/gdb/testsuite/gdb.guil= e/scm-value.exp index ae80d1b..033633c 100644 --- a/gdb/testsuite/gdb.guile/scm-value.exp +++ b/gdb/testsuite/gdb.guile/scm-value.exp @@ -20,6 +20,8 @@ load_lib gdb-guile.exp =20 standard_testfile =20 +set has_argv0 [gdb_has_argv0] + # Build inferior to language specification. # LANG is one of "c" or "c++". proc build_inferior {exefile lang} { @@ -86,9 +88,12 @@ proc test_value_in_inferior {} { "set arg0" =20 # Check that the dereferenced value is sane. - if { ! [target_info exists noargs] } { - gdb_test "gu (print arg0)" \ - "0x.*$testfile\"" "verify dereferenced value" + global has_argv0 + set test "verify dereferenced value" + if { $has_argv0 } { + gdb_test "gu (print arg0)" "0x.*$testfile\"" $test + } else { + unsupported $test } =20 # Smoke-test value-optimized-out?. diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.pyth= on/py-value.exp index 0d18bef..0e1534a 100644 --- a/gdb/testsuite/gdb.python/py-value.exp +++ b/gdb/testsuite/gdb.python/py-value.exp @@ -20,6 +20,8 @@ load_lib gdb-python.exp =20 standard_testfile =20 +set has_argv0 [gdb_has_argv0] + # Build inferior to language specification. # LANG is one of "c" or "c++". proc build_inferior {exefile lang} { @@ -221,8 +223,12 @@ proc test_value_in_inferior {} { gdb_py_test_silent_cmd "python arg0 =3D argv.dereference ()" "dereferenc= e value" 1 =20 # Check that the dereferenced value is sane - if { ! [target_info exists noargs] } { - gdb_test "python print (arg0)" "0x.*$testfile\"" "verify dereferenced = value" + global has_argv0 + set test "verify dereferenced value" + if { $has_argv0 } { + gdb_test "python print (arg0)" "0x.*$testfile\"" $test + } else { + unsupported $test } =20 # Smoke-test is_optimized_out attribute diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 7b2a402..37e701c 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -4227,6 +4227,104 @@ gdb_caching_proc gdb_skip_xml_test { return $xml_missing } =20 +# Return true if argv[0] is available. + +gdb_caching_proc gdb_has_argv0 { + set result 0 + + # Set up, compile, and execute a test program to check whether + # argv[0] is available. + set src [standard_temp_file has_argv0[pid].c] + set exe [standard_temp_file has_argv0[pid].x] + + gdb_produce_source $src { + int main (int argc, char **argv) { + return 0; + } + } + + gdb_compile $src $exe executable {debug} + + # Helper proc. + proc gdb_has_argv0_1 { exe } { + global srcdir subdir + global gdb_prompt hex + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load "$exe" + + # Set breakpoint on main. + gdb_test_multiple "break main" "break main" { + -re "Breakpoint.*${gdb_prompt} $" { + } + -re "${gdb_prompt} $" { + return 0 + } + } + + # Run to main. + gdb_run_cmd + gdb_test_multiple "" "run to main" { + -re "Breakpoint.*${gdb_prompt} $" { + } + -re "${gdb_prompt} $" { + return 0 + } + } + + # Check whether argc is 1. + gdb_test_multiple "p argc" "p argc" { + -re " =3D 1\r\n${gdb_prompt} $" { + + gdb_test_multiple "p argv\[0\]" "p argv\[0\]" { + -re " =3D $hex \".*[file tail $exe]\"\r\n${gdb_prompt} $" { + return 1 + } + -re "${gdb_prompt} $" { + return 0 + } + } + } + -re "${gdb_prompt} $" { + return 0 + } + } + return 0 + } + + set result [gdb_has_argv0_1 $exe] + + gdb_exit + file delete $src + file delete $exe + + if { !$result + && ([istarget *-*-linux*] + || [istarget *-*-freebsd*] || [istarget *-*-kfreebsd*] + || [istarget *-*-netbsd*] || [istarget *-*-knetbsd*] + || [istarget *-*-openbsd*] + || [istarget *-*-darwin*] + || [istarget *-*-solaris*] + || [istarget *-*-aix*] + || [istarget *-*-gnu*] + || [istarget *-*-cygwin*] || [istarget *-*-mingw32*] + || [istarget *-*-*djgpp*] || [istarget *-*-go32*] + || [istarget *-wince-pe] || [istarget *-*-mingw32ce*] + || [istarget *-*-symbianelf*] + || [istarget *-*-osf*] + || [istarget *-*-hpux*] + || [istarget *-*-dicos*] + || [istarget *-*-nto*] + || [istarget *-*-*vms*] + || [istarget *-*-lynx*178]) } { + fail "argv\[0\] should be available on this target" + } + + return $result +} + # Note: the procedure gdb_gnu_strip_debug will produce an executable called # ${binfile}.dbglnk, which is just like the executable ($binfile) but with= out # the debuginfo. Instead $binfile has a .gnu_debuglink section which conta= ins