2002-05-02 David S. Miller <davem@redhat.com>
[official-gcc.git] / gcc / c-objc-common.c
blobdf16be1f491a58fa0f7b2d1580b3b4fa85f9dcbd
1 /* Some code common to C and ObjC front ends.
2 Copyright (C) 2001 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "tree.h"
24 #include "rtl.h"
25 #include "insn-config.h"
26 #include "integrate.h"
27 #include "expr.h"
28 #include "c-tree.h"
29 #include "function.h"
30 #include "flags.h"
31 #include "toplev.h"
32 #include "diagnostic.h"
33 #include "tree-inline.h"
34 #include "varray.h"
35 #include "ggc.h"
36 #include "langhooks.h"
38 static int c_tree_printer PARAMS ((output_buffer *));
39 static tree inline_forbidden_p PARAMS ((tree *, int *, void *));
40 static void expand_deferred_fns PARAMS ((void));
41 static tree start_cdtor PARAMS ((int));
42 static void finish_cdtor PARAMS ((tree));
44 static varray_type deferred_fns;
46 int
47 c_missing_noreturn_ok_p (decl)
48 tree decl;
50 /* A missing noreturn is not ok for freestanding implementations and
51 ok for the `main' function in hosted implementations. */
52 return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl));
55 /* We want to inline `extern inline' functions even if this would
56 violate inlining limits. Some glibc and linux constructs depend on
57 such functions always being inlined when optimizing. */
59 int
60 c_disregard_inline_limits (fn)
61 tree fn;
63 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL)
64 return 1;
66 return DECL_DECLARED_INLINE_P (fn) && DECL_EXTERNAL (fn);
69 static tree
70 inline_forbidden_p (nodep, walk_subtrees, fn)
71 tree *nodep;
72 int *walk_subtrees ATTRIBUTE_UNUSED;
73 void *fn;
75 tree node = *nodep;
76 tree t;
78 switch (TREE_CODE (node))
80 case CALL_EXPR:
81 t = get_callee_fndecl (node);
83 if (! t)
84 break;
86 /* We cannot inline functions that call setjmp. */
87 if (setjmp_call_p (t))
88 return node;
90 switch (DECL_FUNCTION_CODE (t))
92 /* We cannot inline functions that take a variable number of
93 arguments. */
94 case BUILT_IN_VARARGS_START:
95 case BUILT_IN_STDARG_START:
96 #if 0
97 /* Functions that need information about the address of the
98 caller can't (shouldn't?) be inlined. */
99 case BUILT_IN_RETURN_ADDRESS:
100 #endif
101 return node;
103 default:
104 break;
107 break;
109 case DECL_STMT:
110 /* We cannot inline functions that contain other functions. */
111 if (TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
112 && DECL_INITIAL (TREE_OPERAND (node, 0)))
113 return node;
114 break;
116 case GOTO_STMT:
117 case GOTO_EXPR:
118 t = TREE_OPERAND (node, 0);
120 /* We will not inline a function which uses computed goto. The
121 addresses of its local labels, which may be tucked into
122 global storage, are of course not constant across
123 instantiations, which causes unexpected behaviour. */
124 if (TREE_CODE (t) != LABEL_DECL)
125 return node;
127 /* We cannot inline a nested function that jumps to a nonlocal
128 label. */
129 if (TREE_CODE (t) == LABEL_DECL
130 && DECL_CONTEXT (t) && DECL_CONTEXT (t) != fn)
131 return node;
133 break;
135 default:
136 break;
139 return NULL_TREE;
143 c_cannot_inline_tree_fn (fnp)
144 tree *fnp;
146 tree fn = *fnp;
147 tree t;
149 if (flag_really_no_inline
150 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL)
151 return 1;
153 if (! function_attribute_inlinable_p (fn))
155 DECL_UNINLINABLE (fn) = 1;
156 return 1;
159 /* If a function has pending sizes, we must not defer its
160 compilation, and we can't inline it as a tree. */
161 if (fn == current_function_decl)
163 t = get_pending_sizes ();
164 put_pending_sizes (t);
166 if (t)
168 DECL_UNINLINABLE (fn) = 1;
169 return 1;
173 if (DECL_CONTEXT (fn))
175 /* If a nested function has pending sizes, we may have already
176 saved them. */
177 if (DECL_LANG_SPECIFIC (fn)->pending_sizes)
179 DECL_UNINLINABLE (fn) = 1;
180 return 1;
183 else
185 /* We rely on the fact that this function is called upfront,
186 just before we start expanding a function. If FN is active
187 (i.e., it's the current_function_decl or a parent thereof),
188 we have to walk FN's saved tree. Otherwise, we can safely
189 assume we have done it before and, if we didn't mark it as
190 uninlinable (in which case we wouldn't have been called), it
191 is inlinable. Unfortunately, this strategy doesn't work for
192 nested functions, because they're only expanded as part of
193 their enclosing functions, so the inlinability test comes in
194 late. */
195 t = current_function_decl;
197 while (t && t != fn)
198 t = DECL_CONTEXT (t);
199 if (! t)
200 return 0;
203 if (walk_tree (&DECL_SAVED_TREE (fn), inline_forbidden_p, fn, NULL))
205 DECL_UNINLINABLE (fn) = 1;
206 return 1;
209 return 0;
212 /* Called from check_global_declarations. */
214 bool
215 c_warn_unused_global_decl (decl)
216 tree decl;
218 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
219 return false;
220 if (DECL_IN_SYSTEM_HEADER (decl))
221 return false;
223 return true;
226 /* Initialization common to C and Objective-C front ends. */
227 const char *
228 c_objc_common_init (filename)
229 const char *filename;
231 c_init_decl_processing ();
233 filename = c_common_init (filename);
234 if (filename == NULL)
235 return NULL;
237 lang_expand_decl_stmt = c_expand_decl_stmt;
239 /* These were not defined in the Objective-C front end, but I'm
240 putting them here anyway. The diagnostic format decoder might
241 want an enhanced ObjC implementation. */
242 diagnostic_format_decoder (global_dc) = &c_tree_printer;
243 lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p;
245 /* If still unspecified, make it match -std=c99
246 (allowing for -pedantic-errors). */
247 if (mesg_implicit_function_declaration < 0)
249 if (flag_isoc99)
250 mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1;
251 else
252 mesg_implicit_function_declaration = 0;
255 VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns");
256 ggc_add_tree_varray_root (&deferred_fns, 1);
258 return filename;
261 /* Register a function tree, so that its optimization and conversion
262 to RTL is only done at the end of the compilation. */
265 defer_fn (fn)
266 tree fn;
268 VARRAY_PUSH_TREE (deferred_fns, fn);
270 return 1;
273 /* Expand deferred functions for C and ObjC. */
275 static void
276 expand_deferred_fns ()
278 unsigned int i;
280 for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_fns); i++)
282 tree decl = VARRAY_TREE (deferred_fns, i);
284 if (! TREE_ASM_WRITTEN (decl))
286 /* For static inline functions, delay the decision whether to
287 emit them or not until wrapup_global_declarations. */
288 if (! TREE_PUBLIC (decl))
289 DECL_DEFER_OUTPUT (decl) = 1;
290 c_expand_deferred_function (decl);
294 VARRAY_FREE (deferred_fns);
297 static tree
298 start_cdtor (method_type)
299 int method_type;
301 tree fnname = get_file_function_name (method_type);
302 tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
303 tree body;
305 start_function (void_list_node_1,
306 build_nt (CALL_EXPR, fnname,
307 tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
308 NULL_TREE),
309 NULL_TREE);
310 store_parm_decls ();
312 current_function_cannot_inline
313 = "static constructors and destructors cannot be inlined";
315 body = c_begin_compound_stmt ();
317 pushlevel (0);
318 clear_last_expr ();
319 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
321 return body;
324 static void
325 finish_cdtor (body)
326 tree body;
328 tree scope;
329 tree block;
331 scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
332 block = poplevel (0, 0, 0);
333 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
334 SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
336 RECHAIN_STMTS (body, COMPOUND_BODY (body));
338 finish_function (0, 0);
341 /* Called at end of parsing, but before end-of-file processing. */
343 void
344 c_objc_common_finish_file ()
346 expand_deferred_fns ();
348 if (static_ctors)
350 tree body = start_cdtor ('I');
352 for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
353 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
354 NULL_TREE));
356 finish_cdtor (body);
359 if (static_dtors)
361 tree body = start_cdtor ('D');
363 for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
364 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
365 NULL_TREE));
367 finish_cdtor (body);
371 int flags;
372 FILE *stream = dump_begin (TDI_all, &flags);
374 if (stream)
376 dump_node (getdecls (), flags & ~TDF_SLIM, stream);
377 dump_end (TDI_all, stream);
382 /* Called during diagnostic message formatting process to print a
383 source-level entity onto BUFFER. The meaning of the format specifiers
384 is as follows:
385 %D: a general decl,
386 %F: a function declaration,
387 %T: a type.
389 These format specifiers form a subset of the format specifiers set used
390 by the C++ front-end.
391 Please notice when called, the `%' part was already skipped by the
392 diagnostic machinery. */
393 static int
394 c_tree_printer (buffer)
395 output_buffer *buffer;
397 tree t = va_arg (output_buffer_format_args (buffer), tree);
399 switch (*output_buffer_text_cursor (buffer))
401 case 'D':
402 case 'F':
403 case 'T':
405 const char *n = DECL_NAME (t)
406 ? (*lang_hooks.decl_printable_name) (t, 2)
407 : "({anonymous})";
408 output_add_string (buffer, n);
410 return 1;
412 default:
413 return 0;