OSDN Git Service

2007-02-13 Seongbae Park <seongbae.park@gmail.com>
[pf3gnuchains/gcc-fork.git] / gcc / langhooks.c
1 /* Default language-specific hooks.
2    Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3    Contributed by Alexandre Oliva  <aoliva@redhat.com>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
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
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "intl.h"
26 #include "tm.h"
27 #include "toplev.h"
28 #include "tree.h"
29 #include "tree-inline.h"
30 #include "tree-gimple.h"
31 #include "rtl.h"
32 #include "insn-config.h"
33 #include "integrate.h"
34 #include "flags.h"
35 #include "langhooks.h"
36 #include "langhooks-def.h"
37 #include "ggc.h"
38 #include "diagnostic.h"
39
40 /* Do nothing; in many cases the default hook.  */
41
42 void
43 lhd_do_nothing (void)
44 {
45 }
46
47 /* Do nothing (tree).  */
48
49 void
50 lhd_do_nothing_t (tree ARG_UNUSED (t))
51 {
52 }
53
54 /* Do nothing (int).  */
55
56 void
57 lhd_do_nothing_i (int ARG_UNUSED (i))
58 {
59 }
60
61 /* Do nothing (int, int, int).  Return NULL_TREE.  */
62
63 tree
64 lhd_do_nothing_iii_return_null_tree (int ARG_UNUSED (i),
65                                      int ARG_UNUSED (j),
66                                      int ARG_UNUSED (k))
67 {
68   return NULL_TREE;
69 }
70
71 /* Do nothing (function).  */
72
73 void
74 lhd_do_nothing_f (struct function * ARG_UNUSED (f))
75 {
76 }
77
78 /* Do nothing (return the tree node passed).  */
79
80 tree
81 lhd_return_tree (tree t)
82 {
83   return t;
84 }
85
86 /* Do nothing (return NULL_TREE).  */
87
88 tree
89 lhd_return_null_tree_v (void)
90 {
91   return NULL_TREE;
92 }
93
94 /* Do nothing (return NULL_TREE).  */
95
96 tree
97 lhd_return_null_tree (tree ARG_UNUSED (t))
98 {
99   return NULL_TREE;
100 }
101
102 /* The default post options hook.  */
103
104 bool
105 lhd_post_options (const char ** ARG_UNUSED (pfilename))
106 {
107   return false;
108 }
109
110 /* Called from by print-tree.c.  */
111
112 void
113 lhd_print_tree_nothing (FILE * ARG_UNUSED (file),
114                         tree ARG_UNUSED (node),
115                         int ARG_UNUSED (indent))
116 {
117 }
118
119 /* Called from safe_from_p.  */
120
121 int
122 lhd_safe_from_p (rtx ARG_UNUSED (x), tree ARG_UNUSED (exp))
123 {
124   return 1;
125 }
126
127 /* Called from staticp.  */
128
129 tree
130 lhd_staticp (tree ARG_UNUSED (exp))
131 {
132   return NULL;
133 }
134
135 /* Called from check_global_declarations.  */
136
137 bool
138 lhd_warn_unused_global_decl (tree decl)
139 {
140   /* This is what used to exist in check_global_declarations.  Probably
141      not many of these actually apply to non-C languages.  */
142
143   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))
144     return false;
145   if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl))
146     return false;
147   if (DECL_IN_SYSTEM_HEADER (decl))
148     return false;
149
150   return true;
151 }
152
153 /* Set the DECL_ASSEMBLER_NAME for DECL.  */
154 void
155 lhd_set_decl_assembler_name (tree decl)
156 {
157   /* The language-independent code should never use the
158      DECL_ASSEMBLER_NAME for lots of DECLs.  Only FUNCTION_DECLs and
159      VAR_DECLs for variables with static storage duration need a real
160      DECL_ASSEMBLER_NAME.  */
161   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
162               || (TREE_CODE (decl) == VAR_DECL
163                   && (TREE_STATIC (decl)
164                       || DECL_EXTERNAL (decl)
165                       || TREE_PUBLIC (decl))));
166   
167   /* By default, assume the name to use in assembly code is the same
168      as that used in the source language.  (That's correct for C, and
169      GCC used to set DECL_ASSEMBLER_NAME to the same value as
170      DECL_NAME in build_decl, so this choice provides backwards
171      compatibility with existing front-ends.
172       
173      Can't use just the variable's own name for a variable whose scope
174      is less than the whole compilation.  Concatenate a distinguishing
175      number - we use the DECL_UID.  */
176   if (TREE_PUBLIC (decl) || DECL_CONTEXT (decl) == NULL_TREE)
177     SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
178   else
179     {
180       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
181       char *label;
182       
183       ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
184       SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
185     }
186 }
187
188 /* Type promotion for variable arguments.  */
189 tree
190 lhd_type_promotes_to (tree ARG_UNUSED (type))
191 {
192   gcc_unreachable ();
193 }
194
195 /* Registration of machine- or os-specific builtin types.  */
196 void
197 lhd_register_builtin_type (tree ARG_UNUSED (type),
198                            const char * ARG_UNUSED (name))
199 {
200 }
201
202 /* Invalid use of an incomplete type.  */
203 void
204 lhd_incomplete_type_error (tree ARG_UNUSED (value), tree type)
205 {
206   gcc_assert (TREE_CODE (type) == ERROR_MARK);
207   return;
208 }
209
210 /* Provide a default routine for alias sets that always returns -1.  This
211    is used by languages that don't need to do anything special.  */
212
213 HOST_WIDE_INT
214 lhd_get_alias_set (tree ARG_UNUSED (t))
215 {
216   return -1;
217 }
218
219 /* Provide a hook routine for alias sets that always returns 0.  This is
220    used by languages that haven't deal with alias sets yet.  */
221
222 HOST_WIDE_INT
223 hook_get_alias_set_0 (tree ARG_UNUSED (t))
224 {
225   return 0;
226 }
227
228 /* This is the default expand_expr function.  */
229
230 rtx
231 lhd_expand_expr (tree ARG_UNUSED (t), rtx ARG_UNUSED (r),
232                  enum machine_mode ARG_UNUSED (mm),
233                  int ARG_UNUSED (em),
234                  rtx * ARG_UNUSED (a))
235 {
236   gcc_unreachable ();
237 }
238
239 /* The default language-specific function for expanding a decl.  After
240    the language-independent cases are handled, this function will be
241    called.  If this function is not defined, it is assumed that
242    declarations other than those for variables and labels do not require
243    any RTL generation.  */
244
245 int
246 lhd_expand_decl (tree ARG_UNUSED (t))
247 {
248   return 0;
249 }
250
251 /* This is the default decl_printable_name function.  */
252
253 const char *
254 lhd_decl_printable_name (tree decl, int ARG_UNUSED (verbosity))
255 {
256   gcc_assert (decl && DECL_NAME (decl));
257   return IDENTIFIER_POINTER (DECL_NAME (decl));
258 }
259
260 /* This is the default dwarf_name function.  */
261
262 const char *
263 lhd_dwarf_name (tree t, int verbosity)
264 {
265   gcc_assert (DECL_P (t));
266
267   return lang_hooks.decl_printable_name (t, verbosity);
268 }
269
270 /* This compares two types for equivalence ("compatible" in C-based languages).
271    This routine should only return 1 if it is sure.  It should not be used
272    in contexts where erroneously returning 0 causes problems.  */
273
274 int
275 lhd_types_compatible_p (tree x, tree y)
276 {
277   return TYPE_MAIN_VARIANT (x) == TYPE_MAIN_VARIANT (y);
278 }
279
280 /* lang_hooks.tree_inlining.walk_subtrees is called by walk_tree()
281    after handling common cases, but before walking code-specific
282    sub-trees.  If this hook is overridden for a language, it should
283    handle language-specific tree codes, as well as language-specific
284    information associated to common tree codes.  If a tree node is
285    completely handled within this function, it should set *SUBTREES to
286    0, so that generic handling isn't attempted.  The generic handling
287    cannot deal with language-specific tree codes, so make sure it is
288    set properly.  Both SUBTREES and *SUBTREES is guaranteed to be
289    nonzero when the function is called.  */
290
291 tree
292 lhd_tree_inlining_walk_subtrees (tree *tp ATTRIBUTE_UNUSED,
293                                  int *subtrees ATTRIBUTE_UNUSED,
294                                  walk_tree_fn func ATTRIBUTE_UNUSED,
295                                  void *data ATTRIBUTE_UNUSED,
296                                  struct pointer_set_t *pset ATTRIBUTE_UNUSED)
297 {
298   return NULL_TREE;
299 }
300
301 /* lang_hooks.tree_inlining.cannot_inline_tree_fn is called to
302    determine whether there are language-specific reasons for not
303    inlining a given function.  */
304
305 int
306 lhd_tree_inlining_cannot_inline_tree_fn (tree *fnp)
307 {
308   if (flag_really_no_inline
309       && lookup_attribute ("always_inline", DECL_ATTRIBUTES (*fnp)) == NULL)
310     return 1;
311
312   return 0;
313 }
314
315 /* lang_hooks.tree_inlining.disregard_inline_limits is called to
316    determine whether a function should be considered for inlining even
317    if it would exceed inlining limits.  */
318
319 int
320 lhd_tree_inlining_disregard_inline_limits (tree fn)
321 {
322   if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL)
323     return 1;
324
325   return 0;
326 }
327
328 /* lang_hooks.tree_inlining.add_pending_fn_decls is called before
329    starting to inline a function, to push any language-specific
330    functions that should not be inlined into the current function,
331    into VAFNP.  PFN is the top of varray, and should be returned if no
332    functions are pushed into VAFNP.  The top of the varray should be
333    returned.  */
334
335 tree
336 lhd_tree_inlining_add_pending_fn_decls (void *vafnp ATTRIBUTE_UNUSED, tree pfn)
337 {
338   return pfn;
339 }
340
341 /* lang_hooks.tree_inlining.auto_var_in_fn_p is called to determine
342    whether VT is an automatic variable defined in function FT.  */
343
344 int
345 lhd_tree_inlining_auto_var_in_fn_p (tree var, tree fn)
346 {
347   return (DECL_P (var) && DECL_CONTEXT (var) == fn
348           && (((TREE_CODE (var) == VAR_DECL || TREE_CODE (var) == PARM_DECL)
349                && ! TREE_STATIC (var))
350               || TREE_CODE (var) == LABEL_DECL
351               || TREE_CODE (var) == RESULT_DECL));
352 }
353
354 /* lang_hooks.tree_inlining.anon_aggr_type_p determines whether T is a
355    type node representing an anonymous aggregate (union, struct, etc),
356    i.e., one whose members are in the same scope as the union itself.  */
357
358 int
359 lhd_tree_inlining_anon_aggr_type_p (tree t ATTRIBUTE_UNUSED)
360 {
361   return 0;
362 }
363
364 /* lang_hooks.tree_inlining.start_inlining and end_inlining perform any
365    language-specific bookkeeping necessary for processing
366    FN. start_inlining returns nonzero if inlining should proceed, zero if
367    not.
368
369    For instance, the C++ version keeps track of template instantiations to
370    avoid infinite recursion.  */
371
372 int
373 lhd_tree_inlining_start_inlining (tree fn ATTRIBUTE_UNUSED)
374 {
375   return 1;
376 }
377
378 void
379 lhd_tree_inlining_end_inlining (tree fn ATTRIBUTE_UNUSED)
380 {
381 }
382
383 /* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
384    language-specific conversion before assigning VALUE to PARM.  */
385
386 tree
387 lhd_tree_inlining_convert_parm_for_inlining (tree parm ATTRIBUTE_UNUSED,
388                                              tree value,
389                                              tree fndecl ATTRIBUTE_UNUSED,
390                                              int argnum ATTRIBUTE_UNUSED)
391 {
392   return value;
393 }
394
395 /* lang_hooks.tree_dump.dump_tree:  Dump language-specific parts of tree
396    nodes.  Returns nonzero if it does not want the usual dumping of the
397    second argument.  */
398
399 bool
400 lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED, tree t ATTRIBUTE_UNUSED)
401 {
402   return false;
403 }
404
405 /* lang_hooks.tree_dump.type_qual:  Determine type qualifiers in a
406    language-specific way.  */
407
408 int
409 lhd_tree_dump_type_quals (tree t)
410 {
411   return TYPE_QUALS (t);
412 }
413
414 /* lang_hooks.expr_size: Determine the size of the value of an expression T
415    in a language-specific way.  Returns a tree for the size in bytes.  */
416
417 tree
418 lhd_expr_size (tree exp)
419 {
420   if (DECL_P (exp)
421       && DECL_SIZE_UNIT (exp) != 0)
422     return DECL_SIZE_UNIT (exp);
423   else
424     return size_in_bytes (TREE_TYPE (exp));
425 }
426
427 /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form.  */
428
429 int
430 lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED, tree *pre_p ATTRIBUTE_UNUSED,
431                    tree *post_p ATTRIBUTE_UNUSED)
432 {
433   return GS_UNHANDLED;
434 }
435
436 /* lang_hooks.tree_size: Determine the size of a tree with code C,
437    which is a language-specific tree code in category tcc_constant or
438    tcc_exceptional.  The default expects never to be called.  */
439 size_t
440 lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
441 {
442   gcc_unreachable ();
443 }
444
445 /* Return true if decl, which is a function decl, may be called by a
446    sibcall.  */
447
448 bool
449 lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
450 {
451   return true;
452 }
453
454 /* Return the COMDAT group into which DECL should be placed.  */
455
456 const char *
457 lhd_comdat_group (tree decl)
458 {
459   return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
460 }
461
462 /* lang_hooks.decls.final_write_globals: perform final processing on
463    global variables.  */
464 void
465 write_global_declarations (void)
466 {
467   /* Really define vars that have had only a tentative definition.
468      Really output inline functions that must actually be callable
469      and have not been output so far.  */
470
471   tree globals = lang_hooks.decls.getdecls ();
472   int len = list_length (globals);
473   tree *vec = XNEWVEC (tree, len);
474   int i;
475   tree decl;
476
477   /* Process the decls in reverse order--earliest first.
478      Put them into VEC from back to front, then take out from front.  */
479
480   for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
481     vec[len - i - 1] = decl;
482
483   wrapup_global_declarations (vec, len);
484   check_global_declarations (vec, len);
485   emit_debug_global_declarations (vec, len);
486
487   /* Clean up.  */
488   free (vec);
489 }
490
491 /* Called to perform language-specific initialization of CTX.  */
492 void
493 lhd_initialize_diagnostics (struct diagnostic_context *ctx ATTRIBUTE_UNUSED)
494 {
495 }
496
497 /* The default function to print out name of current function that caused
498    an error.  */
499 void
500 lhd_print_error_function (diagnostic_context *context, const char *file)
501 {
502   if (diagnostic_last_function_changed (context))
503     {
504       const char *old_prefix = context->printer->prefix;
505       char *new_prefix = file ? file_name_as_prefix (file) : NULL;
506
507       pp_set_prefix (context->printer, new_prefix);
508
509       if (current_function_decl == NULL)
510         pp_printf (context->printer, _("At top level:"));
511       else
512         {
513           if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
514             pp_printf
515               (context->printer, _("In member function %qs:"),
516                lang_hooks.decl_printable_name (current_function_decl, 2));
517           else
518             pp_printf
519               (context->printer, _("In function %qs:"),
520                lang_hooks.decl_printable_name (current_function_decl, 2));
521         }
522
523       diagnostic_set_last_function (context);
524       pp_flush (context->printer);
525       context->printer->prefix = old_prefix;
526       free ((char*) new_prefix);
527     }
528 }
529
530 tree
531 lhd_callgraph_analyze_expr (tree *tp ATTRIBUTE_UNUSED,
532                             int *walk_subtrees ATTRIBUTE_UNUSED,
533                             tree decl ATTRIBUTE_UNUSED)
534 {
535   return NULL;
536 }
537
538 tree
539 lhd_make_node (enum tree_code code)
540 {
541   return make_node (code);
542 }
543
544 HOST_WIDE_INT
545 lhd_to_target_charset (HOST_WIDE_INT c)
546 {
547   return c;
548 }
549
550 tree
551 lhd_expr_to_decl (tree expr, bool *tc ATTRIBUTE_UNUSED,
552                   bool *ti ATTRIBUTE_UNUSED, bool *se ATTRIBUTE_UNUSED)
553 {
554   return expr;
555 }
556
557 /* Return sharing kind if OpenMP sharing attribute of DECL is
558    predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise.  */
559
560 enum omp_clause_default_kind
561 lhd_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED)
562 {
563   if (DECL_ARTIFICIAL (decl))
564     return OMP_CLAUSE_DEFAULT_SHARED;
565   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
566 }
567
568 /* Generate code to copy SRC to DST.  */
569
570 tree
571 lhd_omp_assignment (tree clause ATTRIBUTE_UNUSED, tree dst, tree src)
572 {
573   return build2 (GIMPLE_MODIFY_STMT, void_type_node, dst, src);
574 }
575
576 /* Register language specific type size variables as potentially OpenMP
577    firstprivate variables.  */
578
579 void
580 lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED,
581                                    tree t ATTRIBUTE_UNUSED)
582 {
583 }
584
585 tree
586 add_builtin_function (const char *name,
587                       tree type,
588                       int function_code,
589                       enum built_in_class cl,
590                       const char *library_name,
591                       tree attrs)
592 {
593   tree   id = get_identifier (name);
594   tree decl = build_decl (FUNCTION_DECL, id, type);
595
596   TREE_PUBLIC (decl)         = 1;
597   DECL_EXTERNAL (decl)       = 1;
598   DECL_BUILT_IN_CLASS (decl) = cl;
599   DECL_FUNCTION_CODE (decl)  = function_code;
600
601   if (library_name)
602     {
603       tree libname = get_identifier (library_name);
604       SET_DECL_ASSEMBLER_NAME (decl, libname);
605     }
606
607   /* Possibly apply some default attributes to this built-in function.  */
608   if (attrs)
609     decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
610   else
611     decl_attributes (&decl, NULL_TREE, 0);
612
613   return lang_hooks.builtin_function (decl);
614
615 }
616
617 tree
618 lhd_builtin_function (tree decl)
619 {
620   lang_hooks.decls.pushdecl (decl);
621   return decl;
622 }