X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.mi%2Fmi-pending.exp;h=e81aa9590c58bbcf3986bab1448c207cadefcb32;hb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;hp=5e5096fc638102361d7cc80fdd0019f3fa4b0685;hpb=d24317b4805503c9a018e77ee4683c87678f11ff;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.mi/mi-pending.exp b/gdb/testsuite/gdb.mi/mi-pending.exp index 5e5096fc63..e81aa9590c 100644 --- a/gdb/testsuite/gdb.mi/mi-pending.exp +++ b/gdb/testsuite/gdb.mi/mi-pending.exp @@ -1,4 +1,4 @@ -# Copyright 2007, 2008 Free Software Foundation, Inc. +# Copyright 2007-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,58 +16,109 @@ load_lib mi-support.exp set MIFLAGS "-i=mi" -if $tracelevel then { - strace $tracelevel -} - # # test running programs # -set prms_id 0 -set bug_id 0 if {[skip_shlib_tests]} { return 0 } -set testfile "mi-pending" -set libfile "mi-pendshr" -set srcfile $testfile.c -set libsrc $srcdir/$subdir/$libfile.c -set binfile $objdir/$subdir/$testfile -set lib_sl $objdir/$subdir/$libfile.sl +standard_testfile mi-pending.c -set lib_opts debug -set exec_opts [list debug shlib=$lib_sl] +set libfile1 "mi-pendshr" +set libfile2 "mi-pendshr2" +set libsrc1 $srcdir/$subdir/$libfile1.c +set libsrc2 $srcdir/$subdir/$libfile2.c +set lib_sl1 [standard_output_file $libfile1.sl] +set lib_sl2 [standard_output_file $libfile2.sl] +set lib_opts debug +set exec_opts [list debug shlib=$lib_sl1 shlib_load] -if [get_compiler_info ${binfile}] { +if [get_compiler_info] { return -1 } -if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != "" - || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { - untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile." +if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != "" + || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} { + untested "failed to compile shared library" return -1 } -# Start with a fresh gdb. +if { [gdb_compile_pthreads $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { + untested "failed to compile" + return -1 +} +# Start with a fresh gdb. gdb_exit mi_gdb_start mi_gdb_reinitialize_dir $srcdir/$subdir mi_gdb_load ${binfile} -gdb_load_shlibs $lib_sl +mi_load_shlibs $lib_sl1 +mi_load_shlibs $lib_sl2 -if [target_info exists gdb_stub] { - gdb_step_for_stub; -} - -# Set pending breakpoint via MI +# Set pending breakpoint via MI. mi_gdb_test "-break-insert -f pendfunc1" \ ".*\\^done,bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",pending=\"pendfunc1\",times=\"0\",original-location=\"pendfunc1\"\}"\ "MI pending breakpoint on pendfunc1" +# Set pending breakpoint with a condition via MI. +mi_gdb_test "-break-insert -f -c x==4 ${libfile1}.c:pendfunc2" \ + ".*\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",pending=\"${libfile1}.c:pendfunc2\",cond=\"x==4\",times=\"0\",original-location=\"${libfile1}.c:pendfunc2\"\}"\ + "MI pending breakpoint on ${libfile1}.c:pendfunc2 if x==4" + +# Set breakpoint so that we can stop when the thread is created +mi_gdb_test "-break-insert -f thread_func" \ + ".*\\^done,bkpt=\{number=\"3\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"${hex}\",func=\"thread_func\".*\}"\ + "MI pending breakpoint on thread_func" + mi_run_cmd + mi_expect_stop "breakpoint-hit" "pendfunc1" ".*" ".*" ".*" \ { "" "disp=\"keep\"" } \ "Run till MI pending breakpoint on pendfunc1" + +mi_send_resuming_command "exec-continue" "continuing execution to skip conditional bp" + +# We should not stop on the conditional breakpoint yet, but we stop on the original bp. +mi_expect_stop "breakpoint-hit" "pendfunc1" ".*" ".*" ".*" \ + { "" "disp=\"keep\"" } \ + "Run till MI pending breakpoint on pendfunc1 a second time" + +mi_send_resuming_command "exec-continue" "continuing execution to conditional bp" + +# Now we should stop on the conditional breakpoint. +mi_expect_stop "breakpoint-hit" "pendfunc2" "\{name=\"x\",value=\"4\"\}" ".*" ".*" \ + { "" "disp=\"keep\"" } \ + "Run till MI pending breakpoint on pendfunc2 with x==4" + +mi_send_resuming_command "exec-continue" "continuing execution to thread creation" + +# Stop on thread creation so we can set a pending breakpoint with a thread cond. +mi_expect_stop "breakpoint-hit" "thread_func" ".*" ".*" ".*" \ + { "" "disp=\"keep\"" } \ + "Run till MI pending breakpoint on thread_func" + +# Delete thread creation breakpoint to enable more than 1 thread to be created. +mi_gdb_test "-break-delete 3" "\\^done" "delete breakpoint 3" + +# Set pending breakpoint with a thread via MI. +mi_gdb_test "-break-insert -p 2 -f pendfunc3" \ + ".*\\^done,bkpt=\{number=\"4\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",pending=\"pendfunc3\",thread=\"2\",thread=\"2\",times=\"0\",original-location=\"pendfunc3\"\}"\ + "MI pending breakpoint on pendfunc3" + +mi_send_resuming_command "exec-continue" "continuing execution to thread condition" + +# Check if we stopped in thread 2 like we should. +set testname "run till MI pending breakpoint on pendfunc3 on thread 2" +gdb_expect { + -re "\\*stopped,reason=\"breakpoint-hit\",disp=\"keep\",bkptno=\"4\",frame=\{addr=\"$hex\",func=\"pendfunc3\".*thread-id=\"2\".*" { + pass $testname + return 0 + } + timeout { + fail "$testname (timeout)" + return -1 + } +}