misc.c 31 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *                                                                          *
 *                         GNAT COMPILER COMPONENTS                         *
 *                                                                          *
 *                                 M I S C                                  *
 *                                                                          *
 *                           C Implementation File                          *
 *                                                                          *
Eric Botcazou committed
9
 *          Copyright (C) 1992-2015, Free Software Foundation, Inc.         *
10 11 12
 *                                                                          *
 * 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- *
13
 * ware  Foundation;  either version 3,  or (at your option) any later ver- *
14 15 16 17
 * 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 *
18 19
 * Public License  distributed  with GNAT;  see file  COPYING3.  If not see *
 * <http://www.gnu.org/licenses/>.                                          *
20 21 22 23 24 25 26 27 28
 *                                                                          *
 * 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"
29 30
#include "opts.h"
#include "options.h"
31
#include "tm.h"
32 33 34 35
#include "vec.h"
#include "alias.h"
#include "symtab.h"
#include "inchash.h"
36
#include "tree.h"
37
#include "fold-const.h"
38 39
#include "stor-layout.h"
#include "print-tree.h"
40
#include "diagnostic.h"
41
#include "target.h"
42 43 44 45 46 47
#include "ggc.h"
#include "flags.h"
#include "debug.h"
#include "toplev.h"
#include "langhooks.h"
#include "langhooks-def.h"
48
#include "plugin.h"
49 50
#include "hashtab.h"
#include "hard-reg-set.h"
51
#include "calls.h"	/* For pass_by_reference.  */
52
#include "dwarf2out.h"
53 54

#include "ada.h"
55
#include "adadecode.h"
56 57 58 59 60 61 62 63 64 65 66 67 68
#include "types.h"
#include "atree.h"
#include "elists.h"
#include "namet.h"
#include "nlists.h"
#include "stringt.h"
#include "uintp.h"
#include "fe.h"
#include "sinfo.h"
#include "einfo.h"
#include "ada-tree.h"
#include "gigi.h"

Javier Miranda committed
69 70 71
/* This symbol needs to be defined for the front-end.  */
void *callgraph_info_file = NULL;

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

77
/* GNAT argc and argv.  */
78 79 80
extern int gnat_argc;
extern char **gnat_argv;

81 82 83 84
#ifdef __cplusplus
extern "C" {
#endif

85
/* Declare functions we use as part of startup.  */
86 87 88 89
extern void __gnat_initialize (void *);
extern void __gnat_install_SEH_handler (void *);
extern void adainit (void);
extern void _ada_gnat1drv (void);
90

91 92 93 94
#ifdef __cplusplus
}
#endif

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

static void
98
gnat_parse_file (void)
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
{
  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 ();
115

116 117
  /* Write the global declarations.  */
  gnat_write_global_declarations ();
118 119
}

120 121 122 123 124 125 126 127
/* Return language mask for option processing.  */

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

128 129
/* 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
130
   are marked as Ada-specific.  Return true on success or false on failure.  */
131

