/****************************************************************************
 *                                                                          *
 *                         GNAT COMPILER COMPONENTS                         *
 *                                                                          *
 *                                 M I S C                                  *
 *                                                                          *
 *                           C Implementation File                          *
 *                                                                          *
 *          Copyright (C) 1992-2020, Free Software Foundation, Inc.         *
 *                                                                          *
 * GNAT is free software;  you can  redistribute it  and/or modify it under *
 * terms of the  GNU General Public License as published  by the Free Soft- *
 * ware  Foundation;  either version 3,  or (at your option) any later ver- *
 * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
 * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License *
 * for  more details.  You should have  received  a copy of the GNU General *
 * Public License  distributed  with GNAT;  see file  COPYING3.  If not see *
 * <http://www.gnu.org/licenses/>.                                          *
 *                                                                          *
 * GNAT was originally developed  by the GNAT team at  New York University. *
 * Extensive contributions were provided by Ada Core Technologies Inc.      *
 *                                                                          *
 ****************************************************************************/

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "target.h"
#include "tree.h"
#include "diagnostic.h"
#include "opts.h"
#include "alias.h"
#include "fold-const.h"
#include "stor-layout.h"
#include "print-tree.h"
#include "toplev.h"
#include "tree-pass.h"
#include "langhooks.h"
#include "langhooks-def.h"
#include "plugin.h"
#include "calls.h"	/* For pass_by_reference.  */
#include "dwarf2out.h"

#include "ada.h"
#include "adadecode.h"
#include "types.h"
#include "atree.h"
#include "namet.h"
#include "nlists.h"
#include "snames.h"
#include "uintp.h"
#include "fe.h"
#include "sinfo.h"
#include "einfo.h"
#include "ada-tree.h"
#include "gigi.h"

/* Command-line argc and argv.  These variables are global since they are
   imported in back_end.adb.  */
unsigned int save_argc;
const char **save_argv;

/* GNAT argc and argv generated by the binder for all Ada programs.  */
extern int gnat_argc;
extern const char **gnat_argv;

/* Ada code requires variables for these settings rather than elements
   of the global_options structure because they are imported.  */
#undef gnat_encodings
enum dwarf_gnat_encodings gnat_encodings = DWARF_GNAT_ENCODINGS_DEFAULT;

#undef optimize
int optimize;

#undef optimize_size
int optimize_size;

#undef flag_short_enums
int flag_short_enums;

#undef flag_stack_check
enum stack_check_type flag_stack_check = NO_STACK_CHECK;

#ifdef __cplusplus
extern "C" {
#endif

/* Declare functions we use as part of startup.  */
extern void __gnat_initialize (void *);
extern void __gnat_install_SEH_handler (void *);
extern void adainit (void);
extern void _ada_gnat1drv (void);

#ifdef __cplusplus
}
#endif

/* The parser for the language.  For us, we process the GNAT tree.  */

static void
gnat_parse_file (void)
{
  int seh[2];

  /* Call the target specific initializations.  */
  __gnat_initialize (NULL);

  /* ??? Call the SEH initialization routine.  This is to workaround
  a bootstrap path problem.  The call below should be removed at some
  point and the SEH pointer passed to __gnat_initialize above.  */
  __gnat_install_SEH_handler ((void *)seh);

  /* Call the front-end elaboration procedures.  */
  adainit ();

  /* Call the front end.  */
  _ada_gnat1drv ();

  /* Write the global declarations.  */
  gnat_write_global_declarations ();
}

/* Return language mask for option processing.  */

static unsigned int
gnat_option_lang_mask (void)
{
  return CL_Ada;
}

/* Decode all the language specific options that cannot be decoded by GCC.
   The option decoding phase of GCC calls this routine on the flags that
   are marked as Ada-specific.  Return true on success or false on failure.  */

static bool
gnat_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
		    int kind, location_t loc,
		    const struct cl_option_handlers *handlers)
{
  enum opt_code code = (enum opt_code) scode;

  switch (code)
    {
    case OPT_Wall:
      handle_generated_option (&global_options, &global_options_set,
			       OPT_Wunused, NULL, value,
			       gnat_option_lang_mask (), kind, loc,
			       handlers, true, global_dc);
      warn_uninitialized = value;
      warn_maybe_uninitialized = value;
      break;

    case OPT_gant:
      warning (0, "%<-gnat%> misspelled as %<-gant%>");

      /* ... fall through ... */

    case OPT_gnat:
    case OPT_gnatO:
    case OPT_fRTS_:
    case OPT_I:
    case OPT_fdump_scos:
    case OPT_nostdinc:
    case OPT_nostdlib:
      /* These are handled by the front-end.  */
      break;

    case OPT_fshort_enums:
    case OPT_fsigned_char:
    case OPT_funsigned_char:
      /* These are handled by the middle-end.  */
      break;

    case OPT_fbuiltin_printf:
      /* This is ignored in Ada but needs to be accepted so it can be
	 defaulted.  */
      break;

    default:
      gcc_unreachable ();
    }

  Ada_handle_option_auto (&global_options, &global_options_set,
			  scode, arg, value,
			  gnat_option_lang_mask (), kind, loc,
			  handlers, global_dc);
  return true;
}

/* Initialize options structure OPTS.  */

static void
gnat_init_options_struct (struct gcc_options *opts)
{
  /* Uninitialized really means uninitialized in Ada.  */
  opts->x_flag_zero_initialized_in_bss = 0;

  /* We don't care about errno in Ada and it causes __builtin_sqrt to
     call the libm function rather than do it inline.  */
  opts->x_flag_errno_math = 0;
  opts->frontend_set_flag_errno_math = true;
}

/* Initialize for option processing.  */

