1 1.1 christos /* This testcase is part of GDB, the GNU debugger. 2 1.1 christos 3 1.1 christos Copyright 2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos This program is free software; you can redistribute it and/or modify 6 1.1 christos it under the terms of the GNU General Public License as published by 7 1.1 christos the Free Software Foundation; either version 3 of the License, or 8 1.1 christos (at your option) any later version. 9 1.1 christos 10 1.1 christos This program is distributed in the hope that it will be useful, 11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 1.1 christos GNU General Public License for more details. 14 1.1 christos 15 1.1 christos You should have received a copy of the GNU General Public License 16 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 1.1 christos 18 1.1 christos /* Used to insert labels within function foo. */ 19 1.1 christos #define LABEL(N) asm ("foo_label_" #N ": .globl foo_label_" #N) 20 1.1 christos 21 1.1 christos volatile int global_var = 0; 22 1.1 christos 23 1.1 christos /* The contents of this '#if 0' block exist so the generated debug can 24 1.1 christos point to these as the source lines. */ 25 1.1 christos #if 0 26 1.1 christos 27 1.1 christos void 28 1.1 christos bar (void) /* bar decl line */ 29 1.1 christos { 30 1.1 christos /* bar line 1 */ 31 1.1 christos /* bar line 2 */ 32 1.1 christos /* bar line 3 */ 33 1.1 christos /* bar line 4 */ 34 1.1 christos } 35 1.1 christos 36 1.1 christos void 37 1.1 christos foo (void) /* foo decl line */ 38 1.1 christos { 39 1.1 christos /* foo line 1 */ 40 1.1 christos /* foo line 2 */ 41 1.1 christos /* foo line 3 */ 42 1.1 christos /* foo line 4 */ 43 1.1 christos } 44 1.1 christos 45 1.1 christos #endif 46 1.1 christos 47 1.1 christos extern void *foo_label_6 (void); 48 1.1 christos 49 1.1 christos void 50 1.1 christos foo (void) 51 1.1 christos { 52 1.1 christos /* This label is used to find the start of 'foo' when generating the 53 1.1 christos debug information. */ 54 1.1 christos asm ("foo_label: .globl foo_label"); 55 1.1 christos ++global_var; 56 1.1 christos 57 1.1 christos LABEL (1); 58 1.1 christos ++global_var; 59 1.1 christos 60 1.1 christos LABEL (2); 61 1.1 christos ++global_var; 62 1.1 christos 63 1.1 christos LABEL (3); 64 1.1 christos ++global_var; 65 1.1 christos 66 1.1 christos /* This goto will always trigger, but we make it conditional so that the 67 1.1 christos compiler doesn't optimise out the code between the goto and the 68 1.1 christos destination. 69 1.1 christos 70 1.1 christos Also 'goto *ADDR' is a GCC extension, but it is critical that the 71 1.1 christos destination address be a global label so that we can generate DWARF 72 1.1 christos that has ranges that start exactly at the destination address. */ 73 1.1 christos if (global_var > 0) 74 1.1 christos goto *(&foo_label_6); 75 1.1 christos 76 1.1 christos LABEL (4); 77 1.1 christos ++global_var; 78 1.1 christos 79 1.1 christos LABEL (5); 80 1.1 christos ++global_var; 81 1.1 christos 82 1.1 christos LABEL (6); 83 1.1 christos ++global_var; 84 1.1 christos 85 1.1 christos LABEL (7); 86 1.1 christos ++global_var; 87 1.1 christos 88 1.1 christos LABEL (8); 89 1.1 christos ++global_var; 90 1.1 christos 91 1.1 christos LABEL (9); 92 1.1 christos ++global_var; 93 1.1 christos } 94 1.1 christos 95 1.1 christos int 96 1.1 christos main (void) 97 1.1 christos { 98 1.1 christos asm ("main_label: .globl main_label"); 99 1.1 christos foo (); 100 1.1 christos } 101