]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-objc-common.c
gcc_release (announce_snapshot): Use changedir instead of plain cd.
[thirdparty/gcc.git] / gcc / c-objc-common.c
CommitLineData
0abc6a6a 1/* Some code common to C and ObjC front ends.
b684a3df 2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
0abc6a6a
NB
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 2, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING. If not, write to the Free
18Software Foundation, 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA. */
20
21#include "config.h"
22#include "system.h"
4977bab6
ZW
23#include "coretypes.h"
24#include "tm.h"
0abc6a6a
NB
25#include "tree.h"
26#include "rtl.h"
27#include "insn-config.h"
28#include "integrate.h"
29#include "expr.h"
30#include "c-tree.h"
31#include "function.h"
32#include "flags.h"
33#include "toplev.h"
34#include "diagnostic.h"
35#include "tree-inline.h"
3b27886e
NB
36#include "varray.h"
37#include "ggc.h"
7afff7cf 38#include "langhooks.h"
38ec83b1 39#include "target.h"
1c4a429a 40#include "cgraph.h"
0abc6a6a 41
b6fe0bb8 42static bool c_tree_printer (pretty_printer *, text_info *);
2f6e4e97
AJ
43static tree start_cdtor (int);
44static void finish_cdtor (tree);
3b27886e 45
0abc6a6a 46int
2f6e4e97 47c_missing_noreturn_ok_p (tree decl)
0abc6a6a
NB
48{
49 /* A missing noreturn is not ok for freestanding implementations and
50 ok for the `main' function in hosted implementations. */
51 return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl));
52}
53
54/* We want to inline `extern inline' functions even if this would
55 violate inlining limits. Some glibc and linux constructs depend on
56 such functions always being inlined when optimizing. */
57
58int
2f6e4e97 59c_disregard_inline_limits (tree fn)
0abc6a6a 60{
6aa77e6c
AH
61 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL)
62 return 1;
63
b684a3df
JH
64 return (!flag_really_no_inline && DECL_DECLARED_INLINE_P (fn)
65 && DECL_EXTERNAL (fn));
0abc6a6a
NB
66}
67
0abc6a6a 68int
2f6e4e97 69c_cannot_inline_tree_fn (tree *fnp)
0abc6a6a
NB
70{
71 tree fn = *fnp;
72 tree t;
f08545a8
JH
73 bool do_warning = (warn_inline
74 && DECL_INLINE (fn)
75 && DECL_DECLARED_INLINE_P (fn)
76 && !DECL_IN_SYSTEM_HEADER (fn));
0abc6a6a 77
2cb921f4 78 if (flag_really_no_inline
6aa77e6c 79 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL)
f08545a8
JH
80 {
81 if (do_warning)
ddd2d57e 82 warning ("%Jfunction '%F' can never be inlined because it "
56ae04af 83 "is suppressed using -fno-inline", fn, fn);
f08545a8
JH
84 goto cannot_inline;
85 }
6aa77e6c 86
2f6e4e97 87 /* Don't auto-inline anything that might not be bound within
38ec83b1
RH
88 this unit of translation. */
89 if (!DECL_DECLARED_INLINE_P (fn) && !(*targetm.binds_local_p) (fn))
f08545a8
JH
90 {
91 if (do_warning)
ddd2d57e
RH
92 warning ("%Jfunction '%F' can never be inlined because it might not "
93 "be bound within this unit of translation", fn, fn);
f08545a8
JH
94 goto cannot_inline;
95 }
38ec83b1 96
0abc6a6a 97 if (! function_attribute_inlinable_p (fn))
f08545a8
JH
98 {
99 if (do_warning)
ddd2d57e
RH
100 warning ("%Jfunction '%F' can never be inlined because it uses "
101 "attributes conflicting with inlining", fn, fn);
f08545a8
JH
102 goto cannot_inline;
103 }
0abc6a6a
NB
104
105 /* If a function has pending sizes, we must not defer its
106 compilation, and we can't inline it as a tree. */
107 if (fn == current_function_decl)
108 {
109 t = get_pending_sizes ();
110 put_pending_sizes (t);
111
112 if (t)
f08545a8
JH
113 {
114 if (do_warning)
ddd2d57e
RH
115 warning ("%Jfunction '%F' can never be inlined because it has "
116 "pending sizes", fn, fn);
f08545a8
JH
117 goto cannot_inline;
118 }
0abc6a6a
NB
119 }
120
4b1e44be 121 if (! DECL_FILE_SCOPE_P (fn))
0abc6a6a
NB
122 {
123 /* If a nested function has pending sizes, we may have already
124 saved them. */
125 if (DECL_LANG_SPECIFIC (fn)->pending_sizes)
f08545a8
JH
126 {
127 if (do_warning)
ddd2d57e
RH
128 warning ("%Jnested function '%F' can never be inlined because it "
129 "has possibly saved pending sizes", fn, fn);
f08545a8
JH
130 goto cannot_inline;
131 }
0abc6a6a 132 }
2f6e4e97 133
0abc6a6a 134 return 0;
38ec83b1
RH
135
136 cannot_inline:
137 DECL_UNINLINABLE (fn) = 1;
138 return 1;
0abc6a6a
NB
139}
140
ef4f94ac
RH
141/* Called from check_global_declarations. */
142
143bool
2f6e4e97 144c_warn_unused_global_decl (tree decl)
ef4f94ac
RH
145{
146 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
147 return false;
148 if (DECL_IN_SYSTEM_HEADER (decl))
149 return false;
150
151 return true;
152}
153
0abc6a6a 154/* Initialization common to C and Objective-C front ends. */
4bfec483 155bool
2f6e4e97 156c_objc_common_init (void)
0abc6a6a 157{
009ed910
SB
158 static const enum tree_code stmt_codes[] = {
159 c_common_stmt_codes
160 };
161
162 INIT_STATEMENT_CODES (stmt_codes);
163
0abc6a6a
NB
164 c_init_decl_processing ();
165
4bfec483
NB
166 if (c_common_init () == false)
167 return false;
0abc6a6a 168
0abc6a6a
NB
169 lang_expand_decl_stmt = c_expand_decl_stmt;
170
171 /* These were not defined in the Objective-C front end, but I'm
172 putting them here anyway. The diagnostic format decoder might
173 want an enhanced ObjC implementation. */
174 diagnostic_format_decoder (global_dc) = &c_tree_printer;
175 lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p;
176
177 /* If still unspecified, make it match -std=c99
178 (allowing for -pedantic-errors). */
179 if (mesg_implicit_function_declaration < 0)
180 {
181 if (flag_isoc99)
182 mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1;
183 else
184 mesg_implicit_function_declaration = 0;
185 }
186
4bfec483 187 return true;
0abc6a6a
NB
188}
189
3b27886e 190static tree
2f6e4e97 191start_cdtor (int method_type)
3b27886e
NB
192{
193 tree fnname = get_file_function_name (method_type);
194 tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
195 tree body;
196
197 start_function (void_list_node_1,
198 build_nt (CALL_EXPR, fnname,
199 tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
200 NULL_TREE),
201 NULL_TREE);
202 store_parm_decls ();
203
204 current_function_cannot_inline
205 = "static constructors and destructors cannot be inlined";
206
207 body = c_begin_compound_stmt ();
208
209 pushlevel (0);
210 clear_last_expr ();
211 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
212
213 return body;
214}
215
216static void
2f6e4e97 217finish_cdtor (tree body)
3b27886e
NB
218{
219 tree scope;
220 tree block;
221
222 scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
223 block = poplevel (0, 0, 0);
224 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
225 SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
226
227 RECHAIN_STMTS (body, COMPOUND_BODY (body));
228
4a46cbfb 229 finish_function ();
3b27886e
NB
230}
231
232/* Called at end of parsing, but before end-of-file processing. */
233
234void
2f6e4e97 235c_objc_common_finish_file (void)
3b27886e 236{
17211ab5
GK
237 if (pch_file)
238 c_common_write_pch ();
239
d1bd0ded
GK
240 /* If multiple translation units were built, copy information between
241 them based on linkage rules. */
242 merge_translation_unit_decls ();
243
4a46cbfb
JH
244 cgraph_finalize_compilation_unit ();
245 cgraph_optimize ();
3b27886e
NB
246
247 if (static_ctors)
248 {
249 tree body = start_cdtor ('I');
250
251 for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
252 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
253 NULL_TREE));
254
255 finish_cdtor (body);
256 }
257
258 if (static_dtors)
259 {
260 tree body = start_cdtor ('D');
261
262 for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
263 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
264 NULL_TREE));
265
266 finish_cdtor (body);
267 }
3b27886e
NB
268}
269
0abc6a6a
NB
270/* Called during diagnostic message formatting process to print a
271 source-level entity onto BUFFER. The meaning of the format specifiers
272 is as follows:
273 %D: a general decl,
eb8221ea 274 %E: An expression,
0abc6a6a
NB
275 %F: a function declaration,
276 %T: a type.
277
278 These format specifiers form a subset of the format specifiers set used
279 by the C++ front-end.
280 Please notice when called, the `%' part was already skipped by the
281 diagnostic machinery. */
47b69537 282static bool
b6fe0bb8 283c_tree_printer (pretty_printer *pp, text_info *text)
0abc6a6a 284{
47b69537 285 tree t = va_arg (*text->args_ptr, tree);
c157f85c 286 const char *n = "({anonymous})";
0abc6a6a 287
47b69537 288 switch (*text->format_spec)
0abc6a6a
NB
289 {
290 case 'D':
291 case 'F':
c157f85c
RH
292 if (DECL_NAME (t))
293 n = (*lang_hooks.decl_printable_name) (t, 2);
294 break;
295
0abc6a6a 296 case 'T':
c157f85c
RH
297 if (TREE_CODE (t) == TYPE_DECL)
298 {
299 if (DECL_NAME (t))
300 n = (*lang_hooks.decl_printable_name) (t, 2);
301 }
302 else
303 {
304 t = TYPE_NAME (t);
305 if (t)
306 n = IDENTIFIER_POINTER (t);
307 }
308 break;
0abc6a6a 309
eb8221ea 310 case 'E':
c157f85c
RH
311 if (TREE_CODE (t) == IDENTIFIER_NODE)
312 n = IDENTIFIER_POINTER (t);
313 else
314 return false;
315 break;
eb8221ea 316
0abc6a6a 317 default:
47b69537 318 return false;
0abc6a6a 319 }
c157f85c
RH
320
321 pp_string (pp, n);
322 return true;
0abc6a6a 323}
e57e265b
PB
324
325tree
326c_objc_common_truthvalue_conversion (tree expr)
327{
328 retry:
329 switch (TREE_CODE (TREE_TYPE (expr)))
330 {
331 case ARRAY_TYPE:
332 expr = default_conversion (expr);
333 if (TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
334 goto retry;
335
336 error ("used array that cannot be converted to pointer where scalar is required");
337 return error_mark_node;
338
339 case RECORD_TYPE:
340 error ("used struct type value where scalar is required");
341 return error_mark_node;
342
343 case UNION_TYPE:
344 error ("used union type value where scalar is required");
345 return error_mark_node;
346 default:
347 break;
348 }
349
350 return c_common_truthvalue_conversion (expr);
351}
352