verbose "using GDBFLAGS = $GDBFLAGS" 2
# INTERNAL_GDBFLAGS contains flags that the testsuite requires.
-set INTERNAL_GDBFLAGS "-nw -nx"
+global INTERNAL_GDBFLAGS
+if ![info exists INTERNAL_GDBFLAGS] {
+ set INTERNAL_GDBFLAGS "-nw -nx"
+}
# The variable gdb_prompt is a regexp which matches the gdb prompt.
# Set it if it is not already set.
set processed_code ""
set patterns ""
set expecting_action 0
+ set expecting_arg 0
foreach item $user_code subst_item $subst_code {
if { $item == "-n" || $item == "-notransfer" || $item == "-nocase" } {
lappend processed_code $item
continue
}
- if {$item == "-indices" || $item == "-re" || $item == "-ex"} {
+ if { $item == "-indices" || $item == "-re" || $item == "-ex" } {
+ lappend processed_code $item
+ continue
+ }
+ if { $item == "-timeout" } {
+ set expecting_arg 1
+ lappend processed_code $item
+ continue
+ }
+ if { $expecting_arg } {
+ set expecting_arg 0
lappend processed_code $item
continue
}
fail "$errmsg"
set result -1
}
- -re "EXIT code \[0-9\r\n\]+Program exited normally.*$gdb_prompt $" {
+ -re "Program exited normally.*$gdb_prompt $" {
if ![string match "" $message] then {
set errmsg "$message (the program exited)"
} else {
unsupported "compilation [file tail $src]"
} elseif { [regexp {.*: command not found[\r|\n]*$} $output] } {
unsupported "compilation [file tail $src]"
+ } elseif { [regexp {.*: [^\r\n]*compiler not installed[^\r\n]*[\r|\n]*$} $output] } {
+ unsupported "compilation [file tail $src]"
} else {
verbose -log "compilation failed: $output" 2
fail "compilation [file tail $src]"
return 0
}
+# Return a 1 for configurations for which don't have both C++ and the STL.
+
+proc skip_stl_tests {} {
+ # Symbian supports the C++ language, but the STL is missing
+ # (both headers and libraries).
+ if { [istarget "arm*-*-symbianelf*"] } {
+ return 1
+ }
+
+ return [skip_cplus_tests]
+}
+
# Return a 1 if I don't even want to try to test FORTRAN.
proc skip_fortran_tests {} {
return 0
}
+# Return a 1 for configurations that do not support Python scripting.
+
+proc skip_python_tests {} {
+ global gdb_prompt
+ gdb_test_multiple "python print 'test'" "verify python support" {
+ -re "not supported.*$gdb_prompt $" {
+ unsupported "Python support is disabled."
+ return 1
+ }
+ -re "$gdb_prompt $" {}
+ }
+
+ return 0
+}
+
# Return a 1 if we should skip shared library tests.
proc skip_shlib_tests {} {
if { ([istarget "*-*-mingw*"]
|| [istarget *-*-cygwin*]
|| [istarget *-*-pe*]
- || [istarget arm*-*-symbianelf*]
|| [istarget hppa*-*-hpux*])} {
# Do not need anything.
} elseif { [istarget *-*-openbsd*] } {
lappend new_options "additional_flags=-Wl,-rpath,${outdir}"
+ } elseif { [istarget arm*-*-symbianelf*] } {
+ if { $shlib_load } {
+ lappend new_options "libs=-ldl"
+ }
} else {
if { $shlib_load } {
lappend new_options "libs=-ldl"
proc gdb_compile_pthreads {source dest type options} {
set built_binfile 0
set why_msg "unrecognized error"
- foreach lib {-lpthreads -lpthread -lthread} {
+ foreach lib {-lpthreads -lpthread -lthread ""} {
# This kind of wipes out whatever libs the caller may have
# set. Or maybe theirs will override ours. How infelicitous.
set options_with_lib [concat $options [list libs=$lib quiet]]
return -1
}
+# Return the filename to download to the target and load on the target
+# for this shared library. Normally just LIBNAME, unless shared libraries
+# for this target have separate link and load images.
+
+proc shlib_target_file { libname } {
+ return $libname
+}
+
+# Return the filename GDB will load symbols from when debugging this
+# shared library. Normally just LIBNAME, unless shared libraries for
+# this target have separate link and load images.
+
+proc shlib_symbol_file { libname } {
+ return $libname
+}
+
# gdb_download
#
# Copy a file to the remote target and return its target filename.
}
foreach file $args {
- gdb_download $file
+ gdb_download [shlib_target_file $file]
}
# Even if the target supplies full paths for shared libraries,
}
}
+# The default timeout used when testing GDB commands. We want to use
+# the same timeout as the default dejagnu timeout, unless the user has
+# already provided a specific value (probably through a site.exp file).
+global gdb_test_timeout
+if ![info exists gdb_test_timeout] {
+ set gdb_test_timeout $timeout
+}
+
proc gdb_init { args } {
+ # Reset the timeout value to the default. This way, any testcase
+ # that changes the timeout value without resetting it cannot affect
+ # the timeout used in subsequent testcases.
+ global gdb_test_timeout
+ global timeout
+ set timeout $gdb_test_timeout
+
return [eval default_gdb_init $args];
}
# Note: the procedure gdb_gnu_strip_debug will produce an executable called
# ${binfile}.dbglnk, which is just like the executable ($binfile) but without
# the debuginfo. Instead $binfile has a .gnu_debuglink section which contains
-# the name of a debuginfo only file. This file will be stored in the
-# gdb.base/.debug subdirectory.
+# the name of a debuginfo only file. This file will be stored in the same
+# subdirectory.
# Functions for separate debug info testing
# at the end of the process we have:
# foo.stripped --> foo w/o debug info
-# .debug/foo.debug --> foo's debug info
+# foo.debug --> foo's debug info
# foo --> like foo, but with a new .gnu_debuglink section pointing to foo.debug.
-# Return the name of the file in which we should stor EXEC's separated
-# debug info. EXEC contains the full path.
-proc separate_debug_filename { exec } {
-
- # In a .debug subdirectory off the same directory where the testcase
- # executable is going to be. Something like:
- # <your-path>/gdb/testsuite/gdb.base/.debug/blah.debug.
- # This is the default location where gdb expects to findi
- # the debug info file.
-
- set exec_dir [file dirname $exec]
- set exec_file [file tail $exec]
- set debug_dir [file join $exec_dir ".debug"]
- set debug_file [file join $debug_dir "${exec_file}.debug"]
-
- return $debug_file
-}
-
# Return the build-id hex string (usually 160 bits as 40 hex characters)
# converted to the form: .build-id/ab/cdef1234...89.debug
# Return "" if no build-id found.
}
# Convert it to hex.
binary scan $data H* data
- set data [regsub {^..} $data {\0/}]
+ regsub {^..} $data {\0/} data
return ".build-id/${data}.debug";
}
# Create stripped files for DEST, replacing it. If ARGS is passed, it is a
# list of optional flags. The only currently supported flag is no-main,
# which removes the symbol entry for main from the separate debug file.
+#
+# Function returns zero on success. Function will return non-zero failure code
+# on some targets not supporting separate debug info (such as i386-msdos).
proc gdb_gnu_strip_debug { dest args } {
- set debug_file [separate_debug_filename $dest]
+ # Use the first separate debug info file location searched by GDB so the
+ # run cannot be broken by some stale file searched with higher precedence.
+ set debug_file "${dest}.debug"
+
set strip_to_file_program [transform strip]
set objcopy_program [transform objcopy]
- # Make sure the directory that will hold the separated debug
- # info actually exists.
- set debug_dir [file dirname $debug_file]
- if {! [file isdirectory $debug_dir]} {
- file mkdir $debug_dir
- }
-
set debug_link [file tail $debug_file]
set stripped_file "${dest}.stripped"