]> gcc.gnu.org Git - gcc.git/blame - gcc/ada/gcc-interface/trans.c
re PR other/38920 (dw2 exceptions don't work.)
[gcc.git] / gcc / ada / gcc-interface / trans.c
CommitLineData
a1ab4c31
AC
1/****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * T R A N S *
6 * *
7 * C Implementation File *
8 * *
66647d44 9 * Copyright (C) 1992-2009, Free Software Foundation, Inc. *
a1ab4c31
AC
10 * *
11 * GNAT is free software; you can redistribute it and/or modify it under *
12 * terms of the GNU General Public License as published by the Free Soft- *
13 * ware Foundation; either version 2, or (at your option) any later ver- *
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
17 * for more details. You should have received a copy of the GNU General *
18 * Public License distributed with GNAT; see file COPYING. If not, write *
19 * to the Free Software Foundation, 51 Franklin Street, Fifth Floor, *
20 * Boston, MA 02110-1301, USA. *
21 * *
22 * GNAT was originally developed by the GNAT team at New York University. *
23 * Extensive contributions were provided by Ada Core Technologies Inc. *
24 * *
25 ****************************************************************************/
26
27#include "config.h"
28#include "system.h"
29#include "coretypes.h"
30#include "tm.h"
31#include "tree.h"
32#include "real.h"
33#include "flags.h"
34#include "toplev.h"
35#include "rtl.h"
36#include "expr.h"
37#include "ggc.h"
38#include "cgraph.h"
39#include "function.h"
40#include "except.h"
41#include "debug.h"
42#include "output.h"
43#include "tree-iterator.h"
44#include "gimple.h"
45#include "ada.h"
46#include "types.h"
47#include "atree.h"
48#include "elists.h"
49#include "namet.h"
50#include "nlists.h"
51#include "snames.h"
52#include "stringt.h"
53#include "uintp.h"
54#include "urealp.h"
55#include "fe.h"
56#include "sinfo.h"
57#include "einfo.h"
58#include "ada-tree.h"
59#include "gigi.h"
60#include "adadecode.h"
61
62#include "dwarf2.h"
63#include "dwarf2out.h"
64
65/* We should avoid allocating more than ALLOCA_THRESHOLD bytes via alloca,
66 for fear of running out of stack space. If we need more, we use xmalloc
67 instead. */
68#define ALLOCA_THRESHOLD 1000
69
70/* Let code below know whether we are targetting VMS without need of
71 intrusive preprocessor directives. */
72#ifndef TARGET_ABI_OPEN_VMS
73#define TARGET_ABI_OPEN_VMS 0
74#endif
75
6eca32ba 76/* For efficient float-to-int rounding, it is necessary to know whether
3453cb78 77 floating-point arithmetic may use wider intermediate results.
6eca32ba
GB
78 When FP_ARITH_MAY_WIDEN is not defined, be conservative and only assume
79 floating-point arithmetic does not widen if double precision is emulated. */
80
81#ifndef FP_ARITH_MAY_WIDEN
82#if defined(HAVE_extendsfdf2)
83#define FP_ARITH_MAY_WIDEN HAVE_extendsfdf2
84#else
85#define FP_ARITH_MAY_WIDEN 0
86#endif
87#endif
88
a1ab4c31
AC
89extern char *__gnat_to_canonical_file_spec (char *);
90
91int max_gnat_nodes;
92int number_names;
93int number_files;
94struct Node *Nodes_Ptr;
95Node_Id *Next_Node_Ptr;
96Node_Id *Prev_Node_Ptr;
97struct Elist_Header *Elists_Ptr;
98struct Elmt_Item *Elmts_Ptr;
99struct String_Entry *Strings_Ptr;
100Char_Code *String_Chars_Ptr;
101struct List_Header *List_Headers_Ptr;
102
103/* Current filename without path. */
104const char *ref_filename;
105
106/* If true, then gigi is being called on an analyzed but unexpanded
107 tree, and the only purpose of the call is to properly annotate
108 types with representation information. */
109bool type_annotate_only;
110
111/* When not optimizing, we cache the 'First, 'Last and 'Length attributes
112 of unconstrained array IN parameters to avoid emitting a great deal of
113 redundant instructions to recompute them each time. */
114struct parm_attr GTY (())
115{
116 int id; /* GTY doesn't like Entity_Id. */
117 int dim;
118 tree first;
119 tree last;
120 tree length;
121};
122
123typedef struct parm_attr *parm_attr;
124
125DEF_VEC_P(parm_attr);
126DEF_VEC_ALLOC_P(parm_attr,gc);
127
128struct language_function GTY(())
129{
130 VEC(parm_attr,gc) *parm_attr_cache;
131};
132
133#define f_parm_attr_cache \
134 DECL_STRUCT_FUNCTION (current_function_decl)->language->parm_attr_cache
135
136/* A structure used to gather together information about a statement group.
137 We use this to gather related statements, for example the "then" part
138 of a IF. In the case where it represents a lexical scope, we may also
139 have a BLOCK node corresponding to it and/or cleanups. */
140
141struct stmt_group GTY((chain_next ("%h.previous"))) {
142 struct stmt_group *previous; /* Previous code group. */
143 tree stmt_list; /* List of statements for this code group. */
144 tree block; /* BLOCK for this code group, if any. */
145 tree cleanups; /* Cleanups for this code group, if any. */
146};
147
148static GTY(()) struct stmt_group *current_stmt_group;
149
150/* List of unused struct stmt_group nodes. */
151static GTY((deletable)) struct stmt_group *stmt_group_free_list;
152
153/* A structure used to record information on elaboration procedures
154 we've made and need to process.
155
156 ??? gnat_node should be Node_Id, but gengtype gets confused. */
157
158struct elab_info GTY((chain_next ("%h.next"))) {
159 struct elab_info *next; /* Pointer to next in chain. */
160 tree elab_proc; /* Elaboration procedure. */
161 int gnat_node; /* The N_Compilation_Unit. */
162};
163
164static GTY(()) struct elab_info *elab_info_list;
165
166/* Free list of TREE_LIST nodes used for stacks. */
167static GTY((deletable)) tree gnu_stack_free_list;
168
169/* List of TREE_LIST nodes representing a stack of exception pointer
170 variables. TREE_VALUE is the VAR_DECL that stores the address of
171 the raised exception. Nonzero means we are in an exception
172 handler. Not used in the zero-cost case. */
173static GTY(()) tree gnu_except_ptr_stack;
174
175/* List of TREE_LIST nodes used to store the current elaboration procedure
176 decl. TREE_VALUE is the decl. */
177static GTY(()) tree gnu_elab_proc_stack;
178
179/* Variable that stores a list of labels to be used as a goto target instead of
180 a return in some functions. See processing for N_Subprogram_Body. */
181static GTY(()) tree gnu_return_label_stack;
182
183/* List of TREE_LIST nodes representing a stack of LOOP_STMT nodes.
184 TREE_VALUE of each entry is the label of the corresponding LOOP_STMT. */
185static GTY(()) tree gnu_loop_label_stack;
186
187/* List of TREE_LIST nodes representing labels for switch statements.
188 TREE_VALUE of each entry is the label at the end of the switch. */
189static GTY(()) tree gnu_switch_label_stack;
190
191/* List of TREE_LIST nodes containing the stacks for N_{Push,Pop}_*_Label. */
192static GTY(()) tree gnu_constraint_error_label_stack;
193static GTY(()) tree gnu_storage_error_label_stack;
194static GTY(()) tree gnu_program_error_label_stack;
195
196/* Map GNAT tree codes to GCC tree codes for simple expressions. */
197static enum tree_code gnu_codes[Number_Node_Kinds];
198
199/* Current node being treated, in case abort called. */
200Node_Id error_gnat_node;
201
202static void init_code_table (void);
203static void Compilation_Unit_to_gnu (Node_Id);
204static void record_code_position (Node_Id);
205static void insert_code_for (Node_Id);
206static void add_cleanup (tree, Node_Id);
207static tree unshare_save_expr (tree *, int *, void *);
208static void add_stmt_list (List_Id);
209static void push_exception_label_stack (tree *, Entity_Id);
210static tree build_stmt_group (List_Id, bool);
211static void push_stack (tree *, tree, tree);
212static void pop_stack (tree *);
213static enum gimplify_status gnat_gimplify_stmt (tree *);
214static void elaborate_all_entities (Node_Id);
215static void process_freeze_entity (Node_Id);
216static void process_inlined_subprograms (Node_Id);
217static void process_decls (List_Id, List_Id, Node_Id, bool, bool);
218static tree emit_range_check (tree, Node_Id);
219static tree emit_index_check (tree, tree, tree, tree);
220static tree emit_check (tree, tree, int);
b666e568
GB
221static tree build_unary_op_trapv (enum tree_code, tree, tree);
222static tree build_binary_op_trapv (enum tree_code, tree, tree, tree);
a1ab4c31
AC
223static tree convert_with_check (Entity_Id, tree, bool, bool, bool);
224static bool smaller_packable_type_p (tree, tree);
225static bool addressable_p (tree, tree);
226static tree assoc_to_constructor (Entity_Id, Node_Id, tree);
227static tree extract_values (tree, tree);
228static tree pos_to_constructor (Node_Id, tree, Entity_Id);
229static tree maybe_implicit_deref (tree);
230static tree gnat_stabilize_reference (tree, bool);
231static tree gnat_stabilize_reference_1 (tree, bool);
232static void set_expr_location_from_node (tree, Node_Id);
233static int lvalue_required_p (Node_Id, tree, int);
234
235/* Hooks for debug info back-ends, only supported and used in a restricted set
236 of configurations. */
237static const char *extract_encoding (const char *) ATTRIBUTE_UNUSED;
238static const char *decode_name (const char *) ATTRIBUTE_UNUSED;
239\f
240/* This is the main program of the back-end. It sets up all the table
241 structures and then generates code. */
242
243void
244gigi (Node_Id gnat_root, int max_gnat_node, int number_name,
245 struct Node *nodes_ptr, Node_Id *next_node_ptr, Node_Id *prev_node_ptr,
246 struct Elist_Header *elists_ptr, struct Elmt_Item *elmts_ptr,
247 struct String_Entry *strings_ptr, Char_Code *string_chars_ptr,
248 struct List_Header *list_headers_ptr, Nat number_file,
01ddebf2 249 struct File_Info_Type *file_info_ptr, Entity_Id standard_boolean,
a1ab4c31
AC
250 Entity_Id standard_integer, Entity_Id standard_long_long_float,
251 Entity_Id standard_exception_type, Int gigi_operating_mode)
252{
01ddebf2
EB
253 Entity_Id gnat_literal;
254 tree gnu_standard_long_long_float, gnu_standard_exception_type, t;
a1ab4c31
AC
255 struct elab_info *info;
256 int i;
257
258 max_gnat_nodes = max_gnat_node;
259 number_names = number_name;
260 number_files = number_file;
261 Nodes_Ptr = nodes_ptr;
262 Next_Node_Ptr = next_node_ptr;
263 Prev_Node_Ptr = prev_node_ptr;
264 Elists_Ptr = elists_ptr;
265 Elmts_Ptr = elmts_ptr;
266 Strings_Ptr = strings_ptr;
267 String_Chars_Ptr = string_chars_ptr;
268 List_Headers_Ptr = list_headers_ptr;
269
270 type_annotate_only = (gigi_operating_mode == 1);
271
272 for (i = 0; i < number_files; i++)
273 {
274 /* Use the identifier table to make a permanent copy of the filename as
275 the name table gets reallocated after Gigi returns but before all the
276 debugging information is output. The __gnat_to_canonical_file_spec
277 call translates filenames from pragmas Source_Reference that contain
278 host style syntax not understood by gdb. */
279 const char *filename
280 = IDENTIFIER_POINTER
281 (get_identifier
282 (__gnat_to_canonical_file_spec
283 (Get_Name_String (file_info_ptr[i].File_Name))));
284
285 /* We rely on the order isomorphism between files and line maps. */
286 gcc_assert ((int) line_table->used == i);
287
288 /* We create the line map for a source file at once, with a fixed number
289 of columns chosen to avoid jumping over the next power of 2. */
290 linemap_add (line_table, LC_ENTER, 0, filename, 1);
291 linemap_line_start (line_table, file_info_ptr[i].Num_Source_Lines, 252);
292 linemap_position_for_column (line_table, 252 - 1);
293 linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
294 }
295
296 /* Initialize ourselves. */
297 init_code_table ();
298 init_gnat_to_gnu ();
299 gnat_compute_largest_alignment ();
300 init_dummy_type ();
301
302 /* If we are just annotating types, give VOID_TYPE zero sizes to avoid
303 errors. */
304 if (type_annotate_only)
305 {
306 TYPE_SIZE (void_type_node) = bitsize_zero_node;
307 TYPE_SIZE_UNIT (void_type_node) = size_zero_node;
308 }
309
310 /* If the GNU type extensions to DWARF are available, setup the hooks. */
311#if defined (DWARF2_DEBUGGING_INFO) && defined (DWARF2_GNU_TYPE_EXTENSIONS)
312 /* We condition the name demangling and the generation of type encoding
313 strings on -gdwarf+ and always set descriptive types on. */
314 if (use_gnu_debug_info_extensions)
315 {
316 dwarf2out_set_type_encoding_func (extract_encoding);
317 dwarf2out_set_demangle_name_func (decode_name);
318 }
319 dwarf2out_set_descriptive_type_func (get_parallel_type);
320#endif
321
322 /* Enable GNAT stack checking method if needed */
323 if (!Stack_Check_Probes_On_Target)
324 set_stack_check_libfunc (gen_rtx_SYMBOL_REF (Pmode, "_gnat_stack_check"));
325
326 /* Give names and make TYPE_DECLs for common types. */
327 create_type_decl (get_identifier (SIZE_TYPE), sizetype,
328 NULL, false, true, Empty);
01ddebf2
EB
329 create_type_decl (get_identifier ("boolean"), boolean_type_node,
330 NULL, false, true, Empty);
a1ab4c31
AC
331 create_type_decl (get_identifier ("integer"), integer_type_node,
332 NULL, false, true, Empty);
333 create_type_decl (get_identifier ("unsigned char"), char_type_node,
334 NULL, false, true, Empty);
335 create_type_decl (get_identifier ("long integer"), long_integer_type_node,
336 NULL, false, true, Empty);
337
01ddebf2
EB
338 /* Save the type we made for boolean as the type for Standard.Boolean. */
339 save_gnu_tree (Base_Type (standard_boolean), TYPE_NAME (boolean_type_node),
340 false);
341 gnat_literal = First_Literal (Base_Type (standard_boolean));
342 t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
343 gcc_assert (t == boolean_false_node);
344 t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
345 boolean_type_node, t, true, false, false, false,
346 NULL, gnat_literal);
347 DECL_IGNORED_P (t) = 1;
348 save_gnu_tree (gnat_literal, t, false);
349 gnat_literal = Next_Literal (gnat_literal);
350 t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
351 gcc_assert (t == boolean_true_node);
352 t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
353 boolean_type_node, t, true, false, false, false,
354 NULL, gnat_literal);
355 DECL_IGNORED_P (t) = 1;
356 save_gnu_tree (gnat_literal, t, false);
357
a1ab4c31
AC
358 /* Save the type we made for integer as the type for Standard.Integer.
359 Then make the rest of the standard types. Note that some of these
360 may be subtypes. */
361 save_gnu_tree (Base_Type (standard_integer), TYPE_NAME (integer_type_node),
362 false);
363
364 gnu_except_ptr_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
365 gnu_constraint_error_label_stack
366 = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
367 gnu_storage_error_label_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
368 gnu_program_error_label_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
369
370 gnu_standard_long_long_float
371 = gnat_to_gnu_entity (Base_Type (standard_long_long_float), NULL_TREE, 0);
372 gnu_standard_exception_type
373 = gnat_to_gnu_entity (Base_Type (standard_exception_type), NULL_TREE, 0);
374
375 init_gigi_decls (gnu_standard_long_long_float, gnu_standard_exception_type);
376
377 /* Process any Pragma Ident for the main unit. */
378#ifdef ASM_OUTPUT_IDENT
379 if (Present (Ident_String (Main_Unit)))
380 ASM_OUTPUT_IDENT
381 (asm_out_file,
382 TREE_STRING_POINTER (gnat_to_gnu (Ident_String (Main_Unit))));
383#endif
384
385 /* If we are using the GCC exception mechanism, let GCC know. */
386 if (Exception_Mechanism == Back_End_Exceptions)
387 gnat_init_gcc_eh ();
388
389 gcc_assert (Nkind (gnat_root) == N_Compilation_Unit);
6a7a3f31
EB
390
391 /* Declare the name of the compilation unit as the first global
392 name in order to make the middle-end fully deterministic. */
393 t = create_concat_name (Defining_Entity (Unit (gnat_root)), NULL);
394 first_global_object_name = ggc_strdup (IDENTIFIER_POINTER (t));
395
396 /* Now translate the compilation unit proper. */
a1ab4c31
AC
397 start_stmt_group ();
398 Compilation_Unit_to_gnu (gnat_root);
399
6a7a3f31 400 /* Finally see if we have any elaboration procedures to deal with. */
a1ab4c31
AC
401 for (info = elab_info_list; info; info = info->next)
402 {
403 tree gnu_body = DECL_SAVED_TREE (info->elab_proc);
404
405 /* Unshare SAVE_EXPRs between subprograms. These are not unshared by
406 the gimplifier for obvious reasons, but it turns out that we need to
407 unshare them for the global level because of SAVE_EXPRs made around
408 checks for global objects and around allocators for global objects
409 of variable size, in order to prevent node sharing in the underlying
410 expression. Note that this implicitly assumes that the SAVE_EXPR
411 nodes themselves are not shared between subprograms, which would be
412 an upstream bug for which we would not change the outcome. */
413 walk_tree_without_duplicates (&gnu_body, unshare_save_expr, NULL);
414
415 /* Process the function as others, but for indicating this is an
416 elab proc, to be discarded if empty, then propagate the status
417 up to the GNAT tree node. */
418 begin_subprog_body (info->elab_proc);
419 end_subprog_body (gnu_body, true);
420
421 if (empty_body_p (gimple_body (info->elab_proc)))
422 Set_Has_No_Elaboration_Code (info->gnat_node, 1);
423 }
424
425 /* We cannot track the location of errors past this point. */
426 error_gnat_node = Empty;
427}
428\f
429/* Return a positive value if an lvalue is required for GNAT_NODE.
430 GNU_TYPE is the type that will be used for GNAT_NODE in the
431 translated GNU tree. ALIASED indicates whether the underlying
432 object represented by GNAT_NODE is aliased in the Ada sense.
433
434 The function climbs up the GNAT tree starting from the node and
435 returns 1 upon encountering a node that effectively requires an
436 lvalue downstream. It returns int instead of bool to facilitate
437 usage in non purely binary logic contexts. */
438
439static int
440lvalue_required_p (Node_Id gnat_node, tree gnu_type, int aliased)
441{
442 Node_Id gnat_parent = Parent (gnat_node), gnat_temp;
443
444 switch (Nkind (gnat_parent))
445 {
446 case N_Reference:
447 return 1;
448
449 case N_Attribute_Reference:
450 {
451 unsigned char id = Get_Attribute_Id (Attribute_Name (gnat_parent));
452 return id == Attr_Address
453 || id == Attr_Access
454 || id == Attr_Unchecked_Access
455 || id == Attr_Unrestricted_Access;
456 }
457
458 case N_Parameter_Association:
459 case N_Function_Call:
460 case N_Procedure_Call_Statement:
461 return (must_pass_by_ref (gnu_type) || default_pass_by_ref (gnu_type));
462
463 case N_Indexed_Component:
464 /* Only the array expression can require an lvalue. */
465 if (Prefix (gnat_parent) != gnat_node)
466 return 0;
467
468 /* ??? Consider that referencing an indexed component with a
469 non-constant index forces the whole aggregate to memory.
470 Note that N_Integer_Literal is conservative, any static
471 expression in the RM sense could probably be accepted. */
472 for (gnat_temp = First (Expressions (gnat_parent));
473 Present (gnat_temp);
474 gnat_temp = Next (gnat_temp))
475 if (Nkind (gnat_temp) != N_Integer_Literal)
476 return 1;
477
478 /* ... fall through ... */
479
480 case N_Slice:
481 /* Only the array expression can require an lvalue. */
482 if (Prefix (gnat_parent) != gnat_node)
483 return 0;
484
485 aliased |= Has_Aliased_Components (Etype (gnat_node));
486 return lvalue_required_p (gnat_parent, gnu_type, aliased);
487
488 case N_Selected_Component:
489 aliased |= Is_Aliased (Entity (Selector_Name (gnat_parent)));
490 return lvalue_required_p (gnat_parent, gnu_type, aliased);
491
492 case N_Object_Renaming_Declaration:
493 /* We need to make a real renaming only if the constant object is
494 aliased or if we may use a renaming pointer; otherwise we can
495 optimize and return the rvalue. We make an exception if the object
496 is an identifier since in this case the rvalue can be propagated
497 attached to the CONST_DECL. */
498 return (aliased != 0
499 /* This should match the constant case of the renaming code. */
500 || Is_Composite_Type (Etype (Name (gnat_parent)))
501 || Nkind (Name (gnat_parent)) == N_Identifier);
502
503 default:
504 return 0;
505 }
506
507 gcc_unreachable ();
508}
509
510/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Identifier,
511 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer
512 to where we should place the result type. */
513
514static tree
515Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
516{
517 Node_Id gnat_temp, gnat_temp_type;
518 tree gnu_result, gnu_result_type;
519
520 /* Whether we should require an lvalue for GNAT_NODE. Needed in
521 specific circumstances only, so evaluated lazily. < 0 means
522 unknown, > 0 means known true, 0 means known false. */
523 int require_lvalue = -1;
524
525 /* If GNAT_NODE is a constant, whether we should use the initialization
526 value instead of the constant entity, typically for scalars with an
527 address clause when the parent doesn't require an lvalue. */
528 bool use_constant_initializer = false;
529
530 /* If the Etype of this node does not equal the Etype of the Entity,
531 something is wrong with the entity map, probably in generic
532 instantiation. However, this does not apply to types. Since we sometime
533 have strange Ekind's, just do this test for objects. Also, if the Etype of
534 the Entity is private, the Etype of the N_Identifier is allowed to be the
535 full type and also we consider a packed array type to be the same as the
536 original type. Similarly, a class-wide type is equivalent to a subtype of
537 itself. Finally, if the types are Itypes, one may be a copy of the other,
538 which is also legal. */
539 gnat_temp = (Nkind (gnat_node) == N_Defining_Identifier
540 ? gnat_node : Entity (gnat_node));
541 gnat_temp_type = Etype (gnat_temp);
542
543 gcc_assert (Etype (gnat_node) == gnat_temp_type
544 || (Is_Packed (gnat_temp_type)
545 && Etype (gnat_node) == Packed_Array_Type (gnat_temp_type))
546 || (Is_Class_Wide_Type (Etype (gnat_node)))
547 || (IN (Ekind (gnat_temp_type), Private_Kind)
548 && Present (Full_View (gnat_temp_type))
549 && ((Etype (gnat_node) == Full_View (gnat_temp_type))
550 || (Is_Packed (Full_View (gnat_temp_type))
551 && (Etype (gnat_node)
552 == Packed_Array_Type (Full_View
553 (gnat_temp_type))))))
554 || (Is_Itype (Etype (gnat_node)) && Is_Itype (gnat_temp_type))
555 || !(Ekind (gnat_temp) == E_Variable
556 || Ekind (gnat_temp) == E_Component
557 || Ekind (gnat_temp) == E_Constant
558 || Ekind (gnat_temp) == E_Loop_Parameter
559 || IN (Ekind (gnat_temp), Formal_Kind)));
560
561 /* If this is a reference to a deferred constant whose partial view is an
562 unconstrained private type, the proper type is on the full view of the
563 constant, not on the full view of the type, which may be unconstrained.
564
565 This may be a reference to a type, for example in the prefix of the
566 attribute Position, generated for dispatching code (see Make_DT in
567 exp_disp,adb). In that case we need the type itself, not is parent,
568 in particular if it is a derived type */
569 if (Is_Private_Type (gnat_temp_type)
570 && Has_Unknown_Discriminants (gnat_temp_type)
571 && Ekind (gnat_temp) == E_Constant
572 && Present (Full_View (gnat_temp)))
573 {
574 gnat_temp = Full_View (gnat_temp);
575 gnat_temp_type = Etype (gnat_temp);
576 }
577 else
578 {
579 /* We want to use the Actual_Subtype if it has already been elaborated,
580 otherwise the Etype. Avoid using Actual_Subtype for packed arrays to
581 simplify things. */
582 if ((Ekind (gnat_temp) == E_Constant
583 || Ekind (gnat_temp) == E_Variable || Is_Formal (gnat_temp))
584 && !(Is_Array_Type (Etype (gnat_temp))
585 && Present (Packed_Array_Type (Etype (gnat_temp))))
586 && Present (Actual_Subtype (gnat_temp))
587 && present_gnu_tree (Actual_Subtype (gnat_temp)))
588 gnat_temp_type = Actual_Subtype (gnat_temp);
589 else
590 gnat_temp_type = Etype (gnat_node);
591 }
592
593 /* Expand the type of this identifier first, in case it is an enumeral
594 literal, which only get made when the type is expanded. There is no
595 order-of-elaboration issue here. */
596 gnu_result_type = get_unpadded_type (gnat_temp_type);
597
598 /* If this is a non-imported scalar constant with an address clause,
599 retrieve the value instead of a pointer to be dereferenced unless
600 an lvalue is required. This is generally more efficient and actually
601 required if this is a static expression because it might be used
602 in a context where a dereference is inappropriate, such as a case
603 statement alternative or a record discriminant. There is no possible
604 volatile-ness short-circuit here since Volatile constants must be imported
605 per C.6. */
606 if (Ekind (gnat_temp) == E_Constant && Is_Scalar_Type (gnat_temp_type)
607 && !Is_Imported (gnat_temp)
608 && Present (Address_Clause (gnat_temp)))
609 {
610 require_lvalue = lvalue_required_p (gnat_node, gnu_result_type,
611 Is_Aliased (gnat_temp));
612 use_constant_initializer = !require_lvalue;
613 }
614
615 if (use_constant_initializer)
616 {
617 /* If this is a deferred constant, the initializer is attached to
618 the full view. */
619 if (Present (Full_View (gnat_temp)))
620 gnat_temp = Full_View (gnat_temp);
621
622 gnu_result = gnat_to_gnu (Expression (Declaration_Node (gnat_temp)));
623 }
624 else
625 gnu_result = gnat_to_gnu_entity (gnat_temp, NULL_TREE, 0);
626
627 /* If we are in an exception handler, force this variable into memory to
628 ensure optimization does not remove stores that appear redundant but are
629 actually needed in case an exception occurs.
630
631 ??? Note that we need not do this if the variable is declared within the
632 handler, only if it is referenced in the handler and declared in an
633 enclosing block, but we have no way of testing that right now.
634
635 ??? We used to essentially set the TREE_ADDRESSABLE flag on the variable
636 here, but it can now be removed by the Tree aliasing machinery if the
637 address of the variable is never taken. All we can do is to make the
638 variable volatile, which might incur the generation of temporaries just
639 to access the memory in some circumstances. This can be avoided for
640 variables of non-constant size because they are automatically allocated
641 to memory. There might be no way of allocating a proper temporary for
642 them in any case. We only do this for SJLJ though. */
643 if (TREE_VALUE (gnu_except_ptr_stack)
644 && TREE_CODE (gnu_result) == VAR_DECL
645 && TREE_CODE (DECL_SIZE_UNIT (gnu_result)) == INTEGER_CST)
646 TREE_THIS_VOLATILE (gnu_result) = TREE_SIDE_EFFECTS (gnu_result) = 1;
647
648 /* Some objects (such as parameters passed by reference, globals of
649 variable size, and renamed objects) actually represent the address
650 of the object. In that case, we must do the dereference. Likewise,
651 deal with parameters to foreign convention subprograms. */
652 if (DECL_P (gnu_result)
653 && (DECL_BY_REF_P (gnu_result)
654 || (TREE_CODE (gnu_result) == PARM_DECL
655 && DECL_BY_COMPONENT_PTR_P (gnu_result))))
656 {
657 bool ro = DECL_POINTS_TO_READONLY_P (gnu_result);
658 tree renamed_obj;
659
660 if (TREE_CODE (gnu_result) == PARM_DECL
661 && DECL_BY_COMPONENT_PTR_P (gnu_result))
662 gnu_result
663 = build_unary_op (INDIRECT_REF, NULL_TREE,
664 convert (build_pointer_type (gnu_result_type),
665 gnu_result));
666
667 /* If it's a renaming pointer and we are at the right binding level,
668 we can reference the renamed object directly, since the renamed
669 expression has been protected against multiple evaluations. */
670 else if (TREE_CODE (gnu_result) == VAR_DECL
671 && (renamed_obj = DECL_RENAMED_OBJECT (gnu_result)) != 0
672 && (! DECL_RENAMING_GLOBAL_P (gnu_result)
673 || global_bindings_p ()))
674 gnu_result = renamed_obj;
675
676 /* Return the underlying CST for a CONST_DECL like a few lines below,
677 after dereferencing in this case. */
678 else if (TREE_CODE (gnu_result) == CONST_DECL)
679 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE,
680 DECL_INITIAL (gnu_result));
681
682 else
683 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
684
685 TREE_READONLY (gnu_result) = TREE_STATIC (gnu_result) = ro;
686 }
687
688 /* The GNAT tree has the type of a function as the type of its result. Also
689 use the type of the result if the Etype is a subtype which is nominally
690 unconstrained. But remove any padding from the resulting type. */
691 if (TREE_CODE (TREE_TYPE (gnu_result)) == FUNCTION_TYPE
692 || Is_Constr_Subt_For_UN_Aliased (gnat_temp_type))
693 {
694 gnu_result_type = TREE_TYPE (gnu_result);
695 if (TREE_CODE (gnu_result_type) == RECORD_TYPE
696 && TYPE_IS_PADDING_P (gnu_result_type))
697 gnu_result_type = TREE_TYPE (TYPE_FIELDS (gnu_result_type));
698 }
699
700 /* If we have a constant declaration and its initializer at hand,
701 try to return the latter to avoid the need to call fold in lots
702 of places and the need of elaboration code if this Id is used as
703 an initializer itself. */
704 if (TREE_CONSTANT (gnu_result)
705 && DECL_P (gnu_result)
706 && DECL_INITIAL (gnu_result))
707 {
708 tree object
709 = (TREE_CODE (gnu_result) == CONST_DECL
710 ? DECL_CONST_CORRESPONDING_VAR (gnu_result) : gnu_result);
711
712 /* If there is a corresponding variable, we only want to return
713 the CST value if an lvalue is not required. Evaluate this
714 now if we have not already done so. */
715 if (object && require_lvalue < 0)
716 require_lvalue = lvalue_required_p (gnat_node, gnu_result_type,
717 Is_Aliased (gnat_temp));
718
719 if (!object || !require_lvalue)
720 gnu_result = unshare_expr (DECL_INITIAL (gnu_result));
721 }
722
723 *gnu_result_type_p = gnu_result_type;
724 return gnu_result;
725}
726\f
727/* Subroutine of gnat_to_gnu to process gnat_node, an N_Pragma. Return
728 any statements we generate. */
729
730static tree
731Pragma_to_gnu (Node_Id gnat_node)
732{
733 Node_Id gnat_temp;
734 tree gnu_result = alloc_stmt_list ();
735
736 /* Check for (and ignore) unrecognized pragma and do nothing if we are just
737 annotating types. */
738 if (type_annotate_only
739 || !Is_Pragma_Name (Chars (Pragma_Identifier (gnat_node))))
740 return gnu_result;
741
742 switch (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node))))
743 {
744 case Pragma_Inspection_Point:
745 /* Do nothing at top level: all such variables are already viewable. */
746 if (global_bindings_p ())
747 break;
748
749 for (gnat_temp = First (Pragma_Argument_Associations (gnat_node));
750 Present (gnat_temp);
751 gnat_temp = Next (gnat_temp))
752 {
753 Node_Id gnat_expr = Expression (gnat_temp);
754 tree gnu_expr = gnat_to_gnu (gnat_expr);
755 int use_address;
756 enum machine_mode mode;
757 tree asm_constraint = NULL_TREE;
758#ifdef ASM_COMMENT_START
759 char *comment;
760#endif
761
762 if (TREE_CODE (gnu_expr) == UNCONSTRAINED_ARRAY_REF)
763 gnu_expr = TREE_OPERAND (gnu_expr, 0);
764
765 /* Use the value only if it fits into a normal register,
766 otherwise use the address. */
767 mode = TYPE_MODE (TREE_TYPE (gnu_expr));
768 use_address = ((GET_MODE_CLASS (mode) != MODE_INT
769 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
770 || GET_MODE_SIZE (mode) > UNITS_PER_WORD);
771
772 if (use_address)
773 gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
774
775#ifdef ASM_COMMENT_START
776 comment = concat (ASM_COMMENT_START,
777 " inspection point: ",
778 Get_Name_String (Chars (gnat_expr)),
779 use_address ? " address" : "",
780 " is in %0",
781 NULL);
782 asm_constraint = build_string (strlen (comment), comment);
783 free (comment);
784#endif
785 gnu_expr = build4 (ASM_EXPR, void_type_node,
786 asm_constraint,
787 NULL_TREE,
788 tree_cons
789 (build_tree_list (NULL_TREE,
790 build_string (1, "g")),
791 gnu_expr, NULL_TREE),
792 NULL_TREE);
793 ASM_VOLATILE_P (gnu_expr) = 1;
794 set_expr_location_from_node (gnu_expr, gnat_node);
795 append_to_statement_list (gnu_expr, &gnu_result);
796 }
797 break;
798
799 case Pragma_Optimize:
800 switch (Chars (Expression
801 (First (Pragma_Argument_Associations (gnat_node)))))
802 {
803 case Name_Time: case Name_Space:
e84319a3 804 if (!optimize)
a1ab4c31
AC
805 post_error ("insufficient -O value?", gnat_node);
806 break;
807
808 case Name_Off:
e84319a3 809 if (optimize)
a1ab4c31
AC
810 post_error ("must specify -O0?", gnat_node);
811 break;
812
813 default:
814 gcc_unreachable ();
815 }
816 break;
817
818 case Pragma_Reviewable:
819 if (write_symbols == NO_DEBUG)
820 post_error ("must specify -g?", gnat_node);
821 break;
822 }
823
824 return gnu_result;
825}
826/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Attribute,
827 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer to
828 where we should place the result type. ATTRIBUTE is the attribute ID. */
829
830static tree
831Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
832{
833 tree gnu_result = error_mark_node;
834 tree gnu_result_type;
835 tree gnu_expr;
836 bool prefix_unused = false;
837 tree gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
838 tree gnu_type = TREE_TYPE (gnu_prefix);
839
840 /* If the input is a NULL_EXPR, make a new one. */
841 if (TREE_CODE (gnu_prefix) == NULL_EXPR)
842 {
843 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
844 return build1 (NULL_EXPR, *gnu_result_type_p,
845 TREE_OPERAND (gnu_prefix, 0));
846 }
847
848 switch (attribute)
849 {
850 case Attr_Pos:
851 case Attr_Val:
852 /* These are just conversions until since representation clauses for
853 enumerations are handled in the front end. */
854 {
855 bool checkp = Do_Range_Check (First (Expressions (gnat_node)));
856
857 gnu_result = gnat_to_gnu (First (Expressions (gnat_node)));
858 gnu_result_type = get_unpadded_type (Etype (gnat_node));
859 gnu_result = convert_with_check (Etype (gnat_node), gnu_result,
860 checkp, checkp, true);
861 }
862 break;
863
864 case Attr_Pred:
865 case Attr_Succ:
866 /* These just add or subject the constant 1. Representation clauses for
867 enumerations are handled in the front-end. */
868 gnu_expr = gnat_to_gnu (First (Expressions (gnat_node)));
869 gnu_result_type = get_unpadded_type (Etype (gnat_node));
870
871 if (Do_Range_Check (First (Expressions (gnat_node))))
872 {
873 gnu_expr = protect_multiple_eval (gnu_expr);
874 gnu_expr
875 = emit_check
876 (build_binary_op (EQ_EXPR, integer_type_node,
877 gnu_expr,
878 attribute == Attr_Pred
879 ? TYPE_MIN_VALUE (gnu_result_type)
880 : TYPE_MAX_VALUE (gnu_result_type)),
881 gnu_expr, CE_Range_Check_Failed);
882 }
883
884 gnu_result
885 = build_binary_op (attribute == Attr_Pred
886 ? MINUS_EXPR : PLUS_EXPR,
887 gnu_result_type, gnu_expr,
888 convert (gnu_result_type, integer_one_node));
889 break;
890
891 case Attr_Address:
892 case Attr_Unrestricted_Access:
893 /* Conversions don't change something's address but can cause us to miss
894 the COMPONENT_REF case below, so strip them off. */
895 gnu_prefix = remove_conversions (gnu_prefix,
896 !Must_Be_Byte_Aligned (gnat_node));
897
898 /* If we are taking 'Address of an unconstrained object, this is the
899 pointer to the underlying array. */
900 if (attribute == Attr_Address)
901 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
902
903 /* If we are building a static dispatch table, we have to honor
904 TARGET_VTABLE_USES_DESCRIPTORS if we want to be compatible
905 with the C++ ABI. We do it in the non-static case as well,
906 see gnat_to_gnu_entity, case E_Access_Subprogram_Type. */
907 else if (TARGET_VTABLE_USES_DESCRIPTORS
908 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
909 {
910 tree gnu_field, gnu_list = NULL_TREE, t;
911 /* Descriptors can only be built here for top-level functions. */
912 bool build_descriptor = (global_bindings_p () != 0);
913 int i;
914
915 gnu_result_type = get_unpadded_type (Etype (gnat_node));
916
917 /* If we're not going to build the descriptor, we have to retrieve
918 the one which will be built by the linker (or by the compiler
919 later if a static chain is requested). */
920 if (!build_descriptor)
921 {
922 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_prefix);
923 gnu_result = fold_convert (build_pointer_type (gnu_result_type),
924 gnu_result);
925 gnu_result = build1 (INDIRECT_REF, gnu_result_type, gnu_result);
926 }
927
928 for (gnu_field = TYPE_FIELDS (gnu_result_type), i = 0;
929 i < TARGET_VTABLE_USES_DESCRIPTORS;
930 gnu_field = TREE_CHAIN (gnu_field), i++)
931 {
932 if (build_descriptor)
933 {
934 t = build2 (FDESC_EXPR, TREE_TYPE (gnu_field), gnu_prefix,
935 build_int_cst (NULL_TREE, i));
936 TREE_CONSTANT (t) = 1;
937 }
938 else
939 t = build3 (COMPONENT_REF, ptr_void_ftype, gnu_result,
940 gnu_field, NULL_TREE);
941
942 gnu_list = tree_cons (gnu_field, t, gnu_list);
943 }
944
945 gnu_result = gnat_build_constructor (gnu_result_type, gnu_list);
946 break;
947 }
948
949 /* ... fall through ... */
950
951 case Attr_Access:
952 case Attr_Unchecked_Access:
953 case Attr_Code_Address:
954 gnu_result_type = get_unpadded_type (Etype (gnat_node));
955 gnu_result
956 = build_unary_op (((attribute == Attr_Address
957 || attribute == Attr_Unrestricted_Access)
958 && !Must_Be_Byte_Aligned (gnat_node))
959 ? ATTR_ADDR_EXPR : ADDR_EXPR,
960 gnu_result_type, gnu_prefix);
961
962 /* For 'Code_Address, find an inner ADDR_EXPR and mark it so that we
963 don't try to build a trampoline. */
964 if (attribute == Attr_Code_Address)
965 {
966 for (gnu_expr = gnu_result;
967 CONVERT_EXPR_P (gnu_expr);
968 gnu_expr = TREE_OPERAND (gnu_expr, 0))
969 TREE_CONSTANT (gnu_expr) = 1;
970
971 if (TREE_CODE (gnu_expr) == ADDR_EXPR)
972 TREE_NO_TRAMPOLINE (gnu_expr) = TREE_CONSTANT (gnu_expr) = 1;
973 }
974
975 /* For other address attributes applied to a nested function,
976 find an inner ADDR_EXPR and annotate it so that we can issue
977 a useful warning with -Wtrampolines. */
978 else if (TREE_CODE (TREE_TYPE (gnu_prefix)) == FUNCTION_TYPE)
979 {
980 for (gnu_expr = gnu_result;
981 CONVERT_EXPR_P (gnu_expr);
982 gnu_expr = TREE_OPERAND (gnu_expr, 0))
983 ;
984
985 if (TREE_CODE (gnu_expr) == ADDR_EXPR
986 && decl_function_context (TREE_OPERAND (gnu_expr, 0)))
987 {
988 set_expr_location_from_node (gnu_expr, gnat_node);
989
990 /* Check that we're not violating the No_Implicit_Dynamic_Code
991 restriction. Be conservative if we don't know anything
992 about the trampoline strategy for the target. */
993 Check_Implicit_Dynamic_Code_Allowed (gnat_node);
994 }
995 }
996 break;
997
998 case Attr_Pool_Address:
999 {
1000 tree gnu_obj_type;
1001 tree gnu_ptr = gnu_prefix;
1002
1003 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1004
1005 /* If this is an unconstrained array, we know the object must have been
1006 allocated with the template in front of the object. So compute the
1007 template address.*/
1008 if (TYPE_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
1009 gnu_ptr
1010 = convert (build_pointer_type
1011 (TYPE_OBJECT_RECORD_TYPE
1012 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
1013 gnu_ptr);
1014
1015 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
1016 if (TREE_CODE (gnu_obj_type) == RECORD_TYPE
1017 && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type))
1018 {
1019 tree gnu_char_ptr_type = build_pointer_type (char_type_node);
1020 tree gnu_pos = byte_position (TYPE_FIELDS (gnu_obj_type));
1021 tree gnu_byte_offset
1022 = convert (sizetype,
1023 size_diffop (size_zero_node, gnu_pos));
1024 gnu_byte_offset = fold_build1 (NEGATE_EXPR, sizetype, gnu_byte_offset);
1025
1026 gnu_ptr = convert (gnu_char_ptr_type, gnu_ptr);
1027 gnu_ptr = build_binary_op (POINTER_PLUS_EXPR, gnu_char_ptr_type,
1028 gnu_ptr, gnu_byte_offset);
1029 }
1030
1031 gnu_result = convert (gnu_result_type, gnu_ptr);
1032 }
1033 break;
1034
1035 case Attr_Size:
1036 case Attr_Object_Size:
1037 case Attr_Value_Size:
1038 case Attr_Max_Size_In_Storage_Elements:
1039 gnu_expr = gnu_prefix;
1040
1041 /* Remove NOPS from gnu_expr and conversions from gnu_prefix.
1042 We only use GNU_EXPR to see if a COMPONENT_REF was involved. */
1043 while (TREE_CODE (gnu_expr) == NOP_EXPR)
1044 gnu_expr = TREE_OPERAND (gnu_expr, 0);
1045
1046 gnu_prefix = remove_conversions (gnu_prefix, true);
1047 prefix_unused = true;
1048 gnu_type = TREE_TYPE (gnu_prefix);
1049
1050 /* Replace an unconstrained array type with the type of the underlying
1051 array. We can't do this with a call to maybe_unconstrained_array
1052 since we may have a TYPE_DECL. For 'Max_Size_In_Storage_Elements,
1053 use the record type that will be used to allocate the object and its
1054 template. */
1055 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1056 {
1057 gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type);
1058 if (attribute != Attr_Max_Size_In_Storage_Elements)
1059 gnu_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
1060 }
1061
1062 /* If we're looking for the size of a field, return the field size.
1063 Otherwise, if the prefix is an object, or if 'Object_Size or
1064 'Max_Size_In_Storage_Elements has been specified, the result is the
1065 GCC size of the type. Otherwise, the result is the RM_Size of the
1066 type. */
1067 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1068 gnu_result = DECL_SIZE (TREE_OPERAND (gnu_prefix, 1));
1069 else if (TREE_CODE (gnu_prefix) != TYPE_DECL
1070 || attribute == Attr_Object_Size
1071 || attribute == Attr_Max_Size_In_Storage_Elements)
1072 {
1073 /* If this is a padded type, the GCC size isn't relevant to the
1074 programmer. Normally, what we want is the RM_Size, which was set
1075 from the specified size, but if it was not set, we want the size
1076 of the relevant field. Using the MAX of those two produces the
1077 right result in all case. Don't use the size of the field if it's
1078 a self-referential type, since that's never what's wanted. */
1079 if (TREE_CODE (gnu_type) == RECORD_TYPE
1080 && TYPE_IS_PADDING_P (gnu_type)
1081 && TREE_CODE (gnu_expr) == COMPONENT_REF)
1082 {
1083 gnu_result = rm_size (gnu_type);
1084 if (!(CONTAINS_PLACEHOLDER_P
1085 (DECL_SIZE (TREE_OPERAND (gnu_expr, 1)))))
1086 gnu_result
1087 = size_binop (MAX_EXPR, gnu_result,
1088 DECL_SIZE (TREE_OPERAND (gnu_expr, 1)));
1089 }
1090 else if (Nkind (Prefix (gnat_node)) == N_Explicit_Dereference)
1091 {
1092 Node_Id gnat_deref = Prefix (gnat_node);
1093 Node_Id gnat_actual_subtype = Actual_Designated_Subtype (gnat_deref);
1094 tree gnu_ptr_type = TREE_TYPE (gnat_to_gnu (Prefix (gnat_deref)));
1095 if (TYPE_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
1096 && Present (gnat_actual_subtype))
1097 {
1098 tree gnu_actual_obj_type = gnat_to_gnu_type (gnat_actual_subtype);
1099 gnu_type = build_unc_object_type_from_ptr (gnu_ptr_type,
1100 gnu_actual_obj_type, get_identifier ("SIZE"));
1101 }
1102
1103 gnu_result = TYPE_SIZE (gnu_type);
1104 }
1105 else
1106 gnu_result = TYPE_SIZE (gnu_type);
1107 }
1108 else
1109 gnu_result = rm_size (gnu_type);
1110
1111 gcc_assert (gnu_result);
1112
1113 /* Deal with a self-referential size by returning the maximum size for a
1114 type and by qualifying the size with the object for 'Size of an
1115 object. */
1116 if (CONTAINS_PLACEHOLDER_P (gnu_result))
1117 {
1118 if (TREE_CODE (gnu_prefix) != TYPE_DECL)
1119 gnu_result = substitute_placeholder_in_expr (gnu_result, gnu_expr);
1120 else
1121 gnu_result = max_size (gnu_result, true);
1122 }
1123
1124 /* If the type contains a template, subtract its size. */
1125 if (TREE_CODE (gnu_type) == RECORD_TYPE
1126 && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
1127 gnu_result = size_binop (MINUS_EXPR, gnu_result,
1128 DECL_SIZE (TYPE_FIELDS (gnu_type)));
1129
1130 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1131
1132 /* Always perform division using unsigned arithmetic as the size cannot
1133 be negative, but may be an overflowed positive value. This provides
1134 correct results for sizes up to 512 MB.
1135
1136 ??? Size should be calculated in storage elements directly. */
1137
1138 if (attribute == Attr_Max_Size_In_Storage_Elements)
1139 gnu_result = convert (sizetype,
1140 fold_build2 (CEIL_DIV_EXPR, bitsizetype,
1141 gnu_result, bitsize_unit_node));
1142 break;
1143
1144 case Attr_Alignment:
1145 if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1146 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0)))
1147 == RECORD_TYPE)
1148 && (TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0)))))
1149 gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1150
1151 gnu_type = TREE_TYPE (gnu_prefix);
1152 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1153 prefix_unused = true;
1154
1155 gnu_result = size_int ((TREE_CODE (gnu_prefix) == COMPONENT_REF
1156 ? DECL_ALIGN (TREE_OPERAND (gnu_prefix, 1))
1157 : TYPE_ALIGN (gnu_type)) / BITS_PER_UNIT);
1158 break;
1159
1160 case Attr_First:
1161 case Attr_Last:
1162 case Attr_Range_Length:
1163 prefix_unused = true;
1164
1165 if (INTEGRAL_TYPE_P (gnu_type) || TREE_CODE (gnu_type) == REAL_TYPE)
1166 {
1167 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1168
1169 if (attribute == Attr_First)
1170 gnu_result = TYPE_MIN_VALUE (gnu_type);
1171 else if (attribute == Attr_Last)
1172 gnu_result = TYPE_MAX_VALUE (gnu_type);
1173 else
1174 gnu_result
1175 = build_binary_op
1176 (MAX_EXPR, get_base_type (gnu_result_type),
1177 build_binary_op
1178 (PLUS_EXPR, get_base_type (gnu_result_type),
1179 build_binary_op (MINUS_EXPR,
1180 get_base_type (gnu_result_type),
1181 convert (gnu_result_type,
1182 TYPE_MAX_VALUE (gnu_type)),
1183 convert (gnu_result_type,
1184 TYPE_MIN_VALUE (gnu_type))),
1185 convert (gnu_result_type, integer_one_node)),
1186 convert (gnu_result_type, integer_zero_node));
1187
1188 break;
1189 }
1190
1191 /* ... fall through ... */
1192
1193 case Attr_Length:
1194 {
1195 int Dimension = (Present (Expressions (gnat_node))
1196 ? UI_To_Int (Intval (First (Expressions (gnat_node))))
1197 : 1), i;
1198 struct parm_attr *pa = NULL;
1199 Entity_Id gnat_param = Empty;
1200
1201 /* Make sure any implicit dereference gets done. */
1202 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1203 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1204 /* We treat unconstrained array In parameters specially. */
1205 if (Nkind (Prefix (gnat_node)) == N_Identifier
1206 && !Is_Constrained (Etype (Prefix (gnat_node)))
1207 && Ekind (Entity (Prefix (gnat_node))) == E_In_Parameter)
1208 gnat_param = Entity (Prefix (gnat_node));
1209 gnu_type = TREE_TYPE (gnu_prefix);
1210 prefix_unused = true;
1211 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1212
1213 if (TYPE_CONVENTION_FORTRAN_P (gnu_type))
1214 {
1215 int ndim;
1216 tree gnu_type_temp;
1217
1218 for (ndim = 1, gnu_type_temp = gnu_type;
1219 TREE_CODE (TREE_TYPE (gnu_type_temp)) == ARRAY_TYPE
1220 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type_temp));
1221 ndim++, gnu_type_temp = TREE_TYPE (gnu_type_temp))
1222 ;
1223
1224 Dimension = ndim + 1 - Dimension;
1225 }
1226
1227 for (i = 1; i < Dimension; i++)
1228 gnu_type = TREE_TYPE (gnu_type);
1229
1230 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1231
1232 /* When not optimizing, look up the slot associated with the parameter
1233 and the dimension in the cache and create a new one on failure. */
1234 if (!optimize && Present (gnat_param))
1235 {
1236 for (i = 0; VEC_iterate (parm_attr, f_parm_attr_cache, i, pa); i++)
1237 if (pa->id == gnat_param && pa->dim == Dimension)
1238 break;
1239
1240 if (!pa)
1241 {
1242 pa = GGC_CNEW (struct parm_attr);
1243 pa->id = gnat_param;
1244 pa->dim = Dimension;
1245 VEC_safe_push (parm_attr, gc, f_parm_attr_cache, pa);
1246 }
1247 }
1248
1249 /* Return the cached expression or build a new one. */
1250 if (attribute == Attr_First)
1251 {
1252 if (pa && pa->first)
1253 {
1254 gnu_result = pa->first;
1255 break;
1256 }
1257
1258 gnu_result
1259 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1260 }
1261
1262 else if (attribute == Attr_Last)
1263 {
1264 if (pa && pa->last)
1265 {
1266 gnu_result = pa->last;
1267 break;
1268 }
1269
1270 gnu_result
1271 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1272 }
1273
1274 else /* attribute == Attr_Range_Length || attribute == Attr_Length */
1275 {
1276 if (pa && pa->length)
1277 {
1278 gnu_result = pa->length;
1279 break;
1280 }
1281 else
1282 {
1283 /* We used to compute the length as max (hb - lb + 1, 0),
1284 which could overflow for some cases of empty arrays, e.g.
1285 when lb == index_type'first. We now compute the length as
1286 (hb < lb) ? 0 : hb - lb + 1, which would only overflow in
1287 much rarer cases, for extremely large arrays we expect
1288 never to encounter in practice. In addition, the former
1289 computation required the use of potentially constraining
9ed0e483
TQ
1290 signed arithmetic while the latter doesn't. Note that the
1291 comparison must be done in the original index base type,
1292 otherwise the conversion of either bound to gnu_compute_type
1293 may overflow. */
a1ab4c31
AC
1294
1295 tree gnu_compute_type = get_base_type (gnu_result_type);
1296
1297 tree index_type
1298 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
1299 tree lb
1300 = convert (gnu_compute_type, TYPE_MIN_VALUE (index_type));
1301 tree hb
1302 = convert (gnu_compute_type, TYPE_MAX_VALUE (index_type));
1303
1304 gnu_result
1305 = build3
1306 (COND_EXPR, gnu_compute_type,
9ed0e483
TQ
1307 build_binary_op (LT_EXPR, get_base_type (index_type),
1308 TYPE_MAX_VALUE (index_type),
1309 TYPE_MIN_VALUE (index_type)),
a1ab4c31
AC
1310 convert (gnu_compute_type, integer_zero_node),
1311 build_binary_op
1312 (PLUS_EXPR, gnu_compute_type,
1313 build_binary_op (MINUS_EXPR, gnu_compute_type, hb, lb),
1314 convert (gnu_compute_type, integer_one_node)));
1315 }
1316 }
1317
1318 /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1319 handling. Note that these attributes could not have been used on
1320 an unconstrained array type. */
1321 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result,
1322 gnu_prefix);
1323
1324 /* Cache the expression we have just computed. Since we want to do it
1325 at runtime, we force the use of a SAVE_EXPR and let the gimplifier
1326 create the temporary. */
1327 if (pa)
1328 {
1329 gnu_result
1330 = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
1331 TREE_SIDE_EFFECTS (gnu_result) = 1;
1332 if (attribute == Attr_First)
1333 pa->first = gnu_result;
1334 else if (attribute == Attr_Last)
1335 pa->last = gnu_result;
1336 else
1337 pa->length = gnu_result;
1338 }
1339 break;
1340 }
1341
1342 case Attr_Bit_Position:
1343 case Attr_Position:
1344 case Attr_First_Bit:
1345 case Attr_Last_Bit:
1346 case Attr_Bit:
1347 {
1348 HOST_WIDE_INT bitsize;
1349 HOST_WIDE_INT bitpos;
1350 tree gnu_offset;
1351 tree gnu_field_bitpos;
1352 tree gnu_field_offset;
1353 tree gnu_inner;
1354 enum machine_mode mode;
1355 int unsignedp, volatilep;
1356
1357 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1358 gnu_prefix = remove_conversions (gnu_prefix, true);
1359 prefix_unused = true;
1360
1361 /* We can have 'Bit on any object, but if it isn't a COMPONENT_REF,
1362 the result is 0. Don't allow 'Bit on a bare component, though. */
1363 if (attribute == Attr_Bit
1364 && TREE_CODE (gnu_prefix) != COMPONENT_REF
1365 && TREE_CODE (gnu_prefix) != FIELD_DECL)
1366 {
1367 gnu_result = integer_zero_node;
1368 break;
1369 }
1370
1371 else
1372 gcc_assert (TREE_CODE (gnu_prefix) == COMPONENT_REF
1373 || (attribute == Attr_Bit_Position
1374 && TREE_CODE (gnu_prefix) == FIELD_DECL));
1375
1376 get_inner_reference (gnu_prefix, &bitsize, &bitpos, &gnu_offset,
1377 &mode, &unsignedp, &volatilep, false);
1378
1379 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1380 {
1381 gnu_field_bitpos = bit_position (TREE_OPERAND (gnu_prefix, 1));
1382 gnu_field_offset = byte_position (TREE_OPERAND (gnu_prefix, 1));
1383
1384 for (gnu_inner = TREE_OPERAND (gnu_prefix, 0);
1385 TREE_CODE (gnu_inner) == COMPONENT_REF
1386 && DECL_INTERNAL_P (TREE_OPERAND (gnu_inner, 1));
1387 gnu_inner = TREE_OPERAND (gnu_inner, 0))
1388 {
1389 gnu_field_bitpos
1390 = size_binop (PLUS_EXPR, gnu_field_bitpos,
1391 bit_position (TREE_OPERAND (gnu_inner, 1)));
1392 gnu_field_offset
1393 = size_binop (PLUS_EXPR, gnu_field_offset,
1394 byte_position (TREE_OPERAND (gnu_inner, 1)));
1395 }
1396 }
1397 else if (TREE_CODE (gnu_prefix) == FIELD_DECL)
1398 {
1399 gnu_field_bitpos = bit_position (gnu_prefix);
1400 gnu_field_offset = byte_position (gnu_prefix);
1401 }
1402 else
1403 {
1404 gnu_field_bitpos = bitsize_zero_node;
1405 gnu_field_offset = size_zero_node;
1406 }
1407
1408 switch (attribute)
1409 {
1410 case Attr_Position:
1411 gnu_result = gnu_field_offset;
1412 break;
1413
1414 case Attr_First_Bit:
1415 case Attr_Bit:
1416 gnu_result = size_int (bitpos % BITS_PER_UNIT);
1417 break;
1418
1419 case Attr_Last_Bit:
1420 gnu_result = bitsize_int (bitpos % BITS_PER_UNIT);
1421 gnu_result = size_binop (PLUS_EXPR, gnu_result,
1422 TYPE_SIZE (TREE_TYPE (gnu_prefix)));
1423 gnu_result = size_binop (MINUS_EXPR, gnu_result,
1424 bitsize_one_node);
1425 break;
1426
1427 case Attr_Bit_Position:
1428 gnu_result = gnu_field_bitpos;
1429 break;
1430 }
1431
1432 /* If this has a PLACEHOLDER_EXPR, qualify it by the object
1433 we are handling. */
1434 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1435 break;
1436 }
1437
1438 case Attr_Min:
1439 case Attr_Max:
1440 {
1441 tree gnu_lhs = gnat_to_gnu (First (Expressions (gnat_node)));
1442 tree gnu_rhs = gnat_to_gnu (Next (First (Expressions (gnat_node))));
1443
1444 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1445 gnu_result = build_binary_op (attribute == Attr_Min
1446 ? MIN_EXPR : MAX_EXPR,
1447 gnu_result_type, gnu_lhs, gnu_rhs);
1448 }
1449 break;
1450
1451 case Attr_Passed_By_Reference:
1452 gnu_result = size_int (default_pass_by_ref (gnu_type)
1453 || must_pass_by_ref (gnu_type));
1454 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1455 break;
1456
1457 case Attr_Component_Size:
1458 if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1459 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0)))
1460 == RECORD_TYPE)
1461 && (TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0)))))
1462 gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1463
1464 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1465 gnu_type = TREE_TYPE (gnu_prefix);
1466
1467 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1468 gnu_type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_type))));
1469
1470 while (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
1471 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type)))
1472 gnu_type = TREE_TYPE (gnu_type);
1473
1474 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1475
1476 /* Note this size cannot be self-referential. */
1477 gnu_result = TYPE_SIZE (TREE_TYPE (gnu_type));
1478 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1479 prefix_unused = true;
1480 break;
1481
1482 case Attr_Null_Parameter:
1483 /* This is just a zero cast to the pointer type for
1484 our prefix and dereferenced. */
1485 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1486 gnu_result
1487 = build_unary_op (INDIRECT_REF, NULL_TREE,
1488 convert (build_pointer_type (gnu_result_type),
1489 integer_zero_node));
1490 TREE_PRIVATE (gnu_result) = 1;
1491 break;
1492
1493 case Attr_Mechanism_Code:
1494 {
1495 int code;
1496 Entity_Id gnat_obj = Entity (Prefix (gnat_node));
1497
1498 prefix_unused = true;
1499 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1500 if (Present (Expressions (gnat_node)))
1501 {
1502 int i = UI_To_Int (Intval (First (Expressions (gnat_node))));
1503
1504 for (gnat_obj = First_Formal (gnat_obj); i > 1;
1505 i--, gnat_obj = Next_Formal (gnat_obj))
1506 ;
1507 }
1508
1509 code = Mechanism (gnat_obj);
1510 if (code == Default)
1511 code = ((present_gnu_tree (gnat_obj)
1512 && (DECL_BY_REF_P (get_gnu_tree (gnat_obj))
1513 || ((TREE_CODE (get_gnu_tree (gnat_obj))
1514 == PARM_DECL)
1515 && (DECL_BY_COMPONENT_PTR_P
1516 (get_gnu_tree (gnat_obj))))))
1517 ? By_Reference : By_Copy);
1518 gnu_result = convert (gnu_result_type, size_int (- code));
1519 }
1520 break;
1521
1522 default:
1523 /* Say we have an unimplemented attribute. Then set the value to be
1524 returned to be a zero and hope that's something we can convert to the
1525 type of this attribute. */
1526 post_error ("unimplemented attribute", gnat_node);
1527 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1528 gnu_result = integer_zero_node;
1529 break;
1530 }
1531
1532 /* If this is an attribute where the prefix was unused, force a use of it if
1533 it has a side-effect. But don't do it if the prefix is just an entity
1534 name. However, if an access check is needed, we must do it. See second
1535 example in AARM 11.6(5.e). */
1536 if (prefix_unused && TREE_SIDE_EFFECTS (gnu_prefix)
1537 && !Is_Entity_Name (Prefix (gnat_node)))
1538 gnu_result = fold_build2 (COMPOUND_EXPR, TREE_TYPE (gnu_result),
1539 gnu_prefix, gnu_result);
1540
1541 *gnu_result_type_p = gnu_result_type;
1542 return gnu_result;
1543}
1544\f
1545/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Case_Statement,
1546 to a GCC tree, which is returned. */
1547
1548static tree
1549Case_Statement_to_gnu (Node_Id gnat_node)
1550{
1551 tree gnu_result;
1552 tree gnu_expr;
1553 Node_Id gnat_when;
1554
1555 gnu_expr = gnat_to_gnu (Expression (gnat_node));
1556 gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
1557
1558 /* The range of values in a case statement is determined by the rules in
1559 RM 5.4(7-9). In almost all cases, this range is represented by the Etype
1560 of the expression. One exception arises in the case of a simple name that
1561 is parenthesized. This still has the Etype of the name, but since it is
1562 not a name, para 7 does not apply, and we need to go to the base type.
1563 This is the only case where parenthesization affects the dynamic
1564 semantics (i.e. the range of possible values at runtime that is covered
1565 by the others alternative.
1566
1567 Another exception is if the subtype of the expression is non-static. In
1568 that case, we also have to use the base type. */
1569 if (Paren_Count (Expression (gnat_node)) != 0
1570 || !Is_OK_Static_Subtype (Underlying_Type
1571 (Etype (Expression (gnat_node)))))
1572 gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
1573
1574 /* We build a SWITCH_EXPR that contains the code with interspersed
1575 CASE_LABEL_EXPRs for each label. */
1576
1577 push_stack (&gnu_switch_label_stack, NULL_TREE, create_artificial_label ());
1578 start_stmt_group ();
1579 for (gnat_when = First_Non_Pragma (Alternatives (gnat_node));
1580 Present (gnat_when);
1581 gnat_when = Next_Non_Pragma (gnat_when))
1582 {
1583 Node_Id gnat_choice;
1584 int choices_added = 0;
1585
1586 /* First compile all the different case choices for the current WHEN
1587 alternative. */
1588 for (gnat_choice = First (Discrete_Choices (gnat_when));
1589 Present (gnat_choice); gnat_choice = Next (gnat_choice))
1590 {
1591 tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
1592
1593 switch (Nkind (gnat_choice))
1594 {
1595 case N_Range:
1596 gnu_low = gnat_to_gnu (Low_Bound (gnat_choice));
1597 gnu_high = gnat_to_gnu (High_Bound (gnat_choice));
1598 break;
1599
1600 case N_Subtype_Indication:
1601 gnu_low = gnat_to_gnu (Low_Bound (Range_Expression
1602 (Constraint (gnat_choice))));
1603 gnu_high = gnat_to_gnu (High_Bound (Range_Expression
1604 (Constraint (gnat_choice))));
1605 break;
1606
1607 case N_Identifier:
1608 case N_Expanded_Name:
1609 /* This represents either a subtype range or a static value of
1610 some kind; Ekind says which. */
1611 if (IN (Ekind (Entity (gnat_choice)), Type_Kind))
1612 {
1613 tree gnu_type = get_unpadded_type (Entity (gnat_choice));
1614
1615 gnu_low = fold (TYPE_MIN_VALUE (gnu_type));
1616 gnu_high = fold (TYPE_MAX_VALUE (gnu_type));
1617 break;
1618 }
1619
1620 /* ... fall through ... */
1621
1622 case N_Character_Literal:
1623 case N_Integer_Literal:
1624 gnu_low = gnat_to_gnu (gnat_choice);
1625 break;
1626
1627 case N_Others_Choice:
1628 break;
1629
1630 default:
1631 gcc_unreachable ();
1632 }
1633
1634 /* If the case value is a subtype that raises Constraint_Error at
1635 run-time because of a wrong bound, then gnu_low or gnu_high is
16b05213 1636 not translated into an INTEGER_CST. In such a case, we need
a1ab4c31
AC
1637 to ensure that the when statement is not added in the tree,
1638 otherwise it will crash the gimplifier. */
1639 if ((!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST)
1640 && (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST))
1641 {
1642 add_stmt_with_node (build3 (CASE_LABEL_EXPR, void_type_node,
1643 gnu_low, gnu_high,
1644 create_artificial_label ()),
1645 gnat_choice);
1646 choices_added++;
1647 }
1648 }
1649
1650 /* Push a binding level here in case variables are declared as we want
1651 them to be local to this set of statements instead of to the block
1652 containing the Case statement. */
1653 if (choices_added > 0)
1654 {
1655 add_stmt (build_stmt_group (Statements (gnat_when), true));
1656 add_stmt (build1 (GOTO_EXPR, void_type_node,
1657 TREE_VALUE (gnu_switch_label_stack)));
1658 }
1659 }
1660
1661 /* Now emit a definition of the label all the cases branched to. */
1662 add_stmt (build1 (LABEL_EXPR, void_type_node,
1663 TREE_VALUE (gnu_switch_label_stack)));
1664 gnu_result = build3 (SWITCH_EXPR, TREE_TYPE (gnu_expr), gnu_expr,
1665 end_stmt_group (), NULL_TREE);
1666 pop_stack (&gnu_switch_label_stack);
1667
1668 return gnu_result;
1669}
1670\f
1671/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement,
1672 to a GCC tree, which is returned. */
1673
1674static tree
1675Loop_Statement_to_gnu (Node_Id gnat_node)
1676{
1677 /* ??? It would be nice to use "build" here, but there's no build5. */
1678 tree gnu_loop_stmt = build_nt (LOOP_STMT, NULL_TREE, NULL_TREE,
1679 NULL_TREE, NULL_TREE, NULL_TREE);
1680 tree gnu_loop_var = NULL_TREE;
1681 Node_Id gnat_iter_scheme = Iteration_Scheme (gnat_node);
1682 tree gnu_cond_expr = NULL_TREE;
1683 tree gnu_result;
1684
1685 TREE_TYPE (gnu_loop_stmt) = void_type_node;
1686 TREE_SIDE_EFFECTS (gnu_loop_stmt) = 1;
1687 LOOP_STMT_LABEL (gnu_loop_stmt) = create_artificial_label ();
1688 set_expr_location_from_node (gnu_loop_stmt, gnat_node);
1689 Sloc_to_locus (Sloc (End_Label (gnat_node)),
1690 &DECL_SOURCE_LOCATION (LOOP_STMT_LABEL (gnu_loop_stmt)));
1691
1692 /* Save the end label of this LOOP_STMT in a stack so that the corresponding
1693 N_Exit_Statement can find it. */
1694 push_stack (&gnu_loop_label_stack, NULL_TREE,
1695 LOOP_STMT_LABEL (gnu_loop_stmt));
1696
7fda1596
EB
1697 /* Set the condition under which the loop must keep going.
1698 For the case "LOOP .... END LOOP;" the condition is always true. */
a1ab4c31
AC
1699 if (No (gnat_iter_scheme))
1700 ;
7fda1596
EB
1701
1702 /* For the case "WHILE condition LOOP ..... END LOOP;" it's immediate. */
a1ab4c31
AC
1703 else if (Present (Condition (gnat_iter_scheme)))
1704 LOOP_STMT_TOP_COND (gnu_loop_stmt)
1705 = gnat_to_gnu (Condition (gnat_iter_scheme));
7fda1596
EB
1706
1707 /* Otherwise we have an iteration scheme and the condition is given by
1708 the bounds of the subtype of the iteration variable. */
a1ab4c31
AC
1709 else
1710 {
a1ab4c31
AC
1711 Node_Id gnat_loop_spec = Loop_Parameter_Specification (gnat_iter_scheme);
1712 Entity_Id gnat_loop_var = Defining_Entity (gnat_loop_spec);
1713 Entity_Id gnat_type = Etype (gnat_loop_var);
1714 tree gnu_type = get_unpadded_type (gnat_type);
1715 tree gnu_low = TYPE_MIN_VALUE (gnu_type);
1716 tree gnu_high = TYPE_MAX_VALUE (gnu_type);
82d3b03a
EB
1717 tree gnu_first, gnu_last, gnu_limit;
1718 enum tree_code update_code, end_code;
a1ab4c31 1719 tree gnu_base_type = get_base_type (gnu_type);
82d3b03a
EB
1720
1721 /* We must disable modulo reduction for the loop variable, if any,
1722 in order for the loop comparison to be effective. */
1723 if (Reverse_Present (gnat_loop_spec))
1724 {
1725 gnu_first = gnu_high;
1726 gnu_last = gnu_low;
1727 update_code = MINUS_NOMOD_EXPR;
1728 end_code = GE_EXPR;
1729 gnu_limit = TYPE_MIN_VALUE (gnu_base_type);
1730 }
1731 else
1732 {
1733 gnu_first = gnu_low;
1734 gnu_last = gnu_high;
1735 update_code = PLUS_NOMOD_EXPR;
1736 end_code = LE_EXPR;
1737 gnu_limit = TYPE_MAX_VALUE (gnu_base_type);
1738 }
a1ab4c31
AC
1739
1740 /* We know the loop variable will not overflow if GNU_LAST is a constant
1741 and is not equal to GNU_LIMIT. If it might overflow, we have to move
1742 the limit test to the end of the loop. In that case, we have to test
1743 for an empty loop outside the loop. */
1744 if (TREE_CODE (gnu_last) != INTEGER_CST
1745 || TREE_CODE (gnu_limit) != INTEGER_CST
1746 || tree_int_cst_equal (gnu_last, gnu_limit))
1747 {
1748 gnu_cond_expr
1749 = build3 (COND_EXPR, void_type_node,
1750 build_binary_op (LE_EXPR, integer_type_node,
1751 gnu_low, gnu_high),
1752 NULL_TREE, alloc_stmt_list ());
1753 set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
1754 }
1755
1756 /* Open a new nesting level that will surround the loop to declare the
1757 loop index variable. */
1758 start_stmt_group ();
1759 gnat_pushlevel ();
1760
1761 /* Declare the loop index and set it to its initial value. */
1762 gnu_loop_var = gnat_to_gnu_entity (gnat_loop_var, gnu_first, 1);
1763 if (DECL_BY_REF_P (gnu_loop_var))
1764 gnu_loop_var = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_loop_var);
1765
1766 /* The loop variable might be a padded type, so use `convert' to get a
1767 reference to the inner variable if so. */
1768 gnu_loop_var = convert (get_base_type (gnu_type), gnu_loop_var);
1769
1770 /* Set either the top or bottom exit condition as appropriate depending
7fda1596 1771 on whether or not we know an overflow cannot occur. */
a1ab4c31
AC
1772 if (gnu_cond_expr)
1773 LOOP_STMT_BOT_COND (gnu_loop_stmt)
1774 = build_binary_op (NE_EXPR, integer_type_node,
1775 gnu_loop_var, gnu_last);
1776 else
1777 LOOP_STMT_TOP_COND (gnu_loop_stmt)
1778 = build_binary_op (end_code, integer_type_node,
1779 gnu_loop_var, gnu_last);
1780
1781 LOOP_STMT_UPDATE (gnu_loop_stmt)
82d3b03a 1782 = build_binary_op (MODIFY_EXPR, NULL_TREE,
a1ab4c31 1783 gnu_loop_var,
82d3b03a
EB
1784 build_binary_op (update_code,
1785 TREE_TYPE (gnu_loop_var),
1786 gnu_loop_var,
1787 convert (TREE_TYPE (gnu_loop_var),
1788 integer_one_node)));
a1ab4c31 1789 set_expr_location_from_node (LOOP_STMT_UPDATE (gnu_loop_stmt),
7fda1596 1790 gnat_iter_scheme);
a1ab4c31
AC
1791 }
1792
1793 /* If the loop was named, have the name point to this loop. In this case,
1794 the association is not a ..._DECL node, but the end label from this
7fda1596 1795 LOOP_STMT. */
a1ab4c31
AC
1796 if (Present (Identifier (gnat_node)))
1797 save_gnu_tree (Entity (Identifier (gnat_node)),
1798 LOOP_STMT_LABEL (gnu_loop_stmt), true);
1799
1800 /* Make the loop body into its own block, so any allocated storage will be
1801 released every iteration. This is needed for stack allocation. */
1802 LOOP_STMT_BODY (gnu_loop_stmt)
1803 = build_stmt_group (Statements (gnat_node), true);
1804
1805 /* If we declared a variable, then we are in a statement group for that
1806 declaration. Add the LOOP_STMT to it and make that the "loop". */
1807 if (gnu_loop_var)
1808 {
1809 add_stmt (gnu_loop_stmt);
1810 gnat_poplevel ();
1811 gnu_loop_stmt = end_stmt_group ();
1812 }
1813
1814 /* If we have an outer COND_EXPR, that's our result and this loop is its
7fda1596 1815 "true" statement. Otherwise, the result is the LOOP_STMT. */
a1ab4c31
AC
1816 if (gnu_cond_expr)
1817 {
1818 COND_EXPR_THEN (gnu_cond_expr) = gnu_loop_stmt;
1819 gnu_result = gnu_cond_expr;
1820 recalculate_side_effects (gnu_cond_expr);
1821 }
1822 else
1823 gnu_result = gnu_loop_stmt;
1824
1825 pop_stack (&gnu_loop_label_stack);
1826
1827 return gnu_result;
1828}
1829\f
1830/* Emit statements to establish __gnat_handle_vms_condition as a VMS condition
1831 handler for the current function. */
1832
1833/* This is implemented by issuing a call to the appropriate VMS specific
1834 builtin. To avoid having VMS specific sections in the global gigi decls
1835 array, we maintain the decls of interest here. We can't declare them
1836 inside the function because we must mark them never to be GC'd, which we
1837 can only do at the global level. */
1838
1839static GTY(()) tree vms_builtin_establish_handler_decl = NULL_TREE;
1840static GTY(()) tree gnat_vms_condition_handler_decl = NULL_TREE;
1841
1842static void
1843establish_gnat_vms_condition_handler (void)
1844{
1845 tree establish_stmt;
1846
1847 /* Elaborate the required decls on the first call. Check on the decl for
1848 the gnat condition handler to decide, as this is one we create so we are
1849 sure that it will be non null on subsequent calls. The builtin decl is
1850 looked up so remains null on targets where it is not implemented yet. */
1851 if (gnat_vms_condition_handler_decl == NULL_TREE)
1852 {
1853 vms_builtin_establish_handler_decl
1854 = builtin_decl_for
1855 (get_identifier ("__builtin_establish_vms_condition_handler"));
1856
1857 gnat_vms_condition_handler_decl
1858 = create_subprog_decl (get_identifier ("__gnat_handle_vms_condition"),
1859 NULL_TREE,
1860 build_function_type_list (integer_type_node,
1861 ptr_void_type_node,
1862 ptr_void_type_node,
1863 NULL_TREE),
1864 NULL_TREE, 0, 1, 1, 0, Empty);
1865 }
1866
1867 /* Do nothing if the establish builtin is not available, which might happen
1868 on targets where the facility is not implemented. */
1869 if (vms_builtin_establish_handler_decl == NULL_TREE)
1870 return;
1871
1872 establish_stmt
1873 = build_call_1_expr (vms_builtin_establish_handler_decl,
1874 build_unary_op
1875 (ADDR_EXPR, NULL_TREE,
1876 gnat_vms_condition_handler_decl));
1877
1878 add_stmt (establish_stmt);
1879}
1880\f
1881/* Subroutine of gnat_to_gnu to process gnat_node, an N_Subprogram_Body. We
1882 don't return anything. */
1883
1884static void
1885Subprogram_Body_to_gnu (Node_Id gnat_node)
1886{
1887 /* Defining identifier of a parameter to the subprogram. */
1888 Entity_Id gnat_param;
1889 /* The defining identifier for the subprogram body. Note that if a
1890 specification has appeared before for this body, then the identifier
1891 occurring in that specification will also be a defining identifier and all
1892 the calls to this subprogram will point to that specification. */
1893 Entity_Id gnat_subprog_id
1894 = (Present (Corresponding_Spec (gnat_node))
1895 ? Corresponding_Spec (gnat_node) : Defining_Entity (gnat_node));
1896 /* The FUNCTION_DECL node corresponding to the subprogram spec. */
1897 tree gnu_subprog_decl;
1898 /* The FUNCTION_TYPE node corresponding to the subprogram spec. */
1899 tree gnu_subprog_type;
1900 tree gnu_cico_list;
1901 tree gnu_result;
1902 VEC(parm_attr,gc) *cache;
1903
1904 /* If this is a generic object or if it has been eliminated,
1905 ignore it. */
1906 if (Ekind (gnat_subprog_id) == E_Generic_Procedure
1907 || Ekind (gnat_subprog_id) == E_Generic_Function
1908 || Is_Eliminated (gnat_subprog_id))
1909 return;
1910
1911 /* If this subprogram acts as its own spec, define it. Otherwise, just get
1912 the already-elaborated tree node. However, if this subprogram had its
1913 elaboration deferred, we will already have made a tree node for it. So
1914 treat it as not being defined in that case. Such a subprogram cannot
1915 have an address clause or a freeze node, so this test is safe, though it
1916 does disable some otherwise-useful error checking. */
1917 gnu_subprog_decl
1918 = gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE,
1919 Acts_As_Spec (gnat_node)
1920 && !present_gnu_tree (gnat_subprog_id));
1921
1922 gnu_subprog_type = TREE_TYPE (gnu_subprog_decl);
1923
1924 /* Propagate the debug mode. */
1925 if (!Needs_Debug_Info (gnat_subprog_id))
1926 DECL_IGNORED_P (gnu_subprog_decl) = 1;
1927
1928 /* Set the line number in the decl to correspond to that of the body so that
1929 the line number notes are written correctly. */
1930 Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (gnu_subprog_decl));
1931
1932 /* Initialize the information structure for the function. */
1933 allocate_struct_function (gnu_subprog_decl, false);
1934 DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language
1935 = GGC_CNEW (struct language_function);
1936
1937 begin_subprog_body (gnu_subprog_decl);
1938 gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
1939
1940 /* If there are Out parameters, we need to ensure that the return statement
1941 properly copies them out. We do this by making a new block and converting
1942 any inner return into a goto to a label at the end of the block. */
1943 push_stack (&gnu_return_label_stack, NULL_TREE,
1944 gnu_cico_list ? create_artificial_label () : NULL_TREE);
1945
1946 /* Get a tree corresponding to the code for the subprogram. */
1947 start_stmt_group ();
1948 gnat_pushlevel ();
1949
1950 /* See if there are any parameters for which we don't yet have GCC entities.
1951 These must be for Out parameters for which we will be making VAR_DECL
1952 nodes here. Fill them in to TYPE_CI_CO_LIST, which must contain the empty
1953 entry as well. We can match up the entries because TYPE_CI_CO_LIST is in
1954 the order of the parameters. */
1955 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
1956 Present (gnat_param);
1957 gnat_param = Next_Formal_With_Extras (gnat_param))
1958 if (!present_gnu_tree (gnat_param))
1959 {
1960 /* Skip any entries that have been already filled in; they must
1961 correspond to In Out parameters. */
1962 for (; gnu_cico_list && TREE_VALUE (gnu_cico_list);
1963 gnu_cico_list = TREE_CHAIN (gnu_cico_list))
1964 ;
1965
1966 /* Do any needed references for padded types. */
1967 TREE_VALUE (gnu_cico_list)
1968 = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_list)),
1969 gnat_to_gnu_entity (gnat_param, NULL_TREE, 1));
1970 }
1971
1972 /* On VMS, establish our condition handler to possibly turn a condition into
1973 the corresponding exception if the subprogram has a foreign convention or
1974 is exported.
1975
1976 To ensure proper execution of local finalizations on condition instances,
1977 we must turn a condition into the corresponding exception even if there
1978 is no applicable Ada handler, and need at least one condition handler per
1979 possible call chain involving GNAT code. OTOH, establishing the handler
1980 has a cost so we want to minimize the number of subprograms into which
1981 this happens. The foreign or exported condition is expected to satisfy
1982 all the constraints. */
1983 if (TARGET_ABI_OPEN_VMS
1984 && (Has_Foreign_Convention (gnat_node) || Is_Exported (gnat_node)))
1985 establish_gnat_vms_condition_handler ();
1986
1987 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
1988
1989 /* Generate the code of the subprogram itself. A return statement will be
1990 present and any Out parameters will be handled there. */
1991 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
1992 gnat_poplevel ();
1993 gnu_result = end_stmt_group ();
1994
1995 /* If we populated the parameter attributes cache, we need to make sure
1996 that the cached expressions are evaluated on all possible paths. */
1997 cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
1998 if (cache)
1999 {
2000 struct parm_attr *pa;
2001 int i;
2002
2003 start_stmt_group ();
2004
2005 for (i = 0; VEC_iterate (parm_attr, cache, i, pa); i++)
2006 {
2007 if (pa->first)
7fda1596 2008 add_stmt_with_node (pa->first, gnat_node);
a1ab4c31 2009 if (pa->last)
7fda1596 2010 add_stmt_with_node (pa->last, gnat_node);
a1ab4c31 2011 if (pa->length)
7fda1596 2012 add_stmt_with_node (pa->length, gnat_node);
a1ab4c31
AC
2013 }
2014
2015 add_stmt (gnu_result);
2016 gnu_result = end_stmt_group ();
2017 }
2018
2019 /* If we made a special return label, we need to make a block that contains
2020 the definition of that label and the copying to the return value. That
2021 block first contains the function, then the label and copy statement. */
2022 if (TREE_VALUE (gnu_return_label_stack))
2023 {
2024 tree gnu_retval;
2025
2026 start_stmt_group ();
2027 gnat_pushlevel ();
2028 add_stmt (gnu_result);
2029 add_stmt (build1 (LABEL_EXPR, void_type_node,
2030 TREE_VALUE (gnu_return_label_stack)));
2031
2032 gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2033 if (list_length (gnu_cico_list) == 1)
2034 gnu_retval = TREE_VALUE (gnu_cico_list);
2035 else
2036 gnu_retval = gnat_build_constructor (TREE_TYPE (gnu_subprog_type),
2037 gnu_cico_list);
2038
2039 if (DECL_P (gnu_retval) && DECL_BY_REF_P (gnu_retval))
2040 gnu_retval = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_retval);
2041
2042 add_stmt_with_node
2043 (build_return_expr (DECL_RESULT (gnu_subprog_decl), gnu_retval),
7fda1596 2044 End_Label (Handled_Statement_Sequence (gnat_node)));
a1ab4c31
AC
2045 gnat_poplevel ();
2046 gnu_result = end_stmt_group ();
2047 }
2048
2049 pop_stack (&gnu_return_label_stack);
2050
2051 /* Set the end location. */
2052 Sloc_to_locus
2053 ((Present (End_Label (Handled_Statement_Sequence (gnat_node)))
2054 ? Sloc (End_Label (Handled_Statement_Sequence (gnat_node)))
2055 : Sloc (gnat_node)),
2056 &DECL_STRUCT_FUNCTION (gnu_subprog_decl)->function_end_locus);
2057
2058 end_subprog_body (gnu_result, false);
2059
2060 /* Disconnect the trees for parameters that we made variables for from the
2061 GNAT entities since these are unusable after we end the function. */
2062 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
2063 Present (gnat_param);
2064 gnat_param = Next_Formal_With_Extras (gnat_param))
2065 if (TREE_CODE (get_gnu_tree (gnat_param)) == VAR_DECL)
2066 save_gnu_tree (gnat_param, NULL_TREE, false);
2067
2068 if (DECL_FUNCTION_STUB (gnu_subprog_decl))
2069 build_function_stub (gnu_subprog_decl, gnat_subprog_id);
2070
2071 mark_out_of_scope (Defining_Unit_Name (Specification (gnat_node)));
2072}
2073\f
2074/* Subroutine of gnat_to_gnu to translate gnat_node, either an N_Function_Call
2075 or an N_Procedure_Call_Statement, to a GCC tree, which is returned.
2076 GNU_RESULT_TYPE_P is a pointer to where we should place the result type.
2077 If GNU_TARGET is non-null, this must be a function call and the result
2078 of the call is to be placed into that object. */
2079
2080static tree
2081call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
2082{
2083 tree gnu_result;
2084 /* The GCC node corresponding to the GNAT subprogram name. This can either
2085 be a FUNCTION_DECL node if we are dealing with a standard subprogram call,
2086 or an indirect reference expression (an INDIRECT_REF node) pointing to a
2087 subprogram. */
2088 tree gnu_subprog_node = gnat_to_gnu (Name (gnat_node));
2089 /* The FUNCTION_TYPE node giving the GCC type of the subprogram. */
2090 tree gnu_subprog_type = TREE_TYPE (gnu_subprog_node);
2091 tree gnu_subprog_addr = build_unary_op (ADDR_EXPR, NULL_TREE,
2092 gnu_subprog_node);
2093 Entity_Id gnat_formal;
2094 Node_Id gnat_actual;
2095 tree gnu_actual_list = NULL_TREE;
2096 tree gnu_name_list = NULL_TREE;
2097 tree gnu_before_list = NULL_TREE;
2098 tree gnu_after_list = NULL_TREE;
2099 tree gnu_subprog_call;
2100
2101 switch (Nkind (Name (gnat_node)))
2102 {
2103 case N_Identifier:
2104 case N_Operator_Symbol:
2105 case N_Expanded_Name:
2106 case N_Attribute_Reference:
2107 if (Is_Eliminated (Entity (Name (gnat_node))))
2108 Eliminate_Error_Msg (gnat_node, Entity (Name (gnat_node)));
2109 }
2110
2111 gcc_assert (TREE_CODE (gnu_subprog_type) == FUNCTION_TYPE);
2112
2113 /* If we are calling a stubbed function, make this into a raise of
2114 Program_Error. Elaborate all our args first. */
2115 if (TREE_CODE (gnu_subprog_node) == FUNCTION_DECL
2116 && DECL_STUBBED_P (gnu_subprog_node))
2117 {
2118 for (gnat_actual = First_Actual (gnat_node);
2119 Present (gnat_actual);
2120 gnat_actual = Next_Actual (gnat_actual))
2121 add_stmt (gnat_to_gnu (gnat_actual));
2122
2123 {
2124 tree call_expr
2125 = build_call_raise (PE_Stubbed_Subprogram_Called, gnat_node,
2126 N_Raise_Program_Error);
2127
2128 if (Nkind (gnat_node) == N_Function_Call && !gnu_target)
2129 {
2130 *gnu_result_type_p = TREE_TYPE (gnu_subprog_type);
2131 return build1 (NULL_EXPR, *gnu_result_type_p, call_expr);
2132 }
2133 else
2134 return call_expr;
2135 }
2136 }
2137
2138 /* If we are calling by supplying a pointer to a target, set up that
2139 pointer as the first argument. Use GNU_TARGET if one was passed;
2140 otherwise, make a target by building a variable of the maximum size
2141 of the type. */
2142 if (TYPE_RETURNS_BY_TARGET_PTR_P (gnu_subprog_type))
2143 {
2144 tree gnu_real_ret_type
2145 = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (gnu_subprog_type)));
2146
2147 if (!gnu_target)
2148 {
2149 tree gnu_obj_type
2150 = maybe_pad_type (gnu_real_ret_type,
2151 max_size (TYPE_SIZE (gnu_real_ret_type), true),
2152 0, Etype (Name (gnat_node)), "PAD", false,
2153 false, false);
2154
2155 /* ??? We may be about to create a static temporary if we happen to
2156 be at the global binding level. That's a regression from what
2157 the 3.x back-end would generate in the same situation, but we
2158 don't have a mechanism in Gigi for creating automatic variables
2159 in the elaboration routines. */
2160 gnu_target
2161 = create_var_decl (create_tmp_var_name ("LR"), NULL, gnu_obj_type,
2162 NULL, false, false, false, false, NULL,
2163 gnat_node);
2164 }
2165
2166 gnu_actual_list
2167 = tree_cons (NULL_TREE,
2168 build_unary_op (ADDR_EXPR, NULL_TREE,
2169 unchecked_convert (gnu_real_ret_type,
2170 gnu_target,
2171 false)),
2172 NULL_TREE);
2173
2174 }
2175
2176 /* The only way we can be making a call via an access type is if Name is an
2177 explicit dereference. In that case, get the list of formal args from the
2178 type the access type is pointing to. Otherwise, get the formals from
2179 entity being called. */
2180 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
2181 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
2182 else if (Nkind (Name (gnat_node)) == N_Attribute_Reference)
2183 /* Assume here that this must be 'Elab_Body or 'Elab_Spec. */
2184 gnat_formal = 0;
2185 else
2186 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
2187
2188 /* Create the list of the actual parameters as GCC expects it, namely a chain
2189 of TREE_LIST nodes in which the TREE_VALUE field of each node is a
2190 parameter-expression and the TREE_PURPOSE field is null. Skip Out
2191 parameters not passed by reference and don't need to be copied in. */
2192 for (gnat_actual = First_Actual (gnat_node);
2193 Present (gnat_actual);
2194 gnat_formal = Next_Formal_With_Extras (gnat_formal),
2195 gnat_actual = Next_Actual (gnat_actual))
2196 {
2197 tree gnu_formal
2198 = (present_gnu_tree (gnat_formal)
2199 ? get_gnu_tree (gnat_formal) : NULL_TREE);
2200 tree gnu_formal_type = gnat_to_gnu_type (Etype (gnat_formal));
2201 /* We must suppress conversions that can cause the creation of a
2202 temporary in the Out or In Out case because we need the real
2203 object in this case, either to pass its address if it's passed
2204 by reference or as target of the back copy done after the call
2205 if it uses the copy-in copy-out mechanism. We do it in the In
2206 case too, except for an unchecked conversion because it alone
2207 can cause the actual to be misaligned and the addressability
2208 test is applied to the real object. */
2209 bool suppress_type_conversion
2210 = ((Nkind (gnat_actual) == N_Unchecked_Type_Conversion
2211 && Ekind (gnat_formal) != E_In_Parameter)
2212 || (Nkind (gnat_actual) == N_Type_Conversion
2213 && Is_Composite_Type (Underlying_Type (Etype (gnat_formal)))));
2214 Node_Id gnat_name = (suppress_type_conversion
2215 ? Expression (gnat_actual) : gnat_actual);
2216 tree gnu_name = gnat_to_gnu (gnat_name), gnu_name_type;
2217 tree gnu_actual;
2218
2219 /* If it's possible we may need to use this expression twice, make sure
2220 that any side-effects are handled via SAVE_EXPRs. Likewise if we need
2221 to force side-effects before the call.
2222 ??? This is more conservative than we need since we don't need to do
2223 this for pass-by-ref with no conversion. */
2224 if (Ekind (gnat_formal) != E_In_Parameter)
2225 gnu_name = gnat_stabilize_reference (gnu_name, true);
2226
2227 /* If we are passing a non-addressable parameter by reference, pass the
2228 address of a copy. In the Out or In Out case, set up to copy back
2229 out after the call. */
2230 if (gnu_formal
2231 && (DECL_BY_REF_P (gnu_formal)
2232 || (TREE_CODE (gnu_formal) == PARM_DECL
2233 && (DECL_BY_COMPONENT_PTR_P (gnu_formal)
2234 || (DECL_BY_DESCRIPTOR_P (gnu_formal)))))
2235 && (gnu_name_type = gnat_to_gnu_type (Etype (gnat_name)))
2236 && !addressable_p (gnu_name, gnu_name_type))
2237 {
2238 tree gnu_copy = gnu_name, gnu_temp;
2239
2240 /* If the type is by_reference, a copy is not allowed. */
2241 if (Is_By_Reference_Type (Etype (gnat_formal)))
2242 post_error
2243 ("misaligned actual cannot be passed by reference", gnat_actual);
2244
2245 /* For users of Starlet we issue a warning because the
2246 interface apparently assumes that by-ref parameters
2247 outlive the procedure invocation. The code still
2248 will not work as intended, but we cannot do much
2249 better since other low-level parts of the back-end
2250 would allocate temporaries at will because of the
2251 misalignment if we did not do so here. */
2252 else if (Is_Valued_Procedure (Entity (Name (gnat_node))))
2253 {
2254 post_error
2255 ("?possible violation of implicit assumption", gnat_actual);
2256 post_error_ne
2257 ("?made by pragma Import_Valued_Procedure on &", gnat_actual,
2258 Entity (Name (gnat_node)));
2259 post_error_ne ("?because of misalignment of &", gnat_actual,
2260 gnat_formal);
2261 }
2262
2263 /* Remove any unpadding from the object and reset the copy. */
2264 if (TREE_CODE (gnu_name) == COMPONENT_REF
2265 && ((TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_name, 0)))
2266 == RECORD_TYPE)
2267 && (TYPE_IS_PADDING_P
2268 (TREE_TYPE (TREE_OPERAND (gnu_name, 0))))))
2269 gnu_name = gnu_copy = TREE_OPERAND (gnu_name, 0);
2270
2271 /* Otherwise convert to the nominal type of the object if it's
2272 a record type. There are several cases in which we need to
2273 make the temporary using this type instead of the actual type
2274 of the object if they are distinct, because the expectations
2275 of the callee would otherwise not be met:
2276 - if it's a justified modular type,
2277 - if the actual type is a smaller packable version of it. */
2278 else if (TREE_CODE (gnu_name_type) == RECORD_TYPE
2279 && (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)
2280 || smaller_packable_type_p (TREE_TYPE (gnu_name),
2281 gnu_name_type)))
2282 gnu_name = convert (gnu_name_type, gnu_name);
2283
2284 /* Make a SAVE_EXPR to both properly account for potential side
2285 effects and handle the creation of a temporary copy. Special
2286 code in gnat_gimplify_expr ensures that the same temporary is
2287 used as the object and copied back after the call if needed. */
2288 gnu_name = build1 (SAVE_EXPR, TREE_TYPE (gnu_name), gnu_name);
2289 TREE_SIDE_EFFECTS (gnu_name) = 1;
2290
2291 /* Set up to move the copy back to the original. */
2292 if (Ekind (gnat_formal) != E_In_Parameter)
2293 {
2294 gnu_temp = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_copy,
2295 gnu_name);
e650b83a 2296 set_expr_location_from_node (gnu_temp, gnat_node);
a1ab4c31
AC
2297 append_to_statement_list (gnu_temp, &gnu_after_list);
2298 }
2299 }
2300
2301 /* Start from the real object and build the actual. */
2302 gnu_actual = gnu_name;
2303
2304 /* If this was a procedure call, we may not have removed any padding.
2305 So do it here for the part we will use as an input, if any. */
2306 if (Ekind (gnat_formal) != E_Out_Parameter
2307 && TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
2308 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
2309 gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
2310 gnu_actual);
2311
2312 /* Do any needed conversions for the actual and make sure that it is
2313 in range of the formal's type. */
2314 if (suppress_type_conversion)
2315 {
2316 /* Put back the conversion we suppressed above in the computation
2317 of the real object. Note that we treat a conversion between
2318 aggregate types as if it is an unchecked conversion here. */
2319 gnu_actual
2320 = unchecked_convert (gnat_to_gnu_type (Etype (gnat_actual)),
2321 gnu_actual,
2322 (Nkind (gnat_actual)
2323 == N_Unchecked_Type_Conversion)
2324 && No_Truncation (gnat_actual));
2325
2326 if (Ekind (gnat_formal) != E_Out_Parameter
2327 && Do_Range_Check (gnat_actual))
2328 gnu_actual = emit_range_check (gnu_actual, Etype (gnat_formal));
2329 }
2330 else
2331 {
2332 if (Ekind (gnat_formal) != E_Out_Parameter
2333 && Do_Range_Check (gnat_actual))
2334 gnu_actual = emit_range_check (gnu_actual, Etype (gnat_formal));
2335
2336 /* We may have suppressed a conversion to the Etype of the actual
2337 since the parent is a procedure call. So put it back here.
2338 ??? We use the reverse order compared to the case above because
2339 of an awkward interaction with the check and actually don't put
2340 back the conversion at all if a check is emitted. This is also
2341 done for the conversion to the formal's type just below. */
2342 if (TREE_CODE (gnu_actual) != SAVE_EXPR)
2343 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
2344 gnu_actual);
2345 }
2346
2347 if (TREE_CODE (gnu_actual) != SAVE_EXPR)
2348 gnu_actual = convert (gnu_formal_type, gnu_actual);
2349
2350 /* Unless this is an In parameter, we must remove any justified modular
2351 building from GNU_NAME to get an lvalue. */
2352 if (Ekind (gnat_formal) != E_In_Parameter
2353 && TREE_CODE (gnu_name) == CONSTRUCTOR
2354 && TREE_CODE (TREE_TYPE (gnu_name)) == RECORD_TYPE
2355 && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (gnu_name)))
2356 gnu_name = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_name))),
2357 gnu_name);
2358
2359 /* If we have not saved a GCC object for the formal, it means it is an
2360 Out parameter not passed by reference and that does not need to be
2361 copied in. Otherwise, look at the PARM_DECL to see if it is passed by
2362 reference. */
2363 if (gnu_formal
2364 && TREE_CODE (gnu_formal) == PARM_DECL
2365 && DECL_BY_REF_P (gnu_formal))
2366 {
2367 if (Ekind (gnat_formal) != E_In_Parameter)
2368 {
2369 /* In Out or Out parameters passed by reference don't use the
2370 copy-in copy-out mechanism so the address of the real object
2371 must be passed to the function. */
2372 gnu_actual = gnu_name;
2373
2374 /* If we have a padded type, be sure we've removed padding. */
2375 if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
2376 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual))
2377 && TREE_CODE (gnu_actual) != SAVE_EXPR)
2378 gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
2379 gnu_actual);
2380
2381 /* If we have the constructed subtype of an aliased object
2382 with an unconstrained nominal subtype, the type of the
2383 actual includes the template, although it is formally
2384 constrained. So we need to convert it back to the real
2385 constructed subtype to retrieve the constrained part
2386 and takes its address. */
2387 if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
2388 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual))
2389 && TREE_CODE (gnu_actual) != SAVE_EXPR
2390 && Is_Constr_Subt_For_UN_Aliased (Etype (gnat_actual))
2391 && Is_Array_Type (Etype (gnat_actual)))
2392 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
2393 gnu_actual);
2394 }
2395
2396 /* The symmetry of the paths to the type of an entity is broken here
2397 since arguments don't know that they will be passed by ref. */
2398 gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal));
2399 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
2400 }
2401 else if (gnu_formal
2402 && TREE_CODE (gnu_formal) == PARM_DECL
2403 && DECL_BY_COMPONENT_PTR_P (gnu_formal))
2404 {
2405 gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal));
2406 gnu_actual = maybe_implicit_deref (gnu_actual);
2407 gnu_actual = maybe_unconstrained_array (gnu_actual);
2408
2409 if (TREE_CODE (gnu_formal_type) == RECORD_TYPE
2410 && TYPE_IS_PADDING_P (gnu_formal_type))
2411 {
2412 gnu_formal_type = TREE_TYPE (TYPE_FIELDS (gnu_formal_type));
2413 gnu_actual = convert (gnu_formal_type, gnu_actual);
2414 }
2415
2416 /* Take the address of the object and convert to the proper pointer
2417 type. We'd like to actually compute the address of the beginning
2418 of the array using an ADDR_EXPR of an ARRAY_REF, but there's a
2419 possibility that the ARRAY_REF might return a constant and we'd be
2420 getting the wrong address. Neither approach is exactly correct,
2421 but this is the most likely to work in all cases. */
2422 gnu_actual = convert (gnu_formal_type,
2423 build_unary_op (ADDR_EXPR, NULL_TREE,
2424 gnu_actual));
2425 }
2426 else if (gnu_formal
2427 && TREE_CODE (gnu_formal) == PARM_DECL
2428 && DECL_BY_DESCRIPTOR_P (gnu_formal))
2429 {
2430 /* If arg is 'Null_Parameter, pass zero descriptor. */
2431 if ((TREE_CODE (gnu_actual) == INDIRECT_REF
2432 || TREE_CODE (gnu_actual) == UNCONSTRAINED_ARRAY_REF)
2433 && TREE_PRIVATE (gnu_actual))
2434 gnu_actual = convert (DECL_ARG_TYPE (get_gnu_tree (gnat_formal)),
2435 integer_zero_node);
2436 else
2437 gnu_actual = build_unary_op (ADDR_EXPR, NULL_TREE,
2438 fill_vms_descriptor (gnu_actual,
819fad69
AC
2439 gnat_formal,
2440 gnat_actual));
a1ab4c31
AC
2441 }
2442 else
2443 {
2444 tree gnu_actual_size = TYPE_SIZE (TREE_TYPE (gnu_actual));
2445
2446 if (Ekind (gnat_formal) != E_In_Parameter)
2447 gnu_name_list = tree_cons (NULL_TREE, gnu_name, gnu_name_list);
2448
2449 if (!gnu_formal || TREE_CODE (gnu_formal) != PARM_DECL)
2450 continue;
2451
2452 /* If this is 'Null_Parameter, pass a zero even though we are
2453 dereferencing it. */
2454 else if (TREE_CODE (gnu_actual) == INDIRECT_REF
2455 && TREE_PRIVATE (gnu_actual)
2456 && host_integerp (gnu_actual_size, 1)
2457 && 0 >= compare_tree_int (gnu_actual_size,
2458 BITS_PER_WORD))
2459 gnu_actual
2460 = unchecked_convert (DECL_ARG_TYPE (gnu_formal),
2461 convert (gnat_type_for_size
2462 (tree_low_cst (gnu_actual_size, 1),
2463 1),
2464 integer_zero_node),
2465 false);
2466 else
2467 gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual);
2468 }
2469
2470 gnu_actual_list = tree_cons (NULL_TREE, gnu_actual, gnu_actual_list);
2471 }
2472
2473 gnu_subprog_call = build_call_list (TREE_TYPE (gnu_subprog_type),
2474 gnu_subprog_addr,
2475 nreverse (gnu_actual_list));
2476 set_expr_location_from_node (gnu_subprog_call, gnat_node);
2477
2478 /* If we return by passing a target, the result is the target after the
2479 call. We must not emit the call directly here because this might be
2480 evaluated as part of an expression with conditions to control whether
2481 the call should be emitted or not. */
2482 if (TYPE_RETURNS_BY_TARGET_PTR_P (gnu_subprog_type))
2483 {
2484 /* Conceptually, what we need is a COMPOUND_EXPR with the call followed
2485 by the target object converted to the proper type. Doing so would
2486 potentially be very inefficient, however, as this expression might
2487 end up wrapped into an outer SAVE_EXPR later on, which would incur a
2488 pointless temporary copy of the whole object.
2489
2490 What we do instead is build a COMPOUND_EXPR returning the address of
2491 the target, and then dereference. Wrapping the COMPOUND_EXPR into a
2492 SAVE_EXPR later on then only incurs a pointer copy. */
2493
2494 tree gnu_result_type
2495 = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (gnu_subprog_type)));
2496
2497 /* Build and return
2498 (result_type) *[gnu_subprog_call (&gnu_target, ...), &gnu_target] */
2499
2500 tree gnu_target_address
2501 = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_target);
2502 set_expr_location_from_node (gnu_target_address, gnat_node);
2503
2504 gnu_result
2505 = build2 (COMPOUND_EXPR, TREE_TYPE (gnu_target_address),
2506 gnu_subprog_call, gnu_target_address);
2507
2508 gnu_result
2509 = unchecked_convert (gnu_result_type,
2510 build_unary_op (INDIRECT_REF, NULL_TREE,
2511 gnu_result),
2512 false);
2513
2514 *gnu_result_type_p = gnu_result_type;
2515 return gnu_result;
2516 }
2517
2518 /* If it is a function call, the result is the call expression unless
2519 a target is specified, in which case we copy the result into the target
2520 and return the assignment statement. */
2521 else if (Nkind (gnat_node) == N_Function_Call)
2522 {
2523 gnu_result = gnu_subprog_call;
2524
2525 /* If the function returns an unconstrained array or by reference,
2526 we have to de-dereference the pointer. */
2527 if (TYPE_RETURNS_UNCONSTRAINED_P (gnu_subprog_type)
2528 || TYPE_RETURNS_BY_REF_P (gnu_subprog_type))
2529 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
2530
2531 if (gnu_target)
2532 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
2533 gnu_target, gnu_result);
2534 else
2535 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
2536
2537 return gnu_result;
2538 }
2539
2540 /* If this is the case where the GNAT tree contains a procedure call
2541 but the Ada procedure has copy in copy out parameters, the special
2542 parameter passing mechanism must be used. */
2543 else if (TYPE_CI_CO_LIST (gnu_subprog_type) != NULL_TREE)
2544 {
2545 /* List of FIELD_DECLs associated with the PARM_DECLs of the copy
2546 in copy out parameters. */
2547 tree scalar_return_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2548 int length = list_length (scalar_return_list);
2549
2550 if (length > 1)
2551 {
2552 tree gnu_name;
2553
2554 gnu_subprog_call = save_expr (gnu_subprog_call);
2555 gnu_name_list = nreverse (gnu_name_list);
2556
2557 /* If any of the names had side-effects, ensure they are all
2558 evaluated before the call. */
2559 for (gnu_name = gnu_name_list; gnu_name;
2560 gnu_name = TREE_CHAIN (gnu_name))
2561 if (TREE_SIDE_EFFECTS (TREE_VALUE (gnu_name)))
2562 append_to_statement_list (TREE_VALUE (gnu_name),
2563 &gnu_before_list);
2564 }
2565
2566 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
2567 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
2568 else
2569 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
2570
2571 for (gnat_actual = First_Actual (gnat_node);
2572 Present (gnat_actual);
2573 gnat_formal = Next_Formal_With_Extras (gnat_formal),
2574 gnat_actual = Next_Actual (gnat_actual))
2575 /* If we are dealing with a copy in copy out parameter, we must
2576 retrieve its value from the record returned in the call. */
2577 if (!(present_gnu_tree (gnat_formal)
2578 && TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
2579 && (DECL_BY_REF_P (get_gnu_tree (gnat_formal))
2580 || (TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
2581 && ((DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal))
2582 || (DECL_BY_DESCRIPTOR_P
2583 (get_gnu_tree (gnat_formal))))))))
2584 && Ekind (gnat_formal) != E_In_Parameter)
2585 {
2586 /* Get the value to assign to this Out or In Out parameter. It is
2587 either the result of the function if there is only a single such
2588 parameter or the appropriate field from the record returned. */
2589 tree gnu_result
2590 = length == 1 ? gnu_subprog_call
2591 : build_component_ref (gnu_subprog_call, NULL_TREE,
2592 TREE_PURPOSE (scalar_return_list),
2593 false);
2594
2595 /* If the actual is a conversion, get the inner expression, which
2596 will be the real destination, and convert the result to the
2597 type of the actual parameter. */
2598 tree gnu_actual
2599 = maybe_unconstrained_array (TREE_VALUE (gnu_name_list));
2600
2601 /* If the result is a padded type, remove the padding. */
2602 if (TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE
2603 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
2604 gnu_result = convert (TREE_TYPE (TYPE_FIELDS
2605 (TREE_TYPE (gnu_result))),
2606 gnu_result);
2607
2608 /* If the actual is a type conversion, the real target object is
2609 denoted by the inner Expression and we need to convert the
2610 result to the associated type.
2611 We also need to convert our gnu assignment target to this type
2612 if the corresponding GNU_NAME was constructed from the GNAT
2613 conversion node and not from the inner Expression. */
2614 if (Nkind (gnat_actual) == N_Type_Conversion)
2615 {
2616 gnu_result
2617 = convert_with_check
2618 (Etype (Expression (gnat_actual)), gnu_result,
2619 Do_Overflow_Check (gnat_actual),
2620 Do_Range_Check (Expression (gnat_actual)),
2621 Float_Truncate (gnat_actual));
2622
2623 if (!Is_Composite_Type (Underlying_Type (Etype (gnat_formal))))
2624 gnu_actual = convert (TREE_TYPE (gnu_result), gnu_actual);
2625 }
2626
2627 /* Unchecked conversions as actuals for Out parameters are not
2628 allowed in user code because they are not variables, but do
2629 occur in front-end expansions. The associated GNU_NAME is
2630 always obtained from the inner expression in such cases. */
2631 else if (Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
2632 gnu_result = unchecked_convert (TREE_TYPE (gnu_actual),
2633 gnu_result,
2634 No_Truncation (gnat_actual));
2635 else
2636 {
2637 if (Do_Range_Check (gnat_actual))
2638 gnu_result = emit_range_check (gnu_result,
2639 Etype (gnat_actual));
2640
2641 if (!(!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_actual)))
2642 && TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_result)))))
2643 gnu_result = convert (TREE_TYPE (gnu_actual), gnu_result);
2644 }
2645
2646 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
2647 gnu_actual, gnu_result);
e650b83a 2648 set_expr_location_from_node (gnu_result, gnat_node);
a1ab4c31
AC
2649 append_to_statement_list (gnu_result, &gnu_before_list);
2650 scalar_return_list = TREE_CHAIN (scalar_return_list);
2651 gnu_name_list = TREE_CHAIN (gnu_name_list);
2652 }
2653 }
2654 else
2655 append_to_statement_list (gnu_subprog_call, &gnu_before_list);
2656
2657 append_to_statement_list (gnu_after_list, &gnu_before_list);
2658 return gnu_before_list;
2659}
2660\f
2661/* Subroutine of gnat_to_gnu to translate gnat_node, an
2662 N_Handled_Sequence_Of_Statements, to a GCC tree, which is returned. */
2663
2664static tree
2665Handled_Sequence_Of_Statements_to_gnu (Node_Id gnat_node)
2666{
2667 tree gnu_jmpsave_decl = NULL_TREE;
2668 tree gnu_jmpbuf_decl = NULL_TREE;
2669 /* If just annotating, ignore all EH and cleanups. */
2670 bool gcc_zcx = (!type_annotate_only
2671 && Present (Exception_Handlers (gnat_node))
2672 && Exception_Mechanism == Back_End_Exceptions);
2673 bool setjmp_longjmp
2674 = (!type_annotate_only && Present (Exception_Handlers (gnat_node))
2675 && Exception_Mechanism == Setjmp_Longjmp);
2676 bool at_end = !type_annotate_only && Present (At_End_Proc (gnat_node));
2677 bool binding_for_block = (at_end || gcc_zcx || setjmp_longjmp);
2678 tree gnu_inner_block; /* The statement(s) for the block itself. */
2679 tree gnu_result;
2680 tree gnu_expr;
2681 Node_Id gnat_temp;
2682
2683 /* The GCC exception handling mechanism can handle both ZCX and SJLJ schemes
2684 and we have our own SJLJ mechanism. To call the GCC mechanism, we call
2685 add_cleanup, and when we leave the binding, end_stmt_group will create
2686 the TRY_FINALLY_EXPR.
2687
2688 ??? The region level calls down there have been specifically put in place
2689 for a ZCX context and currently the order in which things are emitted
2690 (region/handlers) is different from the SJLJ case. Instead of putting
2691 other calls with different conditions at other places for the SJLJ case,
2692 it seems cleaner to reorder things for the SJLJ case and generalize the
2693 condition to make it not ZCX specific.
2694
2695 If there are any exceptions or cleanup processing involved, we need an
2696 outer statement group (for Setjmp_Longjmp) and binding level. */
2697 if (binding_for_block)
2698 {
2699 start_stmt_group ();
2700 gnat_pushlevel ();
2701 }
2702
2703 /* If using setjmp_longjmp, make the variables for the setjmp buffer and save
2704 area for address of previous buffer. Do this first since we need to have
2705 the setjmp buf known for any decls in this block. */
2706 if (setjmp_longjmp)
2707 {
2708 gnu_jmpsave_decl = create_var_decl (get_identifier ("JMPBUF_SAVE"),
2709 NULL_TREE, jmpbuf_ptr_type,
2710 build_call_0_expr (get_jmpbuf_decl),
2711 false, false, false, false, NULL,
2712 gnat_node);
2713 DECL_ARTIFICIAL (gnu_jmpsave_decl) = 1;
2714
2715 /* The __builtin_setjmp receivers will immediately reinstall it. Now
2716 because of the unstructured form of EH used by setjmp_longjmp, there
2717 might be forward edges going to __builtin_setjmp receivers on which
2718 it is uninitialized, although they will never be actually taken. */
2719 TREE_NO_WARNING (gnu_jmpsave_decl) = 1;
2720 gnu_jmpbuf_decl = create_var_decl (get_identifier ("JMP_BUF"),
2721 NULL_TREE, jmpbuf_type,
2722 NULL_TREE, false, false, false, false,
2723 NULL, gnat_node);
2724 DECL_ARTIFICIAL (gnu_jmpbuf_decl) = 1;
2725
2726 set_block_jmpbuf_decl (gnu_jmpbuf_decl);
2727
2728 /* When we exit this block, restore the saved value. */
2729 add_cleanup (build_call_1_expr (set_jmpbuf_decl, gnu_jmpsave_decl),
2730 End_Label (gnat_node));
2731 }
2732
2733 /* If we are to call a function when exiting this block, add a cleanup
2734 to the binding level we made above. Note that add_cleanup is FIFO
2735 so we must register this cleanup after the EH cleanup just above. */
2736 if (at_end)
2737 add_cleanup (build_call_0_expr (gnat_to_gnu (At_End_Proc (gnat_node))),
2738 End_Label (gnat_node));
2739
2740 /* Now build the tree for the declarations and statements inside this block.
2741 If this is SJLJ, set our jmp_buf as the current buffer. */
2742 start_stmt_group ();
2743
2744 if (setjmp_longjmp)
2745 add_stmt (build_call_1_expr (set_jmpbuf_decl,
2746 build_unary_op (ADDR_EXPR, NULL_TREE,
2747 gnu_jmpbuf_decl)));
2748
2749 if (Present (First_Real_Statement (gnat_node)))
2750 process_decls (Statements (gnat_node), Empty,
2751 First_Real_Statement (gnat_node), true, true);
2752
2753 /* Generate code for each statement in the block. */
2754 for (gnat_temp = (Present (First_Real_Statement (gnat_node))
2755 ? First_Real_Statement (gnat_node)
2756 : First (Statements (gnat_node)));
2757 Present (gnat_temp); gnat_temp = Next (gnat_temp))
2758 add_stmt (gnat_to_gnu (gnat_temp));
2759 gnu_inner_block = end_stmt_group ();
2760
2761 /* Now generate code for the two exception models, if either is relevant for
2762 this block. */
2763 if (setjmp_longjmp)
2764 {
2765 tree *gnu_else_ptr = 0;
2766 tree gnu_handler;
2767
2768 /* Make a binding level for the exception handling declarations and code
2769 and set up gnu_except_ptr_stack for the handlers to use. */
2770 start_stmt_group ();
2771 gnat_pushlevel ();
2772
2773 push_stack (&gnu_except_ptr_stack, NULL_TREE,
2774 create_var_decl (get_identifier ("EXCEPT_PTR"),
2775 NULL_TREE,
2776 build_pointer_type (except_type_node),
2777 build_call_0_expr (get_excptr_decl), false,
2778 false, false, false, NULL, gnat_node));
2779
2780 /* Generate code for each handler. The N_Exception_Handler case does the
2781 real work and returns a COND_EXPR for each handler, which we chain
2782 together here. */
2783 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
2784 Present (gnat_temp); gnat_temp = Next_Non_Pragma (gnat_temp))
2785 {
2786 gnu_expr = gnat_to_gnu (gnat_temp);
2787
2788 /* If this is the first one, set it as the outer one. Otherwise,
2789 point the "else" part of the previous handler to us. Then point
2790 to our "else" part. */
2791 if (!gnu_else_ptr)
2792 add_stmt (gnu_expr);
2793 else
2794 *gnu_else_ptr = gnu_expr;
2795
2796 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
2797 }
2798
2799 /* If none of the exception handlers did anything, re-raise but do not
2800 defer abortion. */
2801 gnu_expr = build_call_1_expr (raise_nodefer_decl,
2802 TREE_VALUE (gnu_except_ptr_stack));
2803 set_expr_location_from_node (gnu_expr, gnat_node);
2804
2805 if (gnu_else_ptr)
2806 *gnu_else_ptr = gnu_expr;
2807 else
2808 add_stmt (gnu_expr);
2809
2810 /* End the binding level dedicated to the exception handlers and get the
2811 whole statement group. */
2812 pop_stack (&gnu_except_ptr_stack);
2813 gnat_poplevel ();
2814 gnu_handler = end_stmt_group ();
2815
2816 /* If the setjmp returns 1, we restore our incoming longjmp value and
2817 then check the handlers. */
2818 start_stmt_group ();
2819 add_stmt_with_node (build_call_1_expr (set_jmpbuf_decl,
2820 gnu_jmpsave_decl),
2821 gnat_node);
2822 add_stmt (gnu_handler);
2823 gnu_handler = end_stmt_group ();
2824
2825 /* This block is now "if (setjmp) ... <handlers> else <block>". */
2826 gnu_result = build3 (COND_EXPR, void_type_node,
2827 (build_call_1_expr
2828 (setjmp_decl,
2829 build_unary_op (ADDR_EXPR, NULL_TREE,
2830 gnu_jmpbuf_decl))),
2831 gnu_handler, gnu_inner_block);
2832 }
2833 else if (gcc_zcx)
2834 {
2835 tree gnu_handlers;
2836
2837 /* First make a block containing the handlers. */
2838 start_stmt_group ();
2839 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
2840 Present (gnat_temp);
2841 gnat_temp = Next_Non_Pragma (gnat_temp))
2842 add_stmt (gnat_to_gnu (gnat_temp));
2843 gnu_handlers = end_stmt_group ();
2844
2845 /* Now make the TRY_CATCH_EXPR for the block. */
2846 gnu_result = build2 (TRY_CATCH_EXPR, void_type_node,
2847 gnu_inner_block, gnu_handlers);
2848 }
2849 else
2850 gnu_result = gnu_inner_block;
2851
2852 /* Now close our outer block, if we had to make one. */
2853 if (binding_for_block)
2854 {
2855 add_stmt (gnu_result);
2856 gnat_poplevel ();
2857 gnu_result = end_stmt_group ();
2858 }
2859
2860 return gnu_result;
2861}
2862\f
2863/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
2864 to a GCC tree, which is returned. This is the variant for Setjmp_Longjmp
2865 exception handling. */
2866
2867static tree
2868Exception_Handler_to_gnu_sjlj (Node_Id gnat_node)
2869{
2870 /* Unless this is "Others" or the special "Non-Ada" exception for Ada, make
2871 an "if" statement to select the proper exceptions. For "Others", exclude
2872 exceptions where Handled_By_Others is nonzero unless the All_Others flag
2873 is set. For "Non-ada", accept an exception if "Lang" is 'V'. */
2874 tree gnu_choice = integer_zero_node;
2875 tree gnu_body = build_stmt_group (Statements (gnat_node), false);
2876 Node_Id gnat_temp;
2877
2878 for (gnat_temp = First (Exception_Choices (gnat_node));
2879 gnat_temp; gnat_temp = Next (gnat_temp))
2880 {
2881 tree this_choice;
2882
2883 if (Nkind (gnat_temp) == N_Others_Choice)
2884 {
2885 if (All_Others (gnat_temp))
2886 this_choice = integer_one_node;
2887 else
2888 this_choice
2889 = build_binary_op
2890 (EQ_EXPR, integer_type_node,
2891 convert
2892 (integer_type_node,
2893 build_component_ref
2894 (build_unary_op
2895 (INDIRECT_REF, NULL_TREE,
2896 TREE_VALUE (gnu_except_ptr_stack)),
2897 get_identifier ("not_handled_by_others"), NULL_TREE,
2898 false)),
2899 integer_zero_node);
2900 }
2901
2902 else if (Nkind (gnat_temp) == N_Identifier
2903 || Nkind (gnat_temp) == N_Expanded_Name)
2904 {
2905 Entity_Id gnat_ex_id = Entity (gnat_temp);
2906 tree gnu_expr;
2907
2908 /* Exception may be a renaming. Recover original exception which is
2909 the one elaborated and registered. */
2910 if (Present (Renamed_Object (gnat_ex_id)))
2911 gnat_ex_id = Renamed_Object (gnat_ex_id);
2912
2913 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, 0);
2914
2915 this_choice
2916 = build_binary_op
2917 (EQ_EXPR, integer_type_node, TREE_VALUE (gnu_except_ptr_stack),
2918 convert (TREE_TYPE (TREE_VALUE (gnu_except_ptr_stack)),
2919 build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr)));
2920
2921 /* If this is the distinguished exception "Non_Ada_Error" (and we are
2922 in VMS mode), also allow a non-Ada exception (a VMS condition) t
2923 match. */
2924 if (Is_Non_Ada_Error (Entity (gnat_temp)))
2925 {
2926 tree gnu_comp
2927 = build_component_ref
2928 (build_unary_op (INDIRECT_REF, NULL_TREE,
2929 TREE_VALUE (gnu_except_ptr_stack)),
2930 get_identifier ("lang"), NULL_TREE, false);
2931
2932 this_choice
2933 = build_binary_op
2934 (TRUTH_ORIF_EXPR, integer_type_node,
2935 build_binary_op (EQ_EXPR, integer_type_node, gnu_comp,
2936 build_int_cst (TREE_TYPE (gnu_comp), 'V')),
2937 this_choice);
2938 }
2939 }
2940 else
2941 gcc_unreachable ();
2942
2943 gnu_choice = build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
2944 gnu_choice, this_choice);
2945 }
2946
2947 return build3 (COND_EXPR, void_type_node, gnu_choice, gnu_body, NULL_TREE);
2948}
2949\f
2950/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
2951 to a GCC tree, which is returned. This is the variant for ZCX. */
2952
2953static tree
2954Exception_Handler_to_gnu_zcx (Node_Id gnat_node)
2955{
2956 tree gnu_etypes_list = NULL_TREE;
2957 tree gnu_expr;
2958 tree gnu_etype;
2959 tree gnu_current_exc_ptr;
2960 tree gnu_incoming_exc_ptr;
2961 Node_Id gnat_temp;
2962
2963 /* We build a TREE_LIST of nodes representing what exception types this
2964 handler can catch, with special cases for others and all others cases.
2965
2966 Each exception type is actually identified by a pointer to the exception
2967 id, or to a dummy object for "others" and "all others".
2968
2969 Care should be taken to ensure that the control flow impact of "others"
2970 and "all others" is known to GCC. lang_eh_type_covers is doing the trick
2971 currently. */
2972 for (gnat_temp = First (Exception_Choices (gnat_node));
2973 gnat_temp; gnat_temp = Next (gnat_temp))
2974 {
2975 if (Nkind (gnat_temp) == N_Others_Choice)
2976 {
2977 tree gnu_expr
2978 = All_Others (gnat_temp) ? all_others_decl : others_decl;
2979
2980 gnu_etype
2981 = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
2982 }
2983 else if (Nkind (gnat_temp) == N_Identifier
2984 || Nkind (gnat_temp) == N_Expanded_Name)
2985 {
2986 Entity_Id gnat_ex_id = Entity (gnat_temp);
2987
2988 /* Exception may be a renaming. Recover original exception which is
2989 the one elaborated and registered. */
2990 if (Present (Renamed_Object (gnat_ex_id)))
2991 gnat_ex_id = Renamed_Object (gnat_ex_id);
2992
2993 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, 0);
2994 gnu_etype = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
2995
2996 /* The Non_Ada_Error case for VMS exceptions is handled
2997 by the personality routine. */
2998 }
2999 else
3000 gcc_unreachable ();
3001
3002 /* The GCC interface expects NULL to be passed for catch all handlers, so
3003 it would be quite tempting to set gnu_etypes_list to NULL if gnu_etype
3004 is integer_zero_node. It would not work, however, because GCC's
3005 notion of "catch all" is stronger than our notion of "others". Until
3006 we correctly use the cleanup interface as well, doing that would
3007 prevent the "all others" handlers from being seen, because nothing
3008 can be caught beyond a catch all from GCC's point of view. */
3009 gnu_etypes_list = tree_cons (NULL_TREE, gnu_etype, gnu_etypes_list);
3010 }
3011
3012 start_stmt_group ();
3013 gnat_pushlevel ();
3014
3015 /* Expand a call to the begin_handler hook at the beginning of the handler,
3016 and arrange for a call to the end_handler hook to occur on every possible
3017 exit path.
3018
3019 The hooks expect a pointer to the low level occurrence. This is required
3020 for our stack management scheme because a raise inside the handler pushes
3021 a new occurrence on top of the stack, which means that this top does not
3022 necessarily match the occurrence this handler was dealing with.
3023
3024 The EXC_PTR_EXPR object references the exception occurrence being
3025 propagated. Upon handler entry, this is the exception for which the
3026 handler is triggered. This might not be the case upon handler exit,
3027 however, as we might have a new occurrence propagated by the handler's
3028 body, and the end_handler hook called as a cleanup in this context.
3029
3030 We use a local variable to retrieve the incoming value at handler entry
3031 time, and reuse it to feed the end_handler hook's argument at exit. */
3032 gnu_current_exc_ptr = build0 (EXC_PTR_EXPR, ptr_type_node);
3033 gnu_incoming_exc_ptr = create_var_decl (get_identifier ("EXPTR"), NULL_TREE,
3034 ptr_type_node, gnu_current_exc_ptr,
3035 false, false, false, false, NULL,
3036 gnat_node);
3037
3038 add_stmt_with_node (build_call_1_expr (begin_handler_decl,
3039 gnu_incoming_exc_ptr),
3040 gnat_node);
3041 /* ??? We don't seem to have an End_Label at hand to set the location. */
3042 add_cleanup (build_call_1_expr (end_handler_decl, gnu_incoming_exc_ptr),
3043 Empty);
3044 add_stmt_list (Statements (gnat_node));
3045 gnat_poplevel ();
3046
3047 return build2 (CATCH_EXPR, void_type_node, gnu_etypes_list,
3048 end_stmt_group ());
3049}
3050\f
3051/* Subroutine of gnat_to_gnu to generate code for an N_Compilation unit. */
3052
3053static void
3054Compilation_Unit_to_gnu (Node_Id gnat_node)
3055{
3056 /* Make the decl for the elaboration procedure. */
3057 bool body_p = (Defining_Entity (Unit (gnat_node)),
3058 Nkind (Unit (gnat_node)) == N_Package_Body
3059 || Nkind (Unit (gnat_node)) == N_Subprogram_Body);
3060 Entity_Id gnat_unit_entity = Defining_Entity (Unit (gnat_node));
3061 tree gnu_elab_proc_decl
3062 = create_subprog_decl
3063 (create_concat_name (gnat_unit_entity,
3064 body_p ? "elabb" : "elabs"),
3065 NULL_TREE, void_ftype, NULL_TREE, false, true, false, NULL,
3066 gnat_unit_entity);
3067 struct elab_info *info;
3068
3069 push_stack (&gnu_elab_proc_stack, NULL_TREE, gnu_elab_proc_decl);
3070
3071 DECL_ELABORATION_PROC_P (gnu_elab_proc_decl) = 1;
3072 allocate_struct_function (gnu_elab_proc_decl, false);
3073 Sloc_to_locus (Sloc (gnat_unit_entity), &cfun->function_end_locus);
3074 set_cfun (NULL);
3075
3076 /* For a body, first process the spec if there is one. */
3077 if (Nkind (Unit (gnat_node)) == N_Package_Body
3078 || (Nkind (Unit (gnat_node)) == N_Subprogram_Body
3079 && !Acts_As_Spec (gnat_node)))
3080 {
3081 add_stmt (gnat_to_gnu (Library_Unit (gnat_node)));
3082 finalize_from_with_types ();
3083 }
3084
3085 process_inlined_subprograms (gnat_node);
3086
3087 if (type_annotate_only && gnat_node == Cunit (Main_Unit))
3088 {
3089 elaborate_all_entities (gnat_node);
3090
3091 if (Nkind (Unit (gnat_node)) == N_Subprogram_Declaration
3092 || Nkind (Unit (gnat_node)) == N_Generic_Package_Declaration
3093 || Nkind (Unit (gnat_node)) == N_Generic_Subprogram_Declaration)
3094 return;
3095 }
3096
3097 process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
3098 true, true);
3099 add_stmt (gnat_to_gnu (Unit (gnat_node)));
3100
3101 /* Process any pragmas and actions following the unit. */
3102 add_stmt_list (Pragmas_After (Aux_Decls_Node (gnat_node)));
3103 add_stmt_list (Actions (Aux_Decls_Node (gnat_node)));
3104 finalize_from_with_types ();
3105
3106 /* Save away what we've made so far and record this potential elaboration
3107 procedure. */
3108 info = (struct elab_info *) ggc_alloc (sizeof (struct elab_info));
3109 set_current_block_context (gnu_elab_proc_decl);
3110 gnat_poplevel ();
3111 DECL_SAVED_TREE (gnu_elab_proc_decl) = end_stmt_group ();
3112 info->next = elab_info_list;
3113 info->elab_proc = gnu_elab_proc_decl;
3114 info->gnat_node = gnat_node;
3115 elab_info_list = info;
3116
3117 /* Generate elaboration code for this unit, if necessary, and say whether
3118 we did or not. */
3119 pop_stack (&gnu_elab_proc_stack);
3120
3121 /* Invalidate the global renaming pointers. This is necessary because
3122 stabilization of the renamed entities may create SAVE_EXPRs which
3123 have been tied to a specific elaboration routine just above. */
3124 invalidate_global_renaming_pointers ();
3125}
3126\f
3127/* This function is the driver of the GNAT to GCC tree transformation
3128 process. It is the entry point of the tree transformer. GNAT_NODE is the
3129 root of some GNAT tree. Return the root of the corresponding GCC tree.
3130 If this is an expression, return the GCC equivalent of the expression. If
3131 it is a statement, return the statement. In the case when called for a
3132 statement, it may also add statements to the current statement group, in
3133 which case anything it returns is to be interpreted as occurring after
3134 anything `it already added. */
3135
3136tree
3137gnat_to_gnu (Node_Id gnat_node)
3138{
3139 bool went_into_elab_proc = false;
3140 tree gnu_result = error_mark_node; /* Default to no value. */
3141 tree gnu_result_type = void_type_node;
3142 tree gnu_expr;
3143 tree gnu_lhs, gnu_rhs;
3144 Node_Id gnat_temp;
3145
3146 /* Save node number for error message and set location information. */
3147 error_gnat_node = gnat_node;
3148 Sloc_to_locus (Sloc (gnat_node), &input_location);
3149
3150 if (type_annotate_only
3151 && IN (Nkind (gnat_node), N_Statement_Other_Than_Procedure_Call))
3152 return alloc_stmt_list ();
3153
3154 /* If this node is a non-static subexpression and we are only
3155 annotating types, make this into a NULL_EXPR. */
3156 if (type_annotate_only
3157 && IN (Nkind (gnat_node), N_Subexpr)
3158 && Nkind (gnat_node) != N_Identifier
3159 && !Compile_Time_Known_Value (gnat_node))
3160 return build1 (NULL_EXPR, get_unpadded_type (Etype (gnat_node)),
3161 build_call_raise (CE_Range_Check_Failed, gnat_node,
3162 N_Raise_Constraint_Error));
3163
3164 /* If this is a Statement and we are at top level, it must be part of the
3165 elaboration procedure, so mark us as being in that procedure and push our
3166 context.
3167
3168 If we are in the elaboration procedure, check if we are violating a
3169 No_Elaboration_Code restriction by having a statement there. */
3170 if ((IN (Nkind (gnat_node), N_Statement_Other_Than_Procedure_Call)
3171 && Nkind (gnat_node) != N_Null_Statement)
3172 || Nkind (gnat_node) == N_Procedure_Call_Statement
3173 || Nkind (gnat_node) == N_Label
3174 || Nkind (gnat_node) == N_Implicit_Label_Declaration
3175 || Nkind (gnat_node) == N_Handled_Sequence_Of_Statements
3176 || ((Nkind (gnat_node) == N_Raise_Constraint_Error
3177 || Nkind (gnat_node) == N_Raise_Storage_Error
3178 || Nkind (gnat_node) == N_Raise_Program_Error)
3179 && (Ekind (Etype (gnat_node)) == E_Void)))
3180 {
3181 if (!current_function_decl)
3182 {
3183 current_function_decl = TREE_VALUE (gnu_elab_proc_stack);
3184 start_stmt_group ();
3185 gnat_pushlevel ();
3186 went_into_elab_proc = true;
3187 }
3188
3189 /* Don't check for a possible No_Elaboration_Code restriction violation
3190 on N_Handled_Sequence_Of_Statements, as we want to signal an error on
3191 every nested real statement instead. This also avoids triggering
3192 spurious errors on dummy (empty) sequences created by the front-end
3193 for package bodies in some cases. */
3194
3195 if (current_function_decl == TREE_VALUE (gnu_elab_proc_stack)
3196 && Nkind (gnat_node) != N_Handled_Sequence_Of_Statements)
3197 Check_Elaboration_Code_Allowed (gnat_node);
3198 }
3199
3200 switch (Nkind (gnat_node))
3201 {
3202 /********************************/
3203 /* Chapter 2: Lexical Elements: */
3204 /********************************/
3205
3206 case N_Identifier:
3207 case N_Expanded_Name:
3208 case N_Operator_Symbol:
3209 case N_Defining_Identifier:
3210 gnu_result = Identifier_to_gnu (gnat_node, &gnu_result_type);
3211 break;
3212
3213 case N_Integer_Literal:
3214 {
3215 tree gnu_type;
3216
3217 /* Get the type of the result, looking inside any padding and
3218 justified modular types. Then get the value in that type. */
3219 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
3220
3221 if (TREE_CODE (gnu_type) == RECORD_TYPE
3222 && TYPE_JUSTIFIED_MODULAR_P (gnu_type))
3223 gnu_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
3224
3225 gnu_result = UI_To_gnu (Intval (gnat_node), gnu_type);
3226
3227 /* If the result overflows (meaning it doesn't fit in its base type),
3228 abort. We would like to check that the value is within the range
3229 of the subtype, but that causes problems with subtypes whose usage
3230 will raise Constraint_Error and with biased representation, so
3231 we don't. */
3232 gcc_assert (!TREE_OVERFLOW (gnu_result));
3233 }
3234 break;
3235
3236 case N_Character_Literal:
3237 /* If a Entity is present, it means that this was one of the
3238 literals in a user-defined character type. In that case,
3239 just return the value in the CONST_DECL. Otherwise, use the
3240 character code. In that case, the base type should be an
3241 INTEGER_TYPE, but we won't bother checking for that. */
3242 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3243 if (Present (Entity (gnat_node)))
3244 gnu_result = DECL_INITIAL (get_gnu_tree (Entity (gnat_node)));
3245 else
3246 gnu_result
3247 = build_int_cst_type
3248 (gnu_result_type, UI_To_CC (Char_Literal_Value (gnat_node)));
3249 break;
3250
3251 case N_Real_Literal:
3252 /* If this is of a fixed-point type, the value we want is the
3253 value of the corresponding integer. */
3254 if (IN (Ekind (Underlying_Type (Etype (gnat_node))), Fixed_Point_Kind))
3255 {
3256 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3257 gnu_result = UI_To_gnu (Corresponding_Integer_Value (gnat_node),
3258 gnu_result_type);
3259 gcc_assert (!TREE_OVERFLOW (gnu_result));
3260 }
3261
3262 /* We should never see a Vax_Float type literal, since the front end
3263 is supposed to transform these using appropriate conversions */
3264 else if (Vax_Float (Underlying_Type (Etype (gnat_node))))
3265 gcc_unreachable ();
3266
3267 else
3268 {
3269 Ureal ur_realval = Realval (gnat_node);
3270
3271 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3272
3273 /* If the real value is zero, so is the result. Otherwise,
3274 convert it to a machine number if it isn't already. That
3275 forces BASE to 0 or 2 and simplifies the rest of our logic. */
3276 if (UR_Is_Zero (ur_realval))
3277 gnu_result = convert (gnu_result_type, integer_zero_node);
3278 else
3279 {
3280 if (!Is_Machine_Number (gnat_node))
3281 ur_realval
3282 = Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
3283 ur_realval, Round_Even, gnat_node);
3284
3285 gnu_result
3286 = UI_To_gnu (Numerator (ur_realval), gnu_result_type);
3287
3288 /* If we have a base of zero, divide by the denominator.
3289 Otherwise, the base must be 2 and we scale the value, which
3290 we know can fit in the mantissa of the type (hence the use
3291 of that type above). */
3292 if (No (Rbase (ur_realval)))
3293 gnu_result
3294 = build_binary_op (RDIV_EXPR,
3295 get_base_type (gnu_result_type),
3296 gnu_result,
3297 UI_To_gnu (Denominator (ur_realval),
3298 gnu_result_type));
3299 else
3300 {
3301 REAL_VALUE_TYPE tmp;
3302
3303 gcc_assert (Rbase (ur_realval) == 2);
3304 real_ldexp (&tmp, &TREE_REAL_CST (gnu_result),
3305 - UI_To_Int (Denominator (ur_realval)));
3306 gnu_result = build_real (gnu_result_type, tmp);
3307 }
3308 }
3309
3310 /* Now see if we need to negate the result. Do it this way to
3311 properly handle -0. */
3312 if (UR_Is_Negative (Realval (gnat_node)))
3313 gnu_result
3314 = build_unary_op (NEGATE_EXPR, get_base_type (gnu_result_type),
3315 gnu_result);
3316 }
3317
3318 break;
3319
3320 case N_String_Literal:
3321 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3322 if (TYPE_PRECISION (TREE_TYPE (gnu_result_type)) == HOST_BITS_PER_CHAR)
3323 {
3324 String_Id gnat_string = Strval (gnat_node);
3325 int length = String_Length (gnat_string);
3326 int i;
3327 char *string;
3328 if (length >= ALLOCA_THRESHOLD)
3329 string = XNEWVEC (char, length + 1); /* in case of large strings */
3330 else
3331 string = (char *) alloca (length + 1);
3332
3333 /* Build the string with the characters in the literal. Note
3334 that Ada strings are 1-origin. */
3335 for (i = 0; i < length; i++)
3336 string[i] = Get_String_Char (gnat_string, i + 1);
3337
3338 /* Put a null at the end of the string in case it's in a context
3339 where GCC will want to treat it as a C string. */
3340 string[i] = 0;
3341
3342 gnu_result = build_string (length, string);
3343
3344 /* Strings in GCC don't normally have types, but we want
3345 this to not be converted to the array type. */
3346 TREE_TYPE (gnu_result) = gnu_result_type;
3347
3348 if (length >= ALLOCA_THRESHOLD) /* free if heap-allocated */
3349 free (string);
3350 }
3351 else
3352 {
3353 /* Build a list consisting of each character, then make
3354 the aggregate. */
3355 String_Id gnat_string = Strval (gnat_node);
3356 int length = String_Length (gnat_string);
3357 int i;
3358 tree gnu_list = NULL_TREE;
3359 tree gnu_idx = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
3360
3361 for (i = 0; i < length; i++)
3362 {
3363 gnu_list
3364 = tree_cons (gnu_idx,
3365 build_int_cst (TREE_TYPE (gnu_result_type),
3366 Get_String_Char (gnat_string,
3367 i + 1)),
3368 gnu_list);
3369
3370 gnu_idx = int_const_binop (PLUS_EXPR, gnu_idx, integer_one_node,
3371 0);
3372 }
3373
3374 gnu_result
3375 = gnat_build_constructor (gnu_result_type, nreverse (gnu_list));
3376 }
3377 break;
3378
3379 case N_Pragma:
3380 gnu_result = Pragma_to_gnu (gnat_node);
3381 break;
3382
3383 /**************************************/
3384 /* Chapter 3: Declarations and Types: */
3385 /**************************************/
3386
3387 case N_Subtype_Declaration:
3388 case N_Full_Type_Declaration:
3389 case N_Incomplete_Type_Declaration:
3390 case N_Private_Type_Declaration:
3391 case N_Private_Extension_Declaration:
3392 case N_Task_Type_Declaration:
3393 process_type (Defining_Entity (gnat_node));
3394 gnu_result = alloc_stmt_list ();
3395 break;
3396
3397 case N_Object_Declaration:
3398 case N_Exception_Declaration:
3399 gnat_temp = Defining_Entity (gnat_node);
3400 gnu_result = alloc_stmt_list ();
3401
3402 /* If we are just annotating types and this object has an unconstrained
3403 or task type, don't elaborate it. */
3404 if (type_annotate_only
3405 && (((Is_Array_Type (Etype (gnat_temp))
3406 || Is_Record_Type (Etype (gnat_temp)))
3407 && !Is_Constrained (Etype (gnat_temp)))
3408 || Is_Concurrent_Type (Etype (gnat_temp))))
3409 break;
3410
3411 if (Present (Expression (gnat_node))
3412 && !(Nkind (gnat_node) == N_Object_Declaration
3413 && No_Initialization (gnat_node))
3414 && (!type_annotate_only
3415 || Compile_Time_Known_Value (Expression (gnat_node))))
3416 {
3417 gnu_expr = gnat_to_gnu (Expression (gnat_node));
3418 if (Do_Range_Check (Expression (gnat_node)))
3419 gnu_expr = emit_range_check (gnu_expr, Etype (gnat_temp));
3420
3421 /* If this object has its elaboration delayed, we must force
3422 evaluation of GNU_EXPR right now and save it for when the object
3423 is frozen. */
3424 if (Present (Freeze_Node (gnat_temp)))
3425 {
3426 if ((Is_Public (gnat_temp) || global_bindings_p ())
3427 && !TREE_CONSTANT (gnu_expr))
3428 gnu_expr
3429 = create_var_decl (create_concat_name (gnat_temp, "init"),
3430 NULL_TREE, TREE_TYPE (gnu_expr),
3431 gnu_expr, false, Is_Public (gnat_temp),
3432 false, false, NULL, gnat_temp);
3433 else
3434 gnu_expr = maybe_variable (gnu_expr);
3435
3436 save_gnu_tree (gnat_node, gnu_expr, true);
3437 }
3438 }
3439 else
3440 gnu_expr = NULL_TREE;
3441
3442 if (type_annotate_only && gnu_expr && TREE_CODE (gnu_expr) == ERROR_MARK)
3443 gnu_expr = NULL_TREE;
3444
8df2e902
EB
3445 /* If this is a deferred constant with an address clause, we ignore the
3446 full view since the clause is on the partial view and we cannot have
3447 2 different GCC trees for the object. The only bits of the full view
3448 we will use is the initializer, but it will be directly fetched. */
3449 if (Ekind(gnat_temp) == E_Constant
3450 && Present (Address_Clause (gnat_temp))
3451 && Present (Full_View (gnat_temp)))
3452 save_gnu_tree (Full_View (gnat_temp), error_mark_node, true);
3453
a1ab4c31
AC
3454 if (No (Freeze_Node (gnat_temp)))
3455 gnat_to_gnu_entity (gnat_temp, gnu_expr, 1);
3456 break;
3457
3458 case N_Object_Renaming_Declaration:
3459 gnat_temp = Defining_Entity (gnat_node);
3460
3461 /* Don't do anything if this renaming is handled by the front end or if
3462 we are just annotating types and this object has a composite or task
3463 type, don't elaborate it. We return the result in case it has any
3464 SAVE_EXPRs in it that need to be evaluated here. */
3465 if (!Is_Renaming_Of_Object (gnat_temp)
3466 && ! (type_annotate_only
3467 && (Is_Array_Type (Etype (gnat_temp))
3468 || Is_Record_Type (Etype (gnat_temp))
3469 || Is_Concurrent_Type (Etype (gnat_temp)))))
3470 gnu_result
3471 = gnat_to_gnu_entity (gnat_temp,
3472 gnat_to_gnu (Renamed_Object (gnat_temp)), 1);
3473 else
3474 gnu_result = alloc_stmt_list ();
3475 break;
3476
3477 case N_Implicit_Label_Declaration:
3478 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
3479 gnu_result = alloc_stmt_list ();
3480 break;
3481
3482 case N_Exception_Renaming_Declaration:
3483 case N_Number_Declaration:
3484 case N_Package_Renaming_Declaration:
3485 case N_Subprogram_Renaming_Declaration:
3486 /* These are fully handled in the front end. */
3487 gnu_result = alloc_stmt_list ();
3488 break;
3489
3490 /*************************************/
3491 /* Chapter 4: Names and Expressions: */
3492 /*************************************/
3493
3494 case N_Explicit_Dereference:
3495 gnu_result = gnat_to_gnu (Prefix (gnat_node));
3496 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3497 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
3498 break;
3499
3500 case N_Indexed_Component:
3501 {
3502 tree gnu_array_object = gnat_to_gnu (Prefix (gnat_node));
3503 tree gnu_type;
3504 int ndim;
3505 int i;
3506 Node_Id *gnat_expr_array;
3507
3508 gnu_array_object = maybe_implicit_deref (gnu_array_object);
3509 gnu_array_object = maybe_unconstrained_array (gnu_array_object);
3510
3511 /* If we got a padded type, remove it too. */
3512 if (TREE_CODE (TREE_TYPE (gnu_array_object)) == RECORD_TYPE
3513 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_array_object)))
3514 gnu_array_object
3515 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_array_object))),
3516 gnu_array_object);
3517
3518 gnu_result = gnu_array_object;
3519
3520 /* First compute the number of dimensions of the array, then
3521 fill the expression array, the order depending on whether
3522 this is a Convention_Fortran array or not. */
3523 for (ndim = 1, gnu_type = TREE_TYPE (gnu_array_object);
3524 TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
3525 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type));
3526 ndim++, gnu_type = TREE_TYPE (gnu_type))
3527 ;
3528
3529 gnat_expr_array = (Node_Id *) alloca (ndim * sizeof (Node_Id));
3530
3531 if (TYPE_CONVENTION_FORTRAN_P (TREE_TYPE (gnu_array_object)))
3532 for (i = ndim - 1, gnat_temp = First (Expressions (gnat_node));
3533 i >= 0;
3534 i--, gnat_temp = Next (gnat_temp))
3535 gnat_expr_array[i] = gnat_temp;
3536 else
3537 for (i = 0, gnat_temp = First (Expressions (gnat_node));
3538 i < ndim;
3539 i++, gnat_temp = Next (gnat_temp))
3540 gnat_expr_array[i] = gnat_temp;
3541
3542 for (i = 0, gnu_type = TREE_TYPE (gnu_array_object);
3543 i < ndim; i++, gnu_type = TREE_TYPE (gnu_type))
3544 {
3545 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
3546 gnat_temp = gnat_expr_array[i];
3547 gnu_expr = gnat_to_gnu (gnat_temp);
3548
3549 if (Do_Range_Check (gnat_temp))
3550 gnu_expr
3551 = emit_index_check
3552 (gnu_array_object, gnu_expr,
3553 TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))),
3554 TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))));
3555
3556 gnu_result = build_binary_op (ARRAY_REF, NULL_TREE,
3557 gnu_result, gnu_expr);
3558 }
3559 }
3560
3561 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3562 break;
3563
3564 case N_Slice:
3565 {
3566 tree gnu_type;
3567 Node_Id gnat_range_node = Discrete_Range (gnat_node);
3568
3569 gnu_result = gnat_to_gnu (Prefix (gnat_node));
3570 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3571
3572 /* Do any implicit dereferences of the prefix and do any needed
3573 range check. */
3574 gnu_result = maybe_implicit_deref (gnu_result);
3575 gnu_result = maybe_unconstrained_array (gnu_result);
3576 gnu_type = TREE_TYPE (gnu_result);
3577 if (Do_Range_Check (gnat_range_node))
3578 {
3579 /* Get the bounds of the slice. */
3580 tree gnu_index_type
3581 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_result_type));
3582 tree gnu_min_expr = TYPE_MIN_VALUE (gnu_index_type);
3583 tree gnu_max_expr = TYPE_MAX_VALUE (gnu_index_type);
3584 /* Get the permitted bounds. */
3585 tree gnu_base_index_type
3586 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
82f7c45f
GB
3587 tree gnu_base_min_expr = SUBSTITUTE_PLACEHOLDER_IN_EXPR
3588 (TYPE_MIN_VALUE (gnu_base_index_type), gnu_result);
3589 tree gnu_base_max_expr = SUBSTITUTE_PLACEHOLDER_IN_EXPR
3590 (TYPE_MAX_VALUE (gnu_base_index_type), gnu_result);
a1ab4c31
AC
3591 tree gnu_expr_l, gnu_expr_h, gnu_expr_type;
3592
82f7c45f
GB
3593 gnu_min_expr = protect_multiple_eval (gnu_min_expr);
3594 gnu_max_expr = protect_multiple_eval (gnu_max_expr);
a1ab4c31
AC
3595
3596 /* Derive a good type to convert everything to. */
9ee309d4 3597 gnu_expr_type = get_base_type (gnu_index_type);
82f7c45f
GB
3598
3599 /* Test whether the minimum slice value is too small. */
3600 gnu_expr_l = build_binary_op (LT_EXPR, integer_type_node,
3601 convert (gnu_expr_type,
3602 gnu_min_expr),
3603 convert (gnu_expr_type,
3604 gnu_base_min_expr));
3605
3606 /* Test whether the maximum slice value is too large. */
3607 gnu_expr_h = build_binary_op (GT_EXPR, integer_type_node,
3608 convert (gnu_expr_type,
3609 gnu_max_expr),
3610 convert (gnu_expr_type,
3611 gnu_base_max_expr));
3612
3613 /* Build a slice index check that returns the low bound,
3614 assuming the slice is not empty. */
3615 gnu_expr = emit_check
3616 (build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
3617 gnu_expr_l, gnu_expr_h),
3618 gnu_min_expr, CE_Index_Check_Failed);
3619
3620 /* Build a conditional expression that does the index checks and
a1ab4c31
AC
3621 returns the low bound if the slice is not empty (max >= min),
3622 and returns the naked low bound otherwise (max < min), unless
3623 it is non-constant and the high bound is; this prevents VRP
3624 from inferring bogus ranges on the unlikely path. */
3625 gnu_expr = fold_build3 (COND_EXPR, gnu_expr_type,
3626 build_binary_op (GE_EXPR, gnu_expr_type,
3627 convert (gnu_expr_type,
3628 gnu_max_expr),
3629 convert (gnu_expr_type,
3630 gnu_min_expr)),
3631 gnu_expr,
3632 TREE_CODE (gnu_min_expr) != INTEGER_CST
3633 && TREE_CODE (gnu_max_expr) == INTEGER_CST
3634 ? gnu_max_expr : gnu_min_expr);
3635 }
3636 else
3637 /* Simply return the naked low bound. */
3638 gnu_expr = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
3639
3640 gnu_result = build_binary_op (ARRAY_RANGE_REF, gnu_result_type,
3641 gnu_result, gnu_expr);
3642 }
3643 break;
3644
3645 case N_Selected_Component:
3646 {
3647 tree gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
3648 Entity_Id gnat_field = Entity (Selector_Name (gnat_node));
3649 Entity_Id gnat_pref_type = Etype (Prefix (gnat_node));
3650 tree gnu_field;
3651
3652 while (IN (Ekind (gnat_pref_type), Incomplete_Or_Private_Kind)
3653 || IN (Ekind (gnat_pref_type), Access_Kind))
3654 {
3655 if (IN (Ekind (gnat_pref_type), Incomplete_Or_Private_Kind))
3656 gnat_pref_type = Underlying_Type (gnat_pref_type);
3657 else if (IN (Ekind (gnat_pref_type), Access_Kind))
3658 gnat_pref_type = Designated_Type (gnat_pref_type);
3659 }
3660
3661 gnu_prefix = maybe_implicit_deref (gnu_prefix);
3662
3663 /* For discriminant references in tagged types always substitute the
3664 corresponding discriminant as the actual selected component. */
3665
3666 if (Is_Tagged_Type (gnat_pref_type))
3667 while (Present (Corresponding_Discriminant (gnat_field)))
3668 gnat_field = Corresponding_Discriminant (gnat_field);
3669
3670 /* For discriminant references of untagged types always substitute the
3671 corresponding stored discriminant. */
3672
3673 else if (Present (Corresponding_Discriminant (gnat_field)))
3674 gnat_field = Original_Record_Component (gnat_field);
3675
3676 /* Handle extracting the real or imaginary part of a complex.
3677 The real part is the first field and the imaginary the last. */
3678
3679 if (TREE_CODE (TREE_TYPE (gnu_prefix)) == COMPLEX_TYPE)
3680 gnu_result = build_unary_op (Present (Next_Entity (gnat_field))
3681 ? REALPART_EXPR : IMAGPART_EXPR,
3682 NULL_TREE, gnu_prefix);
3683 else
3684 {
3685 gnu_field = gnat_to_gnu_field_decl (gnat_field);
3686
3687 /* If there are discriminants, the prefix might be
3688 evaluated more than once, which is a problem if it has
3689 side-effects. */
3690 if (Has_Discriminants (Is_Access_Type (Etype (Prefix (gnat_node)))
3691 ? Designated_Type (Etype
3692 (Prefix (gnat_node)))
3693 : Etype (Prefix (gnat_node))))
3694 gnu_prefix = gnat_stabilize_reference (gnu_prefix, false);
3695
3696 gnu_result
3697 = build_component_ref (gnu_prefix, NULL_TREE, gnu_field,
3698 (Nkind (Parent (gnat_node))
3699 == N_Attribute_Reference));
3700 }
3701
3702 gcc_assert (gnu_result);
3703 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3704 }
3705 break;
3706
3707 case N_Attribute_Reference:
3708 {
3709 /* The attribute designator (like an enumeration value). */
3710 int attribute = Get_Attribute_Id (Attribute_Name (gnat_node));
3711
3712 /* The Elab_Spec and Elab_Body attributes are special in that
3713 Prefix is a unit, not an object with a GCC equivalent. Similarly
3714 for Elaborated, since that variable isn't otherwise known. */
3715 if (attribute == Attr_Elab_Body || attribute == Attr_Elab_Spec)
3716 return (create_subprog_decl
3717 (create_concat_name (Entity (Prefix (gnat_node)),
3718 attribute == Attr_Elab_Body
3719 ? "elabb" : "elabs"),
3720 NULL_TREE, void_ftype, NULL_TREE, false, true, true, NULL,
3721 gnat_node));
3722
3723 gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attribute);
3724 }
3725 break;
3726
3727 case N_Reference:
3728 /* Like 'Access as far as we are concerned. */
3729 gnu_result = gnat_to_gnu (Prefix (gnat_node));
3730 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
3731 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3732 break;
3733
3734 case N_Aggregate:
3735 case N_Extension_Aggregate:
3736 {
3737 tree gnu_aggr_type;
3738
3739 /* ??? It is wrong to evaluate the type now, but there doesn't
3740 seem to be any other practical way of doing it. */
3741
3742 gcc_assert (!Expansion_Delayed (gnat_node));
3743
3744 gnu_aggr_type = gnu_result_type
3745 = get_unpadded_type (Etype (gnat_node));
3746
3747 if (TREE_CODE (gnu_result_type) == RECORD_TYPE
3748 && TYPE_CONTAINS_TEMPLATE_P (gnu_result_type))
3749 gnu_aggr_type
3750 = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_result_type)));
3751
3752 if (Null_Record_Present (gnat_node))
3753 gnu_result = gnat_build_constructor (gnu_aggr_type, NULL_TREE);
3754
3755 else if (TREE_CODE (gnu_aggr_type) == RECORD_TYPE
3756 || TREE_CODE (gnu_aggr_type) == UNION_TYPE)
3757 gnu_result
3758 = assoc_to_constructor (Etype (gnat_node),
3759 First (Component_Associations (gnat_node)),
3760 gnu_aggr_type);
3761 else if (TREE_CODE (gnu_aggr_type) == ARRAY_TYPE)
3762 gnu_result = pos_to_constructor (First (Expressions (gnat_node)),
3763 gnu_aggr_type,
3764 Component_Type (Etype (gnat_node)));
3765 else if (TREE_CODE (gnu_aggr_type) == COMPLEX_TYPE)
3766 gnu_result
3767 = build_binary_op
3768 (COMPLEX_EXPR, gnu_aggr_type,
3769 gnat_to_gnu (Expression (First
3770 (Component_Associations (gnat_node)))),
3771 gnat_to_gnu (Expression
3772 (Next
3773 (First (Component_Associations (gnat_node))))));
3774 else
3775 gcc_unreachable ();
3776
3777 gnu_result = convert (gnu_result_type, gnu_result);
3778 }
3779 break;
3780
3781 case N_Null:
3782 if (TARGET_VTABLE_USES_DESCRIPTORS
3783 && Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
3784 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
3785 gnu_result = null_fdesc_node;
3786 else
3787 gnu_result = null_pointer_node;
3788 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3789 break;
3790
3791 case N_Type_Conversion:
3792 case N_Qualified_Expression:
3793 /* Get the operand expression. */
3794 gnu_result = gnat_to_gnu (Expression (gnat_node));
3795 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3796
3797 gnu_result
3798 = convert_with_check (Etype (gnat_node), gnu_result,
3799 Do_Overflow_Check (gnat_node),
3800 Do_Range_Check (Expression (gnat_node)),
3801 Nkind (gnat_node) == N_Type_Conversion
3802 && Float_Truncate (gnat_node));
3803 break;
3804
3805 case N_Unchecked_Type_Conversion:
3806 gnu_result = gnat_to_gnu (Expression (gnat_node));
3807 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3808
3809 /* If the result is a pointer type, see if we are improperly
3810 converting to a stricter alignment. */
3811 if (STRICT_ALIGNMENT && POINTER_TYPE_P (gnu_result_type)
3812 && IN (Ekind (Etype (gnat_node)), Access_Kind))
3813 {
3814 unsigned int align = known_alignment (gnu_result);
3815 tree gnu_obj_type = TREE_TYPE (gnu_result_type);
3816 unsigned int oalign = TYPE_ALIGN (gnu_obj_type);
3817
3818 if (align != 0 && align < oalign && !TYPE_ALIGN_OK (gnu_obj_type))
3819 post_error_ne_tree_2
3820 ("?source alignment (^) '< alignment of & (^)",
3821 gnat_node, Designated_Type (Etype (gnat_node)),
3822 size_int (align / BITS_PER_UNIT), oalign / BITS_PER_UNIT);
3823 }
3824
3825 /* If we are converting a descriptor to a function pointer, first
3826 build the pointer. */
3827 if (TARGET_VTABLE_USES_DESCRIPTORS
3828 && TREE_TYPE (gnu_result) == fdesc_type_node
3829 && POINTER_TYPE_P (gnu_result_type))
3830 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
3831
3832 gnu_result = unchecked_convert (gnu_result_type, gnu_result,
3833 No_Truncation (gnat_node));
3834 break;
3835
3836 case N_In:
3837 case N_Not_In:
3838 {
3839 tree gnu_object = gnat_to_gnu (Left_Opnd (gnat_node));
3840 Node_Id gnat_range = Right_Opnd (gnat_node);
3841 tree gnu_low;
3842 tree gnu_high;
3843
3844 /* GNAT_RANGE is either an N_Range node or an identifier
3845 denoting a subtype. */
3846 if (Nkind (gnat_range) == N_Range)
3847 {
3848 gnu_low = gnat_to_gnu (Low_Bound (gnat_range));
3849 gnu_high = gnat_to_gnu (High_Bound (gnat_range));
3850 }
3851 else if (Nkind (gnat_range) == N_Identifier
3852 || Nkind (gnat_range) == N_Expanded_Name)
3853 {
3854 tree gnu_range_type = get_unpadded_type (Entity (gnat_range));
3855
3856 gnu_low = TYPE_MIN_VALUE (gnu_range_type);
3857 gnu_high = TYPE_MAX_VALUE (gnu_range_type);
3858 }
3859 else
3860 gcc_unreachable ();
3861
3862 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3863
3864 /* If LOW and HIGH are identical, perform an equality test.
3865 Otherwise, ensure that GNU_OBJECT is only evaluated once
3866 and perform a full range test. */
3867 if (operand_equal_p (gnu_low, gnu_high, 0))
3868 gnu_result = build_binary_op (EQ_EXPR, gnu_result_type,
3869 gnu_object, gnu_low);
3870 else
3871 {
3872 gnu_object = protect_multiple_eval (gnu_object);
3873 gnu_result
3874 = build_binary_op (TRUTH_ANDIF_EXPR, gnu_result_type,
3875 build_binary_op (GE_EXPR, gnu_result_type,
3876 gnu_object, gnu_low),
3877 build_binary_op (LE_EXPR, gnu_result_type,
3878 gnu_object, gnu_high));
3879 }
3880
3881 if (Nkind (gnat_node) == N_Not_In)
3882 gnu_result = invert_truthvalue (gnu_result);
3883 }
3884 break;
3885
3886 case N_Op_Divide:
3887 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
3888 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
3889 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3890 gnu_result = build_binary_op (FLOAT_TYPE_P (gnu_result_type)
3891 ? RDIV_EXPR
3892 : (Rounded_Result (gnat_node)
3893 ? ROUND_DIV_EXPR : TRUNC_DIV_EXPR),
3894 gnu_result_type, gnu_lhs, gnu_rhs);
3895 break;
3896
3897 case N_Op_Or: case N_Op_And: case N_Op_Xor:
3898 /* These can either be operations on booleans or on modular types.
3899 Fall through for boolean types since that's the way GNU_CODES is
3900 set up. */
3901 if (IN (Ekind (Underlying_Type (Etype (gnat_node))),
3902 Modular_Integer_Kind))
3903 {
3904 enum tree_code code
3905 = (Nkind (gnat_node) == N_Op_Or ? BIT_IOR_EXPR
3906 : Nkind (gnat_node) == N_Op_And ? BIT_AND_EXPR
3907 : BIT_XOR_EXPR);
3908
3909 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
3910 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
3911 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3912 gnu_result = build_binary_op (code, gnu_result_type,
3913 gnu_lhs, gnu_rhs);
3914 break;
3915 }
3916
3917 /* ... fall through ... */
3918
3919 case N_Op_Eq: case N_Op_Ne: case N_Op_Lt:
3920 case N_Op_Le: case N_Op_Gt: case N_Op_Ge:
3921 case N_Op_Add: case N_Op_Subtract: case N_Op_Multiply:
3922 case N_Op_Mod: case N_Op_Rem:
3923 case N_Op_Rotate_Left:
3924 case N_Op_Rotate_Right:
3925 case N_Op_Shift_Left:
3926 case N_Op_Shift_Right:
3927 case N_Op_Shift_Right_Arithmetic:
3928 case N_And_Then: case N_Or_Else:
3929 {
3930 enum tree_code code = gnu_codes[Nkind (gnat_node)];
3931 bool ignore_lhs_overflow = false;
3932 tree gnu_type;
3933
3934 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
3935 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
3936 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
3937
3938 /* If this is a comparison operator, convert any references to
3939 an unconstrained array value into a reference to the
3940 actual array. */
3941 if (TREE_CODE_CLASS (code) == tcc_comparison)
3942 {
3943 gnu_lhs = maybe_unconstrained_array (gnu_lhs);
3944 gnu_rhs = maybe_unconstrained_array (gnu_rhs);
3945 }
3946
3947 /* If the result type is a private type, its full view may be a
3948 numeric subtype. The representation we need is that of its base
3949 type, given that it is the result of an arithmetic operation. */
3950 else if (Is_Private_Type (Etype (gnat_node)))
3951 gnu_type = gnu_result_type
3952 = get_unpadded_type (Base_Type (Full_View (Etype (gnat_node))));
3953
3954 /* If this is a shift whose count is not guaranteed to be correct,
3955 we need to adjust the shift count. */
3956 if (IN (Nkind (gnat_node), N_Op_Shift)
3957 && !Shift_Count_OK (gnat_node))
3958 {
3959 tree gnu_count_type = get_base_type (TREE_TYPE (gnu_rhs));
3960 tree gnu_max_shift
3961 = convert (gnu_count_type, TYPE_SIZE (gnu_type));
3962
3963 if (Nkind (gnat_node) == N_Op_Rotate_Left
3964 || Nkind (gnat_node) == N_Op_Rotate_Right)
3965 gnu_rhs = build_binary_op (TRUNC_MOD_EXPR, gnu_count_type,
3966 gnu_rhs, gnu_max_shift);
3967 else if (Nkind (gnat_node) == N_Op_Shift_Right_Arithmetic)
3968 gnu_rhs
3969 = build_binary_op
3970 (MIN_EXPR, gnu_count_type,
3971 build_binary_op (MINUS_EXPR,
3972 gnu_count_type,
3973 gnu_max_shift,
3974 convert (gnu_count_type,
3975 integer_one_node)),
3976 gnu_rhs);
3977 }
3978
3979 /* For right shifts, the type says what kind of shift to do,
3980 so we may need to choose a different type. In this case,
3981 we have to ignore integer overflow lest it propagates all
3982 the way down and causes a CE to be explicitly raised. */
3983 if (Nkind (gnat_node) == N_Op_Shift_Right
3984 && !TYPE_UNSIGNED (gnu_type))
3985 {
3986 gnu_type = gnat_unsigned_type (gnu_type);
3987 ignore_lhs_overflow = true;
3988 }
3989 else if (Nkind (gnat_node) == N_Op_Shift_Right_Arithmetic
3990 && TYPE_UNSIGNED (gnu_type))
3991 {
3992 gnu_type = gnat_signed_type (gnu_type);
3993 ignore_lhs_overflow = true;
3994 }
3995
3996 if (gnu_type != gnu_result_type)
3997 {
3998 tree gnu_old_lhs = gnu_lhs;
3999 gnu_lhs = convert (gnu_type, gnu_lhs);
4000 if (TREE_CODE (gnu_lhs) == INTEGER_CST && ignore_lhs_overflow)
4001 TREE_OVERFLOW (gnu_lhs) = TREE_OVERFLOW (gnu_old_lhs);
4002 gnu_rhs = convert (gnu_type, gnu_rhs);
4003 }
4004
b666e568
GB
4005 /* Instead of expanding overflow checks for addition, subtraction
4006 and multiplication itself, the front end will leave this to
4007 the back end when Backend_Overflow_Checks_On_Target is set.
4008 As the GCC back end itself does not know yet how to properly
4009 do overflow checking, do it here. The goal is to push
4010 the expansions further into the back end over time. */
4011 if (Do_Overflow_Check (gnat_node) && Backend_Overflow_Checks_On_Target
4012 && (Nkind (gnat_node) == N_Op_Add
4013 || Nkind (gnat_node) == N_Op_Subtract
4014 || Nkind (gnat_node) == N_Op_Multiply)
4015 && !TYPE_UNSIGNED (gnu_type)
4016 && !FLOAT_TYPE_P (gnu_type))
4017 gnu_result
4018 = build_binary_op_trapv (code, gnu_type, gnu_lhs, gnu_rhs);
4019 else
4020 gnu_result = build_binary_op (code, gnu_type, gnu_lhs, gnu_rhs);
a1ab4c31
AC
4021
4022 /* If this is a logical shift with the shift count not verified,
4023 we must return zero if it is too large. We cannot compensate
4024 above in this case. */
4025 if ((Nkind (gnat_node) == N_Op_Shift_Left
4026 || Nkind (gnat_node) == N_Op_Shift_Right)
4027 && !Shift_Count_OK (gnat_node))
4028 gnu_result
4029 = build_cond_expr
4030 (gnu_type,
4031 build_binary_op (GE_EXPR, integer_type_node,
4032 gnu_rhs,
4033 convert (TREE_TYPE (gnu_rhs),
4034 TYPE_SIZE (gnu_type))),
4035 convert (gnu_type, integer_zero_node),
4036 gnu_result);
4037 }
4038 break;
4039
4040 case N_Conditional_Expression:
4041 {
4042 tree gnu_cond = gnat_to_gnu (First (Expressions (gnat_node)));
4043 tree gnu_true = gnat_to_gnu (Next (First (Expressions (gnat_node))));
4044 tree gnu_false
4045 = gnat_to_gnu (Next (Next (First (Expressions (gnat_node)))));
4046
4047 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4048 gnu_result = build_cond_expr (gnu_result_type,
4049 gnat_truthvalue_conversion (gnu_cond),
4050 gnu_true, gnu_false);
4051 }
4052 break;
4053
4054 case N_Op_Plus:
4055 gnu_result = gnat_to_gnu (Right_Opnd (gnat_node));
4056 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4057 break;
4058
4059 case N_Op_Not:
4060 /* This case can apply to a boolean or a modular type.
4061 Fall through for a boolean operand since GNU_CODES is set
4062 up to handle this. */
4063 if (Is_Modular_Integer_Type (Etype (gnat_node))
4064 || (Ekind (Etype (gnat_node)) == E_Private_Type
4065 && Is_Modular_Integer_Type (Full_View (Etype (gnat_node)))))
4066 {
4067 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
4068 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4069 gnu_result = build_unary_op (BIT_NOT_EXPR, gnu_result_type,
4070 gnu_expr);
4071 break;
4072 }
4073
4074 /* ... fall through ... */
4075
4076 case N_Op_Minus: case N_Op_Abs:
4077 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
4078
4079 if (Ekind (Etype (gnat_node)) != E_Private_Type)
4080 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4081 else
4082 gnu_result_type = get_unpadded_type (Base_Type
4083 (Full_View (Etype (gnat_node))));
4084
b666e568
GB
4085 if (Do_Overflow_Check (gnat_node)
4086 && !TYPE_UNSIGNED (gnu_result_type)
4087 && !FLOAT_TYPE_P (gnu_result_type))
4088 gnu_result = build_unary_op_trapv (gnu_codes[Nkind (gnat_node)],
4089 gnu_result_type, gnu_expr);
4090 else
4091 gnu_result = build_unary_op (gnu_codes[Nkind (gnat_node)],
4092 gnu_result_type, gnu_expr);
a1ab4c31
AC
4093 break;
4094
4095 case N_Allocator:
4096 {
4097 tree gnu_init = 0;
4098 tree gnu_type;
4099 bool ignore_init_type = false;
4100
4101 gnat_temp = Expression (gnat_node);
4102
4103 /* The Expression operand can either be an N_Identifier or
4104 Expanded_Name, which must represent a type, or a
4105 N_Qualified_Expression, which contains both the object type and an
4106 initial value for the object. */
4107 if (Nkind (gnat_temp) == N_Identifier
4108 || Nkind (gnat_temp) == N_Expanded_Name)
4109 gnu_type = gnat_to_gnu_type (Entity (gnat_temp));
4110 else if (Nkind (gnat_temp) == N_Qualified_Expression)
4111 {
4112 Entity_Id gnat_desig_type
4113 = Designated_Type (Underlying_Type (Etype (gnat_node)));
4114
4115 ignore_init_type = Has_Constrained_Partial_View (gnat_desig_type);
4116 gnu_init = gnat_to_gnu (Expression (gnat_temp));
4117
4118 gnu_init = maybe_unconstrained_array (gnu_init);
4119 if (Do_Range_Check (Expression (gnat_temp)))
4120 gnu_init = emit_range_check (gnu_init, gnat_desig_type);
4121
4122 if (Is_Elementary_Type (gnat_desig_type)
4123 || Is_Constrained (gnat_desig_type))
4124 {
4125 gnu_type = gnat_to_gnu_type (gnat_desig_type);
4126 gnu_init = convert (gnu_type, gnu_init);
4127 }
4128 else
4129 {
4130 gnu_type = gnat_to_gnu_type (Etype (Expression (gnat_temp)));
4131 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
4132 gnu_type = TREE_TYPE (gnu_init);
4133
4134 gnu_init = convert (gnu_type, gnu_init);
4135 }
4136 }
4137 else
4138 gcc_unreachable ();
4139
4140 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4141 return build_allocator (gnu_type, gnu_init, gnu_result_type,
4142 Procedure_To_Call (gnat_node),
4143 Storage_Pool (gnat_node), gnat_node,
4144 ignore_init_type);
4145 }
4146 break;
4147
4148 /***************************/
4149 /* Chapter 5: Statements: */
4150 /***************************/
4151
4152 case N_Label:
4153 gnu_result = build1 (LABEL_EXPR, void_type_node,
4154 gnat_to_gnu (Identifier (gnat_node)));
4155 break;
4156
4157 case N_Null_Statement:
4158 gnu_result = alloc_stmt_list ();
4159 break;
4160
4161 case N_Assignment_Statement:
4162 /* Get the LHS and RHS of the statement and convert any reference to an
4163 unconstrained array into a reference to the underlying array.
4164 If we are not to do range checking and the RHS is an N_Function_Call,
4165 pass the LHS to the call function. */
4166 gnu_lhs = maybe_unconstrained_array (gnat_to_gnu (Name (gnat_node)));
4167
4168 /* If the type has a size that overflows, convert this into raise of
4169 Storage_Error: execution shouldn't have gotten here anyway. */
4170 if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))) == INTEGER_CST
4171 && TREE_OVERFLOW (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))))
4172 gnu_result = build_call_raise (SE_Object_Too_Large, gnat_node,
4173 N_Raise_Storage_Error);
4174 else if (Nkind (Expression (gnat_node)) == N_Function_Call
4175 && !Do_Range_Check (Expression (gnat_node)))
4176 gnu_result = call_to_gnu (Expression (gnat_node),
4177 &gnu_result_type, gnu_lhs);
4178 else
4179 {
4180 gnu_rhs
4181 = maybe_unconstrained_array (gnat_to_gnu (Expression (gnat_node)));
4182
8b659f79 4183 /* If range check is needed, emit code to generate it. */
a1ab4c31
AC
4184 if (Do_Range_Check (Expression (gnat_node)))
4185 gnu_rhs = emit_range_check (gnu_rhs, Etype (Name (gnat_node)));
4186
4187 gnu_result
4188 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_lhs, gnu_rhs);
8b659f79
EB
4189
4190 /* If the type being assigned is an array type and the two sides
4191 are not completely disjoint, play safe and use memmove. */
4192 if (TREE_CODE (gnu_result) == MODIFY_EXPR
4193 && Is_Array_Type (Etype (Name (gnat_node)))
4194 && !(Forwards_OK (gnat_node) && Backwards_OK (gnat_node)))
4195 {
4196 tree to, from, size, to_ptr, from_ptr, t;
4197
4198 to = TREE_OPERAND (gnu_result, 0);
4199 from = TREE_OPERAND (gnu_result, 1);
4200
4201 size = TYPE_SIZE_UNIT (TREE_TYPE (from));
4202 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, from);
4203
4204 to_ptr = build_fold_addr_expr (to);
4205 from_ptr = build_fold_addr_expr (from);
4206
4207 t = implicit_built_in_decls[BUILT_IN_MEMMOVE];
4208 gnu_result = build_call_expr (t, 3, to_ptr, from_ptr, size);
4209 }
a1ab4c31
AC
4210 }
4211 break;
4212
4213 case N_If_Statement:
4214 {
4215 tree *gnu_else_ptr; /* Point to put next "else if" or "else". */
4216
4217 /* Make the outer COND_EXPR. Avoid non-determinism. */
4218 gnu_result = build3 (COND_EXPR, void_type_node,
4219 gnat_to_gnu (Condition (gnat_node)),
4220 NULL_TREE, NULL_TREE);
4221 COND_EXPR_THEN (gnu_result)
4222 = build_stmt_group (Then_Statements (gnat_node), false);
4223 TREE_SIDE_EFFECTS (gnu_result) = 1;
4224 gnu_else_ptr = &COND_EXPR_ELSE (gnu_result);
4225
4226 /* Now make a COND_EXPR for each of the "else if" parts. Put each
4227 into the previous "else" part and point to where to put any
4228 outer "else". Also avoid non-determinism. */
4229 if (Present (Elsif_Parts (gnat_node)))
4230 for (gnat_temp = First (Elsif_Parts (gnat_node));
4231 Present (gnat_temp); gnat_temp = Next (gnat_temp))
4232 {
4233 gnu_expr = build3 (COND_EXPR, void_type_node,
4234 gnat_to_gnu (Condition (gnat_temp)),
4235 NULL_TREE, NULL_TREE);
4236 COND_EXPR_THEN (gnu_expr)
4237 = build_stmt_group (Then_Statements (gnat_temp), false);
4238 TREE_SIDE_EFFECTS (gnu_expr) = 1;
4239 set_expr_location_from_node (gnu_expr, gnat_temp);
4240 *gnu_else_ptr = gnu_expr;
4241 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
4242 }
4243
4244 *gnu_else_ptr = build_stmt_group (Else_Statements (gnat_node), false);
4245 }
4246 break;
4247
4248 case N_Case_Statement:
4249 gnu_result = Case_Statement_to_gnu (gnat_node);
4250 break;
4251
4252 case N_Loop_Statement:
4253 gnu_result = Loop_Statement_to_gnu (gnat_node);
4254 break;
4255
4256 case N_Block_Statement:
4257 start_stmt_group ();
4258 gnat_pushlevel ();
4259 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
4260 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
4261 gnat_poplevel ();
4262 gnu_result = end_stmt_group ();
4263
4264 if (Present (Identifier (gnat_node)))
4265 mark_out_of_scope (Entity (Identifier (gnat_node)));
4266 break;
4267
4268 case N_Exit_Statement:
4269 gnu_result
4270 = build2 (EXIT_STMT, void_type_node,
4271 (Present (Condition (gnat_node))
4272 ? gnat_to_gnu (Condition (gnat_node)) : NULL_TREE),
4273 (Present (Name (gnat_node))
4274 ? get_gnu_tree (Entity (Name (gnat_node)))
4275 : TREE_VALUE (gnu_loop_label_stack)));
4276 break;
4277
4278 case N_Return_Statement:
4279 {
4280 /* The gnu function type of the subprogram currently processed. */
4281 tree gnu_subprog_type = TREE_TYPE (current_function_decl);
4282 /* The return value from the subprogram. */
4283 tree gnu_ret_val = NULL_TREE;
4284 /* The place to put the return value. */
4285 tree gnu_lhs;
4286
4287 /* If we are dealing with a "return;" from an Ada procedure with
4288 parameters passed by copy in copy out, we need to return a record
4289 containing the final values of these parameters. If the list
4290 contains only one entry, return just that entry.
4291
4292 For a full description of the copy in copy out parameter mechanism,
4293 see the part of the gnat_to_gnu_entity routine dealing with the
4294 translation of subprograms.
4295
4296 But if we have a return label defined, convert this into
4297 a branch to that label. */
4298
4299 if (TREE_VALUE (gnu_return_label_stack))
4300 {
4301 gnu_result = build1 (GOTO_EXPR, void_type_node,
4302 TREE_VALUE (gnu_return_label_stack));
4303 break;
4304 }
4305
4306 else if (TYPE_CI_CO_LIST (gnu_subprog_type))
4307 {
4308 gnu_lhs = DECL_RESULT (current_function_decl);
4309 if (list_length (TYPE_CI_CO_LIST (gnu_subprog_type)) == 1)
4310 gnu_ret_val = TREE_VALUE (TYPE_CI_CO_LIST (gnu_subprog_type));
4311 else
4312 gnu_ret_val
4313 = gnat_build_constructor (TREE_TYPE (gnu_subprog_type),
4314 TYPE_CI_CO_LIST (gnu_subprog_type));
4315 }
4316
4317 /* If the Ada subprogram is a function, we just need to return the
4318 expression. If the subprogram returns an unconstrained
4319 array, we have to allocate a new version of the result and
4320 return it. If we return by reference, return a pointer. */
4321
4322 else if (Present (Expression (gnat_node)))
4323 {
4324 /* If the current function returns by target pointer and we
4325 are doing a call, pass that target to the call. */
4326 if (TYPE_RETURNS_BY_TARGET_PTR_P (gnu_subprog_type)
4327 && Nkind (Expression (gnat_node)) == N_Function_Call)
4328 {
4329 gnu_lhs
4330 = build_unary_op (INDIRECT_REF, NULL_TREE,
4331 DECL_ARGUMENTS (current_function_decl));
4332 gnu_result = call_to_gnu (Expression (gnat_node),
4333 &gnu_result_type, gnu_lhs);
4334 }
4335 else
4336 {
4337 gnu_ret_val = gnat_to_gnu (Expression (gnat_node));
4338
4339 if (TYPE_RETURNS_BY_TARGET_PTR_P (gnu_subprog_type))
4340 /* The original return type was unconstrained so dereference
4341 the TARGET pointer in the actual return value's type. */
4342 gnu_lhs
4343 = build_unary_op (INDIRECT_REF, TREE_TYPE (gnu_ret_val),
4344 DECL_ARGUMENTS (current_function_decl));
4345 else
4346 gnu_lhs = DECL_RESULT (current_function_decl);
4347
4348 /* Do not remove the padding from GNU_RET_VAL if the inner
4349 type is self-referential since we want to allocate the fixed
4350 size in that case. */
4351 if (TREE_CODE (gnu_ret_val) == COMPONENT_REF
4352 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_ret_val, 0)))
4353 == RECORD_TYPE)
4354 && (TYPE_IS_PADDING_P
4355 (TREE_TYPE (TREE_OPERAND (gnu_ret_val, 0))))
4356 && (CONTAINS_PLACEHOLDER_P
4357 (TYPE_SIZE (TREE_TYPE (gnu_ret_val)))))
4358 gnu_ret_val = TREE_OPERAND (gnu_ret_val, 0);
4359
4360 if (TYPE_RETURNS_BY_REF_P (gnu_subprog_type)
4361 || By_Ref (gnat_node))
4362 gnu_ret_val
4363 = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_ret_val);
4364
4365 else if (TYPE_RETURNS_UNCONSTRAINED_P (gnu_subprog_type))
4366 {
4367 gnu_ret_val = maybe_unconstrained_array (gnu_ret_val);
4368 gnu_ret_val
4369 = build_allocator (TREE_TYPE (gnu_ret_val),
4370 gnu_ret_val,
4371 TREE_TYPE (gnu_subprog_type),
4372 Procedure_To_Call (gnat_node),
4373 Storage_Pool (gnat_node),
4374 gnat_node, false);
4375 }
4376 }
4377 }
4378 else
4379 /* If the Ada subprogram is a regular procedure, just return. */
4380 gnu_lhs = NULL_TREE;
4381
4382 if (TYPE_RETURNS_BY_TARGET_PTR_P (gnu_subprog_type))
4383 {
4384 if (gnu_ret_val)
4385 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
4386 gnu_lhs, gnu_ret_val);
4387 add_stmt_with_node (gnu_result, gnat_node);
4388 gnu_lhs = NULL_TREE;
4389 }
4390
4391 gnu_result = build_return_expr (gnu_lhs, gnu_ret_val);
4392 }
4393 break;
4394
4395 case N_Goto_Statement:
4396 gnu_result = build1 (GOTO_EXPR, void_type_node,
4397 gnat_to_gnu (Name (gnat_node)));
4398 break;
4399
4400 /****************************/
4401 /* Chapter 6: Subprograms: */
4402 /****************************/
4403
4404 case N_Subprogram_Declaration:
4405 /* Unless there is a freeze node, declare the subprogram. We consider
4406 this a "definition" even though we're not generating code for
4407 the subprogram because we will be making the corresponding GCC
4408 node here. */
4409
4410 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
4411 gnat_to_gnu_entity (Defining_Entity (Specification (gnat_node)),
4412 NULL_TREE, 1);
4413 gnu_result = alloc_stmt_list ();
4414 break;
4415
4416 case N_Abstract_Subprogram_Declaration:
4417 /* This subprogram doesn't exist for code generation purposes, but we
4418 have to elaborate the types of any parameters and result, unless
4419 they are imported types (nothing to generate in this case). */
4420
4421 /* Process the parameter types first. */
4422
4423 for (gnat_temp
4424 = First_Formal_With_Extras
4425 (Defining_Entity (Specification (gnat_node)));
4426 Present (gnat_temp);
4427 gnat_temp = Next_Formal_With_Extras (gnat_temp))
4428 if (Is_Itype (Etype (gnat_temp))
4429 && !From_With_Type (Etype (gnat_temp)))
4430 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
4431
4432
4433 /* Then the result type, set to Standard_Void_Type for procedures. */
4434
4435 {
4436 Entity_Id gnat_temp_type
4437 = Etype (Defining_Entity (Specification (gnat_node)));
4438
4439 if (Is_Itype (gnat_temp_type) && !From_With_Type (gnat_temp_type))
4440 gnat_to_gnu_entity (Etype (gnat_temp_type), NULL_TREE, 0);
4441 }
4442
4443 gnu_result = alloc_stmt_list ();
4444 break;
4445
4446 case N_Defining_Program_Unit_Name:
4447 /* For a child unit identifier go up a level to get the
4448 specification. We get this when we try to find the spec of
4449 a child unit package that is the compilation unit being compiled. */
4450 gnu_result = gnat_to_gnu (Parent (gnat_node));
4451 break;
4452
4453 case N_Subprogram_Body:
4454 Subprogram_Body_to_gnu (gnat_node);
4455 gnu_result = alloc_stmt_list ();
4456 break;
4457
4458 case N_Function_Call:
4459 case N_Procedure_Call_Statement:
4460 gnu_result = call_to_gnu (gnat_node, &gnu_result_type, NULL_TREE);
4461 break;
4462
4463 /*************************/
4464 /* Chapter 7: Packages: */
4465 /*************************/
4466
4467 case N_Package_Declaration:
4468 gnu_result = gnat_to_gnu (Specification (gnat_node));
4469 break;
4470
4471 case N_Package_Specification:
4472
4473 start_stmt_group ();
4474 process_decls (Visible_Declarations (gnat_node),
4475 Private_Declarations (gnat_node), Empty, true, true);
4476 gnu_result = end_stmt_group ();
4477 break;
4478
4479 case N_Package_Body:
4480
4481 /* If this is the body of a generic package - do nothing */
4482 if (Ekind (Corresponding_Spec (gnat_node)) == E_Generic_Package)
4483 {
4484 gnu_result = alloc_stmt_list ();
4485 break;
4486 }
4487
4488 start_stmt_group ();
4489 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
4490
4491 if (Present (Handled_Statement_Sequence (gnat_node)))
4492 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
4493
4494 gnu_result = end_stmt_group ();
4495 break;
4496
4497 /*********************************/
4498 /* Chapter 8: Visibility Rules: */
4499 /*********************************/
4500
4501 case N_Use_Package_Clause:
4502 case N_Use_Type_Clause:
4503 /* Nothing to do here - but these may appear in list of declarations */
4504 gnu_result = alloc_stmt_list ();
4505 break;
4506
4507 /***********************/
4508 /* Chapter 9: Tasks: */
4509 /***********************/
4510
4511 case N_Protected_Type_Declaration:
4512 gnu_result = alloc_stmt_list ();
4513 break;
4514
4515 case N_Single_Task_Declaration:
4516 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
4517 gnu_result = alloc_stmt_list ();
4518 break;
4519
4520 /***********************************************************/
4521 /* Chapter 10: Program Structure and Compilation Issues: */
4522 /***********************************************************/
4523
4524 case N_Compilation_Unit:
4525
4526 /* This is not called for the main unit, which is handled in function
4527 gigi above. */
4528 start_stmt_group ();
4529 gnat_pushlevel ();
4530
4531 Compilation_Unit_to_gnu (gnat_node);
4532 gnu_result = alloc_stmt_list ();
4533 break;
4534
4535 case N_Subprogram_Body_Stub:
4536 case N_Package_Body_Stub:
4537 case N_Protected_Body_Stub:
4538 case N_Task_Body_Stub:
4539 /* Simply process whatever unit is being inserted. */
4540 gnu_result = gnat_to_gnu (Unit (Library_Unit (gnat_node)));
4541 break;
4542
4543 case N_Subunit:
4544 gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
4545 break;
4546
4547 /***************************/
4548 /* Chapter 11: Exceptions: */
4549 /***************************/
4550
4551 case N_Handled_Sequence_Of_Statements:
4552 /* If there is an At_End procedure attached to this node, and the EH
4553 mechanism is SJLJ, we must have at least a corresponding At_End
4554 handler, unless the No_Exception_Handlers restriction is set. */
4555 gcc_assert (type_annotate_only
4556 || Exception_Mechanism != Setjmp_Longjmp
4557 || No (At_End_Proc (gnat_node))
4558 || Present (Exception_Handlers (gnat_node))
4559 || No_Exception_Handlers_Set ());
4560
4561 gnu_result = Handled_Sequence_Of_Statements_to_gnu (gnat_node);
4562 break;
4563
4564 case N_Exception_Handler:
4565 if (Exception_Mechanism == Setjmp_Longjmp)
4566 gnu_result = Exception_Handler_to_gnu_sjlj (gnat_node);
4567 else if (Exception_Mechanism == Back_End_Exceptions)
4568 gnu_result = Exception_Handler_to_gnu_zcx (gnat_node);
4569 else
4570 gcc_unreachable ();
4571
4572 break;
4573
4574 case N_Push_Constraint_Error_Label:
4575 push_exception_label_stack (&gnu_constraint_error_label_stack,
4576 Exception_Label (gnat_node));
4577 break;
4578
4579 case N_Push_Storage_Error_Label:
4580 push_exception_label_stack (&gnu_storage_error_label_stack,
4581 Exception_Label (gnat_node));
4582 break;
4583
4584 case N_Push_Program_Error_Label:
4585 push_exception_label_stack (&gnu_program_error_label_stack,
4586 Exception_Label (gnat_node));
4587 break;
4588
4589 case N_Pop_Constraint_Error_Label:
4590 gnu_constraint_error_label_stack
4591 = TREE_CHAIN (gnu_constraint_error_label_stack);
4592 break;
4593
4594 case N_Pop_Storage_Error_Label:
4595 gnu_storage_error_label_stack
4596 = TREE_CHAIN (gnu_storage_error_label_stack);
4597 break;
4598
4599 case N_Pop_Program_Error_Label:
4600 gnu_program_error_label_stack
4601 = TREE_CHAIN (gnu_program_error_label_stack);
4602 break;
4603
4604 /*******************************/
4605 /* Chapter 12: Generic Units: */
4606 /*******************************/
4607
4608 case N_Generic_Function_Renaming_Declaration:
4609 case N_Generic_Package_Renaming_Declaration:
4610 case N_Generic_Procedure_Renaming_Declaration:
4611 case N_Generic_Package_Declaration:
4612 case N_Generic_Subprogram_Declaration:
4613 case N_Package_Instantiation:
4614 case N_Procedure_Instantiation:
4615 case N_Function_Instantiation:
4616 /* These nodes can appear on a declaration list but there is nothing to
4617 to be done with them. */
4618 gnu_result = alloc_stmt_list ();
4619 break;
4620
4621 /***************************************************/
4622 /* Chapter 13: Representation Clauses and */
4623 /* Implementation-Dependent Features: */
4624 /***************************************************/
4625
4626 case N_Attribute_Definition_Clause:
a1ab4c31
AC
4627 gnu_result = alloc_stmt_list ();
4628
8df2e902
EB
4629 /* The only one we need to deal with is 'Address since, for the others,
4630 the front-end puts the information elsewhere. */
4631 if (Get_Attribute_Id (Chars (gnat_node)) != Attr_Address)
4632 break;
4633
4634 /* And we only deal with 'Address if the object has a Freeze node. */
4635 gnat_temp = Entity (Name (gnat_node));
4636 if (No (Freeze_Node (gnat_temp)))
a1ab4c31
AC
4637 break;
4638
8df2e902
EB
4639 /* Get the value to use as the address and save it as the equivalent
4640 for the object. When it is frozen, gnat_to_gnu_entity will do the
4641 right thing. */
4642 save_gnu_tree (gnat_temp, gnat_to_gnu (Expression (gnat_node)), true);
a1ab4c31
AC
4643 break;
4644
4645 case N_Enumeration_Representation_Clause:
4646 case N_Record_Representation_Clause:
4647 case N_At_Clause:
4648 /* We do nothing with these. SEM puts the information elsewhere. */
4649 gnu_result = alloc_stmt_list ();
4650 break;
4651
4652 case N_Code_Statement:
4653 if (!type_annotate_only)
4654 {
4655 tree gnu_template = gnat_to_gnu (Asm_Template (gnat_node));
4656 tree gnu_inputs = NULL_TREE, gnu_outputs = NULL_TREE;
4657 tree gnu_clobbers = NULL_TREE, tail;
4658 bool allows_mem, allows_reg, fake;
4659 int ninputs, noutputs, i;
4660 const char **oconstraints;
4661 const char *constraint;
4662 char *clobber;
4663
4664 /* First retrieve the 3 operand lists built by the front-end. */
4665 Setup_Asm_Outputs (gnat_node);
4666 while (Present (gnat_temp = Asm_Output_Variable ()))
4667 {
4668 tree gnu_value = gnat_to_gnu (gnat_temp);
4669 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
4670 (Asm_Output_Constraint ()));
4671
4672 gnu_outputs = tree_cons (gnu_constr, gnu_value, gnu_outputs);
4673 Next_Asm_Output ();
4674 }
4675
4676 Setup_Asm_Inputs (gnat_node);
4677 while (Present (gnat_temp = Asm_Input_Value ()))
4678 {
4679 tree gnu_value = gnat_to_gnu (gnat_temp);
4680 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
4681 (Asm_Input_Constraint ()));
4682
4683 gnu_inputs = tree_cons (gnu_constr, gnu_value, gnu_inputs);
4684 Next_Asm_Input ();
4685 }
4686
4687 Clobber_Setup (gnat_node);
4688 while ((clobber = Clobber_Get_Next ()))
4689 gnu_clobbers
4690 = tree_cons (NULL_TREE,
4691 build_string (strlen (clobber) + 1, clobber),
4692 gnu_clobbers);
4693
4694 /* Then perform some standard checking and processing on the
4695 operands. In particular, mark them addressable if needed. */
4696 gnu_outputs = nreverse (gnu_outputs);
4697 noutputs = list_length (gnu_outputs);
4698 gnu_inputs = nreverse (gnu_inputs);
4699 ninputs = list_length (gnu_inputs);
4700 oconstraints
4701 = (const char **) alloca (noutputs * sizeof (const char *));
4702
4703 for (i = 0, tail = gnu_outputs; tail; ++i, tail = TREE_CHAIN (tail))
4704 {
4705 tree output = TREE_VALUE (tail);
4706 constraint
4707 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
4708 oconstraints[i] = constraint;
4709
4710 if (parse_output_constraint (&constraint, i, ninputs, noutputs,
4711 &allows_mem, &allows_reg, &fake))
4712 {
4713 /* If the operand is going to end up in memory,
4714 mark it addressable. Note that we don't test
4715 allows_mem like in the input case below; this
4716 is modelled on the C front-end. */
4717 if (!allows_reg
4718 && !gnat_mark_addressable (output))
4719 output = error_mark_node;
4720 }
4721 else
4722 output = error_mark_node;
4723
4724 TREE_VALUE (tail) = output;
4725 }
4726
4727 for (i = 0, tail = gnu_inputs; tail; ++i, tail = TREE_CHAIN (tail))
4728 {
4729 tree input = TREE_VALUE (tail);
4730 constraint
4731 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
4732
4733 if (parse_input_constraint (&constraint, i, ninputs, noutputs,
4734 0, oconstraints,
4735 &allows_mem, &allows_reg))
4736 {
4737 /* If the operand is going to end up in memory,
4738 mark it addressable. */
4739 if (!allows_reg && allows_mem
4740 && !gnat_mark_addressable (input))
4741 input = error_mark_node;
4742 }
4743 else
4744 input = error_mark_node;
4745
4746 TREE_VALUE (tail) = input;
4747 }
4748
4749 gnu_result = build4 (ASM_EXPR, void_type_node,
4750 gnu_template, gnu_outputs,
4751 gnu_inputs, gnu_clobbers);
4752 ASM_VOLATILE_P (gnu_result) = Is_Asm_Volatile (gnat_node);
4753 }
4754 else
4755 gnu_result = alloc_stmt_list ();
4756
4757 break;
4758
4759 /***************************************************/
4760 /* Added Nodes */
4761 /***************************************************/
4762
4763 case N_Freeze_Entity:
4764 start_stmt_group ();
4765 process_freeze_entity (gnat_node);
4766 process_decls (Actions (gnat_node), Empty, Empty, true, true);
4767 gnu_result = end_stmt_group ();
4768 break;
4769
4770 case N_Itype_Reference:
4771 if (!present_gnu_tree (Itype (gnat_node)))
4772 process_type (Itype (gnat_node));
4773
4774 gnu_result = alloc_stmt_list ();
4775 break;
4776
4777 case N_Free_Statement:
4778 if (!type_annotate_only)
4779 {
4780 tree gnu_ptr = gnat_to_gnu (Expression (gnat_node));
4781 tree gnu_ptr_type = TREE_TYPE (gnu_ptr);
4782 tree gnu_obj_type;
4783 tree gnu_actual_obj_type = 0;
4784 tree gnu_obj_size;
4785 unsigned int align;
4786 unsigned int default_allocator_alignment
4787 = get_target_default_allocator_alignment () * BITS_PER_UNIT;
4788
4789 /* If this is a thin pointer, we must dereference it to create
4790 a fat pointer, then go back below to a thin pointer. The
4791 reason for this is that we need a fat pointer someplace in
4792 order to properly compute the size. */
4793 if (TYPE_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
4794 gnu_ptr = build_unary_op (ADDR_EXPR, NULL_TREE,
4795 build_unary_op (INDIRECT_REF, NULL_TREE,
4796 gnu_ptr));
4797
4798 /* If this is an unconstrained array, we know the object must
4799 have been allocated with the template in front of the object.
4800 So pass the template address, but get the total size. Do this
4801 by converting to a thin pointer. */
4802 if (TYPE_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
4803 gnu_ptr
4804 = convert (build_pointer_type
4805 (TYPE_OBJECT_RECORD_TYPE
4806 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
4807 gnu_ptr);
4808
4809 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
4810
4811 if (Present (Actual_Designated_Subtype (gnat_node)))
4812 {
4813 gnu_actual_obj_type
4814 = gnat_to_gnu_type (Actual_Designated_Subtype (gnat_node));
4815
4816 if (TYPE_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
4817 gnu_actual_obj_type
4818 = build_unc_object_type_from_ptr (gnu_ptr_type,
4819 gnu_actual_obj_type,
4820 get_identifier ("DEALLOC"));
4821 }
4822 else
4823 gnu_actual_obj_type = gnu_obj_type;
4824
4825 gnu_obj_size = TYPE_SIZE_UNIT (gnu_actual_obj_type);
4826 align = TYPE_ALIGN (gnu_obj_type);
4827
4828 if (TREE_CODE (gnu_obj_type) == RECORD_TYPE
4829 && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type))
4830 {
4831 tree gnu_char_ptr_type = build_pointer_type (char_type_node);
4832 tree gnu_pos = byte_position (TYPE_FIELDS (gnu_obj_type));
4833 tree gnu_byte_offset
4834 = convert (sizetype,
4835 size_diffop (size_zero_node, gnu_pos));
4836 gnu_byte_offset = fold_build1 (NEGATE_EXPR, sizetype, gnu_byte_offset);
4837
4838 gnu_ptr = convert (gnu_char_ptr_type, gnu_ptr);
4839 gnu_ptr = build_binary_op (POINTER_PLUS_EXPR, gnu_char_ptr_type,
4840 gnu_ptr, gnu_byte_offset);
4841 }
4842
4843 /* If the object was allocated from the default storage pool, the
4844 alignment was greater than what the allocator provides, and this
4845 is not a fat or thin pointer, what we have in gnu_ptr here is an
4846 address dynamically adjusted to match the alignment requirement
4847 (see build_allocator). What we need to pass to free is the
4848 initial allocator's return value, which has been stored just in
4849 front of the block we have. */
4850
4851 if (No (Procedure_To_Call (gnat_node))
4852 && align > default_allocator_alignment
4853 && ! TYPE_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
4854 {
4855 /* We set GNU_PTR
4856 as * (void **)((void *)GNU_PTR - (void *)sizeof(void *))
4857 in two steps: */
4858
4859 /* GNU_PTR (void *)
4860 = (void *)GNU_PTR - (void *)sizeof (void *)) */
4861 gnu_ptr
4862 = build_binary_op
4863 (POINTER_PLUS_EXPR, ptr_void_type_node,
4864 convert (ptr_void_type_node, gnu_ptr),
4865 size_int (-POINTER_SIZE/BITS_PER_UNIT));
4866
4867 /* GNU_PTR (void *) = *(void **)GNU_PTR */
4868 gnu_ptr
4869 = build_unary_op
4870 (INDIRECT_REF, NULL_TREE,
4871 convert (build_pointer_type (ptr_void_type_node),
4872 gnu_ptr));
4873 }
4874
4875 gnu_result = build_call_alloc_dealloc (gnu_ptr, gnu_obj_size, align,
4876 Procedure_To_Call (gnat_node),
4877 Storage_Pool (gnat_node),
4878 gnat_node);
4879 }
4880 break;
4881
4882 case N_Raise_Constraint_Error:
4883 case N_Raise_Program_Error:
4884 case N_Raise_Storage_Error:
4885 if (type_annotate_only)
4886 {
4887 gnu_result = alloc_stmt_list ();
4888 break;
4889 }
4890
4891 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4892 gnu_result
4893 = build_call_raise (UI_To_Int (Reason (gnat_node)), gnat_node,
4894 Nkind (gnat_node));
4895
4896 /* If the type is VOID, this is a statement, so we need to
4897 generate the code for the call. Handle a Condition, if there
4898 is one. */
4899 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
4900 {
4901 set_expr_location_from_node (gnu_result, gnat_node);
4902
4903 if (Present (Condition (gnat_node)))
4904 gnu_result = build3 (COND_EXPR, void_type_node,
4905 gnat_to_gnu (Condition (gnat_node)),
4906 gnu_result, alloc_stmt_list ());
4907 }
4908 else
4909 gnu_result = build1 (NULL_EXPR, gnu_result_type, gnu_result);
4910 break;
4911
4912 case N_Validate_Unchecked_Conversion:
4913 {
4914 Entity_Id gnat_target_type = Target_Type (gnat_node);
4915 tree gnu_source_type = gnat_to_gnu_type (Source_Type (gnat_node));
4916 tree gnu_target_type = gnat_to_gnu_type (gnat_target_type);
4917
4918 /* No need for any warning in this case. */
4919 if (!flag_strict_aliasing)
4920 ;
4921
4922 /* If the result is a pointer type, see if we are either converting
4923 from a non-pointer or from a pointer to a type with a different
4924 alias set and warn if so. If the result is defined in the same
4925 unit as this unchecked conversion, we can allow this because we
4926 can know to make the pointer type behave properly. */
4927 else if (POINTER_TYPE_P (gnu_target_type)
4928 && !In_Same_Source_Unit (gnat_target_type, gnat_node)
4929 && !No_Strict_Aliasing (Underlying_Type (gnat_target_type)))
4930 {
4931 tree gnu_source_desig_type = POINTER_TYPE_P (gnu_source_type)
4932 ? TREE_TYPE (gnu_source_type)
4933 : NULL_TREE;
4934 tree gnu_target_desig_type = TREE_TYPE (gnu_target_type);
4935
4936 if ((TYPE_DUMMY_P (gnu_target_desig_type)
4937 || get_alias_set (gnu_target_desig_type) != 0)
4938 && (!POINTER_TYPE_P (gnu_source_type)
4939 || (TYPE_DUMMY_P (gnu_source_desig_type)
4940 != TYPE_DUMMY_P (gnu_target_desig_type))
4941 || (TYPE_DUMMY_P (gnu_source_desig_type)
4942 && gnu_source_desig_type != gnu_target_desig_type)
794511d2
EB
4943 || !alias_sets_conflict_p
4944 (get_alias_set (gnu_source_desig_type),
4945 get_alias_set (gnu_target_desig_type))))
a1ab4c31
AC
4946 {
4947 post_error_ne
4948 ("?possible aliasing problem for type&",
4949 gnat_node, Target_Type (gnat_node));
4950 post_error
4951 ("\\?use -fno-strict-aliasing switch for references",
4952 gnat_node);
4953 post_error_ne
4954 ("\\?or use `pragma No_Strict_Aliasing (&);`",
4955 gnat_node, Target_Type (gnat_node));
4956 }
4957 }
4958
4959 /* But if the result is a fat pointer type, we have no mechanism to
4960 do that, so we unconditionally warn in problematic cases. */
4961 else if (TYPE_FAT_POINTER_P (gnu_target_type))
4962 {
4963 tree gnu_source_array_type
4964 = TYPE_FAT_POINTER_P (gnu_source_type)
4965 ? TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_source_type)))
4966 : NULL_TREE;
4967 tree gnu_target_array_type
4968 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_target_type)));
4969
4970 if ((TYPE_DUMMY_P (gnu_target_array_type)
4971 || get_alias_set (gnu_target_array_type) != 0)
4972 && (!TYPE_FAT_POINTER_P (gnu_source_type)
4973 || (TYPE_DUMMY_P (gnu_source_array_type)
4974 != TYPE_DUMMY_P (gnu_target_array_type))
4975 || (TYPE_DUMMY_P (gnu_source_array_type)
4976 && gnu_source_array_type != gnu_target_array_type)
794511d2
EB
4977 || !alias_sets_conflict_p
4978 (get_alias_set (gnu_source_array_type),
4979 get_alias_set (gnu_target_array_type))))
a1ab4c31
AC
4980 {
4981 post_error_ne
4982 ("?possible aliasing problem for type&",
4983 gnat_node, Target_Type (gnat_node));
4984 post_error
4985 ("\\?use -fno-strict-aliasing switch for references",
4986 gnat_node);
4987 }
4988 }
4989 }
4990 gnu_result = alloc_stmt_list ();
4991 break;
4992
4993 case N_Raise_Statement:
4994 case N_Function_Specification:
4995 case N_Procedure_Specification:
4996 case N_Op_Concat:
4997 case N_Component_Association:
4998 case N_Task_Body:
4999 default:
5000 gcc_assert (type_annotate_only);
5001 gnu_result = alloc_stmt_list ();
5002 }
5003
5004 /* If we pushed our level as part of processing the elaboration routine,
5005 pop it back now. */
5006 if (went_into_elab_proc)
5007 {
5008 add_stmt (gnu_result);
5009 gnat_poplevel ();
5010 gnu_result = end_stmt_group ();
5011 current_function_decl = NULL_TREE;
5012 }
5013
5014 /* Set the location information on the result if it is a real expression.
5015 References can be reused for multiple GNAT nodes and they would get
5016 the location information of their last use. Note that we may have
5017 no result if we tried to build a CALL_EXPR node to a procedure with
5018 no side-effects and optimization is enabled. */
5019 if (gnu_result
5020 && EXPR_P (gnu_result)
5021 && TREE_CODE (gnu_result) != NOP_EXPR
5022 && !REFERENCE_CLASS_P (gnu_result))
5023 set_expr_location_from_node (gnu_result, gnat_node);
5024
5025 /* If we're supposed to return something of void_type, it means we have
5026 something we're elaborating for effect, so just return. */
5027 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
5028 return gnu_result;
5029
5030 /* If the result is a constant that overflows, raise constraint error. */
5031 else if (TREE_CODE (gnu_result) == INTEGER_CST
5032 && TREE_OVERFLOW (gnu_result))
5033 {
5034 post_error ("Constraint_Error will be raised at run-time?", gnat_node);
5035
5036 gnu_result
5037 = build1 (NULL_EXPR, gnu_result_type,
5038 build_call_raise (CE_Overflow_Check_Failed, gnat_node,
5039 N_Raise_Constraint_Error));
5040 }
5041
5042 /* If our result has side-effects and is of an unconstrained type,
5043 make a SAVE_EXPR so that we can be sure it will only be referenced
5044 once. Note we must do this before any conversions. */
5045 if (TREE_SIDE_EFFECTS (gnu_result)
5046 && (TREE_CODE (gnu_result_type) == UNCONSTRAINED_ARRAY_TYPE
5047 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))))
5048 gnu_result = gnat_stabilize_reference (gnu_result, false);
5049
5050 /* Now convert the result to the result type, unless we are in one of the
5051 following cases:
5052
5053 1. If this is the Name of an assignment statement or a parameter of
5054 a procedure call, return the result almost unmodified since the
5055 RHS will have to be converted to our type in that case, unless
5056 the result type has a simpler size. Similarly, don't convert
5057 integral types that are the operands of an unchecked conversion
5058 since we need to ignore those conversions (for 'Valid).
5059
5060 2. If we have a label (which doesn't have any well-defined type), a
5061 field or an error, return the result almost unmodified. Also don't
5062 do the conversion if the result type involves a PLACEHOLDER_EXPR in
5063 its size since those are the cases where the front end may have the
5064 type wrong due to "instantiating" the unconstrained record with
5065 discriminant values. Similarly, if the two types are record types
5066 with the same name don't convert. This will be the case when we are
5067 converting from a packable version of a type to its original type and
5068 we need those conversions to be NOPs in order for assignments into
5069 these types to work properly.
5070
5071 3. If the type is void or if we have no result, return error_mark_node
5072 to show we have no result.
5073
5074 4. Finally, if the type of the result is already correct. */
5075
5076 if (Present (Parent (gnat_node))
5077 && ((Nkind (Parent (gnat_node)) == N_Assignment_Statement
5078 && Name (Parent (gnat_node)) == gnat_node)
5079 || (Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
5080 && Name (Parent (gnat_node)) != gnat_node)
5081 || Nkind (Parent (gnat_node)) == N_Parameter_Association
5082 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
5083 && !AGGREGATE_TYPE_P (gnu_result_type)
5084 && !AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))))
5085 && !(TYPE_SIZE (gnu_result_type)
5086 && TYPE_SIZE (TREE_TYPE (gnu_result))
5087 && (AGGREGATE_TYPE_P (gnu_result_type)
5088 == AGGREGATE_TYPE_P (TREE_TYPE (gnu_result)))
5089 && ((TREE_CODE (TYPE_SIZE (gnu_result_type)) == INTEGER_CST
5090 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result)))
5091 != INTEGER_CST))
5092 || (TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
5093 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))
5094 && (CONTAINS_PLACEHOLDER_P
5095 (TYPE_SIZE (TREE_TYPE (gnu_result))))))
5096 && !(TREE_CODE (gnu_result_type) == RECORD_TYPE
5097 && TYPE_JUSTIFIED_MODULAR_P (gnu_result_type))))
5098 {
5099 /* Remove padding only if the inner object is of self-referential
5100 size: in that case it must be an object of unconstrained type
5101 with a default discriminant and we want to avoid copying too
5102 much data. */
5103 if (TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE
5104 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result))
5105 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS
5106 (TREE_TYPE (gnu_result))))))
5107 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
5108 gnu_result);
5109 }
5110
5111 else if (TREE_CODE (gnu_result) == LABEL_DECL
5112 || TREE_CODE (gnu_result) == FIELD_DECL
5113 || TREE_CODE (gnu_result) == ERROR_MARK
5114 || (TYPE_SIZE (gnu_result_type)
5115 && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
5116 && TREE_CODE (gnu_result) != INDIRECT_REF
5117 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type)))
5118 || ((TYPE_NAME (gnu_result_type)
5119 == TYPE_NAME (TREE_TYPE (gnu_result)))
5120 && TREE_CODE (gnu_result_type) == RECORD_TYPE
5121 && TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE))
5122 {
5123 /* Remove any padding. */
5124 if (TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE
5125 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
5126 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
5127 gnu_result);
5128 }
5129
5130 else if (gnu_result == error_mark_node || gnu_result_type == void_type_node)
5131 gnu_result = error_mark_node;
5132
5133 else if (gnu_result_type != TREE_TYPE (gnu_result))
5134 gnu_result = convert (gnu_result_type, gnu_result);
5135
5136 /* We don't need any NOP_EXPR or NON_LVALUE_EXPR on the result. */
5137 while ((TREE_CODE (gnu_result) == NOP_EXPR
5138 || TREE_CODE (gnu_result) == NON_LVALUE_EXPR)
5139 && TREE_TYPE (TREE_OPERAND (gnu_result, 0)) == TREE_TYPE (gnu_result))
5140 gnu_result = TREE_OPERAND (gnu_result, 0);
5141
5142 return gnu_result;
5143}
5144\f
5145/* Subroutine of above to push the exception label stack. GNU_STACK is
5146 a pointer to the stack to update and GNAT_LABEL, if present, is the
5147 label to push onto the stack. */
5148
5149static void
5150push_exception_label_stack (tree *gnu_stack, Entity_Id gnat_label)
5151{
5152 tree gnu_label = (Present (gnat_label)
5153 ? gnat_to_gnu_entity (gnat_label, NULL_TREE, 0)
5154 : NULL_TREE);
5155
5156 *gnu_stack = tree_cons (NULL_TREE, gnu_label, *gnu_stack);
5157}
5158\f
5159/* Record the current code position in GNAT_NODE. */
5160
5161static void
5162record_code_position (Node_Id gnat_node)
5163{
5164 tree stmt_stmt = build1 (STMT_STMT, void_type_node, NULL_TREE);
5165
5166 add_stmt_with_node (stmt_stmt, gnat_node);
5167 save_gnu_tree (gnat_node, stmt_stmt, true);
5168}
5169
5170/* Insert the code for GNAT_NODE at the position saved for that node. */
5171
5172static void
5173insert_code_for (Node_Id gnat_node)
5174{
5175 STMT_STMT_STMT (get_gnu_tree (gnat_node)) = gnat_to_gnu (gnat_node);
5176 save_gnu_tree (gnat_node, NULL_TREE, true);
5177}
5178\f
5179/* Start a new statement group chained to the previous group. */
5180
5181void
5182start_stmt_group (void)
5183{
5184 struct stmt_group *group = stmt_group_free_list;
5185
5186 /* First see if we can get one from the free list. */
5187 if (group)
5188 stmt_group_free_list = group->previous;
5189 else
5190 group = (struct stmt_group *) ggc_alloc (sizeof (struct stmt_group));
5191
5192 group->previous = current_stmt_group;
5193 group->stmt_list = group->block = group->cleanups = NULL_TREE;
5194 current_stmt_group = group;
5195}
5196
5197/* Add GNU_STMT to the current statement group. */
5198
5199void
5200add_stmt (tree gnu_stmt)
5201{
5202 append_to_statement_list (gnu_stmt, &current_stmt_group->stmt_list);
5203}
5204
5205/* Similar, but set the location of GNU_STMT to that of GNAT_NODE. */
5206
5207void
5208add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
5209{
5210 if (Present (gnat_node))
5211 set_expr_location_from_node (gnu_stmt, gnat_node);
5212 add_stmt (gnu_stmt);
5213}
5214
5215/* Add a declaration statement for GNU_DECL to the current statement group.
5216 Get SLOC from Entity_Id. */
5217
5218void
5219add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
5220{
5221 tree type = TREE_TYPE (gnu_decl);
5222 tree gnu_stmt, gnu_init, t;
5223
5224 /* If this is a variable that Gigi is to ignore, we may have been given
5225 an ERROR_MARK. So test for it. We also might have been given a
5226 reference for a renaming. So only do something for a decl. Also
5227 ignore a TYPE_DECL for an UNCONSTRAINED_ARRAY_TYPE. */
5228 if (!DECL_P (gnu_decl)
5229 || (TREE_CODE (gnu_decl) == TYPE_DECL
5230 && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE))
5231 return;
5232
5233 gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
5234
5235 /* If we are global, we don't want to actually output the DECL_EXPR for
5236 this decl since we already have evaluated the expressions in the
5237 sizes and positions as globals and doing it again would be wrong. */
5238 if (global_bindings_p ())
5239 {
5240 /* Mark everything as used to prevent node sharing with subprograms.
5241 Note that walk_tree knows how to deal with TYPE_DECL, but neither
5242 VAR_DECL nor CONST_DECL. This appears to be somewhat arbitrary. */
5243 mark_visited (&gnu_stmt);
5244 if (TREE_CODE (gnu_decl) == VAR_DECL
5245 || TREE_CODE (gnu_decl) == CONST_DECL)
5246 {
5247 mark_visited (&DECL_SIZE (gnu_decl));
5248 mark_visited (&DECL_SIZE_UNIT (gnu_decl));
5249 mark_visited (&DECL_INITIAL (gnu_decl));
5250 }
5251 /* In any case, we have to deal with our own TYPE_ADA_SIZE field. */
5252 if (TREE_CODE (gnu_decl) == TYPE_DECL
5253 && (TREE_CODE (type) == RECORD_TYPE
5254 || TREE_CODE (type) == UNION_TYPE
5255 || TREE_CODE (type) == QUAL_UNION_TYPE)
5256 && (t = TYPE_ADA_SIZE (type)))
5257 mark_visited (&t);
5258 }
5259 else
5260 add_stmt_with_node (gnu_stmt, gnat_entity);
5261
5262 /* If this is a variable and an initializer is attached to it, it must be
5263 valid for the context. Similar to init_const in create_var_decl_1. */
5264 if (TREE_CODE (gnu_decl) == VAR_DECL
5265 && (gnu_init = DECL_INITIAL (gnu_decl)) != NULL_TREE
5266 && (!gnat_types_compatible_p (type, TREE_TYPE (gnu_init))
5267 || (TREE_STATIC (gnu_decl)
5268 && !initializer_constant_valid_p (gnu_init,
5269 TREE_TYPE (gnu_init)))))
5270 {
5271 /* If GNU_DECL has a padded type, convert it to the unpadded
5272 type so the assignment is done properly. */
5273 if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
5274 t = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
5275 else
5276 t = gnu_decl;
5277
5278 gnu_stmt = build_binary_op (MODIFY_EXPR, NULL_TREE, t, gnu_init);
5279
5280 DECL_INITIAL (gnu_decl) = NULL_TREE;
5281 if (TREE_READONLY (gnu_decl))
5282 {
5283 TREE_READONLY (gnu_decl) = 0;
5284 DECL_READONLY_ONCE_ELAB (gnu_decl) = 1;
5285 }
5286
5287 add_stmt_with_node (gnu_stmt, gnat_entity);
5288 }
5289}
5290
5291/* Callback for walk_tree to mark the visited trees rooted at *TP. */
5292
5293static tree
5294mark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
5295{
5296 if (TREE_VISITED (*tp))
5297 *walk_subtrees = 0;
5298
5299 /* Don't mark a dummy type as visited because we want to mark its sizes
5300 and fields once it's filled in. */
5301 else if (!TYPE_IS_DUMMY_P (*tp))
5302 TREE_VISITED (*tp) = 1;
5303
5304 if (TYPE_P (*tp))
5305 TYPE_SIZES_GIMPLIFIED (*tp) = 1;
5306
5307 return NULL_TREE;
5308}
5309
5310/* Utility function to unshare expressions wrapped up in a SAVE_EXPR. */
5311
5312static tree
5313unshare_save_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
5314 void *data ATTRIBUTE_UNUSED)
5315{
5316 tree t = *tp;
5317
5318 if (TREE_CODE (t) == SAVE_EXPR)
5319 TREE_OPERAND (t, 0) = unshare_expr (TREE_OPERAND (t, 0));
5320
5321 return NULL_TREE;
5322}
5323
5324/* Mark nodes rooted at *TP with TREE_VISITED and types as having their
5325 sized gimplified. We use this to indicate all variable sizes and
5326 positions in global types may not be shared by any subprogram. */
5327
5328void
5329mark_visited (tree *tp)
5330{
5331 walk_tree (tp, mark_visited_r, NULL, NULL);
5332}
5333
5334/* Add GNU_CLEANUP, a cleanup action, to the current code group and
5335 set its location to that of GNAT_NODE if present. */
5336
5337static void
5338add_cleanup (tree gnu_cleanup, Node_Id gnat_node)
5339{
5340 if (Present (gnat_node))
5341 set_expr_location_from_node (gnu_cleanup, gnat_node);
5342 append_to_statement_list (gnu_cleanup, &current_stmt_group->cleanups);
5343}
5344
5345/* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
5346
5347void
5348set_block_for_group (tree gnu_block)
5349{
5350 gcc_assert (!current_stmt_group->block);
5351 current_stmt_group->block = gnu_block;
5352}
5353
5354/* Return code corresponding to the current code group. It is normally
5355 a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
5356 BLOCK or cleanups were set. */
5357
5358tree
5359end_stmt_group (void)
5360{
5361 struct stmt_group *group = current_stmt_group;
5362 tree gnu_retval = group->stmt_list;
5363
5364 /* If this is a null list, allocate a new STATEMENT_LIST. Then, if there
5365 are cleanups, make a TRY_FINALLY_EXPR. Last, if there is a BLOCK,
5366 make a BIND_EXPR. Note that we nest in that because the cleanup may
5367 reference variables in the block. */
5368 if (gnu_retval == NULL_TREE)
5369 gnu_retval = alloc_stmt_list ();
5370
5371 if (group->cleanups)
5372 gnu_retval = build2 (TRY_FINALLY_EXPR, void_type_node, gnu_retval,
5373 group->cleanups);
5374
5375 if (current_stmt_group->block)
5376 gnu_retval = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (group->block),
5377 gnu_retval, group->block);
5378
5379 /* Remove this group from the stack and add it to the free list. */
5380 current_stmt_group = group->previous;
5381 group->previous = stmt_group_free_list;
5382 stmt_group_free_list = group;
5383
5384 return gnu_retval;
5385}
5386
5387/* Add a list of statements from GNAT_LIST, a possibly-empty list of
5388 statements.*/
5389
5390static void
5391add_stmt_list (List_Id gnat_list)
5392{
5393 Node_Id gnat_node;
5394
5395 if (Present (gnat_list))
5396 for (gnat_node = First (gnat_list); Present (gnat_node);
5397 gnat_node = Next (gnat_node))
5398 add_stmt (gnat_to_gnu (gnat_node));
5399}
5400
5401/* Build a tree from GNAT_LIST, a possibly-empty list of statements.
5402 If BINDING_P is true, push and pop a binding level around the list. */
5403
5404static tree
5405build_stmt_group (List_Id gnat_list, bool binding_p)
5406{
5407 start_stmt_group ();
5408 if (binding_p)
5409 gnat_pushlevel ();
5410
5411 add_stmt_list (gnat_list);
5412 if (binding_p)
5413 gnat_poplevel ();
5414
5415 return end_stmt_group ();
5416}
5417\f
5418/* Push and pop routines for stacks. We keep a free list around so we
5419 don't waste tree nodes. */
5420
5421static void
5422push_stack (tree *gnu_stack_ptr, tree gnu_purpose, tree gnu_value)
5423{
5424 tree gnu_node = gnu_stack_free_list;
5425
5426 if (gnu_node)
5427 {
5428 gnu_stack_free_list = TREE_CHAIN (gnu_node);
5429 TREE_CHAIN (gnu_node) = *gnu_stack_ptr;
5430 TREE_PURPOSE (gnu_node) = gnu_purpose;
5431 TREE_VALUE (gnu_node) = gnu_value;
5432 }
5433 else
5434 gnu_node = tree_cons (gnu_purpose, gnu_value, *gnu_stack_ptr);
5435
5436 *gnu_stack_ptr = gnu_node;
5437}
5438
5439static void
5440pop_stack (tree *gnu_stack_ptr)
5441{
5442 tree gnu_node = *gnu_stack_ptr;
5443
5444 *gnu_stack_ptr = TREE_CHAIN (gnu_node);
5445 TREE_CHAIN (gnu_node) = gnu_stack_free_list;
5446 gnu_stack_free_list = gnu_node;
5447}
5448\f
5449/* Generate GIMPLE in place for the expression at *EXPR_P. */
5450
5451int
5452gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
5453 gimple_seq *post_p ATTRIBUTE_UNUSED)
5454{
5455 tree expr = *expr_p;
5456 tree op;
5457
5458 if (IS_ADA_STMT (expr))
5459 return gnat_gimplify_stmt (expr_p);
5460
5461 switch (TREE_CODE (expr))
5462 {
5463 case NULL_EXPR:
5464 /* If this is for a scalar, just make a VAR_DECL for it. If for
5465 an aggregate, get a null pointer of the appropriate type and
5466 dereference it. */
5467 if (AGGREGATE_TYPE_P (TREE_TYPE (expr)))
5468 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (expr),
5469 convert (build_pointer_type (TREE_TYPE (expr)),
5470 integer_zero_node));
5471 else
5472 {
5473 *expr_p = create_tmp_var (TREE_TYPE (expr), NULL);
5474 TREE_NO_WARNING (*expr_p) = 1;
5475 }
5476
5477 gimplify_and_add (TREE_OPERAND (expr, 0), pre_p);
5478 return GS_OK;
5479
5480 case UNCONSTRAINED_ARRAY_REF:
5481 /* We should only do this if we are just elaborating for side-effects,
5482 but we can't know that yet. */
5483 *expr_p = TREE_OPERAND (*expr_p, 0);
5484 return GS_OK;
5485
5486 case ADDR_EXPR:
5487 op = TREE_OPERAND (expr, 0);
5488
5489 /* If we're taking the address of a constant CONSTRUCTOR, force it to
5490 be put into static memory. We know it's going to be readonly given
5491 the semantics we have and it's required to be static memory in
5492 the case when the reference is in an elaboration procedure. */
5493 if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op))
5494 {
5495 tree new_var = create_tmp_var (TREE_TYPE (op), "C");
5496
5497 TREE_READONLY (new_var) = 1;
5498 TREE_STATIC (new_var) = 1;
5499 TREE_ADDRESSABLE (new_var) = 1;
5500 DECL_INITIAL (new_var) = op;
5501
5502 TREE_OPERAND (expr, 0) = new_var;
5503 recompute_tree_invariant_for_addr_expr (expr);
5504 return GS_ALL_DONE;
5505 }
5506
5507 /* If we are taking the address of a SAVE_EXPR, we are typically
5508 processing a misaligned argument to be passed by reference in a
5509 procedure call. We just mark the operand as addressable + not
5510 readonly here and let the common gimplifier code perform the
5511 temporary creation, initialization, and "instantiation" in place of
5512 the SAVE_EXPR in further operands, in particular in the copy back
5513 code inserted after the call. */
5514 else if (TREE_CODE (op) == SAVE_EXPR)
5515 {
5516 TREE_ADDRESSABLE (op) = 1;
5517 TREE_READONLY (op) = 0;
5518 }
5519
5520 /* We let the gimplifier process &COND_EXPR and expect it to yield the
5521 address of the selected operand when it is addressable. Besides, we
5522 also expect addressable_p to only let COND_EXPRs where both arms are
5523 addressable reach here. */
5524 else if (TREE_CODE (op) == COND_EXPR)
5525 ;
5526
5527 /* Otherwise, if we are taking the address of something that is neither
5528 reference, declaration, or constant, make a variable for the operand
5529 here and then take its address. If we don't do it this way, we may
5530 confuse the gimplifier because it needs to know the variable is
5531 addressable at this point. This duplicates code in
5532 internal_get_tmp_var, which is unfortunate. */
5533 else if (TREE_CODE_CLASS (TREE_CODE (op)) != tcc_reference
5534 && TREE_CODE_CLASS (TREE_CODE (op)) != tcc_declaration
5535 && TREE_CODE_CLASS (TREE_CODE (op)) != tcc_constant)
5536 {
5537 tree new_var = create_tmp_var (TREE_TYPE (op), "A");
5538 gimple stmt;
5539
5540 TREE_ADDRESSABLE (new_var) = 1;
5541
5542 stmt = gimplify_assign (new_var, op, pre_p);
5543 if (EXPR_HAS_LOCATION (op))
5544 gimple_set_location (stmt, *EXPR_LOCUS (op));
5545
5546 TREE_OPERAND (expr, 0) = new_var;
5547 recompute_tree_invariant_for_addr_expr (expr);
5548 return GS_ALL_DONE;
5549 }
5550
5551 /* ... fall through ... */
5552
5553 default:
5554 return GS_UNHANDLED;
5555 }
5556}
5557
5558/* Generate GIMPLE in place for the statement at *STMT_P. */
5559
5560static enum gimplify_status
5561gnat_gimplify_stmt (tree *stmt_p)
5562{
5563 tree stmt = *stmt_p;
5564
5565 switch (TREE_CODE (stmt))
5566 {
5567 case STMT_STMT:
5568 *stmt_p = STMT_STMT_STMT (stmt);
5569 return GS_OK;
5570
5571 case LOOP_STMT:
5572 {
5573 tree gnu_start_label = create_artificial_label ();
5574 tree gnu_end_label = LOOP_STMT_LABEL (stmt);
5575 tree t;
5576
5577 /* Set to emit the statements of the loop. */
5578 *stmt_p = NULL_TREE;
5579
5580 /* We first emit the start label and then a conditional jump to
5581 the end label if there's a top condition, then the body of the
5582 loop, then a conditional branch to the end label, then the update,
5583 if any, and finally a jump to the start label and the definition
5584 of the end label. */
5585 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
5586 gnu_start_label),
5587 stmt_p);
5588
5589 if (LOOP_STMT_TOP_COND (stmt))
5590 append_to_statement_list (build3 (COND_EXPR, void_type_node,
5591 LOOP_STMT_TOP_COND (stmt),
5592 alloc_stmt_list (),
5593 build1 (GOTO_EXPR,
5594 void_type_node,
5595 gnu_end_label)),
5596 stmt_p);
5597
5598 append_to_statement_list (LOOP_STMT_BODY (stmt), stmt_p);
5599
5600 if (LOOP_STMT_BOT_COND (stmt))
5601 append_to_statement_list (build3 (COND_EXPR, void_type_node,
5602 LOOP_STMT_BOT_COND (stmt),
5603 alloc_stmt_list (),
5604 build1 (GOTO_EXPR,
5605 void_type_node,
5606 gnu_end_label)),
5607 stmt_p);
5608
5609 if (LOOP_STMT_UPDATE (stmt))
5610 append_to_statement_list (LOOP_STMT_UPDATE (stmt), stmt_p);
5611
5612 t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
5613 SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (gnu_end_label));
5614 append_to_statement_list (t, stmt_p);
5615
5616 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
5617 gnu_end_label),
5618 stmt_p);
5619 return GS_OK;
5620 }
5621
5622 case EXIT_STMT:
5623 /* Build a statement to jump to the corresponding end label, then
5624 see if it needs to be conditional. */
5625 *stmt_p = build1 (GOTO_EXPR, void_type_node, EXIT_STMT_LABEL (stmt));
5626 if (EXIT_STMT_COND (stmt))
5627 *stmt_p = build3 (COND_EXPR, void_type_node,
5628 EXIT_STMT_COND (stmt), *stmt_p, alloc_stmt_list ());
5629 return GS_OK;
5630
5631 default:
5632 gcc_unreachable ();
5633 }
5634}
5635\f
5636/* Force references to each of the entities in packages withed by GNAT_NODE.
5637 Operate recursively but check that we aren't elaborating something more
5638 than once.
5639
5640 This routine is exclusively called in type_annotate mode, to compute DDA
5641 information for types in withed units, for ASIS use. */
5642
5643static void
5644elaborate_all_entities (Node_Id gnat_node)
5645{
5646 Entity_Id gnat_with_clause, gnat_entity;
5647
5648 /* Process each unit only once. As we trace the context of all relevant
5649 units transitively, including generic bodies, we may encounter the
5650 same generic unit repeatedly. */
5651 if (!present_gnu_tree (gnat_node))
5652 save_gnu_tree (gnat_node, integer_zero_node, true);
5653
5654 /* Save entities in all context units. A body may have an implicit_with
5655 on its own spec, if the context includes a child unit, so don't save
5656 the spec twice. */
5657 for (gnat_with_clause = First (Context_Items (gnat_node));
5658 Present (gnat_with_clause);
5659 gnat_with_clause = Next (gnat_with_clause))
5660 if (Nkind (gnat_with_clause) == N_With_Clause
5661 && !present_gnu_tree (Library_Unit (gnat_with_clause))
5662 && Library_Unit (gnat_with_clause) != Library_Unit (Cunit (Main_Unit)))
5663 {
5664 elaborate_all_entities (Library_Unit (gnat_with_clause));
5665
5666 if (Ekind (Entity (Name (gnat_with_clause))) == E_Package)
5667 {
5668 for (gnat_entity = First_Entity (Entity (Name (gnat_with_clause)));
5669 Present (gnat_entity);
5670 gnat_entity = Next_Entity (gnat_entity))
5671 if (Is_Public (gnat_entity)
5672 && Convention (gnat_entity) != Convention_Intrinsic
5673 && Ekind (gnat_entity) != E_Package
5674 && Ekind (gnat_entity) != E_Package_Body
5675 && Ekind (gnat_entity) != E_Operator
5676 && !(IN (Ekind (gnat_entity), Type_Kind)
5677 && !Is_Frozen (gnat_entity))
5678 && !((Ekind (gnat_entity) == E_Procedure
5679 || Ekind (gnat_entity) == E_Function)
5680 && Is_Intrinsic_Subprogram (gnat_entity))
5681 && !IN (Ekind (gnat_entity), Named_Kind)
5682 && !IN (Ekind (gnat_entity), Generic_Unit_Kind))
5683 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
5684 }
5685 else if (Ekind (Entity (Name (gnat_with_clause))) == E_Generic_Package)
5686 {
5687 Node_Id gnat_body
5688 = Corresponding_Body (Unit (Library_Unit (gnat_with_clause)));
5689
5690 /* Retrieve compilation unit node of generic body. */
5691 while (Present (gnat_body)
5692 && Nkind (gnat_body) != N_Compilation_Unit)
5693 gnat_body = Parent (gnat_body);
5694
5695 /* If body is available, elaborate its context. */
5696 if (Present (gnat_body))
5697 elaborate_all_entities (gnat_body);
5698 }
5699 }
5700
5701 if (Nkind (Unit (gnat_node)) == N_Package_Body)
5702 elaborate_all_entities (Library_Unit (gnat_node));
5703}
5704\f
5705/* Do the processing of N_Freeze_Entity, GNAT_NODE. */
5706
5707static void
5708process_freeze_entity (Node_Id gnat_node)
5709{
5710 Entity_Id gnat_entity = Entity (gnat_node);
5711 tree gnu_old;
5712 tree gnu_new;
5713 tree gnu_init
5714 = (Nkind (Declaration_Node (gnat_entity)) == N_Object_Declaration
5715 && present_gnu_tree (Declaration_Node (gnat_entity)))
5716 ? get_gnu_tree (Declaration_Node (gnat_entity)) : NULL_TREE;
5717
5718 /* If this is a package, need to generate code for the package. */
5719 if (Ekind (gnat_entity) == E_Package)
5720 {
5721 insert_code_for
5722 (Parent (Corresponding_Body
5723 (Parent (Declaration_Node (gnat_entity)))));
5724 return;
5725 }
5726
5727 /* Check for old definition after the above call. This Freeze_Node
5728 might be for one its Itypes. */
5729 gnu_old
5730 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : 0;
5731
5732 /* If this entity has an Address representation clause, GNU_OLD is the
5733 address, so discard it here. */
5734 if (Present (Address_Clause (gnat_entity)))
5735 gnu_old = 0;
5736
5737 /* Don't do anything for class-wide types they are always
5738 transformed into their root type. */
5739 if (Ekind (gnat_entity) == E_Class_Wide_Type
5740 || (Ekind (gnat_entity) == E_Class_Wide_Subtype
5741 && Present (Equivalent_Type (gnat_entity))))
5742 return;
5743
5744 /* Don't do anything for subprograms that may have been elaborated before
5745 their freeze nodes. This can happen, for example because of an inner call
5746 in an instance body, or a previous compilation of a spec for inlining
5747 purposes. */
5748 if (gnu_old
5749 && ((TREE_CODE (gnu_old) == FUNCTION_DECL
5750 && (Ekind (gnat_entity) == E_Function
5751 || Ekind (gnat_entity) == E_Procedure))
5752 || (gnu_old
5753 && TREE_CODE (TREE_TYPE (gnu_old)) == FUNCTION_TYPE
5754 && Ekind (gnat_entity) == E_Subprogram_Type)))
5755 return;
5756
5757 /* If we have a non-dummy type old tree, we have nothing to do, except
5758 aborting if this is the public view of a private type whose full view was
5759 not delayed, as this node was never delayed as it should have been. We
5760 let this happen for concurrent types and their Corresponding_Record_Type,
5761 however, because each might legitimately be elaborated before it's own
5762 freeze node, e.g. while processing the other. */
5763 if (gnu_old
5764 && !(TREE_CODE (gnu_old) == TYPE_DECL
5765 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old))))
5766 {
5767 gcc_assert ((IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
5768 && Present (Full_View (gnat_entity))
5769 && No (Freeze_Node (Full_View (gnat_entity))))
5770 || Is_Concurrent_Type (gnat_entity)
5771 || (IN (Ekind (gnat_entity), Record_Kind)
5772 && Is_Concurrent_Record_Type (gnat_entity)));
5773 return;
5774 }
5775
5776 /* Reset the saved tree, if any, and elaborate the object or type for real.
5777 If there is a full declaration, elaborate it and copy the type to
5778 GNAT_ENTITY. Likewise if this is the record subtype corresponding to
5779 a class wide type or subtype. */
5780 if (gnu_old)
5781 {
5782 save_gnu_tree (gnat_entity, NULL_TREE, false);
5783 if (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
5784 && Present (Full_View (gnat_entity))
5785 && present_gnu_tree (Full_View (gnat_entity)))
5786 save_gnu_tree (Full_View (gnat_entity), NULL_TREE, false);
5787 if (Present (Class_Wide_Type (gnat_entity))
5788 && Class_Wide_Type (gnat_entity) != gnat_entity)
5789 save_gnu_tree (Class_Wide_Type (gnat_entity), NULL_TREE, false);
5790 }
5791
5792 if (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
5793 && Present (Full_View (gnat_entity)))
5794 {
5795 gnu_new = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, 1);
5796
5797 /* Propagate back-annotations from full view to partial view. */
5798 if (Unknown_Alignment (gnat_entity))
5799 Set_Alignment (gnat_entity, Alignment (Full_View (gnat_entity)));
5800
5801 if (Unknown_Esize (gnat_entity))
5802 Set_Esize (gnat_entity, Esize (Full_View (gnat_entity)));
5803
5804 if (Unknown_RM_Size (gnat_entity))
5805 Set_RM_Size (gnat_entity, RM_Size (Full_View (gnat_entity)));
5806
5807 /* The above call may have defined this entity (the simplest example
5808 of this is when we have a private enumeral type since the bounds
5809 will have the public view. */
5810 if (!present_gnu_tree (gnat_entity))
5811 save_gnu_tree (gnat_entity, gnu_new, false);
5812 if (Present (Class_Wide_Type (gnat_entity))
5813 && Class_Wide_Type (gnat_entity) != gnat_entity)
5814 save_gnu_tree (Class_Wide_Type (gnat_entity), gnu_new, false);
5815 }
5816 else
5817 gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, 1);
5818
5819 /* If we've made any pointers to the old version of this type, we
5820 have to update them. */
5821 if (gnu_old)
5822 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
5823 TREE_TYPE (gnu_new));
5824}
5825\f
5826/* Process the list of inlined subprograms of GNAT_NODE, which is an
5827 N_Compilation_Unit. */
5828
5829static void
5830process_inlined_subprograms (Node_Id gnat_node)
5831{
5832 Entity_Id gnat_entity;
5833 Node_Id gnat_body;
5834
13669c36 5835 /* If we can inline, generate Gimple for all the inlined subprograms.
a1ab4c31 5836 Define the entity first so we set DECL_EXTERNAL. */
13669c36 5837 if (optimize > 0)
a1ab4c31
AC
5838 for (gnat_entity = First_Inlined_Subprogram (gnat_node);
5839 Present (gnat_entity);
5840 gnat_entity = Next_Inlined_Subprogram (gnat_entity))
5841 {
5842 gnat_body = Parent (Declaration_Node (gnat_entity));
5843
5844 if (Nkind (gnat_body) != N_Subprogram_Body)
5845 {
5846 /* ??? This really should always be Present. */
5847 if (No (Corresponding_Body (gnat_body)))
5848 continue;
5849
5850 gnat_body
5851 = Parent (Declaration_Node (Corresponding_Body (gnat_body)));
5852 }
5853
5854 if (Present (gnat_body))
5855 {
5856 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
5857 add_stmt (gnat_to_gnu (gnat_body));
5858 }
5859 }
5860}
5861\f
5862/* Elaborate decls in the lists GNAT_DECLS and GNAT_DECLS2, if present.
5863 We make two passes, one to elaborate anything other than bodies (but
5864 we declare a function if there was no spec). The second pass
5865 elaborates the bodies.
5866
5867 GNAT_END_LIST gives the element in the list past the end. Normally,
5868 this is Empty, but can be First_Real_Statement for a
5869 Handled_Sequence_Of_Statements.
5870
5871 We make a complete pass through both lists if PASS1P is true, then make
5872 the second pass over both lists if PASS2P is true. The lists usually
5873 correspond to the public and private parts of a package. */
5874
5875static void
5876process_decls (List_Id gnat_decls, List_Id gnat_decls2,
5877 Node_Id gnat_end_list, bool pass1p, bool pass2p)
5878{
5879 List_Id gnat_decl_array[2];
5880 Node_Id gnat_decl;
5881 int i;
5882
5883 gnat_decl_array[0] = gnat_decls, gnat_decl_array[1] = gnat_decls2;
5884
5885 if (pass1p)
5886 for (i = 0; i <= 1; i++)
5887 if (Present (gnat_decl_array[i]))
5888 for (gnat_decl = First (gnat_decl_array[i]);
5889 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
5890 {
5891 /* For package specs, we recurse inside the declarations,
5892 thus taking the two pass approach inside the boundary. */
5893 if (Nkind (gnat_decl) == N_Package_Declaration
5894 && (Nkind (Specification (gnat_decl)
5895 == N_Package_Specification)))
5896 process_decls (Visible_Declarations (Specification (gnat_decl)),
5897 Private_Declarations (Specification (gnat_decl)),
5898 Empty, true, false);
5899
5900 /* Similarly for any declarations in the actions of a
5901 freeze node. */
5902 else if (Nkind (gnat_decl) == N_Freeze_Entity)
5903 {
5904 process_freeze_entity (gnat_decl);
5905 process_decls (Actions (gnat_decl), Empty, Empty, true, false);
5906 }
5907
5908 /* Package bodies with freeze nodes get their elaboration deferred
5909 until the freeze node, but the code must be placed in the right
5910 place, so record the code position now. */
5911 else if (Nkind (gnat_decl) == N_Package_Body
5912 && Present (Freeze_Node (Corresponding_Spec (gnat_decl))))
5913 record_code_position (gnat_decl);
5914
5915 else if (Nkind (gnat_decl) == N_Package_Body_Stub
5916 && Present (Library_Unit (gnat_decl))
5917 && Present (Freeze_Node
5918 (Corresponding_Spec
5919 (Proper_Body (Unit
5920 (Library_Unit (gnat_decl)))))))
5921 record_code_position
5922 (Proper_Body (Unit (Library_Unit (gnat_decl))));
5923
5924 /* We defer most subprogram bodies to the second pass. */
5925 else if (Nkind (gnat_decl) == N_Subprogram_Body)
5926 {
5927 if (Acts_As_Spec (gnat_decl))
5928 {
5929 Node_Id gnat_subprog_id = Defining_Entity (gnat_decl);
5930
5931 if (Ekind (gnat_subprog_id) != E_Generic_Procedure
5932 && Ekind (gnat_subprog_id) != E_Generic_Function)
5933 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
5934 }
5935 }
5936 /* For bodies and stubs that act as their own specs, the entity
5937 itself must be elaborated in the first pass, because it may
5938 be used in other declarations. */
5939 else if (Nkind (gnat_decl) == N_Subprogram_Body_Stub)
5940 {
5941 Node_Id gnat_subprog_id =
5942 Defining_Entity (Specification (gnat_decl));
5943
5944 if (Ekind (gnat_subprog_id) != E_Subprogram_Body
5945 && Ekind (gnat_subprog_id) != E_Generic_Procedure
5946 && Ekind (gnat_subprog_id) != E_Generic_Function)
5947 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
5948 }
5949
5950 /* Concurrent stubs stand for the corresponding subprogram bodies,
5951 which are deferred like other bodies. */
5952 else if (Nkind (gnat_decl) == N_Task_Body_Stub
5953 || Nkind (gnat_decl) == N_Protected_Body_Stub)
5954 ;
5955 else
5956 add_stmt (gnat_to_gnu (gnat_decl));
5957 }
5958
5959 /* Here we elaborate everything we deferred above except for package bodies,
5960 which are elaborated at their freeze nodes. Note that we must also
5961 go inside things (package specs and freeze nodes) the first pass did. */
5962 if (pass2p)
5963 for (i = 0; i <= 1; i++)
5964 if (Present (gnat_decl_array[i]))
5965 for (gnat_decl = First (gnat_decl_array[i]);
5966 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
5967 {
5968 if (Nkind (gnat_decl) == N_Subprogram_Body
5969 || Nkind (gnat_decl) == N_Subprogram_Body_Stub
5970 || Nkind (gnat_decl) == N_Task_Body_Stub
5971 || Nkind (gnat_decl) == N_Protected_Body_Stub)
5972 add_stmt (gnat_to_gnu (gnat_decl));
5973
5974 else if (Nkind (gnat_decl) == N_Package_Declaration
5975 && (Nkind (Specification (gnat_decl)
5976 == N_Package_Specification)))
5977 process_decls (Visible_Declarations (Specification (gnat_decl)),
5978 Private_Declarations (Specification (gnat_decl)),
5979 Empty, false, true);
5980
5981 else if (Nkind (gnat_decl) == N_Freeze_Entity)
5982 process_decls (Actions (gnat_decl), Empty, Empty, false, true);
5983 }
5984}
5985\f
b666e568 5986/* Make a unary operation of kind CODE using build_unary_op, but guard
a7c43bbc
EB
5987 the operation by an overflow check. CODE can be one of NEGATE_EXPR
5988 or ABS_EXPR. GNU_TYPE is the type desired for the result. Usually
5989 the operation is to be performed in that type. */
b666e568
GB
5990
5991static tree
a7c43bbc 5992build_unary_op_trapv (enum tree_code code, tree gnu_type, tree operand)
b666e568 5993{
a7c43bbc 5994 gcc_assert (code == NEGATE_EXPR || code == ABS_EXPR);
b666e568 5995
d628c015 5996 operand = protect_multiple_eval (operand);
b666e568
GB
5997
5998 return emit_check (build_binary_op (EQ_EXPR, integer_type_node,
5999 operand, TYPE_MIN_VALUE (gnu_type)),
6000 build_unary_op (code, gnu_type, operand),
6001 CE_Overflow_Check_Failed);
6002}
6003
a7c43bbc
EB
6004/* Make a binary operation of kind CODE using build_binary_op, but guard
6005 the operation by an overflow check. CODE can be one of PLUS_EXPR,
6006 MINUS_EXPR or MULT_EXPR. GNU_TYPE is the type desired for the result.
6007 Usually the operation is to be performed in that type. */
b666e568
GB
6008
6009static tree
a7c43bbc 6010build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
b666e568
GB
6011 tree right)
6012{
d628c015
DR
6013 tree lhs = protect_multiple_eval (left);
6014 tree rhs = protect_multiple_eval (right);
b666e568
GB
6015 tree type_max = TYPE_MAX_VALUE (gnu_type);
6016 tree type_min = TYPE_MIN_VALUE (gnu_type);
6017 tree gnu_expr;
6018 tree tmp1, tmp2;
6019 tree zero = convert (gnu_type, integer_zero_node);
4ae39383 6020 tree rhs_lt_zero;
b666e568
GB
6021 tree check_pos;
6022 tree check_neg;
4ae39383 6023 tree check;
b666e568
GB
6024 int precision = TYPE_PRECISION (gnu_type);
6025
4ae39383 6026 gcc_assert (!(precision & (precision - 1))); /* ensure power of 2 */
b666e568 6027
a7c43bbc 6028 /* Prefer a constant or known-positive rhs to simplify checks. */
4ae39383
GB
6029 if (!TREE_CONSTANT (rhs)
6030 && commutative_tree_code (code)
6031 && (TREE_CONSTANT (lhs) || (!tree_expr_nonnegative_p (rhs)
6032 && tree_expr_nonnegative_p (lhs))))
b666e568 6033 {
a7c43bbc
EB
6034 tree tmp = lhs;
6035 lhs = rhs;
6036 rhs = tmp;
4ae39383
GB
6037 }
6038
6039 rhs_lt_zero = tree_expr_nonnegative_p (rhs)
a7c43bbc
EB
6040 ? integer_zero_node
6041 : build_binary_op (LT_EXPR, integer_type_node, rhs, zero);
4ae39383 6042
a7c43bbc 6043 /* ??? Should use more efficient check for operand_equal_p (lhs, rhs, 0) */
b666e568 6044
4ae39383 6045 /* Try a few strategies that may be cheaper than the general
a7c43bbc 6046 code at the end of the function, if the rhs is not known.
4ae39383
GB
6047 The strategies are:
6048 - Call library function for 64-bit multiplication (complex)
6049 - Widen, if input arguments are sufficiently small
a7c43bbc 6050 - Determine overflow using wrapped result for addition/subtraction. */
b666e568
GB
6051
6052 if (!TREE_CONSTANT (rhs))
6053 {
a7c43bbc 6054 /* Even for add/subtract double size to get another base type. */
4ae39383 6055 int needed_precision = precision * 2;
b666e568
GB
6056
6057 if (code == MULT_EXPR && precision == 64)
58e94443
GB
6058 {
6059 tree int_64 = gnat_type_for_size (64, 0);
6060
6061 return convert (gnu_type, build_call_2_expr (mulv64_decl,
6062 convert (int_64, lhs),
6063 convert (int_64, rhs)));
6064 }
a7c43bbc 6065
4ae39383
GB
6066 else if (needed_precision <= BITS_PER_WORD
6067 || (code == MULT_EXPR
6068 && needed_precision <= LONG_LONG_TYPE_SIZE))
b666e568 6069 {
4ae39383 6070 tree wide_type = gnat_type_for_size (needed_precision, 0);
b666e568 6071
4ae39383
GB
6072 tree wide_result = build_binary_op (code, wide_type,
6073 convert (wide_type, lhs),
6074 convert (wide_type, rhs));
b666e568 6075
4ae39383 6076 tree check = build_binary_op
b666e568 6077 (TRUTH_ORIF_EXPR, integer_type_node,
4ae39383
GB
6078 build_binary_op (LT_EXPR, integer_type_node, wide_result,
6079 convert (wide_type, type_min)),
6080 build_binary_op (GT_EXPR, integer_type_node, wide_result,
6081 convert (wide_type, type_max)));
6082
6083 tree result = convert (gnu_type, wide_result);
b666e568 6084
b666e568
GB
6085 return emit_check (check, result, CE_Overflow_Check_Failed);
6086 }
a7c43bbc 6087
4ae39383
GB
6088 else if (code == PLUS_EXPR || code == MINUS_EXPR)
6089 {
6090 tree unsigned_type = gnat_type_for_size (precision, 1);
6091 tree wrapped_expr = convert
6092 (gnu_type, build_binary_op (code, unsigned_type,
6093 convert (unsigned_type, lhs),
6094 convert (unsigned_type, rhs)));
b666e568 6095
4ae39383
GB
6096 tree result = convert
6097 (gnu_type, build_binary_op (code, gnu_type, lhs, rhs));
6098
6099 /* Overflow when (rhs < 0) ^ (wrapped_expr < lhs)), for addition
a7c43bbc 6100 or when (rhs < 0) ^ (wrapped_expr > lhs) for subtraction. */
4ae39383
GB
6101 tree check = build_binary_op
6102 (TRUTH_XOR_EXPR, integer_type_node, rhs_lt_zero,
6103 build_binary_op (code == PLUS_EXPR ? LT_EXPR : GT_EXPR,
6104 integer_type_node, wrapped_expr, lhs));
6105
6106 return emit_check (check, result, CE_Overflow_Check_Failed);
6107 }
6108 }
b666e568
GB
6109
6110 switch (code)
6111 {
6112 case PLUS_EXPR:
a7c43bbc 6113 /* When rhs >= 0, overflow when lhs > type_max - rhs. */
b666e568
GB
6114 check_pos = build_binary_op (GT_EXPR, integer_type_node, lhs,
6115 build_binary_op (MINUS_EXPR, gnu_type,
6116 type_max, rhs)),
6117
a7c43bbc 6118 /* When rhs < 0, overflow when lhs < type_min - rhs. */
b666e568
GB
6119 check_neg = build_binary_op (LT_EXPR, integer_type_node, lhs,
6120 build_binary_op (MINUS_EXPR, gnu_type,
6121 type_min, rhs));
6122 break;
6123
6124 case MINUS_EXPR:
a7c43bbc 6125 /* When rhs >= 0, overflow when lhs < type_min + rhs. */
b666e568
GB
6126 check_pos = build_binary_op (LT_EXPR, integer_type_node, lhs,
6127 build_binary_op (PLUS_EXPR, gnu_type,
6128 type_min, rhs)),
6129
a7c43bbc 6130 /* When rhs < 0, overflow when lhs > type_max + rhs. */
b666e568
GB
6131 check_neg = build_binary_op (GT_EXPR, integer_type_node, lhs,
6132 build_binary_op (PLUS_EXPR, gnu_type,
6133 type_max, rhs));
6134 break;
6135
6136 case MULT_EXPR:
6137 /* The check here is designed to be efficient if the rhs is constant,
4ae39383 6138 but it will work for any rhs by using integer division.
b666e568
GB
6139 Four different check expressions determine wether X * C overflows,
6140 depending on C.
6141 C == 0 => false
6142 C > 0 => X > type_max / C || X < type_min / C
6143 C == -1 => X == type_min
6144 C < -1 => X > type_min / C || X < type_max / C */
6145
6146 tmp1 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_max, rhs);
6147 tmp2 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_min, rhs);
6148
6149 check_pos = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
6150 build_binary_op (NE_EXPR, integer_type_node, zero, rhs),
6151 build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
6152 build_binary_op (GT_EXPR, integer_type_node, lhs, tmp1),
6153 build_binary_op (LT_EXPR, integer_type_node, lhs, tmp2)));
6154
6155 check_neg = fold_build3 (COND_EXPR, integer_type_node,
6156 build_binary_op (EQ_EXPR, integer_type_node, rhs,
6157 build_int_cst (gnu_type, -1)),
6158 build_binary_op (EQ_EXPR, integer_type_node, lhs, type_min),
6159 build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
6160 build_binary_op (GT_EXPR, integer_type_node, lhs, tmp2),
6161 build_binary_op (LT_EXPR, integer_type_node, lhs, tmp1)));
6162 break;
6163
6164 default:
6165 gcc_unreachable();
6166 }
6167
4ae39383
GB
6168 gnu_expr = build_binary_op (code, gnu_type, lhs, rhs);
6169
2575024c 6170 /* If we can fold the expression to a constant, just return it.
a7c43bbc
EB
6171 The caller will deal with overflow, no need to generate a check. */
6172 if (TREE_CONSTANT (gnu_expr))
6173 return gnu_expr;
2575024c 6174
4ae39383
GB
6175 check = fold_build3 (COND_EXPR, integer_type_node,
6176 rhs_lt_zero, check_neg, check_pos);
6177
6178 return emit_check (check, gnu_expr, CE_Overflow_Check_Failed);
b666e568
GB
6179}
6180
a7c43bbc 6181/* Emit code for a range check. GNU_EXPR is the expression to be checked,
a1ab4c31 6182 GNAT_RANGE_TYPE the gnat type or subtype containing the bounds against
a7c43bbc 6183 which we have to check. */
a1ab4c31
AC
6184
6185static tree
6186emit_range_check (tree gnu_expr, Entity_Id gnat_range_type)
6187{
6188 tree gnu_range_type = get_unpadded_type (gnat_range_type);
6189 tree gnu_low = TYPE_MIN_VALUE (gnu_range_type);
6190 tree gnu_high = TYPE_MAX_VALUE (gnu_range_type);
6191 tree gnu_compare_type = get_base_type (TREE_TYPE (gnu_expr));
6192
6193 /* If GNU_EXPR has GNAT_RANGE_TYPE as its base type, no check is needed.
6194 This can for example happen when translating 'Val or 'Value. */
6195 if (gnu_compare_type == gnu_range_type)
6196 return gnu_expr;
6197
6198 /* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
6199 we can't do anything since we might be truncating the bounds. No
6200 check is needed in this case. */
6201 if (INTEGRAL_TYPE_P (TREE_TYPE (gnu_expr))
6202 && (TYPE_PRECISION (gnu_compare_type)
6203 < TYPE_PRECISION (get_base_type (gnu_range_type))))
6204 return gnu_expr;
6205
6206 /* Checked expressions must be evaluated only once. */
6207 gnu_expr = protect_multiple_eval (gnu_expr);
6208
6209 /* There's no good type to use here, so we might as well use
6210 integer_type_node. Note that the form of the check is
6211 (not (expr >= lo)) or (not (expr <= hi))
6212 the reason for this slightly convoluted form is that NaNs
6213 are not considered to be in range in the float case. */
6214 return emit_check
6215 (build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
6216 invert_truthvalue
6217 (build_binary_op (GE_EXPR, integer_type_node,
6218 convert (gnu_compare_type, gnu_expr),
6219 convert (gnu_compare_type, gnu_low))),
6220 invert_truthvalue
6221 (build_binary_op (LE_EXPR, integer_type_node,
6222 convert (gnu_compare_type, gnu_expr),
6223 convert (gnu_compare_type,
6224 gnu_high)))),
6225 gnu_expr, CE_Range_Check_Failed);
6226}
6227\f
6228/* Emit code for an index check. GNU_ARRAY_OBJECT is the array object
6229 which we are about to index, GNU_EXPR is the index expression to be
6230 checked, GNU_LOW and GNU_HIGH are the lower and upper bounds
6231 against which GNU_EXPR has to be checked. Note that for index
6232 checking we cannot use the emit_range_check function (although very
6233 similar code needs to be generated in both cases) since for index
6234 checking the array type against which we are checking the indices
6235 may be unconstrained and consequently we need to retrieve the
6236 actual index bounds from the array object itself
6237 (GNU_ARRAY_OBJECT). The place where we need to do that is in
6238 subprograms having unconstrained array formal parameters */
6239
6240static tree
6241emit_index_check (tree gnu_array_object,
6242 tree gnu_expr,
6243 tree gnu_low,
6244 tree gnu_high)
6245{
6246 tree gnu_expr_check;
6247
6248 /* Checked expressions must be evaluated only once. */
6249 gnu_expr = protect_multiple_eval (gnu_expr);
6250
6251 /* Must do this computation in the base type in case the expression's
6252 type is an unsigned subtypes. */
6253 gnu_expr_check = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
6254
6255 /* If GNU_LOW or GNU_HIGH are a PLACEHOLDER_EXPR, qualify them by
6256 the object we are handling. */
6257 gnu_low = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_low, gnu_array_object);
6258 gnu_high = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_high, gnu_array_object);
6259
6260 /* There's no good type to use here, so we might as well use
6261 integer_type_node. */
6262 return emit_check
6263 (build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
6264 build_binary_op (LT_EXPR, integer_type_node,
6265 gnu_expr_check,
6266 convert (TREE_TYPE (gnu_expr_check),
6267 gnu_low)),
6268 build_binary_op (GT_EXPR, integer_type_node,
6269 gnu_expr_check,
6270 convert (TREE_TYPE (gnu_expr_check),
6271 gnu_high))),
6272 gnu_expr, CE_Index_Check_Failed);
6273}
6274\f
6275/* GNU_COND contains the condition corresponding to an access, discriminant or
6276 range check of value GNU_EXPR. Build a COND_EXPR that returns GNU_EXPR if
6277 GNU_COND is false and raises a CONSTRAINT_ERROR if GNU_COND is true.
6278 REASON is the code that says why the exception was raised. */
6279
6280static tree
6281emit_check (tree gnu_cond, tree gnu_expr, int reason)
6282{
82f7c45f
GB
6283 tree gnu_call = build_call_raise (reason, Empty, N_Raise_Constraint_Error);
6284 tree gnu_result
6285 = fold_build3 (COND_EXPR, TREE_TYPE (gnu_expr), gnu_cond,
6286 build2 (COMPOUND_EXPR, TREE_TYPE (gnu_expr), gnu_call,
6287 convert (TREE_TYPE (gnu_expr), integer_zero_node)),
6288 gnu_expr);
a1ab4c31 6289
82f7c45f
GB
6290 /* GNU_RESULT has side effects if and only if GNU_EXPR has:
6291 we don't need to evaluate it just for the check. */
6292 TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr);
a1ab4c31 6293
7348f18c
GB
6294 /* ??? Unfortunately, if we don't put a SAVE_EXPR around this whole thing,
6295 we will repeatedly do the test and, at compile time, we will repeatedly
6296 visit it during unsharing, which leads to an exponential explosion. */
6297 return save_expr (gnu_result);
a1ab4c31
AC
6298}
6299\f
6300/* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing
6301 overflow checks if OVERFLOW_P is nonzero and range checks if
6302 RANGE_P is nonzero. GNAT_TYPE is known to be an integral type.
6303 If TRUNCATE_P is nonzero, do a float to integer conversion with
6304 truncation; otherwise round. */
6305
6306static tree
6307convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp,
6308 bool rangep, bool truncatep)
6309{
6310 tree gnu_type = get_unpadded_type (gnat_type);
6311 tree gnu_in_type = TREE_TYPE (gnu_expr);
6312 tree gnu_in_basetype = get_base_type (gnu_in_type);
6313 tree gnu_base_type = get_base_type (gnu_type);
6314 tree gnu_result = gnu_expr;
6315
6316 /* If we are not doing any checks, the output is an integral type, and
6317 the input is not a floating type, just do the conversion. This
6318 shortcut is required to avoid problems with packed array types
6319 and simplifies code in all cases anyway. */
6320 if (!rangep && !overflowp && INTEGRAL_TYPE_P (gnu_base_type)
6321 && !FLOAT_TYPE_P (gnu_in_type))
6322 return convert (gnu_type, gnu_expr);
6323
6324 /* First convert the expression to its base type. This
6325 will never generate code, but makes the tests below much simpler.
6326 But don't do this if converting from an integer type to an unconstrained
6327 array type since then we need to get the bounds from the original
6328 (unpacked) type. */
6329 if (TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE)
6330 gnu_result = convert (gnu_in_basetype, gnu_result);
6331
6332 /* If overflow checks are requested, we need to be sure the result will
6333 fit in the output base type. But don't do this if the input
6334 is integer and the output floating-point. */
6335 if (overflowp
6336 && !(FLOAT_TYPE_P (gnu_base_type) && INTEGRAL_TYPE_P (gnu_in_basetype)))
6337 {
6338 /* Ensure GNU_EXPR only gets evaluated once. */
6339 tree gnu_input = protect_multiple_eval (gnu_result);
6340 tree gnu_cond = integer_zero_node;
6341 tree gnu_in_lb = TYPE_MIN_VALUE (gnu_in_basetype);
6342 tree gnu_in_ub = TYPE_MAX_VALUE (gnu_in_basetype);
6343 tree gnu_out_lb = TYPE_MIN_VALUE (gnu_base_type);
6344 tree gnu_out_ub = TYPE_MAX_VALUE (gnu_base_type);
6345
6346 /* Convert the lower bounds to signed types, so we're sure we're
6347 comparing them properly. Likewise, convert the upper bounds
6348 to unsigned types. */
6349 if (INTEGRAL_TYPE_P (gnu_in_basetype) && TYPE_UNSIGNED (gnu_in_basetype))
6350 gnu_in_lb = convert (gnat_signed_type (gnu_in_basetype), gnu_in_lb);
6351
6352 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6353 && !TYPE_UNSIGNED (gnu_in_basetype))
6354 gnu_in_ub = convert (gnat_unsigned_type (gnu_in_basetype), gnu_in_ub);
6355
6356 if (INTEGRAL_TYPE_P (gnu_base_type) && TYPE_UNSIGNED (gnu_base_type))
6357 gnu_out_lb = convert (gnat_signed_type (gnu_base_type), gnu_out_lb);
6358
6359 if (INTEGRAL_TYPE_P (gnu_base_type) && !TYPE_UNSIGNED (gnu_base_type))
6360 gnu_out_ub = convert (gnat_unsigned_type (gnu_base_type), gnu_out_ub);
6361
6362 /* Check each bound separately and only if the result bound
6363 is tighter than the bound on the input type. Note that all the
6364 types are base types, so the bounds must be constant. Also,
6365 the comparison is done in the base type of the input, which
6366 always has the proper signedness. First check for input
6367 integer (which means output integer), output float (which means
6368 both float), or mixed, in which case we always compare.
6369 Note that we have to do the comparison which would *fail* in the
6370 case of an error since if it's an FP comparison and one of the
6371 values is a NaN or Inf, the comparison will fail. */
6372 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6373 ? tree_int_cst_lt (gnu_in_lb, gnu_out_lb)
6374 : (FLOAT_TYPE_P (gnu_base_type)
6375 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_in_lb),
6376 TREE_REAL_CST (gnu_out_lb))
6377 : 1))
6378 gnu_cond
6379 = invert_truthvalue
6380 (build_binary_op (GE_EXPR, integer_type_node,
6381 gnu_input, convert (gnu_in_basetype,
6382 gnu_out_lb)));
6383
6384 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6385 ? tree_int_cst_lt (gnu_out_ub, gnu_in_ub)
6386 : (FLOAT_TYPE_P (gnu_base_type)
6387 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_out_ub),
6388 TREE_REAL_CST (gnu_in_lb))
6389 : 1))
6390 gnu_cond
6391 = build_binary_op (TRUTH_ORIF_EXPR, integer_type_node, gnu_cond,
6392 invert_truthvalue
6393 (build_binary_op (LE_EXPR, integer_type_node,
6394 gnu_input,
6395 convert (gnu_in_basetype,
6396 gnu_out_ub))));
6397
6398 if (!integer_zerop (gnu_cond))
6399 gnu_result = emit_check (gnu_cond, gnu_input,
6400 CE_Overflow_Check_Failed);
6401 }
6402
6403 /* Now convert to the result base type. If this is a non-truncating
6404 float-to-integer conversion, round. */
6405 if (INTEGRAL_TYPE_P (gnu_base_type) && FLOAT_TYPE_P (gnu_in_basetype)
6406 && !truncatep)
6407 {
6408 REAL_VALUE_TYPE half_minus_pred_half, pred_half;
6409 tree gnu_conv, gnu_zero, gnu_comp, gnu_saved_result, calc_type;
6410 tree gnu_pred_half, gnu_add_pred_half, gnu_subtract_pred_half;
6411 const struct real_format *fmt;
6412
6413 /* The following calculations depend on proper rounding to even
6414 of each arithmetic operation. In order to prevent excess
6415 precision from spoiling this property, use the widest hardware
6eca32ba 6416 floating-point type if FP_ARITH_MAY_WIDEN is true. */
a1ab4c31 6417
6eca32ba
GB
6418 calc_type = (FP_ARITH_MAY_WIDEN ? longest_float_type_node
6419 : gnu_in_basetype);
a1ab4c31 6420
a1ab4c31
AC
6421 /* FIXME: Should not have padding in the first place */
6422 if (TREE_CODE (calc_type) == RECORD_TYPE
6423 && TYPE_IS_PADDING_P (calc_type))
6424 calc_type = TREE_TYPE (TYPE_FIELDS (calc_type));
6425
6426 /* Compute the exact value calc_type'Pred (0.5) at compile time. */
6427 fmt = REAL_MODE_FORMAT (TYPE_MODE (calc_type));
6428 real_2expN (&half_minus_pred_half, -(fmt->p) - 1, TYPE_MODE (calc_type));
6429 REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf,
6430 half_minus_pred_half);
6431 gnu_pred_half = build_real (calc_type, pred_half);
6432
6433 /* If the input is strictly negative, subtract this value
6434 and otherwise add it from the input. For 0.5, the result
6435 is exactly between 1.0 and the machine number preceding 1.0
6436 (for calc_type). Since the last bit of 1.0 is even, this 0.5
6437 will round to 1.0, while all other number with an absolute
6438 value less than 0.5 round to 0.0. For larger numbers exactly
6439 halfway between integers, rounding will always be correct as
6440 the true mathematical result will be closer to the higher
6441 integer compared to the lower one. So, this constant works
6442 for all floating-point numbers.
6443
6444 The reason to use the same constant with subtract/add instead
6445 of a positive and negative constant is to allow the comparison
6446 to be scheduled in parallel with retrieval of the constant and
6447 conversion of the input to the calc_type (if necessary).
6448 */
6449
6450 gnu_zero = convert (gnu_in_basetype, integer_zero_node);
6451 gnu_saved_result = save_expr (gnu_result);
6452 gnu_conv = convert (calc_type, gnu_saved_result);
6453 gnu_comp = build2 (GE_EXPR, integer_type_node,
6454 gnu_saved_result, gnu_zero);
6455 gnu_add_pred_half
6456 = build2 (PLUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
6457 gnu_subtract_pred_half
6458 = build2 (MINUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
6459 gnu_result = build3 (COND_EXPR, calc_type, gnu_comp,
6460 gnu_add_pred_half, gnu_subtract_pred_half);
6461 }
6462
6463 if (TREE_CODE (gnu_base_type) == INTEGER_TYPE
6464 && TYPE_HAS_ACTUAL_BOUNDS_P (gnu_base_type)
6465 && TREE_CODE (gnu_result) == UNCONSTRAINED_ARRAY_REF)
6466 gnu_result = unchecked_convert (gnu_base_type, gnu_result, false);
6467 else
6468 gnu_result = convert (gnu_base_type, gnu_result);
6469
6470 /* Finally, do the range check if requested. Note that if the
6471 result type is a modular type, the range check is actually
6472 an overflow check. */
6473
6474 if (rangep
6475 || (TREE_CODE (gnu_base_type) == INTEGER_TYPE
6476 && TYPE_MODULAR_P (gnu_base_type) && overflowp))
6477 gnu_result = emit_range_check (gnu_result, gnat_type);
6478
6479 return convert (gnu_type, gnu_result);
6480}
6481\f
6482/* Return true if TYPE is a smaller packable version of RECORD_TYPE. */
6483
6484static bool
6485smaller_packable_type_p (tree type, tree record_type)
6486{
6487 tree size, rsize;
6488
6489 /* We're not interested in variants here. */
6490 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (record_type))
6491 return false;
6492
6493 /* Like a variant, a packable version keeps the original TYPE_NAME. */
6494 if (TYPE_NAME (type) != TYPE_NAME (record_type))
6495 return false;
6496
6497 size = TYPE_SIZE (type);
6498 rsize = TYPE_SIZE (record_type);
6499
6500 if (!(TREE_CODE (size) == INTEGER_CST && TREE_CODE (rsize) == INTEGER_CST))
6501 return false;
6502
6503 return tree_int_cst_lt (size, rsize) != 0;
6504}
6505
6506/* Return true if GNU_EXPR can be directly addressed. This is the case
6507 unless it is an expression involving computation or if it involves a
6508 reference to a bitfield or to an object not sufficiently aligned for
6509 its type. If GNU_TYPE is non-null, return true only if GNU_EXPR can
6510 be directly addressed as an object of this type.
6511
6512 *** Notes on addressability issues in the Ada compiler ***
6513
6514 This predicate is necessary in order to bridge the gap between Gigi
6515 and the middle-end about addressability of GENERIC trees. A tree
6516 is said to be addressable if it can be directly addressed, i.e. if
6517 its address can be taken, is a multiple of the type's alignment on
6518 strict-alignment architectures and returns the first storage unit
6519 assigned to the object represented by the tree.
6520
6521 In the C family of languages, everything is in practice addressable
6522 at the language level, except for bit-fields. This means that these
6523 compilers will take the address of any tree that doesn't represent
6524 a bit-field reference and expect the result to be the first storage
6525 unit assigned to the object. Even in cases where this will result
6526 in unaligned accesses at run time, nothing is supposed to be done
6527 and the program is considered as erroneous instead (see PR c/18287).
6528
6529 The implicit assumptions made in the middle-end are in keeping with
6530 the C viewpoint described above:
6531 - the address of a bit-field reference is supposed to be never
6532 taken; the compiler (generally) will stop on such a construct,
6533 - any other tree is addressable if it is formally addressable,
6534 i.e. if it is formally allowed to be the operand of ADDR_EXPR.
6535
6536 In Ada, the viewpoint is the opposite one: nothing is addressable
6537 at the language level unless explicitly declared so. This means
6538 that the compiler will both make sure that the trees representing
6539 references to addressable ("aliased" in Ada parlance) objects are
6540 addressable and make no real attempts at ensuring that the trees
6541 representing references to non-addressable objects are addressable.
6542
6543 In the first case, Ada is effectively equivalent to C and handing
6544 down the direct result of applying ADDR_EXPR to these trees to the
6545 middle-end works flawlessly. In the second case, Ada cannot afford
6546 to consider the program as erroneous if the address of trees that
6547 are not addressable is requested for technical reasons, unlike C;
6548 as a consequence, the Ada compiler must arrange for either making
6549 sure that this address is not requested in the middle-end or for
6550 compensating by inserting temporaries if it is requested in Gigi.
6551
6552 The first goal can be achieved because the middle-end should not
6553 request the address of non-addressable trees on its own; the only
6554 exception is for the invocation of low-level block operations like
6555 memcpy, for which the addressability requirements are lower since
6556 the type's alignment can be disregarded. In practice, this means
6557 that Gigi must make sure that such operations cannot be applied to
6558 non-BLKmode bit-fields.
6559
6560 The second goal is achieved by means of the addressable_p predicate
6561 and by inserting SAVE_EXPRs around trees deemed non-addressable.
6562 They will be turned during gimplification into proper temporaries
6563 whose address will be used in lieu of that of the original tree. */
6564
6565static bool
6566addressable_p (tree gnu_expr, tree gnu_type)
6567{
6568 /* The size of the real type of the object must not be smaller than
6569 that of the expected type, otherwise an indirect access in the
6570 latter type would be larger than the object. Only records need
6571 to be considered in practice. */
6572 if (gnu_type
6573 && TREE_CODE (gnu_type) == RECORD_TYPE
6574 && smaller_packable_type_p (TREE_TYPE (gnu_expr), gnu_type))
6575 return false;
6576
6577 switch (TREE_CODE (gnu_expr))
6578 {
6579 case VAR_DECL:
6580 case PARM_DECL:
6581 case FUNCTION_DECL:
6582 case RESULT_DECL:
6583 /* All DECLs are addressable: if they are in a register, we can force
6584 them to memory. */
6585 return true;
6586
6587 case UNCONSTRAINED_ARRAY_REF:
6588 case INDIRECT_REF:
6589 case CONSTRUCTOR:
6590 case STRING_CST:
6591 case INTEGER_CST:
6592 case NULL_EXPR:
6593 case SAVE_EXPR:
6594 case CALL_EXPR:
6595 return true;
6596
6597 case COND_EXPR:
6598 /* We accept &COND_EXPR as soon as both operands are addressable and
6599 expect the outcome to be the address of the selected operand. */
6600 return (addressable_p (TREE_OPERAND (gnu_expr, 1), NULL_TREE)
6601 && addressable_p (TREE_OPERAND (gnu_expr, 2), NULL_TREE));
6602
6603 case COMPONENT_REF:
6604 return (((!DECL_BIT_FIELD (TREE_OPERAND (gnu_expr, 1))
6605 /* Even with DECL_BIT_FIELD cleared, we have to ensure that
6606 the field is sufficiently aligned, in case it is subject
6607 to a pragma Component_Alignment. But we don't need to
6608 check the alignment of the containing record, as it is
6609 guaranteed to be not smaller than that of its most
6610 aligned field that is not a bit-field. */
6611 && (!STRICT_ALIGNMENT
6612 || DECL_ALIGN (TREE_OPERAND (gnu_expr, 1))
6613 >= TYPE_ALIGN (TREE_TYPE (gnu_expr))))
6614 /* The field of a padding record is always addressable. */
6615 || TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))
6616 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
6617
6618 case ARRAY_REF: case ARRAY_RANGE_REF:
6619 case REALPART_EXPR: case IMAGPART_EXPR:
6620 case NOP_EXPR:
6621 return addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE);
6622
6623 case CONVERT_EXPR:
6624 return (AGGREGATE_TYPE_P (TREE_TYPE (gnu_expr))
6625 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
6626
6627 case VIEW_CONVERT_EXPR:
6628 {
6629 /* This is addressable if we can avoid a copy. */
6630 tree type = TREE_TYPE (gnu_expr);
6631 tree inner_type = TREE_TYPE (TREE_OPERAND (gnu_expr, 0));
6632 return (((TYPE_MODE (type) == TYPE_MODE (inner_type)
6633 && (!STRICT_ALIGNMENT
6634 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
6635 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT))
6636 || ((TYPE_MODE (type) == BLKmode
6637 || TYPE_MODE (inner_type) == BLKmode)
6638 && (!STRICT_ALIGNMENT
6639 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
6640 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT
6641 || TYPE_ALIGN_OK (type)
6642 || TYPE_ALIGN_OK (inner_type))))
6643 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
6644 }
6645
6646 default:
6647 return false;
6648 }
6649}
6650\f
6651/* Do the processing for the declaration of a GNAT_ENTITY, a type. If
6652 a separate Freeze node exists, delay the bulk of the processing. Otherwise
6653 make a GCC type for GNAT_ENTITY and set up the correspondence. */
6654
6655void
6656process_type (Entity_Id gnat_entity)
6657{
6658 tree gnu_old
6659 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : 0;
6660 tree gnu_new;
6661
6662 /* If we are to delay elaboration of this type, just do any
6663 elaborations needed for expressions within the declaration and
6664 make a dummy type entry for this node and its Full_View (if
6665 any) in case something points to it. Don't do this if it
6666 has already been done (the only way that can happen is if
6667 the private completion is also delayed). */
6668 if (Present (Freeze_Node (gnat_entity))
6669 || (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
6670 && Present (Full_View (gnat_entity))
6671 && Freeze_Node (Full_View (gnat_entity))
6672 && !present_gnu_tree (Full_View (gnat_entity))))
6673 {
6674 elaborate_entity (gnat_entity);
6675
6676 if (!gnu_old)
6677 {
6678 tree gnu_decl = create_type_decl (get_entity_name (gnat_entity),
6679 make_dummy_type (gnat_entity),
6680 NULL, false, false, gnat_entity);
6681
6682 save_gnu_tree (gnat_entity, gnu_decl, false);
6683 if (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
6684 && Present (Full_View (gnat_entity)))
6685 save_gnu_tree (Full_View (gnat_entity), gnu_decl, false);
6686 }
6687
6688 return;
6689 }
6690
6691 /* If we saved away a dummy type for this node it means that this
6692 made the type that corresponds to the full type of an incomplete
6693 type. Clear that type for now and then update the type in the
6694 pointers. */
6695 if (gnu_old)
6696 {
6697 gcc_assert (TREE_CODE (gnu_old) == TYPE_DECL
6698 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old)));
6699
6700 save_gnu_tree (gnat_entity, NULL_TREE, false);
6701 }
6702
6703 /* Now fully elaborate the type. */
6704 gnu_new = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 1);
6705 gcc_assert (TREE_CODE (gnu_new) == TYPE_DECL);
6706
6707 /* If we have an old type and we've made pointers to this type,
6708 update those pointers. */
6709 if (gnu_old)
6710 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
6711 TREE_TYPE (gnu_new));
6712
6713 /* If this is a record type corresponding to a task or protected type
6714 that is a completion of an incomplete type, perform a similar update
6715 on the type. */
6716 /* ??? Including protected types here is a guess. */
6717
6718 if (IN (Ekind (gnat_entity), Record_Kind)
6719 && Is_Concurrent_Record_Type (gnat_entity)
6720 && present_gnu_tree (Corresponding_Concurrent_Type (gnat_entity)))
6721 {
6722 tree gnu_task_old
6723 = get_gnu_tree (Corresponding_Concurrent_Type (gnat_entity));
6724
6725 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
6726 NULL_TREE, false);
6727 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
6728 gnu_new, false);
6729
6730 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_task_old)),
6731 TREE_TYPE (gnu_new));
6732 }
6733}
6734\f
6735/* GNAT_ENTITY is the type of the resulting constructors,
6736 GNAT_ASSOC is the front of the Component_Associations of an N_Aggregate,
6737 and GNU_TYPE is the GCC type of the corresponding record.
6738
6739 Return a CONSTRUCTOR to build the record. */
6740
6741static tree
6742assoc_to_constructor (Entity_Id gnat_entity, Node_Id gnat_assoc, tree gnu_type)
6743{
6744 tree gnu_list, gnu_result;
6745
6746 /* We test for GNU_FIELD being empty in the case where a variant
6747 was the last thing since we don't take things off GNAT_ASSOC in
6748 that case. We check GNAT_ASSOC in case we have a variant, but it
6749 has no fields. */
6750
6751 for (gnu_list = NULL_TREE; Present (gnat_assoc);
6752 gnat_assoc = Next (gnat_assoc))
6753 {
6754 Node_Id gnat_field = First (Choices (gnat_assoc));
6755 tree gnu_field = gnat_to_gnu_field_decl (Entity (gnat_field));
6756 tree gnu_expr = gnat_to_gnu (Expression (gnat_assoc));
6757
6758 /* The expander is supposed to put a single component selector name
6759 in every record component association */
6760 gcc_assert (No (Next (gnat_field)));
6761
6762 /* Ignore fields that have Corresponding_Discriminants since we'll
6763 be setting that field in the parent. */
6764 if (Present (Corresponding_Discriminant (Entity (gnat_field)))
6765 && Is_Tagged_Type (Scope (Entity (gnat_field))))
6766 continue;
6767
6768 /* Also ignore discriminants of Unchecked_Unions. */
6769 else if (Is_Unchecked_Union (gnat_entity)
6770 && Ekind (Entity (gnat_field)) == E_Discriminant)
6771 continue;
6772
6773 /* Before assigning a value in an aggregate make sure range checks
6774 are done if required. Then convert to the type of the field. */
6775 if (Do_Range_Check (Expression (gnat_assoc)))
6776 gnu_expr = emit_range_check (gnu_expr, Etype (gnat_field));
6777
6778 gnu_expr = convert (TREE_TYPE (gnu_field), gnu_expr);
6779
6780 /* Add the field and expression to the list. */
6781 gnu_list = tree_cons (gnu_field, gnu_expr, gnu_list);
6782 }
6783
6784 gnu_result = extract_values (gnu_list, gnu_type);
6785
6786#ifdef ENABLE_CHECKING
6787 {
6788 tree gnu_field;
6789
6790 /* Verify every entry in GNU_LIST was used. */
6791 for (gnu_field = gnu_list; gnu_field; gnu_field = TREE_CHAIN (gnu_field))
6792 gcc_assert (TREE_ADDRESSABLE (gnu_field));
6793 }
6794#endif
6795
6796 return gnu_result;
6797}
6798
6799/* Builds a possibly nested constructor for array aggregates. GNAT_EXPR
6800 is the first element of an array aggregate. It may itself be an
6801 aggregate (an array or record aggregate). GNU_ARRAY_TYPE is the gnu type
6802 corresponding to the array aggregate. GNAT_COMPONENT_TYPE is the type
6803 of the array component. It is needed for range checking. */
6804
6805static tree
6806pos_to_constructor (Node_Id gnat_expr, tree gnu_array_type,
6807 Entity_Id gnat_component_type)
6808{
6809 tree gnu_expr_list = NULL_TREE;
6810 tree gnu_index = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_array_type));
6811 tree gnu_expr;
6812
6813 for ( ; Present (gnat_expr); gnat_expr = Next (gnat_expr))
6814 {
6815 /* If the expression is itself an array aggregate then first build the
6816 innermost constructor if it is part of our array (multi-dimensional
6817 case). */
6818
6819 if (Nkind (gnat_expr) == N_Aggregate
6820 && TREE_CODE (TREE_TYPE (gnu_array_type)) == ARRAY_TYPE
6821 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_array_type)))
6822 gnu_expr = pos_to_constructor (First (Expressions (gnat_expr)),
6823 TREE_TYPE (gnu_array_type),
6824 gnat_component_type);
6825 else
6826 {
6827 gnu_expr = gnat_to_gnu (gnat_expr);
6828
6829 /* before assigning the element to the array make sure it is
6830 in range */
6831 if (Do_Range_Check (gnat_expr))
6832 gnu_expr = emit_range_check (gnu_expr, gnat_component_type);
6833 }
6834
6835 gnu_expr_list
6836 = tree_cons (gnu_index, convert (TREE_TYPE (gnu_array_type), gnu_expr),
6837 gnu_expr_list);
6838
6839 gnu_index = int_const_binop (PLUS_EXPR, gnu_index, integer_one_node, 0);
6840 }
6841
6842 return gnat_build_constructor (gnu_array_type, nreverse (gnu_expr_list));
6843}
6844\f
6845/* Subroutine of assoc_to_constructor: VALUES is a list of field associations,
6846 some of which are from RECORD_TYPE. Return a CONSTRUCTOR consisting
6847 of the associations that are from RECORD_TYPE. If we see an internal
6848 record, make a recursive call to fill it in as well. */
6849
6850static tree
6851extract_values (tree values, tree record_type)
6852{
6853 tree result = NULL_TREE;
6854 tree field, tem;
6855
6856 for (field = TYPE_FIELDS (record_type); field; field = TREE_CHAIN (field))
6857 {
6858 tree value = 0;
6859
6860 /* _Parent is an internal field, but may have values in the aggregate,
6861 so check for values first. */
6862 if ((tem = purpose_member (field, values)))
6863 {
6864 value = TREE_VALUE (tem);
6865 TREE_ADDRESSABLE (tem) = 1;
6866 }
6867
6868 else if (DECL_INTERNAL_P (field))
6869 {
6870 value = extract_values (values, TREE_TYPE (field));
6871 if (TREE_CODE (value) == CONSTRUCTOR
6872 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value)))
6873 value = 0;
6874 }
6875 else
6876 /* If we have a record subtype, the names will match, but not the
6877 actual FIELD_DECLs. */
6878 for (tem = values; tem; tem = TREE_CHAIN (tem))
6879 if (DECL_NAME (TREE_PURPOSE (tem)) == DECL_NAME (field))
6880 {
6881 value = convert (TREE_TYPE (field), TREE_VALUE (tem));
6882 TREE_ADDRESSABLE (tem) = 1;
6883 }
6884
6885 if (!value)
6886 continue;
6887
6888 result = tree_cons (field, value, result);
6889 }
6890
6891 return gnat_build_constructor (record_type, nreverse (result));
6892}
6893\f
6894/* EXP is to be treated as an array or record. Handle the cases when it is
6895 an access object and perform the required dereferences. */
6896
6897static tree
6898maybe_implicit_deref (tree exp)
6899{
6900 /* If the type is a pointer, dereference it. */
6901
6902 if (POINTER_TYPE_P (TREE_TYPE (exp)) || TYPE_FAT_POINTER_P (TREE_TYPE (exp)))
6903 exp = build_unary_op (INDIRECT_REF, NULL_TREE, exp);
6904
6905 /* If we got a padded type, remove it too. */
6906 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
6907 && TYPE_IS_PADDING_P (TREE_TYPE (exp)))
6908 exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
6909
6910 return exp;
6911}
6912\f
6913/* Protect EXP from multiple evaluation. This may make a SAVE_EXPR. */
6914
6915tree
6916protect_multiple_eval (tree exp)
6917{
6918 tree type = TREE_TYPE (exp);
6919
6920 /* If this has no side effects, we don't need to do anything. */
6921 if (!TREE_SIDE_EFFECTS (exp))
6922 return exp;
6923
6924 /* If it is a conversion, protect what's inside the conversion.
6925 Similarly, if we're indirectly referencing something, we only
6926 actually need to protect the address since the data itself can't
6927 change in these situations. */
6928 else if (TREE_CODE (exp) == NON_LVALUE_EXPR
6929 || CONVERT_EXPR_P (exp)
6930 || TREE_CODE (exp) == VIEW_CONVERT_EXPR
6931 || TREE_CODE (exp) == INDIRECT_REF
6932 || TREE_CODE (exp) == UNCONSTRAINED_ARRAY_REF)
6933 return build1 (TREE_CODE (exp), type,
6934 protect_multiple_eval (TREE_OPERAND (exp, 0)));
6935
6936 /* If EXP is a fat pointer or something that can be placed into a register,
6937 just make a SAVE_EXPR. */
6938 if (TYPE_FAT_POINTER_P (type) || TYPE_MODE (type) != BLKmode)
6939 return save_expr (exp);
6940
6941 /* Otherwise, dereference, protect the address, and re-reference. */
6942 else
6943 return
6944 build_unary_op (INDIRECT_REF, type,
6945 save_expr (build_unary_op (ADDR_EXPR,
6946 build_reference_type (type),
6947 exp)));
6948}
6949\f
6950/* This is equivalent to stabilize_reference in tree.c, but we know how to
6951 handle our own nodes and we take extra arguments. FORCE says whether to
6952 force evaluation of everything. We set SUCCESS to true unless we walk
6953 through something we don't know how to stabilize. */
6954
6955tree
6956maybe_stabilize_reference (tree ref, bool force, bool *success)
6957{
6958 tree type = TREE_TYPE (ref);
6959 enum tree_code code = TREE_CODE (ref);
6960 tree result;
6961
6962 /* Assume we'll success unless proven otherwise. */
6963 *success = true;
6964
6965 switch (code)
6966 {
6967 case CONST_DECL:
6968 case VAR_DECL:
6969 case PARM_DECL:
6970 case RESULT_DECL:
6971 /* No action is needed in this case. */
6972 return ref;
6973
6974 case ADDR_EXPR:
6975 CASE_CONVERT:
6976 case FLOAT_EXPR:
6977 case FIX_TRUNC_EXPR:
6978 case VIEW_CONVERT_EXPR:
6979 result
6980 = build1 (code, type,
6981 maybe_stabilize_reference (TREE_OPERAND (ref, 0), force,
6982 success));
6983 break;
6984
6985 case INDIRECT_REF:
6986 case UNCONSTRAINED_ARRAY_REF:
6987 result = build1 (code, type,
6988 gnat_stabilize_reference_1 (TREE_OPERAND (ref, 0),
6989 force));
6990 break;
6991
6992 case COMPONENT_REF:
6993 result = build3 (COMPONENT_REF, type,
6994 maybe_stabilize_reference (TREE_OPERAND (ref, 0), force,
6995 success),
6996 TREE_OPERAND (ref, 1), NULL_TREE);
6997 break;
6998
6999 case BIT_FIELD_REF:
7000 result = build3 (BIT_FIELD_REF, type,
7001 maybe_stabilize_reference (TREE_OPERAND (ref, 0), force,
7002 success),
7003 gnat_stabilize_reference_1 (TREE_OPERAND (ref, 1),
7004 force),
7005 gnat_stabilize_reference_1 (TREE_OPERAND (ref, 2),
7006 force));
7007 break;
7008
7009 case ARRAY_REF:
7010 case ARRAY_RANGE_REF:
7011 result = build4 (code, type,
7012 maybe_stabilize_reference (TREE_OPERAND (ref, 0), force,
7013 success),
7014 gnat_stabilize_reference_1 (TREE_OPERAND (ref, 1),
7015 force),
7016 NULL_TREE, NULL_TREE);
7017 break;
7018
7019 case COMPOUND_EXPR:
7020 result = gnat_stabilize_reference_1 (ref, force);
7021 break;
7022
7023 case CALL_EXPR:
7024 /* This generates better code than the scheme in protect_multiple_eval
7025 because large objects will be returned via invisible reference in
7026 most ABIs so the temporary will directly be filled by the callee. */
7027 result = gnat_stabilize_reference_1 (ref, force);
7028 break;
7029
7030 case CONSTRUCTOR:
7031 /* Constructors with 1 element are used extensively to formally
7032 convert objects to special wrapping types. */
7033 if (TREE_CODE (type) == RECORD_TYPE
7034 && VEC_length (constructor_elt, CONSTRUCTOR_ELTS (ref)) == 1)
7035 {
7036 tree index
7037 = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (ref), 0)->index;
7038 tree value
7039 = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (ref), 0)->value;
7040 result
7041 = build_constructor_single (type, index,
7042 gnat_stabilize_reference_1 (value,
7043 force));
7044 }
7045 else
7046 {
7047 *success = false;
7048 return ref;
7049 }
7050 break;
7051
7052 case ERROR_MARK:
7053 ref = error_mark_node;
7054
7055 /* ... Fallthru to failure ... */
7056
7057 /* If arg isn't a kind of lvalue we recognize, make no change.
7058 Caller should recognize the error for an invalid lvalue. */
7059 default:
7060 *success = false;
7061 return ref;
7062 }
7063
7064 TREE_READONLY (result) = TREE_READONLY (ref);
7065
7066 /* TREE_THIS_VOLATILE and TREE_SIDE_EFFECTS attached to the initial
7067 expression may not be sustained across some paths, such as the way via
7068 build1 for INDIRECT_REF. We re-populate those flags here for the general
7069 case, which is consistent with the GCC version of this routine.
7070
7071 Special care should be taken regarding TREE_SIDE_EFFECTS, because some
7072 paths introduce side effects where there was none initially (e.g. calls
7073 to save_expr), and we also want to keep track of that. */
7074
7075 TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (ref);
7076 TREE_SIDE_EFFECTS (result) |= TREE_SIDE_EFFECTS (ref);
7077
7078 return result;
7079}
7080
7081/* Wrapper around maybe_stabilize_reference, for common uses without
7082 lvalue restrictions and without need to examine the success
7083 indication. */
7084
7085static tree
7086gnat_stabilize_reference (tree ref, bool force)
7087{
7088 bool dummy;
7089 return maybe_stabilize_reference (ref, force, &dummy);
7090}
7091
7092/* Similar to stabilize_reference_1 in tree.c, but supports an extra
7093 arg to force a SAVE_EXPR for everything. */
7094
7095static tree
7096gnat_stabilize_reference_1 (tree e, bool force)
7097{
7098 enum tree_code code = TREE_CODE (e);
7099 tree type = TREE_TYPE (e);
7100 tree result;
7101
7102 /* We cannot ignore const expressions because it might be a reference
7103 to a const array but whose index contains side-effects. But we can
7104 ignore things that are actual constant or that already have been
7105 handled by this function. */
7106
7107 if (TREE_CONSTANT (e) || code == SAVE_EXPR)
7108 return e;
7109
7110 switch (TREE_CODE_CLASS (code))
7111 {
7112 case tcc_exceptional:
7113 case tcc_type:
7114 case tcc_declaration:
7115 case tcc_comparison:
7116 case tcc_statement:
7117 case tcc_expression:
7118 case tcc_reference:
7119 case tcc_vl_exp:
7120 /* If this is a COMPONENT_REF of a fat pointer, save the entire
7121 fat pointer. This may be more efficient, but will also allow
7122 us to more easily find the match for the PLACEHOLDER_EXPR. */
7123 if (code == COMPONENT_REF
7124 && TYPE_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (e, 0))))
7125 result = build3 (COMPONENT_REF, type,
7126 gnat_stabilize_reference_1 (TREE_OPERAND (e, 0),
7127 force),
7128 TREE_OPERAND (e, 1), TREE_OPERAND (e, 2));
7129 else if (TREE_SIDE_EFFECTS (e) || force)
7130 return save_expr (e);
7131 else
7132 return e;
7133 break;
7134
7135 case tcc_constant:
7136 /* Constants need no processing. In fact, we should never reach
7137 here. */
7138 return e;
7139
7140 case tcc_binary:
7141 /* Recursively stabilize each operand. */
7142 result = build2 (code, type,
7143 gnat_stabilize_reference_1 (TREE_OPERAND (e, 0), force),
7144 gnat_stabilize_reference_1 (TREE_OPERAND (e, 1),
7145 force));
7146 break;
7147
7148 case tcc_unary:
7149 /* Recursively stabilize each operand. */
7150 result = build1 (code, type,
7151 gnat_stabilize_reference_1 (TREE_OPERAND (e, 0),
7152 force));
7153 break;
7154
7155 default:
7156 gcc_unreachable ();
7157 }
7158
7159 TREE_READONLY (result) = TREE_READONLY (e);
7160
7161 TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (e);
7162 TREE_SIDE_EFFECTS (result) |= TREE_SIDE_EFFECTS (e);
7163 return result;
7164}
7165\f
7166/* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
7167 location and false if it doesn't. In the former case, set the Gigi global
7168 variable REF_FILENAME to the simple debug file name as given by sinput. */
7169
7170bool
7171Sloc_to_locus (Source_Ptr Sloc, location_t *locus)
7172{
7173 if (Sloc == No_Location)
7174 return false;
7175
7176 if (Sloc <= Standard_Location)
7177 {
7178 if (*locus == UNKNOWN_LOCATION)
7179 *locus = BUILTINS_LOCATION;
7180 return false;
7181 }
7182 else
7183 {
7184 Source_File_Index file = Get_Source_File_Index (Sloc);
7185 Logical_Line_Number line = Get_Logical_Line_Number (Sloc);
7186 Column_Number column = Get_Column_Number (Sloc);
7187 struct line_map *map = &line_table->maps[file - 1];
7188
7189 /* Translate the location according to the line-map.h formula. */
7190 *locus = map->start_location
7191 + ((line - map->to_line) << map->column_bits)
7192 + (column & ((1 << map->column_bits) - 1));
7193 }
7194
7195 ref_filename
7196 = IDENTIFIER_POINTER
7197 (get_identifier
7198 (Get_Name_String (Debug_Source_Name (Get_Source_File_Index (Sloc)))));;
7199
7200 return true;
7201}
7202
7203/* Similar to set_expr_location, but start with the Sloc of GNAT_NODE and
7204 don't do anything if it doesn't correspond to a source location. */
7205
7206static void
7207set_expr_location_from_node (tree node, Node_Id gnat_node)
7208{
7209 location_t locus;
7210
7211 if (!Sloc_to_locus (Sloc (gnat_node), &locus))
7212 return;
7213
7214 SET_EXPR_LOCATION (node, locus);
7215}
7216\f
7217/* Return a colon-separated list of encodings contained in encoded Ada
7218 name. */
7219
7220static const char *
7221extract_encoding (const char *name)
7222{
7223 char *encoding = GGC_NEWVEC (char, strlen (name));
7224
7225 get_encoding (name, encoding);
7226
7227 return encoding;
7228}
7229
7230/* Extract the Ada name from an encoded name. */
7231
7232static const char *
7233decode_name (const char *name)
7234{
7235 char *decoded = GGC_NEWVEC (char, strlen (name) * 2 + 60);
7236
7237 __gnat_decode (name, decoded, 0);
7238
7239 return decoded;
7240}
7241\f
7242/* Post an error message. MSG is the error message, properly annotated.
7243 NODE is the node at which to post the error and the node to use for the
7244 "&" substitution. */
7245
7246void
7247post_error (const char *msg, Node_Id node)
7248{
7249 String_Template temp;
7250 Fat_Pointer fp;
7251
7252 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7253 fp.Array = msg, fp.Bounds = &temp;
7254 if (Present (node))
7255 Error_Msg_N (fp, node);
7256}
7257
7258/* Similar, but NODE is the node at which to post the error and ENT
7259 is the node to use for the "&" substitution. */
7260
7261void
7262post_error_ne (const char *msg, Node_Id node, Entity_Id ent)
7263{
7264 String_Template temp;
7265 Fat_Pointer fp;
7266
7267 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7268 fp.Array = msg, fp.Bounds = &temp;
7269 if (Present (node))
7270 Error_Msg_NE (fp, node, ent);
7271}
7272
7273/* Similar, but NODE is the node at which to post the error, ENT is the node
7274 to use for the "&" substitution, and N is the number to use for the ^. */
7275
7276void
7277post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent, int n)
7278{
7279 String_Template temp;
7280 Fat_Pointer fp;
7281
7282 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7283 fp.Array = msg, fp.Bounds = &temp;
7284 Error_Msg_Uint_1 = UI_From_Int (n);
7285
7286 if (Present (node))
7287 Error_Msg_NE (fp, node, ent);
7288}
7289\f
7290/* Similar to post_error_ne_num, but T is a GCC tree representing the
7291 number to write. If the tree represents a constant that fits within
7292 a host integer, the text inside curly brackets in MSG will be output
7293 (presumably including a '^'). Otherwise that text will not be output
7294 and the text inside square brackets will be output instead. */
7295
7296void
7297post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent, tree t)
7298{
7299 char *newmsg = XALLOCAVEC (char, strlen (msg) + 1);
7300 String_Template temp = {1, 0};
7301 Fat_Pointer fp;
7302 char start_yes, end_yes, start_no, end_no;
7303 const char *p;
7304 char *q;
7305
7306 fp.Array = newmsg, fp.Bounds = &temp;
7307
7308 if (host_integerp (t, 1)
7309#if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_INT
7310 &&
7311 compare_tree_int
7312 (t, (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_INT - 1)) - 1)) < 0
7313#endif
7314 )
7315 {
7316 Error_Msg_Uint_1 = UI_From_Int (tree_low_cst (t, 1));
7317 start_yes = '{', end_yes = '}', start_no = '[', end_no = ']';
7318 }
7319 else
7320 start_yes = '[', end_yes = ']', start_no = '{', end_no = '}';
7321
7322 for (p = msg, q = newmsg; *p; p++)
7323 {
7324 if (*p == start_yes)
7325 for (p++; *p != end_yes; p++)
7326 *q++ = *p;
7327 else if (*p == start_no)
7328 for (p++; *p != end_no; p++)
7329 ;
7330 else
7331 *q++ = *p;
7332 }
7333
7334 *q = 0;
7335
7336 temp.High_Bound = strlen (newmsg);
7337 if (Present (node))
7338 Error_Msg_NE (fp, node, ent);
7339}
7340
7341/* Similar to post_error_ne_tree, except that NUM is a second
7342 integer to write in the message. */
7343
7344void
7345post_error_ne_tree_2 (const char *msg,
7346 Node_Id node,
7347 Entity_Id ent,
7348 tree t,
7349 int num)
7350{
7351 Error_Msg_Uint_2 = UI_From_Int (num);
7352 post_error_ne_tree (msg, node, ent, t);
7353}
7354\f
7355/* Initialize the table that maps GNAT codes to GCC codes for simple
7356 binary and unary operations. */
7357
7358static void
7359init_code_table (void)
7360{
7361 gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR;
7362 gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR;
7363
7364 gnu_codes[N_Op_And] = TRUTH_AND_EXPR;
7365 gnu_codes[N_Op_Or] = TRUTH_OR_EXPR;
7366 gnu_codes[N_Op_Xor] = TRUTH_XOR_EXPR;
7367 gnu_codes[N_Op_Eq] = EQ_EXPR;
7368 gnu_codes[N_Op_Ne] = NE_EXPR;
7369 gnu_codes[N_Op_Lt] = LT_EXPR;
7370 gnu_codes[N_Op_Le] = LE_EXPR;
7371 gnu_codes[N_Op_Gt] = GT_EXPR;
7372 gnu_codes[N_Op_Ge] = GE_EXPR;
7373 gnu_codes[N_Op_Add] = PLUS_EXPR;
7374 gnu_codes[N_Op_Subtract] = MINUS_EXPR;
7375 gnu_codes[N_Op_Multiply] = MULT_EXPR;
7376 gnu_codes[N_Op_Mod] = FLOOR_MOD_EXPR;
7377 gnu_codes[N_Op_Rem] = TRUNC_MOD_EXPR;
7378 gnu_codes[N_Op_Minus] = NEGATE_EXPR;
7379 gnu_codes[N_Op_Abs] = ABS_EXPR;
7380 gnu_codes[N_Op_Not] = TRUTH_NOT_EXPR;
7381 gnu_codes[N_Op_Rotate_Left] = LROTATE_EXPR;
7382 gnu_codes[N_Op_Rotate_Right] = RROTATE_EXPR;
7383 gnu_codes[N_Op_Shift_Left] = LSHIFT_EXPR;
7384 gnu_codes[N_Op_Shift_Right] = RSHIFT_EXPR;
7385 gnu_codes[N_Op_Shift_Right_Arithmetic] = RSHIFT_EXPR;
7386}
7387
7388/* Return a label to branch to for the exception type in KIND or NULL_TREE
7389 if none. */
7390
7391tree
7392get_exception_label (char kind)
7393{
7394 if (kind == N_Raise_Constraint_Error)
7395 return TREE_VALUE (gnu_constraint_error_label_stack);
7396 else if (kind == N_Raise_Storage_Error)
7397 return TREE_VALUE (gnu_storage_error_label_stack);
7398 else if (kind == N_Raise_Program_Error)
7399 return TREE_VALUE (gnu_program_error_label_stack);
7400 else
7401 return NULL_TREE;
7402}
7403
7404#include "gt-ada-trans.h"
This page took 0.870671 seconds and 5 git commands to generate.