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