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 * GNAT was originally developed by the GNAT team at New York University. *
24 * Extensive contributions were provided by Ada Core Technologies Inc. *
26 ****************************************************************************/
30 #include "coretypes.h"
60 struct Node
*Nodes_Ptr
;
61 Node_Id
*Next_Node_Ptr
;
62 Node_Id
*Prev_Node_Ptr
;
63 struct Elist_Header
*Elists_Ptr
;
64 struct Elmt_Item
*Elmts_Ptr
;
65 struct String_Entry
*Strings_Ptr
;
66 Char_Code
*String_Chars_Ptr
;
67 struct List_Header
*List_Headers_Ptr
;
69 /* Current filename without path. */
70 const char *ref_filename
;
72 /* Flag indicating whether file names are discarded in exception messages */
73 int discard_file_names
;
75 /* If true, then gigi is being called on an analyzed but unexpanded
76 tree, and the only purpose of the call is to properly annotate
77 types with representation information. */
78 int type_annotate_only
;
80 /* List of TREE_LIST nodes representing a block stack. TREE_VALUE
81 of each gives the variable used for the setjmp buffer in the current
82 block, if any. TREE_PURPOSE gives the bottom condition for a loop,
83 if this block is for a loop. The latter is only used to save the tree
87 /* List of TREE_LIST nodes representing a stack of exception pointer
88 variables. TREE_VALUE is the VAR_DECL that stores the address of
89 the raised exception. Nonzero means we are in an exception
90 handler. Not used in the zero-cost case. */
91 static GTY(()) tree gnu_except_ptr_stack
;
93 /* List of TREE_LIST nodes containing pending elaborations lists.
94 used to prevent the elaborations being reclaimed by GC. */
95 static GTY(()) tree gnu_pending_elaboration_lists
;
97 /* Map GNAT tree codes to GCC tree codes for simple expressions. */
98 static enum tree_code gnu_codes
[Number_Node_Kinds
];
100 /* Current node being treated, in case gigi_abort called. */
101 Node_Id error_gnat_node
;
103 /* Variable that stores a list of labels to be used as a goto target instead of
104 a return in some functions. See processing for N_Subprogram_Body. */
105 static GTY(()) tree gnu_return_label_stack
;
107 static tree tree_transform
PARAMS((Node_Id
));
108 static void elaborate_all_entities
PARAMS((Node_Id
));
109 static void process_freeze_entity
PARAMS((Node_Id
));
110 static void process_inlined_subprograms
PARAMS((Node_Id
));
111 static void process_decls
PARAMS((List_Id
, List_Id
, Node_Id
,
113 static tree emit_access_check
PARAMS((tree
));
114 static tree emit_discriminant_check
PARAMS((tree
, Node_Id
));
115 static tree emit_range_check
PARAMS((tree
, Node_Id
));
116 static tree emit_index_check
PARAMS((tree
, tree
, tree
, tree
));
117 static tree emit_check
PARAMS((tree
, tree
, int));
118 static tree convert_with_check
PARAMS((Entity_Id
, tree
,
120 static int addressable_p
PARAMS((tree
));
121 static tree assoc_to_constructor
PARAMS((Node_Id
, tree
));
122 static tree extract_values
PARAMS((tree
, tree
));
123 static tree pos_to_constructor
PARAMS((Node_Id
, tree
, Entity_Id
));
124 static tree maybe_implicit_deref
PARAMS((tree
));
125 static tree gnat_stabilize_reference_1
PARAMS((tree
, int));
126 static int build_unit_elab
PARAMS((Entity_Id
, int, tree
));
128 /* Constants for +0.5 and -0.5 for float-to-integer rounding. */
129 static REAL_VALUE_TYPE dconstp5
;
130 static REAL_VALUE_TYPE dconstmp5
;
132 /* This is the main program of the back-end. It sets up all the table
133 structures and then generates code. */
136 gigi (gnat_root
, max_gnat_node
, number_name
, nodes_ptr
, next_node_ptr
,
137 prev_node_ptr
, elists_ptr
, elmts_ptr
, strings_ptr
, string_chars_ptr
,
138 list_headers_ptr
, number_units
, file_info_ptr
, standard_integer
,
139 standard_long_long_float
, standard_exception_type
, gigi_operating_mode
)
143 struct Node
*nodes_ptr
;
144 Node_Id
*next_node_ptr
;
145 Node_Id
*prev_node_ptr
;
146 struct Elist_Header
*elists_ptr
;
147 struct Elmt_Item
*elmts_ptr
;
148 struct String_Entry
*strings_ptr
;
149 Char_Code
*string_chars_ptr
;
150 struct List_Header
*list_headers_ptr
;
151 Int number_units ATTRIBUTE_UNUSED
;
152 char *file_info_ptr ATTRIBUTE_UNUSED
;
153 Entity_Id standard_integer
;
154 Entity_Id standard_long_long_float
;
155 Entity_Id standard_exception_type
;
156 Int gigi_operating_mode
;
158 tree gnu_standard_long_long_float
;
159 tree gnu_standard_exception_type
;
161 max_gnat_nodes
= max_gnat_node
;
162 number_names
= number_name
;
163 Nodes_Ptr
= nodes_ptr
;
164 Next_Node_Ptr
= next_node_ptr
;
165 Prev_Node_Ptr
= prev_node_ptr
;
166 Elists_Ptr
= elists_ptr
;
167 Elmts_Ptr
= elmts_ptr
;
168 Strings_Ptr
= strings_ptr
;
169 String_Chars_Ptr
= string_chars_ptr
;
170 List_Headers_Ptr
= list_headers_ptr
;
172 type_annotate_only
= (gigi_operating_mode
== 1);
174 /* See if we should discard file names in exception messages. */
175 discard_file_names
= (Global_Discard_Names
|| Debug_Flag_NN
);
177 if (Nkind (gnat_root
) != N_Compilation_Unit
)
180 set_lineno (gnat_root
, 0);
182 /* Initialize ourselves. */
187 /* Enable GNAT stack checking method if needed */
188 if (!Stack_Check_Probes_On_Target
)
189 set_stack_check_libfunc (gen_rtx (SYMBOL_REF
, Pmode
, "_gnat_stack_check"));
191 /* Save the type we made for integer as the type for Standard.Integer.
192 Then make the rest of the standard types. Note that some of these
194 save_gnu_tree (Base_Type (standard_integer
),
195 TYPE_NAME (integer_type_node
), 0);
197 gnu_except_ptr_stack
= tree_cons (NULL_TREE
, NULL_TREE
, NULL_TREE
);
199 dconstp5
= REAL_VALUE_ATOF ("0.5", DFmode
);
200 dconstmp5
= REAL_VALUE_ATOF ("-0.5", DFmode
);
202 gnu_standard_long_long_float
203 = gnat_to_gnu_entity (Base_Type (standard_long_long_float
), NULL_TREE
, 0);
204 gnu_standard_exception_type
205 = gnat_to_gnu_entity (Base_Type (standard_exception_type
), NULL_TREE
, 0);
207 init_gigi_decls (gnu_standard_long_long_float
, gnu_standard_exception_type
);
209 /* Process any Pragma Ident for the main unit. */
210 #ifdef ASM_OUTPUT_IDENT
211 if (Present (Ident_String (Main_Unit
)))
214 TREE_STRING_POINTER (gnat_to_gnu (Ident_String (Main_Unit
))));
217 /* If we are using the GCC exception mechanism, let GCC know. */
218 if (Exception_Mechanism
== GCC_ZCX
)
221 gnat_to_code (gnat_root
);
225 /* This function is the driver of the GNAT to GCC tree transformation process.
226 GNAT_NODE is the root of some gnat tree. It generates code for that
230 gnat_to_code (gnat_node
)
235 /* Save node number in case error */
236 error_gnat_node
= gnat_node
;
238 gnu_root
= tree_transform (gnat_node
);
240 /* This should just generate code, not return a value. If it returns
241 a value, something is wrong. */
242 if (gnu_root
!= error_mark_node
)
246 /* GNAT_NODE is the root of some GNAT tree. Return the root of the GCC
247 tree corresponding to that GNAT tree. Normally, no code is generated.
248 We just return an equivalent tree which is used elsewhere to generate
252 gnat_to_gnu (gnat_node
)
257 /* Save node number in case error */
258 error_gnat_node
= gnat_node
;
260 gnu_root
= tree_transform (gnat_node
);
262 /* If we got no code as a result, something is wrong. */
263 if (gnu_root
== error_mark_node
&& ! type_annotate_only
)
269 /* This function is the driver of the GNAT to GCC tree transformation process.
270 It is the entry point of the tree transformer. GNAT_NODE is the root of
271 some GNAT tree. Return the root of the corresponding GCC tree or
272 error_mark_node to signal that there is no GCC tree to return.
274 The latter is the case if only code generation actions have to be performed
275 like in the case of if statements, loops, etc. This routine is wrapped
276 in the above two routines for most purposes. */
279 tree_transform (gnat_node
)
282 tree gnu_result
= error_mark_node
; /* Default to no value. */
283 tree gnu_result_type
= void_type_node
;
285 tree gnu_lhs
, gnu_rhs
;
287 Entity_Id gnat_temp_type
;
289 /* Set input_file_name and lineno from the Sloc in the GNAT tree. */
290 set_lineno (gnat_node
, 0);
292 /* If this is a Statement and we are at top level, we add the statement
293 as an elaboration for a null tree. That will cause it to be placed
294 in the elaboration procedure. */
295 if (global_bindings_p ()
296 && ((IN (Nkind (gnat_node
), N_Statement_Other_Than_Procedure_Call
)
297 && Nkind (gnat_node
) != N_Null_Statement
)
298 || Nkind (gnat_node
) == N_Procedure_Call_Statement
299 || Nkind (gnat_node
) == N_Label
300 || (Nkind (gnat_node
) == N_Handled_Sequence_Of_Statements
301 && (Present (Exception_Handlers (gnat_node
))
302 || Present (At_End_Proc (gnat_node
))))
303 || ((Nkind (gnat_node
) == N_Raise_Constraint_Error
304 || Nkind (gnat_node
) == N_Raise_Storage_Error
305 || Nkind (gnat_node
) == N_Raise_Program_Error
)
306 && (Ekind (Etype (gnat_node
)) == E_Void
))))
308 add_pending_elaborations (NULL_TREE
, make_transform_expr (gnat_node
));
310 return error_mark_node
;
313 /* If this node is a non-static subexpression and we are only
314 annotating types, make this into a NULL_EXPR for non-VOID types
315 and error_mark_node for void return types. But allow
316 N_Identifier since we use it for lots of things, including
317 getting trees for discriminants. */
319 if (type_annotate_only
320 && IN (Nkind (gnat_node
), N_Subexpr
)
321 && Nkind (gnat_node
) != N_Identifier
322 && ! Compile_Time_Known_Value (gnat_node
))
324 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
326 if (TREE_CODE (gnu_result_type
) == VOID_TYPE
)
327 return error_mark_node
;
329 return build1 (NULL_EXPR
, gnu_result_type
,
330 build_call_raise (CE_Range_Check_Failed
));
333 switch (Nkind (gnat_node
))
335 /********************************/
336 /* Chapter 2: Lexical Elements: */
337 /********************************/
340 case N_Expanded_Name
:
341 case N_Operator_Symbol
:
342 case N_Defining_Identifier
:
344 /* If the Etype of this node does not equal the Etype of the
345 Entity, something is wrong with the entity map, probably in
346 generic instantiation. However, this does not apply to
347 types. Since we sometime have strange Ekind's, just do
348 this test for objects. Also, if the Etype of the Entity
349 is private, the Etype of the N_Identifier is allowed to be the
350 full type and also we consider a packed array type to be the
351 same as the original type. Finally, if the types are Itypes,
352 one may be a copy of the other, which is also legal. */
354 gnat_temp
= (Nkind (gnat_node
) == N_Defining_Identifier
355 ? gnat_node
: Entity (gnat_node
));
356 gnat_temp_type
= Etype (gnat_temp
);
358 if (Etype (gnat_node
) != gnat_temp_type
359 && ! (Is_Packed (gnat_temp_type
)
360 && Etype (gnat_node
) == Packed_Array_Type (gnat_temp_type
))
361 && ! (IN (Ekind (gnat_temp_type
), Private_Kind
)
362 && Present (Full_View (gnat_temp_type
))
363 && ((Etype (gnat_node
) == Full_View (gnat_temp_type
))
364 || (Is_Packed (Full_View (gnat_temp_type
))
365 && Etype (gnat_node
) ==
366 Packed_Array_Type (Full_View (gnat_temp_type
)))))
367 && (!Is_Itype (Etype (gnat_node
)) || !Is_Itype (gnat_temp_type
))
368 && (Ekind (gnat_temp
) == E_Variable
369 || Ekind (gnat_temp
) == E_Component
370 || Ekind (gnat_temp
) == E_Constant
371 || Ekind (gnat_temp
) == E_Loop_Parameter
372 || IN (Ekind (gnat_temp
), Formal_Kind
)))
375 /* If this is a reference to a deferred constant whose partial view
376 is an unconstrained private type, the proper type is on the full
377 view of the constant, not on the full view of the type, which may
380 This may be a reference to a type, for example in the prefix of the
381 attribute Position, generated for dispatching code (see Make_DT in
382 exp_disp,adb). In that case we need the type itself, not is parent,
383 in particular if it is a derived type */
385 if (Is_Private_Type (gnat_temp_type
)
386 && Has_Unknown_Discriminants (gnat_temp_type
)
387 && Present (Full_View (gnat_temp
))
388 && ! Is_Type (gnat_temp
))
390 gnat_temp
= Full_View (gnat_temp
);
391 gnat_temp_type
= Etype (gnat_temp
);
392 gnu_result_type
= get_unpadded_type (gnat_temp_type
);
396 /* Expand the type of this identitier first, in case it is
397 an enumeral literal, which only get made when the type
398 is expanded. There is no order-of-elaboration issue here.
399 We want to use the Actual_Subtype if it has already been
400 elaborated, otherwise the Etype. Avoid using Actual_Subtype
401 for packed arrays to simplify things. */
402 if ((Ekind (gnat_temp
) == E_Constant
403 || Ekind (gnat_temp
) == E_Variable
|| Is_Formal (gnat_temp
))
404 && ! (Is_Array_Type (Etype (gnat_temp
))
405 && Present (Packed_Array_Type (Etype (gnat_temp
))))
406 && Present (Actual_Subtype (gnat_temp
))
407 && present_gnu_tree (Actual_Subtype (gnat_temp
)))
408 gnat_temp_type
= Actual_Subtype (gnat_temp
);
410 gnat_temp_type
= Etype (gnat_node
);
412 gnu_result_type
= get_unpadded_type (gnat_temp_type
);
415 gnu_result
= gnat_to_gnu_entity (gnat_temp
, NULL_TREE
, 0);
417 /* If we are in an exception handler, force this variable into memory
418 to ensure optimization does not remove stores that appear
419 redundant but are actually needed in case an exception occurs.
421 ??? Note that we need not do this if the variable is declared within
422 the handler, only if it is referenced in the handler and declared
423 in an enclosing block, but we have no way of testing that
425 if (TREE_VALUE (gnu_except_ptr_stack
) != 0)
427 gnat_mark_addressable (gnu_result
);
428 flush_addressof (gnu_result
);
431 /* Some objects (such as parameters passed by reference, globals of
432 variable size, and renamed objects) actually represent the address
433 of the object. In that case, we must do the dereference. Likewise,
434 deal with parameters to foreign convention subprograms. Call fold
435 here since GNU_RESULT may be a CONST_DECL. */
436 if (DECL_P (gnu_result
)
437 && (DECL_BY_REF_P (gnu_result
)
438 || DECL_BY_COMPONENT_PTR_P (gnu_result
)))
440 int ro
= DECL_POINTS_TO_READONLY_P (gnu_result
);
442 if (DECL_BY_COMPONENT_PTR_P (gnu_result
))
443 gnu_result
= convert (build_pointer_type (gnu_result_type
),
446 gnu_result
= build_unary_op (INDIRECT_REF
, NULL_TREE
,
448 TREE_READONLY (gnu_result
) = TREE_STATIC (gnu_result
) = ro
;
451 /* The GNAT tree has the type of a function as the type of its result.
452 Also use the type of the result if the Etype is a subtype which
453 is nominally unconstrained. But remove any padding from the
455 if (TREE_CODE (TREE_TYPE (gnu_result
)) == FUNCTION_TYPE
456 || Is_Constr_Subt_For_UN_Aliased (gnat_temp_type
))
458 gnu_result_type
= TREE_TYPE (gnu_result
);
459 if (TREE_CODE (gnu_result_type
) == RECORD_TYPE
460 && TYPE_IS_PADDING_P (gnu_result_type
))
461 gnu_result_type
= TREE_TYPE (TYPE_FIELDS (gnu_result_type
));
464 /* We always want to return the underlying INTEGER_CST for an
465 enumeration literal to avoid the need to call fold in lots
466 of places. But don't do this is the parent will be taking
467 the address of this object. */
468 if (TREE_CODE (gnu_result
) == CONST_DECL
)
470 gnat_temp
= Parent (gnat_node
);
471 if (DECL_CONST_CORRESPONDING_VAR (gnu_result
) == 0
472 || (Nkind (gnat_temp
) != N_Reference
473 && ! (Nkind (gnat_temp
) == N_Attribute_Reference
474 && ((Get_Attribute_Id (Attribute_Name (gnat_temp
))
476 || (Get_Attribute_Id (Attribute_Name (gnat_temp
))
478 || (Get_Attribute_Id (Attribute_Name (gnat_temp
))
479 == Attr_Unchecked_Access
)
480 || (Get_Attribute_Id (Attribute_Name (gnat_temp
))
481 == Attr_Unrestricted_Access
)))))
482 gnu_result
= DECL_INITIAL (gnu_result
);
486 case N_Integer_Literal
:
490 /* Get the type of the result, looking inside any padding and
491 left-justified modular types. Then get the value in that type. */
492 gnu_type
= gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
494 if (TREE_CODE (gnu_type
) == RECORD_TYPE
495 && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_type
))
496 gnu_type
= TREE_TYPE (TYPE_FIELDS (gnu_type
));
498 gnu_result
= UI_To_gnu (Intval (gnat_node
), gnu_type
);
500 /* If the result overflows (meaning it doesn't fit in its base type),
501 abort. We would like to check that the value is within the range
502 of the subtype, but that causes problems with subtypes whose usage
503 will raise Constraint_Error and with biased representation, so
505 if (TREE_CONSTANT_OVERFLOW (gnu_result
))
510 case N_Character_Literal
:
511 /* If a Entity is present, it means that this was one of the
512 literals in a user-defined character type. In that case,
513 just return the value in the CONST_DECL. Otherwise, use the
514 character code. In that case, the base type should be an
515 INTEGER_TYPE, but we won't bother checking for that. */
516 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
517 if (Present (Entity (gnat_node
)))
518 gnu_result
= DECL_INITIAL (get_gnu_tree (Entity (gnat_node
)));
520 gnu_result
= convert (gnu_result_type
,
521 build_int_2 (Char_Literal_Value (gnat_node
), 0));
525 /* If this is of a fixed-point type, the value we want is the
526 value of the corresponding integer. */
527 if (IN (Ekind (Underlying_Type (Etype (gnat_node
))), Fixed_Point_Kind
))
529 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
530 gnu_result
= UI_To_gnu (Corresponding_Integer_Value (gnat_node
),
532 if (TREE_CONSTANT_OVERFLOW (gnu_result
)
534 || (TREE_CODE (TYPE_MIN_VALUE (gnu_result_type
)) == INTEGER_CST
535 && tree_int_cst_lt (gnu_result
,
536 TYPE_MIN_VALUE (gnu_result_type
)))
537 || (TREE_CODE (TYPE_MAX_VALUE (gnu_result_type
)) == INTEGER_CST
538 && tree_int_cst_lt (TYPE_MAX_VALUE (gnu_result_type
),
544 /* We should never see a Vax_Float type literal, since the front end
545 is supposed to transform these using appropriate conversions */
546 else if (Vax_Float (Underlying_Type (Etype (gnat_node
))))
551 Ureal ur_realval
= Realval (gnat_node
);
553 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
555 /* If the real value is zero, so is the result. Otherwise,
556 convert it to a machine number if it isn't already. That
557 forces BASE to 0 or 2 and simplifies the rest of our logic. */
558 if (UR_Is_Zero (ur_realval
))
559 gnu_result
= convert (gnu_result_type
, integer_zero_node
);
562 if (! Is_Machine_Number (gnat_node
))
564 = Machine (Base_Type (Underlying_Type (Etype (gnat_node
))),
565 ur_realval
, Round_Even
);
568 = UI_To_gnu (Numerator (ur_realval
), gnu_result_type
);
570 /* If we have a base of zero, divide by the denominator.
571 Otherwise, the base must be 2 and we scale the value, which
572 we know can fit in the mantissa of the type (hence the use
573 of that type above). */
574 if (Rbase (ur_realval
) == 0)
576 = build_binary_op (RDIV_EXPR
,
577 get_base_type (gnu_result_type
),
579 UI_To_gnu (Denominator (ur_realval
),
581 else if (Rbase (ur_realval
) != 2)
588 real_ldexp (&tmp
, &TREE_REAL_CST (gnu_result
),
589 - UI_To_Int (Denominator (ur_realval
)));
590 gnu_result
= build_real (gnu_result_type
, tmp
);
594 /* Now see if we need to negate the result. Do it this way to
595 properly handle -0. */
596 if (UR_Is_Negative (Realval (gnat_node
)))
598 = build_unary_op (NEGATE_EXPR
, get_base_type (gnu_result_type
),
604 case N_String_Literal
:
605 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
606 if (TYPE_PRECISION (TREE_TYPE (gnu_result_type
)) == HOST_BITS_PER_CHAR
)
608 /* We assume here that all strings are of type standard.string.
609 "Weird" types of string have been converted to an aggregate
611 String_Id gnat_string
= Strval (gnat_node
);
612 int length
= String_Length (gnat_string
);
613 char *string
= (char *) alloca (length
+ 1);
616 /* Build the string with the characters in the literal. Note
617 that Ada strings are 1-origin. */
618 for (i
= 0; i
< length
; i
++)
619 string
[i
] = Get_String_Char (gnat_string
, i
+ 1);
621 /* Put a null at the end of the string in case it's in a context
622 where GCC will want to treat it as a C string. */
625 gnu_result
= build_string (length
, string
);
627 /* Strings in GCC don't normally have types, but we want
628 this to not be converted to the array type. */
629 TREE_TYPE (gnu_result
) = gnu_result_type
;
633 /* Build a list consisting of each character, then make
635 String_Id gnat_string
= Strval (gnat_node
);
636 int length
= String_Length (gnat_string
);
638 tree gnu_list
= NULL_TREE
;
640 for (i
= 0; i
< length
; i
++)
642 = tree_cons (NULL_TREE
,
643 convert (TREE_TYPE (gnu_result_type
),
644 build_int_2 (Get_String_Char (gnat_string
,
650 = build_constructor (gnu_result_type
, nreverse (gnu_list
));
655 if (type_annotate_only
)
658 /* Check for (and ignore) unrecognized pragma */
659 if (! Is_Pragma_Name (Chars (gnat_node
)))
662 switch (Get_Pragma_Id (Chars (gnat_node
)))
664 case Pragma_Inspection_Point
:
665 /* Do nothing at top level: all such variables are already
667 if (global_bindings_p ())
670 set_lineno (gnat_node
, 1);
671 for (gnat_temp
= First (Pragma_Argument_Associations (gnat_node
));
673 gnat_temp
= Next (gnat_temp
))
675 gnu_expr
= gnat_to_gnu (Expression (gnat_temp
));
676 if (TREE_CODE (gnu_expr
) == UNCONSTRAINED_ARRAY_REF
)
677 gnu_expr
= TREE_OPERAND (gnu_expr
, 0);
679 gnu_expr
= build1 (USE_EXPR
, void_type_node
, gnu_expr
);
680 TREE_SIDE_EFFECTS (gnu_expr
) = 1;
681 expand_expr_stmt (gnu_expr
);
685 case Pragma_Optimize
:
686 switch (Chars (Expression
687 (First (Pragma_Argument_Associations (gnat_node
)))))
689 case Name_Time
: case Name_Space
:
691 post_error ("insufficient -O value?", gnat_node
);
696 post_error ("must specify -O0?", gnat_node
);
705 case Pragma_Reviewable
:
706 if (write_symbols
== NO_DEBUG
)
707 post_error ("must specify -g?", gnat_node
);
712 /**************************************/
713 /* Chapter 3: Declarations and Types: */
714 /**************************************/
716 case N_Subtype_Declaration
:
717 case N_Full_Type_Declaration
:
718 case N_Incomplete_Type_Declaration
:
719 case N_Private_Type_Declaration
:
720 case N_Private_Extension_Declaration
:
721 case N_Task_Type_Declaration
:
722 process_type (Defining_Entity (gnat_node
));
725 case N_Object_Declaration
:
726 case N_Exception_Declaration
:
727 gnat_temp
= Defining_Entity (gnat_node
);
729 /* If we are just annotating types and this object has an unconstrained
730 or task type, don't elaborate it. */
731 if (type_annotate_only
732 && (((Is_Array_Type (Etype (gnat_temp
))
733 || Is_Record_Type (Etype (gnat_temp
)))
734 && ! Is_Constrained (Etype (gnat_temp
)))
735 || Is_Concurrent_Type (Etype (gnat_temp
))))
738 if (Present (Expression (gnat_node
))
739 && ! (Nkind (gnat_node
) == N_Object_Declaration
740 && No_Initialization (gnat_node
))
741 && (! type_annotate_only
742 || Compile_Time_Known_Value (Expression (gnat_node
))))
744 gnu_expr
= gnat_to_gnu (Expression (gnat_node
));
745 if (Do_Range_Check (Expression (gnat_node
)))
746 gnu_expr
= emit_range_check (gnu_expr
, Etype (gnat_temp
));
748 /* If this object has its elaboration delayed, we must force
749 evaluation of GNU_EXPR right now and save it for when the object
751 if (Present (Freeze_Node (gnat_temp
)))
753 if ((Is_Public (gnat_temp
) || global_bindings_p ())
754 && ! TREE_CONSTANT (gnu_expr
))
756 = create_var_decl (create_concat_name (gnat_temp
, "init"),
757 NULL_TREE
, TREE_TYPE (gnu_expr
), gnu_expr
,
758 0, Is_Public (gnat_temp
), 0, 0, 0);
760 gnu_expr
= maybe_variable (gnu_expr
, Expression (gnat_node
));
762 save_gnu_tree (gnat_node
, gnu_expr
, 1);
768 if (type_annotate_only
&& gnu_expr
!= 0
769 && TREE_CODE (gnu_expr
) == ERROR_MARK
)
772 if (No (Freeze_Node (gnat_temp
)))
773 gnat_to_gnu_entity (gnat_temp
, gnu_expr
, 1);
776 case N_Object_Renaming_Declaration
:
778 gnat_temp
= Defining_Entity (gnat_node
);
780 /* Don't do anything if this renaming is handled by the front end.
781 or if we are just annotating types and this object has a
782 composite or task type, don't elaborate it. */
783 if (! Is_Renaming_Of_Object (gnat_temp
)
784 && ! (type_annotate_only
785 && (Is_Array_Type (Etype (gnat_temp
))
786 || Is_Record_Type (Etype (gnat_temp
))
787 || Is_Concurrent_Type (Etype (gnat_temp
)))))
789 gnu_expr
= gnat_to_gnu (Renamed_Object (gnat_temp
));
790 gnat_to_gnu_entity (gnat_temp
, gnu_expr
, 1);
794 case N_Implicit_Label_Declaration
:
795 gnat_to_gnu_entity (Defining_Entity (gnat_node
), NULL_TREE
, 1);
798 case N_Subprogram_Renaming_Declaration
:
799 case N_Package_Renaming_Declaration
:
800 case N_Exception_Renaming_Declaration
:
801 case N_Number_Declaration
:
802 /* These are fully handled in the front end. */
805 /*************************************/
806 /* Chapter 4: Names and Expressions: */
807 /*************************************/
809 case N_Explicit_Dereference
:
810 gnu_result
= gnat_to_gnu (Prefix (gnat_node
));
811 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
813 /* Emit access check if necessary */
814 if (Do_Access_Check (gnat_node
))
815 gnu_result
= emit_access_check (gnu_result
);
817 gnu_result
= build_unary_op (INDIRECT_REF
, NULL_TREE
, gnu_result
);
820 case N_Indexed_Component
:
822 tree gnu_array_object
= gnat_to_gnu (Prefix (gnat_node
));
826 Node_Id
*gnat_expr_array
;
828 /* Emit access check if necessary */
829 if (Do_Access_Check (gnat_node
))
830 gnu_array_object
= emit_access_check (gnu_array_object
);
832 gnu_array_object
= maybe_implicit_deref (gnu_array_object
);
833 gnu_array_object
= maybe_unconstrained_array (gnu_array_object
);
835 /* If we got a padded type, remove it too. */
836 if (TREE_CODE (TREE_TYPE (gnu_array_object
)) == RECORD_TYPE
837 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_array_object
)))
839 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_array_object
))),
842 gnu_result
= gnu_array_object
;
844 /* First compute the number of dimensions of the array, then
845 fill the expression array, the order depending on whether
846 this is a Convention_Fortran array or not. */
847 for (ndim
= 1, gnu_type
= TREE_TYPE (gnu_array_object
);
848 TREE_CODE (TREE_TYPE (gnu_type
)) == ARRAY_TYPE
849 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type
));
850 ndim
++, gnu_type
= TREE_TYPE (gnu_type
))
853 gnat_expr_array
= (Node_Id
*) alloca (ndim
* sizeof (Node_Id
));
855 if (TYPE_CONVENTION_FORTRAN_P (TREE_TYPE (gnu_array_object
)))
856 for (i
= ndim
- 1, gnat_temp
= First (Expressions (gnat_node
));
858 i
--, gnat_temp
= Next (gnat_temp
))
859 gnat_expr_array
[i
] = gnat_temp
;
861 for (i
= 0, gnat_temp
= First (Expressions (gnat_node
));
863 i
++, gnat_temp
= Next (gnat_temp
))
864 gnat_expr_array
[i
] = gnat_temp
;
866 for (i
= 0, gnu_type
= TREE_TYPE (gnu_array_object
);
867 i
< ndim
; i
++, gnu_type
= TREE_TYPE (gnu_type
))
869 if (TREE_CODE (gnu_type
) != ARRAY_TYPE
)
872 gnat_temp
= gnat_expr_array
[i
];
873 gnu_expr
= gnat_to_gnu (gnat_temp
);
875 if (Do_Range_Check (gnat_temp
))
878 (gnu_array_object
, gnu_expr
,
879 TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))),
880 TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))));
882 gnu_result
= build_binary_op (ARRAY_REF
, NULL_TREE
,
883 gnu_result
, gnu_expr
);
887 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
893 Node_Id gnat_range_node
= Discrete_Range (gnat_node
);
895 gnu_result
= gnat_to_gnu (Prefix (gnat_node
));
896 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
898 /* Emit access check if necessary */
899 if (Do_Access_Check (gnat_node
))
900 gnu_result
= emit_access_check (gnu_result
);
902 /* Do any implicit dereferences of the prefix and do any needed
904 gnu_result
= maybe_implicit_deref (gnu_result
);
905 gnu_result
= maybe_unconstrained_array (gnu_result
);
906 gnu_type
= TREE_TYPE (gnu_result
);
907 if (Do_Range_Check (gnat_range_node
))
909 /* Get the bounds of the slice. */
911 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_result_type
));
912 tree gnu_min_expr
= TYPE_MIN_VALUE (gnu_index_type
);
913 tree gnu_max_expr
= TYPE_MAX_VALUE (gnu_index_type
);
914 tree gnu_expr_l
, gnu_expr_h
, gnu_expr_type
;
916 /* Check to see that the minimum slice value is in range */
919 (gnu_result
, gnu_min_expr
,
920 TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))),
921 TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))));
923 /* Check to see that the maximum slice value is in range */
926 (gnu_result
, gnu_max_expr
,
927 TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))),
928 TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))));
930 /* Derive a good type to convert everything too */
931 gnu_expr_type
= get_base_type (TREE_TYPE (gnu_expr_l
));
933 /* Build a compound expression that does the range checks */
935 = build_binary_op (COMPOUND_EXPR
, gnu_expr_type
,
936 convert (gnu_expr_type
, gnu_expr_h
),
937 convert (gnu_expr_type
, gnu_expr_l
));
939 /* Build a conditional expression that returns the range checks
940 expression if the slice range is not null (max >= min) or
941 returns the min if the slice range is null */
943 = fold (build (COND_EXPR
, gnu_expr_type
,
944 build_binary_op (GE_EXPR
, gnu_expr_type
,
945 convert (gnu_expr_type
,
947 convert (gnu_expr_type
,
949 gnu_expr
, gnu_min_expr
));
952 gnu_expr
= TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type
));
954 gnu_result
= build_binary_op (ARRAY_RANGE_REF
, gnu_result_type
,
955 gnu_result
, gnu_expr
);
959 case N_Selected_Component
:
961 tree gnu_prefix
= gnat_to_gnu (Prefix (gnat_node
));
962 Entity_Id gnat_field
= Entity (Selector_Name (gnat_node
));
963 Entity_Id gnat_pref_type
= Etype (Prefix (gnat_node
));
966 while (IN (Ekind (gnat_pref_type
), Incomplete_Or_Private_Kind
)
967 || IN (Ekind (gnat_pref_type
), Access_Kind
))
969 if (IN (Ekind (gnat_pref_type
), Incomplete_Or_Private_Kind
))
970 gnat_pref_type
= Underlying_Type (gnat_pref_type
);
971 else if (IN (Ekind (gnat_pref_type
), Access_Kind
))
972 gnat_pref_type
= Designated_Type (gnat_pref_type
);
975 if (Do_Access_Check (gnat_node
))
976 gnu_prefix
= emit_access_check (gnu_prefix
);
978 gnu_prefix
= maybe_implicit_deref (gnu_prefix
);
980 /* For discriminant references in tagged types always substitute the
981 corresponding discriminant as the actual selected component. */
983 if (Is_Tagged_Type (gnat_pref_type
))
984 while (Present (Corresponding_Discriminant (gnat_field
)))
985 gnat_field
= Corresponding_Discriminant (gnat_field
);
987 /* For discriminant references of untagged types always substitute the
988 corresponding girder discriminant. */
990 else if (Present (Corresponding_Discriminant (gnat_field
)))
991 gnat_field
= Original_Record_Component (gnat_field
);
993 /* Handle extracting the real or imaginary part of a complex.
994 The real part is the first field and the imaginary the last. */
996 if (TREE_CODE (TREE_TYPE (gnu_prefix
)) == COMPLEX_TYPE
)
997 gnu_result
= build_unary_op (Present (Next_Entity (gnat_field
))
998 ? REALPART_EXPR
: IMAGPART_EXPR
,
999 NULL_TREE
, gnu_prefix
);
1002 gnu_field
= gnat_to_gnu_entity (gnat_field
, NULL_TREE
, 0);
1004 /* If there are discriminants, the prefix might be
1005 evaluated more than once, which is a problem if it has
1007 if (Has_Discriminants (Is_Access_Type (Etype (Prefix (gnat_node
)))
1008 ? Designated_Type (Etype
1009 (Prefix (gnat_node
)))
1010 : Etype (Prefix (gnat_node
))))
1011 gnu_prefix
= gnat_stabilize_reference (gnu_prefix
, 0);
1013 /* Emit discriminant check if necessary. */
1014 if (Do_Discriminant_Check (gnat_node
))
1015 gnu_prefix
= emit_discriminant_check (gnu_prefix
, gnat_node
);
1017 = build_component_ref (gnu_prefix
, NULL_TREE
, gnu_field
);
1020 if (gnu_result
== 0)
1023 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1027 case N_Attribute_Reference
:
1029 /* The attribute designator (like an enumeration value). */
1030 int attribute
= Get_Attribute_Id (Attribute_Name (gnat_node
));
1031 int prefix_unused
= 0;
1035 /* The Elab_Spec and Elab_Body attributes are special in that
1036 Prefix is a unit, not an object with a GCC equivalent. Similarly
1037 for Elaborated, since that variable isn't otherwise known. */
1038 if (attribute
== Attr_Elab_Body
|| attribute
== Attr_Elab_Spec
)
1041 = create_subprog_decl
1042 (create_concat_name (Entity (Prefix (gnat_node
)),
1043 attribute
== Attr_Elab_Body
1044 ? "elabb" : "elabs"),
1045 NULL_TREE
, void_ftype
, NULL_TREE
, 0, 1, 1, 0);
1049 gnu_prefix
= gnat_to_gnu (Prefix (gnat_node
));
1050 gnu_type
= TREE_TYPE (gnu_prefix
);
1052 /* If the input is a NULL_EXPR, make a new one. */
1053 if (TREE_CODE (gnu_prefix
) == NULL_EXPR
)
1055 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1056 gnu_result
= build1 (NULL_EXPR
, gnu_result_type
,
1057 TREE_OPERAND (gnu_prefix
, 0));
1065 /* These are just conversions until since representation
1066 clauses for enumerations are handled in the front end. */
1068 int check_p
= Do_Range_Check (First (Expressions (gnat_node
)));
1070 gnu_result
= gnat_to_gnu (First (Expressions (gnat_node
)));
1071 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1072 gnu_result
= convert_with_check (Etype (gnat_node
), gnu_result
,
1073 check_p
, check_p
, 1);
1079 /* These just add or subject the constant 1. Representation
1080 clauses for enumerations are handled in the front-end. */
1081 gnu_expr
= gnat_to_gnu (First (Expressions (gnat_node
)));
1082 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1084 if (Do_Range_Check (First (Expressions (gnat_node
))))
1086 gnu_expr
= protect_multiple_eval (gnu_expr
);
1089 (build_binary_op (EQ_EXPR
, integer_type_node
,
1091 attribute
== Attr_Pred
1092 ? TYPE_MIN_VALUE (gnu_result_type
)
1093 : TYPE_MAX_VALUE (gnu_result_type
)),
1094 gnu_expr
, CE_Range_Check_Failed
);
1098 = build_binary_op (attribute
== Attr_Pred
1099 ? MINUS_EXPR
: PLUS_EXPR
,
1100 gnu_result_type
, gnu_expr
,
1101 convert (gnu_result_type
, integer_one_node
));
1105 case Attr_Unrestricted_Access
:
1107 /* Conversions don't change something's address but can cause
1108 us to miss the COMPONENT_REF case below, so strip them off. */
1110 = remove_conversions (gnu_prefix
,
1111 ! Must_Be_Byte_Aligned (gnat_node
));
1113 /* If we are taking 'Address of an unconstrained object,
1114 this is the pointer to the underlying array. */
1115 gnu_prefix
= maybe_unconstrained_array (gnu_prefix
);
1117 /* ... fall through ... */
1120 case Attr_Unchecked_Access
:
1121 case Attr_Code_Address
:
1123 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1125 = build_unary_op (((attribute
== Attr_Address
1126 || attribute
== Attr_Unrestricted_Access
)
1127 && ! Must_Be_Byte_Aligned (gnat_node
))
1128 ? ATTR_ADDR_EXPR
: ADDR_EXPR
,
1129 gnu_result_type
, gnu_prefix
);
1131 /* For 'Code_Address, find an inner ADDR_EXPR and mark it
1132 so that we don't try to build a trampoline. */
1133 if (attribute
== Attr_Code_Address
)
1135 for (gnu_expr
= gnu_result
;
1136 TREE_CODE (gnu_expr
) == NOP_EXPR
1137 || TREE_CODE (gnu_expr
) == CONVERT_EXPR
;
1138 gnu_expr
= TREE_OPERAND (gnu_expr
, 0))
1139 TREE_CONSTANT (gnu_expr
) = 1;
1142 if (TREE_CODE (gnu_expr
) == ADDR_EXPR
)
1143 TREE_STATIC (gnu_expr
) = TREE_CONSTANT (gnu_expr
) = 1;
1149 case Attr_Object_Size
:
1150 case Attr_Value_Size
:
1151 case Attr_Max_Size_In_Storage_Elements
:
1153 gnu_expr
= gnu_prefix
;
1155 /* Remove NOPS from gnu_expr and conversions from gnu_prefix.
1156 We only use GNU_EXPR to see if a COMPONENT_REF was involved. */
1157 while (TREE_CODE (gnu_expr
) == NOP_EXPR
)
1158 gnu_expr
= TREE_OPERAND (gnu_expr
, 0);
1160 gnu_prefix
= remove_conversions (gnu_prefix
, 1);
1162 gnu_type
= TREE_TYPE (gnu_prefix
);
1164 /* Replace an unconstrained array type with the type of the
1165 underlying array. We can't do this with a call to
1166 maybe_unconstrained_array since we may have a TYPE_DECL.
1167 For 'Max_Size_In_Storage_Elements, use the record type
1168 that will be used to allocate the object and its template. */
1170 if (TREE_CODE (gnu_type
) == UNCONSTRAINED_ARRAY_TYPE
)
1172 gnu_type
= TYPE_OBJECT_RECORD_TYPE (gnu_type
);
1173 if (attribute
!= Attr_Max_Size_In_Storage_Elements
)
1174 gnu_type
= TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type
)));
1177 /* If we are looking for the size of a field, return the
1178 field size. Otherwise, if the prefix is an object,
1179 or if 'Object_Size or 'Max_Size_In_Storage_Elements has
1180 been specified, the result is the GCC size of the type.
1181 Otherwise, the result is the RM_Size of the type. */
1182 if (TREE_CODE (gnu_prefix
) == COMPONENT_REF
)
1183 gnu_result
= DECL_SIZE (TREE_OPERAND (gnu_prefix
, 1));
1184 else if (TREE_CODE (gnu_prefix
) != TYPE_DECL
1185 || attribute
== Attr_Object_Size
1186 || attribute
== Attr_Max_Size_In_Storage_Elements
)
1188 /* If this is a padded type, the GCC size isn't relevant
1189 to the programmer. Normally, what we want is the RM_Size,
1190 which was set from the specified size, but if it was not
1191 set, we want the size of the relevant field. Using the MAX
1192 of those two produces the right result in all case. Don't
1193 use the size of the field if it's a self-referential type,
1194 since that's never what's wanted. */
1195 if (TREE_CODE (gnu_type
) == RECORD_TYPE
1196 && TYPE_IS_PADDING_P (gnu_type
)
1197 && TREE_CODE (gnu_expr
) == COMPONENT_REF
)
1199 gnu_result
= rm_size (gnu_type
);
1200 if (! (contains_placeholder_p
1201 (DECL_SIZE (TREE_OPERAND (gnu_expr
, 1)))))
1203 = size_binop (MAX_EXPR
, gnu_result
,
1204 DECL_SIZE (TREE_OPERAND (gnu_expr
, 1)));
1207 gnu_result
= TYPE_SIZE (gnu_type
);
1210 gnu_result
= rm_size (gnu_type
);
1212 if (gnu_result
== 0)
1215 /* Deal with a self-referential size by returning the maximum
1216 size for a type and by qualifying the size with
1217 the object for 'Size of an object. */
1219 if (TREE_CODE (gnu_result
) != INTEGER_CST
1220 && contains_placeholder_p (gnu_result
))
1222 if (TREE_CODE (gnu_prefix
) != TYPE_DECL
)
1223 gnu_result
= build (WITH_RECORD_EXPR
, TREE_TYPE (gnu_result
),
1224 gnu_result
, gnu_prefix
);
1226 gnu_result
= max_size (gnu_result
, 1);
1229 /* If the type contains a template, subtract the size of the
1231 if (TREE_CODE (gnu_type
) == RECORD_TYPE
1232 && TYPE_CONTAINS_TEMPLATE_P (gnu_type
))
1233 gnu_result
= size_binop (MINUS_EXPR
, gnu_result
,
1234 DECL_SIZE (TYPE_FIELDS (gnu_type
)));
1236 /* If the type contains a template, subtract the size of the
1238 if (TREE_CODE (gnu_type
) == RECORD_TYPE
1239 && TYPE_CONTAINS_TEMPLATE_P (gnu_type
))
1240 gnu_result
= size_binop (MINUS_EXPR
, gnu_result
,
1241 DECL_SIZE (TYPE_FIELDS (gnu_type
)));
1243 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1245 /* Always perform division using unsigned arithmetic as the
1246 size cannot be negative, but may be an overflowed positive
1247 value. This provides correct results for sizes up to 512 MB.
1248 ??? Size should be calculated in storage elements directly. */
1250 if (attribute
== Attr_Max_Size_In_Storage_Elements
)
1251 gnu_result
= convert (sizetype
,
1252 fold (build (CEIL_DIV_EXPR
, bitsizetype
,
1254 bitsize_unit_node
)));
1257 case Attr_Alignment
:
1258 if (TREE_CODE (gnu_prefix
) == COMPONENT_REF
1259 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_prefix
, 0)))
1261 && (TYPE_IS_PADDING_P
1262 (TREE_TYPE (TREE_OPERAND (gnu_prefix
, 0)))))
1263 gnu_prefix
= TREE_OPERAND (gnu_prefix
, 0);
1265 gnu_type
= TREE_TYPE (gnu_prefix
);
1266 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1269 if (TREE_CODE (gnu_prefix
) == COMPONENT_REF
)
1271 = size_int (DECL_ALIGN (TREE_OPERAND (gnu_prefix
, 1)));
1273 gnu_result
= size_int (TYPE_ALIGN (gnu_type
) / BITS_PER_UNIT
);
1278 case Attr_Range_Length
:
1281 if (INTEGRAL_TYPE_P (gnu_type
)
1282 || TREE_CODE (gnu_type
) == REAL_TYPE
)
1284 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1286 if (attribute
== Attr_First
)
1287 gnu_result
= TYPE_MIN_VALUE (gnu_type
);
1288 else if (attribute
== Attr_Last
)
1289 gnu_result
= TYPE_MAX_VALUE (gnu_type
);
1293 (MAX_EXPR
, get_base_type (gnu_result_type
),
1295 (PLUS_EXPR
, get_base_type (gnu_result_type
),
1296 build_binary_op (MINUS_EXPR
,
1297 get_base_type (gnu_result_type
),
1298 convert (gnu_result_type
,
1299 TYPE_MAX_VALUE (gnu_type
)),
1300 convert (gnu_result_type
,
1301 TYPE_MIN_VALUE (gnu_type
))),
1302 convert (gnu_result_type
, integer_one_node
)),
1303 convert (gnu_result_type
, integer_zero_node
));
1307 /* ... fall through ... */
1311 = (Present (Expressions (gnat_node
))
1312 ? UI_To_Int (Intval (First (Expressions (gnat_node
))))
1315 /* Emit access check if necessary */
1316 if (Do_Access_Check (gnat_node
))
1317 gnu_prefix
= emit_access_check (gnu_prefix
);
1319 /* Make sure any implicit dereference gets done. */
1320 gnu_prefix
= maybe_implicit_deref (gnu_prefix
);
1321 gnu_prefix
= maybe_unconstrained_array (gnu_prefix
);
1322 gnu_type
= TREE_TYPE (gnu_prefix
);
1324 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1326 if (TYPE_CONVENTION_FORTRAN_P (gnu_type
))
1331 for (ndim
= 1, gnu_type_temp
= gnu_type
;
1332 TREE_CODE (TREE_TYPE (gnu_type_temp
)) == ARRAY_TYPE
1333 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type_temp
));
1334 ndim
++, gnu_type_temp
= TREE_TYPE (gnu_type_temp
))
1337 Dimension
= ndim
+ 1 - Dimension
;
1340 for (; Dimension
> 1; Dimension
--)
1341 gnu_type
= TREE_TYPE (gnu_type
);
1343 if (TREE_CODE (gnu_type
) != ARRAY_TYPE
)
1346 if (attribute
== Attr_First
)
1348 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
)));
1349 else if (attribute
== Attr_Last
)
1351 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
)));
1353 /* 'Length or 'Range_Length. */
1355 tree gnu_compute_type
1356 = gnat_signed_or_unsigned_type
1357 (0, get_base_type (gnu_result_type
));
1361 (MAX_EXPR
, gnu_compute_type
,
1363 (PLUS_EXPR
, gnu_compute_type
,
1365 (MINUS_EXPR
, gnu_compute_type
,
1366 convert (gnu_compute_type
,
1368 (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
)))),
1369 convert (gnu_compute_type
,
1371 (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type
))))),
1372 convert (gnu_compute_type
, integer_one_node
)),
1373 convert (gnu_compute_type
, integer_zero_node
));
1376 /* If this has a PLACEHOLDER_EXPR, qualify it by the object
1377 we are handling. Note that these attributes could not
1378 have been used on an unconstrained array type. */
1379 if (TREE_CODE (gnu_result
) != INTEGER_CST
1380 && contains_placeholder_p (gnu_result
))
1381 gnu_result
= build (WITH_RECORD_EXPR
, TREE_TYPE (gnu_result
),
1382 gnu_result
, gnu_prefix
);
1387 case Attr_Bit_Position
:
1389 case Attr_First_Bit
:
1393 HOST_WIDE_INT bitsize
;
1394 HOST_WIDE_INT bitpos
;
1396 tree gnu_field_bitpos
;
1397 tree gnu_field_offset
;
1399 enum machine_mode mode
;
1400 int unsignedp
, volatilep
;
1402 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1403 gnu_prefix
= remove_conversions (gnu_prefix
, 1);
1406 /* We can have 'Bit on any object, but if it isn't a
1407 COMPONENT_REF, the result is zero. Do not allow
1408 'Bit on a bare component, though. */
1409 if (attribute
== Attr_Bit
1410 && TREE_CODE (gnu_prefix
) != COMPONENT_REF
1411 && TREE_CODE (gnu_prefix
) != FIELD_DECL
)
1413 gnu_result
= integer_zero_node
;
1417 else if (TREE_CODE (gnu_prefix
) != COMPONENT_REF
1418 && ! (attribute
== Attr_Bit_Position
1419 && TREE_CODE (gnu_prefix
) == FIELD_DECL
))
1422 get_inner_reference (gnu_prefix
, &bitsize
, &bitpos
, &gnu_offset
,
1423 &mode
, &unsignedp
, &volatilep
);
1425 if (TREE_CODE (gnu_prefix
) == COMPONENT_REF
)
1428 = bit_position (TREE_OPERAND (gnu_prefix
, 1));
1430 = byte_position (TREE_OPERAND (gnu_prefix
, 1));
1432 for (gnu_inner
= TREE_OPERAND (gnu_prefix
, 0);
1433 TREE_CODE (gnu_inner
) == COMPONENT_REF
1434 && DECL_INTERNAL_P (TREE_OPERAND (gnu_inner
, 1));
1435 gnu_inner
= TREE_OPERAND (gnu_inner
, 0))
1438 = size_binop (PLUS_EXPR
, gnu_field_bitpos
,
1439 bit_position (TREE_OPERAND (gnu_inner
,
1442 = size_binop (PLUS_EXPR
, gnu_field_offset
,
1443 byte_position (TREE_OPERAND (gnu_inner
,
1447 else if (TREE_CODE (gnu_prefix
) == FIELD_DECL
)
1449 gnu_field_bitpos
= bit_position (gnu_prefix
);
1450 gnu_field_offset
= byte_position (gnu_prefix
);
1454 gnu_field_bitpos
= bitsize_zero_node
;
1455 gnu_field_offset
= size_zero_node
;
1461 gnu_result
= gnu_field_offset
;
1464 case Attr_First_Bit
:
1466 gnu_result
= size_int (bitpos
% BITS_PER_UNIT
);
1470 gnu_result
= bitsize_int (bitpos
% BITS_PER_UNIT
);
1472 = size_binop (PLUS_EXPR
, gnu_result
,
1473 TYPE_SIZE (TREE_TYPE (gnu_prefix
)));
1474 gnu_result
= size_binop (MINUS_EXPR
, gnu_result
,
1478 case Attr_Bit_Position
:
1479 gnu_result
= gnu_field_bitpos
;
1483 /* If this has a PLACEHOLDER_EXPR, qualify it by the object
1485 if (TREE_CODE (gnu_result
) != INTEGER_CST
1486 && contains_placeholder_p (gnu_result
))
1487 gnu_result
= build (WITH_RECORD_EXPR
, TREE_TYPE (gnu_result
),
1488 gnu_result
, gnu_prefix
);
1495 gnu_lhs
= gnat_to_gnu (First (Expressions (gnat_node
)));
1496 gnu_rhs
= gnat_to_gnu (Next (First (Expressions (gnat_node
))));
1498 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1499 gnu_result
= build_binary_op (attribute
== Attr_Min
1500 ? MIN_EXPR
: MAX_EXPR
,
1501 gnu_result_type
, gnu_lhs
, gnu_rhs
);
1504 case Attr_Passed_By_Reference
:
1505 gnu_result
= size_int (default_pass_by_ref (gnu_type
)
1506 || must_pass_by_ref (gnu_type
));
1507 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1510 case Attr_Component_Size
:
1511 if (TREE_CODE (gnu_prefix
) == COMPONENT_REF
1512 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_prefix
, 0)))
1514 && (TYPE_IS_PADDING_P
1515 (TREE_TYPE (TREE_OPERAND (gnu_prefix
, 0)))))
1516 gnu_prefix
= TREE_OPERAND (gnu_prefix
, 0);
1518 gnu_prefix
= maybe_implicit_deref (gnu_prefix
);
1519 gnu_type
= TREE_TYPE (gnu_prefix
);
1521 if (TREE_CODE (gnu_type
) == UNCONSTRAINED_ARRAY_TYPE
)
1523 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_type
))));
1525 while (TREE_CODE (TREE_TYPE (gnu_type
)) == ARRAY_TYPE
1526 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type
)))
1527 gnu_type
= TREE_TYPE (gnu_type
);
1529 if (TREE_CODE (gnu_type
) != ARRAY_TYPE
)
1532 /* Note this size cannot be self-referential. */
1533 gnu_result
= TYPE_SIZE (TREE_TYPE (gnu_type
));
1534 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1538 case Attr_Null_Parameter
:
1539 /* This is just a zero cast to the pointer type for
1540 our prefix and dereferenced. */
1541 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1543 = build_unary_op (INDIRECT_REF
, NULL_TREE
,
1544 convert (build_pointer_type (gnu_result_type
),
1545 integer_zero_node
));
1546 TREE_PRIVATE (gnu_result
) = 1;
1549 case Attr_Mechanism_Code
:
1552 Entity_Id gnat_obj
= Entity (Prefix (gnat_node
));
1555 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1556 if (Present (Expressions (gnat_node
)))
1558 int i
= UI_To_Int (Intval (First (Expressions (gnat_node
))));
1560 for (gnat_obj
= First_Formal (gnat_obj
); i
> 1;
1561 i
--, gnat_obj
= Next_Formal (gnat_obj
))
1565 code
= Mechanism (gnat_obj
);
1566 if (code
== Default
)
1567 code
= ((present_gnu_tree (gnat_obj
)
1568 && (DECL_BY_REF_P (get_gnu_tree (gnat_obj
))
1569 || (DECL_BY_COMPONENT_PTR_P
1570 (get_gnu_tree (gnat_obj
)))))
1571 ? By_Reference
: By_Copy
);
1572 gnu_result
= convert (gnu_result_type
, size_int (- code
));
1577 /* Say we have an unimplemented attribute. Then set the
1578 value to be returned to be a zero and hope that's something
1579 we can convert to the type of this attribute. */
1581 post_error ("unimplemented attribute", gnat_node
);
1582 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1583 gnu_result
= integer_zero_node
;
1587 /* If this is an attribute where the prefix was unused,
1588 force a use of it if it has a side-effect. But don't do it if
1589 the prefix is just an entity name. However, if an access check
1590 is needed, we must do it. See second example in AARM 11.6(5.e). */
1591 if (prefix_unused
&& TREE_SIDE_EFFECTS (gnu_prefix
)
1592 && (! Is_Entity_Name (Prefix (gnat_node
))
1593 || Do_Access_Check (gnat_node
)))
1594 gnu_result
= fold (build (COMPOUND_EXPR
, TREE_TYPE (gnu_result
),
1595 gnu_prefix
, gnu_result
));
1600 /* Like 'Access as far as we are concerned. */
1601 gnu_result
= gnat_to_gnu (Prefix (gnat_node
));
1602 gnu_result
= build_unary_op (ADDR_EXPR
, NULL_TREE
, gnu_result
);
1603 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1607 case N_Extension_Aggregate
:
1611 /* ??? It is wrong to evaluate the type now, but there doesn't
1612 seem to be any other practical way of doing it. */
1614 gnu_aggr_type
= gnu_result_type
1615 = get_unpadded_type (Etype (gnat_node
));
1617 if (TREE_CODE (gnu_result_type
) == RECORD_TYPE
1618 && TYPE_CONTAINS_TEMPLATE_P (gnu_result_type
))
1620 = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_result_type
)));
1622 if (Null_Record_Present (gnat_node
))
1623 gnu_result
= build_constructor (gnu_aggr_type
, NULL_TREE
);
1625 else if (TREE_CODE (gnu_aggr_type
) == RECORD_TYPE
)
1627 = assoc_to_constructor (First (Component_Associations (gnat_node
)),
1629 else if (TREE_CODE (gnu_aggr_type
) == UNION_TYPE
)
1631 /* The first element is the discrimant, which we ignore. The
1632 next is the field we're building. Convert the expression
1633 to the type of the field and then to the union type. */
1635 = Next (First (Component_Associations (gnat_node
)));
1636 Entity_Id gnat_field
= Entity (First (Choices (gnat_assoc
)));
1638 = TREE_TYPE (gnat_to_gnu_entity (gnat_field
, NULL_TREE
, 0));
1640 gnu_result
= convert (gnu_field_type
,
1641 gnat_to_gnu (Expression (gnat_assoc
)));
1643 else if (TREE_CODE (gnu_aggr_type
) == ARRAY_TYPE
)
1644 gnu_result
= pos_to_constructor (First (Expressions (gnat_node
)),
1646 Component_Type (Etype (gnat_node
)));
1647 else if (TREE_CODE (gnu_aggr_type
) == COMPLEX_TYPE
)
1650 (COMPLEX_EXPR
, gnu_aggr_type
,
1651 gnat_to_gnu (Expression (First
1652 (Component_Associations (gnat_node
)))),
1653 gnat_to_gnu (Expression
1655 (First (Component_Associations (gnat_node
))))));
1659 gnu_result
= convert (gnu_result_type
, gnu_result
);
1664 gnu_result
= null_pointer_node
;
1665 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1668 case N_Type_Conversion
:
1669 case N_Qualified_Expression
:
1670 /* Get the operand expression. */
1671 gnu_result
= gnat_to_gnu (Expression (gnat_node
));
1672 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1675 = convert_with_check (Etype (gnat_node
), gnu_result
,
1676 Do_Overflow_Check (gnat_node
),
1677 Do_Range_Check (Expression (gnat_node
)),
1678 Nkind (gnat_node
) == N_Type_Conversion
1679 && Float_Truncate (gnat_node
));
1682 case N_Unchecked_Type_Conversion
:
1683 gnu_result
= gnat_to_gnu (Expression (gnat_node
));
1684 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1686 /* If the result is a pointer type, see if we are improperly
1687 converting to a stricter alignment. */
1689 if (STRICT_ALIGNMENT
&& POINTER_TYPE_P (gnu_result_type
)
1690 && IN (Ekind (Etype (gnat_node
)), Access_Kind
))
1692 unsigned int align
= known_alignment (gnu_result
);
1693 tree gnu_obj_type
= TREE_TYPE (gnu_result_type
);
1695 = TREE_CODE (gnu_obj_type
) == FUNCTION_TYPE
1696 ? FUNCTION_BOUNDARY
: TYPE_ALIGN (gnu_obj_type
);
1698 if (align
!= 0 && align
< oalign
&& ! TYPE_ALIGN_OK (gnu_obj_type
))
1699 post_error_ne_tree_2
1700 ("?source alignment (^) < alignment of & (^)",
1701 gnat_node
, Designated_Type (Etype (gnat_node
)),
1702 size_int (align
/ BITS_PER_UNIT
), oalign
/ BITS_PER_UNIT
);
1705 gnu_result
= unchecked_convert (gnu_result_type
, gnu_result
);
1711 tree gnu_object
= gnat_to_gnu (Left_Opnd (gnat_node
));
1712 Node_Id gnat_range
= Right_Opnd (gnat_node
);
1716 /* GNAT_RANGE is either an N_Range node or an identifier
1717 denoting a subtype. */
1718 if (Nkind (gnat_range
) == N_Range
)
1720 gnu_low
= gnat_to_gnu (Low_Bound (gnat_range
));
1721 gnu_high
= gnat_to_gnu (High_Bound (gnat_range
));
1723 else if (Nkind (gnat_range
) == N_Identifier
1724 || Nkind (gnat_range
) == N_Expanded_Name
)
1726 tree gnu_range_type
= get_unpadded_type (Entity (gnat_range
));
1728 gnu_low
= TYPE_MIN_VALUE (gnu_range_type
);
1729 gnu_high
= TYPE_MAX_VALUE (gnu_range_type
);
1734 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1736 /* If LOW and HIGH are identical, perform an equality test.
1737 Otherwise, ensure that GNU_OBJECT is only evaluated once
1738 and perform a full range test. */
1739 if (operand_equal_p (gnu_low
, gnu_high
, 0))
1740 gnu_result
= build_binary_op (EQ_EXPR
, gnu_result_type
,
1741 gnu_object
, gnu_low
);
1744 gnu_object
= protect_multiple_eval (gnu_object
);
1746 = build_binary_op (TRUTH_ANDIF_EXPR
, gnu_result_type
,
1747 build_binary_op (GE_EXPR
, gnu_result_type
,
1748 gnu_object
, gnu_low
),
1749 build_binary_op (LE_EXPR
, gnu_result_type
,
1750 gnu_object
, gnu_high
));
1753 if (Nkind (gnat_node
) == N_Not_In
)
1754 gnu_result
= invert_truthvalue (gnu_result
);
1759 gnu_lhs
= gnat_to_gnu (Left_Opnd (gnat_node
));
1760 gnu_rhs
= gnat_to_gnu (Right_Opnd (gnat_node
));
1761 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1762 gnu_result
= build_binary_op (FLOAT_TYPE_P (gnu_result_type
)
1764 : (Rounded_Result (gnat_node
)
1765 ? ROUND_DIV_EXPR
: TRUNC_DIV_EXPR
),
1766 gnu_result_type
, gnu_lhs
, gnu_rhs
);
1769 case N_And_Then
: case N_Or_Else
:
1771 enum tree_code code
= gnu_codes
[Nkind (gnat_node
)];
1774 /* The elaboration of the RHS may generate code. If so,
1775 we need to make sure it gets executed after the LHS. */
1776 gnu_lhs
= gnat_to_gnu (Left_Opnd (gnat_node
));
1778 gnu_rhs_side
= expand_start_stmt_expr (/*has_scope=*/1);
1779 gnu_rhs
= gnat_to_gnu (Right_Opnd (gnat_node
));
1780 expand_end_stmt_expr (gnu_rhs_side
);
1781 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1783 if (RTL_EXPR_SEQUENCE (gnu_rhs_side
) != 0)
1784 gnu_rhs
= build (COMPOUND_EXPR
, gnu_result_type
, gnu_rhs_side
,
1787 gnu_result
= build_binary_op (code
, gnu_result_type
, gnu_lhs
, gnu_rhs
);
1791 case N_Op_Or
: case N_Op_And
: case N_Op_Xor
:
1792 /* These can either be operations on booleans or on modular types.
1793 Fall through for boolean types since that's the way GNU_CODES is
1795 if (IN (Ekind (Underlying_Type (Etype (gnat_node
))),
1796 Modular_Integer_Kind
))
1799 = (Nkind (gnat_node
) == N_Op_Or
? BIT_IOR_EXPR
1800 : Nkind (gnat_node
) == N_Op_And
? BIT_AND_EXPR
1803 gnu_lhs
= gnat_to_gnu (Left_Opnd (gnat_node
));
1804 gnu_rhs
= gnat_to_gnu (Right_Opnd (gnat_node
));
1805 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1806 gnu_result
= build_binary_op (code
, gnu_result_type
,
1811 /* ... fall through ... */
1813 case N_Op_Eq
: case N_Op_Ne
: case N_Op_Lt
:
1814 case N_Op_Le
: case N_Op_Gt
: case N_Op_Ge
:
1815 case N_Op_Add
: case N_Op_Subtract
: case N_Op_Multiply
:
1816 case N_Op_Mod
: case N_Op_Rem
:
1817 case N_Op_Rotate_Left
:
1818 case N_Op_Rotate_Right
:
1819 case N_Op_Shift_Left
:
1820 case N_Op_Shift_Right
:
1821 case N_Op_Shift_Right_Arithmetic
:
1823 enum tree_code code
= gnu_codes
[Nkind (gnat_node
)];
1826 gnu_lhs
= gnat_to_gnu (Left_Opnd (gnat_node
));
1827 gnu_rhs
= gnat_to_gnu (Right_Opnd (gnat_node
));
1828 gnu_type
= gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1830 /* If this is a comparison operator, convert any references to
1831 an unconstrained array value into a reference to the
1833 if (TREE_CODE_CLASS (code
) == '<')
1835 gnu_lhs
= maybe_unconstrained_array (gnu_lhs
);
1836 gnu_rhs
= maybe_unconstrained_array (gnu_rhs
);
1839 /* If the result type is a private type, its full view may be a
1840 numeric subtype. The representation we need is that of its base
1841 type, given that it is the result of an arithmetic operation. */
1842 else if (Is_Private_Type (Etype (gnat_node
)))
1843 gnu_type
= gnu_result_type
1844 = get_unpadded_type (Base_Type (Full_View (Etype (gnat_node
))));
1846 /* If this is a shift whose count is not guaranteed to be correct,
1847 we need to adjust the shift count. */
1848 if (IN (Nkind (gnat_node
), N_Op_Shift
)
1849 && ! Shift_Count_OK (gnat_node
))
1851 tree gnu_count_type
= get_base_type (TREE_TYPE (gnu_rhs
));
1853 = convert (gnu_count_type
, TYPE_SIZE (gnu_type
));
1855 if (Nkind (gnat_node
) == N_Op_Rotate_Left
1856 || Nkind (gnat_node
) == N_Op_Rotate_Right
)
1857 gnu_rhs
= build_binary_op (TRUNC_MOD_EXPR
, gnu_count_type
,
1858 gnu_rhs
, gnu_max_shift
);
1859 else if (Nkind (gnat_node
) == N_Op_Shift_Right_Arithmetic
)
1862 (MIN_EXPR
, gnu_count_type
,
1863 build_binary_op (MINUS_EXPR
,
1866 convert (gnu_count_type
,
1871 /* For right shifts, the type says what kind of shift to do,
1872 so we may need to choose a different type. */
1873 if (Nkind (gnat_node
) == N_Op_Shift_Right
1874 && ! TREE_UNSIGNED (gnu_type
))
1875 gnu_type
= gnat_unsigned_type (gnu_type
);
1876 else if (Nkind (gnat_node
) == N_Op_Shift_Right_Arithmetic
1877 && TREE_UNSIGNED (gnu_type
))
1878 gnu_type
= gnat_signed_type (gnu_type
);
1880 if (gnu_type
!= gnu_result_type
)
1882 gnu_lhs
= convert (gnu_type
, gnu_lhs
);
1883 gnu_rhs
= convert (gnu_type
, gnu_rhs
);
1886 gnu_result
= build_binary_op (code
, gnu_type
, gnu_lhs
, gnu_rhs
);
1888 /* If this is a logical shift with the shift count not verified,
1889 we must return zero if it is too large. We cannot compensate
1890 above in this case. */
1891 if ((Nkind (gnat_node
) == N_Op_Shift_Left
1892 || Nkind (gnat_node
) == N_Op_Shift_Right
)
1893 && ! Shift_Count_OK (gnat_node
))
1897 build_binary_op (GE_EXPR
, integer_type_node
,
1899 convert (TREE_TYPE (gnu_rhs
),
1900 TYPE_SIZE (gnu_type
))),
1901 convert (gnu_type
, integer_zero_node
),
1906 case N_Conditional_Expression
:
1908 tree gnu_cond
= gnat_to_gnu (First (Expressions (gnat_node
)));
1909 tree gnu_true
= gnat_to_gnu (Next (First (Expressions (gnat_node
))));
1911 = gnat_to_gnu (Next (Next (First (Expressions (gnat_node
)))));
1913 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1914 gnu_result
= build_cond_expr (gnu_result_type
,
1915 gnat_truthvalue_conversion (gnu_cond
),
1916 gnu_true
, gnu_false
);
1921 gnu_result
= gnat_to_gnu (Right_Opnd (gnat_node
));
1922 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1926 /* This case can apply to a boolean or a modular type.
1927 Fall through for a boolean operand since GNU_CODES is set
1928 up to handle this. */
1929 if (IN (Ekind (Etype (gnat_node
)), Modular_Integer_Kind
))
1931 gnu_expr
= gnat_to_gnu (Right_Opnd (gnat_node
));
1932 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1933 gnu_result
= build_unary_op (BIT_NOT_EXPR
, gnu_result_type
,
1938 /* ... fall through ... */
1940 case N_Op_Minus
: case N_Op_Abs
:
1941 gnu_expr
= gnat_to_gnu (Right_Opnd (gnat_node
));
1943 if (Ekind (Etype (gnat_node
)) != E_Private_Type
)
1944 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1946 gnu_result_type
= get_unpadded_type (Base_Type
1947 (Full_View (Etype (gnat_node
))));
1949 gnu_result
= build_unary_op (gnu_codes
[Nkind (gnat_node
)],
1950 gnu_result_type
, gnu_expr
);
1958 gnat_temp
= Expression (gnat_node
);
1960 /* The Expression operand can either be an N_Identifier or
1961 Expanded_Name, which must represent a type, or a
1962 N_Qualified_Expression, which contains both the object type and an
1963 initial value for the object. */
1964 if (Nkind (gnat_temp
) == N_Identifier
1965 || Nkind (gnat_temp
) == N_Expanded_Name
)
1966 gnu_type
= gnat_to_gnu_type (Entity (gnat_temp
));
1967 else if (Nkind (gnat_temp
) == N_Qualified_Expression
)
1969 Entity_Id gnat_desig_type
1970 = Designated_Type (Underlying_Type (Etype (gnat_node
)));
1972 gnu_init
= gnat_to_gnu (Expression (gnat_temp
));
1974 gnu_init
= maybe_unconstrained_array (gnu_init
);
1975 if (Do_Range_Check (Expression (gnat_temp
)))
1976 gnu_init
= emit_range_check (gnu_init
, gnat_desig_type
);
1978 if (Is_Elementary_Type (gnat_desig_type
)
1979 || Is_Constrained (gnat_desig_type
))
1981 gnu_type
= gnat_to_gnu_type (gnat_desig_type
);
1982 gnu_init
= convert (gnu_type
, gnu_init
);
1986 gnu_type
= gnat_to_gnu_type (Etype (Expression (gnat_temp
)));
1987 if (TREE_CODE (gnu_type
) == UNCONSTRAINED_ARRAY_TYPE
)
1988 gnu_type
= TREE_TYPE (gnu_init
);
1990 gnu_init
= convert (gnu_type
, gnu_init
);
1996 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
1997 return build_allocator (gnu_type
, gnu_init
, gnu_result_type
,
1998 Procedure_To_Call (gnat_node
),
1999 Storage_Pool (gnat_node
));
2003 /***************************/
2004 /* Chapter 5: Statements: */
2005 /***************************/
2008 if (! type_annotate_only
)
2010 tree gnu_label
= gnat_to_gnu (Identifier (gnat_node
));
2011 Node_Id gnat_parent
= Parent (gnat_node
);
2013 expand_label (gnu_label
);
2015 /* If this is the first label of an exception handler, we must
2016 mark that any CALL_INSN can jump to it. */
2017 if (Present (gnat_parent
)
2018 && Nkind (gnat_parent
) == N_Exception_Handler
2019 && First (Statements (gnat_parent
)) == gnat_node
)
2020 nonlocal_goto_handler_labels
2021 = gen_rtx_EXPR_LIST (VOIDmode
, label_rtx (gnu_label
),
2022 nonlocal_goto_handler_labels
);
2026 case N_Null_Statement
:
2029 case N_Assignment_Statement
:
2030 if (type_annotate_only
)
2033 /* Get the LHS and RHS of the statement and convert any reference to an
2034 unconstrained array into a reference to the underlying array. */
2035 gnu_lhs
= maybe_unconstrained_array (gnat_to_gnu (Name (gnat_node
)));
2037 = maybe_unconstrained_array (gnat_to_gnu (Expression (gnat_node
)));
2039 set_lineno (gnat_node
, 1);
2041 /* If range check is needed, emit code to generate it */
2042 if (Do_Range_Check (Expression (gnat_node
)))
2043 gnu_rhs
= emit_range_check (gnu_rhs
, Etype (Name (gnat_node
)));
2045 /* If either side's type has a size that overflows, convert this
2046 into raise of Storage_Error: execution shouldn't have gotten
2048 if ((TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_lhs
))) == INTEGER_CST
2049 && TREE_OVERFLOW (TYPE_SIZE (TREE_TYPE (gnu_lhs
))))
2050 || (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_rhs
))) == INTEGER_CST
2051 && TREE_OVERFLOW (TYPE_SIZE (TREE_TYPE (gnu_rhs
)))))
2052 expand_expr_stmt (build_call_raise (SE_Object_Too_Large
));
2054 expand_expr_stmt (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
2058 case N_If_Statement
:
2059 /* Start an IF statement giving the condition. */
2060 gnu_expr
= gnat_to_gnu (Condition (gnat_node
));
2061 set_lineno (gnat_node
, 1);
2062 expand_start_cond (gnu_expr
, 0);
2064 /* Generate code for the statements to be executed if the condition
2067 for (gnat_temp
= First (Then_Statements (gnat_node
));
2068 Present (gnat_temp
);
2069 gnat_temp
= Next (gnat_temp
))
2070 gnat_to_code (gnat_temp
);
2072 /* Generate each of the "else if" parts. */
2073 if (Present (Elsif_Parts (gnat_node
)))
2075 for (gnat_temp
= First (Elsif_Parts (gnat_node
));
2076 Present (gnat_temp
);
2077 gnat_temp
= Next (gnat_temp
))
2079 Node_Id gnat_statement
;
2081 expand_start_else ();
2083 /* Set up the line numbers for each condition we test. */
2084 set_lineno (Condition (gnat_temp
), 1);
2085 expand_elseif (gnat_to_gnu (Condition (gnat_temp
)));
2087 for (gnat_statement
= First (Then_Statements (gnat_temp
));
2088 Present (gnat_statement
);
2089 gnat_statement
= Next (gnat_statement
))
2090 gnat_to_code (gnat_statement
);
2094 /* Finally, handle any statements in the "else" part. */
2095 if (Present (Else_Statements (gnat_node
)))
2097 expand_start_else ();
2099 for (gnat_temp
= First (Else_Statements (gnat_node
));
2100 Present (gnat_temp
);
2101 gnat_temp
= Next (gnat_temp
))
2102 gnat_to_code (gnat_temp
);
2108 case N_Case_Statement
:
2111 Node_Id gnat_choice
;
2113 Node_Id gnat_statement
;
2115 gnu_expr
= gnat_to_gnu (Expression (gnat_node
));
2116 gnu_expr
= convert (get_base_type (TREE_TYPE (gnu_expr
)), gnu_expr
);
2118 set_lineno (gnat_node
, 1);
2119 expand_start_case (1, gnu_expr
, TREE_TYPE (gnu_expr
), "case");
2121 for (gnat_when
= First_Non_Pragma (Alternatives (gnat_node
));
2122 Present (gnat_when
);
2123 gnat_when
= Next_Non_Pragma (gnat_when
))
2125 /* First compile all the different case choices for the current
2126 WHEN alternative. */
2128 for (gnat_choice
= First (Discrete_Choices (gnat_when
));
2129 Present (gnat_choice
); gnat_choice
= Next (gnat_choice
))
2133 gnu_label
= build_decl (LABEL_DECL
, NULL_TREE
, NULL_TREE
);
2135 set_lineno (gnat_choice
, 1);
2136 switch (Nkind (gnat_choice
))
2139 /* Abort on all errors except range empty, which
2140 means we ignore this alternative. */
2142 = pushcase_range (gnat_to_gnu (Low_Bound (gnat_choice
)),
2143 gnat_to_gnu (High_Bound (gnat_choice
)),
2144 convert
, gnu_label
, 0);
2146 if (error_code
!= 0 && error_code
!= 4)
2150 case N_Subtype_Indication
:
2153 (gnat_to_gnu (Low_Bound (Range_Expression
2154 (Constraint (gnat_choice
)))),
2155 gnat_to_gnu (High_Bound (Range_Expression
2156 (Constraint (gnat_choice
)))),
2157 convert
, gnu_label
, 0);
2159 if (error_code
!= 0 && error_code
!= 4)
2164 case N_Expanded_Name
:
2165 /* This represents either a subtype range or a static value
2166 of some kind; Ekind says which. If a static value,
2167 fall through to the next case. */
2168 if (IN (Ekind (Entity (gnat_choice
)), Type_Kind
))
2170 tree type
= get_unpadded_type (Entity (gnat_choice
));
2173 = pushcase_range (fold (TYPE_MIN_VALUE (type
)),
2174 fold (TYPE_MAX_VALUE (type
)),
2175 convert
, gnu_label
, 0);
2177 if (error_code
!= 0 && error_code
!= 4)
2181 /* ... fall through ... */
2182 case N_Character_Literal
:
2183 case N_Integer_Literal
:
2184 if (pushcase (gnat_to_gnu (gnat_choice
), convert
,
2189 case N_Others_Choice
:
2190 if (pushcase (NULL_TREE
, convert
, gnu_label
, 0))
2199 /* After compiling the choices attached to the WHEN compile the
2200 body of statements that have to be executed, should the
2201 "WHEN ... =>" be taken. Push a binding level here in case
2202 variables are declared since we want them to be local to this
2203 set of statements instead of the block containing the Case
2206 expand_start_bindings (0);
2207 for (gnat_statement
= First (Statements (gnat_when
));
2208 Present (gnat_statement
);
2209 gnat_statement
= Next (gnat_statement
))
2210 gnat_to_code (gnat_statement
);
2212 /* Communicate to GCC that we are done with the current WHEN,
2213 i.e. insert a "break" statement. */
2214 expand_exit_something ();
2215 expand_end_bindings (getdecls (), kept_level_p (), 0);
2216 poplevel (kept_level_p (), 1, 0);
2219 expand_end_case (gnu_expr
);
2223 case N_Loop_Statement
:
2225 /* The loop variable in GCC form, if any. */
2226 tree gnu_loop_var
= NULL_TREE
;
2227 /* PREINCREMENT_EXPR or PREDECREMENT_EXPR. */
2228 enum tree_code gnu_update
= ERROR_MARK
;
2229 /* Used if this is a named loop for so EXIT can work. */
2230 struct nesting
*loop_id
;
2231 /* Condition to continue loop tested at top of loop. */
2232 tree gnu_top_condition
= integer_one_node
;
2233 /* Similar, but tested at bottom of loop. */
2234 tree gnu_bottom_condition
= integer_one_node
;
2235 Node_Id gnat_statement
;
2236 Node_Id gnat_iter_scheme
= Iteration_Scheme (gnat_node
);
2237 Node_Id gnat_top_condition
= Empty
;
2238 int enclosing_if_p
= 0;
2240 /* Set the condition that under which the loop should continue.
2241 For "LOOP .... END LOOP;" the condition is always true. */
2242 if (No (gnat_iter_scheme
))
2244 /* The case "WHILE condition LOOP ..... END LOOP;" */
2245 else if (Present (Condition (gnat_iter_scheme
)))
2246 gnat_top_condition
= Condition (gnat_iter_scheme
);
2249 /* We have an iteration scheme. */
2250 Node_Id gnat_loop_spec
2251 = Loop_Parameter_Specification (gnat_iter_scheme
);
2252 Entity_Id gnat_loop_var
= Defining_Entity (gnat_loop_spec
);
2253 Entity_Id gnat_type
= Etype (gnat_loop_var
);
2254 tree gnu_type
= get_unpadded_type (gnat_type
);
2255 tree gnu_low
= TYPE_MIN_VALUE (gnu_type
);
2256 tree gnu_high
= TYPE_MAX_VALUE (gnu_type
);
2257 int reversep
= Reverse_Present (gnat_loop_spec
);
2258 tree gnu_first
= reversep
? gnu_high
: gnu_low
;
2259 tree gnu_last
= reversep
? gnu_low
: gnu_high
;
2260 enum tree_code end_code
= reversep
? GE_EXPR
: LE_EXPR
;
2261 tree gnu_base_type
= get_base_type (gnu_type
);
2263 = (reversep
? TYPE_MIN_VALUE (gnu_base_type
)
2264 : TYPE_MAX_VALUE (gnu_base_type
));
2266 /* We know the loop variable will not overflow if GNU_LAST is
2267 a constant and is not equal to GNU_LIMIT. If it might
2268 overflow, we have to move the limit test to the end of
2269 the loop. In that case, we have to test for an
2270 empty loop outside the loop. */
2271 if (TREE_CODE (gnu_last
) != INTEGER_CST
2272 || TREE_CODE (gnu_limit
) != INTEGER_CST
2273 || tree_int_cst_equal (gnu_last
, gnu_limit
))
2275 gnu_expr
= build_binary_op (LE_EXPR
, integer_type_node
,
2277 set_lineno (gnat_loop_spec
, 1);
2278 expand_start_cond (gnu_expr
, 0);
2282 /* Open a new nesting level that will surround the loop to declare
2283 the loop index variable. */
2285 expand_start_bindings (0);
2287 /* Declare the loop index and set it to its initial value. */
2288 gnu_loop_var
= gnat_to_gnu_entity (gnat_loop_var
, gnu_first
, 1);
2289 if (DECL_BY_REF_P (gnu_loop_var
))
2290 gnu_loop_var
= build_unary_op (INDIRECT_REF
, NULL_TREE
,
2293 /* The loop variable might be a padded type, so use `convert' to
2294 get a reference to the inner variable if so. */
2295 gnu_loop_var
= convert (get_base_type (gnu_type
), gnu_loop_var
);
2297 /* Set either the top or bottom exit condition as
2298 appropriate depending on whether we know an overflow
2299 cannot occur or not. */
2301 gnu_bottom_condition
2302 = build_binary_op (NE_EXPR
, integer_type_node
,
2303 gnu_loop_var
, gnu_last
);
2306 = build_binary_op (end_code
, integer_type_node
,
2307 gnu_loop_var
, gnu_last
);
2309 gnu_update
= reversep
? PREDECREMENT_EXPR
: PREINCREMENT_EXPR
;
2312 set_lineno (gnat_node
, 1);
2314 loop_id
= expand_start_loop_continue_elsewhere (1);
2316 loop_id
= expand_start_loop (1);
2318 /* If the loop was named, have the name point to this loop. In this
2319 case, the association is not a ..._DECL node; in fact, it isn't
2320 a GCC tree node at all. Since this name is referenced inside
2321 the loop, do it before we process the statements of the loop. */
2322 if (Present (Identifier (gnat_node
)))
2324 tree gnu_loop_id
= make_node (GNAT_LOOP_ID
);
2326 TREE_LOOP_ID (gnu_loop_id
) = loop_id
;
2327 save_gnu_tree (Entity (Identifier (gnat_node
)), gnu_loop_id
, 1);
2330 set_lineno (gnat_node
, 1);
2332 /* We must evaluate the condition after we've entered the
2333 loop so that any expression actions get done in the right
2335 if (Present (gnat_top_condition
))
2336 gnu_top_condition
= gnat_to_gnu (gnat_top_condition
);
2338 expand_exit_loop_top_cond (0, gnu_top_condition
);
2340 /* Make the loop body into its own block, so any allocated
2341 storage will be released every iteration. This is needed
2342 for stack allocation. */
2346 = tree_cons (gnu_bottom_condition
, NULL_TREE
, gnu_block_stack
);
2347 expand_start_bindings (0);
2349 for (gnat_statement
= First (Statements (gnat_node
));
2350 Present (gnat_statement
);
2351 gnat_statement
= Next (gnat_statement
))
2352 gnat_to_code (gnat_statement
);
2354 expand_end_bindings (getdecls (), kept_level_p (), 0);
2355 poplevel (kept_level_p (), 1, 0);
2356 gnu_block_stack
= TREE_CHAIN (gnu_block_stack
);
2358 set_lineno (gnat_node
, 1);
2359 expand_exit_loop_if_false (0, gnu_bottom_condition
);
2363 expand_loop_continue_here ();
2364 gnu_expr
= build_binary_op (gnu_update
, TREE_TYPE (gnu_loop_var
),
2366 convert (TREE_TYPE (gnu_loop_var
),
2368 set_lineno (gnat_iter_scheme
, 1);
2369 expand_expr_stmt (gnu_expr
);
2372 set_lineno (gnat_node
, 1);
2377 /* Close the nesting level that sourround the loop that was used to
2378 declare the loop index variable. */
2379 set_lineno (gnat_node
, 1);
2380 expand_end_bindings (getdecls (), 1, 0);
2386 set_lineno (gnat_node
, 1);
2392 case N_Block_Statement
:
2394 gnu_block_stack
= tree_cons (NULL_TREE
, NULL_TREE
, gnu_block_stack
);
2395 expand_start_bindings (0);
2396 process_decls (Declarations (gnat_node
), Empty
, Empty
, 1, 1);
2397 gnat_to_code (Handled_Statement_Sequence (gnat_node
));
2398 expand_end_bindings (getdecls (), kept_level_p (), 0);
2399 poplevel (kept_level_p (), 1, 0);
2400 gnu_block_stack
= TREE_CHAIN (gnu_block_stack
);
2401 if (Present (Identifier (gnat_node
)))
2402 mark_out_of_scope (Entity (Identifier (gnat_node
)));
2405 case N_Exit_Statement
:
2407 /* Which loop to exit, NULL if the current loop. */
2408 struct nesting
*loop_id
= 0;
2409 /* The GCC version of the optional GNAT condition node attached to the
2410 exit statement. Exit the loop if this is false. */
2411 tree gnu_cond
= integer_zero_node
;
2413 if (Present (Name (gnat_node
)))
2415 = TREE_LOOP_ID (get_gnu_tree (Entity (Name (gnat_node
))));
2417 if (Present (Condition (gnat_node
)))
2418 gnu_cond
= invert_truthvalue (gnat_truthvalue_conversion
2419 (gnat_to_gnu (Condition (gnat_node
))));
2421 set_lineno (gnat_node
, 1);
2422 expand_exit_loop_if_false (loop_id
, gnu_cond
);
2426 case N_Return_Statement
:
2427 if (type_annotate_only
)
2431 /* The gnu function type of the subprogram currently processed. */
2432 tree gnu_subprog_type
= TREE_TYPE (current_function_decl
);
2433 /* The return value from the subprogram. */
2434 tree gnu_ret_val
= 0;
2436 /* If we are dealing with a "return;" from an Ada procedure with
2437 parameters passed by copy in copy out, we need to return a record
2438 containing the final values of these parameters. If the list
2439 contains only one entry, return just that entry.
2441 For a full description of the copy in copy out parameter mechanism,
2442 see the part of the gnat_to_gnu_entity routine dealing with the
2443 translation of subprograms.
2445 But if we have a return label defined, convert this into
2446 a branch to that label. */
2448 if (TREE_VALUE (gnu_return_label_stack
) != 0)
2449 expand_goto (TREE_VALUE (gnu_return_label_stack
));
2451 else if (TYPE_CI_CO_LIST (gnu_subprog_type
) != NULL_TREE
)
2453 if (list_length (TYPE_CI_CO_LIST (gnu_subprog_type
)) == 1)
2454 gnu_ret_val
= TREE_VALUE (TYPE_CI_CO_LIST (gnu_subprog_type
));
2457 = build_constructor (TREE_TYPE (gnu_subprog_type
),
2458 TYPE_CI_CO_LIST (gnu_subprog_type
));
2461 /* If the Ada subprogram is a function, we just need to return the
2462 expression. If the subprogram returns an unconstrained
2463 array, we have to allocate a new version of the result and
2464 return it. If we return by reference, return a pointer. */
2466 else if (Present (Expression (gnat_node
)))
2468 gnu_ret_val
= gnat_to_gnu (Expression (gnat_node
));
2470 /* Do not remove the padding from GNU_RET_VAL if the inner
2471 type is self-referential since we want to allocate the fixed
2472 size in that case. */
2473 if (TREE_CODE (gnu_ret_val
) == COMPONENT_REF
2474 && (TYPE_IS_PADDING_P
2475 (TREE_TYPE (TREE_OPERAND (gnu_ret_val
, 0))))
2476 && contains_placeholder_p
2477 (TYPE_SIZE (TREE_TYPE (gnu_ret_val
))))
2478 gnu_ret_val
= TREE_OPERAND (gnu_ret_val
, 0);
2480 if (TYPE_RETURNS_BY_REF_P (gnu_subprog_type
)
2481 || By_Ref (gnat_node
))
2482 gnu_ret_val
= build_unary_op (ADDR_EXPR
, NULL_TREE
, gnu_ret_val
);
2484 else if (TYPE_RETURNS_UNCONSTRAINED_P (gnu_subprog_type
))
2486 gnu_ret_val
= maybe_unconstrained_array (gnu_ret_val
);
2488 /* We have two cases: either the function returns with
2489 depressed stack or not. If not, we allocate on the
2490 secondary stack. If so, we allocate in the stack frame.
2491 if no copy is needed, the front end will set By_Ref,
2492 which we handle in the case above. */
2493 if (TYPE_RETURNS_STACK_DEPRESSED (gnu_subprog_type
))
2495 = build_allocator (TREE_TYPE (gnu_ret_val
), gnu_ret_val
,
2496 TREE_TYPE (gnu_subprog_type
), 0, -1);
2499 = build_allocator (TREE_TYPE (gnu_ret_val
), gnu_ret_val
,
2500 TREE_TYPE (gnu_subprog_type
),
2501 Procedure_To_Call (gnat_node
),
2502 Storage_Pool (gnat_node
));
2506 set_lineno (gnat_node
, 1);
2508 expand_return (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
2509 DECL_RESULT (current_function_decl
),
2512 expand_null_return ();
2517 case N_Goto_Statement
:
2518 if (type_annotate_only
)
2521 gnu_expr
= gnat_to_gnu (Name (gnat_node
));
2522 TREE_USED (gnu_expr
) = 1;
2523 set_lineno (gnat_node
, 1);
2524 expand_goto (gnu_expr
);
2527 /****************************/
2528 /* Chapter 6: Subprograms: */
2529 /****************************/
2531 case N_Subprogram_Declaration
:
2532 /* Unless there is a freeze node, declare the subprogram. We consider
2533 this a "definition" even though we're not generating code for
2534 the subprogram because we will be making the corresponding GCC
2537 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node
)))))
2538 gnat_to_gnu_entity (Defining_Entity (Specification (gnat_node
)),
2543 case N_Abstract_Subprogram_Declaration
:
2544 /* This subprogram doesn't exist for code generation purposes, but we
2545 have to elaborate the types of any parameters, unless they are
2546 imported types (nothing to generate in this case). */
2548 = First_Formal (Defining_Entity (Specification (gnat_node
)));
2549 Present (gnat_temp
);
2550 gnat_temp
= Next_Formal_With_Extras (gnat_temp
))
2551 if (Is_Itype (Etype (gnat_temp
))
2552 && !From_With_Type (Etype (gnat_temp
)))
2553 gnat_to_gnu_entity (Etype (gnat_temp
), NULL_TREE
, 0);
2557 case N_Defining_Program_Unit_Name
:
2558 /* For a child unit identifier go up a level to get the
2559 specificaton. We get this when we try to find the spec of
2560 a child unit package that is the compilation unit being compiled. */
2561 gnat_to_code (Parent (gnat_node
));
2564 case N_Subprogram_Body
:
2566 /* Save debug output mode in case it is reset. */
2567 enum debug_info_type save_write_symbols
= write_symbols
;
2568 const struct gcc_debug_hooks
*const save_debug_hooks
= debug_hooks
;
2569 /* Definining identifier of a parameter to the subprogram. */
2570 Entity_Id gnat_param
;
2571 /* The defining identifier for the subprogram body. Note that if a
2572 specification has appeared before for this body, then the identifier
2573 occurring in that specification will also be a defining identifier
2574 and all the calls to this subprogram will point to that
2576 Entity_Id gnat_subprog_id
2577 = (Present (Corresponding_Spec (gnat_node
))
2578 ? Corresponding_Spec (gnat_node
) : Defining_Entity (gnat_node
));
2580 /* The FUNCTION_DECL node corresponding to the subprogram spec. */
2581 tree gnu_subprog_decl
;
2582 /* The FUNCTION_TYPE node corresponding to the subprogram spec. */
2583 tree gnu_subprog_type
;
2586 /* If this is a generic object or if it has been eliminated,
2589 if (Ekind (gnat_subprog_id
) == E_Generic_Procedure
2590 || Ekind (gnat_subprog_id
) == E_Generic_Function
2591 || Is_Eliminated (gnat_subprog_id
))
2594 /* If debug information is suppressed for the subprogram,
2595 turn debug mode off for the duration of processing. */
2596 if (Debug_Info_Off (gnat_subprog_id
))
2598 write_symbols
= NO_DEBUG
;
2599 debug_hooks
= &do_nothing_debug_hooks
;
2602 /* If this subprogram acts as its own spec, define it. Otherwise,
2603 just get the already-elaborated tree node. However, if this
2604 subprogram had its elaboration deferred, we will already have
2605 made a tree node for it. So treat it as not being defined in
2606 that case. Such a subprogram cannot have an address clause or
2607 a freeze node, so this test is safe, though it does disable
2608 some otherwise-useful error checking. */
2610 = gnat_to_gnu_entity (gnat_subprog_id
, NULL_TREE
,
2611 Acts_As_Spec (gnat_node
)
2612 && ! present_gnu_tree (gnat_subprog_id
));
2614 gnu_subprog_type
= TREE_TYPE (gnu_subprog_decl
);
2616 /* Set the line number in the decl to correspond to that of
2617 the body so that the line number notes are written
2619 set_lineno (gnat_node
, 0);
2620 DECL_SOURCE_FILE (gnu_subprog_decl
) = input_filename
;
2621 DECL_SOURCE_LINE (gnu_subprog_decl
) = lineno
;
2623 begin_subprog_body (gnu_subprog_decl
);
2624 set_lineno (gnat_node
, 1);
2627 gnu_block_stack
= tree_cons (NULL_TREE
, NULL_TREE
, gnu_block_stack
);
2628 expand_start_bindings (0);
2630 gnu_cico_list
= TYPE_CI_CO_LIST (gnu_subprog_type
);
2632 /* If there are OUT parameters, we need to ensure that the
2633 return statement properly copies them out. We do this by
2634 making a new block and converting any inner return into a goto
2635 to a label at the end of the block. */
2637 if (gnu_cico_list
!= 0)
2639 gnu_return_label_stack
2640 = tree_cons (NULL_TREE
,
2641 build_decl (LABEL_DECL
, NULL_TREE
, NULL_TREE
),
2642 gnu_return_label_stack
);
2644 expand_start_bindings (0);
2647 gnu_return_label_stack
2648 = tree_cons (NULL_TREE
, NULL_TREE
, gnu_return_label_stack
);
2650 /* See if there are any parameters for which we don't yet have
2651 GCC entities. These must be for OUT parameters for which we
2652 will be making VAR_DECL nodes here. Fill them in to
2653 TYPE_CI_CO_LIST, which must contain the empty entry as well.
2654 We can match up the entries because TYPE_CI_CO_LIST is in the
2655 order of the parameters. */
2657 for (gnat_param
= First_Formal (gnat_subprog_id
);
2658 Present (gnat_param
);
2659 gnat_param
= Next_Formal_With_Extras (gnat_param
))
2660 if (present_gnu_tree (gnat_param
))
2661 adjust_decl_rtl (get_gnu_tree (gnat_param
));
2664 /* Skip any entries that have been already filled in; they
2665 must correspond to IN OUT parameters. */
2666 for (; gnu_cico_list
!= 0 && TREE_VALUE (gnu_cico_list
) != 0;
2667 gnu_cico_list
= TREE_CHAIN (gnu_cico_list
))
2670 /* Do any needed references for padded types. */
2671 TREE_VALUE (gnu_cico_list
)
2672 = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_list
)),
2673 gnat_to_gnu_entity (gnat_param
, NULL_TREE
, 1));
2676 process_decls (Declarations (gnat_node
), Empty
, Empty
, 1, 1);
2678 /* Generate the code of the subprogram itself. A return statement
2679 will be present and any OUT parameters will be handled there. */
2680 gnat_to_code (Handled_Statement_Sequence (gnat_node
));
2682 expand_end_bindings (getdecls (), kept_level_p (), 0);
2683 poplevel (kept_level_p (), 1, 0);
2684 gnu_block_stack
= TREE_CHAIN (gnu_block_stack
);
2686 if (TREE_VALUE (gnu_return_label_stack
) != 0)
2690 expand_end_bindings (NULL_TREE
, kept_level_p (), 0);
2691 poplevel (kept_level_p (), 1, 0);
2692 expand_label (TREE_VALUE (gnu_return_label_stack
));
2694 gnu_cico_list
= TYPE_CI_CO_LIST (gnu_subprog_type
);
2695 set_lineno (gnat_node
, 1);
2696 if (list_length (gnu_cico_list
) == 1)
2697 gnu_retval
= TREE_VALUE (gnu_cico_list
);
2699 gnu_retval
= build_constructor (TREE_TYPE (gnu_subprog_type
),
2702 if (DECL_P (gnu_retval
) && DECL_BY_REF_P (gnu_retval
))
2704 = build_unary_op (INDIRECT_REF
, NULL_TREE
, gnu_retval
);
2707 (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
2708 DECL_RESULT (current_function_decl
),
2713 gnu_return_label_stack
= TREE_CHAIN (gnu_return_label_stack
);
2715 /* Disconnect the trees for parameters that we made variables for
2716 from the GNAT entities since these will become unusable after
2717 we end the function. */
2718 for (gnat_param
= First_Formal (gnat_subprog_id
);
2719 Present (gnat_param
);
2720 gnat_param
= Next_Formal_With_Extras (gnat_param
))
2721 if (TREE_CODE (get_gnu_tree (gnat_param
)) == VAR_DECL
)
2722 save_gnu_tree (gnat_param
, NULL_TREE
, 0);
2724 end_subprog_body ();
2725 mark_out_of_scope (Defining_Unit_Name (Specification (gnat_node
)));
2726 write_symbols
= save_write_symbols
;
2727 debug_hooks
= save_debug_hooks
;
2731 case N_Function_Call
:
2732 case N_Procedure_Call_Statement
:
2734 if (type_annotate_only
)
2738 /* The GCC node corresponding to the GNAT subprogram name. This can
2739 either be a FUNCTION_DECL node if we are dealing with a standard
2740 subprogram call, or an indirect reference expression (an
2741 INDIRECT_REF node) pointing to a subprogram. */
2742 tree gnu_subprog_node
= gnat_to_gnu (Name (gnat_node
));
2743 /* The FUNCTION_TYPE node giving the GCC type of the subprogram. */
2744 tree gnu_subprog_type
= TREE_TYPE (gnu_subprog_node
);
2745 tree gnu_subprog_addr
2746 = build_unary_op (ADDR_EXPR
, NULL_TREE
, gnu_subprog_node
);
2747 Entity_Id gnat_formal
;
2748 Node_Id gnat_actual
;
2749 tree gnu_actual_list
= NULL_TREE
;
2750 tree gnu_name_list
= NULL_TREE
;
2751 tree gnu_after_list
= NULL_TREE
;
2752 tree gnu_subprog_call
;
2754 switch (Nkind (Name (gnat_node
)))
2757 case N_Operator_Symbol
:
2758 case N_Expanded_Name
:
2759 case N_Attribute_Reference
:
2760 if (Is_Eliminated (Entity (Name (gnat_node
))))
2761 post_error_ne ("cannot call eliminated subprogram &!",
2762 gnat_node
, Entity (Name (gnat_node
)));
2765 if (TREE_CODE (gnu_subprog_type
) != FUNCTION_TYPE
)
2768 /* If we are calling a stubbed function, make this into a
2769 raise of Program_Error. Elaborate all our args first. */
2771 if (TREE_CODE (gnu_subprog_node
) == FUNCTION_DECL
2772 && DECL_STUBBED_P (gnu_subprog_node
))
2774 for (gnat_actual
= First_Actual (gnat_node
);
2775 Present (gnat_actual
);
2776 gnat_actual
= Next_Actual (gnat_actual
))
2777 expand_expr_stmt (gnat_to_gnu (gnat_actual
));
2779 if (Nkind (gnat_node
) == N_Function_Call
)
2781 gnu_result_type
= TREE_TYPE (gnu_subprog_type
);
2783 = build1 (NULL_EXPR
, gnu_result_type
,
2784 build_call_raise (PE_Stubbed_Subprogram_Called
));
2788 (build_call_raise (PE_Stubbed_Subprogram_Called
));
2792 /* The only way we can be making a call via an access type is
2793 if Name is an explicit dereference. In that case, get the
2794 list of formal args from the type the access type is pointing
2795 to. Otherwise, get the formals from entity being called. */
2796 if (Nkind (Name (gnat_node
)) == N_Explicit_Dereference
)
2797 gnat_formal
= First_Formal (Etype (Name (gnat_node
)));
2798 else if (Nkind (Name (gnat_node
)) == N_Attribute_Reference
)
2799 /* Assume here that this must be 'Elab_Body or 'Elab_Spec. */
2802 gnat_formal
= First_Formal (Entity (Name (gnat_node
)));
2804 /* Create the list of the actual parameters as GCC expects it, namely
2805 a chain of TREE_LIST nodes in which the TREE_VALUE field of each
2806 node is a parameter-expression and the TREE_PURPOSE field is
2807 null. Skip OUT parameters that are not passed by reference. */
2809 for (gnat_actual
= First_Actual (gnat_node
);
2810 Present (gnat_actual
);
2811 gnat_formal
= Next_Formal_With_Extras (gnat_formal
),
2812 gnat_actual
= Next_Actual (gnat_actual
))
2814 tree gnu_formal_type
= gnat_to_gnu_type (Etype (gnat_formal
));
2816 = ((Nkind (gnat_actual
) == N_Unchecked_Type_Conversion
)
2817 ? Expression (gnat_actual
) : gnat_actual
);
2818 tree gnu_name
= gnat_to_gnu (gnat_name
);
2819 tree gnu_name_type
= gnat_to_gnu_type (Etype (gnat_name
));
2822 /* If it's possible we may need to use this expression twice,
2823 make sure than any side-effects are handled via SAVE_EXPRs.
2824 Likewise if we need to force side-effects before the call.
2825 ??? This is more conservative than we need since we don't
2826 need to do this for pass-by-ref with no conversion.
2827 If we are passing a non-addressable Out or In Out parameter by
2828 reference, pass the address of a copy and set up to copy back
2829 out after the call. */
2831 if (Ekind (gnat_formal
) != E_In_Parameter
)
2833 gnu_name
= gnat_stabilize_reference (gnu_name
, 1);
2834 if (! addressable_p (gnu_name
)
2835 && present_gnu_tree (gnat_formal
)
2836 && (DECL_BY_REF_P (get_gnu_tree (gnat_formal
))
2837 || DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal
))
2838 || DECL_BY_DESCRIPTOR_P (get_gnu_tree (gnat_formal
))))
2840 tree gnu_copy
= gnu_name
;
2842 /* Remove any unpadding on the actual and make a copy.
2843 But if the actual is a left-justified modular type,
2844 first convert to it. */
2845 if (TREE_CODE (gnu_name
) == COMPONENT_REF
2846 && (TYPE_IS_PADDING_P
2847 (TREE_TYPE (TREE_OPERAND (gnu_name
, 0)))))
2848 gnu_name
= gnu_copy
= TREE_OPERAND (gnu_name
, 0);
2849 else if (TREE_CODE (gnu_name_type
) == RECORD_TYPE
2850 && (TYPE_LEFT_JUSTIFIED_MODULAR_P
2852 gnu_name
= convert (gnu_name_type
, gnu_name
);
2854 gnu_actual
= save_expr (gnu_name
);
2856 /* Set up to move the copy back to the original. */
2857 gnu_after_list
= tree_cons (gnu_copy
, gnu_actual
,
2860 gnu_name
= gnu_actual
;
2864 /* If this was a procedure call, we may not have removed any
2865 padding. So do it here for the part we will use as an
2867 gnu_actual
= gnu_name
;
2868 if (Ekind (gnat_formal
) != E_Out_Parameter
2869 && TREE_CODE (TREE_TYPE (gnu_actual
)) == RECORD_TYPE
2870 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual
)))
2871 gnu_actual
= convert (get_unpadded_type (Etype (gnat_actual
)),
2874 if (Ekind (gnat_formal
) != E_Out_Parameter
2875 && Nkind (gnat_actual
) != N_Unchecked_Type_Conversion
2876 && Do_Range_Check (gnat_actual
))
2877 gnu_actual
= emit_range_check (gnu_actual
, Etype (gnat_formal
));
2879 /* Do any needed conversions. We need only check for
2880 unchecked conversion since normal conversions will be handled
2881 by just converting to the formal type. */
2882 if (Nkind (gnat_actual
) == N_Unchecked_Type_Conversion
)
2885 = unchecked_convert (gnat_to_gnu_type (Etype (gnat_actual
)),
2888 /* One we've done the unchecked conversion, we still
2889 must ensure that the object is in range of the formal's
2891 if (Ekind (gnat_formal
) != E_Out_Parameter
2892 && Do_Range_Check (gnat_actual
))
2893 gnu_actual
= emit_range_check (gnu_actual
,
2894 Etype (gnat_formal
));
2897 /* We may have suppressed a conversion to the Etype of the
2898 actual since the parent is a procedure call. So add the
2900 gnu_actual
= convert (gnat_to_gnu_type (Etype (gnat_actual
)),
2903 gnu_actual
= convert (gnu_formal_type
, gnu_actual
);
2905 /* If we have not saved a GCC object for the formal, it means
2906 it is an OUT parameter not passed by reference. Otherwise,
2907 look at the PARM_DECL to see if it is passed by reference. */
2908 if (present_gnu_tree (gnat_formal
)
2909 && TREE_CODE (get_gnu_tree (gnat_formal
)) == PARM_DECL
2910 && DECL_BY_REF_P (get_gnu_tree (gnat_formal
)))
2912 if (Ekind (gnat_formal
) != E_In_Parameter
)
2914 gnu_actual
= gnu_name
;
2916 /* If we have a padded type, be sure we've removed the
2918 if (TREE_CODE (TREE_TYPE (gnu_actual
)) == RECORD_TYPE
2919 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual
)))
2921 = convert (get_unpadded_type (Etype (gnat_actual
)),
2925 /* The symmetry of the paths to the type of an entity is
2926 broken here since arguments don't know that they will
2927 be passed by ref. */
2928 gnu_formal_type
= TREE_TYPE (get_gnu_tree (gnat_formal
));
2929 gnu_actual
= build_unary_op (ADDR_EXPR
, gnu_formal_type
,
2932 else if (present_gnu_tree (gnat_formal
)
2933 && TREE_CODE (get_gnu_tree (gnat_formal
)) == PARM_DECL
2934 && DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal
)))
2936 gnu_formal_type
= TREE_TYPE (get_gnu_tree (gnat_formal
));
2937 gnu_actual
= maybe_implicit_deref (gnu_actual
);
2938 gnu_actual
= maybe_unconstrained_array (gnu_actual
);
2940 if (TREE_CODE (gnu_formal_type
) == RECORD_TYPE
2941 && TYPE_IS_PADDING_P (gnu_formal_type
))
2944 = TREE_TYPE (TYPE_FIELDS (gnu_formal_type
));
2945 gnu_actual
= convert (gnu_formal_type
, gnu_actual
);
2948 /* Take the address of the object and convert to the
2949 proper pointer type. We'd like to actually compute
2950 the address of the beginning of the array using
2951 an ADDR_EXPR of an ARRAY_REF, but there's a possibility
2952 that the ARRAY_REF might return a constant and we'd
2953 be getting the wrong address. Neither approach is
2954 exactly correct, but this is the most likely to work
2956 gnu_actual
= convert (gnu_formal_type
,
2957 build_unary_op (ADDR_EXPR
, NULL_TREE
,
2960 else if (present_gnu_tree (gnat_formal
)
2961 && TREE_CODE (get_gnu_tree (gnat_formal
)) == PARM_DECL
2962 && DECL_BY_DESCRIPTOR_P (get_gnu_tree (gnat_formal
)))
2964 /* If arg is 'Null_Parameter, pass zero descriptor. */
2965 if ((TREE_CODE (gnu_actual
) == INDIRECT_REF
2966 || TREE_CODE (gnu_actual
) == UNCONSTRAINED_ARRAY_REF
)
2967 && TREE_PRIVATE (gnu_actual
))
2969 = convert (DECL_ARG_TYPE (get_gnu_tree (gnat_formal
)),
2973 = build_unary_op (ADDR_EXPR
, NULL_TREE
,
2974 fill_vms_descriptor (gnu_actual
,
2979 tree gnu_actual_size
= TYPE_SIZE (TREE_TYPE (gnu_actual
));
2981 if (Ekind (gnat_formal
) != E_In_Parameter
)
2983 = chainon (gnu_name_list
,
2984 build_tree_list (NULL_TREE
, gnu_name
));
2986 if (! present_gnu_tree (gnat_formal
)
2987 || TREE_CODE (get_gnu_tree (gnat_formal
)) != PARM_DECL
)
2990 /* If this is 'Null_Parameter, pass a zero even though we are
2991 dereferencing it. */
2992 else if (TREE_CODE (gnu_actual
) == INDIRECT_REF
2993 && TREE_PRIVATE (gnu_actual
)
2994 && host_integerp (gnu_actual_size
, 1)
2995 && 0 >= compare_tree_int (gnu_actual_size
,
2999 (DECL_ARG_TYPE (get_gnu_tree (gnat_formal
)),
3000 convert (gnat_type_for_size
3001 (tree_low_cst (gnu_actual_size
, 1), 1),
3002 integer_zero_node
));
3005 = convert (TYPE_MAIN_VARIANT
3006 (DECL_ARG_TYPE (get_gnu_tree (gnat_formal
))),
3011 = chainon (gnu_actual_list
,
3012 build_tree_list (NULL_TREE
, gnu_actual
));
3015 gnu_subprog_call
= build (CALL_EXPR
, TREE_TYPE (gnu_subprog_type
),
3016 gnu_subprog_addr
, gnu_actual_list
,
3018 TREE_SIDE_EFFECTS (gnu_subprog_call
) = 1;
3020 /* If it is a function call, the result is the call expression. */
3021 if (Nkind (gnat_node
) == N_Function_Call
)
3023 gnu_result
= gnu_subprog_call
;
3025 /* If the function returns an unconstrained array or by reference,
3026 we have to de-dereference the pointer. */
3027 if (TYPE_RETURNS_UNCONSTRAINED_P (gnu_subprog_type
)
3028 || TYPE_RETURNS_BY_REF_P (gnu_subprog_type
))
3029 gnu_result
= build_unary_op (INDIRECT_REF
, NULL_TREE
,
3032 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
3035 /* If this is the case where the GNAT tree contains a procedure call
3036 but the Ada procedure has copy in copy out parameters, the special
3037 parameter passing mechanism must be used. */
3038 else if (TYPE_CI_CO_LIST (gnu_subprog_type
) != NULL_TREE
)
3040 /* List of FIELD_DECLs associated with the PARM_DECLs of the copy
3041 in copy out parameters. */
3042 tree scalar_return_list
= TYPE_CI_CO_LIST (gnu_subprog_type
);
3043 int length
= list_length (scalar_return_list
);
3049 gnu_subprog_call
= protect_multiple_eval (gnu_subprog_call
);
3051 /* If any of the names had side-effects, ensure they are
3052 all evaluated before the call. */
3053 for (gnu_name
= gnu_name_list
; gnu_name
;
3054 gnu_name
= TREE_CHAIN (gnu_name
))
3055 if (TREE_SIDE_EFFECTS (TREE_VALUE (gnu_name
)))
3057 = build (COMPOUND_EXPR
, TREE_TYPE (gnu_subprog_call
),
3058 TREE_VALUE (gnu_name
), gnu_subprog_call
);
3061 if (Nkind (Name (gnat_node
)) == N_Explicit_Dereference
)
3062 gnat_formal
= First_Formal (Etype (Name (gnat_node
)));
3064 gnat_formal
= First_Formal (Entity (Name (gnat_node
)));
3066 for (gnat_actual
= First_Actual (gnat_node
);
3067 Present (gnat_actual
);
3068 gnat_formal
= Next_Formal_With_Extras (gnat_formal
),
3069 gnat_actual
= Next_Actual (gnat_actual
))
3070 /* If we are dealing with a copy in copy out parameter, we must
3071 retrieve its value from the record returned in the function
3073 if (! (present_gnu_tree (gnat_formal
)
3074 && TREE_CODE (get_gnu_tree (gnat_formal
)) == PARM_DECL
3075 && (DECL_BY_REF_P (get_gnu_tree (gnat_formal
))
3076 || (DECL_BY_COMPONENT_PTR_P
3077 (get_gnu_tree (gnat_formal
)))
3078 || DECL_BY_DESCRIPTOR_P (get_gnu_tree (gnat_formal
))))
3079 && Ekind (gnat_formal
) != E_In_Parameter
)
3081 /* Get the value to assign to this OUT or IN OUT
3082 parameter. It is either the result of the function if
3083 there is only a single such parameter or the appropriate
3084 field from the record returned. */
3086 = length
== 1 ? gnu_subprog_call
3087 : build_component_ref
3088 (gnu_subprog_call
, NULL_TREE
,
3089 TREE_PURPOSE (scalar_return_list
));
3090 int unchecked_conversion
3091 = Nkind (gnat_actual
) == N_Unchecked_Type_Conversion
;
3092 /* If the actual is a conversion, get the inner expression,
3093 which will be the real destination, and convert the
3094 result to the type of the actual parameter. */
3096 = maybe_unconstrained_array (TREE_VALUE (gnu_name_list
));
3098 /* If the result is a padded type, remove the padding. */
3099 if (TREE_CODE (TREE_TYPE (gnu_result
)) == RECORD_TYPE
3100 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result
)))
3102 = convert (TREE_TYPE (TYPE_FIELDS
3103 (TREE_TYPE (gnu_result
))),
3106 /* If the result is a type conversion, do it. */
3107 if (Nkind (gnat_actual
) == N_Type_Conversion
)
3109 = convert_with_check
3110 (Etype (Expression (gnat_actual
)), gnu_result
,
3111 Do_Overflow_Check (gnat_actual
),
3112 Do_Range_Check (Expression (gnat_actual
)),
3113 Float_Truncate (gnat_actual
));
3115 else if (unchecked_conversion
)
3117 = unchecked_convert (TREE_TYPE (gnu_actual
), gnu_result
);
3120 if (Do_Range_Check (gnat_actual
))
3121 gnu_result
= emit_range_check (gnu_result
,
3122 Etype (gnat_actual
));
3124 if (! (! TREE_CONSTANT (TYPE_SIZE
3125 (TREE_TYPE (gnu_actual
)))
3126 && TREE_CONSTANT (TYPE_SIZE
3127 (TREE_TYPE (gnu_result
)))))
3128 gnu_result
= convert (TREE_TYPE (gnu_actual
),
3132 set_lineno (gnat_node
, 1);
3133 expand_expr_stmt (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
3134 gnu_actual
, gnu_result
));
3135 scalar_return_list
= TREE_CHAIN (scalar_return_list
);
3136 gnu_name_list
= TREE_CHAIN (gnu_name_list
);
3141 set_lineno (gnat_node
, 1);
3142 expand_expr_stmt (gnu_subprog_call
);
3145 /* Handle anything we need to assign back. */
3146 for (gnu_expr
= gnu_after_list
;
3148 gnu_expr
= TREE_CHAIN (gnu_expr
))
3149 expand_expr_stmt (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
3150 TREE_PURPOSE (gnu_expr
),
3151 TREE_VALUE (gnu_expr
)));
3155 /*************************/
3156 /* Chapter 7: Packages: */
3157 /*************************/
3159 case N_Package_Declaration
:
3160 gnat_to_code (Specification (gnat_node
));
3163 case N_Package_Specification
:
3165 process_decls (Visible_Declarations (gnat_node
),
3166 Private_Declarations (gnat_node
), Empty
, 1, 1);
3169 case N_Package_Body
:
3171 /* If this is the body of a generic package - do nothing */
3172 if (Ekind (Corresponding_Spec (gnat_node
)) == E_Generic_Package
)
3175 process_decls (Declarations (gnat_node
), Empty
, Empty
, 1, 1);
3177 if (Present (Handled_Statement_Sequence (gnat_node
)))
3179 gnu_block_stack
= tree_cons (NULL_TREE
, NULL_TREE
, gnu_block_stack
);
3180 gnat_to_code (Handled_Statement_Sequence (gnat_node
));
3181 gnu_block_stack
= TREE_CHAIN (gnu_block_stack
);
3185 /*********************************/
3186 /* Chapter 8: Visibility Rules: */
3187 /*********************************/
3189 case N_Use_Package_Clause
:
3190 case N_Use_Type_Clause
:
3191 /* Nothing to do here - but these may appear in list of declarations */
3194 /***********************/
3195 /* Chapter 9: Tasks: */
3196 /***********************/
3198 case N_Protected_Type_Declaration
:
3201 case N_Single_Task_Declaration
:
3202 gnat_to_gnu_entity (Defining_Entity (gnat_node
), NULL_TREE
, 1);
3205 /***********************************************************/
3206 /* Chapter 10: Program Structure and Compilation Issues: */
3207 /***********************************************************/
3209 case N_Compilation_Unit
:
3211 /* For a body, first process the spec if there is one. */
3212 if (Nkind (Unit (gnat_node
)) == N_Package_Body
3213 || (Nkind (Unit (gnat_node
)) == N_Subprogram_Body
3214 && ! Acts_As_Spec (gnat_node
)))
3215 gnat_to_code (Library_Unit (gnat_node
));
3217 process_inlined_subprograms (gnat_node
);
3219 if (type_annotate_only
&& gnat_node
== Cunit (Main_Unit
))
3221 elaborate_all_entities (gnat_node
);
3223 if (Nkind (Unit (gnat_node
)) == N_Subprogram_Declaration
3224 || Nkind (Unit (gnat_node
)) == N_Generic_Package_Declaration
3225 || Nkind (Unit (gnat_node
)) == N_Generic_Subprogram_Declaration
)
3229 process_decls (Declarations (Aux_Decls_Node (gnat_node
)),
3230 Empty
, Empty
, 1, 1);
3232 gnat_to_code (Unit (gnat_node
));
3234 /* Process any pragmas following the unit. */
3235 if (Present (Pragmas_After (Aux_Decls_Node (gnat_node
))))
3236 for (gnat_temp
= First (Pragmas_After (Aux_Decls_Node (gnat_node
)));
3237 gnat_temp
; gnat_temp
= Next (gnat_temp
))
3238 gnat_to_code (gnat_temp
);
3240 /* Put all the Actions into the elaboration routine if we already had
3241 elaborations. This will happen anyway if they are statements, but we
3242 want to force declarations there too due to order-of-elaboration
3243 issues. Most should have Is_Statically_Allocated set. If we
3244 have had no elaborations, we have no order-of-elaboration issue and
3245 don't want to create elaborations here. */
3246 if (Is_Non_Empty_List (Actions (Aux_Decls_Node (gnat_node
))))
3247 for (gnat_temp
= First (Actions (Aux_Decls_Node (gnat_node
)));
3248 Present (gnat_temp
); gnat_temp
= Next (gnat_temp
))
3250 if (pending_elaborations_p ())
3251 add_pending_elaborations (NULL_TREE
,
3252 make_transform_expr (gnat_temp
));
3254 gnat_to_code (gnat_temp
);
3257 /* Generate elaboration code for this unit, if necessary, and
3258 say whether we did or not. */
3259 Set_Has_No_Elaboration_Code
3262 (Defining_Entity (Unit (gnat_node
)),
3263 Nkind (Unit (gnat_node
)) == N_Package_Body
3264 || Nkind (Unit (gnat_node
)) == N_Subprogram_Body
,
3265 get_pending_elaborations ()));
3269 case N_Subprogram_Body_Stub
:
3270 case N_Package_Body_Stub
:
3271 case N_Protected_Body_Stub
:
3272 case N_Task_Body_Stub
:
3273 /* Simply process whatever unit is being inserted. */
3274 gnat_to_code (Unit (Library_Unit (gnat_node
)));
3278 gnat_to_code (Proper_Body (gnat_node
));
3281 /***************************/
3282 /* Chapter 11: Exceptions: */
3283 /***************************/
3285 case N_Handled_Sequence_Of_Statements
:
3287 /* The GCC exception handling mechanism can handle both ZCX and SJLJ
3288 schemes and we have our own SJLJ mechanism. To call the GCC
3289 mechanism, we first call expand_eh_region_start if there is at least
3290 one handler associated with the region. We then generate code for
3291 the region and call expand_start_all_catch to announce that the
3292 associated handlers are going to be generated.
3294 For each handler we call expand_start_catch, generate code for the
3295 handler, and then call expand_end_catch.
3297 After all the handlers, we call expand_end_all_catch.
3299 Here we deal with the region level calls and the
3300 N_Exception_Handler branch deals with the handler level calls
3301 (start_catch/end_catch).
3303 ??? The region level calls down there have been specifically put in
3304 place for a ZCX context and currently the order in which things are
3305 emitted (region/handlers) is different from the SJLJ case. Instead of
3306 putting other calls with different conditions at other places for the
3307 SJLJ case, it seems cleaner to reorder things for the SJLJ case and
3308 generalize the condition to make it not ZCX specific. */
3310 /* Tell the back-end we are starting a new exception region if
3312 if (! type_annotate_only
3313 && Exception_Mechanism
== GCC_ZCX
3314 && Present (Exception_Handlers (gnat_node
)))
3315 expand_eh_region_start ();
3317 /* If there are exception handlers, start a new binding level that
3318 we can exit (since each exception handler will do so). Then
3319 declare a variable to save the old __gnat_jmpbuf value and a
3320 variable for our jmpbuf. Call setjmp and handle each of the
3321 possible exceptions if it returns one. */
3323 if (! type_annotate_only
&& Present (Exception_Handlers (gnat_node
)))
3325 tree gnu_jmpsave_decl
= 0;
3326 tree gnu_jmpbuf_decl
= 0;
3327 tree gnu_cleanup_call
= 0;
3328 tree gnu_cleanup_decl
;
3331 expand_start_bindings (1);
3333 if (Exception_Mechanism
== Setjmp_Longjmp
)
3336 = create_var_decl (get_identifier ("JMPBUF_SAVE"), NULL_TREE
,
3338 build_call_0_expr (get_jmpbuf_decl
),
3341 gnu_jmpbuf_decl
= create_var_decl (get_identifier ("JMP_BUF"),
3342 NULL_TREE
, jmpbuf_type
,
3343 NULL_TREE
, 0, 0, 0, 0,
3345 TREE_VALUE (gnu_block_stack
) = gnu_jmpbuf_decl
;
3348 /* See if we are to call a function when exiting this block. */
3349 if (Present (At_End_Proc (gnat_node
)))
3352 = build_call_0_expr (gnat_to_gnu (At_End_Proc (gnat_node
)));
3355 = create_var_decl (get_identifier ("CLEANUP"), NULL_TREE
,
3356 integer_type_node
, NULL_TREE
, 0, 0, 0, 0,
3359 expand_decl_cleanup (gnu_cleanup_decl
, gnu_cleanup_call
);
3362 if (Exception_Mechanism
== Setjmp_Longjmp
)
3364 /* When we exit this block, restore the saved value. */
3365 expand_decl_cleanup (gnu_jmpsave_decl
,
3366 build_call_1_expr (set_jmpbuf_decl
,
3369 /* Call setjmp and handle exceptions if it returns one. */
3370 set_lineno (gnat_node
, 1);
3372 (build_call_1_expr (setjmp_decl
,
3373 build_unary_op (ADDR_EXPR
, NULL_TREE
,
3377 /* Restore our incoming longjmp value before we do anything. */
3378 expand_expr_stmt (build_call_1_expr (set_jmpbuf_decl
,
3382 expand_start_bindings (0);
3384 gnu_except_ptr_stack
3385 = tree_cons (NULL_TREE
,
3387 (get_identifier ("EXCEPT_PTR"), NULL_TREE
,
3388 build_pointer_type (except_type_node
),
3389 build_call_0_expr (get_excptr_decl
),
3391 gnu_except_ptr_stack
);
3393 /* Generate code for each exception handler. The code at
3394 N_Exception_Handler below does the real work. Note that
3395 we ignore the dummy exception handler for the identifier
3396 case, this is used only by the front end */
3397 if (Present (Exception_Handlers (gnat_node
)))
3399 = First_Non_Pragma (Exception_Handlers (gnat_node
));
3400 Present (gnat_temp
);
3401 gnat_temp
= Next_Non_Pragma (gnat_temp
))
3402 gnat_to_code (gnat_temp
);
3404 /* If none of the exception handlers did anything, re-raise
3405 but do not defer abortion. */
3406 set_lineno (gnat_node
, 1);
3408 (build_call_1_expr (raise_nodefer_decl
,
3409 TREE_VALUE (gnu_except_ptr_stack
)));
3411 gnu_except_ptr_stack
= TREE_CHAIN (gnu_except_ptr_stack
);
3412 expand_end_bindings (getdecls (), kept_level_p (), 0);
3413 poplevel (kept_level_p (), 1, 0);
3415 /* End the "if" on setjmp. Note that we have arranged things so
3416 control never returns here. */
3419 /* This is now immediately before the body proper. Set
3420 our jmp_buf as the current buffer. */
3422 (build_call_1_expr (set_jmpbuf_decl
,
3423 build_unary_op (ADDR_EXPR
, NULL_TREE
,
3428 /* If there are no exception handlers, we must not have an at end
3429 cleanup identifier, since the cleanup identifier should always
3430 generate a corresponding exception handler, except in the case
3431 of the No_Exception_Handlers restriction, where the front-end
3432 does not generate exception handlers. */
3433 else if (! type_annotate_only
&& Present (At_End_Proc (gnat_node
)))
3435 if (No_Exception_Handlers_Set ())
3437 tree gnu_cleanup_call
= 0;
3438 tree gnu_cleanup_decl
;
3441 = build_call_0_expr (gnat_to_gnu (At_End_Proc (gnat_node
)));
3444 = create_var_decl (get_identifier ("CLEANUP"), NULL_TREE
,
3445 integer_type_node
, NULL_TREE
, 0, 0, 0, 0,
3448 expand_decl_cleanup (gnu_cleanup_decl
, gnu_cleanup_call
);
3454 /* Generate code and declarations for the prefix of this block,
3456 if (Present (First_Real_Statement (gnat_node
)))
3457 process_decls (Statements (gnat_node
), Empty
,
3458 First_Real_Statement (gnat_node
), 1, 1);
3460 /* Generate code for each statement in the block. */
3461 for (gnat_temp
= (Present (First_Real_Statement (gnat_node
))
3462 ? First_Real_Statement (gnat_node
)
3463 : First (Statements (gnat_node
)));
3464 Present (gnat_temp
); gnat_temp
= Next (gnat_temp
))
3465 gnat_to_code (gnat_temp
);
3467 /* Tell the back-end we are ending the new exception region and
3468 starting the associated handlers. */
3469 if (! type_annotate_only
3470 && Exception_Mechanism
== GCC_ZCX
3471 && Present (Exception_Handlers (gnat_node
)))
3472 expand_start_all_catch ();
3474 /* For zero-cost exceptions, exit the block and then compile
3476 if (! type_annotate_only
3477 && Exception_Mechanism
== GCC_ZCX
3478 && Present (Exception_Handlers (gnat_node
)))
3480 expand_exit_something ();
3481 for (gnat_temp
= First_Non_Pragma (Exception_Handlers (gnat_node
));
3482 Present (gnat_temp
);
3483 gnat_temp
= Next_Non_Pragma (gnat_temp
))
3484 gnat_to_code (gnat_temp
);
3487 /* We don't support Front_End_ZCX in GNAT 5.0, but we don't want to
3488 crash if -gnatdX is specified. */
3489 if (! type_annotate_only
3490 && Exception_Mechanism
== Front_End_ZCX
3491 && Present (Exception_Handlers (gnat_node
)))
3493 for (gnat_temp
= First_Non_Pragma (Exception_Handlers (gnat_node
));
3494 Present (gnat_temp
);
3495 gnat_temp
= Next_Non_Pragma (gnat_temp
))
3496 gnat_to_code (gnat_temp
);
3499 /* Tell the backend when we are done with the handlers. */
3500 if (! type_annotate_only
3501 && Exception_Mechanism
== GCC_ZCX
3502 && Present (Exception_Handlers (gnat_node
)))
3503 expand_end_all_catch ();
3505 /* If we have handlers, close the block we made. */
3506 if (! type_annotate_only
&& Present (Exception_Handlers (gnat_node
)))
3508 expand_end_bindings (getdecls (), kept_level_p (), 0);
3509 poplevel (kept_level_p (), 1, 0);
3514 case N_Exception_Handler
:
3515 if (Exception_Mechanism
== Setjmp_Longjmp
)
3517 /* Unless this is "Others" or the special "Non-Ada" exception
3518 for Ada, make an "if" statement to select the proper
3519 exceptions. For "Others", exclude exceptions where
3520 Handled_By_Others is nonzero unless the All_Others flag is set.
3521 For "Non-ada", accept an exception if "Lang" is 'V'. */
3522 tree gnu_choice
= integer_zero_node
;
3524 for (gnat_temp
= First (Exception_Choices (gnat_node
));
3525 gnat_temp
; gnat_temp
= Next (gnat_temp
))
3529 if (Nkind (gnat_temp
) == N_Others_Choice
)
3531 if (All_Others (gnat_temp
))
3532 this_choice
= integer_one_node
;
3536 (EQ_EXPR
, integer_type_node
,
3541 (INDIRECT_REF
, NULL_TREE
,
3542 TREE_VALUE (gnu_except_ptr_stack
)),
3543 get_identifier ("not_handled_by_others"), NULL_TREE
)),
3547 else if (Nkind (gnat_temp
) == N_Identifier
3548 || Nkind (gnat_temp
) == N_Expanded_Name
)
3550 /* ??? Note that we have to use gnat_to_gnu_entity here
3551 since the type of the exception will be wrong in the
3552 VMS case and that's exactly what this test is for. */
3554 = gnat_to_gnu_entity (Entity (gnat_temp
), NULL_TREE
, 0);
3556 /* If this was a VMS exception, check import_code
3557 against the value of the exception. */
3558 if (TREE_CODE (TREE_TYPE (gnu_expr
)) == INTEGER_TYPE
)
3561 (EQ_EXPR
, integer_type_node
,
3564 (INDIRECT_REF
, NULL_TREE
,
3565 TREE_VALUE (gnu_except_ptr_stack
)),
3566 get_identifier ("import_code"), NULL_TREE
),
3571 (EQ_EXPR
, integer_type_node
,
3572 TREE_VALUE (gnu_except_ptr_stack
),
3574 (TREE_TYPE (TREE_VALUE (gnu_except_ptr_stack
)),
3575 build_unary_op (ADDR_EXPR
, NULL_TREE
, gnu_expr
)));
3577 /* If this is the distinguished exception "Non_Ada_Error"
3578 (and we are in VMS mode), also allow a non-Ada
3579 exception (a VMS condition) to match. */
3580 if (Is_Non_Ada_Error (Entity (gnat_temp
)))
3583 = build_component_ref
3585 (INDIRECT_REF
, NULL_TREE
,
3586 TREE_VALUE (gnu_except_ptr_stack
)),
3587 get_identifier ("lang"), NULL_TREE
);
3591 (TRUTH_ORIF_EXPR
, integer_type_node
,
3593 (EQ_EXPR
, integer_type_node
, gnu_comp
,
3594 convert (TREE_TYPE (gnu_comp
),
3595 build_int_2 ('V', 0))),
3602 gnu_choice
= build_binary_op (TRUTH_ORIF_EXPR
, integer_type_node
,
3603 gnu_choice
, this_choice
);
3606 set_lineno (gnat_node
, 1);
3608 expand_start_cond (gnu_choice
, 0);
3611 /* Tell the back end that we start an exception handler if necessary. */
3612 if (Exception_Mechanism
== GCC_ZCX
)
3614 /* We build a TREE_LIST of nodes representing what exception
3615 types this handler is able to catch, with special cases
3616 for others and all others cases.
3618 Each exception type is actually identified by a pointer to the
3619 exception id, with special value zero for "others" and one for
3620 "all others". Beware that these special values are known and used
3621 by the personality routine to identify the corresponding specific
3624 ??? For initial time frame reasons, the others and all_others
3625 cases have been handled using specific type trees, but this
3626 somehow hides information to the back-end, which expects NULL to
3627 be passed for catch all and end_cleanup to be used for cleanups.
3629 Care should be taken to ensure that the control flow impact of
3630 such clauses is rendered in some way. lang_eh_type_covers is
3631 doing the trick currently.
3633 ??? Should investigate the possible usage of the end_cleanup
3634 interface in this context. */
3636 tree gnu_expr
, gnu_etype
;
3637 tree gnu_etypes_list
= NULL_TREE
;
3639 for (gnat_temp
= First (Exception_Choices (gnat_node
));
3640 gnat_temp
; gnat_temp
= Next (gnat_temp
))
3642 if (Nkind (gnat_temp
) == N_Others_Choice
)
3644 = All_Others (gnat_temp
) ? integer_one_node
3645 : integer_zero_node
;
3646 else if (Nkind (gnat_temp
) == N_Identifier
3647 || Nkind (gnat_temp
) == N_Expanded_Name
)
3649 gnu_expr
= gnat_to_gnu_entity (Entity (gnat_temp
),
3651 gnu_etype
= build_unary_op (ADDR_EXPR
, NULL_TREE
, gnu_expr
);
3657 = tree_cons (NULL_TREE
, gnu_etype
, gnu_etypes_list
);
3659 /* The GCC interface expects NULL to be passed for catch all
3660 handlers, so the approach below is quite tempting :
3662 if (gnu_etype == integer_zero_node)
3663 gnu_etypes_list = NULL;
3665 It would not work, however, because GCC's notion
3666 of "catch all" is stronger than our notion of "others".
3668 Until we correctly use the cleanup interface as well, the
3669 two lines above will prevent the "all others" handlers from
3670 beeing seen, because nothing can be caught beyond a catch
3671 all from GCC's point of view. */
3674 expand_start_catch (gnu_etypes_list
);
3677 for (gnat_temp
= First (Statements (gnat_node
));
3678 gnat_temp
; gnat_temp
= Next (gnat_temp
))
3679 gnat_to_code (gnat_temp
);
3681 /* At the end of the handler, exit the block. We made this block
3682 in N_Handled_Sequence_Of_Statements. */
3683 expand_exit_something ();
3685 /* Tell the back end that we're done with the current handler. */
3686 if (Exception_Mechanism
== GCC_ZCX
)
3687 expand_end_catch ();
3688 else if (Exception_Mechanism
== Setjmp_Longjmp
)
3693 /*******************************/
3694 /* Chapter 12: Generic Units: */
3695 /*******************************/
3697 case N_Generic_Function_Renaming_Declaration
:
3698 case N_Generic_Package_Renaming_Declaration
:
3699 case N_Generic_Procedure_Renaming_Declaration
:
3700 case N_Generic_Package_Declaration
:
3701 case N_Generic_Subprogram_Declaration
:
3702 case N_Package_Instantiation
:
3703 case N_Procedure_Instantiation
:
3704 case N_Function_Instantiation
:
3705 /* These nodes can appear on a declaration list but there is nothing to
3706 to be done with them. */
3709 /***************************************************/
3710 /* Chapter 13: Representation Clauses and */
3711 /* Implementation-Dependent Features: */
3712 /***************************************************/
3714 case N_Attribute_Definition_Clause
:
3716 /* The only one we need deal with is for 'Address. For the others, SEM
3717 puts the information elsewhere. We need only deal with 'Address
3718 if the object has a Freeze_Node (which it never will currently). */
3719 if (Get_Attribute_Id (Chars (gnat_node
)) != Attr_Address
3720 || No (Freeze_Node (Entity (Name (gnat_node
)))))
3723 /* Get the value to use as the address and save it as the
3724 equivalent for GNAT_TEMP. When the object is frozen,
3725 gnat_to_gnu_entity will do the right thing. */
3726 gnu_expr
= gnat_to_gnu (Expression (gnat_node
));
3727 save_gnu_tree (Entity (Name (gnat_node
)), gnu_expr
, 1);
3730 case N_Enumeration_Representation_Clause
:
3731 case N_Record_Representation_Clause
:
3733 /* We do nothing with these. SEM puts the information elsewhere. */
3736 case N_Code_Statement
:
3737 if (! type_annotate_only
)
3739 tree gnu_template
= gnat_to_gnu (Asm_Template (gnat_node
));
3740 tree gnu_input_list
= 0, gnu_output_list
= 0, gnu_orig_out_list
= 0;
3741 tree gnu_clobber_list
= 0;
3744 /* First process inputs, then outputs, then clobbers. */
3745 Setup_Asm_Inputs (gnat_node
);
3746 while (Present (gnat_temp
= Asm_Input_Value ()))
3748 tree gnu_value
= gnat_to_gnu (gnat_temp
);
3749 tree gnu_constr
= build_tree_list (NULL_TREE
, gnat_to_gnu
3750 (Asm_Input_Constraint ()));
3753 = tree_cons (gnu_constr
, gnu_value
, gnu_input_list
);
3757 Setup_Asm_Outputs (gnat_node
);
3758 while (Present (gnat_temp
= Asm_Output_Variable ()))
3760 tree gnu_value
= gnat_to_gnu (gnat_temp
);
3761 tree gnu_constr
= build_tree_list (NULL_TREE
, gnat_to_gnu
3762 (Asm_Output_Constraint ()));
3765 = tree_cons (gnu_constr
, gnu_value
, gnu_orig_out_list
);
3767 = tree_cons (gnu_constr
, gnu_value
, gnu_output_list
);
3771 Clobber_Setup (gnat_node
);
3772 while ((clobber
= Clobber_Get_Next ()) != 0)
3774 = tree_cons (NULL_TREE
,
3775 build_string (strlen (clobber
) + 1, clobber
),
3778 gnu_input_list
= nreverse (gnu_input_list
);
3779 gnu_output_list
= nreverse (gnu_output_list
);
3780 gnu_orig_out_list
= nreverse (gnu_orig_out_list
);
3781 expand_asm_operands (gnu_template
, gnu_output_list
, gnu_input_list
,
3782 gnu_clobber_list
, Is_Asm_Volatile (gnat_node
),
3783 input_filename
, lineno
);
3785 /* Copy all the intermediate outputs into the specified outputs. */
3786 for (; gnu_output_list
;
3787 (gnu_output_list
= TREE_CHAIN (gnu_output_list
),
3788 gnu_orig_out_list
= TREE_CHAIN (gnu_orig_out_list
)))
3789 if (TREE_VALUE (gnu_orig_out_list
) != TREE_VALUE (gnu_output_list
))
3792 (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
3793 TREE_VALUE (gnu_orig_out_list
),
3794 TREE_VALUE (gnu_output_list
)));
3800 /***************************************************/
3802 /***************************************************/
3804 case N_Freeze_Entity
:
3805 process_freeze_entity (gnat_node
);
3806 process_decls (Actions (gnat_node
), Empty
, Empty
, 1, 1);
3809 case N_Itype_Reference
:
3810 if (! present_gnu_tree (Itype (gnat_node
)))
3811 process_type (Itype (gnat_node
));
3814 case N_Free_Statement
:
3815 if (! type_annotate_only
)
3817 tree gnu_ptr
= gnat_to_gnu (Expression (gnat_node
));
3822 /* If this is an unconstrained array, we know the object must
3823 have been allocated with the template in front of the object.
3824 So pass the template address, but get the total size. Do this
3825 by converting to a thin pointer. */
3826 if (TYPE_FAT_POINTER_P (TREE_TYPE (gnu_ptr
)))
3828 = convert (build_pointer_type
3829 (TYPE_OBJECT_RECORD_TYPE
3830 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr
)))),
3833 gnu_obj_type
= TREE_TYPE (TREE_TYPE (gnu_ptr
));
3834 gnu_obj_size
= TYPE_SIZE_UNIT (gnu_obj_type
);
3835 align
= TYPE_ALIGN (gnu_obj_type
);
3837 if (TREE_CODE (gnu_obj_type
) == RECORD_TYPE
3838 && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type
))
3840 tree gnu_char_ptr_type
= build_pointer_type (char_type_node
);
3841 tree gnu_pos
= byte_position (TYPE_FIELDS (gnu_obj_type
));
3842 tree gnu_byte_offset
3843 = convert (gnu_char_ptr_type
,
3844 size_diffop (size_zero_node
, gnu_pos
));
3846 gnu_ptr
= convert (gnu_char_ptr_type
, gnu_ptr
);
3847 gnu_ptr
= build_binary_op (MINUS_EXPR
, gnu_char_ptr_type
,
3848 gnu_ptr
, gnu_byte_offset
);
3851 set_lineno (gnat_node
, 1);
3853 (build_call_alloc_dealloc (gnu_ptr
, gnu_obj_size
, align
,
3854 Procedure_To_Call (gnat_node
),
3855 Storage_Pool (gnat_node
)));
3859 case N_Raise_Constraint_Error
:
3860 case N_Raise_Program_Error
:
3861 case N_Raise_Storage_Error
:
3863 if (type_annotate_only
)
3866 gnu_result_type
= get_unpadded_type (Etype (gnat_node
));
3867 gnu_result
= build_call_raise (UI_To_Int (Reason (gnat_node
)));
3869 /* If the type is VOID, this is a statement, so we need to
3870 generate the code for the call. Handle a Condition, if there
3872 if (TREE_CODE (gnu_result_type
) == VOID_TYPE
)
3874 set_lineno (gnat_node
, 1);
3876 if (Present (Condition (gnat_node
)))
3877 expand_start_cond (gnat_to_gnu (Condition (gnat_node
)), 0);
3879 expand_expr_stmt (gnu_result
);
3880 if (Present (Condition (gnat_node
)))
3882 gnu_result
= error_mark_node
;
3885 gnu_result
= build1 (NULL_EXPR
, gnu_result_type
, gnu_result
);
3888 /* Nothing to do, since front end does all validation using the
3889 values that Gigi back-annotates. */
3890 case N_Validate_Unchecked_Conversion
:
3893 case N_Raise_Statement
:
3894 case N_Function_Specification
:
3895 case N_Procedure_Specification
:
3897 case N_Component_Association
:
3900 if (! type_annotate_only
)
3904 /* If the result is a constant that overflows, raise constraint error. */
3905 if (TREE_CODE (gnu_result
) == INTEGER_CST
3906 && TREE_CONSTANT_OVERFLOW (gnu_result
))
3908 post_error ("Constraint_Error will be raised at run-time?", gnat_node
);
3911 = build1 (NULL_EXPR
, gnu_result_type
,
3912 build_call_raise (CE_Overflow_Check_Failed
));
3915 /* If our result has side-effects and is of an unconstrained type,
3916 make a SAVE_EXPR so that we can be sure it will only be referenced
3917 once. Note we must do this before any conversions. */
3918 if (TREE_SIDE_EFFECTS (gnu_result
)
3919 && (TREE_CODE (gnu_result_type
) == UNCONSTRAINED_ARRAY_TYPE
3920 || (TREE_CODE (TYPE_SIZE (gnu_result_type
)) != INTEGER_CST
3921 && contains_placeholder_p (TYPE_SIZE (gnu_result_type
)))))
3922 gnu_result
= gnat_stabilize_reference (gnu_result
, 0);
3924 /* Now convert the result to the proper type. If the type is void or if
3925 we have no result, return error_mark_node to show we have no result.
3926 If the type of the result is correct or if we have a label (which doesn't
3927 have any well-defined type), return our result. Also don't do the
3928 conversion if the "desired" type involves a PLACEHOLDER_EXPR in its size
3929 since those are the cases where the front end may have the type wrong due
3930 to "instantiating" the unconstrained record with discriminant values
3931 or if this is a FIELD_DECL. If this is the Name of an assignment
3932 statement or a parameter of a procedure call, return what we have since
3933 the RHS has to be converted to our type there in that case, unless
3934 GNU_RESULT_TYPE has a simpler size. Similarly, if the two types are
3935 record types with the same name, the expression type has integral mode,
3936 and GNU_RESULT_TYPE BLKmode, don't convert. This will be the case when
3937 we are converting from a packable type to its actual type and we need
3938 those conversions to be NOPs in order for assignments into these types to
3939 work properly if the inner object is a bitfield and hence can't have
3940 its address taken. Finally, don't convert integral types that are the
3941 operand of an unchecked conversion since we need to ignore those
3942 conversions (for 'Valid). Otherwise, convert the result to the proper
3945 if (Present (Parent (gnat_node
))
3946 && ((Nkind (Parent (gnat_node
)) == N_Assignment_Statement
3947 && Name (Parent (gnat_node
)) == gnat_node
)
3948 || (Nkind (Parent (gnat_node
)) == N_Procedure_Call_Statement
3949 && Name (Parent (gnat_node
)) != gnat_node
)
3950 || (Nkind (Parent (gnat_node
)) == N_Unchecked_Type_Conversion
3951 && ! AGGREGATE_TYPE_P (gnu_result_type
)
3952 && ! AGGREGATE_TYPE_P (TREE_TYPE (gnu_result
)))
3953 || Nkind (Parent (gnat_node
)) == N_Parameter_Association
)
3954 && ! (TYPE_SIZE (gnu_result_type
) != 0
3955 && TYPE_SIZE (TREE_TYPE (gnu_result
)) != 0
3956 && (AGGREGATE_TYPE_P (gnu_result_type
)
3957 == AGGREGATE_TYPE_P (TREE_TYPE (gnu_result
)))
3958 && ((TREE_CODE (TYPE_SIZE (gnu_result_type
)) == INTEGER_CST
3959 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result
)))
3961 || (TREE_CODE (TYPE_SIZE (gnu_result_type
)) != INTEGER_CST
3962 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result
)))
3964 && ! (contains_placeholder_p (TYPE_SIZE (gnu_result_type
)))
3965 && (contains_placeholder_p
3966 (TYPE_SIZE (TREE_TYPE (gnu_result
))))))
3967 && ! (TREE_CODE (gnu_result_type
) == RECORD_TYPE
3968 && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_result_type
))))
3970 /* In this case remove padding only if the inner object is of
3971 self-referential size: in that case it must be an object of
3972 unconstrained type with a default discriminant. In other cases,
3973 we want to avoid copying too much data. */
3974 if (TREE_CODE (TREE_TYPE (gnu_result
)) == RECORD_TYPE
3975 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result
))
3976 && contains_placeholder_p (TYPE_SIZE
3977 (TREE_TYPE (TYPE_FIELDS
3978 (TREE_TYPE (gnu_result
))))))
3979 gnu_result
= convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result
))),
3983 else if (TREE_CODE (gnu_result
) == LABEL_DECL
3984 || TREE_CODE (gnu_result
) == FIELD_DECL
3985 || TREE_CODE (gnu_result
) == ERROR_MARK
3986 || (TYPE_SIZE (gnu_result_type
) != 0
3987 && TREE_CODE (TYPE_SIZE (gnu_result_type
)) != INTEGER_CST
3988 && TREE_CODE (gnu_result
) != INDIRECT_REF
3989 && contains_placeholder_p (TYPE_SIZE (gnu_result_type
)))
3990 || ((TYPE_NAME (gnu_result_type
)
3991 == TYPE_NAME (TREE_TYPE (gnu_result
)))
3992 && TREE_CODE (gnu_result_type
) == RECORD_TYPE
3993 && TREE_CODE (TREE_TYPE (gnu_result
)) == RECORD_TYPE
3994 && TYPE_MODE (gnu_result_type
) == BLKmode
3995 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (gnu_result
)))
3998 /* Remove any padding record, but do nothing more in this case. */
3999 if (TREE_CODE (TREE_TYPE (gnu_result
)) == RECORD_TYPE
4000 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result
)))
4001 gnu_result
= convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result
))),
4005 else if (gnu_result
== error_mark_node
4006 || gnu_result_type
== void_type_node
)
4007 gnu_result
= error_mark_node
;
4008 else if (gnu_result_type
!= TREE_TYPE (gnu_result
))
4009 gnu_result
= convert (gnu_result_type
, gnu_result
);
4011 /* We don't need any NOP_EXPR or NON_LVALUE_EXPR on GNU_RESULT. */
4012 while ((TREE_CODE (gnu_result
) == NOP_EXPR
4013 || TREE_CODE (gnu_result
) == NON_LVALUE_EXPR
)
4014 && TREE_TYPE (TREE_OPERAND (gnu_result
, 0)) == TREE_TYPE (gnu_result
))
4015 gnu_result
= TREE_OPERAND (gnu_result
, 0);
4020 /* Force references to each of the entities in packages GNAT_NODE with's
4021 so that the debugging information for all of them are identical
4022 in all clients. Operate recursively on anything it with's, but check
4023 that we aren't elaborating something more than once. */
4025 /* The reason for this routine's existence is two-fold.
4026 First, with some debugging formats, notably MDEBUG on SGI
4027 IRIX, the linker will remove duplicate debugging information if two
4028 clients have identical debugguing information. With the normal scheme
4029 of elaboration, this does not usually occur, since entities in with'ed
4030 packages are elaborated on demand, and if clients have different usage
4031 patterns, the normal case, then the order and selection of entities
4032 will differ. In most cases however, it seems that linkers do not know
4033 how to eliminate duplicate debugging information, even if it is
4034 identical, so the use of this routine would increase the total amount
4035 of debugging information in the final executable.
4037 Second, this routine is called in type_annotate mode, to compute DDA
4038 information for types in withed units, for ASIS use */
4041 elaborate_all_entities (gnat_node
)
4044 Entity_Id gnat_with_clause
, gnat_entity
;
4046 save_gnu_tree (gnat_node
, integer_zero_node
, 1);
4048 /* Save entities in all context units. A body may have an implicit_with
4049 on its own spec, if the context includes a child unit, so don't save
4052 for (gnat_with_clause
= First (Context_Items (gnat_node
));
4053 Present (gnat_with_clause
);
4054 gnat_with_clause
= Next (gnat_with_clause
))
4055 if (Nkind (gnat_with_clause
) == N_With_Clause
4056 && ! present_gnu_tree (Library_Unit (gnat_with_clause
))
4057 && Library_Unit (gnat_with_clause
) != Library_Unit (Cunit (Main_Unit
)))
4059 elaborate_all_entities (Library_Unit (gnat_with_clause
));
4061 if (Ekind (Entity (Name (gnat_with_clause
))) == E_Package
)
4062 for (gnat_entity
= First_Entity (Entity (Name (gnat_with_clause
)));
4063 Present (gnat_entity
);
4064 gnat_entity
= Next_Entity (gnat_entity
))
4065 if (Is_Public (gnat_entity
)
4066 && Convention (gnat_entity
) != Convention_Intrinsic
4067 && Ekind (gnat_entity
) != E_Package
4068 && Ekind (gnat_entity
) != E_Package_Body
4069 && Ekind (gnat_entity
) != E_Operator
4070 && ! (IN (Ekind (gnat_entity
), Type_Kind
)
4071 && ! Is_Frozen (gnat_entity
))
4072 && ! ((Ekind (gnat_entity
) == E_Procedure
4073 || Ekind (gnat_entity
) == E_Function
)
4074 && Is_Intrinsic_Subprogram (gnat_entity
))
4075 && ! IN (Ekind (gnat_entity
), Named_Kind
)
4076 && ! IN (Ekind (gnat_entity
), Generic_Unit_Kind
))
4077 gnat_to_gnu_entity (gnat_entity
, NULL_TREE
, 0);
4080 if (Nkind (Unit (gnat_node
)) == N_Package_Body
&& type_annotate_only
)
4081 elaborate_all_entities (Library_Unit (gnat_node
));
4084 /* Do the processing of N_Freeze_Entity, GNAT_NODE. */
4087 process_freeze_entity (gnat_node
)
4090 Entity_Id gnat_entity
= Entity (gnat_node
);
4094 = (Nkind (Declaration_Node (gnat_entity
)) == N_Object_Declaration
4095 && present_gnu_tree (Declaration_Node (gnat_entity
)))
4096 ? get_gnu_tree (Declaration_Node (gnat_entity
)) : NULL_TREE
;
4098 /* If this is a package, need to generate code for the package. */
4099 if (Ekind (gnat_entity
) == E_Package
)
4102 (Parent (Corresponding_Body
4103 (Parent (Declaration_Node (gnat_entity
)))));
4107 /* Check for old definition after the above call. This Freeze_Node
4108 might be for one its Itypes. */
4110 = present_gnu_tree (gnat_entity
) ? get_gnu_tree (gnat_entity
) : 0;
4112 /* If this entity has an Address representation clause, GNU_OLD is the
4113 address, so discard it here. */
4114 if (Present (Address_Clause (gnat_entity
)))
4117 /* Don't do anything for class-wide types they are always
4118 transformed into their root type. */
4119 if (Ekind (gnat_entity
) == E_Class_Wide_Type
4120 || (Ekind (gnat_entity
) == E_Class_Wide_Subtype
4121 && Present (Equivalent_Type (gnat_entity
))))
4124 /* Don't do anything for subprograms that may have been elaborated before
4125 their freeze nodes. This can happen, for example because of an inner call
4126 in an instance body. */
4128 && TREE_CODE (gnu_old
) == FUNCTION_DECL
4129 && (Ekind (gnat_entity
) == E_Function
4130 || Ekind (gnat_entity
) == E_Procedure
))
4133 /* If we have a non-dummy type old tree, we have nothing to do. Unless
4134 this is the public view of a private type whose full view was not
4135 delayed, this node was never delayed as it should have been.
4136 Also allow this to happen for concurrent types since we may have
4137 frozen both the Corresponding_Record_Type and this type. */
4139 && ! (TREE_CODE (gnu_old
) == TYPE_DECL
4140 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old
))))
4142 if (IN (Ekind (gnat_entity
), Incomplete_Or_Private_Kind
)
4143 && Present (Full_View (gnat_entity
))
4144 && No (Freeze_Node (Full_View (gnat_entity
))))
4146 else if (Is_Concurrent_Type (gnat_entity
))
4152 /* Reset the saved tree, if any, and elaborate the object or type for real.
4153 If there is a full declaration, elaborate it and copy the type to
4154 GNAT_ENTITY. Likewise if this is the record subtype corresponding to
4155 a class wide type or subtype. */
4158 save_gnu_tree (gnat_entity
, NULL_TREE
, 0);
4159 if (IN (Ekind (gnat_entity
), Incomplete_Or_Private_Kind
)
4160 && Present (Full_View (gnat_entity
))
4161 && present_gnu_tree (Full_View (gnat_entity
)))
4162 save_gnu_tree (Full_View (gnat_entity
), NULL_TREE
, 0);
4163 if (Present (Class_Wide_Type (gnat_entity
))
4164 && Class_Wide_Type (gnat_entity
) != gnat_entity
)
4165 save_gnu_tree (Class_Wide_Type (gnat_entity
), NULL_TREE
, 0);
4168 if (IN (Ekind (gnat_entity
), Incomplete_Or_Private_Kind
)
4169 && Present (Full_View (gnat_entity
)))
4171 gnu_new
= gnat_to_gnu_entity (Full_View (gnat_entity
), NULL_TREE
, 1);
4173 /* The above call may have defined this entity (the simplest example
4174 of this is when we have a private enumeral type since the bounds
4175 will have the public view. */
4176 if (! present_gnu_tree (gnat_entity
))
4177 save_gnu_tree (gnat_entity
, gnu_new
, 0);
4178 if (Present (Class_Wide_Type (gnat_entity
))
4179 && Class_Wide_Type (gnat_entity
) != gnat_entity
)
4180 save_gnu_tree (Class_Wide_Type (gnat_entity
), gnu_new
, 0);
4183 gnu_new
= gnat_to_gnu_entity (gnat_entity
, gnu_init
, 1);
4185 /* If we've made any pointers to the old version of this type, we
4186 have to update them. */
4188 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old
)),
4189 TREE_TYPE (gnu_new
));
4192 /* Process the list of inlined subprograms of GNAT_NODE, which is an
4193 N_Compilation_Unit. */
4196 process_inlined_subprograms (gnat_node
)
4199 Entity_Id gnat_entity
;
4202 /* If we can inline, generate RTL for all the inlined subprograms.
4203 Define the entity first so we set DECL_EXTERNAL. */
4204 if (optimize
> 0 && ! flag_no_inline
)
4205 for (gnat_entity
= First_Inlined_Subprogram (gnat_node
);
4206 Present (gnat_entity
);
4207 gnat_entity
= Next_Inlined_Subprogram (gnat_entity
))
4209 gnat_body
= Parent (Declaration_Node (gnat_entity
));
4211 if (Nkind (gnat_body
) != N_Subprogram_Body
)
4213 /* ??? This really should always be Present. */
4214 if (No (Corresponding_Body (gnat_body
)))
4218 = Parent (Declaration_Node (Corresponding_Body (gnat_body
)));
4221 if (Present (gnat_body
))
4223 gnat_to_gnu_entity (gnat_entity
, NULL_TREE
, 0);
4224 gnat_to_code (gnat_body
);
4229 /* Elaborate decls in the lists GNAT_DECLS and GNAT_DECLS2, if present.
4230 We make two passes, one to elaborate anything other than bodies (but
4231 we declare a function if there was no spec). The second pass
4232 elaborates the bodies.
4234 GNAT_END_LIST gives the element in the list past the end. Normally,
4235 this is Empty, but can be First_Real_Statement for a
4236 Handled_Sequence_Of_Statements.
4238 We make a complete pass through both lists if PASS1P is true, then make
4239 the second pass over both lists if PASS2P is true. The lists usually
4240 correspond to the public and private parts of a package. */
4243 process_decls (gnat_decls
, gnat_decls2
, gnat_end_list
, pass1p
, pass2p
)
4244 List_Id gnat_decls
, gnat_decls2
;
4245 Node_Id gnat_end_list
;
4248 List_Id gnat_decl_array
[2];
4252 gnat_decl_array
[0] = gnat_decls
, gnat_decl_array
[1] = gnat_decls2
;
4255 for (i
= 0; i
<= 1; i
++)
4256 if (Present (gnat_decl_array
[i
]))
4257 for (gnat_decl
= First (gnat_decl_array
[i
]);
4258 gnat_decl
!= gnat_end_list
; gnat_decl
= Next (gnat_decl
))
4260 set_lineno (gnat_decl
, 0);
4262 /* For package specs, we recurse inside the declarations,
4263 thus taking the two pass approach inside the boundary. */
4264 if (Nkind (gnat_decl
) == N_Package_Declaration
4265 && (Nkind (Specification (gnat_decl
)
4266 == N_Package_Specification
)))
4267 process_decls (Visible_Declarations (Specification (gnat_decl
)),
4268 Private_Declarations (Specification (gnat_decl
)),
4271 /* Similarly for any declarations in the actions of a
4273 else if (Nkind (gnat_decl
) == N_Freeze_Entity
)
4275 process_freeze_entity (gnat_decl
);
4276 process_decls (Actions (gnat_decl
), Empty
, Empty
, 1, 0);
4279 /* Package bodies with freeze nodes get their elaboration deferred
4280 until the freeze node, but the code must be placed in the right
4281 place, so record the code position now. */
4282 else if (Nkind (gnat_decl
) == N_Package_Body
4283 && Present (Freeze_Node (Corresponding_Spec (gnat_decl
))))
4284 record_code_position (gnat_decl
);
4286 else if (Nkind (gnat_decl
) == N_Package_Body_Stub
4287 && Present (Library_Unit (gnat_decl
))
4288 && Present (Freeze_Node
4291 (Library_Unit (gnat_decl
)))))))
4292 record_code_position
4293 (Proper_Body (Unit (Library_Unit (gnat_decl
))));
4295 /* We defer most subprogram bodies to the second pass.
4296 However, Init_Proc subprograms cannot be defered, but luckily
4297 don't need to be. */
4298 else if ((Nkind (gnat_decl
) == N_Subprogram_Body
4299 && (Chars (Defining_Entity (gnat_decl
))
4300 != Name_uInit_Proc
)))
4302 if (Acts_As_Spec (gnat_decl
))
4304 Node_Id gnat_subprog_id
= Defining_Entity (gnat_decl
);
4306 if (Ekind (gnat_subprog_id
) != E_Generic_Procedure
4307 && Ekind (gnat_subprog_id
) != E_Generic_Function
)
4308 gnat_to_gnu_entity (gnat_subprog_id
, NULL_TREE
, 1);
4311 /* For bodies and stubs that act as their own specs, the entity
4312 itself must be elaborated in the first pass, because it may
4313 be used in other declarations. */
4314 else if (Nkind (gnat_decl
) == N_Subprogram_Body_Stub
)
4316 Node_Id gnat_subprog_id
=
4317 Defining_Entity (Specification (gnat_decl
));
4319 if (Ekind (gnat_subprog_id
) != E_Subprogram_Body
4320 && Ekind (gnat_subprog_id
) != E_Generic_Procedure
4321 && Ekind (gnat_subprog_id
) != E_Generic_Function
)
4322 gnat_to_gnu_entity (gnat_subprog_id
, NULL_TREE
, 1);
4325 /* Concurrent stubs stand for the corresponding subprogram bodies,
4326 which are deferred like other bodies. */
4327 else if (Nkind (gnat_decl
) == N_Task_Body_Stub
4328 || Nkind (gnat_decl
) == N_Protected_Body_Stub
)
4332 gnat_to_code (gnat_decl
);
4335 /* Here we elaborate everything we deferred above except for package bodies,
4336 which are elaborated at their freeze nodes. Note that we must also
4337 go inside things (package specs and freeze nodes) the first pass did. */
4339 for (i
= 0; i
<= 1; i
++)
4340 if (Present (gnat_decl_array
[i
]))
4341 for (gnat_decl
= First (gnat_decl_array
[i
]);
4342 gnat_decl
!= gnat_end_list
; gnat_decl
= Next (gnat_decl
))
4344 if ((Nkind (gnat_decl
) == N_Subprogram_Body
4345 && (Chars (Defining_Entity (gnat_decl
))
4346 != Name_uInit_Proc
))
4347 || Nkind (gnat_decl
) == N_Subprogram_Body_Stub
4348 || Nkind (gnat_decl
) == N_Task_Body_Stub
4349 || Nkind (gnat_decl
) == N_Protected_Body_Stub
)
4350 gnat_to_code (gnat_decl
);
4352 else if (Nkind (gnat_decl
) == N_Package_Declaration
4353 && (Nkind (Specification (gnat_decl
)
4354 == N_Package_Specification
)))
4355 process_decls (Visible_Declarations (Specification (gnat_decl
)),
4356 Private_Declarations (Specification (gnat_decl
)),
4359 else if (Nkind (gnat_decl
) == N_Freeze_Entity
)
4360 process_decls (Actions (gnat_decl
), Empty
, Empty
, 0, 1);
4364 /* Emits an access check. GNU_EXPR is the expression that needs to be
4365 checked against the NULL pointer. */
4368 emit_access_check (gnu_expr
)
4371 tree gnu_check_expr
;
4373 /* Checked expressions must be evaluated only once. */
4374 gnu_check_expr
= gnu_expr
= protect_multiple_eval (gnu_expr
);
4376 /* Technically, we check a fat pointer against two words of zero. However,
4377 that's wasteful and really doesn't protect against null accesses. It
4378 makes more sense to check oly the array pointer. */
4379 if (TYPE_FAT_POINTER_P (TREE_TYPE (gnu_expr
)))
4381 = build_component_ref (gnu_expr
, get_identifier ("P_ARRAY"), NULL_TREE
);
4383 if (! POINTER_TYPE_P (TREE_TYPE (gnu_check_expr
)))
4386 return emit_check (build_binary_op (EQ_EXPR
, integer_type_node
,
4388 convert (TREE_TYPE (gnu_check_expr
),
4389 integer_zero_node
)),
4391 CE_Access_Check_Failed
);
4394 /* Emits a discriminant check. GNU_EXPR is the expression to be checked and
4395 GNAT_NODE a N_Selected_Component node. */
4398 emit_discriminant_check (gnu_expr
, gnat_node
)
4403 = Original_Record_Component (Entity (Selector_Name (gnat_node
)));
4404 Entity_Id gnat_discr_fct
= Discriminant_Checking_Func (orig_comp
);
4406 Entity_Id gnat_discr
;
4407 tree gnu_actual_list
= NULL_TREE
;
4409 Entity_Id gnat_pref_type
;
4412 if (Is_Tagged_Type (Scope (orig_comp
)))
4413 gnat_pref_type
= Scope (orig_comp
);
4416 gnat_pref_type
= Etype (Prefix (gnat_node
));
4418 /* For an untagged derived type, use the discriminants of the parent,
4419 which have been renamed in the derivation, possibly by a one-to-many
4421 if (Is_Derived_Type (gnat_pref_type
)
4422 && (Number_Discriminants (gnat_pref_type
)
4423 != Number_Discriminants (Etype (Base_Type (gnat_pref_type
)))))
4424 gnat_pref_type
= Etype (Base_Type (gnat_pref_type
));
4427 if (! Present (gnat_discr_fct
))
4430 gnu_discr_fct
= gnat_to_gnu (gnat_discr_fct
);
4432 /* Checked expressions must be evaluated only once. */
4433 gnu_expr
= protect_multiple_eval (gnu_expr
);
4435 /* Create the list of the actual parameters as GCC expects it.
4436 This list is the list of the discriminant fields of the
4437 record expression to be discriminant checked. For documentation
4438 on what is the GCC format for this list see under the
4439 N_Function_Call case */
4441 while (IN (Ekind (gnat_pref_type
), Incomplete_Or_Private_Kind
)
4442 || IN (Ekind (gnat_pref_type
), Access_Kind
))
4444 if (IN (Ekind (gnat_pref_type
), Incomplete_Or_Private_Kind
))
4445 gnat_pref_type
= Underlying_Type (gnat_pref_type
);
4446 else if (IN (Ekind (gnat_pref_type
), Access_Kind
))
4447 gnat_pref_type
= Designated_Type (gnat_pref_type
);
4451 = TREE_TYPE (gnat_to_gnu_entity (gnat_pref_type
, NULL_TREE
, 0));
4453 for (gnat_discr
= First_Discriminant (gnat_pref_type
);
4454 Present (gnat_discr
); gnat_discr
= Next_Discriminant (gnat_discr
))
4456 Entity_Id gnat_real_discr
4457 = ((Present (Corresponding_Discriminant (gnat_discr
))
4458 && Present (Parent_Subtype (gnat_pref_type
)))
4459 ? Corresponding_Discriminant (gnat_discr
) : gnat_discr
);
4460 tree gnu_discr
= gnat_to_gnu_entity (gnat_real_discr
, NULL_TREE
, 0);
4463 = chainon (gnu_actual_list
,
4464 build_tree_list (NULL_TREE
,
4466 (convert (gnu_pref_type
, gnu_expr
),
4467 NULL_TREE
, gnu_discr
)));
4470 gnu_cond
= build (CALL_EXPR
,
4471 TREE_TYPE (TREE_TYPE (gnu_discr_fct
)),
4472 build_unary_op (ADDR_EXPR
, NULL_TREE
, gnu_discr_fct
),
4475 TREE_SIDE_EFFECTS (gnu_cond
) = 1;
4479 (INDIRECT_REF
, NULL_TREE
,
4480 emit_check (gnu_cond
,
4481 build_unary_op (ADDR_EXPR
,
4482 build_reference_type (TREE_TYPE (gnu_expr
)),
4484 CE_Discriminant_Check_Failed
));
4487 /* Emit code for a range check. GNU_EXPR is the expression to be checked,
4488 GNAT_RANGE_TYPE the gnat type or subtype containing the bounds against
4489 which we have to check. */
4492 emit_range_check (gnu_expr
, gnat_range_type
)
4494 Entity_Id gnat_range_type
;
4496 tree gnu_range_type
= get_unpadded_type (gnat_range_type
);
4497 tree gnu_low
= TYPE_MIN_VALUE (gnu_range_type
);
4498 tree gnu_high
= TYPE_MAX_VALUE (gnu_range_type
);
4499 tree gnu_compare_type
= get_base_type (TREE_TYPE (gnu_expr
));
4501 /* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
4502 we can't do anything since we might be truncating the bounds. No
4503 check is needed in this case. */
4504 if (INTEGRAL_TYPE_P (TREE_TYPE (gnu_expr
))
4505 && (TYPE_PRECISION (gnu_compare_type
)
4506 < TYPE_PRECISION (get_base_type (gnu_range_type
))))
4509 /* Checked expressions must be evaluated only once. */
4510 gnu_expr
= protect_multiple_eval (gnu_expr
);
4512 /* There's no good type to use here, so we might as well use
4513 integer_type_node. Note that the form of the check is
4514 (not (expr >= lo)) or (not (expr >= hi))
4515 the reason for this slightly convoluted form is that NaN's
4516 are not considered to be in range in the float case. */
4518 (build_binary_op (TRUTH_ORIF_EXPR
, integer_type_node
,
4520 (build_binary_op (GE_EXPR
, integer_type_node
,
4521 convert (gnu_compare_type
, gnu_expr
),
4522 convert (gnu_compare_type
, gnu_low
))),
4524 (build_binary_op (LE_EXPR
, integer_type_node
,
4525 convert (gnu_compare_type
, gnu_expr
),
4526 convert (gnu_compare_type
,
4528 gnu_expr
, CE_Range_Check_Failed
);
4531 /* Emit code for an index check. GNU_ARRAY_OBJECT is the array object
4532 which we are about to index, GNU_EXPR is the index expression to be
4533 checked, GNU_LOW and GNU_HIGH are the lower and upper bounds
4534 against which GNU_EXPR has to be checked. Note that for index
4535 checking we cannot use the emit_range_check function (although very
4536 similar code needs to be generated in both cases) since for index
4537 checking the array type against which we are checking the indeces
4538 may be unconstrained and consequently we need to retrieve the
4539 actual index bounds from the array object itself
4540 (GNU_ARRAY_OBJECT). The place where we need to do that is in
4541 subprograms having unconstrained array formal parameters */
4544 emit_index_check (gnu_array_object
, gnu_expr
, gnu_low
, gnu_high
)
4545 tree gnu_array_object
;
4550 tree gnu_expr_check
;
4552 /* Checked expressions must be evaluated only once. */
4553 gnu_expr
= protect_multiple_eval (gnu_expr
);
4555 /* Must do this computation in the base type in case the expression's
4556 type is an unsigned subtypes. */
4557 gnu_expr_check
= convert (get_base_type (TREE_TYPE (gnu_expr
)), gnu_expr
);
4559 /* If GNU_LOW or GNU_HIGH are a PLACEHOLDER_EXPR, qualify them by
4560 the object we are handling. */
4561 if (TREE_CODE (gnu_low
) != INTEGER_CST
&& contains_placeholder_p (gnu_low
))
4562 gnu_low
= build (WITH_RECORD_EXPR
, TREE_TYPE (gnu_low
),
4563 gnu_low
, gnu_array_object
);
4565 if (TREE_CODE (gnu_high
) != INTEGER_CST
&& contains_placeholder_p (gnu_high
))
4566 gnu_high
= build (WITH_RECORD_EXPR
, TREE_TYPE (gnu_high
),
4567 gnu_high
, gnu_array_object
);
4569 /* There's no good type to use here, so we might as well use
4570 integer_type_node. */
4572 (build_binary_op (TRUTH_ORIF_EXPR
, integer_type_node
,
4573 build_binary_op (LT_EXPR
, integer_type_node
,
4575 convert (TREE_TYPE (gnu_expr_check
),
4577 build_binary_op (GT_EXPR
, integer_type_node
,
4579 convert (TREE_TYPE (gnu_expr_check
),
4581 gnu_expr
, CE_Index_Check_Failed
);
4584 /* Given GNU_COND which contains the condition corresponding to an access,
4585 discriminant or range check, of value GNU_EXPR, build a COND_EXPR
4586 that returns GNU_EXPR if GNU_COND is false and raises a
4587 CONSTRAINT_ERROR if GNU_COND is true. REASON is the code that says
4588 why the exception was raised. */
4591 emit_check (gnu_cond
, gnu_expr
, reason
)
4599 gnu_call
= build_call_raise (reason
);
4601 /* Use an outer COMPOUND_EXPR to make sure that GNU_EXPR will get evaluated
4602 in front of the comparison in case it ends up being a SAVE_EXPR. Put the
4603 whole thing inside its own SAVE_EXPR so the inner SAVE_EXPR doesn't leak
4605 gnu_result
= fold (build (COND_EXPR
, TREE_TYPE (gnu_expr
), gnu_cond
,
4606 build (COMPOUND_EXPR
, TREE_TYPE (gnu_expr
),
4607 gnu_call
, gnu_expr
),
4610 /* If GNU_EXPR has side effects, make the outer COMPOUND_EXPR and
4611 protect it. Otherwise, show GNU_RESULT has no side effects: we
4612 don't need to evaluate it just for the check. */
4613 if (TREE_SIDE_EFFECTS (gnu_expr
))
4615 = build (COMPOUND_EXPR
, TREE_TYPE (gnu_expr
), gnu_expr
, gnu_result
);
4617 TREE_SIDE_EFFECTS (gnu_result
) = 0;
4619 /* ??? Unfortunately, if we don't put a SAVE_EXPR around this whole thing,
4620 we will repeatedly do the test. It would be nice if GCC was able
4621 to optimize this and only do it once. */
4622 return save_expr (gnu_result
);
4625 /* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing
4626 overflow checks if OVERFLOW_P is nonzero and range checks if
4627 RANGE_P is nonzero. GNAT_TYPE is known to be an integral type.
4628 If TRUNCATE_P is nonzero, do a float to integer conversion with
4629 truncation; otherwise round. */
4632 convert_with_check (gnat_type
, gnu_expr
, overflow_p
, range_p
, truncate_p
)
4633 Entity_Id gnat_type
;
4639 tree gnu_type
= get_unpadded_type (gnat_type
);
4640 tree gnu_in_type
= TREE_TYPE (gnu_expr
);
4641 tree gnu_in_basetype
= get_base_type (gnu_in_type
);
4642 tree gnu_base_type
= get_base_type (gnu_type
);
4643 tree gnu_ada_base_type
= get_ada_base_type (gnu_type
);
4644 tree gnu_in_lb
= TYPE_MIN_VALUE (gnu_in_basetype
);
4645 tree gnu_in_ub
= TYPE_MAX_VALUE (gnu_in_basetype
);
4646 tree gnu_out_lb
= TYPE_MIN_VALUE (gnu_base_type
);
4647 tree gnu_out_ub
= TYPE_MAX_VALUE (gnu_base_type
);
4648 tree gnu_result
= gnu_expr
;
4650 /* If we are not doing any checks, the output is an integral type, and
4651 the input is not a floating type, just do the conversion. This
4652 shortcut is required to avoid problems with packed array types
4653 and simplifies code in all cases anyway. */
4654 if (! range_p
&& ! overflow_p
&& INTEGRAL_TYPE_P (gnu_base_type
)
4655 && ! FLOAT_TYPE_P (gnu_in_type
))
4656 return convert (gnu_type
, gnu_expr
);
4658 /* First convert the expression to its base type. This
4659 will never generate code, but makes the tests below much simpler.
4660 But don't do this if converting from an integer type to an unconstrained
4661 array type since then we need to get the bounds from the original
4663 if (TREE_CODE (gnu_type
) != UNCONSTRAINED_ARRAY_TYPE
)
4664 gnu_result
= convert (gnu_in_basetype
, gnu_result
);
4666 /* If overflow checks are requested, we need to be sure the result will
4667 fit in the output base type. But don't do this if the input
4668 is integer and the output floating-point. */
4670 && ! (FLOAT_TYPE_P (gnu_base_type
) && INTEGRAL_TYPE_P (gnu_in_basetype
)))
4672 /* Ensure GNU_EXPR only gets evaluated once. */
4673 tree gnu_input
= protect_multiple_eval (gnu_result
);
4674 tree gnu_cond
= integer_zero_node
;
4676 /* Convert the lower bounds to signed types, so we're sure we're
4677 comparing them properly. Likewise, convert the upper bounds
4678 to unsigned types. */
4679 if (INTEGRAL_TYPE_P (gnu_in_basetype
) && TREE_UNSIGNED (gnu_in_basetype
))
4680 gnu_in_lb
= convert (gnat_signed_type (gnu_in_basetype
), gnu_in_lb
);
4682 if (INTEGRAL_TYPE_P (gnu_in_basetype
)
4683 && ! TREE_UNSIGNED (gnu_in_basetype
))
4684 gnu_in_ub
= convert (gnat_unsigned_type (gnu_in_basetype
), gnu_in_ub
);
4686 if (INTEGRAL_TYPE_P (gnu_base_type
) && TREE_UNSIGNED (gnu_base_type
))
4687 gnu_out_lb
= convert (gnat_signed_type (gnu_base_type
), gnu_out_lb
);
4689 if (INTEGRAL_TYPE_P (gnu_base_type
) && ! TREE_UNSIGNED (gnu_base_type
))
4690 gnu_out_ub
= convert (gnat_unsigned_type (gnu_base_type
), gnu_out_ub
);
4692 /* Check each bound separately and only if the result bound
4693 is tighter than the bound on the input type. Note that all the
4694 types are base types, so the bounds must be constant. Also,
4695 the comparison is done in the base type of the input, which
4696 always has the proper signedness. First check for input
4697 integer (which means output integer), output float (which means
4698 both float), or mixed, in which case we always compare.
4699 Note that we have to do the comparison which would *fail* in the
4700 case of an error since if it's an FP comparison and one of the
4701 values is a NaN or Inf, the comparison will fail. */
4702 if (INTEGRAL_TYPE_P (gnu_in_basetype
)
4703 ? tree_int_cst_lt (gnu_in_lb
, gnu_out_lb
)
4704 : (FLOAT_TYPE_P (gnu_base_type
)
4705 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_in_lb
),
4706 TREE_REAL_CST (gnu_out_lb
))
4710 (build_binary_op (GE_EXPR
, integer_type_node
,
4711 gnu_input
, convert (gnu_in_basetype
,
4714 if (INTEGRAL_TYPE_P (gnu_in_basetype
)
4715 ? tree_int_cst_lt (gnu_out_ub
, gnu_in_ub
)
4716 : (FLOAT_TYPE_P (gnu_base_type
)
4717 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_out_ub
),
4718 TREE_REAL_CST (gnu_in_lb
))
4721 = build_binary_op (TRUTH_ORIF_EXPR
, integer_type_node
, gnu_cond
,
4723 (build_binary_op (LE_EXPR
, integer_type_node
,
4725 convert (gnu_in_basetype
,
4728 if (! integer_zerop (gnu_cond
))
4729 gnu_result
= emit_check (gnu_cond
, gnu_input
,
4730 CE_Overflow_Check_Failed
);
4733 /* Now convert to the result base type. If this is a non-truncating
4734 float-to-integer conversion, round. */
4735 if (INTEGRAL_TYPE_P (gnu_ada_base_type
) && FLOAT_TYPE_P (gnu_in_basetype
)
4738 tree gnu_point_5
= build_real (gnu_in_basetype
, dconstp5
);
4739 tree gnu_minus_point_5
= build_real (gnu_in_basetype
, dconstmp5
);
4740 tree gnu_zero
= convert (gnu_in_basetype
, integer_zero_node
);
4741 tree gnu_saved_result
= save_expr (gnu_result
);
4742 tree gnu_comp
= build (GE_EXPR
, integer_type_node
,
4743 gnu_saved_result
, gnu_zero
);
4744 tree gnu_adjust
= build (COND_EXPR
, gnu_in_basetype
, gnu_comp
,
4745 gnu_point_5
, gnu_minus_point_5
);
4748 = build (PLUS_EXPR
, gnu_in_basetype
, gnu_saved_result
, gnu_adjust
);
4751 if (TREE_CODE (gnu_ada_base_type
) == INTEGER_TYPE
4752 && TYPE_HAS_ACTUAL_BOUNDS_P (gnu_ada_base_type
)
4753 && TREE_CODE (gnu_result
) == UNCONSTRAINED_ARRAY_REF
)
4754 gnu_result
= unchecked_convert (gnu_ada_base_type
, gnu_result
);
4756 gnu_result
= convert (gnu_ada_base_type
, gnu_result
);
4758 /* Finally, do the range check if requested. Note that if the
4759 result type is a modular type, the range check is actually
4760 an overflow check. */
4763 || (TREE_CODE (gnu_base_type
) == INTEGER_TYPE
4764 && TYPE_MODULAR_P (gnu_base_type
) && overflow_p
))
4765 gnu_result
= emit_range_check (gnu_result
, gnat_type
);
4767 return convert (gnu_type
, gnu_result
);
4770 /* Return 1 if GNU_EXPR can be directly addressed. This is the case
4771 unless it is an expression involving computation or if it involves
4772 a bitfield reference. This returns the same as
4773 gnat_mark_addressable in most cases. */
4776 addressable_p (gnu_expr
)
4779 switch (TREE_CODE (gnu_expr
))
4781 case UNCONSTRAINED_ARRAY_REF
:
4792 return (! DECL_BIT_FIELD (TREE_OPERAND (gnu_expr
, 1))
4793 && addressable_p (TREE_OPERAND (gnu_expr
, 0)));
4795 case ARRAY_REF
: case ARRAY_RANGE_REF
:
4796 case REALPART_EXPR
: case IMAGPART_EXPR
:
4798 return addressable_p (TREE_OPERAND (gnu_expr
, 0));
4801 return (AGGREGATE_TYPE_P (TREE_TYPE (gnu_expr
))
4802 && addressable_p (TREE_OPERAND (gnu_expr
, 0)));
4804 case VIEW_CONVERT_EXPR
:
4806 /* This is addressable if we can avoid a copy. */
4807 tree type
= TREE_TYPE (gnu_expr
);
4808 tree inner_type
= TREE_TYPE (TREE_OPERAND (gnu_expr
, 0));
4810 return (((TYPE_MODE (type
) == TYPE_MODE (inner_type
)
4811 && (TYPE_ALIGN (type
) <= TYPE_ALIGN (inner_type
)
4812 || TYPE_ALIGN (inner_type
) >= BIGGEST_ALIGNMENT
))
4813 || ((TYPE_MODE (type
) == BLKmode
4814 || TYPE_MODE (inner_type
) == BLKmode
)
4815 && (TYPE_ALIGN (type
) <= TYPE_ALIGN (inner_type
)
4816 || TYPE_ALIGN (inner_type
) >= BIGGEST_ALIGNMENT
4817 || TYPE_ALIGN_OK (type
)
4818 || TYPE_ALIGN_OK (inner_type
))))
4819 && addressable_p (TREE_OPERAND (gnu_expr
, 0)));
4827 /* Do the processing for the declaration of a GNAT_ENTITY, a type. If
4828 a separate Freeze node exists, delay the bulk of the processing. Otherwise
4829 make a GCC type for GNAT_ENTITY and set up the correspondance. */
4832 process_type (gnat_entity
)
4833 Entity_Id gnat_entity
;
4836 = present_gnu_tree (gnat_entity
) ? get_gnu_tree (gnat_entity
) : 0;
4839 /* If we are to delay elaboration of this type, just do any
4840 elaborations needed for expressions within the declaration and
4841 make a dummy type entry for this node and its Full_View (if
4842 any) in case something points to it. Don't do this if it
4843 has already been done (the only way that can happen is if
4844 the private completion is also delayed). */
4845 if (Present (Freeze_Node (gnat_entity
))
4846 || (IN (Ekind (gnat_entity
), Incomplete_Or_Private_Kind
)
4847 && Present (Full_View (gnat_entity
))
4848 && Freeze_Node (Full_View (gnat_entity
))
4849 && ! present_gnu_tree (Full_View (gnat_entity
))))
4851 elaborate_entity (gnat_entity
);
4855 tree gnu_decl
= create_type_decl (get_entity_name (gnat_entity
),
4856 make_dummy_type (gnat_entity
),
4859 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
4860 if (IN (Ekind (gnat_entity
), Incomplete_Or_Private_Kind
)
4861 && Present (Full_View (gnat_entity
)))
4862 save_gnu_tree (Full_View (gnat_entity
), gnu_decl
, 0);
4868 /* If we saved away a dummy type for this node it means that this
4869 made the type that corresponds to the full type of an incomplete
4870 type. Clear that type for now and then update the type in the
4874 if (TREE_CODE (gnu_old
) != TYPE_DECL
4875 || ! TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old
)))
4877 /* If this was a withed access type, this is not an error
4878 and merely indicates we've already elaborated the type
4880 if (Is_Type (gnat_entity
) && From_With_Type (gnat_entity
))
4886 save_gnu_tree (gnat_entity
, NULL_TREE
, 0);
4889 /* Now fully elaborate the type. */
4890 gnu_new
= gnat_to_gnu_entity (gnat_entity
, NULL_TREE
, 1);
4891 if (TREE_CODE (gnu_new
) != TYPE_DECL
)
4894 /* If we have an old type and we've made pointers to this type,
4895 update those pointers. */
4897 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old
)),
4898 TREE_TYPE (gnu_new
));
4900 /* If this is a record type corresponding to a task or protected type
4901 that is a completion of an incomplete type, perform a similar update
4903 /* ??? Including protected types here is a guess. */
4905 if (IN (Ekind (gnat_entity
), Record_Kind
)
4906 && Is_Concurrent_Record_Type (gnat_entity
)
4907 && present_gnu_tree (Corresponding_Concurrent_Type (gnat_entity
)))
4910 = get_gnu_tree (Corresponding_Concurrent_Type (gnat_entity
));
4912 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity
),
4914 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity
),
4917 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_task_old
)),
4918 TREE_TYPE (gnu_new
));
4922 /* GNAT_ASSOC is the front of the Component_Associations of an N_Aggregate.
4923 GNU_TYPE is the GCC type of the corresponding record.
4925 Return a CONSTRUCTOR to build the record. */
4928 assoc_to_constructor (gnat_assoc
, gnu_type
)
4932 tree gnu_field
, gnu_list
, gnu_result
;
4934 /* We test for GNU_FIELD being empty in the case where a variant
4935 was the last thing since we don't take things off GNAT_ASSOC in
4936 that case. We check GNAT_ASSOC in case we have a variant, but it
4939 for (gnu_list
= NULL_TREE
; Present (gnat_assoc
);
4940 gnat_assoc
= Next (gnat_assoc
))
4942 Node_Id gnat_field
= First (Choices (gnat_assoc
));
4943 tree gnu_field
= gnat_to_gnu_entity (Entity (gnat_field
), NULL_TREE
, 0);
4944 tree gnu_expr
= gnat_to_gnu (Expression (gnat_assoc
));
4946 /* The expander is supposed to put a single component selector name
4947 in every record component association */
4948 if (Next (gnat_field
))
4951 /* Before assigning a value in an aggregate make sure range checks
4952 are done if required. Then convert to the type of the field. */
4953 if (Do_Range_Check (Expression (gnat_assoc
)))
4954 gnu_expr
= emit_range_check (gnu_expr
, Etype (gnat_field
));
4956 gnu_expr
= convert (TREE_TYPE (gnu_field
), gnu_expr
);
4958 /* Add the field and expression to the list. */
4959 gnu_list
= tree_cons (gnu_field
, gnu_expr
, gnu_list
);
4962 gnu_result
= extract_values (gnu_list
, gnu_type
);
4964 /* Verify every enty in GNU_LIST was used. */
4965 for (gnu_field
= gnu_list
; gnu_field
; gnu_field
= TREE_CHAIN (gnu_field
))
4966 if (! TREE_ADDRESSABLE (gnu_field
))
4972 /* Builds a possibly nested constructor for array aggregates. GNAT_EXPR
4973 is the first element of an array aggregate. It may itself be an
4974 aggregate (an array or record aggregate). GNU_ARRAY_TYPE is the gnu type
4975 corresponding to the array aggregate. GNAT_COMPONENT_TYPE is the type
4976 of the array component. It is needed for range checking. */
4979 pos_to_constructor (gnat_expr
, gnu_array_type
, gnat_component_type
)
4981 tree gnu_array_type
;
4982 Entity_Id gnat_component_type
;
4985 tree gnu_expr_list
= NULL_TREE
;
4987 for ( ; Present (gnat_expr
); gnat_expr
= Next (gnat_expr
))
4989 /* If the expression is itself an array aggregate then first build the
4990 innermost constructor if it is part of our array (multi-dimensional
4993 if (Nkind (gnat_expr
) == N_Aggregate
4994 && TREE_CODE (TREE_TYPE (gnu_array_type
)) == ARRAY_TYPE
4995 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_array_type
)))
4996 gnu_expr
= pos_to_constructor (First (Expressions (gnat_expr
)),
4997 TREE_TYPE (gnu_array_type
),
4998 gnat_component_type
);
5001 gnu_expr
= gnat_to_gnu (gnat_expr
);
5003 /* before assigning the element to the array make sure it is
5005 if (Do_Range_Check (gnat_expr
))
5006 gnu_expr
= emit_range_check (gnu_expr
, gnat_component_type
);
5010 = tree_cons (NULL_TREE
, convert (TREE_TYPE (gnu_array_type
), gnu_expr
),
5014 return build_constructor (gnu_array_type
, nreverse (gnu_expr_list
));
5017 /* Subroutine of assoc_to_constructor: VALUES is a list of field associations,
5018 some of which are from RECORD_TYPE. Return a CONSTRUCTOR consisting
5019 of the associations that are from RECORD_TYPE. If we see an internal
5020 record, make a recursive call to fill it in as well. */
5023 extract_values (values
, record_type
)
5027 tree result
= NULL_TREE
;
5030 for (field
= TYPE_FIELDS (record_type
); field
; field
= TREE_CHAIN (field
))
5034 /* _Parent is an internal field, but may have values in the aggregate,
5035 so check for values first. */
5036 if ((tem
= purpose_member (field
, values
)) != 0)
5038 value
= TREE_VALUE (tem
);
5039 TREE_ADDRESSABLE (tem
) = 1;
5042 else if (DECL_INTERNAL_P (field
))
5044 value
= extract_values (values
, TREE_TYPE (field
));
5045 if (TREE_CODE (value
) == CONSTRUCTOR
5046 && CONSTRUCTOR_ELTS (value
) == 0)
5050 /* If we have a record subtype, the names will match, but not the
5051 actual FIELD_DECLs. */
5052 for (tem
= values
; tem
; tem
= TREE_CHAIN (tem
))
5053 if (DECL_NAME (TREE_PURPOSE (tem
)) == DECL_NAME (field
))
5055 value
= convert (TREE_TYPE (field
), TREE_VALUE (tem
));
5056 TREE_ADDRESSABLE (tem
) = 1;
5062 result
= tree_cons (field
, value
, result
);
5065 return build_constructor (record_type
, nreverse (result
));
5068 /* EXP is to be treated as an array or record. Handle the cases when it is
5069 an access object and perform the required dereferences. */
5072 maybe_implicit_deref (exp
)
5075 /* If the type is a pointer, dereference it. */
5077 if (POINTER_TYPE_P (TREE_TYPE (exp
)) || TYPE_FAT_POINTER_P (TREE_TYPE (exp
)))
5078 exp
= build_unary_op (INDIRECT_REF
, NULL_TREE
, exp
);
5080 /* If we got a padded type, remove it too. */
5081 if (TREE_CODE (TREE_TYPE (exp
)) == RECORD_TYPE
5082 && TYPE_IS_PADDING_P (TREE_TYPE (exp
)))
5083 exp
= convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp
))), exp
);
5088 /* Protect EXP from multiple evaluation. This may make a SAVE_EXPR. */
5091 protect_multiple_eval (exp
)
5094 tree type
= TREE_TYPE (exp
);
5096 /* If this has no side effects, we don't need to do anything. */
5097 if (! TREE_SIDE_EFFECTS (exp
))
5100 /* If it is a conversion, protect what's inside the conversion.
5101 Similarly, if we're indirectly referencing something, we only
5102 actually need to protect the address since the data itself can't
5103 change in these situations. */
5104 else if (TREE_CODE (exp
) == NON_LVALUE_EXPR
5105 || TREE_CODE (exp
) == NOP_EXPR
|| TREE_CODE (exp
) == CONVERT_EXPR
5106 || TREE_CODE (exp
) == VIEW_CONVERT_EXPR
5107 || TREE_CODE (exp
) == INDIRECT_REF
5108 || TREE_CODE (exp
) == UNCONSTRAINED_ARRAY_REF
)
5109 return build1 (TREE_CODE (exp
), type
,
5110 protect_multiple_eval (TREE_OPERAND (exp
, 0)));
5112 /* If EXP is a fat pointer or something that can be placed into a register,
5113 just make a SAVE_EXPR. */
5114 if (TYPE_FAT_POINTER_P (type
) || TYPE_MODE (type
) != BLKmode
)
5115 return save_expr (exp
);
5117 /* Otherwise, dereference, protect the address, and re-reference. */
5120 build_unary_op (INDIRECT_REF
, type
,
5121 save_expr (build_unary_op (ADDR_EXPR
,
5122 build_reference_type (type
),
5126 /* This is equivalent to stabilize_reference in GCC's tree.c, but we know
5127 how to handle our new nodes and we take an extra argument that says
5128 whether to force evaluation of everything. */
5131 gnat_stabilize_reference (ref
, force
)
5135 register tree type
= TREE_TYPE (ref
);
5136 register enum tree_code code
= TREE_CODE (ref
);
5137 register tree result
;
5144 /* No action is needed in this case. */
5150 case FIX_TRUNC_EXPR
:
5151 case FIX_FLOOR_EXPR
:
5152 case FIX_ROUND_EXPR
:
5154 case VIEW_CONVERT_EXPR
:
5157 = build1 (code
, type
,
5158 gnat_stabilize_reference (TREE_OPERAND (ref
, 0), force
));
5162 case UNCONSTRAINED_ARRAY_REF
:
5163 result
= build1 (code
, type
,
5164 gnat_stabilize_reference_1 (TREE_OPERAND (ref
, 0),
5169 result
= build (COMPONENT_REF
, type
,
5170 gnat_stabilize_reference (TREE_OPERAND (ref
, 0),
5172 TREE_OPERAND (ref
, 1));
5176 result
= build (BIT_FIELD_REF
, type
,
5177 gnat_stabilize_reference (TREE_OPERAND (ref
, 0), force
),
5178 gnat_stabilize_reference_1 (TREE_OPERAND (ref
, 1),
5180 gnat_stabilize_reference_1 (TREE_OPERAND (ref
, 2),
5185 result
= build (ARRAY_REF
, type
,
5186 gnat_stabilize_reference (TREE_OPERAND (ref
, 0), force
),
5187 gnat_stabilize_reference_1 (TREE_OPERAND (ref
, 1),
5191 case ARRAY_RANGE_REF
:
5192 result
= build (ARRAY_RANGE_REF
, type
,
5193 gnat_stabilize_reference (TREE_OPERAND (ref
, 0), force
),
5194 gnat_stabilize_reference_1 (TREE_OPERAND (ref
, 1),
5199 result
= build (COMPOUND_EXPR
, type
,
5200 gnat_stabilize_reference_1 (TREE_OPERAND (ref
, 0),
5202 gnat_stabilize_reference (TREE_OPERAND (ref
, 1),
5207 result
= build1 (INDIRECT_REF
, type
,
5208 save_expr (build1 (ADDR_EXPR
,
5209 build_reference_type (type
), ref
)));
5212 /* If arg isn't a kind of lvalue we recognize, make no change.
5213 Caller should recognize the error for an invalid lvalue. */
5218 return error_mark_node
;
5221 TREE_READONLY (result
) = TREE_READONLY (ref
);
5225 /* Similar to stabilize_reference_1 in tree.c, but supports an extra
5226 arg to force a SAVE_EXPR for everything. */
5229 gnat_stabilize_reference_1 (e
, force
)
5233 register enum tree_code code
= TREE_CODE (e
);
5234 register tree type
= TREE_TYPE (e
);
5235 register tree result
;
5237 /* We cannot ignore const expressions because it might be a reference
5238 to a const array but whose index contains side-effects. But we can
5239 ignore things that are actual constant or that already have been
5240 handled by this function. */
5242 if (TREE_CONSTANT (e
) || code
== SAVE_EXPR
)
5245 switch (TREE_CODE_CLASS (code
))
5255 if (TREE_SIDE_EFFECTS (e
) || force
)
5256 return save_expr (e
);
5260 /* Constants need no processing. In fact, we should never reach
5265 /* Recursively stabilize each operand. */
5266 result
= build (code
, type
,
5267 gnat_stabilize_reference_1 (TREE_OPERAND (e
, 0), force
),
5268 gnat_stabilize_reference_1 (TREE_OPERAND (e
, 1), force
));
5272 /* Recursively stabilize each operand. */
5273 result
= build1 (code
, type
,
5274 gnat_stabilize_reference_1 (TREE_OPERAND (e
, 0),
5282 TREE_READONLY (result
) = TREE_READONLY (e
);
5286 /* GNAT_UNIT is the Defining_Identifier for some package or subprogram,
5287 either a spec or a body, BODY_P says which. If needed, make a function
5288 to be the elaboration routine for that object and perform the elaborations
5291 Return 1 if we didn't need an elaboration function, zero otherwise. */
5294 build_unit_elab (gnat_unit
, body_p
, gnu_elab_list
)
5295 Entity_Id gnat_unit
;
5303 /* If we have nothing to do, return. */
5304 if (gnu_elab_list
== 0)
5307 /* Prevent the elaboration list from being reclaimed by the GC. */
5308 gnu_pending_elaboration_lists
= chainon (gnu_pending_elaboration_lists
,
5311 /* Set our file and line number to that of the object and set up the
5312 elaboration routine. */
5313 gnu_decl
= create_subprog_decl (create_concat_name (gnat_unit
,
5316 NULL_TREE
, void_ftype
, NULL_TREE
, 0, 1, 0,
5318 DECL_ELABORATION_PROC_P (gnu_decl
) = 1;
5320 begin_subprog_body (gnu_decl
);
5321 set_lineno (gnat_unit
, 1);
5323 gnu_block_stack
= tree_cons (NULL_TREE
, NULL_TREE
, gnu_block_stack
);
5324 expand_start_bindings (0);
5326 /* Emit the assignments for the elaborations we have to do. If there
5327 is no destination, this is just a call to execute some statement
5328 that was placed within the declarative region. But first save a
5329 pointer so we can see if any insns were generated. */
5331 insn
= get_last_insn ();
5333 for (; gnu_elab_list
; gnu_elab_list
= TREE_CHAIN (gnu_elab_list
))
5334 if (TREE_PURPOSE (gnu_elab_list
) == NULL_TREE
)
5336 if (TREE_VALUE (gnu_elab_list
) != 0)
5337 expand_expr_stmt (TREE_VALUE (gnu_elab_list
));
5341 tree lhs
= TREE_PURPOSE (gnu_elab_list
);
5343 input_filename
= DECL_SOURCE_FILE (lhs
);
5344 lineno
= DECL_SOURCE_LINE (lhs
);
5346 /* If LHS has a padded type, convert it to the unpadded type
5347 so the assignment is done properly. */
5348 if (TREE_CODE (TREE_TYPE (lhs
)) == RECORD_TYPE
5349 && TYPE_IS_PADDING_P (TREE_TYPE (lhs
)))
5350 lhs
= convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (lhs
))), lhs
);
5352 emit_line_note (input_filename
, lineno
);
5353 expand_expr_stmt (build_binary_op (MODIFY_EXPR
, NULL_TREE
,
5354 TREE_PURPOSE (gnu_elab_list
),
5355 TREE_VALUE (gnu_elab_list
)));
5358 /* See if any non-NOTE insns were generated. */
5359 for (insn
= NEXT_INSN (insn
); insn
; insn
= NEXT_INSN (insn
))
5360 if (GET_RTX_CLASS (GET_CODE (insn
)) == 'i')
5366 expand_end_bindings (getdecls (), kept_level_p (), 0);
5367 poplevel (kept_level_p (), 1, 0);
5368 gnu_block_stack
= TREE_CHAIN (gnu_block_stack
);
5369 end_subprog_body ();
5371 /* We are finished with the elaboration list it can now be discarded. */
5372 gnu_pending_elaboration_lists
= TREE_CHAIN (gnu_pending_elaboration_lists
);
5374 /* If there were no insns, we don't need an elab routine. It would
5375 be nice to not output this one, but there's no good way to do that. */
5379 extern char *__gnat_to_canonical_file_spec
PARAMS ((char *));
5381 /* Determine the input_filename and the lineno from the source location
5382 (Sloc) of GNAT_NODE node. Set the global variable input_filename and
5383 lineno. If WRITE_NOTE_P is true, emit a line number note. */
5386 set_lineno (gnat_node
, write_note_p
)
5390 Source_Ptr source_location
= Sloc (gnat_node
);
5392 /* If node not from source code, ignore. */
5393 if (source_location
< 0)
5396 /* Use the identifier table to make a hashed, permanent copy of the filename,
5397 since the name table gets reallocated after Gigi returns but before all
5398 the debugging information is output. The call to
5399 __gnat_to_canonical_file_spec translates filenames from pragmas
5400 Source_Reference that contain host style syntax not understood by gdb. */
5402 = IDENTIFIER_POINTER
5404 (__gnat_to_canonical_file_spec
5406 (Debug_Source_Name (Get_Source_File_Index (source_location
))))));
5408 /* ref_filename is the reference file name as given by sinput (i.e no
5411 = IDENTIFIER_POINTER
5414 (Reference_Name (Get_Source_File_Index (source_location
)))));;
5415 lineno
= Get_Logical_Line_Number (source_location
);
5418 emit_line_note (input_filename
, lineno
);
5421 /* Post an error message. MSG is the error message, properly annotated.
5422 NODE is the node at which to post the error and the node to use for the
5423 "&" substitution. */
5426 post_error (msg
, node
)
5430 String_Template temp
;
5433 temp
.Low_Bound
= 1, temp
.High_Bound
= strlen (msg
);
5434 fp
.Array
= msg
, fp
.Bounds
= &temp
;
5436 Error_Msg_N (fp
, node
);
5439 /* Similar, but NODE is the node at which to post the error and ENT
5440 is the node to use for the "&" substitution. */
5443 post_error_ne (msg
, node
, ent
)
5448 String_Template temp
;
5451 temp
.Low_Bound
= 1, temp
.High_Bound
= strlen (msg
);
5452 fp
.Array
= msg
, fp
.Bounds
= &temp
;
5454 Error_Msg_NE (fp
, node
, ent
);
5457 /* Similar, but NODE is the node at which to post the error, ENT is the node
5458 to use for the "&" substitution, and N is the number to use for the ^. */
5461 post_error_ne_num (msg
, node
, ent
, n
)
5467 String_Template temp
;
5470 temp
.Low_Bound
= 1, temp
.High_Bound
= strlen (msg
);
5471 fp
.Array
= msg
, fp
.Bounds
= &temp
;
5472 Error_Msg_Uint_1
= UI_From_Int (n
);
5475 Error_Msg_NE (fp
, node
, ent
);
5478 /* Similar to post_error_ne_num, but T is a GCC tree representing the
5479 number to write. If the tree represents a constant that fits within
5480 a host integer, the text inside curly brackets in MSG will be output
5481 (presumably including a '^'). Otherwise that text will not be output
5482 and the text inside square brackets will be output instead. */
5485 post_error_ne_tree (msg
, node
, ent
, t
)
5491 char *newmsg
= alloca (strlen (msg
) + 1);
5492 String_Template temp
= {1, 0};
5494 char start_yes
, end_yes
, start_no
, end_no
;
5498 fp
.Array
= newmsg
, fp
.Bounds
= &temp
;
5500 if (host_integerp (t
, 1)
5501 #if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_INT
5502 && compare_tree_int (t
, 1 << (HOST_BITS_PER_INT
- 2)) < 0
5506 Error_Msg_Uint_1
= UI_From_Int (tree_low_cst (t
, 1));
5507 start_yes
= '{', end_yes
= '}', start_no
= '[', end_no
= ']';
5510 start_yes
= '[', end_yes
= ']', start_no
= '{', end_no
= '}';
5512 for (p
= msg
, q
= newmsg
; *p
!= 0; p
++)
5514 if (*p
== start_yes
)
5515 for (p
++; *p
!= end_yes
; p
++)
5517 else if (*p
== start_no
)
5518 for (p
++; *p
!= end_no
; p
++)
5526 temp
.High_Bound
= strlen (newmsg
);
5528 Error_Msg_NE (fp
, node
, ent
);
5531 /* Similar to post_error_ne_tree, except that NUM is a second
5532 integer to write in the message. */
5535 post_error_ne_tree_2 (msg
, node
, ent
, t
, num
)
5542 Error_Msg_Uint_2
= UI_From_Int (num
);
5543 post_error_ne_tree (msg
, node
, ent
, t
);
5546 /* Set the node for a second '&' in the error message. */
5549 set_second_error_entity (e
)
5552 Error_Msg_Node_2
= e
;
5555 /* Signal abort, with "Gigi abort" as the error label, and error_gnat_node
5556 as the relevant node that provides the location info for the error */
5562 String_Template temp
= {1, 10};
5565 fp
.Array
= "Gigi abort", fp
.Bounds
= &temp
;
5567 Current_Error_Node
= error_gnat_node
;
5568 Compiler_Abort (fp
, code
);
5571 /* Initialize the table that maps GNAT codes to GCC codes for simple
5572 binary and unary operations. */
5577 gnu_codes
[N_And_Then
] = TRUTH_ANDIF_EXPR
;
5578 gnu_codes
[N_Or_Else
] = TRUTH_ORIF_EXPR
;
5580 gnu_codes
[N_Op_And
] = TRUTH_AND_EXPR
;
5581 gnu_codes
[N_Op_Or
] = TRUTH_OR_EXPR
;
5582 gnu_codes
[N_Op_Xor
] = TRUTH_XOR_EXPR
;
5583 gnu_codes
[N_Op_Eq
] = EQ_EXPR
;
5584 gnu_codes
[N_Op_Ne
] = NE_EXPR
;
5585 gnu_codes
[N_Op_Lt
] = LT_EXPR
;
5586 gnu_codes
[N_Op_Le
] = LE_EXPR
;
5587 gnu_codes
[N_Op_Gt
] = GT_EXPR
;
5588 gnu_codes
[N_Op_Ge
] = GE_EXPR
;
5589 gnu_codes
[N_Op_Add
] = PLUS_EXPR
;
5590 gnu_codes
[N_Op_Subtract
] = MINUS_EXPR
;
5591 gnu_codes
[N_Op_Multiply
] = MULT_EXPR
;
5592 gnu_codes
[N_Op_Mod
] = FLOOR_MOD_EXPR
;
5593 gnu_codes
[N_Op_Rem
] = TRUNC_MOD_EXPR
;
5594 gnu_codes
[N_Op_Minus
] = NEGATE_EXPR
;
5595 gnu_codes
[N_Op_Abs
] = ABS_EXPR
;
5596 gnu_codes
[N_Op_Not
] = TRUTH_NOT_EXPR
;
5597 gnu_codes
[N_Op_Rotate_Left
] = LROTATE_EXPR
;
5598 gnu_codes
[N_Op_Rotate_Right
] = RROTATE_EXPR
;
5599 gnu_codes
[N_Op_Shift_Left
] = LSHIFT_EXPR
;
5600 gnu_codes
[N_Op_Shift_Right
] = RSHIFT_EXPR
;
5601 gnu_codes
[N_Op_Shift_Right_Arithmetic
] = RSHIFT_EXPR
;
5604 #include "gt-ada-trans.h"