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 * It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). *
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
43 #include "diagnostic.h"
49 #include "insn-codes.h"
50 #include "insn-flags.h"
51 #include "insn-config.h"
57 #include "langhooks.h"
58 #include "langhooks-def.h"
73 #include "adadecode.h"
75 extern FILE *asm_out_file;
77 extern char **save_argv;
79 static const char *gnat_init PARAMS ((const char *));
80 static void gnat_init_options PARAMS ((void));
81 static int gnat_decode_option PARAMS ((int, char **));
82 static HOST_WIDE_INT gnat_get_alias_set PARAMS ((tree));
83 static void gnat_print_decl PARAMS ((FILE *, tree, int));
84 static void gnat_print_type PARAMS ((FILE *, tree, int));
85 static const char *gnat_printable_name PARAMS ((tree, int));
86 static tree gnat_eh_runtime_type PARAMS ((tree));
87 static int gnat_eh_type_covers PARAMS ((tree, tree));
88 static void gnat_parse_file PARAMS ((void));
90 /* Structure giving our language-specific hooks. */
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_DECODE_OPTION
101 #define LANG_HOOKS_DECODE_OPTION gnat_decode_option
102 #undef LANG_HOOKS_PARSE_FILE
103 #define LANG_HOOKS_PARSE_FILE gnat_parse_file
104 #undef LANG_HOOKS_HONOR_READONLY
105 #define LANG_HOOKS_HONOR_READONLY 1
106 #undef LANG_HOOKS_GET_ALIAS_SET
107 #define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
108 #undef LANG_HOOKS_PRINT_DECL
109 #define LANG_HOOKS_PRINT_DECL gnat_print_decl
110 #undef LANG_HOOKS_PRINT_TYPE
111 #define LANG_HOOKS_PRINT_TYPE gnat_print_type
112 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
113 #define LANG_HOOKS_DECL_PRINTABLE_NAME gnat_printable_name
115 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
117 /* Tables describing GCC tree codes used only by GNAT.
119 Table indexed by tree code giving a string containing a character
120 classifying the tree code. Possibilities are
121 t, d, s, c, r, <, 1 and 2. See cp-tree.def for details. */
123 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
125 const char tree_code_type[] = {
128 #include "ada-tree.def"
132 /* Table indexed by tree code giving number of expression
133 operands beyond the fixed part of the node structure.
134 Not used for types or decls. */
136 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
138 const unsigned char tree_code_length[] = {
141 #include "ada-tree.def"
145 /* Names of tree components.
146 Used for printing out the tree and error messages. */
147 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
149 const char *const tree_code_name[] = {
152 #include "ada-tree.def"
156 /* gnat standard argc argv */
158 extern int gnat_argc;
159 extern char **gnat_argv;
161 /* Global Variables Expected by gcc: */
165 static void internal_error_function PARAMS ((const char *, va_list *));
166 static rtx gnat_expand_expr PARAMS ((tree, rtx, enum machine_mode,
167 enum expand_modifier));
168 static void gnat_adjust_rli PARAMS ((record_layout_info));
170 /* Declare functions we use as part of startup. */
171 extern void __gnat_initialize PARAMS((void));
172 extern void adainit PARAMS((void));
173 extern void _ada_gnat1drv PARAMS((void));
175 /* The parser for the language. For us, we process the GNAT tree. */
180 /* call the target specific initializations */
183 /* Call the front-end elaboration procedures */
186 immediate_size_expand = 1;
188 /* Call the front end */
192 /* Decode all the language specific options that cannot be decoded by GCC.
193 The option decoding phase of GCC calls this routine on the flags that
194 it cannot decode. This routine returns 1 if it is successful, otherwise
198 gnat_decode_option (argc, argv)
199 int argc ATTRIBUTE_UNUSED;
205 if (!strncmp (p, "-I", 2))
207 /* Pass the -I switches as-is. */
208 gnat_argv[gnat_argc] = p;
213 else if (!strncmp (p, "-gant", 5))
215 char *q = (char *) xmalloc (strlen (p) + 1);
217 warning ("`-gnat' misspelled as `-gant'");
219 q[2] = 'n', q[3] = 'a';
224 else if (!strncmp (p, "-gnat", 5))
226 /* Recopy the switches without the 'gnat' prefix */
228 gnat_argv[gnat_argc] = (char *) xmalloc (strlen (p) - 3);
229 gnat_argv[gnat_argc][0] = '-';
230 strcpy (gnat_argv[gnat_argc] + 1, p + 5);
233 for (i = 1; i < save_argc - 1; i++)
234 if (!strncmp (save_argv[i], "-gnatO", 6))
235 if (save_argv[++i][0] != '-')
237 /* Preserve output filename as GCC doesn't save it for GNAT. */
238 gnat_argv[gnat_argc] = save_argv[i];
246 /* Handle the --RTS switch. The real option we get is -fRTS. This
247 modification is done by the driver program. */
248 if (!strncmp (p, "-fRTS", 5))
250 gnat_argv[gnat_argc] = p;
255 /* Ignore -W flags since people may want to use the same flags for all
257 else if (p[0] == '-' && p[1] == 'W' && p[2] != 0)
263 /* Initialize for option processing. */
268 /* Initialize gnat_argv with save_argv size */
269 gnat_argv = (char **) xmalloc ((save_argc + 1) * sizeof (gnat_argv[0]));
270 gnat_argv[0] = save_argv[0]; /* name of the command */
278 switch (TREE_CODE (t))
281 ggc_mark_tree (TYPE_CI_CO_LIST (t));
285 if (TYPE_MODULAR_P (t))
286 ggc_mark_tree (TYPE_MODULUS (t));
287 else if (TYPE_VAX_FLOATING_POINT_P (t))
289 else if (TYPE_HAS_ACTUAL_BOUNDS_P (t))
290 ggc_mark_tree (TYPE_ACTUAL_BOUNDS (t));
292 ggc_mark_tree (TYPE_INDEX_TYPE (t));
296 ggc_mark_tree (TYPE_RM_SIZE_ENUM (t));
300 ggc_mark_tree (TYPE_ACTUAL_BOUNDS (t));
303 case RECORD_TYPE: case UNION_TYPE: case QUAL_UNION_TYPE:
304 /* This is really TYPE_UNCONSTRAINED_ARRAY for fat pointers. */
305 ggc_mark_tree (TYPE_ADA_SIZE (t));
309 ggc_mark_tree (DECL_CONST_CORRESPONDING_VAR (t));
313 ggc_mark_tree (DECL_ORIGINAL_FIELD (t));
321 /* Here is the function to handle the compiler error processing in GCC. */
324 internal_error_function (msgid, ap)
328 char buffer[1000]; /* Assume this is big enough. */
330 String_Template temp;
333 vsprintf (buffer, msgid, *ap);
335 /* Go up to the first newline. */
336 for (p = buffer; *p != 0; p++)
343 temp.Low_Bound = 1, temp.High_Bound = strlen (buffer);
344 fp.Array = buffer, fp.Bounds = &temp;
346 Current_Error_Node = error_gnat_node;
347 Compiler_Abort (fp, -1);
350 /* Perform all the initialization steps that are language-specific. */
354 const char *filename;
356 /* Performs whatever initialization steps needed by the language-dependent
359 Define the additional tree codes here. This isn't the best place to put
360 it, but it's where g++ does it. */
362 lang_expand_expr = gnat_expand_expr;
364 gnat_init_decl_processing ();
366 /* Add the input filename as the last argument. */
367 gnat_argv[gnat_argc] = (char *) filename;
369 gnat_argv[gnat_argc] = 0;
371 set_internal_error_function (internal_error_function);
373 /* Show that REFERENCE_TYPEs are internal and should be Pmode. */
374 internal_reference_types ();
376 /* Show we don't use the common language attributes. */
377 lang_attribute_common = 0;
379 set_lang_adjust_rli (gnat_adjust_rli);
383 /* If we are using the GCC mechanism for to process exception handling, we
384 have to register the personality routine for Ada and to initialize
385 various language dependent hooks. */
390 /* We shouldn't do anything if the No_Exceptions_Handler pragma is set,
391 though. This could for instance lead to the emission of tables with
392 references to symbols (such as the Ada eh personality routine) within
393 libraries we won't link against. */
394 if (No_Exception_Handlers_Set ())
397 eh_personality_libfunc = init_one_libfunc ("__gnat_eh_personality");
398 lang_eh_type_covers = gnat_eh_type_covers;
399 lang_eh_runtime_type = gnat_eh_runtime_type;
403 #ifdef DWARF2_UNWIND_INFO
404 if (dwarf2out_do_frame ())
405 dwarf2out_frame_init ();
409 /* Hooks for print-tree.c: */
412 gnat_print_decl (file, node, indent)
417 switch (TREE_CODE (node))
420 print_node (file, "const_corresponding_var",
421 DECL_CONST_CORRESPONDING_VAR (node), indent + 4);
425 print_node (file, "original field", DECL_ORIGINAL_FIELD (node),
435 gnat_print_type (file, node, indent)
440 switch (TREE_CODE (node))
443 print_node (file, "ci_co_list", TYPE_CI_CO_LIST (node), indent + 4);
447 print_node (file, "RM size", TYPE_RM_SIZE_ENUM (node), indent + 4);
451 if (TYPE_MODULAR_P (node))
452 print_node (file, "modulus", TYPE_MODULUS (node), indent + 4);
453 else if (TYPE_HAS_ACTUAL_BOUNDS_P (node))
454 print_node (file, "actual bounds", TYPE_ACTUAL_BOUNDS (node),
456 else if (TYPE_VAX_FLOATING_POINT_P (node))
459 print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4);
461 print_node (file, "RM size", TYPE_RM_SIZE_INT (node), indent + 4);
465 print_node (file,"actual bounds", TYPE_ACTUAL_BOUNDS (node), indent + 4);
469 if (TYPE_IS_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
470 print_node (file, "unconstrained array",
471 TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
473 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
477 case QUAL_UNION_TYPE:
478 print_node (file, "Ada size", TYPE_ADA_SIZE (node), indent + 4);
487 gnat_printable_name (decl, verbosity)
489 int verbosity ATTRIBUTE_UNUSED;
491 const char *coded_name = IDENTIFIER_POINTER (DECL_NAME (decl));
492 char *ada_name = (char *) ggc_alloc (strlen (coded_name) * 2 + 60);
494 __gnat_decode (coded_name, ada_name, 0);
496 return (const char *) ada_name;
499 /* Expands GNAT-specific GCC tree nodes. The only ones we support
500 here are TRANSFORM_EXPR, ALLOCATE_EXPR, USE_EXPR and NULL_EXPR. */
503 gnat_expand_expr (exp, target, tmode, modifier)
506 enum machine_mode tmode;
507 enum expand_modifier modifier;
509 tree type = TREE_TYPE (exp);
513 /* Update EXP to be the new expression to expand. */
515 switch (TREE_CODE (exp))
518 gnat_to_code (TREE_COMPLEXITY (exp));
523 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
525 /* We aren't going to be doing anything with this memory, but allocate
526 it anyway. If it's variable size, make a bogus address. */
527 if (! host_integerp (TYPE_SIZE_UNIT (type), 1))
528 result = gen_rtx_MEM (BLKmode, virtual_stack_vars_rtx);
530 result = assign_temp (type, 0, TREE_ADDRESSABLE (exp), 1);
536 allocate_dynamic_stack_space
537 (expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, TYPE_MODE (sizetype),
539 NULL_RTX, tree_low_cst (TREE_OPERAND (exp, 1), 1));
542 if (target != const0_rtx)
545 /* First write a volatile ASM_INPUT to prevent anything from being
547 result = gen_rtx_ASM_INPUT (VOIDmode, "");
548 MEM_VOLATILE_P (result) = 1;
551 result = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode,
553 emit_insn (gen_rtx_USE (VOIDmode, result));
557 return expand_expr (build1 (NOP_EXPR, type, TREE_OPERAND (exp, 0)),
558 target, tmode, modifier);
560 case UNCONSTRAINED_ARRAY_REF:
561 /* If we are evaluating just for side-effects, just evaluate our
562 operand. Otherwise, abort since this code should never appear
563 in a tree to be evaluated (objects aren't unconstrained). */
564 if (target == const0_rtx || TREE_CODE (type) == VOID_TYPE)
565 return expand_expr (TREE_OPERAND (exp, 0), const0_rtx,
568 /* ... fall through ... */
574 return expand_expr (new, target, tmode, modifier);
577 /* Adjusts the RLI used to layout a record after all the fields have been
578 added. We only handle the packed case and cause it to use the alignment
579 that will pad the record at the end. */
582 gnat_adjust_rli (rli)
583 record_layout_info rli;
585 unsigned int record_align = rli->unpadded_align;
588 /* If any fields have variable size, we need to force the record to be at
589 least as aligned as the alignment of that type. */
590 for (field = TYPE_FIELDS (rli->t); field; field = TREE_CHAIN (field))
591 if (TREE_CODE (DECL_SIZE_UNIT (field)) != INTEGER_CST)
592 record_align = MAX (record_align, DECL_ALIGN (field));
594 if (TYPE_PACKED (rli->t))
595 rli->record_align = record_align;
598 /* Make a TRANSFORM_EXPR to later expand GNAT_NODE into code. */
601 make_transform_expr (gnat_node)
604 tree gnu_result = build (TRANSFORM_EXPR, void_type_node);
606 TREE_SIDE_EFFECTS (gnu_result) = 1;
607 TREE_COMPLEXITY (gnu_result) = gnat_node;
611 /* Update the setjmp buffer BUF with the current stack pointer. We assume
612 here that a __builtin_setjmp was done to BUF. */
615 update_setjmp_buf (buf)
618 enum machine_mode sa_mode = Pmode;
621 #ifdef HAVE_save_stack_nonlocal
622 if (HAVE_save_stack_nonlocal)
623 sa_mode = insn_data[(int) CODE_FOR_save_stack_nonlocal].operand[0].mode;
625 #ifdef STACK_SAVEAREA_MODE
626 sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
630 = gen_rtx_MEM (sa_mode,
633 plus_constant (expand_expr
634 (build_unary_op (ADDR_EXPR, NULL_TREE, buf),
635 NULL_RTX, VOIDmode, 0),
636 2 * GET_MODE_SIZE (Pmode))));
640 emit_insn (gen_setjmp ());
643 emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
646 /* These routines are used in conjunction with GCC exception handling. */
648 /* Map compile-time to run-time tree for GCC exception handling scheme. */
651 gnat_eh_runtime_type (type)
657 /* Return true if type A catches type B. Callback for flow analysis from
658 the exception handling part of the back-end. */
661 gnat_eh_type_covers (a, b)
664 /* a catches b if they represent the same exception id or if a
667 ??? integer_zero_node for "others" is hardwired in too many places
669 return (a == b || a == integer_zero_node);
672 /* See if DECL has an RTL that is indirect via a pseudo-register or a
673 memory location and replace it with an indirect reference if so.
674 This improves the debugger's ability to display the value. */
677 adjust_decl_rtl (decl)
682 /* If this decl is already indirect, don't do anything. This should
683 mean that the decl cannot be indirect, but there's no point in
684 adding an abort to check that. */
685 if (TREE_CODE (decl) != CONST_DECL
686 && ! DECL_BY_REF_P (decl)
687 && (GET_CODE (DECL_RTL (decl)) == MEM
688 && (GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
689 || (GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG
690 && (REGNO (XEXP (DECL_RTL (decl), 0))
691 > LAST_VIRTUAL_REGISTER))))
692 /* We can't do this if the reference type's mode is not the same
693 as the current mode, which means this may not work on mixed 32/64
695 && (new_type = build_reference_type (TREE_TYPE (decl))) != 0
696 && TYPE_MODE (new_type) == GET_MODE (XEXP (DECL_RTL (decl), 0))
697 /* If this is a PARM_DECL, we can only do it if DECL_INCOMING_RTL
698 is also an indirect and of the same mode and if the object is
699 readonly, the latter condition because we don't want to upset the
700 handling of CICO_LIST. */
701 && (TREE_CODE (decl) != PARM_DECL
702 || (GET_CODE (DECL_INCOMING_RTL (decl)) == MEM
703 && (TYPE_MODE (new_type)
704 == GET_MODE (XEXP (DECL_INCOMING_RTL (decl), 0)))
705 && TREE_READONLY (decl))))
708 = build_qualified_type (new_type,
709 (TYPE_QUALS (new_type) | TYPE_QUAL_CONST));
711 DECL_POINTS_TO_READONLY_P (decl) = TREE_READONLY (decl);
712 DECL_BY_REF_P (decl) = 1;
713 SET_DECL_RTL (decl, XEXP (DECL_RTL (decl), 0));
714 TREE_TYPE (decl) = new_type;
715 DECL_MODE (decl) = TYPE_MODE (new_type);
716 DECL_ALIGN (decl) = TYPE_ALIGN (new_type);
717 DECL_SIZE (decl) = TYPE_SIZE (new_type);
719 if (TREE_CODE (decl) == PARM_DECL)
720 DECL_INCOMING_RTL (decl) = XEXP (DECL_INCOMING_RTL (decl), 0);
722 /* If DECL_INITIAL was set, it should be updated to show that
723 the decl is initialized to the address of that thing.
724 Otherwise, just set it to the address of this decl.
725 It needs to be set so that GCC does not think the decl is
728 = build1 (ADDR_EXPR, new_type,
729 DECL_INITIAL (decl) != 0 ? DECL_INITIAL (decl) : decl);
733 /* Record the current code position in GNAT_NODE. */
736 record_code_position (gnat_node)
739 if (global_bindings_p ())
741 /* Make a dummy entry so multiple things at the same location don't
742 end up in the same place. */
743 add_pending_elaborations (NULL_TREE, NULL_TREE);
744 save_gnu_tree (gnat_node, get_elaboration_location (), 1);
747 /* Always emit another insn in case marking the last insn
748 addressable needs some fixups and also for above reason. */
749 save_gnu_tree (gnat_node,
750 build (RTL_EXPR, void_type_node, NULL_TREE,
751 (tree) emit_note (0, NOTE_INSN_DELETED)),
755 /* Insert the code for GNAT_NODE at the position saved for that node. */
758 insert_code_for (gnat_node)
761 if (global_bindings_p ())
763 push_pending_elaborations ();
764 gnat_to_code (gnat_node);
765 Check_Elaboration_Code_Allowed (gnat_node);
766 insert_elaboration_list (get_gnu_tree (gnat_node));
767 pop_pending_elaborations ();
773 do_pending_stack_adjust ();
775 mark_all_temps_used ();
776 gnat_to_code (gnat_node);
777 do_pending_stack_adjust ();
778 insns = get_insns ();
780 emit_insns_after (insns, RTL_EXPR_RTL (get_gnu_tree (gnat_node)));
784 /* Get the alias set corresponding to a type or expression. */
787 gnat_get_alias_set (type)
790 /* If this is a padding type, use the type of the first field. */
791 if (TREE_CODE (type) == RECORD_TYPE
792 && TYPE_IS_PADDING_P (type))
793 return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)));
795 /* If the type is an unconstrained array, use the type of the
796 self-referential array we make. */
797 else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
799 get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type)))));
805 /* Set default attributes for functions. We do nothing. */
808 insert_default_attributes (decl)
809 tree decl ATTRIBUTE_UNUSED;
813 /* GNU_TYPE is a type. Determine if it should be passed by reference by
817 default_pass_by_ref (gnu_type)
822 INIT_CUMULATIVE_ARGS (cum, NULL_TREE, NULL_RTX, 0);
824 /* We pass aggregates by reference if they are sufficiently large. The
825 choice of constant here is somewhat arbitrary. We also pass by
826 reference if the target machine would either pass or return by
827 reference. Strictly speaking, we need only check the return if this
828 is an In Out parameter, but it's probably best to err on the side of
829 passing more things by reference. */
831 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
832 || FUNCTION_ARG_PASS_BY_REFERENCE (cum, TYPE_MODE (gnu_type),
835 || RETURN_IN_MEMORY (gnu_type)
836 || (AGGREGATE_TYPE_P (gnu_type)
837 && (! host_integerp (TYPE_SIZE (gnu_type), 1)
838 || 0 < compare_tree_int (TYPE_SIZE (gnu_type),
839 8 * TYPE_ALIGN (gnu_type)))));
842 /* GNU_TYPE is the type of a subprogram parameter. Determine from the type if
843 it should be passed by reference. */
846 must_pass_by_ref (gnu_type)
849 /* We pass only unconstrained objects, those required by the language
850 to be passed by reference, and objects of variable size. The latter
851 is more efficient, avoids problems with variable size temporaries,
852 and does not produce compatibility problems with C, since C does
853 not have such objects. */
854 return (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
855 || (AGGREGATE_TYPE_P (gnu_type) && TYPE_BY_REFERENCE_P (gnu_type))
856 || (TYPE_SIZE (gnu_type) != 0
857 && TREE_CODE (TYPE_SIZE (gnu_type)) != INTEGER_CST));
860 /* This function returns the version of GCC being used. Here it's GCC 3. */