]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/langhooks.c
Update copyright years.
[thirdparty/gcc.git] / gcc / langhooks.c
CommitLineData
69dcadff 1/* Default language-specific hooks.
a5544970 2 Copyright (C) 2001-2019 Free Software Foundation, Inc.
69dcadff
AO
3 Contributed by Alexandre Oliva <aoliva@redhat.com>
4
54a7b573 5This file is part of GCC.
69dcadff 6
54a7b573 7GCC is free software; you can redistribute it and/or modify
69dcadff 8it under the terms of the GNU General Public License as published by
9dcd6f09 9the Free Software Foundation; either version 3, or (at your option)
69dcadff
AO
10any later version.
11
54a7b573 12GCC is distributed in the hope that it will be useful,
69dcadff
AO
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
69dcadff
AO
20
21#include "config.h"
22#include "system.h"
4977bab6 23#include "coretypes.h"
957060b5 24#include "target.h"
957060b5
AM
25#include "rtl.h"
26#include "tree.h"
27#include "timevar.h"
28#include "stringpool.h"
957060b5 29#include "diagnostic.h"
971801ff 30#include "intl.h"
69dcadff 31#include "toplev.h"
d8a2d370 32#include "attribs.h"
45b0be94 33#include "gimplify.h"
59bee412 34#include "langhooks.h"
cf835838 35#include "tree-diagnostic.h"
d7f09764 36#include "output.h"
ed7dc894 37#include "timevar.h"
59bee412 38
77b1a921 39/* Do nothing; in many cases the default hook. */
8ac61af7 40
77b1a921 41void
0c20a65f 42lhd_do_nothing (void)
77b1a921
NB
43{
44}
45
b03e38e1 46/* Do nothing (tree). */
63e1b1c4
NB
47
48void
e18476eb 49lhd_do_nothing_t (tree ARG_UNUSED (t))
63e1b1c4
NB
50{
51}
52
f9417da1
RG
53/* Pass through (tree). */
54tree
55lhd_pass_through_t (tree t)
56{
57 return t;
58}
59
a7e8c268
MM
60/* Do nothing (int, int, int). Return NULL_TREE. */
61
62tree
9f63daea 63lhd_do_nothing_iii_return_null_tree (int ARG_UNUSED (i),
e18476eb
BI
64 int ARG_UNUSED (j),
65 int ARG_UNUSED (k))
a7e8c268
MM
66{
67 return NULL_TREE;
68}
69
b03e38e1
NB
70/* Do nothing (function). */
71
72void
e18476eb 73lhd_do_nothing_f (struct function * ARG_UNUSED (f))
b03e38e1
NB
74{
75}
76
c88770e9
NB
77/* Do nothing (return NULL_TREE). */
78
79tree
e18476eb 80lhd_return_null_tree (tree ARG_UNUSED (t))
c88770e9
NB
81{
82 return NULL_TREE;
83}
84
fa233e34
KG
85/* Do nothing (return NULL_TREE). */
86
87tree
88lhd_return_null_const_tree (const_tree ARG_UNUSED (t))
89{
90 return NULL_TREE;
91}
92
4bfec483
NB
93/* The default post options hook. */
94
95bool
e18476eb 96lhd_post_options (const char ** ARG_UNUSED (pfilename))
4bfec483 97{
8ce94e44
JM
98 /* Excess precision other than "fast" requires front-end
99 support. */
100 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
4bfec483
NB
101 return false;
102}
103
5d69f816
NB
104/* Called from by print-tree.c. */
105
106void
e18476eb
BI
107lhd_print_tree_nothing (FILE * ARG_UNUSED (file),
108 tree ARG_UNUSED (node),
109 int ARG_UNUSED (indent))
5d69f816 110{
ac79cd5a
RK
111}
112
d7438551 113/* Called from check_global_declaration. */
ef4f94ac
RH
114
115bool
ac7d7749 116lhd_warn_unused_global_decl (const_tree decl)
ef4f94ac 117{
d7438551 118 /* This is what used to exist in check_global_declaration. Probably
ef4f94ac
RH
119 not many of these actually apply to non-C languages. */
120
54dfd46b 121 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
ef4f94ac 122 return false;
8813a647 123 if (VAR_P (decl) && TREE_READONLY (decl))
ef4f94ac
RH
124 return false;
125 if (DECL_IN_SYSTEM_HEADER (decl))
126 return false;
127
128 return true;
129}
130
599bba86
NB
131/* Set the DECL_ASSEMBLER_NAME for DECL. */
132void
0c20a65f 133lhd_set_decl_assembler_name (tree decl)
599bba86 134{
5234b8f5
DS
135 tree id;
136
1ee85ee1
JH
137 /* set_decl_assembler_name may be called on TYPE_DECL to record ODR
138 name for C++ types. By default types have no ODR names. */
139 if (TREE_CODE (decl) == TYPE_DECL)
140 return;
141
599bba86
NB
142 /* The language-independent code should never use the
143 DECL_ASSEMBLER_NAME for lots of DECLs. Only FUNCTION_DECLs and
144 VAR_DECLs for variables with static storage duration need a real
8127d0e0 145 DECL_ASSEMBLER_NAME. */
41806d92 146 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
8813a647 147 || (VAR_P (decl)
41806d92
NS
148 && (TREE_STATIC (decl)
149 || DECL_EXTERNAL (decl)
150 || TREE_PUBLIC (decl))));
b8698a0f 151
41806d92
NS
152 /* By default, assume the name to use in assembly code is the same
153 as that used in the source language. (That's correct for C, and
154 GCC used to set DECL_ASSEMBLER_NAME to the same value as
155 DECL_NAME in build_decl, so this choice provides backwards
5234b8f5
DS
156 compatibility with existing front-ends. This assumption is wrapped
157 in a target hook, to allow for target-specific modification of the
158 identifier.
b8698a0f 159
41806d92
NS
160 Can't use just the variable's own name for a variable whose scope
161 is less than the whole compilation. Concatenate a distinguishing
162 number - we use the DECL_UID. */
5234b8f5 163
116f30c3 164 if (TREE_PUBLIC (decl) || DECL_FILE_SCOPE_P (decl))
5234b8f5 165 id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl));
41806d92 166 else
26e0dcb3 167 {
41806d92
NS
168 const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
169 char *label;
b8698a0f 170
41806d92 171 ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
5234b8f5 172 id = get_identifier (label);
26e0dcb3 173 }
5f3682ff 174
5234b8f5 175 SET_DECL_ASSEMBLER_NAME (decl, id);
5f3682ff 176}
5234b8f5 177
5f3682ff
NS
178/* Forcibly overwrite the DECL_ASSEMBLER_NAME for DECL to NAME. */
179void
180lhd_overwrite_decl_assembler_name (tree decl, tree name)
181{
182 DECL_ASSEMBLER_NAME_RAW (decl) = name;
599bba86
NB
183}
184
ab393bf1
NB
185/* Type promotion for variable arguments. */
186tree
e18476eb 187lhd_type_promotes_to (tree ARG_UNUSED (type))
ab393bf1 188{
41806d92 189 gcc_unreachable ();
ab393bf1
NB
190}
191
9649812a
MM
192/* Registration of machine- or os-specific builtin types. */
193void
9f63daea 194lhd_register_builtin_type (tree ARG_UNUSED (type),
e18476eb 195 const char * ARG_UNUSED (name))
9649812a
MM
196{
197}
198
7a228918
NB
199/* Invalid use of an incomplete type. */
200void
4f2e1536
MP
201lhd_incomplete_type_error (location_t ARG_UNUSED (loc),
202 const_tree ARG_UNUSED (value), const_tree type)
7a228918 203{
41806d92
NS
204 gcc_assert (TREE_CODE (type) == ERROR_MARK);
205 return;
7a228918
NB
206}
207
37207ee7
ZW
208/* Provide a default routine for alias sets that always returns -1. This
209 is used by languages that don't need to do anything special. */
210
4862826d 211alias_set_type
e18476eb 212lhd_get_alias_set (tree ARG_UNUSED (t))
37207ee7
ZW
213{
214 return -1;
215}
216
7afff7cf
NB
217/* This is the default decl_printable_name function. */
218
219const char *
e18476eb 220lhd_decl_printable_name (tree decl, int ARG_UNUSED (verbosity))
7afff7cf 221{
05cf561d 222 gcc_assert (decl && DECL_NAME (decl));
7afff7cf
NB
223 return IDENTIFIER_POINTER (DECL_NAME (decl));
224}
225
721a8ac5
NS
226/* This is the default dwarf_name function. */
227
228const char *
229lhd_dwarf_name (tree t, int verbosity)
230{
231 gcc_assert (DECL_P (t));
232
233 return lang_hooks.decl_printable_name (t, verbosity);
234}
235
6de9cd9a
DN
236/* This compares two types for equivalence ("compatible" in C-based languages).
237 This routine should only return 1 if it is sure. It should not be used
238 in contexts where erroneously returning 0 causes problems. */
239
240int
241lhd_types_compatible_p (tree x, tree y)
242{
243 return TYPE_MAIN_VARIANT (x) == TYPE_MAIN_VARIANT (y);
244}
245
e11e816e 246/* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree
cc2902df 247 nodes. Returns nonzero if it does not want the usual dumping of the
89d684bb
BM
248 second argument. */
249
2bd3ecad 250bool
0c20a65f 251lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED, tree t ATTRIBUTE_UNUSED)
89d684bb 252{
2bd3ecad 253 return false;
89d684bb
BM
254}
255
e11e816e 256/* lang_hooks.tree_dump.type_qual: Determine type qualifiers in a
89d684bb
BM
257 language-specific way. */
258
259int
ac7d7749 260lhd_tree_dump_type_quals (const_tree t)
89d684bb
BM
261{
262 return TYPE_QUALS (t);
263}
a77a9a18 264
6de9cd9a
DN
265/* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form. */
266
267int
726a989a
RB
268lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED,
269 gimple_seq *pre_p ATTRIBUTE_UNUSED,
270 gimple_seq *post_p ATTRIBUTE_UNUSED)
16b0d23f 271{
6de9cd9a 272 return GS_UNHANDLED;
16b0d23f 273}
2f51bb1d 274
d78e771d 275/* lang_hooks.tree_size: Determine the size of a tree with code C,
8e7014b4
JJ
276 which is a language-specific tree code in category tcc_constant,
277 tcc_exceptional or tcc_type. The default expects never to be called. */
d78e771d 278size_t
0c20a65f 279lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
d78e771d 280{
41806d92 281 gcc_unreachable ();
d78e771d
ZW
282}
283
e076f71a
AH
284/* Return true if decl, which is a function decl, may be called by a
285 sibcall. */
286
287bool
58f9752a 288lhd_decl_ok_for_sibcall (const_tree decl ATTRIBUTE_UNUSED)
e076f71a
AH
289{
290 return true;
291}
292
d7438551
AH
293/* Generic global declaration processing. This is meant to be called
294 by the front-ends at the end of parsing. C/C++ do their own thing,
295 but other front-ends may call this. */
296
2f51bb1d 297void
d7438551 298global_decl_processing (void)
2f51bb1d 299{
a406865a
RG
300 tree globals, decl, *vec;
301 int len, i;
302
d7438551 303 timevar_stop (TV_PHASE_PARSING);
0d6bf48c 304 timevar_start (TV_PHASE_DEFERRED);
2f51bb1d
MA
305 /* Really define vars that have had only a tentative definition.
306 Really output inline functions that must actually be callable
307 and have not been output so far. */
308
a406865a
RG
309 globals = lang_hooks.decls.getdecls ();
310 len = list_length (globals);
311 vec = XNEWVEC (tree, len);
2f51bb1d
MA
312
313 /* Process the decls in reverse order--earliest first.
314 Put them into VEC from back to front, then take out from front. */
315
910ad8de 316 for (i = 0, decl = globals; i < len; i++, decl = DECL_CHAIN (decl))
2f51bb1d
MA
317 vec[len - i - 1] = decl;
318
319 wrapup_global_declarations (vec, len);
0d6bf48c
JH
320 timevar_stop (TV_PHASE_DEFERRED);
321
d7438551 322 timevar_start (TV_PHASE_PARSING);
2f51bb1d
MA
323 free (vec);
324}
26e0dcb3 325
21ecc5a7
GDR
326/* Called to perform language-specific initialization of CTX. */
327void
1ebe4b4f 328lhd_initialize_diagnostics (diagnostic_context *ctx ATTRIBUTE_UNUSED)
21ecc5a7
GDR
329{
330}
331
2a8a8d7b
NS
332/* Called to register dumps. */
333void
334lhd_register_dumps (gcc::dump_manager *)
335{
336}
337
7a9bf9a4
JM
338/* Called to perform language-specific options initialization. */
339void
340lhd_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
341 struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
342{
343}
344
345/* By default, always complain about options for the wrong language. */
346bool
347lhd_complain_wrong_lang_p (const struct cl_option *option ATTRIBUTE_UNUSED)
348{
349 return true;
350}
351
5f20c657
JM
352/* By default, no language-specific options are valid. */
353bool
354lhd_handle_option (size_t code ATTRIBUTE_UNUSED,
355 const char *arg ATTRIBUTE_UNUSED,
00abf86c
MS
356 HOST_WIDE_INT value ATTRIBUTE_UNUSED,
357 int kind ATTRIBUTE_UNUSED,
a4d8c676 358 location_t loc ATTRIBUTE_UNUSED,
5f20c657
JM
359 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
360{
361 return false;
362}
363
dba65e79
GDR
364/* The default function to print out name of current function that caused
365 an error. */
366void
c94ed7a1
JJ
367lhd_print_error_function (diagnostic_context *context, const char *file,
368 diagnostic_info *diagnostic)
dba65e79 369{
c94ed7a1 370 if (diagnostic_last_function_changed (context, diagnostic))
dba65e79 371 {
653fee19 372 char *old_prefix = pp_take_prefix (context->printer);
cf835838 373 tree abstract_origin = diagnostic_abstract_origin (diagnostic);
c94ed7a1 374 char *new_prefix = (file && abstract_origin == NULL)
e78e8a0b 375 ? file_name_as_prefix (context, file) : NULL;
dba65e79
GDR
376
377 pp_set_prefix (context->printer, new_prefix);
378
379 if (current_function_decl == NULL)
971801ff 380 pp_printf (context->printer, _("At top level:"));
dba65e79
GDR
381 else
382 {
c94ed7a1
JJ
383 tree fndecl, ao;
384
385 if (abstract_origin)
386 {
387 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
c94ed7a1
JJ
388 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
389 fndecl = ao;
390 }
391 else
392 fndecl = current_function_decl;
393
394 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
dba65e79 395 pp_printf
c94ed7a1 396 (context->printer, _("In member function %qs"),
4f1e4960 397 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
dba65e79
GDR
398 else
399 pp_printf
c94ed7a1 400 (context->printer, _("In function %qs"),
4f1e4960 401 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
c94ed7a1
JJ
402
403 while (abstract_origin)
404 {
405 location_t *locus;
406 tree block = abstract_origin;
407
408 locus = &BLOCK_SOURCE_LOCATION (block);
409 fndecl = NULL;
410 block = BLOCK_SUPERCONTEXT (block);
411 while (block && TREE_CODE (block) == BLOCK
412 && BLOCK_ABSTRACT_ORIGIN (block))
413 {
414 ao = BLOCK_ABSTRACT_ORIGIN (block);
c94ed7a1
JJ
415 if (TREE_CODE (ao) == FUNCTION_DECL)
416 {
417 fndecl = ao;
418 break;
419 }
420 else if (TREE_CODE (ao) != BLOCK)
421 break;
422
423 block = BLOCK_SUPERCONTEXT (block);
424 }
425 if (fndecl)
426 abstract_origin = block;
427 else
428 {
429 while (block && TREE_CODE (block) == BLOCK)
430 block = BLOCK_SUPERCONTEXT (block);
431
91ab2c86 432 if (block && TREE_CODE (block) == FUNCTION_DECL)
c94ed7a1
JJ
433 fndecl = block;
434 abstract_origin = NULL;
435 }
436 if (fndecl)
437 {
438 expanded_location s = expand_location (*locus);
07838b13 439 pp_comma (context->printer);
c94ed7a1
JJ
440 pp_newline (context->printer);
441 if (s.file != NULL)
442 {
243fbddd 443 if (context->show_column)
c94ed7a1 444 pp_printf (context->printer,
4b84d650 445 _(" inlined from %qs at %r%s:%d:%d%R"),
4f1e4960 446 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)),
4b84d650 447 "locus", s.file, s.line, s.column);
c94ed7a1 448 else
c94ed7a1 449 pp_printf (context->printer,
4b84d650 450 _(" inlined from %qs at %r%s:%d%R"),
4f1e4960 451 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)),
4b84d650 452 "locus", s.file, s.line);
c94ed7a1
JJ
453
454 }
455 else
456 pp_printf (context->printer, _(" inlined from %qs"),
4f1e4960 457 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
c94ed7a1
JJ
458 }
459 }
07838b13 460 pp_colon (context->printer);
dba65e79 461 }
dba65e79 462
c94ed7a1 463 diagnostic_set_last_function (context, diagnostic);
f8923f7e 464 pp_newline_and_flush (context->printer);
dba65e79
GDR
465 context->printer->prefix = old_prefix;
466 free ((char*) new_prefix);
467 }
468}
469
b9dcdee4
JH
470tree
471lhd_make_node (enum tree_code code)
472{
473 return make_node (code);
474}
c5ff069d 475
8a3a6ab4
DM
476/* Default implementation of LANG_HOOKS_TYPE_FOR_SIZE.
477 Return an integer type with PRECISION bits of precision,
478 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
479
480tree
481lhd_type_for_size (unsigned precision, int unsignedp)
482{
483 int i;
484
485 if (precision == TYPE_PRECISION (integer_type_node))
486 return unsignedp ? unsigned_type_node : integer_type_node;
487
488 if (precision == TYPE_PRECISION (signed_char_type_node))
489 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
490
491 if (precision == TYPE_PRECISION (short_integer_type_node))
492 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
493
494 if (precision == TYPE_PRECISION (long_integer_type_node))
495 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
496
497 if (precision == TYPE_PRECISION (long_long_integer_type_node))
498 return unsignedp
499 ? long_long_unsigned_type_node
500 : long_long_integer_type_node;
501
502 for (i = 0; i < NUM_INT_N_ENTS; i ++)
503 if (int_n_enabled_p[i]
504 && precision == int_n_data[i].bitsize)
505 return (unsignedp ? int_n_trees[i].unsigned_type
506 : int_n_trees[i].signed_type);
507
508 if (precision <= TYPE_PRECISION (intQI_type_node))
509 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
510
511 if (precision <= TYPE_PRECISION (intHI_type_node))
512 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
513
514 if (precision <= TYPE_PRECISION (intSI_type_node))
515 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
516
517 if (precision <= TYPE_PRECISION (intDI_type_node))
518 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
519
520 if (precision <= TYPE_PRECISION (intTI_type_node))
521 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
522
523 return NULL_TREE;
524}
525
c5ff069d
ZW
526HOST_WIDE_INT
527lhd_to_target_charset (HOST_WIDE_INT c)
528{
529 return c;
530}
73f397d4
JM
531
532tree
51eed280 533lhd_expr_to_decl (tree expr, bool *tc ATTRIBUTE_UNUSED, bool *se ATTRIBUTE_UNUSED)
73f397d4
JM
534{
535 return expr;
536}
953ff289
DN
537
538/* Return sharing kind if OpenMP sharing attribute of DECL is
539 predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise. */
540
541enum omp_clause_default_kind
542lhd_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED)
543{
544 if (DECL_ARTIFICIAL (decl))
545 return OMP_CLAUSE_DEFAULT_SHARED;
546 return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
547}
548
549/* Generate code to copy SRC to DST. */
550
551tree
552lhd_omp_assignment (tree clause ATTRIBUTE_UNUSED, tree dst, tree src)
553{
726a989a 554 return build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
953ff289
DN
555}
556
f014c653
JJ
557/* Finalize clause C. */
558
559void
560lhd_omp_finish_clause (tree, gimple_seq *)
561{
562}
563
b4c3a85b
JJ
564/* Return true if DECL is a scalar variable (for the purpose of
565 implicit firstprivatization). */
566
567bool
568lhd_omp_scalar_p (tree decl)
569{
570 tree type = TREE_TYPE (decl);
571 if (TREE_CODE (type) == REFERENCE_TYPE)
572 type = TREE_TYPE (type);
573 if (TREE_CODE (type) == COMPLEX_TYPE)
574 type = TREE_TYPE (type);
575 if (INTEGRAL_TYPE_P (type)
576 || SCALAR_FLOAT_TYPE_P (type)
577 || TREE_CODE (type) == POINTER_TYPE)
578 return true;
579 return false;
580}
581
953ff289
DN
582/* Register language specific type size variables as potentially OpenMP
583 firstprivate variables. */
584
585void
586lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED,
587 tree t ATTRIBUTE_UNUSED)
588{
589}
c79efc4d 590
b17a8b07 591/* Return true if TYPE is an OpenMP mappable type. */
acf0174b
JJ
592
593bool
594lhd_omp_mappable_type (tree type)
595{
b17a8b07
TS
596 /* Mappable type has to be complete. */
597 if (type == error_mark_node || !COMPLETE_TYPE_P (type))
598 return false;
599 return true;
acf0174b
JJ
600}
601
5779e713
MM
602/* Common function for add_builtin_function and
603 add_builtin_function_ext_scope. */
604static tree
605add_builtin_function_common (const char *name,
606 tree type,
607 int function_code,
608 enum built_in_class cl,
609 const char *library_name,
610 tree attrs,
611 tree (*hook) (tree))
c79efc4d
RÁE
612{
613 tree id = get_identifier (name);
c2255bc4 614 tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, id, type);
c79efc4d
RÁE
615
616 TREE_PUBLIC (decl) = 1;
617 DECL_EXTERNAL (decl) = 1;
618 DECL_BUILT_IN_CLASS (decl) = cl;
c536a6a7 619
32e8bb8e
ILT
620 DECL_FUNCTION_CODE (decl) = (enum built_in_function) function_code;
621
622 /* DECL_FUNCTION_CODE is a bitfield; verify that the value fits. */
623 gcc_assert (DECL_FUNCTION_CODE (decl) == function_code);
c79efc4d 624
428aba16
RS
625 if (library_name)
626 {
627 tree libname = get_identifier (library_name);
72b1108c
NS
628
629 libname = targetm.mangle_decl_assembler_name (decl, libname);
428aba16
RS
630 SET_DECL_ASSEMBLER_NAME (decl, libname);
631 }
c79efc4d
RÁE
632
633 /* Possibly apply some default attributes to this built-in function. */
634 if (attrs)
635 decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
636 else
637 decl_attributes (&decl, NULL_TREE, 0);
638
5779e713
MM
639 return hook (decl);
640
641}
642
643/* Create a builtin function. */
644
645tree
646add_builtin_function (const char *name,
647 tree type,
648 int function_code,
649 enum built_in_class cl,
650 const char *library_name,
651 tree attrs)
652{
653 return add_builtin_function_common (name, type, function_code, cl,
654 library_name, attrs,
655 lang_hooks.builtin_function);
656}
c79efc4d 657
5779e713
MM
658/* Like add_builtin_function, but make sure the scope is the external scope.
659 This is used to delay putting in back end builtin functions until the ISA
660 that defines the builtin is declared via function specific target options,
661 which can save memory for machines like the x86_64 that have multiple ISAs.
662 If this points to the same function as builtin_function, the backend must
663 add all of the builtins at program initialization time. */
664
665tree
666add_builtin_function_ext_scope (const char *name,
667 tree type,
668 int function_code,
669 enum built_in_class cl,
670 const char *library_name,
671 tree attrs)
672{
673 return add_builtin_function_common (name, type, function_code, cl,
674 library_name, attrs,
675 lang_hooks.builtin_function_ext_scope);
c79efc4d
RÁE
676}
677
678tree
679lhd_builtin_function (tree decl)
680{
681 lang_hooks.decls.pushdecl (decl);
682 return decl;
683}
d7f09764 684
c0814136
SB
685/* Create a builtin type. */
686
687tree
688add_builtin_type (const char *name, tree type)
689{
690 tree id = get_identifier (name);
691 tree decl = build_decl (BUILTINS_LOCATION, TYPE_DECL, id, type);
692 return lang_hooks.decls.pushdecl (decl);
693}
694
d7f09764
DN
695/* LTO hooks. */
696
697/* Used to save and restore any previously active section. */
698static section *saved_section;
699
700
701/* Begin a new LTO output section named NAME. This default implementation
702 saves the old section and emits assembly code to switch to the new
703 section. */
704
705void
706lhd_begin_section (const char *name)
707{
708 section *section;
709
710 /* Save the old section so we can restore it in lto_end_asm_section. */
711 gcc_assert (!saved_section);
712 saved_section = in_section;
cb799353
RG
713 if (!saved_section)
714 saved_section = text_section;
d7f09764
DN
715
716 /* Create a new section and switch to it. */
d856054b 717 section = get_section (name, SECTION_DEBUG | SECTION_EXCLUDE, NULL);
d7f09764
DN
718 switch_to_section (section);
719}
720
721
722/* Write DATA of length LEN to the current LTO output section. This default
f6bcdb5e 723 implementation just calls assemble_string. */
d7f09764
DN
724
725void
f6bcdb5e 726lhd_append_data (const void *data, size_t len, void *)
d7f09764
DN
727{
728 if (data)
ed7dc894
JH
729 {
730 timevar_push (TV_IPA_LTO_OUTPUT);
731 assemble_string ((const char *)data, len);
732 timevar_pop (TV_IPA_LTO_OUTPUT);
733 }
d7f09764
DN
734}
735
736
737/* Finish the current LTO output section. This default implementation emits
738 assembly code to switch to any section previously saved by
739 lhd_begin_section. */
740
741void
742lhd_end_section (void)
743{
744 if (saved_section)
745 {
746 switch_to_section (saved_section);
747 saved_section = NULL;
748 }
749}
7315daa6
MW
750
751/* Default implementation of enum_underlying_base_type using type_for_size. */
752
753tree
754lhd_enum_underlying_base_type (const_tree enum_type)
755{
756 return lang_hooks.types.type_for_size (TYPE_PRECISION (enum_type),
757 TYPE_UNSIGNED (enum_type));
758}
dcc97066 759
e5106e27
DM
760/* Default implementation of LANG_HOOKS_GET_SUBSTRING_LOCATION. */
761
762const char *
763lhd_get_substring_location (const substring_loc &, location_t *)
764{
765 return "unimplemented";
766}
767
81b42cc6
JJ
768/* Default implementation of LANG_HOOKS_DECL_DWARF_ATTRIBUTE. Don't add
769 any attributes. */
770
771int
772lhd_decl_dwarf_attribute (const_tree, int)
773{
774 return -1;
775}
776
6905c577
JJ
777/* Default implementation of LANG_HOOKS_TYPE_DWARF_ATTRIBUTE. Don't add
778 any attributes. */
779
780int
781lhd_type_dwarf_attribute (const_tree, int)
782{
783 return -1;
784}
785
b7fc43d7
RB
786/* Default implementation of LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING.
787 Just return TYPE_SIZE_UNIT unadjusted. */
788
789tree
790lhd_unit_size_without_reusable_padding (tree t)
791{
792 return TYPE_SIZE_UNIT (t);
793}
794
dcc97066
MW
795/* Returns true if the current lang_hooks represents the GNU C frontend. */
796
797bool
798lang_GNU_C (void)
799{
800 return (strncmp (lang_hooks.name, "GNU C", 5) == 0
801 && (lang_hooks.name[5] == '\0' || ISDIGIT (lang_hooks.name[5])));
802}
803
804/* Returns true if the current lang_hooks represents the GNU C++ frontend. */
805
806bool
807lang_GNU_CXX (void)
808{
809 return strncmp (lang_hooks.name, "GNU C++", 7) == 0;
810}
de3aebff
JJ
811
812/* Returns true if the current lang_hooks represents the GNU Fortran frontend. */
813
814bool
815lang_GNU_Fortran (void)
816{
817 return strncmp (lang_hooks.name, "GNU Fortran", 11) == 0;
818}
81fea426
MP
819
820/* Returns true if the current lang_hooks represents the GNU Objective-C
821 frontend. */
822
823bool
824lang_GNU_OBJC (void)
825{
826 return strncmp (lang_hooks.name, "GNU Objective-C", 15) == 0;
827}