+# 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
+ }
+ }
+
+ set old_elements "200"
+ set test "show print elements"
+ gdb_test_multiple $test $test {
+ -re "Limit on string chars or array elements to print is (\[^\r\n\]+)\\.\r\n$gdb_prompt $" {
+ set old_elements $expect_out(1,string)
+ }
+ }
+ set old_repeats "200"
+ set test "show print repeats"
+ gdb_test_multiple $test $test {
+ -re "Threshold for repeated print elements is (\[^\r\n\]+)\\.\r\n$gdb_prompt $" {
+ set old_repeats $expect_out(1,string)
+ }
+ }
+ gdb_test_no_output "set print elements unlimited" ""
+ gdb_test_no_output "set print repeats unlimited" ""
+
+ set retval 0
+ # Check whether argc is 1.
+ gdb_test_multiple "p argc" "p argc" {
+ -re " = 1\r\n${gdb_prompt} $" {
+
+ gdb_test_multiple "p argv\[0\]" "p argv\[0\]" {
+ -re " = $hex \".*[file tail $exe]\"\r\n${gdb_prompt} $" {
+ set retval 1
+ }
+ -re "${gdb_prompt} $" {
+ }
+ }
+ }
+ -re "${gdb_prompt} $" {
+ }
+ }
+
+ gdb_test_no_output "set print elements $old_elements" ""
+ gdb_test_no_output "set print repeats $old_repeats" ""
+
+ return $retval
+ }
+
+ 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 *-*-dicos*]
+ || [istarget *-*-nto*]
+ || [istarget *-*-*vms*]
+ || [istarget *-*-lynx*178]) } {
+ fail "argv\[0\] should be available on this target"
+ }
+
+ return $result
+}
+