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
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
25 #include "insn-config.h"
26 #include "integrate.h"
32 #include "diagnostic.h"
33 #include "tree-inline.h"
36 #include "langhooks.h"
39 static bool c_tree_printer
PARAMS ((output_buffer
*, text_info
*));
40 static tree inline_forbidden_p
PARAMS ((tree
*, int *, void *));
41 static void expand_deferred_fns
PARAMS ((void));
42 static tree start_cdtor
PARAMS ((int));
43 static void finish_cdtor
PARAMS ((tree
));
45 static GTY(()) varray_type deferred_fns
;
48 c_missing_noreturn_ok_p (decl
)
51 /* A missing noreturn is not ok for freestanding implementations and
52 ok for the `main' function in hosted implementations. */
53 return flag_hosted
&& MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl
));
56 /* We want to inline `extern inline' functions even if this would
57 violate inlining limits. Some glibc and linux constructs depend on
58 such functions always being inlined when optimizing. */
61 c_disregard_inline_limits (fn
)
64 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) != NULL
)
67 return DECL_DECLARED_INLINE_P (fn
) && DECL_EXTERNAL (fn
);
71 inline_forbidden_p (nodep
, walk_subtrees
, fn
)
73 int *walk_subtrees ATTRIBUTE_UNUSED
;
79 switch (TREE_CODE (node
))
82 t
= get_callee_fndecl (node
);
87 /* We cannot inline functions that call setjmp. */
88 if (setjmp_call_p (t
))
91 switch (DECL_FUNCTION_CODE (t
))
93 /* We cannot inline functions that take a variable number of
95 case BUILT_IN_VA_START
:
96 case BUILT_IN_STDARG_START
:
98 /* Functions that need information about the address of the
99 caller can't (shouldn't?) be inlined. */
100 case BUILT_IN_RETURN_ADDRESS
:
111 /* We cannot inline functions that contain other functions. */
112 if (TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
113 && DECL_INITIAL (TREE_OPERAND (node
, 0)))
119 t
= TREE_OPERAND (node
, 0);
121 /* We will not inline a function which uses computed goto. The
122 addresses of its local labels, which may be tucked into
123 global storage, are of course not constant across
124 instantiations, which causes unexpected behavior. */
125 if (TREE_CODE (t
) != LABEL_DECL
)
128 /* We cannot inline a nested function that jumps to a nonlocal
130 if (TREE_CODE (t
) == LABEL_DECL
131 && DECL_CONTEXT (t
) && DECL_CONTEXT (t
) != fn
)
138 /* We cannot inline a function of the form
140 void F (int i) { struct S { int ar[i]; } s; }
142 Attempting to do so produces a catch-22 in tree-inline.c.
143 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
144 UNION_TYPE nodes, then it goes into infinite recursion on a
145 structure containing a pointer to its own type. If it doesn't,
146 then the type node for S doesn't get adjusted properly when
147 F is inlined, and we abort in find_function_data. */
148 for (t
= TYPE_FIELDS (node
); t
; t
= TREE_CHAIN (t
))
149 if (variably_modified_type_p (TREE_TYPE (t
)))
160 c_cannot_inline_tree_fn (fnp
)
166 if (flag_really_no_inline
167 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) == NULL
)
170 /* Don't auto-inline anything that might not be bound within
171 this unit of translation. */
172 if (!DECL_DECLARED_INLINE_P (fn
) && !(*targetm
.binds_local_p
) (fn
))
175 if (! function_attribute_inlinable_p (fn
))
178 /* If a function has pending sizes, we must not defer its
179 compilation, and we can't inline it as a tree. */
180 if (fn
== current_function_decl
)
182 t
= get_pending_sizes ();
183 put_pending_sizes (t
);
189 if (DECL_CONTEXT (fn
))
191 /* If a nested function has pending sizes, we may have already
193 if (DECL_LANG_SPECIFIC (fn
)->pending_sizes
)
198 /* We rely on the fact that this function is called upfront,
199 just before we start expanding a function. If FN is active
200 (i.e., it's the current_function_decl or a parent thereof),
201 we have to walk FN's saved tree. Otherwise, we can safely
202 assume we have done it before and, if we didn't mark it as
203 uninlinable (in which case we wouldn't have been called), it
204 is inlinable. Unfortunately, this strategy doesn't work for
205 nested functions, because they're only expanded as part of
206 their enclosing functions, so the inlinability test comes in
208 t
= current_function_decl
;
211 t
= DECL_CONTEXT (t
);
216 if (walk_tree (&DECL_SAVED_TREE (fn
), inline_forbidden_p
, fn
, NULL
))
222 DECL_UNINLINABLE (fn
) = 1;
226 /* Called from check_global_declarations. */
229 c_warn_unused_global_decl (decl
)
232 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl
))
234 if (DECL_IN_SYSTEM_HEADER (decl
))
240 /* Initialization common to C and Objective-C front ends. */
242 c_objc_common_init (filename
)
243 const char *filename
;
245 c_init_decl_processing ();
247 filename
= c_common_init (filename
);
248 if (filename
== NULL
)
251 lang_expand_decl_stmt
= c_expand_decl_stmt
;
253 /* These were not defined in the Objective-C front end, but I'm
254 putting them here anyway. The diagnostic format decoder might
255 want an enhanced ObjC implementation. */
256 diagnostic_format_decoder (global_dc
) = &c_tree_printer
;
257 lang_missing_noreturn_ok_p
= &c_missing_noreturn_ok_p
;
259 /* If still unspecified, make it match -std=c99
260 (allowing for -pedantic-errors). */
261 if (mesg_implicit_function_declaration
< 0)
264 mesg_implicit_function_declaration
= flag_pedantic_errors
? 2 : 1;
266 mesg_implicit_function_declaration
= 0;
269 VARRAY_TREE_INIT (deferred_fns
, 32, "deferred_fns");
274 /* Register a function tree, so that its optimization and conversion
275 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 ()
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 (method_type
)
314 tree fnname
= get_file_function_name (method_type
);
315 tree void_list_node_1
= build_tree_list (NULL_TREE
, void_type_node
);
318 start_function (void_list_node_1
,
319 build_nt (CALL_EXPR
, fnname
,
320 tree_cons (NULL_TREE
, NULL_TREE
, void_list_node_1
),
325 current_function_cannot_inline
326 = "static constructors and destructors cannot be inlined";
328 body
= c_begin_compound_stmt ();
332 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
344 scope
= add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
345 block
= poplevel (0, 0, 0);
346 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope
)) = block
;
347 SCOPE_STMT_BLOCK (TREE_VALUE (scope
)) = block
;
349 RECHAIN_STMTS (body
, COMPOUND_BODY (body
));
351 finish_function (0, 0);
354 /* Called at end of parsing, but before end-of-file processing. */
357 c_objc_common_finish_file ()
359 expand_deferred_fns ();
363 tree body
= start_cdtor ('I');
365 for (; static_ctors
; static_ctors
= TREE_CHAIN (static_ctors
))
366 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors
),
374 tree body
= start_cdtor ('D');
376 for (; static_dtors
; static_dtors
= TREE_CHAIN (static_dtors
))
377 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors
),
385 FILE *stream
= dump_begin (TDI_all
, &flags
);
389 dump_node (getdecls (), flags
& ~TDF_SLIM
, stream
);
390 dump_end (TDI_all
, stream
);
395 /* Called during diagnostic message formatting process to print a
396 source-level entity onto BUFFER. The meaning of the format specifiers
399 %F: a function declaration,
402 These format specifiers form a subset of the format specifiers set used
403 by the C++ front-end.
404 Please notice when called, the `%' part was already skipped by the
405 diagnostic machinery. */
407 c_tree_printer (buffer
, text
)
408 output_buffer
*buffer
;
411 tree t
= va_arg (*text
->args_ptr
, tree
);
413 switch (*text
->format_spec
)
419 const char *n
= DECL_NAME (t
)
420 ? (*lang_hooks
.decl_printable_name
) (t
, 2)
422 output_add_string (buffer
, n
);
431 #include "gt-c-objc-common.h"