xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.opt/inline-break.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright (C) 2012-2016 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 /* The file ../gdb.dwarf2/inline-break.S was generated manually from
19    this file, and should be regenerated if this file is modified.  */
20 
21 #ifdef __GNUC__
22 # define ATTR __attribute__((gnu_inline)) __attribute__((always_inline))
23 #else
24 # define ATTR
25 #endif
26 
27 /* A static inlined function that is called once.  */
28 
29 static inline ATTR int
30 func1 (int x)
31 {
32   return x * 23;
33 }
34 
35 /* A non-static inlined function that is called once.  */
36 
37 inline ATTR int
38 func2 (int x)
39 {
40   return x * 17;
41 }
42 
43 /* A static inlined function that calls another static inlined
44    function.  */
45 
46 static inline ATTR int
47 func3b (int x)
48 {
49   return x < 14 ? 1 : 2;
50 }
51 
52 static inline ATTR int
53 func3a (int x)
54 {
55   return func3b (x * 23);
56 }
57 
58 /* A non-static inlined function that calls a static inlined
59    function.  */
60 
61 static inline ATTR int
62 func4b (int x)
63 {
64   return x < 13 ? 1 : 2;
65 }
66 
67 inline ATTR int
68 func4a (int x)
69 {
70   return func4b (x * 17);
71 }
72 
73 /* A static inlined function that calls a non-static inlined
74    function.  */
75 
76 inline ATTR int
77 func5b (int x)
78 {
79   return x < 12 ? 1 : 2;
80 }
81 
82 static inline ATTR int
83 func5a (int x)
84 {
85   return func5b (x * 23);
86 }
87 
88 /* A non-static inlined function that calls another non-static inlined
89    function.  */
90 
91 inline ATTR int
92 func6b (int x)
93 {
94   return x < 14 ? 3 : 2;
95 }
96 
97 inline ATTR int
98 func6a (int x)
99 {
100   return func6b (x * 17);
101 }
102 
103 /* A static inlined function that is called more than once.  */
104 
105 static inline ATTR int
106 func7b (int x)
107 {
108   return x < 23 ? 1 : 4;
109 }
110 
111 static inline ATTR int
112 func7a (int x)
113 {
114   return func7b (x * 29);
115 }
116 
117 /* A non-static inlined function that is called more than once.  */
118 
119 inline ATTR int
120 func8b (int x)
121 {
122   return x < 7 ? 11 : 9;
123 }
124 
125 static inline ATTR int
126 func8a (int x)
127 {
128   return func8b (x * 31);
129 }
130 
131 /* Entry point.  */
132 
133 int
134 main (int argc, char *argv[])
135 {
136   /* Declaring x as volatile here prevents GCC from combining calls.
137      If GCC is allowed to combine calls then some of them end up with
138      no instructions at all, so there is no specific address for GDB
139      to set a breakpoint at.  */
140   volatile int x = argc;
141 
142   x = func1 (x);
143 
144   x = func2 (x);
145 
146   x = func3a (x);
147 
148   x = func4a (x);
149 
150   x = func5a (x);
151 
152   x = func6a (x);
153 
154   x = func7a (x) + func7b (x);
155 
156   x = func8a (x) + func8b (x);
157 
158   return x;
159 }
160