OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc4/] [gcc/] [ada/] [gcc-interface/] [trans.c] - Blame information for rev 855

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.