1/****************************************************************************
2 *                                                                          *
3 *                         GNAT COMPILER COMPONENTS                         *
4 *                                                                          *
5 *                                 M I S C                                  *
6 *                                                                          *
7 *                           C Implementation File                          *
8 *                                                                          *
9 *          Copyright (C) 1992-2015, 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 "opts.h"
30#include "options.h"
31#include "tm.h"
32#include "hash-set.h"
33#include "machmode.h"
34#include "vec.h"
35#include "double-int.h"
36#include "input.h"
37#include "alias.h"
38#include "symtab.h"
39#include "wide-int.h"
40#include "inchash.h"
41#include "tree.h"
42#include "fold-const.h"
43#include "stor-layout.h"
44#include "print-tree.h"
45#include "diagnostic.h"
46#include "target.h"
47#include "ggc.h"
48#include "flags.h"
49#include "debug.h"
50#include "toplev.h"
51#include "langhooks.h"
52#include "langhooks-def.h"
53#include "plugin.h"
54#include "real.h"
55#include "hashtab.h"
56#include "hash-set.h"
57#include "vec.h"
58#include "machmode.h"
59#include "hard-reg-set.h"
60#include "input.h"
61#include "function.h"	/* For pass_by_reference.  */
62#include "dwarf2out.h"
63
64#include "ada.h"
65#include "adadecode.h"
66#include "types.h"
67#include "atree.h"
68#include "elists.h"
69#include "namet.h"
70#include "nlists.h"
71#include "stringt.h"
72#include "uintp.h"
73#include "fe.h"
74#include "sinfo.h"
75#include "einfo.h"
76#include "ada-tree.h"
77#include "gigi.h"
78
79/* This symbol needs to be defined for the front-end.  */
80void *callgraph_info_file = NULL;
81
82/* Command-line argc and argv.  These variables are global since they are
83   imported in back_end.adb.  */
84unsigned int save_argc;
85const char **save_argv;
86
87/* GNAT argc and argv.  */
88extern int gnat_argc;
89extern char **gnat_argv;
90
91#ifdef __cplusplus
92extern "C" {
93#endif
94
95/* Declare functions we use as part of startup.  */
96extern void __gnat_initialize (void *);
97extern void __gnat_install_SEH_handler (void *);
98extern void adainit (void);
99extern void _ada_gnat1drv (void);
100
101#ifdef __cplusplus
102}
103#endif
104
105/* The parser for the language.  For us, we process the GNAT tree.  */
106
107static void
108gnat_parse_file (void)
109{
110  int seh[2];
111
112  /* Call the target specific initializations.  */
113  __gnat_initialize (NULL);
114
115  /* ??? Call the SEH initialization routine.  This is to workaround
116  a bootstrap path problem.  The call below should be removed at some
117  point and the SEH pointer passed to __gnat_initialize() above.  */
118  __gnat_install_SEH_handler((void *)seh);
119
120  /* Call the front-end elaboration procedures.  */
121  adainit ();
122
123  /* Call the front end.  */
124  _ada_gnat1drv ();
125}
126
127/* Return language mask for option processing.  */
128
129static unsigned int
130gnat_option_lang_mask (void)
131{
132  return CL_Ada;
133}
134
135/* Decode all the language specific options that cannot be decoded by GCC.
136   The option decoding phase of GCC calls this routine on the flags that
137   are marked as Ada-specific.  Return true on success or false on failure.  */
138
139static bool
140gnat_handle_option (size_t scode, const char *arg ATTRIBUTE_UNUSED, int value,
141		    int kind ATTRIBUTE_UNUSED, location_t loc ATTRIBUTE_UNUSED,
142		    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
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      /* This is handled by the middle-end.  */
173      break;
174
175    default:
176      gcc_unreachable ();
177    }
178
179  Ada_handle_option_auto (&global_options, &global_options_set,
180			  scode, arg, value,
181			  gnat_option_lang_mask (), kind,
182			  loc, handlers, global_dc);
183  return true;
184}
185
186/* Initialize options structure OPTS.  */
187
188static void
189gnat_init_options_struct (struct gcc_options *opts)
190{
191  /* Uninitialized really means uninitialized in Ada.  */
192  opts->x_flag_zero_initialized_in_bss = 0;
193
194  /* We don't care about errno in Ada and it causes __builtin_sqrt to
195     call the libm function rather than do it inline.  */
196  opts->x_flag_errno_math = 0;
197  opts->frontend_set_flag_errno_math = true;
198}
199
200/* Initialize for option processing.  */
201
202static void
203gnat_init_options (unsigned int decoded_options_count,
204		   struct cl_decoded_option *decoded_options)
205{
206  /* Reconstruct an argv array for use of back_end.adb.
207
208     ??? back_end.adb should not rely on this; instead, it should work with
209     decoded options without such reparsing, to ensure consistency in how
210     options are decoded.  */
211  unsigned int i;
212
213  save_argv = XNEWVEC (const char *, 2 * decoded_options_count + 1);
214  save_argc = 0;
215  for (i = 0; i < decoded_options_count; i++)
216    {
217      size_t num_elements = decoded_options[i].canonical_option_num_elements;
218
219      if (decoded_options[i].errors
220	  || decoded_options[i].opt_index == OPT_SPECIAL_unknown
221	  || num_elements == 0)
222	continue;
223
224      /* Deal with -I- specially since it must be a single switch.  */
225      if (decoded_options[i].opt_index == OPT_I
226	  && num_elements == 2
227	  && decoded_options[i].canonical_option[1][0] == '-'
228	  && decoded_options[i].canonical_option[1][1] == '\0')
229	save_argv[save_argc++] = "-I-";
230      else
231	{
232	  gcc_assert (num_elements >= 1 && num_elements <= 2);
233	  save_argv[save_argc++] = decoded_options[i].canonical_option[0];
234	  if (num_elements >= 2)
235	    save_argv[save_argc++] = decoded_options[i].canonical_option[1];
236	}
237    }
238  save_argv[save_argc] = NULL;
239
240  gnat_argv = (char **) xmalloc (sizeof (save_argv[0]));
241  gnat_argv[0] = xstrdup (save_argv[0]);     /* name of the command */
242  gnat_argc = 1;
243}
244
245/* Ada code requires variables for these settings rather than elements
246   of the global_options structure.  */
247#undef optimize
248#undef optimize_size
249#undef flag_compare_debug
250#undef flag_short_enums
251#undef flag_stack_check
252int gnat_encodings = 0;
253int optimize;
254int optimize_size;
255int flag_compare_debug;
256int flag_short_enums;
257enum stack_check_type flag_stack_check = NO_STACK_CHECK;
258
259/* Settings adjustments after switches processing by the back-end.
260   Note that the front-end switches processing (Scan_Compiler_Arguments)
261   has not been done yet at this point!  */
262
263static bool
264gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
265{
266  /* Excess precision other than "fast" requires front-end support.  */
267  if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
268      && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
269    sorry ("-fexcess-precision=standard for Ada");
270  flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
271
272  /* ??? The warning machinery is outsmarted by Ada.  */
273  warn_unused_parameter = 0;
274
275  /* No psABI change warnings for Ada.  */
276  warn_psabi = 0;
277
278  /* No caret by default for Ada.  */
279  if (!global_options_set.x_flag_diagnostics_show_caret)
280    global_dc->show_caret = false;
281
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
299static void
300internal_error_function (diagnostic_context *context,
301			 const char *msgid, 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
353static bool
354gnat_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, this doesn't really
358     matter since we'll use the explicit `unsigned char' for Character.  */
359  build_common_tree_nodes (flag_signed_char, false);
360
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);
369
370  sbitsize_one_node = sbitsize_int (1);
371  sbitsize_unit_node = sbitsize_int (BITS_PER_UNIT);
372
373  ptr_void_type_node = build_pointer_type (void_type_node);
374
375  /* Show that REFERENCE_TYPEs are internal and should be Pmode.  */
376  internal_reference_types ();
377
378  /* Register our internal error function.  */
379  global_dc->internal_error = &internal_error_function;
380
381  return true;
382}
383
384/* Initialize the GCC support for exception handling.  */
385
386void
387gnat_init_gcc_eh (void)
388{
389  /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
390     though. This could for instance lead to the emission of tables with
391     references to symbols (such as the Ada eh personality routine) within
392     libraries we won't link against.  */
393  if (No_Exception_Handlers_Set ())
394    return;
395
396  /* Tell GCC we are handling cleanup actions through exception propagation.
397     This opens possibilities that we don't take advantage of yet, but is
398     nonetheless necessary to ensure that fixup code gets assigned to the
399     right exception regions.  */
400  using_eh_for_cleanups ();
401
402  /* Turn on -fexceptions, -fnon-call-exceptions and -fdelete-dead-exceptions.
403     The first one triggers the generation of the necessary exception tables.
404     The second one is useful for two reasons: 1/ we map some asynchronous
405     signals like SEGV to exceptions, so we need to ensure that the insns
406     which can lead to such signals are correctly attached to the exception
407     region they pertain to, 2/ some calls to pure subprograms are handled as
408     libcall blocks and then marked as "cannot trap" if the flag is not set
409     (see emit_libcall_block).  We should not let this be since it is possible
410     for such calls to actually raise in Ada.
411     The third one is an optimization that makes it possible to delete dead
412     instructions that may throw exceptions, most notably loads and stores,
413     as permitted in Ada.  */
414  flag_exceptions = 1;
415  flag_non_call_exceptions = 1;
416  flag_delete_dead_exceptions = 1;
417
418  init_eh ();
419}
420
421/* Initialize the GCC support for floating-point operations.  */
422
423void
424gnat_init_gcc_fp (void)
425{
426  /* Disable FP optimizations that ignore the signedness of zero if
427     S'Signed_Zeros is true, but don't override the user if not.  */
428  if (Signed_Zeros_On_Target)
429    flag_signed_zeros = 1;
430  else if (!global_options_set.x_flag_signed_zeros)
431    flag_signed_zeros = 0;
432
433  /* Assume that FP operations can trap if S'Machine_Overflow is true,
434     but don't override the user if not.  */
435  if (Machine_Overflows_On_Target)
436    flag_trapping_math = 1;
437  else if (!global_options_set.x_flag_trapping_math)
438    flag_trapping_math = 0;
439}
440
441/* Print language-specific items in declaration NODE.  */
442
443static void
444gnat_print_decl (FILE *file, tree node, int indent)
445{
446  switch (TREE_CODE (node))
447    {
448    case CONST_DECL:
449      print_node (file, "corresponding var",
450		  DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
451      break;
452
453    case FIELD_DECL:
454      print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
455		  indent + 4);
456      break;
457
458    case VAR_DECL:
459      if (DECL_LOOP_PARM_P (node))
460	print_node (file, "induction var", DECL_INDUCTION_VAR (node),
461		    indent + 4);
462      else
463	print_node (file, "renamed object", DECL_RENAMED_OBJECT (node),
464		    indent + 4);
465      break;
466
467    default:
468      break;
469    }
470}
471
472/* Print language-specific items in type NODE.  */
473
474static void
475gnat_print_type (FILE *file, tree node, int indent)
476{
477  switch (TREE_CODE (node))
478    {
479    case FUNCTION_TYPE:
480      print_node (file, "ci/co list", TYPE_CI_CO_LIST (node), indent + 4);
481      break;
482
483    case INTEGER_TYPE:
484      if (TYPE_MODULAR_P (node))
485	print_node_brief (file, "modulus", TYPE_MODULUS (node), 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
532/* Return the name to be printed for DECL.  */
533
534static const char *
535gnat_printable_name (tree decl, int verbosity)
536{
537  const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
538  char *ada_name = (char *) ggc_alloc_atomic (strlen (coded_name) * 2 + 60);
539
540  __gnat_decode (coded_name, ada_name, 0);
541
542  if (verbosity == 2 && !DECL_IS_BUILTIN (decl))
543    {
544      Set_Identifier_Casing (ada_name, DECL_SOURCE_FILE (decl));
545      return ggc_strdup (Name_Buffer);
546    }
547
548  return ada_name;
549}
550
551/* Return the name to be used in DWARF debug info for DECL.  */
552
553static const char *
554gnat_dwarf_name (tree decl, int verbosity ATTRIBUTE_UNUSED)
555{
556  gcc_assert (DECL_P (decl));
557  return (const char *) IDENTIFIER_POINTER (DECL_NAME (decl));
558}
559
560/* Return the descriptive type associated with TYPE, if any.  */
561
562static tree
563gnat_descriptive_type (const_tree type)
564{
565  if (TYPE_STUB_DECL (type))
566    return DECL_PARALLEL_TYPE (TYPE_STUB_DECL (type));
567  else
568    return NULL_TREE;
569}
570
571/* Return the underlying base type of an enumeration type.  */
572
573static tree
574gnat_enum_underlying_base_type (const_tree)
575{
576  /* Enumeration types are base types in Ada.  */
577  return void_type_node;
578}
579
580/* Return true if types T1 and T2 are identical for type hashing purposes.
581   Called only after doing all language independent checks.  At present,
582   this function is only called when both types are FUNCTION_TYPE.  */
583
584static bool
585gnat_type_hash_eq (const_tree t1, const_tree t2)
586{
587  gcc_assert (TREE_CODE (t1) == FUNCTION_TYPE);
588  return fntype_same_flags_p (t1, TYPE_CI_CO_LIST (t2),
589			      TYPE_RETURN_UNCONSTRAINED_P (t2),
590			      TYPE_RETURN_BY_DIRECT_REF_P (t2),
591			      TREE_ADDRESSABLE (t2));
592}
593
594/* Do nothing (return the tree node passed).  */
595
596static tree
597gnat_return_tree (tree t)
598{
599  return t;
600}
601
602/* Get the alias set corresponding to a type or expression.  */
603
604static alias_set_type
605gnat_get_alias_set (tree type)
606{
607  /* If this is a padding type, use the type of the first field.  */
608  if (TYPE_IS_PADDING_P (type))
609    return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
610
611  /* If the type is an unconstrained array, use the type of the
612     self-referential array we make.  */
613  else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
614    return
615      get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
616
617  /* If the type can alias any other types, return the alias set 0.  */
618  else if (TYPE_P (type)
619	   && TYPE_UNIVERSAL_ALIASING_P (TYPE_MAIN_VARIANT (type)))
620    return 0;
621
622  return -1;
623}
624
625/* GNU_TYPE is a type.  Return its maximum size in bytes, if known,
626   as a constant when possible.  */
627
628static tree
629gnat_type_max_size (const_tree gnu_type)
630{
631  /* First see what we can get from TYPE_SIZE_UNIT, which might not
632     be constant even for simple expressions if it has already been
633     elaborated and possibly replaced by a VAR_DECL.  */
634  tree max_unitsize = max_size (TYPE_SIZE_UNIT (gnu_type), true);
635
636  /* If we don't have a constant, see what we can get from TYPE_ADA_SIZE,
637     which should stay untouched.  */
638  if (!tree_fits_uhwi_p (max_unitsize)
639      && RECORD_OR_UNION_TYPE_P (gnu_type)
640      && !TYPE_FAT_POINTER_P (gnu_type)
641      && TYPE_ADA_SIZE (gnu_type))
642    {
643      tree max_adasize = max_size (TYPE_ADA_SIZE (gnu_type), true);
644
645      /* If we have succeeded in finding a constant, round it up to the
646	 type's alignment and return the result in units.  */
647      if (tree_fits_uhwi_p (max_adasize))
648	max_unitsize
649	  = size_binop (CEIL_DIV_EXPR,
650			round_up (max_adasize, TYPE_ALIGN (gnu_type)),
651			bitsize_unit_node);
652    }
653
654  return max_unitsize;
655}
656
657/* Provide information in INFO for debug output about the TYPE array type.
658   Return whether TYPE is handled.  */
659
660static bool
661gnat_get_array_descr_info (const_tree type, struct array_descr_info *info)
662{
663  bool convention_fortran_p;
664  tree index_type;
665
666  const_tree dimen = NULL_TREE;
667  const_tree last_dimen = NULL_TREE;
668  int i;
669
670  if (TREE_CODE (type) != ARRAY_TYPE
671      || !TYPE_DOMAIN (type)
672      || !TYPE_INDEX_TYPE (TYPE_DOMAIN (type)))
673    return false;
674
675  /* Count how many dimentions this array has.  */
676  for (i = 0, dimen = type; ; ++i, dimen = TREE_TYPE (dimen))
677    if (i > 0
678	&& (TREE_CODE (dimen) != ARRAY_TYPE
679	    || !TYPE_MULTI_ARRAY_P (dimen)))
680      break;
681  info->ndimensions = i;
682  convention_fortran_p = TYPE_CONVENTION_FORTRAN_P (type);
683
684  /* TODO: For row major ordering, we probably want to emit nothing and
685     instead specify it as the default in Dw_TAG_compile_unit.  */
686  info->ordering = (convention_fortran_p
687		    ? array_descr_ordering_column_major
688		    : array_descr_ordering_row_major);
689  info->base_decl = NULL_TREE;
690  info->data_location = NULL_TREE;
691  info->allocated = NULL_TREE;
692  info->associated = NULL_TREE;
693
694  for (i = (convention_fortran_p ? info->ndimensions - 1 : 0),
695       dimen = type;
696
697       0 <= i && i < info->ndimensions;
698
699       i += (convention_fortran_p ? -1 : 1),
700       dimen = TREE_TYPE (dimen))
701    {
702      /* We are interested in the stored bounds for the debug info.  */
703      index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (dimen));
704
705      info->dimen[i].bounds_type = index_type;
706      info->dimen[i].lower_bound = TYPE_MIN_VALUE (index_type);
707      info->dimen[i].upper_bound = TYPE_MAX_VALUE (index_type);
708      last_dimen = dimen;
709    }
710
711  info->element_type = TREE_TYPE (last_dimen);
712
713  return true;
714}
715
716/* GNU_TYPE is a subtype of an integral type.  Set LOWVAL to the low bound
717   and HIGHVAL to the high bound, respectively.  */
718
719static void
720gnat_get_subrange_bounds (const_tree gnu_type, tree *lowval, tree *highval)
721{
722  *lowval = TYPE_MIN_VALUE (gnu_type);
723  *highval = TYPE_MAX_VALUE (gnu_type);
724}
725
726/* GNU_TYPE is the type of a subprogram parameter.  Determine if it should be
727   passed by reference by default.  */
728
729bool
730default_pass_by_ref (tree gnu_type)
731{
732  /* We pass aggregates by reference if they are sufficiently large for
733     their alignment.  The ratio is somewhat arbitrary.  We also pass by
734     reference if the target machine would either pass or return by
735     reference.  Strictly speaking, we need only check the return if this
736     is an In Out parameter, but it's probably best to err on the side of
737     passing more things by reference.  */
738
739  if (pass_by_reference (NULL, TYPE_MODE (gnu_type), gnu_type, true))
740    return true;
741
742  if (targetm.calls.return_in_memory (gnu_type, NULL_TREE))
743    return true;
744
745  if (AGGREGATE_TYPE_P (gnu_type)
746      && (!valid_constant_size_p (TYPE_SIZE_UNIT (gnu_type))
747	  || 0 < compare_tree_int (TYPE_SIZE_UNIT (gnu_type),
748				   TYPE_ALIGN (gnu_type))))
749    return true;
750
751  return false;
752}
753
754/* GNU_TYPE is the type of a subprogram parameter.  Determine if it must be
755   passed by reference.  */
756
757bool
758must_pass_by_ref (tree gnu_type)
759{
760  /* We pass only unconstrained objects, those required by the language
761     to be passed by reference, and objects of variable size.  The latter
762     is more efficient, avoids problems with variable size temporaries,
763     and does not produce compatibility problems with C, since C does
764     not have such objects.  */
765  return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
766	  || TYPE_IS_BY_REFERENCE_P (gnu_type)
767	  || (TYPE_SIZE_UNIT (gnu_type)
768	      && TREE_CODE (TYPE_SIZE_UNIT (gnu_type)) != INTEGER_CST));
769}
770
771/* This function is called by the front-end to enumerate all the supported
772   modes for the machine, as well as some predefined C types.  F is a function
773   which is called back with the parameters as listed below, first a string,
774   then seven ints.  The name is any arbitrary null-terminated string and has
775   no particular significance, except for the case of predefined C types, where
776   it should be the name of the C type.  For integer types, only signed types
777   should be listed, unsigned versions are assumed.  The order of types should
778   be in order of preference, with the smallest/cheapest types first.
779
780   In particular, C predefined types should be listed before other types,
781   binary floating point types before decimal ones, and narrower/cheaper
782   type versions before more expensive ones.  In type selection the first
783   matching variant will be used.
784
785   NAME		pointer to first char of type name
786   DIGS		number of decimal digits for floating-point modes, else 0
787   COMPLEX_P	nonzero is this represents a complex mode
788   COUNT	count of number of items, nonzero for vector mode
789   FLOAT_REP	Float_Rep_Kind for FP, otherwise undefined
790   PRECISION	number of bits used to store data
791   SIZE		number of bits occupied by the mode
792   ALIGN	number of bits to which mode is aligned.  */
793
794void
795enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int))
796{
797  const tree c_types[]
798    = { float_type_node, double_type_node, long_double_type_node };
799  const char *const c_names[]
800    = { "float", "double", "long double" };
801  int iloop;
802
803  /* We are going to compute it below.  */
804  fp_arith_may_widen = false;
805
806  for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++)
807    {
808      machine_mode i = (machine_mode) iloop;
809      machine_mode inner_mode = i;
810      bool float_p = false;
811      bool complex_p = false;
812      bool vector_p = false;
813      bool skip_p = false;
814      int digs = 0;
815      unsigned int nameloop;
816      Float_Rep_Kind float_rep = IEEE_Binary; /* Until proven otherwise */
817
818      switch (GET_MODE_CLASS (i))
819	{
820	case MODE_INT:
821	  break;
822	case MODE_FLOAT:
823	  float_p = true;
824	  break;
825	case MODE_COMPLEX_INT:
826	  complex_p = true;
827	  inner_mode = GET_MODE_INNER (i);
828	  break;
829	case MODE_COMPLEX_FLOAT:
830	  float_p = true;
831	  complex_p = true;
832	  inner_mode = GET_MODE_INNER (i);
833	  break;
834	case MODE_VECTOR_INT:
835	  vector_p = true;
836	  inner_mode = GET_MODE_INNER (i);
837	  break;
838	case MODE_VECTOR_FLOAT:
839	  float_p = true;
840	  vector_p = true;
841	  inner_mode = GET_MODE_INNER (i);
842	  break;
843	default:
844	  skip_p = true;
845	}
846
847      if (float_p)
848	{
849	  const struct real_format *fmt = REAL_MODE_FORMAT (inner_mode);
850
851	  /* ??? Cope with the ghost XFmode of the ARM port.  */
852	  if (!fmt)
853	    continue;
854
855	  /* Be conservative and consider that floating-point arithmetics may
856	     use wider intermediate results as soon as there is an extended
857	     Motorola or Intel mode supported by the machine.  */
858	  if (fmt == &ieee_extended_motorola_format
859	      || fmt == &ieee_extended_intel_96_format
860	      || fmt == &ieee_extended_intel_96_round_53_format
861	      || fmt == &ieee_extended_intel_128_format)
862	    fp_arith_may_widen = true;
863
864	  if (fmt->b == 2)
865	    digs = (fmt->p - 1) * 1233 / 4096; /* scale by log (2) */
866
867	  else if (fmt->b == 10)
868	    digs = fmt->p;
869
870	  else
871	    gcc_unreachable();
872	}
873
874      /* First register any C types for this mode that the front end
875	 may need to know about, unless the mode should be skipped.  */
876      if (!skip_p && !vector_p)
877	for (nameloop = 0; nameloop < ARRAY_SIZE (c_types); nameloop++)
878	  {
879	    tree type = c_types[nameloop];
880	    const char *name = c_names[nameloop];
881
882	    if (TYPE_MODE (type) == i)
883	      {
884		f (name, digs, complex_p, 0, float_rep, TYPE_PRECISION (type),
885		   TREE_INT_CST_LOW (TYPE_SIZE (type)), TYPE_ALIGN (type));
886		skip_p = true;
887	      }
888	  }
889
890      /* If no predefined C types were found, register the mode itself.  */
891      if (!skip_p)
892	f (GET_MODE_NAME (i), digs, complex_p,
893	   vector_p ? GET_MODE_NUNITS (i) : 0, float_rep,
894	   GET_MODE_PRECISION (i), GET_MODE_BITSIZE (i),
895	   GET_MODE_ALIGNMENT (i));
896    }
897}
898
899/* Return the size of the FP mode with precision PREC.  */
900
901int
902fp_prec_to_size (int prec)
903{
904  machine_mode mode;
905
906  for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
907       mode = GET_MODE_WIDER_MODE (mode))
908    if (GET_MODE_PRECISION (mode) == prec)
909      return GET_MODE_BITSIZE (mode);
910
911  gcc_unreachable ();
912}
913
914/* Return the precision of the FP mode with size SIZE.  */
915
916int
917fp_size_to_prec (int size)
918{
919  machine_mode mode;
920
921  for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
922       mode = GET_MODE_WIDER_MODE (mode))
923    if (GET_MODE_BITSIZE (mode) == size)
924      return GET_MODE_PRECISION (mode);
925
926  gcc_unreachable ();
927}
928
929static GTY(()) tree gnat_eh_personality_decl;
930
931/* Return the GNAT personality function decl.  */
932
933static tree
934gnat_eh_personality (void)
935{
936  if (!gnat_eh_personality_decl)
937    gnat_eh_personality_decl = build_personality_function ("gnat");
938  return gnat_eh_personality_decl;
939}
940
941/* Initialize language-specific bits of tree_contains_struct.  */
942
943static void
944gnat_init_ts (void)
945{
946  MARK_TS_COMMON (UNCONSTRAINED_ARRAY_TYPE);
947
948  MARK_TS_TYPED (UNCONSTRAINED_ARRAY_REF);
949  MARK_TS_TYPED (NULL_EXPR);
950  MARK_TS_TYPED (PLUS_NOMOD_EXPR);
951  MARK_TS_TYPED (MINUS_NOMOD_EXPR);
952  MARK_TS_TYPED (ATTR_ADDR_EXPR);
953  MARK_TS_TYPED (STMT_STMT);
954  MARK_TS_TYPED (LOOP_STMT);
955  MARK_TS_TYPED (EXIT_STMT);
956}
957
958/* Definitions for our language-specific hooks.  */
959
960#undef  LANG_HOOKS_NAME
961#define LANG_HOOKS_NAME			"GNU Ada"
962#undef  LANG_HOOKS_IDENTIFIER_SIZE
963#define LANG_HOOKS_IDENTIFIER_SIZE	sizeof (struct tree_identifier)
964#undef  LANG_HOOKS_INIT
965#define LANG_HOOKS_INIT			gnat_init
966#undef  LANG_HOOKS_OPTION_LANG_MASK
967#define LANG_HOOKS_OPTION_LANG_MASK	gnat_option_lang_mask
968#undef  LANG_HOOKS_INIT_OPTIONS_STRUCT
969#define LANG_HOOKS_INIT_OPTIONS_STRUCT	gnat_init_options_struct
970#undef  LANG_HOOKS_INIT_OPTIONS
971#define LANG_HOOKS_INIT_OPTIONS		gnat_init_options
972#undef  LANG_HOOKS_HANDLE_OPTION
973#define LANG_HOOKS_HANDLE_OPTION	gnat_handle_option
974#undef  LANG_HOOKS_POST_OPTIONS
975#define LANG_HOOKS_POST_OPTIONS		gnat_post_options
976#undef  LANG_HOOKS_PARSE_FILE
977#define LANG_HOOKS_PARSE_FILE		gnat_parse_file
978#undef  LANG_HOOKS_TYPE_HASH_EQ
979#define LANG_HOOKS_TYPE_HASH_EQ		gnat_type_hash_eq
980#undef  LANG_HOOKS_GETDECLS
981#define LANG_HOOKS_GETDECLS		lhd_return_null_tree_v
982#undef  LANG_HOOKS_PUSHDECL
983#define LANG_HOOKS_PUSHDECL		gnat_return_tree
984#undef  LANG_HOOKS_WRITE_GLOBALS
985#define LANG_HOOKS_WRITE_GLOBALS	gnat_write_global_declarations
986#undef  LANG_HOOKS_GET_ALIAS_SET
987#define LANG_HOOKS_GET_ALIAS_SET	gnat_get_alias_set
988#undef  LANG_HOOKS_PRINT_DECL
989#define LANG_HOOKS_PRINT_DECL		gnat_print_decl
990#undef  LANG_HOOKS_PRINT_TYPE
991#define LANG_HOOKS_PRINT_TYPE		gnat_print_type
992#undef  LANG_HOOKS_TYPE_MAX_SIZE
993#define LANG_HOOKS_TYPE_MAX_SIZE	gnat_type_max_size
994#undef  LANG_HOOKS_DECL_PRINTABLE_NAME
995#define LANG_HOOKS_DECL_PRINTABLE_NAME	gnat_printable_name
996#undef  LANG_HOOKS_DWARF_NAME
997#define LANG_HOOKS_DWARF_NAME		gnat_dwarf_name
998#undef  LANG_HOOKS_GIMPLIFY_EXPR
999#define LANG_HOOKS_GIMPLIFY_EXPR	gnat_gimplify_expr
1000#undef  LANG_HOOKS_TYPE_FOR_MODE
1001#define LANG_HOOKS_TYPE_FOR_MODE	gnat_type_for_mode
1002#undef  LANG_HOOKS_TYPE_FOR_SIZE
1003#define LANG_HOOKS_TYPE_FOR_SIZE	gnat_type_for_size
1004#undef  LANG_HOOKS_TYPES_COMPATIBLE_P
1005#define LANG_HOOKS_TYPES_COMPATIBLE_P	gnat_types_compatible_p
1006#undef  LANG_HOOKS_GET_ARRAY_DESCR_INFO
1007#define LANG_HOOKS_GET_ARRAY_DESCR_INFO	gnat_get_array_descr_info
1008#undef  LANG_HOOKS_GET_SUBRANGE_BOUNDS
1009#define LANG_HOOKS_GET_SUBRANGE_BOUNDS  gnat_get_subrange_bounds
1010#undef  LANG_HOOKS_DESCRIPTIVE_TYPE
1011#define LANG_HOOKS_DESCRIPTIVE_TYPE	gnat_descriptive_type
1012#undef  LANG_HOOKS_ATTRIBUTE_TABLE
1013#undef  LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE
1014#define LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE gnat_enum_underlying_base_type
1015#define LANG_HOOKS_ATTRIBUTE_TABLE	gnat_internal_attribute_table
1016#undef  LANG_HOOKS_BUILTIN_FUNCTION
1017#define LANG_HOOKS_BUILTIN_FUNCTION	gnat_builtin_function
1018#undef  LANG_HOOKS_EH_PERSONALITY
1019#define LANG_HOOKS_EH_PERSONALITY	gnat_eh_personality
1020#undef  LANG_HOOKS_DEEP_UNSHARING
1021#define LANG_HOOKS_DEEP_UNSHARING	true
1022#undef  LANG_HOOKS_INIT_TS
1023#define LANG_HOOKS_INIT_TS		gnat_init_ts
1024
1025struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
1026
1027#include "gt-ada-misc.h"
1028