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 tree
start_cdtor (int);
45 static void finish_cdtor (tree
);
48 c_missing_noreturn_ok_p (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. */
60 c_disregard_inline_limits (tree fn
)
62 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) != NULL
)
65 return DECL_DECLARED_INLINE_P (fn
) && DECL_EXTERNAL (fn
);
69 inline_forbidden_p (tree
*nodep
, int *walk_subtrees ATTRIBUTE_UNUSED
,
75 switch (TREE_CODE (node
))
78 t
= get_callee_fndecl (node
);
83 /* We cannot inline functions that call setjmp. */
84 if (setjmp_call_p (t
))
87 switch (DECL_FUNCTION_CODE (t
))
89 /* We cannot inline functions that take a variable number of
91 case BUILT_IN_VA_START
:
92 case BUILT_IN_STDARG_START
:
94 /* Functions that need information about the address of the
95 caller can't (shouldn't?) be inlined. */
96 case BUILT_IN_RETURN_ADDRESS
:
107 /* We cannot inline functions that contain other functions. */
108 if (TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
109 && DECL_INITIAL (TREE_OPERAND (node
, 0)))
115 t
= TREE_OPERAND (node
, 0);
117 /* We will not inline a function which uses computed goto. The
118 addresses of its local labels, which may be tucked into
119 global storage, are of course not constant across
120 instantiations, which causes unexpected behavior. */
121 if (TREE_CODE (t
) != LABEL_DECL
)
124 /* We cannot inline a nested function that jumps to a nonlocal
126 if (TREE_CODE (t
) == LABEL_DECL
127 && !DECL_FILE_SCOPE_P (t
) && DECL_CONTEXT (t
) != fn
)
134 /* We cannot inline a function of the form
136 void F (int i) { struct S { int ar[i]; } s; }
138 Attempting to do so produces a catch-22 in tree-inline.c.
139 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
140 UNION_TYPE nodes, then it goes into infinite recursion on a
141 structure containing a pointer to its own type. If it doesn't,
142 then the type node for S doesn't get adjusted properly when
143 F is inlined, and we abort in find_function_data. */
144 for (t
= TYPE_FIELDS (node
); t
; t
= TREE_CHAIN (t
))
145 if (variably_modified_type_p (TREE_TYPE (t
)))
156 c_cannot_inline_tree_fn (tree
*fnp
)
161 if (flag_really_no_inline
162 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) == NULL
)
165 /* Don't auto-inline anything that might not be bound within
166 this unit of translation. */
167 if (!DECL_DECLARED_INLINE_P (fn
) && !(*targetm
.binds_local_p
) (fn
))
170 if (! function_attribute_inlinable_p (fn
))
173 /* If a function has pending sizes, we must not defer its
174 compilation, and we can't inline it as a tree. */
175 if (fn
== current_function_decl
)
177 t
= get_pending_sizes ();
178 put_pending_sizes (t
);
184 if (! DECL_FILE_SCOPE_P (fn
))
186 /* If a nested function has pending sizes, we may have already
188 if (DECL_LANG_SPECIFIC (fn
)->pending_sizes
)
193 /* We rely on the fact that this function is called upfront,
194 just before we start expanding a function. If FN is active
195 (i.e., it's the current_function_decl or a parent thereof),
196 we have to walk FN's saved tree. Otherwise, we can safely
197 assume we have done it before and, if we didn't mark it as
198 uninlinable (in which case we wouldn't have been called), it
199 is inlinable. Unfortunately, this strategy doesn't work for
200 nested functions, because they're only expanded as part of
201 their enclosing functions, so the inlinability test comes in
203 t
= current_function_decl
;
206 t
= DECL_CONTEXT (t
);
211 if (walk_tree (&DECL_SAVED_TREE (fn
), inline_forbidden_p
, fn
, NULL
))
217 DECL_UNINLINABLE (fn
) = 1;
221 /* Called from check_global_declarations. */
224 c_warn_unused_global_decl (tree decl
)
226 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl
))
228 if (DECL_IN_SYSTEM_HEADER (decl
))
234 /* Initialization common to C and Objective-C front ends. */
236 c_objc_common_init (void)
238 static const enum tree_code stmt_codes
[] = {
242 INIT_STATEMENT_CODES (stmt_codes
);
244 c_init_decl_processing ();
246 if (c_common_init () == false)
249 lang_expand_decl_stmt
= c_expand_decl_stmt
;
251 /* These were not defined in the Objective-C front end, but I'm
252 putting them here anyway. The diagnostic format decoder might
253 want an enhanced ObjC implementation. */
254 diagnostic_format_decoder (global_dc
) = &c_tree_printer
;
255 lang_missing_noreturn_ok_p
= &c_missing_noreturn_ok_p
;
257 /* If still unspecified, make it match -std=c99
258 (allowing for -pedantic-errors). */
259 if (mesg_implicit_function_declaration
< 0)
262 mesg_implicit_function_declaration
= flag_pedantic_errors
? 2 : 1;
264 mesg_implicit_function_declaration
= 0;
271 start_cdtor (int method_type
)
273 tree fnname
= get_file_function_name (method_type
);
274 tree void_list_node_1
= build_tree_list (NULL_TREE
, void_type_node
);
277 start_function (void_list_node_1
,
278 build_nt (CALL_EXPR
, fnname
,
279 tree_cons (NULL_TREE
, NULL_TREE
, void_list_node_1
),
284 current_function_cannot_inline
285 = "static constructors and destructors cannot be inlined";
287 body
= c_begin_compound_stmt ();
291 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
297 finish_cdtor (tree body
)
302 scope
= add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
303 block
= poplevel (0, 0, 0);
304 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope
)) = block
;
305 SCOPE_STMT_BLOCK (TREE_VALUE (scope
)) = block
;
307 RECHAIN_STMTS (body
, COMPOUND_BODY (body
));
312 /* Called at end of parsing, but before end-of-file processing. */
315 c_objc_common_finish_file (void)
318 c_common_write_pch ();
320 /* If multiple translation units were built, copy information between
321 them based on linkage rules. */
322 merge_translation_unit_decls ();
324 cgraph_finalize_compilation_unit ();
329 tree body
= start_cdtor ('I');
331 for (; static_ctors
; static_ctors
= TREE_CHAIN (static_ctors
))
332 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors
),
340 tree body
= start_cdtor ('D');
342 for (; static_dtors
; static_dtors
= TREE_CHAIN (static_dtors
))
343 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors
),
351 FILE *stream
= dump_begin (TDI_all
, &flags
);
355 dump_node (getdecls (), flags
& ~TDF_SLIM
, stream
);
356 dump_end (TDI_all
, stream
);
361 /* Called during diagnostic message formatting process to print a
362 source-level entity onto BUFFER. The meaning of the format specifiers
366 %F: a function declaration,
369 These format specifiers form a subset of the format specifiers set used
370 by the C++ front-end.
371 Please notice when called, the `%' part was already skipped by the
372 diagnostic machinery. */
374 c_tree_printer (pretty_printer
*pp
, text_info
*text
)
376 tree t
= va_arg (*text
->args_ptr
, tree
);
378 switch (*text
->format_spec
)
384 const char *n
= DECL_NAME (t
)
385 ? (*lang_hooks
.decl_printable_name
) (t
, 2)
392 if (TREE_CODE (t
) == IDENTIFIER_NODE
)
394 pp_string (pp
, IDENTIFIER_POINTER (t
));