static void
gnat_init_options (unsigned int decoded_options_count,
		   struct cl_decoded_option *decoded_options)
{
  /* Reconstruct an argv array for use of back_end.adb.

     ??? back_end.adb should not rely on this; instead, it should work with
     decoded options without such reparsing, to ensure consistency in how
     options are decoded.  */
  save_argv = XNEWVEC (const char *, 2 * decoded_options_count + 1);
  save_argc = 0;
  for (unsigned int i = 0; i < decoded_options_count; i++)
    {
      size_t num_elements = decoded_options[i].canonical_option_num_elements;

      if (decoded_options[i].errors
	  || decoded_options[i].opt_index == OPT_SPECIAL_unknown
	  || num_elements == 0)
	continue;

      /* Deal with -I- specially since it must be a single switch.  */
      if (decoded_options[i].opt_index == OPT_I
	  && num_elements == 2
	  && decoded_options[i].canonical_option[1][0] == '-'
	  && decoded_options[i].canonical_option[1][1] == '\0')
	save_argv[save_argc++] = "-I-";
      else
	{
	  gcc_assert (num_elements >= 1 && num_elements <= 2);
	  save_argv[save_argc++] = decoded_options[i].canonical_option[0];
	  if (num_elements >= 2)
	    save_argv[save_argc++] = decoded_options[i].canonical_option[1];
	}
    }
  save_argv[save_argc] = NULL;

  /* Pass just the name of the command through the regular channel.  */
  gnat_argv = (const char **) xmalloc (sizeof (char *));
  gnat_argv[0] = xstrdup (save_argv[0]);
  gnat_argc = 1;
}

/* Settings adjustments after switches processing by the back-end.
   Note that the front-end switches processing (Scan_Compiler_Arguments)
   has not been done yet at this point!  */

static bool
gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
{
  /* Excess precision other than "fast" requires front-end support.  */
  if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
    sorry ("%<-fexcess-precision=standard%> for Ada");
  flag_excess_precision = EXCESS_PRECISION_FAST;

  /* No psABI change warnings for Ada.  */
  warn_psabi = 0;

  /* No return type warnings for Ada.  */
  warn_return_type = 0;

  /* No string overflow warnings for Ada.  */
  warn_stringop_overflow = 0;

  /* No caret by default for Ada.  */
  if (!global_options_set.x_flag_diagnostics_show_caret)
    global_dc->show_caret = false;

  /* Warn only if STABS is not the default: we don't want to emit a warning if
     the user did not use a -gstabs option.  */
  if (PREFERRED_DEBUGGING_TYPE != DBX_DEBUG && write_symbols == DBX_DEBUG)
    warning (0, "STABS debugging information for Ada is obsolete and not "
		"supported anymore");

  /* Copy global settings to local versions.  */
  gnat_encodings = global_options.x_gnat_encodings;
  optimize = global_options.x_optimize;
  optimize_size = global_options.x_optimize_size;
  flag_stack_check = global_options.x_flag_stack_check;
  flag_short_enums = global_options.x_flag_short_enums;

  /* Unfortunately the post_options hook is called before the value of
     flag_short_enums is autodetected, if need be.  Mimic the process
     for our private flag_short_enums.  */
  if (flag_short_enums == 2)
    flag_short_enums = targetm.default_short_enums ();

  return false;
}

/* Here is the function to handle the compiler error processing in GCC.  */

static void
internal_error_function (diagnostic_context *context, const char *msgid,
			 va_list *ap)
{
  text_info tinfo;
  char *buffer, *p, *loc;
  String_Template temp, temp_loc;
  String_Pointer sp, sp_loc;
  expanded_location xloc;

  /* Warn if plugins present.  */
  warn_if_plugins ();

  /* Dump the representation of the function.  */
  emergency_dump_function ();

  /* Reset the pretty-printer.  */
  pp_clear_output_area (context->printer);

  /* Format the message into the pretty-printer.  */
  tinfo.format_spec = msgid;
  tinfo.args_ptr = ap;
  tinfo.err_no = errno;
  pp_format_verbatim (context->printer, &tinfo);

  /* Extract a (writable) pointer to the formatted text.  */
  buffer = xstrdup (pp_formatted_text (context->printer));

  /* Go up to the first newline.  */
  for (p = buffer; *p; p++)
    if (*p == '\n')
      {
	*p = '\0';
	break;
      }

  temp.Low_Bound = 1;
  temp.High_Bound = p - buffer;
  sp.Bounds = &temp;
  sp.Array = buffer;

  xloc = expand_location (input_location);
  if (context->show_column && xloc.column != 0)
    loc = xasprintf ("%s:%d:%d", xloc.file, xloc.line, xloc.column);
  else
    loc = xasprintf ("%s:%d", xloc.file, xloc.line);
  temp_loc.Low_Bound = 1;
  temp_loc.High_Bound = strlen (loc);
  sp_loc.Bounds = &temp_loc;
  sp_loc.Array = loc;

  Compiler_Abort (sp, sp_loc, true);
}

/* Perform all the initialization steps that are language-specific.  */

static bool
gnat_init (void)
{
  /* Do little here, most of the standard declarations are set up after the
     front-end has been run.  Use the same `char' as C for Interfaces.C.  */
  build_common_tree_nodes (flag_signed_char);

  /* In Ada, we use an unsigned 8-bit type for the default boolean type.  */
  boolean_type_node = make_unsigned_type (8);
  TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
  SET_TYPE_RM_MAX_VALUE (boolean_type_node,
			 build_int_cst (boolean_type_node, 1));
  SET_TYPE_RM_SIZE (boolean_type_node, bitsize_int (1));
  boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
  boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);

  sbitsize_one_node = sbitsize_int (1);
  sbitsize_unit_node = sbitsize_int (BITS_PER_UNIT);

  /* In Ada, we do not use location ranges.  */
  line_table->default_range_bits = 0;

  /* Register our internal error function.  */
  global_dc->internal_error = &internal_error_function;

  return true;
}

/* Initialize the GCC support for exception handling.  */

