Fix some AVR test failures.
[deliverable/binutils-gdb.git] / gdb / testsuite / lib / gdb.exp
index 015e20225dc3b8b80cd76c1bd0230784cf6ad31a..5a5a8fb403c5a0ce69768357af5f08b28e05b53b 100644 (file)
@@ -976,9 +976,7 @@ proc gdb_test_multiple { command message user_code } {
 #   -1 if there was an internal error.
 #  
 proc gdb_test { args } {
-    global verbose
     global gdb_prompt
-    global GDB
     upvar timeout timeout
 
     if [llength $args]>2 then {
@@ -1908,6 +1906,18 @@ proc with_test_prefix { prefix body } {
   }
 }
 
+# Wrapper for foreach that calls with_test_prefix on each iteration,
+# including the iterator's name and current value in the prefix.
+
+proc foreach_with_prefix {var list body} {
+    upvar 1 $var myvar
+    foreach myvar $list {
+       with_test_prefix "$var=$myvar" {
+           uplevel 1 $body
+       }
+    }
+}
+
 # Run BODY in the context of the caller.  After BODY is run, the variables
 # listed in VARS will be reset to the values they had before BODY was run.
 #
@@ -3359,12 +3369,10 @@ proc gdb_compile {source dest type options} {
         }
     }
 
-    # We typically link to shared libraries using an absolute path, and
-    # that's how they are found at runtime.  If we are going to
-    # dynamically load one by basename, we must specify rpath.  If we
-    # are using a remote host, DejaGNU will link to the shared library
-    # using a relative path, so again we must specify an rpath.
-    if { $shlib_load || ($shlib_found && [is_remote target]) } {
+    # Because we link with libraries using their basename, we may need
+    # (depending on the platform) to set a special rpath value, to allow
+    # the executable to find the libraries it depends on.
+    if { $shlib_load || $shlib_found } {
        if { ([istarget "*-*-mingw*"]
              || [istarget *-*-cygwin*]
              || [istarget *-*-pe*]) } {
@@ -3545,6 +3553,9 @@ proc gdb_compile_shlib {sources dest options} {
                 lappend obj_options "additional_flags=-fpic"
             }
         }
+        "icc-*" {
+                lappend obj_options "additional_flags=-fpic"
+        }
         default {
            # don't know what the compiler is...
         }
@@ -3575,14 +3586,16 @@ proc gdb_compile_shlib {sources dest options} {
                set name ${dest}
            }
            lappend link_options "additional_flags=-Wl,--out-implib,${name}.a"
-       } elseif [is_remote target] {
-           # By default, we do not set the soname.  This causes the linker
-           # on ELF systems to create a DT_NEEDED entry in the executable
-           # refering to the full path name of the library.  This is a
-           # problem in remote testing if the library is in a different
-           # directory there.  To fix this, we set a soname of just the
-           # base filename for the library, and add an appropriate -rpath
-           # to the main executable (in gdb_compile).
+       } else {
+           # Set the soname of the library.  This causes the linker on ELF
+           # systems to create the DT_NEEDED entry in the executable referring
+           # to the soname of the library, and not its absolute path.  This
+           # (using the absolute path) would be problem when testing on a
+           # remote target.
+           #
+           # In conjunction with setting the soname, we add the special
+           # rpath=$ORIGIN value when building the executable, so that it's
+           # able to find the library in its own directory.
            set destbase [file tail $dest]
            lappend link_options "additional_flags=-Wl,-soname,$destbase"
        }
@@ -4173,52 +4186,67 @@ proc gdb_touch_execfile { binfile } {
     }
 }
 
-# Like remote_download but provides a gdb-specific behavior.  If DEST
-# is "host", and the host is not remote, and TOFILE is not specified,
-# then the [file tail] of FROMFILE is passed through
-# standard_output_file to compute the destination.
+# Like remote_download but provides a gdb-specific behavior.
+#
+# If the destination board is remote, the local file FROMFILE is transferred as
+# usual with remote_download to TOFILE on the remote board.  The destination
+# filename is added to the CLEANFILES global, so it can be cleaned up at the
+# end of the test.
+#
+# If the destination board is local, the destination path TOFILE is passed
+# through standard_output_file, and FROMFILE is copied there.
+#
+# In both cases, if TOFILE is omitted, it defaults to the [file tail] of
+# FROMFILE.
 
 proc gdb_remote_download {dest fromfile {tofile {}}} {
-    if {$dest == "host" && ![is_remote host] && $tofile == ""} {
-       set tofile [standard_output_file [file tail $fromfile]]
+    # If TOFILE is not given, default to the same filename as FROMFILE.
+    if {[string length $tofile] == 0} {
+       set tofile [file tail $fromfile]
     }
 
-    if { $tofile == "" } {
-       return [remote_download $dest $fromfile]
+    if {[is_remote $dest]} {
+       # When the DEST is remote, we simply send the file to DEST.
+       global cleanfiles
+
+       set destname [remote_download $dest $fromfile $tofile]
+       lappend cleanfiles $destname
+
+       return $destname
     } else {
-       return [remote_download $dest $fromfile $tofile]
-    }
-}
+       # When the DEST is local, we copy the file to the test directory (where
+       # the executable is).
+       #
+       # Note that we pass TOFILE through standard_output_file, regardless of
+       # whether it is absolute or relative, because we don't want the tests
+       # to be able to write outside their standard output directory.
 
-# gdb_download
-#
-# Copy a file to the remote target and return its target filename.
-# Schedule the file to be deleted at the end of this test.
+       set tofile [standard_output_file $tofile]
 
-proc gdb_download { filename } {
-    global cleanfiles
+       file copy -force $fromfile $tofile
 
-    set destname [remote_download target $filename]
-    lappend cleanfiles $destname
-    return $destname
+       return $tofile
+    }
 }
 
-# gdb_load_shlibs LIB...
+# gdb_load_shlib LIB...
 #
-# Copy the listed libraries to the target.
+# Copy the listed library to the target.
 
-proc gdb_load_shlibs { args } {
-    if {![is_remote target]} {
-       return
-    }
+proc gdb_load_shlib { file } {
+    set dest [gdb_remote_download target [shlib_target_file $file]]
 
-    foreach file $args {
-       gdb_download [shlib_target_file $file]
+    if {[is_remote target]} {
+       # If the target is remote, we need to tell gdb where to find the
+       # libraries.
+       #
+       # We could set this even when not testing remotely, but a user
+       # generally won't set it unless necessary.  In order to make the tests
+       # more like the real-life scenarios, we don't set it for local testing.
+       gdb_test "set solib-search-path [file dirname $file]" "" ""
     }
 
-    # Even if the target supplies full paths for shared libraries,
-    # they may not be paths for this system.
-    gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "" ""
+    return $dest
 }
 
 #
@@ -4307,7 +4335,7 @@ proc default_gdb_init { test_file_name } {
 proc make_gdb_parallel_path { args } {
     global GDB_PARALLEL objdir
     set joiner [list "file" "join" $objdir]
-    if { $GDB_PARALLEL != "yes" } {
+    if { [info exists GDB_PARALLEL] && $GDB_PARALLEL != "yes" } {
        lappend joiner $GDB_PARALLEL
     }
     set joiner [concat $joiner $args]
@@ -4319,27 +4347,22 @@ proc make_gdb_parallel_path { args } {
 # the directory is returned.
 
 proc standard_output_file {basename} {
-    global objdir subdir gdb_test_file_name GDB_PARALLEL
+    global objdir subdir gdb_test_file_name
 
-    if {[info exists GDB_PARALLEL]} {
-       set dir [make_gdb_parallel_path outputs $subdir $gdb_test_file_name]
-       file mkdir $dir
-       return [file join $dir $basename]
-    } else {
-       return [file join $objdir $subdir $basename]
-    }
+    set dir [make_gdb_parallel_path outputs $subdir $gdb_test_file_name]
+    file mkdir $dir
+    return [file join $dir $basename]
 }
 
 # Return the name of a file in our standard temporary directory.
 
 proc standard_temp_file {basename} {
-    global objdir GDB_PARALLEL
-
-    if {[info exists GDB_PARALLEL]} {
-       return [make_gdb_parallel_path temp $basename]
-    } else {
-       return $basename
-    }
+    # Since a particular runtest invocation is only executing a single test
+    # file at any given time, we can use the runtest pid to build the
+    # path of the temp directory.
+    set dir [make_gdb_parallel_path temp [pid]]
+    file mkdir $dir
+    return [file join $dir $basename]
 }
 
 # Set 'testfile', 'srcfile', and 'binfile'.
@@ -4896,24 +4919,44 @@ gdb_caching_proc gdb_has_argv0 {
            }
        }
 
+       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} $" {
-                       return 1
+                       set retval 1
                    }
                    -re "${gdb_prompt} $" {
-                       return 0
                    }
                }
            }
            -re "${gdb_prompt} $" {
-               return 0
            }
        }
-       return 0
+       
+       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]
This page took 0.029381 seconds and 4 git commands to generate.