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_NAME
53 #define LANG_HOOKS_NAME "GNU C"
54 #undef LANG_HOOKS_INIT
55 #define LANG_HOOKS_INIT c_init
56 #undef LANG_HOOKS_INIT_OPTIONS
57 #define LANG_HOOKS_INIT_OPTIONS c_init_options
58 #undef LANG_HOOKS_DECODE_OPTION
59 #define LANG_HOOKS_DECODE_OPTION c_decode_option
60 #undef LANG_HOOKS_POST_OPTIONS
61 #define LANG_HOOKS_POST_OPTIONS c_post_options
62 #undef LANG_HOOKS_GET_ALIAS_SET
63 #define LANG_HOOKS_GET_ALIAS_SET c_common_get_alias_set
65 #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN
66 #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \
67 c_cannot_inline_tree_fn
68 #undef LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS
69 #define LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS \
70 c_disregard_inline_limits
71 #undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
72 #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
75 /* Each front end provides its own. */
76 const struct lang_hooks lang_hooks
= LANG_HOOKS_INITIALIZER
;
78 /* Post-switch processing. */
82 cpp_post_options (parse_in
);
84 /* Use tree inlining if possible. Function instrumentation is only
85 done in the RTL level, so we disable tree inlining. */
86 if (! flag_instrument_function_entry_exit
)
90 flag_inline_trees
= 1;
93 if (flag_inline_functions
)
95 flag_inline_trees
= 2;
96 flag_inline_functions
= 0;
104 parse_in
= cpp_create_reader (ident_hash
, CLK_GNUC89
);
106 /* Mark as "unspecified". */
107 flag_bounds_check
= -1;
113 c_common_lang_init ();
115 /* If still unspecified, make it match -std=c99
116 (allowing for -pedantic-errors). */
117 if (mesg_implicit_function_declaration
< 0)
120 mesg_implicit_function_declaration
= flag_pedantic_errors
? 2 : 1;
122 mesg_implicit_function_declaration
= 0;
125 save_lang_status
= &push_c_function_context
;
126 restore_lang_status
= &pop_c_function_context
;
127 mark_lang_status
= &mark_c_function_context
;
128 lang_expand_expr
= &c_expand_expr
;
129 lang_safe_from_p
= &c_safe_from_p
;
130 diagnostic_format_decoder (global_dc
) = &c_tree_printer
;
131 lang_expand_decl_stmt
= &c_expand_decl_stmt
;
132 lang_missing_noreturn_ok_p
= &c_missing_noreturn_ok_p
;
138 print_lang_statistics ()
142 /* used by print-tree.c */
145 lang_print_xnode (file
, node
, indent
)
146 FILE *file ATTRIBUTE_UNUSED
;
147 tree node ATTRIBUTE_UNUSED
;
148 int indent ATTRIBUTE_UNUSED
;
152 /* Used by c-lex.c, but only for objc. */
155 lookup_interface (arg
)
156 tree arg ATTRIBUTE_UNUSED
;
163 tree arg ATTRIBUTE_UNUSED
;
169 maybe_objc_check_decl (decl
)
170 tree decl ATTRIBUTE_UNUSED
;
175 maybe_objc_comptypes (lhs
, rhs
, reflexive
)
176 tree lhs ATTRIBUTE_UNUSED
;
177 tree rhs ATTRIBUTE_UNUSED
;
178 int reflexive ATTRIBUTE_UNUSED
;
184 maybe_building_objc_message_expr ()
190 recognize_objc_keyword ()
195 /* Used by c-typeck.c (build_external_ref), but only for objc. */
198 lookup_objc_ivar (id
)
199 tree id ATTRIBUTE_UNUSED
;
204 #if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR)
205 extern tree static_ctors
;
206 extern tree static_dtors
;
208 static tree start_cdtor
PARAMS ((int));
209 static void finish_cdtor
PARAMS ((tree
));
212 start_cdtor (method_type
)
215 tree fnname
= get_file_function_name (method_type
);
216 tree void_list_node_1
= build_tree_list (NULL_TREE
, void_type_node
);
219 start_function (void_list_node_1
,
220 build_nt (CALL_EXPR
, fnname
,
221 tree_cons (NULL_TREE
, NULL_TREE
, void_list_node_1
),
226 current_function_cannot_inline
227 = "static constructors and destructors cannot be inlined";
229 body
= c_begin_compound_stmt ();
233 add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
245 scope
= add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
246 block
= poplevel (0, 0, 0);
247 SCOPE_STMT_BLOCK (TREE_PURPOSE (scope
)) = block
;
248 SCOPE_STMT_BLOCK (TREE_VALUE (scope
)) = block
;
250 RECHAIN_STMTS (body
, COMPOUND_BODY (body
));
256 /* Called at end of parsing, but before end-of-file processing. */
261 #ifndef ASM_OUTPUT_CONSTRUCTOR
264 tree body
= start_cdtor ('I');
266 for (; static_ctors
; static_ctors
= TREE_CHAIN (static_ctors
))
267 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors
),
273 #ifndef ASM_OUTPUT_DESTRUCTOR
276 tree body
= start_cdtor ('D');
278 for (; static_dtors
; static_dtors
= TREE_CHAIN (static_dtors
))
279 c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors
),
287 (*back_end_hook
) (getdecls ());
291 FILE *stream
= dump_begin (TDI_all
, &flags
);
295 dump_node (getdecls (), flags
& ~TDF_SLIM
, stream
);
296 dump_end (TDI_all
, stream
);
301 /* Called during diagnostic message formatting process to print a
302 source-level entity onto BUFFER. The meaning of the format specifiers
305 %F: a function declaration,
308 These format specifiers form a subset of the format specifiers set used
309 by the C++ front-end.
310 Please notice when called, the `%' part was already skipped by the
311 diagnostic machinery. */
313 c_tree_printer (buffer
)
314 output_buffer
*buffer
;
316 tree t
= va_arg (output_buffer_format_args (buffer
), tree
);
318 switch (*output_buffer_text_cursor (buffer
))
324 const char *n
= DECL_NAME (t
)
325 ? (*decl_printable_name
) (t
, 2)
327 output_add_string (buffer
, n
);
337 c_missing_noreturn_ok_p (decl
)
340 /* A missing noreturn is not ok for freestanding implementations and
341 ok for the `main' function in hosted implementations. */
342 return flag_hosted
&& MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl
));
345 /* We want to inline `extern inline' functions even if this would
346 violate inlining limits. Some glibc and linux constructs depend on
347 such functions always being inlined when optimizing. */
350 c_disregard_inline_limits (fn
)
353 return DECL_DECLARED_INLINE_P (fn
) && DECL_EXTERNAL (fn
);
356 static tree inline_forbidden_p
PARAMS ((tree
*, int *, void *));
359 inline_forbidden_p (nodep
, walk_subtrees
, fn
)
361 int *walk_subtrees ATTRIBUTE_UNUSED
;
367 switch (TREE_CODE (node
))
370 t
= get_callee_fndecl (node
);
375 /* We cannot inline functions that call setjmp. */
376 if (setjmp_call_p (t
))
379 switch (DECL_FUNCTION_CODE (t
))
381 /* We cannot inline functions that take a variable number of
383 case BUILT_IN_VARARGS_START
:
384 case BUILT_IN_STDARG_START
:
386 /* Functions that need information about the address of the
387 caller can't (shouldn't?) be inlined. */
388 case BUILT_IN_RETURN_ADDRESS
:
399 /* We cannot inline functions that contain other functions. */
400 if (TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
401 && DECL_INITIAL (TREE_OPERAND (node
, 0)))
407 t
= TREE_OPERAND (node
, 0);
409 /* We will not inline a function which uses computed goto. The
410 addresses of its local labels, which may be tucked into
411 global storage, are of course not constant across
412 instantiations, which causes unexpected behaviour. */
413 if (TREE_CODE (t
) != LABEL_DECL
)
416 /* We cannot inline a nested function that jumps to a nonlocal
418 if (TREE_CODE (t
) == LABEL_DECL
419 && DECL_CONTEXT (t
) && DECL_CONTEXT (t
) != fn
)
432 c_cannot_inline_tree_fn (fnp
)
438 if (! function_attribute_inlinable_p (fn
))
440 DECL_UNINLINABLE (fn
) = 1;
444 /* If a function has pending sizes, we must not defer its
445 compilation, and we can't inline it as a tree. */
446 if (fn
== current_function_decl
)
448 t
= get_pending_sizes ();
449 put_pending_sizes (t
);
453 DECL_UNINLINABLE (fn
) = 1;
458 if (DECL_CONTEXT (fn
))
460 /* If a nested function has pending sizes, we may have already
462 if (DECL_LANG_SPECIFIC (fn
)->pending_sizes
)
464 DECL_UNINLINABLE (fn
) = 1;
470 /* We rely on the fact that this function is called upfront,
471 just before we start expanding a function. If FN is active
472 (i.e., it's the current_function_decl or a parent thereof),
473 we have to walk FN's saved tree. Otherwise, we can safely
474 assume we have done it before and, if we didn't mark it as
475 uninlinable (in which case we wouldn't have been called), it
476 is inlinable. Unfortunately, this strategy doesn't work for
477 nested functions, because they're only expanded as part of
478 their enclosing functions, so the inlinability test comes in
480 t
= current_function_decl
;
483 t
= DECL_CONTEXT (t
);
488 if (walk_tree (&DECL_SAVED_TREE (fn
), inline_forbidden_p
, fn
, NULL
))
490 DECL_UNINLINABLE (fn
) = 1;