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