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