1 /* Language-specific hook definitions for C front end.
2 Copyright (C) 1991, 1995, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
26 #include "tree-inline.h"
30 #include "diagnostic.h"
39 #include "insn-config.h"
40 #include "integrate.h"
41 #include "langhooks.h"
42 #include "langhooks-def.h"
44 static int c_tree_printer PARAMS ((output_buffer *));
45 static int c_missing_noreturn_ok_p PARAMS ((tree));
46 static void c_init PARAMS ((void));
47 static void c_init_options PARAMS ((void));
48 static void c_post_options PARAMS ((void));
49 static int c_disregard_inline_limits PARAMS ((tree));
50 static int c_cannot_inline_tree_fn PARAMS ((tree *));
52 #undef LANG_HOOKS_INIT
53 #define LANG_HOOKS_INIT c_init
54 #undef LANG_HOOKS_INIT_OPTIONS
55 #define LANG_HOOKS_INIT_OPTIONS c_init_options
56 #undef LANG_HOOKS_DECODE_OPTION
57 #define LANG_HOOKS_DECODE_OPTION c_decode_option
58 #undef LANG_HOOKS_POST_OPTIONS
59 #define LANG_HOOKS_POST_OPTIONS c_post_options
60 #undef LANG_HOOKS_GET_ALIAS_SET
61 #define LANG_HOOKS_GET_ALIAS_SET c_common_get_alias_set
63 #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN
64 #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \
65 c_cannot_inline_tree_fn
66 #undef LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS
67 #define LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS \
68 c_disregard_inline_limits
69 #undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
70 #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
73 /* Each front end provides its own. */
74 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
76 /* Post-switch processing. */
80 cpp_post_options (parse_in);
82 /* Use tree inlining if possible. Function instrumentation is only
83 done in the RTL level, so we disable tree inlining. */
84 if (! flag_instrument_function_entry_exit)
88 flag_inline_trees = 1;
91 if (flag_inline_functions)
93 flag_inline_trees = 2;
94 flag_inline_functions = 0;
102 /* Make identifier nodes long enough for the language-specific slots. */
103 set_identifier_size (sizeof (struct lang_identifier));
105 parse_in = cpp_create_reader (ident_hash, CLK_GNUC89);
107 /* Mark as "unspecified". */
108 flag_bounds_check = -1;
114 c_common_lang_init ();
116 /* If still unspecified, make it match -std=c99
117 (allowing for -pedantic-errors). */
118 if (mesg_implicit_function_declaration < 0)
121 mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1;
123 mesg_implicit_function_declaration = 0;
126 save_lang_status = &push_c_function_context;
127 restore_lang_status = &pop_c_function_context;
128 mark_lang_status = &mark_c_function_context;
129 lang_expand_expr = &c_expand_expr;
130 lang_safe_from_p = &c_safe_from_p;
131 diagnostic_format_decoder (global_dc) = &c_tree_printer;
132 lang_expand_decl_stmt = &c_expand_decl_stmt;
133 lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p;
145 print_lang_statistics ()
149 /* used by print-tree.c */
152 lang_print_xnode (file, node, indent)
153 FILE *file ATTRIBUTE_UNUSED;
154 tree node ATTRIBUTE_UNUSED;
155 int indent ATTRIBUTE_UNUSED;
159 /* Used by c-lex.c, but only for objc. */
162 lookup_interface (arg)
163 tree arg ATTRIBUTE_UNUSED;
170 tree arg ATTRIBUTE_UNUSED;
176 maybe_objc_check_decl (decl)
177 tree decl ATTRIBUTE_UNUSED;
182 maybe_objc_comptypes (lhs, rhs, reflexive)
183 tree lhs ATTRIBUTE_UNUSED;
184 tree rhs ATTRIBUTE_UNUSED;
185 int reflexive ATTRIBUTE_UNUSED;
191 maybe_building_objc_message_expr ()
197 recognize_objc_keyword ()
202 /* Used by c-typeck.c (build_external_ref), but only for objc. */
205 lookup_objc_ivar (id)
206 tree id ATTRIBUTE_UNUSED;
211 #if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR)
212 extern tree static_ctors;
213 extern tree static_dtors;
215 static tree start_cdtor PARAMS ((int));
216 static void finish_cdtor PARAMS ((tree));
219 start_cdtor (method_type)
222 tree fnname = get_file_function_name (method_type);
223 tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
226 start_function (void_list_node_1,
227 build_nt (CALL_EXPR, fnname,
228 tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
233 current_function_cannot_inline
234 = "static constructors and destructors cannot be inlined";
236 body = c_begin_compound_stmt ();
240 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
252 scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
253 block = poplevel (0, 0, 0);
254 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
255 SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
257 RECHAIN_STMTS (body, COMPOUND_BODY (body));
263 /* Called at end of parsing, but before end-of-file processing. */
268 #ifndef ASM_OUTPUT_CONSTRUCTOR
271 tree body = start_cdtor ('I');
273 for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
274 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
280 #ifndef ASM_OUTPUT_DESTRUCTOR
283 tree body = start_cdtor ('D');
285 for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
286 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
294 (*back_end_hook) (getdecls ());
298 FILE *stream = dump_begin (TDI_all, &flags);
302 dump_node (getdecls (), flags & ~TDF_SLIM, stream);
303 dump_end (TDI_all, stream);
308 /* Called during diagnostic message formatting process to print a
309 source-level entity onto BUFFER. The meaning of the format specifiers
312 %F: a function declaration,
315 These format specifiers form a subset of the format specifiers set used
316 by the C++ front-end.
317 Please notice when called, the `%' part was already skipped by the
318 diagnostic machinery. */
320 c_tree_printer (buffer)
321 output_buffer *buffer;
323 tree t = va_arg (output_buffer_format_args (buffer), tree);
325 switch (*output_buffer_text_cursor (buffer))
331 const char *n = DECL_NAME (t)
332 ? (*decl_printable_name) (t, 2)
334 output_add_string (buffer, n);
344 c_missing_noreturn_ok_p (decl)
347 /* A missing noreturn is not ok for freestanding implementations and
348 ok for the `main' function in hosted implementations. */
349 return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl));
352 /* We want to inline `extern inline' functions even if this would
353 violate inlining limits. Some glibc and linux constructs depend on
354 such functions always being inlined when optimizing. */
357 c_disregard_inline_limits (fn)
360 return DECL_DECLARED_INLINE_P (fn) && DECL_EXTERNAL (fn);
363 static tree inline_forbidden_p PARAMS ((tree *, int *, void *));
366 inline_forbidden_p (nodep, walk_subtrees, fn)
368 int *walk_subtrees ATTRIBUTE_UNUSED;
374 switch (TREE_CODE (node))
377 t = get_callee_fndecl (node);
382 /* We cannot inline functions that call setjmp. */
383 if (setjmp_call_p (t))
386 switch (DECL_FUNCTION_CODE (t))
388 /* We cannot inline functions that take a variable number of
390 case BUILT_IN_VARARGS_START:
391 case BUILT_IN_STDARG_START:
393 /* Functions that need information about the address of the
394 caller can't (shouldn't?) be inlined. */
395 case BUILT_IN_RETURN_ADDRESS:
406 /* We cannot inline functions that contain other functions. */
407 if (TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
408 && DECL_INITIAL (TREE_OPERAND (node, 0)))
414 t = TREE_OPERAND (node, 0);
416 /* We will not inline a function which uses computed goto. The
417 addresses of its local labels, which may be tucked into
418 global storage, are of course not constant across
419 instantiations, which causes unexpected behaviour. */
420 if (TREE_CODE (t) != LABEL_DECL)
423 /* We cannot inline a nested function that jumps to a nonlocal
425 if (TREE_CODE (t) == LABEL_DECL
426 && DECL_CONTEXT (t) && DECL_CONTEXT (t) != fn)
439 c_cannot_inline_tree_fn (fnp)
445 if (! function_attribute_inlinable_p (fn))
447 DECL_UNINLINABLE (fn) = 1;
451 /* If a function has pending sizes, we must not defer its
452 compilation, and we can't inline it as a tree. */
453 if (fn == current_function_decl)
455 t = get_pending_sizes ();
456 put_pending_sizes (t);
460 DECL_UNINLINABLE (fn) = 1;
465 if (DECL_CONTEXT (fn))
467 /* If a nested function has pending sizes, we may have already
469 if (DECL_LANG_SPECIFIC (fn)->pending_sizes)
471 DECL_UNINLINABLE (fn) = 1;
477 /* We rely on the fact that this function is called upfront,
478 just before we start expanding a function. If FN is active
479 (i.e., it's the current_function_decl or a parent thereof),
480 we have to walk FN's saved tree. Otherwise, we can safely
481 assume we have done it before and, if we didn't mark it as
482 uninlinable (in which case we wouldn't have been called), it
483 is inlinable. Unfortunately, this strategy doesn't work for
484 nested functions, because they're only expanded as part of
485 their enclosing functions, so the inlinability test comes in
487 t = current_function_decl;
490 t = DECL_CONTEXT (t);
495 if (walk_tree (&DECL_SAVED_TREE (fn), inline_forbidden_p, fn, NULL))
497 DECL_UNINLINABLE (fn) = 1;