misc.c (gnat_expand_expr): Remove.
[official-gcc.git] / gcc / ada / gcc-interface / misc.c
blobcbb892933f1e88fef130053b09e79a48af7721c7
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 ****************************************************************************/
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. */
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"
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"
75 extern FILE *asm_out_file;
77 /* The largest alignment, in bits, that is needed for using the widest
78 move instruction. */
79 unsigned int largest_move_alignment;
81 static bool gnat_init (void);
82 static void gnat_finish_incomplete_decl (tree);
83 static unsigned int gnat_init_options (unsigned int, const char **);
84 static int gnat_handle_option (size_t, const char *, int);
85 static bool gnat_post_options (const char **);
86 static alias_set_type gnat_get_alias_set (tree);
87 static void gnat_print_decl (FILE *, tree, int);
88 static void gnat_print_type (FILE *, tree, int);
89 static const char *gnat_printable_name (tree, int);
90 static const char *gnat_dwarf_name (tree, int);
91 static tree gnat_return_tree (tree);
92 static int gnat_eh_type_covers (tree, tree);
93 static void gnat_parse_file (int);
94 static void internal_error_function (const char *, va_list *);
95 static tree gnat_type_max_size (const_tree);
97 /* Definitions for our language-specific hooks. */
99 #undef LANG_HOOKS_NAME
100 #define LANG_HOOKS_NAME "GNU Ada"
101 #undef LANG_HOOKS_IDENTIFIER_SIZE
102 #define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct tree_identifier)
103 #undef LANG_HOOKS_INIT
104 #define LANG_HOOKS_INIT gnat_init
105 #undef LANG_HOOKS_INIT_OPTIONS
106 #define LANG_HOOKS_INIT_OPTIONS gnat_init_options
107 #undef LANG_HOOKS_HANDLE_OPTION
108 #define LANG_HOOKS_HANDLE_OPTION gnat_handle_option
109 #undef LANG_HOOKS_POST_OPTIONS
110 #define LANG_HOOKS_POST_OPTIONS gnat_post_options
111 #undef LANG_HOOKS_PARSE_FILE
112 #define LANG_HOOKS_PARSE_FILE gnat_parse_file
113 #undef LANG_HOOKS_HASH_TYPES
114 #define LANG_HOOKS_HASH_TYPES false
115 #undef LANG_HOOKS_GETDECLS
116 #define LANG_HOOKS_GETDECLS lhd_return_null_tree_v
117 #undef LANG_HOOKS_PUSHDECL
118 #define LANG_HOOKS_PUSHDECL gnat_return_tree
119 #undef LANG_HOOKS_WRITE_GLOBALS
120 #define LANG_HOOKS_WRITE_GLOBALS gnat_write_global_declarations
121 #undef LANG_HOOKS_FINISH_INCOMPLETE_DECL
122 #define LANG_HOOKS_FINISH_INCOMPLETE_DECL gnat_finish_incomplete_decl
123 #undef LANG_HOOKS_GET_ALIAS_SET
124 #define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
125 #undef LANG_HOOKS_MARK_ADDRESSABLE
126 #define LANG_HOOKS_MARK_ADDRESSABLE gnat_mark_addressable
127 #undef LANG_HOOKS_PRINT_DECL
128 #define LANG_HOOKS_PRINT_DECL gnat_print_decl
129 #undef LANG_HOOKS_PRINT_TYPE
130 #define LANG_HOOKS_PRINT_TYPE gnat_print_type
131 #undef LANG_HOOKS_TYPE_MAX_SIZE
132 #define LANG_HOOKS_TYPE_MAX_SIZE gnat_type_max_size
133 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
134 #define LANG_HOOKS_DECL_PRINTABLE_NAME gnat_printable_name
135 #undef LANG_HOOKS_DWARF_NAME
136 #define LANG_HOOKS_DWARF_NAME gnat_dwarf_name
137 #undef LANG_HOOKS_GIMPLIFY_EXPR
138 #define LANG_HOOKS_GIMPLIFY_EXPR gnat_gimplify_expr
139 #undef LANG_HOOKS_TYPE_FOR_MODE
140 #define LANG_HOOKS_TYPE_FOR_MODE gnat_type_for_mode
141 #undef LANG_HOOKS_TYPE_FOR_SIZE
142 #define LANG_HOOKS_TYPE_FOR_SIZE gnat_type_for_size
143 #undef LANG_HOOKS_TYPES_COMPATIBLE_P
144 #define LANG_HOOKS_TYPES_COMPATIBLE_P gnat_types_compatible_p
145 #undef LANG_HOOKS_ATTRIBUTE_TABLE
146 #define LANG_HOOKS_ATTRIBUTE_TABLE gnat_internal_attribute_table
147 #undef LANG_HOOKS_BUILTIN_FUNCTION
148 #define LANG_HOOKS_BUILTIN_FUNCTION gnat_builtin_function
150 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
152 /* How much we want of our DWARF extensions. Some of our dwarf+ extensions
153 are incompatible with regular GDB versions, so we must make sure to only
154 produce them on explicit request. This is eventually reflected into the
155 use_gnu_debug_info_extensions common flag for later processing. */
157 static int gnat_dwarf_extensions = 0;
159 /* Command-line argc and argv.
160 These variables are global, since they are imported and used in
161 back_end.adb */
163 unsigned int save_argc;
164 const char **save_argv;
166 /* gnat standard argc argv */
168 extern int gnat_argc;
169 extern char **gnat_argv;
172 /* Declare functions we use as part of startup. */
173 extern void __gnat_initialize (void *);
174 extern void __gnat_install_SEH_handler (void *);
175 extern void adainit (void);
176 extern void _ada_gnat1drv (void);
178 /* The parser for the language. For us, we process the GNAT tree. */
180 static void
181 gnat_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
183 int seh[2];
185 /* Call the target specific initializations. */
186 __gnat_initialize (NULL);
188 /* ??? Call the SEH initialization routine. This is to workaround
189 a bootstrap path problem. The call below should be removed at some
190 point and the SEH pointer passed to __gnat_initialize() above. */
191 __gnat_install_SEH_handler((void *)seh);
193 /* Call the front-end elaboration procedures. */
194 adainit ();
196 /* Call the front end. */
197 _ada_gnat1drv ();
199 /* We always have a single compilation unit in Ada. */
200 cgraph_finalize_compilation_unit ();
203 /* Decode all the language specific options that cannot be decoded by GCC.
204 The option decoding phase of GCC calls this routine on the flags that
205 it cannot decode. This routine returns the number of consecutive arguments
206 from ARGV that it successfully decoded; 0 indicates failure. */
208 static int
209 gnat_handle_option (size_t scode, const char *arg, int value)
211 const struct cl_option *option = &cl_options[scode];
212 enum opt_code code = (enum opt_code) scode;
213 char *q;
215 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
217 error ("missing argument to \"-%s\"", option->opt_text);
218 return 1;
221 switch (code)
223 case OPT_I:
224 q = XNEWVEC (char, sizeof("-I") + strlen (arg));
225 strcpy (q, "-I");
226 strcat (q, arg);
227 gnat_argv[gnat_argc] = q;
228 gnat_argc++;
229 break;
231 case OPT_Wall:
232 warn_unused = value;
234 /* We save the value of warn_uninitialized, since if they put
235 -Wuninitialized on the command line, we need to generate a
236 warning about not using it without also specifying -O. */
237 if (warn_uninitialized != 1)
238 warn_uninitialized = (value ? 2 : 0);
239 break;
241 /* These are used in the GCC Makefile. */
242 case OPT_Wmissing_prototypes:
243 case OPT_Wstrict_prototypes:
244 case OPT_Wwrite_strings:
245 case OPT_Wlong_long:
246 case OPT_Wvariadic_macros:
247 case OPT_Wold_style_definition:
248 case OPT_Wmissing_format_attribute:
249 case OPT_Woverlength_strings:
250 break;
252 /* This is handled by the front-end. */
253 case OPT_nostdinc:
254 break;
256 case OPT_nostdlib:
257 gnat_argv[gnat_argc] = xstrdup ("-nostdlib");
258 gnat_argc++;
259 break;
261 case OPT_feliminate_unused_debug_types:
262 /* We arrange for post_option to be able to only set the corresponding
263 flag to 1 when explicitly requested by the user. We expect the
264 default flag value to be either 0 or positive, and expose a positive
265 -f as a negative value to post_option. */
266 flag_eliminate_unused_debug_types = -value;
267 break;
269 case OPT_fRTS_:
270 gnat_argv[gnat_argc] = xstrdup ("-fRTS");
271 gnat_argc++;
272 break;
274 case OPT_gant:
275 warning (0, "%<-gnat%> misspelled as %<-gant%>");
277 /* ... fall through ... */
279 case OPT_gnat:
280 /* Recopy the switches without the 'gnat' prefix. */
281 gnat_argv[gnat_argc] = XNEWVEC (char, strlen (arg) + 2);
282 gnat_argv[gnat_argc][0] = '-';
283 strcpy (gnat_argv[gnat_argc] + 1, arg);
284 gnat_argc++;
285 break;
287 case OPT_gnatO:
288 gnat_argv[gnat_argc] = xstrdup ("-O");
289 gnat_argc++;
290 gnat_argv[gnat_argc] = xstrdup (arg);
291 gnat_argc++;
292 break;
294 case OPT_gdwarf_:
295 gnat_dwarf_extensions ++;
296 break;
298 default:
299 gcc_unreachable ();
302 return 1;
305 /* Initialize for option processing. */
307 static unsigned int
308 gnat_init_options (unsigned int argc, const char **argv)
310 /* Initialize gnat_argv with save_argv size. */
311 gnat_argv = (char **) xmalloc ((argc + 1) * sizeof (argv[0]));
312 gnat_argv[0] = xstrdup (argv[0]); /* name of the command */
313 gnat_argc = 1;
315 save_argc = argc;
316 save_argv = argv;
318 /* Uninitialized really means uninitialized in Ada. */
319 flag_zero_initialized_in_bss = 0;
321 return CL_Ada;
324 /* Post-switch processing. */
326 bool
327 gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED)
329 /* Excess precision other than "fast" requires front-end
330 support. */
331 if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
332 && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
333 sorry ("-fexcess-precision=standard for Ada");
334 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
336 /* ??? The warning machinery is outsmarted by Ada. */
337 warn_unused_parameter = 0;
339 /* No psABI change warnings for Ada. */
340 warn_psabi = 0;
342 /* Force eliminate_unused_debug_types to 0 unless an explicit positive
343 -f has been passed. This forces the default to 0 for Ada, which might
344 differ from the common default. */
345 if (flag_eliminate_unused_debug_types < 0)
346 flag_eliminate_unused_debug_types = 1;
347 else
348 flag_eliminate_unused_debug_types = 0;
350 /* Reflect the explicit request of DWARF extensions into the common
351 flag for use by later passes. */
352 if (write_symbols == DWARF2_DEBUG)
353 use_gnu_debug_info_extensions = gnat_dwarf_extensions > 0;
355 return false;
358 /* Here is the function to handle the compiler error processing in GCC. */
360 static void
361 internal_error_function (const char *msgid, va_list *ap)
363 text_info tinfo;
364 char *buffer, *p, *loc;
365 String_Template temp, temp_loc;
366 Fat_Pointer fp, fp_loc;
367 expanded_location s;
369 /* Reset the pretty-printer. */
370 pp_clear_output_area (global_dc->printer);
372 /* Format the message into the pretty-printer. */
373 tinfo.format_spec = msgid;
374 tinfo.args_ptr = ap;
375 tinfo.err_no = errno;
376 pp_format_verbatim (global_dc->printer, &tinfo);
378 /* Extract a (writable) pointer to the formatted text. */
379 buffer = (char*) pp_formatted_text (global_dc->printer);
381 /* Go up to the first newline. */
382 for (p = buffer; *p; p++)
383 if (*p == '\n')
385 *p = '\0';
386 break;
389 temp.Low_Bound = 1;
390 temp.High_Bound = p - buffer;
391 fp.Bounds = &temp;
392 fp.Array = buffer;
394 s = expand_location (input_location);
395 if (flag_show_column && s.column != 0)
396 asprintf (&loc, "%s:%d:%d", s.file, s.line, s.column);
397 else
398 asprintf (&loc, "%s:%d", s.file, s.line);
399 temp_loc.Low_Bound = 1;
400 temp_loc.High_Bound = strlen (loc);
401 fp_loc.Bounds = &temp_loc;
402 fp_loc.Array = loc;
404 Current_Error_Node = error_gnat_node;
405 Compiler_Abort (fp, -1, fp_loc);
408 /* Perform all the initialization steps that are language-specific. */
410 static bool
411 gnat_init (void)
413 /* Performs whatever initialization steps needed by the language-dependent
414 lexical analyzer. */
415 gnat_init_decl_processing ();
417 /* Add the input filename as the last argument. */
418 gnat_argv[gnat_argc] = (char *) main_input_filename;
419 gnat_argc++;
420 gnat_argv[gnat_argc] = 0;
422 global_dc->internal_error = &internal_error_function;
424 /* Show that REFERENCE_TYPEs are internal and should be Pmode. */
425 internal_reference_types ();
427 return true;
430 /* This function is called indirectly from toplev.c to handle incomplete
431 declarations, i.e. VAR_DECL nodes whose DECL_SIZE is zero. To be precise,
432 compile_file in toplev.c makes an indirect call through the function pointer
433 incomplete_decl_finalize_hook which is initialized to this routine in
434 init_decl_processing. */
436 static void
437 gnat_finish_incomplete_decl (tree dont_care ATTRIBUTE_UNUSED)
439 gcc_unreachable ();
442 /* Compute the alignment of the largest mode that can be used for copying
443 objects. */
445 void
446 gnat_compute_largest_alignment (void)
448 enum machine_mode mode;
450 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
451 mode = GET_MODE_WIDER_MODE (mode))
452 if (optab_handler (mov_optab, mode)->insn_code != CODE_FOR_nothing)
453 largest_move_alignment = MIN (BIGGEST_ALIGNMENT,
454 MAX (largest_move_alignment,
455 GET_MODE_ALIGNMENT (mode)));
458 /* If we are using the GCC mechanism to process exception handling, we
459 have to register the personality routine for Ada and to initialize
460 various language dependent hooks. */
462 void
463 gnat_init_gcc_eh (void)
465 #ifdef DWARF2_UNWIND_INFO
466 /* lang_dependent_init already called dwarf2out_frame_init if true. */
467 int dwarf2out_frame_initialized = dwarf2out_do_frame ();
468 #endif
470 /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
471 though. This could for instance lead to the emission of tables with
472 references to symbols (such as the Ada eh personality routine) within
473 libraries we won't link against. */
474 if (No_Exception_Handlers_Set ())
475 return;
477 /* Tell GCC we are handling cleanup actions through exception propagation.
478 This opens possibilities that we don't take advantage of yet, but is
479 nonetheless necessary to ensure that fixup code gets assigned to the
480 right exception regions. */
481 using_eh_for_cleanups ();
483 eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
484 ? "__gnat_eh_personality_sj"
485 : "__gnat_eh_personality");
486 lang_eh_type_covers = gnat_eh_type_covers;
487 lang_eh_runtime_type = gnat_return_tree;
488 default_init_unwind_resume_libfunc ();
490 /* Turn on -fexceptions and -fnon-call-exceptions. The first one triggers
491 the generation of the necessary exception runtime tables. The second one
492 is useful for two reasons: 1/ we map some asynchronous signals like SEGV
493 to exceptions, so we need to ensure that the insns which can lead to such
494 signals are correctly attached to the exception region they pertain to,
495 2/ Some calls to pure subprograms are handled as libcall blocks and then
496 marked as "cannot trap" if the flag is not set (see emit_libcall_block).
497 We should not let this be since it is possible for such calls to actually
498 raise in Ada. */
499 flag_exceptions = 1;
500 flag_non_call_exceptions = 1;
502 init_eh ();
503 #ifdef DWARF2_UNWIND_INFO
504 if (!dwarf2out_frame_initialized && dwarf2out_do_frame ())
505 dwarf2out_frame_init ();
506 #endif
509 /* Language hooks, first one to print language-specific items in a DECL. */
511 static void
512 gnat_print_decl (FILE *file, tree node, int indent)
514 switch (TREE_CODE (node))
516 case CONST_DECL:
517 print_node (file, "const_corresponding_var",
518 DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
519 break;
521 case FIELD_DECL:
522 print_node (file, "original_field", DECL_ORIGINAL_FIELD (node),
523 indent + 4);
524 break;
526 case VAR_DECL:
527 print_node (file, "renamed_object", DECL_RENAMED_OBJECT (node),
528 indent + 4);
529 break;
531 default:
532 break;
536 static void
537 gnat_print_type (FILE *file, tree node, int indent)
539 switch (TREE_CODE (node))
541 case FUNCTION_TYPE:
542 print_node (file, "ci_co_list", TYPE_CI_CO_LIST (node), indent + 4);
543 break;
545 case ENUMERAL_TYPE:
546 case BOOLEAN_TYPE:
547 print_node (file, "RM size", TYPE_RM_SIZE_NUM (node), indent + 4);
548 break;
550 case INTEGER_TYPE:
551 if (TYPE_MODULAR_P (node))
552 print_node (file, "modulus", TYPE_MODULUS (node), indent + 4);
553 else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
554 print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
555 indent + 4);
556 else if (TYPE_VAX_FLOATING_POINT_P (node))
558 else
559 print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);
561 print_node (file, "RM size", TYPE_RM_SIZE_NUM (node), indent + 4);
562 break;
564 case ARRAY_TYPE:
565 print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
566 break;
568 case RECORD_TYPE:
569 if (TYPE_IS_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
570 print_node (file, "unconstrained array",
571 TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
572 else
573 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
574 break;
576 case UNION_TYPE:
577 case QUAL_UNION_TYPE:
578 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
579 break;
581 default:
582 break;
586 static const char *
587 gnat_dwarf_name (tree t, int verbosity ATTRIBUTE_UNUSED)
589 gcc_assert (DECL_P (t));
591 return (const char *) IDENTIFIER_POINTER (DECL_NAME (t));
594 static const char *
595 gnat_printable_name (tree decl, int verbosity)
597 const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
598 char *ada_name = (char *) ggc_alloc (strlen (coded_name) * 2 + 60);
600 __gnat_decode (coded_name, ada_name, 0);
602 if (verbosity == 2 && !DECL_IS_BUILTIN (decl))
604 Set_Identifier_Casing (ada_name, (char *) DECL_SOURCE_FILE (decl));
605 return ggc_strdup (Name_Buffer);
607 else
608 return ada_name;
611 /* Do nothing (return the tree node passed). */
613 static tree
614 gnat_return_tree (tree t)
616 return t;
619 /* Return true if type A catches type B. Callback for flow analysis from
620 the exception handling part of the back-end. */
622 static int
623 gnat_eh_type_covers (tree a, tree b)
625 /* a catches b if they represent the same exception id or if a
626 is an "others".
628 ??? integer_zero_node for "others" is hardwired in too many places
629 currently. */
630 return (a == b || a == integer_zero_node);
633 /* Get the alias set corresponding to a type or expression. */
635 static alias_set_type
636 gnat_get_alias_set (tree type)
638 /* If this is a padding type, use the type of the first field. */
639 if (TREE_CODE (type) == RECORD_TYPE
640 && TYPE_IS_PADDING_P (type))
641 return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
643 /* If the type is an unconstrained array, use the type of the
644 self-referential array we make. */
645 else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
646 return
647 get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
649 /* If the type can alias any other types, return the alias set 0. */
650 else if (TYPE_P (type)
651 && TYPE_UNIVERSAL_ALIASING_P (TYPE_MAIN_VARIANT (type)))
652 return 0;
654 return -1;
657 /* GNU_TYPE is a type. Return its maximum size in bytes, if known,
658 as a constant when possible. */
660 static tree
661 gnat_type_max_size (const_tree gnu_type)
663 /* First see what we can get from TYPE_SIZE_UNIT, which might not
664 be constant even for simple expressions if it has already been
665 elaborated and possibly replaced by a VAR_DECL. */
666 tree max_unitsize = max_size (TYPE_SIZE_UNIT (gnu_type), true);
668 /* If we don't have a constant, see what we can get from TYPE_ADA_SIZE,
669 which should stay untouched. */
670 if (!host_integerp (max_unitsize, 1)
671 && (TREE_CODE (gnu_type) == RECORD_TYPE
672 || TREE_CODE (gnu_type) == UNION_TYPE
673 || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
674 && TYPE_ADA_SIZE (gnu_type))
676 tree max_adasize = max_size (TYPE_ADA_SIZE (gnu_type), true);
678 /* If we have succeeded in finding a constant, round it up to the
679 type's alignment and return the result in units. */
680 if (host_integerp (max_adasize, 1))
681 max_unitsize
682 = size_binop (CEIL_DIV_EXPR,
683 round_up (max_adasize, TYPE_ALIGN (gnu_type)),
684 bitsize_unit_node);
687 return max_unitsize;
690 /* GNU_TYPE is a type. Determine if it should be passed by reference by
691 default. */
693 bool
694 default_pass_by_ref (tree gnu_type)
696 /* We pass aggregates by reference if they are sufficiently large. The
697 choice of constant here is somewhat arbitrary. We also pass by
698 reference if the target machine would either pass or return by
699 reference. Strictly speaking, we need only check the return if this
700 is an In Out parameter, but it's probably best to err on the side of
701 passing more things by reference. */
703 if (pass_by_reference (NULL, TYPE_MODE (gnu_type), gnu_type, 1))
704 return true;
706 if (targetm.calls.return_in_memory (gnu_type, NULL_TREE))
707 return true;
709 if (AGGREGATE_TYPE_P (gnu_type)
710 && (!host_integerp (TYPE_SIZE (gnu_type), 1)
711 || 0 < compare_tree_int (TYPE_SIZE (gnu_type),
712 8 * TYPE_ALIGN (gnu_type))))
713 return true;
715 return false;
718 /* GNU_TYPE is the type of a subprogram parameter. Determine from the type if
719 it should be passed by reference. */
721 bool
722 must_pass_by_ref (tree gnu_type)
724 /* We pass only unconstrained objects, those required by the language
725 to be passed by reference, and objects of variable size. The latter
726 is more efficient, avoids problems with variable size temporaries,
727 and does not produce compatibility problems with C, since C does
728 not have such objects. */
729 return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
730 || (AGGREGATE_TYPE_P (gnu_type) && TYPE_BY_REFERENCE_P (gnu_type))
731 || (TYPE_SIZE (gnu_type)
732 && TREE_CODE (TYPE_SIZE (gnu_type)) != INTEGER_CST));
735 /* This function is called by the front end to enumerate all the supported
736 modes for the machine. We pass a function which is called back with
737 the following integer parameters:
739 FLOAT_P nonzero if this represents a floating-point mode
740 COMPLEX_P nonzero is this represents a complex mode
741 COUNT count of number of items, nonzero for vector mode
742 PRECISION number of bits in data representation
743 MANTISSA number of bits in mantissa, if FP and known, else zero.
744 SIZE number of bits used to store data
745 ALIGN number of bits to which mode is aligned. */
747 void
748 enumerate_modes (void (*f) (int, int, int, int, int, int, unsigned int))
750 enum machine_mode i;
752 for (i = 0; i < NUM_MACHINE_MODES; i++)
754 enum machine_mode j;
755 bool float_p = 0;
756 bool complex_p = 0;
757 bool vector_p = 0;
758 bool skip_p = 0;
759 int mantissa = 0;
760 enum machine_mode inner_mode = i;
762 switch (GET_MODE_CLASS (i))
764 case MODE_INT:
765 break;
766 case MODE_FLOAT:
767 float_p = 1;
768 break;
769 case MODE_COMPLEX_INT:
770 complex_p = 1;
771 inner_mode = GET_MODE_INNER (i);
772 break;
773 case MODE_COMPLEX_FLOAT:
774 float_p = 1;
775 complex_p = 1;
776 inner_mode = GET_MODE_INNER (i);
777 break;
778 case MODE_VECTOR_INT:
779 vector_p = 1;
780 inner_mode = GET_MODE_INNER (i);
781 break;
782 case MODE_VECTOR_FLOAT:
783 float_p = 1;
784 vector_p = 1;
785 inner_mode = GET_MODE_INNER (i);
786 break;
787 default:
788 skip_p = 1;
791 /* Skip this mode if it's one the front end doesn't need to know about
792 (e.g., the CC modes) or if there is no add insn for that mode (or
793 any wider mode), meaning it is not supported by the hardware. If
794 this a complex or vector mode, we care about the inner mode. */
795 for (j = inner_mode; j != VOIDmode; j = GET_MODE_WIDER_MODE (j))
796 if (optab_handler (add_optab, j)->insn_code != CODE_FOR_nothing)
797 break;
799 if (float_p)
801 const struct real_format *fmt = REAL_MODE_FORMAT (inner_mode);
803 mantissa = fmt->p;
806 if (!skip_p && j != VOIDmode)
807 (*f) (float_p, complex_p, vector_p ? GET_MODE_NUNITS (i) : 0,
808 GET_MODE_BITSIZE (i), mantissa,
809 GET_MODE_SIZE (i) * BITS_PER_UNIT, GET_MODE_ALIGNMENT (i));
814 fp_prec_to_size (int prec)
816 enum machine_mode mode;
818 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
819 mode = GET_MODE_WIDER_MODE (mode))
820 if (GET_MODE_PRECISION (mode) == prec)
821 return GET_MODE_BITSIZE (mode);
823 gcc_unreachable ();
827 fp_size_to_prec (int size)
829 enum machine_mode mode;
831 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
832 mode = GET_MODE_WIDER_MODE (mode))
833 if (GET_MODE_BITSIZE (mode) == size)
834 return GET_MODE_PRECISION (mode);
836 gcc_unreachable ();