1 /* Some code common to C and ObjC front ends.
2 Copyright (C) 2001, 2002, 2003 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
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
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
23 #include "coretypes.h"
27 #include "insn-config.h"
28 #include "integrate.h"
34 #include "diagnostic.h"
35 #include "tree-inline.h"
38 #include "langhooks.h"
42 static bool c_tree_printer (pretty_printer
*, text_info
*);
43 static tree
inline_forbidden_p (tree
*, int *, void *);
44 static void expand_deferred_fns (void);
45 static tree
start_cdtor (int);
46 static void finish_cdtor (tree
);
48 static GTY(()) varray_type deferred_fns
;
51 c_missing_noreturn_ok_p (tree decl
)
53 /* A missing noreturn is not ok for freestanding implementations and
54 ok for the `main' function in hosted implementations. */
55 return flag_hosted
&& MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl
));
58 /* We want to inline `extern inline' functions even if this would
59 violate inlining limits. Some glibc and linux constructs depend on
60 such functions always being inlined when optimizing. */
63 c_disregard_inline_limits (tree fn
)
65 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) != NULL
)
68 return DECL_DECLARED_INLINE_P (fn
) && DECL_EXTERNAL (fn
);
72 inline_forbidden_p (tree
*nodep
, int *walk_subtrees ATTRIBUTE_UNUSED
,
78 switch (TREE_CODE (node
))
81 t
= get_callee_fndecl (node
);
86 /* We cannot inline functions that call setjmp. */
87 if (setjmp_call_p (t
))
90 switch (DECL_FUNCTION_CODE (t
))
92 /* We cannot inline functions that take a variable number of
94 case BUILT_IN_VA_START
:
95 case BUILT_IN_STDARG_START
:
97 /* Functions that need information about the address of the
98 caller can't (shouldn't?) be inlined. */
99 case BUILT_IN_RETURN_ADDRESS
:
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)))
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 behavior. */
124 if (TREE_CODE (t
) != LABEL_DECL
)
127 /* We cannot inline a nested function that jumps to a nonlocal
129 if (TREE_CODE (t
) == LABEL_DECL
130 && !C_DECL_FILE_SCOPE (t
) && DECL_CONTEXT (t
) != fn
)
137 /* We cannot inline a function of the form
139 void F (int i) { struct S { int ar[i]; } s; }
141 Attempting to do so produces a catch-22 in tree-inline.c.
142 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
143 UNION_TYPE nodes, then it goes into infinite recursion on a
144 structure containing a pointer to its own type. If it doesn't,
145 then the type node for S doesn't get adjusted properly when
146 F is inlined, and we abort in find_function_data. */
147 for (t
= TYPE_FIELDS (node
); t
; t
= TREE_CHAIN (t
))
148 if (variably_modified_type_p (TREE_TYPE (t
)))
159 c_cannot_inline_tree_fn (tree
*fnp
)
164 if (flag_really_no_inline
165 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) == NULL
)
168 /* Don't auto-inline anything that might not be bound within
169 this unit of translation. */
170 if (!DECL_DECLARED_INLINE_P (fn
) && !(*targetm
.binds_local_p
) (fn
))
173 if (! function_attribute_inlinable_p (fn
))
176 /* If a function has pending sizes, we must not defer its
177 compilation, and we can't inline it as a tree. */
178 if (fn
== current_function_decl
)
180 t
= get_pending_sizes ();
181 put_pending_sizes (t
);
187 if (! C_DECL_FILE_SCOPE (fn
))
189 /* If a nested function has pending sizes, we may have already
191 if (DECL_LANG_SPECIFIC (fn
)->pending_sizes
)
196 /* We rely on the fact that this function is called upfront,
197 just before we start expanding a function. If FN is active
198 (i.e., it's the current_function_decl or a parent thereof),
199 we have to walk FN's saved tree. Otherwise, we can safely
200 assume we have done it before and, if we didn't mark it as
201 uninlinable (in which case we wouldn't have been called), it
202 is inlinable. Unfortunately, this strategy doesn't work for
203 nested functions, because they're only expanded as part of
204 their enclosing functions, so the inlinability test comes in
206 t
= current_function_decl
;
209 t
= DECL_CONTEXT (t
);
214 if (walk_tree (&DECL_SAVED_TREE (fn
), inline_forbidden_p
, fn
, NULL
))
220 DECL_UNINLINABLE (fn
) = 1;
224 /* Called from check_global_declarations. */
227 c_warn_unused_global_decl (tree decl
)
229 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl
))
231 if (DECL_IN_SYSTEM_HEADER (decl
))
237 /* Initialization common to C and Objective-C front ends. */
239 c_objc_common_init (void)
241 static const enum tree_code stmt_codes
[] = {
245 INIT_STATEMENT_CODES (stmt_codes
);
247 c_init_decl_processing ();
249 if (c_common_init () == false)
252 lang_expand_decl_stmt
= c_expand_decl_stmt
;
254 /* These were not defined in the Objective-C front end, but I'm
255 putting them here anyway. The diagnostic format decoder might
256 want an enhanced ObjC implementation. */
257 diagnostic_format_decoder (global_dc
) = &c_tree_printer
;
258 lang_missing_noreturn_ok_p
= &c_missing_noreturn_ok_p
;
260 /* If still unspecified, make it match -std=c99
261 (allowing for -pedantic-errors). */
262 if (mesg_implicit_function_declaration
< 0)
265 mesg_implicit_function_declaration
= flag_pedantic_errors
? 2 : 1;
267 mesg_implicit_function_declaration
= 0;
270 VARRAY_TREE_INIT (deferred_fns
, 32, "deferred_fns");
275 /* Register a function tree, so that its optimization and conversion
276 to RTL is only done at the end of the compilation. */
281 VARRAY_PUSH_TREE (deferred_fns
, fn
);
286 /* Expand deferred functions for C and ObjC. */
289 expand_deferred_fns (void)
293 for (i
= 0; i
< VARRAY_ACTIVE_SIZE (deferred_fns
); i
++)
295 tree decl
= VARRAY_TREE (deferred_fns
, i
);
297 if (! TREE_ASM_WRITTEN (decl
))
299 /* For static inline functions, delay the decision whether to
300 emit them or not until wrapup_global_declarations. */
301 if (! TREE_PUBLIC (decl
))
302 DECL_DEFER_OUTPUT (decl
) = 1;
303 c_expand_deferred_function (decl
);
311 start_cdtor (int method_type
)
313 tree fnname
= get_file_function_name (method_type
);
314 tree void_list_node_1
= build_tree_list (NULL_TREE
, void_type_node
);
317 start_function (void_list_node_1
,
318 build_nt (CALL_EXPR
, fnname
,
319 tree_cons (NULL_TREE
, NULL_TREE
, void_list_node_1
),
324 current_function_cannot_inline
325 = "static constructors and destructors cannot be inlined";
327 body
= c_begin_compound_stmt ();
331 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
337 finish_cdtor (tree body
)
342 scope
= add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
343 block
= poplevel (0, 0, 0);
344 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope
)) = block
;
345 SCOPE_STMT_BLOCK (TREE_VALUE (scope
)) = block
;
347 RECHAIN_STMTS (body
, COMPOUND_BODY (body
));
349 finish_function (0, 0);
352 /* Called at end of parsing, but before end-of-file processing. */
355 c_objc_common_finish_file (void)
358 c_common_write_pch ();
360 /* If multiple translation units were built, copy information between
361 them based on linkage rules. */
362 merge_translation_unit_decls ();
364 if (flag_unit_at_a_time
)
366 cgraph_finalize_compilation_unit ();
370 expand_deferred_fns ();
374 tree body
= start_cdtor ('I');
376 for (; static_ctors
; static_ctors
= TREE_CHAIN (static_ctors
))
377 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors
),
385 tree body
= start_cdtor ('D');
387 for (; static_dtors
; static_dtors
= TREE_CHAIN (static_dtors
))
388 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors
),
396 FILE *stream
= dump_begin (TDI_all
, &flags
);
400 dump_node (getdecls (), flags
& ~TDF_SLIM
, stream
);
401 dump_end (TDI_all
, stream
);
406 /* Called during diagnostic message formatting process to print a
407 source-level entity onto BUFFER. The meaning of the format specifiers
411 %F: a function declaration,
414 These format specifiers form a subset of the format specifiers set used
415 by the C++ front-end.
416 Please notice when called, the `%' part was already skipped by the
417 diagnostic machinery. */
419 c_tree_printer (pretty_printer
*pp
, text_info
*text
)
421 tree t
= va_arg (*text
->args_ptr
, tree
);
423 switch (*text
->format_spec
)
429 const char *n
= DECL_NAME (t
)
430 ? (*lang_hooks
.decl_printable_name
) (t
, 2)
437 if (TREE_CODE (t
) == IDENTIFIER_NODE
)
439 pp_string (pp
, IDENTIFIER_POINTER (t
));
449 #include "gt-c-objc-common.h"