Check in tree-dce enh to trunk
[official-gcc.git] / gcc / fortran / trans-expr.c
blob563e840c64ade71d9efb6cb8edb39a45a63bab3c
1 /* Expression translation
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
3 Foundation, Inc.
4 Contributed by Paul Brook <paul@nowt.org>
5 and Steven Bosscher <s.bosscher@student.tudelft.nl>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* trans-expr.c-- generate GENERIC trees for gfc_expr. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tree.h"
29 #include "convert.h"
30 #include "ggc.h"
31 #include "toplev.h"
32 #include "real.h"
33 #include "tree-gimple.h"
34 #include "langhooks.h"
35 #include "flags.h"
36 #include "gfortran.h"
37 #include "arith.h"
38 #include "trans.h"
39 #include "trans-const.h"
40 #include "trans-types.h"
41 #include "trans-array.h"
42 /* Only for gfc_trans_assign and gfc_trans_pointer_assign. */
43 #include "trans-stmt.h"
44 #include "dependency.h"
46 static tree gfc_trans_structure_assign (tree dest, gfc_expr * expr);
47 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
48 gfc_expr *);
50 /* Copy the scalarization loop variables. */
52 static void
53 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
55 dest->ss = src->ss;
56 dest->loop = src->loop;
60 /* Initialize a simple expression holder.
62 Care must be taken when multiple se are created with the same parent.
63 The child se must be kept in sync. The easiest way is to delay creation
64 of a child se until after after the previous se has been translated. */
66 void
67 gfc_init_se (gfc_se * se, gfc_se * parent)
69 memset (se, 0, sizeof (gfc_se));
70 gfc_init_block (&se->pre);
71 gfc_init_block (&se->post);
73 se->parent = parent;
75 if (parent)
76 gfc_copy_se_loopvars (se, parent);
80 /* Advances to the next SS in the chain. Use this rather than setting
81 se->ss = se->ss->next because all the parents needs to be kept in sync.
82 See gfc_init_se. */
84 void
85 gfc_advance_se_ss_chain (gfc_se * se)
87 gfc_se *p;
89 gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
91 p = se;
92 /* Walk down the parent chain. */
93 while (p != NULL)
95 /* Simple consistency check. */
96 gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
98 p->ss = p->ss->next;
100 p = p->parent;
105 /* Ensures the result of the expression as either a temporary variable
106 or a constant so that it can be used repeatedly. */
108 void
109 gfc_make_safe_expr (gfc_se * se)
111 tree var;
113 if (CONSTANT_CLASS_P (se->expr))
114 return;
116 /* We need a temporary for this result. */
117 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
118 gfc_add_modify_expr (&se->pre, var, se->expr);
119 se->expr = var;
123 /* Return an expression which determines if a dummy parameter is present.
124 Also used for arguments to procedures with multiple entry points. */
126 tree
127 gfc_conv_expr_present (gfc_symbol * sym)
129 tree decl;
131 gcc_assert (sym->attr.dummy);
133 decl = gfc_get_symbol_decl (sym);
134 if (TREE_CODE (decl) != PARM_DECL)
136 /* Array parameters use a temporary descriptor, we want the real
137 parameter. */
138 gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
139 || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
140 decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
142 return fold_build2 (NE_EXPR, boolean_type_node, decl,
143 fold_convert (TREE_TYPE (decl), null_pointer_node));
147 /* Converts a missing, dummy argument into a null or zero. */
149 void
150 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind)
152 tree present;
153 tree tmp;
155 present = gfc_conv_expr_present (arg->symtree->n.sym);
157 if (kind > 0)
159 /* Create a temporary and convert it to the correct type. */
160 tmp = gfc_get_int_type (kind);
161 tmp = fold_convert (tmp, build_fold_indirect_ref (se->expr));
163 /* Test for a NULL value. */
164 tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present, tmp, integer_one_node);
165 tmp = gfc_evaluate_now (tmp, &se->pre);
166 se->expr = build_fold_addr_expr (tmp);
168 else
170 tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
171 fold_convert (TREE_TYPE (se->expr), integer_zero_node));
172 tmp = gfc_evaluate_now (tmp, &se->pre);
173 se->expr = tmp;
176 if (ts.type == BT_CHARACTER)
178 tmp = build_int_cst (gfc_charlen_type_node, 0);
179 tmp = fold_build3 (COND_EXPR, gfc_charlen_type_node,
180 present, se->string_length, tmp);
181 tmp = gfc_evaluate_now (tmp, &se->pre);
182 se->string_length = tmp;
184 return;
188 /* Get the character length of an expression, looking through gfc_refs
189 if necessary. */
191 tree
192 gfc_get_expr_charlen (gfc_expr *e)
194 gfc_ref *r;
195 tree length;
197 gcc_assert (e->expr_type == EXPR_VARIABLE
198 && e->ts.type == BT_CHARACTER);
200 length = NULL; /* To silence compiler warning. */
202 if (is_subref_array (e) && e->ts.cl->length)
204 gfc_se tmpse;
205 gfc_init_se (&tmpse, NULL);
206 gfc_conv_expr_type (&tmpse, e->ts.cl->length, gfc_charlen_type_node);
207 e->ts.cl->backend_decl = tmpse.expr;
208 return tmpse.expr;
211 /* First candidate: if the variable is of type CHARACTER, the
212 expression's length could be the length of the character
213 variable. */
214 if (e->symtree->n.sym->ts.type == BT_CHARACTER)
215 length = e->symtree->n.sym->ts.cl->backend_decl;
217 /* Look through the reference chain for component references. */
218 for (r = e->ref; r; r = r->next)
220 switch (r->type)
222 case REF_COMPONENT:
223 if (r->u.c.component->ts.type == BT_CHARACTER)
224 length = r->u.c.component->ts.cl->backend_decl;
225 break;
227 case REF_ARRAY:
228 /* Do nothing. */
229 break;
231 default:
232 /* We should never got substring references here. These will be
233 broken down by the scalarizer. */
234 gcc_unreachable ();
235 break;
239 gcc_assert (length != NULL);
240 return length;
245 /* Generate code to initialize a string length variable. Returns the
246 value. */
248 void
249 gfc_conv_string_length (gfc_charlen * cl, stmtblock_t * pblock)
251 gfc_se se;
253 gfc_init_se (&se, NULL);
254 gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
255 se.expr = fold_build2 (MAX_EXPR, gfc_charlen_type_node, se.expr,
256 build_int_cst (gfc_charlen_type_node, 0));
257 gfc_add_block_to_block (pblock, &se.pre);
259 if (cl->backend_decl)
260 gfc_add_modify_expr (pblock, cl->backend_decl, se.expr);
261 else
262 cl->backend_decl = gfc_evaluate_now (se.expr, pblock);
266 static void
267 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
268 const char *name, locus *where)
270 tree tmp;
271 tree type;
272 tree var;
273 tree fault;
274 gfc_se start;
275 gfc_se end;
276 char *msg;
278 type = gfc_get_character_type (kind, ref->u.ss.length);
279 type = build_pointer_type (type);
281 var = NULL_TREE;
282 gfc_init_se (&start, se);
283 gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
284 gfc_add_block_to_block (&se->pre, &start.pre);
286 if (integer_onep (start.expr))
287 gfc_conv_string_parameter (se);
288 else
290 /* Avoid multiple evaluation of substring start. */
291 if (!CONSTANT_CLASS_P (start.expr) && !DECL_P (start.expr))
292 start.expr = gfc_evaluate_now (start.expr, &se->pre);
294 /* Change the start of the string. */
295 if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
296 tmp = se->expr;
297 else
298 tmp = build_fold_indirect_ref (se->expr);
299 tmp = gfc_build_array_ref (tmp, start.expr, NULL);
300 se->expr = gfc_build_addr_expr (type, tmp);
303 /* Length = end + 1 - start. */
304 gfc_init_se (&end, se);
305 if (ref->u.ss.end == NULL)
306 end.expr = se->string_length;
307 else
309 gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
310 gfc_add_block_to_block (&se->pre, &end.pre);
312 if (!CONSTANT_CLASS_P (end.expr) && !DECL_P (end.expr))
313 end.expr = gfc_evaluate_now (end.expr, &se->pre);
315 if (flag_bounds_check)
317 tree nonempty = fold_build2 (LE_EXPR, boolean_type_node,
318 start.expr, end.expr);
320 /* Check lower bound. */
321 fault = fold_build2 (LT_EXPR, boolean_type_node, start.expr,
322 build_int_cst (gfc_charlen_type_node, 1));
323 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
324 nonempty, fault);
325 if (name)
326 asprintf (&msg, "Substring out of bounds: lower bound (%%ld) of '%s' "
327 "is less than one", name);
328 else
329 asprintf (&msg, "Substring out of bounds: lower bound (%%ld)"
330 "is less than one");
331 gfc_trans_runtime_check (fault, &se->pre, where, msg,
332 fold_convert (long_integer_type_node,
333 start.expr));
334 gfc_free (msg);
336 /* Check upper bound. */
337 fault = fold_build2 (GT_EXPR, boolean_type_node, end.expr,
338 se->string_length);
339 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
340 nonempty, fault);
341 if (name)
342 asprintf (&msg, "Substring out of bounds: upper bound (%%ld) of '%s' "
343 "exceeds string length (%%ld)", name);
344 else
345 asprintf (&msg, "Substring out of bounds: upper bound (%%ld) "
346 "exceeds string length (%%ld)");
347 gfc_trans_runtime_check (fault, &se->pre, where, msg,
348 fold_convert (long_integer_type_node, end.expr),
349 fold_convert (long_integer_type_node,
350 se->string_length));
351 gfc_free (msg);
354 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node,
355 build_int_cst (gfc_charlen_type_node, 1),
356 start.expr);
357 tmp = fold_build2 (PLUS_EXPR, gfc_charlen_type_node, end.expr, tmp);
358 tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
359 build_int_cst (gfc_charlen_type_node, 0));
360 se->string_length = tmp;
364 /* Convert a derived type component reference. */
366 static void
367 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
369 gfc_component *c;
370 tree tmp;
371 tree decl;
372 tree field;
374 c = ref->u.c.component;
376 gcc_assert (c->backend_decl);
378 field = c->backend_decl;
379 gcc_assert (TREE_CODE (field) == FIELD_DECL);
380 decl = se->expr;
381 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field), decl, field, NULL_TREE);
383 se->expr = tmp;
385 if (c->ts.type == BT_CHARACTER)
387 tmp = c->ts.cl->backend_decl;
388 /* Components must always be constant length. */
389 gcc_assert (tmp && INTEGER_CST_P (tmp));
390 se->string_length = tmp;
393 if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER)
394 se->expr = build_fold_indirect_ref (se->expr);
398 /* Return the contents of a variable. Also handles reference/pointer
399 variables (all Fortran pointer references are implicit). */
401 static void
402 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
404 gfc_ref *ref;
405 gfc_symbol *sym;
406 tree parent_decl;
407 int parent_flag;
408 bool return_value;
409 bool alternate_entry;
410 bool entry_master;
412 sym = expr->symtree->n.sym;
413 if (se->ss != NULL)
415 /* Check that something hasn't gone horribly wrong. */
416 gcc_assert (se->ss != gfc_ss_terminator);
417 gcc_assert (se->ss->expr == expr);
419 /* A scalarized term. We already know the descriptor. */
420 se->expr = se->ss->data.info.descriptor;
421 se->string_length = se->ss->string_length;
422 for (ref = se->ss->data.info.ref; ref; ref = ref->next)
423 if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
424 break;
426 else
428 tree se_expr = NULL_TREE;
430 se->expr = gfc_get_symbol_decl (sym);
432 /* Deal with references to a parent results or entries by storing
433 the current_function_decl and moving to the parent_decl. */
434 return_value = sym->attr.function && sym->result == sym;
435 alternate_entry = sym->attr.function && sym->attr.entry
436 && sym->result == sym;
437 entry_master = sym->attr.result
438 && sym->ns->proc_name->attr.entry_master
439 && !gfc_return_by_reference (sym->ns->proc_name);
440 parent_decl = DECL_CONTEXT (current_function_decl);
442 if ((se->expr == parent_decl && return_value)
443 || (sym->ns && sym->ns->proc_name
444 && parent_decl
445 && sym->ns->proc_name->backend_decl == parent_decl
446 && (alternate_entry || entry_master)))
447 parent_flag = 1;
448 else
449 parent_flag = 0;
451 /* Special case for assigning the return value of a function.
452 Self recursive functions must have an explicit return value. */
453 if (return_value && (se->expr == current_function_decl || parent_flag))
454 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
456 /* Similarly for alternate entry points. */
457 else if (alternate_entry
458 && (sym->ns->proc_name->backend_decl == current_function_decl
459 || parent_flag))
461 gfc_entry_list *el = NULL;
463 for (el = sym->ns->entries; el; el = el->next)
464 if (sym == el->sym)
466 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
467 break;
471 else if (entry_master
472 && (sym->ns->proc_name->backend_decl == current_function_decl
473 || parent_flag))
474 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
476 if (se_expr)
477 se->expr = se_expr;
479 /* Procedure actual arguments. */
480 else if (sym->attr.flavor == FL_PROCEDURE
481 && se->expr != current_function_decl)
483 gcc_assert (se->want_pointer);
484 if (!sym->attr.dummy)
486 gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
487 se->expr = build_fold_addr_expr (se->expr);
489 return;
493 /* Dereference the expression, where needed. Since characters
494 are entirely different from other types, they are treated
495 separately. */
496 if (sym->ts.type == BT_CHARACTER)
498 /* Dereference character pointer dummy arguments
499 or results. */
500 if ((sym->attr.pointer || sym->attr.allocatable)
501 && (sym->attr.dummy
502 || sym->attr.function
503 || sym->attr.result))
504 se->expr = build_fold_indirect_ref (se->expr);
507 else if (!sym->attr.value)
509 /* Dereference non-character scalar dummy arguments. */
510 if (sym->attr.dummy && !sym->attr.dimension)
511 se->expr = build_fold_indirect_ref (se->expr);
513 /* Dereference scalar hidden result. */
514 if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
515 && (sym->attr.function || sym->attr.result)
516 && !sym->attr.dimension && !sym->attr.pointer
517 && !sym->attr.always_explicit)
518 se->expr = build_fold_indirect_ref (se->expr);
520 /* Dereference non-character pointer variables.
521 These must be dummies, results, or scalars. */
522 if ((sym->attr.pointer || sym->attr.allocatable)
523 && (sym->attr.dummy
524 || sym->attr.function
525 || sym->attr.result
526 || !sym->attr.dimension))
527 se->expr = build_fold_indirect_ref (se->expr);
530 ref = expr->ref;
533 /* For character variables, also get the length. */
534 if (sym->ts.type == BT_CHARACTER)
536 /* If the character length of an entry isn't set, get the length from
537 the master function instead. */
538 if (sym->attr.entry && !sym->ts.cl->backend_decl)
539 se->string_length = sym->ns->proc_name->ts.cl->backend_decl;
540 else
541 se->string_length = sym->ts.cl->backend_decl;
542 gcc_assert (se->string_length);
545 while (ref)
547 switch (ref->type)
549 case REF_ARRAY:
550 /* Return the descriptor if that's what we want and this is an array
551 section reference. */
552 if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
553 return;
554 /* TODO: Pointers to single elements of array sections, eg elemental subs. */
555 /* Return the descriptor for array pointers and allocations. */
556 if (se->want_pointer
557 && ref->next == NULL && (se->descriptor_only))
558 return;
560 gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
561 /* Return a pointer to an element. */
562 break;
564 case REF_COMPONENT:
565 gfc_conv_component_ref (se, ref);
566 break;
568 case REF_SUBSTRING:
569 gfc_conv_substring (se, ref, expr->ts.kind,
570 expr->symtree->name, &expr->where);
571 break;
573 default:
574 gcc_unreachable ();
575 break;
577 ref = ref->next;
579 /* Pointer assignment, allocation or pass by reference. Arrays are handled
580 separately. */
581 if (se->want_pointer)
583 if (expr->ts.type == BT_CHARACTER)
584 gfc_conv_string_parameter (se);
585 else
586 se->expr = build_fold_addr_expr (se->expr);
591 /* Unary ops are easy... Or they would be if ! was a valid op. */
593 static void
594 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
596 gfc_se operand;
597 tree type;
599 gcc_assert (expr->ts.type != BT_CHARACTER);
600 /* Initialize the operand. */
601 gfc_init_se (&operand, se);
602 gfc_conv_expr_val (&operand, expr->value.op.op1);
603 gfc_add_block_to_block (&se->pre, &operand.pre);
605 type = gfc_typenode_for_spec (&expr->ts);
607 /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
608 We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
609 All other unary operators have an equivalent GIMPLE unary operator. */
610 if (code == TRUTH_NOT_EXPR)
611 se->expr = fold_build2 (EQ_EXPR, type, operand.expr,
612 build_int_cst (type, 0));
613 else
614 se->expr = fold_build1 (code, type, operand.expr);
618 /* Expand power operator to optimal multiplications when a value is raised
619 to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
620 Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
621 Programming", 3rd Edition, 1998. */
623 /* This code is mostly duplicated from expand_powi in the backend.
624 We establish the "optimal power tree" lookup table with the defined size.
625 The items in the table are the exponents used to calculate the index
626 exponents. Any integer n less than the value can get an "addition chain",
627 with the first node being one. */
628 #define POWI_TABLE_SIZE 256
630 /* The table is from builtins.c. */
631 static const unsigned char powi_table[POWI_TABLE_SIZE] =
633 0, 1, 1, 2, 2, 3, 3, 4, /* 0 - 7 */
634 4, 6, 5, 6, 6, 10, 7, 9, /* 8 - 15 */
635 8, 16, 9, 16, 10, 12, 11, 13, /* 16 - 23 */
636 12, 17, 13, 18, 14, 24, 15, 26, /* 24 - 31 */
637 16, 17, 17, 19, 18, 33, 19, 26, /* 32 - 39 */
638 20, 25, 21, 40, 22, 27, 23, 44, /* 40 - 47 */
639 24, 32, 25, 34, 26, 29, 27, 44, /* 48 - 55 */
640 28, 31, 29, 34, 30, 60, 31, 36, /* 56 - 63 */
641 32, 64, 33, 34, 34, 46, 35, 37, /* 64 - 71 */
642 36, 65, 37, 50, 38, 48, 39, 69, /* 72 - 79 */
643 40, 49, 41, 43, 42, 51, 43, 58, /* 80 - 87 */
644 44, 64, 45, 47, 46, 59, 47, 76, /* 88 - 95 */
645 48, 65, 49, 66, 50, 67, 51, 66, /* 96 - 103 */
646 52, 70, 53, 74, 54, 104, 55, 74, /* 104 - 111 */
647 56, 64, 57, 69, 58, 78, 59, 68, /* 112 - 119 */
648 60, 61, 61, 80, 62, 75, 63, 68, /* 120 - 127 */
649 64, 65, 65, 128, 66, 129, 67, 90, /* 128 - 135 */
650 68, 73, 69, 131, 70, 94, 71, 88, /* 136 - 143 */
651 72, 128, 73, 98, 74, 132, 75, 121, /* 144 - 151 */
652 76, 102, 77, 124, 78, 132, 79, 106, /* 152 - 159 */
653 80, 97, 81, 160, 82, 99, 83, 134, /* 160 - 167 */
654 84, 86, 85, 95, 86, 160, 87, 100, /* 168 - 175 */
655 88, 113, 89, 98, 90, 107, 91, 122, /* 176 - 183 */
656 92, 111, 93, 102, 94, 126, 95, 150, /* 184 - 191 */
657 96, 128, 97, 130, 98, 133, 99, 195, /* 192 - 199 */
658 100, 128, 101, 123, 102, 164, 103, 138, /* 200 - 207 */
659 104, 145, 105, 146, 106, 109, 107, 149, /* 208 - 215 */
660 108, 200, 109, 146, 110, 170, 111, 157, /* 216 - 223 */
661 112, 128, 113, 130, 114, 182, 115, 132, /* 224 - 231 */
662 116, 200, 117, 132, 118, 158, 119, 206, /* 232 - 239 */
663 120, 240, 121, 162, 122, 147, 123, 152, /* 240 - 247 */
664 124, 166, 125, 214, 126, 138, 127, 153, /* 248 - 255 */
667 /* If n is larger than lookup table's max index, we use the "window
668 method". */
669 #define POWI_WINDOW_SIZE 3
671 /* Recursive function to expand the power operator. The temporary
672 values are put in tmpvar. The function returns tmpvar[1] ** n. */
673 static tree
674 gfc_conv_powi (gfc_se * se, unsigned HOST_WIDE_INT n, tree * tmpvar)
676 tree op0;
677 tree op1;
678 tree tmp;
679 int digit;
681 if (n < POWI_TABLE_SIZE)
683 if (tmpvar[n])
684 return tmpvar[n];
686 op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
687 op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
689 else if (n & 1)
691 digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
692 op0 = gfc_conv_powi (se, n - digit, tmpvar);
693 op1 = gfc_conv_powi (se, digit, tmpvar);
695 else
697 op0 = gfc_conv_powi (se, n >> 1, tmpvar);
698 op1 = op0;
701 tmp = fold_build2 (MULT_EXPR, TREE_TYPE (op0), op0, op1);
702 tmp = gfc_evaluate_now (tmp, &se->pre);
704 if (n < POWI_TABLE_SIZE)
705 tmpvar[n] = tmp;
707 return tmp;
711 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
712 return 1. Else return 0 and a call to runtime library functions
713 will have to be built. */
714 static int
715 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
717 tree cond;
718 tree tmp;
719 tree type;
720 tree vartmp[POWI_TABLE_SIZE];
721 HOST_WIDE_INT m;
722 unsigned HOST_WIDE_INT n;
723 int sgn;
725 /* If exponent is too large, we won't expand it anyway, so don't bother
726 with large integer values. */
727 if (!double_int_fits_in_shwi_p (TREE_INT_CST (rhs)))
728 return 0;
730 m = double_int_to_shwi (TREE_INT_CST (rhs));
731 /* There's no ABS for HOST_WIDE_INT, so here we go. It also takes care
732 of the asymmetric range of the integer type. */
733 n = (unsigned HOST_WIDE_INT) (m < 0 ? -m : m);
735 type = TREE_TYPE (lhs);
736 sgn = tree_int_cst_sgn (rhs);
738 if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
739 || optimize_size) && (m > 2 || m < -1))
740 return 0;
742 /* rhs == 0 */
743 if (sgn == 0)
745 se->expr = gfc_build_const (type, integer_one_node);
746 return 1;
749 /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1. */
750 if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
752 tmp = fold_build2 (EQ_EXPR, boolean_type_node,
753 lhs, build_int_cst (TREE_TYPE (lhs), -1));
754 cond = fold_build2 (EQ_EXPR, boolean_type_node,
755 lhs, build_int_cst (TREE_TYPE (lhs), 1));
757 /* If rhs is even,
758 result = (lhs == 1 || lhs == -1) ? 1 : 0. */
759 if ((n & 1) == 0)
761 tmp = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, tmp, cond);
762 se->expr = fold_build3 (COND_EXPR, type,
763 tmp, build_int_cst (type, 1),
764 build_int_cst (type, 0));
765 return 1;
767 /* If rhs is odd,
768 result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0. */
769 tmp = fold_build3 (COND_EXPR, type, tmp, build_int_cst (type, -1),
770 build_int_cst (type, 0));
771 se->expr = fold_build3 (COND_EXPR, type,
772 cond, build_int_cst (type, 1), tmp);
773 return 1;
776 memset (vartmp, 0, sizeof (vartmp));
777 vartmp[1] = lhs;
778 if (sgn == -1)
780 tmp = gfc_build_const (type, integer_one_node);
781 vartmp[1] = fold_build2 (RDIV_EXPR, type, tmp, vartmp[1]);
784 se->expr = gfc_conv_powi (se, n, vartmp);
786 return 1;
790 /* Power op (**). Constant integer exponent has special handling. */
792 static void
793 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
795 tree gfc_int4_type_node;
796 int kind;
797 int ikind;
798 gfc_se lse;
799 gfc_se rse;
800 tree fndecl;
802 gfc_init_se (&lse, se);
803 gfc_conv_expr_val (&lse, expr->value.op.op1);
804 lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
805 gfc_add_block_to_block (&se->pre, &lse.pre);
807 gfc_init_se (&rse, se);
808 gfc_conv_expr_val (&rse, expr->value.op.op2);
809 gfc_add_block_to_block (&se->pre, &rse.pre);
811 if (expr->value.op.op2->ts.type == BT_INTEGER
812 && expr->value.op.op2->expr_type == EXPR_CONSTANT)
813 if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
814 return;
816 gfc_int4_type_node = gfc_get_int_type (4);
818 kind = expr->value.op.op1->ts.kind;
819 switch (expr->value.op.op2->ts.type)
821 case BT_INTEGER:
822 ikind = expr->value.op.op2->ts.kind;
823 switch (ikind)
825 case 1:
826 case 2:
827 rse.expr = convert (gfc_int4_type_node, rse.expr);
828 /* Fall through. */
830 case 4:
831 ikind = 0;
832 break;
834 case 8:
835 ikind = 1;
836 break;
838 case 16:
839 ikind = 2;
840 break;
842 default:
843 gcc_unreachable ();
845 switch (kind)
847 case 1:
848 case 2:
849 if (expr->value.op.op1->ts.type == BT_INTEGER)
850 lse.expr = convert (gfc_int4_type_node, lse.expr);
851 else
852 gcc_unreachable ();
853 /* Fall through. */
855 case 4:
856 kind = 0;
857 break;
859 case 8:
860 kind = 1;
861 break;
863 case 10:
864 kind = 2;
865 break;
867 case 16:
868 kind = 3;
869 break;
871 default:
872 gcc_unreachable ();
875 switch (expr->value.op.op1->ts.type)
877 case BT_INTEGER:
878 if (kind == 3) /* Case 16 was not handled properly above. */
879 kind = 2;
880 fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
881 break;
883 case BT_REAL:
884 /* Use builtins for real ** int4. */
885 if (ikind == 0)
887 switch (kind)
889 case 0:
890 fndecl = built_in_decls[BUILT_IN_POWIF];
891 break;
893 case 1:
894 fndecl = built_in_decls[BUILT_IN_POWI];
895 break;
897 case 2:
898 case 3:
899 fndecl = built_in_decls[BUILT_IN_POWIL];
900 break;
902 default:
903 gcc_unreachable ();
906 else
907 fndecl = gfor_fndecl_math_powi[kind][ikind].real;
908 break;
910 case BT_COMPLEX:
911 fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
912 break;
914 default:
915 gcc_unreachable ();
917 break;
919 case BT_REAL:
920 switch (kind)
922 case 4:
923 fndecl = built_in_decls[BUILT_IN_POWF];
924 break;
925 case 8:
926 fndecl = built_in_decls[BUILT_IN_POW];
927 break;
928 case 10:
929 case 16:
930 fndecl = built_in_decls[BUILT_IN_POWL];
931 break;
932 default:
933 gcc_unreachable ();
935 break;
937 case BT_COMPLEX:
938 switch (kind)
940 case 4:
941 fndecl = built_in_decls[BUILT_IN_CPOWF];
942 break;
943 case 8:
944 fndecl = built_in_decls[BUILT_IN_CPOW];
945 break;
946 case 10:
947 case 16:
948 fndecl = built_in_decls[BUILT_IN_CPOWL];
949 break;
950 default:
951 gcc_unreachable ();
953 break;
955 default:
956 gcc_unreachable ();
957 break;
960 se->expr = build_call_expr (fndecl, 2, lse.expr, rse.expr);
964 /* Generate code to allocate a string temporary. */
966 tree
967 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
969 tree var;
970 tree tmp;
972 gcc_assert (TREE_TYPE (len) == gfc_charlen_type_node);
974 if (gfc_can_put_var_on_stack (len))
976 /* Create a temporary variable to hold the result. */
977 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
978 build_int_cst (gfc_charlen_type_node, 1));
979 tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
980 tmp = build_array_type (gfc_character1_type_node, tmp);
981 var = gfc_create_var (tmp, "str");
982 var = gfc_build_addr_expr (type, var);
984 else
986 /* Allocate a temporary to hold the result. */
987 var = gfc_create_var (type, "pstr");
988 tmp = gfc_call_malloc (&se->pre, type, len);
989 gfc_add_modify_expr (&se->pre, var, tmp);
991 /* Free the temporary afterwards. */
992 tmp = gfc_call_free (convert (pvoid_type_node, var));
993 gfc_add_expr_to_block (&se->post, tmp);
996 return var;
1000 /* Handle a string concatenation operation. A temporary will be allocated to
1001 hold the result. */
1003 static void
1004 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
1006 gfc_se lse, rse;
1007 tree len, type, var, tmp, fndecl;
1009 gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
1010 && expr->value.op.op2->ts.type == BT_CHARACTER);
1012 gfc_init_se (&lse, se);
1013 gfc_conv_expr (&lse, expr->value.op.op1);
1014 gfc_conv_string_parameter (&lse);
1015 gfc_init_se (&rse, se);
1016 gfc_conv_expr (&rse, expr->value.op.op2);
1017 gfc_conv_string_parameter (&rse);
1019 gfc_add_block_to_block (&se->pre, &lse.pre);
1020 gfc_add_block_to_block (&se->pre, &rse.pre);
1022 type = gfc_get_character_type (expr->ts.kind, expr->ts.cl);
1023 len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1024 if (len == NULL_TREE)
1026 len = fold_build2 (PLUS_EXPR, TREE_TYPE (lse.string_length),
1027 lse.string_length, rse.string_length);
1030 type = build_pointer_type (type);
1032 var = gfc_conv_string_tmp (se, type, len);
1034 /* Do the actual concatenation. */
1035 if (expr->ts.kind == 1)
1036 fndecl = gfor_fndecl_concat_string;
1037 else if (expr->ts.kind == 4)
1038 fndecl = gfor_fndecl_concat_string_char4;
1039 else
1040 gcc_unreachable ();
1042 tmp = build_call_expr (fndecl, 6, len, var, lse.string_length, lse.expr,
1043 rse.string_length, rse.expr);
1044 gfc_add_expr_to_block (&se->pre, tmp);
1046 /* Add the cleanup for the operands. */
1047 gfc_add_block_to_block (&se->pre, &rse.post);
1048 gfc_add_block_to_block (&se->pre, &lse.post);
1050 se->expr = var;
1051 se->string_length = len;
1054 /* Translates an op expression. Common (binary) cases are handled by this
1055 function, others are passed on. Recursion is used in either case.
1056 We use the fact that (op1.ts == op2.ts) (except for the power
1057 operator **).
1058 Operators need no special handling for scalarized expressions as long as
1059 they call gfc_conv_simple_val to get their operands.
1060 Character strings get special handling. */
1062 static void
1063 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
1065 enum tree_code code;
1066 gfc_se lse;
1067 gfc_se rse;
1068 tree tmp, type;
1069 int lop;
1070 int checkstring;
1072 checkstring = 0;
1073 lop = 0;
1074 switch (expr->value.op.operator)
1076 case INTRINSIC_PARENTHESES:
1077 if (expr->ts.type == BT_REAL
1078 || expr->ts.type == BT_COMPLEX)
1080 gfc_conv_unary_op (PAREN_EXPR, se, expr);
1081 gcc_assert (FLOAT_TYPE_P (TREE_TYPE (se->expr)));
1082 return;
1085 /* Fallthrough. */
1086 case INTRINSIC_UPLUS:
1087 gfc_conv_expr (se, expr->value.op.op1);
1088 return;
1090 case INTRINSIC_UMINUS:
1091 gfc_conv_unary_op (NEGATE_EXPR, se, expr);
1092 return;
1094 case INTRINSIC_NOT:
1095 gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
1096 return;
1098 case INTRINSIC_PLUS:
1099 code = PLUS_EXPR;
1100 break;
1102 case INTRINSIC_MINUS:
1103 code = MINUS_EXPR;
1104 break;
1106 case INTRINSIC_TIMES:
1107 code = MULT_EXPR;
1108 break;
1110 case INTRINSIC_DIVIDE:
1111 /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
1112 an integer, we must round towards zero, so we use a
1113 TRUNC_DIV_EXPR. */
1114 if (expr->ts.type == BT_INTEGER)
1115 code = TRUNC_DIV_EXPR;
1116 else
1117 code = RDIV_EXPR;
1118 break;
1120 case INTRINSIC_POWER:
1121 gfc_conv_power_op (se, expr);
1122 return;
1124 case INTRINSIC_CONCAT:
1125 gfc_conv_concat_op (se, expr);
1126 return;
1128 case INTRINSIC_AND:
1129 code = TRUTH_ANDIF_EXPR;
1130 lop = 1;
1131 break;
1133 case INTRINSIC_OR:
1134 code = TRUTH_ORIF_EXPR;
1135 lop = 1;
1136 break;
1138 /* EQV and NEQV only work on logicals, but since we represent them
1139 as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE. */
1140 case INTRINSIC_EQ:
1141 case INTRINSIC_EQ_OS:
1142 case INTRINSIC_EQV:
1143 code = EQ_EXPR;
1144 checkstring = 1;
1145 lop = 1;
1146 break;
1148 case INTRINSIC_NE:
1149 case INTRINSIC_NE_OS:
1150 case INTRINSIC_NEQV:
1151 code = NE_EXPR;
1152 checkstring = 1;
1153 lop = 1;
1154 break;
1156 case INTRINSIC_GT:
1157 case INTRINSIC_GT_OS:
1158 code = GT_EXPR;
1159 checkstring = 1;
1160 lop = 1;
1161 break;
1163 case INTRINSIC_GE:
1164 case INTRINSIC_GE_OS:
1165 code = GE_EXPR;
1166 checkstring = 1;
1167 lop = 1;
1168 break;
1170 case INTRINSIC_LT:
1171 case INTRINSIC_LT_OS:
1172 code = LT_EXPR;
1173 checkstring = 1;
1174 lop = 1;
1175 break;
1177 case INTRINSIC_LE:
1178 case INTRINSIC_LE_OS:
1179 code = LE_EXPR;
1180 checkstring = 1;
1181 lop = 1;
1182 break;
1184 case INTRINSIC_USER:
1185 case INTRINSIC_ASSIGN:
1186 /* These should be converted into function calls by the frontend. */
1187 gcc_unreachable ();
1189 default:
1190 fatal_error ("Unknown intrinsic op");
1191 return;
1194 /* The only exception to this is **, which is handled separately anyway. */
1195 gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
1197 if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
1198 checkstring = 0;
1200 /* lhs */
1201 gfc_init_se (&lse, se);
1202 gfc_conv_expr (&lse, expr->value.op.op1);
1203 gfc_add_block_to_block (&se->pre, &lse.pre);
1205 /* rhs */
1206 gfc_init_se (&rse, se);
1207 gfc_conv_expr (&rse, expr->value.op.op2);
1208 gfc_add_block_to_block (&se->pre, &rse.pre);
1210 if (checkstring)
1212 gfc_conv_string_parameter (&lse);
1213 gfc_conv_string_parameter (&rse);
1215 lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
1216 rse.string_length, rse.expr,
1217 expr->value.op.op1->ts.kind);
1218 rse.expr = build_int_cst (TREE_TYPE (lse.expr), 0);
1219 gfc_add_block_to_block (&lse.post, &rse.post);
1222 type = gfc_typenode_for_spec (&expr->ts);
1224 if (lop)
1226 /* The result of logical ops is always boolean_type_node. */
1227 tmp = fold_build2 (code, boolean_type_node, lse.expr, rse.expr);
1228 se->expr = convert (type, tmp);
1230 else
1231 se->expr = fold_build2 (code, type, lse.expr, rse.expr);
1233 /* Add the post blocks. */
1234 gfc_add_block_to_block (&se->post, &rse.post);
1235 gfc_add_block_to_block (&se->post, &lse.post);
1238 /* If a string's length is one, we convert it to a single character. */
1240 static tree
1241 gfc_to_single_character (tree len, tree str)
1243 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str)));
1245 if (INTEGER_CST_P (len) && TREE_INT_CST_LOW (len) == 1
1246 && TREE_INT_CST_HIGH (len) == 0)
1248 str = fold_convert (pchar_type_node, str);
1249 return build_fold_indirect_ref (str);
1252 return NULL_TREE;
1256 void
1257 gfc_conv_scalar_char_value (gfc_symbol *sym, gfc_se *se, gfc_expr **expr)
1260 if (sym->backend_decl)
1262 /* This becomes the nominal_type in
1263 function.c:assign_parm_find_data_types. */
1264 TREE_TYPE (sym->backend_decl) = unsigned_char_type_node;
1265 /* This becomes the passed_type in
1266 function.c:assign_parm_find_data_types. C promotes char to
1267 integer for argument passing. */
1268 DECL_ARG_TYPE (sym->backend_decl) = unsigned_type_node;
1270 DECL_BY_REFERENCE (sym->backend_decl) = 0;
1273 if (expr != NULL)
1275 /* If we have a constant character expression, make it into an
1276 integer. */
1277 if ((*expr)->expr_type == EXPR_CONSTANT)
1279 gfc_typespec ts;
1280 gfc_clear_ts (&ts);
1282 *expr = gfc_int_expr ((int)(*expr)->value.character.string[0]);
1283 if ((*expr)->ts.kind != gfc_c_int_kind)
1285 /* The expr needs to be compatible with a C int. If the
1286 conversion fails, then the 2 causes an ICE. */
1287 ts.type = BT_INTEGER;
1288 ts.kind = gfc_c_int_kind;
1289 gfc_convert_type (*expr, &ts, 2);
1292 else if (se != NULL && (*expr)->expr_type == EXPR_VARIABLE)
1294 if ((*expr)->ref == NULL)
1296 se->expr = gfc_to_single_character
1297 (build_int_cst (integer_type_node, 1),
1298 gfc_build_addr_expr (pchar_type_node,
1299 gfc_get_symbol_decl
1300 ((*expr)->symtree->n.sym)));
1302 else
1304 gfc_conv_variable (se, *expr);
1305 se->expr = gfc_to_single_character
1306 (build_int_cst (integer_type_node, 1),
1307 gfc_build_addr_expr (pchar_type_node, se->expr));
1314 /* Compare two strings. If they are all single characters, the result is the
1315 subtraction of them. Otherwise, we build a library call. */
1317 tree
1318 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2, int kind)
1320 tree sc1;
1321 tree sc2;
1322 tree tmp;
1324 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
1325 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
1327 sc1 = gfc_to_single_character (len1, str1);
1328 sc2 = gfc_to_single_character (len2, str2);
1330 if (sc1 != NULL_TREE && sc2 != NULL_TREE)
1332 /* Deal with single character specially. */
1333 sc1 = fold_convert (integer_type_node, sc1);
1334 sc2 = fold_convert (integer_type_node, sc2);
1335 tmp = fold_build2 (MINUS_EXPR, integer_type_node, sc1, sc2);
1337 else
1339 /* Build a call for the comparison. */
1340 tree fndecl;
1342 if (kind == 1)
1343 fndecl = gfor_fndecl_compare_string;
1344 else if (kind == 4)
1345 fndecl = gfor_fndecl_compare_string_char4;
1346 else
1347 gcc_unreachable ();
1349 tmp = build_call_expr (fndecl, 4, len1, str1, len2, str2);
1352 return tmp;
1355 static void
1356 gfc_conv_function_val (gfc_se * se, gfc_symbol * sym)
1358 tree tmp;
1360 if (sym->attr.dummy)
1362 tmp = gfc_get_symbol_decl (sym);
1363 gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1364 && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
1366 else
1368 if (!sym->backend_decl)
1369 sym->backend_decl = gfc_get_extern_function_decl (sym);
1371 tmp = sym->backend_decl;
1372 if (sym->attr.cray_pointee)
1373 tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
1374 gfc_get_symbol_decl (sym->cp_pointer));
1375 if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1377 gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1378 tmp = build_fold_addr_expr (tmp);
1381 se->expr = tmp;
1385 /* Translate the call for an elemental subroutine call used in an operator
1386 assignment. This is a simplified version of gfc_conv_function_call. */
1388 tree
1389 gfc_conv_operator_assign (gfc_se *lse, gfc_se *rse, gfc_symbol *sym)
1391 tree args;
1392 tree tmp;
1393 gfc_se se;
1394 stmtblock_t block;
1396 /* Only elemental subroutines with two arguments. */
1397 gcc_assert (sym->attr.elemental && sym->attr.subroutine);
1398 gcc_assert (sym->formal->next->next == NULL);
1400 gfc_init_block (&block);
1402 gfc_add_block_to_block (&block, &lse->pre);
1403 gfc_add_block_to_block (&block, &rse->pre);
1405 /* Build the argument list for the call, including hidden string lengths. */
1406 args = gfc_chainon_list (NULL_TREE, build_fold_addr_expr (lse->expr));
1407 args = gfc_chainon_list (args, build_fold_addr_expr (rse->expr));
1408 if (lse->string_length != NULL_TREE)
1409 args = gfc_chainon_list (args, lse->string_length);
1410 if (rse->string_length != NULL_TREE)
1411 args = gfc_chainon_list (args, rse->string_length);
1413 /* Build the function call. */
1414 gfc_init_se (&se, NULL);
1415 gfc_conv_function_val (&se, sym);
1416 tmp = TREE_TYPE (TREE_TYPE (TREE_TYPE (se.expr)));
1417 tmp = build_call_list (tmp, se.expr, args);
1418 gfc_add_expr_to_block (&block, tmp);
1420 gfc_add_block_to_block (&block, &lse->post);
1421 gfc_add_block_to_block (&block, &rse->post);
1423 return gfc_finish_block (&block);
1427 /* Initialize MAPPING. */
1429 void
1430 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1432 mapping->syms = NULL;
1433 mapping->charlens = NULL;
1437 /* Free all memory held by MAPPING (but not MAPPING itself). */
1439 void
1440 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1442 gfc_interface_sym_mapping *sym;
1443 gfc_interface_sym_mapping *nextsym;
1444 gfc_charlen *cl;
1445 gfc_charlen *nextcl;
1447 for (sym = mapping->syms; sym; sym = nextsym)
1449 nextsym = sym->next;
1450 gfc_free_symbol (sym->new->n.sym);
1451 gfc_free_expr (sym->expr);
1452 gfc_free (sym->new);
1453 gfc_free (sym);
1455 for (cl = mapping->charlens; cl; cl = nextcl)
1457 nextcl = cl->next;
1458 gfc_free_expr (cl->length);
1459 gfc_free (cl);
1464 /* Return a copy of gfc_charlen CL. Add the returned structure to
1465 MAPPING so that it will be freed by gfc_free_interface_mapping. */
1467 static gfc_charlen *
1468 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1469 gfc_charlen * cl)
1471 gfc_charlen *new;
1473 new = gfc_get_charlen ();
1474 new->next = mapping->charlens;
1475 new->length = gfc_copy_expr (cl->length);
1477 mapping->charlens = new;
1478 return new;
1482 /* A subroutine of gfc_add_interface_mapping. Return a descriptorless
1483 array variable that can be used as the actual argument for dummy
1484 argument SYM. Add any initialization code to BLOCK. PACKED is as
1485 for gfc_get_nodesc_array_type and DATA points to the first element
1486 in the passed array. */
1488 static tree
1489 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1490 gfc_packed packed, tree data)
1492 tree type;
1493 tree var;
1495 type = gfc_typenode_for_spec (&sym->ts);
1496 type = gfc_get_nodesc_array_type (type, sym->as, packed);
1498 var = gfc_create_var (type, "ifm");
1499 gfc_add_modify_expr (block, var, fold_convert (type, data));
1501 return var;
1505 /* A subroutine of gfc_add_interface_mapping. Set the stride, upper bounds
1506 and offset of descriptorless array type TYPE given that it has the same
1507 size as DESC. Add any set-up code to BLOCK. */
1509 static void
1510 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1512 int n;
1513 tree dim;
1514 tree offset;
1515 tree tmp;
1517 offset = gfc_index_zero_node;
1518 for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1520 dim = gfc_rank_cst[n];
1521 GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1522 if (GFC_TYPE_ARRAY_LBOUND (type, n) == NULL_TREE)
1524 GFC_TYPE_ARRAY_LBOUND (type, n)
1525 = gfc_conv_descriptor_lbound (desc, dim);
1526 GFC_TYPE_ARRAY_UBOUND (type, n)
1527 = gfc_conv_descriptor_ubound (desc, dim);
1529 else if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1531 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1532 gfc_conv_descriptor_ubound (desc, dim),
1533 gfc_conv_descriptor_lbound (desc, dim));
1534 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1535 GFC_TYPE_ARRAY_LBOUND (type, n),
1536 tmp);
1537 tmp = gfc_evaluate_now (tmp, block);
1538 GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1540 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
1541 GFC_TYPE_ARRAY_LBOUND (type, n),
1542 GFC_TYPE_ARRAY_STRIDE (type, n));
1543 offset = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp);
1545 offset = gfc_evaluate_now (offset, block);
1546 GFC_TYPE_ARRAY_OFFSET (type) = offset;
1550 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1551 in SE. The caller may still use se->expr and se->string_length after
1552 calling this function. */
1554 void
1555 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1556 gfc_symbol * sym, gfc_se * se,
1557 gfc_expr *expr)
1559 gfc_interface_sym_mapping *sm;
1560 tree desc;
1561 tree tmp;
1562 tree value;
1563 gfc_symbol *new_sym;
1564 gfc_symtree *root;
1565 gfc_symtree *new_symtree;
1567 /* Create a new symbol to represent the actual argument. */
1568 new_sym = gfc_new_symbol (sym->name, NULL);
1569 new_sym->ts = sym->ts;
1570 new_sym->attr.referenced = 1;
1571 new_sym->attr.dimension = sym->attr.dimension;
1572 new_sym->attr.pointer = sym->attr.pointer;
1573 new_sym->attr.allocatable = sym->attr.allocatable;
1574 new_sym->attr.flavor = sym->attr.flavor;
1575 new_sym->attr.function = sym->attr.function;
1577 /* Create a fake symtree for it. */
1578 root = NULL;
1579 new_symtree = gfc_new_symtree (&root, sym->name);
1580 new_symtree->n.sym = new_sym;
1581 gcc_assert (new_symtree == root);
1583 /* Create a dummy->actual mapping. */
1584 sm = gfc_getmem (sizeof (*sm));
1585 sm->next = mapping->syms;
1586 sm->old = sym;
1587 sm->new = new_symtree;
1588 sm->expr = gfc_copy_expr (expr);
1589 mapping->syms = sm;
1591 /* Stabilize the argument's value. */
1592 if (!sym->attr.function && se)
1593 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1595 if (sym->ts.type == BT_CHARACTER)
1597 /* Create a copy of the dummy argument's length. */
1598 new_sym->ts.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.cl);
1599 sm->expr->ts.cl = new_sym->ts.cl;
1601 /* If the length is specified as "*", record the length that
1602 the caller is passing. We should use the callee's length
1603 in all other cases. */
1604 if (!new_sym->ts.cl->length && se)
1606 se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1607 new_sym->ts.cl->backend_decl = se->string_length;
1611 if (!se)
1612 return;
1614 /* Use the passed value as-is if the argument is a function. */
1615 if (sym->attr.flavor == FL_PROCEDURE)
1616 value = se->expr;
1618 /* If the argument is either a string or a pointer to a string,
1619 convert it to a boundless character type. */
1620 else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1622 tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1623 tmp = build_pointer_type (tmp);
1624 if (sym->attr.pointer)
1625 value = build_fold_indirect_ref (se->expr);
1626 else
1627 value = se->expr;
1628 value = fold_convert (tmp, value);
1631 /* If the argument is a scalar, a pointer to an array or an allocatable,
1632 dereference it. */
1633 else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1634 value = build_fold_indirect_ref (se->expr);
1636 /* For character(*), use the actual argument's descriptor. */
1637 else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.cl->length)
1638 value = build_fold_indirect_ref (se->expr);
1640 /* If the argument is an array descriptor, use it to determine
1641 information about the actual argument's shape. */
1642 else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1643 && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1645 /* Get the actual argument's descriptor. */
1646 desc = build_fold_indirect_ref (se->expr);
1648 /* Create the replacement variable. */
1649 tmp = gfc_conv_descriptor_data_get (desc);
1650 value = gfc_get_interface_mapping_array (&se->pre, sym,
1651 PACKED_NO, tmp);
1653 /* Use DESC to work out the upper bounds, strides and offset. */
1654 gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1656 else
1657 /* Otherwise we have a packed array. */
1658 value = gfc_get_interface_mapping_array (&se->pre, sym,
1659 PACKED_FULL, se->expr);
1661 new_sym->backend_decl = value;
1665 /* Called once all dummy argument mappings have been added to MAPPING,
1666 but before the mapping is used to evaluate expressions. Pre-evaluate
1667 the length of each argument, adding any initialization code to PRE and
1668 any finalization code to POST. */
1670 void
1671 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1672 stmtblock_t * pre, stmtblock_t * post)
1674 gfc_interface_sym_mapping *sym;
1675 gfc_expr *expr;
1676 gfc_se se;
1678 for (sym = mapping->syms; sym; sym = sym->next)
1679 if (sym->new->n.sym->ts.type == BT_CHARACTER
1680 && !sym->new->n.sym->ts.cl->backend_decl)
1682 expr = sym->new->n.sym->ts.cl->length;
1683 gfc_apply_interface_mapping_to_expr (mapping, expr);
1684 gfc_init_se (&se, NULL);
1685 gfc_conv_expr (&se, expr);
1687 se.expr = gfc_evaluate_now (se.expr, &se.pre);
1688 gfc_add_block_to_block (pre, &se.pre);
1689 gfc_add_block_to_block (post, &se.post);
1691 sym->new->n.sym->ts.cl->backend_decl = se.expr;
1696 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1697 constructor C. */
1699 static void
1700 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
1701 gfc_constructor * c)
1703 for (; c; c = c->next)
1705 gfc_apply_interface_mapping_to_expr (mapping, c->expr);
1706 if (c->iterator)
1708 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
1709 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
1710 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
1716 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1717 reference REF. */
1719 static void
1720 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
1721 gfc_ref * ref)
1723 int n;
1725 for (; ref; ref = ref->next)
1726 switch (ref->type)
1728 case REF_ARRAY:
1729 for (n = 0; n < ref->u.ar.dimen; n++)
1731 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
1732 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
1733 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
1735 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
1736 break;
1738 case REF_COMPONENT:
1739 break;
1741 case REF_SUBSTRING:
1742 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
1743 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
1744 break;
1749 /* Convert intrinsic function calls into result expressions. */
1750 static bool
1751 gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping * mapping)
1753 gfc_symbol *sym;
1754 gfc_expr *new_expr;
1755 gfc_expr *arg1;
1756 gfc_expr *arg2;
1757 int d, dup;
1759 arg1 = expr->value.function.actual->expr;
1760 if (expr->value.function.actual->next)
1761 arg2 = expr->value.function.actual->next->expr;
1762 else
1763 arg2 = NULL;
1765 sym = arg1->symtree->n.sym;
1767 if (sym->attr.dummy)
1768 return false;
1770 new_expr = NULL;
1772 switch (expr->value.function.isym->id)
1774 case GFC_ISYM_LEN:
1775 /* TODO figure out why this condition is necessary. */
1776 if (sym->attr.function
1777 && arg1->ts.cl->length->expr_type != EXPR_CONSTANT
1778 && arg1->ts.cl->length->expr_type != EXPR_VARIABLE)
1779 return false;
1781 new_expr = gfc_copy_expr (arg1->ts.cl->length);
1782 break;
1784 case GFC_ISYM_SIZE:
1785 if (!sym->as)
1786 return false;
1788 if (arg2 && arg2->expr_type == EXPR_CONSTANT)
1790 dup = mpz_get_si (arg2->value.integer);
1791 d = dup - 1;
1793 else
1795 dup = sym->as->rank;
1796 d = 0;
1799 for (; d < dup; d++)
1801 gfc_expr *tmp;
1802 tmp = gfc_add (gfc_copy_expr (sym->as->upper[d]), gfc_int_expr (1));
1803 tmp = gfc_subtract (tmp, gfc_copy_expr (sym->as->lower[d]));
1804 if (new_expr)
1805 new_expr = gfc_multiply (new_expr, tmp);
1806 else
1807 new_expr = tmp;
1809 break;
1811 case GFC_ISYM_LBOUND:
1812 case GFC_ISYM_UBOUND:
1813 /* TODO These implementations of lbound and ubound do not limit if
1814 the size < 0, according to F95's 13.14.53 and 13.14.113. */
1816 if (!sym->as)
1817 return false;
1819 if (arg2 && arg2->expr_type == EXPR_CONSTANT)
1820 d = mpz_get_si (arg2->value.integer) - 1;
1821 else
1822 /* TODO: If the need arises, this could produce an array of
1823 ubound/lbounds. */
1824 gcc_unreachable ();
1826 if (expr->value.function.isym->id == GFC_ISYM_LBOUND)
1827 new_expr = gfc_copy_expr (sym->as->lower[d]);
1828 else
1829 new_expr = gfc_copy_expr (sym->as->upper[d]);
1830 break;
1832 default:
1833 break;
1836 gfc_apply_interface_mapping_to_expr (mapping, new_expr);
1837 if (!new_expr)
1838 return false;
1840 gfc_replace_expr (expr, new_expr);
1841 return true;
1845 static void
1846 gfc_map_fcn_formal_to_actual (gfc_expr *expr, gfc_expr *map_expr,
1847 gfc_interface_mapping * mapping)
1849 gfc_formal_arglist *f;
1850 gfc_actual_arglist *actual;
1852 actual = expr->value.function.actual;
1853 f = map_expr->symtree->n.sym->formal;
1855 for (; f && actual; f = f->next, actual = actual->next)
1857 if (!actual->expr)
1858 continue;
1860 gfc_add_interface_mapping (mapping, f->sym, NULL, actual->expr);
1863 if (map_expr->symtree->n.sym->attr.dimension)
1865 int d;
1866 gfc_array_spec *as;
1868 as = gfc_copy_array_spec (map_expr->symtree->n.sym->as);
1870 for (d = 0; d < as->rank; d++)
1872 gfc_apply_interface_mapping_to_expr (mapping, as->lower[d]);
1873 gfc_apply_interface_mapping_to_expr (mapping, as->upper[d]);
1876 expr->value.function.esym->as = as;
1879 if (map_expr->symtree->n.sym->ts.type == BT_CHARACTER)
1881 expr->value.function.esym->ts.cl->length
1882 = gfc_copy_expr (map_expr->symtree->n.sym->ts.cl->length);
1884 gfc_apply_interface_mapping_to_expr (mapping,
1885 expr->value.function.esym->ts.cl->length);
1890 /* EXPR is a copy of an expression that appeared in the interface
1891 associated with MAPPING. Walk it recursively looking for references to
1892 dummy arguments that MAPPING maps to actual arguments. Replace each such
1893 reference with a reference to the associated actual argument. */
1895 static void
1896 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
1897 gfc_expr * expr)
1899 gfc_interface_sym_mapping *sym;
1900 gfc_actual_arglist *actual;
1902 if (!expr)
1903 return;
1905 /* Copying an expression does not copy its length, so do that here. */
1906 if (expr->ts.type == BT_CHARACTER && expr->ts.cl)
1908 expr->ts.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.cl);
1909 gfc_apply_interface_mapping_to_expr (mapping, expr->ts.cl->length);
1912 /* Apply the mapping to any references. */
1913 gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
1915 /* ...and to the expression's symbol, if it has one. */
1916 /* TODO Find out why the condition on expr->symtree had to be moved into
1917 the loop rather than being ouside it, as originally. */
1918 for (sym = mapping->syms; sym; sym = sym->next)
1919 if (expr->symtree && sym->old == expr->symtree->n.sym)
1921 if (sym->new->n.sym->backend_decl)
1922 expr->symtree = sym->new;
1923 else if (sym->expr)
1924 gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
1927 /* ...and to subexpressions in expr->value. */
1928 switch (expr->expr_type)
1930 case EXPR_VARIABLE:
1931 case EXPR_CONSTANT:
1932 case EXPR_NULL:
1933 case EXPR_SUBSTRING:
1934 break;
1936 case EXPR_OP:
1937 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
1938 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
1939 break;
1941 case EXPR_FUNCTION:
1942 for (actual = expr->value.function.actual; actual; actual = actual->next)
1943 gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
1945 if (expr->value.function.esym == NULL
1946 && expr->value.function.isym != NULL
1947 && expr->value.function.actual->expr->symtree
1948 && gfc_map_intrinsic_function (expr, mapping))
1949 break;
1951 for (sym = mapping->syms; sym; sym = sym->next)
1952 if (sym->old == expr->value.function.esym)
1954 expr->value.function.esym = sym->new->n.sym;
1955 gfc_map_fcn_formal_to_actual (expr, sym->expr, mapping);
1956 expr->value.function.esym->result = sym->new->n.sym;
1958 break;
1960 case EXPR_ARRAY:
1961 case EXPR_STRUCTURE:
1962 gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
1963 break;
1966 return;
1970 /* Evaluate interface expression EXPR using MAPPING. Store the result
1971 in SE. */
1973 void
1974 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
1975 gfc_se * se, gfc_expr * expr)
1977 expr = gfc_copy_expr (expr);
1978 gfc_apply_interface_mapping_to_expr (mapping, expr);
1979 gfc_conv_expr (se, expr);
1980 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1981 gfc_free_expr (expr);
1985 /* Returns a reference to a temporary array into which a component of
1986 an actual argument derived type array is copied and then returned
1987 after the function call. */
1988 void
1989 gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr,
1990 int g77, sym_intent intent)
1992 gfc_se lse;
1993 gfc_se rse;
1994 gfc_ss *lss;
1995 gfc_ss *rss;
1996 gfc_loopinfo loop;
1997 gfc_loopinfo loop2;
1998 gfc_ss_info *info;
1999 tree offset;
2000 tree tmp_index;
2001 tree tmp;
2002 tree base_type;
2003 stmtblock_t body;
2004 int n;
2006 gcc_assert (expr->expr_type == EXPR_VARIABLE);
2008 gfc_init_se (&lse, NULL);
2009 gfc_init_se (&rse, NULL);
2011 /* Walk the argument expression. */
2012 rss = gfc_walk_expr (expr);
2014 gcc_assert (rss != gfc_ss_terminator);
2016 /* Initialize the scalarizer. */
2017 gfc_init_loopinfo (&loop);
2018 gfc_add_ss_to_loop (&loop, rss);
2020 /* Calculate the bounds of the scalarization. */
2021 gfc_conv_ss_startstride (&loop);
2023 /* Build an ss for the temporary. */
2024 if (expr->ts.type == BT_CHARACTER && !expr->ts.cl->backend_decl)
2025 gfc_conv_string_length (expr->ts.cl, &parmse->pre);
2027 base_type = gfc_typenode_for_spec (&expr->ts);
2028 if (GFC_ARRAY_TYPE_P (base_type)
2029 || GFC_DESCRIPTOR_TYPE_P (base_type))
2030 base_type = gfc_get_element_type (base_type);
2032 loop.temp_ss = gfc_get_ss ();;
2033 loop.temp_ss->type = GFC_SS_TEMP;
2034 loop.temp_ss->data.temp.type = base_type;
2036 if (expr->ts.type == BT_CHARACTER)
2037 loop.temp_ss->string_length = expr->ts.cl->backend_decl;
2038 else
2039 loop.temp_ss->string_length = NULL;
2041 parmse->string_length = loop.temp_ss->string_length;
2042 loop.temp_ss->data.temp.dimen = loop.dimen;
2043 loop.temp_ss->next = gfc_ss_terminator;
2045 /* Associate the SS with the loop. */
2046 gfc_add_ss_to_loop (&loop, loop.temp_ss);
2048 /* Setup the scalarizing loops. */
2049 gfc_conv_loop_setup (&loop);
2051 /* Pass the temporary descriptor back to the caller. */
2052 info = &loop.temp_ss->data.info;
2053 parmse->expr = info->descriptor;
2055 /* Setup the gfc_se structures. */
2056 gfc_copy_loopinfo_to_se (&lse, &loop);
2057 gfc_copy_loopinfo_to_se (&rse, &loop);
2059 rse.ss = rss;
2060 lse.ss = loop.temp_ss;
2061 gfc_mark_ss_chain_used (rss, 1);
2062 gfc_mark_ss_chain_used (loop.temp_ss, 1);
2064 /* Start the scalarized loop body. */
2065 gfc_start_scalarized_body (&loop, &body);
2067 /* Translate the expression. */
2068 gfc_conv_expr (&rse, expr);
2070 gfc_conv_tmp_array_ref (&lse);
2071 gfc_advance_se_ss_chain (&lse);
2073 if (intent != INTENT_OUT)
2075 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false);
2076 gfc_add_expr_to_block (&body, tmp);
2077 gcc_assert (rse.ss == gfc_ss_terminator);
2078 gfc_trans_scalarizing_loops (&loop, &body);
2080 else
2082 /* Make sure that the temporary declaration survives by merging
2083 all the loop declarations into the current context. */
2084 for (n = 0; n < loop.dimen; n++)
2086 gfc_merge_block_scope (&body);
2087 body = loop.code[loop.order[n]];
2089 gfc_merge_block_scope (&body);
2092 /* Add the post block after the second loop, so that any
2093 freeing of allocated memory is done at the right time. */
2094 gfc_add_block_to_block (&parmse->pre, &loop.pre);
2096 /**********Copy the temporary back again.*********/
2098 gfc_init_se (&lse, NULL);
2099 gfc_init_se (&rse, NULL);
2101 /* Walk the argument expression. */
2102 lss = gfc_walk_expr (expr);
2103 rse.ss = loop.temp_ss;
2104 lse.ss = lss;
2106 /* Initialize the scalarizer. */
2107 gfc_init_loopinfo (&loop2);
2108 gfc_add_ss_to_loop (&loop2, lss);
2110 /* Calculate the bounds of the scalarization. */
2111 gfc_conv_ss_startstride (&loop2);
2113 /* Setup the scalarizing loops. */
2114 gfc_conv_loop_setup (&loop2);
2116 gfc_copy_loopinfo_to_se (&lse, &loop2);
2117 gfc_copy_loopinfo_to_se (&rse, &loop2);
2119 gfc_mark_ss_chain_used (lss, 1);
2120 gfc_mark_ss_chain_used (loop.temp_ss, 1);
2122 /* Declare the variable to hold the temporary offset and start the
2123 scalarized loop body. */
2124 offset = gfc_create_var (gfc_array_index_type, NULL);
2125 gfc_start_scalarized_body (&loop2, &body);
2127 /* Build the offsets for the temporary from the loop variables. The
2128 temporary array has lbounds of zero and strides of one in all
2129 dimensions, so this is very simple. The offset is only computed
2130 outside the innermost loop, so the overall transfer could be
2131 optimized further. */
2132 info = &rse.ss->data.info;
2134 tmp_index = gfc_index_zero_node;
2135 for (n = info->dimen - 1; n > 0; n--)
2137 tree tmp_str;
2138 tmp = rse.loop->loopvar[n];
2139 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2140 tmp, rse.loop->from[n]);
2141 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2142 tmp, tmp_index);
2144 tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2145 rse.loop->to[n-1], rse.loop->from[n-1]);
2146 tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2147 tmp_str, gfc_index_one_node);
2149 tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
2150 tmp, tmp_str);
2153 tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2154 tmp_index, rse.loop->from[0]);
2155 gfc_add_modify_expr (&rse.loop->code[0], offset, tmp_index);
2157 tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2158 rse.loop->loopvar[0], offset);
2160 /* Now use the offset for the reference. */
2161 tmp = build_fold_indirect_ref (info->data);
2162 rse.expr = gfc_build_array_ref (tmp, tmp_index, NULL);
2164 if (expr->ts.type == BT_CHARACTER)
2165 rse.string_length = expr->ts.cl->backend_decl;
2167 gfc_conv_expr (&lse, expr);
2169 gcc_assert (lse.ss == gfc_ss_terminator);
2171 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false);
2172 gfc_add_expr_to_block (&body, tmp);
2174 /* Generate the copying loops. */
2175 gfc_trans_scalarizing_loops (&loop2, &body);
2177 /* Wrap the whole thing up by adding the second loop to the post-block
2178 and following it by the post-block of the first loop. In this way,
2179 if the temporary needs freeing, it is done after use! */
2180 if (intent != INTENT_IN)
2182 gfc_add_block_to_block (&parmse->post, &loop2.pre);
2183 gfc_add_block_to_block (&parmse->post, &loop2.post);
2186 gfc_add_block_to_block (&parmse->post, &loop.post);
2188 gfc_cleanup_loop (&loop);
2189 gfc_cleanup_loop (&loop2);
2191 /* Pass the string length to the argument expression. */
2192 if (expr->ts.type == BT_CHARACTER)
2193 parmse->string_length = expr->ts.cl->backend_decl;
2195 /* We want either the address for the data or the address of the descriptor,
2196 depending on the mode of passing array arguments. */
2197 if (g77)
2198 parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
2199 else
2200 parmse->expr = build_fold_addr_expr (parmse->expr);
2202 return;
2206 /* Generate the code for argument list functions. */
2208 static void
2209 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
2211 /* Pass by value for g77 %VAL(arg), pass the address
2212 indirectly for %LOC, else by reference. Thus %REF
2213 is a "do-nothing" and %LOC is the same as an F95
2214 pointer. */
2215 if (strncmp (name, "%VAL", 4) == 0)
2216 gfc_conv_expr (se, expr);
2217 else if (strncmp (name, "%LOC", 4) == 0)
2219 gfc_conv_expr_reference (se, expr);
2220 se->expr = gfc_build_addr_expr (NULL, se->expr);
2222 else if (strncmp (name, "%REF", 4) == 0)
2223 gfc_conv_expr_reference (se, expr);
2224 else
2225 gfc_error ("Unknown argument list function at %L", &expr->where);
2229 /* Generate code for a procedure call. Note can return se->post != NULL.
2230 If se->direct_byref is set then se->expr contains the return parameter.
2231 Return nonzero, if the call has alternate specifiers. */
2234 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
2235 gfc_actual_arglist * arg, tree append_args)
2237 gfc_interface_mapping mapping;
2238 tree arglist;
2239 tree retargs;
2240 tree tmp;
2241 tree fntype;
2242 gfc_se parmse;
2243 gfc_ss *argss;
2244 gfc_ss_info *info;
2245 int byref;
2246 int parm_kind;
2247 tree type;
2248 tree var;
2249 tree len;
2250 tree stringargs;
2251 gfc_formal_arglist *formal;
2252 int has_alternate_specifier = 0;
2253 bool need_interface_mapping;
2254 bool callee_alloc;
2255 gfc_typespec ts;
2256 gfc_charlen cl;
2257 gfc_expr *e;
2258 gfc_symbol *fsym;
2259 stmtblock_t post;
2260 enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
2262 arglist = NULL_TREE;
2263 retargs = NULL_TREE;
2264 stringargs = NULL_TREE;
2265 var = NULL_TREE;
2266 len = NULL_TREE;
2267 gfc_clear_ts (&ts);
2269 if (sym->from_intmod == INTMOD_ISO_C_BINDING)
2271 if (sym->intmod_sym_id == ISOCBINDING_LOC)
2273 if (arg->expr->rank == 0)
2274 gfc_conv_expr_reference (se, arg->expr);
2275 else
2277 int f;
2278 /* This is really the actual arg because no formal arglist is
2279 created for C_LOC. */
2280 fsym = arg->expr->symtree->n.sym;
2282 /* We should want it to do g77 calling convention. */
2283 f = (fsym != NULL)
2284 && !(fsym->attr.pointer || fsym->attr.allocatable)
2285 && fsym->as->type != AS_ASSUMED_SHAPE;
2286 f = f || !sym->attr.always_explicit;
2288 argss = gfc_walk_expr (arg->expr);
2289 gfc_conv_array_parameter (se, arg->expr, argss, f);
2292 /* TODO -- the following two lines shouldn't be necessary, but
2293 they're removed a bug is exposed later in the codepath.
2294 This is workaround was thus introduced, but will have to be
2295 removed; please see PR 35150 for details about the issue. */
2296 se->expr = convert (pvoid_type_node, se->expr);
2297 se->expr = gfc_evaluate_now (se->expr, &se->pre);
2299 return 0;
2301 else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2303 arg->expr->ts.type = sym->ts.derived->ts.type;
2304 arg->expr->ts.f90_type = sym->ts.derived->ts.f90_type;
2305 arg->expr->ts.kind = sym->ts.derived->ts.kind;
2306 gfc_conv_expr_reference (se, arg->expr);
2308 return 0;
2310 else if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2312 gfc_se arg1se;
2313 gfc_se arg2se;
2315 /* Build the addr_expr for the first argument. The argument is
2316 already an *address* so we don't need to set want_pointer in
2317 the gfc_se. */
2318 gfc_init_se (&arg1se, NULL);
2319 gfc_conv_expr (&arg1se, arg->expr);
2320 gfc_add_block_to_block (&se->pre, &arg1se.pre);
2321 gfc_add_block_to_block (&se->post, &arg1se.post);
2323 /* See if we were given two arguments. */
2324 if (arg->next == NULL)
2325 /* Only given one arg so generate a null and do a
2326 not-equal comparison against the first arg. */
2327 se->expr = fold_build2 (NE_EXPR, boolean_type_node, arg1se.expr,
2328 fold_convert (TREE_TYPE (arg1se.expr),
2329 null_pointer_node));
2330 else
2332 tree eq_expr;
2333 tree not_null_expr;
2335 /* Given two arguments so build the arg2se from second arg. */
2336 gfc_init_se (&arg2se, NULL);
2337 gfc_conv_expr (&arg2se, arg->next->expr);
2338 gfc_add_block_to_block (&se->pre, &arg2se.pre);
2339 gfc_add_block_to_block (&se->post, &arg2se.post);
2341 /* Generate test to compare that the two args are equal. */
2342 eq_expr = fold_build2 (EQ_EXPR, boolean_type_node,
2343 arg1se.expr, arg2se.expr);
2344 /* Generate test to ensure that the first arg is not null. */
2345 not_null_expr = fold_build2 (NE_EXPR, boolean_type_node,
2346 arg1se.expr, null_pointer_node);
2348 /* Finally, the generated test must check that both arg1 is not
2349 NULL and that it is equal to the second arg. */
2350 se->expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
2351 not_null_expr, eq_expr);
2354 return 0;
2358 if (se->ss != NULL)
2360 if (!sym->attr.elemental)
2362 gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2363 if (se->ss->useflags)
2365 gcc_assert (gfc_return_by_reference (sym)
2366 && sym->result->attr.dimension);
2367 gcc_assert (se->loop != NULL);
2369 /* Access the previously obtained result. */
2370 gfc_conv_tmp_array_ref (se);
2371 gfc_advance_se_ss_chain (se);
2372 return 0;
2375 info = &se->ss->data.info;
2377 else
2378 info = NULL;
2380 gfc_init_block (&post);
2381 gfc_init_interface_mapping (&mapping);
2382 need_interface_mapping = ((sym->ts.type == BT_CHARACTER
2383 && sym->ts.cl->length
2384 && sym->ts.cl->length->expr_type
2385 != EXPR_CONSTANT)
2386 || sym->attr.dimension);
2387 formal = sym->formal;
2388 /* Evaluate the arguments. */
2389 for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
2391 e = arg->expr;
2392 fsym = formal ? formal->sym : NULL;
2393 parm_kind = MISSING;
2394 if (e == NULL)
2397 if (se->ignore_optional)
2399 /* Some intrinsics have already been resolved to the correct
2400 parameters. */
2401 continue;
2403 else if (arg->label)
2405 has_alternate_specifier = 1;
2406 continue;
2408 else
2410 /* Pass a NULL pointer for an absent arg. */
2411 gfc_init_se (&parmse, NULL);
2412 parmse.expr = null_pointer_node;
2413 if (arg->missing_arg_type == BT_CHARACTER)
2414 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2417 else if (se->ss && se->ss->useflags)
2419 /* An elemental function inside a scalarized loop. */
2420 gfc_init_se (&parmse, se);
2421 gfc_conv_expr_reference (&parmse, e);
2422 parm_kind = ELEMENTAL;
2424 else
2426 /* A scalar or transformational function. */
2427 gfc_init_se (&parmse, NULL);
2428 argss = gfc_walk_expr (e);
2430 if (argss == gfc_ss_terminator)
2432 if (fsym && fsym->attr.value)
2434 if (fsym->ts.type == BT_CHARACTER
2435 && fsym->ts.is_c_interop
2436 && fsym->ns->proc_name != NULL
2437 && fsym->ns->proc_name->attr.is_bind_c)
2439 parmse.expr = NULL;
2440 gfc_conv_scalar_char_value (fsym, &parmse, &e);
2441 if (parmse.expr == NULL)
2442 gfc_conv_expr (&parmse, e);
2444 else
2445 gfc_conv_expr (&parmse, e);
2447 else if (arg->name && arg->name[0] == '%')
2448 /* Argument list functions %VAL, %LOC and %REF are signalled
2449 through arg->name. */
2450 conv_arglist_function (&parmse, arg->expr, arg->name);
2451 else if ((e->expr_type == EXPR_FUNCTION)
2452 && e->symtree->n.sym->attr.pointer
2453 && fsym && fsym->attr.target)
2455 gfc_conv_expr (&parmse, e);
2456 parmse.expr = build_fold_addr_expr (parmse.expr);
2458 else
2460 gfc_conv_expr_reference (&parmse, e);
2461 if (fsym && fsym->attr.pointer
2462 && fsym->attr.flavor != FL_PROCEDURE
2463 && e->expr_type != EXPR_NULL)
2465 /* Scalar pointer dummy args require an extra level of
2466 indirection. The null pointer already contains
2467 this level of indirection. */
2468 parm_kind = SCALAR_POINTER;
2469 parmse.expr = build_fold_addr_expr (parmse.expr);
2473 else
2475 /* If the procedure requires an explicit interface, the actual
2476 argument is passed according to the corresponding formal
2477 argument. If the corresponding formal argument is a POINTER,
2478 ALLOCATABLE or assumed shape, we do not use g77's calling
2479 convention, and pass the address of the array descriptor
2480 instead. Otherwise we use g77's calling convention. */
2481 int f;
2482 f = (fsym != NULL)
2483 && !(fsym->attr.pointer || fsym->attr.allocatable)
2484 && fsym->as->type != AS_ASSUMED_SHAPE;
2485 f = f || !sym->attr.always_explicit;
2487 if (e->expr_type == EXPR_VARIABLE
2488 && is_subref_array (e))
2489 /* The actual argument is a component reference to an
2490 array of derived types. In this case, the argument
2491 is converted to a temporary, which is passed and then
2492 written back after the procedure call. */
2493 gfc_conv_subref_array_arg (&parmse, e, f,
2494 fsym ? fsym->attr.intent : INTENT_INOUT);
2495 else
2496 gfc_conv_array_parameter (&parmse, e, argss, f);
2498 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
2499 allocated on entry, it must be deallocated. */
2500 if (fsym && fsym->attr.allocatable
2501 && fsym->attr.intent == INTENT_OUT)
2503 tmp = build_fold_indirect_ref (parmse.expr);
2504 tmp = gfc_trans_dealloc_allocated (tmp);
2505 gfc_add_expr_to_block (&se->pre, tmp);
2511 /* The case with fsym->attr.optional is that of a user subroutine
2512 with an interface indicating an optional argument. When we call
2513 an intrinsic subroutine, however, fsym is NULL, but we might still
2514 have an optional argument, so we proceed to the substitution
2515 just in case. */
2516 if (e && (fsym == NULL || fsym->attr.optional))
2518 /* If an optional argument is itself an optional dummy argument,
2519 check its presence and substitute a null if absent. */
2520 if (e->expr_type == EXPR_VARIABLE
2521 && e->symtree->n.sym->attr.optional)
2522 gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
2523 e->representation.length);
2526 if (fsym && e)
2528 /* Obtain the character length of an assumed character length
2529 length procedure from the typespec. */
2530 if (fsym->ts.type == BT_CHARACTER
2531 && parmse.string_length == NULL_TREE
2532 && e->ts.type == BT_PROCEDURE
2533 && e->symtree->n.sym->ts.type == BT_CHARACTER
2534 && e->symtree->n.sym->ts.cl->length != NULL)
2536 gfc_conv_const_charlen (e->symtree->n.sym->ts.cl);
2537 parmse.string_length = e->symtree->n.sym->ts.cl->backend_decl;
2541 if (fsym && need_interface_mapping && e)
2542 gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
2544 gfc_add_block_to_block (&se->pre, &parmse.pre);
2545 gfc_add_block_to_block (&post, &parmse.post);
2547 /* Allocated allocatable components of derived types must be
2548 deallocated for INTENT(OUT) dummy arguments and non-variable
2549 scalars. Non-variable arrays are dealt with in trans-array.c
2550 (gfc_conv_array_parameter). */
2551 if (e && e->ts.type == BT_DERIVED
2552 && e->ts.derived->attr.alloc_comp
2553 && ((formal && formal->sym->attr.intent == INTENT_OUT)
2555 (e->expr_type != EXPR_VARIABLE && !e->rank)))
2557 int parm_rank;
2558 tmp = build_fold_indirect_ref (parmse.expr);
2559 parm_rank = e->rank;
2560 switch (parm_kind)
2562 case (ELEMENTAL):
2563 case (SCALAR):
2564 parm_rank = 0;
2565 break;
2567 case (SCALAR_POINTER):
2568 tmp = build_fold_indirect_ref (tmp);
2569 break;
2570 case (ARRAY):
2571 tmp = parmse.expr;
2572 break;
2575 tmp = gfc_deallocate_alloc_comp (e->ts.derived, tmp, parm_rank);
2576 if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.optional)
2577 tmp = build3_v (COND_EXPR, gfc_conv_expr_present (e->symtree->n.sym),
2578 tmp, build_empty_stmt ());
2580 if (e->expr_type != EXPR_VARIABLE)
2581 /* Don't deallocate non-variables until they have been used. */
2582 gfc_add_expr_to_block (&se->post, tmp);
2583 else
2585 gcc_assert (formal && formal->sym->attr.intent == INTENT_OUT);
2586 gfc_add_expr_to_block (&se->pre, tmp);
2590 /* Character strings are passed as two parameters, a length and a
2591 pointer - except for Bind(c) which only passes the pointer. */
2592 if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
2593 stringargs = gfc_chainon_list (stringargs, parmse.string_length);
2595 arglist = gfc_chainon_list (arglist, parmse.expr);
2597 gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
2599 ts = sym->ts;
2600 if (ts.type == BT_CHARACTER && !sym->attr.is_bind_c)
2602 if (sym->ts.cl->length == NULL)
2604 /* Assumed character length results are not allowed by 5.1.1.5 of the
2605 standard and are trapped in resolve.c; except in the case of SPREAD
2606 (and other intrinsics?) and dummy functions. In the case of SPREAD,
2607 we take the character length of the first argument for the result.
2608 For dummies, we have to look through the formal argument list for
2609 this function and use the character length found there.*/
2610 if (!sym->attr.dummy)
2611 cl.backend_decl = TREE_VALUE (stringargs);
2612 else
2614 formal = sym->ns->proc_name->formal;
2615 for (; formal; formal = formal->next)
2616 if (strcmp (formal->sym->name, sym->name) == 0)
2617 cl.backend_decl = formal->sym->ts.cl->backend_decl;
2620 else
2622 tree tmp;
2624 /* Calculate the length of the returned string. */
2625 gfc_init_se (&parmse, NULL);
2626 if (need_interface_mapping)
2627 gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2628 else
2629 gfc_conv_expr (&parmse, sym->ts.cl->length);
2630 gfc_add_block_to_block (&se->pre, &parmse.pre);
2631 gfc_add_block_to_block (&se->post, &parmse.post);
2633 tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
2634 tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
2635 build_int_cst (gfc_charlen_type_node, 0));
2636 cl.backend_decl = tmp;
2639 /* Set up a charlen structure for it. */
2640 cl.next = NULL;
2641 cl.length = NULL;
2642 ts.cl = &cl;
2644 len = cl.backend_decl;
2647 byref = gfc_return_by_reference (sym);
2648 if (byref)
2650 if (se->direct_byref)
2652 /* Sometimes, too much indirection can be applied; eg. for
2653 function_result = array_valued_recursive_function. */
2654 if (TREE_TYPE (TREE_TYPE (se->expr))
2655 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
2656 && GFC_DESCRIPTOR_TYPE_P
2657 (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
2658 se->expr = build_fold_indirect_ref (se->expr);
2660 retargs = gfc_chainon_list (retargs, se->expr);
2662 else if (sym->result->attr.dimension)
2664 gcc_assert (se->loop && info);
2666 /* Set the type of the array. */
2667 tmp = gfc_typenode_for_spec (&ts);
2668 info->dimen = se->loop->dimen;
2670 /* Evaluate the bounds of the result, if known. */
2671 gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2673 /* Create a temporary to store the result. In case the function
2674 returns a pointer, the temporary will be a shallow copy and
2675 mustn't be deallocated. */
2676 callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2677 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2678 false, !sym->attr.pointer, callee_alloc);
2680 /* Pass the temporary as the first argument. */
2681 tmp = info->descriptor;
2682 tmp = build_fold_addr_expr (tmp);
2683 retargs = gfc_chainon_list (retargs, tmp);
2685 else if (ts.type == BT_CHARACTER)
2687 /* Pass the string length. */
2688 type = gfc_get_character_type (ts.kind, ts.cl);
2689 type = build_pointer_type (type);
2691 /* Return an address to a char[0:len-1]* temporary for
2692 character pointers. */
2693 if (sym->attr.pointer || sym->attr.allocatable)
2695 var = gfc_create_var (type, "pstr");
2697 /* Provide an address expression for the function arguments. */
2698 var = build_fold_addr_expr (var);
2700 else
2701 var = gfc_conv_string_tmp (se, type, len);
2703 retargs = gfc_chainon_list (retargs, var);
2705 else
2707 gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2709 type = gfc_get_complex_type (ts.kind);
2710 var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2711 retargs = gfc_chainon_list (retargs, var);
2714 /* Add the string length to the argument list. */
2715 if (ts.type == BT_CHARACTER)
2716 retargs = gfc_chainon_list (retargs, len);
2718 gfc_free_interface_mapping (&mapping);
2720 /* Add the return arguments. */
2721 arglist = chainon (retargs, arglist);
2723 /* Add the hidden string length parameters to the arguments. */
2724 arglist = chainon (arglist, stringargs);
2726 /* We may want to append extra arguments here. This is used e.g. for
2727 calls to libgfortran_matmul_??, which need extra information. */
2728 if (append_args != NULL_TREE)
2729 arglist = chainon (arglist, append_args);
2731 /* Generate the actual call. */
2732 gfc_conv_function_val (se, sym);
2734 /* If there are alternate return labels, function type should be
2735 integer. Can't modify the type in place though, since it can be shared
2736 with other functions. For dummy arguments, the typing is done to
2737 to this result, even if it has to be repeated for each call. */
2738 if (has_alternate_specifier
2739 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2741 if (!sym->attr.dummy)
2743 TREE_TYPE (sym->backend_decl)
2744 = build_function_type (integer_type_node,
2745 TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2746 se->expr = build_fold_addr_expr (sym->backend_decl);
2748 else
2749 TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
2752 fntype = TREE_TYPE (TREE_TYPE (se->expr));
2753 se->expr = build_call_list (TREE_TYPE (fntype), se->expr, arglist);
2755 /* If we have a pointer function, but we don't want a pointer, e.g.
2756 something like
2757 x = f()
2758 where f is pointer valued, we have to dereference the result. */
2759 if (!se->want_pointer && !byref && sym->attr.pointer)
2760 se->expr = build_fold_indirect_ref (se->expr);
2762 /* f2c calling conventions require a scalar default real function to
2763 return a double precision result. Convert this back to default
2764 real. We only care about the cases that can happen in Fortran 77.
2766 if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2767 && sym->ts.kind == gfc_default_real_kind
2768 && !sym->attr.always_explicit)
2769 se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2771 /* A pure function may still have side-effects - it may modify its
2772 parameters. */
2773 TREE_SIDE_EFFECTS (se->expr) = 1;
2774 #if 0
2775 if (!sym->attr.pure)
2776 TREE_SIDE_EFFECTS (se->expr) = 1;
2777 #endif
2779 if (byref)
2781 /* Add the function call to the pre chain. There is no expression. */
2782 gfc_add_expr_to_block (&se->pre, se->expr);
2783 se->expr = NULL_TREE;
2785 if (!se->direct_byref)
2787 if (sym->attr.dimension)
2789 if (flag_bounds_check)
2791 /* Check the data pointer hasn't been modified. This would
2792 happen in a function returning a pointer. */
2793 tmp = gfc_conv_descriptor_data_get (info->descriptor);
2794 tmp = fold_build2 (NE_EXPR, boolean_type_node,
2795 tmp, info->data);
2796 gfc_trans_runtime_check (tmp, &se->pre, NULL, gfc_msg_fault);
2798 se->expr = info->descriptor;
2799 /* Bundle in the string length. */
2800 se->string_length = len;
2802 else if (sym->ts.type == BT_CHARACTER)
2804 /* Dereference for character pointer results. */
2805 if (sym->attr.pointer || sym->attr.allocatable)
2806 se->expr = build_fold_indirect_ref (var);
2807 else
2808 se->expr = var;
2810 se->string_length = len;
2812 else
2814 gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
2815 se->expr = build_fold_indirect_ref (var);
2820 /* Follow the function call with the argument post block. */
2821 if (byref)
2822 gfc_add_block_to_block (&se->pre, &post);
2823 else
2824 gfc_add_block_to_block (&se->post, &post);
2826 return has_alternate_specifier;
2830 /* Generate code to copy a string. */
2832 void
2833 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
2834 tree slength, tree src)
2836 tree tmp, dlen, slen;
2837 tree dsc;
2838 tree ssc;
2839 tree cond;
2840 tree cond2;
2841 tree tmp2;
2842 tree tmp3;
2843 tree tmp4;
2844 stmtblock_t tempblock;
2846 if (slength != NULL_TREE)
2848 slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
2849 ssc = gfc_to_single_character (slen, src);
2851 else
2853 slen = build_int_cst (size_type_node, 1);
2854 ssc = src;
2857 if (dlength != NULL_TREE)
2859 dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
2860 dsc = gfc_to_single_character (slen, dest);
2862 else
2864 dlen = build_int_cst (size_type_node, 1);
2865 dsc = dest;
2868 if (slength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (src)))
2869 ssc = gfc_to_single_character (slen, src);
2870 if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
2871 dsc = gfc_to_single_character (dlen, dest);
2874 /* Assign directly if the types are compatible. */
2875 if (dsc != NULL_TREE && ssc != NULL_TREE
2876 && TREE_TYPE (dsc) == TREE_TYPE (ssc))
2878 gfc_add_modify_expr (block, dsc, ssc);
2879 return;
2882 /* Do nothing if the destination length is zero. */
2883 cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
2884 build_int_cst (size_type_node, 0));
2886 /* The following code was previously in _gfortran_copy_string:
2888 // The two strings may overlap so we use memmove.
2889 void
2890 copy_string (GFC_INTEGER_4 destlen, char * dest,
2891 GFC_INTEGER_4 srclen, const char * src)
2893 if (srclen >= destlen)
2895 // This will truncate if too long.
2896 memmove (dest, src, destlen);
2898 else
2900 memmove (dest, src, srclen);
2901 // Pad with spaces.
2902 memset (&dest[srclen], ' ', destlen - srclen);
2906 We're now doing it here for better optimization, but the logic
2907 is the same. */
2909 if (dlength)
2910 dest = fold_convert (pvoid_type_node, dest);
2911 else
2912 dest = gfc_build_addr_expr (pvoid_type_node, dest);
2914 if (slength)
2915 src = fold_convert (pvoid_type_node, src);
2916 else
2917 src = gfc_build_addr_expr (pvoid_type_node, src);
2919 /* Truncate string if source is too long. */
2920 cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
2921 tmp2 = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE],
2922 3, dest, src, dlen);
2924 /* Else copy and pad with spaces. */
2925 tmp3 = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE],
2926 3, dest, src, slen);
2928 tmp4 = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest,
2929 fold_convert (sizetype, slen));
2930 tmp4 = build_call_expr (built_in_decls[BUILT_IN_MEMSET], 3,
2931 tmp4,
2932 build_int_cst (gfc_get_int_type (gfc_c_int_kind),
2933 lang_hooks.to_target_charset (' ')),
2934 fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
2935 dlen, slen));
2937 gfc_init_block (&tempblock);
2938 gfc_add_expr_to_block (&tempblock, tmp3);
2939 gfc_add_expr_to_block (&tempblock, tmp4);
2940 tmp3 = gfc_finish_block (&tempblock);
2942 /* The whole copy_string function is there. */
2943 tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
2944 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
2945 gfc_add_expr_to_block (block, tmp);
2949 /* Translate a statement function.
2950 The value of a statement function reference is obtained by evaluating the
2951 expression using the values of the actual arguments for the values of the
2952 corresponding dummy arguments. */
2954 static void
2955 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
2957 gfc_symbol *sym;
2958 gfc_symbol *fsym;
2959 gfc_formal_arglist *fargs;
2960 gfc_actual_arglist *args;
2961 gfc_se lse;
2962 gfc_se rse;
2963 gfc_saved_var *saved_vars;
2964 tree *temp_vars;
2965 tree type;
2966 tree tmp;
2967 int n;
2969 sym = expr->symtree->n.sym;
2970 args = expr->value.function.actual;
2971 gfc_init_se (&lse, NULL);
2972 gfc_init_se (&rse, NULL);
2974 n = 0;
2975 for (fargs = sym->formal; fargs; fargs = fargs->next)
2976 n++;
2977 saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
2978 temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
2980 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2982 /* Each dummy shall be specified, explicitly or implicitly, to be
2983 scalar. */
2984 gcc_assert (fargs->sym->attr.dimension == 0);
2985 fsym = fargs->sym;
2987 /* Create a temporary to hold the value. */
2988 type = gfc_typenode_for_spec (&fsym->ts);
2989 temp_vars[n] = gfc_create_var (type, fsym->name);
2991 if (fsym->ts.type == BT_CHARACTER)
2993 /* Copy string arguments. */
2994 tree arglen;
2996 gcc_assert (fsym->ts.cl && fsym->ts.cl->length
2997 && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
2999 arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3000 tmp = gfc_build_addr_expr (build_pointer_type (type),
3001 temp_vars[n]);
3003 gfc_conv_expr (&rse, args->expr);
3004 gfc_conv_string_parameter (&rse);
3005 gfc_add_block_to_block (&se->pre, &lse.pre);
3006 gfc_add_block_to_block (&se->pre, &rse.pre);
3008 gfc_trans_string_copy (&se->pre, arglen, tmp, rse.string_length,
3009 rse.expr);
3010 gfc_add_block_to_block (&se->pre, &lse.post);
3011 gfc_add_block_to_block (&se->pre, &rse.post);
3013 else
3015 /* For everything else, just evaluate the expression. */
3016 gfc_conv_expr (&lse, args->expr);
3018 gfc_add_block_to_block (&se->pre, &lse.pre);
3019 gfc_add_modify_expr (&se->pre, temp_vars[n], lse.expr);
3020 gfc_add_block_to_block (&se->pre, &lse.post);
3023 args = args->next;
3026 /* Use the temporary variables in place of the real ones. */
3027 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3028 gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
3030 gfc_conv_expr (se, sym->value);
3032 if (sym->ts.type == BT_CHARACTER)
3034 gfc_conv_const_charlen (sym->ts.cl);
3036 /* Force the expression to the correct length. */
3037 if (!INTEGER_CST_P (se->string_length)
3038 || tree_int_cst_lt (se->string_length,
3039 sym->ts.cl->backend_decl))
3041 type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
3042 tmp = gfc_create_var (type, sym->name);
3043 tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
3044 gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
3045 se->string_length, se->expr);
3046 se->expr = tmp;
3048 se->string_length = sym->ts.cl->backend_decl;
3051 /* Restore the original variables. */
3052 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3053 gfc_restore_sym (fargs->sym, &saved_vars[n]);
3054 gfc_free (saved_vars);
3058 /* Translate a function expression. */
3060 static void
3061 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
3063 gfc_symbol *sym;
3065 if (expr->value.function.isym)
3067 gfc_conv_intrinsic_function (se, expr);
3068 return;
3071 /* We distinguish statement functions from general functions to improve
3072 runtime performance. */
3073 if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3075 gfc_conv_statement_function (se, expr);
3076 return;
3079 /* expr.value.function.esym is the resolved (specific) function symbol for
3080 most functions. However this isn't set for dummy procedures. */
3081 sym = expr->value.function.esym;
3082 if (!sym)
3083 sym = expr->symtree->n.sym;
3084 gfc_conv_function_call (se, sym, expr->value.function.actual, NULL_TREE);
3088 static void
3089 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
3091 gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
3092 gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
3094 gfc_conv_tmp_array_ref (se);
3095 gfc_advance_se_ss_chain (se);
3099 /* Build a static initializer. EXPR is the expression for the initial value.
3100 The other parameters describe the variable of the component being
3101 initialized. EXPR may be null. */
3103 tree
3104 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
3105 bool array, bool pointer)
3107 gfc_se se;
3109 if (!(expr || pointer))
3110 return NULL_TREE;
3112 /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
3113 (these are the only two iso_c_binding derived types that can be
3114 used as initialization expressions). If so, we need to modify
3115 the 'expr' to be that for a (void *). */
3116 if (expr != NULL && expr->ts.type == BT_DERIVED
3117 && expr->ts.is_iso_c && expr->ts.derived)
3119 gfc_symbol *derived = expr->ts.derived;
3121 expr = gfc_int_expr (0);
3123 /* The derived symbol has already been converted to a (void *). Use
3124 its kind. */
3125 expr->ts.f90_type = derived->ts.f90_type;
3126 expr->ts.kind = derived->ts.kind;
3129 if (array)
3131 /* Arrays need special handling. */
3132 if (pointer)
3133 return gfc_build_null_descriptor (type);
3134 else
3135 return gfc_conv_array_initializer (type, expr);
3137 else if (pointer)
3138 return fold_convert (type, null_pointer_node);
3139 else
3141 switch (ts->type)
3143 case BT_DERIVED:
3144 gfc_init_se (&se, NULL);
3145 gfc_conv_structure (&se, expr, 1);
3146 return se.expr;
3148 case BT_CHARACTER:
3149 return gfc_conv_string_init (ts->cl->backend_decl,expr);
3151 default:
3152 gfc_init_se (&se, NULL);
3153 gfc_conv_constant (&se, expr);
3154 return se.expr;
3159 static tree
3160 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3162 gfc_se rse;
3163 gfc_se lse;
3164 gfc_ss *rss;
3165 gfc_ss *lss;
3166 stmtblock_t body;
3167 stmtblock_t block;
3168 gfc_loopinfo loop;
3169 int n;
3170 tree tmp;
3172 gfc_start_block (&block);
3174 /* Initialize the scalarizer. */
3175 gfc_init_loopinfo (&loop);
3177 gfc_init_se (&lse, NULL);
3178 gfc_init_se (&rse, NULL);
3180 /* Walk the rhs. */
3181 rss = gfc_walk_expr (expr);
3182 if (rss == gfc_ss_terminator)
3184 /* The rhs is scalar. Add a ss for the expression. */
3185 rss = gfc_get_ss ();
3186 rss->next = gfc_ss_terminator;
3187 rss->type = GFC_SS_SCALAR;
3188 rss->expr = expr;
3191 /* Create a SS for the destination. */
3192 lss = gfc_get_ss ();
3193 lss->type = GFC_SS_COMPONENT;
3194 lss->expr = NULL;
3195 lss->shape = gfc_get_shape (cm->as->rank);
3196 lss->next = gfc_ss_terminator;
3197 lss->data.info.dimen = cm->as->rank;
3198 lss->data.info.descriptor = dest;
3199 lss->data.info.data = gfc_conv_array_data (dest);
3200 lss->data.info.offset = gfc_conv_array_offset (dest);
3201 for (n = 0; n < cm->as->rank; n++)
3203 lss->data.info.dim[n] = n;
3204 lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
3205 lss->data.info.stride[n] = gfc_index_one_node;
3207 mpz_init (lss->shape[n]);
3208 mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
3209 cm->as->lower[n]->value.integer);
3210 mpz_add_ui (lss->shape[n], lss->shape[n], 1);
3213 /* Associate the SS with the loop. */
3214 gfc_add_ss_to_loop (&loop, lss);
3215 gfc_add_ss_to_loop (&loop, rss);
3217 /* Calculate the bounds of the scalarization. */
3218 gfc_conv_ss_startstride (&loop);
3220 /* Setup the scalarizing loops. */
3221 gfc_conv_loop_setup (&loop);
3223 /* Setup the gfc_se structures. */
3224 gfc_copy_loopinfo_to_se (&lse, &loop);
3225 gfc_copy_loopinfo_to_se (&rse, &loop);
3227 rse.ss = rss;
3228 gfc_mark_ss_chain_used (rss, 1);
3229 lse.ss = lss;
3230 gfc_mark_ss_chain_used (lss, 1);
3232 /* Start the scalarized loop body. */
3233 gfc_start_scalarized_body (&loop, &body);
3235 gfc_conv_tmp_array_ref (&lse);
3236 if (cm->ts.type == BT_CHARACTER)
3237 lse.string_length = cm->ts.cl->backend_decl;
3239 gfc_conv_expr (&rse, expr);
3241 tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
3242 gfc_add_expr_to_block (&body, tmp);
3244 gcc_assert (rse.ss == gfc_ss_terminator);
3246 /* Generate the copying loops. */
3247 gfc_trans_scalarizing_loops (&loop, &body);
3249 /* Wrap the whole thing up. */
3250 gfc_add_block_to_block (&block, &loop.pre);
3251 gfc_add_block_to_block (&block, &loop.post);
3253 for (n = 0; n < cm->as->rank; n++)
3254 mpz_clear (lss->shape[n]);
3255 gfc_free (lss->shape);
3257 gfc_cleanup_loop (&loop);
3259 return gfc_finish_block (&block);
3263 /* Assign a single component of a derived type constructor. */
3265 static tree
3266 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3268 gfc_se se;
3269 gfc_se lse;
3270 gfc_ss *rss;
3271 stmtblock_t block;
3272 tree tmp;
3273 tree offset;
3274 int n;
3276 gfc_start_block (&block);
3278 if (cm->pointer)
3280 gfc_init_se (&se, NULL);
3281 /* Pointer component. */
3282 if (cm->dimension)
3284 /* Array pointer. */
3285 if (expr->expr_type == EXPR_NULL)
3286 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
3287 else
3289 rss = gfc_walk_expr (expr);
3290 se.direct_byref = 1;
3291 se.expr = dest;
3292 gfc_conv_expr_descriptor (&se, expr, rss);
3293 gfc_add_block_to_block (&block, &se.pre);
3294 gfc_add_block_to_block (&block, &se.post);
3297 else
3299 /* Scalar pointers. */
3300 se.want_pointer = 1;
3301 gfc_conv_expr (&se, expr);
3302 gfc_add_block_to_block (&block, &se.pre);
3303 gfc_add_modify_expr (&block, dest,
3304 fold_convert (TREE_TYPE (dest), se.expr));
3305 gfc_add_block_to_block (&block, &se.post);
3308 else if (cm->dimension)
3310 if (cm->allocatable && expr->expr_type == EXPR_NULL)
3311 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
3312 else if (cm->allocatable)
3314 tree tmp2;
3316 gfc_init_se (&se, NULL);
3318 rss = gfc_walk_expr (expr);
3319 se.want_pointer = 0;
3320 gfc_conv_expr_descriptor (&se, expr, rss);
3321 gfc_add_block_to_block (&block, &se.pre);
3323 tmp = fold_convert (TREE_TYPE (dest), se.expr);
3324 gfc_add_modify_expr (&block, dest, tmp);
3326 if (cm->ts.type == BT_DERIVED && cm->ts.derived->attr.alloc_comp)
3327 tmp = gfc_copy_alloc_comp (cm->ts.derived, se.expr, dest,
3328 cm->as->rank);
3329 else
3330 tmp = gfc_duplicate_allocatable (dest, se.expr,
3331 TREE_TYPE(cm->backend_decl),
3332 cm->as->rank);
3334 gfc_add_expr_to_block (&block, tmp);
3336 gfc_add_block_to_block (&block, &se.post);
3337 gfc_conv_descriptor_data_set (&block, se.expr, null_pointer_node);
3339 /* Shift the lbound and ubound of temporaries to being unity, rather
3340 than zero, based. Calculate the offset for all cases. */
3341 offset = gfc_conv_descriptor_offset (dest);
3342 gfc_add_modify_expr (&block, offset, gfc_index_zero_node);
3343 tmp2 =gfc_create_var (gfc_array_index_type, NULL);
3344 for (n = 0; n < expr->rank; n++)
3346 if (expr->expr_type != EXPR_VARIABLE
3347 && expr->expr_type != EXPR_CONSTANT)
3349 tree span;
3350 tmp = gfc_conv_descriptor_ubound (dest, gfc_rank_cst[n]);
3351 span = fold_build2 (MINUS_EXPR, gfc_array_index_type, tmp,
3352 gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]));
3353 gfc_add_modify_expr (&block, tmp,
3354 fold_build2 (PLUS_EXPR,
3355 gfc_array_index_type,
3356 span, gfc_index_one_node));
3357 tmp = gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]);
3358 gfc_add_modify_expr (&block, tmp, gfc_index_one_node);
3360 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
3361 gfc_conv_descriptor_lbound (dest,
3362 gfc_rank_cst[n]),
3363 gfc_conv_descriptor_stride (dest,
3364 gfc_rank_cst[n]));
3365 gfc_add_modify_expr (&block, tmp2, tmp);
3366 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
3367 gfc_add_modify_expr (&block, offset, tmp);
3370 else
3372 tmp = gfc_trans_subarray_assign (dest, cm, expr);
3373 gfc_add_expr_to_block (&block, tmp);
3376 else if (expr->ts.type == BT_DERIVED)
3378 if (expr->expr_type != EXPR_STRUCTURE)
3380 gfc_init_se (&se, NULL);
3381 gfc_conv_expr (&se, expr);
3382 gfc_add_modify_expr (&block, dest,
3383 fold_convert (TREE_TYPE (dest), se.expr));
3385 else
3387 /* Nested constructors. */
3388 tmp = gfc_trans_structure_assign (dest, expr);
3389 gfc_add_expr_to_block (&block, tmp);
3392 else
3394 /* Scalar component. */
3395 gfc_init_se (&se, NULL);
3396 gfc_init_se (&lse, NULL);
3398 gfc_conv_expr (&se, expr);
3399 if (cm->ts.type == BT_CHARACTER)
3400 lse.string_length = cm->ts.cl->backend_decl;
3401 lse.expr = dest;
3402 tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
3403 gfc_add_expr_to_block (&block, tmp);
3405 return gfc_finish_block (&block);
3408 /* Assign a derived type constructor to a variable. */
3410 static tree
3411 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
3413 gfc_constructor *c;
3414 gfc_component *cm;
3415 stmtblock_t block;
3416 tree field;
3417 tree tmp;
3419 gfc_start_block (&block);
3420 cm = expr->ts.derived->components;
3421 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3423 /* Skip absent members in default initializers. */
3424 if (!c->expr)
3425 continue;
3427 /* Update the type/kind of the expression if it represents either
3428 C_NULL_PTR or C_NULL_FUNPTR. This is done here because this may
3429 be the first place reached for initializing output variables that
3430 have components of type C_PTR/C_FUNPTR that are initialized. */
3431 if (c->expr->ts.type == BT_DERIVED && c->expr->ts.derived
3432 && c->expr->ts.derived->attr.is_iso_c)
3434 c->expr->expr_type = EXPR_NULL;
3435 c->expr->ts.type = c->expr->ts.derived->ts.type;
3436 c->expr->ts.f90_type = c->expr->ts.derived->ts.f90_type;
3437 c->expr->ts.kind = c->expr->ts.derived->ts.kind;
3440 field = cm->backend_decl;
3441 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
3442 dest, field, NULL_TREE);
3443 tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
3444 gfc_add_expr_to_block (&block, tmp);
3446 return gfc_finish_block (&block);
3449 /* Build an expression for a constructor. If init is nonzero then
3450 this is part of a static variable initializer. */
3452 void
3453 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
3455 gfc_constructor *c;
3456 gfc_component *cm;
3457 tree val;
3458 tree type;
3459 tree tmp;
3460 VEC(constructor_elt,gc) *v = NULL;
3462 gcc_assert (se->ss == NULL);
3463 gcc_assert (expr->expr_type == EXPR_STRUCTURE);
3464 type = gfc_typenode_for_spec (&expr->ts);
3466 if (!init)
3468 /* Create a temporary variable and fill it in. */
3469 se->expr = gfc_create_var (type, expr->ts.derived->name);
3470 tmp = gfc_trans_structure_assign (se->expr, expr);
3471 gfc_add_expr_to_block (&se->pre, tmp);
3472 return;
3475 cm = expr->ts.derived->components;
3477 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3479 /* Skip absent members in default initializers and allocatable
3480 components. Although the latter have a default initializer
3481 of EXPR_NULL,... by default, the static nullify is not needed
3482 since this is done every time we come into scope. */
3483 if (!c->expr || cm->allocatable)
3484 continue;
3486 val = gfc_conv_initializer (c->expr, &cm->ts,
3487 TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer);
3489 /* Append it to the constructor list. */
3490 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
3492 se->expr = build_constructor (type, v);
3493 if (init)
3494 TREE_CONSTANT (se->expr) = 1;
3498 /* Translate a substring expression. */
3500 static void
3501 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
3503 gfc_ref *ref;
3504 char *s;
3506 ref = expr->ref;
3508 gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
3510 gcc_assert (expr->ts.kind == gfc_default_character_kind);
3511 s = gfc_widechar_to_char (expr->value.character.string,
3512 expr->value.character.length);
3513 se->expr = gfc_build_string_const (expr->value.character.length, s);
3514 gfc_free (s);
3516 se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
3517 TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
3519 if (ref)
3520 gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
3524 /* Entry point for expression translation. Evaluates a scalar quantity.
3525 EXPR is the expression to be translated, and SE is the state structure if
3526 called from within the scalarized. */
3528 void
3529 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
3531 if (se->ss && se->ss->expr == expr
3532 && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
3534 /* Substitute a scalar expression evaluated outside the scalarization
3535 loop. */
3536 se->expr = se->ss->data.scalar.expr;
3537 se->string_length = se->ss->string_length;
3538 gfc_advance_se_ss_chain (se);
3539 return;
3542 /* We need to convert the expressions for the iso_c_binding derived types.
3543 C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
3544 null_pointer_node. C_PTR and C_FUNPTR are converted to match the
3545 typespec for the C_PTR and C_FUNPTR symbols, which has already been
3546 updated to be an integer with a kind equal to the size of a (void *). */
3547 if (expr->ts.type == BT_DERIVED && expr->ts.derived
3548 && expr->ts.derived->attr.is_iso_c)
3550 if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
3551 || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR)
3553 /* Set expr_type to EXPR_NULL, which will result in
3554 null_pointer_node being used below. */
3555 expr->expr_type = EXPR_NULL;
3557 else
3559 /* Update the type/kind of the expression to be what the new
3560 type/kind are for the updated symbols of C_PTR/C_FUNPTR. */
3561 expr->ts.type = expr->ts.derived->ts.type;
3562 expr->ts.f90_type = expr->ts.derived->ts.f90_type;
3563 expr->ts.kind = expr->ts.derived->ts.kind;
3567 switch (expr->expr_type)
3569 case EXPR_OP:
3570 gfc_conv_expr_op (se, expr);
3571 break;
3573 case EXPR_FUNCTION:
3574 gfc_conv_function_expr (se, expr);
3575 break;
3577 case EXPR_CONSTANT:
3578 gfc_conv_constant (se, expr);
3579 break;
3581 case EXPR_VARIABLE:
3582 gfc_conv_variable (se, expr);
3583 break;
3585 case EXPR_NULL:
3586 se->expr = null_pointer_node;
3587 break;
3589 case EXPR_SUBSTRING:
3590 gfc_conv_substring_expr (se, expr);
3591 break;
3593 case EXPR_STRUCTURE:
3594 gfc_conv_structure (se, expr, 0);
3595 break;
3597 case EXPR_ARRAY:
3598 gfc_conv_array_constructor_expr (se, expr);
3599 break;
3601 default:
3602 gcc_unreachable ();
3603 break;
3607 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
3608 of an assignment. */
3609 void
3610 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
3612 gfc_conv_expr (se, expr);
3613 /* All numeric lvalues should have empty post chains. If not we need to
3614 figure out a way of rewriting an lvalue so that it has no post chain. */
3615 gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
3618 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
3619 numeric expressions. Used for scalar values where inserting cleanup code
3620 is inconvenient. */
3621 void
3622 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
3624 tree val;
3626 gcc_assert (expr->ts.type != BT_CHARACTER);
3627 gfc_conv_expr (se, expr);
3628 if (se->post.head)
3630 val = gfc_create_var (TREE_TYPE (se->expr), NULL);
3631 gfc_add_modify_expr (&se->pre, val, se->expr);
3632 se->expr = val;
3633 gfc_add_block_to_block (&se->pre, &se->post);
3637 /* Helper to translate an expression and convert it to a particular type. */
3638 void
3639 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
3641 gfc_conv_expr_val (se, expr);
3642 se->expr = convert (type, se->expr);
3646 /* Converts an expression so that it can be passed by reference. Scalar
3647 values only. */
3649 void
3650 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
3652 tree var;
3654 if (se->ss && se->ss->expr == expr
3655 && se->ss->type == GFC_SS_REFERENCE)
3657 se->expr = se->ss->data.scalar.expr;
3658 se->string_length = se->ss->string_length;
3659 gfc_advance_se_ss_chain (se);
3660 return;
3663 if (expr->ts.type == BT_CHARACTER)
3665 gfc_conv_expr (se, expr);
3666 gfc_conv_string_parameter (se);
3667 return;
3670 if (expr->expr_type == EXPR_VARIABLE)
3672 se->want_pointer = 1;
3673 gfc_conv_expr (se, expr);
3674 if (se->post.head)
3676 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3677 gfc_add_modify_expr (&se->pre, var, se->expr);
3678 gfc_add_block_to_block (&se->pre, &se->post);
3679 se->expr = var;
3681 return;
3684 if (expr->expr_type == EXPR_FUNCTION
3685 && expr->symtree->n.sym->attr.pointer
3686 && !expr->symtree->n.sym->attr.dimension)
3688 se->want_pointer = 1;
3689 gfc_conv_expr (se, expr);
3690 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3691 gfc_add_modify_expr (&se->pre, var, se->expr);
3692 se->expr = var;
3693 return;
3697 gfc_conv_expr (se, expr);
3699 /* Create a temporary var to hold the value. */
3700 if (TREE_CONSTANT (se->expr))
3702 tree tmp = se->expr;
3703 STRIP_TYPE_NOPS (tmp);
3704 var = build_decl (CONST_DECL, NULL, TREE_TYPE (tmp));
3705 DECL_INITIAL (var) = tmp;
3706 TREE_STATIC (var) = 1;
3707 pushdecl (var);
3709 else
3711 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3712 gfc_add_modify_expr (&se->pre, var, se->expr);
3714 gfc_add_block_to_block (&se->pre, &se->post);
3716 /* Take the address of that value. */
3717 se->expr = build_fold_addr_expr (var);
3721 tree
3722 gfc_trans_pointer_assign (gfc_code * code)
3724 return gfc_trans_pointer_assignment (code->expr, code->expr2);
3728 /* Generate code for a pointer assignment. */
3730 tree
3731 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
3733 gfc_se lse;
3734 gfc_se rse;
3735 gfc_ss *lss;
3736 gfc_ss *rss;
3737 stmtblock_t block;
3738 tree desc;
3739 tree tmp;
3740 tree decl;
3743 gfc_start_block (&block);
3745 gfc_init_se (&lse, NULL);
3747 lss = gfc_walk_expr (expr1);
3748 rss = gfc_walk_expr (expr2);
3749 if (lss == gfc_ss_terminator)
3751 /* Scalar pointers. */
3752 lse.want_pointer = 1;
3753 gfc_conv_expr (&lse, expr1);
3754 gcc_assert (rss == gfc_ss_terminator);
3755 gfc_init_se (&rse, NULL);
3756 rse.want_pointer = 1;
3757 gfc_conv_expr (&rse, expr2);
3758 gfc_add_block_to_block (&block, &lse.pre);
3759 gfc_add_block_to_block (&block, &rse.pre);
3760 gfc_add_modify_expr (&block, lse.expr,
3761 fold_convert (TREE_TYPE (lse.expr), rse.expr));
3762 gfc_add_block_to_block (&block, &rse.post);
3763 gfc_add_block_to_block (&block, &lse.post);
3765 else
3767 /* Array pointer. */
3768 gfc_conv_expr_descriptor (&lse, expr1, lss);
3769 switch (expr2->expr_type)
3771 case EXPR_NULL:
3772 /* Just set the data pointer to null. */
3773 gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
3774 break;
3776 case EXPR_VARIABLE:
3777 /* Assign directly to the pointer's descriptor. */
3778 lse.direct_byref = 1;
3779 gfc_conv_expr_descriptor (&lse, expr2, rss);
3781 /* If this is a subreference array pointer assignment, use the rhs
3782 descriptor element size for the lhs span. */
3783 if (expr1->symtree->n.sym->attr.subref_array_pointer)
3785 decl = expr1->symtree->n.sym->backend_decl;
3786 gfc_init_se (&rse, NULL);
3787 rse.descriptor_only = 1;
3788 gfc_conv_expr (&rse, expr2);
3789 tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
3790 tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
3791 if (!INTEGER_CST_P (tmp))
3792 gfc_add_block_to_block (&lse.post, &rse.pre);
3793 gfc_add_modify_expr (&lse.post, GFC_DECL_SPAN(decl), tmp);
3796 break;
3798 default:
3799 /* Assign to a temporary descriptor and then copy that
3800 temporary to the pointer. */
3801 desc = lse.expr;
3802 tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
3804 lse.expr = tmp;
3805 lse.direct_byref = 1;
3806 gfc_conv_expr_descriptor (&lse, expr2, rss);
3807 gfc_add_modify_expr (&lse.pre, desc, tmp);
3808 break;
3810 gfc_add_block_to_block (&block, &lse.pre);
3811 gfc_add_block_to_block (&block, &lse.post);
3813 return gfc_finish_block (&block);
3817 /* Makes sure se is suitable for passing as a function string parameter. */
3818 /* TODO: Need to check all callers fo this function. It may be abused. */
3820 void
3821 gfc_conv_string_parameter (gfc_se * se)
3823 tree type;
3825 if (TREE_CODE (se->expr) == STRING_CST)
3827 se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3828 return;
3831 type = TREE_TYPE (se->expr);
3832 if (TYPE_STRING_FLAG (type))
3834 if (TREE_CODE (se->expr) != INDIRECT_REF)
3835 se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3836 else
3838 type = gfc_get_character_type_len (gfc_default_character_kind,
3839 se->string_length);
3840 type = build_pointer_type (type);
3841 se->expr = gfc_build_addr_expr (type, se->expr);
3845 gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
3846 gcc_assert (se->string_length
3847 && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
3851 /* Generate code for assignment of scalar variables. Includes character
3852 strings and derived types with allocatable components. */
3854 tree
3855 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
3856 bool l_is_temp, bool r_is_var)
3858 stmtblock_t block;
3859 tree tmp;
3860 tree cond;
3862 gfc_init_block (&block);
3864 if (ts.type == BT_CHARACTER)
3866 tree rlen = NULL;
3867 tree llen = NULL;
3869 if (lse->string_length != NULL_TREE)
3871 gfc_conv_string_parameter (lse);
3872 gfc_add_block_to_block (&block, &lse->pre);
3873 llen = lse->string_length;
3876 if (rse->string_length != NULL_TREE)
3878 gcc_assert (rse->string_length != NULL_TREE);
3879 gfc_conv_string_parameter (rse);
3880 gfc_add_block_to_block (&block, &rse->pre);
3881 rlen = rse->string_length;
3884 gfc_trans_string_copy (&block, llen, lse->expr, rlen, rse->expr);
3886 else if (ts.type == BT_DERIVED && ts.derived->attr.alloc_comp)
3888 cond = NULL_TREE;
3890 /* Are the rhs and the lhs the same? */
3891 if (r_is_var)
3893 cond = fold_build2 (EQ_EXPR, boolean_type_node,
3894 build_fold_addr_expr (lse->expr),
3895 build_fold_addr_expr (rse->expr));
3896 cond = gfc_evaluate_now (cond, &lse->pre);
3899 /* Deallocate the lhs allocated components as long as it is not
3900 the same as the rhs. This must be done following the assignment
3901 to prevent deallocating data that could be used in the rhs
3902 expression. */
3903 if (!l_is_temp)
3905 tmp = gfc_evaluate_now (lse->expr, &lse->pre);
3906 tmp = gfc_deallocate_alloc_comp (ts.derived, tmp, 0);
3907 if (r_is_var)
3908 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
3909 gfc_add_expr_to_block (&lse->post, tmp);
3912 gfc_add_block_to_block (&block, &rse->pre);
3913 gfc_add_block_to_block (&block, &lse->pre);
3915 gfc_add_modify_expr (&block, lse->expr,
3916 fold_convert (TREE_TYPE (lse->expr), rse->expr));
3918 /* Do a deep copy if the rhs is a variable, if it is not the
3919 same as the lhs. */
3920 if (r_is_var)
3922 tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
3923 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
3924 gfc_add_expr_to_block (&block, tmp);
3927 else
3929 gfc_add_block_to_block (&block, &lse->pre);
3930 gfc_add_block_to_block (&block, &rse->pre);
3932 gfc_add_modify_expr (&block, lse->expr,
3933 fold_convert (TREE_TYPE (lse->expr), rse->expr));
3936 gfc_add_block_to_block (&block, &lse->post);
3937 gfc_add_block_to_block (&block, &rse->post);
3939 return gfc_finish_block (&block);
3943 /* Try to translate array(:) = func (...), where func is a transformational
3944 array function, without using a temporary. Returns NULL is this isn't the
3945 case. */
3947 static tree
3948 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
3950 gfc_se se;
3951 gfc_ss *ss;
3952 gfc_ref * ref;
3953 bool seen_array_ref;
3955 /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
3956 if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
3957 return NULL;
3959 /* Elemental functions don't need a temporary anyway. */
3960 if (expr2->value.function.esym != NULL
3961 && expr2->value.function.esym->attr.elemental)
3962 return NULL;
3964 /* Fail if EXPR1 can't be expressed as a descriptor. */
3965 if (gfc_ref_needs_temporary_p (expr1->ref))
3966 return NULL;
3968 /* Functions returning pointers need temporaries. */
3969 if (expr2->symtree->n.sym->attr.pointer
3970 || expr2->symtree->n.sym->attr.allocatable)
3971 return NULL;
3973 /* Character array functions need temporaries unless the
3974 character lengths are the same. */
3975 if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
3977 if (expr1->ts.cl->length == NULL
3978 || expr1->ts.cl->length->expr_type != EXPR_CONSTANT)
3979 return NULL;
3981 if (expr2->ts.cl->length == NULL
3982 || expr2->ts.cl->length->expr_type != EXPR_CONSTANT)
3983 return NULL;
3985 if (mpz_cmp (expr1->ts.cl->length->value.integer,
3986 expr2->ts.cl->length->value.integer) != 0)
3987 return NULL;
3990 /* Check that no LHS component references appear during an array
3991 reference. This is needed because we do not have the means to
3992 span any arbitrary stride with an array descriptor. This check
3993 is not needed for the rhs because the function result has to be
3994 a complete type. */
3995 seen_array_ref = false;
3996 for (ref = expr1->ref; ref; ref = ref->next)
3998 if (ref->type == REF_ARRAY)
3999 seen_array_ref= true;
4000 else if (ref->type == REF_COMPONENT && seen_array_ref)
4001 return NULL;
4004 /* Check for a dependency. */
4005 if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
4006 expr2->value.function.esym,
4007 expr2->value.function.actual))
4008 return NULL;
4010 /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
4011 functions. */
4012 gcc_assert (expr2->value.function.isym
4013 || (gfc_return_by_reference (expr2->value.function.esym)
4014 && expr2->value.function.esym->result->attr.dimension));
4016 ss = gfc_walk_expr (expr1);
4017 gcc_assert (ss != gfc_ss_terminator);
4018 gfc_init_se (&se, NULL);
4019 gfc_start_block (&se.pre);
4020 se.want_pointer = 1;
4022 gfc_conv_array_parameter (&se, expr1, ss, 0);
4024 se.direct_byref = 1;
4025 se.ss = gfc_walk_expr (expr2);
4026 gcc_assert (se.ss != gfc_ss_terminator);
4027 gfc_conv_function_expr (&se, expr2);
4028 gfc_add_block_to_block (&se.pre, &se.post);
4030 return gfc_finish_block (&se.pre);
4033 /* Determine whether the given EXPR_CONSTANT is a zero initializer. */
4035 static bool
4036 is_zero_initializer_p (gfc_expr * expr)
4038 if (expr->expr_type != EXPR_CONSTANT)
4039 return false;
4041 /* We ignore constants with prescribed memory representations for now. */
4042 if (expr->representation.string)
4043 return false;
4045 switch (expr->ts.type)
4047 case BT_INTEGER:
4048 return mpz_cmp_si (expr->value.integer, 0) == 0;
4050 case BT_REAL:
4051 return mpfr_zero_p (expr->value.real)
4052 && MPFR_SIGN (expr->value.real) >= 0;
4054 case BT_LOGICAL:
4055 return expr->value.logical == 0;
4057 case BT_COMPLEX:
4058 return mpfr_zero_p (expr->value.complex.r)
4059 && MPFR_SIGN (expr->value.complex.r) >= 0
4060 && mpfr_zero_p (expr->value.complex.i)
4061 && MPFR_SIGN (expr->value.complex.i) >= 0;
4063 default:
4064 break;
4066 return false;
4069 /* Try to efficiently translate array(:) = 0. Return NULL if this
4070 can't be done. */
4072 static tree
4073 gfc_trans_zero_assign (gfc_expr * expr)
4075 tree dest, len, type;
4076 tree tmp;
4077 gfc_symbol *sym;
4079 sym = expr->symtree->n.sym;
4080 dest = gfc_get_symbol_decl (sym);
4082 type = TREE_TYPE (dest);
4083 if (POINTER_TYPE_P (type))
4084 type = TREE_TYPE (type);
4085 if (!GFC_ARRAY_TYPE_P (type))
4086 return NULL_TREE;
4088 /* Determine the length of the array. */
4089 len = GFC_TYPE_ARRAY_SIZE (type);
4090 if (!len || TREE_CODE (len) != INTEGER_CST)
4091 return NULL_TREE;
4093 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
4094 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4095 fold_convert (gfc_array_index_type, tmp));
4097 /* Convert arguments to the correct types. */
4098 if (!POINTER_TYPE_P (TREE_TYPE (dest)))
4099 dest = gfc_build_addr_expr (pvoid_type_node, dest);
4100 else
4101 dest = fold_convert (pvoid_type_node, dest);
4102 len = fold_convert (size_type_node, len);
4104 /* Construct call to __builtin_memset. */
4105 tmp = build_call_expr (built_in_decls[BUILT_IN_MEMSET],
4106 3, dest, integer_zero_node, len);
4107 return fold_convert (void_type_node, tmp);
4111 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
4112 that constructs the call to __builtin_memcpy. */
4114 static tree
4115 gfc_build_memcpy_call (tree dst, tree src, tree len)
4117 tree tmp;
4119 /* Convert arguments to the correct types. */
4120 if (!POINTER_TYPE_P (TREE_TYPE (dst)))
4121 dst = gfc_build_addr_expr (pvoid_type_node, dst);
4122 else
4123 dst = fold_convert (pvoid_type_node, dst);
4125 if (!POINTER_TYPE_P (TREE_TYPE (src)))
4126 src = gfc_build_addr_expr (pvoid_type_node, src);
4127 else
4128 src = fold_convert (pvoid_type_node, src);
4130 len = fold_convert (size_type_node, len);
4132 /* Construct call to __builtin_memcpy. */
4133 tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY], 3, dst, src, len);
4134 return fold_convert (void_type_node, tmp);
4138 /* Try to efficiently translate dst(:) = src(:). Return NULL if this
4139 can't be done. EXPR1 is the destination/lhs and EXPR2 is the
4140 source/rhs, both are gfc_full_array_ref_p which have been checked for
4141 dependencies. */
4143 static tree
4144 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
4146 tree dst, dlen, dtype;
4147 tree src, slen, stype;
4148 tree tmp;
4150 dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
4151 src = gfc_get_symbol_decl (expr2->symtree->n.sym);
4153 dtype = TREE_TYPE (dst);
4154 if (POINTER_TYPE_P (dtype))
4155 dtype = TREE_TYPE (dtype);
4156 stype = TREE_TYPE (src);
4157 if (POINTER_TYPE_P (stype))
4158 stype = TREE_TYPE (stype);
4160 if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
4161 return NULL_TREE;
4163 /* Determine the lengths of the arrays. */
4164 dlen = GFC_TYPE_ARRAY_SIZE (dtype);
4165 if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
4166 return NULL_TREE;
4167 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
4168 dlen = fold_build2 (MULT_EXPR, gfc_array_index_type, dlen,
4169 fold_convert (gfc_array_index_type, tmp));
4171 slen = GFC_TYPE_ARRAY_SIZE (stype);
4172 if (!slen || TREE_CODE (slen) != INTEGER_CST)
4173 return NULL_TREE;
4174 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
4175 slen = fold_build2 (MULT_EXPR, gfc_array_index_type, slen,
4176 fold_convert (gfc_array_index_type, tmp));
4178 /* Sanity check that they are the same. This should always be
4179 the case, as we should already have checked for conformance. */
4180 if (!tree_int_cst_equal (slen, dlen))
4181 return NULL_TREE;
4183 return gfc_build_memcpy_call (dst, src, dlen);
4187 /* Try to efficiently translate array(:) = (/ ... /). Return NULL if
4188 this can't be done. EXPR1 is the destination/lhs for which
4189 gfc_full_array_ref_p is true, and EXPR2 is the source/rhs. */
4191 static tree
4192 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
4194 unsigned HOST_WIDE_INT nelem;
4195 tree dst, dtype;
4196 tree src, stype;
4197 tree len;
4198 tree tmp;
4200 nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
4201 if (nelem == 0)
4202 return NULL_TREE;
4204 dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
4205 dtype = TREE_TYPE (dst);
4206 if (POINTER_TYPE_P (dtype))
4207 dtype = TREE_TYPE (dtype);
4208 if (!GFC_ARRAY_TYPE_P (dtype))
4209 return NULL_TREE;
4211 /* Determine the lengths of the array. */
4212 len = GFC_TYPE_ARRAY_SIZE (dtype);
4213 if (!len || TREE_CODE (len) != INTEGER_CST)
4214 return NULL_TREE;
4216 /* Confirm that the constructor is the same size. */
4217 if (compare_tree_int (len, nelem) != 0)
4218 return NULL_TREE;
4220 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
4221 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4222 fold_convert (gfc_array_index_type, tmp));
4224 stype = gfc_typenode_for_spec (&expr2->ts);
4225 src = gfc_build_constant_array_constructor (expr2, stype);
4227 stype = TREE_TYPE (src);
4228 if (POINTER_TYPE_P (stype))
4229 stype = TREE_TYPE (stype);
4231 return gfc_build_memcpy_call (dst, src, len);
4235 /* Subroutine of gfc_trans_assignment that actually scalarizes the
4236 assignment. EXPR1 is the destination/RHS and EXPR2 is the source/LHS. */
4238 static tree
4239 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
4241 gfc_se lse;
4242 gfc_se rse;
4243 gfc_ss *lss;
4244 gfc_ss *lss_section;
4245 gfc_ss *rss;
4246 gfc_loopinfo loop;
4247 tree tmp;
4248 stmtblock_t block;
4249 stmtblock_t body;
4250 bool l_is_temp;
4252 /* Assignment of the form lhs = rhs. */
4253 gfc_start_block (&block);
4255 gfc_init_se (&lse, NULL);
4256 gfc_init_se (&rse, NULL);
4258 /* Walk the lhs. */
4259 lss = gfc_walk_expr (expr1);
4260 rss = NULL;
4261 if (lss != gfc_ss_terminator)
4263 /* The assignment needs scalarization. */
4264 lss_section = lss;
4266 /* Find a non-scalar SS from the lhs. */
4267 while (lss_section != gfc_ss_terminator
4268 && lss_section->type != GFC_SS_SECTION)
4269 lss_section = lss_section->next;
4271 gcc_assert (lss_section != gfc_ss_terminator);
4273 /* Initialize the scalarizer. */
4274 gfc_init_loopinfo (&loop);
4276 /* Walk the rhs. */
4277 rss = gfc_walk_expr (expr2);
4278 if (rss == gfc_ss_terminator)
4280 /* The rhs is scalar. Add a ss for the expression. */
4281 rss = gfc_get_ss ();
4282 rss->next = gfc_ss_terminator;
4283 rss->type = GFC_SS_SCALAR;
4284 rss->expr = expr2;
4286 /* Associate the SS with the loop. */
4287 gfc_add_ss_to_loop (&loop, lss);
4288 gfc_add_ss_to_loop (&loop, rss);
4290 /* Calculate the bounds of the scalarization. */
4291 gfc_conv_ss_startstride (&loop);
4292 /* Resolve any data dependencies in the statement. */
4293 gfc_conv_resolve_dependencies (&loop, lss, rss);
4294 /* Setup the scalarizing loops. */
4295 gfc_conv_loop_setup (&loop);
4297 /* Setup the gfc_se structures. */
4298 gfc_copy_loopinfo_to_se (&lse, &loop);
4299 gfc_copy_loopinfo_to_se (&rse, &loop);
4301 rse.ss = rss;
4302 gfc_mark_ss_chain_used (rss, 1);
4303 if (loop.temp_ss == NULL)
4305 lse.ss = lss;
4306 gfc_mark_ss_chain_used (lss, 1);
4308 else
4310 lse.ss = loop.temp_ss;
4311 gfc_mark_ss_chain_used (lss, 3);
4312 gfc_mark_ss_chain_used (loop.temp_ss, 3);
4315 /* Start the scalarized loop body. */
4316 gfc_start_scalarized_body (&loop, &body);
4318 else
4319 gfc_init_block (&body);
4321 l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
4323 /* Translate the expression. */
4324 gfc_conv_expr (&rse, expr2);
4326 if (l_is_temp)
4328 gfc_conv_tmp_array_ref (&lse);
4329 gfc_advance_se_ss_chain (&lse);
4331 else
4332 gfc_conv_expr (&lse, expr1);
4334 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
4335 l_is_temp || init_flag,
4336 expr2->expr_type == EXPR_VARIABLE);
4337 gfc_add_expr_to_block (&body, tmp);
4339 if (lss == gfc_ss_terminator)
4341 /* Use the scalar assignment as is. */
4342 gfc_add_block_to_block (&block, &body);
4344 else
4346 gcc_assert (lse.ss == gfc_ss_terminator
4347 && rse.ss == gfc_ss_terminator);
4349 if (l_is_temp)
4351 gfc_trans_scalarized_loop_boundary (&loop, &body);
4353 /* We need to copy the temporary to the actual lhs. */
4354 gfc_init_se (&lse, NULL);
4355 gfc_init_se (&rse, NULL);
4356 gfc_copy_loopinfo_to_se (&lse, &loop);
4357 gfc_copy_loopinfo_to_se (&rse, &loop);
4359 rse.ss = loop.temp_ss;
4360 lse.ss = lss;
4362 gfc_conv_tmp_array_ref (&rse);
4363 gfc_advance_se_ss_chain (&rse);
4364 gfc_conv_expr (&lse, expr1);
4366 gcc_assert (lse.ss == gfc_ss_terminator
4367 && rse.ss == gfc_ss_terminator);
4369 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
4370 false, false);
4371 gfc_add_expr_to_block (&body, tmp);
4374 /* Generate the copying loops. */
4375 gfc_trans_scalarizing_loops (&loop, &body);
4377 /* Wrap the whole thing up. */
4378 gfc_add_block_to_block (&block, &loop.pre);
4379 gfc_add_block_to_block (&block, &loop.post);
4381 gfc_cleanup_loop (&loop);
4384 return gfc_finish_block (&block);
4388 /* Check whether EXPR is a copyable array. */
4390 static bool
4391 copyable_array_p (gfc_expr * expr)
4393 if (expr->expr_type != EXPR_VARIABLE)
4394 return false;
4396 /* First check it's an array. */
4397 if (expr->rank < 1 || !expr->ref || expr->ref->next)
4398 return false;
4400 if (!gfc_full_array_ref_p (expr->ref))
4401 return false;
4403 /* Next check that it's of a simple enough type. */
4404 switch (expr->ts.type)
4406 case BT_INTEGER:
4407 case BT_REAL:
4408 case BT_COMPLEX:
4409 case BT_LOGICAL:
4410 return true;
4412 case BT_CHARACTER:
4413 return false;
4415 case BT_DERIVED:
4416 return !expr->ts.derived->attr.alloc_comp;
4418 default:
4419 break;
4422 return false;
4425 /* Translate an assignment. */
4427 tree
4428 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
4430 tree tmp;
4432 /* Special case a single function returning an array. */
4433 if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
4435 tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
4436 if (tmp)
4437 return tmp;
4440 /* Special case assigning an array to zero. */
4441 if (copyable_array_p (expr1)
4442 && is_zero_initializer_p (expr2))
4444 tmp = gfc_trans_zero_assign (expr1);
4445 if (tmp)
4446 return tmp;
4449 /* Special case copying one array to another. */
4450 if (copyable_array_p (expr1)
4451 && copyable_array_p (expr2)
4452 && gfc_compare_types (&expr1->ts, &expr2->ts)
4453 && !gfc_check_dependency (expr1, expr2, 0))
4455 tmp = gfc_trans_array_copy (expr1, expr2);
4456 if (tmp)
4457 return tmp;
4460 /* Special case initializing an array from a constant array constructor. */
4461 if (copyable_array_p (expr1)
4462 && expr2->expr_type == EXPR_ARRAY
4463 && gfc_compare_types (&expr1->ts, &expr2->ts))
4465 tmp = gfc_trans_array_constructor_copy (expr1, expr2);
4466 if (tmp)
4467 return tmp;
4470 /* Fallback to the scalarizer to generate explicit loops. */
4471 return gfc_trans_assignment_1 (expr1, expr2, init_flag);
4474 tree
4475 gfc_trans_init_assign (gfc_code * code)
4477 return gfc_trans_assignment (code->expr, code->expr2, true);
4480 tree
4481 gfc_trans_assign (gfc_code * code)
4483 return gfc_trans_assignment (code->expr, code->expr2, false);