2008-08-06 Doug Rupp <rupp@adacore.com>
[platform/upstream/gcc.git] / gcc / ada / gcc-interface / utils2.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                               U T I L S 2                                *
6  *                                                                          *
7  *                          C Implementation File                           *
8  *                                                                          *
9  *          Copyright (C) 1992-2008, 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 along with GCC; see the 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 "rtl.h"
32 #include "ggc.h"
33 #include "flags.h"
34 #include "output.h"
35 #include "ada.h"
36 #include "types.h"
37 #include "atree.h"
38 #include "stringt.h"
39 #include "namet.h"
40 #include "uintp.h"
41 #include "fe.h"
42 #include "elists.h"
43 #include "nlists.h"
44 #include "sinfo.h"
45 #include "einfo.h"
46 #include "ada-tree.h"
47 #include "gigi.h"
48 #include "snames.h"
49
50 /* Let code below know whether we are targetting VMS without need of
51    intrusive preprocessor directives.  */
52 #ifndef TARGET_ABI_OPEN_VMS
53 #define TARGET_ABI_OPEN_VMS 0
54 #endif
55
56 static tree find_common_type (tree, tree);
57 static bool contains_save_expr_p (tree);
58 static tree contains_null_expr (tree);
59 static tree compare_arrays (tree, tree, tree);
60 static tree nonbinary_modular_operation (enum tree_code, tree, tree, tree);
61 static tree build_simple_component_ref (tree, tree, tree, bool);
62 \f
63 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR or other logical
64    operation.
65
66    This preparation consists of taking the ordinary representation of
67    an expression expr and producing a valid tree boolean expression
68    describing whether expr is nonzero. We could simply always do
69
70       build_binary_op (NE_EXPR, expr, integer_zero_node, 1),
71
72    but we optimize comparisons, &&, ||, and !.
73
74    The resulting type should always be the same as the input type.
75    This function is simpler than the corresponding C version since
76    the only possible operands will be things of Boolean type.  */
77
78 tree
79 gnat_truthvalue_conversion (tree expr)
80 {
81   tree type = TREE_TYPE (expr);
82
83   switch (TREE_CODE (expr))
84     {
85     case EQ_EXPR:  case NE_EXPR: case LE_EXPR: case GE_EXPR:
86     case LT_EXPR:  case GT_EXPR:
87     case TRUTH_ANDIF_EXPR:
88     case TRUTH_ORIF_EXPR:
89     case TRUTH_AND_EXPR:
90     case TRUTH_OR_EXPR:
91     case TRUTH_XOR_EXPR:
92     case ERROR_MARK:
93       return expr;
94
95     case INTEGER_CST:
96       return (integer_zerop (expr)
97               ? build_int_cst (type, 0)
98               : build_int_cst (type, 1));
99
100     case REAL_CST:
101       return (real_zerop (expr)
102               ? fold_convert (type, integer_zero_node)
103               : fold_convert (type, integer_one_node));
104
105     case COND_EXPR:
106       /* Distribute the conversion into the arms of a COND_EXPR.  */
107       {
108         tree arg1 = gnat_truthvalue_conversion (TREE_OPERAND (expr, 1));
109         tree arg2 = gnat_truthvalue_conversion (TREE_OPERAND (expr, 2));
110         return fold_build3 (COND_EXPR, type, TREE_OPERAND (expr, 0),
111                             arg1, arg2);
112       }
113
114     default:
115       return build_binary_op (NE_EXPR, type, expr,
116                               fold_convert (type, integer_zero_node));
117     }
118 }
119 \f
120 /* Return the base type of TYPE.  */
121
122 tree
123 get_base_type (tree type)
124 {
125   if (TREE_CODE (type) == RECORD_TYPE
126       && TYPE_JUSTIFIED_MODULAR_P (type))
127     type = TREE_TYPE (TYPE_FIELDS (type));
128
129   while (TREE_TYPE (type)
130          && (TREE_CODE (type) == INTEGER_TYPE
131              || TREE_CODE (type) == REAL_TYPE))
132     type = TREE_TYPE (type);
133
134   return type;
135 }
136 \f
137 /* EXP is a GCC tree representing an address.  See if we can find how
138    strictly the object at that address is aligned.   Return that alignment
139    in bits.  If we don't know anything about the alignment, return 0.  */
140
141 unsigned int
142 known_alignment (tree exp)
143 {
144   unsigned int this_alignment;
145   unsigned int lhs, rhs;
146
147   switch (TREE_CODE (exp))
148     {
149     CASE_CONVERT:
150     case VIEW_CONVERT_EXPR:
151     case NON_LVALUE_EXPR:
152       /* Conversions between pointers and integers don't change the alignment
153          of the underlying object.  */
154       this_alignment = known_alignment (TREE_OPERAND (exp, 0));
155       break;
156
157     case COMPOUND_EXPR:
158       /* The value of a COMPOUND_EXPR is that of it's second operand.  */
159       this_alignment = known_alignment (TREE_OPERAND (exp, 1));
160       break;
161
162     case PLUS_EXPR:
163     case MINUS_EXPR:
164       /* If two address are added, the alignment of the result is the
165          minimum of the two alignments.  */
166       lhs = known_alignment (TREE_OPERAND (exp, 0));
167       rhs = known_alignment (TREE_OPERAND (exp, 1));
168       this_alignment = MIN (lhs, rhs);
169       break;
170
171     case POINTER_PLUS_EXPR:
172       lhs = known_alignment (TREE_OPERAND (exp, 0));
173       rhs = known_alignment (TREE_OPERAND (exp, 1));
174       /* If we don't know the alignment of the offset, we assume that
175          of the base.  */
176       if (rhs == 0)
177         this_alignment = lhs;
178       else
179         this_alignment = MIN (lhs, rhs);
180       break;
181
182     case COND_EXPR:
183       /* If there is a choice between two values, use the smallest one.  */
184       lhs = known_alignment (TREE_OPERAND (exp, 1));
185       rhs = known_alignment (TREE_OPERAND (exp, 2));
186       this_alignment = MIN (lhs, rhs);
187       break;
188
189     case INTEGER_CST:
190       {
191         unsigned HOST_WIDE_INT c = TREE_INT_CST_LOW (exp);
192         /* The first part of this represents the lowest bit in the constant,
193            but it is originally in bytes, not bits.  */
194         this_alignment = MIN (BITS_PER_UNIT * (c & -c), BIGGEST_ALIGNMENT);
195       }
196       break;
197
198     case MULT_EXPR:
199       /* If we know the alignment of just one side, use it.  Otherwise,
200          use the product of the alignments.  */
201       lhs = known_alignment (TREE_OPERAND (exp, 0));
202       rhs = known_alignment (TREE_OPERAND (exp, 1));
203
204       if (lhs == 0)
205         this_alignment = rhs;
206       else if (rhs == 0)
207         this_alignment = lhs;
208       else
209         this_alignment = MIN (lhs * rhs, BIGGEST_ALIGNMENT);
210       break;
211
212     case BIT_AND_EXPR:
213       /* A bit-and expression is as aligned as the maximum alignment of the
214          operands.  We typically get here for a complex lhs and a constant
215          negative power of two on the rhs to force an explicit alignment, so
216          don't bother looking at the lhs.  */
217       this_alignment = known_alignment (TREE_OPERAND (exp, 1));
218       break;
219
220     case ADDR_EXPR:
221       this_alignment = expr_align (TREE_OPERAND (exp, 0));
222       break;
223
224     default:
225       /* For other pointer expressions, we assume that the pointed-to object
226          is at least as aligned as the pointed-to type.  Beware that we can
227          have a dummy type here (e.g. a Taft Amendment type), for which the
228          alignment is meaningless and should be ignored.  */
229       if (POINTER_TYPE_P (TREE_TYPE (exp))
230           && !TYPE_IS_DUMMY_P (TREE_TYPE (TREE_TYPE (exp))))
231         this_alignment = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (exp)));
232       else
233         this_alignment = 0;
234       break;
235     }
236
237   return this_alignment;
238 }
239 \f
240 /* We have a comparison or assignment operation on two types, T1 and T2, which
241    are either both array types or both record types.  T1 is assumed to be for
242    the left hand side operand, and T2 for the right hand side.  Return the
243    type that both operands should be converted to for the operation, if any.
244    Otherwise return zero.  */
245
246 static tree
247 find_common_type (tree t1, tree t2)
248 {
249   /* ??? As of today, various constructs lead here with types of different
250      sizes even when both constants (e.g. tagged types, packable vs regular
251      component types, padded vs unpadded types, ...).  While some of these
252      would better be handled upstream (types should be made consistent before
253      calling into build_binary_op), some others are really expected and we
254      have to be careful.  */
255
256   /* We must prevent writing more than what the target may hold if this is for
257      an assignment and the case of tagged types is handled in build_binary_op
258      so use the lhs type if it is known to be smaller, or of constant size and
259      the rhs type is not, whatever the modes.  We also force t1 in case of
260      constant size equality to minimize occurrences of view conversions on the
261      lhs of assignments.  */
262   if (TREE_CONSTANT (TYPE_SIZE (t1))
263       && (!TREE_CONSTANT (TYPE_SIZE (t2))
264           || !tree_int_cst_lt (TYPE_SIZE (t2), TYPE_SIZE (t1))))
265     return t1;
266
267   /* Otherwise, if the lhs type is non-BLKmode, use it.  Note that we know
268      that we will not have any alignment problems since, if we did, the
269      non-BLKmode type could not have been used.  */
270   if (TYPE_MODE (t1) != BLKmode)
271     return t1;
272
273   /* If the rhs type is of constant size, use it whatever the modes.  At
274      this point it is known to be smaller, or of constant size and the
275      lhs type is not.  */
276   if (TREE_CONSTANT (TYPE_SIZE (t2)))
277     return t2;
278
279   /* Otherwise, if the rhs type is non-BLKmode, use it.  */
280   if (TYPE_MODE (t2) != BLKmode)
281     return t2;
282
283   /* In this case, both types have variable size and BLKmode.  It's
284      probably best to leave the "type mismatch" because changing it
285      could cause a bad self-referential reference.  */
286   return NULL_TREE;
287 }
288 \f
289 /* See if EXP contains a SAVE_EXPR in a position where we would
290    normally put it.
291
292    ??? This is a real kludge, but is probably the best approach short
293    of some very general solution.  */
294
295 static bool
296 contains_save_expr_p (tree exp)
297 {
298   switch (TREE_CODE (exp))
299     {
300     case SAVE_EXPR:
301       return true;
302
303     case ADDR_EXPR:  case INDIRECT_REF:
304     case COMPONENT_REF:
305     CASE_CONVERT: case VIEW_CONVERT_EXPR:
306       return contains_save_expr_p (TREE_OPERAND (exp, 0));
307
308     case CONSTRUCTOR:
309       {
310         tree value;
311         unsigned HOST_WIDE_INT ix;
312
313         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), ix, value)
314           if (contains_save_expr_p (value))
315             return true;
316         return false;
317       }
318
319     default:
320       return false;
321     }
322 }
323 \f
324 /* See if EXP contains a NULL_EXPR in an expression we use for sizes. Return
325    it if so.  This is used to detect types whose sizes involve computations
326    that are known to raise Constraint_Error.  */
327
328 static tree
329 contains_null_expr (tree exp)
330 {
331   tree tem;
332
333   if (TREE_CODE (exp) == NULL_EXPR)
334     return exp;
335
336   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
337     {
338     case tcc_unary:
339       return contains_null_expr (TREE_OPERAND (exp, 0));
340
341     case tcc_comparison:
342     case tcc_binary:
343       tem = contains_null_expr (TREE_OPERAND (exp, 0));
344       if (tem)
345         return tem;
346
347       return contains_null_expr (TREE_OPERAND (exp, 1));
348
349     case tcc_expression:
350       switch (TREE_CODE (exp))
351         {
352         case SAVE_EXPR:
353           return contains_null_expr (TREE_OPERAND (exp, 0));
354
355         case COND_EXPR:
356           tem = contains_null_expr (TREE_OPERAND (exp, 0));
357           if (tem)
358             return tem;
359
360           tem = contains_null_expr (TREE_OPERAND (exp, 1));
361           if (tem)
362             return tem;
363
364           return contains_null_expr (TREE_OPERAND (exp, 2));
365
366         default:
367           return 0;
368         }
369
370     default:
371       return 0;
372     }
373 }
374 \f
375 /* Return an expression tree representing an equality comparison of
376    A1 and A2, two objects of ARRAY_TYPE.  The returned expression should
377    be of type RESULT_TYPE
378
379    Two arrays are equal in one of two ways: (1) if both have zero length
380    in some dimension (not necessarily the same dimension) or (2) if the
381    lengths in each dimension are equal and the data is equal.  We perform the
382    length tests in as efficient a manner as possible.  */
383
384 static tree
385 compare_arrays (tree result_type, tree a1, tree a2)
386 {
387   tree t1 = TREE_TYPE (a1);
388   tree t2 = TREE_TYPE (a2);
389   tree result = convert (result_type, integer_one_node);
390   tree a1_is_null = convert (result_type, integer_zero_node);
391   tree a2_is_null = convert (result_type, integer_zero_node);
392   bool length_zero_p = false;
393
394   /* Process each dimension separately and compare the lengths.  If any
395      dimension has a size known to be zero, set SIZE_ZERO_P to 1 to
396      suppress the comparison of the data.  */
397   while (TREE_CODE (t1) == ARRAY_TYPE && TREE_CODE (t2) == ARRAY_TYPE)
398     {
399       tree lb1 = TYPE_MIN_VALUE (TYPE_DOMAIN (t1));
400       tree ub1 = TYPE_MAX_VALUE (TYPE_DOMAIN (t1));
401       tree lb2 = TYPE_MIN_VALUE (TYPE_DOMAIN (t2));
402       tree ub2 = TYPE_MAX_VALUE (TYPE_DOMAIN (t2));
403       tree bt = get_base_type (TREE_TYPE (lb1));
404       tree length1 = fold_build2 (MINUS_EXPR, bt, ub1, lb1);
405       tree length2 = fold_build2 (MINUS_EXPR, bt, ub2, lb2);
406       tree nbt;
407       tree tem;
408       tree comparison, this_a1_is_null, this_a2_is_null;
409
410       /* If the length of the first array is a constant, swap our operands
411          unless the length of the second array is the constant zero.
412          Note that we have set the `length' values to the length - 1.  */
413       if (TREE_CODE (length1) == INTEGER_CST
414           && !integer_zerop (fold_build2 (PLUS_EXPR, bt, length2,
415                                           convert (bt, integer_one_node))))
416         {
417           tem = a1, a1 = a2, a2 = tem;
418           tem = t1, t1 = t2, t2 = tem;
419           tem = lb1, lb1 = lb2, lb2 = tem;
420           tem = ub1, ub1 = ub2, ub2 = tem;
421           tem = length1, length1 = length2, length2 = tem;
422           tem = a1_is_null, a1_is_null = a2_is_null, a2_is_null = tem;
423         }
424
425       /* If the length of this dimension in the second array is the constant
426          zero, we can just go inside the original bounds for the first
427          array and see if last < first.  */
428       if (integer_zerop (fold_build2 (PLUS_EXPR, bt, length2,
429                                       convert (bt, integer_one_node))))
430         {
431           tree ub = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
432           tree lb = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
433
434           comparison = build_binary_op (LT_EXPR, result_type, ub, lb);
435           comparison = SUBSTITUTE_PLACEHOLDER_IN_EXPR (comparison, a1);
436           length1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length1, a1);
437
438           length_zero_p = true;
439           this_a1_is_null = comparison;
440           this_a2_is_null = convert (result_type, integer_one_node);
441         }
442
443       /* If the length is some other constant value, we know that the
444          this dimension in the first array cannot be superflat, so we
445          can just use its length from the actual stored bounds.  */
446       else if (TREE_CODE (length2) == INTEGER_CST)
447         {
448           ub1 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
449           lb1 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
450           ub2 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t2)));
451           lb2 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t2)));
452           nbt = get_base_type (TREE_TYPE (ub1));
453
454           comparison
455             = build_binary_op (EQ_EXPR, result_type,
456                                build_binary_op (MINUS_EXPR, nbt, ub1, lb1),
457                                build_binary_op (MINUS_EXPR, nbt, ub2, lb2));
458
459           /* Note that we know that UB2 and LB2 are constant and hence
460              cannot contain a PLACEHOLDER_EXPR.  */
461
462           comparison = SUBSTITUTE_PLACEHOLDER_IN_EXPR (comparison, a1);
463           length1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length1, a1);
464
465           this_a1_is_null = build_binary_op (LT_EXPR, result_type, ub1, lb1);
466           this_a2_is_null = convert (result_type, integer_zero_node);
467         }
468
469       /* Otherwise compare the computed lengths.  */
470       else
471         {
472           length1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length1, a1);
473           length2 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length2, a2);
474
475           comparison
476             = build_binary_op (EQ_EXPR, result_type, length1, length2);
477
478           this_a1_is_null
479             = build_binary_op (LT_EXPR, result_type, length1,
480                                convert (bt, integer_zero_node));
481           this_a2_is_null
482             = build_binary_op (LT_EXPR, result_type, length2,
483                                convert (bt, integer_zero_node));
484         }
485
486       result = build_binary_op (TRUTH_ANDIF_EXPR, result_type,
487                                 result, comparison);
488
489       a1_is_null = build_binary_op (TRUTH_ORIF_EXPR, result_type,
490                                     this_a1_is_null, a1_is_null);
491       a2_is_null = build_binary_op (TRUTH_ORIF_EXPR, result_type,
492                                     this_a2_is_null, a2_is_null);
493
494       t1 = TREE_TYPE (t1);
495       t2 = TREE_TYPE (t2);
496     }
497
498   /* Unless the size of some bound is known to be zero, compare the
499      data in the array.  */
500   if (!length_zero_p)
501     {
502       tree type = find_common_type (TREE_TYPE (a1), TREE_TYPE (a2));
503
504       if (type)
505         a1 = convert (type, a1), a2 = convert (type, a2);
506
507       result = build_binary_op (TRUTH_ANDIF_EXPR, result_type, result,
508                                 fold_build2 (EQ_EXPR, result_type, a1, a2));
509
510     }
511
512   /* The result is also true if both sizes are zero.  */
513   result = build_binary_op (TRUTH_ORIF_EXPR, result_type,
514                             build_binary_op (TRUTH_ANDIF_EXPR, result_type,
515                                              a1_is_null, a2_is_null),
516                             result);
517
518   /* If either operand contains SAVE_EXPRs, they have to be evaluated before
519      starting the comparison above since the place it would be otherwise
520      evaluated would be wrong.  */
521
522   if (contains_save_expr_p (a1))
523     result = build2 (COMPOUND_EXPR, result_type, a1, result);
524
525   if (contains_save_expr_p (a2))
526     result = build2 (COMPOUND_EXPR, result_type, a2, result);
527
528   return result;
529 }
530 \f
531 /* Compute the result of applying OP_CODE to LHS and RHS, where both are of
532    type TYPE.  We know that TYPE is a modular type with a nonbinary
533    modulus.  */
534
535 static tree
536 nonbinary_modular_operation (enum tree_code op_code, tree type, tree lhs,
537                              tree rhs)
538 {
539   tree modulus = TYPE_MODULUS (type);
540   unsigned int needed_precision = tree_floor_log2 (modulus) + 1;
541   unsigned int precision;
542   bool unsignedp = true;
543   tree op_type = type;
544   tree result;
545
546   /* If this is an addition of a constant, convert it to a subtraction
547      of a constant since we can do that faster.  */
548   if (op_code == PLUS_EXPR && TREE_CODE (rhs) == INTEGER_CST)
549     {
550       rhs = fold_build2 (MINUS_EXPR, type, modulus, rhs);
551       op_code = MINUS_EXPR;
552     }
553
554   /* For the logical operations, we only need PRECISION bits.  For
555      addition and subtraction, we need one more and for multiplication we
556      need twice as many.  But we never want to make a size smaller than
557      our size. */
558   if (op_code == PLUS_EXPR || op_code == MINUS_EXPR)
559     needed_precision += 1;
560   else if (op_code == MULT_EXPR)
561     needed_precision *= 2;
562
563   precision = MAX (needed_precision, TYPE_PRECISION (op_type));
564
565   /* Unsigned will do for everything but subtraction.  */
566   if (op_code == MINUS_EXPR)
567     unsignedp = false;
568
569   /* If our type is the wrong signedness or isn't wide enough, make a new
570      type and convert both our operands to it.  */
571   if (TYPE_PRECISION (op_type) < precision
572       || TYPE_UNSIGNED (op_type) != unsignedp)
573     {
574       /* Copy the node so we ensure it can be modified to make it modular.  */
575       op_type = copy_node (gnat_type_for_size (precision, unsignedp));
576       modulus = convert (op_type, modulus);
577       SET_TYPE_MODULUS (op_type, modulus);
578       TYPE_MODULAR_P (op_type) = 1;
579       lhs = convert (op_type, lhs);
580       rhs = convert (op_type, rhs);
581     }
582
583   /* Do the operation, then we'll fix it up.  */
584   result = fold_build2 (op_code, op_type, lhs, rhs);
585
586   /* For multiplication, we have no choice but to do a full modulus
587      operation.  However, we want to do this in the narrowest
588      possible size.  */
589   if (op_code == MULT_EXPR)
590     {
591       tree div_type = copy_node (gnat_type_for_size (needed_precision, 1));
592       modulus = convert (div_type, modulus);
593       SET_TYPE_MODULUS (div_type, modulus);
594       TYPE_MODULAR_P (div_type) = 1;
595       result = convert (op_type,
596                         fold_build2 (TRUNC_MOD_EXPR, div_type,
597                                      convert (div_type, result), modulus));
598     }
599
600   /* For subtraction, add the modulus back if we are negative.  */
601   else if (op_code == MINUS_EXPR)
602     {
603       result = save_expr (result);
604       result = fold_build3 (COND_EXPR, op_type,
605                             fold_build2 (LT_EXPR, integer_type_node, result,
606                                          convert (op_type, integer_zero_node)),
607                             fold_build2 (PLUS_EXPR, op_type, result, modulus),
608                             result);
609     }
610
611   /* For the other operations, subtract the modulus if we are >= it.  */
612   else
613     {
614       result = save_expr (result);
615       result = fold_build3 (COND_EXPR, op_type,
616                             fold_build2 (GE_EXPR, integer_type_node,
617                                          result, modulus),
618                             fold_build2 (MINUS_EXPR, op_type,
619                                          result, modulus),
620                             result);
621     }
622
623   return convert (type, result);
624 }
625 \f
626 /* Make a binary operation of kind OP_CODE.  RESULT_TYPE is the type
627    desired for the result.  Usually the operation is to be performed
628    in that type.  For MODIFY_EXPR and ARRAY_REF, RESULT_TYPE may be 0
629    in which case the type to be used will be derived from the operands.
630
631    This function is very much unlike the ones for C and C++ since we
632    have already done any type conversion and matching required.  All we
633    have to do here is validate the work done by SEM and handle subtypes.  */
634
635 tree
636 build_binary_op (enum tree_code op_code, tree result_type,
637                  tree left_operand, tree right_operand)
638 {
639   tree left_type  = TREE_TYPE (left_operand);
640   tree right_type = TREE_TYPE (right_operand);
641   tree left_base_type = get_base_type (left_type);
642   tree right_base_type = get_base_type (right_type);
643   tree operation_type = result_type;
644   tree best_type = NULL_TREE;
645   tree modulus, result;
646   bool has_side_effects = false;
647
648   if (operation_type
649       && TREE_CODE (operation_type) == RECORD_TYPE
650       && TYPE_JUSTIFIED_MODULAR_P (operation_type))
651     operation_type = TREE_TYPE (TYPE_FIELDS (operation_type));
652
653   if (operation_type
654       && !AGGREGATE_TYPE_P (operation_type)
655       && TYPE_EXTRA_SUBTYPE_P (operation_type))
656     operation_type = get_base_type (operation_type);
657
658   modulus = (operation_type
659              && TREE_CODE (operation_type) == INTEGER_TYPE
660              && TYPE_MODULAR_P (operation_type)
661              ? TYPE_MODULUS (operation_type) : NULL_TREE);
662
663   switch (op_code)
664     {
665     case MODIFY_EXPR:
666       /* If there were integral or pointer conversions on the LHS, remove
667          them; we'll be putting them back below if needed.  Likewise for
668          conversions between array and record types, except for justified
669          modular types.  But don't do this if the right operand is not
670          BLKmode (for packed arrays) unless we are not changing the mode.  */
671       while ((CONVERT_EXPR_P (left_operand)
672               || TREE_CODE (left_operand) == VIEW_CONVERT_EXPR)
673              && (((INTEGRAL_TYPE_P (left_type)
674                    || POINTER_TYPE_P (left_type))
675                   && (INTEGRAL_TYPE_P (TREE_TYPE
676                                        (TREE_OPERAND (left_operand, 0)))
677                       || POINTER_TYPE_P (TREE_TYPE
678                                          (TREE_OPERAND (left_operand, 0)))))
679                  || (((TREE_CODE (left_type) == RECORD_TYPE
680                        && !TYPE_JUSTIFIED_MODULAR_P (left_type))
681                       || TREE_CODE (left_type) == ARRAY_TYPE)
682                      && ((TREE_CODE (TREE_TYPE
683                                      (TREE_OPERAND (left_operand, 0)))
684                           == RECORD_TYPE)
685                          || (TREE_CODE (TREE_TYPE
686                                         (TREE_OPERAND (left_operand, 0)))
687                              == ARRAY_TYPE))
688                      && (TYPE_MODE (right_type) == BLKmode
689                          || (TYPE_MODE (left_type)
690                              == TYPE_MODE (TREE_TYPE
691                                            (TREE_OPERAND
692                                             (left_operand, 0))))))))
693         {
694           left_operand = TREE_OPERAND (left_operand, 0);
695           left_type = TREE_TYPE (left_operand);
696         }
697
698       /* If a class-wide type may be involved, force use of the RHS type.  */
699       if ((TREE_CODE (right_type) == RECORD_TYPE
700            || TREE_CODE (right_type) == UNION_TYPE)
701           && TYPE_ALIGN_OK (right_type))
702         operation_type = right_type;
703
704       /* If we are copying between padded objects with compatible types, use
705          the padded view of the objects, this is very likely more efficient.
706          Likewise for a padded that is assigned a constructor, in order to
707          avoid putting a VIEW_CONVERT_EXPR on the LHS.  But don't do this if
708          we wouldn't have actually copied anything.  */
709       else if (TREE_CODE (left_type) == RECORD_TYPE
710                && TYPE_IS_PADDING_P (left_type)
711                && TREE_CONSTANT (TYPE_SIZE (left_type))
712                && ((TREE_CODE (right_operand) == COMPONENT_REF
713                     && TREE_CODE (TREE_TYPE (TREE_OPERAND (right_operand, 0)))
714                        == RECORD_TYPE
715                     && TYPE_IS_PADDING_P
716                        (TREE_TYPE (TREE_OPERAND (right_operand, 0)))
717                     && gnat_types_compatible_p
718                         (left_type,
719                          TREE_TYPE (TREE_OPERAND (right_operand, 0))))
720                    || TREE_CODE (right_operand) == CONSTRUCTOR)
721                && !integer_zerop (TYPE_SIZE (right_type)))
722         operation_type = left_type;
723
724       /* Find the best type to use for copying between aggregate types.  */
725       else if (((TREE_CODE (left_type) == ARRAY_TYPE
726                  && TREE_CODE (right_type) == ARRAY_TYPE)
727                 || (TREE_CODE (left_type) == RECORD_TYPE
728                     && TREE_CODE (right_type) == RECORD_TYPE))
729                && (best_type = find_common_type (left_type, right_type)))
730         operation_type = best_type;
731
732       /* Otherwise use the LHS type.  */
733       else if (!operation_type)
734         operation_type = left_type;
735
736       /* Ensure everything on the LHS is valid.  If we have a field reference,
737          strip anything that get_inner_reference can handle.  Then remove any
738          conversions between types having the same code and mode.  And mark
739          VIEW_CONVERT_EXPRs with TREE_ADDRESSABLE.  When done, we must have
740          either an INDIRECT_REF, a NULL_EXPR or a DECL node.  */
741       result = left_operand;
742       while (true)
743         {
744           tree restype = TREE_TYPE (result);
745
746           if (TREE_CODE (result) == COMPONENT_REF
747               || TREE_CODE (result) == ARRAY_REF
748               || TREE_CODE (result) == ARRAY_RANGE_REF)
749             while (handled_component_p (result))
750               result = TREE_OPERAND (result, 0);
751           else if (TREE_CODE (result) == REALPART_EXPR
752                    || TREE_CODE (result) == IMAGPART_EXPR
753                    || (CONVERT_EXPR_P (result)
754                        && (((TREE_CODE (restype)
755                              == TREE_CODE (TREE_TYPE
756                                            (TREE_OPERAND (result, 0))))
757                              && (TYPE_MODE (TREE_TYPE
758                                             (TREE_OPERAND (result, 0)))
759                                  == TYPE_MODE (restype)))
760                            || TYPE_ALIGN_OK (restype))))
761             result = TREE_OPERAND (result, 0);
762           else if (TREE_CODE (result) == VIEW_CONVERT_EXPR)
763             {
764               TREE_ADDRESSABLE (result) = 1;
765               result = TREE_OPERAND (result, 0);
766             }
767           else
768             break;
769         }
770
771       gcc_assert (TREE_CODE (result) == INDIRECT_REF
772                   || TREE_CODE (result) == NULL_EXPR
773                   || DECL_P (result));
774
775       /* Convert the right operand to the operation type unless it is
776          either already of the correct type or if the type involves a
777          placeholder, since the RHS may not have the same record type.  */
778       if (operation_type != right_type
779           && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (operation_type)))
780         {
781           right_operand = convert (operation_type, right_operand);
782           right_type = operation_type;
783         }
784
785       /* If the left operand is not of the same type as the operation
786          type, wrap it up in a VIEW_CONVERT_EXPR.  */
787       if (left_type != operation_type)
788         left_operand = unchecked_convert (operation_type, left_operand, false);
789
790       has_side_effects = true;
791       modulus = NULL_TREE;
792       break;
793
794     case ARRAY_REF:
795       if (!operation_type)
796         operation_type = TREE_TYPE (left_type);
797
798       /* ... fall through ... */
799
800     case ARRAY_RANGE_REF:
801       /* First look through conversion between type variants.  Note that
802          this changes neither the operation type nor the type domain.  */
803       if (TREE_CODE (left_operand) == VIEW_CONVERT_EXPR
804           && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (left_operand, 0)))
805              == TYPE_MAIN_VARIANT (left_type))
806         {
807           left_operand = TREE_OPERAND (left_operand, 0);
808           left_type = TREE_TYPE (left_operand);
809         }
810
811       /* Then convert the right operand to its base type.  This will
812          prevent unneeded signedness conversions when sizetype is wider than
813          integer.  */
814       right_operand = convert (right_base_type, right_operand);
815       right_operand = convert (TYPE_DOMAIN (left_type), right_operand);
816
817       if (!TREE_CONSTANT (right_operand)
818           || !TREE_CONSTANT (TYPE_MIN_VALUE (right_type)))
819         gnat_mark_addressable (left_operand);
820
821       modulus = NULL_TREE;
822       break;
823
824     case GE_EXPR:
825     case LE_EXPR:
826     case GT_EXPR:
827     case LT_EXPR:
828       gcc_assert (!POINTER_TYPE_P (left_type));
829
830       /* ... fall through ... */
831
832     case EQ_EXPR:
833     case NE_EXPR:
834       /* If either operand is a NULL_EXPR, just return a new one.  */
835       if (TREE_CODE (left_operand) == NULL_EXPR)
836         return build2 (op_code, result_type,
837                        build1 (NULL_EXPR, integer_type_node,
838                                TREE_OPERAND (left_operand, 0)),
839                        integer_zero_node);
840
841       else if (TREE_CODE (right_operand) == NULL_EXPR)
842         return build2 (op_code, result_type,
843                        build1 (NULL_EXPR, integer_type_node,
844                                TREE_OPERAND (right_operand, 0)),
845                        integer_zero_node);
846
847       /* If either object is a justified modular types, get the
848          fields from within.  */
849       if (TREE_CODE (left_type) == RECORD_TYPE
850           && TYPE_JUSTIFIED_MODULAR_P (left_type))
851         {
852           left_operand = convert (TREE_TYPE (TYPE_FIELDS (left_type)),
853                                   left_operand);
854           left_type = TREE_TYPE (left_operand);
855           left_base_type = get_base_type (left_type);
856         }
857
858       if (TREE_CODE (right_type) == RECORD_TYPE
859           && TYPE_JUSTIFIED_MODULAR_P (right_type))
860         {
861           right_operand = convert (TREE_TYPE (TYPE_FIELDS (right_type)),
862                                   right_operand);
863           right_type = TREE_TYPE (right_operand);
864           right_base_type = get_base_type (right_type);
865         }
866
867       /* If both objects are arrays, compare them specially.  */
868       if ((TREE_CODE (left_type) == ARRAY_TYPE
869            || (TREE_CODE (left_type) == INTEGER_TYPE
870                && TYPE_HAS_ACTUAL_BOUNDS_P (left_type)))
871           && (TREE_CODE (right_type) == ARRAY_TYPE
872               || (TREE_CODE (right_type) == INTEGER_TYPE
873                   && TYPE_HAS_ACTUAL_BOUNDS_P (right_type))))
874         {
875           result = compare_arrays (result_type, left_operand, right_operand);
876
877           if (op_code == NE_EXPR)
878             result = invert_truthvalue (result);
879           else
880             gcc_assert (op_code == EQ_EXPR);
881
882           return result;
883         }
884
885       /* Otherwise, the base types must be the same unless the objects are
886          fat pointers or records.  If we have records, use the best type and
887          convert both operands to that type.  */
888       if (left_base_type != right_base_type)
889         {
890           if (TYPE_FAT_POINTER_P (left_base_type)
891               && TYPE_FAT_POINTER_P (right_base_type)
892               && TYPE_MAIN_VARIANT (left_base_type)
893                  == TYPE_MAIN_VARIANT (right_base_type))
894             best_type = left_base_type;
895           else if (TREE_CODE (left_base_type) == RECORD_TYPE
896                    && TREE_CODE (right_base_type) == RECORD_TYPE)
897             {
898               /* The only way these are permitted to be the same is if both
899                  types have the same name.  In that case, one of them must
900                  not be self-referential.  Use that one as the best type.
901                  Even better is if one is of fixed size.  */
902               gcc_assert (TYPE_NAME (left_base_type)
903                           && (TYPE_NAME (left_base_type)
904                               == TYPE_NAME (right_base_type)));
905
906               if (TREE_CONSTANT (TYPE_SIZE (left_base_type)))
907                 best_type = left_base_type;
908               else if (TREE_CONSTANT (TYPE_SIZE (right_base_type)))
909                 best_type = right_base_type;
910               else if (!CONTAINS_PLACEHOLDER_P (TYPE_SIZE (left_base_type)))
911                 best_type = left_base_type;
912               else if (!CONTAINS_PLACEHOLDER_P (TYPE_SIZE (right_base_type)))
913                 best_type = right_base_type;
914               else
915                 gcc_unreachable ();
916             }
917           else
918             gcc_unreachable ();
919
920           left_operand = convert (best_type, left_operand);
921           right_operand = convert (best_type, right_operand);
922         }
923
924       /* If we are comparing a fat pointer against zero, we need to
925          just compare the data pointer.  */
926       else if (TYPE_FAT_POINTER_P (left_base_type)
927                && TREE_CODE (right_operand) == CONSTRUCTOR
928                && integer_zerop (VEC_index (constructor_elt,
929                                             CONSTRUCTOR_ELTS (right_operand),
930                                             0)
931                                  ->value))
932         {
933           right_operand = build_component_ref (left_operand, NULL_TREE,
934                                                TYPE_FIELDS (left_base_type),
935                                                false);
936           left_operand = convert (TREE_TYPE (right_operand),
937                                   integer_zero_node);
938         }
939       else
940         {
941           left_operand = convert (left_base_type, left_operand);
942           right_operand = convert (right_base_type, right_operand);
943         }
944
945       modulus = NULL_TREE;
946       break;
947
948     case PREINCREMENT_EXPR:
949     case PREDECREMENT_EXPR:
950     case POSTINCREMENT_EXPR:
951     case POSTDECREMENT_EXPR:
952       /* In these, the result type and the left operand type should be the
953          same.  Do the operation in the base type of those and convert the
954          right operand (which is an integer) to that type.
955
956          Note that these operations are only used in loop control where
957          we guarantee that no overflow can occur.  So nothing special need
958          be done for modular types.  */
959
960       gcc_assert (left_type == result_type);
961       operation_type = get_base_type (result_type);
962       left_operand = convert (operation_type, left_operand);
963       right_operand = convert (operation_type, right_operand);
964       has_side_effects = true;
965       modulus = NULL_TREE;
966       break;
967
968     case LSHIFT_EXPR:
969     case RSHIFT_EXPR:
970     case LROTATE_EXPR:
971     case RROTATE_EXPR:
972        /* The RHS of a shift can be any type.  Also, ignore any modulus
973          (we used to abort, but this is needed for unchecked conversion
974          to modular types).  Otherwise, processing is the same as normal.  */
975       gcc_assert (operation_type == left_base_type);
976       modulus = NULL_TREE;
977       left_operand = convert (operation_type, left_operand);
978       break;
979
980     case TRUTH_ANDIF_EXPR:
981     case TRUTH_ORIF_EXPR:
982     case TRUTH_AND_EXPR:
983     case TRUTH_OR_EXPR:
984     case TRUTH_XOR_EXPR:
985       left_operand = gnat_truthvalue_conversion (left_operand);
986       right_operand = gnat_truthvalue_conversion (right_operand);
987       goto common;
988
989     case BIT_AND_EXPR:
990     case BIT_IOR_EXPR:
991     case BIT_XOR_EXPR:
992       /* For binary modulus, if the inputs are in range, so are the
993          outputs.  */
994       if (modulus && integer_pow2p (modulus))
995         modulus = NULL_TREE;
996       goto common;
997
998     case COMPLEX_EXPR:
999       gcc_assert (TREE_TYPE (result_type) == left_base_type
1000                   && TREE_TYPE (result_type) == right_base_type);
1001       left_operand = convert (left_base_type, left_operand);
1002       right_operand = convert (right_base_type, right_operand);
1003       break;
1004
1005     case TRUNC_DIV_EXPR:   case TRUNC_MOD_EXPR:
1006     case CEIL_DIV_EXPR:    case CEIL_MOD_EXPR:
1007     case FLOOR_DIV_EXPR:   case FLOOR_MOD_EXPR:
1008     case ROUND_DIV_EXPR:   case ROUND_MOD_EXPR:
1009       /* These always produce results lower than either operand.  */
1010       modulus = NULL_TREE;
1011       goto common;
1012
1013     case POINTER_PLUS_EXPR:
1014       gcc_assert (operation_type == left_base_type
1015                   && sizetype == right_base_type);
1016       left_operand = convert (operation_type, left_operand);
1017       right_operand = convert (sizetype, right_operand);
1018       break;
1019
1020     case PLUS_EXPR:
1021     case MINUS_EXPR:
1022       /* Avoid doing arithmetics in BOOLEAN_TYPE like the other compilers.
1023          Contrary to C, Ada doesn't allow arithmetics in Standard.Boolean
1024          but we can generate addition or subtraction for 'Succ and 'Pred.  */
1025       if (operation_type && TREE_CODE (operation_type) == BOOLEAN_TYPE)
1026         operation_type = left_base_type = right_base_type = integer_type_node;
1027       goto common;
1028
1029     default:
1030     common:
1031       /* The result type should be the same as the base types of the
1032          both operands (and they should be the same).  Convert
1033          everything to the result type.  */
1034
1035       gcc_assert (operation_type == left_base_type
1036                   && left_base_type == right_base_type);
1037       left_operand = convert (operation_type, left_operand);
1038       right_operand = convert (operation_type, right_operand);
1039     }
1040
1041   if (modulus && !integer_pow2p (modulus))
1042     {
1043       result = nonbinary_modular_operation (op_code, operation_type,
1044                                             left_operand, right_operand);
1045       modulus = NULL_TREE;
1046     }
1047   /* If either operand is a NULL_EXPR, just return a new one.  */
1048   else if (TREE_CODE (left_operand) == NULL_EXPR)
1049     return build1 (NULL_EXPR, operation_type, TREE_OPERAND (left_operand, 0));
1050   else if (TREE_CODE (right_operand) == NULL_EXPR)
1051     return build1 (NULL_EXPR, operation_type, TREE_OPERAND (right_operand, 0));
1052   else if (op_code == ARRAY_REF || op_code == ARRAY_RANGE_REF)
1053     result = fold (build4 (op_code, operation_type, left_operand,
1054                            right_operand, NULL_TREE, NULL_TREE));
1055   else
1056     result
1057       = fold_build2 (op_code, operation_type, left_operand, right_operand);
1058
1059   TREE_SIDE_EFFECTS (result) |= has_side_effects;
1060   TREE_CONSTANT (result)
1061     |= (TREE_CONSTANT (left_operand) & TREE_CONSTANT (right_operand)
1062         && op_code != ARRAY_REF && op_code != ARRAY_RANGE_REF);
1063
1064   if ((op_code == ARRAY_REF || op_code == ARRAY_RANGE_REF)
1065       && TYPE_VOLATILE (operation_type))
1066     TREE_THIS_VOLATILE (result) = 1;
1067
1068   /* If we are working with modular types, perform the MOD operation
1069      if something above hasn't eliminated the need for it.  */
1070   if (modulus)
1071     result = fold_build2 (FLOOR_MOD_EXPR, operation_type, result,
1072                           convert (operation_type, modulus));
1073
1074   if (result_type && result_type != operation_type)
1075     result = convert (result_type, result);
1076
1077   return result;
1078 }
1079 \f
1080 /* Similar, but for unary operations.  */
1081
1082 tree
1083 build_unary_op (enum tree_code op_code, tree result_type, tree operand)
1084 {
1085   tree type = TREE_TYPE (operand);
1086   tree base_type = get_base_type (type);
1087   tree operation_type = result_type;
1088   tree result;
1089   bool side_effects = false;
1090
1091   if (operation_type
1092       && TREE_CODE (operation_type) == RECORD_TYPE
1093       && TYPE_JUSTIFIED_MODULAR_P (operation_type))
1094     operation_type = TREE_TYPE (TYPE_FIELDS (operation_type));
1095
1096   if (operation_type
1097       && !AGGREGATE_TYPE_P (operation_type)
1098       && TYPE_EXTRA_SUBTYPE_P (operation_type))
1099     operation_type = get_base_type (operation_type);
1100
1101   switch (op_code)
1102     {
1103     case REALPART_EXPR:
1104     case IMAGPART_EXPR:
1105       if (!operation_type)
1106         result_type = operation_type = TREE_TYPE (type);
1107       else
1108         gcc_assert (result_type == TREE_TYPE (type));
1109
1110       result = fold_build1 (op_code, operation_type, operand);
1111       break;
1112
1113     case TRUTH_NOT_EXPR:
1114       gcc_assert (result_type == base_type);
1115       result = invert_truthvalue (gnat_truthvalue_conversion (operand));
1116       break;
1117
1118     case ATTR_ADDR_EXPR:
1119     case ADDR_EXPR:
1120       switch (TREE_CODE (operand))
1121         {
1122         case INDIRECT_REF:
1123         case UNCONSTRAINED_ARRAY_REF:
1124           result = TREE_OPERAND (operand, 0);
1125
1126           /* Make sure the type here is a pointer, not a reference.
1127              GCC wants pointer types for function addresses.  */
1128           if (!result_type)
1129             result_type = build_pointer_type (type);
1130
1131           /* If the underlying object can alias everything, propagate the
1132              property since we are effectively retrieving the object.  */
1133           if (POINTER_TYPE_P (TREE_TYPE (result))
1134               && TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (result)))
1135             {
1136               if (TREE_CODE (result_type) == POINTER_TYPE
1137                   && !TYPE_REF_CAN_ALIAS_ALL (result_type))
1138                 result_type
1139                   = build_pointer_type_for_mode (TREE_TYPE (result_type),
1140                                                  TYPE_MODE (result_type),
1141                                                  true);
1142               else if (TREE_CODE (result_type) == REFERENCE_TYPE
1143                        && !TYPE_REF_CAN_ALIAS_ALL (result_type))
1144                 result_type
1145                   = build_reference_type_for_mode (TREE_TYPE (result_type),
1146                                                    TYPE_MODE (result_type),
1147                                                    true);
1148             }
1149           break;
1150
1151         case NULL_EXPR:
1152           result = operand;
1153           TREE_TYPE (result) = type = build_pointer_type (type);
1154           break;
1155
1156         case ARRAY_REF:
1157         case ARRAY_RANGE_REF:
1158         case COMPONENT_REF:
1159         case BIT_FIELD_REF:
1160             /* If this is for 'Address, find the address of the prefix and
1161                add the offset to the field.  Otherwise, do this the normal
1162                way.  */
1163           if (op_code == ATTR_ADDR_EXPR)
1164             {
1165               HOST_WIDE_INT bitsize;
1166               HOST_WIDE_INT bitpos;
1167               tree offset, inner;
1168               enum machine_mode mode;
1169               int unsignedp, volatilep;
1170
1171               inner = get_inner_reference (operand, &bitsize, &bitpos, &offset,
1172                                            &mode, &unsignedp, &volatilep,
1173                                            false);
1174
1175               /* If INNER is a padding type whose field has a self-referential
1176                  size, convert to that inner type.  We know the offset is zero
1177                  and we need to have that type visible.  */
1178               if (TREE_CODE (TREE_TYPE (inner)) == RECORD_TYPE
1179                   && TYPE_IS_PADDING_P (TREE_TYPE (inner))
1180                   && (CONTAINS_PLACEHOLDER_P
1181                       (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS
1182                                              (TREE_TYPE (inner)))))))
1183                 inner = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (inner))),
1184                                  inner);
1185
1186               /* Compute the offset as a byte offset from INNER.  */
1187               if (!offset)
1188                 offset = size_zero_node;
1189
1190               if (bitpos % BITS_PER_UNIT != 0)
1191                 post_error
1192                   ("taking address of object not aligned on storage unit?",
1193                    error_gnat_node);
1194
1195               offset = size_binop (PLUS_EXPR, offset,
1196                                    size_int (bitpos / BITS_PER_UNIT));
1197
1198               /* Take the address of INNER, convert the offset to void *, and
1199                  add then.  It will later be converted to the desired result
1200                  type, if any.  */
1201               inner = build_unary_op (ADDR_EXPR, NULL_TREE, inner);
1202               inner = convert (ptr_void_type_node, inner);
1203               result = build_binary_op (POINTER_PLUS_EXPR, ptr_void_type_node,
1204                                         inner, offset);
1205               result = convert (build_pointer_type (TREE_TYPE (operand)),
1206                                 result);
1207               break;
1208             }
1209           goto common;
1210
1211         case CONSTRUCTOR:
1212           /* If this is just a constructor for a padded record, we can
1213              just take the address of the single field and convert it to
1214              a pointer to our type.  */
1215           if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
1216             {
1217               result = (VEC_index (constructor_elt,
1218                                    CONSTRUCTOR_ELTS (operand),
1219                                    0)
1220                         ->value);
1221
1222               result = convert (build_pointer_type (TREE_TYPE (operand)),
1223                                 build_unary_op (ADDR_EXPR, NULL_TREE, result));
1224               break;
1225             }
1226
1227           goto common;
1228
1229         case NOP_EXPR:
1230           if (AGGREGATE_TYPE_P (type)
1231               && AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (operand, 0))))
1232             return build_unary_op (ADDR_EXPR, result_type,
1233                                    TREE_OPERAND (operand, 0));
1234
1235           /* ... fallthru ... */
1236
1237         case VIEW_CONVERT_EXPR:
1238           /* If this just a variant conversion or if the conversion doesn't
1239              change the mode, get the result type from this type and go down.
1240              This is needed for conversions of CONST_DECLs, to eventually get
1241              to the address of their CORRESPONDING_VARs.  */
1242           if ((TYPE_MAIN_VARIANT (type)
1243                == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (operand, 0))))
1244               || (TYPE_MODE (type) != BLKmode
1245                   && (TYPE_MODE (type)
1246                       == TYPE_MODE (TREE_TYPE (TREE_OPERAND (operand, 0))))))
1247             return build_unary_op (ADDR_EXPR,
1248                                    (result_type ? result_type
1249                                     : build_pointer_type (type)),
1250                                    TREE_OPERAND (operand, 0));
1251           goto common;
1252
1253         case CONST_DECL:
1254           operand = DECL_CONST_CORRESPONDING_VAR (operand);
1255
1256           /* ... fall through ... */
1257
1258         default:
1259         common:
1260
1261           /* If we are taking the address of a padded record whose field is
1262              contains a template, take the address of the template.  */
1263           if (TREE_CODE (type) == RECORD_TYPE
1264               && TYPE_IS_PADDING_P (type)
1265               && TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == RECORD_TYPE
1266               && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (TYPE_FIELDS (type))))
1267             {
1268               type = TREE_TYPE (TYPE_FIELDS (type));
1269               operand = convert (type, operand);
1270             }
1271
1272           if (type != error_mark_node)
1273             operation_type = build_pointer_type (type);
1274
1275           gnat_mark_addressable (operand);
1276           result = fold_build1 (ADDR_EXPR, operation_type, operand);
1277         }
1278
1279       TREE_CONSTANT (result) = staticp (operand) || TREE_CONSTANT (operand);
1280       break;
1281
1282     case INDIRECT_REF:
1283       /* If we want to refer to an entire unconstrained array,
1284          make up an expression to do so.  This will never survive to
1285          the backend.  If TYPE is a thin pointer, first convert the
1286          operand to a fat pointer.  */
1287       if (TYPE_THIN_POINTER_P (type)
1288           && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
1289         {
1290           operand
1291             = convert (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))),
1292                        operand);
1293           type = TREE_TYPE (operand);
1294         }
1295
1296       if (TYPE_FAT_POINTER_P (type))
1297         {
1298           result = build1 (UNCONSTRAINED_ARRAY_REF,
1299                            TYPE_UNCONSTRAINED_ARRAY (type), operand);
1300           TREE_READONLY (result) = TREE_STATIC (result)
1301             = TYPE_READONLY (TYPE_UNCONSTRAINED_ARRAY (type));
1302         }
1303       else if (TREE_CODE (operand) == ADDR_EXPR)
1304         result = TREE_OPERAND (operand, 0);
1305
1306       else
1307         {
1308           result = fold_build1 (op_code, TREE_TYPE (type), operand);
1309           TREE_READONLY (result) = TYPE_READONLY (TREE_TYPE (type));
1310         }
1311
1312       side_effects
1313         =  (!TYPE_FAT_POINTER_P (type) && TYPE_VOLATILE (TREE_TYPE (type)));
1314       break;
1315
1316     case NEGATE_EXPR:
1317     case BIT_NOT_EXPR:
1318       {
1319         tree modulus = ((operation_type
1320                          && TREE_CODE (operation_type) == INTEGER_TYPE
1321                          && TYPE_MODULAR_P (operation_type))
1322                         ? TYPE_MODULUS (operation_type) : NULL_TREE);
1323         int mod_pow2 = modulus && integer_pow2p (modulus);
1324
1325         /* If this is a modular type, there are various possibilities
1326            depending on the operation and whether the modulus is a
1327            power of two or not.  */
1328
1329         if (modulus)
1330           {
1331             gcc_assert (operation_type == base_type);
1332             operand = convert (operation_type, operand);
1333
1334             /* The fastest in the negate case for binary modulus is
1335                the straightforward code; the TRUNC_MOD_EXPR below
1336                is an AND operation.  */
1337             if (op_code == NEGATE_EXPR && mod_pow2)
1338               result = fold_build2 (TRUNC_MOD_EXPR, operation_type,
1339                                     fold_build1 (NEGATE_EXPR, operation_type,
1340                                                  operand),
1341                                     modulus);
1342
1343             /* For nonbinary negate case, return zero for zero operand,
1344                else return the modulus minus the operand.  If the modulus
1345                is a power of two minus one, we can do the subtraction
1346                as an XOR since it is equivalent and faster on most machines. */
1347             else if (op_code == NEGATE_EXPR && !mod_pow2)
1348               {
1349                 if (integer_pow2p (fold_build2 (PLUS_EXPR, operation_type,
1350                                                 modulus,
1351                                                 convert (operation_type,
1352                                                          integer_one_node))))
1353                   result = fold_build2 (BIT_XOR_EXPR, operation_type,
1354                                         operand, modulus);
1355                 else
1356                   result = fold_build2 (MINUS_EXPR, operation_type,
1357                                         modulus, operand);
1358
1359                 result = fold_build3 (COND_EXPR, operation_type,
1360                                       fold_build2 (NE_EXPR,
1361                                                    integer_type_node,
1362                                                    operand,
1363                                                    convert
1364                                                      (operation_type,
1365                                                       integer_zero_node)),
1366                                       result, operand);
1367               }
1368             else
1369               {
1370                 /* For the NOT cases, we need a constant equal to
1371                    the modulus minus one.  For a binary modulus, we
1372                    XOR against the constant and subtract the operand from
1373                    that constant for nonbinary modulus.  */
1374
1375                 tree cnst = fold_build2 (MINUS_EXPR, operation_type, modulus,
1376                                          convert (operation_type,
1377                                                   integer_one_node));
1378
1379                 if (mod_pow2)
1380                   result = fold_build2 (BIT_XOR_EXPR, operation_type,
1381                                         operand, cnst);
1382                 else
1383                   result = fold_build2 (MINUS_EXPR, operation_type,
1384                                         cnst, operand);
1385               }
1386
1387             break;
1388           }
1389       }
1390
1391       /* ... fall through ... */
1392
1393     default:
1394       gcc_assert (operation_type == base_type);
1395       result = fold_build1 (op_code, operation_type,
1396                             convert (operation_type, operand));
1397     }
1398
1399   if (side_effects)
1400     {
1401       TREE_SIDE_EFFECTS (result) = 1;
1402       if (TREE_CODE (result) == INDIRECT_REF)
1403         TREE_THIS_VOLATILE (result) = TYPE_VOLATILE (TREE_TYPE (result));
1404     }
1405
1406   if (result_type && TREE_TYPE (result) != result_type)
1407     result = convert (result_type, result);
1408
1409   return result;
1410 }
1411 \f
1412 /* Similar, but for COND_EXPR.  */
1413
1414 tree
1415 build_cond_expr (tree result_type, tree condition_operand,
1416                  tree true_operand, tree false_operand)
1417 {
1418   tree result;
1419   bool addr_p = false;
1420
1421   /* The front-end verifies that result, true and false operands have same base
1422      type.  Convert everything to the result type.  */
1423
1424   true_operand  = convert (result_type, true_operand);
1425   false_operand = convert (result_type, false_operand);
1426
1427   /* If the result type is unconstrained, take the address of
1428      the operands and then dereference our result.  */
1429   if (TREE_CODE (result_type) == UNCONSTRAINED_ARRAY_TYPE
1430       || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type)))
1431     {
1432       addr_p = true;
1433       result_type = build_pointer_type (result_type);
1434       true_operand = build_unary_op (ADDR_EXPR, result_type, true_operand);
1435       false_operand = build_unary_op (ADDR_EXPR, result_type, false_operand);
1436     }
1437
1438   result = fold_build3 (COND_EXPR, result_type, condition_operand,
1439                         true_operand, false_operand);
1440
1441   /* If either operand is a SAVE_EXPR (possibly surrounded by
1442      arithmetic, make sure it gets done.  */
1443   true_operand  = skip_simple_arithmetic (true_operand);
1444   false_operand = skip_simple_arithmetic (false_operand);
1445
1446   if (TREE_CODE (true_operand) == SAVE_EXPR)
1447     result = build2 (COMPOUND_EXPR, result_type, true_operand, result);
1448
1449   if (TREE_CODE (false_operand) == SAVE_EXPR)
1450     result = build2 (COMPOUND_EXPR, result_type, false_operand, result);
1451
1452   /* ??? Seems the code above is wrong, as it may move ahead of the COND
1453      SAVE_EXPRs with side effects and not shared by both arms.  */
1454
1455  if (addr_p)
1456     result = build_unary_op (INDIRECT_REF, NULL_TREE, result);
1457
1458   return result;
1459 }
1460
1461 /* Similar, but for RETURN_EXPR.  If RESULT_DECL is non-zero, build
1462    a RETURN_EXPR around the assignment of RET_VAL to RESULT_DECL.
1463    If RESULT_DECL is zero, build a bare RETURN_EXPR.  */
1464
1465 tree
1466 build_return_expr (tree result_decl, tree ret_val)
1467 {
1468   tree result_expr;
1469
1470   if (result_decl)
1471     {
1472       /* The gimplifier explicitly enforces the following invariant:
1473
1474            RETURN_EXPR
1475                |
1476            MODIFY_EXPR
1477            /        \
1478           /          \
1479       RESULT_DECL    ...
1480
1481       As a consequence, type-homogeneity dictates that we use the type
1482       of the RESULT_DECL as the operation type.  */
1483
1484       tree operation_type = TREE_TYPE (result_decl);
1485
1486       /* Convert the right operand to the operation type.  Note that
1487          it's the same transformation as in the MODIFY_EXPR case of
1488          build_binary_op with the additional guarantee that the type
1489          cannot involve a placeholder, since otherwise the function
1490          would use the "target pointer" return mechanism.  */
1491
1492       if (operation_type != TREE_TYPE (ret_val))
1493         ret_val = convert (operation_type, ret_val);
1494
1495       result_expr
1496         = build2 (MODIFY_EXPR, operation_type, result_decl, ret_val);
1497     }
1498   else
1499     result_expr = NULL_TREE;
1500
1501   return build1 (RETURN_EXPR, void_type_node, result_expr);
1502 }
1503 \f
1504 /* Build a CALL_EXPR to call FUNDECL with one argument, ARG.  Return
1505    the CALL_EXPR.  */
1506
1507 tree
1508 build_call_1_expr (tree fundecl, tree arg)
1509 {
1510   tree call = build_call_nary (TREE_TYPE (TREE_TYPE (fundecl)),
1511                                build_unary_op (ADDR_EXPR, NULL_TREE, fundecl),
1512                                1, arg);
1513   TREE_SIDE_EFFECTS (call) = 1;
1514   return call;
1515 }
1516
1517 /* Build a CALL_EXPR to call FUNDECL with two arguments, ARG1 & ARG2.  Return
1518    the CALL_EXPR.  */
1519
1520 tree
1521 build_call_2_expr (tree fundecl, tree arg1, tree arg2)
1522 {
1523   tree call = build_call_nary (TREE_TYPE (TREE_TYPE (fundecl)),
1524                                build_unary_op (ADDR_EXPR, NULL_TREE, fundecl),
1525                                2, arg1, arg2);
1526   TREE_SIDE_EFFECTS (call) = 1;
1527   return call;
1528 }
1529
1530 /* Likewise to call FUNDECL with no arguments.  */
1531
1532 tree
1533 build_call_0_expr (tree fundecl)
1534 {
1535   /* We rely on build_call_nary to compute TREE_SIDE_EFFECTS.  This makes
1536      it possible to propagate DECL_IS_PURE on parameterless functions.  */
1537   tree call = build_call_nary (TREE_TYPE (TREE_TYPE (fundecl)),
1538                                build_unary_op (ADDR_EXPR, NULL_TREE, fundecl),
1539                                0);
1540   return call;
1541 }
1542 \f
1543 /* Call a function that raises an exception and pass the line number and file
1544    name, if requested.  MSG says which exception function to call.
1545
1546    GNAT_NODE is the gnat node conveying the source location for which the
1547    error should be signaled, or Empty in which case the error is signaled on
1548    the current ref_file_name/input_line.
1549
1550    KIND says which kind of exception this is for
1551    (N_Raise_{Constraint,Storage,Program}_Error).  */
1552
1553 tree
1554 build_call_raise (int msg, Node_Id gnat_node, char kind)
1555 {
1556   tree fndecl = gnat_raise_decls[msg];
1557   tree label = get_exception_label (kind);
1558   tree filename;
1559   int line_number;
1560   const char *str;
1561   int len;
1562
1563   /* If this is to be done as a goto, handle that case.  */
1564   if (label)
1565     {
1566       Entity_Id local_raise = Get_Local_Raise_Call_Entity ();
1567       tree gnu_result = build1 (GOTO_EXPR, void_type_node, label);
1568
1569       /* If Local_Raise is present, generate
1570          Local_Raise (exception'Identity);  */
1571       if (Present (local_raise))
1572         {
1573           tree gnu_local_raise
1574             = gnat_to_gnu_entity (local_raise, NULL_TREE, 0);
1575           tree gnu_exception_entity
1576             = gnat_to_gnu_entity (Get_RT_Exception_Entity (msg), NULL_TREE, 0);
1577           tree gnu_call
1578             = build_call_1_expr (gnu_local_raise,
1579                                  build_unary_op (ADDR_EXPR, NULL_TREE,
1580                                                  gnu_exception_entity));
1581
1582           gnu_result = build2 (COMPOUND_EXPR, void_type_node,
1583                                gnu_call, gnu_result);}
1584
1585       return gnu_result;
1586     }
1587
1588   str
1589     = (Debug_Flag_NN || Exception_Locations_Suppressed)
1590       ? ""
1591       : (gnat_node != Empty && Sloc (gnat_node) != No_Location)
1592         ? IDENTIFIER_POINTER
1593           (get_identifier (Get_Name_String
1594                            (Debug_Source_Name
1595                             (Get_Source_File_Index (Sloc (gnat_node))))))
1596         : ref_filename;
1597
1598   len = strlen (str) + 1;
1599   filename = build_string (len, str);
1600   line_number
1601     = (gnat_node != Empty && Sloc (gnat_node) != No_Location)
1602       ? Get_Logical_Line_Number (Sloc(gnat_node)) : input_line;
1603
1604   TREE_TYPE (filename)
1605     = build_array_type (char_type_node,
1606                         build_index_type (build_int_cst (NULL_TREE, len)));
1607
1608   return
1609     build_call_2_expr (fndecl,
1610                        build1 (ADDR_EXPR, build_pointer_type (char_type_node),
1611                                filename),
1612                        build_int_cst (NULL_TREE, line_number));
1613 }
1614 \f
1615 /* qsort comparer for the bit positions of two constructor elements
1616    for record components.  */
1617
1618 static int
1619 compare_elmt_bitpos (const PTR rt1, const PTR rt2)
1620 {
1621   const_tree const elmt1 = * (const_tree const *) rt1;
1622   const_tree const elmt2 = * (const_tree const *) rt2;
1623   const_tree const field1 = TREE_PURPOSE (elmt1);
1624   const_tree const field2 = TREE_PURPOSE (elmt2);
1625   const int ret
1626     = tree_int_cst_compare (bit_position (field1), bit_position (field2));
1627
1628   return ret ? ret : (int) (DECL_UID (field1) - DECL_UID (field2));
1629 }
1630
1631 /* Return a CONSTRUCTOR of TYPE whose list is LIST.  */
1632
1633 tree
1634 gnat_build_constructor (tree type, tree list)
1635 {
1636   tree elmt;
1637   int n_elmts;
1638   bool allconstant = (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST);
1639   bool side_effects = false;
1640   tree result;
1641
1642   /* Scan the elements to see if they are all constant or if any has side
1643      effects, to let us set global flags on the resulting constructor.  Count
1644      the elements along the way for possible sorting purposes below.  */
1645   for (n_elmts = 0, elmt = list; elmt; elmt = TREE_CHAIN (elmt), n_elmts ++)
1646     {
1647       if (!TREE_CONSTANT (TREE_VALUE (elmt))
1648           || (TREE_CODE (type) == RECORD_TYPE
1649               && DECL_BIT_FIELD (TREE_PURPOSE (elmt))
1650               && TREE_CODE (TREE_VALUE (elmt)) != INTEGER_CST)
1651           || !initializer_constant_valid_p (TREE_VALUE (elmt),
1652                                             TREE_TYPE (TREE_VALUE (elmt))))
1653         allconstant = false;
1654
1655       if (TREE_SIDE_EFFECTS (TREE_VALUE (elmt)))
1656         side_effects = true;
1657
1658       /* Propagate an NULL_EXPR from the size of the type.  We won't ever
1659          be executing the code we generate here in that case, but handle it
1660          specially to avoid the compiler blowing up.  */
1661       if (TREE_CODE (type) == RECORD_TYPE
1662           && (0 != (result
1663                     = contains_null_expr (DECL_SIZE (TREE_PURPOSE (elmt))))))
1664         return build1 (NULL_EXPR, type, TREE_OPERAND (result, 0));
1665     }
1666
1667   /* For record types with constant components only, sort field list
1668      by increasing bit position.  This is necessary to ensure the
1669      constructor can be output as static data.  */
1670   if (allconstant && TREE_CODE (type) == RECORD_TYPE && n_elmts > 1)
1671     {
1672       /* Fill an array with an element tree per index, and ask qsort to order
1673          them according to what a bitpos comparison function says.  */
1674       tree *gnu_arr = (tree *) alloca (sizeof (tree) * n_elmts);
1675       int i;
1676
1677       for (i = 0, elmt = list; elmt; elmt = TREE_CHAIN (elmt), i++)
1678         gnu_arr[i] = elmt;
1679
1680       qsort (gnu_arr, n_elmts, sizeof (tree), compare_elmt_bitpos);
1681
1682       /* Then reconstruct the list from the sorted array contents.  */
1683       list = NULL_TREE;
1684       for (i = n_elmts - 1; i >= 0; i--)
1685         {
1686           TREE_CHAIN (gnu_arr[i]) = list;
1687           list = gnu_arr[i];
1688         }
1689     }
1690
1691   result = build_constructor_from_list (type, list);
1692   TREE_CONSTANT (result) = TREE_STATIC (result) = allconstant;
1693   TREE_SIDE_EFFECTS (result) = side_effects;
1694   TREE_READONLY (result) = TYPE_READONLY (type) || allconstant;
1695   return result;
1696 }
1697 \f
1698 /* Return a COMPONENT_REF to access a field that is given by COMPONENT,
1699    an IDENTIFIER_NODE giving the name of the field, or FIELD, a FIELD_DECL,
1700    for the field.  Don't fold the result if NO_FOLD_P is true.
1701
1702    We also handle the fact that we might have been passed a pointer to the
1703    actual record and know how to look for fields in variant parts.  */
1704
1705 static tree
1706 build_simple_component_ref (tree record_variable, tree component,
1707                             tree field, bool no_fold_p)
1708 {
1709   tree record_type = TYPE_MAIN_VARIANT (TREE_TYPE (record_variable));
1710   tree ref, inner_variable;
1711
1712   gcc_assert ((TREE_CODE (record_type) == RECORD_TYPE
1713                || TREE_CODE (record_type) == UNION_TYPE
1714                || TREE_CODE (record_type) == QUAL_UNION_TYPE)
1715               && TYPE_SIZE (record_type)
1716               && (component != 0) != (field != 0));
1717
1718   /* If no field was specified, look for a field with the specified name
1719      in the current record only.  */
1720   if (!field)
1721     for (field = TYPE_FIELDS (record_type); field;
1722          field = TREE_CHAIN (field))
1723       if (DECL_NAME (field) == component)
1724         break;
1725
1726   if (!field)
1727     return NULL_TREE;
1728
1729   /* If this field is not in the specified record, see if we can find
1730      something in the record whose original field is the same as this one. */
1731   if (DECL_CONTEXT (field) != record_type)
1732     /* Check if there is a field with name COMPONENT in the record.  */
1733     {
1734       tree new_field;
1735
1736       /* First loop thru normal components.  */
1737
1738       for (new_field = TYPE_FIELDS (record_type); new_field;
1739            new_field = TREE_CHAIN (new_field))
1740         if (field == new_field
1741             || DECL_ORIGINAL_FIELD (new_field) == field
1742             || new_field == DECL_ORIGINAL_FIELD (field)
1743             || (DECL_ORIGINAL_FIELD (field)
1744                 && (DECL_ORIGINAL_FIELD (field)
1745                     == DECL_ORIGINAL_FIELD (new_field))))
1746           break;
1747
1748       /* Next, loop thru DECL_INTERNAL_P components if we haven't found
1749          the component in the first search. Doing this search in 2 steps
1750          is required to avoiding hidden homonymous fields in the
1751          _Parent field.  */
1752
1753       if (!new_field)
1754         for (new_field = TYPE_FIELDS (record_type); new_field;
1755              new_field = TREE_CHAIN (new_field))
1756           if (DECL_INTERNAL_P (new_field))
1757             {
1758               tree field_ref
1759                 = build_simple_component_ref (record_variable,
1760                                               NULL_TREE, new_field, no_fold_p);
1761               ref = build_simple_component_ref (field_ref, NULL_TREE, field,
1762                                                 no_fold_p);
1763
1764               if (ref)
1765                 return ref;
1766             }
1767
1768       field = new_field;
1769     }
1770
1771   if (!field)
1772     return NULL_TREE;
1773
1774   /* If the field's offset has overflowed, do not attempt to access it
1775      as doing so may trigger sanity checks deeper in the back-end.
1776      Note that we don't need to warn since this will be done on trying
1777      to declare the object.  */
1778   if (TREE_CODE (DECL_FIELD_OFFSET (field)) == INTEGER_CST
1779       && TREE_OVERFLOW (DECL_FIELD_OFFSET (field)))
1780     return NULL_TREE;
1781
1782   /* Look through conversion between type variants.  Note that this
1783      is transparent as far as the field is concerned.  */
1784   if (TREE_CODE (record_variable) == VIEW_CONVERT_EXPR
1785       && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (record_variable, 0)))
1786          == record_type)
1787     inner_variable = TREE_OPERAND (record_variable, 0);
1788   else
1789     inner_variable = record_variable;
1790
1791   ref = build3 (COMPONENT_REF, TREE_TYPE (field), inner_variable, field,
1792                 NULL_TREE);
1793
1794   if (TREE_READONLY (record_variable) || TREE_READONLY (field))
1795     TREE_READONLY (ref) = 1;
1796   if (TREE_THIS_VOLATILE (record_variable) || TREE_THIS_VOLATILE (field)
1797       || TYPE_VOLATILE (record_type))
1798     TREE_THIS_VOLATILE (ref) = 1;
1799
1800   if (no_fold_p)
1801     return ref;
1802
1803   /* The generic folder may punt in this case because the inner array type
1804      can be self-referential, but folding is in fact not problematic.  */
1805   else if (TREE_CODE (record_variable) == CONSTRUCTOR
1806            && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (record_variable)))
1807     {
1808       VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (record_variable);
1809       unsigned HOST_WIDE_INT idx;
1810       tree index, value;
1811       FOR_EACH_CONSTRUCTOR_ELT (elts, idx, index, value)
1812         if (index == field)
1813           return value;
1814       return ref;
1815     }
1816
1817   else
1818     return fold (ref);
1819 }
1820 \f
1821 /* Like build_simple_component_ref, except that we give an error if the
1822    reference could not be found.  */
1823
1824 tree
1825 build_component_ref (tree record_variable, tree component,
1826                      tree field, bool no_fold_p)
1827 {
1828   tree ref = build_simple_component_ref (record_variable, component, field,
1829                                          no_fold_p);
1830
1831   if (ref)
1832     return ref;
1833
1834   /* If FIELD was specified, assume this is an invalid user field so
1835      raise constraint error.  Otherwise, we can't find the type to return, so
1836      abort.  */
1837   gcc_assert (field);
1838   return build1 (NULL_EXPR, TREE_TYPE (field),
1839                  build_call_raise (CE_Discriminant_Check_Failed, Empty,
1840                                    N_Raise_Constraint_Error));
1841 }
1842 \f
1843 /* Build a GCC tree to call an allocation or deallocation function.
1844    If GNU_OBJ is nonzero, it is an object to deallocate.  Otherwise,
1845    generate an allocator.
1846
1847    GNU_SIZE is the size of the object in bytes and ALIGN is the alignment in
1848    bits.  GNAT_PROC, if present, is a procedure to call and GNAT_POOL is the
1849    storage pool to use.  If not preset, malloc and free will be used except
1850    if GNAT_PROC is the "fake" value of -1, in which case we allocate the
1851    object dynamically on the stack frame.  */
1852
1853 tree
1854 build_call_alloc_dealloc (tree gnu_obj, tree gnu_size, unsigned align,
1855                           Entity_Id gnat_proc, Entity_Id gnat_pool,
1856                           Node_Id gnat_node)
1857 {
1858   tree gnu_align = size_int (align / BITS_PER_UNIT);
1859
1860   gnu_size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_size, gnu_obj);
1861
1862   if (Present (gnat_proc))
1863     {
1864       /* The storage pools are obviously always tagged types, but the
1865          secondary stack uses the same mechanism and is not tagged */
1866       if (Is_Tagged_Type (Etype (gnat_pool)))
1867         {
1868           /* The size is the third parameter; the alignment is the
1869              same type.  */
1870           Entity_Id gnat_size_type
1871             = Etype (Next_Formal (Next_Formal (First_Formal (gnat_proc))));
1872           tree gnu_size_type = gnat_to_gnu_type (gnat_size_type);
1873           tree gnu_proc = gnat_to_gnu (gnat_proc);
1874           tree gnu_proc_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_proc);
1875           tree gnu_pool = gnat_to_gnu (gnat_pool);
1876           tree gnu_pool_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_pool);
1877           tree gnu_call;
1878
1879           gnu_size = convert (gnu_size_type, gnu_size);
1880           gnu_align = convert (gnu_size_type, gnu_align);
1881
1882           /* The first arg is always the address of the storage pool; next
1883              comes the address of the object, for a deallocator, then the
1884              size and alignment.  */
1885           if (gnu_obj)
1886             gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1887                                         gnu_proc_addr, 4, gnu_pool_addr,
1888                                         gnu_obj, gnu_size, gnu_align);
1889           else
1890             gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1891                                         gnu_proc_addr, 3, gnu_pool_addr,
1892                                         gnu_size, gnu_align);
1893           TREE_SIDE_EFFECTS (gnu_call) = 1;
1894           return gnu_call;
1895         }
1896
1897       /* Secondary stack case.  */
1898       else
1899         {
1900           /* The size is the second parameter */
1901           Entity_Id gnat_size_type
1902             = Etype (Next_Formal (First_Formal (gnat_proc)));
1903           tree gnu_size_type = gnat_to_gnu_type (gnat_size_type);
1904           tree gnu_proc = gnat_to_gnu (gnat_proc);
1905           tree gnu_proc_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_proc);
1906           tree gnu_call;
1907
1908           gnu_size = convert (gnu_size_type, gnu_size);
1909
1910           /* The first arg is the address of the object, for a
1911              deallocator, then the size */
1912           if (gnu_obj)
1913             gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1914                                         gnu_proc_addr, 2, gnu_obj, gnu_size);
1915           else
1916             gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1917                                         gnu_proc_addr, 1, gnu_size);
1918           TREE_SIDE_EFFECTS (gnu_call) = 1;
1919           return gnu_call;
1920         }
1921     }
1922
1923   else if (gnu_obj)
1924     return build_call_1_expr (free_decl, gnu_obj);
1925
1926   /* ??? For now, disable variable-sized allocators in the stack since
1927      we can't yet gimplify an ALLOCATE_EXPR.  */
1928   else if (gnat_pool == -1
1929            && TREE_CODE (gnu_size) == INTEGER_CST && !flag_stack_check)
1930     {
1931       /* If the size is a constant, we can put it in the fixed portion of
1932          the stack frame to avoid the need to adjust the stack pointer.  */
1933       if (TREE_CODE (gnu_size) == INTEGER_CST && !flag_stack_check)
1934         {
1935           tree gnu_range
1936             = build_range_type (NULL_TREE, size_one_node, gnu_size);
1937           tree gnu_array_type = build_array_type (char_type_node, gnu_range);
1938           tree gnu_decl
1939             = create_var_decl (get_identifier ("RETVAL"), NULL_TREE,
1940                                gnu_array_type, NULL_TREE, false, false, false,
1941                                false, NULL, gnat_node);
1942
1943           return convert (ptr_void_type_node,
1944                           build_unary_op (ADDR_EXPR, NULL_TREE, gnu_decl));
1945         }
1946       else
1947         gcc_unreachable ();
1948 #if 0
1949         return build2 (ALLOCATE_EXPR, ptr_void_type_node, gnu_size, gnu_align);
1950 #endif
1951     }
1952   else
1953     {
1954       if (Nkind (gnat_node) != N_Allocator || !Comes_From_Source (gnat_node))
1955         Check_No_Implicit_Heap_Alloc (gnat_node);
1956
1957       /* If the allocator size is 32bits but the pointer size is 64bits then
1958          allocate 32bit memory (sometimes necessary on 64bit VMS). Otherwise
1959          default to standard malloc. */
1960       if (TARGET_ABI_OPEN_VMS && POINTER_SIZE == 64
1961           && (UI_To_Int (Esize (Etype (gnat_node))) == 32
1962               || Convention (Etype (gnat_node)) == Convention_C))
1963         return build_call_1_expr (malloc32_decl, gnu_size);
1964       else
1965         return build_call_1_expr (malloc_decl, gnu_size);
1966     }
1967 }
1968 \f
1969 /* Build a GCC tree to correspond to allocating an object of TYPE whose
1970    initial value is INIT, if INIT is nonzero.  Convert the expression to
1971    RESULT_TYPE, which must be some type of pointer.  Return the tree.
1972    GNAT_PROC and GNAT_POOL optionally give the procedure to call and
1973    the storage pool to use.  GNAT_NODE is used to provide an error
1974    location for restriction violations messages.  If IGNORE_INIT_TYPE is
1975    true, ignore the type of INIT for the purpose of determining the size;
1976    this will cause the maximum size to be allocated if TYPE is of
1977    self-referential size.  */
1978
1979 tree
1980 build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
1981                  Entity_Id gnat_pool, Node_Id gnat_node, bool ignore_init_type)
1982 {
1983   tree size = TYPE_SIZE_UNIT (type);
1984   tree result;
1985   unsigned int default_allocator_alignment
1986     = get_target_default_allocator_alignment () * BITS_PER_UNIT;
1987
1988   /* If the initializer, if present, is a NULL_EXPR, just return a new one.  */
1989   if (init && TREE_CODE (init) == NULL_EXPR)
1990     return build1 (NULL_EXPR, result_type, TREE_OPERAND (init, 0));
1991
1992   /* If RESULT_TYPE is a fat or thin pointer, set SIZE to be the sum of the
1993      sizes of the object and its template.  Allocate the whole thing and
1994      fill in the parts that are known.  */
1995   else if (TYPE_FAT_OR_THIN_POINTER_P (result_type))
1996     {
1997       tree storage_type
1998         = build_unc_object_type_from_ptr (result_type, type,
1999                                           get_identifier ("ALLOC"));
2000       tree template_type = TREE_TYPE (TYPE_FIELDS (storage_type));
2001       tree storage_ptr_type = build_pointer_type (storage_type);
2002       tree storage;
2003       tree template_cons = NULL_TREE;
2004
2005       size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (storage_type),
2006                                              init);
2007
2008       /* If the size overflows, pass -1 so the allocator will raise
2009          storage error.  */
2010       if (TREE_CODE (size) == INTEGER_CST && TREE_OVERFLOW (size))
2011         size = ssize_int (-1);
2012
2013       storage = build_call_alloc_dealloc (NULL_TREE, size,
2014                                           TYPE_ALIGN (storage_type),
2015                                           gnat_proc, gnat_pool, gnat_node);
2016       storage = convert (storage_ptr_type, protect_multiple_eval (storage));
2017
2018       if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
2019         {
2020           type = TREE_TYPE (TYPE_FIELDS (type));
2021
2022           if (init)
2023             init = convert (type, init);
2024         }
2025
2026       /* If there is an initializing expression, make a constructor for
2027          the entire object including the bounds and copy it into the
2028          object.  If there is no initializing expression, just set the
2029          bounds.  */
2030       if (init)
2031         {
2032           template_cons = tree_cons (TREE_CHAIN (TYPE_FIELDS (storage_type)),
2033                                      init, NULL_TREE);
2034           template_cons = tree_cons (TYPE_FIELDS (storage_type),
2035                                      build_template (template_type, type,
2036                                                      init),
2037                                      template_cons);
2038
2039           return convert
2040             (result_type,
2041              build2 (COMPOUND_EXPR, storage_ptr_type,
2042                      build_binary_op
2043                      (MODIFY_EXPR, storage_type,
2044                       build_unary_op (INDIRECT_REF, NULL_TREE,
2045                                       convert (storage_ptr_type, storage)),
2046                       gnat_build_constructor (storage_type, template_cons)),
2047                      convert (storage_ptr_type, storage)));
2048         }
2049       else
2050         return build2
2051           (COMPOUND_EXPR, result_type,
2052            build_binary_op
2053            (MODIFY_EXPR, template_type,
2054             build_component_ref
2055             (build_unary_op (INDIRECT_REF, NULL_TREE,
2056                              convert (storage_ptr_type, storage)),
2057              NULL_TREE, TYPE_FIELDS (storage_type), 0),
2058             build_template (template_type, type, NULL_TREE)),
2059            convert (result_type, convert (storage_ptr_type, storage)));
2060     }
2061
2062   /* If we have an initializing expression, see if its size is simpler
2063      than the size from the type.  */
2064   if (!ignore_init_type && init && TYPE_SIZE_UNIT (TREE_TYPE (init))
2065       && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (init))) == INTEGER_CST
2066           || CONTAINS_PLACEHOLDER_P (size)))
2067     size = TYPE_SIZE_UNIT (TREE_TYPE (init));
2068
2069   /* If the size is still self-referential, reference the initializing
2070      expression, if it is present.  If not, this must have been a
2071      call to allocate a library-level object, in which case we use
2072      the maximum size.  */
2073   if (CONTAINS_PLACEHOLDER_P (size))
2074     {
2075       if (!ignore_init_type && init)
2076         size = substitute_placeholder_in_expr (size, init);
2077       else
2078         size = max_size (size, true);
2079     }
2080
2081   /* If the size overflows, pass -1 so the allocator will raise
2082      storage error.  */
2083   if (TREE_CODE (size) == INTEGER_CST && TREE_OVERFLOW (size))
2084     size = ssize_int (-1);
2085
2086   /* If this is in the default storage pool and the type alignment is larger
2087      than what the default allocator supports, make an "aligning" record type
2088      with room to store a pointer before the field, allocate an object of that
2089      type, store the system's allocator return value just in front of the
2090      field and return the field's address.  */
2091
2092   if (No (gnat_proc) && TYPE_ALIGN (type) > default_allocator_alignment)
2093     {
2094       /* Construct the aligning type with enough room for a pointer ahead
2095          of the field, then allocate.  */
2096       tree record_type
2097         = make_aligning_type (type, TYPE_ALIGN (type), size,
2098                               default_allocator_alignment,
2099                               POINTER_SIZE / BITS_PER_UNIT);
2100
2101       tree record, record_addr;
2102
2103       record_addr
2104         = build_call_alloc_dealloc (NULL_TREE, TYPE_SIZE_UNIT (record_type),
2105                                     default_allocator_alignment, Empty, Empty,
2106                                     gnat_node);
2107
2108       record_addr
2109         = convert (build_pointer_type (record_type),
2110                    save_expr (record_addr));
2111
2112       record = build_unary_op (INDIRECT_REF, NULL_TREE, record_addr);
2113
2114       /* Our RESULT (the Ada allocator's value) is the super-aligned address
2115          of the internal record field ... */
2116       result
2117         = build_unary_op (ADDR_EXPR, NULL_TREE,
2118                           build_component_ref
2119                           (record, NULL_TREE, TYPE_FIELDS (record_type), 0));
2120       result = convert (result_type, result);
2121
2122       /* ... with the system allocator's return value stored just in
2123          front.  */
2124       {
2125         tree ptr_addr
2126           = build_binary_op (POINTER_PLUS_EXPR, ptr_void_type_node,
2127                              convert (ptr_void_type_node, result),
2128                              size_int (-POINTER_SIZE/BITS_PER_UNIT));
2129
2130         tree ptr_ref
2131           = convert (build_pointer_type (ptr_void_type_node), ptr_addr);
2132
2133         result
2134           = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2135                     build_binary_op (MODIFY_EXPR, NULL_TREE,
2136                                      build_unary_op (INDIRECT_REF, NULL_TREE,
2137                                                      ptr_ref),
2138                                      convert (ptr_void_type_node,
2139                                               record_addr)),
2140                     result);
2141       }
2142     }
2143   else
2144     result = convert (result_type,
2145                       build_call_alloc_dealloc (NULL_TREE, size,
2146                                                 TYPE_ALIGN (type),
2147                                                 gnat_proc,
2148                                                 gnat_pool,
2149                                                 gnat_node));
2150
2151   /* If we have an initial value, put the new address into a SAVE_EXPR, assign
2152      the value, and return the address.  Do this with a COMPOUND_EXPR.  */
2153
2154   if (init)
2155     {
2156       result = save_expr (result);
2157       result
2158         = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2159                   build_binary_op
2160                   (MODIFY_EXPR, NULL_TREE,
2161                    build_unary_op (INDIRECT_REF,
2162                                    TREE_TYPE (TREE_TYPE (result)), result),
2163                    init),
2164                   result);
2165     }
2166
2167   return convert (result_type, result);
2168 }
2169 \f
2170 /* Fill in a VMS descriptor for EXPR and return a constructor for it.
2171    GNAT_FORMAL is how we find the descriptor record.  GNAT_ACTUAL is
2172    how we derive the source location to raise C_E on an out of range
2173    pointer. */
2174
2175 tree
2176 fill_vms_descriptor (tree expr, Entity_Id gnat_formal, Node_Id gnat_actual)
2177 {
2178   tree field;
2179   tree parm_decl = get_gnu_tree (gnat_formal);
2180   tree const_list = NULL_TREE;
2181   tree record_type = TREE_TYPE (TREE_TYPE (parm_decl));
2182   int do_range_check =
2183       strcmp ("MBO",
2184               IDENTIFIER_POINTER (DECL_NAME (TYPE_FIELDS (record_type))));
2185
2186   expr = maybe_unconstrained_array (expr);
2187   gnat_mark_addressable (expr);
2188
2189   for (field = TYPE_FIELDS (record_type); field; field = TREE_CHAIN (field))
2190     {
2191       tree conexpr = convert (TREE_TYPE (field),
2192                               SUBSTITUTE_PLACEHOLDER_IN_EXPR
2193                               (DECL_INITIAL (field), expr));
2194
2195       /* Check to ensure that only 32bit pointers are passed in
2196          32bit descriptors */
2197       if (do_range_check &&
2198           strcmp (IDENTIFIER_POINTER (DECL_NAME (field)), "POINTER") == 0)
2199         {
2200           tree pointer64type =
2201              build_pointer_type_for_mode (void_type_node, DImode, false);
2202           tree addr64expr = build_unary_op (ADDR_EXPR, pointer64type, expr);
2203           tree malloc64low =
2204              build_int_cstu (long_integer_type_node, 0x80000000);
2205
2206           add_stmt (build3 (COND_EXPR, void_type_node,
2207                             build_binary_op (GE_EXPR, long_integer_type_node,
2208                                              convert (long_integer_type_node,
2209                                                       addr64expr), 
2210                                              malloc64low),
2211                             build_call_raise (CE_Range_Check_Failed, gnat_actual,
2212                                               N_Raise_Constraint_Error),
2213                             NULL_TREE));
2214         }
2215       const_list = tree_cons (field, conexpr, const_list);
2216     }
2217
2218   return gnat_build_constructor (record_type, nreverse (const_list));
2219 }
2220
2221 /* Indicate that we need to make the address of EXPR_NODE and it therefore
2222    should not be allocated in a register.  Returns true if successful.  */
2223
2224 bool
2225 gnat_mark_addressable (tree expr_node)
2226 {
2227   while (1)
2228     switch (TREE_CODE (expr_node))
2229       {
2230       case ADDR_EXPR:
2231       case COMPONENT_REF:
2232       case ARRAY_REF:
2233       case ARRAY_RANGE_REF:
2234       case REALPART_EXPR:
2235       case IMAGPART_EXPR:
2236       case VIEW_CONVERT_EXPR:
2237       case NON_LVALUE_EXPR:
2238       CASE_CONVERT:
2239         expr_node = TREE_OPERAND (expr_node, 0);
2240         break;
2241
2242       case CONSTRUCTOR:
2243         TREE_ADDRESSABLE (expr_node) = 1;
2244         return true;
2245
2246       case VAR_DECL:
2247       case PARM_DECL:
2248       case RESULT_DECL:
2249         TREE_ADDRESSABLE (expr_node) = 1;
2250         return true;
2251
2252       case FUNCTION_DECL:
2253         TREE_ADDRESSABLE (expr_node) = 1;
2254         return true;
2255
2256       case CONST_DECL:
2257         return (DECL_CONST_CORRESPONDING_VAR (expr_node)
2258                 && (gnat_mark_addressable
2259                     (DECL_CONST_CORRESPONDING_VAR (expr_node))));
2260       default:
2261         return true;
2262     }
2263 }