OSDN Git Service

bd01c3fb95ab876e0b163fde3139a4d0ee9afc01
[pf3gnuchains/gcc-fork.git] / gcc / langhooks.c
1 /* Default language-specific hooks.
2    Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Alexandre Oliva  <aoliva@redhat.com>
5
6 This file is part of GCC.
7
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 3, or (at your option)
11 any later version.
12
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.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
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 "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 "target.h"
37 #include "langhooks-def.h"
38 #include "ggc.h"
39 #include "diagnostic.h"
40
41 /* Do nothing; in many cases the default hook.  */
42
43 void
44 lhd_do_nothing (void)
45 {
46 }
47
48 /* Do nothing (tree).  */
49
50 void
51 lhd_do_nothing_t (tree ARG_UNUSED (t))
52 {
53 }
54
55 /* Do nothing (int).  */
56
57 void
58 lhd_do_nothing_i (int ARG_UNUSED (i))
59 {
60 }
61
62 /* Do nothing (int, int, int).  Return NULL_TREE.  */
63
64 tree
65 lhd_do_nothing_iii_return_null_tree (int ARG_UNUSED (i),
66                                      int ARG_UNUSED (j),
67                                      int ARG_UNUSED (k))
68 {
69   return NULL_TREE;
70 }
71
72 /* Do nothing (function).  */
73
74 void
75 lhd_do_nothing_f (struct function * ARG_UNUSED (f))
76 {
77 }
78
79 /* Do nothing (return NULL_TREE).  */
80
81 tree
82 lhd_return_null_tree_v (void)
83 {
84   return NULL_TREE;
85 }
86
87 /* Do nothing (return NULL_TREE).  */
88
89 tree
90 lhd_return_null_tree (tree ARG_UNUSED (t))
91 {
92   return NULL_TREE;
93 }
94
95 /* Do nothing (return NULL_TREE).  */
96
97 tree
98 lhd_return_null_const_tree (const_tree ARG_UNUSED (t))
99 {
100   return NULL_TREE;
101 }
102
103 /* The default post options hook.  */
104
105 bool
106 lhd_post_options (const char ** ARG_UNUSED (pfilename))
107 {
108   return false;
109 }
110
111 /* Called from by print-tree.c.  */
112
113 void
114 lhd_print_tree_nothing (FILE * ARG_UNUSED (file),
115                         tree ARG_UNUSED (node),
116                         int ARG_UNUSED (indent))
117 {
118 }
119
120 /* Called from check_global_declarations.  */
121
122 bool
123 lhd_warn_unused_global_decl (const_tree decl)
124 {
125   /* This is what used to exist in check_global_declarations.  Probably
126      not many of these actually apply to non-C languages.  */
127
128   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
129     return false;
130   if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl))
131     return false;
132   if (DECL_IN_SYSTEM_HEADER (decl))
133     return false;
134
135   return true;
136 }
137
138 /* Set the DECL_ASSEMBLER_NAME for DECL.  */
139 void
140 lhd_set_decl_assembler_name (tree decl)
141 {
142   tree id;
143
144   /* The language-independent code should never use the
145      DECL_ASSEMBLER_NAME for lots of DECLs.  Only FUNCTION_DECLs and
146      VAR_DECLs for variables with static storage duration need a real
147      DECL_ASSEMBLER_NAME.  */
148   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
149               || (TREE_CODE (decl) == VAR_DECL
150                   && (TREE_STATIC (decl)
151                       || DECL_EXTERNAL (decl)
152                       || TREE_PUBLIC (decl))));
153   
154   /* By default, assume the name to use in assembly code is the same
155      as that used in the source language.  (That's correct for C, and
156      GCC used to set DECL_ASSEMBLER_NAME to the same value as
157      DECL_NAME in build_decl, so this choice provides backwards
158      compatibility with existing front-ends.  This assumption is wrapped
159      in a target hook, to allow for target-specific modification of the
160      identifier.
161  
162      Can't use just the variable's own name for a variable whose scope
163      is less than the whole compilation.  Concatenate a distinguishing
164      number - we use the DECL_UID.  */
165
166   if (TREE_PUBLIC (decl) || DECL_CONTEXT (decl) == NULL_TREE)
167     id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl));
168   else
169     {
170       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
171       char *label;
172       
173       ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
174       id = get_identifier (label);
175     }
176   SET_DECL_ASSEMBLER_NAME (decl, id);
177
178 }
179
180 /* Type promotion for variable arguments.  */
181 tree
182 lhd_type_promotes_to (tree ARG_UNUSED (type))
183 {
184   gcc_unreachable ();
185 }
186
187 /* Registration of machine- or os-specific builtin types.  */
188 void
189 lhd_register_builtin_type (tree ARG_UNUSED (type),
190                            const char * ARG_UNUSED (name))
191 {
192 }
193
194 /* Invalid use of an incomplete type.  */
195 void
196 lhd_incomplete_type_error (const_tree ARG_UNUSED (value), const_tree type)
197 {
198   gcc_assert (TREE_CODE (type) == ERROR_MARK);
199   return;
200 }
201
202 /* Provide a default routine for alias sets that always returns -1.  This
203    is used by languages that don't need to do anything special.  */
204
205 alias_set_type
206 lhd_get_alias_set (tree ARG_UNUSED (t))
207 {
208   return -1;
209 }
210
211 /* This is the default decl_printable_name function.  */
212
213 const char *
214 lhd_decl_printable_name (tree decl, int ARG_UNUSED (verbosity))
215 {
216   gcc_assert (decl && DECL_NAME (decl));
217   return IDENTIFIER_POINTER (DECL_NAME (decl));
218 }
219
220 /* This is the default dwarf_name function.  */
221
222 const char *
223 lhd_dwarf_name (tree t, int verbosity)
224 {
225   gcc_assert (DECL_P (t));
226
227   return lang_hooks.decl_printable_name (t, verbosity);
228 }
229
230 /* This compares two types for equivalence ("compatible" in C-based languages).
231    This routine should only return 1 if it is sure.  It should not be used
232    in contexts where erroneously returning 0 causes problems.  */
233
234 int
235 lhd_types_compatible_p (tree x, tree y)
236 {
237   return TYPE_MAIN_VARIANT (x) == TYPE_MAIN_VARIANT (y);
238 }
239
240 /* lang_hooks.tree_dump.dump_tree:  Dump language-specific parts of tree
241    nodes.  Returns nonzero if it does not want the usual dumping of the
242    second argument.  */
243
244 bool
245 lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED, tree t ATTRIBUTE_UNUSED)
246 {
247   return false;
248 }
249
250 /* lang_hooks.tree_dump.type_qual:  Determine type qualifiers in a
251    language-specific way.  */
252
253 int
254 lhd_tree_dump_type_quals (const_tree t)
255 {
256   return TYPE_QUALS (t);
257 }
258
259 /* lang_hooks.expr_size: Determine the size of the value of an expression T
260    in a language-specific way.  Returns a tree for the size in bytes.  */
261
262 tree
263 lhd_expr_size (const_tree exp)
264 {
265   if (DECL_P (exp)
266       && DECL_SIZE_UNIT (exp) != 0)
267     return DECL_SIZE_UNIT (exp);
268   else
269     return size_in_bytes (TREE_TYPE (exp));
270 }
271
272 /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form.  */
273
274 int
275 lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED,
276                    gimple_seq *pre_p ATTRIBUTE_UNUSED,
277                    gimple_seq *post_p ATTRIBUTE_UNUSED)
278 {
279   return GS_UNHANDLED;
280 }
281
282 /* lang_hooks.tree_size: Determine the size of a tree with code C,
283    which is a language-specific tree code in category tcc_constant or
284    tcc_exceptional.  The default expects never to be called.  */
285 size_t
286 lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
287 {
288   gcc_unreachable ();
289 }
290
291 /* Return true if decl, which is a function decl, may be called by a
292    sibcall.  */
293
294 bool
295 lhd_decl_ok_for_sibcall (const_tree decl ATTRIBUTE_UNUSED)
296 {
297   return true;
298 }
299
300 /* Return the COMDAT group into which DECL should be placed.  */
301
302 const char *
303 lhd_comdat_group (tree decl)
304 {
305   return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
306 }
307
308 /* lang_hooks.decls.final_write_globals: perform final processing on
309    global variables.  */
310 void
311 write_global_declarations (void)
312 {
313   /* Really define vars that have had only a tentative definition.
314      Really output inline functions that must actually be callable
315      and have not been output so far.  */
316
317   tree globals = lang_hooks.decls.getdecls ();
318   int len = list_length (globals);
319   tree *vec = XNEWVEC (tree, len);
320   int i;
321   tree decl;
322
323   /* Process the decls in reverse order--earliest first.
324      Put them into VEC from back to front, then take out from front.  */
325
326   for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
327     vec[len - i - 1] = decl;
328
329   wrapup_global_declarations (vec, len);
330   check_global_declarations (vec, len);
331   emit_debug_global_declarations (vec, len);
332
333   /* Clean up.  */
334   free (vec);
335 }
336
337 /* Called to perform language-specific initialization of CTX.  */
338 void
339 lhd_initialize_diagnostics (struct diagnostic_context *ctx ATTRIBUTE_UNUSED)
340 {
341 }
342
343 /* The default function to print out name of current function that caused
344    an error.  */
345 void
346 lhd_print_error_function (diagnostic_context *context, const char *file,
347                           diagnostic_info *diagnostic)
348 {
349   if (diagnostic_last_function_changed (context, diagnostic))
350     {
351       const char *old_prefix = context->printer->prefix;
352       tree abstract_origin = diagnostic->abstract_origin;
353       char *new_prefix = (file && abstract_origin == NULL)
354                          ? file_name_as_prefix (file) : NULL;
355
356       pp_set_prefix (context->printer, new_prefix);
357
358       if (current_function_decl == NULL)
359         pp_printf (context->printer, _("At top level:"));
360       else
361         {
362           tree fndecl, ao;
363
364           if (abstract_origin)
365             {
366               ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
367               while (TREE_CODE (ao) == BLOCK
368                      && BLOCK_ABSTRACT_ORIGIN (ao)
369                      && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
370                 ao = BLOCK_ABSTRACT_ORIGIN (ao);
371               gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
372               fndecl = ao;
373             }
374           else
375             fndecl = current_function_decl;
376
377           if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
378             pp_printf
379               (context->printer, _("In member function %qs"),
380                lang_hooks.decl_printable_name (fndecl, 2));
381           else
382             pp_printf
383               (context->printer, _("In function %qs"),
384                lang_hooks.decl_printable_name (fndecl, 2));
385
386           while (abstract_origin)
387             {
388               location_t *locus;
389               tree block = abstract_origin;
390
391               locus = &BLOCK_SOURCE_LOCATION (block);
392               fndecl = NULL;
393               block = BLOCK_SUPERCONTEXT (block);
394               while (block && TREE_CODE (block) == BLOCK
395                      && BLOCK_ABSTRACT_ORIGIN (block))
396                 {
397                   ao = BLOCK_ABSTRACT_ORIGIN (block);
398
399                   while (TREE_CODE (ao) == BLOCK
400                          && BLOCK_ABSTRACT_ORIGIN (ao)
401                          && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
402                     ao = BLOCK_ABSTRACT_ORIGIN (ao);
403
404                   if (TREE_CODE (ao) == FUNCTION_DECL)
405                     {
406                       fndecl = ao;
407                       break;
408                     }
409                   else if (TREE_CODE (ao) != BLOCK)
410                     break;
411
412                   block = BLOCK_SUPERCONTEXT (block);
413                 }
414               if (fndecl)
415                 abstract_origin = block;
416               else
417                 {
418                   while (block && TREE_CODE (block) == BLOCK)
419                     block = BLOCK_SUPERCONTEXT (block);
420
421                   if (block && TREE_CODE (block) == FUNCTION_DECL)
422                     fndecl = block;
423                   abstract_origin = NULL;
424                 }
425               if (fndecl)
426                 {
427                   expanded_location s = expand_location (*locus);
428                   pp_character (context->printer, ',');
429                   pp_newline (context->printer);
430                   if (s.file != NULL)
431                     {
432                       if (flag_show_column && s.column != 0)
433                         pp_printf (context->printer,
434                                    _("    inlined from %qs at %s:%d:%d"),
435                                    lang_hooks.decl_printable_name (fndecl, 2),
436                                    s.file, s.line, s.column);
437                       else
438                         pp_printf (context->printer,
439                                    _("    inlined from %qs at %s:%d"),
440                                    lang_hooks.decl_printable_name (fndecl, 2),
441                                    s.file, s.line);
442
443                     }
444                   else
445                     pp_printf (context->printer, _("    inlined from %qs"),
446                                lang_hooks.decl_printable_name (fndecl, 2));
447                 }
448             }
449           pp_character (context->printer, ':');
450         }
451
452       diagnostic_set_last_function (context, diagnostic);
453       pp_flush (context->printer);
454       context->printer->prefix = old_prefix;
455       free ((char*) new_prefix);
456     }
457 }
458
459 tree
460 lhd_callgraph_analyze_expr (tree *tp ATTRIBUTE_UNUSED,
461                             int *walk_subtrees ATTRIBUTE_UNUSED)
462 {
463   return NULL;
464 }
465
466 tree
467 lhd_make_node (enum tree_code code)
468 {
469   return make_node (code);
470 }
471
472 HOST_WIDE_INT
473 lhd_to_target_charset (HOST_WIDE_INT c)
474 {
475   return c;
476 }
477
478 tree
479 lhd_expr_to_decl (tree expr, bool *tc ATTRIBUTE_UNUSED, bool *se ATTRIBUTE_UNUSED)
480 {
481   return expr;
482 }
483
484 /* Return sharing kind if OpenMP sharing attribute of DECL is
485    predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise.  */
486
487 enum omp_clause_default_kind
488 lhd_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED)
489 {
490   if (DECL_ARTIFICIAL (decl))
491     return OMP_CLAUSE_DEFAULT_SHARED;
492   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
493 }
494
495 /* Generate code to copy SRC to DST.  */
496
497 tree
498 lhd_omp_assignment (tree clause ATTRIBUTE_UNUSED, tree dst, tree src)
499 {
500   return build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
501 }
502
503 /* Register language specific type size variables as potentially OpenMP
504    firstprivate variables.  */
505
506 void
507 lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED,
508                                    tree t ATTRIBUTE_UNUSED)
509 {
510 }
511
512 /* Common function for add_builtin_function and
513    add_builtin_function_ext_scope.  */
514 static tree
515 add_builtin_function_common (const char *name,
516                              tree type,
517                              int function_code,
518                              enum built_in_class cl,
519                              const char *library_name,
520                              tree attrs,
521                              tree (*hook) (tree))
522 {
523   tree   id = get_identifier (name);
524   tree decl = build_decl (FUNCTION_DECL, id, type);
525
526   TREE_PUBLIC (decl)         = 1;
527   DECL_EXTERNAL (decl)       = 1;
528   DECL_BUILT_IN_CLASS (decl) = cl;
529
530   DECL_FUNCTION_CODE (decl)  = -1;
531   gcc_assert (DECL_FUNCTION_CODE (decl) >= function_code);
532   DECL_FUNCTION_CODE (decl)  = function_code;
533
534   if (library_name)
535     {
536       tree libname = get_identifier (library_name);
537       SET_DECL_ASSEMBLER_NAME (decl, libname);
538     }
539
540   /* Possibly apply some default attributes to this built-in function.  */
541   if (attrs)
542     decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
543   else
544     decl_attributes (&decl, NULL_TREE, 0);
545
546   return hook (decl);
547
548 }
549
550 /* Create a builtin function.  */
551
552 tree
553 add_builtin_function (const char *name,
554                       tree type,
555                       int function_code,
556                       enum built_in_class cl,
557                       const char *library_name,
558                       tree attrs)
559 {
560   return add_builtin_function_common (name, type, function_code, cl,
561                                       library_name, attrs,
562                                       lang_hooks.builtin_function);
563 }
564
565 /* Like add_builtin_function, but make sure the scope is the external scope.
566    This is used to delay putting in back end builtin functions until the ISA
567    that defines the builtin is declared via function specific target options,
568    which can save memory for machines like the x86_64 that have multiple ISAs.
569    If this points to the same function as builtin_function, the backend must
570    add all of the builtins at program initialization time.  */
571
572 tree
573 add_builtin_function_ext_scope (const char *name,
574                                 tree type,
575                                 int function_code,
576                                 enum built_in_class cl,
577                                 const char *library_name,
578                                 tree attrs)
579 {
580   return add_builtin_function_common (name, type, function_code, cl,
581                                       library_name, attrs,
582                                       lang_hooks.builtin_function_ext_scope);
583 }
584
585 tree
586 lhd_builtin_function (tree decl)
587 {
588   lang_hooks.decls.pushdecl (decl);
589   return decl;
590 }