The guality tests expect to run (native) GDB on the target.  If this
is available, there is some support for cross testing, but with
various defects and limitations, some of them fixed here.

* GUALITY_GDB_NAME doesn't get passed through to the target for remote
  testing (a general limitation of the DejaGnu interface: it doesn't
  support setting environment variables on the target).  Not fixed
  here.

* Using in-tree GDB is only appropriate when host = target, since
  in-tree GDB runs on the host and the testsuite runs GDB on the
  target.  Fixed here.  (Note that [isnative] isn't used because that
  refers to build = target, and we need host = target here.)

* [transform gdb] is not appropriate because that's a cross-GDB and
  the tests run GDB on the target, so need a native GDB.  Fixed here.

* gdb-test (used by some guality tests) exits early in cross and
  remote cases (whereas the tests running GDB directly from the test
  itself via popen can already do so on the target without needing
  further patches).  Fixed here.  There are various other fixes done
  in gdb-test as well; it needs to transfer files to the target then
  delete them afterwards.

* report_gdb expects to run GDB on the host when the tests run it on
  the target.  Fixed here.

Note: some similar fixes will also be needed for simulate-thread tests
to get them working for cross testing, but I haven't done those yet.

Tested for x86_64-pc-linux-gnu to make sure native testing isn't
broken, and with cross to aarch64-linux.

        * lib/gcc-gdb-test.exp (gdb-test): Do not return early for
        non-native and remote.  Download executable and GDB command file
        to target before running GDB there, and delete when closing
        target.
        (report_gdb): Use target when testing GDB availability and
        version.
        * g++.dg/guality/guality.exp: Only use in-tree GDB when host =
        target.  Do not use [transform gdb].
        * gcc.dg/guality/guality.exp: Likewise.
        * gfortran.dg/guality/guality.exp: Likewise.

diff --git a/gcc/testsuite/g++.dg/guality/guality.exp 
b/gcc/testsuite/g++.dg/guality/guality.exp
index 6de5e8091a50..695ed02b89bb 100644
--- a/gcc/testsuite/g++.dg/guality/guality.exp
+++ b/gcc/testsuite/g++.dg/guality/guality.exp
@@ -40,14 +40,17 @@ dg-init
 torture-init
 
 global GDB
+global host_triplet target_triplet
 if ![info exists ::env(GUALITY_GDB_NAME)] {
     if [info exists GDB] {
        set guality_gdb_name "$GDB"
-    } elseif { [info exists rootme] && [file exists $rootme/../gdb/gdb] } {
+    } elseif { [string equal $host_triplet $target_triplet]
+              && [info exists rootme]
+              && [file exists $rootme/../gdb/gdb] } {
        # If we're doing a combined build, and gdb is available, use it.
        set guality_gdb_name "$rootme/../gdb/gdb"
     } else {
-       set guality_gdb_name "[transform gdb]"
+       set guality_gdb_name "gdb"
     }
     setenv GUALITY_GDB_NAME "$guality_gdb_name"
 }
diff --git a/gcc/testsuite/gcc.dg/guality/guality.exp 
b/gcc/testsuite/gcc.dg/guality/guality.exp
index 0dc8f10762d7..4d342aa51658 100644
--- a/gcc/testsuite/gcc.dg/guality/guality.exp
+++ b/gcc/testsuite/gcc.dg/guality/guality.exp
@@ -40,14 +40,17 @@ dg-init
 torture-init
 
 global GDB
+global host_triplet target_triplet
 if ![info exists ::env(GUALITY_GDB_NAME)] {
     if [info exists GDB] {
        set guality_gdb_name "$GDB"
-    } elseif { [info exists rootme] && [file exists $rootme/../gdb/gdb] } {
+    } elseif { [string equal $host_triplet $target_triplet]
+              && [info exists rootme]
+              && [file exists $rootme/../gdb/gdb] } {
        # If we're doing a combined build, and gdb is available, use it.
        set guality_gdb_name "$rootme/../gdb/gdb"
     } else {
-       set guality_gdb_name "[transform gdb]"
+       set guality_gdb_name "gdb"
     }
     setenv GUALITY_GDB_NAME "$guality_gdb_name"
 }
diff --git a/gcc/testsuite/gfortran.dg/guality/guality.exp 
b/gcc/testsuite/gfortran.dg/guality/guality.exp
index 105e08a70d88..3ee157abf7b3 100644
--- a/gcc/testsuite/gfortran.dg/guality/guality.exp
+++ b/gcc/testsuite/gfortran.dg/guality/guality.exp
@@ -21,14 +21,17 @@ dg-init
 torture-init
 
 global GDB
