1 /****************************************************************************
3 * GNAT COMPILER COMPONENTS *
7 * C Implementation File *
9 * Copyright (C) 1992-2008, Free Software Foundation, Inc. *
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/>. *
21 * GNAT was originally developed by the GNAT team at New York University. *
22 * Extensive contributions were provided by Ada Core Technologies Inc. *
24 ****************************************************************************/
28 #include "coretypes.h"
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);
56 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR or other logical
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
63 build_binary_op (NE_EXPR, expr, integer_zero_node, 1),
65 but we optimize comparisons, &&, ||, and !.
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. */
72 gnat_truthvalue_conversion (tree expr)
74 tree type = TREE_TYPE (expr);
76 switch (TREE_CODE (expr))
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:
89 return (integer_zerop (expr)
90 ? build_int_cst (type, 0)
91 : build_int_cst (type, 1));
94 return (real_zerop (expr)
95 ? fold_convert (type, integer_zero_node)
96 : fold_convert (type, integer_one_node));
99 /* Distribute the conversion into the arms of a COND_EXPR. */
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),
108 return build_binary_op (NE_EXPR, type, expr,
109 fold_convert (type, integer_zero_node));
113 /* Return the base type of TYPE. */
116 get_base_type (tree type)
118 if (TREE_CODE (type) == RECORD_TYPE
119 && TYPE_JUSTIFIED_MODULAR_P (type))
120 type = TREE_TYPE (TYPE_FIELDS (type));
122 while (TREE_TYPE (type)
123 && (TREE_CODE (type) == INTEGER_TYPE
124 || TREE_CODE (type) == REAL_TYPE))
125 type = TREE_TYPE (type);
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. */
135 known_alignment (tree exp)
137 unsigned int this_alignment;
138 unsigned int lhs, rhs;
139 unsigned int type_alignment;
141 /* For pointer expressions, we know that the designated object is always at
142 least as strictly aligned as the designated subtype, so we account for
143 both type and expression information in this case.
145 Beware that we can still get a dummy designated subtype here (e.g. Taft
146 Amendement types), in which the alignment information is meaningless and
149 We always compute a type_alignment value and return the MAX of it
150 compared with what we get from the expression tree. Just set the
151 type_alignment value to 0 when the type information is to be ignored. */
153 = ((POINTER_TYPE_P (TREE_TYPE (exp))
154 && !TYPE_IS_DUMMY_P (TREE_TYPE (TREE_TYPE (exp))))
155 ? TYPE_ALIGN (TREE_TYPE (TREE_TYPE (exp))) : 0);
157 switch (TREE_CODE (exp))
160 case VIEW_CONVERT_EXPR:
162 case NON_LVALUE_EXPR:
163 /* Conversions between pointers and integers don't change the alignment
164 of the underlying object. */
165 this_alignment = known_alignment (TREE_OPERAND (exp, 0));
169 /* The value of a COMPOUND_EXPR is that of it's second operand. */
170 this_alignment = known_alignment (TREE_OPERAND (exp, 1));
174 case POINTER_PLUS_EXPR:
176 /* If two address are added, the alignment of the result is the
177 minimum of the two alignments. */
178 lhs = known_alignment (TREE_OPERAND (exp, 0));
179 rhs = known_alignment (TREE_OPERAND (exp, 1));
180 this_alignment = MIN (lhs, rhs);
184 /* If there is a choice between two values, use the smallest one. */
185 lhs = known_alignment (TREE_OPERAND (exp, 1));
186 rhs = known_alignment (TREE_OPERAND (exp, 2));
187 this_alignment = MIN (lhs, rhs);
191 /* The first part of this represents the lowest bit in the constant,
192 but is it in bytes, not bits. */
195 * (TREE_INT_CST_LOW (exp) & - TREE_INT_CST_LOW (exp)),
200 /* If we know the alignment of just one side, use it. Otherwise,
201 use the product of the alignments. */
202 lhs = known_alignment (TREE_OPERAND (exp, 0));
203 rhs = known_alignment (TREE_OPERAND (exp, 1));
205 if (lhs == 0 || rhs == 0)
206 this_alignment = MIN (BIGGEST_ALIGNMENT, MAX (lhs, rhs));
208 this_alignment = MIN (BIGGEST_ALIGNMENT, lhs * rhs);
212 /* A bit-and expression is as aligned as the maximum alignment of the
213 operands. We typically get here for a complex lhs and a constant
214 negative power of two on the rhs to force an explicit alignment, so
215 don't bother looking at the lhs. */
216 this_alignment = known_alignment (TREE_OPERAND (exp, 1));
220 this_alignment = expr_align (TREE_OPERAND (exp, 0));
228 return MAX (type_alignment, this_alignment);
231 /* We have a comparison or assignment operation on two types, T1 and T2, which
232 are either both array types or both record types. T1 is assumed to be for
233 the left hand side operand, and T2 for the right hand side. Return the
234 type that both operands should be converted to for the operation, if any.
235 Otherwise return zero. */
238 find_common_type (tree t1, tree t2)
240 /* ??? As of today, various constructs lead here with types of different
241 sizes even when both constants (e.g. tagged types, packable vs regular
242 component types, padded vs unpadded types, ...). While some of these
243 would better be handled upstream (types should be made consistent before
244 calling into build_binary_op), some others are really expected and we
245 have to be careful. */
247 /* We must prevent writing more than what the target may hold if this is for
248 an assignment and the case of tagged types is handled in build_binary_op
249 so use the lhs type if it is known to be smaller, or of constant size and
250 the rhs type is not, whatever the modes. We also force t1 in case of
251 constant size equality to minimize occurrences of view conversions on the
252 lhs of assignments. */
253 if (TREE_CONSTANT (TYPE_SIZE (t1))
254 && (!TREE_CONSTANT (TYPE_SIZE (t2))
255 || !tree_int_cst_lt (TYPE_SIZE (t2), TYPE_SIZE (t1))))
258 /* Otherwise, if the lhs type is non-BLKmode, use it. Note that we know
259 that we will not have any alignment problems since, if we did, the
260 non-BLKmode type could not have been used. */
261 if (TYPE_MODE (t1) != BLKmode)
264 /* If the rhs type is of constant size, use it whatever the modes. At
265 this point it is known to be smaller, or of constant size and the
267 if (TREE_CONSTANT (TYPE_SIZE (t2)))
270 /* Otherwise, if the rhs type is non-BLKmode, use it. */
271 if (TYPE_MODE (t2) != BLKmode)
274 /* In this case, both types have variable size and BLKmode. It's
275 probably best to leave the "type mismatch" because changing it
276 could cause a bad self-referential reference. */
280 /* See if EXP contains a SAVE_EXPR in a position where we would
283 ??? This is a real kludge, but is probably the best approach short
284 of some very general solution. */
287 contains_save_expr_p (tree exp)
289 switch (TREE_CODE (exp))
294 case ADDR_EXPR: case INDIRECT_REF:
296 case NOP_EXPR: case CONVERT_EXPR: case VIEW_CONVERT_EXPR:
297 return contains_save_expr_p (TREE_OPERAND (exp, 0));
302 unsigned HOST_WIDE_INT ix;
304 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), ix, value)
305 if (contains_save_expr_p (value))
315 /* See if EXP contains a NULL_EXPR in an expression we use for sizes. Return
316 it if so. This is used to detect types whose sizes involve computations
317 that are known to raise Constraint_Error. */
320 contains_null_expr (tree exp)
324 if (TREE_CODE (exp) == NULL_EXPR)
327 switch (TREE_CODE_CLASS (TREE_CODE (exp)))
330 return contains_null_expr (TREE_OPERAND (exp, 0));
334 tem = contains_null_expr (TREE_OPERAND (exp, 0));
338 return contains_null_expr (TREE_OPERAND (exp, 1));
341 switch (TREE_CODE (exp))
344 return contains_null_expr (TREE_OPERAND (exp, 0));
347 tem = contains_null_expr (TREE_OPERAND (exp, 0));
351 tem = contains_null_expr (TREE_OPERAND (exp, 1));
355 return contains_null_expr (TREE_OPERAND (exp, 2));
366 /* Return an expression tree representing an equality comparison of
367 A1 and A2, two objects of ARRAY_TYPE. The returned expression should
368 be of type RESULT_TYPE
370 Two arrays are equal in one of two ways: (1) if both have zero length
371 in some dimension (not necessarily the same dimension) or (2) if the
372 lengths in each dimension are equal and the data is equal. We perform the
373 length tests in as efficient a manner as possible. */
376 compare_arrays (tree result_type, tree a1, tree a2)
378 tree t1 = TREE_TYPE (a1);
379 tree t2 = TREE_TYPE (a2);
380 tree result = convert (result_type, integer_one_node);
381 tree a1_is_null = convert (result_type, integer_zero_node);
382 tree a2_is_null = convert (result_type, integer_zero_node);
383 bool length_zero_p = false;
385 /* Process each dimension separately and compare the lengths. If any
386 dimension has a size known to be zero, set SIZE_ZERO_P to 1 to
387 suppress the comparison of the data. */
388 while (TREE_CODE (t1) == ARRAY_TYPE && TREE_CODE (t2) == ARRAY_TYPE)
390 tree lb1 = TYPE_MIN_VALUE (TYPE_DOMAIN (t1));
391 tree ub1 = TYPE_MAX_VALUE (TYPE_DOMAIN (t1));
392 tree lb2 = TYPE_MIN_VALUE (TYPE_DOMAIN (t2));
393 tree ub2 = TYPE_MAX_VALUE (TYPE_DOMAIN (t2));
394 tree bt = get_base_type (TREE_TYPE (lb1));
395 tree length1 = fold_build2 (MINUS_EXPR, bt, ub1, lb1);
396 tree length2 = fold_build2 (MINUS_EXPR, bt, ub2, lb2);
399 tree comparison, this_a1_is_null, this_a2_is_null;
401 /* If the length of the first array is a constant, swap our operands
402 unless the length of the second array is the constant zero.
403 Note that we have set the `length' values to the length - 1. */
404 if (TREE_CODE (length1) == INTEGER_CST
405 && !integer_zerop (fold_build2 (PLUS_EXPR, bt, length2,
406 convert (bt, integer_one_node))))
408 tem = a1, a1 = a2, a2 = tem;
409 tem = t1, t1 = t2, t2 = tem;
410 tem = lb1, lb1 = lb2, lb2 = tem;
411 tem = ub1, ub1 = ub2, ub2 = tem;
412 tem = length1, length1 = length2, length2 = tem;
413 tem = a1_is_null, a1_is_null = a2_is_null, a2_is_null = tem;
416 /* If the length of this dimension in the second array is the constant
417 zero, we can just go inside the original bounds for the first
418 array and see if last < first. */
419 if (integer_zerop (fold_build2 (PLUS_EXPR, bt, length2,
420 convert (bt, integer_one_node))))
422 tree ub = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
423 tree lb = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
425 comparison = build_binary_op (LT_EXPR, result_type, ub, lb);
426 comparison = SUBSTITUTE_PLACEHOLDER_IN_EXPR (comparison, a1);
427 length1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length1, a1);
429 length_zero_p = true;
430 this_a1_is_null = comparison;
431 this_a2_is_null = convert (result_type, integer_one_node);
434 /* If the length is some other constant value, we know that the
435 this dimension in the first array cannot be superflat, so we
436 can just use its length from the actual stored bounds. */
437 else if (TREE_CODE (length2) == INTEGER_CST)
439 ub1 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
440 lb1 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t1)));
441 ub2 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t2)));
442 lb2 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (t2)));
443 nbt = get_base_type (TREE_TYPE (ub1));
446 = build_binary_op (EQ_EXPR, result_type,
447 build_binary_op (MINUS_EXPR, nbt, ub1, lb1),
448 build_binary_op (MINUS_EXPR, nbt, ub2, lb2));
450 /* Note that we know that UB2 and LB2 are constant and hence
451 cannot contain a PLACEHOLDER_EXPR. */
453 comparison = SUBSTITUTE_PLACEHOLDER_IN_EXPR (comparison, a1);
454 length1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length1, a1);
456 this_a1_is_null = build_binary_op (LT_EXPR, result_type, ub1, lb1);
457 this_a2_is_null = convert (result_type, integer_zero_node);
460 /* Otherwise compare the computed lengths. */
463 length1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length1, a1);
464 length2 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (length2, a2);
467 = build_binary_op (EQ_EXPR, result_type, length1, length2);
470 = build_binary_op (LT_EXPR, result_type, length1,
471 convert (bt, integer_zero_node));
473 = build_binary_op (LT_EXPR, result_type, length2,
474 convert (bt, integer_zero_node));
477 result = build_binary_op (TRUTH_ANDIF_EXPR, result_type,
480 a1_is_null = build_binary_op (TRUTH_ORIF_EXPR, result_type,
481 this_a1_is_null, a1_is_null);
482 a2_is_null = build_binary_op (TRUTH_ORIF_EXPR, result_type,
483 this_a2_is_null, a2_is_null);
489 /* Unless the size of some bound is known to be zero, compare the
490 data in the array. */
493 tree type = find_common_type (TREE_TYPE (a1), TREE_TYPE (a2));
496 a1 = convert (type, a1), a2 = convert (type, a2);
498 result = build_binary_op (TRUTH_ANDIF_EXPR, result_type, result,
499 fold_build2 (EQ_EXPR, result_type, a1, a2));
503 /* The result is also true if both sizes are zero. */
504 result = build_binary_op (TRUTH_ORIF_EXPR, result_type,
505 build_binary_op (TRUTH_ANDIF_EXPR, result_type,
506 a1_is_null, a2_is_null),
509 /* If either operand contains SAVE_EXPRs, they have to be evaluated before
510 starting the comparison above since the place it would be otherwise
511 evaluated would be wrong. */
513 if (contains_save_expr_p (a1))
514 result = build2 (COMPOUND_EXPR, result_type, a1, result);
516 if (contains_save_expr_p (a2))
517 result = build2 (COMPOUND_EXPR, result_type, a2, result);
522 /* Compute the result of applying OP_CODE to LHS and RHS, where both are of
523 type TYPE. We know that TYPE is a modular type with a nonbinary
527 nonbinary_modular_operation (enum tree_code op_code, tree type, tree lhs,
530 tree modulus = TYPE_MODULUS (type);
531 unsigned int needed_precision = tree_floor_log2 (modulus) + 1;
532 unsigned int precision;
533 bool unsignedp = true;
537 /* If this is an addition of a constant, convert it to a subtraction
538 of a constant since we can do that faster. */
539 if (op_code == PLUS_EXPR && TREE_CODE (rhs) == INTEGER_CST)
541 rhs = fold_build2 (MINUS_EXPR, type, modulus, rhs);
542 op_code = MINUS_EXPR;
545 /* For the logical operations, we only need PRECISION bits. For
546 addition and subtraction, we need one more and for multiplication we
547 need twice as many. But we never want to make a size smaller than
549 if (op_code == PLUS_EXPR || op_code == MINUS_EXPR)
550 needed_precision += 1;
551 else if (op_code == MULT_EXPR)
552 needed_precision *= 2;
554 precision = MAX (needed_precision, TYPE_PRECISION (op_type));
556 /* Unsigned will do for everything but subtraction. */
557 if (op_code == MINUS_EXPR)
560 /* If our type is the wrong signedness or isn't wide enough, make a new
561 type and convert both our operands to it. */
562 if (TYPE_PRECISION (op_type) < precision
563 || TYPE_UNSIGNED (op_type) != unsignedp)
565 /* Copy the node so we ensure it can be modified to make it modular. */
566 op_type = copy_node (gnat_type_for_size (precision, unsignedp));
567 modulus = convert (op_type, modulus);
568 SET_TYPE_MODULUS (op_type, modulus);
569 TYPE_MODULAR_P (op_type) = 1;
570 lhs = convert (op_type, lhs);
571 rhs = convert (op_type, rhs);
574 /* Do the operation, then we'll fix it up. */
575 result = fold_build2 (op_code, op_type, lhs, rhs);
577 /* For multiplication, we have no choice but to do a full modulus
578 operation. However, we want to do this in the narrowest
580 if (op_code == MULT_EXPR)
582 tree div_type = copy_node (gnat_type_for_size (needed_precision, 1));
583 modulus = convert (div_type, modulus);
584 SET_TYPE_MODULUS (div_type, modulus);
585 TYPE_MODULAR_P (div_type) = 1;
586 result = convert (op_type,
587 fold_build2 (TRUNC_MOD_EXPR, div_type,
588 convert (div_type, result), modulus));
591 /* For subtraction, add the modulus back if we are negative. */
592 else if (op_code == MINUS_EXPR)
594 result = save_expr (result);
595 result = fold_build3 (COND_EXPR, op_type,
596 fold_build2 (LT_EXPR, integer_type_node, result,
597 convert (op_type, integer_zero_node)),
598 fold_build2 (PLUS_EXPR, op_type, result, modulus),
602 /* For the other operations, subtract the modulus if we are >= it. */
605 result = save_expr (result);
606 result = fold_build3 (COND_EXPR, op_type,
607 fold_build2 (GE_EXPR, integer_type_node,
609 fold_build2 (MINUS_EXPR, op_type,
614 return convert (type, result);
617 /* Make a binary operation of kind OP_CODE. RESULT_TYPE is the type
618 desired for the result. Usually the operation is to be performed
619 in that type. For MODIFY_EXPR and ARRAY_REF, RESULT_TYPE may be 0
620 in which case the type to be used will be derived from the operands.
622 This function is very much unlike the ones for C and C++ since we
623 have already done any type conversion and matching required. All we
624 have to do here is validate the work done by SEM and handle subtypes. */
627 build_binary_op (enum tree_code op_code, tree result_type,
628 tree left_operand, tree right_operand)
630 tree left_type = TREE_TYPE (left_operand);
631 tree right_type = TREE_TYPE (right_operand);
632 tree left_base_type = get_base_type (left_type);
633 tree right_base_type = get_base_type (right_type);
634 tree operation_type = result_type;
635 tree best_type = NULL_TREE;
636 tree modulus, result;
637 bool has_side_effects = false;
640 && TREE_CODE (operation_type) == RECORD_TYPE
641 && TYPE_JUSTIFIED_MODULAR_P (operation_type))
642 operation_type = TREE_TYPE (TYPE_FIELDS (operation_type));
645 && !AGGREGATE_TYPE_P (operation_type)
646 && TYPE_EXTRA_SUBTYPE_P (operation_type))
647 operation_type = get_base_type (operation_type);
649 modulus = (operation_type
650 && TREE_CODE (operation_type) == INTEGER_TYPE
651 && TYPE_MODULAR_P (operation_type)
652 ? TYPE_MODULUS (operation_type) : NULL_TREE);
657 /* If there were integral or pointer conversions on the LHS, remove
658 them; we'll be putting them back below if needed. Likewise for
659 conversions between array and record types, except for justified
660 modular types. But don't do this if the right operand is not
661 BLKmode (for packed arrays) unless we are not changing the mode. */
662 while ((TREE_CODE (left_operand) == CONVERT_EXPR
663 || TREE_CODE (left_operand) == NOP_EXPR
664 || TREE_CODE (left_operand) == VIEW_CONVERT_EXPR)
665 && (((INTEGRAL_TYPE_P (left_type)
666 || POINTER_TYPE_P (left_type))
667 && (INTEGRAL_TYPE_P (TREE_TYPE
668 (TREE_OPERAND (left_operand, 0)))
669 || POINTER_TYPE_P (TREE_TYPE
670 (TREE_OPERAND (left_operand, 0)))))
671 || (((TREE_CODE (left_type) == RECORD_TYPE
672 && !TYPE_JUSTIFIED_MODULAR_P (left_type))
673 || TREE_CODE (left_type) == ARRAY_TYPE)
674 && ((TREE_CODE (TREE_TYPE
675 (TREE_OPERAND (left_operand, 0)))
677 || (TREE_CODE (TREE_TYPE
678 (TREE_OPERAND (left_operand, 0)))
680 && (TYPE_MODE (right_type) == BLKmode
681 || (TYPE_MODE (left_type)
682 == TYPE_MODE (TREE_TYPE
684 (left_operand, 0))))))))
686 left_operand = TREE_OPERAND (left_operand, 0);
687 left_type = TREE_TYPE (left_operand);
691 operation_type = left_type;
693 /* Find the best type to use for copying between aggregate types. */
694 if (((TREE_CODE (left_type) == ARRAY_TYPE
695 && TREE_CODE (right_type) == ARRAY_TYPE)
696 || (TREE_CODE (left_type) == RECORD_TYPE
697 && TREE_CODE (right_type) == RECORD_TYPE))
698 && (best_type = find_common_type (left_type, right_type)))
699 operation_type = best_type;
701 /* If a class-wide type may be involved, force use of the RHS type. */
702 if ((TREE_CODE (right_type) == RECORD_TYPE
703 || TREE_CODE (right_type) == UNION_TYPE)
704 && TYPE_ALIGN_OK (right_type))
705 operation_type = right_type;
707 /* Ensure everything on the LHS is valid. If we have a field reference,
708 strip anything that get_inner_reference can handle. Then remove any
709 conversions between types having the same code and mode. And mark
710 VIEW_CONVERT_EXPRs with TREE_ADDRESSABLE. When done, we must have
711 either an INDIRECT_REF, a NULL_EXPR or a DECL node. */
712 result = left_operand;
715 tree restype = TREE_TYPE (result);
717 if (TREE_CODE (result) == COMPONENT_REF
718 || TREE_CODE (result) == ARRAY_REF
719 || TREE_CODE (result) == ARRAY_RANGE_REF)
720 while (handled_component_p (result))
721 result = TREE_OPERAND (result, 0);
722 else if (TREE_CODE (result) == REALPART_EXPR
723 || TREE_CODE (result) == IMAGPART_EXPR
724 || ((TREE_CODE (result) == NOP_EXPR
725 || TREE_CODE (result) == CONVERT_EXPR)
726 && (((TREE_CODE (restype)
727 == TREE_CODE (TREE_TYPE
728 (TREE_OPERAND (result, 0))))
729 && (TYPE_MODE (TREE_TYPE
730 (TREE_OPERAND (result, 0)))
731 == TYPE_MODE (restype)))
732 || TYPE_ALIGN_OK (restype))))
733 result = TREE_OPERAND (result, 0);
734 else if (TREE_CODE (result) == VIEW_CONVERT_EXPR)
736 TREE_ADDRESSABLE (result) = 1;
737 result = TREE_OPERAND (result, 0);
743 gcc_assert (TREE_CODE (result) == INDIRECT_REF
744 || TREE_CODE (result) == NULL_EXPR
747 /* Convert the right operand to the operation type unless it is
748 either already of the correct type or if the type involves a
749 placeholder, since the RHS may not have the same record type. */
750 if (operation_type != right_type
751 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (operation_type)))
753 right_operand = convert (operation_type, right_operand);
754 right_type = operation_type;
757 /* If the left operand is not of the same type as the operation
758 type, wrap it up in a VIEW_CONVERT_EXPR. */
759 if (left_type != operation_type)
760 left_operand = unchecked_convert (operation_type, left_operand, false);
762 has_side_effects = true;
768 operation_type = TREE_TYPE (left_type);
770 /* ... fall through ... */
772 case ARRAY_RANGE_REF:
773 /* First look through conversion between type variants. Note that
774 this changes neither the operation type nor the type domain. */
775 if (TREE_CODE (left_operand) == VIEW_CONVERT_EXPR
776 && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (left_operand, 0)))
777 == TYPE_MAIN_VARIANT (left_type))
779 left_operand = TREE_OPERAND (left_operand, 0);
780 left_type = TREE_TYPE (left_operand);
783 /* Then convert the right operand to its base type. This will
784 prevent unneeded signedness conversions when sizetype is wider than
786 right_operand = convert (right_base_type, right_operand);
787 right_operand = convert (TYPE_DOMAIN (left_type), right_operand);
789 if (!TREE_CONSTANT (right_operand)
790 || !TREE_CONSTANT (TYPE_MIN_VALUE (right_type)))
791 gnat_mark_addressable (left_operand);
800 gcc_assert (!POINTER_TYPE_P (left_type));
802 /* ... fall through ... */
806 /* If either operand is a NULL_EXPR, just return a new one. */
807 if (TREE_CODE (left_operand) == NULL_EXPR)
808 return build2 (op_code, result_type,
809 build1 (NULL_EXPR, integer_type_node,
810 TREE_OPERAND (left_operand, 0)),
813 else if (TREE_CODE (right_operand) == NULL_EXPR)
814 return build2 (op_code, result_type,
815 build1 (NULL_EXPR, integer_type_node,
816 TREE_OPERAND (right_operand, 0)),
819 /* If either object is a justified modular types, get the
820 fields from within. */
821 if (TREE_CODE (left_type) == RECORD_TYPE
822 && TYPE_JUSTIFIED_MODULAR_P (left_type))
824 left_operand = convert (TREE_TYPE (TYPE_FIELDS (left_type)),
826 left_type = TREE_TYPE (left_operand);
827 left_base_type = get_base_type (left_type);
830 if (TREE_CODE (right_type) == RECORD_TYPE
831 && TYPE_JUSTIFIED_MODULAR_P (right_type))
833 right_operand = convert (TREE_TYPE (TYPE_FIELDS (right_type)),
835 right_type = TREE_TYPE (right_operand);
836 right_base_type = get_base_type (right_type);
839 /* If both objects are arrays, compare them specially. */
840 if ((TREE_CODE (left_type) == ARRAY_TYPE
841 || (TREE_CODE (left_type) == INTEGER_TYPE
842 && TYPE_HAS_ACTUAL_BOUNDS_P (left_type)))
843 && (TREE_CODE (right_type) == ARRAY_TYPE
844 || (TREE_CODE (right_type) == INTEGER_TYPE
845 && TYPE_HAS_ACTUAL_BOUNDS_P (right_type))))
847 result = compare_arrays (result_type, left_operand, right_operand);
849 if (op_code == NE_EXPR)
850 result = invert_truthvalue (result);
852 gcc_assert (op_code == EQ_EXPR);
857 /* Otherwise, the base types must be the same unless the objects are
858 fat pointers or records. If we have records, use the best type and
859 convert both operands to that type. */
860 if (left_base_type != right_base_type)
862 if (TYPE_FAT_POINTER_P (left_base_type)
863 && TYPE_FAT_POINTER_P (right_base_type)
864 && TYPE_MAIN_VARIANT (left_base_type)
865 == TYPE_MAIN_VARIANT (right_base_type))
866 best_type = left_base_type;
867 else if (TREE_CODE (left_base_type) == RECORD_TYPE
868 && TREE_CODE (right_base_type) == RECORD_TYPE)
870 /* The only way these are permitted to be the same is if both
871 types have the same name. In that case, one of them must
872 not be self-referential. Use that one as the best type.
873 Even better is if one is of fixed size. */
874 gcc_assert (TYPE_NAME (left_base_type)
875 && (TYPE_NAME (left_base_type)
876 == TYPE_NAME (right_base_type)));
878 if (TREE_CONSTANT (TYPE_SIZE (left_base_type)))
879 best_type = left_base_type;
880 else if (TREE_CONSTANT (TYPE_SIZE (right_base_type)))
881 best_type = right_base_type;
882 else if (!CONTAINS_PLACEHOLDER_P (TYPE_SIZE (left_base_type)))
883 best_type = left_base_type;
884 else if (!CONTAINS_PLACEHOLDER_P (TYPE_SIZE (right_base_type)))
885 best_type = right_base_type;
892 left_operand = convert (best_type, left_operand);
893 right_operand = convert (best_type, right_operand);
896 /* If we are comparing a fat pointer against zero, we need to
897 just compare the data pointer. */
898 else if (TYPE_FAT_POINTER_P (left_base_type)
899 && TREE_CODE (right_operand) == CONSTRUCTOR
900 && integer_zerop (VEC_index (constructor_elt,
901 CONSTRUCTOR_ELTS (right_operand),
905 right_operand = build_component_ref (left_operand, NULL_TREE,
906 TYPE_FIELDS (left_base_type),
908 left_operand = convert (TREE_TYPE (right_operand),
913 left_operand = convert (left_base_type, left_operand);
914 right_operand = convert (right_base_type, right_operand);
920 case PREINCREMENT_EXPR:
921 case PREDECREMENT_EXPR:
922 case POSTINCREMENT_EXPR:
923 case POSTDECREMENT_EXPR:
924 /* In these, the result type and the left operand type should be the
925 same. Do the operation in the base type of those and convert the
926 right operand (which is an integer) to that type.
928 Note that these operations are only used in loop control where
929 we guarantee that no overflow can occur. So nothing special need
930 be done for modular types. */
932 gcc_assert (left_type == result_type);
933 operation_type = get_base_type (result_type);
934 left_operand = convert (operation_type, left_operand);
935 right_operand = convert (operation_type, right_operand);
936 has_side_effects = true;
944 /* The RHS of a shift can be any type. Also, ignore any modulus
945 (we used to abort, but this is needed for unchecked conversion
946 to modular types). Otherwise, processing is the same as normal. */
947 gcc_assert (operation_type == left_base_type);
949 left_operand = convert (operation_type, left_operand);
952 case TRUTH_ANDIF_EXPR:
953 case TRUTH_ORIF_EXPR:
957 left_operand = gnat_truthvalue_conversion (left_operand);
958 right_operand = gnat_truthvalue_conversion (right_operand);
964 /* For binary modulus, if the inputs are in range, so are the
966 if (modulus && integer_pow2p (modulus))
972 gcc_assert (TREE_TYPE (result_type) == left_base_type
973 && TREE_TYPE (result_type) == right_base_type);
974 left_operand = convert (left_base_type, left_operand);
975 right_operand = convert (right_base_type, right_operand);
978 case TRUNC_DIV_EXPR: case TRUNC_MOD_EXPR:
979 case CEIL_DIV_EXPR: case CEIL_MOD_EXPR:
980 case FLOOR_DIV_EXPR: case FLOOR_MOD_EXPR:
981 case ROUND_DIV_EXPR: case ROUND_MOD_EXPR:
982 /* These always produce results lower than either operand. */
986 case POINTER_PLUS_EXPR:
987 gcc_assert (operation_type == left_base_type
988 && sizetype == right_base_type);
989 left_operand = convert (operation_type, left_operand);
990 right_operand = convert (sizetype, right_operand);
995 /* The result type should be the same as the base types of the
996 both operands (and they should be the same). Convert
997 everything to the result type. */
999 gcc_assert (operation_type == left_base_type
1000 && left_base_type == right_base_type);
1001 left_operand = convert (operation_type, left_operand);
1002 right_operand = convert (operation_type, right_operand);
1005 if (modulus && !integer_pow2p (modulus))
1007 result = nonbinary_modular_operation (op_code, operation_type,
1008 left_operand, right_operand);
1009 modulus = NULL_TREE;
1011 /* If either operand is a NULL_EXPR, just return a new one. */
1012 else if (TREE_CODE (left_operand) == NULL_EXPR)
1013 return build1 (NULL_EXPR, operation_type, TREE_OPERAND (left_operand, 0));
1014 else if (TREE_CODE (right_operand) == NULL_EXPR)
1015 return build1 (NULL_EXPR, operation_type, TREE_OPERAND (right_operand, 0));
1016 else if (op_code == ARRAY_REF || op_code == ARRAY_RANGE_REF)
1017 result = fold (build4 (op_code, operation_type, left_operand,
1018 right_operand, NULL_TREE, NULL_TREE));
1021 = fold_build2 (op_code, operation_type, left_operand, right_operand);
1023 TREE_SIDE_EFFECTS (result) |= has_side_effects;
1024 TREE_CONSTANT (result)
1025 |= (TREE_CONSTANT (left_operand) & TREE_CONSTANT (right_operand)
1026 && op_code != ARRAY_REF && op_code != ARRAY_RANGE_REF);
1028 if ((op_code == ARRAY_REF || op_code == ARRAY_RANGE_REF)
1029 && TYPE_VOLATILE (operation_type))
1030 TREE_THIS_VOLATILE (result) = 1;
1032 /* If we are working with modular types, perform the MOD operation
1033 if something above hasn't eliminated the need for it. */
1035 result = fold_build2 (FLOOR_MOD_EXPR, operation_type, result,
1036 convert (operation_type, modulus));
1038 if (result_type && result_type != operation_type)
1039 result = convert (result_type, result);
1044 /* Similar, but for unary operations. */
1047 build_unary_op (enum tree_code op_code, tree result_type, tree operand)
1049 tree type = TREE_TYPE (operand);
1050 tree base_type = get_base_type (type);
1051 tree operation_type = result_type;
1053 bool side_effects = false;
1056 && TREE_CODE (operation_type) == RECORD_TYPE
1057 && TYPE_JUSTIFIED_MODULAR_P (operation_type))
1058 operation_type = TREE_TYPE (TYPE_FIELDS (operation_type));
1061 && !AGGREGATE_TYPE_P (operation_type)
1062 && TYPE_EXTRA_SUBTYPE_P (operation_type))
1063 operation_type = get_base_type (operation_type);
1069 if (!operation_type)
1070 result_type = operation_type = TREE_TYPE (type);
1072 gcc_assert (result_type == TREE_TYPE (type));
1074 result = fold_build1 (op_code, operation_type, operand);
1077 case TRUTH_NOT_EXPR:
1078 gcc_assert (result_type == base_type);
1079 result = invert_truthvalue (gnat_truthvalue_conversion (operand));
1082 case ATTR_ADDR_EXPR:
1084 switch (TREE_CODE (operand))
1087 case UNCONSTRAINED_ARRAY_REF:
1088 result = TREE_OPERAND (operand, 0);
1090 /* Make sure the type here is a pointer, not a reference.
1091 GCC wants pointer types for function addresses. */
1093 result_type = build_pointer_type (type);
1095 /* If the underlying object can alias everything, propagate the
1096 property since we are effectively retrieving the object. */
1097 if (POINTER_TYPE_P (TREE_TYPE (result))
1098 && TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (result)))
1100 if (TREE_CODE (result_type) == POINTER_TYPE
1101 && !TYPE_REF_CAN_ALIAS_ALL (result_type))
1103 = build_pointer_type_for_mode (TREE_TYPE (result_type),
1104 TYPE_MODE (result_type),
1106 else if (TREE_CODE (result_type) == REFERENCE_TYPE
1107 && !TYPE_REF_CAN_ALIAS_ALL (result_type))
1109 = build_reference_type_for_mode (TREE_TYPE (result_type),
1110 TYPE_MODE (result_type),
1117 TREE_TYPE (result) = type = build_pointer_type (type);
1121 case ARRAY_RANGE_REF:
1124 /* If this is for 'Address, find the address of the prefix and
1125 add the offset to the field. Otherwise, do this the normal
1127 if (op_code == ATTR_ADDR_EXPR)
1129 HOST_WIDE_INT bitsize;
1130 HOST_WIDE_INT bitpos;
1132 enum machine_mode mode;
1133 int unsignedp, volatilep;
1135 inner = get_inner_reference (operand, &bitsize, &bitpos, &offset,
1136 &mode, &unsignedp, &volatilep,
1139 /* If INNER is a padding type whose field has a self-referential
1140 size, convert to that inner type. We know the offset is zero
1141 and we need to have that type visible. */
1142 if (TREE_CODE (TREE_TYPE (inner)) == RECORD_TYPE
1143 && TYPE_IS_PADDING_P (TREE_TYPE (inner))
1144 && (CONTAINS_PLACEHOLDER_P
1145 (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS
1146 (TREE_TYPE (inner)))))))
1147 inner = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (inner))),
1150 /* Compute the offset as a byte offset from INNER. */
1152 offset = size_zero_node;
1154 if (bitpos % BITS_PER_UNIT != 0)
1156 ("taking address of object not aligned on storage unit?",
1159 offset = size_binop (PLUS_EXPR, offset,
1160 size_int (bitpos / BITS_PER_UNIT));
1162 /* Take the address of INNER, convert the offset to void *, and
1163 add then. It will later be converted to the desired result
1165 inner = build_unary_op (ADDR_EXPR, NULL_TREE, inner);
1166 inner = convert (ptr_void_type_node, inner);
1167 result = build_binary_op (POINTER_PLUS_EXPR, ptr_void_type_node,
1169 result = convert (build_pointer_type (TREE_TYPE (operand)),
1176 /* If this is just a constructor for a padded record, we can
1177 just take the address of the single field and convert it to
1178 a pointer to our type. */
1179 if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
1181 result = (VEC_index (constructor_elt,
1182 CONSTRUCTOR_ELTS (operand),
1186 result = convert (build_pointer_type (TREE_TYPE (operand)),
1187 build_unary_op (ADDR_EXPR, NULL_TREE, result));
1194 if (AGGREGATE_TYPE_P (type)
1195 && AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (operand, 0))))
1196 return build_unary_op (ADDR_EXPR, result_type,
1197 TREE_OPERAND (operand, 0));
1199 /* ... fallthru ... */
1201 case VIEW_CONVERT_EXPR:
1202 /* If this just a variant conversion or if the conversion doesn't
1203 change the mode, get the result type from this type and go down.
1204 This is needed for conversions of CONST_DECLs, to eventually get
1205 to the address of their CORRESPONDING_VARs. */
1206 if ((TYPE_MAIN_VARIANT (type)
1207 == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (operand, 0))))
1208 || (TYPE_MODE (type) != BLKmode
1209 && (TYPE_MODE (type)
1210 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (operand, 0))))))
1211 return build_unary_op (ADDR_EXPR,
1212 (result_type ? result_type
1213 : build_pointer_type (type)),
1214 TREE_OPERAND (operand, 0));
1218 operand = DECL_CONST_CORRESPONDING_VAR (operand);
1220 /* ... fall through ... */
1225 /* If we are taking the address of a padded record whose field is
1226 contains a template, take the address of the template. */
1227 if (TREE_CODE (type) == RECORD_TYPE
1228 && TYPE_IS_PADDING_P (type)
1229 && TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == RECORD_TYPE
1230 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (TYPE_FIELDS (type))))
1232 type = TREE_TYPE (TYPE_FIELDS (type));
1233 operand = convert (type, operand);
1236 if (type != error_mark_node)
1237 operation_type = build_pointer_type (type);
1239 gnat_mark_addressable (operand);
1240 result = fold_build1 (ADDR_EXPR, operation_type, operand);
1243 TREE_CONSTANT (result) = staticp (operand) || TREE_CONSTANT (operand);
1247 /* If we want to refer to an entire unconstrained array,
1248 make up an expression to do so. This will never survive to
1249 the backend. If TYPE is a thin pointer, first convert the
1250 operand to a fat pointer. */
1251 if (TYPE_THIN_POINTER_P (type)
1252 && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
1255 = convert (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))),
1257 type = TREE_TYPE (operand);
1260 if (TYPE_FAT_POINTER_P (type))
1262 result = build1 (UNCONSTRAINED_ARRAY_REF,
1263 TYPE_UNCONSTRAINED_ARRAY (type), operand);
1264 TREE_READONLY (result) = TREE_STATIC (result)
1265 = TYPE_READONLY (TYPE_UNCONSTRAINED_ARRAY (type));
1267 else if (TREE_CODE (operand) == ADDR_EXPR)
1268 result = TREE_OPERAND (operand, 0);
1272 result = fold_build1 (op_code, TREE_TYPE (type), operand);
1273 TREE_READONLY (result) = TYPE_READONLY (TREE_TYPE (type));
1277 = (!TYPE_FAT_POINTER_P (type) && TYPE_VOLATILE (TREE_TYPE (type)));
1283 tree modulus = ((operation_type
1284 && TREE_CODE (operation_type) == INTEGER_TYPE
1285 && TYPE_MODULAR_P (operation_type))
1286 ? TYPE_MODULUS (operation_type) : NULL_TREE);
1287 int mod_pow2 = modulus && integer_pow2p (modulus);
1289 /* If this is a modular type, there are various possibilities
1290 depending on the operation and whether the modulus is a
1291 power of two or not. */
1295 gcc_assert (operation_type == base_type);
1296 operand = convert (operation_type, operand);
1298 /* The fastest in the negate case for binary modulus is
1299 the straightforward code; the TRUNC_MOD_EXPR below
1300 is an AND operation. */
1301 if (op_code == NEGATE_EXPR && mod_pow2)
1302 result = fold_build2 (TRUNC_MOD_EXPR, operation_type,
1303 fold_build1 (NEGATE_EXPR, operation_type,
1307 /* For nonbinary negate case, return zero for zero operand,
1308 else return the modulus minus the operand. If the modulus
1309 is a power of two minus one, we can do the subtraction
1310 as an XOR since it is equivalent and faster on most machines. */
1311 else if (op_code == NEGATE_EXPR && !mod_pow2)
1313 if (integer_pow2p (fold_build2 (PLUS_EXPR, operation_type,
1315 convert (operation_type,
1316 integer_one_node))))
1317 result = fold_build2 (BIT_XOR_EXPR, operation_type,
1320 result = fold_build2 (MINUS_EXPR, operation_type,
1323 result = fold_build3 (COND_EXPR, operation_type,
1324 fold_build2 (NE_EXPR,
1329 integer_zero_node)),
1334 /* For the NOT cases, we need a constant equal to
1335 the modulus minus one. For a binary modulus, we
1336 XOR against the constant and subtract the operand from
1337 that constant for nonbinary modulus. */
1339 tree cnst = fold_build2 (MINUS_EXPR, operation_type, modulus,
1340 convert (operation_type,
1344 result = fold_build2 (BIT_XOR_EXPR, operation_type,
1347 result = fold_build2 (MINUS_EXPR, operation_type,
1355 /* ... fall through ... */
1358 gcc_assert (operation_type == base_type);
1359 result = fold_build1 (op_code, operation_type,
1360 convert (operation_type, operand));
1365 TREE_SIDE_EFFECTS (result) = 1;
1366 if (TREE_CODE (result) == INDIRECT_REF)
1367 TREE_THIS_VOLATILE (result) = TYPE_VOLATILE (TREE_TYPE (result));
1370 if (result_type && TREE_TYPE (result) != result_type)
1371 result = convert (result_type, result);
1376 /* Similar, but for COND_EXPR. */
1379 build_cond_expr (tree result_type, tree condition_operand,
1380 tree true_operand, tree false_operand)
1383 bool addr_p = false;
1385 /* The front-end verifies that result, true and false operands have same base
1386 type. Convert everything to the result type. */
1388 true_operand = convert (result_type, true_operand);
1389 false_operand = convert (result_type, false_operand);
1391 /* If the result type is unconstrained, take the address of
1392 the operands and then dereference our result. */
1393 if (TREE_CODE (result_type) == UNCONSTRAINED_ARRAY_TYPE
1394 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type)))
1397 result_type = build_pointer_type (result_type);
1398 true_operand = build_unary_op (ADDR_EXPR, result_type, true_operand);
1399 false_operand = build_unary_op (ADDR_EXPR, result_type, false_operand);
1402 result = fold_build3 (COND_EXPR, result_type, condition_operand,
1403 true_operand, false_operand);
1405 /* If either operand is a SAVE_EXPR (possibly surrounded by
1406 arithmetic, make sure it gets done. */
1407 true_operand = skip_simple_arithmetic (true_operand);
1408 false_operand = skip_simple_arithmetic (false_operand);
1410 if (TREE_CODE (true_operand) == SAVE_EXPR)
1411 result = build2 (COMPOUND_EXPR, result_type, true_operand, result);
1413 if (TREE_CODE (false_operand) == SAVE_EXPR)
1414 result = build2 (COMPOUND_EXPR, result_type, false_operand, result);
1416 /* ??? Seems the code above is wrong, as it may move ahead of the COND
1417 SAVE_EXPRs with side effects and not shared by both arms. */
1420 result = build_unary_op (INDIRECT_REF, NULL_TREE, result);
1425 /* Similar, but for RETURN_EXPR. If RESULT_DECL is non-zero, build
1426 a RETURN_EXPR around the assignment of RET_VAL to RESULT_DECL.
1427 If RESULT_DECL is zero, build a bare RETURN_EXPR. */
1430 build_return_expr (tree result_decl, tree ret_val)
1436 /* The gimplifier explicitly enforces the following invariant:
1445 As a consequence, type-homogeneity dictates that we use the type
1446 of the RESULT_DECL as the operation type. */
1448 tree operation_type = TREE_TYPE (result_decl);
1450 /* Convert the right operand to the operation type. Note that
1451 it's the same transformation as in the MODIFY_EXPR case of
1452 build_binary_op with the additional guarantee that the type
1453 cannot involve a placeholder, since otherwise the function
1454 would use the "target pointer" return mechanism. */
1456 if (operation_type != TREE_TYPE (ret_val))
1457 ret_val = convert (operation_type, ret_val);
1460 = build2 (MODIFY_EXPR, operation_type, result_decl, ret_val);
1463 result_expr = NULL_TREE;
1465 return build1 (RETURN_EXPR, void_type_node, result_expr);
1468 /* Build a CALL_EXPR to call FUNDECL with one argument, ARG. Return
1472 build_call_1_expr (tree fundecl, tree arg)
1474 tree call = build_call_nary (TREE_TYPE (TREE_TYPE (fundecl)),
1475 build_unary_op (ADDR_EXPR, NULL_TREE, fundecl),
1477 TREE_SIDE_EFFECTS (call) = 1;
1481 /* Build a CALL_EXPR to call FUNDECL with two arguments, ARG1 & ARG2. Return
1485 build_call_2_expr (tree fundecl, tree arg1, tree arg2)
1487 tree call = build_call_nary (TREE_TYPE (TREE_TYPE (fundecl)),
1488 build_unary_op (ADDR_EXPR, NULL_TREE, fundecl),
1490 TREE_SIDE_EFFECTS (call) = 1;
1494 /* Likewise to call FUNDECL with no arguments. */
1497 build_call_0_expr (tree fundecl)
1499 /* We rely on build_call_nary to compute TREE_SIDE_EFFECTS. This makes
1500 it possible to propagate DECL_IS_PURE on parameterless functions. */
1501 tree call = build_call_nary (TREE_TYPE (TREE_TYPE (fundecl)),
1502 build_unary_op (ADDR_EXPR, NULL_TREE, fundecl),
1507 /* Call a function that raises an exception and pass the line number and file
1508 name, if requested. MSG says which exception function to call.
1510 GNAT_NODE is the gnat node conveying the source location for which the
1511 error should be signaled, or Empty in which case the error is signaled on
1512 the current ref_file_name/input_line.
1514 KIND says which kind of exception this is for
1515 (N_Raise_{Constraint,Storage,Program}_Error). */
1518 build_call_raise (int msg, Node_Id gnat_node, char kind)
1520 tree fndecl = gnat_raise_decls[msg];
1521 tree label = get_exception_label (kind);
1527 /* If this is to be done as a goto, handle that case. */
1530 Entity_Id local_raise = Get_Local_Raise_Call_Entity ();
1531 tree gnu_result = build1 (GOTO_EXPR, void_type_node, label);
1533 /* If Local_Raise is present, generate
1534 Local_Raise (exception'Identity); */
1535 if (Present (local_raise))
1537 tree gnu_local_raise
1538 = gnat_to_gnu_entity (local_raise, NULL_TREE, 0);
1539 tree gnu_exception_entity
1540 = gnat_to_gnu_entity (Get_RT_Exception_Entity (msg), NULL_TREE, 0);
1542 = build_call_1_expr (gnu_local_raise,
1543 build_unary_op (ADDR_EXPR, NULL_TREE,
1544 gnu_exception_entity));
1546 gnu_result = build2 (COMPOUND_EXPR, void_type_node,
1547 gnu_call, gnu_result);}
1553 = (Debug_Flag_NN || Exception_Locations_Suppressed)
1555 : (gnat_node != Empty && Sloc (gnat_node) != No_Location)
1556 ? IDENTIFIER_POINTER
1557 (get_identifier (Get_Name_String
1559 (Get_Source_File_Index (Sloc (gnat_node))))))
1562 len = strlen (str) + 1;
1563 filename = build_string (len, str);
1565 = (gnat_node != Empty && Sloc (gnat_node) != No_Location)
1566 ? Get_Logical_Line_Number (Sloc(gnat_node)) : input_line;
1568 TREE_TYPE (filename)
1569 = build_array_type (char_type_node,
1570 build_index_type (build_int_cst (NULL_TREE, len)));
1573 build_call_2_expr (fndecl,
1574 build1 (ADDR_EXPR, build_pointer_type (char_type_node),
1576 build_int_cst (NULL_TREE, line_number));
1579 /* qsort comparer for the bit positions of two constructor elements
1580 for record components. */
1583 compare_elmt_bitpos (const PTR rt1, const PTR rt2)
1585 const_tree const elmt1 = * (const_tree const *) rt1;
1586 const_tree const elmt2 = * (const_tree const *) rt2;
1587 const_tree const field1 = TREE_PURPOSE (elmt1);
1588 const_tree const field2 = TREE_PURPOSE (elmt2);
1590 = tree_int_cst_compare (bit_position (field1), bit_position (field2));
1592 return ret ? ret : (int) (DECL_UID (field1) - DECL_UID (field2));
1595 /* Return a CONSTRUCTOR of TYPE whose list is LIST. */
1598 gnat_build_constructor (tree type, tree list)
1602 bool allconstant = (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST);
1603 bool side_effects = false;
1606 /* Scan the elements to see if they are all constant or if any has side
1607 effects, to let us set global flags on the resulting constructor. Count
1608 the elements along the way for possible sorting purposes below. */
1609 for (n_elmts = 0, elmt = list; elmt; elmt = TREE_CHAIN (elmt), n_elmts ++)
1611 if (!TREE_CONSTANT (TREE_VALUE (elmt))
1612 || (TREE_CODE (type) == RECORD_TYPE
1613 && DECL_BIT_FIELD (TREE_PURPOSE (elmt))
1614 && TREE_CODE (TREE_VALUE (elmt)) != INTEGER_CST)
1615 || !initializer_constant_valid_p (TREE_VALUE (elmt),
1616 TREE_TYPE (TREE_VALUE (elmt))))
1617 allconstant = false;
1619 if (TREE_SIDE_EFFECTS (TREE_VALUE (elmt)))
1620 side_effects = true;
1622 /* Propagate an NULL_EXPR from the size of the type. We won't ever
1623 be executing the code we generate here in that case, but handle it
1624 specially to avoid the compiler blowing up. */
1625 if (TREE_CODE (type) == RECORD_TYPE
1627 = contains_null_expr (DECL_SIZE (TREE_PURPOSE (elmt))))))
1628 return build1 (NULL_EXPR, type, TREE_OPERAND (result, 0));
1631 /* For record types with constant components only, sort field list
1632 by increasing bit position. This is necessary to ensure the
1633 constructor can be output as static data. */
1634 if (allconstant && TREE_CODE (type) == RECORD_TYPE && n_elmts > 1)
1636 /* Fill an array with an element tree per index, and ask qsort to order
1637 them according to what a bitpos comparison function says. */
1638 tree *gnu_arr = (tree *) alloca (sizeof (tree) * n_elmts);
1641 for (i = 0, elmt = list; elmt; elmt = TREE_CHAIN (elmt), i++)
1644 qsort (gnu_arr, n_elmts, sizeof (tree), compare_elmt_bitpos);
1646 /* Then reconstruct the list from the sorted array contents. */
1648 for (i = n_elmts - 1; i >= 0; i--)
1650 TREE_CHAIN (gnu_arr[i]) = list;
1655 result = build_constructor_from_list (type, list);
1656 TREE_CONSTANT (result) = TREE_INVARIANT (result)
1657 = TREE_STATIC (result) = allconstant;
1658 TREE_SIDE_EFFECTS (result) = side_effects;
1659 TREE_READONLY (result) = TYPE_READONLY (type) || allconstant;
1663 /* Return a COMPONENT_REF to access a field that is given by COMPONENT,
1664 an IDENTIFIER_NODE giving the name of the field, or FIELD, a FIELD_DECL,
1665 for the field. Don't fold the result if NO_FOLD_P is true.
1667 We also handle the fact that we might have been passed a pointer to the
1668 actual record and know how to look for fields in variant parts. */
1671 build_simple_component_ref (tree record_variable, tree component,
1672 tree field, bool no_fold_p)
1674 tree record_type = TYPE_MAIN_VARIANT (TREE_TYPE (record_variable));
1675 tree ref, inner_variable;
1677 gcc_assert ((TREE_CODE (record_type) == RECORD_TYPE
1678 || TREE_CODE (record_type) == UNION_TYPE
1679 || TREE_CODE (record_type) == QUAL_UNION_TYPE)
1680 && TYPE_SIZE (record_type)
1681 && (component != 0) != (field != 0));
1683 /* If no field was specified, look for a field with the specified name
1684 in the current record only. */
1686 for (field = TYPE_FIELDS (record_type); field;
1687 field = TREE_CHAIN (field))
1688 if (DECL_NAME (field) == component)
1694 /* If this field is not in the specified record, see if we can find
1695 something in the record whose original field is the same as this one. */
1696 if (DECL_CONTEXT (field) != record_type)
1697 /* Check if there is a field with name COMPONENT in the record. */
1701 /* First loop thru normal components. */
1703 for (new_field = TYPE_FIELDS (record_type); new_field;
1704 new_field = TREE_CHAIN (new_field))
1705 if (field == new_field
1706 || DECL_ORIGINAL_FIELD (new_field) == field
1707 || new_field == DECL_ORIGINAL_FIELD (field)
1708 || (DECL_ORIGINAL_FIELD (field)
1709 && (DECL_ORIGINAL_FIELD (field)
1710 == DECL_ORIGINAL_FIELD (new_field))))
1713 /* Next, loop thru DECL_INTERNAL_P components if we haven't found
1714 the component in the first search. Doing this search in 2 steps
1715 is required to avoiding hidden homonymous fields in the
1719 for (new_field = TYPE_FIELDS (record_type); new_field;
1720 new_field = TREE_CHAIN (new_field))
1721 if (DECL_INTERNAL_P (new_field))
1724 = build_simple_component_ref (record_variable,
1725 NULL_TREE, new_field, no_fold_p);
1726 ref = build_simple_component_ref (field_ref, NULL_TREE, field,
1739 /* If the field's offset has overflowed, do not attempt to access it
1740 as doing so may trigger sanity checks deeper in the back-end.
1741 Note that we don't need to warn since this will be done on trying
1742 to declare the object. */
1743 if (TREE_CODE (DECL_FIELD_OFFSET (field)) == INTEGER_CST
1744 && TREE_OVERFLOW (DECL_FIELD_OFFSET (field)))
1747 /* Look through conversion between type variants. Note that this
1748 is transparent as far as the field is concerned. */
1749 if (TREE_CODE (record_variable) == VIEW_CONVERT_EXPR
1750 && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (record_variable, 0)))
1752 inner_variable = TREE_OPERAND (record_variable, 0);
1754 inner_variable = record_variable;
1756 ref = build3 (COMPONENT_REF, TREE_TYPE (field), inner_variable, field,
1759 if (TREE_READONLY (record_variable) || TREE_READONLY (field))
1760 TREE_READONLY (ref) = 1;
1761 if (TREE_THIS_VOLATILE (record_variable) || TREE_THIS_VOLATILE (field)
1762 || TYPE_VOLATILE (record_type))
1763 TREE_THIS_VOLATILE (ref) = 1;
1768 /* The generic folder may punt in this case because the inner array type
1769 can be self-referential, but folding is in fact not problematic. */
1770 else if (TREE_CODE (record_variable) == CONSTRUCTOR
1771 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (record_variable)))
1773 VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (record_variable);
1774 unsigned HOST_WIDE_INT idx;
1776 FOR_EACH_CONSTRUCTOR_ELT (elts, idx, index, value)
1786 /* Like build_simple_component_ref, except that we give an error if the
1787 reference could not be found. */
1790 build_component_ref (tree record_variable, tree component,
1791 tree field, bool no_fold_p)
1793 tree ref = build_simple_component_ref (record_variable, component, field,
1799 /* If FIELD was specified, assume this is an invalid user field so
1800 raise constraint error. Otherwise, we can't find the type to return, so
1803 return build1 (NULL_EXPR, TREE_TYPE (field),
1804 build_call_raise (CE_Discriminant_Check_Failed, Empty,
1805 N_Raise_Constraint_Error));
1808 /* Build a GCC tree to call an allocation or deallocation function.
1809 If GNU_OBJ is nonzero, it is an object to deallocate. Otherwise,
1810 generate an allocator.
1812 GNU_SIZE is the size of the object in bytes and ALIGN is the alignment in
1813 bits. GNAT_PROC, if present, is a procedure to call and GNAT_POOL is the
1814 storage pool to use. If not preset, malloc and free will be used except
1815 if GNAT_PROC is the "fake" value of -1, in which case we allocate the
1816 object dynamically on the stack frame. */
1819 build_call_alloc_dealloc (tree gnu_obj, tree gnu_size, unsigned align,
1820 Entity_Id gnat_proc, Entity_Id gnat_pool,
1823 tree gnu_align = size_int (align / BITS_PER_UNIT);
1825 gnu_size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_size, gnu_obj);
1827 if (Present (gnat_proc))
1829 /* The storage pools are obviously always tagged types, but the
1830 secondary stack uses the same mechanism and is not tagged */
1831 if (Is_Tagged_Type (Etype (gnat_pool)))
1833 /* The size is the third parameter; the alignment is the
1835 Entity_Id gnat_size_type
1836 = Etype (Next_Formal (Next_Formal (First_Formal (gnat_proc))));
1837 tree gnu_size_type = gnat_to_gnu_type (gnat_size_type);
1838 tree gnu_proc = gnat_to_gnu (gnat_proc);
1839 tree gnu_proc_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_proc);
1840 tree gnu_pool = gnat_to_gnu (gnat_pool);
1841 tree gnu_pool_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_pool);
1844 gnu_size = convert (gnu_size_type, gnu_size);
1845 gnu_align = convert (gnu_size_type, gnu_align);
1847 /* The first arg is always the address of the storage pool; next
1848 comes the address of the object, for a deallocator, then the
1849 size and alignment. */
1851 gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1852 gnu_proc_addr, 4, gnu_pool_addr,
1853 gnu_obj, gnu_size, gnu_align);
1855 gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1856 gnu_proc_addr, 3, gnu_pool_addr,
1857 gnu_size, gnu_align);
1858 TREE_SIDE_EFFECTS (gnu_call) = 1;
1862 /* Secondary stack case. */
1865 /* The size is the second parameter */
1866 Entity_Id gnat_size_type
1867 = Etype (Next_Formal (First_Formal (gnat_proc)));
1868 tree gnu_size_type = gnat_to_gnu_type (gnat_size_type);
1869 tree gnu_proc = gnat_to_gnu (gnat_proc);
1870 tree gnu_proc_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_proc);
1873 gnu_size = convert (gnu_size_type, gnu_size);
1875 /* The first arg is the address of the object, for a
1876 deallocator, then the size */
1878 gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1879 gnu_proc_addr, 2, gnu_obj, gnu_size);
1881 gnu_call = build_call_nary (TREE_TYPE (TREE_TYPE (gnu_proc)),
1882 gnu_proc_addr, 1, gnu_size);
1883 TREE_SIDE_EFFECTS (gnu_call) = 1;
1889 return build_call_1_expr (free_decl, gnu_obj);
1891 /* ??? For now, disable variable-sized allocators in the stack since
1892 we can't yet gimplify an ALLOCATE_EXPR. */
1893 else if (gnat_pool == -1
1894 && TREE_CODE (gnu_size) == INTEGER_CST && !flag_stack_check)
1896 /* If the size is a constant, we can put it in the fixed portion of
1897 the stack frame to avoid the need to adjust the stack pointer. */
1898 if (TREE_CODE (gnu_size) == INTEGER_CST && !flag_stack_check)
1901 = build_range_type (NULL_TREE, size_one_node, gnu_size);
1902 tree gnu_array_type = build_array_type (char_type_node, gnu_range);
1904 = create_var_decl (get_identifier ("RETVAL"), NULL_TREE,
1905 gnu_array_type, NULL_TREE, false, false, false,
1906 false, NULL, gnat_node);
1908 return convert (ptr_void_type_node,
1909 build_unary_op (ADDR_EXPR, NULL_TREE, gnu_decl));
1914 return build2 (ALLOCATE_EXPR, ptr_void_type_node, gnu_size, gnu_align);
1919 if (Nkind (gnat_node) != N_Allocator || !Comes_From_Source (gnat_node))
1920 Check_No_Implicit_Heap_Alloc (gnat_node);
1921 return build_call_1_expr (malloc_decl, gnu_size);
1925 /* Build a GCC tree to correspond to allocating an object of TYPE whose
1926 initial value is INIT, if INIT is nonzero. Convert the expression to
1927 RESULT_TYPE, which must be some type of pointer. Return the tree.
1928 GNAT_PROC and GNAT_POOL optionally give the procedure to call and
1929 the storage pool to use. GNAT_NODE is used to provide an error
1930 location for restriction violations messages. If IGNORE_INIT_TYPE is
1931 true, ignore the type of INIT for the purpose of determining the size;
1932 this will cause the maximum size to be allocated if TYPE is of
1933 self-referential size. */
1936 build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
1937 Entity_Id gnat_pool, Node_Id gnat_node, bool ignore_init_type)
1939 tree size = TYPE_SIZE_UNIT (type);
1941 unsigned int default_allocator_alignment
1942 = get_target_default_allocator_alignment () * BITS_PER_UNIT;
1944 /* If the initializer, if present, is a NULL_EXPR, just return a new one. */
1945 if (init && TREE_CODE (init) == NULL_EXPR)
1946 return build1 (NULL_EXPR, result_type, TREE_OPERAND (init, 0));
1948 /* If RESULT_TYPE is a fat or thin pointer, set SIZE to be the sum of the
1949 sizes of the object and its template. Allocate the whole thing and
1950 fill in the parts that are known. */
1951 else if (TYPE_FAT_OR_THIN_POINTER_P (result_type))
1954 = build_unc_object_type_from_ptr (result_type, type,
1955 get_identifier ("ALLOC"));
1956 tree template_type = TREE_TYPE (TYPE_FIELDS (storage_type));
1957 tree storage_ptr_type = build_pointer_type (storage_type);
1959 tree template_cons = NULL_TREE;
1961 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (storage_type),
1964 /* If the size overflows, pass -1 so the allocator will raise
1966 if (TREE_CODE (size) == INTEGER_CST && TREE_OVERFLOW (size))
1967 size = ssize_int (-1);
1969 storage = build_call_alloc_dealloc (NULL_TREE, size,
1970 TYPE_ALIGN (storage_type),
1971 gnat_proc, gnat_pool, gnat_node);
1972 storage = convert (storage_ptr_type, protect_multiple_eval (storage));
1974 if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
1976 type = TREE_TYPE (TYPE_FIELDS (type));
1979 init = convert (type, init);
1982 /* If there is an initializing expression, make a constructor for
1983 the entire object including the bounds and copy it into the
1984 object. If there is no initializing expression, just set the
1988 template_cons = tree_cons (TREE_CHAIN (TYPE_FIELDS (storage_type)),
1990 template_cons = tree_cons (TYPE_FIELDS (storage_type),
1991 build_template (template_type, type,
1997 build2 (COMPOUND_EXPR, storage_ptr_type,
1999 (MODIFY_EXPR, storage_type,
2000 build_unary_op (INDIRECT_REF, NULL_TREE,
2001 convert (storage_ptr_type, storage)),
2002 gnat_build_constructor (storage_type, template_cons)),
2003 convert (storage_ptr_type, storage)));
2007 (COMPOUND_EXPR, result_type,
2009 (MODIFY_EXPR, template_type,
2011 (build_unary_op (INDIRECT_REF, NULL_TREE,
2012 convert (storage_ptr_type, storage)),
2013 NULL_TREE, TYPE_FIELDS (storage_type), 0),
2014 build_template (template_type, type, NULL_TREE)),
2015 convert (result_type, convert (storage_ptr_type, storage)));
2018 /* If we have an initializing expression, see if its size is simpler
2019 than the size from the type. */
2020 if (!ignore_init_type && init && TYPE_SIZE_UNIT (TREE_TYPE (init))
2021 && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (init))) == INTEGER_CST
2022 || CONTAINS_PLACEHOLDER_P (size)))
2023 size = TYPE_SIZE_UNIT (TREE_TYPE (init));
2025 /* If the size is still self-referential, reference the initializing
2026 expression, if it is present. If not, this must have been a
2027 call to allocate a library-level object, in which case we use
2028 the maximum size. */
2029 if (CONTAINS_PLACEHOLDER_P (size))
2031 if (!ignore_init_type && init)
2032 size = substitute_placeholder_in_expr (size, init);
2034 size = max_size (size, true);
2037 /* If the size overflows, pass -1 so the allocator will raise
2039 if (TREE_CODE (size) == INTEGER_CST && TREE_OVERFLOW (size))
2040 size = ssize_int (-1);
2042 /* If this is in the default storage pool and the type alignment is larger
2043 than what the default allocator supports, make an "aligning" record type
2044 with room to store a pointer before the field, allocate an object of that
2045 type, store the system's allocator return value just in front of the
2046 field and return the field's address. */
2048 if (No (gnat_proc) && TYPE_ALIGN (type) > default_allocator_alignment)
2050 /* Construct the aligning type with enough room for a pointer ahead
2051 of the field, then allocate. */
2053 = make_aligning_type (type, TYPE_ALIGN (type), size,
2054 default_allocator_alignment,
2055 POINTER_SIZE / BITS_PER_UNIT);
2057 tree record, record_addr;
2060 = build_call_alloc_dealloc (NULL_TREE, TYPE_SIZE_UNIT (record_type),
2061 default_allocator_alignment, Empty, Empty,
2065 = convert (build_pointer_type (record_type),
2066 save_expr (record_addr));
2068 record = build_unary_op (INDIRECT_REF, NULL_TREE, record_addr);
2070 /* Our RESULT (the Ada allocator's value) is the super-aligned address
2071 of the internal record field ... */
2073 = build_unary_op (ADDR_EXPR, NULL_TREE,
2075 (record, NULL_TREE, TYPE_FIELDS (record_type), 0));
2076 result = convert (result_type, result);
2078 /* ... with the system allocator's return value stored just in
2082 = build_binary_op (POINTER_PLUS_EXPR, ptr_void_type_node,
2083 convert (ptr_void_type_node, result),
2084 size_int (-POINTER_SIZE/BITS_PER_UNIT));
2087 = convert (build_pointer_type (ptr_void_type_node), ptr_addr);
2090 = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2091 build_binary_op (MODIFY_EXPR, NULL_TREE,
2092 build_unary_op (INDIRECT_REF, NULL_TREE,
2094 convert (ptr_void_type_node,
2100 result = convert (result_type,
2101 build_call_alloc_dealloc (NULL_TREE, size,
2107 /* If we have an initial value, put the new address into a SAVE_EXPR, assign
2108 the value, and return the address. Do this with a COMPOUND_EXPR. */
2112 result = save_expr (result);
2114 = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2116 (MODIFY_EXPR, NULL_TREE,
2117 build_unary_op (INDIRECT_REF,
2118 TREE_TYPE (TREE_TYPE (result)), result),
2123 return convert (result_type, result);
2126 /* Fill in a VMS descriptor for EXPR and return a constructor for it.
2127 GNAT_FORMAL is how we find the descriptor record. */
2130 fill_vms_descriptor (tree expr, Entity_Id gnat_formal)
2132 tree record_type = TREE_TYPE (TREE_TYPE (get_gnu_tree (gnat_formal)));
2134 tree const_list = NULL_TREE;
2136 expr = maybe_unconstrained_array (expr);
2137 gnat_mark_addressable (expr);
2139 for (field = TYPE_FIELDS (record_type); field; field = TREE_CHAIN (field))
2142 convert (TREE_TYPE (field),
2143 SUBSTITUTE_PLACEHOLDER_IN_EXPR
2144 (DECL_INITIAL (field), expr)),
2147 return gnat_build_constructor (record_type, nreverse (const_list));
2150 /* Indicate that we need to make the address of EXPR_NODE and it therefore
2151 should not be allocated in a register. Returns true if successful. */
2154 gnat_mark_addressable (tree expr_node)
2157 switch (TREE_CODE (expr_node))
2162 case ARRAY_RANGE_REF:
2165 case VIEW_CONVERT_EXPR:
2167 case NON_LVALUE_EXPR:
2169 expr_node = TREE_OPERAND (expr_node, 0);
2173 TREE_ADDRESSABLE (expr_node) = 1;
2179 TREE_ADDRESSABLE (expr_node) = 1;
2183 TREE_ADDRESSABLE (expr_node) = 1;
2187 return (DECL_CONST_CORRESPONDING_VAR (expr_node)
2188 && (gnat_mark_addressable
2189 (DECL_CONST_CORRESPONDING_VAR (expr_node))));