OSDN Git Service

* gcc-interface/ada-tree.def: Fix formatting nits.
[pf3gnuchains/gcc-fork.git] / gcc / ada / gcc-interface / misc.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                                 M I S C                                  *
6  *                                                                          *
7  *                           C Implementation File                          *
8  *                                                                          *
9  *          Copyright (C) 1992-2009, 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 /* This file contains parts of the compiler that are required for interfacing
27    with GCC but otherwise do nothing and parts of Gigi that need to know
28    about RTL.  */
29
30 #include "config.h"
31 #include "system.h"
32 #include "coretypes.h"
33 #include "tm.h"
34 #include "tree.h"
35 #include "real.h"
36 #include "rtl.h"
37 #include "diagnostic.h"
38 #include "expr.h"
39 #include "libfuncs.h"
40 #include "ggc.h"
41 #include "flags.h"
42 #include "debug.h"
43 #include "cgraph.h"
44 #include "tree-inline.h"
45 #include "insn-codes.h"
46 #include "insn-flags.h"
47 #include "insn-config.h"
48 #include "optabs.h"
49 #include "recog.h"
50 #include "toplev.h"
51 #include "output.h"
52 #include "except.h"
53 #include "tm_p.h"
54 #include "langhooks.h"
55 #include "langhooks-def.h"
56 #include "target.h"
57
58 #include "ada.h"
59 #include "types.h"
60 #include "atree.h"
61 #include "elists.h"
62 #include "namet.h"
63 #include "nlists.h"
64 #include "stringt.h"
65 #include "uintp.h"
66 #include "fe.h"
67 #include "sinfo.h"
68 #include "einfo.h"
69 #include "ada-tree.h"
70 #include "gigi.h"
71 #include "adadecode.h"
72 #include "opts.h"
73 #include "options.h"
74
75 static bool gnat_init                   (void);
76 static unsigned int gnat_init_options   (unsigned int, const char **);
77 static int gnat_handle_option           (size_t, const char *, int);
78 static bool gnat_post_options           (const char **);
79 static alias_set_type gnat_get_alias_set (tree);
80 static void gnat_print_decl             (FILE *, tree, int);
81 static void gnat_print_type             (FILE *, tree, int);
82 static const char *gnat_printable_name  (tree, int);
83 static const char *gnat_dwarf_name      (tree, int);
84 static tree gnat_return_tree            (tree);
85 static int gnat_eh_type_covers          (tree, tree);
86 static void gnat_parse_file             (int);
87 static void internal_error_function     (const char *, va_list *);
88 static tree gnat_type_max_size          (const_tree);
89
90 /* Definitions for our language-specific hooks.  */
91
92 #undef  LANG_HOOKS_NAME
93 #define LANG_HOOKS_NAME                 "GNU Ada"
94 #undef  LANG_HOOKS_IDENTIFIER_SIZE
95 #define LANG_HOOKS_IDENTIFIER_SIZE      sizeof (struct tree_identifier)
96 #undef  LANG_HOOKS_INIT
97 #define LANG_HOOKS_INIT                 gnat_init
98 #undef  LANG_HOOKS_INIT_OPTIONS
99 #define LANG_HOOKS_INIT_OPTIONS         gnat_init_options
100 #undef  LANG_HOOKS_HANDLE_OPTION
101 #define LANG_HOOKS_HANDLE_OPTION        gnat_handle_option
102 #undef  LANG_HOOKS_POST_OPTIONS
103 #define LANG_HOOKS_POST_OPTIONS         gnat_post_options
104 #undef  LANG_HOOKS_PARSE_FILE
105 #define LANG_HOOKS_PARSE_FILE           gnat_parse_file
106 #undef  LANG_HOOKS_HASH_TYPES
107 #define LANG_HOOKS_HASH_TYPES           false
108 #undef  LANG_HOOKS_GETDECLS
109 #define LANG_HOOKS_GETDECLS             lhd_return_null_tree_v
110 #undef  LANG_HOOKS_PUSHDECL
111 #define LANG_HOOKS_PUSHDECL             gnat_return_tree
112 #undef  LANG_HOOKS_WRITE_GLOBALS
113 #define LANG_HOOKS_WRITE_GLOBALS        gnat_write_global_declarations
114 #undef  LANG_HOOKS_GET_ALIAS_SET
115 #define LANG_HOOKS_GET_ALIAS_SET        gnat_get_alias_set
116 #undef  LANG_HOOKS_MARK_ADDRESSABLE
117 #define LANG_HOOKS_MARK_ADDRESSABLE     gnat_mark_addressable
118 #undef  LANG_HOOKS_PRINT_DECL
119 #define LANG_HOOKS_PRINT_DECL           gnat_print_decl
120 #undef  LANG_HOOKS_PRINT_TYPE
121 #define LANG_HOOKS_PRINT_TYPE           gnat_print_type
122 #undef  LANG_HOOKS_TYPE_MAX_SIZE
123 #define LANG_HOOKS_TYPE_MAX_SIZE        gnat_type_max_size
124 #undef  LANG_HOOKS_DECL_PRINTABLE_NAME
125 #define LANG_HOOKS_DECL_PRINTABLE_NAME  gnat_printable_name
126 #undef  LANG_HOOKS_DWARF_NAME
127 #define LANG_HOOKS_DWARF_NAME           gnat_dwarf_name
128 #undef  LANG_HOOKS_GIMPLIFY_EXPR
129 #define LANG_HOOKS_GIMPLIFY_EXPR        gnat_gimplify_expr
130 #undef  LANG_HOOKS_TYPE_FOR_MODE
131 #define LANG_HOOKS_TYPE_FOR_MODE        gnat_type_for_mode
132 #undef  LANG_HOOKS_TYPE_FOR_SIZE
133 #define LANG_HOOKS_TYPE_FOR_SIZE        gnat_type_for_size
134 #undef  LANG_HOOKS_TYPES_COMPATIBLE_P
135 #define LANG_HOOKS_TYPES_COMPATIBLE_P   gnat_types_compatible_p
136 #undef  LANG_HOOKS_ATTRIBUTE_TABLE
137 #define LANG_HOOKS_ATTRIBUTE_TABLE      gnat_internal_attribute_table
138 #undef  LANG_HOOKS_BUILTIN_FUNCTION
139 #define LANG_HOOKS_BUILTIN_FUNCTION        gnat_builtin_function
140
141 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
142
143 /* How much we want of our DWARF extensions.  Some of our dwarf+ extensions
144    are incompatible with regular GDB versions, so we must make sure to only
145    produce them on explicit request.  This is eventually reflected into the
146    use_gnu_debug_info_extensions common flag for later processing.  */
147 static int gnat_dwarf_extensions = 0;
148
149 /* Command-line argc and argv.  These variables are global
150    since they are imported in back_end.adb.  */
151 unsigned int save_argc;
152 const char **save_argv;
153
154 /* GNAT argc and argv.  */
155 extern int gnat_argc;
156 extern char **gnat_argv;
157
158 \f
159 /* Declare functions we use as part of startup.  */
160 extern void __gnat_initialize           (void *);
161 extern void __gnat_install_SEH_handler  (void *);
162 extern void adainit                     (void);
163 extern void _ada_gnat1drv               (void);
164
165 /* The parser for the language.  For us, we process the GNAT tree.  */
166
167 static void
168 gnat_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
169 {
170   int seh[2];
171
172   /* Call the target specific initializations.  */
173   __gnat_initialize (NULL);
174
175   /* ??? Call the SEH initialization routine.  This is to workaround
176   a bootstrap path problem.  The call below should be removed at some
177   point and the SEH pointer passed to __gnat_initialize() above.  */
178   __gnat_install_SEH_handler((void *)seh);
179
180   /* Call the front-end elaboration procedures.  */
181   adainit ();
182
183   /* Call the front end.  */
184   _ada_gnat1drv ();
185
186   /* We always have a single compilation unit in Ada.  */
187   cgraph_finalize_compilation_unit ();
188 }
189
190 /* Decode all the language specific options that cannot be decoded by GCC.
191    The option decoding phase of GCC calls this routine on the flags that
192    it cannot decode.  Return the number of consecutive arguments from ARGV
193    that have been successfully decoded or 0 on failure.  */
194
195 static int
196 gnat_handle_option (size_t scode, const char *arg, int value)
197 {
198   const struct cl_option *option = &cl_options[scode];
199   enum opt_code code = (enum opt_code) scode;
200   char *q;
201
202   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
203     {
204       error ("missing argument to \"-%s\"", option->opt_text);
205       return 1;
206     }
207
208   switch (code)
209     {
210     case OPT_I:
211       q = XNEWVEC (char, sizeof("-I") + strlen (arg));
212       strcpy (q, "-I");
213       strcat (q, arg);
214       gnat_argv[gnat_argc] = q;
215       gnat_argc++;
216       break;
217
218     case OPT_Wall:
219       warn_unused = value;
220
221       /* We save the value of warn_uninitialized, since if they put
222          -Wuninitialized on the command line, we need to generate a
223          warning about not using it without also specifying -O.  */
224       if (warn_uninitialized != 1)
225         warn_uninitialized = (value ? 2 : 0);
226       break;
227
228       /* These are used in the GCC Makefile.  */
229     case OPT_Wmissing_prototypes:
230     case OPT_Wstrict_prototypes:
231     case OPT_Wwrite_strings:
232     case OPT_Wlong_long:
233     case OPT_Wvariadic_macros:
234     case OPT_Wold_style_definition:
235     case OPT_Wmissing_format_attribute:
236     case OPT_Woverlength_strings:
237       break;
238
239       /* This is handled by the front-end.  */
240     case OPT_nostdinc:
241       break;
242
243     case OPT_nostdlib:
244       gnat_argv[gnat_argc] = xstrdup ("-nostdlib");
245       gnat_argc++;
246       break;
247
248     case OPT_feliminate_unused_debug_types:
249       /* We arrange for post_option to be able to only set the corresponding
250          flag to 1 when explicitly requested by the user.  We expect the
251          default flag value to be either 0 or positive, and expose a positive
252          -f as a negative value to post_option.  */
253       flag_eliminate_unused_debug_types = -value;
254       break;
255
256     case OPT_fRTS_:
257       gnat_argv[gnat_argc] = xstrdup ("-fRTS");
258       gnat_argc++;
259       break;
260
261     case OPT_gant:
262       warning (0, "%<-gnat%> misspelled as %<-gant%>");
263
264       /* ... fall through ... */
265
266     case OPT_gnat:
267       /* Recopy the switches without the 'gnat' prefix.  */
268       gnat_argv[gnat_argc] = XNEWVEC (char, strlen (arg) + 2);
269       gnat_argv[gnat_argc][0] = '-';
270       strcpy (gnat_argv[gnat_argc] + 1, arg);
271       gnat_argc++;
272       break;
273
274     case OPT_gnatO:
275       gnat_argv[gnat_argc] = xstrdup ("-O");
276       gnat_argc++;
277       gnat_argv[gnat_argc] = xstrdup (arg);
278       gnat_argc++;
279       break;
280
281     case OPT_gdwarf_:
282       gnat_dwarf_extensions ++;
283       break;
284
285     default:
286       gcc_unreachable ();
287     }
288
289   return 1;
290 }
291
292 /* Initialize for option processing.  */
293
294 static unsigned int
295 gnat_init_options (unsigned int argc, const char **argv)
296 {
297   /* Initialize gnat_argv with save_argv size.  */
298   gnat_argv = (char **) xmalloc ((argc + 1) * sizeof (argv[0]));
299   gnat_argv[0] = xstrdup (argv[0]);     /* name of the command */
300   gnat_argc = 1;
301
302   save_argc = argc;
303   save_argv = argv;
304
305   /* Uninitialized really means uninitialized in Ada.  */
306   flag_zero_initialized_in_bss = 0;
307
308   return CL_Ada;
309 }
310
311 /* Post-switch processing.  */
312
313 bool
314 gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
315 {
316   /* Excess precision other than "fast" requires front-end
317      support.  */
318   if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
319       && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
320     sorry ("-fexcess-precision=standard for Ada");
321   flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
322
323   /* ??? The warning machinery is outsmarted by Ada.  */
324   warn_unused_parameter = 0;
325
326   /* No psABI change warnings for Ada.  */
327   warn_psabi = 0;
328
329   /* Force eliminate_unused_debug_types to 0 unless an explicit positive
330      -f has been passed.  This forces the default to 0 for Ada, which might
331      differ from the common default.  */
332   if (flag_eliminate_unused_debug_types < 0)
333     flag_eliminate_unused_debug_types = 1;
334   else
335     flag_eliminate_unused_debug_types = 0;
336
337   /* Reflect the explicit request of DWARF extensions into the common
338      flag for use by later passes.  */
339   if (write_symbols == DWARF2_DEBUG)
340     use_gnu_debug_info_extensions = gnat_dwarf_extensions > 0;
341
342   return false;
343 }
344
345 /* Here is the function to handle the compiler error processing in GCC.  */
346
347 static void
348 internal_error_function (const char *msgid, va_list *ap)
349 {
350   text_info tinfo;
351   char *buffer, *p, *loc;
352   String_Template temp, temp_loc;
353   Fat_Pointer fp, fp_loc;
354   expanded_location s;
355
356   /* Reset the pretty-printer.  */
357   pp_clear_output_area (global_dc->printer);
358
359   /* Format the message into the pretty-printer.  */
360   tinfo.format_spec = msgid;
361   tinfo.args_ptr = ap;
362   tinfo.err_no = errno;
363   pp_format_verbatim (global_dc->printer, &tinfo);
364
365   /* Extract a (writable) pointer to the formatted text.  */
366   buffer = (char*) pp_formatted_text (global_dc->printer);
367
368   /* Go up to the first newline.  */
369   for (p = buffer; *p; p++)
370     if (*p == '\n')
371       {
372         *p = '\0';
373         break;
374       }
375
376   temp.Low_Bound = 1;
377   temp.High_Bound = p - buffer;
378   fp.Bounds = &temp;
379   fp.Array = buffer;
380
381   s = expand_location (input_location);
382   if (flag_show_column && s.column != 0)
383     asprintf (&loc, "%s:%d:%d", s.file, s.line, s.column);
384   else
385     asprintf (&loc, "%s:%d", s.file, s.line);
386   temp_loc.Low_Bound = 1;
387   temp_loc.High_Bound = strlen (loc);
388   fp_loc.Bounds = &temp_loc;
389   fp_loc.Array = loc;
390
391   Current_Error_Node = error_gnat_node;
392   Compiler_Abort (fp, -1, fp_loc);
393 }
394
395 /* Perform all the initialization steps that are language-specific.  */
396
397 static bool
398 gnat_init (void)
399 {
400   /* Performs whatever initialization steps needed by the language-dependent
401      lexical analyzer.  */
402   gnat_init_decl_processing ();
403
404   /* Add the input filename as the last argument.  */
405   gnat_argv[gnat_argc] = (char *) main_input_filename;
406   gnat_argc++;
407   gnat_argv[gnat_argc] = 0;
408
409   global_dc->internal_error = &internal_error_function;
410
411   /* Show that REFERENCE_TYPEs are internal and should be Pmode.  */
412   internal_reference_types ();
413
414   return true;
415 }
416
417 /* If we are using the GCC mechanism to process exception handling, we
418    have to register the personality routine for Ada and to initialize
419    various language dependent hooks.  */
420
421 void
422 gnat_init_gcc_eh (void)
423 {
424 #ifdef DWARF2_UNWIND_INFO
425   /* lang_dependent_init already called dwarf2out_frame_init if true.  */
426   int dwarf2out_frame_initialized = dwarf2out_do_frame ();
427 #endif
428
429   /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
430      though. This could for instance lead to the emission of tables with
431      references to symbols (such as the Ada eh personality routine) within
432      libraries we won't link against.  */
433   if (No_Exception_Handlers_Set ())
434     return;
435
436   /* Tell GCC we are handling cleanup actions through exception propagation.
437      This opens possibilities that we don't take advantage of yet, but is
438      nonetheless necessary to ensure that fixup code gets assigned to the
439      right exception regions.  */
440   using_eh_for_cleanups ();
441
442   eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
443                                              ? "__gnat_eh_personality_sj"
444                                              : "__gnat_eh_personality");
445   lang_eh_type_covers = gnat_eh_type_covers;
446   lang_eh_runtime_type = gnat_return_tree;
447   default_init_unwind_resume_libfunc ();
448
449   /* Turn on -fexceptions and -fnon-call-exceptions. The first one triggers
450      the generation of the necessary exception runtime tables. The second one
451      is useful for two reasons: 1/ we map some asynchronous signals like SEGV
452      to exceptions, so we need to ensure that the insns which can lead to such
453      signals are correctly attached to the exception region they pertain to,
454      2/ Some calls to pure subprograms are handled as libcall blocks and then
455      marked as "cannot trap" if the flag is not set (see emit_libcall_block).
456      We should not let this be since it is possible for such calls to actually
457      raise in Ada.  */
458   flag_exceptions = 1;
459   flag_non_call_exceptions = 1;
460
461   init_eh ();
462 #ifdef DWARF2_UNWIND_INFO
463   if (!dwarf2out_frame_initialized && dwarf2out_do_frame ())
464     dwarf2out_frame_init ();
465 #endif
466 }
467
468 /* Print language-specific items in declaration NODE.  */
469
470 static void
471 gnat_print_decl (FILE *file, tree node, int indent)
472 {
473   switch (TREE_CODE (node))
474     {
475     case CONST_DECL:
476       print_node (file, "const_corresponding_var",
477                   DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
478       break;
479
480     case FIELD_DECL:
481       print_node (file, "original_field", DECL_ORIGINAL_FIELD (node),
482                   indent + 4);
483       break;
484
485     case VAR_DECL:
486       print_node (file, "renamed_object", DECL_RENAMED_OBJECT (node),
487                   indent + 4);
488       break;
489
490     default:
491       break;
492     }
493 }
494
495 /* Print language-specific items in type NODE.  */
496
497 static void
498 gnat_print_type (FILE *file, tree node, int indent)
499 {
500   switch (TREE_CODE (node))
501     {
502     case FUNCTION_TYPE:
503       print_node (file, "ci_co_list", TYPE_CI_CO_LIST (node), indent + 4);
504       break;
505
506     case INTEGER_TYPE:
507       if (TYPE_MODULAR_P (node))
508         print_node (file, "modulus", TYPE_MODULUS (node), indent + 4);
509       else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
510         print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
511                     indent + 4);
512       else if (TYPE_VAX_FLOATING_POINT_P (node))
513         ;
514       else
515         print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);
516
517       /* ... fall through ... */
518
519     case ENUMERAL_TYPE:
520     case BOOLEAN_TYPE:
521       print_node (file, "RM size", TYPE_RM_SIZE (node), indent + 4);
522       break;
523
524     case ARRAY_TYPE:
525       print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
526       break;
527
528     case RECORD_TYPE:
529       if (TYPE_IS_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
530         print_node (file, "unconstrained array",
531                     TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
532       else
533         print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
534       break;
535
536     case UNION_TYPE:
537     case QUAL_UNION_TYPE:
538       print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
539       break;
540
541     default:
542       break;
543     }
544 }
545
546 /* Return the name to be printed for DECL.  */
547
548 static const char *
549 gnat_printable_name (tree decl, int verbosity)
550 {
551   const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
552   char *ada_name = (char *) ggc_alloc (strlen (coded_name) * 2 + 60);
553
554   __gnat_decode (coded_name, ada_name, 0);
555
556   if (verbosity == 2 && !DECL_IS_BUILTIN (decl))
557     {
558       Set_Identifier_Casing (ada_name, (char *) DECL_SOURCE_FILE (decl));
559       return ggc_strdup (Name_Buffer);
560     }
561
562   return ada_name;
563 }
564
565 /* Return the name to be used in DWARF debug info for DECL.  */
566
567 static const char *
568 gnat_dwarf_name (tree decl, int verbosity ATTRIBUTE_UNUSED)
569 {
570   gcc_assert (DECL_P (decl));
571   return (const char *) IDENTIFIER_POINTER (DECL_NAME (decl));
572 }
573
574 /* Do nothing (return the tree node passed).  */
575
576 static tree
577 gnat_return_tree (tree t)
578 {
579   return t;
580 }
581
582 /* Return true if type A catches type B. Callback for flow analysis from
583    the exception handling part of the back-end.  */
584
585 static int
586 gnat_eh_type_covers (tree a, tree b)
587 {
588   /* a catches b if they represent the same exception id or if a
589      is an "others".
590
591      ??? integer_zero_node for "others" is hardwired in too many places
592      currently.  */
593   return (a == b || a == integer_zero_node);
594 }
595 \f
596 /* Get the alias set corresponding to a type or expression.  */
597
598 static alias_set_type
599 gnat_get_alias_set (tree type)
600 {
601   /* If this is a padding type, use the type of the first field.  */
602   if (TREE_CODE (type) == RECORD_TYPE
603       && TYPE_IS_PADDING_P (type))
604     return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
605
606   /* If the type is an unconstrained array, use the type of the
607      self-referential array we make.  */
608   else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
609     return
610       get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
611
612   /* If the type can alias any other types, return the alias set 0.  */
613   else if (TYPE_P (type)
614            && TYPE_UNIVERSAL_ALIASING_P (TYPE_MAIN_VARIANT (type)))
615     return 0;
616
617   return -1;
618 }
619
620 /* GNU_TYPE is a type.  Return its maximum size in bytes, if known,
621    as a constant when possible.  */
622
623 static tree
624 gnat_type_max_size (const_tree gnu_type)
625 {
626   /* First see what we can get from TYPE_SIZE_UNIT, which might not
627      be constant even for simple expressions if it has already been
628      elaborated and possibly replaced by a VAR_DECL.  */
629   tree max_unitsize = max_size (TYPE_SIZE_UNIT (gnu_type), true);
630
631   /* If we don't have a constant, see what we can get from TYPE_ADA_SIZE,
632      which should stay untouched.  */
633   if (!host_integerp (max_unitsize, 1)
634       && (TREE_CODE (gnu_type) == RECORD_TYPE
635           || TREE_CODE (gnu_type) == UNION_TYPE
636           || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
637       && TYPE_ADA_SIZE (gnu_type))
638     {
639       tree max_adasize = max_size (TYPE_ADA_SIZE (gnu_type), true);
640
641       /* If we have succeeded in finding a constant, round it up to the
642          type's alignment and return the result in units.  */
643       if (host_integerp (max_adasize, 1))
644         max_unitsize
645           = size_binop (CEIL_DIV_EXPR,
646                         round_up (max_adasize, TYPE_ALIGN (gnu_type)),
647                         bitsize_unit_node);
648     }
649
650   return max_unitsize;
651 }
652
653 /* GNU_TYPE is a type. Determine if it should be passed by reference by
654    default.  */
655
656 bool
657 default_pass_by_ref (tree gnu_type)
658 {
659   /* We pass aggregates by reference if they are sufficiently large.  The
660      choice of constant here is somewhat arbitrary.  We also pass by
661      reference if the target machine would either pass or return by
662      reference.  Strictly speaking, we need only check the return if this
663      is an In Out parameter, but it's probably best to err on the side of
664      passing more things by reference.  */
665
666   if (pass_by_reference (NULL, TYPE_MODE (gnu_type), gnu_type, 1))
667     return true;
668
669   if (targetm.calls.return_in_memory (gnu_type, NULL_TREE))
670     return true;
671
672   if (AGGREGATE_TYPE_P (gnu_type)
673       && (!host_integerp (TYPE_SIZE (gnu_type), 1)
674           || 0 < compare_tree_int (TYPE_SIZE (gnu_type),
675                                    8 * TYPE_ALIGN (gnu_type))))
676     return true;
677
678   return false;
679 }
680
681 /* GNU_TYPE is the type of a subprogram parameter.  Determine from the type if
682    it should be passed by reference. */
683
684 bool
685 must_pass_by_ref (tree gnu_type)
686 {
687   /* We pass only unconstrained objects, those required by the language
688      to be passed by reference, and objects of variable size.  The latter
689      is more efficient, avoids problems with variable size temporaries,
690      and does not produce compatibility problems with C, since C does
691      not have such objects.  */
692   return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
693           || (AGGREGATE_TYPE_P (gnu_type) && TYPE_BY_REFERENCE_P (gnu_type))
694           || (TYPE_SIZE (gnu_type)
695               && TREE_CODE (TYPE_SIZE (gnu_type)) != INTEGER_CST));
696 }
697
698 /* This function is called by the front end to enumerate all the supported
699    modes for the machine.  We pass a function which is called back with
700    the following integer parameters:
701
702    FLOAT_P      nonzero if this represents a floating-point mode
703    COMPLEX_P    nonzero is this represents a complex mode
704    COUNT        count of number of items, nonzero for vector mode
705    PRECISION    number of bits in data representation
706    MANTISSA     number of bits in mantissa, if FP and known, else zero.
707    SIZE         number of bits used to store data
708    ALIGN        number of bits to which mode is aligned.  */
709
710 void
711 enumerate_modes (void (*f) (int, int, int, int, int, int, unsigned int))
712 {
713   enum machine_mode i;
714
715   for (i = 0; i < NUM_MACHINE_MODES; i++)
716     {
717       enum machine_mode j;
718       bool float_p = 0;
719       bool complex_p = 0;
720       bool vector_p = 0;
721       bool skip_p = 0;
722       int mantissa = 0;
723       enum machine_mode inner_mode = i;
724
725       switch (GET_MODE_CLASS (i))
726         {
727         case MODE_INT:
728           break;
729         case MODE_FLOAT:
730           float_p = 1;
731           break;
732         case MODE_COMPLEX_INT:
733           complex_p = 1;
734           inner_mode = GET_MODE_INNER (i);
735           break;
736         case MODE_COMPLEX_FLOAT:
737           float_p = 1;
738           complex_p = 1;
739           inner_mode = GET_MODE_INNER (i);
740           break;
741         case MODE_VECTOR_INT:
742           vector_p = 1;
743           inner_mode = GET_MODE_INNER (i);
744           break;
745         case MODE_VECTOR_FLOAT:
746           float_p = 1;
747           vector_p = 1;
748           inner_mode = GET_MODE_INNER (i);
749           break;
750         default:
751           skip_p = 1;
752         }
753
754       /* Skip this mode if it's one the front end doesn't need to know about
755          (e.g., the CC modes) or if there is no add insn for that mode (or
756          any wider mode), meaning it is not supported by the hardware.  If
757          this a complex or vector mode, we care about the inner mode.  */
758       for (j = inner_mode; j != VOIDmode; j = GET_MODE_WIDER_MODE (j))
759         if (optab_handler (add_optab, j)->insn_code != CODE_FOR_nothing)
760           break;
761
762       if (float_p)
763         {
764           const struct real_format *fmt = REAL_MODE_FORMAT (inner_mode);
765
766           mantissa = fmt->p;
767         }
768
769       if (!skip_p && j != VOIDmode)
770         (*f) (float_p, complex_p, vector_p ? GET_MODE_NUNITS (i) : 0,
771               GET_MODE_BITSIZE (i), mantissa,
772               GET_MODE_SIZE (i) * BITS_PER_UNIT, GET_MODE_ALIGNMENT (i));
773     }
774 }
775
776 /* Return the size of the FP mode with precision PREC.  */
777
778 int
779 fp_prec_to_size (int prec)
780 {
781   enum machine_mode mode;
782
783   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
784        mode = GET_MODE_WIDER_MODE (mode))
785     if (GET_MODE_PRECISION (mode) == prec)
786       return GET_MODE_BITSIZE (mode);
787
788   gcc_unreachable ();
789 }
790
791 /* Return the precision of the FP mode with size SIZE.  */
792
793 int
794 fp_size_to_prec (int size)
795 {
796   enum machine_mode mode;
797
798   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
799        mode = GET_MODE_WIDER_MODE (mode))
800     if (GET_MODE_BITSIZE (mode) == size)
801       return GET_MODE_PRECISION (mode);
802
803   gcc_unreachable ();
804 }