[gdb/testsuite] Add untested case in selftest_setup

Message ID 20210902061325.GA29918@delia
State New
Headers show
Series
  • [gdb/testsuite] Add untested case in selftest_setup
Related show

Commit Message

Simon Marchi via Gdb-patches Sept. 2, 2021, 6:13 a.m.
Hi,

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.
...

Any comments?

Thanks,
- Tom

[gdb/testsuite] Add untested case in selftest_setup

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.

---
 gdb/testsuite/lib/selftest-support.exp | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

Comments

Simon Marchi via Gdb-patches Sept. 3, 2021, 12:24 p.m. | #1
On 2021-09-02 2:13 a.m., Tom de Vries via Gdb-patches wrote:
> Hi,

> 

> 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.

> ...

> 

> Any comments?


I don't see what else we could do in this case, so LGTM.

Simon

Patch

diff --git a/gdb/testsuite/lib/selftest-support.exp b/gdb/testsuite/lib/selftest-support.exp
index 4b96bf4f5f6..325ea997d5e 100644
--- a/gdb/testsuite/lib/selftest-support.exp
+++ b/gdb/testsuite/lib/selftest-support.exp
@@ -40,6 +40,8 @@  proc find_gdb { arg } {
 # EXECUTABLE is the gdb to use.
 # FUNCTION is the function to break in, either captured_main
 # 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 } {
     global gdb_prompt
@@ -73,14 +75,14 @@  proc selftest_setup { executable function } {
 
     if { $gdb_file_cmd_debug_info != "debug" } then {
 	untested "no debug information, skipping testcase."
-	return -1
+	return -2
     }
 
-    # Set a breakpoint at main.  Allow more than one location, as
-    # workaround for PR26096 - "gdb sets breakpoint at cold clone".
-    gdb_test "break $function" \
-            "Breakpoint.*at.* (file.*, line|locations).*" \
-            "breakpoint in $function"
+    # Set a breakpoint at $function.
+    if { [gdb_breakpoint $function "no-message"] != 1 } {
+	untested "Cannot set breakpoint at $function, skipping testcase."
+	return -2
+    }
 
     # run yourself
     # 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
     catch "remote_file host delete $file"
 
-    if {$result < 0} then {
+    if {$result == -1} then {
 	warning "Couldn't test self"
     }
 }