Home | History | Annotate | Line # | Download | only in gdb.dwarf2
dw2-step-between-inline-func-blocks.c revision 1.1.1.1
      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