xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.python/py-finish-breakpoint.c (revision 3117ece4fc4a4ca4489ba793710b60b0d26bab6c)
1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2011-2023 Free Software Foundation, Inc.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see  <http://www.gnu.org/licenses/>.  */
17 
18 #include <setjmp.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <unistd.h>
22 
23 /* Defined in py-events-shlib.h.  */
24 extern void do_nothing (void);
25 
26 int increase_1 (int *a)
27 {
28   *a += 1;
29   return -5;
30 }
31 
32 void increase (int *a)
33 {
34   increase_1 (a);
35 }
36 
37 int
38 test_1 (int i, int j)
39 {
40   return i == j;
41 }
42 
43 int
44 test (int i, int j)
45 {
46   return test_1 (i, j);
47 }
48 
49 int
50 call_longjmp_1 (jmp_buf *buf)
51 {
52   longjmp (*buf, 1);
53 }
54 
55 int
56 call_longjmp (jmp_buf *buf)
57 {
58   call_longjmp_1 (buf);
59   return 0;
60 }
61 
62 void
63 test_exec_exit (const char *self_exec)
64 {
65   if (self_exec == NULL)
66     exit (0);
67   else
68     execl (self_exec, self_exec, "exit", (char *)0);
69 }
70 
71 int main (int argc, char *argv[])
72 {
73   jmp_buf env;
74   int foo = 5;
75   int bar = 42;
76   int i, j;
77 
78   if (argc == 2 && strcmp (argv[1], "exit") == 0)
79     return 0;
80 
81   do_nothing ();
82 
83   i = 0;
84   /* Break at increase.  */
85   increase (&i);
86   increase (&i);
87   increase (&i);
88 
89   for (i = 0; i < 10; i++)
90     {
91       j += 1; /* Condition Break.  */
92     }
93 
94   if (setjmp (env) == 0) /* longjmp caught */
95     {
96       call_longjmp (&env);
97     }
98   else
99     j += 1; /* after longjmp.  */
100 
101   test_exec_exit (argv[0]);
102 
103   return j; /* Break at end.  */
104 }
105