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