void
gnat_init_gcc_eh (void)
{
  /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
     though. This could for instance lead to the emission of tables with
     references to symbols (such as the Ada eh personality routine) within
     libraries we won't link against.  */
  if (No_Exception_Handlers_Set ())
    return;

  /* Tell GCC we are handling cleanup actions through exception propagation.
     This opens possibilities that we don't take advantage of yet, but is
     nonetheless necessary to ensure that fixup code gets assigned to the
     right exception regions.  */
  using_eh_for_cleanups ();

  /* Turn on -fexceptions, -fnon-call-exceptions and -fdelete-dead-exceptions.
     The first one activates the support for exceptions in the compiler.
     The second one is useful for two reasons: 1/ we map some asynchronous
     signals like SEGV to exceptions, so we need to ensure that the insns
     which can lead to such signals are correctly attached to the exception
     region they pertain to, 2/ some calls to pure subprograms are handled as
     libcall blocks and then marked as "cannot trap" if the flag is not set
     (see emit_libcall_block).  We should not let this be since it is possible
     for such calls to actually raise in Ada.
     The third one is an optimization that makes it possible to delete dead
     instructions that may throw exceptions, most notably loads and stores,
     as permitted in Ada.
     Turn off -faggressive-loop-optimizations because it may optimize away
     out-of-bound array accesses that we want to be able to catch.
     If checks are disabled, we use the same settings as the C++ compiler,
     except for the runtime on platforms where S'Machine_Overflow is true
     because the runtime depends on FP (hardware) checks being properly
     handled despite being compiled in -gnatp mode.  */
  flag_exceptions = 1;
  flag_delete_dead_exceptions = 1;
  if (Suppress_Checks)
    {
      if (!global_options_set.x_flag_non_call_exceptions)
	flag_non_call_exceptions = Machine_Overflows_On_Target && GNAT_Mode;
    }
  else
    {
      if (!global_options_set.x_flag_non_call_exceptions)
        flag_non_call_exceptions = 1;
      flag_aggressive_loop_optimizations = 0;
      warn_aggressive_loop_optimizations = 0;
    }

  init_eh ();
}

/* Initialize the GCC support for floating-point operations.  */

void
gnat_init_gcc_fp (void)
{
  /* Disable FP optimizations that ignore the signedness of zero if
     S'Signed_Zeros is true, but don't override the user if not.  */
  if (Signed_Zeros_On_Target)
    flag_signed_zeros = 1;
  else if (!global_options_set.x_flag_signed_zeros)
    flag_signed_zeros = 0;

  /* Assume that FP operations can trap if S'Machine_Overflow is true,
     but don't override the user if not.  */
  if (Machine_Overflows_On_Target)
    flag_trapping_math = 1;
  else if (!global_options_set.x_flag_trapping_math)
    flag_trapping_math = 0;
}

/* Print language-specific items in declaration NODE.  */

static void
gnat_print_decl (FILE *file, tree node, int indent)
{
  switch (TREE_CODE (node))
    {
    case CONST_DECL:
      print_node (file, "corresponding var",
		  DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
      break;

    case FIELD_DECL:
      print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
		  indent + 4);
      break;

    case VAR_DECL:
      if (DECL_LOOP_PARM_P (node))
	print_node (file, "induction var", DECL_INDUCTION_VAR (node),
		    indent + 4);
      break;

    default:
      break;
    }
}

/* Print language-specific items in type NODE.  */

static void
gnat_print_type (FILE *file, tree node, int indent)
{
  switch (TREE_CODE (node))
    {
    case FUNCTION_TYPE:
    case METHOD_TYPE:
      print_node (file, "ci/co list", TYPE_CI_CO_LIST (node), indent + 4);
      break;

    case INTEGER_TYPE:
      if (TYPE_MODULAR_P (node))
	print_node_brief (file, "modulus", TYPE_MODULUS (node), indent + 4);
      else if (TYPE_FIXED_POINT_P (node))
	print_node (file, "scale factor", TYPE_SCALE_FACTOR (node),
		    indent + 4);
      else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
	print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
		    indent + 4);
      else
	print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);

      /* ... fall through ... */

    case ENUMERAL_TYPE:
    case BOOLEAN_TYPE:
      print_node_brief (file, "RM size", TYPE_RM_SIZE (node), indent + 4);

      /* ... fall through ... */

    case REAL_TYPE:
      print_node_brief (file, "RM min", TYPE_RM_MIN_VALUE (node), indent + 4);
      print_node_brief (file, "RM max", TYPE_RM_MAX_VALUE (node), indent + 4);
      break;

    case ARRAY_TYPE:
      print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
      break;

    case VECTOR_TYPE:
      print_node (file,"representative array",
		  TYPE_REPRESENTATIVE_ARRAY (node), indent + 4);
      break;

    case RECORD_TYPE:
      if (TYPE_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
	print_node (file, "unconstrained array",
		    TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
      else
	print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
      break;

    case UNION_TYPE:
    case QUAL_UNION_TYPE:
      print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
      break;

    default:
      break;
    }

  if (TYPE_CAN_HAVE_DEBUG_TYPE_P (node) && TYPE_DEBUG_TYPE (node))
    print_node_brief (file, "debug type", TYPE_DEBUG_TYPE (node), indent + 4);

  if (TYPE_IMPL_PACKED_ARRAY_P (node) && TYPE_ORIGINAL_PACKED_ARRAY (node))
    print_node_brief (file, "original packed array",
		      TYPE_ORIGINAL_PACKED_ARRAY (node), indent + 4);
}

/* Return the name to be printed for DECL.  */

static const char *
gnat_printable_name (tree decl, int verbosity)
{
  const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
  char *ada_name = (char *) ggc_alloc_atomic (strlen (coded_name) * 2 + 60);

  __gnat_decode (coded_name, ada_name, 0);

  if (verbosity == 2 && !DECL_IS_UNDECLARED_BUILTIN (decl))
    {
      Set_Identifier_Casing (ada_name, DECL_SOURCE_FILE (decl));
      return ggc_strdup (Name_Buffer);
    }

  return ada_name;
}

/* Return the name to be used in DWARF debug info for DECL.  */

static const char *
gnat_dwarf_name (tree decl, int verbosity ATTRIBUTE_UNUSED)
{
  gcc_assert (DECL_P (decl));
  return (const char *) IDENTIFIER_POINTER (DECL_NAME (decl));
}

/* Return the descriptive type associated with TYPE, if any.  */

static tree
gnat_descriptive_type (const_tree type)
{
  if (TYPE_STUB_DECL (type))
    return DECL_PARALLEL_TYPE (TYPE_STUB_DECL (type));
  else
    return NULL_TREE;
}

/* Return the underlying base type of an enumeration type.  */

static tree
gnat_enum_underlying_base_type (const_tree)
{
  /* Enumeration types are base types in Ada.  */
  return void_type_node;
}

