Skip to content
This repository has been archived by the owner on Sep 2, 2023. It is now read-only.

Commit

Permalink
gdb/testsuite/: Use -qualified in runto_main / mi_runto_main
Browse files Browse the repository at this point in the history
In some runtimes, there may be a "main" function in some class or
namespace.  The breakpoint created by runto_main may therefore have
unexpected locations on some other functions than the actual main.
These breakpoint locations can unexpectedly get hit during tests and
lead to failures.

I saw this while playing with AMD's ROCm toolchain -- I wrote a board
file to run the testsuite against device kernels.  There, the runtime
calls a "main" function before the device kernel code is reached:

 Thread 4 "bit_extract" hit Breakpoint 1, 0x00007ffeea140960 in lld::elf::LinkerDriver::main(llvm::ArrayRef<char const*>) () from /opt/rocm/lib/libamd_comgr.so.1
 (gdb) bt
 #0  0x00007ffeea140960 in lld::elf::LinkerDriver::main(llvm::ArrayRef<char const*>) () from /opt/rocm/lib/libamd_comgr.so.1
 #1  0x00007ffeea2257a5 in lld::elf::link(llvm::ArrayRef<char const*>, bool, llvm::raw_ostream&, llvm::raw_ostream&) () from /opt/rocm/lib/libamd_comgr.so.1
 #2  0x00007ffeea1bc374 in COMGR::linkWithLLD(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&) () from /opt/rocm/lib/libamd_comgr.so.1
 #3  0x00007ffeea1bfb09 in COMGR::InProcessDriver::execute(llvm::ArrayRef<char const*>) () from /opt/rocm/lib/libamd_comgr.so.1
 #4  0x00007ffeea1c4da9 in COMGR::AMDGPUCompiler::linkToExecutable() () from /opt/rocm/lib/libamd_comgr.so.1
 #5  0x00007ffeea1fde20 in dispatchCompilerAction(amd_comgr_action_kind_s, COMGR::DataAction*, COMGR::DataSet*, COMGR::DataSet*, llvm::raw_ostream&) () from /opt/rocm/lib/libamd_comgr.so.1
 #6  0x00007ffeea203a87 in amd_comgr_do_action () from /opt/rocm/lib/libamd_comgr.so.1
 ...

To avoid that, pass "qualified" to runto, in runto_main, so that
gdb_breakpoint ends up creating a breakpoint with -qualified.  This
avoids creating breakpoints locations for other unrelated "main"
functions.

Note: I first tried making runto itself use "-qualified", but that
caused regressions in the gdb.ada/ tests, which use runto without
specifying the whole fully-qualified function name (i.e., without the
package).  So I end up restricting the -qualified to
runto_main/mi_runto_main.

The gdb.base/ui-redirect.exp change is necessary because that testcase
is looking at what "save breakpoint" generates.

gdb/testsuite/ChangeLog:

	* gdb.base/ui-redirect.exp: Expect "break -qualified main" in
	saved breakpoints file.
	* gdb.guile/scm-breakpoint.exp: Expect "-qualified main" when
	inspecting breakpoint list.
	* lib/gdb.exp (runto_main): Add "qualified" to options.
	* lib/mi-support.exp (mi_runto_helper): Add 'qualified' parameter,
	and handle it.
	(mi_runto_main): Pass 1 as qualified argument.

Change-Id: I51468359ab0a518f05f7c0394c97f7e33b45fe69
  • Loading branch information
palves committed Oct 13, 2020
1 parent f71e671 commit 8abd8ee
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 6 deletions.
11 changes: 11 additions & 0 deletions gdb/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2020-10-13 Pedro Alves <[email protected]>

* gdb.base/ui-redirect.exp: Expect "break -qualified main" in
saved breakpoints file.
* gdb.guile/scm-breakpoint.exp: Expect "-qualified main" when
inspecting breakpoint list.
* lib/gdb.exp (runto_main): Add "qualified" to options.
* lib/mi-support.exp (mi_runto_helper): Add 'qualified' parameter,
and handle it.
(mi_runto_main): Pass 1 as qualified argument.

2020-10-13 Pedro Alves <[email protected]>

* lib/mi-support.exp (mi_runto_main): New proc.
Expand Down
2 changes: 1 addition & 1 deletion gdb/testsuite/gdb.base/ui-redirect.exp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ gdb_breakpoint "foo"
gdb_breakpoint "bar"

set cmds [multi_line_input \
"break main" \
"break -qualified main" \
" commands" \
" print 1" \
" end" \
Expand Down
2 changes: 1 addition & 1 deletion gdb/testsuite/gdb.guile/scm-breakpoint.exp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ proc test_bkpt_basic { } {
gdb_scm_test_silent_cmd "guile (define blist (breakpoints))" \
"get breakpoint list 1"
gdb_test "guile (print (car blist))" \
"<gdb:breakpoint #1 BP_BREAKPOINT enabled noisy hit:1 ignore:0 @main>" \
"<gdb:breakpoint #1 BP_BREAKPOINT enabled noisy hit:1 ignore:0 @-qualified main>" \
"check main breakpoint"
gdb_test "guile (print (breakpoint-location (car blist)))" \
"main" "check main breakpoint location"
Expand Down
2 changes: 1 addition & 1 deletion gdb/testsuite/lib/gdb.exp
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ proc runto { function args } {
# If you don't want that, use gdb_start_cmd.

proc runto_main { } {
return [runto main no-message]
return [runto main no-message qualified]
}

### Continue, and expect to hit a breakpoint.
Expand Down
16 changes: 13 additions & 3 deletions gdb/testsuite/lib/mi-support.exp
Original file line number Diff line number Diff line change
Expand Up @@ -1055,8 +1055,12 @@ proc mi_run_to_main { } {
# It returns:
# -1 if test suppressed, failed, timedout
# 0 if test passed
#
# Supported options:
#
# -qualified -- pass --qualified to -break-insert

proc mi_runto_helper {func run_or_continue} {
proc mi_runto_helper {func run_or_continue args} {
global suppress_flag
if { $suppress_flag } {
return -1
Expand All @@ -1065,10 +1069,16 @@ proc mi_runto_helper {func run_or_continue} {
global mi_gdb_prompt expect_out
global hex decimal fullname_syntax

parse_args {{qualified}}

set test "mi runto $func"
set bp [mi_make_breakpoint -type breakpoint -disp del \
-func $func\(\\\(.*\\\)\)?]
mi_gdb_test "200-break-insert -t $func" "200\\^done,$bp" \
set extra_opts ""
if {$qualified} {
append extra_opts "--qualified"
}
mi_gdb_test "200-break-insert $extra_opts -t $func" "200\\^done,$bp" \
"breakpoint at $func"

if {$run_or_continue == "run"} {
Expand All @@ -1089,7 +1099,7 @@ proc mi_runto {func} {
# Just like runto_main but works with the MI interface.

proc mi_runto_main {} {
return [mi_runto_helper "main" "run"]
return [mi_runto_helper "main" "run" -qualified]
}

# Next to the next statement
Expand Down

0 comments on commit 8abd8ee

Please sign in to comment.