132 133
static bool
gnat_handle_option (size_t scode, const char *arg ATTRIBUTE_UNUSED, int value,
134
		    int kind ATTRIBUTE_UNUSED, location_t loc ATTRIBUTE_UNUSED,
135
		    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
136 137 138 139 140 141
{
  enum opt_code code = (enum opt_code) scode;

  switch (code)
    {
    case OPT_Wall:
142 143 144 145
      handle_generated_option (&global_options, &global_options_set,
			       OPT_Wunused, NULL, value,
			       gnat_option_lang_mask (), kind, loc,
			       handlers, global_dc);
146
      warn_uninitialized = value;
147
      warn_maybe_uninitialized = value;
148 149 150 151 152 153 154 155 156
      break;

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

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

    case OPT_gnat:
    case OPT_gnatO:
157 158 159 160 161
    case OPT_fRTS_:
    case OPT_I:
    case OPT_nostdinc:
    case OPT_nostdlib:
      /* These are handled by the front-end.  */
162 163
      break;

Arnaud Charlet committed
164 165 166 167
    case OPT_fshort_enums:
      /* This is handled by the middle-end.  */
      break;

168 169 170 171
    default:
      gcc_unreachable ();
    }

172 173 174 175
  Ada_handle_option_auto (&global_options, &global_options_set,
			  scode, arg, value,
			  gnat_option_lang_mask (), kind,
			  loc, handlers, global_dc);
176
  return true;
177 178
}

179 180 181 182 183 184 185
/* 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;
186

187 188 189 190
  /* 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;
191 192
}

193 194 195 196 197 198 199 200
/* 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.

201 202 203
     ??? 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.  */
204 205 206 207 208 209
  unsigned int i;

  save_argv = XNEWVEC (const char *, 2 * decoded_options_count + 1);
  save_argc = 0;
  for (i = 0; i < decoded_options_count; i++)
    {
210 211
      size_t num_elements = decoded_options[i].canonical_option_num_elements;

212
      if (decoded_options[i].errors
213
	  || decoded_options[i].opt_index == OPT_SPECIAL_unknown
214
	  || num_elements == 0)
215
	continue;
216

217 218 219 220 221 222
      /* 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-";
223 224
      else
	{
225
	  gcc_assert (num_elements >= 1 && num_elements <= 2);
226
	  save_argv[save_argc++] = decoded_options[i].canonical_option[0];
227
	  if (num_elements >= 2)
228 229
	    save_argv[save_argc++] = decoded_options[i].canonical_option[1];
	}
230 231
    }
  save_argv[save_argc] = NULL;
232

233 234 235
  gnat_argv = (char **) xmalloc (sizeof (save_argv[0]));
  gnat_argv[0] = xstrdup (save_argv[0]);     /* name of the command */
  gnat_argc = 1;
236 237
}

238 239 240 241
/* Ada code requires variables for these settings rather than elements
   of the global_options structure.  */
#undef optimize
#undef optimize_size
242
#undef flag_compare_debug
243
#undef flag_short_enums
244
#undef flag_stack_check
245
int gnat_encodings = 0;
246 247
int optimize;
int optimize_size;
248
int flag_compare_debug;
249
int flag_short_enums;
250
enum stack_check_type flag_stack_check = NO_STACK_CHECK;
251

Arnaud Charlet committed
252 253 254
/* 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!  */
255

256
static bool
257 258
gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
{
259
  /* Excess precision other than "fast" requires front-end support.  */
260 261 262 263 264
  if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
      && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
    sorry ("-fexcess-precision=standard for Ada");
  flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;

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

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

272 273
  optimize = global_options.x_optimize;
  optimize_size = global_options.x_optimize_size;
274 275
  flag_compare_debug = global_options.x_flag_compare_debug;
  flag_stack_check = global_options.x_flag_stack_check;
276 277
  flag_short_enums = global_options.x_flag_short_enums;

Arnaud Charlet committed
278 279 280 281 282 283
  /* 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 ();

284 285 286 287 288 289
  return false;
}

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

static void
290 291
internal_error_function (diagnostic_context *context,
			 const char *msgid, va_list *ap)
292 293 294 295
{
  text_info tinfo;
  char *buffer, *p, *loc;
  String_Template temp, temp_loc;
296 297
  String_Pointer sp, sp_loc;
  expanded_location xloc;
298

299 300 301
  /* Warn if plugins present.  */
  warn_if_plugins ();

302
  /* Reset the pretty-printer.  */
303
  pp_clear_output_area (context->printer);
304 305 306 307 308

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

  /* Extract a (writable) pointer to the formatted text.  */
312
  buffer = xstrdup (pp_formatted_text (context->printer));
313 314 315 316 317 318 319 320 321 322 323

  /* 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;
324 325
  sp.Bounds = &temp;
  sp.Array = buffer;
326

327 328
  xloc = expand_location (input_location);
  if (context->show_column && xloc.column != 0)
329
    loc = xasprintf ("%s:%d:%d", xloc.file, xloc.line, xloc.column);
330
  else
331
    loc = xasprintf ("%s:%d", xloc.file, xloc.line);
332 333
  temp_loc.Low_Bound = 1;
  temp_loc.High_Bound = strlen (loc);
334 335
  sp_loc.Bounds = &temp_loc;
  sp_loc.Array = loc;
336 337

  Current_Error_Node = error_gnat_node;
338
  Compiler_Abort (sp, sp_loc, true);
339 340 341 342 343 344 345
}

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

static bool
gnat_init (void)
{
346
  /* Do little here, most of the standard declarations are set up after the
347 348
     front-end has been run.  Use the same `char' as C, this doesn't really
     matter since we'll use the explicit `unsigned char' for Character.  */
349
  build_common_tree_nodes (flag_signed_char, false);
350

351 352 353 354 355 356
  /* 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));
357 358
  boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
  boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
359

360 361
  sbitsize_one_node = sbitsize_int (1);
  sbitsize_unit_node = sbitsize_int (BITS_PER_UNIT);
362 363 364

  /* Show that REFERENCE_TYPEs are internal and should be Pmode.  */
  internal_reference_types ();
365

366
  /* Register our internal error function.  */
367 368 369 370 371
  global_dc->internal_error = &internal_error_function;

  return true;
}

372
/* Initialize the GCC support for exception handling.  */
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389

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 ();

390 391 392 393 394 395 396 397 398 399 400 401
  /* Turn on -fexceptions, -fnon-call-exceptions and -fdelete-dead-exceptions.
     The first one triggers the generation of the necessary exception tables.
     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.  */
402 403
  flag_exceptions = 1;
  flag_non_call_exceptions = 1;
404
  flag_delete_dead_exceptions = 1;
405 406 407 408

  init_eh ();
}

