[gdb/testsuite] Add untested case in selftest_setup

When building gdb with "-Wall -O2 -g -flto=auto", I run into:
...
FAIL: gdb.gdb/python-helper.exp: breakpoint in captured_main \
  (got interactive prompt)
FAIL: gdb.gdb/python-helper.exp: run until breakpoint at captured_main
WARNING: Couldn't test self
...
and similar in gdb.gdb/selftest.exp.

The first FAIL in more detail:
...
(gdb) break captured_main^M
Function "captured_main" not defined.^M
Make breakpoint pending on future shared library load? (y or [n]) n^M
(gdb) FAIL: gdb.gdb/python-helper.exp: breakpoint in captured_main \
  (got interactive prompt)
...

The problem is that lto has optimized away the captured_main function
and consequently the selftests dependent on that cannot run.

Fix this by:
- using gdb_breakpoint to detect failure to set the breakpoint
- handling the failure to set a breakpoint by calling untested
- not emitting the warning if we've already got untested
such that we have:
...
(gdb) UNTESTED: gdb.gdb/python-helper.exp: Cannot set breakpoint at \
  captured_main, skipping testcase.
...

gdb/testsuite/ChangeLog:

2021-09-02  Tom de Vries  <tdevries@suse.de>

	* lib/selftest-support.exp: Emit untested when not being able to set
	breakpoint.
This commit is contained in:
Tom de Vries
2021-09-03 14:45:53 +02:00
parent 669d511534
commit 41e37c9d0a

View File

@ -40,6 +40,8 @@ proc find_gdb { arg } {
# EXECUTABLE is the gdb to use. # EXECUTABLE is the gdb to use.
# FUNCTION is the function to break in, either captured_main # FUNCTION is the function to break in, either captured_main
# or captured_command_loop. # or captured_command_loop.
# Return 0 in case of success, -1 in case of failure, and -2 in case of
# skipping the test-case.
proc selftest_setup { executable function } { proc selftest_setup { executable function } {
global gdb_prompt global gdb_prompt
@ -73,14 +75,14 @@ proc selftest_setup { executable function } {
if { $gdb_file_cmd_debug_info != "debug" } then { if { $gdb_file_cmd_debug_info != "debug" } then {
untested "no debug information, skipping testcase." untested "no debug information, skipping testcase."
return -1 return -2
} }
# Set a breakpoint at main. Allow more than one location, as # Set a breakpoint at $function.
# workaround for PR26096 - "gdb sets breakpoint at cold clone". if { [gdb_breakpoint $function "no-message"] != 1 } {
gdb_test "break $function" \ untested "Cannot set breakpoint at $function, skipping testcase."
"Breakpoint.*at.* (file.*, line|locations).*" \ return -2
"breakpoint in $function" }
# run yourself # run yourself
# It may take a very long time for the inferior gdb to start (lynx), # It may take a very long time for the inferior gdb to start (lynx),
@ -165,7 +167,7 @@ proc do_self_tests {function body} {
gdb_exit gdb_exit
catch "remote_file host delete $file" catch "remote_file host delete $file"
if {$result < 0} then { if {$result == -1} then {
warning "Couldn't test self" warning "Couldn't test self"
} }
} }