/* Return the type to be used for debugging information instead of TYPE or
   NULL_TREE if TYPE is fine.  */

static tree
gnat_get_debug_type (const_tree type)
{
  if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type))
    return TYPE_DEBUG_TYPE (type);
  else
    return NULL_TREE;
}

/* Provide information in INFO for debugging output about the TYPE fixed-point
   type.  Return whether TYPE is handled.  */

static bool
gnat_get_fixed_point_type_info (const_tree type,
				struct fixed_point_type_info *info)
{
  tree scale_factor;

  /* Do nothing if the GNAT encodings are used.  */
  if (!TYPE_IS_FIXED_POINT_P (type)
      || gnat_encodings == DWARF_GNAT_ENCODINGS_ALL)
    return false;

  scale_factor = TYPE_SCALE_FACTOR (type);

  /* We expect here only a finite set of pattern.  See fixed-point types
     handling in gnat_to_gnu_entity.  */

  if (TREE_CODE (scale_factor) == RDIV_EXPR)
    {
      tree num = TREE_OPERAND (scale_factor, 0);
      tree den = TREE_OPERAND (scale_factor, 1);

      /* See if we have a binary or decimal scale.  */
      if (TREE_CODE (den) == POWER_EXPR)
	{
	  tree base = TREE_OPERAND (den, 0);
	  tree exponent = TREE_OPERAND (den, 1);

	  /* We expect the scale factor to be 1 / 2 ** N or 1 / 10 ** N.  */
	  gcc_assert (num == integer_one_node
		      && TREE_CODE (base) == INTEGER_CST
		      && TREE_CODE (exponent) == INTEGER_CST);

	  switch (tree_to_shwi (base))
	    {
	    case 2:
	      info->scale_factor_kind = fixed_point_scale_factor_binary;
	      info->scale_factor.binary = -tree_to_shwi (exponent);
	      return true;

	    case 10:
	      info->scale_factor_kind = fixed_point_scale_factor_decimal;
	      info->scale_factor.decimal = -tree_to_shwi (exponent);
	      return true;

	    default:
	      gcc_unreachable ();
	    }
	}

      /* If we reach this point, we are handling an arbitrary scale factor.  We
	 expect N / D with constant operands.  */
      gcc_assert (TREE_CODE (num) == INTEGER_CST
		  && TREE_CODE (den) == INTEGER_CST);

      info->scale_factor_kind = fixed_point_scale_factor_arbitrary;
      info->scale_factor.arbitrary.numerator = num;
      info->scale_factor.arbitrary.denominator = den;
      return true;
    }

  gcc_unreachable ();
}

/* Return true if types T1 and T2 are identical for type hashing purposes.
   Called only after doing all language independent checks.  At present,
   this is only called when both types are FUNCTION_TYPE or METHOD_TYPE.  */

static bool
gnat_type_hash_eq (const_tree t1, const_tree t2)
{
  gcc_assert (FUNC_OR_METHOD_TYPE_P (t1) && TREE_CODE (t1) == TREE_CODE (t2));
  return fntype_same_flags_p (t1, TYPE_CI_CO_LIST (t2),
			      TYPE_RETURN_UNCONSTRAINED_P (t2),
			      TYPE_RETURN_BY_DIRECT_REF_P (t2),
			      TREE_ADDRESSABLE (t2));
}

/* Do nothing (return the tree node passed).  */

static tree
gnat_return_tree (tree t)
{
  return t;
}

/* Get the alias set corresponding to a type or expression.  */

static alias_set_type
gnat_get_alias_set (tree type)
{
  /* If this is a padding type, use the type of the first field.  */
  if (TYPE_IS_PADDING_P (type))
    return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));

  /* If this is an extra subtype, use the base type.  */
  else if (TYPE_IS_EXTRA_SUBTYPE_P (type))
    return get_alias_set (get_base_type (type));

  /* If the type is an unconstrained array, use the type of the
     self-referential array we make.  */
  else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
    return
      get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));

  /* If the type can alias any other types, return the alias set 0.  */
  else if (TYPE_P (type)
	   && !TYPE_IS_DUMMY_P (type)
	   && TYPE_UNIVERSAL_ALIASING_P (type))
    return 0;

  return -1;
}

/* GNU_TYPE is a type.  Return its maximum size in bytes, if known,
   as a constant when possible.  */

static tree
gnat_type_max_size (const_tree gnu_type)
{
  /* First see what we can get from TYPE_SIZE_UNIT, which might not
     be constant even for simple expressions if it has already been
     elaborated and possibly replaced by a VAR_DECL.  */
  tree max_size_unit = max_size (TYPE_SIZE_UNIT (gnu_type), true);

  /* If we don't have a constant, see what we can get from TYPE_ADA_SIZE,
     which should stay untouched.  */
  if (!tree_fits_uhwi_p (max_size_unit)
      && RECORD_OR_UNION_TYPE_P (gnu_type)
      && !TYPE_FAT_POINTER_P (gnu_type)
      && TYPE_ADA_SIZE (gnu_type))
    {
      tree max_ada_size = max_size (TYPE_ADA_SIZE (gnu_type), true);

      /* If we have succeeded in finding a constant, round it up to the
	 type's alignment and return the result in units.  */
      if (tree_fits_uhwi_p (max_ada_size))
	max_size_unit
	  = size_binop (CEIL_DIV_EXPR,
			round_up (max_ada_size, TYPE_ALIGN (gnu_type)),
			bitsize_unit_node);
    }

  return max_size_unit;
}

static tree get_array_bit_stride (tree);

/* Provide information in INFO for debug output about the TYPE array type.
   Return whether TYPE is handled.  */

static bool
gnat_get_array_descr_info (const_tree const_type,
			   struct array_descr_info *info)
{
  tree type = const_cast<tree> (const_type);
  tree first_dimen, dimen;
  bool is_packed_array, is_array;
  int i;

  /* Temporaries created in the first pass and used in the second one for thin
     pointers.  The first one is an expression that yields the template record
     from the base address (i.e. the PLACEHOLDER_EXPR).  The second one is just
     a cursor through this record's fields.  */
  tree thinptr_template_expr = NULL_TREE;
  tree thinptr_bound_field = NULL_TREE;