409 410 411 412 413 414
/* Initialize the GCC support for floating-point operations.  */

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

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

429
/* Print language-specific items in declaration NODE.  */
430 431 432 433 434 435 436

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

    case FIELD_DECL:
442
      print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
443 444 445 446
		  indent + 4);
      break;

    case VAR_DECL:
447 448 449 450 451 452
      if (DECL_LOOP_PARM_P (node))
	print_node (file, "induction var", DECL_INDUCTION_VAR (node),
		    indent + 4);
      else
	print_node (file, "renamed object", DECL_RENAMED_OBJECT (node),
		    indent + 4);
453 454 455 456 457 458 459
      break;

    default:
      break;
    }
}

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

462 463 464 465 466 467
static void
gnat_print_type (FILE *file, tree node, int indent)
{
  switch (TREE_CODE (node))
    {
    case FUNCTION_TYPE:
468
      print_node (file, "ci/co list", TYPE_CI_CO_LIST (node), indent + 4);
469 470 471 472
      break;

    case INTEGER_TYPE:
      if (TYPE_MODULAR_P (node))
473
	print_node_brief (file, "modulus", TYPE_MODULUS (node), indent + 4);
474 475 476 477 478 479
      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);

480 481 482 483
      /* ... fall through ... */

    case ENUMERAL_TYPE:
    case BOOLEAN_TYPE:
484
      print_node_brief (file, "RM size", TYPE_RM_SIZE (node), indent + 4);
485 486 487 488 489 490

      /* ... 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);
491 492 493 494 495 496
      break;

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

497 498 499 500 501
    case VECTOR_TYPE:
      print_node (file,"representative array",
		  TYPE_REPRESENTATIVE_ARRAY (node), indent + 4);
      break;

502
    case RECORD_TYPE:
503
      if (TYPE_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
	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;
    }
}

520
/* Return the name to be printed for DECL.  */
521 522 523 524 525

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

  __gnat_decode (coded_name, ada_name, 0);

530
  if (verbosity == 2 && !DECL_IS_BUILTIN (decl))
531
    {
532
      Set_Identifier_Casing (ada_name, DECL_SOURCE_FILE (decl));
533
      return ggc_strdup (Name_Buffer);
534
    }
535 536 537 538 539 540 541 542 543 544 545

  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));
546 547
}

548 549 550 551 552 553 554 555 556 557 558
/* 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;
}

559 560 561 562 563 564 565 566 567 568 569 570 571 572
/* Return true if types T1 and T2 are identical for type hashing purposes.
   Called only after doing all language independent checks.  At present,
   this function is only called when both types are FUNCTION_TYPE.  */

static bool
gnat_type_hash_eq (const_tree t1, const_tree t2)
{
  gcc_assert (TREE_CODE (t1) == FUNCTION_TYPE);
  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));
}

573 574 575 576 577 578 579 580 581 582 583 584 585 586
/* 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.  */
587
  if (TYPE_IS_PADDING_P (type))
