1 /* Default language-specific hooks.
2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Alexandre Oliva <aoliva@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
25 #include "coretypes.h"
30 #include "tree-inline.h"
31 #include "tree-gimple.h"
33 #include "insn-config.h"
34 #include "integrate.h"
36 #include "langhooks.h"
37 #include "langhooks-def.h"
39 #include "diagnostic.h"
41 /* Do nothing; in many cases the default hook. */
48 /* Do nothing (tree). */
51 lhd_do_nothing_t (tree
ARG_UNUSED (t
))
55 /* Do nothing (int). */
58 lhd_do_nothing_i (int ARG_UNUSED (i
))
62 /* Do nothing (int, int, int). Return NULL_TREE. */
65 lhd_do_nothing_iii_return_null_tree (int ARG_UNUSED (i
),
72 /* Do nothing (function). */
75 lhd_do_nothing_f (struct function
* ARG_UNUSED (f
))
79 /* Do nothing (return the tree node passed). */
82 lhd_return_tree (tree t
)
87 /* Do nothing (return NULL_TREE). */
90 lhd_return_null_tree_v (void)
95 /* Do nothing (return NULL_TREE). */
98 lhd_return_null_tree (tree
ARG_UNUSED (t
))
103 /* The default post options hook. */
106 lhd_post_options (const char ** ARG_UNUSED (pfilename
))
111 /* Called from by print-tree.c. */
114 lhd_print_tree_nothing (FILE * ARG_UNUSED (file
),
115 tree
ARG_UNUSED (node
),
116 int ARG_UNUSED (indent
))
120 /* Called from safe_from_p. */
123 lhd_safe_from_p (rtx
ARG_UNUSED (x
), tree
ARG_UNUSED (exp
))
128 /* Called from staticp. */
131 lhd_staticp (tree
ARG_UNUSED (exp
))
136 /* Called from check_global_declarations. */
139 lhd_warn_unused_global_decl (tree decl
)
141 /* This is what used to exist in check_global_declarations. Probably
142 not many of these actually apply to non-C languages. */
144 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_INLINE (decl
))
146 if (TREE_CODE (decl
) == VAR_DECL
&& TREE_READONLY (decl
))
148 if (DECL_IN_SYSTEM_HEADER (decl
))
154 /* Set the DECL_ASSEMBLER_NAME for DECL. */
156 lhd_set_decl_assembler_name (tree decl
)
158 /* The language-independent code should never use the
159 DECL_ASSEMBLER_NAME for lots of DECLs. Only FUNCTION_DECLs and
160 VAR_DECLs for variables with static storage duration need a real
161 DECL_ASSEMBLER_NAME. */
162 gcc_assert (TREE_CODE (decl
) == FUNCTION_DECL
163 || (TREE_CODE (decl
) == VAR_DECL
164 && (TREE_STATIC (decl
)
165 || DECL_EXTERNAL (decl
)
166 || TREE_PUBLIC (decl
))));
168 /* By default, assume the name to use in assembly code is the same
169 as that used in the source language. (That's correct for C, and
170 GCC used to set DECL_ASSEMBLER_NAME to the same value as
171 DECL_NAME in build_decl, so this choice provides backwards
172 compatibility with existing front-ends.
174 Can't use just the variable's own name for a variable whose scope
175 is less than the whole compilation. Concatenate a distinguishing
176 number - we use the DECL_UID. */
177 if (TREE_PUBLIC (decl
) || DECL_CONTEXT (decl
) == NULL_TREE
)
178 SET_DECL_ASSEMBLER_NAME (decl
, DECL_NAME (decl
));
181 const char *name
= IDENTIFIER_POINTER (DECL_NAME (decl
));
184 ASM_FORMAT_PRIVATE_NAME (label
, name
, DECL_UID (decl
));
185 SET_DECL_ASSEMBLER_NAME (decl
, get_identifier (label
));
189 /* Type promotion for variable arguments. */
191 lhd_type_promotes_to (tree
ARG_UNUSED (type
))
196 /* Registration of machine- or os-specific builtin types. */
198 lhd_register_builtin_type (tree
ARG_UNUSED (type
),
199 const char * ARG_UNUSED (name
))
203 /* Invalid use of an incomplete type. */
205 lhd_incomplete_type_error (tree
ARG_UNUSED (value
), tree type
)
207 gcc_assert (TREE_CODE (type
) == ERROR_MARK
);
211 /* Provide a default routine for alias sets that always returns -1. This
212 is used by languages that don't need to do anything special. */
215 lhd_get_alias_set (tree
ARG_UNUSED (t
))
220 /* Provide a hook routine for alias sets that always returns 0. This is
221 used by languages that haven't deal with alias sets yet. */
224 hook_get_alias_set_0 (tree
ARG_UNUSED (t
))
229 /* This is the default expand_expr function. */
232 lhd_expand_expr (tree
ARG_UNUSED (t
), rtx
ARG_UNUSED (r
),
233 enum machine_mode
ARG_UNUSED (mm
),
235 rtx
* ARG_UNUSED (a
))
240 /* The default language-specific function for expanding a decl. After
241 the language-independent cases are handled, this function will be
242 called. If this function is not defined, it is assumed that
243 declarations other than those for variables and labels do not require
244 any RTL generation. */
247 lhd_expand_decl (tree
ARG_UNUSED (t
))
252 /* This is the default decl_printable_name function. */
255 lhd_decl_printable_name (tree decl
, int ARG_UNUSED (verbosity
))
257 gcc_assert (decl
&& DECL_NAME (decl
));
258 return IDENTIFIER_POINTER (DECL_NAME (decl
));
261 /* This is the default dwarf_name function. */
264 lhd_dwarf_name (tree t
, int verbosity
)
266 gcc_assert (DECL_P (t
));
268 return lang_hooks
.decl_printable_name (t
, verbosity
);
271 /* This compares two types for equivalence ("compatible" in C-based languages).
272 This routine should only return 1 if it is sure. It should not be used
273 in contexts where erroneously returning 0 causes problems. */
276 lhd_types_compatible_p (tree x
, tree y
)
278 return TYPE_MAIN_VARIANT (x
) == TYPE_MAIN_VARIANT (y
);
281 /* lang_hooks.tree_inlining.walk_subtrees is called by walk_tree()
282 after handling common cases, but before walking code-specific
283 sub-trees. If this hook is overridden for a language, it should
284 handle language-specific tree codes, as well as language-specific
285 information associated to common tree codes. If a tree node is
286 completely handled within this function, it should set *SUBTREES to
287 0, so that generic handling isn't attempted. The generic handling
288 cannot deal with language-specific tree codes, so make sure it is
289 set properly. Both SUBTREES and *SUBTREES is guaranteed to be
290 nonzero when the function is called. */
293 lhd_tree_inlining_walk_subtrees (tree
*tp ATTRIBUTE_UNUSED
,
294 int *subtrees ATTRIBUTE_UNUSED
,
295 walk_tree_fn func ATTRIBUTE_UNUSED
,
296 void *data ATTRIBUTE_UNUSED
,
297 struct pointer_set_t
*pset ATTRIBUTE_UNUSED
)
302 /* lang_hooks.tree_inlining.cannot_inline_tree_fn is called to
303 determine whether there are language-specific reasons for not
304 inlining a given function. */
307 lhd_tree_inlining_cannot_inline_tree_fn (tree
*fnp
)
309 if (flag_really_no_inline
310 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (*fnp
)) == NULL
)
316 /* lang_hooks.tree_inlining.disregard_inline_limits is called to
317 determine whether a function should be considered for inlining even
318 if it would exceed inlining limits. */
321 lhd_tree_inlining_disregard_inline_limits (tree fn
)
323 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) != NULL
)
329 /* lang_hooks.tree_inlining.add_pending_fn_decls is called before
330 starting to inline a function, to push any language-specific
331 functions that should not be inlined into the current function,
332 into VAFNP. PFN is the top of varray, and should be returned if no
333 functions are pushed into VAFNP. The top of the varray should be
337 lhd_tree_inlining_add_pending_fn_decls (void *vafnp ATTRIBUTE_UNUSED
, tree pfn
)
342 /* lang_hooks.tree_inlining.auto_var_in_fn_p is called to determine
343 whether VT is an automatic variable defined in function FT. */
346 lhd_tree_inlining_auto_var_in_fn_p (tree var
, tree fn
)
348 return (DECL_P (var
) && DECL_CONTEXT (var
) == fn
349 && (((TREE_CODE (var
) == VAR_DECL
|| TREE_CODE (var
) == PARM_DECL
)
350 && ! TREE_STATIC (var
))
351 || TREE_CODE (var
) == LABEL_DECL
352 || TREE_CODE (var
) == RESULT_DECL
));
355 /* lang_hooks.tree_inlining.anon_aggr_type_p determines whether T is a
356 type node representing an anonymous aggregate (union, struct, etc),
357 i.e., one whose members are in the same scope as the union itself. */
360 lhd_tree_inlining_anon_aggr_type_p (tree t ATTRIBUTE_UNUSED
)
365 /* lang_hooks.tree_inlining.start_inlining and end_inlining perform any
366 language-specific bookkeeping necessary for processing
367 FN. start_inlining returns nonzero if inlining should proceed, zero if
370 For instance, the C++ version keeps track of template instantiations to
371 avoid infinite recursion. */
374 lhd_tree_inlining_start_inlining (tree fn ATTRIBUTE_UNUSED
)
380 lhd_tree_inlining_end_inlining (tree fn ATTRIBUTE_UNUSED
)
384 /* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
385 language-specific conversion before assigning VALUE to PARM. */
388 lhd_tree_inlining_convert_parm_for_inlining (tree parm ATTRIBUTE_UNUSED
,
390 tree fndecl ATTRIBUTE_UNUSED
,
391 int argnum ATTRIBUTE_UNUSED
)
396 /* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree
397 nodes. Returns nonzero if it does not want the usual dumping of the
401 lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED
, tree t ATTRIBUTE_UNUSED
)
406 /* lang_hooks.tree_dump.type_qual: Determine type qualifiers in a
407 language-specific way. */
410 lhd_tree_dump_type_quals (tree t
)
412 return TYPE_QUALS (t
);
415 /* lang_hooks.expr_size: Determine the size of the value of an expression T
416 in a language-specific way. Returns a tree for the size in bytes. */
419 lhd_expr_size (tree exp
)
422 && DECL_SIZE_UNIT (exp
) != 0)
423 return DECL_SIZE_UNIT (exp
);
425 return size_in_bytes (TREE_TYPE (exp
));
428 /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form. */
431 lhd_gimplify_expr (tree
*expr_p ATTRIBUTE_UNUSED
, tree
*pre_p ATTRIBUTE_UNUSED
,
432 tree
*post_p ATTRIBUTE_UNUSED
)
437 /* lang_hooks.tree_size: Determine the size of a tree with code C,
438 which is a language-specific tree code in category tcc_constant or
439 tcc_exceptional. The default expects never to be called. */
441 lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED
)
446 /* Return true if decl, which is a function decl, may be called by a
450 lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED
)
455 /* Return the COMDAT group into which DECL should be placed. */
458 lhd_comdat_group (tree decl
)
460 return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
463 /* lang_hooks.decls.final_write_globals: perform final processing on
466 write_global_declarations (void)
468 /* Really define vars that have had only a tentative definition.
469 Really output inline functions that must actually be callable
470 and have not been output so far. */
472 tree globals
= lang_hooks
.decls
.getdecls ();
473 int len
= list_length (globals
);
474 tree
*vec
= XNEWVEC (tree
, len
);
478 /* Process the decls in reverse order--earliest first.
479 Put them into VEC from back to front, then take out from front. */
481 for (i
= 0, decl
= globals
; i
< len
; i
++, decl
= TREE_CHAIN (decl
))
482 vec
[len
- i
- 1] = decl
;
484 wrapup_global_declarations (vec
, len
);
485 check_global_declarations (vec
, len
);
486 emit_debug_global_declarations (vec
, len
);
492 /* Called to perform language-specific initialization of CTX. */
494 lhd_initialize_diagnostics (struct diagnostic_context
*ctx ATTRIBUTE_UNUSED
)
498 /* The default function to print out name of current function that caused
501 lhd_print_error_function (diagnostic_context
*context
, const char *file
)
503 if (diagnostic_last_function_changed (context
))
505 const char *old_prefix
= context
->printer
->prefix
;
506 char *new_prefix
= file
? file_name_as_prefix (file
) : NULL
;
508 pp_set_prefix (context
->printer
, new_prefix
);
510 if (current_function_decl
== NULL
)
511 pp_printf (context
->printer
, _("At top level:"));
514 if (TREE_CODE (TREE_TYPE (current_function_decl
)) == METHOD_TYPE
)
516 (context
->printer
, _("In member function %qs:"),
517 lang_hooks
.decl_printable_name (current_function_decl
, 2));
520 (context
->printer
, _("In function %qs:"),
521 lang_hooks
.decl_printable_name (current_function_decl
, 2));
524 diagnostic_set_last_function (context
);
525 pp_flush (context
->printer
);
526 context
->printer
->prefix
= old_prefix
;
527 free ((char*) new_prefix
);
532 lhd_callgraph_analyze_expr (tree
*tp ATTRIBUTE_UNUSED
,
533 int *walk_subtrees ATTRIBUTE_UNUSED
,
534 tree decl ATTRIBUTE_UNUSED
)
540 lhd_make_node (enum tree_code code
)
542 return make_node (code
);
546 lhd_to_target_charset (HOST_WIDE_INT c
)
552 lhd_expr_to_decl (tree expr
, bool *tc ATTRIBUTE_UNUSED
,
553 bool *ti ATTRIBUTE_UNUSED
, bool *se ATTRIBUTE_UNUSED
)
558 /* Return sharing kind if OpenMP sharing attribute of DECL is
559 predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise. */
561 enum omp_clause_default_kind
562 lhd_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED
)
564 if (DECL_ARTIFICIAL (decl
))
565 return OMP_CLAUSE_DEFAULT_SHARED
;
566 return OMP_CLAUSE_DEFAULT_UNSPECIFIED
;
569 /* Generate code to copy SRC to DST. */
572 lhd_omp_assignment (tree clause ATTRIBUTE_UNUSED
, tree dst
, tree src
)
574 return build_gimple_modify_stmt (dst
, src
);
577 /* Register language specific type size variables as potentially OpenMP
578 firstprivate variables. */
581 lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx
*c ATTRIBUTE_UNUSED
,
582 tree t ATTRIBUTE_UNUSED
)
587 add_builtin_function (const char *name
,
590 enum built_in_class cl
,
591 const char *library_name
,
594 tree id
= get_identifier (name
);
595 tree decl
= build_decl (FUNCTION_DECL
, id
, type
);
597 TREE_PUBLIC (decl
) = 1;
598 DECL_EXTERNAL (decl
) = 1;
599 DECL_BUILT_IN_CLASS (decl
) = cl
;
600 DECL_FUNCTION_CODE (decl
) = function_code
;
604 tree libname
= get_identifier (library_name
);
605 SET_DECL_ASSEMBLER_NAME (decl
, libname
);
608 /* Possibly apply some default attributes to this built-in function. */
610 decl_attributes (&decl
, attrs
, ATTR_FLAG_BUILT_IN
);
612 decl_attributes (&decl
, NULL_TREE
, 0);
614 return lang_hooks
.builtin_function (decl
);
619 lhd_builtin_function (tree decl
)
621 lang_hooks
.decls
.pushdecl (decl
);