* rs6000-tdep: Include "features/rs6000/powerpc-vsx32.c".
[deliverable/binutils-gdb.git] / gdb / testsuite / lib / gdb.exp
index 9260e9a530af4f3e090063d7bfbfef5723aca366..3761d7a170343ae7ce74481f30c944a1afcdc7ec 100644 (file)
@@ -325,7 +325,8 @@ proc gdb_start_cmd {args} {
 }
 
 # Set a breakpoint at FUNCTION.  If there is an additional argument it is
-# a list of options; the supported options are allow-pending and temporary.
+# a list of options; the supported options are allow-pending, temporary,
+# and no-message.
 
 proc gdb_breakpoint { function args } {
     global gdb_prompt
@@ -337,19 +338,28 @@ proc gdb_breakpoint { function args } {
     }
 
     set break_command "break"
+    set break_message "Breakpoint"
     if {[lsearch -exact [lindex $args 0] temporary] != -1} {
        set break_command "tbreak"
+       set break_message "Temporary breakpoint"
+    }
+
+    set no_message 0
+    if {[lsearch -exact [lindex $args 0] no-message] != -1} {
+       set no_message 1
     }
 
     send_gdb "$break_command $function\n"
     # The first two regexps are what we get with -g, the third is without -g.
     gdb_expect 30 {
-       -re "Breakpoint \[0-9\]* at .*: file .*, line $decimal.\r\n$gdb_prompt $" {}
-       -re "Breakpoint \[0-9\]*: file .*, line $decimal.\r\n$gdb_prompt $" {}
-       -re "Breakpoint \[0-9\]* at .*$gdb_prompt $" {}
-       -re "Breakpoint \[0-9\]* \\(.*\\) pending.*$gdb_prompt $" {
+       -re "$break_message \[0-9\]* at .*: file .*, line $decimal.\r\n$gdb_prompt $" {}
+       -re "$break_message \[0-9\]*: file .*, line $decimal.\r\n$gdb_prompt $" {}
+       -re "$break_message \[0-9\]* at .*$gdb_prompt $" {}
+       -re "$break_message \[0-9\]* \\(.*\\) pending.*$gdb_prompt $" {
                if {$pending_response == "n"} {
-                       fail "setting breakpoint at $function"
+                       if { $no_message == 0 } {
+                               fail "setting breakpoint at $function"
+                       }
                        return 0
                }
        }
@@ -357,8 +367,18 @@ proc gdb_breakpoint { function args } {
                send_gdb "$pending_response\n"
                exp_continue
        }
-       -re "$gdb_prompt $" { fail "setting breakpoint at $function" ; return 0 }
-       timeout { fail "setting breakpoint at $function (timeout)" ; return 0 }
+       -re "$gdb_prompt $" {
+               if { $no_message == 0 } {
+                       fail "setting breakpoint at $function"
+               }
+               return 0
+       }
+       timeout {
+               if { $no_message == 0 } {
+                       fail "setting breakpoint at $function (timeout)"
+               }
+               return 0
+       }
     }
     return 1;
 }    
@@ -430,13 +450,13 @@ proc runto_main { } {
 ### worked.  Use NAME as part of the test name; each call to
 ### continue_to_breakpoint should use a NAME which is unique within
 ### that test file.
-proc gdb_continue_to_breakpoint {name} {
+proc gdb_continue_to_breakpoint {name {location_pattern .*}} {
     global gdb_prompt
     set full_name "continue to breakpoint: $name"
 
     send_gdb "continue\n"
     gdb_expect {
-       -re "Breakpoint .* at .*\r\n$gdb_prompt $" {
+       -re "Breakpoint .* at $location_pattern\r\n$gdb_prompt $" {
            pass $full_name
        }
        -re ".*$gdb_prompt $" {
@@ -1329,6 +1349,92 @@ proc skip_altivec_tests {} {
     return $skip_vmx_tests_saved
 }
 
+# Run a test on the target to see if it supports vmx hardware.  Return 0 if so,
+# 1 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.
+
+proc skip_vsx_tests {} {
+    global skip_vsx_tests_saved
+    global srcdir subdir gdb_prompt
+
+    # Use the cached value, if it exists.
+    set me "skip_vsx_tests"
+    if [info exists skip_vsx_tests_saved] {
+        verbose "$me:  returning saved $skip_vsx_tests_saved" 2
+        return $skip_vsx_tests_saved
+    }
+
+    # Some simulators are known to not support Altivec instructions, so
+    # they won't support VSX instructions as well.
+    if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] } {
+        verbose "$me:  target known to not support VSX, returning 1" 2
+        return [set skip_vsx_tests_saved 1]
+    }
+
+    # Make sure we have a compiler that understands altivec.
+    set compile_flags {debug nowarnings quiet}
+    if [get_compiler_info not-used] {
+       warning "Could not get compiler info"
+       return 1
+    }
+    if [test_compiler_info gcc*] {
+        set compile_flags "$compile_flags additional_flags=-mvsx"
+    } elseif [test_compiler_info xlc*] {
+        set compile_flags "$compile_flags additional_flags=-qvsx"
+    } else {
+        verbose "Could not compile with vsx support, returning 1" 2
+        return 1
+    }
+
+    set src vsx[pid].c
+    set exe vsx[pid].x
+
+    set f [open $src "w"]
+    puts $f "int main() {"
+    puts $f "#ifdef __MACH__"
+    puts $f "  asm volatile (\"lxvd2x v0,v0,v0\");"
+    puts $f "#else"
+    puts $f "  asm volatile (\"lxvd2x 0,0,0\");"
+    puts $f "#endif"
+    puts $f "  return 0; }"
+    close $f
+
+    verbose "$me:  compiling testfile $src" 2
+    set lines [gdb_compile $src $exe executable $compile_flags]
+    file delete $src
+
+    if ![string match "" $lines] then {
+        verbose "$me:  testfile compilation failed, returning 1" 2
+        return [set skip_vsx_tests_saved 1]
+    }
+
+    # No error message, compilation succeeded so now run it via gdb.
+
+    gdb_exit
+    gdb_start
+    gdb_reinitialize_dir $srcdir/$subdir
+    gdb_load "$exe"
+    gdb_run_cmd
+    gdb_expect {
+        -re ".*Illegal instruction.*${gdb_prompt} $" {
+            verbose -log "\n$me VSX hardware not detected"
+            set skip_vsx_tests_saved 1
+        }
+        -re ".*Program exited normally.*${gdb_prompt} $" {
+            verbose -log "\n$me: VSX hardware detected"
+            set skip_vsx_tests_saved 0
+        }
+        default {
+          warning "\n$me: default case taken"
+            set skip_vsx_tests_saved 1
+        }
+    }
+    gdb_exit
+    remote_file build delete $exe
+
+    verbose "$me:  returning $skip_vsx_tests_saved" 2
+    return $skip_vsx_tests_saved
+}
+
 # Skip all the tests in the file if you are not on an hppa running
 # hpux target.
 
@@ -1516,11 +1622,18 @@ proc gdb_wrapper_init { args } {
     set gdb_wrapper_initialized 1
 }
 
+# Some targets need to always link a special object in.  Save its path here.
+global gdb_saved_set_unbuffered_mode_obj
+set gdb_saved_set_unbuffered_mode_obj ""
+
 proc gdb_compile {source dest type options} {
     global GDB_TESTCASE_OPTIONS;
     global gdb_wrapper_file;
     global gdb_wrapper_flags;
     global gdb_wrapper_initialized;
+    global srcdir
+    global objdir
+    global gdb_saved_set_unbuffered_mode_obj
 
     set outdir [file dirname $dest]
 
@@ -1607,6 +1720,44 @@ proc gdb_compile {source dest type options} {
        set options [lreplace $options $nowarnings $nowarnings $flag]
     }
 
+    if { $type == "executable" } {
+       if { ([istarget "*-*-mingw*"]
+             || [istarget "*-*-cygwin*"])} {
+           # Force output to unbuffered mode, by linking in an object file
+           # with a global contructor that calls setvbuf.
+           #
+           # Compile the special object seperatelly for two reasons:
+           #  1) Insulate it from $options.
+           #  2) Avoid compiling it for every gdb_compile invocation,
+           #  which is time consuming, especially if we're remote
+           #  host testing.
+           #
+           if { $gdb_saved_set_unbuffered_mode_obj == "" } {
+               verbose "compiling gdb_saved_set_unbuffered_obj"
+               set unbuf_src ${srcdir}/lib/set_unbuffered_mode.c
+               set unbuf_obj ${objdir}/set_unbuffered_mode.o
+
+               set result [gdb_compile "${unbuf_src}" "${unbuf_obj}" object {nowarnings}]
+               if { $result != "" } {
+                   return $result
+               }
+
+               set gdb_saved_set_unbuffered_mode_obj ${objdir}/set_unbuffered_mode_saved.o
+               # Link a copy of the output object, because the
+               # original may be automatically deleted.
+               remote_exec host "cp -f $unbuf_obj $gdb_saved_set_unbuffered_mode_obj"
+           } else {
+               verbose "gdb_saved_set_unbuffered_obj already compiled"
+           }
+
+           # Rely on the internal knowledge that the global ctors are ran in
+           # reverse link order.  In that case, we can use ldflags to
+           # avoid copying the object file to the host multiple
+           # times.
+           lappend options "ldflags=$gdb_saved_set_unbuffered_mode_obj"
+       }
+    }
+
     set result [target_compile $source $dest $type $options];
 
     # Prune uninteresting compiler (and linker) output.
@@ -2712,7 +2863,7 @@ proc clean_restart { executable } {
 # Please refer to build_executable for parameter description.
 proc prepare_for_testing { testname executable {sources ""} {options {debug}}} {
 
-    if {[build_executable $testname $executable $sources] == -1} {
+    if {[build_executable $testname $executable $sources $options] == -1} {
         return -1
     }
     clean_restart $executable
This page took 0.028415 seconds and 4 git commands to generate.