Daily bump.
[official-gcc.git] / gcc / ada / gcc-interface / misc.c
blobe4efa21d740959519c3e9a50e5a85a584dd7cd74
1 /****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * M I S C *
6 * *
7 * C Implementation File *
8 * *
9 * Copyright (C) 1992-2018, Free Software Foundation, Inc. *
10 * *
11 * GNAT is free software; you can redistribute it and/or modify it under *
12 * terms of the GNU General Public License as published by the Free Soft- *
13 * ware Foundation; either version 3, or (at your option) any later ver- *
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
17 * for more details. You should have received a copy of the GNU General *
18 * Public License distributed with GNAT; see file COPYING3. If not see *
19 * <http://www.gnu.org/licenses/>. *
20 * *
21 * GNAT was originally developed by the GNAT team at New York University. *
22 * Extensive contributions were provided by Ada Core Technologies Inc. *
23 * *
24 ****************************************************************************/
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "target.h"
30 #include "tree.h"
31 #include "diagnostic.h"
32 #include "opts.h"
33 #include "alias.h"
34 #include "fold-const.h"
35 #include "stor-layout.h"
36 #include "print-tree.h"
37 #include "toplev.h"
38 #include "langhooks.h"
39 #include "langhooks-def.h"
40 #include "plugin.h"
41 #include "calls.h" /* For pass_by_reference. */
42 #include "dwarf2out.h"
44 #include "ada.h"
45 #include "adadecode.h"
46 #include "types.h"
47 #include "atree.h"
48 #include "namet.h"
49 #include "nlists.h"
50 #include "uintp.h"
51 #include "fe.h"
52 #include "sinfo.h"
53 #include "einfo.h"
54 #include "ada-tree.h"
55 #include "gigi.h"
57 /* This symbol needs to be defined for the front-end. */
58 void *callgraph_info_file = NULL;
60 /* Command-line argc and argv. These variables are global since they are
61 imported in back_end.adb. */
62 unsigned int save_argc;
63 const char **save_argv;
65 /* GNAT argc and argv generated by the binder for all Ada programs. */
66 extern int gnat_argc;
67 extern const char **gnat_argv;
69 /* Ada code requires variables for these settings rather than elements
70 of the global_options structure because they are imported. */
71 #undef gnat_encodings
72 enum dwarf_gnat_encodings gnat_encodings = DWARF_GNAT_ENCODINGS_DEFAULT;
74 #undef optimize
75 int optimize;
77 #undef optimize_size
78 int optimize_size;
80 #undef flag_compare_debug
81 int flag_compare_debug;
83 #undef flag_short_enums
84 int flag_short_enums;
86 #undef flag_stack_check
87 enum stack_check_type flag_stack_check = NO_STACK_CHECK;
89 #ifdef __cplusplus
90 extern "C" {
91 #endif
93 /* Declare functions we use as part of startup. */
94 extern void __gnat_initialize (void *);
95 extern void __gnat_install_SEH_handler (void *);
96 extern void adainit (void);
97 extern void _ada_gnat1drv (void);
99 #ifdef __cplusplus
101 #endif
103 /* The parser for the language. For us, we process the GNAT tree. */
105 static void
106 gnat_parse_file (void)
108 int seh[2];
110 /* Call the target specific initializations. */
111 __gnat_initialize (NULL);
113 /* ??? Call the SEH initialization routine. This is to workaround
114 a bootstrap path problem. The call below should be removed at some
115 point and the SEH pointer passed to __gnat_initialize above. */
116 __gnat_install_SEH_handler ((void *)seh);
118 /* Call the front-end elaboration procedures. */
119 adainit ();
121 /* Call the front end. */
122 _ada_gnat1drv ();
124 /* Write the global declarations. */
125 gnat_write_global_declarations ();
128 /* Return language mask for option processing. */
130 static unsigned int
131 gnat_option_lang_mask (void)
133 return CL_Ada;
136 /* Decode all the language specific options that cannot be decoded by GCC.
137 The option decoding phase of GCC calls this routine on the flags that
138 are marked as Ada-specific. Return true on success or false on failure. */
140 static bool
141 gnat_handle_option (size_t scode, const char *arg, int value, int kind,
142 location_t loc, const struct cl_option_handlers *handlers)
144 enum opt_code code = (enum opt_code) scode;
146 switch (code)
148 case OPT_Wall:
149 handle_generated_option (&global_options, &global_options_set,
150 OPT_Wunused, NULL, value,
151 gnat_option_lang_mask (), kind, loc,
152 handlers, true, global_dc);
153 warn_uninitialized = value;
154 warn_maybe_uninitialized = value;
155 break;
157 case OPT_gant:
158 warning (0, "%<-gnat%> misspelled as %<-gant%>");
160 /* ... fall through ... */
162 case OPT_gnat:
163 case OPT_gnatO:
164 case OPT_fRTS_:
165 case OPT_I:
166 case OPT_nostdinc:
167 case OPT_nostdlib:
168 /* These are handled by the front-end. */
169 break;
171 case OPT_fshort_enums:
172 case OPT_fsigned_char:
173 /* These are handled by the middle-end. */
174 break;
176 case OPT_fbuiltin_printf:
177 /* This is ignored in Ada but needs to be accepted so it can be
178 defaulted. */
179 break;
181 default:
182 gcc_unreachable ();
185 Ada_handle_option_auto (&global_options, &global_options_set,
186 scode, arg, value,
187 gnat_option_lang_mask (), kind, loc,
188 handlers, global_dc);
189 return true;
192 /* Initialize options structure OPTS. */
194 static void
195 gnat_init_options_struct (struct gcc_options *opts)
197 /* Uninitialized really means uninitialized in Ada. */
198 opts->x_flag_zero_initialized_in_bss = 0;
200 /* We don't care about errno in Ada and it causes __builtin_sqrt to
201 call the libm function rather than do it inline. */
202 opts->x_flag_errno_math = 0;
203 opts->frontend_set_flag_errno_math = true;
206 /* Initialize for option processing. */
208 static void
209 gnat_init_options (unsigned int decoded_options_count,
210 struct cl_decoded_option *decoded_options)
212 /* Reconstruct an argv array for use of back_end.adb.
214 ??? back_end.adb should not rely on this; instead, it should work with
215 decoded options without such reparsing, to ensure consistency in how
216 options are decoded. */
217 save_argv = XNEWVEC (const char *, 2 * decoded_options_count + 1);
218 save_argc = 0;
219 for (unsigned int i = 0; i < decoded_options_count; i++)
221 size_t num_elements = decoded_options[i].canonical_option_num_elements;
223 if (decoded_options[i].errors
224 || decoded_options[i].opt_index == OPT_SPECIAL_unknown
225 || num_elements == 0)
226 continue;
228 /* Deal with -I- specially since it must be a single switch. */
229 if (decoded_options[i].opt_index == OPT_I
230 && num_elements == 2
231 && decoded_options[i].canonical_option[1][0] == '-'
232 && decoded_options[i].canonical_option[1][1] == '\0')
233 save_argv[save_argc++] = "-I-";
234 else
236 gcc_assert (num_elements >= 1 && num_elements <= 2);
237 save_argv[save_argc++] = decoded_options[i].canonical_option[0];
238 if (num_elements >= 2)
239 save_argv[save_argc++] = decoded_options[i].canonical_option[1];
242 save_argv[save_argc] = NULL;
244 /* Pass just the name of the command through the regular channel. */
245 gnat_argv = (const char **) xmalloc (sizeof (char *));
246 gnat_argv[0] = xstrdup (save_argv[0]);
247 gnat_argc = 1;
250 /* Settings adjustments after switches processing by the back-end.
251 Note that the front-end switches processing (Scan_Compiler_Arguments)
252 has not been done yet at this point! */
254 static bool
255 gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
257 /* Excess precision other than "fast" requires front-end support. */
258 if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD)
259 sorry ("-fexcess-precision=standard for Ada");
260 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
262 /* No psABI change warnings for Ada. */
263 warn_psabi = 0;
265 /* No return type warnings for Ada. */
266 warn_return_type = 0;
268 /* No string overflow warnings for Ada. */
269 warn_stringop_overflow = 0;
271 /* No caret by default for Ada. */
272 if (!global_options_set.x_flag_diagnostics_show_caret)
273 global_dc->show_caret = false;
275 /* Warn only if STABS is not the default: we don't want to emit a warning if
276 the user did not use a -gstabs option. */
277 if (PREFERRED_DEBUGGING_TYPE != DBX_DEBUG && write_symbols == DBX_DEBUG)
278 warning (0, "STABS debugging information for Ada is obsolete and not "
279 "supported anymore");
281 /* Copy global settings to local versions. */
282 gnat_encodings = global_options.x_gnat_encodings;
283 optimize = global_options.x_optimize;
284 optimize_size = global_options.x_optimize_size;
285 flag_compare_debug = global_options.x_flag_compare_debug;
286 flag_stack_check = global_options.x_flag_stack_check;
287 flag_short_enums = global_options.x_flag_short_enums;
289 /* Unfortunately the post_options hook is called before the value of
290 flag_short_enums is autodetected, if need be. Mimic the process
291 for our private flag_short_enums. */
292 if (flag_short_enums == 2)
293 flag_short_enums = targetm.default_short_enums ();
295 return false;
298 /* Here is the function to handle the compiler error processing in GCC. */
300 static void
301 internal_error_function (diagnostic_context *context, const char *msgid,
302 va_list *ap)
304 text_info tinfo;
305 char *buffer, *p, *loc;
306 String_Template temp, temp_loc;
307 String_Pointer sp, sp_loc;
308 expanded_location xloc;
310 /* Warn if plugins present. */
311 warn_if_plugins ();
313 /* Reset the pretty-printer. */
314 pp_clear_output_area (context->printer);
316 /* Format the message into the pretty-printer. */
317 tinfo.format_spec = msgid;
318 tinfo.args_ptr = ap;
319 tinfo.err_no = errno;
320 pp_format_verbatim (context->printer, &tinfo);
322 /* Extract a (writable) pointer to the formatted text. */
323 buffer = xstrdup (pp_formatted_text (context->printer));
325 /* Go up to the first newline. */
326 for (p = buffer; *p; p++)
327 if (*p == '\n')
329 *p = '\0';
330 break;
333 temp.Low_Bound = 1;
334 temp.High_Bound = p - buffer;
335 sp.Bounds = &temp;
336 sp.Array = buffer;
338 xloc = expand_location (input_location);
339 if (context->show_column && xloc.column != 0)
340 loc = xasprintf ("%s:%d:%d", xloc.file, xloc.line, xloc.column);
341 else
342 loc = xasprintf ("%s:%d", xloc.file, xloc.line);
343 temp_loc.Low_Bound = 1;
344 temp_loc.High_Bound = strlen (loc);
345 sp_loc.Bounds = &temp_loc;
346 sp_loc.Array = loc;
348 Current_Error_Node = error_gnat_node;
349 Compiler_Abort (sp, sp_loc, true);
352 /* Perform all the initialization steps that are language-specific. */
354 static bool
355 gnat_init (void)
357 /* Do little here, most of the standard declarations are set up after the
358 front-end has been run. Use the same `char' as C for Interfaces.C. */
359 build_common_tree_nodes (flag_signed_char);
361 /* In Ada, we use an unsigned 8-bit type for the default boolean type. */
362 boolean_type_node = make_unsigned_type (8);
363 TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
364 SET_TYPE_RM_MAX_VALUE (boolean_type_node,
365 build_int_cst (boolean_type_node, 1));
366 SET_TYPE_RM_SIZE (boolean_type_node, bitsize_int (1));
367 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
368 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
370 sbitsize_one_node = sbitsize_int (1);
371 sbitsize_unit_node = sbitsize_int (BITS_PER_UNIT);
373 /* Register our internal error function. */
374 global_dc->internal_error = &internal_error_function;
376 return true;
379 /* Initialize the GCC support for exception handling. */
381 void
382 gnat_init_gcc_eh (void)
384 /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
385 though. This could for instance lead to the emission of tables with
386 references to symbols (such as the Ada eh personality routine) within
387 libraries we won't link against. */
388 if (No_Exception_Handlers_Set ())
389 return;
391 /* Tell GCC we are handling cleanup actions through exception propagation.
392 This opens possibilities that we don't take advantage of yet, but is
393 nonetheless necessary to ensure that fixup code gets assigned to the
394 right exception regions. */
395 using_eh_for_cleanups ();
397 /* Turn on -fexceptions, -fnon-call-exceptions and -fdelete-dead-exceptions.
398 The first one triggers the generation of the necessary exception tables.
399 The second one is useful for two reasons: 1/ we map some asynchronous
400 signals like SEGV to exceptions, so we need to ensure that the insns
401 which can lead to such signals are correctly attached to the exception
402 region they pertain to, 2/ some calls to pure subprograms are handled as
403 libcall blocks and then marked as "cannot trap" if the flag is not set
404 (see emit_libcall_block). We should not let this be since it is possible
405 for such calls to actually raise in Ada.
406 The third one is an optimization that makes it possible to delete dead
407 instructions that may throw exceptions, most notably loads and stores,
408 as permitted in Ada. */
409 flag_exceptions = 1;
410 flag_non_call_exceptions = 1;
411 flag_delete_dead_exceptions = 1;
413 init_eh ();
416 /* Initialize the GCC support for floating-point operations. */
418 void
419 gnat_init_gcc_fp (void)
421 /* Disable FP optimizations that ignore the signedness of zero if
422 S'Signed_Zeros is true, but don't override the user if not. */
423 if (Signed_Zeros_On_Target)
424 flag_signed_zeros = 1;
425 else if (!global_options_set.x_flag_signed_zeros)
426 flag_signed_zeros = 0;
428 /* Assume that FP operations can trap if S'Machine_Overflow is true,
429 but don't override the user if not. */
430 if (Machine_Overflows_On_Target)
431 flag_trapping_math = 1;
432 else if (!global_options_set.x_flag_trapping_math)
433 flag_trapping_math = 0;
436 /* Print language-specific items in declaration NODE. */
438 static void
439 gnat_print_decl (FILE *file, tree node, int indent)
441 switch (TREE_CODE (node))
443 case CONST_DECL:
444 print_node (file, "corresponding var",
445 DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
446 break;
448 case FIELD_DECL:
449 print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
450 indent + 4);
451 break;
453 case VAR_DECL:
454 if (DECL_LOOP_PARM_P (node))
455 print_node (file, "induction var", DECL_INDUCTION_VAR (node),
456 indent + 4);
457 else
458 print_node (file, "renamed object", DECL_RENAMED_OBJECT (node),
459 indent + 4);
460 break;
462 default:
463 break;
467 /* Print language-specific items in type NODE. */
469 static void
470 gnat_print_type (FILE *file, tree node, int indent)
472 switch (TREE_CODE (node))
474 case FUNCTION_TYPE:
475 print_node (file, "ci/co list", TYPE_CI_CO_LIST (node), indent + 4);
476 break;
478 case INTEGER_TYPE:
479 if (TYPE_MODULAR_P (node))
480 print_node_brief (file, "modulus", TYPE_MODULUS (node), indent + 4);
481 else if (TYPE_FIXED_POINT_P (node))
482 print_node (file, "scale factor", TYPE_SCALE_FACTOR (node),
483 indent + 4);
484 else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
485 print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
486 indent + 4);
487 else
488 print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);
490 /* ... fall through ... */
492 case ENUMERAL_TYPE:
493 case BOOLEAN_TYPE:
494 print_node_brief (file, "RM size", TYPE_RM_SIZE (node), indent + 4);
496 /* ... fall through ... */
498 case REAL_TYPE:
499 print_node_brief (file, "RM min", TYPE_RM_MIN_VALUE (node), indent + 4);
500 print_node_brief (file, "RM max", TYPE_RM_MAX_VALUE (node), indent + 4);
501 break;
503 case ARRAY_TYPE:
504 print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
505 break;
507 case VECTOR_TYPE:
508 print_node (file,"representative array",
509 TYPE_REPRESENTATIVE_ARRAY (node), indent + 4);
510 break;
512 case RECORD_TYPE:
513 if (TYPE_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
514 print_node (file, "unconstrained array",
515 TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
516 else
517 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
518 break;
520 case UNION_TYPE:
521 case QUAL_UNION_TYPE:
522 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
523 break;
525 default:
526 break;
529 if (TYPE_CAN_HAVE_DEBUG_TYPE_P (node) && TYPE_DEBUG_TYPE (node))
530 print_node_brief (file, "debug type", TYPE_DEBUG_TYPE (node), indent + 4);
532 if (TYPE_IMPL_PACKED_ARRAY_P (node) && TYPE_ORIGINAL_PACKED_ARRAY (node))
533 print_node_brief (file, "original packed array",
534 TYPE_ORIGINAL_PACKED_ARRAY (node), indent + 4);
537 /* Return the name to be printed for DECL. */
539 static const char *
540 gnat_printable_name (tree decl, int verbosity)
542 const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
543 char *ada_name = (char *) ggc_alloc_atomic (strlen (coded_name) * 2 + 60);
545 __gnat_decode (coded_name, ada_name, 0);
547 if (verbosity == 2 && !DECL_IS_BUILTIN (decl))
549 Set_Identifier_Casing (ada_name, DECL_SOURCE_FILE (decl));
550 return ggc_strdup (Name_Buffer);
553 return ada_name;
556 /* Return the name to be used in DWARF debug info for DECL. */
558 static const char *
559 gnat_dwarf_name (tree decl, int verbosity ATTRIBUTE_UNUSED)
561 gcc_assert (DECL_P (decl));
562 return (const char *) IDENTIFIER_POINTER (DECL_NAME (decl));
565 /* Return the descriptive type associated with TYPE, if any. */
567 static tree
568 gnat_descriptive_type (const_tree type)
570 if (TYPE_STUB_DECL (type))
571 return DECL_PARALLEL_TYPE (TYPE_STUB_DECL (type));
572 else
573 return NULL_TREE;
576 /* Return the underlying base type of an enumeration type. */
578 static tree
579 gnat_enum_underlying_base_type (const_tree)
581 /* Enumeration types are base types in Ada. */
582 return void_type_node;
585 /* Return the type to be used for debugging information instead of TYPE or
586 NULL_TREE if TYPE is fine. */
588 static tree
589 gnat_get_debug_type (const_tree type)
591 if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) && TYPE_DEBUG_TYPE (type))
593 type = TYPE_DEBUG_TYPE (type);
595 /* ??? The get_debug_type language hook is processed after the array
596 descriptor language hook, so if there is an array behind this type,
597 the latter is supposed to handle it. Still, we can get here with
598 a type we are not supposed to handle (e.g. when the DWARF back-end
599 processes the type of a variable), so keep this guard. */
600 if (type && TYPE_CAN_HAVE_DEBUG_TYPE_P (type))
601 return const_cast<tree> (type);
604 return NULL_TREE;
607 /* Provide information in INFO for debugging output about the TYPE fixed-point
608 type. Return whether TYPE is handled. */
610 static bool
611 gnat_get_fixed_point_type_info (const_tree type,
612 struct fixed_point_type_info *info)
614 tree scale_factor;
616 /* GDB cannot handle fixed-point types yet, so rely on GNAT encodings
617 instead for it. */
618 if (!TYPE_IS_FIXED_POINT_P (type)
619 || gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
620 return false;
622 scale_factor = TYPE_SCALE_FACTOR (type);
624 /* We expect here only a finite set of pattern. See fixed-point types
625 handling in gnat_to_gnu_entity. */
627 /* Put invalid values when compiler internals cannot represent the scale
628 factor. */
629 if (scale_factor == integer_zero_node)
631 info->scale_factor_kind = fixed_point_scale_factor_arbitrary;
632 info->scale_factor.arbitrary.numerator = 0;
633 info->scale_factor.arbitrary.denominator = 0;
634 return true;
637 if (TREE_CODE (scale_factor) == RDIV_EXPR)
639 const tree num = TREE_OPERAND (scale_factor, 0);
640 const tree den = TREE_OPERAND (scale_factor, 1);
642 /* See if we have a binary or decimal scale. */
643 if (TREE_CODE (den) == POWER_EXPR)
645 const tree base = TREE_OPERAND (den, 0);
646 const tree exponent = TREE_OPERAND (den, 1);
648 /* We expect the scale factor to be 1 / 2 ** N or 1 / 10 ** N. */
649 gcc_assert (num == integer_one_node
650 && TREE_CODE (base) == INTEGER_CST
651 && TREE_CODE (exponent) == INTEGER_CST);
653 switch (tree_to_shwi (base))
655 case 2:
656 info->scale_factor_kind = fixed_point_scale_factor_binary;
657 info->scale_factor.binary = -tree_to_shwi (exponent);
658 return true;
660 case 10:
661 info->scale_factor_kind = fixed_point_scale_factor_decimal;
662 info->scale_factor.decimal = -tree_to_shwi (exponent);
663 return true;
665 default:
666 gcc_unreachable ();
670 /* If we reach this point, we are handling an arbitrary scale factor. We
671 expect N / D with constant operands. */
672 gcc_assert (TREE_CODE (num) == INTEGER_CST
673 && TREE_CODE (den) == INTEGER_CST);
675 info->scale_factor_kind = fixed_point_scale_factor_arbitrary;
676 info->scale_factor.arbitrary.numerator = tree_to_uhwi (num);
677 info->scale_factor.arbitrary.denominator = tree_to_shwi (den);
678 return true;
681 gcc_unreachable ();
684 /* Return true if types T1 and T2 are identical for type hashing purposes.
685 Called only after doing all language independent checks. At present,
686 this function is only called when both types are FUNCTION_TYPE. */
688 static bool
689 gnat_type_hash_eq (const_tree t1, const_tree t2)
691 gcc_assert (TREE_CODE (t1) == FUNCTION_TYPE);
692 return fntype_same_flags_p (t1, TYPE_CI_CO_LIST (t2),
693 TYPE_RETURN_UNCONSTRAINED_P (t2),
694 TYPE_RETURN_BY_DIRECT_REF_P (t2),
695 TREE_ADDRESSABLE (t2));
698 /* Do nothing (return the tree node passed). */
700 static tree
701 gnat_return_tree (tree t)
703 return t;
706 /* Get the alias set corresponding to a type or expression. */
708 static alias_set_type
709 gnat_get_alias_set (tree type)
711 /* If this is a padding type, use the type of the first field. */
712 if (TYPE_IS_PADDING_P (type))
713 return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
715 /* If the type is an unconstrained array, use the type of the
716 self-referential array we make. */
717 else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
718 return
719 get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
721 /* If the type can alias any other types, return the alias set 0. */
722 else if (TYPE_P (type)
723 && !TYPE_IS_DUMMY_P (type)
724 && TYPE_UNIVERSAL_ALIASING_P (type))
725 return 0;
727 return -1;
730 /* GNU_TYPE is a type. Return its maximum size in bytes, if known,
731 as a constant when possible. */
733 static tree
734 gnat_type_max_size (const_tree gnu_type)
736 /* First see what we can get from TYPE_SIZE_UNIT, which might not
737 be constant even for simple expressions if it has already been
738 elaborated and possibly replaced by a VAR_DECL. */
739 tree max_unitsize = max_size (TYPE_SIZE_UNIT (gnu_type), true);
741 /* If we don't have a constant, try to look at attributes which should have
742 stayed untouched. */
743 if (!tree_fits_uhwi_p (max_unitsize))
745 /* For record types, see what we can get from TYPE_ADA_SIZE. */
746 if (RECORD_OR_UNION_TYPE_P (gnu_type)
747 && !TYPE_FAT_POINTER_P (gnu_type)
748 && TYPE_ADA_SIZE (gnu_type))
750 tree max_adasize = max_size (TYPE_ADA_SIZE (gnu_type), true);
752 /* If we have succeeded in finding a constant, round it up to the
753 type's alignment and return the result in units. */
754 if (tree_fits_uhwi_p (max_adasize))
755 max_unitsize
756 = size_binop (CEIL_DIV_EXPR,
757 round_up (max_adasize, TYPE_ALIGN (gnu_type)),
758 bitsize_unit_node);
761 /* For array types, see what we can get from TYPE_INDEX_TYPE. */
762 else if (TREE_CODE (gnu_type) == ARRAY_TYPE
763 && TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))
764 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (gnu_type))))
766 tree lb = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
767 tree hb = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
768 if (TREE_CODE (lb) != INTEGER_CST
769 && TYPE_RM_SIZE (TREE_TYPE (lb))
770 && compare_tree_int (TYPE_RM_SIZE (TREE_TYPE (lb)), 16) <= 0)
771 lb = TYPE_MIN_VALUE (TREE_TYPE (lb));
772 if (TREE_CODE (hb) != INTEGER_CST
773 && TYPE_RM_SIZE (TREE_TYPE (hb))
774 && compare_tree_int (TYPE_RM_SIZE (TREE_TYPE (hb)), 16) <= 0)
775 hb = TYPE_MAX_VALUE (TREE_TYPE (hb));
776 if (TREE_CODE (lb) == INTEGER_CST && TREE_CODE (hb) == INTEGER_CST)
778 tree ctype = get_base_type (TREE_TYPE (lb));
779 lb = fold_convert (ctype, lb);
780 hb = fold_convert (ctype, hb);
781 if (tree_int_cst_le (lb, hb))
783 tree length
784 = fold_build2 (PLUS_EXPR, ctype,
785 fold_build2 (MINUS_EXPR, ctype, hb, lb),
786 build_int_cst (ctype, 1));
787 max_unitsize
788 = fold_build2 (MULT_EXPR, sizetype,
789 fold_convert (sizetype, length),
790 TYPE_SIZE_UNIT (TREE_TYPE (gnu_type)));
796 return max_unitsize;
799 static tree get_array_bit_stride (tree);
801 /* Provide information in INFO for debug output about the TYPE array type.
802 Return whether TYPE is handled. */
804 static bool
805 gnat_get_array_descr_info (const_tree const_type,
806 struct array_descr_info *info)
808 bool convention_fortran_p;
809 bool is_array = false;
810 bool is_fat_ptr = false;
811 bool is_packed_array = false;
812 tree type = const_cast<tree> (const_type);
813 const_tree first_dimen = NULL_TREE;
814 const_tree last_dimen = NULL_TREE;
815 const_tree dimen;
816 int i;
818 /* Temporaries created in the first pass and used in the second one for thin
819 pointers. The first one is an expression that yields the template record
820 from the base address (i.e. the PLACEHOLDER_EXPR). The second one is just
821 a cursor through this record's fields. */
822 tree thinptr_template_expr = NULL_TREE;
823 tree thinptr_bound_field = NULL_TREE;
825 /* ??? See gnat_get_debug_type. */
826 type = maybe_debug_type (type);
828 /* If we have an implementation type for a packed array, get the orignial
829 array type. */
830 if (TYPE_IMPL_PACKED_ARRAY_P (type) && TYPE_ORIGINAL_PACKED_ARRAY (type))
832 type = TYPE_ORIGINAL_PACKED_ARRAY (type);
833 is_packed_array = true;
836 /* First pass: gather all information about this array except everything
837 related to dimensions. */
839 /* Only handle ARRAY_TYPE nodes that come from GNAT. */
840 if (TREE_CODE (type) == ARRAY_TYPE
841 && TYPE_DOMAIN (type)
842 && TYPE_INDEX_TYPE (TYPE_DOMAIN (type)))
844 is_array = true;
845 first_dimen = type;
846 info->data_location = NULL_TREE;
849 else if (TYPE_IS_FAT_POINTER_P (type)
850 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
852 const tree ua_type = TYPE_UNCONSTRAINED_ARRAY (type);
854 /* This will be our base object address. */
855 const tree placeholder_expr = build0 (PLACEHOLDER_EXPR, type);
857 /* We assume below that maybe_unconstrained_array returns an INDIRECT_REF
858 node. */
859 const tree ua_val
860 = maybe_unconstrained_array (build_unary_op (INDIRECT_REF,
861 ua_type,
862 placeholder_expr));
864 is_fat_ptr = true;
865 first_dimen = TREE_TYPE (ua_val);
867 /* Get the *address* of the array, not the array itself. */
868 info->data_location = TREE_OPERAND (ua_val, 0);
871 /* Unlike fat pointers (which appear for unconstrained arrays passed in
872 argument), thin pointers are used only for array access types, so we want
873 them to appear in the debug info as pointers to an array type. That's why
874 we match only the RECORD_TYPE here instead of the POINTER_TYPE with the
875 TYPE_IS_THIN_POINTER_P predicate. */
876 else if (TREE_CODE (type) == RECORD_TYPE
877 && TYPE_CONTAINS_TEMPLATE_P (type)
878 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
880 /* This will be our base object address. Note that we assume that
881 pointers to these will actually point to the array field (thin
882 pointers are shifted). */
883 const tree placeholder_expr = build0 (PLACEHOLDER_EXPR, type);
884 const tree placeholder_addr
885 = build_unary_op (ADDR_EXPR, NULL_TREE, placeholder_expr);
887 const tree bounds_field = TYPE_FIELDS (type);
888 const tree bounds_type = TREE_TYPE (bounds_field);
889 const tree array_field = DECL_CHAIN (bounds_field);
890 const tree array_type = TREE_TYPE (array_field);
892 /* Shift the thin pointer address to get the address of the template. */
893 const tree shift_amount
894 = fold_build1 (NEGATE_EXPR, sizetype, byte_position (array_field));
895 tree template_addr
896 = build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (placeholder_addr),
897 placeholder_addr, shift_amount);
898 template_addr
899 = fold_convert (TYPE_POINTER_TO (bounds_type), template_addr);
901 first_dimen = array_type;
903 /* The thin pointer is already the pointer to the array data, so there's
904 no need for a specific "data location" expression. */
905 info->data_location = NULL_TREE;
907 thinptr_template_expr = build_unary_op (INDIRECT_REF,
908 bounds_type,
909 template_addr);
910 thinptr_bound_field = TYPE_FIELDS (bounds_type);
912 else
913 return false;
915 /* Second pass: compute the remaining information: dimensions and
916 corresponding bounds. */
918 if (TYPE_PACKED (first_dimen))
919 is_packed_array = true;
920 /* If this array has fortran convention, it's arranged in column-major
921 order, so our view here has reversed dimensions. */
922 convention_fortran_p = TYPE_CONVENTION_FORTRAN_P (first_dimen);
923 /* ??? For row major ordering, we probably want to emit nothing and
924 instead specify it as the default in Dw_TAG_compile_unit. */
925 info->ordering = (convention_fortran_p
926 ? array_descr_ordering_column_major
927 : array_descr_ordering_row_major);
929 /* Count how many dimensions this array has. */
930 for (i = 0, dimen = first_dimen; ; ++i, dimen = TREE_TYPE (dimen))
932 if (i > 0
933 && (TREE_CODE (dimen) != ARRAY_TYPE
934 || !TYPE_MULTI_ARRAY_P (dimen)))
935 break;
936 last_dimen = dimen;
939 info->ndimensions = i;
940 info->rank = NULL_TREE;
942 /* Too many dimensions? Give up generating proper description: yield instead
943 nested arrays. Note that in this case, this hook is invoked once on each
944 intermediate array type: be consistent and output nested arrays for all
945 dimensions. */
946 if (info->ndimensions > DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
947 || TYPE_MULTI_ARRAY_P (first_dimen))
949 info->ndimensions = 1;
950 last_dimen = first_dimen;
953 info->element_type = TREE_TYPE (last_dimen);
955 /* Now iterate over all dimensions in source-order and fill the info
956 structure. */
957 for (i = (convention_fortran_p ? info->ndimensions - 1 : 0),
958 dimen = first_dimen;
959 IN_RANGE (i, 0, info->ndimensions - 1);
960 i += (convention_fortran_p ? -1 : 1),
961 dimen = TREE_TYPE (dimen))
963 /* We are interested in the stored bounds for the debug info. */
964 tree index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (dimen));
966 if (is_array || is_fat_ptr)
968 /* GDB does not handle very well the self-referencial bound
969 expressions we are able to generate here for XUA types (they are
970 used only by XUP encodings) so avoid them in this case. Note that
971 there are two cases where we generate self-referencial bound
972 expressions: arrays that are constrained by record discriminants
973 and XUA types. */
974 if (TYPE_CONTEXT (first_dimen)
975 && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
976 && CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (index_type))
977 && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
979 info->dimen[i].lower_bound = NULL_TREE;
980 info->dimen[i].upper_bound = NULL_TREE;
982 else
984 info->dimen[i].lower_bound
985 = maybe_character_value (TYPE_MIN_VALUE (index_type));
986 info->dimen[i].upper_bound
987 = maybe_character_value (TYPE_MAX_VALUE (index_type));
991 /* This is a thin pointer. */
992 else
994 info->dimen[i].lower_bound
995 = build_component_ref (thinptr_template_expr, thinptr_bound_field,
996 false);
997 thinptr_bound_field = DECL_CHAIN (thinptr_bound_field);
999 info->dimen[i].upper_bound
1000 = build_component_ref (thinptr_template_expr, thinptr_bound_field,
1001 false);
1002 thinptr_bound_field = DECL_CHAIN (thinptr_bound_field);
1005 /* The DWARF back-end will output BOUNDS_TYPE as the base type of
1006 the array index, so get to the base type of INDEX_TYPE. */
1007 while (TREE_TYPE (index_type))
1008 index_type = TREE_TYPE (index_type);
1010 info->dimen[i].bounds_type = maybe_debug_type (index_type);
1011 info->dimen[i].stride = NULL_TREE;
1014 /* These are Fortran-specific fields. They make no sense here. */
1015 info->allocated = NULL_TREE;
1016 info->associated = NULL_TREE;
1018 if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
1020 /* When arrays contain dynamically-sized elements, we usually wrap them
1021 in padding types, or we create constrained types for them. Then, if
1022 such types are stripped in the debugging information output, the
1023 debugger needs a way to know the size that is reserved for each
1024 element. This is why we emit a stride in such situations. */
1025 tree source_element_type = info->element_type;
1027 while (true)
1029 if (TYPE_DEBUG_TYPE (source_element_type))
1030 source_element_type = TYPE_DEBUG_TYPE (source_element_type);
1031 else if (TYPE_IS_PADDING_P (source_element_type))
1032 source_element_type
1033 = TREE_TYPE (TYPE_FIELDS (source_element_type));
1034 else
1035 break;
1038 if (TREE_CODE (TYPE_SIZE_UNIT (source_element_type)) != INTEGER_CST)
1040 info->stride = TYPE_SIZE_UNIT (info->element_type);
1041 info->stride_in_bits = false;
1044 /* We need to specify a bit stride when it does not correspond to the
1045 natural size of the contained elements. ??? Note that we do not
1046 support packed records and nested packed arrays. */
1047 else if (is_packed_array)
1049 info->stride = get_array_bit_stride (info->element_type);
1050 info->stride_in_bits = true;
1054 return true;
1057 /* Given the component type COMP_TYPE of a packed array, return an expression
1058 that computes the bit stride of this packed array. Return NULL_TREE when
1059 unsuccessful. */
1061 static tree
1062 get_array_bit_stride (tree comp_type)
1064 struct array_descr_info info;
1065 tree stride;
1067 /* Simple case: the array contains an integral type: return its RM size. */
1068 if (INTEGRAL_TYPE_P (comp_type))
1069 return TYPE_RM_SIZE (comp_type);
1071 /* Otherwise, see if this is an array we can analyze; if it's not, punt. */
1072 memset (&info, 0, sizeof (info));
1073 if (!gnat_get_array_descr_info (comp_type, &info) || !info.stride)
1074 return NULL_TREE;
1076 /* Otherwise, the array stride is the inner array's stride multiplied by the
1077 number of elements it contains. Note that if the inner array is not
1078 packed, then the stride is "natural" and thus does not deserve an
1079 attribute. */
1080 stride = info.stride;
1081 if (!info.stride_in_bits)
1083 stride = fold_convert (bitsizetype, stride);
1084 stride = build_binary_op (MULT_EXPR, bitsizetype,
1085 stride, build_int_cst (bitsizetype, 8));
1088 for (int i = 0; i < info.ndimensions; ++i)
1090 tree count;
1092 if (!info.dimen[i].lower_bound || !info.dimen[i].upper_bound)
1093 return NULL_TREE;
1095 /* Put in count an expression that computes the length of this
1096 dimension. */
1097 count = build_binary_op (MINUS_EXPR, sbitsizetype,
1098 fold_convert (sbitsizetype,
1099 info.dimen[i].upper_bound),
1100 fold_convert (sbitsizetype,
1101 info.dimen[i].lower_bound)),
1102 count = build_binary_op (PLUS_EXPR, sbitsizetype,
1103 count, build_int_cst (sbitsizetype, 1));
1104 count = build_binary_op (MAX_EXPR, sbitsizetype,
1105 count,
1106 build_int_cst (sbitsizetype, 0));
1107 count = fold_convert (bitsizetype, count);
1108 stride = build_binary_op (MULT_EXPR, bitsizetype, stride, count);
1111 return stride;
1114 /* GNU_TYPE is a subtype of an integral type. Set LOWVAL to the low bound
1115 and HIGHVAL to the high bound, respectively. */
1117 static void
1118 gnat_get_subrange_bounds (const_tree gnu_type, tree *lowval, tree *highval)
1120 *lowval = TYPE_MIN_VALUE (gnu_type);
1121 *highval = TYPE_MAX_VALUE (gnu_type);
1124 /* Return the bias of GNU_TYPE, if any. */
1126 static tree
1127 gnat_get_type_bias (const_tree gnu_type)
1129 if (TREE_CODE (gnu_type) == INTEGER_TYPE
1130 && TYPE_BIASED_REPRESENTATION_P (gnu_type)
1131 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
1132 return TYPE_RM_MIN_VALUE (gnu_type);
1134 return NULL_TREE;
1137 /* GNU_TYPE is the type of a subprogram parameter. Determine if it should be
1138 passed by reference by default. */
1140 bool
1141 default_pass_by_ref (tree gnu_type)
1143 /* We pass aggregates by reference if they are sufficiently large for
1144 their alignment. The ratio is somewhat arbitrary. We also pass by
1145 reference if the target machine would either pass or return by
1146 reference. Strictly speaking, we need only check the return if this
1147 is an In Out parameter, but it's probably best to err on the side of
1148 passing more things by reference. */
1150 if (AGGREGATE_TYPE_P (gnu_type)
1151 && (!valid_constant_size_p (TYPE_SIZE_UNIT (gnu_type))
1152 || compare_tree_int (TYPE_SIZE_UNIT (gnu_type),
1153 TYPE_ALIGN (gnu_type)) > 0))
1154 return true;
1156 if (pass_by_reference (NULL, TYPE_MODE (gnu_type), gnu_type, true))
1157 return true;
1159 if (targetm.calls.return_in_memory (gnu_type, NULL_TREE))
1160 return true;
1162 return false;
1165 /* GNU_TYPE is the type of a subprogram parameter. Determine if it must be
1166 passed by reference. */
1168 bool
1169 must_pass_by_ref (tree gnu_type)
1171 /* We pass only unconstrained objects, those required by the language
1172 to be passed by reference, and objects of variable size. The latter
1173 is more efficient, avoids problems with variable size temporaries,
1174 and does not produce compatibility problems with C, since C does
1175 not have such objects. */
1176 return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
1177 || TYPE_IS_BY_REFERENCE_P (gnu_type)
1178 || (TYPE_SIZE_UNIT (gnu_type)
1179 && TREE_CODE (TYPE_SIZE_UNIT (gnu_type)) != INTEGER_CST));
1182 /* This function is called by the front-end to enumerate all the supported
1183 modes for the machine, as well as some predefined C types. F is a function
1184 which is called back with the parameters as listed below, first a string,
1185 then seven ints. The name is any arbitrary null-terminated string and has
1186 no particular significance, except for the case of predefined C types, where
1187 it should be the name of the C type. For integer types, only signed types
1188 should be listed, unsigned versions are assumed. The order of types should
1189 be in order of preference, with the smallest/cheapest types first.
1191 In particular, C predefined types should be listed before other types,
1192 binary floating point types before decimal ones, and narrower/cheaper
1193 type versions before more expensive ones. In type selection the first
1194 matching variant will be used.
1196 NAME pointer to first char of type name
1197 DIGS number of decimal digits for floating-point modes, else 0
1198 COMPLEX_P nonzero is this represents a complex mode
1199 COUNT count of number of items, nonzero for vector mode
1200 FLOAT_REP Float_Rep_Kind for FP, otherwise undefined
1201 PRECISION number of bits used to store data
1202 SIZE number of bits occupied by the mode
1203 ALIGN number of bits to which mode is aligned. */
1205 void
1206 enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int))
1208 const tree c_types[]
1209 = { float_type_node, double_type_node, long_double_type_node };
1210 const char *const c_names[]
1211 = { "float", "double", "long double" };
1212 int iloop;
1214 /* We are going to compute it below. */
1215 fp_arith_may_widen = false;
1217 for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++)
1219 machine_mode i = (machine_mode) iloop;
1220 machine_mode inner_mode = i;
1221 bool float_p = false;
1222 bool complex_p = false;
1223 bool vector_p = false;
1224 bool skip_p = false;
1225 int digs = 0;
1226 unsigned int nameloop;
1227 Float_Rep_Kind float_rep = IEEE_Binary; /* Until proven otherwise */
1229 switch (GET_MODE_CLASS (i))
1231 case MODE_INT:
1232 break;
1233 case MODE_FLOAT:
1234 float_p = true;
1235 break;
1236 case MODE_COMPLEX_INT:
1237 complex_p = true;
1238 inner_mode = GET_MODE_INNER (i);
1239 break;
1240 case MODE_COMPLEX_FLOAT:
1241 float_p = true;
1242 complex_p = true;
1243 inner_mode = GET_MODE_INNER (i);
1244 break;
1245 case MODE_VECTOR_INT:
1246 vector_p = true;
1247 inner_mode = GET_MODE_INNER (i);
1248 break;
1249 case MODE_VECTOR_FLOAT:
1250 float_p = true;
1251 vector_p = true;
1252 inner_mode = GET_MODE_INNER (i);
1253 break;
1254 default:
1255 skip_p = true;
1258 if (float_p)
1260 const struct real_format *fmt = REAL_MODE_FORMAT (inner_mode);
1262 /* ??? Cope with the ghost XFmode of the ARM port. */
1263 if (!fmt)
1264 continue;
1266 /* Be conservative and consider that floating-point arithmetics may
1267 use wider intermediate results as soon as there is an extended
1268 Motorola or Intel mode supported by the machine. */
1269 if (fmt == &ieee_extended_motorola_format
1270 || fmt == &ieee_extended_intel_96_format
1271 || fmt == &ieee_extended_intel_96_round_53_format
1272 || fmt == &ieee_extended_intel_128_format)
1274 #ifdef TARGET_FPMATH_DEFAULT
1275 if (TARGET_FPMATH_DEFAULT == FPMATH_387)
1276 #endif
1277 fp_arith_may_widen = true;
1280 if (fmt->b == 2)
1281 digs = (fmt->p - 1) * 1233 / 4096; /* scale by log (2) */
1283 else if (fmt->b == 10)
1284 digs = fmt->p;
1286 else
1287 gcc_unreachable ();
1290 /* First register any C types for this mode that the front end
1291 may need to know about, unless the mode should be skipped. */
1292 if (!skip_p && !vector_p)
1293 for (nameloop = 0; nameloop < ARRAY_SIZE (c_types); nameloop++)
1295 tree type = c_types[nameloop];
1296 const char *name = c_names[nameloop];
1298 if (TYPE_MODE (type) == i)
1300 f (name, digs, complex_p, 0, float_rep, TYPE_PRECISION (type),
1301 TREE_INT_CST_LOW (TYPE_SIZE (type)), TYPE_ALIGN (type));
1302 skip_p = true;
1306 /* If no predefined C types were found, register the mode itself. */
1307 int nunits, precision, bitsize;
1308 if (!skip_p
1309 && GET_MODE_NUNITS (i).is_constant (&nunits)
1310 && GET_MODE_PRECISION (i).is_constant (&precision)
1311 && GET_MODE_BITSIZE (i).is_constant (&bitsize))
1312 f (GET_MODE_NAME (i), digs, complex_p,
1313 vector_p ? nunits : 0, float_rep,
1314 precision, bitsize, GET_MODE_ALIGNMENT (i));
1318 /* Return the size of the FP mode with precision PREC. */
1321 fp_prec_to_size (int prec)
1323 opt_scalar_float_mode opt_mode;
1325 FOR_EACH_MODE_IN_CLASS (opt_mode, MODE_FLOAT)
1327 scalar_float_mode mode = opt_mode.require ();
1328 if (GET_MODE_PRECISION (mode) == prec)
1329 return GET_MODE_BITSIZE (mode);
1332 gcc_unreachable ();
1335 /* Return the precision of the FP mode with size SIZE. */
1338 fp_size_to_prec (int size)
1340 opt_scalar_float_mode opt_mode;
1342 FOR_EACH_MODE_IN_CLASS (opt_mode, MODE_FLOAT)
1344 scalar_mode mode = opt_mode.require ();
1345 if (GET_MODE_BITSIZE (mode) == size)
1346 return GET_MODE_PRECISION (mode);
1349 gcc_unreachable ();
1352 static GTY(()) tree gnat_eh_personality_decl;
1354 /* Return the GNAT personality function decl. */
1356 static tree
1357 gnat_eh_personality (void)
1359 if (!gnat_eh_personality_decl)
1360 gnat_eh_personality_decl = build_personality_function ("gnat");
1361 return gnat_eh_personality_decl;
1364 /* Initialize language-specific bits of tree_contains_struct. */
1366 static void
1367 gnat_init_ts (void)
1369 MARK_TS_COMMON (UNCONSTRAINED_ARRAY_TYPE);
1371 MARK_TS_TYPED (UNCONSTRAINED_ARRAY_REF);
1372 MARK_TS_TYPED (NULL_EXPR);
1373 MARK_TS_TYPED (PLUS_NOMOD_EXPR);
1374 MARK_TS_TYPED (MINUS_NOMOD_EXPR);
1375 MARK_TS_TYPED (POWER_EXPR);
1376 MARK_TS_TYPED (ATTR_ADDR_EXPR);
1377 MARK_TS_TYPED (STMT_STMT);
1378 MARK_TS_TYPED (LOOP_STMT);
1379 MARK_TS_TYPED (EXIT_STMT);
1382 /* Return the size of a tree with CODE, which is a language-specific tree code
1383 in category tcc_constant, tcc_exceptional or tcc_type. The default expects
1384 never to be called. */
1386 static size_t
1387 gnat_tree_size (enum tree_code code)
1389 gcc_checking_assert (code >= NUM_TREE_CODES);
1390 switch (code)
1392 case UNCONSTRAINED_ARRAY_TYPE:
1393 return sizeof (tree_type_non_common);
1394 default:
1395 gcc_unreachable ();
1399 /* Return the lang specific structure attached to NODE. Allocate it (cleared)
1400 if needed. */
1402 struct lang_type *
1403 get_lang_specific (tree node)
1405 if (!TYPE_LANG_SPECIFIC (node))
1406 TYPE_LANG_SPECIFIC (node) = ggc_cleared_alloc<struct lang_type> ();
1407 return TYPE_LANG_SPECIFIC (node);
1410 /* Definitions for our language-specific hooks. */
1412 #undef LANG_HOOKS_NAME
1413 #define LANG_HOOKS_NAME "GNU Ada"
1414 #undef LANG_HOOKS_IDENTIFIER_SIZE
1415 #define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct tree_identifier)
1416 #undef LANG_HOOKS_TREE_SIZE
1417 #define LANG_HOOKS_TREE_SIZE gnat_tree_size
1418 #undef LANG_HOOKS_INIT
1419 #define LANG_HOOKS_INIT gnat_init
1420 #undef LANG_HOOKS_OPTION_LANG_MASK
1421 #define LANG_HOOKS_OPTION_LANG_MASK gnat_option_lang_mask
1422 #undef LANG_HOOKS_INIT_OPTIONS_STRUCT
1423 #define LANG_HOOKS_INIT_OPTIONS_STRUCT gnat_init_options_struct
1424 #undef LANG_HOOKS_INIT_OPTIONS
1425 #define LANG_HOOKS_INIT_OPTIONS gnat_init_options
1426 #undef LANG_HOOKS_HANDLE_OPTION
1427 #define LANG_HOOKS_HANDLE_OPTION gnat_handle_option
1428 #undef LANG_HOOKS_POST_OPTIONS
1429 #define LANG_HOOKS_POST_OPTIONS gnat_post_options
1430 #undef LANG_HOOKS_PARSE_FILE
1431 #define LANG_HOOKS_PARSE_FILE gnat_parse_file
1432 #undef LANG_HOOKS_TYPE_HASH_EQ
1433 #define LANG_HOOKS_TYPE_HASH_EQ gnat_type_hash_eq
1434 #undef LANG_HOOKS_GETDECLS
1435 #define LANG_HOOKS_GETDECLS hook_tree_void_null
1436 #undef LANG_HOOKS_PUSHDECL
1437 #define LANG_HOOKS_PUSHDECL gnat_return_tree
1438 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
1439 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL hook_bool_const_tree_false
1440 #undef LANG_HOOKS_GET_ALIAS_SET
1441 #define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
1442 #undef LANG_HOOKS_PRINT_DECL
1443 #define LANG_HOOKS_PRINT_DECL gnat_print_decl
1444 #undef LANG_HOOKS_PRINT_TYPE
1445 #define LANG_HOOKS_PRINT_TYPE gnat_print_type
1446 #undef LANG_HOOKS_TYPE_MAX_SIZE
1447 #define LANG_HOOKS_TYPE_MAX_SIZE gnat_type_max_size
1448 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
1449 #define LANG_HOOKS_DECL_PRINTABLE_NAME gnat_printable_name
1450 #undef LANG_HOOKS_DWARF_NAME
1451 #define LANG_HOOKS_DWARF_NAME gnat_dwarf_name
1452 #undef LANG_HOOKS_GIMPLIFY_EXPR
1453 #define LANG_HOOKS_GIMPLIFY_EXPR gnat_gimplify_expr
1454 #undef LANG_HOOKS_TYPE_FOR_MODE
1455 #define LANG_HOOKS_TYPE_FOR_MODE gnat_type_for_mode
1456 #undef LANG_HOOKS_TYPE_FOR_SIZE
1457 #define LANG_HOOKS_TYPE_FOR_SIZE gnat_type_for_size
1458 #undef LANG_HOOKS_TYPES_COMPATIBLE_P
1459 #define LANG_HOOKS_TYPES_COMPATIBLE_P gnat_types_compatible_p
1460 #undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
1461 #define LANG_HOOKS_GET_ARRAY_DESCR_INFO gnat_get_array_descr_info
1462 #undef LANG_HOOKS_GET_SUBRANGE_BOUNDS
1463 #define LANG_HOOKS_GET_SUBRANGE_BOUNDS gnat_get_subrange_bounds
1464 #undef LANG_HOOKS_GET_TYPE_BIAS
1465 #define LANG_HOOKS_GET_TYPE_BIAS gnat_get_type_bias
1466 #undef LANG_HOOKS_DESCRIPTIVE_TYPE
1467 #define LANG_HOOKS_DESCRIPTIVE_TYPE gnat_descriptive_type
1468 #undef LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE
1469 #define LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE gnat_enum_underlying_base_type
1470 #undef LANG_HOOKS_GET_DEBUG_TYPE
1471 #define LANG_HOOKS_GET_DEBUG_TYPE gnat_get_debug_type
1472 #undef LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO
1473 #define LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO gnat_get_fixed_point_type_info
1474 #undef LANG_HOOKS_ATTRIBUTE_TABLE
1475 #define LANG_HOOKS_ATTRIBUTE_TABLE gnat_internal_attribute_table
1476 #undef LANG_HOOKS_BUILTIN_FUNCTION
1477 #define LANG_HOOKS_BUILTIN_FUNCTION gnat_builtin_function
1478 #undef LANG_HOOKS_INIT_TS
1479 #define LANG_HOOKS_INIT_TS gnat_init_ts
1480 #undef LANG_HOOKS_EH_PERSONALITY
1481 #define LANG_HOOKS_EH_PERSONALITY gnat_eh_personality
1482 #undef LANG_HOOKS_DEEP_UNSHARING
1483 #define LANG_HOOKS_DEEP_UNSHARING true
1484 #undef LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS
1485 #define LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS true
1487 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
1489 #include "gt-ada-misc.h"