1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright (C) 2012-2013 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__((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
func1(int x)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
func2(int x)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
func3b(int x)47 func3b (int x)
48 {
49   return x < 14 ? 1 : 2;
50 }
51 
52 static inline ATTR int
func3a(int x)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
func4b(int x)62 func4b (int x)
63 {
64   return x < 13 ? 1 : 2;
65 }
66 
67 inline ATTR int
func4a(int x)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
func5b(int x)77 func5b (int x)
78 {
79   return x < 12 ? 1 : 2;
80 }
81 
82 static inline ATTR int
func5a(int x)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
func6b(int x)92 func6b (int x)
93 {
94   return x < 14 ? 3 : 2;
95 }
96 
97 inline ATTR int
func6a(int x)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
func7b(int x)106 func7b (int x)
107 {
108   return x < 23 ? 1 : 4;
109 }
110 
111 static inline ATTR int
func7a(int x)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
func8b(int x)120 func8b (int x)
121 {
122   return x < 7 ? 11 : 9;
123 }
124 
125 static inline ATTR int
func8a(int x)126 func8a (int x)
127 {
128   return func8b (x * 31);
129 }
130 
131 /* Entry point.  */
132 
133 int
main(int argc,char * argv[])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