+global host_triplet target_triplet
 if ![info exists ::env(GUALITY_GDB_NAME)] {
     if [info exists GDB] {
        set guality_gdb_name "$GDB"
-    } elseif { [info exists rootme] && [file exists $rootme/../gdb/gdb] } {
+    } elseif { [string equal $host_triplet $target_triplet]
+              && [info exists rootme]
+              && [file exists $rootme/../gdb/gdb] } {
        # If we're doing a combined build, and gdb is available, use it.
        set guality_gdb_name "$rootme/../gdb/gdb"
     } else {
-       set guality_gdb_name "[transform gdb]"
+       set guality_gdb_name "gdb"
     }
     setenv GUALITY_GDB_NAME "$guality_gdb_name"
 }
diff --git a/gcc/testsuite/lib/gcc-gdb-test.exp 
b/gcc/testsuite/lib/gcc-gdb-test.exp
index 942853f183e6..f7c1da8fae25 100644
--- a/gcc/testsuite/lib/gcc-gdb-test.exp
+++ b/gcc/testsuite/lib/gcc-gdb-test.exp
@@ -27,8 +27,6 @@
 #   the literal string with extra whitespace removed.
 # Argument 3 handles expected failures and the like
 proc gdb-test { useline args } {
-    if { ![isnative] || [is_remote target] } { return }
-
     if { [llength $args] >= 4 } {
        switch [dg-process-target [lindex $args 3]] {
            "S" { }
@@ -80,11 +78,17 @@ proc gdb-test { useline args } {
     puts $fd "quit"
     close $fd
 
-    send_log "Spawning: $gdb_name -nx -nw -quiet -batch -x $cmd_file 
./$output_file\n"
-    set res [remote_spawn target "$gdb_name -nx -nw -quiet -batch -x $cmd_file 
./$output_file"]
+    set cmd_file_remote [remote_download target $cmd_file]
+    set output_file_remote [remote_download target $output_file]
+    send_log "Spawning: $gdb_name -nx -nw -quiet -batch -x $cmd_file_remote 
$output_file_remote\n"
+    set res [remote_spawn target "$gdb_name -nx -nw -quiet -batch -x 
$cmd_file_remote $output_file_remote"]
     if { $res < 0 || $res == "" } {
        unsupported "$testname"
        file delete $cmd_file
+       if { [is_remote target] } {
+           remote_file target delete $cmd_file_remote
+           remote_file target delete $output_file_remote
+       }
        return
     }
 
@@ -94,6 +98,10 @@ proc gdb-test { useline args } {
            unsupported "$testname"
            remote_close target
            file delete $cmd_file
+           if { [is_remote target] } {
+               remote_file target delete $cmd_file_remote
+               remote_file target delete $output_file_remote
+           }
            return
        }
        # print var; print expected
@@ -110,6 +118,10 @@ proc gdb-test { useline args } {
            }
            remote_close target
            file delete $cmd_file
+           if { [is_remote target] } {
+               remote_file target delete $cmd_file_remote
+               remote_file target delete $output_file_remote
+           }
            return
        }
        # ptype var;
@@ -131,12 +143,20 @@ proc gdb-test { useline args } {
            }
            remote_close target
            file delete $cmd_file
+           if { [is_remote target] } {
+               remote_file target delete $cmd_file_remote
+               remote_file target delete $output_file_remote
+           }
            return
        }
        timeout {
            unsupported "$testname"
            remote_close target
            file delete $cmd_file
+           if { [is_remote target] } {
+               remote_file target delete $cmd_file_remote
+               remote_file target delete $output_file_remote
+           }
            return
        }
     }
@@ -144,6 +164,10 @@ proc gdb-test { useline args } {
     unsupported "$testname"
     remote_close target
     file delete $cmd_file
+    if { [is_remote target] } {
+       remote_file target delete $cmd_file_remote
+       remote_file target delete $output_file_remote
+    }
     return
 }
 
@@ -152,15 +176,18 @@ proc gdb-test { useline args } {
 # Argument 1 is the location where gdb is used
 # 
 proc report_gdb { gdb loc } {
-    if { [catch { exec which $gdb } msg] } {
-       send_log "gdb not found in $loc: $msg\n"
+    set status [remote_exec target "which" "$gdb"]
+    set gdb [string trim [lindex $status 1]]
+    if { [lindex $status 0] != 0 } {
+       send_log "gdb not found in $loc: $gdb\n"
        return
     }
-    set gdb [exec which $gdb]
     send_log "gdb used in $loc: $gdb\n"
 
     send_log "gdb used in $loc: "
-    if { [catch { exec $gdb -v } gdb_version] } {
+    set status [remote_exec target "$gdb" "-v"]
+    set gdb_version [lindex $status 1]
+    if { [lindex $status 0] != 0 } {
        send_log "getting version failed:\n"
     } else {
        send_log "version:\n"

-- 
Joseph S. Myers
[email protected]

Reply via email to