1 /****************************************************************************
3 * GNAT COMPILER COMPONENTS *
7 * C Implementation File *
10 * Copyright (C) 1992-2002 Free Software Foundation, Inc. *
12 * GNAT is free software; you can redistribute it and/or modify it under *
13 * terms of the GNU General Public License as published by the Free Soft- *
14 * ware Foundation; either version 2, or (at your option) any later ver- *
15 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
16 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
18 * for more details. You should have received a copy of the GNU General *
19 * Public License distributed with GNAT; see file COPYING. If not, write *
20 * to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, *
21 * MA 02111-1307, USA. *
23 * As a special exception, if you link this file with other files to *
24 * produce an executable, this file does not by itself cause the resulting *
25 * executable to be covered by the GNU General Public License. This except- *
26 * ion does not however invalidate any other reasons why the executable *
27 * file might be covered by the GNU Public License. *
29 * GNAT was originally developed by the GNAT team at New York University. *
30 * Extensive contributions were provided by Ada Core Technologies Inc. *
32 ****************************************************************************/
34 /* This file contains parts of the compiler that are required for interfacing
35 with GCC but otherwise do nothing and parts of Gigi that need to know
40 #include "coretypes.h"
45 #include "diagnostic.h"
51 #include "insn-codes.h"
52 #include "insn-flags.h"
53 #include "insn-config.h"
60 #include "langhooks.h"
61 #include "langhooks-def.h"
76 #include "adadecode.h"
80 extern FILE *asm_out_file;
82 extern char **save_argv;
84 static size_t gnat_tree_size PARAMS ((enum tree_code));
85 static bool gnat_init PARAMS ((void));
86 static int gnat_init_options PARAMS ((void));
87 static int gnat_handle_option (size_t scode, const char *arg, int value);
88 static HOST_WIDE_INT gnat_get_alias_set PARAMS ((tree));
89 static void gnat_print_decl PARAMS ((FILE *, tree, int));
90 static void gnat_print_type PARAMS ((FILE *, tree, int));
91 static const char *gnat_printable_name PARAMS ((tree, int));
92 static tree gnat_eh_runtime_type PARAMS ((tree));
93 static int gnat_eh_type_covers PARAMS ((tree, tree));
94 static void gnat_parse_file PARAMS ((int));
95 static rtx gnat_expand_expr PARAMS ((tree, rtx, enum machine_mode,
98 /* Structure giving our language-specific hooks. */
100 #undef LANG_HOOKS_NAME
101 #define LANG_HOOKS_NAME "GNU Ada"
102 #undef LANG_HOOKS_IDENTIFIER_SIZE
103 #define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct tree_identifier)
104 #undef LANG_HOOKS_TREE_SIZE
105 #define LANG_HOOKS_TREE_SIZE gnat_tree_size
106 #undef LANG_HOOKS_INIT
107 #define LANG_HOOKS_INIT gnat_init
108 #undef LANG_HOOKS_INIT_OPTIONS
109 #define LANG_HOOKS_INIT_OPTIONS gnat_init_options
110 #undef LANG_HOOKS_HANDLE_OPTION
111 #define LANG_HOOKS_HANDLE_OPTION gnat_handle_option
112 #undef LANG_HOOKS_PARSE_FILE
113 #define LANG_HOOKS_PARSE_FILE gnat_parse_file
114 #undef LANG_HOOKS_HONOR_READONLY
115 #define LANG_HOOKS_HONOR_READONLY 1
116 #undef LANG_HOOKS_FINISH_INCOMPLETE_DECL
117 #define LANG_HOOKS_FINISH_INCOMPLETE_DECL gnat_finish_incomplete_decl
118 #undef LANG_HOOKS_GET_ALIAS_SET
119 #define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
120 #undef LANG_HOOKS_EXPAND_EXPR
121 #define LANG_HOOKS_EXPAND_EXPR gnat_expand_expr
122 #undef LANG_HOOKS_MARK_ADDRESSABLE
123 #define LANG_HOOKS_MARK_ADDRESSABLE gnat_mark_addressable
124 #undef LANG_HOOKS_TRUTHVALUE_CONVERSION
125 #define LANG_HOOKS_TRUTHVALUE_CONVERSION gnat_truthvalue_conversion
126 #undef LANG_HOOKS_PRINT_DECL
127 #define LANG_HOOKS_PRINT_DECL gnat_print_decl
128 #undef LANG_HOOKS_PRINT_TYPE
129 #define LANG_HOOKS_PRINT_TYPE gnat_print_type
130 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
131 #define LANG_HOOKS_DECL_PRINTABLE_NAME gnat_printable_name
132 #undef LANG_HOOKS_TYPE_FOR_MODE
133 #define LANG_HOOKS_TYPE_FOR_MODE gnat_type_for_mode
134 #undef LANG_HOOKS_TYPE_FOR_SIZE
135 #define LANG_HOOKS_TYPE_FOR_SIZE gnat_type_for_size
136 #undef LANG_HOOKS_SIGNED_TYPE
137 #define LANG_HOOKS_SIGNED_TYPE gnat_signed_type
138 #undef LANG_HOOKS_UNSIGNED_TYPE
139 #define LANG_HOOKS_UNSIGNED_TYPE gnat_unsigned_type
140 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
141 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE gnat_signed_or_unsigned_type
143 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
145 /* Tables describing GCC tree codes used only by GNAT.
147 Table indexed by tree code giving a string containing a character
148 classifying the tree code. Possibilities are
149 t, d, s, c, r, <, 1 and 2. See cp-tree.def for details. */
151 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
153 const char tree_code_type[] = {
156 #include "ada-tree.def"
160 /* Table indexed by tree code giving number of expression
161 operands beyond the fixed part of the node structure.
162 Not used for types or decls. */
164 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
166 const unsigned char tree_code_length[] = {
169 #include "ada-tree.def"
173 /* Names of tree components.
174 Used for printing out the tree and error messages. */
175 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
177 const char *const tree_code_name[] = {
180 #include "ada-tree.def"
184 /* gnat standard argc argv */
186 extern int gnat_argc;
187 extern char **gnat_argv;
189 static void internal_error_function PARAMS ((const char *, va_list *));
190 static void gnat_adjust_rli PARAMS ((record_layout_info));
192 /* Declare functions we use as part of startup. */
193 extern void __gnat_initialize PARAMS((void));
194 extern void adainit PARAMS((void));
195 extern void _ada_gnat1drv PARAMS((void));
197 /* The parser for the language. For us, we process the GNAT tree. */
200 gnat_parse_file (set_yydebug)
201 int set_yydebug ATTRIBUTE_UNUSED;
203 /* call the target specific initializations */
206 /* Call the front-end elaboration procedures */
209 immediate_size_expand = 1;
211 /* Call the front end */
215 /* Decode all the language specific options that cannot be decoded by GCC.
216 The option decoding phase of GCC calls this routine on the flags that
217 it cannot decode. This routine returns the number of consecutive arguments
218 from ARGV that it successfully decoded; 0 indicates failure. */
221 gnat_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED)
223 const struct cl_option *option = &cl_options[scode];
224 enum opt_code code = (enum opt_code) scode;
228 /* Ignore file names. */
232 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
234 error ("missing argument to \"-%s\"", option->opt_text);
244 q = xmalloc (sizeof("-I") + strlen (arg));
247 gnat_argv[gnat_argc] = q;
252 /* All front ends are expected to accept this. */
256 gnat_argv[gnat_argc] = xstrdup ("-fRTS");
261 warning ("`-gnat' misspelled as `-gant'");
265 /* Recopy the switches without the 'gnat' prefix */
266 gnat_argv[gnat_argc] = xmalloc (strlen (arg) + 2);
267 gnat_argv[gnat_argc][0] = '-';
268 strcpy (gnat_argv[gnat_argc] + 1, arg);
272 for (i = 1; i < save_argc - 1; i++)
273 if (!strncmp (save_argv[i], "-gnatO", 6))
274 if (save_argv[++i][0] != '-')
276 /* Preserve output filename as GCC doesn't save it for GNAT. */
277 gnat_argv[gnat_argc] = save_argv[i];
287 /* Initialize for option processing. */
292 /* Initialize gnat_argv with save_argv size */
293 gnat_argv = (char **) xmalloc ((save_argc + 1) * sizeof (gnat_argv[0]));
294 gnat_argv[0] = save_argv[0]; /* name of the command */
300 /* Here is the function to handle the compiler error processing in GCC. */
303 internal_error_function (msgid, ap)
307 char buffer[1000]; /* Assume this is big enough. */
309 String_Template temp;
312 vsprintf (buffer, msgid, *ap);
314 /* Go up to the first newline. */
315 for (p = buffer; *p != 0; p++)
322 temp.Low_Bound = 1, temp.High_Bound = strlen (buffer);
323 fp.Array = buffer, fp.Bounds = &temp;
325 Current_Error_Node = error_gnat_node;
326 Compiler_Abort (fp, -1);
329 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
331 gnat_tree_size (enum tree_code code)
335 case GNAT_LOOP_ID: return sizeof (struct tree_loop_id);
342 /* Perform all the initialization steps that are language-specific. */
347 /* Performs whatever initialization steps needed by the language-dependent
350 Define the additional tree codes here. This isn't the best place to put
351 it, but it's where g++ does it. */
353 gnat_init_decl_processing ();
355 /* Add the input filename as the last argument. */
356 gnat_argv[gnat_argc] = (char *) main_input_filename;
358 gnat_argv[gnat_argc] = 0;
360 global_dc->internal_error = &internal_error_function;
362 /* Show that REFERENCE_TYPEs are internal and should be Pmode. */
363 internal_reference_types ();
365 set_lang_adjust_rli (gnat_adjust_rli);
370 /* If we are using the GCC mechanism for to process exception handling, we
371 have to register the personality routine for Ada and to initialize
372 various language dependent hooks. */
377 /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
378 though. This could for instance lead to the emission of tables with
379 references to symbols (such as the Ada eh personality routine) within
380 libraries we won't link against. */
381 if (No_Exception_Handlers_Set ())
384 eh_personality_libfunc = init_one_libfunc ("__gnat_eh_personality");
385 lang_eh_type_covers = gnat_eh_type_covers;
386 lang_eh_runtime_type = gnat_eh_runtime_type;
390 #ifdef DWARF2_UNWIND_INFO
391 if (dwarf2out_do_frame ())
392 dwarf2out_frame_init ();
396 /* Hooks for print-tree.c: */
399 gnat_print_decl (file, node, indent)
404 switch (TREE_CODE (node))
407 print_node (file, "const_corresponding_var",
408 DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
412 print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
422 gnat_print_type (file, node, indent)
427 switch (TREE_CODE (node))
430 print_node (file, "ci_co_list", TYPE_CI_CO_LIST (node), indent + 4);
434 print_node (file, "RM size", TYPE_RM_SIZE_ENUM (node), indent + 4);
438 if (TYPE_MODULAR_P (node))
439 print_node (file, "modulus", TYPE_MODULUS (node), indent + 4);
440 else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
441 print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
443 else if (TYPE_VAX_FLOATING_POINT_P (node))
446 print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);
448 print_node (file, "RM size", TYPE_RM_SIZE_INT (node), indent + 4);
452 print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
456 if (TYPE_IS_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
457 print_node (file, "unconstrained array",
458 TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
460 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
464 case QUAL_UNION_TYPE:
465 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
474 gnat_printable_name (decl, verbosity)
476 int verbosity ATTRIBUTE_UNUSED;
478 const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
479 char *ada_name = (char *) ggc_alloc (strlen (coded_name) * 2 + 60);
481 __gnat_decode (coded_name, ada_name, 0);
483 return (const char *) ada_name;
486 /* Expands GNAT-specific GCC tree nodes. The only ones we support
487 here are TRANSFORM_EXPR, ALLOCATE_EXPR, USE_EXPR and NULL_EXPR. */
490 gnat_expand_expr (exp, target, tmode, modifier)
493 enum machine_mode tmode;
494 int modifier; /* Actually an enum expand_modifier. */
496 tree type = TREE_TYPE (exp);
500 /* Update EXP to be the new expression to expand. */
502 switch (TREE_CODE (exp))
505 gnat_to_code (TREE_COMPLEXITY (exp));
510 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
512 /* We aren't going to be doing anything with this memory, but allocate
513 it anyway. If it's variable size, make a bogus address. */
514 if (! host_integerp (TYPE_SIZE_UNIT (type), 1))
515 result = gen_rtx_MEM (BLKmode, virtual_stack_vars_rtx);
517 result = assign_temp (type, 0, TREE_ADDRESSABLE (exp), 1);
523 allocate_dynamic_stack_space
524 (expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, TYPE_MODE (sizetype),
526 NULL_RTX, tree_low_cst (TREE_OPERAND (exp, 1), 1));
529 if (target != const0_rtx)
532 /* First write a volatile ASM_INPUT to prevent anything from being
534 result = gen_rtx_ASM_INPUT (VOIDmode, "");
535 MEM_VOLATILE_P (result) = 1;
538 result = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode,
540 emit_insn (gen_rtx_USE (VOIDmode, result));
544 return expand_expr (build1 (NOP_EXPR, type, TREE_OPERAND (exp, 0)),
545 target, tmode, modifier);
547 case UNCONSTRAINED_ARRAY_REF:
548 /* If we are evaluating just for side-effects, just evaluate our
549 operand. Otherwise, abort since this code should never appear
550 in a tree to be evaluated (objects aren't unconstrained). */
551 if (target == const0_rtx || TREE_CODE (type) == VOID_TYPE)
552 return expand_expr (TREE_OPERAND (exp, 0), const0_rtx,
555 /* ... fall through ... */
561 return expand_expr (new, target, tmode, modifier);
564 /* Adjusts the RLI used to layout a record after all the fields have been
565 added. We only handle the packed case and cause it to use the alignment
566 that will pad the record at the end. */
569 gnat_adjust_rli (rli)
570 record_layout_info rli ATTRIBUTE_UNUSED;
572 /* This function has no actual effect; record_align should already
573 reflect the largest alignment desired by a field. jason 2003-04-01 */
576 /* Make a TRANSFORM_EXPR to later expand GNAT_NODE into code. */
579 make_transform_expr (gnat_node)
582 tree gnu_result = build (TRANSFORM_EXPR, void_type_node);
584 TREE_SIDE_EFFECTS (gnu_result) = 1;
585 TREE_COMPLEXITY (gnu_result) = gnat_node;
589 /* Update the setjmp buffer BUF with the current stack pointer. We assume
590 here that a __builtin_setjmp was done to BUF. */
593 update_setjmp_buf (buf)
596 enum machine_mode sa_mode = Pmode;
599 #ifdef HAVE_save_stack_nonlocal
600 if (HAVE_save_stack_nonlocal)
601 sa_mode = insn_data[(int) CODE_FOR_save_stack_nonlocal].operand[0].mode;
603 #ifdef STACK_SAVEAREA_MODE
604 sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
608 = gen_rtx_MEM (sa_mode,
611 plus_constant (expand_expr
612 (build_unary_op (ADDR_EXPR, NULL_TREE, buf),
613 NULL_RTX, VOIDmode, 0),
614 2 * GET_MODE_SIZE (Pmode))));
618 emit_insn (gen_setjmp ());
621 emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
624 /* These routines are used in conjunction with GCC exception handling. */
626 /* Map compile-time to run-time tree for GCC exception handling scheme. */
629 gnat_eh_runtime_type (type)
635 /* Return true if type A catches type B. Callback for flow analysis from
636 the exception handling part of the back-end. */
639 gnat_eh_type_covers (a, b)
642 /* a catches b if they represent the same exception id or if a
645 ??? integer_zero_node for "others" is hardwired in too many places
647 return (a == b || a == integer_zero_node);
650 /* See if DECL has an RTL that is indirect via a pseudo-register or a
651 memory location and replace it with an indirect reference if so.
652 This improves the debugger's ability to display the value. */
655 adjust_decl_rtl (decl)
660 /* If this decl is already indirect, don't do anything. This should
661 mean that the decl cannot be indirect, but there's no point in
662 adding an abort to check that. */
663 if (TREE_CODE (decl) != CONST_DECL
664 && ! DECL_BY_REF_P (decl)
665 && (GET_CODE (DECL_RTL (decl)) == MEM
666 && (GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
667 || (GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG
668 && (REGNO (XEXP (DECL_RTL (decl), 0))
669 > LAST_VIRTUAL_REGISTER))))
670 /* We can't do this if the reference type's mode is not the same
671 as the current mode, which means this may not work on mixed 32/64
673 && (new_type = build_reference_type (TREE_TYPE (decl))) != 0
674 && TYPE_MODE (new_type) == GET_MODE (XEXP (DECL_RTL (decl), 0))
675 /* If this is a PARM_DECL, we can only do it if DECL_INCOMING_RTL
676 is also an indirect and of the same mode and if the object is
677 readonly, the latter condition because we don't want to upset the
678 handling of CICO_LIST. */
679 && (TREE_CODE (decl) != PARM_DECL
680 || (GET_CODE (DECL_INCOMING_RTL (decl)) == MEM
681 && (TYPE_MODE (new_type)
682 == GET_MODE (XEXP (DECL_INCOMING_RTL (decl), 0)))
683 && TREE_READONLY (decl))))
686 = build_qualified_type (new_type,
687 (TYPE_QUALS (new_type) | TYPE_QUAL_CONST));
689 DECL_POINTS_TO_READONLY_P (decl) = TREE_READONLY (decl);
690 DECL_BY_REF_P (decl) = 1;
691 SET_DECL_RTL (decl, XEXP (DECL_RTL (decl), 0));
692 TREE_TYPE (decl) = new_type;
693 DECL_MODE (decl) = TYPE_MODE (new_type);
694 DECL_ALIGN (decl) = TYPE_ALIGN (new_type);
695 DECL_SIZE (decl) = TYPE_SIZE (new_type);
697 if (TREE_CODE (decl) == PARM_DECL)
698 DECL_INCOMING_RTL (decl) = XEXP (DECL_INCOMING_RTL (decl), 0);
700 /* If DECL_INITIAL was set, it should be updated to show that
701 the decl is initialized to the address of that thing.
702 Otherwise, just set it to the address of this decl.
703 It needs to be set so that GCC does not think the decl is
706 = build1 (ADDR_EXPR, new_type,
707 DECL_INITIAL (decl) != 0 ? DECL_INITIAL (decl) : decl);
711 /* Record the current code position in GNAT_NODE. */
714 record_code_position (gnat_node)
717 if (global_bindings_p ())
719 /* Make a dummy entry so multiple things at the same location don't
720 end up in the same place. */
721 add_pending_elaborations (NULL_TREE, NULL_TREE);
722 save_gnu_tree (gnat_node, get_elaboration_location (), 1);
725 /* Always emit another insn in case marking the last insn
726 addressable needs some fixups and also for above reason. */
727 save_gnu_tree (gnat_node,
728 build (RTL_EXPR, void_type_node, NULL_TREE,
729 (tree) emit_note (0, NOTE_INSN_DELETED)),
733 /* Insert the code for GNAT_NODE at the position saved for that node. */
736 insert_code_for (gnat_node)
739 if (global_bindings_p ())
741 push_pending_elaborations ();
742 gnat_to_code (gnat_node);
743 Check_Elaboration_Code_Allowed (gnat_node);
744 insert_elaboration_list (get_gnu_tree (gnat_node));
745 pop_pending_elaborations ();
751 do_pending_stack_adjust ();
753 mark_all_temps_used ();
754 gnat_to_code (gnat_node);
755 do_pending_stack_adjust ();
756 insns = get_insns ();
758 emit_insn_after (insns, RTL_EXPR_RTL (get_gnu_tree (gnat_node)));
762 /* Get the alias set corresponding to a type or expression. */
765 gnat_get_alias_set (type)
768 /* If this is a padding type, use the type of the first field. */
769 if (TREE_CODE (type) == RECORD_TYPE
770 && TYPE_IS_PADDING_P (type))
771 return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
773 /* If the type is an unconstrained array, use the type of the
774 self-referential array we make. */
775 else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
777 get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
783 /* GNU_TYPE is a type. Determine if it should be passed by reference by
787 default_pass_by_ref (gnu_type)
792 INIT_CUMULATIVE_ARGS (cum, NULL_TREE, NULL_RTX, 0);
794 /* We pass aggregates by reference if they are sufficiently large. The
795 choice of constant here is somewhat arbitrary. We also pass by
796 reference if the target machine would either pass or return by
797 reference. Strictly speaking, we need only check the return if this
798 is an In Out parameter, but it's probably best to err on the side of
799 passing more things by reference. */
801 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
802 || FUNCTION_ARG_PASS_BY_REFERENCE (cum, TYPE_MODE (gnu_type),
805 || RETURN_IN_MEMORY (gnu_type)
806 || (AGGREGATE_TYPE_P (gnu_type)
807 && (! host_integerp (TYPE_SIZE (gnu_type), 1)
808 || 0 < compare_tree_int (TYPE_SIZE (gnu_type),
809 8 * TYPE_ALIGN (gnu_type)))));
812 /* GNU_TYPE is the type of a subprogram parameter. Determine from the type if
813 it should be passed by reference. */
816 must_pass_by_ref (gnu_type)
819 /* We pass only unconstrained objects, those required by the language
820 to be passed by reference, and objects of variable size. The latter
821 is more efficient, avoids problems with variable size temporaries,
822 and does not produce compatibility problems with C, since C does
823 not have such objects. */
824 return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
825 || (AGGREGATE_TYPE_P (gnu_type) && TYPE_BY_REFERENCE_P (gnu_type))
826 || (TYPE_SIZE (gnu_type) != 0
827 && TREE_CODE (TYPE_SIZE (gnu_type)) != INTEGER_CST));
830 /* This function returns the version of GCC being used. Here it's GCC 3. */