  /* If we have an implementation type for a packed array, get the orignial
     array type.  */
  if (TYPE_IMPL_PACKED_ARRAY_P (type) && TYPE_ORIGINAL_PACKED_ARRAY (type))
    {
      type = TYPE_ORIGINAL_PACKED_ARRAY (type);
      is_packed_array = true;
    }
  else
    is_packed_array = false;

  /* First pass: gather all information about this array except everything
     related to dimensions.  */

  /* Only handle ARRAY_TYPE nodes that come from GNAT.  */
  if (TREE_CODE (type) == ARRAY_TYPE
      && TYPE_DOMAIN (type)
      && TYPE_INDEX_TYPE (TYPE_DOMAIN (type)))
    {
      is_array = true;
      first_dimen = type;
    }

  /* As well as array types embedded in a record type with their bounds.  */
  else if (TREE_CODE (type) == RECORD_TYPE
	   && TYPE_CONTAINS_TEMPLATE_P (type)
	   && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
    {
      /* This will be our base object address.  Note that we assume that
	 pointers to this will actually point to the array field (thin
	 pointers are shifted).  */
      tree placeholder_expr = build0 (PLACEHOLDER_EXPR, type);
      tree placeholder_addr
	= build_unary_op (ADDR_EXPR, NULL_TREE, placeholder_expr);

      tree bounds_field = TYPE_FIELDS (type);
      tree bounds_type = TREE_TYPE (bounds_field);
      tree array_field = DECL_CHAIN (bounds_field);
      tree array_type = TREE_TYPE (array_field);

      /* Shift back the address to get the address of the template.  */
      tree shift_amount
	= fold_build1 (NEGATE_EXPR, sizetype, byte_position (array_field));
      tree template_addr
	= build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (placeholder_addr),
			   placeholder_addr, shift_amount);
      template_addr
	= fold_convert (TYPE_POINTER_TO (bounds_type), template_addr);

      thinptr_template_expr
	= build_unary_op (INDIRECT_REF, NULL_TREE, template_addr);
      thinptr_bound_field = TYPE_FIELDS (bounds_type);

      is_array = false;
      first_dimen = array_type;
    }

  else
    return false;

  /* Second pass: compute the remaining information: dimensions and
     corresponding bounds.  */

  /* If this array has fortran convention, it's arranged in column-major
     order, so our view here has reversed dimensions.  */
  const bool convention_fortran_p = TYPE_CONVENTION_FORTRAN_P (first_dimen);

  if (TYPE_PACKED (first_dimen))
    is_packed_array = true;

  /* ??? For row major ordering, we probably want to emit nothing and
     instead specify it as the default in Dw_TAG_compile_unit.  */
  info->ordering = (convention_fortran_p
		    ? array_descr_ordering_column_major
		    : array_descr_ordering_row_major);
  info->rank = NULL_TREE;

  /* Count the number of dimensions and determine the element type.  */
  i = 1;
  dimen = TREE_TYPE (first_dimen);
  while (TREE_CODE (dimen) == ARRAY_TYPE && TYPE_MULTI_ARRAY_P (dimen))
    {
      i++;
      dimen = TREE_TYPE (dimen);
    }
  info->ndimensions = i;
  info->element_type = dimen;

  /* Too many dimensions?  Give up generating proper description: yield instead
     nested arrays.  Note that in this case, this hook is invoked once on each
     intermediate array type: be consistent and output nested arrays for all
     dimensions.  */
  if (info->ndimensions > DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
      || TYPE_MULTI_ARRAY_P (first_dimen))
    {
      info->ndimensions = 1;
      info->element_type = TREE_TYPE (first_dimen);
    }

  /* Now iterate over all dimensions in source order and fill the info
     structure.  */
  for (i = (convention_fortran_p ? info->ndimensions - 1 : 0),
       dimen = first_dimen;
       IN_RANGE (i, 0, info->ndimensions - 1);
       i += (convention_fortran_p ? -1 : 1),
       dimen = TREE_TYPE (dimen))
    {
      /* We are interested in the stored bounds for the debug info.  */
      tree index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (dimen));

      if (is_array)
	{
	  /* GDB does not handle very well the self-referencial bound
	     expressions we are able to generate here for XUA types (they are
	     used only by XUP encodings) so avoid them in this case.  Note that
	     there are two cases where we generate self-referencial bound
	     expressions:  arrays that are constrained by record discriminants
	     and XUA types.  */
	  if (TYPE_CONTEXT (first_dimen)
	      && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
	      && CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (index_type))
	      && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
	    {
	      info->dimen[i].lower_bound = NULL_TREE;
	      info->dimen[i].upper_bound = NULL_TREE;
	    }
	  else
	    {
	      info->dimen[i].lower_bound
		= maybe_character_value (TYPE_MIN_VALUE (index_type));
	      info->dimen[i].upper_bound
		= maybe_character_value (TYPE_MAX_VALUE (index_type));
	    }
	}

      /* This is a thin pointer.  */
      else
	{
	  info->dimen[i].lower_bound
	    = build_component_ref (thinptr_template_expr, thinptr_bound_field,
				   false);
	  thinptr_bound_field = DECL_CHAIN (thinptr_bound_field);

	  info->dimen[i].upper_bound
	    = build_component_ref (thinptr_template_expr, thinptr_bound_field,
				   false);
	  thinptr_bound_field = DECL_CHAIN (thinptr_bound_field);
	}

      /* The DWARF back-end will output BOUNDS_TYPE as the base type of
	 the array index, so get to the base type of INDEX_TYPE.  */
      while (TREE_TYPE (index_type))
	index_type = TREE_TYPE (index_type);

