gdb: Only run scheduler-locking tests if feature is supported

Message ID 20180703160230.25472-1-andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess July 3, 2018, 4:02 p.m. UTC
  Not all targets support scheduler-locking.  Add a check to see if the
taraget supports scheduler locking, and if it doesn't, don't run the
scheduler-locking tests that will otherwise fail.

There are actually a set of tests that try to use scheduler-locking
however, in most of these cases the test will not be run on smaller
targets (those that might not support threads and scheduler-locking)
due to the targets lack of support for threads, or some other larger
feature.

In the gdb.mi/mi-cmd-param-changed.exp test though, there's no
dependence on threads, or any other larger feature, and so, for the
small target I was using the test would otherwise try to run, only to
fail due to lack of support for scheduler-locking.

gdb/testsuite/ChangeLog:

	* lib/gdb.exp (target_supports_scheduler_locking): New proc.
	* gdb.mi/mi-cmd-param-changed.exp: Only run scheduler locking
	tests if the target supports scheduler locking.
---
 gdb/testsuite/ChangeLog                       |  6 +++
 gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp | 48 ++++++++++--------
 gdb/testsuite/lib/gdb.exp                     | 70 +++++++++++++++++++++++++++
 3 files changed, 103 insertions(+), 21 deletions(-)
  

Comments

Andrew Burgess July 17, 2018, 5:46 p.m. UTC | #1
Ping.

Thanks,
Andrew


* Andrew Burgess <andrew.burgess@embecosm.com> [2018-07-03 17:02:30 +0100]:

> Not all targets support scheduler-locking.  Add a check to see if the
> taraget supports scheduler locking, and if it doesn't, don't run the
> scheduler-locking tests that will otherwise fail.
> 
> There are actually a set of tests that try to use scheduler-locking
> however, in most of these cases the test will not be run on smaller
> targets (those that might not support threads and scheduler-locking)
> due to the targets lack of support for threads, or some other larger
> feature.
> 
> In the gdb.mi/mi-cmd-param-changed.exp test though, there's no
> dependence on threads, or any other larger feature, and so, for the
> small target I was using the test would otherwise try to run, only to
> fail due to lack of support for scheduler-locking.
> 
> gdb/testsuite/ChangeLog:
> 
> 	* lib/gdb.exp (target_supports_scheduler_locking): New proc.
> 	* gdb.mi/mi-cmd-param-changed.exp: Only run scheduler locking
> 	tests if the target supports scheduler locking.
> ---
>  gdb/testsuite/ChangeLog                       |  6 +++
>  gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp | 48 ++++++++++--------
>  gdb/testsuite/lib/gdb.exp                     | 70 +++++++++++++++++++++++++++
>  3 files changed, 103 insertions(+), 21 deletions(-)
> 
> diff --git a/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp b/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp
> index 8ffafe296f6..bbe9cf36236 100644
> --- a/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp
> +++ b/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp
> @@ -13,6 +13,9 @@
>  # You should have received a copy of the GNU General Public License
>  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>  
> +# Do this here before we start GDB for the test.
> +set scheduler_locking_supported [target_supports_scheduler_locking]
> +
>  load_lib mi-support.exp
>  set MIFLAGS "-i=mi"
>  
> @@ -24,37 +27,40 @@ if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb
>  }
>  
>  proc test_command_param_changed { } {
> +    global scheduler_locking_supported
> +
>      with_test_prefix "cmd param" {
>  	if [mi_gdb_start] {
>  	    return
>  	}
>  	mi_run_to_main
>  
> -	foreach opt { "on" "off" "step" } {
> -	    mi_gdb_test "set scheduler-locking ${opt}" \
> -		".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
> -		"\"set scheduler-locking ${opt}\""
> -	}
> -	foreach opt { "on" "off" "step" } {
> -	    mi_gdb_test "interpreter-exec console \"set scheduler-locking ${opt}\"" \
> -		".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
> -		"interpreter-exec \"set scheduler-locking ${opt}\""
> +	if { $scheduler_locking_supported } {
> +	    foreach opt { "on" "off" "step" } {
> +		mi_gdb_test "set scheduler-locking ${opt}" \
> +		    ".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
> +		    "\"set scheduler-locking ${opt}\""
> +	    }
> +	    foreach opt { "on" "off" "step" } {
> +		mi_gdb_test "interpreter-exec console \"set scheduler-locking ${opt}\"" \
> +		    ".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
> +		    "interpreter-exec \"set scheduler-locking ${opt}\""
> +	    }
> +	    # Don't emit MI notification for request from MI.
> +	    mi_gdb_test "-gdb-set scheduler-locking on" \
> +		{\^done} \
> +		"\"set scheduler-locking on\" no event (requested by MI)"
> +	    mi_gdb_test "interpreter-exec mi \"-gdb-set scheduler-locking step\"" \
> +	    "\\&\"interpreter-exec mi .*\"-gdb-set scheduler-locking step.*\"\\\\n\"\r\n\\^done\r\n\\^done" \
> +		"\"set scheduler-locking step\" no event (requested by MI interp)"
> +	    mi_gdb_test "set scheduler-locking step" \
> +		"\\&\"set scheduler-locking step\\\\n\"\r\n\\^done" \
> +		"\"set scheduler-locking stepr\" no event"
>  	}
> -	# Don't emit MI notification for request from MI.
> -	mi_gdb_test "-gdb-set scheduler-locking on" \
> -	    {\^done} \
> -	    "\"set scheduler-locking on\" no event (requested by MI)"
> +
>  	mi_gdb_test "-exec-arguments foo" {\^done} \
>  	    "\"-exec-arguments foo\" no event"
>  
> -	mi_gdb_test "interpreter-exec mi \"-gdb-set scheduler-locking step\"" \
> -	    "\\&\"interpreter-exec mi .*\"-gdb-set scheduler-locking step.*\"\\\\n\"\r\n\\^done\r\n\\^done" \
> -	    "\"set scheduler-locking step\" no event (requested by MI interp)"
> -	mi_gdb_test "set scheduler-locking step" \
> -	    "\\&\"set scheduler-locking step\\\\n\"\r\n\\^done" \
> -	    "\"set scheduler-locking stepr\" no event"
> -
> -
>  	foreach command { "remotecache" "check type" } {
>  
>  	    # The default value of each command option may be different, so we first
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index aef580b04d3..f15a2f309d1 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -6047,6 +6047,76 @@ gdb_caching_proc gdb_target_symbol_prefix {
>      return $prefix
>  }
>  
> +# Return 1 if target supports scheduler locking, otherwise return 0.
> +
> +gdb_caching_proc target_supports_scheduler_locking {
> +    global gdb_prompt
> +
> +    set me "gdb_target_supports_scheduler_locking"
> +
> +    set src [standard_temp_file has_schedlock[pid].c]
> +    set exe [standard_temp_file has_schedlock[pid].x]
> +
> +    gdb_produce_source $src {
> +	int main () {
> +	    return 0;
> +	}
> +    }
> +
> +    verbose "$me:  compiling testfile $src" 2
> +    set compile_flags {debug nowarnings}
> +    set lines [gdb_compile $src $exe executable $compile_flags]
> +    file delete $src
> +
> +    if ![string match "" $lines] then {
> +        verbose "$me:  testfile compilation failed, returning 0" 2
> +        return 0
> +    }
> +
> +    clean_restart $exe
> +    gdb_start_cmd
> +
> +    set supports_schedule_locking -1
> +    set current_schedule_locking_mode ""
> +
> +    set test "reading current scheduler-locking mode"
> +    gdb_test_multiple "show scheduler-locking" $test {
> +	-re "Mode for locking scheduler during execution is \"(\[\^\"\]*)\".*$gdb_prompt" {
> +	    set current_schedule_locking_mode $expect_out(1,string)
> +	}
> +	-re "$gdb_prompt $" {
> +	    set supports_schedule_locking 0
> +	}
> +	timeout {
> +	    set supports_schedule_locking 0
> +	}
> +    }
> +
> +    if { $supports_schedule_locking == -1 } {
> +	set test "checking for scheduler-locking support"
> +	gdb_test_multiple "set scheduler-locking $current_schedule_locking_mode" $test {
> +	    -re "Target '\[^'\]+' cannot support this command\..*$gdb_prompt $" {
> +		set supports_schedule_locking 0
> +	    }
> +	    -re "$gdb_prompt $" {
> +		set supports_schedule_locking 1
> +	    }
> +	    timeout {
> +		set supports_schedule_locking 0
> +	    }
> +	}
> +    }
> +
> +    if { $supports_schedule_locking == -1 } {
> +	set supports_schedule_locking 0
> +    }
> +
> +    gdb_exit
> +    remote_file build delete $exe
> +    verbose "$me:  returning $supports_schedule_locking" 2
> +    return $supports_schedule_locking
> +}
> +
>  # gdb_target_symbol returns the provided symbol with the correct prefix
>  # prepended.  (See gdb_target_symbol_prefix, above.)
>  
> -- 
> 2.14.4
>
  

Patch

diff --git a/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp b/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp
index 8ffafe296f6..bbe9cf36236 100644
--- a/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp
+++ b/gdb/testsuite/gdb.mi/mi-cmd-param-changed.exp
@@ -13,6 +13,9 @@ 
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# Do this here before we start GDB for the test.
+set scheduler_locking_supported [target_supports_scheduler_locking]
+
 load_lib mi-support.exp
 set MIFLAGS "-i=mi"
 
@@ -24,37 +27,40 @@  if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb
 }
 
 proc test_command_param_changed { } {
+    global scheduler_locking_supported
+
     with_test_prefix "cmd param" {
 	if [mi_gdb_start] {
 	    return
 	}
 	mi_run_to_main
 
-	foreach opt { "on" "off" "step" } {
-	    mi_gdb_test "set scheduler-locking ${opt}" \
-		".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
-		"\"set scheduler-locking ${opt}\""
-	}
-	foreach opt { "on" "off" "step" } {
-	    mi_gdb_test "interpreter-exec console \"set scheduler-locking ${opt}\"" \
-		".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
-		"interpreter-exec \"set scheduler-locking ${opt}\""
+	if { $scheduler_locking_supported } {
+	    foreach opt { "on" "off" "step" } {
+		mi_gdb_test "set scheduler-locking ${opt}" \
+		    ".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
+		    "\"set scheduler-locking ${opt}\""
+	    }
+	    foreach opt { "on" "off" "step" } {
+		mi_gdb_test "interpreter-exec console \"set scheduler-locking ${opt}\"" \
+		    ".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
+		    "interpreter-exec \"set scheduler-locking ${opt}\""
+	    }
+	    # Don't emit MI notification for request from MI.
+	    mi_gdb_test "-gdb-set scheduler-locking on" \
+		{\^done} \
+		"\"set scheduler-locking on\" no event (requested by MI)"
+	    mi_gdb_test "interpreter-exec mi \"-gdb-set scheduler-locking step\"" \
+	    "\\&\"interpreter-exec mi .*\"-gdb-set scheduler-locking step.*\"\\\\n\"\r\n\\^done\r\n\\^done" \
+		"\"set scheduler-locking step\" no event (requested by MI interp)"
+	    mi_gdb_test "set scheduler-locking step" \
+		"\\&\"set scheduler-locking step\\\\n\"\r\n\\^done" \
+		"\"set scheduler-locking stepr\" no event"
 	}
-	# Don't emit MI notification for request from MI.
-	mi_gdb_test "-gdb-set scheduler-locking on" \
-	    {\^done} \
-	    "\"set scheduler-locking on\" no event (requested by MI)"
+
 	mi_gdb_test "-exec-arguments foo" {\^done} \
 	    "\"-exec-arguments foo\" no event"
 
-	mi_gdb_test "interpreter-exec mi \"-gdb-set scheduler-locking step\"" \
-	    "\\&\"interpreter-exec mi .*\"-gdb-set scheduler-locking step.*\"\\\\n\"\r\n\\^done\r\n\\^done" \
-	    "\"set scheduler-locking step\" no event (requested by MI interp)"
-	mi_gdb_test "set scheduler-locking step" \
-	    "\\&\"set scheduler-locking step\\\\n\"\r\n\\^done" \
-	    "\"set scheduler-locking stepr\" no event"
-
-
 	foreach command { "remotecache" "check type" } {
 
 	    # The default value of each command option may be different, so we first
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index aef580b04d3..f15a2f309d1 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -6047,6 +6047,76 @@  gdb_caching_proc gdb_target_symbol_prefix {
     return $prefix
 }
 
+# Return 1 if target supports scheduler locking, otherwise return 0.
+
+gdb_caching_proc target_supports_scheduler_locking {
+    global gdb_prompt
+
+    set me "gdb_target_supports_scheduler_locking"
+
+    set src [standard_temp_file has_schedlock[pid].c]
+    set exe [standard_temp_file has_schedlock[pid].x]
+
+    gdb_produce_source $src {
+	int main () {
+	    return 0;
+	}
+    }
+
+    verbose "$me:  compiling testfile $src" 2
+    set compile_flags {debug nowarnings}
+    set lines [gdb_compile $src $exe executable $compile_flags]
+    file delete $src
+
+    if ![string match "" $lines] then {
+        verbose "$me:  testfile compilation failed, returning 0" 2
+        return 0
+    }
+
+    clean_restart $exe
+    gdb_start_cmd
+
+    set supports_schedule_locking -1
+    set current_schedule_locking_mode ""
+
+    set test "reading current scheduler-locking mode"
+    gdb_test_multiple "show scheduler-locking" $test {
+	-re "Mode for locking scheduler during execution is \"(\[\^\"\]*)\".*$gdb_prompt" {
+	    set current_schedule_locking_mode $expect_out(1,string)
+	}
+	-re "$gdb_prompt $" {
+	    set supports_schedule_locking 0
+	}
+	timeout {
+	    set supports_schedule_locking 0
+	}
+    }
+
+    if { $supports_schedule_locking == -1 } {
+	set test "checking for scheduler-locking support"
+	gdb_test_multiple "set scheduler-locking $current_schedule_locking_mode" $test {
+	    -re "Target '\[^'\]+' cannot support this command\..*$gdb_prompt $" {
+		set supports_schedule_locking 0
+	    }
+	    -re "$gdb_prompt $" {
+		set supports_schedule_locking 1
+	    }
+	    timeout {
+		set supports_schedule_locking 0
+	    }
+	}
+    }
+
+    if { $supports_schedule_locking == -1 } {
+	set supports_schedule_locking 0
+    }
+
+    gdb_exit
+    remote_file build delete $exe
+    verbose "$me:  returning $supports_schedule_locking" 2
+    return $supports_schedule_locking
+}
+
 # gdb_target_symbol returns the provided symbol with the correct prefix
 # prepended.  (See gdb_target_symbol_prefix, above.)