]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/ada/gcc-interface/misc.c
* exp_ch2.adb (Expand_Current_Value): Make an appropriate character
[thirdparty/gcc.git] / gcc / ada / gcc-interface / misc.c
1 /****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * M I S C *
6 * *
7 * C Implementation File *
8 * *
9 * Copyright (C) 1992-2016, 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 ****************************************************************************/
25
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"
43
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"
56
57 /* This symbol needs to be defined for the front-end. */
58 void *callgraph_info_file = NULL;
59
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;
64
65 /* GNAT argc and argv generated by the binder for all Ada programs. */
66 extern int gnat_argc;
67 extern const char **gnat_argv;
68
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;
73
74 #undef optimize
75 int optimize;
76
77 #undef optimize_size
78 int optimize_size;
79
80 #undef flag_compare_debug
81 int flag_compare_debug;
82
83 #undef flag_short_enums
84 int flag_short_enums;
85
86 #undef flag_stack_check
87 enum stack_check_type flag_stack_check = NO_STACK_CHECK;
88
89 #ifdef __cplusplus
90 extern "C" {
91 #endif
92
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);
98
99 #ifdef __cplusplus
100 }
101 #endif
102
103 /* The parser for the language. For us, we process the GNAT tree. */
104
105 static void
106 gnat_parse_file (void)
107 {
108 int seh[2];
109
110 /* Call the target specific initializations. */
111 __gnat_initialize (NULL);
112
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);
117
118 /* Call the front-end elaboration procedures. */
119 adainit ();
120
121 /* Call the front end. */
122 _ada_gnat1drv ();
123
124 /* Write the global declarations. */
125 gnat_write_global_declarations ();
126 }
127
128 /* Return language mask for option processing. */
129
130 static unsigned int
131 gnat_option_lang_mask (void)
132 {
133 return CL_Ada;
134 }
135
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. */
139
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)
143 {
144 enum opt_code code = (enum opt_code) scode;
145
146 switch (code)
147 {
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, global_dc);
153 warn_uninitialized = value;
154 warn_maybe_uninitialized = value;
155 break;
156
157 case OPT_gant:
158 warning (0, "%<-gnat%> misspelled as %<-gant%>");
159
160 /* ... fall through ... */
161
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;
170
171 case OPT_fshort_enums:
172 case OPT_fsigned_char:
173 /* These are handled by the middle-end. */
174 break;
175
176 case OPT_fbuiltin_printf:
177 /* This is ignored in Ada but needs to be accepted so it can be
178 defaulted. */
179 break;
180
181 default:
182 gcc_unreachable ();
183 }
184
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;
190 }
191
192 /* Initialize options structure OPTS. */
193
194 static void
195 gnat_init_options_struct (struct gcc_options *opts)
196 {
197 /* Uninitialized really means uninitialized in Ada. */
198 opts->x_flag_zero_initialized_in_bss = 0;
199
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;
204 }
205
206 /* Initialize for option processing. */
207
208 static void
209 gnat_init_options (unsigned int decoded_options_count,
210 struct cl_decoded_option *decoded_options)
211 {
212 /* Reconstruct an argv array for use of back_end.adb.
213
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++)
220 {
221 size_t num_elements = decoded_options[i].canonical_option_num_elements;
222
223 if (decoded_options[i].errors
224 || decoded_options[i].opt_index == OPT_SPECIAL_unknown
225 || num_elements == 0)
226 continue;
227
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
235 {
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];
240 }
241 }
242 save_argv[save_argc] = NULL;
243
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;
248 }
249
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! */
253
254 static bool
255 gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
256 {
257 /* Excess precision other than "fast" requires front-end support. */
258 if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
259 && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
260 sorry ("-fexcess-precision=standard for Ada");
261 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
262
263 /* No psABI change warnings for Ada. */
264 warn_psabi = 0;
265
266 /* No caret by default for Ada. */
267 if (!global_options_set.x_flag_diagnostics_show_caret)
268 global_dc->show_caret = false;
269
270 /* Set strict overflow by default for Ada. */
271 if (!global_options_set.x_flag_strict_overflow)
272 global_options.x_flag_strict_overflow = true;
273
274 /* Warn only if STABS is not the default: we don't want to emit a warning if
275 the user did not use a -gstabs option. */
276 if (PREFERRED_DEBUGGING_TYPE != DBX_DEBUG && write_symbols == DBX_DEBUG)
277 warning (0, "STABS debugging information for Ada is obsolete and not "
278 "supported anymore");
279
280 /* Copy global settings to local versions. */
281 gnat_encodings = global_options.x_gnat_encodings;
282 optimize = global_options.x_optimize;
283 optimize_size = global_options.x_optimize_size;
284 flag_compare_debug = global_options.x_flag_compare_debug;
285 flag_stack_check = global_options.x_flag_stack_check;
286 flag_short_enums = global_options.x_flag_short_enums;
287
288 /* Unfortunately the post_options hook is called before the value of
289 flag_short_enums is autodetected, if need be. Mimic the process
290 for our private flag_short_enums. */
291 if (flag_short_enums == 2)
292 flag_short_enums = targetm.default_short_enums ();
293
294 return false;
295 }
296
297 /* Here is the function to handle the compiler error processing in GCC. */
298
299 static void
300 internal_error_function (diagnostic_context *context, const char *msgid,
301 va_list *ap)
302 {
303 text_info tinfo;
304 char *buffer, *p, *loc;
305 String_Template temp, temp_loc;
306 String_Pointer sp, sp_loc;
307 expanded_location xloc;
308
309 /* Warn if plugins present. */
310 warn_if_plugins ();
311
312 /* Reset the pretty-printer. */
313 pp_clear_output_area (context->printer);
314
315 /* Format the message into the pretty-printer. */
316 tinfo.format_spec = msgid;
317 tinfo.args_ptr = ap;
318 tinfo.err_no = errno;
319 pp_format_verbatim (context->printer, &tinfo);
320
321 /* Extract a (writable) pointer to the formatted text. */
322 buffer = xstrdup (pp_formatted_text (context->printer));
323
324 /* Go up to the first newline. */
325 for (p = buffer; *p; p++)
326 if (*p == '\n')
327 {
328 *p = '\0';
329 break;
330 }
331
332 temp.Low_Bound = 1;
333 temp.High_Bound = p - buffer;
334 sp.Bounds = &temp;
335 sp.Array = buffer;
336
337 xloc = expand_location (input_location);
338 if (context->show_column && xloc.column != 0)
339 loc = xasprintf ("%s:%d:%d", xloc.file, xloc.line, xloc.column);
340 else
341 loc = xasprintf ("%s:%d", xloc.file, xloc.line);
342 temp_loc.Low_Bound = 1;
343 temp_loc.High_Bound = strlen (loc);
344 sp_loc.Bounds = &temp_loc;
345 sp_loc.Array = loc;
346
347 Current_Error_Node = error_gnat_node;
348 Compiler_Abort (sp, sp_loc, true);
349 }
350
351 /* Perform all the initialization steps that are language-specific. */
352
353 static bool
354 gnat_init (void)
355 {
356 /* Do little here, most of the standard declarations are set up after the
357 front-end has been run. Use the same `char' as C for Interfaces.C. */
358 build_common_tree_nodes (flag_signed_char, false);
359
360 /* In Ada, we use an unsigned 8-bit type for the default boolean type. */
361 boolean_type_node = make_unsigned_type (8);
362 TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
363 SET_TYPE_RM_MAX_VALUE (boolean_type_node,
364 build_int_cst (boolean_type_node, 1));
365 SET_TYPE_RM_SIZE (boolean_type_node, bitsize_int (1));
366 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
367 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
368
369 sbitsize_one_node = sbitsize_int (1);
370 sbitsize_unit_node = sbitsize_int (BITS_PER_UNIT);
371
372 /* Show that REFERENCE_TYPEs are internal and should be Pmode. */
373 internal_reference_types ();
374
375 /* Register our internal error function. */
376 global_dc->internal_error = &internal_error_function;
377
378 return true;
379 }
380
381 /* Initialize the GCC support for exception handling. */
382
383 void
384 gnat_init_gcc_eh (void)
385 {
386 /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
387 though. This could for instance lead to the emission of tables with
388 references to symbols (such as the Ada eh personality routine) within
389 libraries we won't link against. */
390 if (No_Exception_Handlers_Set ())
391 return;
392
393 /* Tell GCC we are handling cleanup actions through exception propagation.
394 This opens possibilities that we don't take advantage of yet, but is
395 nonetheless necessary to ensure that fixup code gets assigned to the
396 right exception regions. */
397 using_eh_for_cleanups ();
398
399 /* Turn on -fexceptions, -fnon-call-exceptions and -fdelete-dead-exceptions.
400 The first one triggers the generation of the necessary exception tables.
401 The second one is useful for two reasons: 1/ we map some asynchronous
402 signals like SEGV to exceptions, so we need to ensure that the insns
403 which can lead to such signals are correctly attached to the exception
404 region they pertain to, 2/ some calls to pure subprograms are handled as
405 libcall blocks and then marked as "cannot trap" if the flag is not set
406 (see emit_libcall_block). We should not let this be since it is possible
407 for such calls to actually raise in Ada.
408 The third one is an optimization that makes it possible to delete dead
409 instructions that may throw exceptions, most notably loads and stores,
410 as permitted in Ada. */
411 flag_exceptions = 1;
412 flag_non_call_exceptions = 1;
413 flag_delete_dead_exceptions = 1;
414
415 init_eh ();
416 }
417
418 /* Initialize the GCC support for floating-point operations. */
419
420 void
421 gnat_init_gcc_fp (void)
422 {
423 /* Disable FP optimizations that ignore the signedness of zero if
424 S'Signed_Zeros is true, but don't override the user if not. */
425 if (Signed_Zeros_On_Target)
426 flag_signed_zeros = 1;
427 else if (!global_options_set.x_flag_signed_zeros)
428 flag_signed_zeros = 0;
429
430 /* Assume that FP operations can trap if S'Machine_Overflow is true,
431 but don't override the user if not. */
432 if (Machine_Overflows_On_Target)
433 flag_trapping_math = 1;
434 else if (!global_options_set.x_flag_trapping_math)
435 flag_trapping_math = 0;
436 }
437
438 /* Print language-specific items in declaration NODE. */
439
440 static void
441 gnat_print_decl (FILE *file, tree node, int indent)
442 {
443 switch (TREE_CODE (node))
444 {
445 case CONST_DECL:
446 print_node (file, "corresponding var",
447 DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
448 break;
449
450 case FIELD_DECL:
451 print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
452 indent + 4);
453 break;
454
455 case VAR_DECL:
456 if (DECL_LOOP_PARM_P (node))
457 print_node (file, "induction var", DECL_INDUCTION_VAR (node),
458 indent + 4);
459 else
460 print_node (file, "renamed object", DECL_RENAMED_OBJECT (node),
461 indent + 4);
462 break;
463
464 default:
465 break;
466 }
467 }
468
469 /* Print language-specific items in type NODE. */
470
471 static void
472 gnat_print_type (FILE *file, tree node, int indent)
473 {
474 switch (TREE_CODE (node))
475 {
476 case FUNCTION_TYPE:
477 print_node (file, "ci/co list", TYPE_CI_CO_LIST (node), indent + 4);
478 break;
479
480 case INTEGER_TYPE:
481 if (TYPE_MODULAR_P (node))
482 print_node_brief (file, "modulus", TYPE_MODULUS (node), indent + 4);
483 else if (TYPE_FIXED_POINT_P (node))
484 print_node (file, "scale factor", TYPE_SCALE_FACTOR (node),
485 indent + 4);
486 else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
487 print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
488 indent + 4);
489 else
490 print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);
491
492 /* ... fall through ... */
493
494 case ENUMERAL_TYPE:
495 case BOOLEAN_TYPE:
496 print_node_brief (file, "RM size", TYPE_RM_SIZE (node), indent + 4);
497
498 /* ... fall through ... */
499
500 case REAL_TYPE:
501 print_node_brief (file, "RM min", TYPE_RM_MIN_VALUE (node), indent + 4);
502 print_node_brief (file, "RM max", TYPE_RM_MAX_VALUE (node), indent + 4);
503 break;
504
505 case ARRAY_TYPE:
506 print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
507 break;
508
509 case VECTOR_TYPE:
510 print_node (file,"representative array",
511 TYPE_REPRESENTATIVE_ARRAY (node), indent + 4);
512 break;
513
514 case RECORD_TYPE:
515 if (TYPE_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
516 print_node (file, "unconstrained array",
517 TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
518 else
519 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
520 break;
521
522 case UNION_TYPE:
523 case QUAL_UNION_TYPE:
524 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
525 break;
526
527 default:
528 break;
529 }
530
531 if (TYPE_CAN_HAVE_DEBUG_TYPE_P (node) && TYPE_DEBUG_TYPE (node))
532 print_node_brief (file, "debug type", TYPE_DEBUG_TYPE (node), indent + 4);
533
534 if (TYPE_IMPL_PACKED_ARRAY_P (node) && TYPE_ORIGINAL_PACKED_ARRAY (node))
535 print_node_brief (file, "original packed array",
536 TYPE_ORIGINAL_PACKED_ARRAY (node), indent + 4);
537 }
538
539 /* Return the name to be printed for DECL. */
540
541 static const char *
542 gnat_printable_name (tree decl, int verbosity)
543 {
544 const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
545 char *ada_name = (char *) ggc_alloc_atomic (strlen (coded_name) * 2 + 60);
546
547 __gnat_decode (coded_name, ada_name, 0);
548
549 if (verbosity == 2 && !DECL_IS_BUILTIN (decl))
550 {
551 Set_Identifier_Casing (ada_name, DECL_SOURCE_FILE (decl));
552 return ggc_strdup (Name_Buffer);
553 }
554
555 return ada_name;
556 }
557
558 /* Return the name to be used in DWARF debug info for DECL. */
559
560 static const char *
561 gnat_dwarf_name (tree decl, int verbosity ATTRIBUTE_UNUSED)
562 {
563 gcc_assert (DECL_P (decl));
564 return (const char *) IDENTIFIER_POINTER (DECL_NAME (decl));
565 }
566
567 /* Return the descriptive type associated with TYPE, if any. */
568
569 static tree
570 gnat_descriptive_type (const_tree type)
571 {
572 if (TYPE_STUB_DECL (type))
573 return DECL_PARALLEL_TYPE (TYPE_STUB_DECL (type));
574 else
575 return NULL_TREE;
576 }
577
578 /* Return the type to be used for debugging information instead of TYPE or
579 NULL_TREE if TYPE is fine. */
580
581 static tree
582 gnat_get_debug_type (const_tree type)
583 {
584 if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) && TYPE_DEBUG_TYPE (type))
585 {
586 type = TYPE_DEBUG_TYPE (type);
587
588 /* ??? The get_debug_type language hook is processed after the array
589 descriptor language hook, so if there is an array behind this type,
590 the latter is supposed to handle it. Still, we can get here with
591 a type we are not supposed to handle (e.g. when the DWARF back-end
592 processes the type of a variable), so keep this guard. */
593 if (type && TYPE_CAN_HAVE_DEBUG_TYPE_P (type))
594 return const_cast<tree> (type);
595 }
596
597 return NULL_TREE;
598 }
599
600 /* Provide information in INFO for debugging output about the TYPE fixed-point
601 type. Return whether TYPE is handled. */
602
603 static bool
604 gnat_get_fixed_point_type_info (const_tree type,
605 struct fixed_point_type_info *info)
606 {
607 tree scale_factor;
608
609 /* GDB cannot handle fixed-point types yet, so rely on GNAT encodings
610 instead for it. */
611 if (!TYPE_IS_FIXED_POINT_P (type)
612 || gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
613 return false;
614
615 scale_factor = TYPE_SCALE_FACTOR (type);
616
617 /* We expect here only a finite set of pattern. See fixed-point types
618 handling in gnat_to_gnu_entity. */
619
620 /* Put invalid values when compiler internals cannot represent the scale
621 factor. */
622 if (scale_factor == integer_zero_node)
623 {
624 info->scale_factor_kind = fixed_point_scale_factor_arbitrary;
625 info->scale_factor.arbitrary.numerator = 0;
626 info->scale_factor.arbitrary.denominator = 0;
627 return true;
628 }
629
630 if (TREE_CODE (scale_factor) == RDIV_EXPR)
631 {
632 const tree num = TREE_OPERAND (scale_factor, 0);
633 const tree den = TREE_OPERAND (scale_factor, 1);
634
635 /* See if we have a binary or decimal scale. */
636 if (TREE_CODE (den) == POWER_EXPR)
637 {
638 const tree base = TREE_OPERAND (den, 0);
639 const tree exponent = TREE_OPERAND (den, 1);
640
641 /* We expect the scale factor to be 1 / 2 ** N or 1 / 10 ** N. */
642 gcc_assert (num == integer_one_node
643 && TREE_CODE (base) == INTEGER_CST
644 && TREE_CODE (exponent) == INTEGER_CST);
645
646 switch (tree_to_shwi (base))
647 {
648 case 2:
649 info->scale_factor_kind = fixed_point_scale_factor_binary;
650 info->scale_factor.binary = -tree_to_shwi (exponent);
651 return true;
652
653 case 10:
654 info->scale_factor_kind = fixed_point_scale_factor_decimal;
655 info->scale_factor.decimal = -tree_to_shwi (exponent);
656 return true;
657
658 default:
659 gcc_unreachable ();
660 }
661 }
662
663 /* If we reach this point, we are handling an arbitrary scale factor. We
664 expect N / D with constant operands. */
665 gcc_assert (TREE_CODE (num) == INTEGER_CST
666 && TREE_CODE (den) == INTEGER_CST);
667
668 info->scale_factor_kind = fixed_point_scale_factor_arbitrary;
669 info->scale_factor.arbitrary.numerator = tree_to_uhwi (num);
670 info->scale_factor.arbitrary.denominator = tree_to_shwi (den);
671 return true;
672 }
673
674 gcc_unreachable ();
675 }
676
677 /* Return true if types T1 and T2 are identical for type hashing purposes.
678 Called only after doing all language independent checks. At present,
679 this function is only called when both types are FUNCTION_TYPE. */
680
681 static bool
682 gnat_type_hash_eq (const_tree t1, const_tree t2)
683 {
684 gcc_assert (TREE_CODE (t1) == FUNCTION_TYPE);
685 return fntype_same_flags_p (t1, TYPE_CI_CO_LIST (t2),
686 TYPE_RETURN_UNCONSTRAINED_P (t2),
687 TYPE_RETURN_BY_DIRECT_REF_P (t2),
688 TREE_ADDRESSABLE (t2));
689 }
690
691 /* Do nothing (return the tree node passed). */
692
693 static tree
694 gnat_return_tree (tree t)
695 {
696 return t;
697 }
698
699 /* Get the alias set corresponding to a type or expression. */
700
701 static alias_set_type
702 gnat_get_alias_set (tree type)
703 {
704 /* If this is a padding type, use the type of the first field. */
705 if (TYPE_IS_PADDING_P (type))
706 return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
707
708 /* If the type is an unconstrained array, use the type of the
709 self-referential array we make. */
710 else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
711 return
712 get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
713
714 /* If the type can alias any other types, return the alias set 0. */
715 else if (TYPE_P (type) && TYPE_UNIVERSAL_ALIASING_P (type))
716 return 0;
717
718 return -1;
719 }
720
721 /* GNU_TYPE is a type. Return its maximum size in bytes, if known,
722 as a constant when possible. */
723
724 static tree
725 gnat_type_max_size (const_tree gnu_type)
726 {
727 /* First see what we can get from TYPE_SIZE_UNIT, which might not
728 be constant even for simple expressions if it has already been
729 elaborated and possibly replaced by a VAR_DECL. */
730 tree max_unitsize = max_size (TYPE_SIZE_UNIT (gnu_type), true);
731
732 /* If we don't have a constant, see what we can get from TYPE_ADA_SIZE,
733 which should stay untouched. */
734 if (!tree_fits_uhwi_p (max_unitsize)
735 && RECORD_OR_UNION_TYPE_P (gnu_type)
736 && !TYPE_FAT_POINTER_P (gnu_type)
737 && TYPE_ADA_SIZE (gnu_type))
738 {
739 tree max_adasize = max_size (TYPE_ADA_SIZE (gnu_type), true);
740
741 /* If we have succeeded in finding a constant, round it up to the
742 type's alignment and return the result in units. */
743 if (tree_fits_uhwi_p (max_adasize))
744 max_unitsize
745 = size_binop (CEIL_DIV_EXPR,
746 round_up (max_adasize, TYPE_ALIGN (gnu_type)),
747 bitsize_unit_node);
748 }
749
750 return max_unitsize;
751 }
752
753 static tree get_array_bit_stride (tree);
754
755 /* Provide information in INFO for debug output about the TYPE array type.
756 Return whether TYPE is handled. */
757
758 static bool
759 gnat_get_array_descr_info (const_tree const_type,
760 struct array_descr_info *info)
761 {
762 bool convention_fortran_p;
763 bool is_array = false;
764 bool is_fat_ptr = false;
765 bool is_packed_array = false;
766 tree type = const_cast<tree> (const_type);
767 const_tree first_dimen = NULL_TREE;
768 const_tree last_dimen = NULL_TREE;
769 const_tree dimen;
770 int i;
771
772 /* Temporaries created in the first pass and used in the second one for thin
773 pointers. The first one is an expression that yields the template record
774 from the base address (i.e. the PLACEHOLDER_EXPR). The second one is just
775 a cursor through this record's fields. */
776 tree thinptr_template_expr = NULL_TREE;
777 tree thinptr_bound_field = NULL_TREE;
778
779 /* ??? See gnat_get_debug_type. */
780 if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) && TYPE_DEBUG_TYPE (type))
781 type = TYPE_DEBUG_TYPE (type);
782
783 /* If we have an implementation type for a packed array, get the orignial
784 array type. */
785 if (TYPE_IMPL_PACKED_ARRAY_P (type) && TYPE_ORIGINAL_PACKED_ARRAY (type))
786 {
787 type = TYPE_ORIGINAL_PACKED_ARRAY (type);
788 is_packed_array = true;
789 }
790
791 /* First pass: gather all information about this array except everything
792 related to dimensions. */
793
794 /* Only handle ARRAY_TYPE nodes that come from GNAT. */
795 if (TREE_CODE (type) == ARRAY_TYPE
796 && TYPE_DOMAIN (type)
797 && TYPE_INDEX_TYPE (TYPE_DOMAIN (type)))
798 {
799 is_array = true;
800 first_dimen = type;
801 info->data_location = NULL_TREE;
802 }
803
804 else if (TYPE_IS_FAT_POINTER_P (type)
805 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
806 {
807 const tree ua_type = TYPE_UNCONSTRAINED_ARRAY (type);
808
809 /* This will be our base object address. */
810 const tree placeholder_expr = build0 (PLACEHOLDER_EXPR, type);
811
812 /* We assume below that maybe_unconstrained_array returns an INDIRECT_REF
813 node. */
814 const tree ua_val
815 = maybe_unconstrained_array (build_unary_op (INDIRECT_REF,
816 ua_type,
817 placeholder_expr));
818
819 is_fat_ptr = true;
820 first_dimen = TREE_TYPE (ua_val);
821
822 /* Get the *address* of the array, not the array itself. */
823 info->data_location = TREE_OPERAND (ua_val, 0);
824 }
825
826 /* Unlike fat pointers (which appear for unconstrained arrays passed in
827 argument), thin pointers are used only for array access types, so we want
828 them to appear in the debug info as pointers to an array type. That's why
829 we match only the RECORD_TYPE here instead of the POINTER_TYPE with the
830 TYPE_IS_THIN_POINTER_P predicate. */
831 else if (TREE_CODE (type) == RECORD_TYPE
832 && TYPE_CONTAINS_TEMPLATE_P (type)
833 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
834 {
835 /* This will be our base object address. Note that we assume that
836 pointers to these will actually point to the array field (thin
837 pointers are shifted). */
838 const tree placeholder_expr = build0 (PLACEHOLDER_EXPR, type);
839 const tree placeholder_addr
840 = build_unary_op (ADDR_EXPR, NULL_TREE, placeholder_expr);
841
842 const tree bounds_field = TYPE_FIELDS (type);
843 const tree bounds_type = TREE_TYPE (bounds_field);
844 const tree array_field = DECL_CHAIN (bounds_field);
845 const tree array_type = TREE_TYPE (array_field);
846
847 /* Shift the thin pointer address to get the address of the template. */
848 const tree shift_amount
849 = fold_build1 (NEGATE_EXPR, sizetype, byte_position (array_field));
850 tree template_addr
851 = build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (placeholder_addr),
852 placeholder_addr, shift_amount);
853 template_addr
854 = fold_convert (TYPE_POINTER_TO (bounds_type), template_addr);
855
856 first_dimen = array_type;
857
858 /* The thin pointer is already the pointer to the array data, so there's
859 no need for a specific "data location" expression. */
860 info->data_location = NULL_TREE;
861
862 thinptr_template_expr = build_unary_op (INDIRECT_REF,
863 bounds_type,
864 template_addr);
865 thinptr_bound_field = TYPE_FIELDS (bounds_type);
866 }
867 else
868 return false;
869
870 /* Second pass: compute the remaining information: dimensions and
871 corresponding bounds. */
872
873 if (TYPE_PACKED (first_dimen))
874 is_packed_array = true;
875 /* If this array has fortran convention, it's arranged in column-major
876 order, so our view here has reversed dimensions. */
877 convention_fortran_p = TYPE_CONVENTION_FORTRAN_P (first_dimen);
878 /* ??? For row major ordering, we probably want to emit nothing and
879 instead specify it as the default in Dw_TAG_compile_unit. */
880 info->ordering = (convention_fortran_p
881 ? array_descr_ordering_column_major
882 : array_descr_ordering_row_major);
883
884 /* Count how many dimensions this array has. */
885 for (i = 0, dimen = first_dimen; ; ++i, dimen = TREE_TYPE (dimen))
886 {
887 if (i > 0
888 && (TREE_CODE (dimen) != ARRAY_TYPE
889 || !TYPE_MULTI_ARRAY_P (dimen)))
890 break;
891 last_dimen = dimen;
892 }
893
894 info->ndimensions = i;
895
896 /* Too many dimensions? Give up generating proper description: yield instead
897 nested arrays. Note that in this case, this hook is invoked once on each
898 intermediate array type: be consistent and output nested arrays for all
899 dimensions. */
900 if (info->ndimensions > DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
901 || TYPE_MULTI_ARRAY_P (first_dimen))
902 {
903 info->ndimensions = 1;
904 last_dimen = first_dimen;
905 }
906
907 info->element_type = TREE_TYPE (last_dimen);
908
909 /* Now iterate over all dimensions in source-order and fill the info
910 structure. */
911 for (i = (convention_fortran_p ? info->ndimensions - 1 : 0),
912 dimen = first_dimen;
913 0 <= i && i < info->ndimensions;
914 i += (convention_fortran_p ? -1 : 1),
915 dimen = TREE_TYPE (dimen))
916 {
917 /* We are interested in the stored bounds for the debug info. */
918 tree index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (dimen));
919
920 if (is_array || is_fat_ptr)
921 {
922 /* GDB does not handle very well the self-referencial bound
923 expressions we are able to generate here for XUA types (they are
924 used only by XUP encodings) so avoid them in this case. Note that
925 there are two cases where we generate self-referencial bound
926 expressions: arrays that are constrained by record discriminants
927 and XUA types. */
928 if (TYPE_CONTEXT (first_dimen)
929 && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
930 && contains_placeholder_p (TYPE_MIN_VALUE (index_type))
931 && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
932 {
933 info->dimen[i].lower_bound = NULL_TREE;
934 info->dimen[i].upper_bound = NULL_TREE;
935 }
936 else
937 {
938 info->dimen[i].lower_bound = TYPE_MIN_VALUE (index_type);
939 info->dimen[i].upper_bound = TYPE_MAX_VALUE (index_type);
940 }
941 }
942
943 /* This is a thin pointer. */
944 else
945 {
946 info->dimen[i].lower_bound
947 = build_component_ref (thinptr_template_expr, thinptr_bound_field,
948 false);
949 thinptr_bound_field = DECL_CHAIN (thinptr_bound_field);
950
951 info->dimen[i].upper_bound
952 = build_component_ref (thinptr_template_expr, thinptr_bound_field,
953 false);
954 thinptr_bound_field = DECL_CHAIN (thinptr_bound_field);
955 }
956
957 /* The DWARF back-end will output exactly INDEX_TYPE as the array index'
958 "root" type, so pell subtypes when possible. */
959 while (TREE_TYPE (index_type)
960 && !subrange_type_for_debug_p (index_type, NULL, NULL))
961 index_type = TREE_TYPE (index_type);
962
963 info->dimen[i].bounds_type = index_type;
964 info->dimen[i].stride = NULL_TREE;
965 }
966
967 /* These are Fortran-specific fields. They make no sense here. */
968 info->allocated = NULL_TREE;
969 info->associated = NULL_TREE;
970
971 if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
972 {
973 /* When arrays contain dynamically-sized elements, we usually wrap them
974 in padding types, or we create constrained types for them. Then, if
975 such types are stripped in the debugging information output, the
976 debugger needs a way to know the size that is reserved for each
977 element. This is why we emit a stride in such situations. */
978 tree source_element_type = info->element_type;
979
980 while (true)
981 {
982 if (TYPE_DEBUG_TYPE (source_element_type))
983 source_element_type = TYPE_DEBUG_TYPE (source_element_type);
984 else if (TYPE_IS_PADDING_P (source_element_type))
985 source_element_type
986 = TREE_TYPE (TYPE_FIELDS (source_element_type));
987 else
988 break;
989 }
990
991 if (TREE_CODE (TYPE_SIZE_UNIT (source_element_type)) != INTEGER_CST)
992 {
993 info->stride = TYPE_SIZE_UNIT (info->element_type);
994 info->stride_in_bits = false;
995 }
996
997 /* We need to specify a bit stride when it does not correspond to the
998 natural size of the contained elements. ??? Note that we do not
999 support packed records and nested packed arrays. */
1000 else if (is_packed_array)
1001 {
1002 info->stride = get_array_bit_stride (info->element_type);
1003 info->stride_in_bits = true;
1004 }
1005 }
1006
1007 return true;
1008 }
1009
1010 /* Given the component type COMP_TYPE of a packed array, return an expression
1011 that computes the bit stride of this packed array. Return NULL_TREE when
1012 unsuccessful. */
1013
1014 static tree
1015 get_array_bit_stride (tree comp_type)
1016 {
1017 struct array_descr_info info;
1018 tree stride;
1019
1020 /* Simple case: the array contains an integral type: return its RM size. */
1021 if (INTEGRAL_TYPE_P (comp_type))
1022 return TYPE_RM_SIZE (comp_type);
1023
1024 /* Otherwise, see if this is an array we can analyze; if it's not, punt. */
1025 memset (&info, 0, sizeof (info));
1026 if (!gnat_get_array_descr_info (comp_type, &info) || !info.stride)
1027 return NULL_TREE;
1028
1029 /* Otherwise, the array stride is the inner array's stride multiplied by the
1030 number of elements it contains. Note that if the inner array is not
1031 packed, then the stride is "natural" and thus does not deserve an
1032 attribute. */
1033 stride = info.stride;
1034 if (!info.stride_in_bits)
1035 {
1036 stride = fold_convert (bitsizetype, stride);
1037 stride = build_binary_op (MULT_EXPR, bitsizetype,
1038 stride, build_int_cst (bitsizetype, 8));
1039 }
1040
1041 for (int i = 0; i < info.ndimensions; ++i)
1042 {
1043 tree count;
1044
1045 if (!info.dimen[i].lower_bound || !info.dimen[i].upper_bound)
1046 return NULL_TREE;
1047
1048 /* Put in count an expression that computes the length of this
1049 dimension. */
1050 count = build_binary_op (MINUS_EXPR, sbitsizetype,
1051 fold_convert (sbitsizetype,
1052 info.dimen[i].upper_bound),
1053 fold_convert (sbitsizetype,
1054 info.dimen[i].lower_bound)),
1055 count = build_binary_op (PLUS_EXPR, sbitsizetype,
1056 count, build_int_cst (sbitsizetype, 1));
1057 count = build_binary_op (MAX_EXPR, sbitsizetype,
1058 count,
1059 build_int_cst (sbitsizetype, 0));
1060 count = fold_convert (bitsizetype, count);
1061 stride = build_binary_op (MULT_EXPR, bitsizetype, stride, count);
1062 }
1063
1064 return stride;
1065 }
1066
1067 /* GNU_TYPE is a subtype of an integral type. Set LOWVAL to the low bound
1068 and HIGHVAL to the high bound, respectively. */
1069
1070 static void
1071 gnat_get_subrange_bounds (const_tree gnu_type, tree *lowval, tree *highval)
1072 {
1073 *lowval = TYPE_MIN_VALUE (gnu_type);
1074 *highval = TYPE_MAX_VALUE (gnu_type);
1075 }
1076
1077 /* Return the bias of GNU_TYPE, if any. */
1078
1079 static tree
1080 gnat_get_type_bias (const_tree gnu_type)
1081 {
1082 if (TREE_CODE (gnu_type) == INTEGER_TYPE
1083 && TYPE_BIASED_REPRESENTATION_P (gnu_type)
1084 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
1085 return TYPE_RM_MIN_VALUE (gnu_type);
1086
1087 return NULL_TREE;
1088 }
1089
1090 /* GNU_TYPE is the type of a subprogram parameter. Determine if it should be
1091 passed by reference by default. */
1092
1093 bool
1094 default_pass_by_ref (tree gnu_type)
1095 {
1096 /* We pass aggregates by reference if they are sufficiently large for
1097 their alignment. The ratio is somewhat arbitrary. We also pass by
1098 reference if the target machine would either pass or return by
1099 reference. Strictly speaking, we need only check the return if this
1100 is an In Out parameter, but it's probably best to err on the side of
1101 passing more things by reference. */
1102
1103 if (pass_by_reference (NULL, TYPE_MODE (gnu_type), gnu_type, true))
1104 return true;
1105
1106 if (targetm.calls.return_in_memory (gnu_type, NULL_TREE))
1107 return true;
1108
1109 if (AGGREGATE_TYPE_P (gnu_type)
1110 && (!valid_constant_size_p (TYPE_SIZE_UNIT (gnu_type))
1111 || 0 < compare_tree_int (TYPE_SIZE_UNIT (gnu_type),
1112 TYPE_ALIGN (gnu_type))))
1113 return true;
1114
1115 return false;
1116 }
1117
1118 /* GNU_TYPE is the type of a subprogram parameter. Determine if it must be
1119 passed by reference. */
1120
1121 bool
1122 must_pass_by_ref (tree gnu_type)
1123 {
1124 /* We pass only unconstrained objects, those required by the language
1125 to be passed by reference, and objects of variable size. The latter
1126 is more efficient, avoids problems with variable size temporaries,
1127 and does not produce compatibility problems with C, since C does
1128 not have such objects. */
1129 return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
1130 || TYPE_IS_BY_REFERENCE_P (gnu_type)
1131 || (TYPE_SIZE_UNIT (gnu_type)
1132 && TREE_CODE (TYPE_SIZE_UNIT (gnu_type)) != INTEGER_CST));
1133 }
1134
1135 /* This function is called by the front-end to enumerate all the supported
1136 modes for the machine, as well as some predefined C types. F is a function
1137 which is called back with the parameters as listed below, first a string,
1138 then seven ints. The name is any arbitrary null-terminated string and has
1139 no particular significance, except for the case of predefined C types, where
1140 it should be the name of the C type. For integer types, only signed types
1141 should be listed, unsigned versions are assumed. The order of types should
1142 be in order of preference, with the smallest/cheapest types first.
1143
1144 In particular, C predefined types should be listed before other types,
1145 binary floating point types before decimal ones, and narrower/cheaper
1146 type versions before more expensive ones. In type selection the first
1147 matching variant will be used.
1148
1149 NAME pointer to first char of type name
1150 DIGS number of decimal digits for floating-point modes, else 0
1151 COMPLEX_P nonzero is this represents a complex mode
1152 COUNT count of number of items, nonzero for vector mode
1153 FLOAT_REP Float_Rep_Kind for FP, otherwise undefined
1154 PRECISION number of bits used to store data
1155 SIZE number of bits occupied by the mode
1156 ALIGN number of bits to which mode is aligned. */
1157
1158 void
1159 enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int))
1160 {
1161 const tree c_types[]
1162 = { float_type_node, double_type_node, long_double_type_node };
1163 const char *const c_names[]
1164 = { "float", "double", "long double" };
1165 int iloop;
1166
1167 /* We are going to compute it below. */
1168 fp_arith_may_widen = false;
1169
1170 for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++)
1171 {
1172 machine_mode i = (machine_mode) iloop;
1173 machine_mode inner_mode = i;
1174 bool float_p = false;
1175 bool complex_p = false;
1176 bool vector_p = false;
1177 bool skip_p = false;
1178 int digs = 0;
1179 unsigned int nameloop;
1180 Float_Rep_Kind float_rep = IEEE_Binary; /* Until proven otherwise */
1181
1182 switch (GET_MODE_CLASS (i))
1183 {
1184 case MODE_INT:
1185 break;
1186 case MODE_FLOAT:
1187 float_p = true;
1188 break;
1189 case MODE_COMPLEX_INT:
1190 complex_p = true;
1191 inner_mode = GET_MODE_INNER (i);
1192 break;
1193 case MODE_COMPLEX_FLOAT:
1194 float_p = true;
1195 complex_p = true;
1196 inner_mode = GET_MODE_INNER (i);
1197 break;
1198 case MODE_VECTOR_INT:
1199 vector_p = true;
1200 inner_mode = GET_MODE_INNER (i);
1201 break;
1202 case MODE_VECTOR_FLOAT:
1203 float_p = true;
1204 vector_p = true;
1205 inner_mode = GET_MODE_INNER (i);
1206 break;
1207 default:
1208 skip_p = true;
1209 }
1210
1211 if (float_p)
1212 {
1213 const struct real_format *fmt = REAL_MODE_FORMAT (inner_mode);
1214
1215 /* ??? Cope with the ghost XFmode of the ARM port. */
1216 if (!fmt)
1217 continue;
1218
1219 /* Be conservative and consider that floating-point arithmetics may
1220 use wider intermediate results as soon as there is an extended
1221 Motorola or Intel mode supported by the machine. */
1222 if (fmt == &ieee_extended_motorola_format
1223 || fmt == &ieee_extended_intel_96_format
1224 || fmt == &ieee_extended_intel_96_round_53_format
1225 || fmt == &ieee_extended_intel_128_format)
1226 {
1227 #ifdef TARGET_FPMATH_DEFAULT
1228 if (TARGET_FPMATH_DEFAULT == FPMATH_387)
1229 #endif
1230 fp_arith_may_widen = true;
1231 }
1232
1233 if (fmt->b == 2)
1234 digs = (fmt->p - 1) * 1233 / 4096; /* scale by log (2) */
1235
1236 else if (fmt->b == 10)
1237 digs = fmt->p;
1238
1239 else
1240 gcc_unreachable ();
1241 }
1242
1243 /* First register any C types for this mode that the front end
1244 may need to know about, unless the mode should be skipped. */
1245 if (!skip_p && !vector_p)
1246 for (nameloop = 0; nameloop < ARRAY_SIZE (c_types); nameloop++)
1247 {
1248 tree type = c_types[nameloop];
1249 const char *name = c_names[nameloop];
1250
1251 if (TYPE_MODE (type) == i)
1252 {
1253 f (name, digs, complex_p, 0, float_rep, TYPE_PRECISION (type),
1254 TREE_INT_CST_LOW (TYPE_SIZE (type)), TYPE_ALIGN (type));
1255 skip_p = true;
1256 }
1257 }
1258
1259 /* If no predefined C types were found, register the mode itself. */
1260 if (!skip_p)
1261 f (GET_MODE_NAME (i), digs, complex_p,
1262 vector_p ? GET_MODE_NUNITS (i) : 0, float_rep,
1263 GET_MODE_PRECISION (i), GET_MODE_BITSIZE (i),
1264 GET_MODE_ALIGNMENT (i));
1265 }
1266 }
1267
1268 /* Return the size of the FP mode with precision PREC. */
1269
1270 int
1271 fp_prec_to_size (int prec)
1272 {
1273 machine_mode mode;
1274
1275 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
1276 mode = GET_MODE_WIDER_MODE (mode))
1277 if (GET_MODE_PRECISION (mode) == prec)
1278 return GET_MODE_BITSIZE (mode);
1279
1280 gcc_unreachable ();
1281 }
1282
1283 /* Return the precision of the FP mode with size SIZE. */
1284
1285 int
1286 fp_size_to_prec (int size)
1287 {
1288 machine_mode mode;
1289
1290 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
1291 mode = GET_MODE_WIDER_MODE (mode))
1292 if (GET_MODE_BITSIZE (mode) == size)
1293 return GET_MODE_PRECISION (mode);
1294
1295 gcc_unreachable ();
1296 }
1297
1298 static GTY(()) tree gnat_eh_personality_decl;
1299
1300 /* Return the GNAT personality function decl. */
1301
1302 static tree
1303 gnat_eh_personality (void)
1304 {
1305 if (!gnat_eh_personality_decl)
1306 gnat_eh_personality_decl = build_personality_function ("gnat");
1307 return gnat_eh_personality_decl;
1308 }
1309
1310 /* Initialize language-specific bits of tree_contains_struct. */
1311
1312 static void
1313 gnat_init_ts (void)
1314 {
1315 MARK_TS_COMMON (UNCONSTRAINED_ARRAY_TYPE);
1316
1317 MARK_TS_TYPED (UNCONSTRAINED_ARRAY_REF);
1318 MARK_TS_TYPED (NULL_EXPR);
1319 MARK_TS_TYPED (PLUS_NOMOD_EXPR);
1320 MARK_TS_TYPED (MINUS_NOMOD_EXPR);
1321 MARK_TS_TYPED (POWER_EXPR);
1322 MARK_TS_TYPED (ATTR_ADDR_EXPR);
1323 MARK_TS_TYPED (STMT_STMT);
1324 MARK_TS_TYPED (LOOP_STMT);
1325 MARK_TS_TYPED (EXIT_STMT);
1326 }
1327
1328 /* Return the lang specific structure attached to NODE. Allocate it (cleared)
1329 if needed. */
1330
1331 struct lang_type *
1332 get_lang_specific (tree node)
1333 {
1334 if (!TYPE_LANG_SPECIFIC (node))
1335 TYPE_LANG_SPECIFIC (node) = ggc_cleared_alloc<struct lang_type> ();
1336 return TYPE_LANG_SPECIFIC (node);
1337 }
1338
1339 /* Definitions for our language-specific hooks. */
1340
1341 #undef LANG_HOOKS_NAME
1342 #define LANG_HOOKS_NAME "GNU Ada"
1343 #undef LANG_HOOKS_IDENTIFIER_SIZE
1344 #define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct tree_identifier)
1345 #undef LANG_HOOKS_INIT
1346 #define LANG_HOOKS_INIT gnat_init
1347 #undef LANG_HOOKS_OPTION_LANG_MASK
1348 #define LANG_HOOKS_OPTION_LANG_MASK gnat_option_lang_mask
1349 #undef LANG_HOOKS_INIT_OPTIONS_STRUCT
1350 #define LANG_HOOKS_INIT_OPTIONS_STRUCT gnat_init_options_struct
1351 #undef LANG_HOOKS_INIT_OPTIONS
1352 #define LANG_HOOKS_INIT_OPTIONS gnat_init_options
1353 #undef LANG_HOOKS_HANDLE_OPTION
1354 #define LANG_HOOKS_HANDLE_OPTION gnat_handle_option
1355 #undef LANG_HOOKS_POST_OPTIONS
1356 #define LANG_HOOKS_POST_OPTIONS gnat_post_options
1357 #undef LANG_HOOKS_PARSE_FILE
1358 #define LANG_HOOKS_PARSE_FILE gnat_parse_file
1359 #undef LANG_HOOKS_TYPE_HASH_EQ
1360 #define LANG_HOOKS_TYPE_HASH_EQ gnat_type_hash_eq
1361 #undef LANG_HOOKS_GETDECLS
1362 #define LANG_HOOKS_GETDECLS lhd_return_null_tree_v
1363 #undef LANG_HOOKS_PUSHDECL
1364 #define LANG_HOOKS_PUSHDECL gnat_return_tree
1365 #undef LANG_HOOKS_GET_ALIAS_SET
1366 #define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
1367 #undef LANG_HOOKS_PRINT_DECL
1368 #define LANG_HOOKS_PRINT_DECL gnat_print_decl
1369 #undef LANG_HOOKS_PRINT_TYPE
1370 #define LANG_HOOKS_PRINT_TYPE gnat_print_type
1371 #undef LANG_HOOKS_TYPE_MAX_SIZE
1372 #define LANG_HOOKS_TYPE_MAX_SIZE gnat_type_max_size
1373 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
1374 #define LANG_HOOKS_DECL_PRINTABLE_NAME gnat_printable_name
1375 #undef LANG_HOOKS_DWARF_NAME
1376 #define LANG_HOOKS_DWARF_NAME gnat_dwarf_name
1377 #undef LANG_HOOKS_GIMPLIFY_EXPR
1378 #define LANG_HOOKS_GIMPLIFY_EXPR gnat_gimplify_expr
1379 #undef LANG_HOOKS_TYPE_FOR_MODE
1380 #define LANG_HOOKS_TYPE_FOR_MODE gnat_type_for_mode
1381 #undef LANG_HOOKS_TYPE_FOR_SIZE
1382 #define LANG_HOOKS_TYPE_FOR_SIZE gnat_type_for_size
1383 #undef LANG_HOOKS_TYPES_COMPATIBLE_P
1384 #define LANG_HOOKS_TYPES_COMPATIBLE_P gnat_types_compatible_p
1385 #undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
1386 #define LANG_HOOKS_GET_ARRAY_DESCR_INFO gnat_get_array_descr_info
1387 #undef LANG_HOOKS_GET_SUBRANGE_BOUNDS
1388 #define LANG_HOOKS_GET_SUBRANGE_BOUNDS gnat_get_subrange_bounds
1389 #undef LANG_HOOKS_GET_TYPE_BIAS
1390 #define LANG_HOOKS_GET_TYPE_BIAS gnat_get_type_bias
1391 #undef LANG_HOOKS_DESCRIPTIVE_TYPE
1392 #define LANG_HOOKS_DESCRIPTIVE_TYPE gnat_descriptive_type
1393 #undef LANG_HOOKS_GET_DEBUG_TYPE
1394 #define LANG_HOOKS_GET_DEBUG_TYPE gnat_get_debug_type
1395 #undef LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO
1396 #define LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO \
1397 gnat_get_fixed_point_type_info
1398 #undef LANG_HOOKS_ATTRIBUTE_TABLE
1399 #define LANG_HOOKS_ATTRIBUTE_TABLE gnat_internal_attribute_table
1400 #undef LANG_HOOKS_BUILTIN_FUNCTION
1401 #define LANG_HOOKS_BUILTIN_FUNCTION gnat_builtin_function
1402 #undef LANG_HOOKS_EH_PERSONALITY
1403 #define LANG_HOOKS_EH_PERSONALITY gnat_eh_personality
1404 #undef LANG_HOOKS_DEEP_UNSHARING
1405 #define LANG_HOOKS_DEEP_UNSHARING true
1406 #undef LANG_HOOKS_INIT_TS
1407 #define LANG_HOOKS_INIT_TS gnat_init_ts
1408 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
1409 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL hook_bool_const_tree_false
1410
1411 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
1412
1413 #include "gt-ada-misc.h"