      info->dimen[i].bounds_type = maybe_debug_type (index_type);
      info->dimen[i].stride = NULL_TREE;
    }

  /* These are Fortran-specific fields.  They make no sense here.  */
  info->allocated = NULL_TREE;
  info->associated = NULL_TREE;
  info->data_location = NULL_TREE;

  if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
    {
      /* When arrays contain dynamically-sized elements, we usually wrap them
	 in padding types, or we create constrained types for them.  Then, if
	 such types are stripped in the debugging information output, the
	 debugger needs a way to know the size that is reserved for each
	 element.  This is why we emit a stride in such situations.  */
      tree source_element_type = info->element_type;

      while (true)
	{
	  if (TYPE_DEBUG_TYPE (source_element_type))
	    source_element_type = TYPE_DEBUG_TYPE (source_element_type);
	  else if (TYPE_IS_PADDING_P (source_element_type))
	    source_element_type
	      = TREE_TYPE (TYPE_FIELDS (source_element_type));
	  else
	    break;
	}

      if (TREE_CODE (TYPE_SIZE_UNIT (source_element_type)) != INTEGER_CST)
	{
	  info->stride = TYPE_SIZE_UNIT (info->element_type);
	  info->stride_in_bits = false;
	}

      /* We need to specify a bit stride when it does not correspond to the
	 natural size of the contained elements.  ??? Note that we do not
	 support packed records and nested packed arrays.  */
      else if (is_packed_array)
	{
	  info->stride = get_array_bit_stride (info->element_type);
	  info->stride_in_bits = true;
	}
    }

  return true;
}

/* Given the component type COMP_TYPE of a packed array, return an expression
   that computes the bit stride of this packed array.  Return NULL_TREE when
   unsuccessful.  */

static tree
get_array_bit_stride (tree comp_type)
{
  struct array_descr_info info;
  tree stride;

  /* Simple case: the array contains an integral type: return its RM size.  */
  if (INTEGRAL_TYPE_P (comp_type))
    return TYPE_RM_SIZE (comp_type);

  /* Likewise for record or union types.  */
  if (RECORD_OR_UNION_TYPE_P (comp_type) && !TYPE_FAT_POINTER_P (comp_type))
    return TYPE_ADA_SIZE (comp_type);

  /* The gnat_get_array_descr_info debug hook expects a debug tyoe.  */
  comp_type = maybe_debug_type (comp_type);

  /* Otherwise, see if this is an array we can analyze; if it's not, punt.  */
  memset (&info, 0, sizeof (info));
  if (!gnat_get_array_descr_info (comp_type, &info) || !info.stride)
    return NULL_TREE;

  /* Otherwise, the array stride is the inner array's stride multiplied by the
     number of elements it contains.  Note that if the inner array is not
     packed, then the stride is "natural" and thus does not deserve an
     attribute.  */
  stride = info.stride;
  if (!info.stride_in_bits)
    {
      stride = fold_convert (bitsizetype, stride);
      stride = build_binary_op (MULT_EXPR, bitsizetype,
				stride, build_int_cst (bitsizetype, 8));
    }

  for (int i = 0; i < info.ndimensions; ++i)
    {
      tree count;

      if (!info.dimen[i].lower_bound || !info.dimen[i].upper_bound)
	return NULL_TREE;

      /* Put in count an expression that computes the length of this
	 dimension.  */
      count = build_binary_op (MINUS_EXPR, sbitsizetype,
			       fold_convert (sbitsizetype,
					     info.dimen[i].upper_bound),
			       fold_convert (sbitsizetype,
					     info.dimen[i].lower_bound)),
      count = build_binary_op (PLUS_EXPR, sbitsizetype,
			       count, build_int_cst (sbitsizetype, 1));
      count = build_binary_op (MAX_EXPR, sbitsizetype,
			       count,
			       build_int_cst (sbitsizetype, 0));
      count = fold_convert (bitsizetype, count);
      stride = build_binary_op (MULT_EXPR, bitsizetype, stride, count);
    }

  return stride;
}

/* GNU_TYPE is a subtype of an integral type.  Set LOWVAL to the low bound
   and HIGHVAL to the high bound, respectively.  */

static void
gnat_get_subrange_bounds (const_tree gnu_type, tree *lowval, tree *highval)
{
  *lowval = TYPE_MIN_VALUE (gnu_type);
  *highval = TYPE_MAX_VALUE (gnu_type);
}

/* Return the bias of GNU_TYPE, if any.  */

static tree
gnat_get_type_bias (const_tree gnu_type)
{
  if (TREE_CODE (gnu_type) == INTEGER_TYPE
      && TYPE_BIASED_REPRESENTATION_P (gnu_type)
      && gnat_encodings != DWARF_GNAT_ENCODINGS_ALL)
    return TYPE_RM_MIN_VALUE (gnu_type);

  return NULL_TREE;
}

/* GNU_TYPE is the type of a subprogram parameter.  Determine if it should be
   passed by reference by default.  */

bool
default_pass_by_ref (tree gnu_type)
{
  /* We pass aggregates by reference if they are sufficiently large for
     their alignment.  The ratio is somewhat arbitrary.  We also pass by
     reference if the target machine would either pass or return by
     reference.  Strictly speaking, we need only check the return if this
     is an In Out parameter, but it's probably best to err on the side of
     passing more things by reference.  */

  if (AGGREGATE_TYPE_P (gnu_type)
      && (!valid_constant_size_p (TYPE_SIZE_UNIT (gnu_type))
	  || compare_tree_int (TYPE_SIZE_UNIT (gnu_type),
			       TYPE_ALIGN (gnu_type)) > 0))
    return true;

  if (pass_by_reference (NULL, function_arg_info (gnu_type, /*named=*/true)))
    return true;

  if (targetm.calls.return_in_memory (gnu_type, NULL_TREE))
    return true;

  return false;
}

/* GNU_TYPE is the type of a subprogram parameter.  Determine if it must be
   passed by reference.  */

bool
must_pass_by_ref (tree gnu_type)
{
  /* We pass only unconstrained objects, those required by the language
     to be passed by reference, and objects of variable size.  The latter
     is more efficient, avoids problems with variable size temporaries,
     and does not produce compatibility problems with C, since C does
     not have such objects.  */
  return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
	  || TYPE_IS_BY_REFERENCE_P (gnu_type)
	  || (TYPE_SIZE_UNIT (gnu_type)
	      && TREE_CODE (TYPE_SIZE_UNIT (gnu_type)) != INTEGER_CST));
}

