1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2011-2020 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. */ 24extern void do_nothing (void); 25 26int increase_1 (int *a) 27{ 28 *a += 1; 29 return -5; 30} 31 32void increase (int *a) 33{ 34 increase_1 (a); 35} 36 37int 38test_1 (int i, int j) 39{ 40 return i == j; 41} 42 43int 44test (int i, int j) 45{ 46 return test_1 (i, j); 47} 48 49int 50call_longjmp_1 (jmp_buf *buf) 51{ 52 longjmp (*buf, 1); 53} 54 55int 56call_longjmp (jmp_buf *buf) 57{ 58 call_longjmp_1 (buf); 59 return 0; 60} 61 62void 63test_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 71int 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