588 589 590 591 592 593 594 595 596
    return get_alias_set (TREE_TYPE (TYPE_FIELDS (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.  */
597
  else if (TYPE_P (type) && TYPE_UNIVERSAL_ALIASING_P (type))
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
    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_unitsize = 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.  */
616
  if (!tree_fits_uhwi_p (max_unitsize)
617 618
      && RECORD_OR_UNION_TYPE_P (gnu_type)
      && !TYPE_FAT_POINTER_P (gnu_type)
619 620 621 622 623 624
      && TYPE_ADA_SIZE (gnu_type))
    {
      tree max_adasize = 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.  */
625
      if (tree_fits_uhwi_p (max_adasize))
626 627 628 629 630 631 632 633 634
	max_unitsize
	  = size_binop (CEIL_DIV_EXPR,
			round_up (max_adasize, TYPE_ALIGN (gnu_type)),
			bitsize_unit_node);
    }

  return max_unitsize;
}

635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
/* 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 type, struct array_descr_info *info)
{
  bool convention_fortran_p;
  tree index_type;

  const_tree dimen = NULL_TREE;
  const_tree last_dimen = NULL_TREE;
  int i;

  if (TREE_CODE (type) != ARRAY_TYPE
      || !TYPE_DOMAIN (type)
      || !TYPE_INDEX_TYPE (TYPE_DOMAIN (type)))
    return false;

  /* Count how many dimentions this array has.  */
  for (i = 0, dimen = type; ; ++i, dimen = TREE_TYPE (dimen))
    if (i > 0
	&& (TREE_CODE (dimen) != ARRAY_TYPE
	    || !TYPE_MULTI_ARRAY_P (dimen)))
      break;
  info->ndimensions = i;
  convention_fortran_p = TYPE_CONVENTION_FORTRAN_P (type);

662
  /* TODO: For row major ordering, we probably want to emit nothing and
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
     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->base_decl = NULL_TREE;
  info->data_location = NULL_TREE;
  info->allocated = NULL_TREE;
  info->associated = NULL_TREE;

  for (i = (convention_fortran_p ? info->ndimensions - 1 : 0),
       dimen = type;

       0 <= i && i < info->ndimensions;

       i += (convention_fortran_p ? -1 : 1),
       dimen = TREE_TYPE (dimen))
    {
      /* We are interested in the stored bounds for the debug info.  */
      index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (dimen));

      info->dimen[i].bounds_type = index_type;
      info->dimen[i].lower_bound = TYPE_MIN_VALUE (index_type);
      info->dimen[i].upper_bound = TYPE_MAX_VALUE (index_type);
      last_dimen = dimen;
    }

  info->element_type = TREE_TYPE (last_dimen);

  return true;
}

694 695 696 697 698 699
/* 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)
{
700 701
  *lowval = TYPE_MIN_VALUE (gnu_type);
  *highval = TYPE_MAX_VALUE (gnu_type);
702 703
}

704 705
/* GNU_TYPE is the type of a subprogram parameter.  Determine if it should be
   passed by reference by default.  */
706 707 708 709

bool
default_pass_by_ref (tree gnu_type)
{
710 711
  /* We pass aggregates by reference if they are sufficiently large for
     their alignment.  The ratio is somewhat arbitrary.  We also pass by
712 713 714 715 716
     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.  */

717
  if (pass_by_reference (NULL, TYPE_MODE (gnu_type), gnu_type, true))
718 719 720 721 722 723
    return true;

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

  if (AGGREGATE_TYPE_P (gnu_type)
724 725 726
      && (!valid_constant_size_p (TYPE_SIZE_UNIT (gnu_type))
	  || 0 < compare_tree_int (TYPE_SIZE_UNIT (gnu_type),
				   TYPE_ALIGN (gnu_type))))
727 728 729 730 731
    return true;

  return false;
}

732 733
/* GNU_TYPE is the type of a subprogram parameter.  Determine if it must be
   passed by reference.  */
734 735 736 737 738 739 740 741 742 743

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
744
	  || TYPE_IS_BY_REFERENCE_P (gnu_type)
745 746
	  || (TYPE_SIZE_UNIT (gnu_type)
	      && TREE_CODE (TYPE_SIZE_UNIT (gnu_type)) != INTEGER_CST));
747 748
}

Arnaud Charlet committed
749 750 751
/* 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,
752
   then seven ints.  The name is any arbitrary null-terminated string and has
Arnaud Charlet committed
753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
   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
768 769
   PRECISION	number of bits used to store data
   SIZE		number of bits occupied by the mode
Arnaud Charlet committed
770 771 772
   ALIGN	number of bits to which mode is aligned.  */

void
773
enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int))
Arnaud Charlet committed
774 775 776 777 778 779 780
{
  const tree c_types[]
    = { float_type_node, double_type_node, long_double_type_node };
  const char *const c_names[]
    = { "float", "double", "long double" };
  int iloop;

Arnaud Charlet committed
781 782 783
  /* We are going to compute it below.  */
  fp_arith_may_widen = false;

Arnaud Charlet committed
784 785
  for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++)
    {
786 787
      machine_mode i = (machine_mode) iloop;
      machine_mode inner_mode = i;
Arnaud Charlet committed
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828
      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);

