1 /* Expression translation
2 Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Paul Brook <paul@nowt.org>
4 and Steven Bosscher <s.bosscher@student.tudelft.nl>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
23 /* trans-expr.c-- generate GENERIC trees for gfc_expr. */
27 #include "coretypes.h"
33 #include "tree-gimple.h"
37 #include "trans-const.h"
38 #include "trans-types.h"
39 #include "trans-array.h"
40 /* Only for gfc_trans_assign and gfc_trans_pointer_assign. */
41 #include "trans-stmt.h"
42 #include "dependency.h"
44 static tree gfc_trans_structure_assign (tree dest, gfc_expr * expr);
45 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
48 /* Copy the scalarization loop variables. */
51 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
54 dest->loop = src->loop;
58 /* Initialize a simple expression holder.
60 Care must be taken when multiple se are created with the same parent.
61 The child se must be kept in sync. The easiest way is to delay creation
62 of a child se until after after the previous se has been translated. */
65 gfc_init_se (gfc_se * se, gfc_se * parent)
67 memset (se, 0, sizeof (gfc_se));
68 gfc_init_block (&se->pre);
69 gfc_init_block (&se->post);
74 gfc_copy_se_loopvars (se, parent);
78 /* Advances to the next SS in the chain. Use this rather than setting
79 se->ss = se->ss->next because all the parents needs to be kept in sync.
83 gfc_advance_se_ss_chain (gfc_se * se)
87 gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
90 /* Walk down the parent chain. */
93 /* Simple consistency check. */
94 gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
103 /* Ensures the result of the expression as either a temporary variable
104 or a constant so that it can be used repeatedly. */
107 gfc_make_safe_expr (gfc_se * se)
111 if (CONSTANT_CLASS_P (se->expr))
114 /* We need a temporary for this result. */
115 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
116 gfc_add_modify_expr (&se->pre, var, se->expr);
121 /* Return an expression which determines if a dummy parameter is present.
122 Also used for arguments to procedures with multiple entry points. */
125 gfc_conv_expr_present (gfc_symbol * sym)
129 gcc_assert (sym->attr.dummy);
131 decl = gfc_get_symbol_decl (sym);
132 if (TREE_CODE (decl) != PARM_DECL)
134 /* Array parameters use a temporary descriptor, we want the real
136 gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
137 || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
138 decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
140 return build2 (NE_EXPR, boolean_type_node, decl,
141 fold_convert (TREE_TYPE (decl), null_pointer_node));
145 /* Converts a missing, dummy argument into a null or zero. */
148 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts)
153 present = gfc_conv_expr_present (arg->symtree->n.sym);
154 tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
155 convert (TREE_TYPE (se->expr), integer_zero_node));
156 tmp = gfc_evaluate_now (tmp, &se->pre);
158 if (ts.type == BT_CHARACTER)
160 tmp = convert (gfc_charlen_type_node, integer_zero_node);
161 tmp = build3 (COND_EXPR, gfc_charlen_type_node, present,
162 se->string_length, tmp);
163 tmp = gfc_evaluate_now (tmp, &se->pre);
164 se->string_length = tmp;
170 /* Get the character length of an expression, looking through gfc_refs
174 gfc_get_expr_charlen (gfc_expr *e)
179 gcc_assert (e->expr_type == EXPR_VARIABLE
180 && e->ts.type == BT_CHARACTER);
182 length = NULL; /* To silence compiler warning. */
184 /* First candidate: if the variable is of type CHARACTER, the
185 expression's length could be the length of the character
187 if (e->symtree->n.sym->ts.type == BT_CHARACTER)
188 length = e->symtree->n.sym->ts.cl->backend_decl;
190 /* Look through the reference chain for component references. */
191 for (r = e->ref; r; r = r->next)
196 if (r->u.c.component->ts.type == BT_CHARACTER)
197 length = r->u.c.component->ts.cl->backend_decl;
205 /* We should never got substring references here. These will be
206 broken down by the scalarizer. */
211 gcc_assert (length != NULL);
217 /* Generate code to initialize a string length variable. Returns the
221 gfc_trans_init_string_length (gfc_charlen * cl, stmtblock_t * pblock)
226 gfc_init_se (&se, NULL);
227 gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
228 gfc_add_block_to_block (pblock, &se.pre);
230 tmp = cl->backend_decl;
231 gfc_add_modify_expr (pblock, tmp, se.expr);
236 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind)
244 type = gfc_get_character_type (kind, ref->u.ss.length);
245 type = build_pointer_type (type);
248 gfc_init_se (&start, se);
249 gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
250 gfc_add_block_to_block (&se->pre, &start.pre);
252 if (integer_onep (start.expr))
253 gfc_conv_string_parameter (se);
256 /* Change the start of the string. */
257 if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
260 tmp = build_fold_indirect_ref (se->expr);
261 tmp = gfc_build_array_ref (tmp, start.expr);
262 se->expr = gfc_build_addr_expr (type, tmp);
265 /* Length = end + 1 - start. */
266 gfc_init_se (&end, se);
267 if (ref->u.ss.end == NULL)
268 end.expr = se->string_length;
271 gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
272 gfc_add_block_to_block (&se->pre, &end.pre);
274 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node,
275 build_int_cst (gfc_charlen_type_node, 1),
277 tmp = fold_build2 (PLUS_EXPR, gfc_charlen_type_node, end.expr, tmp);
278 se->string_length = tmp;
282 /* Convert a derived type component reference. */
285 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
292 c = ref->u.c.component;
294 gcc_assert (c->backend_decl);
296 field = c->backend_decl;
297 gcc_assert (TREE_CODE (field) == FIELD_DECL);
299 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field, NULL_TREE);
303 if (c->ts.type == BT_CHARACTER)
305 tmp = c->ts.cl->backend_decl;
306 /* Components must always be constant length. */
307 gcc_assert (tmp && INTEGER_CST_P (tmp));
308 se->string_length = tmp;
311 if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER)
312 se->expr = build_fold_indirect_ref (se->expr);
316 /* Return the contents of a variable. Also handles reference/pointer
317 variables (all Fortran pointer references are implicit). */
320 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
327 bool alternate_entry;
330 sym = expr->symtree->n.sym;
333 /* Check that something hasn't gone horribly wrong. */
334 gcc_assert (se->ss != gfc_ss_terminator);
335 gcc_assert (se->ss->expr == expr);
337 /* A scalarized term. We already know the descriptor. */
338 se->expr = se->ss->data.info.descriptor;
339 se->string_length = se->ss->string_length;
340 for (ref = se->ss->data.info.ref; ref; ref = ref->next)
341 if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
346 tree se_expr = NULL_TREE;
348 se->expr = gfc_get_symbol_decl (sym);
350 /* Deal with references to a parent results or entries by storing
351 the current_function_decl and moving to the parent_decl. */
352 return_value = sym->attr.function && sym->result == sym;
353 alternate_entry = sym->attr.function && sym->attr.entry
354 && sym->result == sym;
355 entry_master = sym->attr.result
356 && sym->ns->proc_name->attr.entry_master
357 && !gfc_return_by_reference (sym->ns->proc_name);
358 parent_decl = DECL_CONTEXT (current_function_decl);
360 if ((se->expr == parent_decl && return_value)
361 || (sym->ns && sym->ns->proc_name
362 && sym->ns->proc_name->backend_decl == parent_decl
363 && (alternate_entry || entry_master)))
368 /* Special case for assigning the return value of a function.
369 Self recursive functions must have an explicit return value. */
370 if (return_value && (se->expr == current_function_decl || parent_flag))
371 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
373 /* Similarly for alternate entry points. */
374 else if (alternate_entry
375 && (sym->ns->proc_name->backend_decl == current_function_decl
378 gfc_entry_list *el = NULL;
380 for (el = sym->ns->entries; el; el = el->next)
383 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
388 else if (entry_master
389 && (sym->ns->proc_name->backend_decl == current_function_decl
391 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
396 /* Procedure actual arguments. */
397 else if (sym->attr.flavor == FL_PROCEDURE
398 && se->expr != current_function_decl)
400 gcc_assert (se->want_pointer);
401 if (!sym->attr.dummy)
403 gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
404 se->expr = build_fold_addr_expr (se->expr);
410 /* Dereference the expression, where needed. Since characters
411 are entirely different from other types, they are treated
413 if (sym->ts.type == BT_CHARACTER)
415 /* Dereference character pointer dummy arguments
417 if ((sym->attr.pointer || sym->attr.allocatable)
419 || sym->attr.function
420 || sym->attr.result))
421 se->expr = build_fold_indirect_ref (se->expr);
425 /* Dereference non-character scalar dummy arguments. */
426 if (sym->attr.dummy && !sym->attr.dimension)
427 se->expr = build_fold_indirect_ref (se->expr);
429 /* Dereference scalar hidden result. */
430 if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
431 && (sym->attr.function || sym->attr.result)
432 && !sym->attr.dimension && !sym->attr.pointer)
433 se->expr = build_fold_indirect_ref (se->expr);
435 /* Dereference non-character pointer variables.
436 These must be dummies, results, or scalars. */
437 if ((sym->attr.pointer || sym->attr.allocatable)
439 || sym->attr.function
441 || !sym->attr.dimension))
442 se->expr = build_fold_indirect_ref (se->expr);
448 /* For character variables, also get the length. */
449 if (sym->ts.type == BT_CHARACTER)
451 /* If the character length of an entry isn't set, get the length from
452 the master function instead. */
453 if (sym->attr.entry && !sym->ts.cl->backend_decl)
454 se->string_length = sym->ns->proc_name->ts.cl->backend_decl;
456 se->string_length = sym->ts.cl->backend_decl;
457 gcc_assert (se->string_length);
465 /* Return the descriptor if that's what we want and this is an array
466 section reference. */
467 if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
469 /* TODO: Pointers to single elements of array sections, eg elemental subs. */
470 /* Return the descriptor for array pointers and allocations. */
472 && ref->next == NULL && (se->descriptor_only))
475 gfc_conv_array_ref (se, &ref->u.ar);
476 /* Return a pointer to an element. */
480 gfc_conv_component_ref (se, ref);
484 gfc_conv_substring (se, ref, expr->ts.kind);
493 /* Pointer assignment, allocation or pass by reference. Arrays are handled
495 if (se->want_pointer)
497 if (expr->ts.type == BT_CHARACTER)
498 gfc_conv_string_parameter (se);
500 se->expr = build_fold_addr_expr (se->expr);
505 /* Unary ops are easy... Or they would be if ! was a valid op. */
508 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
513 gcc_assert (expr->ts.type != BT_CHARACTER);
514 /* Initialize the operand. */
515 gfc_init_se (&operand, se);
516 gfc_conv_expr_val (&operand, expr->value.op.op1);
517 gfc_add_block_to_block (&se->pre, &operand.pre);
519 type = gfc_typenode_for_spec (&expr->ts);
521 /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
522 We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
523 All other unary operators have an equivalent GIMPLE unary operator. */
524 if (code == TRUTH_NOT_EXPR)
525 se->expr = build2 (EQ_EXPR, type, operand.expr,
526 convert (type, integer_zero_node));
528 se->expr = build1 (code, type, operand.expr);
532 /* Expand power operator to optimal multiplications when a value is raised
533 to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
534 Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
535 Programming", 3rd Edition, 1998. */
537 /* This code is mostly duplicated from expand_powi in the backend.
538 We establish the "optimal power tree" lookup table with the defined size.
539 The items in the table are the exponents used to calculate the index
540 exponents. Any integer n less than the value can get an "addition chain",
541 with the first node being one. */
542 #define POWI_TABLE_SIZE 256
544 /* The table is from builtins.c. */
545 static const unsigned char powi_table[POWI_TABLE_SIZE] =
547 0, 1, 1, 2, 2, 3, 3, 4, /* 0 - 7 */
548 4, 6, 5, 6, 6, 10, 7, 9, /* 8 - 15 */
549 8, 16, 9, 16, 10, 12, 11, 13, /* 16 - 23 */
550 12, 17, 13, 18, 14, 24, 15, 26, /* 24 - 31 */
551 16, 17, 17, 19, 18, 33, 19, 26, /* 32 - 39 */
552 20, 25, 21, 40, 22, 27, 23, 44, /* 40 - 47 */
553 24, 32, 25, 34, 26, 29, 27, 44, /* 48 - 55 */
554 28, 31, 29, 34, 30, 60, 31, 36, /* 56 - 63 */
555 32, 64, 33, 34, 34, 46, 35, 37, /* 64 - 71 */
556 36, 65, 37, 50, 38, 48, 39, 69, /* 72 - 79 */
557 40, 49, 41, 43, 42, 51, 43, 58, /* 80 - 87 */
558 44, 64, 45, 47, 46, 59, 47, 76, /* 88 - 95 */
559 48, 65, 49, 66, 50, 67, 51, 66, /* 96 - 103 */
560 52, 70, 53, 74, 54, 104, 55, 74, /* 104 - 111 */
561 56, 64, 57, 69, 58, 78, 59, 68, /* 112 - 119 */
562 60, 61, 61, 80, 62, 75, 63, 68, /* 120 - 127 */
563 64, 65, 65, 128, 66, 129, 67, 90, /* 128 - 135 */
564 68, 73, 69, 131, 70, 94, 71, 88, /* 136 - 143 */
565 72, 128, 73, 98, 74, 132, 75, 121, /* 144 - 151 */
566 76, 102, 77, 124, 78, 132, 79, 106, /* 152 - 159 */
567 80, 97, 81, 160, 82, 99, 83, 134, /* 160 - 167 */
568 84, 86, 85, 95, 86, 160, 87, 100, /* 168 - 175 */
569 88, 113, 89, 98, 90, 107, 91, 122, /* 176 - 183 */
570 92, 111, 93, 102, 94, 126, 95, 150, /* 184 - 191 */
571 96, 128, 97, 130, 98, 133, 99, 195, /* 192 - 199 */
572 100, 128, 101, 123, 102, 164, 103, 138, /* 200 - 207 */
573 104, 145, 105, 146, 106, 109, 107, 149, /* 208 - 215 */
574 108, 200, 109, 146, 110, 170, 111, 157, /* 216 - 223 */
575 112, 128, 113, 130, 114, 182, 115, 132, /* 224 - 231 */
576 116, 200, 117, 132, 118, 158, 119, 206, /* 232 - 239 */
577 120, 240, 121, 162, 122, 147, 123, 152, /* 240 - 247 */
578 124, 166, 125, 214, 126, 138, 127, 153, /* 248 - 255 */
581 /* If n is larger than lookup table's max index, we use the "window
583 #define POWI_WINDOW_SIZE 3
585 /* Recursive function to expand the power operator. The temporary
586 values are put in tmpvar. The function returns tmpvar[1] ** n. */
588 gfc_conv_powi (gfc_se * se, int n, tree * tmpvar)
595 if (n < POWI_TABLE_SIZE)
600 op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
601 op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
605 digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
606 op0 = gfc_conv_powi (se, n - digit, tmpvar);
607 op1 = gfc_conv_powi (se, digit, tmpvar);
611 op0 = gfc_conv_powi (se, n >> 1, tmpvar);
615 tmp = fold_build2 (MULT_EXPR, TREE_TYPE (op0), op0, op1);
616 tmp = gfc_evaluate_now (tmp, &se->pre);
618 if (n < POWI_TABLE_SIZE)
625 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
626 return 1. Else return 0 and a call to runtime library functions
627 will have to be built. */
629 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
634 tree vartmp[POWI_TABLE_SIZE];
638 type = TREE_TYPE (lhs);
639 n = abs (TREE_INT_CST_LOW (rhs));
640 sgn = tree_int_cst_sgn (rhs);
642 if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations) || optimize_size)
643 && (n > 2 || n < -1))
649 se->expr = gfc_build_const (type, integer_one_node);
652 /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1. */
653 if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
655 tmp = build2 (EQ_EXPR, boolean_type_node, lhs,
656 fold_convert (TREE_TYPE (lhs), integer_minus_one_node));
657 cond = build2 (EQ_EXPR, boolean_type_node, lhs,
658 convert (TREE_TYPE (lhs), integer_one_node));
661 result = (lhs == 1 || lhs == -1) ? 1 : 0. */
664 tmp = build2 (TRUTH_OR_EXPR, boolean_type_node, tmp, cond);
665 se->expr = build3 (COND_EXPR, type, tmp,
666 convert (type, integer_one_node),
667 convert (type, integer_zero_node));
671 result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0. */
672 tmp = build3 (COND_EXPR, type, tmp,
673 convert (type, integer_minus_one_node),
674 convert (type, integer_zero_node));
675 se->expr = build3 (COND_EXPR, type, cond,
676 convert (type, integer_one_node),
681 memset (vartmp, 0, sizeof (vartmp));
685 tmp = gfc_build_const (type, integer_one_node);
686 vartmp[1] = build2 (RDIV_EXPR, type, tmp, vartmp[1]);
689 se->expr = gfc_conv_powi (se, n, vartmp);
695 /* Power op (**). Constant integer exponent has special handling. */
698 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
700 tree gfc_int4_type_node;
708 gfc_init_se (&lse, se);
709 gfc_conv_expr_val (&lse, expr->value.op.op1);
710 lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
711 gfc_add_block_to_block (&se->pre, &lse.pre);
713 gfc_init_se (&rse, se);
714 gfc_conv_expr_val (&rse, expr->value.op.op2);
715 gfc_add_block_to_block (&se->pre, &rse.pre);
717 if (expr->value.op.op2->ts.type == BT_INTEGER
718 && expr->value.op.op2->expr_type == EXPR_CONSTANT)
719 if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
722 gfc_int4_type_node = gfc_get_int_type (4);
724 kind = expr->value.op.op1->ts.kind;
725 switch (expr->value.op.op2->ts.type)
728 ikind = expr->value.op.op2->ts.kind;
733 rse.expr = convert (gfc_int4_type_node, rse.expr);
755 if (expr->value.op.op1->ts.type == BT_INTEGER)
756 lse.expr = convert (gfc_int4_type_node, lse.expr);
781 switch (expr->value.op.op1->ts.type)
784 if (kind == 3) /* Case 16 was not handled properly above. */
786 fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
790 fndecl = gfor_fndecl_math_powi[kind][ikind].real;
794 fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
806 fndecl = built_in_decls[BUILT_IN_POWF];
809 fndecl = built_in_decls[BUILT_IN_POW];
813 fndecl = built_in_decls[BUILT_IN_POWL];
824 fndecl = gfor_fndecl_math_cpowf;
827 fndecl = gfor_fndecl_math_cpow;
830 fndecl = gfor_fndecl_math_cpowl10;
833 fndecl = gfor_fndecl_math_cpowl16;
845 tmp = gfc_chainon_list (NULL_TREE, lse.expr);
846 tmp = gfc_chainon_list (tmp, rse.expr);
847 se->expr = build_function_call_expr (fndecl, tmp);
851 /* Generate code to allocate a string temporary. */
854 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
860 gcc_assert (TREE_TYPE (len) == gfc_charlen_type_node);
862 if (gfc_can_put_var_on_stack (len))
864 /* Create a temporary variable to hold the result. */
865 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
866 convert (gfc_charlen_type_node, integer_one_node));
867 tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
868 tmp = build_array_type (gfc_character1_type_node, tmp);
869 var = gfc_create_var (tmp, "str");
870 var = gfc_build_addr_expr (type, var);
874 /* Allocate a temporary to hold the result. */
875 var = gfc_create_var (type, "pstr");
876 args = gfc_chainon_list (NULL_TREE, len);
877 tmp = build_function_call_expr (gfor_fndecl_internal_malloc, args);
878 tmp = convert (type, tmp);
879 gfc_add_modify_expr (&se->pre, var, tmp);
881 /* Free the temporary afterwards. */
882 tmp = convert (pvoid_type_node, var);
883 args = gfc_chainon_list (NULL_TREE, tmp);
884 tmp = build_function_call_expr (gfor_fndecl_internal_free, args);
885 gfc_add_expr_to_block (&se->post, tmp);
892 /* Handle a string concatenation operation. A temporary will be allocated to
896 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
906 gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
907 && expr->value.op.op2->ts.type == BT_CHARACTER);
909 gfc_init_se (&lse, se);
910 gfc_conv_expr (&lse, expr->value.op.op1);
911 gfc_conv_string_parameter (&lse);
912 gfc_init_se (&rse, se);
913 gfc_conv_expr (&rse, expr->value.op.op2);
914 gfc_conv_string_parameter (&rse);
916 gfc_add_block_to_block (&se->pre, &lse.pre);
917 gfc_add_block_to_block (&se->pre, &rse.pre);
919 type = gfc_get_character_type (expr->ts.kind, expr->ts.cl);
920 len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
921 if (len == NULL_TREE)
923 len = fold_build2 (PLUS_EXPR, TREE_TYPE (lse.string_length),
924 lse.string_length, rse.string_length);
927 type = build_pointer_type (type);
929 var = gfc_conv_string_tmp (se, type, len);
931 /* Do the actual concatenation. */
933 args = gfc_chainon_list (args, len);
934 args = gfc_chainon_list (args, var);
935 args = gfc_chainon_list (args, lse.string_length);
936 args = gfc_chainon_list (args, lse.expr);
937 args = gfc_chainon_list (args, rse.string_length);
938 args = gfc_chainon_list (args, rse.expr);
939 tmp = build_function_call_expr (gfor_fndecl_concat_string, args);
940 gfc_add_expr_to_block (&se->pre, tmp);
942 /* Add the cleanup for the operands. */
943 gfc_add_block_to_block (&se->pre, &rse.post);
944 gfc_add_block_to_block (&se->pre, &lse.post);
947 se->string_length = len;
950 /* Translates an op expression. Common (binary) cases are handled by this
951 function, others are passed on. Recursion is used in either case.
952 We use the fact that (op1.ts == op2.ts) (except for the power
954 Operators need no special handling for scalarized expressions as long as
955 they call gfc_conv_simple_val to get their operands.
956 Character strings get special handling. */
959 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
971 switch (expr->value.op.operator)
973 case INTRINSIC_UPLUS:
974 case INTRINSIC_PARENTHESES:
975 gfc_conv_expr (se, expr->value.op.op1);
978 case INTRINSIC_UMINUS:
979 gfc_conv_unary_op (NEGATE_EXPR, se, expr);
983 gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
990 case INTRINSIC_MINUS:
994 case INTRINSIC_TIMES:
998 case INTRINSIC_DIVIDE:
999 /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
1000 an integer, we must round towards zero, so we use a
1002 if (expr->ts.type == BT_INTEGER)
1003 code = TRUNC_DIV_EXPR;
1008 case INTRINSIC_POWER:
1009 gfc_conv_power_op (se, expr);
1012 case INTRINSIC_CONCAT:
1013 gfc_conv_concat_op (se, expr);
1017 code = TRUTH_ANDIF_EXPR;
1022 code = TRUTH_ORIF_EXPR;
1026 /* EQV and NEQV only work on logicals, but since we represent them
1027 as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE. */
1036 case INTRINSIC_NEQV:
1066 case INTRINSIC_USER:
1067 case INTRINSIC_ASSIGN:
1068 /* These should be converted into function calls by the frontend. */
1072 fatal_error ("Unknown intrinsic op");
1076 /* The only exception to this is **, which is handled separately anyway. */
1077 gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
1079 if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
1083 gfc_init_se (&lse, se);
1084 gfc_conv_expr (&lse, expr->value.op.op1);
1085 gfc_add_block_to_block (&se->pre, &lse.pre);
1088 gfc_init_se (&rse, se);
1089 gfc_conv_expr (&rse, expr->value.op.op2);
1090 gfc_add_block_to_block (&se->pre, &rse.pre);
1094 gfc_conv_string_parameter (&lse);
1095 gfc_conv_string_parameter (&rse);
1097 lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
1098 rse.string_length, rse.expr);
1099 rse.expr = integer_zero_node;
1100 gfc_add_block_to_block (&lse.post, &rse.post);
1103 type = gfc_typenode_for_spec (&expr->ts);
1107 /* The result of logical ops is always boolean_type_node. */
1108 tmp = fold_build2 (code, type, lse.expr, rse.expr);
1109 se->expr = convert (type, tmp);
1112 se->expr = fold_build2 (code, type, lse.expr, rse.expr);
1114 /* Add the post blocks. */
1115 gfc_add_block_to_block (&se->post, &rse.post);
1116 gfc_add_block_to_block (&se->post, &lse.post);
1119 /* If a string's length is one, we convert it to a single character. */
1122 gfc_to_single_character (tree len, tree str)
1124 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str)));
1126 if (INTEGER_CST_P (len) && TREE_INT_CST_LOW (len) == 1
1127 && TREE_INT_CST_HIGH (len) == 0)
1129 str = fold_convert (pchar_type_node, str);
1130 return build_fold_indirect_ref (str);
1136 /* Compare two strings. If they are all single characters, the result is the
1137 subtraction of them. Otherwise, we build a library call. */
1140 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2)
1147 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
1148 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
1150 type = gfc_get_int_type (gfc_default_integer_kind);
1152 sc1 = gfc_to_single_character (len1, str1);
1153 sc2 = gfc_to_single_character (len2, str2);
1155 /* Deal with single character specially. */
1156 if (sc1 != NULL_TREE && sc2 != NULL_TREE)
1158 sc1 = fold_convert (type, sc1);
1159 sc2 = fold_convert (type, sc2);
1160 tmp = fold_build2 (MINUS_EXPR, type, sc1, sc2);
1165 tmp = gfc_chainon_list (tmp, len1);
1166 tmp = gfc_chainon_list (tmp, str1);
1167 tmp = gfc_chainon_list (tmp, len2);
1168 tmp = gfc_chainon_list (tmp, str2);
1170 /* Build a call for the comparison. */
1171 tmp = build_function_call_expr (gfor_fndecl_compare_string, tmp);
1178 gfc_conv_function_val (gfc_se * se, gfc_symbol * sym)
1182 if (sym->attr.dummy)
1184 tmp = gfc_get_symbol_decl (sym);
1185 gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1186 && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
1190 if (!sym->backend_decl)
1191 sym->backend_decl = gfc_get_extern_function_decl (sym);
1193 tmp = sym->backend_decl;
1194 if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1196 gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1197 tmp = build_fold_addr_expr (tmp);
1204 /* Initialize MAPPING. */
1207 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1209 mapping->syms = NULL;
1210 mapping->charlens = NULL;
1214 /* Free all memory held by MAPPING (but not MAPPING itself). */
1217 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1219 gfc_interface_sym_mapping *sym;
1220 gfc_interface_sym_mapping *nextsym;
1222 gfc_charlen *nextcl;
1224 for (sym = mapping->syms; sym; sym = nextsym)
1226 nextsym = sym->next;
1227 gfc_free_symbol (sym->new->n.sym);
1228 gfc_free (sym->new);
1231 for (cl = mapping->charlens; cl; cl = nextcl)
1234 gfc_free_expr (cl->length);
1240 /* Return a copy of gfc_charlen CL. Add the returned structure to
1241 MAPPING so that it will be freed by gfc_free_interface_mapping. */
1243 static gfc_charlen *
1244 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1249 new = gfc_get_charlen ();
1250 new->next = mapping->charlens;
1251 new->length = gfc_copy_expr (cl->length);
1253 mapping->charlens = new;
1258 /* A subroutine of gfc_add_interface_mapping. Return a descriptorless
1259 array variable that can be used as the actual argument for dummy
1260 argument SYM. Add any initialization code to BLOCK. PACKED is as
1261 for gfc_get_nodesc_array_type and DATA points to the first element
1262 in the passed array. */
1265 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1266 int packed, tree data)
1271 type = gfc_typenode_for_spec (&sym->ts);
1272 type = gfc_get_nodesc_array_type (type, sym->as, packed);
1274 var = gfc_create_var (type, "ifm");
1275 gfc_add_modify_expr (block, var, fold_convert (type, data));
1281 /* A subroutine of gfc_add_interface_mapping. Set the stride, upper bounds
1282 and offset of descriptorless array type TYPE given that it has the same
1283 size as DESC. Add any set-up code to BLOCK. */
1286 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1293 offset = gfc_index_zero_node;
1294 for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1296 GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1297 if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1299 dim = gfc_rank_cst[n];
1300 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1301 gfc_conv_descriptor_ubound (desc, dim),
1302 gfc_conv_descriptor_lbound (desc, dim));
1303 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1304 GFC_TYPE_ARRAY_LBOUND (type, n),
1306 tmp = gfc_evaluate_now (tmp, block);
1307 GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1309 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
1310 GFC_TYPE_ARRAY_LBOUND (type, n),
1311 GFC_TYPE_ARRAY_STRIDE (type, n));
1312 offset = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp);
1314 offset = gfc_evaluate_now (offset, block);
1315 GFC_TYPE_ARRAY_OFFSET (type) = offset;
1319 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1320 in SE. The caller may still use se->expr and se->string_length after
1321 calling this function. */
1324 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1325 gfc_symbol * sym, gfc_se * se)
1327 gfc_interface_sym_mapping *sm;
1331 gfc_symbol *new_sym;
1333 gfc_symtree *new_symtree;
1335 /* Create a new symbol to represent the actual argument. */
1336 new_sym = gfc_new_symbol (sym->name, NULL);
1337 new_sym->ts = sym->ts;
1338 new_sym->attr.referenced = 1;
1339 new_sym->attr.dimension = sym->attr.dimension;
1340 new_sym->attr.pointer = sym->attr.pointer;
1341 new_sym->attr.allocatable = sym->attr.allocatable;
1342 new_sym->attr.flavor = sym->attr.flavor;
1344 /* Create a fake symtree for it. */
1346 new_symtree = gfc_new_symtree (&root, sym->name);
1347 new_symtree->n.sym = new_sym;
1348 gcc_assert (new_symtree == root);
1350 /* Create a dummy->actual mapping. */
1351 sm = gfc_getmem (sizeof (*sm));
1352 sm->next = mapping->syms;
1354 sm->new = new_symtree;
1357 /* Stabilize the argument's value. */
1358 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1360 if (sym->ts.type == BT_CHARACTER)
1362 /* Create a copy of the dummy argument's length. */
1363 new_sym->ts.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.cl);
1365 /* If the length is specified as "*", record the length that
1366 the caller is passing. We should use the callee's length
1367 in all other cases. */
1368 if (!new_sym->ts.cl->length)
1370 se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1371 new_sym->ts.cl->backend_decl = se->string_length;
1375 /* Use the passed value as-is if the argument is a function. */
1376 if (sym->attr.flavor == FL_PROCEDURE)
1379 /* If the argument is either a string or a pointer to a string,
1380 convert it to a boundless character type. */
1381 else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1383 tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1384 tmp = build_pointer_type (tmp);
1385 if (sym->attr.pointer)
1386 tmp = build_pointer_type (tmp);
1388 value = fold_convert (tmp, se->expr);
1389 if (sym->attr.pointer)
1390 value = build_fold_indirect_ref (value);
1393 /* If the argument is a scalar, a pointer to an array or an allocatable,
1395 else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1396 value = build_fold_indirect_ref (se->expr);
1398 /* For character(*), use the actual argument's descriptor. */
1399 else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.cl->length)
1400 value = build_fold_indirect_ref (se->expr);
1402 /* If the argument is an array descriptor, use it to determine
1403 information about the actual argument's shape. */
1404 else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1405 && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1407 /* Get the actual argument's descriptor. */
1408 desc = build_fold_indirect_ref (se->expr);
1410 /* Create the replacement variable. */
1411 tmp = gfc_conv_descriptor_data_get (desc);
1412 value = gfc_get_interface_mapping_array (&se->pre, sym, 0, tmp);
1414 /* Use DESC to work out the upper bounds, strides and offset. */
1415 gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1418 /* Otherwise we have a packed array. */
1419 value = gfc_get_interface_mapping_array (&se->pre, sym, 2, se->expr);
1421 new_sym->backend_decl = value;
1425 /* Called once all dummy argument mappings have been added to MAPPING,
1426 but before the mapping is used to evaluate expressions. Pre-evaluate
1427 the length of each argument, adding any initialization code to PRE and
1428 any finalization code to POST. */
1431 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1432 stmtblock_t * pre, stmtblock_t * post)
1434 gfc_interface_sym_mapping *sym;
1438 for (sym = mapping->syms; sym; sym = sym->next)
1439 if (sym->new->n.sym->ts.type == BT_CHARACTER
1440 && !sym->new->n.sym->ts.cl->backend_decl)
1442 expr = sym->new->n.sym->ts.cl->length;
1443 gfc_apply_interface_mapping_to_expr (mapping, expr);
1444 gfc_init_se (&se, NULL);
1445 gfc_conv_expr (&se, expr);
1447 se.expr = gfc_evaluate_now (se.expr, &se.pre);
1448 gfc_add_block_to_block (pre, &se.pre);
1449 gfc_add_block_to_block (post, &se.post);
1451 sym->new->n.sym->ts.cl->backend_decl = se.expr;
1456 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1460 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
1461 gfc_constructor * c)
1463 for (; c; c = c->next)
1465 gfc_apply_interface_mapping_to_expr (mapping, c->expr);
1468 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
1469 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
1470 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
1476 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1480 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
1485 for (; ref; ref = ref->next)
1489 for (n = 0; n < ref->u.ar.dimen; n++)
1491 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
1492 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
1493 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
1495 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
1502 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
1503 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
1509 /* EXPR is a copy of an expression that appeared in the interface
1510 associated with MAPPING. Walk it recursively looking for references to
1511 dummy arguments that MAPPING maps to actual arguments. Replace each such
1512 reference with a reference to the associated actual argument. */
1515 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
1518 gfc_interface_sym_mapping *sym;
1519 gfc_actual_arglist *actual;
1524 /* Copying an expression does not copy its length, so do that here. */
1525 if (expr->ts.type == BT_CHARACTER && expr->ts.cl)
1527 expr->ts.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.cl);
1528 gfc_apply_interface_mapping_to_expr (mapping, expr->ts.cl->length);
1531 /* Apply the mapping to any references. */
1532 gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
1534 /* ...and to the expression's symbol, if it has one. */
1536 for (sym = mapping->syms; sym; sym = sym->next)
1537 if (sym->old == expr->symtree->n.sym)
1538 expr->symtree = sym->new;
1540 /* ...and to subexpressions in expr->value. */
1541 switch (expr->expr_type)
1546 case EXPR_SUBSTRING:
1550 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
1551 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
1555 for (sym = mapping->syms; sym; sym = sym->next)
1556 if (sym->old == expr->value.function.esym)
1557 expr->value.function.esym = sym->new->n.sym;
1559 for (actual = expr->value.function.actual; actual; actual = actual->next)
1560 gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
1564 case EXPR_STRUCTURE:
1565 gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
1571 /* Evaluate interface expression EXPR using MAPPING. Store the result
1575 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
1576 gfc_se * se, gfc_expr * expr)
1578 expr = gfc_copy_expr (expr);
1579 gfc_apply_interface_mapping_to_expr (mapping, expr);
1580 gfc_conv_expr (se, expr);
1581 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1582 gfc_free_expr (expr);
1585 /* Returns a reference to a temporary array into which a component of
1586 an actual argument derived type array is copied and then returned
1587 after the function call.
1588 TODO Get rid of this kludge, when array descriptors are capable of
1589 handling aliased arrays. */
1592 gfc_conv_aliased_arg (gfc_se * parmse, gfc_expr * expr, int g77)
1608 gcc_assert (expr->expr_type == EXPR_VARIABLE);
1610 gfc_init_se (&lse, NULL);
1611 gfc_init_se (&rse, NULL);
1613 /* Walk the argument expression. */
1614 rss = gfc_walk_expr (expr);
1616 gcc_assert (rss != gfc_ss_terminator);
1618 /* Initialize the scalarizer. */
1619 gfc_init_loopinfo (&loop);
1620 gfc_add_ss_to_loop (&loop, rss);
1622 /* Calculate the bounds of the scalarization. */
1623 gfc_conv_ss_startstride (&loop);
1625 /* Build an ss for the temporary. */
1626 base_type = gfc_typenode_for_spec (&expr->ts);
1627 if (GFC_ARRAY_TYPE_P (base_type)
1628 || GFC_DESCRIPTOR_TYPE_P (base_type))
1629 base_type = gfc_get_element_type (base_type);
1631 loop.temp_ss = gfc_get_ss ();;
1632 loop.temp_ss->type = GFC_SS_TEMP;
1633 loop.temp_ss->data.temp.type = base_type;
1635 if (expr->ts.type == BT_CHARACTER)
1636 loop.temp_ss->string_length = expr->ts.cl->backend_decl;
1638 loop.temp_ss->data.temp.dimen = loop.dimen;
1639 loop.temp_ss->next = gfc_ss_terminator;
1641 /* Associate the SS with the loop. */
1642 gfc_add_ss_to_loop (&loop, loop.temp_ss);
1644 /* Setup the scalarizing loops. */
1645 gfc_conv_loop_setup (&loop);
1647 /* Pass the temporary descriptor back to the caller. */
1648 info = &loop.temp_ss->data.info;
1649 parmse->expr = info->descriptor;
1651 /* Setup the gfc_se structures. */
1652 gfc_copy_loopinfo_to_se (&lse, &loop);
1653 gfc_copy_loopinfo_to_se (&rse, &loop);
1656 lse.ss = loop.temp_ss;
1657 gfc_mark_ss_chain_used (rss, 1);
1658 gfc_mark_ss_chain_used (loop.temp_ss, 1);
1660 /* Start the scalarized loop body. */
1661 gfc_start_scalarized_body (&loop, &body);
1663 /* Translate the expression. */
1664 gfc_conv_expr (&rse, expr);
1666 gfc_conv_tmp_array_ref (&lse);
1667 gfc_advance_se_ss_chain (&lse);
1669 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts.type);
1670 gfc_add_expr_to_block (&body, tmp);
1672 gcc_assert (rse.ss == gfc_ss_terminator);
1674 gfc_trans_scalarizing_loops (&loop, &body);
1676 /* Add the post block after the second loop, so that any
1677 freeing of allocated memory is done at the right time. */
1678 gfc_add_block_to_block (&parmse->pre, &loop.pre);
1680 /**********Copy the temporary back again.*********/
1682 gfc_init_se (&lse, NULL);
1683 gfc_init_se (&rse, NULL);
1685 /* Walk the argument expression. */
1686 lss = gfc_walk_expr (expr);
1687 rse.ss = loop.temp_ss;
1690 /* Initialize the scalarizer. */
1691 gfc_init_loopinfo (&loop2);
1692 gfc_add_ss_to_loop (&loop2, lss);
1694 /* Calculate the bounds of the scalarization. */
1695 gfc_conv_ss_startstride (&loop2);
1697 /* Setup the scalarizing loops. */
1698 gfc_conv_loop_setup (&loop2);
1700 gfc_copy_loopinfo_to_se (&lse, &loop2);
1701 gfc_copy_loopinfo_to_se (&rse, &loop2);
1703 gfc_mark_ss_chain_used (lss, 1);
1704 gfc_mark_ss_chain_used (loop.temp_ss, 1);
1706 /* Declare the variable to hold the temporary offset and start the
1707 scalarized loop body. */
1708 offset = gfc_create_var (gfc_array_index_type, NULL);
1709 gfc_start_scalarized_body (&loop2, &body);
1711 /* Build the offsets for the temporary from the loop variables. The
1712 temporary array has lbounds of zero and strides of one in all
1713 dimensions, so this is very simple. The offset is only computed
1714 outside the innermost loop, so the overall transfer could be
1715 optimised further. */
1716 info = &rse.ss->data.info;
1718 tmp_index = gfc_index_zero_node;
1719 for (n = info->dimen - 1; n > 0; n--)
1722 tmp = rse.loop->loopvar[n];
1723 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1724 tmp, rse.loop->from[n]);
1725 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1728 tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1729 rse.loop->to[n-1], rse.loop->from[n-1]);
1730 tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1731 tmp_str, gfc_index_one_node);
1733 tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
1737 tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1738 tmp_index, rse.loop->from[0]);
1739 gfc_add_modify_expr (&rse.loop->code[0], offset, tmp_index);
1741 tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1742 rse.loop->loopvar[0], offset);
1744 /* Now use the offset for the reference. */
1745 tmp = build_fold_indirect_ref (info->data);
1746 rse.expr = gfc_build_array_ref (tmp, tmp_index);
1748 if (expr->ts.type == BT_CHARACTER)
1749 rse.string_length = expr->ts.cl->backend_decl;
1751 gfc_conv_expr (&lse, expr);
1753 gcc_assert (lse.ss == gfc_ss_terminator);
1755 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts.type);
1756 gfc_add_expr_to_block (&body, tmp);
1758 /* Generate the copying loops. */
1759 gfc_trans_scalarizing_loops (&loop2, &body);
1761 /* Wrap the whole thing up by adding the second loop to the post-block
1762 and following it by the post-block of the fist loop. In this way,
1763 if the temporary needs freeing, it is done after use! */
1764 gfc_add_block_to_block (&parmse->post, &loop2.pre);
1765 gfc_add_block_to_block (&parmse->post, &loop2.post);
1767 gfc_add_block_to_block (&parmse->post, &loop.post);
1769 gfc_cleanup_loop (&loop);
1770 gfc_cleanup_loop (&loop2);
1772 /* Pass the string length to the argument expression. */
1773 if (expr->ts.type == BT_CHARACTER)
1774 parmse->string_length = expr->ts.cl->backend_decl;
1776 /* We want either the address for the data or the address of the descriptor,
1777 depending on the mode of passing array arguments. */
1779 parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
1781 parmse->expr = build_fold_addr_expr (parmse->expr);
1786 /* Is true if the last array reference is followed by a component reference. */
1789 is_aliased_array (gfc_expr * e)
1795 for (ref = e->ref; ref; ref = ref->next)
1797 if (ref->type == REF_ARRAY)
1800 if (ref->next == NULL && ref->type == REF_COMPONENT)
1806 /* Generate code for a procedure call. Note can return se->post != NULL.
1807 If se->direct_byref is set then se->expr contains the return parameter.
1808 Return nonzero, if the call has alternate specifiers. */
1811 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
1812 gfc_actual_arglist * arg)
1814 gfc_interface_mapping mapping;
1827 gfc_formal_arglist *formal;
1828 int has_alternate_specifier = 0;
1829 bool need_interface_mapping;
1836 arglist = NULL_TREE;
1837 retargs = NULL_TREE;
1838 stringargs = NULL_TREE;
1844 if (!sym->attr.elemental)
1846 gcc_assert (se->ss->type == GFC_SS_FUNCTION);
1847 if (se->ss->useflags)
1849 gcc_assert (gfc_return_by_reference (sym)
1850 && sym->result->attr.dimension);
1851 gcc_assert (se->loop != NULL);
1853 /* Access the previously obtained result. */
1854 gfc_conv_tmp_array_ref (se);
1855 gfc_advance_se_ss_chain (se);
1859 info = &se->ss->data.info;
1864 gfc_init_interface_mapping (&mapping);
1865 need_interface_mapping = ((sym->ts.type == BT_CHARACTER
1866 && sym->ts.cl->length
1867 && sym->ts.cl->length->expr_type
1869 || sym->attr.dimension);
1870 formal = sym->formal;
1871 /* Evaluate the arguments. */
1872 for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
1875 fsym = formal ? formal->sym : NULL;
1879 if (se->ignore_optional)
1881 /* Some intrinsics have already been resolved to the correct
1885 else if (arg->label)
1887 has_alternate_specifier = 1;
1892 /* Pass a NULL pointer for an absent arg. */
1893 gfc_init_se (&parmse, NULL);
1894 parmse.expr = null_pointer_node;
1895 if (arg->missing_arg_type == BT_CHARACTER)
1896 parmse.string_length = convert (gfc_charlen_type_node,
1900 else if (se->ss && se->ss->useflags)
1902 /* An elemental function inside a scalarized loop. */
1903 gfc_init_se (&parmse, se);
1904 gfc_conv_expr_reference (&parmse, e);
1908 /* A scalar or transformational function. */
1909 gfc_init_se (&parmse, NULL);
1910 argss = gfc_walk_expr (e);
1912 if (argss == gfc_ss_terminator)
1914 gfc_conv_expr_reference (&parmse, e);
1915 if (fsym && fsym->attr.pointer
1916 && e->expr_type != EXPR_NULL)
1918 /* Scalar pointer dummy args require an extra level of
1919 indirection. The null pointer already contains
1920 this level of indirection. */
1921 parmse.expr = build_fold_addr_expr (parmse.expr);
1926 /* If the procedure requires an explicit interface, the actual
1927 argument is passed according to the corresponding formal
1928 argument. If the corresponding formal argument is a POINTER,
1929 ALLOCATABLE or assumed shape, we do not use g77's calling
1930 convention, and pass the address of the array descriptor
1931 instead. Otherwise we use g77's calling convention. */
1934 && !(fsym->attr.pointer || fsym->attr.allocatable)
1935 && fsym->as->type != AS_ASSUMED_SHAPE;
1936 f = f || !sym->attr.always_explicit;
1937 if (e->expr_type == EXPR_VARIABLE
1938 && is_aliased_array (e))
1939 /* The actual argument is a component reference to an
1940 array of derived types. In this case, the argument
1941 is converted to a temporary, which is passed and then
1942 written back after the procedure call. */
1943 gfc_conv_aliased_arg (&parmse, e, f);
1945 gfc_conv_array_parameter (&parmse, e, argss, f);
1947 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
1948 allocated on entry, it must be deallocated. */
1949 if (fsym && fsym->attr.allocatable
1950 && fsym->attr.intent == INTENT_OUT)
1952 tmp = e->symtree->n.sym->backend_decl;
1953 if (e->symtree->n.sym->attr.dummy)
1954 tmp = build_fold_indirect_ref (tmp);
1955 tmp = gfc_trans_dealloc_allocated (tmp);
1956 gfc_add_expr_to_block (&se->pre, tmp);
1962 /* If an optional argument is itself an optional dummy argument,
1963 check its presence and substitute a null if absent. */
1964 if (e && e->expr_type == EXPR_VARIABLE
1965 && e->symtree->n.sym->attr.optional
1966 && fsym && fsym->attr.optional)
1967 gfc_conv_missing_dummy (&parmse, e, fsym->ts);
1969 if (fsym && need_interface_mapping)
1970 gfc_add_interface_mapping (&mapping, fsym, &parmse);
1972 gfc_add_block_to_block (&se->pre, &parmse.pre);
1973 gfc_add_block_to_block (&se->post, &parmse.post);
1975 /* Character strings are passed as two parameters, a length and a
1977 if (parmse.string_length != NULL_TREE)
1978 stringargs = gfc_chainon_list (stringargs, parmse.string_length);
1980 arglist = gfc_chainon_list (arglist, parmse.expr);
1982 gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
1985 if (ts.type == BT_CHARACTER)
1987 if (sym->ts.cl->length == NULL)
1989 /* Assumed character length results are not allowed by 5.1.1.5 of the
1990 standard and are trapped in resolve.c; except in the case of SPREAD
1991 (and other intrinsics?). In this case, we take the character length
1992 of the first argument for the result. */
1993 cl.backend_decl = TREE_VALUE (stringargs);
1997 /* Calculate the length of the returned string. */
1998 gfc_init_se (&parmse, NULL);
1999 if (need_interface_mapping)
2000 gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2002 gfc_conv_expr (&parmse, sym->ts.cl->length);
2003 gfc_add_block_to_block (&se->pre, &parmse.pre);
2004 gfc_add_block_to_block (&se->post, &parmse.post);
2005 cl.backend_decl = fold_convert (gfc_charlen_type_node, parmse.expr);
2008 /* Set up a charlen structure for it. */
2013 len = cl.backend_decl;
2016 byref = gfc_return_by_reference (sym);
2019 if (se->direct_byref)
2020 retargs = gfc_chainon_list (retargs, se->expr);
2021 else if (sym->result->attr.dimension)
2023 gcc_assert (se->loop && info);
2025 /* Set the type of the array. */
2026 tmp = gfc_typenode_for_spec (&ts);
2027 info->dimen = se->loop->dimen;
2029 /* Evaluate the bounds of the result, if known. */
2030 gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2032 /* Create a temporary to store the result. In case the function
2033 returns a pointer, the temporary will be a shallow copy and
2034 mustn't be deallocated. */
2035 callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2036 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2037 false, !sym->attr.pointer, callee_alloc);
2039 /* Zero the first stride to indicate a temporary. */
2040 tmp = gfc_conv_descriptor_stride (info->descriptor, gfc_rank_cst[0]);
2041 gfc_add_modify_expr (&se->pre, tmp,
2042 convert (TREE_TYPE (tmp), integer_zero_node));
2044 /* Pass the temporary as the first argument. */
2045 tmp = info->descriptor;
2046 tmp = build_fold_addr_expr (tmp);
2047 retargs = gfc_chainon_list (retargs, tmp);
2049 else if (ts.type == BT_CHARACTER)
2051 /* Pass the string length. */
2052 type = gfc_get_character_type (ts.kind, ts.cl);
2053 type = build_pointer_type (type);
2055 /* Return an address to a char[0:len-1]* temporary for
2056 character pointers. */
2057 if (sym->attr.pointer || sym->attr.allocatable)
2059 /* Build char[0:len-1] * pstr. */
2060 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
2061 build_int_cst (gfc_charlen_type_node, 1));
2062 tmp = build_range_type (gfc_array_index_type,
2063 gfc_index_zero_node, tmp);
2064 tmp = build_array_type (gfc_character1_type_node, tmp);
2065 var = gfc_create_var (build_pointer_type (tmp), "pstr");
2067 /* Provide an address expression for the function arguments. */
2068 var = build_fold_addr_expr (var);
2071 var = gfc_conv_string_tmp (se, type, len);
2073 retargs = gfc_chainon_list (retargs, var);
2077 gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2079 type = gfc_get_complex_type (ts.kind);
2080 var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2081 retargs = gfc_chainon_list (retargs, var);
2084 /* Add the string length to the argument list. */
2085 if (ts.type == BT_CHARACTER)
2086 retargs = gfc_chainon_list (retargs, len);
2088 gfc_free_interface_mapping (&mapping);
2090 /* Add the return arguments. */
2091 arglist = chainon (retargs, arglist);
2093 /* Add the hidden string length parameters to the arguments. */
2094 arglist = chainon (arglist, stringargs);
2096 /* Generate the actual call. */
2097 gfc_conv_function_val (se, sym);
2098 /* If there are alternate return labels, function type should be
2099 integer. Can't modify the type in place though, since it can be shared
2100 with other functions. */
2101 if (has_alternate_specifier
2102 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2104 gcc_assert (! sym->attr.dummy);
2105 TREE_TYPE (sym->backend_decl)
2106 = build_function_type (integer_type_node,
2107 TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2108 se->expr = build_fold_addr_expr (sym->backend_decl);
2111 fntype = TREE_TYPE (TREE_TYPE (se->expr));
2112 se->expr = build3 (CALL_EXPR, TREE_TYPE (fntype), se->expr,
2113 arglist, NULL_TREE);
2115 /* If we have a pointer function, but we don't want a pointer, e.g.
2118 where f is pointer valued, we have to dereference the result. */
2119 if (!se->want_pointer && !byref && sym->attr.pointer)
2120 se->expr = build_fold_indirect_ref (se->expr);
2122 /* f2c calling conventions require a scalar default real function to
2123 return a double precision result. Convert this back to default
2124 real. We only care about the cases that can happen in Fortran 77.
2126 if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2127 && sym->ts.kind == gfc_default_real_kind
2128 && !sym->attr.always_explicit)
2129 se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2131 /* A pure function may still have side-effects - it may modify its
2133 TREE_SIDE_EFFECTS (se->expr) = 1;
2135 if (!sym->attr.pure)
2136 TREE_SIDE_EFFECTS (se->expr) = 1;
2141 /* Add the function call to the pre chain. There is no expression. */
2142 gfc_add_expr_to_block (&se->pre, se->expr);
2143 se->expr = NULL_TREE;
2145 if (!se->direct_byref)
2147 if (sym->attr.dimension)
2149 if (flag_bounds_check)
2151 /* Check the data pointer hasn't been modified. This would
2152 happen in a function returning a pointer. */
2153 tmp = gfc_conv_descriptor_data_get (info->descriptor);
2154 tmp = fold_build2 (NE_EXPR, boolean_type_node,
2156 gfc_trans_runtime_check (tmp, gfc_strconst_fault, &se->pre);
2158 se->expr = info->descriptor;
2159 /* Bundle in the string length. */
2160 se->string_length = len;
2162 else if (sym->ts.type == BT_CHARACTER)
2164 /* Dereference for character pointer results. */
2165 if (sym->attr.pointer || sym->attr.allocatable)
2166 se->expr = build_fold_indirect_ref (var);
2170 se->string_length = len;
2174 gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
2175 se->expr = build_fold_indirect_ref (var);
2180 return has_alternate_specifier;
2184 /* Generate code to copy a string. */
2187 gfc_trans_string_copy (stmtblock_t * block, tree dlen, tree dest,
2188 tree slen, tree src)
2194 /* Deal with single character specially. */
2195 dsc = gfc_to_single_character (dlen, dest);
2196 ssc = gfc_to_single_character (slen, src);
2197 if (dsc != NULL_TREE && ssc != NULL_TREE)
2199 gfc_add_modify_expr (block, dsc, ssc);
2204 tmp = gfc_chainon_list (tmp, dlen);
2205 tmp = gfc_chainon_list (tmp, dest);
2206 tmp = gfc_chainon_list (tmp, slen);
2207 tmp = gfc_chainon_list (tmp, src);
2208 tmp = build_function_call_expr (gfor_fndecl_copy_string, tmp);
2209 gfc_add_expr_to_block (block, tmp);
2213 /* Translate a statement function.
2214 The value of a statement function reference is obtained by evaluating the
2215 expression using the values of the actual arguments for the values of the
2216 corresponding dummy arguments. */
2219 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
2223 gfc_formal_arglist *fargs;
2224 gfc_actual_arglist *args;
2227 gfc_saved_var *saved_vars;
2233 sym = expr->symtree->n.sym;
2234 args = expr->value.function.actual;
2235 gfc_init_se (&lse, NULL);
2236 gfc_init_se (&rse, NULL);
2239 for (fargs = sym->formal; fargs; fargs = fargs->next)
2241 saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
2242 temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
2244 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2246 /* Each dummy shall be specified, explicitly or implicitly, to be
2248 gcc_assert (fargs->sym->attr.dimension == 0);
2251 /* Create a temporary to hold the value. */
2252 type = gfc_typenode_for_spec (&fsym->ts);
2253 temp_vars[n] = gfc_create_var (type, fsym->name);
2255 if (fsym->ts.type == BT_CHARACTER)
2257 /* Copy string arguments. */
2260 gcc_assert (fsym->ts.cl && fsym->ts.cl->length
2261 && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
2263 arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
2264 tmp = gfc_build_addr_expr (build_pointer_type (type),
2267 gfc_conv_expr (&rse, args->expr);
2268 gfc_conv_string_parameter (&rse);
2269 gfc_add_block_to_block (&se->pre, &lse.pre);
2270 gfc_add_block_to_block (&se->pre, &rse.pre);
2272 gfc_trans_string_copy (&se->pre, arglen, tmp, rse.string_length,
2274 gfc_add_block_to_block (&se->pre, &lse.post);
2275 gfc_add_block_to_block (&se->pre, &rse.post);
2279 /* For everything else, just evaluate the expression. */
2280 gfc_conv_expr (&lse, args->expr);
2282 gfc_add_block_to_block (&se->pre, &lse.pre);
2283 gfc_add_modify_expr (&se->pre, temp_vars[n], lse.expr);
2284 gfc_add_block_to_block (&se->pre, &lse.post);
2290 /* Use the temporary variables in place of the real ones. */
2291 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2292 gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
2294 gfc_conv_expr (se, sym->value);
2296 if (sym->ts.type == BT_CHARACTER)
2298 gfc_conv_const_charlen (sym->ts.cl);
2300 /* Force the expression to the correct length. */
2301 if (!INTEGER_CST_P (se->string_length)
2302 || tree_int_cst_lt (se->string_length,
2303 sym->ts.cl->backend_decl))
2305 type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
2306 tmp = gfc_create_var (type, sym->name);
2307 tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
2308 gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
2309 se->string_length, se->expr);
2312 se->string_length = sym->ts.cl->backend_decl;
2315 /* Restore the original variables. */
2316 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2317 gfc_restore_sym (fargs->sym, &saved_vars[n]);
2318 gfc_free (saved_vars);
2322 /* Translate a function expression. */
2325 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
2329 if (expr->value.function.isym)
2331 gfc_conv_intrinsic_function (se, expr);
2335 /* We distinguish statement functions from general functions to improve
2336 runtime performance. */
2337 if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2339 gfc_conv_statement_function (se, expr);
2343 /* expr.value.function.esym is the resolved (specific) function symbol for
2344 most functions. However this isn't set for dummy procedures. */
2345 sym = expr->value.function.esym;
2347 sym = expr->symtree->n.sym;
2348 gfc_conv_function_call (se, sym, expr->value.function.actual);
2353 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
2355 gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
2356 gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
2358 gfc_conv_tmp_array_ref (se);
2359 gfc_advance_se_ss_chain (se);
2363 /* Build a static initializer. EXPR is the expression for the initial value.
2364 The other parameters describe the variable of the component being
2365 initialized. EXPR may be null. */
2368 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
2369 bool array, bool pointer)
2373 if (!(expr || pointer))
2378 /* Arrays need special handling. */
2380 return gfc_build_null_descriptor (type);
2382 return gfc_conv_array_initializer (type, expr);
2385 return fold_convert (type, null_pointer_node);
2391 gfc_init_se (&se, NULL);
2392 gfc_conv_structure (&se, expr, 1);
2396 return gfc_conv_string_init (ts->cl->backend_decl,expr);
2399 gfc_init_se (&se, NULL);
2400 gfc_conv_constant (&se, expr);
2407 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2419 gfc_start_block (&block);
2421 /* Initialize the scalarizer. */
2422 gfc_init_loopinfo (&loop);
2424 gfc_init_se (&lse, NULL);
2425 gfc_init_se (&rse, NULL);
2428 rss = gfc_walk_expr (expr);
2429 if (rss == gfc_ss_terminator)
2431 /* The rhs is scalar. Add a ss for the expression. */
2432 rss = gfc_get_ss ();
2433 rss->next = gfc_ss_terminator;
2434 rss->type = GFC_SS_SCALAR;
2438 /* Create a SS for the destination. */
2439 lss = gfc_get_ss ();
2440 lss->type = GFC_SS_COMPONENT;
2442 lss->shape = gfc_get_shape (cm->as->rank);
2443 lss->next = gfc_ss_terminator;
2444 lss->data.info.dimen = cm->as->rank;
2445 lss->data.info.descriptor = dest;
2446 lss->data.info.data = gfc_conv_array_data (dest);
2447 lss->data.info.offset = gfc_conv_array_offset (dest);
2448 for (n = 0; n < cm->as->rank; n++)
2450 lss->data.info.dim[n] = n;
2451 lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
2452 lss->data.info.stride[n] = gfc_index_one_node;
2454 mpz_init (lss->shape[n]);
2455 mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
2456 cm->as->lower[n]->value.integer);
2457 mpz_add_ui (lss->shape[n], lss->shape[n], 1);
2460 /* Associate the SS with the loop. */
2461 gfc_add_ss_to_loop (&loop, lss);
2462 gfc_add_ss_to_loop (&loop, rss);
2464 /* Calculate the bounds of the scalarization. */
2465 gfc_conv_ss_startstride (&loop);
2467 /* Setup the scalarizing loops. */
2468 gfc_conv_loop_setup (&loop);
2470 /* Setup the gfc_se structures. */
2471 gfc_copy_loopinfo_to_se (&lse, &loop);
2472 gfc_copy_loopinfo_to_se (&rse, &loop);
2475 gfc_mark_ss_chain_used (rss, 1);
2477 gfc_mark_ss_chain_used (lss, 1);
2479 /* Start the scalarized loop body. */
2480 gfc_start_scalarized_body (&loop, &body);
2482 gfc_conv_tmp_array_ref (&lse);
2483 if (cm->ts.type == BT_CHARACTER)
2484 lse.string_length = cm->ts.cl->backend_decl;
2486 gfc_conv_expr (&rse, expr);
2488 tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts.type);
2489 gfc_add_expr_to_block (&body, tmp);
2491 gcc_assert (rse.ss == gfc_ss_terminator);
2493 /* Generate the copying loops. */
2494 gfc_trans_scalarizing_loops (&loop, &body);
2496 /* Wrap the whole thing up. */
2497 gfc_add_block_to_block (&block, &loop.pre);
2498 gfc_add_block_to_block (&block, &loop.post);
2500 for (n = 0; n < cm->as->rank; n++)
2501 mpz_clear (lss->shape[n]);
2502 gfc_free (lss->shape);
2504 gfc_cleanup_loop (&loop);
2506 return gfc_finish_block (&block);
2509 /* Assign a single component of a derived type constructor. */
2512 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2519 gfc_start_block (&block);
2522 gfc_init_se (&se, NULL);
2523 /* Pointer component. */
2526 /* Array pointer. */
2527 if (expr->expr_type == EXPR_NULL)
2528 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2531 rss = gfc_walk_expr (expr);
2532 se.direct_byref = 1;
2534 gfc_conv_expr_descriptor (&se, expr, rss);
2535 gfc_add_block_to_block (&block, &se.pre);
2536 gfc_add_block_to_block (&block, &se.post);
2541 /* Scalar pointers. */
2542 se.want_pointer = 1;
2543 gfc_conv_expr (&se, expr);
2544 gfc_add_block_to_block (&block, &se.pre);
2545 gfc_add_modify_expr (&block, dest,
2546 fold_convert (TREE_TYPE (dest), se.expr));
2547 gfc_add_block_to_block (&block, &se.post);
2550 else if (cm->dimension)
2552 tmp = gfc_trans_subarray_assign (dest, cm, expr);
2553 gfc_add_expr_to_block (&block, tmp);
2555 else if (expr->ts.type == BT_DERIVED)
2557 /* Nested derived type. */
2558 tmp = gfc_trans_structure_assign (dest, expr);
2559 gfc_add_expr_to_block (&block, tmp);
2563 /* Scalar component. */
2566 gfc_init_se (&se, NULL);
2567 gfc_init_se (&lse, NULL);
2569 gfc_conv_expr (&se, expr);
2570 if (cm->ts.type == BT_CHARACTER)
2571 lse.string_length = cm->ts.cl->backend_decl;
2573 tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts.type);
2574 gfc_add_expr_to_block (&block, tmp);
2576 return gfc_finish_block (&block);
2579 /* Assign a derived type constructor to a variable. */
2582 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
2590 gfc_start_block (&block);
2591 cm = expr->ts.derived->components;
2592 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2594 /* Skip absent members in default initializers. */
2598 field = cm->backend_decl;
2599 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), dest, field, NULL_TREE);
2600 tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
2601 gfc_add_expr_to_block (&block, tmp);
2603 return gfc_finish_block (&block);
2606 /* Build an expression for a constructor. If init is nonzero then
2607 this is part of a static variable initializer. */
2610 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
2617 VEC(constructor_elt,gc) *v = NULL;
2619 gcc_assert (se->ss == NULL);
2620 gcc_assert (expr->expr_type == EXPR_STRUCTURE);
2621 type = gfc_typenode_for_spec (&expr->ts);
2625 /* Create a temporary variable and fill it in. */
2626 se->expr = gfc_create_var (type, expr->ts.derived->name);
2627 tmp = gfc_trans_structure_assign (se->expr, expr);
2628 gfc_add_expr_to_block (&se->pre, tmp);
2632 cm = expr->ts.derived->components;
2633 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2635 /* Skip absent members in default initializers. */
2639 val = gfc_conv_initializer (c->expr, &cm->ts,
2640 TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer);
2642 /* Append it to the constructor list. */
2643 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
2645 se->expr = build_constructor (type, v);
2649 /* Translate a substring expression. */
2652 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
2658 gcc_assert (ref->type == REF_SUBSTRING);
2660 se->expr = gfc_build_string_const(expr->value.character.length,
2661 expr->value.character.string);
2662 se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
2663 TYPE_STRING_FLAG (TREE_TYPE (se->expr))=1;
2665 gfc_conv_substring(se,ref,expr->ts.kind);
2669 /* Entry point for expression translation. Evaluates a scalar quantity.
2670 EXPR is the expression to be translated, and SE is the state structure if
2671 called from within the scalarized. */
2674 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
2676 if (se->ss && se->ss->expr == expr
2677 && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
2679 /* Substitute a scalar expression evaluated outside the scalarization
2681 se->expr = se->ss->data.scalar.expr;
2682 se->string_length = se->ss->string_length;
2683 gfc_advance_se_ss_chain (se);
2687 switch (expr->expr_type)
2690 gfc_conv_expr_op (se, expr);
2694 gfc_conv_function_expr (se, expr);
2698 gfc_conv_constant (se, expr);
2702 gfc_conv_variable (se, expr);
2706 se->expr = null_pointer_node;
2709 case EXPR_SUBSTRING:
2710 gfc_conv_substring_expr (se, expr);
2713 case EXPR_STRUCTURE:
2714 gfc_conv_structure (se, expr, 0);
2718 gfc_conv_array_constructor_expr (se, expr);
2727 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
2728 of an assignment. */
2730 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
2732 gfc_conv_expr (se, expr);
2733 /* All numeric lvalues should have empty post chains. If not we need to
2734 figure out a way of rewriting an lvalue so that it has no post chain. */
2735 gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
2738 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
2739 numeric expressions. Used for scalar values where inserting cleanup code
2742 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
2746 gcc_assert (expr->ts.type != BT_CHARACTER);
2747 gfc_conv_expr (se, expr);
2750 val = gfc_create_var (TREE_TYPE (se->expr), NULL);
2751 gfc_add_modify_expr (&se->pre, val, se->expr);
2753 gfc_add_block_to_block (&se->pre, &se->post);
2757 /* Helper to translate and expression and convert it to a particular type. */
2759 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
2761 gfc_conv_expr_val (se, expr);
2762 se->expr = convert (type, se->expr);
2766 /* Converts an expression so that it can be passed by reference. Scalar
2770 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
2774 if (se->ss && se->ss->expr == expr
2775 && se->ss->type == GFC_SS_REFERENCE)
2777 se->expr = se->ss->data.scalar.expr;
2778 se->string_length = se->ss->string_length;
2779 gfc_advance_se_ss_chain (se);
2783 if (expr->ts.type == BT_CHARACTER)
2785 gfc_conv_expr (se, expr);
2786 gfc_conv_string_parameter (se);
2790 if (expr->expr_type == EXPR_VARIABLE)
2792 se->want_pointer = 1;
2793 gfc_conv_expr (se, expr);
2796 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
2797 gfc_add_modify_expr (&se->pre, var, se->expr);
2798 gfc_add_block_to_block (&se->pre, &se->post);
2804 gfc_conv_expr (se, expr);
2806 /* Create a temporary var to hold the value. */
2807 if (TREE_CONSTANT (se->expr))
2809 var = build_decl (CONST_DECL, NULL, TREE_TYPE (se->expr));
2810 DECL_INITIAL (var) = se->expr;
2815 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
2816 gfc_add_modify_expr (&se->pre, var, se->expr);
2818 gfc_add_block_to_block (&se->pre, &se->post);
2820 /* Take the address of that value. */
2821 se->expr = build_fold_addr_expr (var);
2826 gfc_trans_pointer_assign (gfc_code * code)
2828 return gfc_trans_pointer_assignment (code->expr, code->expr2);
2832 /* Generate code for a pointer assignment. */
2835 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
2845 gfc_start_block (&block);
2847 gfc_init_se (&lse, NULL);
2849 lss = gfc_walk_expr (expr1);
2850 rss = gfc_walk_expr (expr2);
2851 if (lss == gfc_ss_terminator)
2853 /* Scalar pointers. */
2854 lse.want_pointer = 1;
2855 gfc_conv_expr (&lse, expr1);
2856 gcc_assert (rss == gfc_ss_terminator);
2857 gfc_init_se (&rse, NULL);
2858 rse.want_pointer = 1;
2859 gfc_conv_expr (&rse, expr2);
2860 gfc_add_block_to_block (&block, &lse.pre);
2861 gfc_add_block_to_block (&block, &rse.pre);
2862 gfc_add_modify_expr (&block, lse.expr,
2863 fold_convert (TREE_TYPE (lse.expr), rse.expr));
2864 gfc_add_block_to_block (&block, &rse.post);
2865 gfc_add_block_to_block (&block, &lse.post);
2869 /* Array pointer. */
2870 gfc_conv_expr_descriptor (&lse, expr1, lss);
2871 switch (expr2->expr_type)
2874 /* Just set the data pointer to null. */
2875 gfc_conv_descriptor_data_set (&block, lse.expr, null_pointer_node);
2879 /* Assign directly to the pointer's descriptor. */
2880 lse.direct_byref = 1;
2881 gfc_conv_expr_descriptor (&lse, expr2, rss);
2885 /* Assign to a temporary descriptor and then copy that
2886 temporary to the pointer. */
2888 tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
2891 lse.direct_byref = 1;
2892 gfc_conv_expr_descriptor (&lse, expr2, rss);
2893 gfc_add_modify_expr (&lse.pre, desc, tmp);
2896 gfc_add_block_to_block (&block, &lse.pre);
2897 gfc_add_block_to_block (&block, &lse.post);
2899 return gfc_finish_block (&block);
2903 /* Makes sure se is suitable for passing as a function string parameter. */
2904 /* TODO: Need to check all callers fo this function. It may be abused. */
2907 gfc_conv_string_parameter (gfc_se * se)
2911 if (TREE_CODE (se->expr) == STRING_CST)
2913 se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
2917 type = TREE_TYPE (se->expr);
2918 if (TYPE_STRING_FLAG (type))
2920 gcc_assert (TREE_CODE (se->expr) != INDIRECT_REF);
2921 se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
2924 gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
2925 gcc_assert (se->string_length
2926 && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
2930 /* Generate code for assignment of scalar variables. Includes character
2934 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, bt type)
2938 gfc_init_block (&block);
2940 if (type == BT_CHARACTER)
2942 gcc_assert (lse->string_length != NULL_TREE
2943 && rse->string_length != NULL_TREE);
2945 gfc_conv_string_parameter (lse);
2946 gfc_conv_string_parameter (rse);
2948 gfc_add_block_to_block (&block, &lse->pre);
2949 gfc_add_block_to_block (&block, &rse->pre);
2951 gfc_trans_string_copy (&block, lse->string_length, lse->expr,
2952 rse->string_length, rse->expr);
2956 gfc_add_block_to_block (&block, &lse->pre);
2957 gfc_add_block_to_block (&block, &rse->pre);
2959 gfc_add_modify_expr (&block, lse->expr,
2960 fold_convert (TREE_TYPE (lse->expr), rse->expr));
2963 gfc_add_block_to_block (&block, &lse->post);
2964 gfc_add_block_to_block (&block, &rse->post);
2966 return gfc_finish_block (&block);
2970 /* Try to translate array(:) = func (...), where func is a transformational
2971 array function, without using a temporary. Returns NULL is this isn't the
2975 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
2980 bool seen_array_ref;
2982 /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
2983 if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
2986 /* Elemental functions don't need a temporary anyway. */
2987 if (expr2->value.function.esym != NULL
2988 && expr2->value.function.esym->attr.elemental)
2991 /* Fail if EXPR1 can't be expressed as a descriptor. */
2992 if (gfc_ref_needs_temporary_p (expr1->ref))
2995 /* Functions returning pointers need temporaries. */
2996 if (expr2->symtree->n.sym->attr.pointer
2997 || expr2->symtree->n.sym->attr.allocatable)
3000 /* Check that no LHS component references appear during an array
3001 reference. This is needed because we do not have the means to
3002 span any arbitrary stride with an array descriptor. This check
3003 is not needed for the rhs because the function result has to be
3005 seen_array_ref = false;
3006 for (ref = expr1->ref; ref; ref = ref->next)
3008 if (ref->type == REF_ARRAY)
3009 seen_array_ref= true;
3010 else if (ref->type == REF_COMPONENT && seen_array_ref)
3014 /* Check for a dependency. */
3015 if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
3016 expr2->value.function.esym,
3017 expr2->value.function.actual))
3020 /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
3022 gcc_assert (expr2->value.function.isym
3023 || (gfc_return_by_reference (expr2->value.function.esym)
3024 && expr2->value.function.esym->result->attr.dimension));
3026 ss = gfc_walk_expr (expr1);
3027 gcc_assert (ss != gfc_ss_terminator);
3028 gfc_init_se (&se, NULL);
3029 gfc_start_block (&se.pre);
3030 se.want_pointer = 1;
3032 gfc_conv_array_parameter (&se, expr1, ss, 0);
3034 se.direct_byref = 1;
3035 se.ss = gfc_walk_expr (expr2);
3036 gcc_assert (se.ss != gfc_ss_terminator);
3037 gfc_conv_function_expr (&se, expr2);
3038 gfc_add_block_to_block (&se.pre, &se.post);
3040 return gfc_finish_block (&se.pre);
3044 /* Translate an assignment. Most of the code is concerned with
3045 setting up the scalarizer. */
3048 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2)
3053 gfc_ss *lss_section;
3060 /* Special case a single function returning an array. */
3061 if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
3063 tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
3068 /* Assignment of the form lhs = rhs. */
3069 gfc_start_block (&block);
3071 gfc_init_se (&lse, NULL);
3072 gfc_init_se (&rse, NULL);
3075 lss = gfc_walk_expr (expr1);
3077 if (lss != gfc_ss_terminator)
3079 /* The assignment needs scalarization. */
3082 /* Find a non-scalar SS from the lhs. */
3083 while (lss_section != gfc_ss_terminator
3084 && lss_section->type != GFC_SS_SECTION)
3085 lss_section = lss_section->next;
3087 gcc_assert (lss_section != gfc_ss_terminator);
3089 /* Initialize the scalarizer. */
3090 gfc_init_loopinfo (&loop);
3093 rss = gfc_walk_expr (expr2);
3094 if (rss == gfc_ss_terminator)
3096 /* The rhs is scalar. Add a ss for the expression. */
3097 rss = gfc_get_ss ();
3098 rss->next = gfc_ss_terminator;
3099 rss->type = GFC_SS_SCALAR;
3102 /* Associate the SS with the loop. */
3103 gfc_add_ss_to_loop (&loop, lss);
3104 gfc_add_ss_to_loop (&loop, rss);
3106 /* Calculate the bounds of the scalarization. */
3107 gfc_conv_ss_startstride (&loop);
3108 /* Resolve any data dependencies in the statement. */
3109 gfc_conv_resolve_dependencies (&loop, lss, rss);
3110 /* Setup the scalarizing loops. */
3111 gfc_conv_loop_setup (&loop);
3113 /* Setup the gfc_se structures. */
3114 gfc_copy_loopinfo_to_se (&lse, &loop);
3115 gfc_copy_loopinfo_to_se (&rse, &loop);
3118 gfc_mark_ss_chain_used (rss, 1);
3119 if (loop.temp_ss == NULL)
3122 gfc_mark_ss_chain_used (lss, 1);
3126 lse.ss = loop.temp_ss;
3127 gfc_mark_ss_chain_used (lss, 3);
3128 gfc_mark_ss_chain_used (loop.temp_ss, 3);
3131 /* Start the scalarized loop body. */
3132 gfc_start_scalarized_body (&loop, &body);
3135 gfc_init_block (&body);
3137 /* Translate the expression. */
3138 gfc_conv_expr (&rse, expr2);
3140 if (lss != gfc_ss_terminator && loop.temp_ss != NULL)
3142 gfc_conv_tmp_array_ref (&lse);
3143 gfc_advance_se_ss_chain (&lse);
3146 gfc_conv_expr (&lse, expr1);
3148 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts.type);
3149 gfc_add_expr_to_block (&body, tmp);
3151 if (lss == gfc_ss_terminator)
3153 /* Use the scalar assignment as is. */
3154 gfc_add_block_to_block (&block, &body);
3158 gcc_assert (lse.ss == gfc_ss_terminator
3159 && rse.ss == gfc_ss_terminator);
3161 if (loop.temp_ss != NULL)
3163 gfc_trans_scalarized_loop_boundary (&loop, &body);
3165 /* We need to copy the temporary to the actual lhs. */
3166 gfc_init_se (&lse, NULL);
3167 gfc_init_se (&rse, NULL);
3168 gfc_copy_loopinfo_to_se (&lse, &loop);
3169 gfc_copy_loopinfo_to_se (&rse, &loop);
3171 rse.ss = loop.temp_ss;
3174 gfc_conv_tmp_array_ref (&rse);
3175 gfc_advance_se_ss_chain (&rse);
3176 gfc_conv_expr (&lse, expr1);
3178 gcc_assert (lse.ss == gfc_ss_terminator
3179 && rse.ss == gfc_ss_terminator);
3181 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts.type);
3182 gfc_add_expr_to_block (&body, tmp);
3184 /* Generate the copying loops. */
3185 gfc_trans_scalarizing_loops (&loop, &body);
3187 /* Wrap the whole thing up. */
3188 gfc_add_block_to_block (&block, &loop.pre);
3189 gfc_add_block_to_block (&block, &loop.post);
3191 gfc_cleanup_loop (&loop);
3194 return gfc_finish_block (&block);
3198 gfc_trans_assign (gfc_code * code)
3200 return gfc_trans_assignment (code->expr, code->expr2);