re PR fortran/23060 (%VAL, %REF and %DESCR constructs not implemented)
[gcc.git] / gcc / fortran / trans-expr.c
1 /* Expression translation
2 Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Paul Brook <paul@nowt.org>
4 and Steven Bosscher <s.bosscher@student.tudelft.nl>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
22
23 /* trans-expr.c-- generate GENERIC trees for gfc_expr. */
24
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 "trans.h"
38 #include "trans-const.h"
39 #include "trans-types.h"
40 #include "trans-array.h"
41 /* Only for gfc_trans_assign and gfc_trans_pointer_assign. */
42 #include "trans-stmt.h"
43 #include "dependency.h"
44
45 static tree gfc_trans_structure_assign (tree dest, gfc_expr * expr);
46 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
47 gfc_expr *);
48
49 /* Copy the scalarization loop variables. */
50
51 static void
52 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
53 {
54 dest->ss = src->ss;
55 dest->loop = src->loop;
56 }
57
58
59 /* Initialize a simple expression holder.
60
61 Care must be taken when multiple se are created with the same parent.
62 The child se must be kept in sync. The easiest way is to delay creation
63 of a child se until after after the previous se has been translated. */
64
65 void
66 gfc_init_se (gfc_se * se, gfc_se * parent)
67 {
68 memset (se, 0, sizeof (gfc_se));
69 gfc_init_block (&se->pre);
70 gfc_init_block (&se->post);
71
72 se->parent = parent;
73
74 if (parent)
75 gfc_copy_se_loopvars (se, parent);
76 }
77
78
79 /* Advances to the next SS in the chain. Use this rather than setting
80 se->ss = se->ss->next because all the parents needs to be kept in sync.
81 See gfc_init_se. */
82
83 void
84 gfc_advance_se_ss_chain (gfc_se * se)
85 {
86 gfc_se *p;
87
88 gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
89
90 p = se;
91 /* Walk down the parent chain. */
92 while (p != NULL)
93 {
94 /* Simple consistency check. */
95 gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
96
97 p->ss = p->ss->next;
98
99 p = p->parent;
100 }
101 }
102
103
104 /* Ensures the result of the expression as either a temporary variable
105 or a constant so that it can be used repeatedly. */
106
107 void
108 gfc_make_safe_expr (gfc_se * se)
109 {
110 tree var;
111
112 if (CONSTANT_CLASS_P (se->expr))
113 return;
114
115 /* We need a temporary for this result. */
116 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
117 gfc_add_modify_expr (&se->pre, var, se->expr);
118 se->expr = var;
119 }
120
121
122 /* Return an expression which determines if a dummy parameter is present.
123 Also used for arguments to procedures with multiple entry points. */
124
125 tree
126 gfc_conv_expr_present (gfc_symbol * sym)
127 {
128 tree decl;
129
130 gcc_assert (sym->attr.dummy);
131
132 decl = gfc_get_symbol_decl (sym);
133 if (TREE_CODE (decl) != PARM_DECL)
134 {
135 /* Array parameters use a temporary descriptor, we want the real
136 parameter. */
137 gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
138 || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
139 decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
140 }
141 return build2 (NE_EXPR, boolean_type_node, decl,
142 fold_convert (TREE_TYPE (decl), null_pointer_node));
143 }
144
145
146 /* Converts a missing, dummy argument into a null or zero. */
147
148 void
149 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts)
150 {
151 tree present;
152 tree tmp;
153
154 present = gfc_conv_expr_present (arg->symtree->n.sym);
155 tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
156 fold_convert (TREE_TYPE (se->expr), integer_zero_node));
157
158 tmp = gfc_evaluate_now (tmp, &se->pre);
159 se->expr = tmp;
160 if (ts.type == BT_CHARACTER)
161 {
162 tmp = build_int_cst (gfc_charlen_type_node, 0);
163 tmp = build3 (COND_EXPR, gfc_charlen_type_node, present,
164 se->string_length, tmp);
165 tmp = gfc_evaluate_now (tmp, &se->pre);
166 se->string_length = tmp;
167 }
168 return;
169 }
170
171
172 /* Get the character length of an expression, looking through gfc_refs
173 if necessary. */
174
175 tree
176 gfc_get_expr_charlen (gfc_expr *e)
177 {
178 gfc_ref *r;
179 tree length;
180
181 gcc_assert (e->expr_type == EXPR_VARIABLE
182 && e->ts.type == BT_CHARACTER);
183
184 length = NULL; /* To silence compiler warning. */
185
186 /* First candidate: if the variable is of type CHARACTER, the
187 expression's length could be the length of the character
188 variable. */
189 if (e->symtree->n.sym->ts.type == BT_CHARACTER)
190 length = e->symtree->n.sym->ts.cl->backend_decl;
191
192 /* Look through the reference chain for component references. */
193 for (r = e->ref; r; r = r->next)
194 {
195 switch (r->type)
196 {
197 case REF_COMPONENT:
198 if (r->u.c.component->ts.type == BT_CHARACTER)
199 length = r->u.c.component->ts.cl->backend_decl;
200 break;
201
202 case REF_ARRAY:
203 /* Do nothing. */
204 break;
205
206 default:
207 /* We should never got substring references here. These will be
208 broken down by the scalarizer. */
209 gcc_unreachable ();
210 }
211 }
212
213 gcc_assert (length != NULL);
214 return length;
215 }
216
217
218
219 /* Generate code to initialize a string length variable. Returns the
220 value. */
221
222 void
223 gfc_trans_init_string_length (gfc_charlen * cl, stmtblock_t * pblock)
224 {
225 gfc_se se;
226 tree tmp;
227
228 gfc_init_se (&se, NULL);
229 gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
230 gfc_add_block_to_block (pblock, &se.pre);
231
232 tmp = cl->backend_decl;
233 gfc_add_modify_expr (pblock, tmp, se.expr);
234 }
235
236
237 static void
238 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
239 const char *name, locus *where)
240 {
241 tree tmp;
242 tree type;
243 tree var;
244 tree fault;
245 gfc_se start;
246 gfc_se end;
247 char *msg;
248
249 type = gfc_get_character_type (kind, ref->u.ss.length);
250 type = build_pointer_type (type);
251
252 var = NULL_TREE;
253 gfc_init_se (&start, se);
254 gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
255 gfc_add_block_to_block (&se->pre, &start.pre);
256
257 if (integer_onep (start.expr))
258 gfc_conv_string_parameter (se);
259 else
260 {
261 /* Change the start of the string. */
262 if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
263 tmp = se->expr;
264 else
265 tmp = build_fold_indirect_ref (se->expr);
266 tmp = gfc_build_array_ref (tmp, start.expr);
267 se->expr = gfc_build_addr_expr (type, tmp);
268 }
269
270 /* Length = end + 1 - start. */
271 gfc_init_se (&end, se);
272 if (ref->u.ss.end == NULL)
273 end.expr = se->string_length;
274 else
275 {
276 gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
277 gfc_add_block_to_block (&se->pre, &end.pre);
278 }
279 if (flag_bounds_check)
280 {
281 tree nonempty = fold_build2 (LE_EXPR, boolean_type_node,
282 start.expr, end.expr);
283
284 /* Check lower bound. */
285 fault = fold_build2 (LT_EXPR, boolean_type_node, start.expr,
286 build_int_cst (gfc_charlen_type_node, 1));
287 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
288 nonempty, fault);
289 if (name)
290 asprintf (&msg, "Substring out of bounds: lower bound of '%s' "
291 "is less than one", name);
292 else
293 asprintf (&msg, "Substring out of bounds: lower bound "
294 "is less than one");
295 gfc_trans_runtime_check (fault, msg, &se->pre, where);
296 gfc_free (msg);
297
298 /* Check upper bound. */
299 fault = fold_build2 (GT_EXPR, boolean_type_node, end.expr,
300 se->string_length);
301 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
302 nonempty, fault);
303 if (name)
304 asprintf (&msg, "Substring out of bounds: upper bound of '%s' "
305 "exceeds string length", name);
306 else
307 asprintf (&msg, "Substring out of bounds: upper bound "
308 "exceeds string length");
309 gfc_trans_runtime_check (fault, msg, &se->pre, where);
310 gfc_free (msg);
311 }
312
313 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node,
314 build_int_cst (gfc_charlen_type_node, 1),
315 start.expr);
316 tmp = fold_build2 (PLUS_EXPR, gfc_charlen_type_node, end.expr, tmp);
317 tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
318 build_int_cst (gfc_charlen_type_node, 0));
319 se->string_length = tmp;
320 }
321
322
323 /* Convert a derived type component reference. */
324
325 static void
326 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
327 {
328 gfc_component *c;
329 tree tmp;
330 tree decl;
331 tree field;
332
333 c = ref->u.c.component;
334
335 gcc_assert (c->backend_decl);
336
337 field = c->backend_decl;
338 gcc_assert (TREE_CODE (field) == FIELD_DECL);
339 decl = se->expr;
340 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field, NULL_TREE);
341
342 se->expr = tmp;
343
344 if (c->ts.type == BT_CHARACTER)
345 {
346 tmp = c->ts.cl->backend_decl;
347 /* Components must always be constant length. */
348 gcc_assert (tmp && INTEGER_CST_P (tmp));
349 se->string_length = tmp;
350 }
351
352 if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER)
353 se->expr = build_fold_indirect_ref (se->expr);
354 }
355
356
357 /* Return the contents of a variable. Also handles reference/pointer
358 variables (all Fortran pointer references are implicit). */
359
360 static void
361 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
362 {
363 gfc_ref *ref;
364 gfc_symbol *sym;
365 tree parent_decl;
366 int parent_flag;
367 bool return_value;
368 bool alternate_entry;
369 bool entry_master;
370
371 sym = expr->symtree->n.sym;
372 if (se->ss != NULL)
373 {
374 /* Check that something hasn't gone horribly wrong. */
375 gcc_assert (se->ss != gfc_ss_terminator);
376 gcc_assert (se->ss->expr == expr);
377
378 /* A scalarized term. We already know the descriptor. */
379 se->expr = se->ss->data.info.descriptor;
380 se->string_length = se->ss->string_length;
381 for (ref = se->ss->data.info.ref; ref; ref = ref->next)
382 if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
383 break;
384 }
385 else
386 {
387 tree se_expr = NULL_TREE;
388
389 se->expr = gfc_get_symbol_decl (sym);
390
391 /* Deal with references to a parent results or entries by storing
392 the current_function_decl and moving to the parent_decl. */
393 return_value = sym->attr.function && sym->result == sym;
394 alternate_entry = sym->attr.function && sym->attr.entry
395 && sym->result == sym;
396 entry_master = sym->attr.result
397 && sym->ns->proc_name->attr.entry_master
398 && !gfc_return_by_reference (sym->ns->proc_name);
399 parent_decl = DECL_CONTEXT (current_function_decl);
400
401 if ((se->expr == parent_decl && return_value)
402 || (sym->ns && sym->ns->proc_name
403 && parent_decl
404 && sym->ns->proc_name->backend_decl == parent_decl
405 && (alternate_entry || entry_master)))
406 parent_flag = 1;
407 else
408 parent_flag = 0;
409
410 /* Special case for assigning the return value of a function.
411 Self recursive functions must have an explicit return value. */
412 if (return_value && (se->expr == current_function_decl || parent_flag))
413 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
414
415 /* Similarly for alternate entry points. */
416 else if (alternate_entry
417 && (sym->ns->proc_name->backend_decl == current_function_decl
418 || parent_flag))
419 {
420 gfc_entry_list *el = NULL;
421
422 for (el = sym->ns->entries; el; el = el->next)
423 if (sym == el->sym)
424 {
425 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
426 break;
427 }
428 }
429
430 else if (entry_master
431 && (sym->ns->proc_name->backend_decl == current_function_decl
432 || parent_flag))
433 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
434
435 if (se_expr)
436 se->expr = se_expr;
437
438 /* Procedure actual arguments. */
439 else if (sym->attr.flavor == FL_PROCEDURE
440 && se->expr != current_function_decl)
441 {
442 gcc_assert (se->want_pointer);
443 if (!sym->attr.dummy)
444 {
445 gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
446 se->expr = build_fold_addr_expr (se->expr);
447 }
448 return;
449 }
450
451
452 /* Dereference the expression, where needed. Since characters
453 are entirely different from other types, they are treated
454 separately. */
455 if (sym->ts.type == BT_CHARACTER)
456 {
457 /* Dereference character pointer dummy arguments
458 or results. */
459 if ((sym->attr.pointer || sym->attr.allocatable)
460 && (sym->attr.dummy
461 || sym->attr.function
462 || sym->attr.result))
463 se->expr = build_fold_indirect_ref (se->expr);
464
465 /* A character with VALUE attribute needs an address
466 expression. */
467 if (sym->attr.value)
468 se->expr = build_fold_addr_expr (se->expr);
469
470 }
471 else if (!sym->attr.value)
472 {
473 /* Dereference non-character scalar dummy arguments. */
474 if (sym->attr.dummy && !sym->attr.dimension)
475 se->expr = build_fold_indirect_ref (se->expr);
476
477 /* Dereference scalar hidden result. */
478 if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
479 && (sym->attr.function || sym->attr.result)
480 && !sym->attr.dimension && !sym->attr.pointer)
481 se->expr = build_fold_indirect_ref (se->expr);
482
483 /* Dereference non-character pointer variables.
484 These must be dummies, results, or scalars. */
485 if ((sym->attr.pointer || sym->attr.allocatable)
486 && (sym->attr.dummy
487 || sym->attr.function
488 || sym->attr.result
489 || !sym->attr.dimension))
490 se->expr = build_fold_indirect_ref (se->expr);
491 }
492
493 ref = expr->ref;
494 }
495
496 /* For character variables, also get the length. */
497 if (sym->ts.type == BT_CHARACTER)
498 {
499 /* If the character length of an entry isn't set, get the length from
500 the master function instead. */
501 if (sym->attr.entry && !sym->ts.cl->backend_decl)
502 se->string_length = sym->ns->proc_name->ts.cl->backend_decl;
503 else
504 se->string_length = sym->ts.cl->backend_decl;
505 gcc_assert (se->string_length);
506 }
507
508 while (ref)
509 {
510 switch (ref->type)
511 {
512 case REF_ARRAY:
513 /* Return the descriptor if that's what we want and this is an array
514 section reference. */
515 if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
516 return;
517 /* TODO: Pointers to single elements of array sections, eg elemental subs. */
518 /* Return the descriptor for array pointers and allocations. */
519 if (se->want_pointer
520 && ref->next == NULL && (se->descriptor_only))
521 return;
522
523 gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
524 /* Return a pointer to an element. */
525 break;
526
527 case REF_COMPONENT:
528 gfc_conv_component_ref (se, ref);
529 break;
530
531 case REF_SUBSTRING:
532 gfc_conv_substring (se, ref, expr->ts.kind,
533 expr->symtree->name, &expr->where);
534 break;
535
536 default:
537 gcc_unreachable ();
538 break;
539 }
540 ref = ref->next;
541 }
542 /* Pointer assignment, allocation or pass by reference. Arrays are handled
543 separately. */
544 if (se->want_pointer)
545 {
546 if (expr->ts.type == BT_CHARACTER)
547 gfc_conv_string_parameter (se);
548 else
549 se->expr = build_fold_addr_expr (se->expr);
550 }
551 }
552
553
554 /* Unary ops are easy... Or they would be if ! was a valid op. */
555
556 static void
557 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
558 {
559 gfc_se operand;
560 tree type;
561
562 gcc_assert (expr->ts.type != BT_CHARACTER);
563 /* Initialize the operand. */
564 gfc_init_se (&operand, se);
565 gfc_conv_expr_val (&operand, expr->value.op.op1);
566 gfc_add_block_to_block (&se->pre, &operand.pre);
567
568 type = gfc_typenode_for_spec (&expr->ts);
569
570 /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
571 We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
572 All other unary operators have an equivalent GIMPLE unary operator. */
573 if (code == TRUTH_NOT_EXPR)
574 se->expr = build2 (EQ_EXPR, type, operand.expr,
575 build_int_cst (type, 0));
576 else
577 se->expr = build1 (code, type, operand.expr);
578
579 }
580
581 /* Expand power operator to optimal multiplications when a value is raised
582 to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
583 Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
584 Programming", 3rd Edition, 1998. */
585
586 /* This code is mostly duplicated from expand_powi in the backend.
587 We establish the "optimal power tree" lookup table with the defined size.
588 The items in the table are the exponents used to calculate the index
589 exponents. Any integer n less than the value can get an "addition chain",
590 with the first node being one. */
591 #define POWI_TABLE_SIZE 256
592
593 /* The table is from builtins.c. */
594 static const unsigned char powi_table[POWI_TABLE_SIZE] =
595 {
596 0, 1, 1, 2, 2, 3, 3, 4, /* 0 - 7 */
597 4, 6, 5, 6, 6, 10, 7, 9, /* 8 - 15 */
598 8, 16, 9, 16, 10, 12, 11, 13, /* 16 - 23 */
599 12, 17, 13, 18, 14, 24, 15, 26, /* 24 - 31 */
600 16, 17, 17, 19, 18, 33, 19, 26, /* 32 - 39 */
601 20, 25, 21, 40, 22, 27, 23, 44, /* 40 - 47 */
602 24, 32, 25, 34, 26, 29, 27, 44, /* 48 - 55 */
603 28, 31, 29, 34, 30, 60, 31, 36, /* 56 - 63 */
604 32, 64, 33, 34, 34, 46, 35, 37, /* 64 - 71 */
605 36, 65, 37, 50, 38, 48, 39, 69, /* 72 - 79 */
606 40, 49, 41, 43, 42, 51, 43, 58, /* 80 - 87 */
607 44, 64, 45, 47, 46, 59, 47, 76, /* 88 - 95 */
608 48, 65, 49, 66, 50, 67, 51, 66, /* 96 - 103 */
609 52, 70, 53, 74, 54, 104, 55, 74, /* 104 - 111 */
610 56, 64, 57, 69, 58, 78, 59, 68, /* 112 - 119 */
611 60, 61, 61, 80, 62, 75, 63, 68, /* 120 - 127 */
612 64, 65, 65, 128, 66, 129, 67, 90, /* 128 - 135 */
613 68, 73, 69, 131, 70, 94, 71, 88, /* 136 - 143 */
614 72, 128, 73, 98, 74, 132, 75, 121, /* 144 - 151 */
615 76, 102, 77, 124, 78, 132, 79, 106, /* 152 - 159 */
616 80, 97, 81, 160, 82, 99, 83, 134, /* 160 - 167 */
617 84, 86, 85, 95, 86, 160, 87, 100, /* 168 - 175 */
618 88, 113, 89, 98, 90, 107, 91, 122, /* 176 - 183 */
619 92, 111, 93, 102, 94, 126, 95, 150, /* 184 - 191 */
620 96, 128, 97, 130, 98, 133, 99, 195, /* 192 - 199 */
621 100, 128, 101, 123, 102, 164, 103, 138, /* 200 - 207 */
622 104, 145, 105, 146, 106, 109, 107, 149, /* 208 - 215 */
623 108, 200, 109, 146, 110, 170, 111, 157, /* 216 - 223 */
624 112, 128, 113, 130, 114, 182, 115, 132, /* 224 - 231 */
625 116, 200, 117, 132, 118, 158, 119, 206, /* 232 - 239 */
626 120, 240, 121, 162, 122, 147, 123, 152, /* 240 - 247 */
627 124, 166, 125, 214, 126, 138, 127, 153, /* 248 - 255 */
628 };
629
630 /* If n is larger than lookup table's max index, we use the "window
631 method". */
632 #define POWI_WINDOW_SIZE 3
633
634 /* Recursive function to expand the power operator. The temporary
635 values are put in tmpvar. The function returns tmpvar[1] ** n. */
636 static tree
637 gfc_conv_powi (gfc_se * se, int n, tree * tmpvar)
638 {
639 tree op0;
640 tree op1;
641 tree tmp;
642 int digit;
643
644 if (n < POWI_TABLE_SIZE)
645 {
646 if (tmpvar[n])
647 return tmpvar[n];
648
649 op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
650 op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
651 }
652 else if (n & 1)
653 {
654 digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
655 op0 = gfc_conv_powi (se, n - digit, tmpvar);
656 op1 = gfc_conv_powi (se, digit, tmpvar);
657 }
658 else
659 {
660 op0 = gfc_conv_powi (se, n >> 1, tmpvar);
661 op1 = op0;
662 }
663
664 tmp = fold_build2 (MULT_EXPR, TREE_TYPE (op0), op0, op1);
665 tmp = gfc_evaluate_now (tmp, &se->pre);
666
667 if (n < POWI_TABLE_SIZE)
668 tmpvar[n] = tmp;
669
670 return tmp;
671 }
672
673
674 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
675 return 1. Else return 0 and a call to runtime library functions
676 will have to be built. */
677 static int
678 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
679 {
680 tree cond;
681 tree tmp;
682 tree type;
683 tree vartmp[POWI_TABLE_SIZE];
684 int n;
685 int sgn;
686
687 type = TREE_TYPE (lhs);
688 n = abs (TREE_INT_CST_LOW (rhs));
689 sgn = tree_int_cst_sgn (rhs);
690
691 if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations) || optimize_size)
692 && (n > 2 || n < -1))
693 return 0;
694
695 /* rhs == 0 */
696 if (sgn == 0)
697 {
698 se->expr = gfc_build_const (type, integer_one_node);
699 return 1;
700 }
701 /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1. */
702 if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
703 {
704 tmp = build2 (EQ_EXPR, boolean_type_node, lhs,
705 build_int_cst (TREE_TYPE (lhs), -1));
706 cond = build2 (EQ_EXPR, boolean_type_node, lhs,
707 build_int_cst (TREE_TYPE (lhs), 1));
708
709 /* If rhs is even,
710 result = (lhs == 1 || lhs == -1) ? 1 : 0. */
711 if ((n & 1) == 0)
712 {
713 tmp = build2 (TRUTH_OR_EXPR, boolean_type_node, tmp, cond);
714 se->expr = build3 (COND_EXPR, type, tmp, build_int_cst (type, 1),
715 build_int_cst (type, 0));
716 return 1;
717 }
718 /* If rhs is odd,
719 result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0. */
720 tmp = build3 (COND_EXPR, type, tmp, build_int_cst (type, -1),
721 build_int_cst (type, 0));
722 se->expr = build3 (COND_EXPR, type, cond, build_int_cst (type, 1), tmp);
723 return 1;
724 }
725
726 memset (vartmp, 0, sizeof (vartmp));
727 vartmp[1] = lhs;
728 if (sgn == -1)
729 {
730 tmp = gfc_build_const (type, integer_one_node);
731 vartmp[1] = build2 (RDIV_EXPR, type, tmp, vartmp[1]);
732 }
733
734 se->expr = gfc_conv_powi (se, n, vartmp);
735
736 return 1;
737 }
738
739
740 /* Power op (**). Constant integer exponent has special handling. */
741
742 static void
743 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
744 {
745 tree gfc_int4_type_node;
746 int kind;
747 int ikind;
748 gfc_se lse;
749 gfc_se rse;
750 tree fndecl;
751 tree tmp;
752
753 gfc_init_se (&lse, se);
754 gfc_conv_expr_val (&lse, expr->value.op.op1);
755 lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
756 gfc_add_block_to_block (&se->pre, &lse.pre);
757
758 gfc_init_se (&rse, se);
759 gfc_conv_expr_val (&rse, expr->value.op.op2);
760 gfc_add_block_to_block (&se->pre, &rse.pre);
761
762 if (expr->value.op.op2->ts.type == BT_INTEGER
763 && expr->value.op.op2->expr_type == EXPR_CONSTANT)
764 if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
765 return;
766
767 gfc_int4_type_node = gfc_get_int_type (4);
768
769 kind = expr->value.op.op1->ts.kind;
770 switch (expr->value.op.op2->ts.type)
771 {
772 case BT_INTEGER:
773 ikind = expr->value.op.op2->ts.kind;
774 switch (ikind)
775 {
776 case 1:
777 case 2:
778 rse.expr = convert (gfc_int4_type_node, rse.expr);
779 /* Fall through. */
780
781 case 4:
782 ikind = 0;
783 break;
784
785 case 8:
786 ikind = 1;
787 break;
788
789 case 16:
790 ikind = 2;
791 break;
792
793 default:
794 gcc_unreachable ();
795 }
796 switch (kind)
797 {
798 case 1:
799 case 2:
800 if (expr->value.op.op1->ts.type == BT_INTEGER)
801 lse.expr = convert (gfc_int4_type_node, lse.expr);
802 else
803 gcc_unreachable ();
804 /* Fall through. */
805
806 case 4:
807 kind = 0;
808 break;
809
810 case 8:
811 kind = 1;
812 break;
813
814 case 10:
815 kind = 2;
816 break;
817
818 case 16:
819 kind = 3;
820 break;
821
822 default:
823 gcc_unreachable ();
824 }
825
826 switch (expr->value.op.op1->ts.type)
827 {
828 case BT_INTEGER:
829 if (kind == 3) /* Case 16 was not handled properly above. */
830 kind = 2;
831 fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
832 break;
833
834 case BT_REAL:
835 fndecl = gfor_fndecl_math_powi[kind][ikind].real;
836 break;
837
838 case BT_COMPLEX:
839 fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
840 break;
841
842 default:
843 gcc_unreachable ();
844 }
845 break;
846
847 case BT_REAL:
848 switch (kind)
849 {
850 case 4:
851 fndecl = built_in_decls[BUILT_IN_POWF];
852 break;
853 case 8:
854 fndecl = built_in_decls[BUILT_IN_POW];
855 break;
856 case 10:
857 case 16:
858 fndecl = built_in_decls[BUILT_IN_POWL];
859 break;
860 default:
861 gcc_unreachable ();
862 }
863 break;
864
865 case BT_COMPLEX:
866 switch (kind)
867 {
868 case 4:
869 fndecl = gfor_fndecl_math_cpowf;
870 break;
871 case 8:
872 fndecl = gfor_fndecl_math_cpow;
873 break;
874 case 10:
875 fndecl = gfor_fndecl_math_cpowl10;
876 break;
877 case 16:
878 fndecl = gfor_fndecl_math_cpowl16;
879 break;
880 default:
881 gcc_unreachable ();
882 }
883 break;
884
885 default:
886 gcc_unreachable ();
887 break;
888 }
889
890 tmp = gfc_chainon_list (NULL_TREE, lse.expr);
891 tmp = gfc_chainon_list (tmp, rse.expr);
892 se->expr = build_function_call_expr (fndecl, tmp);
893 }
894
895
896 /* Generate code to allocate a string temporary. */
897
898 tree
899 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
900 {
901 tree var;
902 tree tmp;
903 tree args;
904
905 gcc_assert (TREE_TYPE (len) == gfc_charlen_type_node);
906
907 if (gfc_can_put_var_on_stack (len))
908 {
909 /* Create a temporary variable to hold the result. */
910 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
911 build_int_cst (gfc_charlen_type_node, 1));
912 tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
913 tmp = build_array_type (gfc_character1_type_node, tmp);
914 var = gfc_create_var (tmp, "str");
915 var = gfc_build_addr_expr (type, var);
916 }
917 else
918 {
919 /* Allocate a temporary to hold the result. */
920 var = gfc_create_var (type, "pstr");
921 args = gfc_chainon_list (NULL_TREE, len);
922 tmp = build_function_call_expr (gfor_fndecl_internal_malloc, args);
923 tmp = convert (type, tmp);
924 gfc_add_modify_expr (&se->pre, var, tmp);
925
926 /* Free the temporary afterwards. */
927 tmp = convert (pvoid_type_node, var);
928 args = gfc_chainon_list (NULL_TREE, tmp);
929 tmp = build_function_call_expr (gfor_fndecl_internal_free, args);
930 gfc_add_expr_to_block (&se->post, tmp);
931 }
932
933 return var;
934 }
935
936
937 /* Handle a string concatenation operation. A temporary will be allocated to
938 hold the result. */
939
940 static void
941 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
942 {
943 gfc_se lse;
944 gfc_se rse;
945 tree len;
946 tree type;
947 tree var;
948 tree args;
949 tree tmp;
950
951 gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
952 && expr->value.op.op2->ts.type == BT_CHARACTER);
953
954 gfc_init_se (&lse, se);
955 gfc_conv_expr (&lse, expr->value.op.op1);
956 gfc_conv_string_parameter (&lse);
957 gfc_init_se (&rse, se);
958 gfc_conv_expr (&rse, expr->value.op.op2);
959 gfc_conv_string_parameter (&rse);
960
961 gfc_add_block_to_block (&se->pre, &lse.pre);
962 gfc_add_block_to_block (&se->pre, &rse.pre);
963
964 type = gfc_get_character_type (expr->ts.kind, expr->ts.cl);
965 len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
966 if (len == NULL_TREE)
967 {
968 len = fold_build2 (PLUS_EXPR, TREE_TYPE (lse.string_length),
969 lse.string_length, rse.string_length);
970 }
971
972 type = build_pointer_type (type);
973
974 var = gfc_conv_string_tmp (se, type, len);
975
976 /* Do the actual concatenation. */
977 args = NULL_TREE;
978 args = gfc_chainon_list (args, len);
979 args = gfc_chainon_list (args, var);
980 args = gfc_chainon_list (args, lse.string_length);
981 args = gfc_chainon_list (args, lse.expr);
982 args = gfc_chainon_list (args, rse.string_length);
983 args = gfc_chainon_list (args, rse.expr);
984 tmp = build_function_call_expr (gfor_fndecl_concat_string, args);
985 gfc_add_expr_to_block (&se->pre, tmp);
986
987 /* Add the cleanup for the operands. */
988 gfc_add_block_to_block (&se->pre, &rse.post);
989 gfc_add_block_to_block (&se->pre, &lse.post);
990
991 se->expr = var;
992 se->string_length = len;
993 }
994
995 /* Translates an op expression. Common (binary) cases are handled by this
996 function, others are passed on. Recursion is used in either case.
997 We use the fact that (op1.ts == op2.ts) (except for the power
998 operator **).
999 Operators need no special handling for scalarized expressions as long as
1000 they call gfc_conv_simple_val to get their operands.
1001 Character strings get special handling. */
1002
1003 static void
1004 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
1005 {
1006 enum tree_code code;
1007 gfc_se lse;
1008 gfc_se rse;
1009 tree type;
1010 tree tmp;
1011 int lop;
1012 int checkstring;
1013
1014 checkstring = 0;
1015 lop = 0;
1016 switch (expr->value.op.operator)
1017 {
1018 case INTRINSIC_UPLUS:
1019 case INTRINSIC_PARENTHESES:
1020 gfc_conv_expr (se, expr->value.op.op1);
1021 return;
1022
1023 case INTRINSIC_UMINUS:
1024 gfc_conv_unary_op (NEGATE_EXPR, se, expr);
1025 return;
1026
1027 case INTRINSIC_NOT:
1028 gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
1029 return;
1030
1031 case INTRINSIC_PLUS:
1032 code = PLUS_EXPR;
1033 break;
1034
1035 case INTRINSIC_MINUS:
1036 code = MINUS_EXPR;
1037 break;
1038
1039 case INTRINSIC_TIMES:
1040 code = MULT_EXPR;
1041 break;
1042
1043 case INTRINSIC_DIVIDE:
1044 /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
1045 an integer, we must round towards zero, so we use a
1046 TRUNC_DIV_EXPR. */
1047 if (expr->ts.type == BT_INTEGER)
1048 code = TRUNC_DIV_EXPR;
1049 else
1050 code = RDIV_EXPR;
1051 break;
1052
1053 case INTRINSIC_POWER:
1054 gfc_conv_power_op (se, expr);
1055 return;
1056
1057 case INTRINSIC_CONCAT:
1058 gfc_conv_concat_op (se, expr);
1059 return;
1060
1061 case INTRINSIC_AND:
1062 code = TRUTH_ANDIF_EXPR;
1063 lop = 1;
1064 break;
1065
1066 case INTRINSIC_OR:
1067 code = TRUTH_ORIF_EXPR;
1068 lop = 1;
1069 break;
1070
1071 /* EQV and NEQV only work on logicals, but since we represent them
1072 as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE. */
1073 case INTRINSIC_EQ:
1074 case INTRINSIC_EQV:
1075 code = EQ_EXPR;
1076 checkstring = 1;
1077 lop = 1;
1078 break;
1079
1080 case INTRINSIC_NE:
1081 case INTRINSIC_NEQV:
1082 code = NE_EXPR;
1083 checkstring = 1;
1084 lop = 1;
1085 break;
1086
1087 case INTRINSIC_GT:
1088 code = GT_EXPR;
1089 checkstring = 1;
1090 lop = 1;
1091 break;
1092
1093 case INTRINSIC_GE:
1094 code = GE_EXPR;
1095 checkstring = 1;
1096 lop = 1;
1097 break;
1098
1099 case INTRINSIC_LT:
1100 code = LT_EXPR;
1101 checkstring = 1;
1102 lop = 1;
1103 break;
1104
1105 case INTRINSIC_LE:
1106 code = LE_EXPR;
1107 checkstring = 1;
1108 lop = 1;
1109 break;
1110
1111 case INTRINSIC_USER:
1112 case INTRINSIC_ASSIGN:
1113 /* These should be converted into function calls by the frontend. */
1114 gcc_unreachable ();
1115
1116 default:
1117 fatal_error ("Unknown intrinsic op");
1118 return;
1119 }
1120
1121 /* The only exception to this is **, which is handled separately anyway. */
1122 gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
1123
1124 if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
1125 checkstring = 0;
1126
1127 /* lhs */
1128 gfc_init_se (&lse, se);
1129 gfc_conv_expr (&lse, expr->value.op.op1);
1130 gfc_add_block_to_block (&se->pre, &lse.pre);
1131
1132 /* rhs */
1133 gfc_init_se (&rse, se);
1134 gfc_conv_expr (&rse, expr->value.op.op2);
1135 gfc_add_block_to_block (&se->pre, &rse.pre);
1136
1137 if (checkstring)
1138 {
1139 gfc_conv_string_parameter (&lse);
1140 gfc_conv_string_parameter (&rse);
1141
1142 lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
1143 rse.string_length, rse.expr);
1144 rse.expr = integer_zero_node;
1145 gfc_add_block_to_block (&lse.post, &rse.post);
1146 }
1147
1148 type = gfc_typenode_for_spec (&expr->ts);
1149
1150 if (lop)
1151 {
1152 /* The result of logical ops is always boolean_type_node. */
1153 tmp = fold_build2 (code, type, lse.expr, rse.expr);
1154 se->expr = convert (type, tmp);
1155 }
1156 else
1157 se->expr = fold_build2 (code, type, lse.expr, rse.expr);
1158
1159 /* Add the post blocks. */
1160 gfc_add_block_to_block (&se->post, &rse.post);
1161 gfc_add_block_to_block (&se->post, &lse.post);
1162 }
1163
1164 /* If a string's length is one, we convert it to a single character. */
1165
1166 static tree
1167 gfc_to_single_character (tree len, tree str)
1168 {
1169 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str)));
1170
1171 if (INTEGER_CST_P (len) && TREE_INT_CST_LOW (len) == 1
1172 && TREE_INT_CST_HIGH (len) == 0)
1173 {
1174 str = fold_convert (pchar_type_node, str);
1175 return build_fold_indirect_ref (str);
1176 }
1177
1178 return NULL_TREE;
1179 }
1180
1181 /* Compare two strings. If they are all single characters, the result is the
1182 subtraction of them. Otherwise, we build a library call. */
1183
1184 tree
1185 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2)
1186 {
1187 tree sc1;
1188 tree sc2;
1189 tree type;
1190 tree tmp;
1191
1192 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
1193 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
1194
1195 type = gfc_get_int_type (gfc_default_integer_kind);
1196
1197 sc1 = gfc_to_single_character (len1, str1);
1198 sc2 = gfc_to_single_character (len2, str2);
1199
1200 /* Deal with single character specially. */
1201 if (sc1 != NULL_TREE && sc2 != NULL_TREE)
1202 {
1203 sc1 = fold_convert (type, sc1);
1204 sc2 = fold_convert (type, sc2);
1205 tmp = fold_build2 (MINUS_EXPR, type, sc1, sc2);
1206 }
1207 else
1208 {
1209 tmp = NULL_TREE;
1210 tmp = gfc_chainon_list (tmp, len1);
1211 tmp = gfc_chainon_list (tmp, str1);
1212 tmp = gfc_chainon_list (tmp, len2);
1213 tmp = gfc_chainon_list (tmp, str2);
1214
1215 /* Build a call for the comparison. */
1216 tmp = build_function_call_expr (gfor_fndecl_compare_string, tmp);
1217 }
1218
1219 return tmp;
1220 }
1221
1222 static void
1223 gfc_conv_function_val (gfc_se * se, gfc_symbol * sym)
1224 {
1225 tree tmp;
1226
1227 if (sym->attr.dummy)
1228 {
1229 tmp = gfc_get_symbol_decl (sym);
1230 gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1231 && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
1232 }
1233 else
1234 {
1235 if (!sym->backend_decl)
1236 sym->backend_decl = gfc_get_extern_function_decl (sym);
1237
1238 tmp = sym->backend_decl;
1239 if (sym->attr.cray_pointee)
1240 tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
1241 gfc_get_symbol_decl (sym->cp_pointer));
1242 if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1243 {
1244 gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1245 tmp = build_fold_addr_expr (tmp);
1246 }
1247 }
1248 se->expr = tmp;
1249 }
1250
1251
1252 /* Initialize MAPPING. */
1253
1254 void
1255 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1256 {
1257 mapping->syms = NULL;
1258 mapping->charlens = NULL;
1259 }
1260
1261
1262 /* Free all memory held by MAPPING (but not MAPPING itself). */
1263
1264 void
1265 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1266 {
1267 gfc_interface_sym_mapping *sym;
1268 gfc_interface_sym_mapping *nextsym;
1269 gfc_charlen *cl;
1270 gfc_charlen *nextcl;
1271
1272 for (sym = mapping->syms; sym; sym = nextsym)
1273 {
1274 nextsym = sym->next;
1275 gfc_free_symbol (sym->new->n.sym);
1276 gfc_free (sym->new);
1277 gfc_free (sym);
1278 }
1279 for (cl = mapping->charlens; cl; cl = nextcl)
1280 {
1281 nextcl = cl->next;
1282 gfc_free_expr (cl->length);
1283 gfc_free (cl);
1284 }
1285 }
1286
1287
1288 /* Return a copy of gfc_charlen CL. Add the returned structure to
1289 MAPPING so that it will be freed by gfc_free_interface_mapping. */
1290
1291 static gfc_charlen *
1292 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1293 gfc_charlen * cl)
1294 {
1295 gfc_charlen *new;
1296
1297 new = gfc_get_charlen ();
1298 new->next = mapping->charlens;
1299 new->length = gfc_copy_expr (cl->length);
1300
1301 mapping->charlens = new;
1302 return new;
1303 }
1304
1305
1306 /* A subroutine of gfc_add_interface_mapping. Return a descriptorless
1307 array variable that can be used as the actual argument for dummy
1308 argument SYM. Add any initialization code to BLOCK. PACKED is as
1309 for gfc_get_nodesc_array_type and DATA points to the first element
1310 in the passed array. */
1311
1312 static tree
1313 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1314 int packed, tree data)
1315 {
1316 tree type;
1317 tree var;
1318
1319 type = gfc_typenode_for_spec (&sym->ts);
1320 type = gfc_get_nodesc_array_type (type, sym->as, packed);
1321
1322 var = gfc_create_var (type, "ifm");
1323 gfc_add_modify_expr (block, var, fold_convert (type, data));
1324
1325 return var;
1326 }
1327
1328
1329 /* A subroutine of gfc_add_interface_mapping. Set the stride, upper bounds
1330 and offset of descriptorless array type TYPE given that it has the same
1331 size as DESC. Add any set-up code to BLOCK. */
1332
1333 static void
1334 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1335 {
1336 int n;
1337 tree dim;
1338 tree offset;
1339 tree tmp;
1340
1341 offset = gfc_index_zero_node;
1342 for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1343 {
1344 dim = gfc_rank_cst[n];
1345 GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1346 if (GFC_TYPE_ARRAY_LBOUND (type, n) == NULL_TREE)
1347 {
1348 GFC_TYPE_ARRAY_LBOUND (type, n)
1349 = gfc_conv_descriptor_lbound (desc, dim);
1350 GFC_TYPE_ARRAY_UBOUND (type, n)
1351 = gfc_conv_descriptor_ubound (desc, dim);
1352 }
1353 else if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1354 {
1355 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1356 gfc_conv_descriptor_ubound (desc, dim),
1357 gfc_conv_descriptor_lbound (desc, dim));
1358 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1359 GFC_TYPE_ARRAY_LBOUND (type, n),
1360 tmp);
1361 tmp = gfc_evaluate_now (tmp, block);
1362 GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1363 }
1364 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
1365 GFC_TYPE_ARRAY_LBOUND (type, n),
1366 GFC_TYPE_ARRAY_STRIDE (type, n));
1367 offset = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp);
1368 }
1369 offset = gfc_evaluate_now (offset, block);
1370 GFC_TYPE_ARRAY_OFFSET (type) = offset;
1371 }
1372
1373
1374 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1375 in SE. The caller may still use se->expr and se->string_length after
1376 calling this function. */
1377
1378 void
1379 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1380 gfc_symbol * sym, gfc_se * se)
1381 {
1382 gfc_interface_sym_mapping *sm;
1383 tree desc;
1384 tree tmp;
1385 tree value;
1386 gfc_symbol *new_sym;
1387 gfc_symtree *root;
1388 gfc_symtree *new_symtree;
1389
1390 /* Create a new symbol to represent the actual argument. */
1391 new_sym = gfc_new_symbol (sym->name, NULL);
1392 new_sym->ts = sym->ts;
1393 new_sym->attr.referenced = 1;
1394 new_sym->attr.dimension = sym->attr.dimension;
1395 new_sym->attr.pointer = sym->attr.pointer;
1396 new_sym->attr.allocatable = sym->attr.allocatable;
1397 new_sym->attr.flavor = sym->attr.flavor;
1398
1399 /* Create a fake symtree for it. */
1400 root = NULL;
1401 new_symtree = gfc_new_symtree (&root, sym->name);
1402 new_symtree->n.sym = new_sym;
1403 gcc_assert (new_symtree == root);
1404
1405 /* Create a dummy->actual mapping. */
1406 sm = gfc_getmem (sizeof (*sm));
1407 sm->next = mapping->syms;
1408 sm->old = sym;
1409 sm->new = new_symtree;
1410 mapping->syms = sm;
1411
1412 /* Stabilize the argument's value. */
1413 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1414
1415 if (sym->ts.type == BT_CHARACTER)
1416 {
1417 /* Create a copy of the dummy argument's length. */
1418 new_sym->ts.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.cl);
1419
1420 /* If the length is specified as "*", record the length that
1421 the caller is passing. We should use the callee's length
1422 in all other cases. */
1423 if (!new_sym->ts.cl->length)
1424 {
1425 se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1426 new_sym->ts.cl->backend_decl = se->string_length;
1427 }
1428 }
1429
1430 /* Use the passed value as-is if the argument is a function. */
1431 if (sym->attr.flavor == FL_PROCEDURE)
1432 value = se->expr;
1433
1434 /* If the argument is either a string or a pointer to a string,
1435 convert it to a boundless character type. */
1436 else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1437 {
1438 tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1439 tmp = build_pointer_type (tmp);
1440 if (sym->attr.pointer)
1441 value = build_fold_indirect_ref (se->expr);
1442 else
1443 value = se->expr;
1444 value = fold_convert (tmp, value);
1445 }
1446
1447 /* If the argument is a scalar, a pointer to an array or an allocatable,
1448 dereference it. */
1449 else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1450 value = build_fold_indirect_ref (se->expr);
1451
1452 /* For character(*), use the actual argument's descriptor. */
1453 else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.cl->length)
1454 value = build_fold_indirect_ref (se->expr);
1455
1456 /* If the argument is an array descriptor, use it to determine
1457 information about the actual argument's shape. */
1458 else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1459 && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1460 {
1461 /* Get the actual argument's descriptor. */
1462 desc = build_fold_indirect_ref (se->expr);
1463
1464 /* Create the replacement variable. */
1465 tmp = gfc_conv_descriptor_data_get (desc);
1466 value = gfc_get_interface_mapping_array (&se->pre, sym, 0, tmp);
1467
1468 /* Use DESC to work out the upper bounds, strides and offset. */
1469 gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1470 }
1471 else
1472 /* Otherwise we have a packed array. */
1473 value = gfc_get_interface_mapping_array (&se->pre, sym, 2, se->expr);
1474
1475 new_sym->backend_decl = value;
1476 }
1477
1478
1479 /* Called once all dummy argument mappings have been added to MAPPING,
1480 but before the mapping is used to evaluate expressions. Pre-evaluate
1481 the length of each argument, adding any initialization code to PRE and
1482 any finalization code to POST. */
1483
1484 void
1485 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1486 stmtblock_t * pre, stmtblock_t * post)
1487 {
1488 gfc_interface_sym_mapping *sym;
1489 gfc_expr *expr;
1490 gfc_se se;
1491
1492 for (sym = mapping->syms; sym; sym = sym->next)
1493 if (sym->new->n.sym->ts.type == BT_CHARACTER
1494 && !sym->new->n.sym->ts.cl->backend_decl)
1495 {
1496 expr = sym->new->n.sym->ts.cl->length;
1497 gfc_apply_interface_mapping_to_expr (mapping, expr);
1498 gfc_init_se (&se, NULL);
1499 gfc_conv_expr (&se, expr);
1500
1501 se.expr = gfc_evaluate_now (se.expr, &se.pre);
1502 gfc_add_block_to_block (pre, &se.pre);
1503 gfc_add_block_to_block (post, &se.post);
1504
1505 sym->new->n.sym->ts.cl->backend_decl = se.expr;
1506 }
1507 }
1508
1509
1510 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1511 constructor C. */
1512
1513 static void
1514 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
1515 gfc_constructor * c)
1516 {
1517 for (; c; c = c->next)
1518 {
1519 gfc_apply_interface_mapping_to_expr (mapping, c->expr);
1520 if (c->iterator)
1521 {
1522 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
1523 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
1524 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
1525 }
1526 }
1527 }
1528
1529
1530 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1531 reference REF. */
1532
1533 static void
1534 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
1535 gfc_ref * ref)
1536 {
1537 int n;
1538
1539 for (; ref; ref = ref->next)
1540 switch (ref->type)
1541 {
1542 case REF_ARRAY:
1543 for (n = 0; n < ref->u.ar.dimen; n++)
1544 {
1545 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
1546 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
1547 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
1548 }
1549 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
1550 break;
1551
1552 case REF_COMPONENT:
1553 break;
1554
1555 case REF_SUBSTRING:
1556 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
1557 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
1558 break;
1559 }
1560 }
1561
1562
1563 /* EXPR is a copy of an expression that appeared in the interface
1564 associated with MAPPING. Walk it recursively looking for references to
1565 dummy arguments that MAPPING maps to actual arguments. Replace each such
1566 reference with a reference to the associated actual argument. */
1567
1568 static void
1569 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
1570 gfc_expr * expr)
1571 {
1572 gfc_interface_sym_mapping *sym;
1573 gfc_actual_arglist *actual;
1574
1575 if (!expr)
1576 return;
1577
1578 /* Copying an expression does not copy its length, so do that here. */
1579 if (expr->ts.type == BT_CHARACTER && expr->ts.cl)
1580 {
1581 expr->ts.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.cl);
1582 gfc_apply_interface_mapping_to_expr (mapping, expr->ts.cl->length);
1583 }
1584
1585 /* Apply the mapping to any references. */
1586 gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
1587
1588 /* ...and to the expression's symbol, if it has one. */
1589 if (expr->symtree)
1590 for (sym = mapping->syms; sym; sym = sym->next)
1591 if (sym->old == expr->symtree->n.sym)
1592 expr->symtree = sym->new;
1593
1594 /* ...and to subexpressions in expr->value. */
1595 switch (expr->expr_type)
1596 {
1597 case EXPR_VARIABLE:
1598 case EXPR_CONSTANT:
1599 case EXPR_NULL:
1600 case EXPR_SUBSTRING:
1601 break;
1602
1603 case EXPR_OP:
1604 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
1605 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
1606 break;
1607
1608 case EXPR_FUNCTION:
1609 for (sym = mapping->syms; sym; sym = sym->next)
1610 if (sym->old == expr->value.function.esym)
1611 expr->value.function.esym = sym->new->n.sym;
1612
1613 for (actual = expr->value.function.actual; actual; actual = actual->next)
1614 gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
1615 break;
1616
1617 case EXPR_ARRAY:
1618 case EXPR_STRUCTURE:
1619 gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
1620 break;
1621 }
1622 }
1623
1624
1625 /* Evaluate interface expression EXPR using MAPPING. Store the result
1626 in SE. */
1627
1628 void
1629 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
1630 gfc_se * se, gfc_expr * expr)
1631 {
1632 expr = gfc_copy_expr (expr);
1633 gfc_apply_interface_mapping_to_expr (mapping, expr);
1634 gfc_conv_expr (se, expr);
1635 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1636 gfc_free_expr (expr);
1637 }
1638
1639 /* Returns a reference to a temporary array into which a component of
1640 an actual argument derived type array is copied and then returned
1641 after the function call.
1642 TODO Get rid of this kludge, when array descriptors are capable of
1643 handling aliased arrays. */
1644
1645 static void
1646 gfc_conv_aliased_arg (gfc_se * parmse, gfc_expr * expr,
1647 int g77, sym_intent intent)
1648 {
1649 gfc_se lse;
1650 gfc_se rse;
1651 gfc_ss *lss;
1652 gfc_ss *rss;
1653 gfc_loopinfo loop;
1654 gfc_loopinfo loop2;
1655 gfc_ss_info *info;
1656 tree offset;
1657 tree tmp_index;
1658 tree tmp;
1659 tree base_type;
1660 stmtblock_t body;
1661 int n;
1662
1663 gcc_assert (expr->expr_type == EXPR_VARIABLE);
1664
1665 gfc_init_se (&lse, NULL);
1666 gfc_init_se (&rse, NULL);
1667
1668 /* Walk the argument expression. */
1669 rss = gfc_walk_expr (expr);
1670
1671 gcc_assert (rss != gfc_ss_terminator);
1672
1673 /* Initialize the scalarizer. */
1674 gfc_init_loopinfo (&loop);
1675 gfc_add_ss_to_loop (&loop, rss);
1676
1677 /* Calculate the bounds of the scalarization. */
1678 gfc_conv_ss_startstride (&loop);
1679
1680 /* Build an ss for the temporary. */
1681 base_type = gfc_typenode_for_spec (&expr->ts);
1682 if (GFC_ARRAY_TYPE_P (base_type)
1683 || GFC_DESCRIPTOR_TYPE_P (base_type))
1684 base_type = gfc_get_element_type (base_type);
1685
1686 loop.temp_ss = gfc_get_ss ();;
1687 loop.temp_ss->type = GFC_SS_TEMP;
1688 loop.temp_ss->data.temp.type = base_type;
1689
1690 if (expr->ts.type == BT_CHARACTER)
1691 {
1692 gfc_ref *char_ref = expr->ref;
1693
1694 for (; expr->ts.cl == NULL && char_ref; char_ref = char_ref->next)
1695 if (char_ref->type == REF_SUBSTRING)
1696 {
1697 gfc_se tmp_se;
1698
1699 expr->ts.cl = gfc_get_charlen ();
1700 expr->ts.cl->next = char_ref->u.ss.length->next;
1701 char_ref->u.ss.length->next = expr->ts.cl;
1702
1703 gfc_init_se (&tmp_se, NULL);
1704 gfc_conv_expr_type (&tmp_se, char_ref->u.ss.end,
1705 gfc_array_index_type);
1706 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1707 tmp_se.expr, gfc_index_one_node);
1708 tmp = gfc_evaluate_now (tmp, &parmse->pre);
1709 gfc_init_se (&tmp_se, NULL);
1710 gfc_conv_expr_type (&tmp_se, char_ref->u.ss.start,
1711 gfc_array_index_type);
1712 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1713 tmp, tmp_se.expr);
1714 expr->ts.cl->backend_decl = tmp;
1715
1716 break;
1717 }
1718 loop.temp_ss->data.temp.type
1719 = gfc_typenode_for_spec (&expr->ts);
1720 loop.temp_ss->string_length = expr->ts.cl->backend_decl;
1721 }
1722
1723 loop.temp_ss->data.temp.dimen = loop.dimen;
1724 loop.temp_ss->next = gfc_ss_terminator;
1725
1726 /* Associate the SS with the loop. */
1727 gfc_add_ss_to_loop (&loop, loop.temp_ss);
1728
1729 /* Setup the scalarizing loops. */
1730 gfc_conv_loop_setup (&loop);
1731
1732 /* Pass the temporary descriptor back to the caller. */
1733 info = &loop.temp_ss->data.info;
1734 parmse->expr = info->descriptor;
1735
1736 /* Setup the gfc_se structures. */
1737 gfc_copy_loopinfo_to_se (&lse, &loop);
1738 gfc_copy_loopinfo_to_se (&rse, &loop);
1739
1740 rse.ss = rss;
1741 lse.ss = loop.temp_ss;
1742 gfc_mark_ss_chain_used (rss, 1);
1743 gfc_mark_ss_chain_used (loop.temp_ss, 1);
1744
1745 /* Start the scalarized loop body. */
1746 gfc_start_scalarized_body (&loop, &body);
1747
1748 /* Translate the expression. */
1749 gfc_conv_expr (&rse, expr);
1750
1751 gfc_conv_tmp_array_ref (&lse);
1752 gfc_advance_se_ss_chain (&lse);
1753
1754 if (intent != INTENT_OUT)
1755 {
1756 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false);
1757 gfc_add_expr_to_block (&body, tmp);
1758 gcc_assert (rse.ss == gfc_ss_terminator);
1759 gfc_trans_scalarizing_loops (&loop, &body);
1760 }
1761 else
1762 {
1763 /* Make sure that the temporary declaration survives by merging
1764 all the loop declarations into the current context. */
1765 for (n = 0; n < loop.dimen; n++)
1766 {
1767 gfc_merge_block_scope (&body);
1768 body = loop.code[loop.order[n]];
1769 }
1770 gfc_merge_block_scope (&body);
1771 }
1772
1773 /* Add the post block after the second loop, so that any
1774 freeing of allocated memory is done at the right time. */
1775 gfc_add_block_to_block (&parmse->pre, &loop.pre);
1776
1777 /**********Copy the temporary back again.*********/
1778
1779 gfc_init_se (&lse, NULL);
1780 gfc_init_se (&rse, NULL);
1781
1782 /* Walk the argument expression. */
1783 lss = gfc_walk_expr (expr);
1784 rse.ss = loop.temp_ss;
1785 lse.ss = lss;
1786
1787 /* Initialize the scalarizer. */
1788 gfc_init_loopinfo (&loop2);
1789 gfc_add_ss_to_loop (&loop2, lss);
1790
1791 /* Calculate the bounds of the scalarization. */
1792 gfc_conv_ss_startstride (&loop2);
1793
1794 /* Setup the scalarizing loops. */
1795 gfc_conv_loop_setup (&loop2);
1796
1797 gfc_copy_loopinfo_to_se (&lse, &loop2);
1798 gfc_copy_loopinfo_to_se (&rse, &loop2);
1799
1800 gfc_mark_ss_chain_used (lss, 1);
1801 gfc_mark_ss_chain_used (loop.temp_ss, 1);
1802
1803 /* Declare the variable to hold the temporary offset and start the
1804 scalarized loop body. */
1805 offset = gfc_create_var (gfc_array_index_type, NULL);
1806 gfc_start_scalarized_body (&loop2, &body);
1807
1808 /* Build the offsets for the temporary from the loop variables. The
1809 temporary array has lbounds of zero and strides of one in all
1810 dimensions, so this is very simple. The offset is only computed
1811 outside the innermost loop, so the overall transfer could be
1812 optimized further. */
1813 info = &rse.ss->data.info;
1814
1815 tmp_index = gfc_index_zero_node;
1816 for (n = info->dimen - 1; n > 0; n--)
1817 {
1818 tree tmp_str;
1819 tmp = rse.loop->loopvar[n];
1820 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1821 tmp, rse.loop->from[n]);
1822 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1823 tmp, tmp_index);
1824
1825 tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1826 rse.loop->to[n-1], rse.loop->from[n-1]);
1827 tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1828 tmp_str, gfc_index_one_node);
1829
1830 tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
1831 tmp, tmp_str);
1832 }
1833
1834 tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1835 tmp_index, rse.loop->from[0]);
1836 gfc_add_modify_expr (&rse.loop->code[0], offset, tmp_index);
1837
1838 tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1839 rse.loop->loopvar[0], offset);
1840
1841 /* Now use the offset for the reference. */
1842 tmp = build_fold_indirect_ref (info->data);
1843 rse.expr = gfc_build_array_ref (tmp, tmp_index);
1844
1845 if (expr->ts.type == BT_CHARACTER)
1846 rse.string_length = expr->ts.cl->backend_decl;
1847
1848 gfc_conv_expr (&lse, expr);
1849
1850 gcc_assert (lse.ss == gfc_ss_terminator);
1851
1852 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false);
1853 gfc_add_expr_to_block (&body, tmp);
1854
1855 /* Generate the copying loops. */
1856 gfc_trans_scalarizing_loops (&loop2, &body);
1857
1858 /* Wrap the whole thing up by adding the second loop to the post-block
1859 and following it by the post-block of the first loop. In this way,
1860 if the temporary needs freeing, it is done after use! */
1861 if (intent != INTENT_IN)
1862 {
1863 gfc_add_block_to_block (&parmse->post, &loop2.pre);
1864 gfc_add_block_to_block (&parmse->post, &loop2.post);
1865 }
1866
1867 gfc_add_block_to_block (&parmse->post, &loop.post);
1868
1869 gfc_cleanup_loop (&loop);
1870 gfc_cleanup_loop (&loop2);
1871
1872 /* Pass the string length to the argument expression. */
1873 if (expr->ts.type == BT_CHARACTER)
1874 parmse->string_length = expr->ts.cl->backend_decl;
1875
1876 /* We want either the address for the data or the address of the descriptor,
1877 depending on the mode of passing array arguments. */
1878 if (g77)
1879 parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
1880 else
1881 parmse->expr = build_fold_addr_expr (parmse->expr);
1882
1883 return;
1884 }
1885
1886 /* Is true if an array reference is followed by a component or substring
1887 reference. */
1888
1889 static bool
1890 is_aliased_array (gfc_expr * e)
1891 {
1892 gfc_ref * ref;
1893 bool seen_array;
1894
1895 seen_array = false;
1896 for (ref = e->ref; ref; ref = ref->next)
1897 {
1898 if (ref->type == REF_ARRAY
1899 && ref->u.ar.type != AR_ELEMENT)
1900 seen_array = true;
1901
1902 if (seen_array
1903 && ref->type != REF_ARRAY)
1904 return seen_array;
1905 }
1906 return false;
1907 }
1908
1909 /* Generate the code for argument list functions. */
1910
1911 static void
1912 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
1913 {
1914 tree type = NULL_TREE;
1915 /* Pass by value for g77 %VAL(arg), pass the address
1916 indirectly for %LOC, else by reference. Thus %REF
1917 is a "do-nothing" and %LOC is the same as an F95
1918 pointer. */
1919 if (strncmp (name, "%VAL", 4) == 0)
1920 {
1921 gfc_conv_expr (se, expr);
1922 /* %VAL converts argument to default kind. */
1923 switch (expr->ts.type)
1924 {
1925 case BT_REAL:
1926 type = gfc_get_real_type (gfc_default_real_kind);
1927 se->expr = fold_convert (type, se->expr);
1928 break;
1929 case BT_COMPLEX:
1930 type = gfc_get_complex_type (gfc_default_complex_kind);
1931 se->expr = fold_convert (type, se->expr);
1932 break;
1933 case BT_INTEGER:
1934 type = gfc_get_int_type (gfc_default_integer_kind);
1935 se->expr = fold_convert (type, se->expr);
1936 break;
1937 case BT_LOGICAL:
1938 type = gfc_get_logical_type (gfc_default_logical_kind);
1939 se->expr = fold_convert (type, se->expr);
1940 break;
1941 /* This should have been resolved away. */
1942 case BT_UNKNOWN: case BT_CHARACTER: case BT_DERIVED:
1943 case BT_PROCEDURE: case BT_HOLLERITH:
1944 gfc_internal_error ("Bad type in conv_arglist_function");
1945 }
1946
1947 }
1948 else if (strncmp (name, "%LOC", 4) == 0)
1949 {
1950 gfc_conv_expr_reference (se, expr);
1951 se->expr = gfc_build_addr_expr (NULL, se->expr);
1952 }
1953 else if (strncmp (name, "%REF", 4) == 0)
1954 gfc_conv_expr_reference (se, expr);
1955 else
1956 gfc_error ("Unknown argument list function at %L", &expr->where);
1957 }
1958
1959
1960 /* Generate code for a procedure call. Note can return se->post != NULL.
1961 If se->direct_byref is set then se->expr contains the return parameter.
1962 Return nonzero, if the call has alternate specifiers. */
1963
1964 int
1965 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
1966 gfc_actual_arglist * arg, tree append_args)
1967 {
1968 gfc_interface_mapping mapping;
1969 tree arglist;
1970 tree retargs;
1971 tree tmp;
1972 tree fntype;
1973 gfc_se parmse;
1974 gfc_ss *argss;
1975 gfc_ss_info *info;
1976 int byref;
1977 int parm_kind;
1978 tree type;
1979 tree var;
1980 tree len;
1981 tree stringargs;
1982 gfc_formal_arglist *formal;
1983 int has_alternate_specifier = 0;
1984 bool need_interface_mapping;
1985 bool callee_alloc;
1986 gfc_typespec ts;
1987 gfc_charlen cl;
1988 gfc_expr *e;
1989 gfc_symbol *fsym;
1990 stmtblock_t post;
1991 enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
1992
1993 arglist = NULL_TREE;
1994 retargs = NULL_TREE;
1995 stringargs = NULL_TREE;
1996 var = NULL_TREE;
1997 len = NULL_TREE;
1998
1999 if (se->ss != NULL)
2000 {
2001 if (!sym->attr.elemental)
2002 {
2003 gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2004 if (se->ss->useflags)
2005 {
2006 gcc_assert (gfc_return_by_reference (sym)
2007 && sym->result->attr.dimension);
2008 gcc_assert (se->loop != NULL);
2009
2010 /* Access the previously obtained result. */
2011 gfc_conv_tmp_array_ref (se);
2012 gfc_advance_se_ss_chain (se);
2013 return 0;
2014 }
2015 }
2016 info = &se->ss->data.info;
2017 }
2018 else
2019 info = NULL;
2020
2021 gfc_init_block (&post);
2022 gfc_init_interface_mapping (&mapping);
2023 need_interface_mapping = ((sym->ts.type == BT_CHARACTER
2024 && sym->ts.cl->length
2025 && sym->ts.cl->length->expr_type
2026 != EXPR_CONSTANT)
2027 || sym->attr.dimension);
2028 formal = sym->formal;
2029 /* Evaluate the arguments. */
2030 for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
2031 {
2032 e = arg->expr;
2033 fsym = formal ? formal->sym : NULL;
2034 parm_kind = MISSING;
2035 if (e == NULL)
2036 {
2037
2038 if (se->ignore_optional)
2039 {
2040 /* Some intrinsics have already been resolved to the correct
2041 parameters. */
2042 continue;
2043 }
2044 else if (arg->label)
2045 {
2046 has_alternate_specifier = 1;
2047 continue;
2048 }
2049 else
2050 {
2051 /* Pass a NULL pointer for an absent arg. */
2052 gfc_init_se (&parmse, NULL);
2053 parmse.expr = null_pointer_node;
2054 if (arg->missing_arg_type == BT_CHARACTER)
2055 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2056 }
2057 }
2058 else if (se->ss && se->ss->useflags)
2059 {
2060 /* An elemental function inside a scalarized loop. */
2061 gfc_init_se (&parmse, se);
2062 gfc_conv_expr_reference (&parmse, e);
2063 parm_kind = ELEMENTAL;
2064 }
2065 else
2066 {
2067 /* A scalar or transformational function. */
2068 gfc_init_se (&parmse, NULL);
2069 argss = gfc_walk_expr (e);
2070
2071 if (argss == gfc_ss_terminator)
2072 {
2073 parm_kind = SCALAR;
2074 if (fsym && fsym->attr.value)
2075 {
2076 gfc_conv_expr (&parmse, e);
2077 }
2078 else if (arg->name && arg->name[0] == '%')
2079 /* Argument list functions %VAL, %LOC and %REF are signalled
2080 through arg->name. */
2081 conv_arglist_function (&parmse, arg->expr, arg->name);
2082 else
2083 {
2084 gfc_conv_expr_reference (&parmse, e);
2085 if (fsym && fsym->attr.pointer
2086 && e->expr_type != EXPR_NULL)
2087 {
2088 /* Scalar pointer dummy args require an extra level of
2089 indirection. The null pointer already contains
2090 this level of indirection. */
2091 parm_kind = SCALAR_POINTER;
2092 parmse.expr = build_fold_addr_expr (parmse.expr);
2093 }
2094 }
2095 }
2096 else
2097 {
2098 /* If the procedure requires an explicit interface, the actual
2099 argument is passed according to the corresponding formal
2100 argument. If the corresponding formal argument is a POINTER,
2101 ALLOCATABLE or assumed shape, we do not use g77's calling
2102 convention, and pass the address of the array descriptor
2103 instead. Otherwise we use g77's calling convention. */
2104 int f;
2105 f = (fsym != NULL)
2106 && !(fsym->attr.pointer || fsym->attr.allocatable)
2107 && fsym->as->type != AS_ASSUMED_SHAPE;
2108 f = f || !sym->attr.always_explicit;
2109
2110 if (e->expr_type == EXPR_VARIABLE
2111 && is_aliased_array (e))
2112 /* The actual argument is a component reference to an
2113 array of derived types. In this case, the argument
2114 is converted to a temporary, which is passed and then
2115 written back after the procedure call. */
2116 gfc_conv_aliased_arg (&parmse, e, f,
2117 fsym ? fsym->attr.intent : INTENT_INOUT);
2118 else
2119 gfc_conv_array_parameter (&parmse, e, argss, f);
2120
2121 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
2122 allocated on entry, it must be deallocated. */
2123 if (fsym && fsym->attr.allocatable
2124 && fsym->attr.intent == INTENT_OUT)
2125 {
2126 tmp = build_fold_indirect_ref (parmse.expr);
2127 tmp = gfc_trans_dealloc_allocated (tmp);
2128 gfc_add_expr_to_block (&se->pre, tmp);
2129 }
2130
2131 }
2132 }
2133
2134 if (fsym)
2135 {
2136 if (e)
2137 {
2138 /* If an optional argument is itself an optional dummy
2139 argument, check its presence and substitute a null
2140 if absent. */
2141 if (e->expr_type == EXPR_VARIABLE
2142 && e->symtree->n.sym->attr.optional
2143 && fsym->attr.optional)
2144 gfc_conv_missing_dummy (&parmse, e, fsym->ts);
2145
2146 /* If an INTENT(OUT) dummy of derived type has a default
2147 initializer, it must be (re)initialized here. */
2148 if (fsym->attr.intent == INTENT_OUT
2149 && fsym->ts.type == BT_DERIVED
2150 && fsym->value)
2151 {
2152 gcc_assert (!fsym->attr.allocatable);
2153 tmp = gfc_trans_assignment (e, fsym->value, false);
2154 gfc_add_expr_to_block (&se->pre, tmp);
2155 }
2156
2157 /* Obtain the character length of an assumed character
2158 length procedure from the typespec. */
2159 if (fsym->ts.type == BT_CHARACTER
2160 && parmse.string_length == NULL_TREE
2161 && e->ts.type == BT_PROCEDURE
2162 && e->symtree->n.sym->ts.type == BT_CHARACTER
2163 && e->symtree->n.sym->ts.cl->length != NULL)
2164 {
2165 gfc_conv_const_charlen (e->symtree->n.sym->ts.cl);
2166 parmse.string_length
2167 = e->symtree->n.sym->ts.cl->backend_decl;
2168 }
2169 }
2170
2171 if (need_interface_mapping)
2172 gfc_add_interface_mapping (&mapping, fsym, &parmse);
2173 }
2174
2175 gfc_add_block_to_block (&se->pre, &parmse.pre);
2176 gfc_add_block_to_block (&post, &parmse.post);
2177
2178 /* Allocated allocatable components of derived types must be
2179 deallocated for INTENT(OUT) dummy arguments and non-variable
2180 scalars. Non-variable arrays are dealt with in trans-array.c
2181 (gfc_conv_array_parameter). */
2182 if (e && e->ts.type == BT_DERIVED
2183 && e->ts.derived->attr.alloc_comp
2184 && ((formal && formal->sym->attr.intent == INTENT_OUT)
2185 ||
2186 (e->expr_type != EXPR_VARIABLE && !e->rank)))
2187 {
2188 int parm_rank;
2189 tmp = build_fold_indirect_ref (parmse.expr);
2190 parm_rank = e->rank;
2191 switch (parm_kind)
2192 {
2193 case (ELEMENTAL):
2194 case (SCALAR):
2195 parm_rank = 0;
2196 break;
2197
2198 case (SCALAR_POINTER):
2199 tmp = build_fold_indirect_ref (tmp);
2200 break;
2201 case (ARRAY):
2202 tmp = parmse.expr;
2203 break;
2204 }
2205
2206 tmp = gfc_deallocate_alloc_comp (e->ts.derived, tmp, parm_rank);
2207 if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.optional)
2208 tmp = build3_v (COND_EXPR, gfc_conv_expr_present (e->symtree->n.sym),
2209 tmp, build_empty_stmt ());
2210
2211 if (e->expr_type != EXPR_VARIABLE)
2212 /* Don't deallocate non-variables until they have been used. */
2213 gfc_add_expr_to_block (&se->post, tmp);
2214 else
2215 {
2216 gcc_assert (formal && formal->sym->attr.intent == INTENT_OUT);
2217 gfc_add_expr_to_block (&se->pre, tmp);
2218 }
2219 }
2220
2221 /* Character strings are passed as two parameters, a length and a
2222 pointer. */
2223 if (parmse.string_length != NULL_TREE)
2224 stringargs = gfc_chainon_list (stringargs, parmse.string_length);
2225
2226 arglist = gfc_chainon_list (arglist, parmse.expr);
2227 }
2228 gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
2229
2230 ts = sym->ts;
2231 if (ts.type == BT_CHARACTER)
2232 {
2233 if (sym->ts.cl->length == NULL)
2234 {
2235 /* Assumed character length results are not allowed by 5.1.1.5 of the
2236 standard and are trapped in resolve.c; except in the case of SPREAD
2237 (and other intrinsics?) and dummy functions. In the case of SPREAD,
2238 we take the character length of the first argument for the result.
2239 For dummies, we have to look through the formal argument list for
2240 this function and use the character length found there.*/
2241 if (!sym->attr.dummy)
2242 cl.backend_decl = TREE_VALUE (stringargs);
2243 else
2244 {
2245 formal = sym->ns->proc_name->formal;
2246 for (; formal; formal = formal->next)
2247 if (strcmp (formal->sym->name, sym->name) == 0)
2248 cl.backend_decl = formal->sym->ts.cl->backend_decl;
2249 }
2250 }
2251 else
2252 {
2253 /* Calculate the length of the returned string. */
2254 gfc_init_se (&parmse, NULL);
2255 if (need_interface_mapping)
2256 gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2257 else
2258 gfc_conv_expr (&parmse, sym->ts.cl->length);
2259 gfc_add_block_to_block (&se->pre, &parmse.pre);
2260 gfc_add_block_to_block (&se->post, &parmse.post);
2261 cl.backend_decl = fold_convert (gfc_charlen_type_node, parmse.expr);
2262 }
2263
2264 /* Set up a charlen structure for it. */
2265 cl.next = NULL;
2266 cl.length = NULL;
2267 ts.cl = &cl;
2268
2269 len = cl.backend_decl;
2270 }
2271
2272 byref = gfc_return_by_reference (sym);
2273 if (byref)
2274 {
2275 if (se->direct_byref)
2276 retargs = gfc_chainon_list (retargs, se->expr);
2277 else if (sym->result->attr.dimension)
2278 {
2279 gcc_assert (se->loop && info);
2280
2281 /* Set the type of the array. */
2282 tmp = gfc_typenode_for_spec (&ts);
2283 info->dimen = se->loop->dimen;
2284
2285 /* Evaluate the bounds of the result, if known. */
2286 gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2287
2288 /* Create a temporary to store the result. In case the function
2289 returns a pointer, the temporary will be a shallow copy and
2290 mustn't be deallocated. */
2291 callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2292 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2293 false, !sym->attr.pointer, callee_alloc,
2294 true);
2295
2296 /* Pass the temporary as the first argument. */
2297 tmp = info->descriptor;
2298 tmp = build_fold_addr_expr (tmp);
2299 retargs = gfc_chainon_list (retargs, tmp);
2300 }
2301 else if (ts.type == BT_CHARACTER)
2302 {
2303 /* Pass the string length. */
2304 type = gfc_get_character_type (ts.kind, ts.cl);
2305 type = build_pointer_type (type);
2306
2307 /* Return an address to a char[0:len-1]* temporary for
2308 character pointers. */
2309 if (sym->attr.pointer || sym->attr.allocatable)
2310 {
2311 /* Build char[0:len-1] * pstr. */
2312 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
2313 build_int_cst (gfc_charlen_type_node, 1));
2314 tmp = build_range_type (gfc_array_index_type,
2315 gfc_index_zero_node, tmp);
2316 tmp = build_array_type (gfc_character1_type_node, tmp);
2317 var = gfc_create_var (build_pointer_type (tmp), "pstr");
2318
2319 /* Provide an address expression for the function arguments. */
2320 var = build_fold_addr_expr (var);
2321 }
2322 else
2323 var = gfc_conv_string_tmp (se, type, len);
2324
2325 retargs = gfc_chainon_list (retargs, var);
2326 }
2327 else
2328 {
2329 gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2330
2331 type = gfc_get_complex_type (ts.kind);
2332 var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2333 retargs = gfc_chainon_list (retargs, var);
2334 }
2335
2336 /* Add the string length to the argument list. */
2337 if (ts.type == BT_CHARACTER)
2338 retargs = gfc_chainon_list (retargs, len);
2339 }
2340 gfc_free_interface_mapping (&mapping);
2341
2342 /* Add the return arguments. */
2343 arglist = chainon (retargs, arglist);
2344
2345 /* Add the hidden string length parameters to the arguments. */
2346 arglist = chainon (arglist, stringargs);
2347
2348 /* We may want to append extra arguments here. This is used e.g. for
2349 calls to libgfortran_matmul_??, which need extra information. */
2350 if (append_args != NULL_TREE)
2351 arglist = chainon (arglist, append_args);
2352
2353 /* Generate the actual call. */
2354 gfc_conv_function_val (se, sym);
2355 /* If there are alternate return labels, function type should be
2356 integer. Can't modify the type in place though, since it can be shared
2357 with other functions. */
2358 if (has_alternate_specifier
2359 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2360 {
2361 gcc_assert (! sym->attr.dummy);
2362 TREE_TYPE (sym->backend_decl)
2363 = build_function_type (integer_type_node,
2364 TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2365 se->expr = build_fold_addr_expr (sym->backend_decl);
2366 }
2367
2368 fntype = TREE_TYPE (TREE_TYPE (se->expr));
2369 se->expr = build3 (CALL_EXPR, TREE_TYPE (fntype), se->expr,
2370 arglist, NULL_TREE);
2371
2372 /* If we have a pointer function, but we don't want a pointer, e.g.
2373 something like
2374 x = f()
2375 where f is pointer valued, we have to dereference the result. */
2376 if (!se->want_pointer && !byref && sym->attr.pointer)
2377 se->expr = build_fold_indirect_ref (se->expr);
2378
2379 /* f2c calling conventions require a scalar default real function to
2380 return a double precision result. Convert this back to default
2381 real. We only care about the cases that can happen in Fortran 77.
2382 */
2383 if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2384 && sym->ts.kind == gfc_default_real_kind
2385 && !sym->attr.always_explicit)
2386 se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2387
2388 /* A pure function may still have side-effects - it may modify its
2389 parameters. */
2390 TREE_SIDE_EFFECTS (se->expr) = 1;
2391 #if 0
2392 if (!sym->attr.pure)
2393 TREE_SIDE_EFFECTS (se->expr) = 1;
2394 #endif
2395
2396 if (byref)
2397 {
2398 /* Add the function call to the pre chain. There is no expression. */
2399 gfc_add_expr_to_block (&se->pre, se->expr);
2400 se->expr = NULL_TREE;
2401
2402 if (!se->direct_byref)
2403 {
2404 if (sym->attr.dimension)
2405 {
2406 if (flag_bounds_check)
2407 {
2408 /* Check the data pointer hasn't been modified. This would
2409 happen in a function returning a pointer. */
2410 tmp = gfc_conv_descriptor_data_get (info->descriptor);
2411 tmp = fold_build2 (NE_EXPR, boolean_type_node,
2412 tmp, info->data);
2413 gfc_trans_runtime_check (tmp, gfc_msg_fault, &se->pre, NULL);
2414 }
2415 se->expr = info->descriptor;
2416 /* Bundle in the string length. */
2417 se->string_length = len;
2418 }
2419 else if (sym->ts.type == BT_CHARACTER)
2420 {
2421 /* Dereference for character pointer results. */
2422 if (sym->attr.pointer || sym->attr.allocatable)
2423 se->expr = build_fold_indirect_ref (var);
2424 else
2425 se->expr = var;
2426
2427 se->string_length = len;
2428 }
2429 else
2430 {
2431 gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
2432 se->expr = build_fold_indirect_ref (var);
2433 }
2434 }
2435 }
2436
2437 /* Follow the function call with the argument post block. */
2438 if (byref)
2439 gfc_add_block_to_block (&se->pre, &post);
2440 else
2441 gfc_add_block_to_block (&se->post, &post);
2442
2443 return has_alternate_specifier;
2444 }
2445
2446
2447 /* Generate code to copy a string. */
2448
2449 static void
2450 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
2451 tree slength, tree src)
2452 {
2453 tree tmp, dlen, slen;
2454 tree dsc;
2455 tree ssc;
2456 tree cond;
2457 tree cond2;
2458 tree tmp2;
2459 tree tmp3;
2460 tree tmp4;
2461 stmtblock_t tempblock;
2462
2463 dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
2464 slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
2465
2466 /* Deal with single character specially. */
2467 dsc = gfc_to_single_character (dlen, dest);
2468 ssc = gfc_to_single_character (slen, src);
2469 if (dsc != NULL_TREE && ssc != NULL_TREE)
2470 {
2471 gfc_add_modify_expr (block, dsc, ssc);
2472 return;
2473 }
2474
2475 /* Do nothing if the destination length is zero. */
2476 cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
2477 build_int_cst (gfc_charlen_type_node, 0));
2478
2479 /* The following code was previously in _gfortran_copy_string:
2480
2481 // The two strings may overlap so we use memmove.
2482 void
2483 copy_string (GFC_INTEGER_4 destlen, char * dest,
2484 GFC_INTEGER_4 srclen, const char * src)
2485 {
2486 if (srclen >= destlen)
2487 {
2488 // This will truncate if too long.
2489 memmove (dest, src, destlen);
2490 }
2491 else
2492 {
2493 memmove (dest, src, srclen);
2494 // Pad with spaces.
2495 memset (&dest[srclen], ' ', destlen - srclen);
2496 }
2497 }
2498
2499 We're now doing it here for better optimization, but the logic
2500 is the same. */
2501
2502 /* Truncate string if source is too long. */
2503 cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
2504 tmp2 = gfc_chainon_list (NULL_TREE, dest);
2505 tmp2 = gfc_chainon_list (tmp2, src);
2506 tmp2 = gfc_chainon_list (tmp2, dlen);
2507 tmp2 = build_function_call_expr (built_in_decls[BUILT_IN_MEMMOVE], tmp2);
2508
2509 /* Else copy and pad with spaces. */
2510 tmp3 = gfc_chainon_list (NULL_TREE, dest);
2511 tmp3 = gfc_chainon_list (tmp3, src);
2512 tmp3 = gfc_chainon_list (tmp3, slen);
2513 tmp3 = build_function_call_expr (built_in_decls[BUILT_IN_MEMMOVE], tmp3);
2514
2515 tmp4 = fold_build2 (PLUS_EXPR, pchar_type_node, dest,
2516 fold_convert (pchar_type_node, slen));
2517 tmp4 = gfc_chainon_list (NULL_TREE, tmp4);
2518 tmp4 = gfc_chainon_list (tmp4, build_int_cst
2519 (gfc_get_int_type (gfc_c_int_kind),
2520 lang_hooks.to_target_charset (' ')));
2521 tmp4 = gfc_chainon_list (tmp4, fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
2522 dlen, slen));
2523 tmp4 = build_function_call_expr (built_in_decls[BUILT_IN_MEMSET], tmp4);
2524
2525 gfc_init_block (&tempblock);
2526 gfc_add_expr_to_block (&tempblock, tmp3);
2527 gfc_add_expr_to_block (&tempblock, tmp4);
2528 tmp3 = gfc_finish_block (&tempblock);
2529
2530 /* The whole copy_string function is there. */
2531 tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
2532 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
2533 gfc_add_expr_to_block (block, tmp);
2534 }
2535
2536
2537 /* Translate a statement function.
2538 The value of a statement function reference is obtained by evaluating the
2539 expression using the values of the actual arguments for the values of the
2540 corresponding dummy arguments. */
2541
2542 static void
2543 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
2544 {
2545 gfc_symbol *sym;
2546 gfc_symbol *fsym;
2547 gfc_formal_arglist *fargs;
2548 gfc_actual_arglist *args;
2549 gfc_se lse;
2550 gfc_se rse;
2551 gfc_saved_var *saved_vars;
2552 tree *temp_vars;
2553 tree type;
2554 tree tmp;
2555 int n;
2556
2557 sym = expr->symtree->n.sym;
2558 args = expr->value.function.actual;
2559 gfc_init_se (&lse, NULL);
2560 gfc_init_se (&rse, NULL);
2561
2562 n = 0;
2563 for (fargs = sym->formal; fargs; fargs = fargs->next)
2564 n++;
2565 saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
2566 temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
2567
2568 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2569 {
2570 /* Each dummy shall be specified, explicitly or implicitly, to be
2571 scalar. */
2572 gcc_assert (fargs->sym->attr.dimension == 0);
2573 fsym = fargs->sym;
2574
2575 /* Create a temporary to hold the value. */
2576 type = gfc_typenode_for_spec (&fsym->ts);
2577 temp_vars[n] = gfc_create_var (type, fsym->name);
2578
2579 if (fsym->ts.type == BT_CHARACTER)
2580 {
2581 /* Copy string arguments. */
2582 tree arglen;
2583
2584 gcc_assert (fsym->ts.cl && fsym->ts.cl->length
2585 && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
2586
2587 arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
2588 tmp = gfc_build_addr_expr (build_pointer_type (type),
2589 temp_vars[n]);
2590
2591 gfc_conv_expr (&rse, args->expr);
2592 gfc_conv_string_parameter (&rse);
2593 gfc_add_block_to_block (&se->pre, &lse.pre);
2594 gfc_add_block_to_block (&se->pre, &rse.pre);
2595
2596 gfc_trans_string_copy (&se->pre, arglen, tmp, rse.string_length,
2597 rse.expr);
2598 gfc_add_block_to_block (&se->pre, &lse.post);
2599 gfc_add_block_to_block (&se->pre, &rse.post);
2600 }
2601 else
2602 {
2603 /* For everything else, just evaluate the expression. */
2604 gfc_conv_expr (&lse, args->expr);
2605
2606 gfc_add_block_to_block (&se->pre, &lse.pre);
2607 gfc_add_modify_expr (&se->pre, temp_vars[n], lse.expr);
2608 gfc_add_block_to_block (&se->pre, &lse.post);
2609 }
2610
2611 args = args->next;
2612 }
2613
2614 /* Use the temporary variables in place of the real ones. */
2615 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2616 gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
2617
2618 gfc_conv_expr (se, sym->value);
2619
2620 if (sym->ts.type == BT_CHARACTER)
2621 {
2622 gfc_conv_const_charlen (sym->ts.cl);
2623
2624 /* Force the expression to the correct length. */
2625 if (!INTEGER_CST_P (se->string_length)
2626 || tree_int_cst_lt (se->string_length,
2627 sym->ts.cl->backend_decl))
2628 {
2629 type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
2630 tmp = gfc_create_var (type, sym->name);
2631 tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
2632 gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
2633 se->string_length, se->expr);
2634 se->expr = tmp;
2635 }
2636 se->string_length = sym->ts.cl->backend_decl;
2637 }
2638
2639 /* Restore the original variables. */
2640 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2641 gfc_restore_sym (fargs->sym, &saved_vars[n]);
2642 gfc_free (saved_vars);
2643 }
2644
2645
2646 /* Translate a function expression. */
2647
2648 static void
2649 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
2650 {
2651 gfc_symbol *sym;
2652
2653 if (expr->value.function.isym)
2654 {
2655 gfc_conv_intrinsic_function (se, expr);
2656 return;
2657 }
2658
2659 /* We distinguish statement functions from general functions to improve
2660 runtime performance. */
2661 if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2662 {
2663 gfc_conv_statement_function (se, expr);
2664 return;
2665 }
2666
2667 /* expr.value.function.esym is the resolved (specific) function symbol for
2668 most functions. However this isn't set for dummy procedures. */
2669 sym = expr->value.function.esym;
2670 if (!sym)
2671 sym = expr->symtree->n.sym;
2672 gfc_conv_function_call (se, sym, expr->value.function.actual, NULL_TREE);
2673 }
2674
2675
2676 static void
2677 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
2678 {
2679 gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
2680 gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
2681
2682 gfc_conv_tmp_array_ref (se);
2683 gfc_advance_se_ss_chain (se);
2684 }
2685
2686
2687 /* Build a static initializer. EXPR is the expression for the initial value.
2688 The other parameters describe the variable of the component being
2689 initialized. EXPR may be null. */
2690
2691 tree
2692 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
2693 bool array, bool pointer)
2694 {
2695 gfc_se se;
2696
2697 if (!(expr || pointer))
2698 return NULL_TREE;
2699
2700 if (array)
2701 {
2702 /* Arrays need special handling. */
2703 if (pointer)
2704 return gfc_build_null_descriptor (type);
2705 else
2706 return gfc_conv_array_initializer (type, expr);
2707 }
2708 else if (pointer)
2709 return fold_convert (type, null_pointer_node);
2710 else
2711 {
2712 switch (ts->type)
2713 {
2714 case BT_DERIVED:
2715 gfc_init_se (&se, NULL);
2716 gfc_conv_structure (&se, expr, 1);
2717 return se.expr;
2718
2719 case BT_CHARACTER:
2720 return gfc_conv_string_init (ts->cl->backend_decl,expr);
2721
2722 default:
2723 gfc_init_se (&se, NULL);
2724 gfc_conv_constant (&se, expr);
2725 return se.expr;
2726 }
2727 }
2728 }
2729
2730 static tree
2731 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2732 {
2733 gfc_se rse;
2734 gfc_se lse;
2735 gfc_ss *rss;
2736 gfc_ss *lss;
2737 stmtblock_t body;
2738 stmtblock_t block;
2739 gfc_loopinfo loop;
2740 int n;
2741 tree tmp;
2742
2743 gfc_start_block (&block);
2744
2745 /* Initialize the scalarizer. */
2746 gfc_init_loopinfo (&loop);
2747
2748 gfc_init_se (&lse, NULL);
2749 gfc_init_se (&rse, NULL);
2750
2751 /* Walk the rhs. */
2752 rss = gfc_walk_expr (expr);
2753 if (rss == gfc_ss_terminator)
2754 {
2755 /* The rhs is scalar. Add a ss for the expression. */
2756 rss = gfc_get_ss ();
2757 rss->next = gfc_ss_terminator;
2758 rss->type = GFC_SS_SCALAR;
2759 rss->expr = expr;
2760 }
2761
2762 /* Create a SS for the destination. */
2763 lss = gfc_get_ss ();
2764 lss->type = GFC_SS_COMPONENT;
2765 lss->expr = NULL;
2766 lss->shape = gfc_get_shape (cm->as->rank);
2767 lss->next = gfc_ss_terminator;
2768 lss->data.info.dimen = cm->as->rank;
2769 lss->data.info.descriptor = dest;
2770 lss->data.info.data = gfc_conv_array_data (dest);
2771 lss->data.info.offset = gfc_conv_array_offset (dest);
2772 for (n = 0; n < cm->as->rank; n++)
2773 {
2774 lss->data.info.dim[n] = n;
2775 lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
2776 lss->data.info.stride[n] = gfc_index_one_node;
2777
2778 mpz_init (lss->shape[n]);
2779 mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
2780 cm->as->lower[n]->value.integer);
2781 mpz_add_ui (lss->shape[n], lss->shape[n], 1);
2782 }
2783
2784 /* Associate the SS with the loop. */
2785 gfc_add_ss_to_loop (&loop, lss);
2786 gfc_add_ss_to_loop (&loop, rss);
2787
2788 /* Calculate the bounds of the scalarization. */
2789 gfc_conv_ss_startstride (&loop);
2790
2791 /* Setup the scalarizing loops. */
2792 gfc_conv_loop_setup (&loop);
2793
2794 /* Setup the gfc_se structures. */
2795 gfc_copy_loopinfo_to_se (&lse, &loop);
2796 gfc_copy_loopinfo_to_se (&rse, &loop);
2797
2798 rse.ss = rss;
2799 gfc_mark_ss_chain_used (rss, 1);
2800 lse.ss = lss;
2801 gfc_mark_ss_chain_used (lss, 1);
2802
2803 /* Start the scalarized loop body. */
2804 gfc_start_scalarized_body (&loop, &body);
2805
2806 gfc_conv_tmp_array_ref (&lse);
2807 if (cm->ts.type == BT_CHARACTER)
2808 lse.string_length = cm->ts.cl->backend_decl;
2809
2810 gfc_conv_expr (&rse, expr);
2811
2812 tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
2813 gfc_add_expr_to_block (&body, tmp);
2814
2815 gcc_assert (rse.ss == gfc_ss_terminator);
2816
2817 /* Generate the copying loops. */
2818 gfc_trans_scalarizing_loops (&loop, &body);
2819
2820 /* Wrap the whole thing up. */
2821 gfc_add_block_to_block (&block, &loop.pre);
2822 gfc_add_block_to_block (&block, &loop.post);
2823
2824 for (n = 0; n < cm->as->rank; n++)
2825 mpz_clear (lss->shape[n]);
2826 gfc_free (lss->shape);
2827
2828 gfc_cleanup_loop (&loop);
2829
2830 return gfc_finish_block (&block);
2831 }
2832
2833
2834 /* Assign a single component of a derived type constructor. */
2835
2836 static tree
2837 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2838 {
2839 gfc_se se;
2840 gfc_se lse;
2841 gfc_ss *rss;
2842 stmtblock_t block;
2843 tree tmp;
2844 tree offset;
2845 int n;
2846
2847 gfc_start_block (&block);
2848
2849 if (cm->pointer)
2850 {
2851 gfc_init_se (&se, NULL);
2852 /* Pointer component. */
2853 if (cm->dimension)
2854 {
2855 /* Array pointer. */
2856 if (expr->expr_type == EXPR_NULL)
2857 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2858 else
2859 {
2860 rss = gfc_walk_expr (expr);
2861 se.direct_byref = 1;
2862 se.expr = dest;
2863 gfc_conv_expr_descriptor (&se, expr, rss);
2864 gfc_add_block_to_block (&block, &se.pre);
2865 gfc_add_block_to_block (&block, &se.post);
2866 }
2867 }
2868 else
2869 {
2870 /* Scalar pointers. */
2871 se.want_pointer = 1;
2872 gfc_conv_expr (&se, expr);
2873 gfc_add_block_to_block (&block, &se.pre);
2874 gfc_add_modify_expr (&block, dest,
2875 fold_convert (TREE_TYPE (dest), se.expr));
2876 gfc_add_block_to_block (&block, &se.post);
2877 }
2878 }
2879 else if (cm->dimension)
2880 {
2881 if (cm->allocatable && expr->expr_type == EXPR_NULL)
2882 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2883 else if (cm->allocatable)
2884 {
2885 tree tmp2;
2886
2887 gfc_init_se (&se, NULL);
2888
2889 rss = gfc_walk_expr (expr);
2890 se.want_pointer = 0;
2891 gfc_conv_expr_descriptor (&se, expr, rss);
2892 gfc_add_block_to_block (&block, &se.pre);
2893
2894 tmp = fold_convert (TREE_TYPE (dest), se.expr);
2895 gfc_add_modify_expr (&block, dest, tmp);
2896
2897 if (cm->ts.type == BT_DERIVED && cm->ts.derived->attr.alloc_comp)
2898 tmp = gfc_copy_alloc_comp (cm->ts.derived, se.expr, dest,
2899 cm->as->rank);
2900 else
2901 tmp = gfc_duplicate_allocatable (dest, se.expr,
2902 TREE_TYPE(cm->backend_decl),
2903 cm->as->rank);
2904
2905 gfc_add_expr_to_block (&block, tmp);
2906
2907 gfc_add_block_to_block (&block, &se.post);
2908 gfc_conv_descriptor_data_set (&block, se.expr, null_pointer_node);
2909
2910 /* Shift the lbound and ubound of temporaries to being unity, rather
2911 than zero, based. Calculate the offset for all cases. */
2912 offset = gfc_conv_descriptor_offset (dest);
2913 gfc_add_modify_expr (&block, offset, gfc_index_zero_node);
2914 tmp2 =gfc_create_var (gfc_array_index_type, NULL);
2915 for (n = 0; n < expr->rank; n++)
2916 {
2917 if (expr->expr_type != EXPR_VARIABLE
2918 && expr->expr_type != EXPR_CONSTANT)
2919 {
2920 tmp = gfc_conv_descriptor_ubound (dest, gfc_rank_cst[n]);
2921 gfc_add_modify_expr (&block, tmp,
2922 fold_build2 (PLUS_EXPR,
2923 gfc_array_index_type,
2924 tmp, gfc_index_one_node));
2925 tmp = gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]);
2926 gfc_add_modify_expr (&block, tmp, gfc_index_one_node);
2927 }
2928 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
2929 gfc_conv_descriptor_lbound (dest,
2930 gfc_rank_cst[n]),
2931 gfc_conv_descriptor_stride (dest,
2932 gfc_rank_cst[n]));
2933 gfc_add_modify_expr (&block, tmp2, tmp);
2934 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
2935 gfc_add_modify_expr (&block, offset, tmp);
2936 }
2937 }
2938 else
2939 {
2940 tmp = gfc_trans_subarray_assign (dest, cm, expr);
2941 gfc_add_expr_to_block (&block, tmp);
2942 }
2943 }
2944 else if (expr->ts.type == BT_DERIVED)
2945 {
2946 if (expr->expr_type != EXPR_STRUCTURE)
2947 {
2948 gfc_init_se (&se, NULL);
2949 gfc_conv_expr (&se, expr);
2950 gfc_add_modify_expr (&block, dest,
2951 fold_convert (TREE_TYPE (dest), se.expr));
2952 }
2953 else
2954 {
2955 /* Nested constructors. */
2956 tmp = gfc_trans_structure_assign (dest, expr);
2957 gfc_add_expr_to_block (&block, tmp);
2958 }
2959 }
2960 else
2961 {
2962 /* Scalar component. */
2963 gfc_init_se (&se, NULL);
2964 gfc_init_se (&lse, NULL);
2965
2966 gfc_conv_expr (&se, expr);
2967 if (cm->ts.type == BT_CHARACTER)
2968 lse.string_length = cm->ts.cl->backend_decl;
2969 lse.expr = dest;
2970 tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
2971 gfc_add_expr_to_block (&block, tmp);
2972 }
2973 return gfc_finish_block (&block);
2974 }
2975
2976 /* Assign a derived type constructor to a variable. */
2977
2978 static tree
2979 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
2980 {
2981 gfc_constructor *c;
2982 gfc_component *cm;
2983 stmtblock_t block;
2984 tree field;
2985 tree tmp;
2986
2987 gfc_start_block (&block);
2988 cm = expr->ts.derived->components;
2989 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2990 {
2991 /* Skip absent members in default initializers. */
2992 if (!c->expr)
2993 continue;
2994
2995 field = cm->backend_decl;
2996 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), dest, field, NULL_TREE);
2997 tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
2998 gfc_add_expr_to_block (&block, tmp);
2999 }
3000 return gfc_finish_block (&block);
3001 }
3002
3003 /* Build an expression for a constructor. If init is nonzero then
3004 this is part of a static variable initializer. */
3005
3006 void
3007 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
3008 {
3009 gfc_constructor *c;
3010 gfc_component *cm;
3011 tree val;
3012 tree type;
3013 tree tmp;
3014 VEC(constructor_elt,gc) *v = NULL;
3015
3016 gcc_assert (se->ss == NULL);
3017 gcc_assert (expr->expr_type == EXPR_STRUCTURE);
3018 type = gfc_typenode_for_spec (&expr->ts);
3019
3020 if (!init)
3021 {
3022 /* Create a temporary variable and fill it in. */
3023 se->expr = gfc_create_var (type, expr->ts.derived->name);
3024 tmp = gfc_trans_structure_assign (se->expr, expr);
3025 gfc_add_expr_to_block (&se->pre, tmp);
3026 return;
3027 }
3028
3029 cm = expr->ts.derived->components;
3030
3031 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3032 {
3033 /* Skip absent members in default initializers and allocatable
3034 components. Although the latter have a default initializer
3035 of EXPR_NULL,... by default, the static nullify is not needed
3036 since this is done every time we come into scope. */
3037 if (!c->expr || cm->allocatable)
3038 continue;
3039
3040 val = gfc_conv_initializer (c->expr, &cm->ts,
3041 TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer);
3042
3043 /* Append it to the constructor list. */
3044 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
3045 }
3046 se->expr = build_constructor (type, v);
3047 }
3048
3049
3050 /* Translate a substring expression. */
3051
3052 static void
3053 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
3054 {
3055 gfc_ref *ref;
3056
3057 ref = expr->ref;
3058
3059 gcc_assert (ref->type == REF_SUBSTRING);
3060
3061 se->expr = gfc_build_string_const(expr->value.character.length,
3062 expr->value.character.string);
3063 se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
3064 TYPE_STRING_FLAG (TREE_TYPE (se->expr))=1;
3065
3066 gfc_conv_substring(se,ref,expr->ts.kind,NULL,&expr->where);
3067 }
3068
3069
3070 /* Entry point for expression translation. Evaluates a scalar quantity.
3071 EXPR is the expression to be translated, and SE is the state structure if
3072 called from within the scalarized. */
3073
3074 void
3075 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
3076 {
3077 if (se->ss && se->ss->expr == expr
3078 && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
3079 {
3080 /* Substitute a scalar expression evaluated outside the scalarization
3081 loop. */
3082 se->expr = se->ss->data.scalar.expr;
3083 se->string_length = se->ss->string_length;
3084 gfc_advance_se_ss_chain (se);
3085 return;
3086 }
3087
3088 switch (expr->expr_type)
3089 {
3090 case EXPR_OP:
3091 gfc_conv_expr_op (se, expr);
3092 break;
3093
3094 case EXPR_FUNCTION:
3095 gfc_conv_function_expr (se, expr);
3096 break;
3097
3098 case EXPR_CONSTANT:
3099 gfc_conv_constant (se, expr);
3100 break;
3101
3102 case EXPR_VARIABLE:
3103 gfc_conv_variable (se, expr);
3104 break;
3105
3106 case EXPR_NULL:
3107 se->expr = null_pointer_node;
3108 break;
3109
3110 case EXPR_SUBSTRING:
3111 gfc_conv_substring_expr (se, expr);
3112 break;
3113
3114 case EXPR_STRUCTURE:
3115 gfc_conv_structure (se, expr, 0);
3116 break;
3117
3118 case EXPR_ARRAY:
3119 gfc_conv_array_constructor_expr (se, expr);
3120 break;
3121
3122 default:
3123 gcc_unreachable ();
3124 break;
3125 }
3126 }
3127
3128 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
3129 of an assignment. */
3130 void
3131 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
3132 {
3133 gfc_conv_expr (se, expr);
3134 /* All numeric lvalues should have empty post chains. If not we need to
3135 figure out a way of rewriting an lvalue so that it has no post chain. */
3136 gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
3137 }
3138
3139 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
3140 numeric expressions. Used for scalar values where inserting cleanup code
3141 is inconvenient. */
3142 void
3143 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
3144 {
3145 tree val;
3146
3147 gcc_assert (expr->ts.type != BT_CHARACTER);
3148 gfc_conv_expr (se, expr);
3149 if (se->post.head)
3150 {
3151 val = gfc_create_var (TREE_TYPE (se->expr), NULL);
3152 gfc_add_modify_expr (&se->pre, val, se->expr);
3153 se->expr = val;
3154 gfc_add_block_to_block (&se->pre, &se->post);
3155 }
3156 }
3157
3158 /* Helper to translate and expression and convert it to a particular type. */
3159 void
3160 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
3161 {
3162 gfc_conv_expr_val (se, expr);
3163 se->expr = convert (type, se->expr);
3164 }
3165
3166
3167 /* Converts an expression so that it can be passed by reference. Scalar
3168 values only. */
3169
3170 void
3171 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
3172 {
3173 tree var;
3174
3175 if (se->ss && se->ss->expr == expr
3176 && se->ss->type == GFC_SS_REFERENCE)
3177 {
3178 se->expr = se->ss->data.scalar.expr;
3179 se->string_length = se->ss->string_length;
3180 gfc_advance_se_ss_chain (se);
3181 return;
3182 }
3183
3184 if (expr->ts.type == BT_CHARACTER)
3185 {
3186 gfc_conv_expr (se, expr);
3187 gfc_conv_string_parameter (se);
3188 return;
3189 }
3190
3191 if (expr->expr_type == EXPR_VARIABLE)
3192 {
3193 se->want_pointer = 1;
3194 gfc_conv_expr (se, expr);
3195 if (se->post.head)
3196 {
3197 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3198 gfc_add_modify_expr (&se->pre, var, se->expr);
3199 gfc_add_block_to_block (&se->pre, &se->post);
3200 se->expr = var;
3201 }
3202 return;
3203 }
3204
3205 gfc_conv_expr (se, expr);
3206
3207 /* Create a temporary var to hold the value. */
3208 if (TREE_CONSTANT (se->expr))
3209 {
3210 tree tmp = se->expr;
3211 STRIP_TYPE_NOPS (tmp);
3212 var = build_decl (CONST_DECL, NULL, TREE_TYPE (tmp));
3213 DECL_INITIAL (var) = tmp;
3214 TREE_STATIC (var) = 1;
3215 pushdecl (var);
3216 }
3217 else
3218 {
3219 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3220 gfc_add_modify_expr (&se->pre, var, se->expr);
3221 }
3222 gfc_add_block_to_block (&se->pre, &se->post);
3223
3224 /* Take the address of that value. */
3225 se->expr = build_fold_addr_expr (var);
3226 }
3227
3228
3229 tree
3230 gfc_trans_pointer_assign (gfc_code * code)
3231 {
3232 return gfc_trans_pointer_assignment (code->expr, code->expr2);
3233 }
3234
3235
3236 /* Generate code for a pointer assignment. */
3237
3238 tree
3239 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
3240 {
3241 gfc_se lse;
3242 gfc_se rse;
3243 gfc_ss *lss;
3244 gfc_ss *rss;
3245 stmtblock_t block;
3246 tree desc;
3247 tree tmp;
3248
3249 gfc_start_block (&block);
3250
3251 gfc_init_se (&lse, NULL);
3252
3253 lss = gfc_walk_expr (expr1);
3254 rss = gfc_walk_expr (expr2);
3255 if (lss == gfc_ss_terminator)
3256 {
3257 /* Scalar pointers. */
3258 lse.want_pointer = 1;
3259 gfc_conv_expr (&lse, expr1);
3260 gcc_assert (rss == gfc_ss_terminator);
3261 gfc_init_se (&rse, NULL);
3262 rse.want_pointer = 1;
3263 gfc_conv_expr (&rse, expr2);
3264 gfc_add_block_to_block (&block, &lse.pre);
3265 gfc_add_block_to_block (&block, &rse.pre);
3266 gfc_add_modify_expr (&block, lse.expr,
3267 fold_convert (TREE_TYPE (lse.expr), rse.expr));
3268 gfc_add_block_to_block (&block, &rse.post);
3269 gfc_add_block_to_block (&block, &lse.post);
3270 }
3271 else
3272 {
3273 /* Array pointer. */
3274 gfc_conv_expr_descriptor (&lse, expr1, lss);
3275 switch (expr2->expr_type)
3276 {
3277 case EXPR_NULL:
3278 /* Just set the data pointer to null. */
3279 gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
3280 break;
3281
3282 case EXPR_VARIABLE:
3283 /* Assign directly to the pointer's descriptor. */
3284 lse.direct_byref = 1;
3285 gfc_conv_expr_descriptor (&lse, expr2, rss);
3286 break;
3287
3288 default:
3289 /* Assign to a temporary descriptor and then copy that
3290 temporary to the pointer. */
3291 desc = lse.expr;
3292 tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
3293
3294 lse.expr = tmp;
3295 lse.direct_byref = 1;
3296 gfc_conv_expr_descriptor (&lse, expr2, rss);
3297 gfc_add_modify_expr (&lse.pre, desc, tmp);
3298 break;
3299 }
3300 gfc_add_block_to_block (&block, &lse.pre);
3301 gfc_add_block_to_block (&block, &lse.post);
3302 }
3303 return gfc_finish_block (&block);
3304 }
3305
3306
3307 /* Makes sure se is suitable for passing as a function string parameter. */
3308 /* TODO: Need to check all callers fo this function. It may be abused. */
3309
3310 void
3311 gfc_conv_string_parameter (gfc_se * se)
3312 {
3313 tree type;
3314
3315 if (TREE_CODE (se->expr) == STRING_CST)
3316 {
3317 se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3318 return;
3319 }
3320
3321 type = TREE_TYPE (se->expr);
3322 if (TYPE_STRING_FLAG (type))
3323 {
3324 gcc_assert (TREE_CODE (se->expr) != INDIRECT_REF);
3325 se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3326 }
3327
3328 gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
3329 gcc_assert (se->string_length
3330 && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
3331 }
3332
3333
3334 /* Generate code for assignment of scalar variables. Includes character
3335 strings and derived types with allocatable components. */
3336
3337 tree
3338 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
3339 bool l_is_temp, bool r_is_var)
3340 {
3341 stmtblock_t block;
3342 tree tmp;
3343 tree cond;
3344
3345 gfc_init_block (&block);
3346
3347 if (ts.type == BT_CHARACTER)
3348 {
3349 gcc_assert (lse->string_length != NULL_TREE
3350 && rse->string_length != NULL_TREE);
3351
3352 gfc_conv_string_parameter (lse);
3353 gfc_conv_string_parameter (rse);
3354
3355 gfc_add_block_to_block (&block, &lse->pre);
3356 gfc_add_block_to_block (&block, &rse->pre);
3357
3358 gfc_trans_string_copy (&block, lse->string_length, lse->expr,
3359 rse->string_length, rse->expr);
3360 }
3361 else if (ts.type == BT_DERIVED && ts.derived->attr.alloc_comp)
3362 {
3363 cond = NULL_TREE;
3364
3365 /* Are the rhs and the lhs the same? */
3366 if (r_is_var)
3367 {
3368 cond = fold_build2 (EQ_EXPR, boolean_type_node,
3369 build_fold_addr_expr (lse->expr),
3370 build_fold_addr_expr (rse->expr));
3371 cond = gfc_evaluate_now (cond, &lse->pre);
3372 }
3373
3374 /* Deallocate the lhs allocated components as long as it is not
3375 the same as the rhs. */
3376 if (!l_is_temp)
3377 {
3378 tmp = gfc_deallocate_alloc_comp (ts.derived, lse->expr, 0);
3379 if (r_is_var)
3380 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
3381 gfc_add_expr_to_block (&lse->pre, tmp);
3382 }
3383
3384 gfc_add_block_to_block (&block, &lse->pre);
3385 gfc_add_block_to_block (&block, &rse->pre);
3386
3387 gfc_add_modify_expr (&block, lse->expr,
3388 fold_convert (TREE_TYPE (lse->expr), rse->expr));
3389
3390 /* Do a deep copy if the rhs is a variable, if it is not the
3391 same as the lhs. */
3392 if (r_is_var)
3393 {
3394 tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
3395 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
3396 gfc_add_expr_to_block (&block, tmp);
3397 }
3398 }
3399 else
3400 {
3401 gfc_add_block_to_block (&block, &lse->pre);
3402 gfc_add_block_to_block (&block, &rse->pre);
3403
3404 gfc_add_modify_expr (&block, lse->expr,
3405 fold_convert (TREE_TYPE (lse->expr), rse->expr));
3406 }
3407
3408 gfc_add_block_to_block (&block, &lse->post);
3409 gfc_add_block_to_block (&block, &rse->post);
3410
3411 return gfc_finish_block (&block);
3412 }
3413
3414
3415 /* Try to translate array(:) = func (...), where func is a transformational
3416 array function, without using a temporary. Returns NULL is this isn't the
3417 case. */
3418
3419 static tree
3420 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
3421 {
3422 gfc_se se;
3423 gfc_ss *ss;
3424 gfc_ref * ref;
3425 bool seen_array_ref;
3426
3427 /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
3428 if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
3429 return NULL;
3430
3431 /* Elemental functions don't need a temporary anyway. */
3432 if (expr2->value.function.esym != NULL
3433 && expr2->value.function.esym->attr.elemental)
3434 return NULL;
3435
3436 /* Fail if EXPR1 can't be expressed as a descriptor. */
3437 if (gfc_ref_needs_temporary_p (expr1->ref))
3438 return NULL;
3439
3440 /* Functions returning pointers need temporaries. */
3441 if (expr2->symtree->n.sym->attr.pointer
3442 || expr2->symtree->n.sym->attr.allocatable)
3443 return NULL;
3444
3445 /* Character array functions need temporaries unless the
3446 character lengths are the same. */
3447 if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
3448 {
3449 if (expr1->ts.cl->length == NULL
3450 || expr1->ts.cl->length->expr_type != EXPR_CONSTANT)
3451 return NULL;
3452
3453 if (expr2->ts.cl->length == NULL
3454 || expr2->ts.cl->length->expr_type != EXPR_CONSTANT)
3455 return NULL;
3456
3457 if (mpz_cmp (expr1->ts.cl->length->value.integer,
3458 expr2->ts.cl->length->value.integer) != 0)
3459 return NULL;
3460 }
3461
3462 /* Check that no LHS component references appear during an array
3463 reference. This is needed because we do not have the means to
3464 span any arbitrary stride with an array descriptor. This check
3465 is not needed for the rhs because the function result has to be
3466 a complete type. */
3467 seen_array_ref = false;
3468 for (ref = expr1->ref; ref; ref = ref->next)
3469 {
3470 if (ref->type == REF_ARRAY)
3471 seen_array_ref= true;
3472 else if (ref->type == REF_COMPONENT && seen_array_ref)
3473 return NULL;
3474 }
3475
3476 /* Check for a dependency. */
3477 if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
3478 expr2->value.function.esym,
3479 expr2->value.function.actual))
3480 return NULL;
3481
3482 /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
3483 functions. */
3484 gcc_assert (expr2->value.function.isym
3485 || (gfc_return_by_reference (expr2->value.function.esym)
3486 && expr2->value.function.esym->result->attr.dimension));
3487
3488 ss = gfc_walk_expr (expr1);
3489 gcc_assert (ss != gfc_ss_terminator);
3490 gfc_init_se (&se, NULL);
3491 gfc_start_block (&se.pre);
3492 se.want_pointer = 1;
3493
3494 gfc_conv_array_parameter (&se, expr1, ss, 0);
3495
3496 se.direct_byref = 1;
3497 se.ss = gfc_walk_expr (expr2);
3498 gcc_assert (se.ss != gfc_ss_terminator);
3499 gfc_conv_function_expr (&se, expr2);
3500 gfc_add_block_to_block (&se.pre, &se.post);
3501
3502 return gfc_finish_block (&se.pre);
3503 }
3504
3505 /* Determine whether the given EXPR_CONSTANT is a zero initializer. */
3506
3507 static bool
3508 is_zero_initializer_p (gfc_expr * expr)
3509 {
3510 if (expr->expr_type != EXPR_CONSTANT)
3511 return false;
3512 /* We ignore Hollerith constants for the time being. */
3513 if (expr->from_H)
3514 return false;
3515
3516 switch (expr->ts.type)
3517 {
3518 case BT_INTEGER:
3519 return mpz_cmp_si (expr->value.integer, 0) == 0;
3520
3521 case BT_REAL:
3522 return mpfr_zero_p (expr->value.real)
3523 && MPFR_SIGN (expr->value.real) >= 0;
3524
3525 case BT_LOGICAL:
3526 return expr->value.logical == 0;
3527
3528 case BT_COMPLEX:
3529 return mpfr_zero_p (expr->value.complex.r)
3530 && MPFR_SIGN (expr->value.complex.r) >= 0
3531 && mpfr_zero_p (expr->value.complex.i)
3532 && MPFR_SIGN (expr->value.complex.i) >= 0;
3533
3534 default:
3535 break;
3536 }
3537 return false;
3538 }
3539
3540 /* Try to efficiently translate array(:) = 0. Return NULL if this
3541 can't be done. */
3542
3543 static tree
3544 gfc_trans_zero_assign (gfc_expr * expr)
3545 {
3546 tree dest, len, type;
3547 tree tmp, args;
3548 gfc_symbol *sym;
3549
3550 sym = expr->symtree->n.sym;
3551 dest = gfc_get_symbol_decl (sym);
3552
3553 type = TREE_TYPE (dest);
3554 if (POINTER_TYPE_P (type))
3555 type = TREE_TYPE (type);
3556 if (!GFC_ARRAY_TYPE_P (type))
3557 return NULL_TREE;
3558
3559 /* Determine the length of the array. */
3560 len = GFC_TYPE_ARRAY_SIZE (type);
3561 if (!len || TREE_CODE (len) != INTEGER_CST)
3562 return NULL_TREE;
3563
3564 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
3565 TYPE_SIZE_UNIT (gfc_get_element_type (type)));
3566
3567 /* Convert arguments to the correct types. */
3568 if (!POINTER_TYPE_P (TREE_TYPE (dest)))
3569 dest = gfc_build_addr_expr (pvoid_type_node, dest);
3570 else
3571 dest = fold_convert (pvoid_type_node, dest);
3572 len = fold_convert (size_type_node, len);
3573
3574 /* Construct call to __builtin_memset. */
3575 args = build_tree_list (NULL_TREE, len);
3576 args = tree_cons (NULL_TREE, integer_zero_node, args);
3577 args = tree_cons (NULL_TREE, dest, args);
3578 tmp = build_function_call_expr (built_in_decls[BUILT_IN_MEMSET], args);
3579 return fold_convert (void_type_node, tmp);
3580 }
3581
3582 /* Translate an assignment. Most of the code is concerned with
3583 setting up the scalarizer. */
3584
3585 tree
3586 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
3587 {
3588 gfc_se lse;
3589 gfc_se rse;
3590 gfc_ss *lss;
3591 gfc_ss *lss_section;
3592 gfc_ss *rss;
3593 gfc_loopinfo loop;
3594 tree tmp;
3595 stmtblock_t block;
3596 stmtblock_t body;
3597 bool l_is_temp;
3598
3599 /* Special case a single function returning an array. */
3600 if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
3601 {
3602 tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
3603 if (tmp)
3604 return tmp;
3605 }
3606
3607 /* Special case assigning an array to zero. */
3608 if (expr1->expr_type == EXPR_VARIABLE
3609 && expr1->rank > 0
3610 && expr1->ref
3611 && gfc_full_array_ref_p (expr1->ref)
3612 && is_zero_initializer_p (expr2))
3613 {
3614 tmp = gfc_trans_zero_assign (expr1);
3615 if (tmp)
3616 return tmp;
3617 }
3618
3619 /* Assignment of the form lhs = rhs. */
3620 gfc_start_block (&block);
3621
3622 gfc_init_se (&lse, NULL);
3623 gfc_init_se (&rse, NULL);
3624
3625 /* Walk the lhs. */
3626 lss = gfc_walk_expr (expr1);
3627 rss = NULL;
3628 if (lss != gfc_ss_terminator)
3629 {
3630 /* The assignment needs scalarization. */
3631 lss_section = lss;
3632
3633 /* Find a non-scalar SS from the lhs. */
3634 while (lss_section != gfc_ss_terminator
3635 && lss_section->type != GFC_SS_SECTION)
3636 lss_section = lss_section->next;
3637
3638 gcc_assert (lss_section != gfc_ss_terminator);
3639
3640 /* Initialize the scalarizer. */
3641 gfc_init_loopinfo (&loop);
3642
3643 /* Walk the rhs. */
3644 rss = gfc_walk_expr (expr2);
3645 if (rss == gfc_ss_terminator)
3646 {
3647 /* The rhs is scalar. Add a ss for the expression. */
3648 rss = gfc_get_ss ();
3649 rss->next = gfc_ss_terminator;
3650 rss->type = GFC_SS_SCALAR;
3651 rss->expr = expr2;
3652 }
3653 /* Associate the SS with the loop. */
3654 gfc_add_ss_to_loop (&loop, lss);
3655 gfc_add_ss_to_loop (&loop, rss);
3656
3657 /* Calculate the bounds of the scalarization. */
3658 gfc_conv_ss_startstride (&loop);
3659 /* Resolve any data dependencies in the statement. */
3660 gfc_conv_resolve_dependencies (&loop, lss, rss);
3661 /* Setup the scalarizing loops. */
3662 gfc_conv_loop_setup (&loop);
3663
3664 /* Setup the gfc_se structures. */
3665 gfc_copy_loopinfo_to_se (&lse, &loop);
3666 gfc_copy_loopinfo_to_se (&rse, &loop);
3667
3668 rse.ss = rss;
3669 gfc_mark_ss_chain_used (rss, 1);
3670 if (loop.temp_ss == NULL)
3671 {
3672 lse.ss = lss;
3673 gfc_mark_ss_chain_used (lss, 1);
3674 }
3675 else
3676 {
3677 lse.ss = loop.temp_ss;
3678 gfc_mark_ss_chain_used (lss, 3);
3679 gfc_mark_ss_chain_used (loop.temp_ss, 3);
3680 }
3681
3682 /* Start the scalarized loop body. */
3683 gfc_start_scalarized_body (&loop, &body);
3684 }
3685 else
3686 gfc_init_block (&body);
3687
3688 l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
3689
3690 /* Translate the expression. */
3691 gfc_conv_expr (&rse, expr2);
3692
3693 if (l_is_temp)
3694 {
3695 gfc_conv_tmp_array_ref (&lse);
3696 gfc_advance_se_ss_chain (&lse);
3697 }
3698 else
3699 gfc_conv_expr (&lse, expr1);
3700
3701 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
3702 l_is_temp || init_flag,
3703 expr2->expr_type == EXPR_VARIABLE);
3704 gfc_add_expr_to_block (&body, tmp);
3705
3706 if (lss == gfc_ss_terminator)
3707 {
3708 /* Use the scalar assignment as is. */
3709 gfc_add_block_to_block (&block, &body);
3710 }
3711 else
3712 {
3713 gcc_assert (lse.ss == gfc_ss_terminator
3714 && rse.ss == gfc_ss_terminator);
3715
3716 if (l_is_temp)
3717 {
3718 gfc_trans_scalarized_loop_boundary (&loop, &body);
3719
3720 /* We need to copy the temporary to the actual lhs. */
3721 gfc_init_se (&lse, NULL);
3722 gfc_init_se (&rse, NULL);
3723 gfc_copy_loopinfo_to_se (&lse, &loop);
3724 gfc_copy_loopinfo_to_se (&rse, &loop);
3725
3726 rse.ss = loop.temp_ss;
3727 lse.ss = lss;
3728
3729 gfc_conv_tmp_array_ref (&rse);
3730 gfc_advance_se_ss_chain (&rse);
3731 gfc_conv_expr (&lse, expr1);
3732
3733 gcc_assert (lse.ss == gfc_ss_terminator
3734 && rse.ss == gfc_ss_terminator);
3735
3736 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
3737 false, false);
3738 gfc_add_expr_to_block (&body, tmp);
3739 }
3740
3741 /* Generate the copying loops. */
3742 gfc_trans_scalarizing_loops (&loop, &body);
3743
3744 /* Wrap the whole thing up. */
3745 gfc_add_block_to_block (&block, &loop.pre);
3746 gfc_add_block_to_block (&block, &loop.post);
3747
3748 gfc_cleanup_loop (&loop);
3749 }
3750
3751 return gfc_finish_block (&block);
3752 }
3753
3754 tree
3755 gfc_trans_init_assign (gfc_code * code)
3756 {
3757 return gfc_trans_assignment (code->expr, code->expr2, true);
3758 }
3759
3760 tree
3761 gfc_trans_assign (gfc_code * code)
3762 {
3763 return gfc_trans_assignment (code->expr, code->expr2, false);
3764 }