/* This function is called by the front-end to enumerate all the supported
   modes for the machine, as well as some predefined C types.  F is a function
   which is called back with the parameters as listed below, first a string,
   then seven ints.  The name is any arbitrary null-terminated string and has
   no particular significance, except for the case of predefined C types, where
   it should be the name of the C type.  For integer types, only signed types
   should be listed, unsigned versions are assumed.  The order of types should
   be in order of preference, with the smallest/cheapest types first.

   In particular, C predefined types should be listed before other types,
   binary floating point types before decimal ones, and narrower/cheaper
   type versions before more expensive ones.  In type selection the first
   matching variant will be used.

   NAME		pointer to first char of type name
   DIGS		number of decimal digits for floating-point modes, else 0
   COMPLEX_P	nonzero is this represents a complex mode
   COUNT	count of number of items, nonzero for vector mode
   FLOAT_REP	Float_Rep_Kind for FP, otherwise undefined
   PRECISION	number of bits used to store data
   SIZE		number of bits occupied by the mode
   ALIGN	number of bits to which mode is aligned.  */

void
enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int))
{
  tree const c_types[]
    = { float_type_node, double_type_node, long_double_type_node };
  const char *const c_names[]
    = { "float", "double", "long double" };
  int iloop;

  /* We are going to compute it below.  */
  fp_arith_may_widen = false;

  for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++)
    {
      machine_mode i = (machine_mode) iloop;
      machine_mode inner_mode = i;
      bool float_p = false;
      bool complex_p = false;
      bool vector_p = false;
      bool skip_p = false;
      int digs = 0;
      unsigned int nameloop;
      Float_Rep_Kind float_rep = IEEE_Binary; /* Until proven otherwise */

      switch (GET_MODE_CLASS (i))
	{
	case MODE_INT:
	  break;
	case MODE_FLOAT:
	  float_p = true;
	  break;
	case MODE_COMPLEX_INT:
	  complex_p = true;
	  inner_mode = GET_MODE_INNER (i);
	  break;
	case MODE_COMPLEX_FLOAT:
	  float_p = true;
	  complex_p = true;
	  inner_mode = GET_MODE_INNER (i);
	  break;
	case MODE_VECTOR_INT:
	  vector_p = true;
	  inner_mode = GET_MODE_INNER (i);
	  break;
	case MODE_VECTOR_FLOAT:
	  float_p = true;
	  vector_p = true;
	  inner_mode = GET_MODE_INNER (i);
	  break;
	default:
	  skip_p = true;
	}

      if (float_p)
	{
	  const struct real_format *fmt = REAL_MODE_FORMAT (inner_mode);

	  /* ??? Cope with the ghost XFmode of the ARM port.  */
	  if (!fmt)
	    continue;

	  /* Be conservative and consider that floating-point arithmetics may
	     use wider intermediate results as soon as there is an extended
	     Motorola or Intel mode supported by the machine.  */
	  if (fmt == &ieee_extended_motorola_format
	      || fmt == &ieee_extended_intel_96_format
	      || fmt == &ieee_extended_intel_96_round_53_format
	      || fmt == &ieee_extended_intel_128_format)
	    {
#ifdef TARGET_FPMATH_DEFAULT
	      if (TARGET_FPMATH_DEFAULT == FPMATH_387)
#endif
		fp_arith_may_widen = true;
	    }

	  if (fmt->b == 2)
	    digs = (fmt->p - 1) * 1233 / 4096; /* scale by log (2) */

	  else if (fmt->b == 10)
	    digs = fmt->p;

	  else
	    gcc_unreachable ();
	}

      /* First register any C types for this mode that the front end
	 may need to know about, unless the mode should be skipped.  */
      if (!skip_p && !vector_p)
	for (nameloop = 0; nameloop < ARRAY_SIZE (c_types); nameloop++)
	  {
	    tree type = c_types[nameloop];
	    const char *name = c_names[nameloop];

	    if (TYPE_MODE (type) == i)
	      {
		f (name, digs, complex_p, 0, float_rep, TYPE_PRECISION (type),
		   TREE_INT_CST_LOW (TYPE_SIZE (type)), TYPE_ALIGN (type));
		skip_p = true;
	      }
	  }

      /* If no predefined C types were found, register the mode itself.  */
      int nunits, precision, bitsize;
      if (!skip_p
	  && GET_MODE_NUNITS (i).is_constant (&nunits)
	  && GET_MODE_PRECISION (i).is_constant (&precision)
	  && GET_MODE_BITSIZE (i).is_constant (&bitsize))
	f (GET_MODE_NAME (i), digs, complex_p,
	   vector_p ? nunits : 0, float_rep,
	   precision, bitsize, GET_MODE_ALIGNMENT (i));
    }
}

/* Return the size of the FP mode with precision PREC.  */

int
fp_prec_to_size (int prec)
{
  opt_scalar_float_mode opt_mode;

  FOR_EACH_MODE_IN_CLASS (opt_mode, MODE_FLOAT)
    {
      scalar_float_mode mode = opt_mode.require ();
      if (GET_MODE_PRECISION (mode) == prec)
	return GET_MODE_BITSIZE (mode);
    }

  gcc_unreachable ();
}

/* Return the precision of the FP mode with size SIZE.  */

int
fp_size_to_prec (int size)
{
  opt_scalar_float_mode opt_mode;

  FOR_EACH_MODE_IN_CLASS (opt_mode, MODE_FLOAT)
    {
      scalar_mode mode = opt_mode.require ();
      if (GET_MODE_BITSIZE (mode) == size)
	return GET_MODE_PRECISION (mode);
    }

  gcc_unreachable ();
}

static GTY(()) tree gnat_eh_personality_decl;

/* Return the GNAT personality function decl.  */

static tree
gnat_eh_personality (void)
{
  if (!gnat_eh_personality_decl)
    gnat_eh_personality_decl = build_personality_function ("gnat");
  return gnat_eh_personality_decl;
}

/* Initialize language-specific bits of tree_contains_struct.  */

static void
gnat_init_ts (void)
{
  MARK_TS_COMMON (UNCONSTRAINED_ARRAY_TYPE);

  MARK_TS_TYPED (UNCONSTRAINED_ARRAY_REF);
  MARK_TS_TYPED (NULL_EXPR);
  MARK_TS_TYPED (PLUS_NOMOD_EXPR);
  MARK_TS_TYPED (MINUS_NOMOD_EXPR);
  MARK_TS_TYPED (POWER_EXPR);
  MARK_TS_TYPED (ATTR_ADDR_EXPR);
  MARK_TS_TYPED (STMT_STMT);
  MARK_TS_TYPED (LOOP_STMT);
  MARK_TS_TYPED (EXIT_STMT);
}