Arnaud Charlet committed
829 830 831 832
	  /* ??? Cope with the ghost XFmode of the ARM port.  */
	  if (!fmt)
	    continue;

Arnaud Charlet committed
833 834 835 836 837 838 839
	  /* 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)
840 841 842 843 844 845
	    {
#ifdef TARGET_FPMATH_DEFAULT
	      if (TARGET_FPMATH_DEFAULT == FPMATH_387)
#endif
		fp_arith_may_widen = true;
	    }
Arnaud Charlet committed
846

Arnaud Charlet committed
847 848 849 850 851 852 853 854 855 856 857 858
	  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.  */
859
      if (!skip_p && !vector_p)
Arnaud Charlet committed
860 861
	for (nameloop = 0; nameloop < ARRAY_SIZE (c_types); nameloop++)
	  {
862 863
	    tree type = c_types[nameloop];
	    const char *name = c_names[nameloop];
Arnaud Charlet committed
864

865
	    if (TYPE_MODE (type) == i)
Arnaud Charlet committed
866
	      {
867 868
		f (name, digs, complex_p, 0, float_rep, TYPE_PRECISION (type),
		   TREE_INT_CST_LOW (TYPE_SIZE (type)), TYPE_ALIGN (type));
Arnaud Charlet committed
869 870 871 872 873 874 875 876
		skip_p = true;
	      }
	  }

      /* If no predefined C types were found, register the mode itself.  */
      if (!skip_p)
	f (GET_MODE_NAME (i), digs, complex_p,
	   vector_p ? GET_MODE_NUNITS (i) : 0, float_rep,
877 878
	   GET_MODE_PRECISION (i), GET_MODE_BITSIZE (i),
	   GET_MODE_ALIGNMENT (i));
Arnaud Charlet committed
879 880 881
    }
}

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

884 885 886
int
fp_prec_to_size (int prec)
{
887
  machine_mode mode;
888 889 890 891 892 893 894 895 896

  for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
       mode = GET_MODE_WIDER_MODE (mode))
    if (GET_MODE_PRECISION (mode) == prec)
      return GET_MODE_BITSIZE (mode);

  gcc_unreachable ();
}

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

899 900 901
int
fp_size_to_prec (int size)
{
902
  machine_mode mode;
903 904 905 906 907 908 909 910

  for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
       mode = GET_MODE_WIDER_MODE (mode))
    if (GET_MODE_BITSIZE (mode) == size)
      return GET_MODE_PRECISION (mode);

  gcc_unreachable ();
}
911 912 913

static GTY(()) tree gnat_eh_personality_decl;

914 915
/* Return the GNAT personality function decl.  */

916 917 918 919
static tree
gnat_eh_personality (void)
{
  if (!gnat_eh_personality_decl)
920
    gnat_eh_personality_decl = build_personality_function ("gnat");
921 922 923
  return gnat_eh_personality_decl;
}

924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
/* 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 (ATTR_ADDR_EXPR);
  MARK_TS_TYPED (STMT_STMT);
  MARK_TS_TYPED (LOOP_STMT);
  MARK_TS_TYPED (EXIT_STMT);
}

941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986
/* 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_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		lhd_return_null_tree_v
#undef  LANG_HOOKS_PUSHDECL
#define LANG_HOOKS_PUSHDECL		gnat_return_tree
#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
987 988
#undef  LANG_HOOKS_GET_ARRAY_DESCR_INFO
#define LANG_HOOKS_GET_ARRAY_DESCR_INFO	gnat_get_array_descr_info
989 990
#undef  LANG_HOOKS_GET_SUBRANGE_BOUNDS
#define LANG_HOOKS_GET_SUBRANGE_BOUNDS  gnat_get_subrange_bounds
991 992
#undef  LANG_HOOKS_DESCRIPTIVE_TYPE
#define LANG_HOOKS_DESCRIPTIVE_TYPE	gnat_descriptive_type
993 994 995 996 997 998 999 1000
#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_EH_PERSONALITY
#define LANG_HOOKS_EH_PERSONALITY	gnat_eh_personality
#undef  LANG_HOOKS_DEEP_UNSHARING
#define LANG_HOOKS_DEEP_UNSHARING	true
1001 1002
#undef  LANG_HOOKS_INIT_TS
#define LANG_HOOKS_INIT_TS		gnat_init_ts
1003 1004
#undef  LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL hook_bool_const_tree_false
1005 1006 1007

struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;

1008
#include "gt-ada-misc.h"