summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.ada/mi_catch_ex_hand.exp
blob: 655b087d5e3fc6aab7a20dbf1e59d83c3f7d34da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# Copyright 2011-2021 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
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile foo

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional_flags=-gnata ]] != "" } {
  return -1
}

# A global variable used to simplify the maintenance of some of
# the regular expressions below.
set eol "\[\r\n\]+"

# Before going any further, verify that we can insert exception
# handlers catchpoints...  That way, we won't have to do this while
# doing the actual GDB/MI testing.

clean_restart ${testfile}

if ![runto_main] then {
   return 0
}

set msg "insert catchpoint on all Ada exceptions handlers"
gdb_test_multiple "catch handlers" $msg {
    -re "Catchpoint $decimal: all Ada exceptions handlers$eol$gdb_prompt $" {
	pass $msg
    }
    -re "Your Ada runtime appears to be missing some debugging information.*\[\r\n\]+$gdb_prompt $" {
	# If the runtime was not built with enough debug information,
	# or if it was stripped, we can not test exception
	# catchpoints.
	unsupported $msg
	return -1
    }
}

# Now, we can start the GDB/MI testing itself...

load_lib mi-support.exp
set MIFLAGS "-i=mi"

mi_clean_restart $binfile

#############################################
# 1. Try catching all exceptions handlers.  #
#############################################

with_test_prefix "scenario 1" {
    if {[mi_runto_main] < 0} {
	return 0
    }
}

mi_gdb_test "-catch-handlers" \
            "\\^done,bkptno=\"$decimal\",bkpt={.*disp=\"keep\",enabled=\"y\",what=\"all Ada exceptions handlers\",.*}" \
            "catch all exceptions handlers"

# Continue to exception handler.

proc continue_to_exception_handler { test line } {

    global decimal

    mi_send_resuming_command "exec-continue" "$test"

    # Now MI stream output.
    mi_expect_stop \
	"breakpoint-hit\",disp=\"keep\",bkptno=\"$decimal\",exception-name=\"exception\"?" \
	"foo" "" ".*" "$line" \
	".*" \
        $test
}

# We don't have the exception name info when stopping at the exception handlers
# catchpoints so we use source line to check if the inferior stops at the
# right location.

set bp_ce_location [gdb_get_line_number "BREAK1" ${testdir}/foo.adb]
continue_to_exception_handler \
    "continue until CE handling caught by all-exceptions handlers catchpoint" \
    "$bp_ce_location"

set bp_pe_location [gdb_get_line_number "BREAK2" ${testdir}/foo.adb]
continue_to_exception_handler \
    "continue until PE handling caught by all-exceptions handlers catchpoint" \
    "$bp_pe_location"

##########################################################
# 2. Try catching only some of the exceptions handlers.  #
##########################################################

# Here is the scenario:
#  - Restart the debugger from scratch, runto_main
#  - We'll catch only "Constraint_Error handlers"
#  - continue, we should stop at the Constraint_Error exception handler
#  - continue, we should not stop at the Program_Error exception handler
#    but exit instead.

with_test_prefix "scenario 2" {
    mi_delete_breakpoints
    if {[mi_runto_main] < 0} {
	return 0
    }
}

mi_gdb_test "-catch-handlers -e Constraint_Error" \
            "\\^done,bkptno=\"$decimal\",bkpt={.*disp=\"keep\",enabled=\"y\",what=\"`Constraint_Error' Ada exception handlers\",.*}" \
            "catch Constraint_Error"

mi_execute_to "exec-continue" \
              "breakpoint-hit\",disp=\"keep\",bkptno=\"$decimal\",exception-name=\"exception\"?" \
              "foo" "" ".*" "$bp_ce_location" \
              ".*" \
              "continue to exception catchpoint hit"

# Exit the inferior.
mi_send_resuming_command "exec-continue" "continuing to inferior exit"
mi_expect_stop "exited-normally" "" "" "" "" "" "exit normally"

mi_gdb_exit
return 0