/* Return the size of a tree with CODE, which is a language-specific tree code
   in category tcc_constant, tcc_exceptional or tcc_type.  The default expects
   never to be called.  */

static size_t
gnat_tree_size (enum tree_code code)
{
  gcc_checking_assert (code >= NUM_TREE_CODES);
  switch (code)
    {
    case UNCONSTRAINED_ARRAY_TYPE:
      return sizeof (tree_type_non_common);
    default:
      gcc_unreachable ();
    }
}

/* Return the lang specific structure attached to NODE.  Allocate it (cleared)
   if needed.  */

struct lang_type *
get_lang_specific (tree node)
{
  if (!TYPE_LANG_SPECIFIC (node))
    TYPE_LANG_SPECIFIC (node) = ggc_cleared_alloc<struct lang_type> ();
  return TYPE_LANG_SPECIFIC (node);
}

/* Definitions for our language-specific hooks.  */

#undef  LANG_HOOKS_NAME
#define LANG_HOOKS_NAME			"GNU Ada"
#undef  LANG_HOOKS_IDENTIFIER_SIZE
#define LANG_HOOKS_IDENTIFIER_SIZE	sizeof (struct tree_identifier)
#undef  LANG_HOOKS_TREE_SIZE
#define LANG_HOOKS_TREE_SIZE		gnat_tree_size
#undef  LANG_HOOKS_INIT
#define LANG_HOOKS_INIT			gnat_init
#undef  LANG_HOOKS_OPTION_LANG_MASK
#define LANG_HOOKS_OPTION_LANG_MASK	gnat_option_lang_mask
#undef  LANG_HOOKS_INIT_OPTIONS_STRUCT
#define LANG_HOOKS_INIT_OPTIONS_STRUCT	gnat_init_options_struct
#undef  LANG_HOOKS_INIT_OPTIONS
#define LANG_HOOKS_INIT_OPTIONS		gnat_init_options
#undef  LANG_HOOKS_HANDLE_OPTION
#define LANG_HOOKS_HANDLE_OPTION	gnat_handle_option
#undef  LANG_HOOKS_POST_OPTIONS
#define LANG_HOOKS_POST_OPTIONS		gnat_post_options
#undef  LANG_HOOKS_PARSE_FILE
#define LANG_HOOKS_PARSE_FILE		gnat_parse_file
#undef  LANG_HOOKS_TYPE_HASH_EQ
#define LANG_HOOKS_TYPE_HASH_EQ		gnat_type_hash_eq
#undef  LANG_HOOKS_GETDECLS
#define LANG_HOOKS_GETDECLS		hook_tree_void_null
#undef  LANG_HOOKS_PUSHDECL
#define LANG_HOOKS_PUSHDECL		gnat_return_tree
#undef  LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL hook_bool_const_tree_false
#undef  LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET	gnat_get_alias_set
#undef  LANG_HOOKS_PRINT_DECL
#define LANG_HOOKS_PRINT_DECL		gnat_print_decl
#undef  LANG_HOOKS_PRINT_TYPE
#define LANG_HOOKS_PRINT_TYPE		gnat_print_type
#undef  LANG_HOOKS_TYPE_MAX_SIZE
#define LANG_HOOKS_TYPE_MAX_SIZE	gnat_type_max_size
#undef  LANG_HOOKS_DECL_PRINTABLE_NAME
#define LANG_HOOKS_DECL_PRINTABLE_NAME	gnat_printable_name
#undef  LANG_HOOKS_DWARF_NAME
#define LANG_HOOKS_DWARF_NAME		gnat_dwarf_name
#undef  LANG_HOOKS_GIMPLIFY_EXPR
#define LANG_HOOKS_GIMPLIFY_EXPR	gnat_gimplify_expr
#undef  LANG_HOOKS_TYPE_FOR_MODE
#define LANG_HOOKS_TYPE_FOR_MODE	gnat_type_for_mode
#undef  LANG_HOOKS_TYPE_FOR_SIZE
#define LANG_HOOKS_TYPE_FOR_SIZE	gnat_type_for_size
#undef  LANG_HOOKS_TYPES_COMPATIBLE_P
#define LANG_HOOKS_TYPES_COMPATIBLE_P	gnat_types_compatible_p
#undef  LANG_HOOKS_GET_ARRAY_DESCR_INFO
#define LANG_HOOKS_GET_ARRAY_DESCR_INFO	gnat_get_array_descr_info
#undef  LANG_HOOKS_GET_SUBRANGE_BOUNDS
#define LANG_HOOKS_GET_SUBRANGE_BOUNDS  gnat_get_subrange_bounds
#undef  LANG_HOOKS_GET_TYPE_BIAS
#define LANG_HOOKS_GET_TYPE_BIAS	gnat_get_type_bias
#undef  LANG_HOOKS_DESCRIPTIVE_TYPE
#define LANG_HOOKS_DESCRIPTIVE_TYPE	gnat_descriptive_type
#undef  LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE
#define LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE gnat_enum_underlying_base_type
#undef  LANG_HOOKS_GET_DEBUG_TYPE
#define LANG_HOOKS_GET_DEBUG_TYPE	gnat_get_debug_type
#undef  LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO
#define LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO gnat_get_fixed_point_type_info
#undef  LANG_HOOKS_ATTRIBUTE_TABLE
#define LANG_HOOKS_ATTRIBUTE_TABLE	gnat_internal_attribute_table
#undef  LANG_HOOKS_BUILTIN_FUNCTION
#define LANG_HOOKS_BUILTIN_FUNCTION	gnat_builtin_function
#undef  LANG_HOOKS_INIT_TS
#define LANG_HOOKS_INIT_TS		gnat_init_ts
#undef  LANG_HOOKS_EH_PERSONALITY
#define LANG_HOOKS_EH_PERSONALITY	gnat_eh_personality
#undef  LANG_HOOKS_DEEP_UNSHARING
#define LANG_HOOKS_DEEP_UNSHARING	true
#undef  LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS
#define LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS true

struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;

#include "gt-ada-misc.h"
