]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/fortran/trans-decl.c
2012-01-06 Tobias Burnus <burnus@net-b.de>
[thirdparty/gcc.git] / gcc / fortran / trans-decl.c
1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
3 2011, 2012
4 Free Software Foundation, Inc.
5 Contributed by Paul Brook
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
22
23 /* trans-decl.c -- Handling of backend function and variable decls, etc */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tm.h"
29 #include "tree.h"
30 #include "tree-dump.h"
31 #include "gimple.h" /* For create_tmp_var_raw. */
32 #include "ggc.h"
33 #include "diagnostic-core.h" /* For internal_error. */
34 #include "toplev.h" /* For announce_function. */
35 #include "output.h" /* For decl_default_tls_model. */
36 #include "target.h"
37 #include "function.h"
38 #include "flags.h"
39 #include "cgraph.h"
40 #include "debug.h"
41 #include "gfortran.h"
42 #include "pointer-set.h"
43 #include "constructor.h"
44 #include "trans.h"
45 #include "trans-types.h"
46 #include "trans-array.h"
47 #include "trans-const.h"
48 /* Only for gfc_trans_code. Shouldn't need to include this. */
49 #include "trans-stmt.h"
50
51 #define MAX_LABEL_VALUE 99999
52
53
54 /* Holds the result of the function if no result variable specified. */
55
56 static GTY(()) tree current_fake_result_decl;
57 static GTY(()) tree parent_fake_result_decl;
58
59
60 /* Holds the variable DECLs for the current function. */
61
62 static GTY(()) tree saved_function_decls;
63 static GTY(()) tree saved_parent_function_decls;
64
65 static struct pointer_set_t *nonlocal_dummy_decl_pset;
66 static GTY(()) tree nonlocal_dummy_decls;
67
68 /* Holds the variable DECLs that are locals. */
69
70 static GTY(()) tree saved_local_decls;
71
72 /* The namespace of the module we're currently generating. Only used while
73 outputting decls for module variables. Do not rely on this being set. */
74
75 static gfc_namespace *module_namespace;
76
77 /* The currently processed procedure symbol. */
78 static gfc_symbol* current_procedure_symbol = NULL;
79
80
81 /* With -fcoarray=lib: For generating the registering call
82 of static coarrays. */
83 static bool has_coarray_vars;
84 static stmtblock_t caf_init_block;
85
86
87 /* List of static constructor functions. */
88
89 tree gfc_static_ctors;
90
91
92 /* Function declarations for builtin library functions. */
93
94 tree gfor_fndecl_pause_numeric;
95 tree gfor_fndecl_pause_string;
96 tree gfor_fndecl_stop_numeric;
97 tree gfor_fndecl_stop_numeric_f08;
98 tree gfor_fndecl_stop_string;
99 tree gfor_fndecl_error_stop_numeric;
100 tree gfor_fndecl_error_stop_string;
101 tree gfor_fndecl_runtime_error;
102 tree gfor_fndecl_runtime_error_at;
103 tree gfor_fndecl_runtime_warning_at;
104 tree gfor_fndecl_os_error;
105 tree gfor_fndecl_generate_error;
106 tree gfor_fndecl_set_args;
107 tree gfor_fndecl_set_fpe;
108 tree gfor_fndecl_set_options;
109 tree gfor_fndecl_set_convert;
110 tree gfor_fndecl_set_record_marker;
111 tree gfor_fndecl_set_max_subrecord_length;
112 tree gfor_fndecl_ctime;
113 tree gfor_fndecl_fdate;
114 tree gfor_fndecl_ttynam;
115 tree gfor_fndecl_in_pack;
116 tree gfor_fndecl_in_unpack;
117 tree gfor_fndecl_associated;
118
119
120 /* Coarray run-time library function decls. */
121 tree gfor_fndecl_caf_init;
122 tree gfor_fndecl_caf_finalize;
123 tree gfor_fndecl_caf_register;
124 tree gfor_fndecl_caf_deregister;
125 tree gfor_fndecl_caf_critical;
126 tree gfor_fndecl_caf_end_critical;
127 tree gfor_fndecl_caf_sync_all;
128 tree gfor_fndecl_caf_sync_images;
129 tree gfor_fndecl_caf_error_stop;
130 tree gfor_fndecl_caf_error_stop_str;
131
132 /* Coarray global variables for num_images/this_image. */
133
134 tree gfort_gvar_caf_num_images;
135 tree gfort_gvar_caf_this_image;
136
137
138 /* Math functions. Many other math functions are handled in
139 trans-intrinsic.c. */
140
141 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
142 tree gfor_fndecl_math_ishftc4;
143 tree gfor_fndecl_math_ishftc8;
144 tree gfor_fndecl_math_ishftc16;
145
146
147 /* String functions. */
148
149 tree gfor_fndecl_compare_string;
150 tree gfor_fndecl_concat_string;
151 tree gfor_fndecl_string_len_trim;
152 tree gfor_fndecl_string_index;
153 tree gfor_fndecl_string_scan;
154 tree gfor_fndecl_string_verify;
155 tree gfor_fndecl_string_trim;
156 tree gfor_fndecl_string_minmax;
157 tree gfor_fndecl_adjustl;
158 tree gfor_fndecl_adjustr;
159 tree gfor_fndecl_select_string;
160 tree gfor_fndecl_compare_string_char4;
161 tree gfor_fndecl_concat_string_char4;
162 tree gfor_fndecl_string_len_trim_char4;
163 tree gfor_fndecl_string_index_char4;
164 tree gfor_fndecl_string_scan_char4;
165 tree gfor_fndecl_string_verify_char4;
166 tree gfor_fndecl_string_trim_char4;
167 tree gfor_fndecl_string_minmax_char4;
168 tree gfor_fndecl_adjustl_char4;
169 tree gfor_fndecl_adjustr_char4;
170 tree gfor_fndecl_select_string_char4;
171
172
173 /* Conversion between character kinds. */
174 tree gfor_fndecl_convert_char1_to_char4;
175 tree gfor_fndecl_convert_char4_to_char1;
176
177
178 /* Other misc. runtime library functions. */
179 tree gfor_fndecl_size0;
180 tree gfor_fndecl_size1;
181 tree gfor_fndecl_iargc;
182
183 /* Intrinsic functions implemented in Fortran. */
184 tree gfor_fndecl_sc_kind;
185 tree gfor_fndecl_si_kind;
186 tree gfor_fndecl_sr_kind;
187
188 /* BLAS gemm functions. */
189 tree gfor_fndecl_sgemm;
190 tree gfor_fndecl_dgemm;
191 tree gfor_fndecl_cgemm;
192 tree gfor_fndecl_zgemm;
193
194
195 static void
196 gfc_add_decl_to_parent_function (tree decl)
197 {
198 gcc_assert (decl);
199 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
200 DECL_NONLOCAL (decl) = 1;
201 DECL_CHAIN (decl) = saved_parent_function_decls;
202 saved_parent_function_decls = decl;
203 }
204
205 void
206 gfc_add_decl_to_function (tree decl)
207 {
208 gcc_assert (decl);
209 TREE_USED (decl) = 1;
210 DECL_CONTEXT (decl) = current_function_decl;
211 DECL_CHAIN (decl) = saved_function_decls;
212 saved_function_decls = decl;
213 }
214
215 static void
216 add_decl_as_local (tree decl)
217 {
218 gcc_assert (decl);
219 TREE_USED (decl) = 1;
220 DECL_CONTEXT (decl) = current_function_decl;
221 DECL_CHAIN (decl) = saved_local_decls;
222 saved_local_decls = decl;
223 }
224
225
226 /* Build a backend label declaration. Set TREE_USED for named labels.
227 The context of the label is always the current_function_decl. All
228 labels are marked artificial. */
229
230 tree
231 gfc_build_label_decl (tree label_id)
232 {
233 /* 2^32 temporaries should be enough. */
234 static unsigned int tmp_num = 1;
235 tree label_decl;
236 char *label_name;
237
238 if (label_id == NULL_TREE)
239 {
240 /* Build an internal label name. */
241 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
242 label_id = get_identifier (label_name);
243 }
244 else
245 label_name = NULL;
246
247 /* Build the LABEL_DECL node. Labels have no type. */
248 label_decl = build_decl (input_location,
249 LABEL_DECL, label_id, void_type_node);
250 DECL_CONTEXT (label_decl) = current_function_decl;
251 DECL_MODE (label_decl) = VOIDmode;
252
253 /* We always define the label as used, even if the original source
254 file never references the label. We don't want all kinds of
255 spurious warnings for old-style Fortran code with too many
256 labels. */
257 TREE_USED (label_decl) = 1;
258
259 DECL_ARTIFICIAL (label_decl) = 1;
260 return label_decl;
261 }
262
263
264 /* Set the backend source location of a decl. */
265
266 void
267 gfc_set_decl_location (tree decl, locus * loc)
268 {
269 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
270 }
271
272
273 /* Return the backend label declaration for a given label structure,
274 or create it if it doesn't exist yet. */
275
276 tree
277 gfc_get_label_decl (gfc_st_label * lp)
278 {
279 if (lp->backend_decl)
280 return lp->backend_decl;
281 else
282 {
283 char label_name[GFC_MAX_SYMBOL_LEN + 1];
284 tree label_decl;
285
286 /* Validate the label declaration from the front end. */
287 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
288
289 /* Build a mangled name for the label. */
290 sprintf (label_name, "__label_%.6d", lp->value);
291
292 /* Build the LABEL_DECL node. */
293 label_decl = gfc_build_label_decl (get_identifier (label_name));
294
295 /* Tell the debugger where the label came from. */
296 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
297 gfc_set_decl_location (label_decl, &lp->where);
298 else
299 DECL_ARTIFICIAL (label_decl) = 1;
300
301 /* Store the label in the label list and return the LABEL_DECL. */
302 lp->backend_decl = label_decl;
303 return label_decl;
304 }
305 }
306
307
308 /* Convert a gfc_symbol to an identifier of the same name. */
309
310 static tree
311 gfc_sym_identifier (gfc_symbol * sym)
312 {
313 if (sym->attr.is_main_program && strcmp (sym->name, "main") == 0)
314 return (get_identifier ("MAIN__"));
315 else
316 return (get_identifier (sym->name));
317 }
318
319
320 /* Construct mangled name from symbol name. */
321
322 static tree
323 gfc_sym_mangled_identifier (gfc_symbol * sym)
324 {
325 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
326
327 /* Prevent the mangling of identifiers that have an assigned
328 binding label (mainly those that are bind(c)). */
329 if (sym->attr.is_bind_c == 1
330 && sym->binding_label[0] != '\0')
331 return get_identifier(sym->binding_label);
332
333 if (sym->module == NULL)
334 return gfc_sym_identifier (sym);
335 else
336 {
337 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
338 return get_identifier (name);
339 }
340 }
341
342
343 /* Construct mangled function name from symbol name. */
344
345 static tree
346 gfc_sym_mangled_function_id (gfc_symbol * sym)
347 {
348 int has_underscore;
349 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
350
351 /* It may be possible to simply use the binding label if it's
352 provided, and remove the other checks. Then we could use it
353 for other things if we wished. */
354 if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
355 sym->binding_label[0] != '\0')
356 /* use the binding label rather than the mangled name */
357 return get_identifier (sym->binding_label);
358
359 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
360 || (sym->module != NULL && (sym->attr.external
361 || sym->attr.if_source == IFSRC_IFBODY)))
362 {
363 /* Main program is mangled into MAIN__. */
364 if (sym->attr.is_main_program)
365 return get_identifier ("MAIN__");
366
367 /* Intrinsic procedures are never mangled. */
368 if (sym->attr.proc == PROC_INTRINSIC)
369 return get_identifier (sym->name);
370
371 if (gfc_option.flag_underscoring)
372 {
373 has_underscore = strchr (sym->name, '_') != 0;
374 if (gfc_option.flag_second_underscore && has_underscore)
375 snprintf (name, sizeof name, "%s__", sym->name);
376 else
377 snprintf (name, sizeof name, "%s_", sym->name);
378 return get_identifier (name);
379 }
380 else
381 return get_identifier (sym->name);
382 }
383 else
384 {
385 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
386 return get_identifier (name);
387 }
388 }
389
390
391 void
392 gfc_set_decl_assembler_name (tree decl, tree name)
393 {
394 tree target_mangled = targetm.mangle_decl_assembler_name (decl, name);
395 SET_DECL_ASSEMBLER_NAME (decl, target_mangled);
396 }
397
398
399 /* Returns true if a variable of specified size should go on the stack. */
400
401 int
402 gfc_can_put_var_on_stack (tree size)
403 {
404 unsigned HOST_WIDE_INT low;
405
406 if (!INTEGER_CST_P (size))
407 return 0;
408
409 if (gfc_option.flag_max_stack_var_size < 0)
410 return 1;
411
412 if (TREE_INT_CST_HIGH (size) != 0)
413 return 0;
414
415 low = TREE_INT_CST_LOW (size);
416 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
417 return 0;
418
419 /* TODO: Set a per-function stack size limit. */
420
421 return 1;
422 }
423
424
425 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
426 an expression involving its corresponding pointer. There are
427 2 cases; one for variable size arrays, and one for everything else,
428 because variable-sized arrays require one fewer level of
429 indirection. */
430
431 static void
432 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
433 {
434 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
435 tree value;
436
437 /* Parameters need to be dereferenced. */
438 if (sym->cp_pointer->attr.dummy)
439 ptr_decl = build_fold_indirect_ref_loc (input_location,
440 ptr_decl);
441
442 /* Check to see if we're dealing with a variable-sized array. */
443 if (sym->attr.dimension
444 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
445 {
446 /* These decls will be dereferenced later, so we don't dereference
447 them here. */
448 value = convert (TREE_TYPE (decl), ptr_decl);
449 }
450 else
451 {
452 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
453 ptr_decl);
454 value = build_fold_indirect_ref_loc (input_location,
455 ptr_decl);
456 }
457
458 SET_DECL_VALUE_EXPR (decl, value);
459 DECL_HAS_VALUE_EXPR_P (decl) = 1;
460 GFC_DECL_CRAY_POINTEE (decl) = 1;
461 /* This is a fake variable just for debugging purposes. */
462 TREE_ASM_WRITTEN (decl) = 1;
463 }
464
465
466 /* Finish processing of a declaration without an initial value. */
467
468 static void
469 gfc_finish_decl (tree decl)
470 {
471 gcc_assert (TREE_CODE (decl) == PARM_DECL
472 || DECL_INITIAL (decl) == NULL_TREE);
473
474 if (TREE_CODE (decl) != VAR_DECL)
475 return;
476
477 if (DECL_SIZE (decl) == NULL_TREE
478 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
479 layout_decl (decl, 0);
480
481 /* A few consistency checks. */
482 /* A static variable with an incomplete type is an error if it is
483 initialized. Also if it is not file scope. Otherwise, let it
484 through, but if it is not `extern' then it may cause an error
485 message later. */
486 /* An automatic variable with an incomplete type is an error. */
487
488 /* We should know the storage size. */
489 gcc_assert (DECL_SIZE (decl) != NULL_TREE
490 || (TREE_STATIC (decl)
491 ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
492 : DECL_EXTERNAL (decl)));
493
494 /* The storage size should be constant. */
495 gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
496 || !DECL_SIZE (decl)
497 || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
498 }
499
500
501 /* Apply symbol attributes to a variable, and add it to the function scope. */
502
503 static void
504 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
505 {
506 tree new_type;
507 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
508 This is the equivalent of the TARGET variables.
509 We also need to set this if the variable is passed by reference in a
510 CALL statement. */
511
512 /* Set DECL_VALUE_EXPR for Cray Pointees. */
513 if (sym->attr.cray_pointee)
514 gfc_finish_cray_pointee (decl, sym);
515
516 if (sym->attr.target)
517 TREE_ADDRESSABLE (decl) = 1;
518 /* If it wasn't used we wouldn't be getting it. */
519 TREE_USED (decl) = 1;
520
521 if (sym->attr.flavor == FL_PARAMETER
522 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
523 TREE_READONLY (decl) = 1;
524
525 /* Chain this decl to the pending declarations. Don't do pushdecl()
526 because this would add them to the current scope rather than the
527 function scope. */
528 if (current_function_decl != NULL_TREE)
529 {
530 if (sym->ns->proc_name->backend_decl == current_function_decl
531 || sym->result == sym)
532 gfc_add_decl_to_function (decl);
533 else if (sym->ns->proc_name->attr.flavor == FL_LABEL)
534 /* This is a BLOCK construct. */
535 add_decl_as_local (decl);
536 else
537 gfc_add_decl_to_parent_function (decl);
538 }
539
540 if (sym->attr.cray_pointee)
541 return;
542
543 if(sym->attr.is_bind_c == 1)
544 {
545 /* We need to put variables that are bind(c) into the common
546 segment of the object file, because this is what C would do.
547 gfortran would typically put them in either the BSS or
548 initialized data segments, and only mark them as common if
549 they were part of common blocks. However, if they are not put
550 into common space, then C cannot initialize global Fortran
551 variables that it interoperates with and the draft says that
552 either Fortran or C should be able to initialize it (but not
553 both, of course.) (J3/04-007, section 15.3). */
554 TREE_PUBLIC(decl) = 1;
555 DECL_COMMON(decl) = 1;
556 }
557
558 /* If a variable is USE associated, it's always external. */
559 if (sym->attr.use_assoc)
560 {
561 DECL_EXTERNAL (decl) = 1;
562 TREE_PUBLIC (decl) = 1;
563 }
564 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
565 {
566 /* TODO: Don't set sym->module for result or dummy variables. */
567 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
568 /* This is the declaration of a module variable. */
569 TREE_PUBLIC (decl) = 1;
570 TREE_STATIC (decl) = 1;
571 }
572
573 /* Derived types are a bit peculiar because of the possibility of
574 a default initializer; this must be applied each time the variable
575 comes into scope it therefore need not be static. These variables
576 are SAVE_NONE but have an initializer. Otherwise explicitly
577 initialized variables are SAVE_IMPLICIT and explicitly saved are
578 SAVE_EXPLICIT. */
579 if (!sym->attr.use_assoc
580 && (sym->attr.save != SAVE_NONE || sym->attr.data
581 || (sym->value && sym->ns->proc_name->attr.is_main_program)
582 || (gfc_option.coarray == GFC_FCOARRAY_LIB
583 && sym->attr.codimension && !sym->attr.allocatable)))
584 TREE_STATIC (decl) = 1;
585
586 if (sym->attr.volatile_)
587 {
588 TREE_THIS_VOLATILE (decl) = 1;
589 TREE_SIDE_EFFECTS (decl) = 1;
590 new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
591 TREE_TYPE (decl) = new_type;
592 }
593
594 /* Keep variables larger than max-stack-var-size off stack. */
595 if (!sym->ns->proc_name->attr.recursive
596 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
597 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
598 /* Put variable length auto array pointers always into stack. */
599 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
600 || sym->attr.dimension == 0
601 || sym->as->type != AS_EXPLICIT
602 || sym->attr.pointer
603 || sym->attr.allocatable)
604 && !DECL_ARTIFICIAL (decl))
605 TREE_STATIC (decl) = 1;
606
607 /* Handle threadprivate variables. */
608 if (sym->attr.threadprivate
609 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
610 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
611
612 if (!sym->attr.target
613 && !sym->attr.pointer
614 && !sym->attr.cray_pointee
615 && !sym->attr.proc_pointer)
616 DECL_RESTRICTED_P (decl) = 1;
617 }
618
619
620 /* Allocate the lang-specific part of a decl. */
621
622 void
623 gfc_allocate_lang_decl (tree decl)
624 {
625 DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof
626 (struct lang_decl));
627 }
628
629 /* Remember a symbol to generate initialization/cleanup code at function
630 entry/exit. */
631
632 static void
633 gfc_defer_symbol_init (gfc_symbol * sym)
634 {
635 gfc_symbol *p;
636 gfc_symbol *last;
637 gfc_symbol *head;
638
639 /* Don't add a symbol twice. */
640 if (sym->tlink)
641 return;
642
643 last = head = sym->ns->proc_name;
644 p = last->tlink;
645
646 /* Make sure that setup code for dummy variables which are used in the
647 setup of other variables is generated first. */
648 if (sym->attr.dummy)
649 {
650 /* Find the first dummy arg seen after us, or the first non-dummy arg.
651 This is a circular list, so don't go past the head. */
652 while (p != head
653 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
654 {
655 last = p;
656 p = p->tlink;
657 }
658 }
659 /* Insert in between last and p. */
660 last->tlink = sym;
661 sym->tlink = p;
662 }
663
664
665 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
666 backend_decl for a module symbol, if it all ready exists. If the
667 module gsymbol does not exist, it is created. If the symbol does
668 not exist, it is added to the gsymbol namespace. Returns true if
669 an existing backend_decl is found. */
670
671 bool
672 gfc_get_module_backend_decl (gfc_symbol *sym)
673 {
674 gfc_gsymbol *gsym;
675 gfc_symbol *s;
676 gfc_symtree *st;
677
678 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
679
680 if (!gsym || (gsym->ns && gsym->type == GSYM_MODULE))
681 {
682 st = NULL;
683 s = NULL;
684
685 if (gsym)
686 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
687
688 if (!s)
689 {
690 if (!gsym)
691 {
692 gsym = gfc_get_gsymbol (sym->module);
693 gsym->type = GSYM_MODULE;
694 gsym->ns = gfc_get_namespace (NULL, 0);
695 }
696
697 st = gfc_new_symtree (&gsym->ns->sym_root, sym->name);
698 st->n.sym = sym;
699 sym->refs++;
700 }
701 else if (sym->attr.flavor == FL_DERIVED)
702 {
703 if (s && s->attr.flavor == FL_PROCEDURE)
704 {
705 gfc_interface *intr;
706 gcc_assert (s->attr.generic);
707 for (intr = s->generic; intr; intr = intr->next)
708 if (intr->sym->attr.flavor == FL_DERIVED)
709 {
710 s = intr->sym;
711 break;
712 }
713 }
714
715 if (!s->backend_decl)
716 s->backend_decl = gfc_get_derived_type (s);
717 gfc_copy_dt_decls_ifequal (s, sym, true);
718 return true;
719 }
720 else if (s->backend_decl)
721 {
722 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
723 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
724 true);
725 else if (sym->ts.type == BT_CHARACTER)
726 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
727 sym->backend_decl = s->backend_decl;
728 return true;
729 }
730 }
731 return false;
732 }
733
734
735 /* Create an array index type variable with function scope. */
736
737 static tree
738 create_index_var (const char * pfx, int nest)
739 {
740 tree decl;
741
742 decl = gfc_create_var_np (gfc_array_index_type, pfx);
743 if (nest)
744 gfc_add_decl_to_parent_function (decl);
745 else
746 gfc_add_decl_to_function (decl);
747 return decl;
748 }
749
750
751 /* Create variables to hold all the non-constant bits of info for a
752 descriptorless array. Remember these in the lang-specific part of the
753 type. */
754
755 static void
756 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
757 {
758 tree type;
759 int dim;
760 int nest;
761 gfc_namespace* procns;
762
763 type = TREE_TYPE (decl);
764
765 /* We just use the descriptor, if there is one. */
766 if (GFC_DESCRIPTOR_TYPE_P (type))
767 return;
768
769 gcc_assert (GFC_ARRAY_TYPE_P (type));
770 procns = gfc_find_proc_namespace (sym->ns);
771 nest = (procns->proc_name->backend_decl != current_function_decl)
772 && !sym->attr.contained;
773
774 if (sym->attr.codimension && gfc_option.coarray == GFC_FCOARRAY_LIB
775 && sym->as->type != AS_ASSUMED_SHAPE
776 && GFC_TYPE_ARRAY_CAF_TOKEN (type) == NULL_TREE)
777 {
778 tree token;
779
780 token = gfc_create_var_np (build_qualified_type (pvoid_type_node,
781 TYPE_QUAL_RESTRICT),
782 "caf_token");
783 GFC_TYPE_ARRAY_CAF_TOKEN (type) = token;
784 DECL_ARTIFICIAL (token) = 1;
785 TREE_STATIC (token) = 1;
786 gfc_add_decl_to_function (token);
787 }
788
789 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
790 {
791 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
792 {
793 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
794 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
795 }
796 /* Don't try to use the unknown bound for assumed shape arrays. */
797 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
798 && (sym->as->type != AS_ASSUMED_SIZE
799 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
800 {
801 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
802 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
803 }
804
805 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
806 {
807 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
808 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
809 }
810 }
811 for (dim = GFC_TYPE_ARRAY_RANK (type);
812 dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type); dim++)
813 {
814 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
815 {
816 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
817 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
818 }
819 /* Don't try to use the unknown ubound for the last coarray dimension. */
820 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
821 && dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type) - 1)
822 {
823 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
824 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
825 }
826 }
827 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
828 {
829 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
830 "offset");
831 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
832
833 if (nest)
834 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
835 else
836 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
837 }
838
839 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
840 && sym->as->type != AS_ASSUMED_SIZE)
841 {
842 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
843 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
844 }
845
846 if (POINTER_TYPE_P (type))
847 {
848 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
849 gcc_assert (TYPE_LANG_SPECIFIC (type)
850 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
851 type = TREE_TYPE (type);
852 }
853
854 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
855 {
856 tree size, range;
857
858 size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
859 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
860 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
861 size);
862 TYPE_DOMAIN (type) = range;
863 layout_type (type);
864 }
865
866 if (TYPE_NAME (type) != NULL_TREE
867 && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE
868 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL)
869 {
870 tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
871
872 for (dim = 0; dim < sym->as->rank - 1; dim++)
873 {
874 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
875 gtype = TREE_TYPE (gtype);
876 }
877 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
878 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL)
879 TYPE_NAME (type) = NULL_TREE;
880 }
881
882 if (TYPE_NAME (type) == NULL_TREE)
883 {
884 tree gtype = TREE_TYPE (type), rtype, type_decl;
885
886 for (dim = sym->as->rank - 1; dim >= 0; dim--)
887 {
888 tree lbound, ubound;
889 lbound = GFC_TYPE_ARRAY_LBOUND (type, dim);
890 ubound = GFC_TYPE_ARRAY_UBOUND (type, dim);
891 rtype = build_range_type (gfc_array_index_type, lbound, ubound);
892 gtype = build_array_type (gtype, rtype);
893 /* Ensure the bound variables aren't optimized out at -O0.
894 For -O1 and above they often will be optimized out, but
895 can be tracked by VTA. Also set DECL_NAMELESS, so that
896 the artificial lbound.N or ubound.N DECL_NAME doesn't
897 end up in debug info. */
898 if (lbound && TREE_CODE (lbound) == VAR_DECL
899 && DECL_ARTIFICIAL (lbound) && DECL_IGNORED_P (lbound))
900 {
901 if (DECL_NAME (lbound)
902 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound)),
903 "lbound") != 0)
904 DECL_NAMELESS (lbound) = 1;
905 DECL_IGNORED_P (lbound) = 0;
906 }
907 if (ubound && TREE_CODE (ubound) == VAR_DECL
908 && DECL_ARTIFICIAL (ubound) && DECL_IGNORED_P (ubound))
909 {
910 if (DECL_NAME (ubound)
911 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound)),
912 "ubound") != 0)
913 DECL_NAMELESS (ubound) = 1;
914 DECL_IGNORED_P (ubound) = 0;
915 }
916 }
917 TYPE_NAME (type) = type_decl = build_decl (input_location,
918 TYPE_DECL, NULL, gtype);
919 DECL_ORIGINAL_TYPE (type_decl) = gtype;
920 }
921 }
922
923
924 /* For some dummy arguments we don't use the actual argument directly.
925 Instead we create a local decl and use that. This allows us to perform
926 initialization, and construct full type information. */
927
928 static tree
929 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
930 {
931 tree decl;
932 tree type;
933 gfc_array_spec *as;
934 char *name;
935 gfc_packed packed;
936 int n;
937 bool known_size;
938
939 if (sym->attr.pointer || sym->attr.allocatable)
940 return dummy;
941
942 /* Add to list of variables if not a fake result variable. */
943 if (sym->attr.result || sym->attr.dummy)
944 gfc_defer_symbol_init (sym);
945
946 type = TREE_TYPE (dummy);
947 gcc_assert (TREE_CODE (dummy) == PARM_DECL
948 && POINTER_TYPE_P (type));
949
950 /* Do we know the element size? */
951 known_size = sym->ts.type != BT_CHARACTER
952 || INTEGER_CST_P (sym->ts.u.cl->backend_decl);
953
954 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
955 {
956 /* For descriptorless arrays with known element size the actual
957 argument is sufficient. */
958 gcc_assert (GFC_ARRAY_TYPE_P (type));
959 gfc_build_qualified_array (dummy, sym);
960 return dummy;
961 }
962
963 type = TREE_TYPE (type);
964 if (GFC_DESCRIPTOR_TYPE_P (type))
965 {
966 /* Create a descriptorless array pointer. */
967 as = sym->as;
968 packed = PACKED_NO;
969
970 /* Even when -frepack-arrays is used, symbols with TARGET attribute
971 are not repacked. */
972 if (!gfc_option.flag_repack_arrays || sym->attr.target)
973 {
974 if (as->type == AS_ASSUMED_SIZE)
975 packed = PACKED_FULL;
976 }
977 else
978 {
979 if (as->type == AS_EXPLICIT)
980 {
981 packed = PACKED_FULL;
982 for (n = 0; n < as->rank; n++)
983 {
984 if (!(as->upper[n]
985 && as->lower[n]
986 && as->upper[n]->expr_type == EXPR_CONSTANT
987 && as->lower[n]->expr_type == EXPR_CONSTANT))
988 packed = PACKED_PARTIAL;
989 }
990 }
991 else
992 packed = PACKED_PARTIAL;
993 }
994
995 type = gfc_typenode_for_spec (&sym->ts);
996 type = gfc_get_nodesc_array_type (type, sym->as, packed,
997 !sym->attr.target);
998 }
999 else
1000 {
1001 /* We now have an expression for the element size, so create a fully
1002 qualified type. Reset sym->backend decl or this will just return the
1003 old type. */
1004 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1005 sym->backend_decl = NULL_TREE;
1006 type = gfc_sym_type (sym);
1007 packed = PACKED_FULL;
1008 }
1009
1010 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
1011 decl = build_decl (input_location,
1012 VAR_DECL, get_identifier (name), type);
1013
1014 DECL_ARTIFICIAL (decl) = 1;
1015 DECL_NAMELESS (decl) = 1;
1016 TREE_PUBLIC (decl) = 0;
1017 TREE_STATIC (decl) = 0;
1018 DECL_EXTERNAL (decl) = 0;
1019
1020 /* We should never get deferred shape arrays here. We used to because of
1021 frontend bugs. */
1022 gcc_assert (sym->as->type != AS_DEFERRED);
1023
1024 if (packed == PACKED_PARTIAL)
1025 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
1026 else if (packed == PACKED_FULL)
1027 GFC_DECL_PACKED_ARRAY (decl) = 1;
1028
1029 gfc_build_qualified_array (decl, sym);
1030
1031 if (DECL_LANG_SPECIFIC (dummy))
1032 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
1033 else
1034 gfc_allocate_lang_decl (decl);
1035
1036 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
1037
1038 if (sym->ns->proc_name->backend_decl == current_function_decl
1039 || sym->attr.contained)
1040 gfc_add_decl_to_function (decl);
1041 else
1042 gfc_add_decl_to_parent_function (decl);
1043
1044 return decl;
1045 }
1046
1047 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
1048 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
1049 pointing to the artificial variable for debug info purposes. */
1050
1051 static void
1052 gfc_nonlocal_dummy_array_decl (gfc_symbol *sym)
1053 {
1054 tree decl, dummy;
1055
1056 if (! nonlocal_dummy_decl_pset)
1057 nonlocal_dummy_decl_pset = pointer_set_create ();
1058
1059 if (pointer_set_insert (nonlocal_dummy_decl_pset, sym->backend_decl))
1060 return;
1061
1062 dummy = GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl);
1063 decl = build_decl (input_location, VAR_DECL, DECL_NAME (dummy),
1064 TREE_TYPE (sym->backend_decl));
1065 DECL_ARTIFICIAL (decl) = 0;
1066 TREE_USED (decl) = 1;
1067 TREE_PUBLIC (decl) = 0;
1068 TREE_STATIC (decl) = 0;
1069 DECL_EXTERNAL (decl) = 0;
1070 if (DECL_BY_REFERENCE (dummy))
1071 DECL_BY_REFERENCE (decl) = 1;
1072 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (sym->backend_decl);
1073 SET_DECL_VALUE_EXPR (decl, sym->backend_decl);
1074 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1075 DECL_CONTEXT (decl) = DECL_CONTEXT (sym->backend_decl);
1076 DECL_CHAIN (decl) = nonlocal_dummy_decls;
1077 nonlocal_dummy_decls = decl;
1078 }
1079
1080 /* Return a constant or a variable to use as a string length. Does not
1081 add the decl to the current scope. */
1082
1083 static tree
1084 gfc_create_string_length (gfc_symbol * sym)
1085 {
1086 gcc_assert (sym->ts.u.cl);
1087 gfc_conv_const_charlen (sym->ts.u.cl);
1088
1089 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1090 {
1091 tree length;
1092 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1093
1094 /* Also prefix the mangled name. */
1095 strcpy (&name[1], sym->name);
1096 name[0] = '.';
1097 length = build_decl (input_location,
1098 VAR_DECL, get_identifier (name),
1099 gfc_charlen_type_node);
1100 DECL_ARTIFICIAL (length) = 1;
1101 TREE_USED (length) = 1;
1102 if (sym->ns->proc_name->tlink != NULL)
1103 gfc_defer_symbol_init (sym);
1104
1105 sym->ts.u.cl->backend_decl = length;
1106 }
1107
1108 gcc_assert (sym->ts.u.cl->backend_decl != NULL_TREE);
1109 return sym->ts.u.cl->backend_decl;
1110 }
1111
1112 /* If a variable is assigned a label, we add another two auxiliary
1113 variables. */
1114
1115 static void
1116 gfc_add_assign_aux_vars (gfc_symbol * sym)
1117 {
1118 tree addr;
1119 tree length;
1120 tree decl;
1121
1122 gcc_assert (sym->backend_decl);
1123
1124 decl = sym->backend_decl;
1125 gfc_allocate_lang_decl (decl);
1126 GFC_DECL_ASSIGN (decl) = 1;
1127 length = build_decl (input_location,
1128 VAR_DECL, create_tmp_var_name (sym->name),
1129 gfc_charlen_type_node);
1130 addr = build_decl (input_location,
1131 VAR_DECL, create_tmp_var_name (sym->name),
1132 pvoid_type_node);
1133 gfc_finish_var_decl (length, sym);
1134 gfc_finish_var_decl (addr, sym);
1135 /* STRING_LENGTH is also used as flag. Less than -1 means that
1136 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1137 target label's address. Otherwise, value is the length of a format string
1138 and ASSIGN_ADDR is its address. */
1139 if (TREE_STATIC (length))
1140 DECL_INITIAL (length) = build_int_cst (gfc_charlen_type_node, -2);
1141 else
1142 gfc_defer_symbol_init (sym);
1143
1144 GFC_DECL_STRING_LEN (decl) = length;
1145 GFC_DECL_ASSIGN_ADDR (decl) = addr;
1146 }
1147
1148
1149 static tree
1150 add_attributes_to_decl (symbol_attribute sym_attr, tree list)
1151 {
1152 unsigned id;
1153 tree attr;
1154
1155 for (id = 0; id < EXT_ATTR_NUM; id++)
1156 if (sym_attr.ext_attr & (1 << id))
1157 {
1158 attr = build_tree_list (
1159 get_identifier (ext_attr_list[id].middle_end_name),
1160 NULL_TREE);
1161 list = chainon (list, attr);
1162 }
1163
1164 return list;
1165 }
1166
1167
1168 static void build_function_decl (gfc_symbol * sym, bool global);
1169
1170
1171 /* Return the decl for a gfc_symbol, create it if it doesn't already
1172 exist. */
1173
1174 tree
1175 gfc_get_symbol_decl (gfc_symbol * sym)
1176 {
1177 tree decl;
1178 tree length = NULL_TREE;
1179 tree attributes;
1180 int byref;
1181 bool intrinsic_array_parameter = false;
1182
1183 gcc_assert (sym->attr.referenced
1184 || sym->attr.use_assoc
1185 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY
1186 || (sym->module && sym->attr.if_source != IFSRC_DECL
1187 && sym->backend_decl));
1188
1189 if (sym->ns && sym->ns->proc_name && sym->ns->proc_name->attr.function)
1190 byref = gfc_return_by_reference (sym->ns->proc_name);
1191 else
1192 byref = 0;
1193
1194 /* Make sure that the vtab for the declared type is completed. */
1195 if (sym->ts.type == BT_CLASS)
1196 {
1197 gfc_component *c = CLASS_DATA (sym);
1198 if (!c->ts.u.derived->backend_decl)
1199 {
1200 gfc_find_derived_vtab (c->ts.u.derived);
1201 gfc_get_derived_type (sym->ts.u.derived);
1202 }
1203 }
1204
1205 /* All deferred character length procedures need to retain the backend
1206 decl, which is a pointer to the character length in the caller's
1207 namespace and to declare a local character length. */
1208 if (!byref && sym->attr.function
1209 && sym->ts.type == BT_CHARACTER
1210 && sym->ts.deferred
1211 && sym->ts.u.cl->passed_length == NULL
1212 && sym->ts.u.cl->backend_decl
1213 && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL)
1214 {
1215 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1216 sym->ts.u.cl->backend_decl = NULL_TREE;
1217 length = gfc_create_string_length (sym);
1218 }
1219
1220 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
1221 {
1222 /* Return via extra parameter. */
1223 if (sym->attr.result && byref
1224 && !sym->backend_decl)
1225 {
1226 sym->backend_decl =
1227 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
1228 /* For entry master function skip over the __entry
1229 argument. */
1230 if (sym->ns->proc_name->attr.entry_master)
1231 sym->backend_decl = DECL_CHAIN (sym->backend_decl);
1232 }
1233
1234 /* Dummy variables should already have been created. */
1235 gcc_assert (sym->backend_decl);
1236
1237 /* Create a character length variable. */
1238 if (sym->ts.type == BT_CHARACTER)
1239 {
1240 /* For a deferred dummy, make a new string length variable. */
1241 if (sym->ts.deferred
1242 &&
1243 (sym->ts.u.cl->passed_length == sym->ts.u.cl->backend_decl))
1244 sym->ts.u.cl->backend_decl = NULL_TREE;
1245
1246 if (sym->ts.deferred && sym->attr.result
1247 && sym->ts.u.cl->passed_length == NULL
1248 && sym->ts.u.cl->backend_decl)
1249 {
1250 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1251 sym->ts.u.cl->backend_decl = NULL_TREE;
1252 }
1253
1254 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1255 length = gfc_create_string_length (sym);
1256 else
1257 length = sym->ts.u.cl->backend_decl;
1258 if (TREE_CODE (length) == VAR_DECL
1259 && DECL_FILE_SCOPE_P (length))
1260 {
1261 /* Add the string length to the same context as the symbol. */
1262 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
1263 gfc_add_decl_to_function (length);
1264 else
1265 gfc_add_decl_to_parent_function (length);
1266
1267 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
1268 DECL_CONTEXT (length));
1269
1270 gfc_defer_symbol_init (sym);
1271 }
1272 }
1273
1274 /* Use a copy of the descriptor for dummy arrays. */
1275 if ((sym->attr.dimension || sym->attr.codimension)
1276 && !TREE_USED (sym->backend_decl))
1277 {
1278 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
1279 /* Prevent the dummy from being detected as unused if it is copied. */
1280 if (sym->backend_decl != NULL && decl != sym->backend_decl)
1281 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1282 sym->backend_decl = decl;
1283 }
1284
1285 TREE_USED (sym->backend_decl) = 1;
1286 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
1287 {
1288 gfc_add_assign_aux_vars (sym);
1289 }
1290
1291 if (sym->attr.dimension
1292 && DECL_LANG_SPECIFIC (sym->backend_decl)
1293 && GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl)
1294 && DECL_CONTEXT (sym->backend_decl) != current_function_decl)
1295 gfc_nonlocal_dummy_array_decl (sym);
1296
1297 if (sym->ts.type == BT_CLASS && sym->backend_decl)
1298 GFC_DECL_CLASS(sym->backend_decl) = 1;
1299
1300 if (sym->ts.type == BT_CLASS && sym->backend_decl)
1301 GFC_DECL_CLASS(sym->backend_decl) = 1;
1302 return sym->backend_decl;
1303 }
1304
1305 if (sym->backend_decl)
1306 return sym->backend_decl;
1307
1308 /* Special case for array-valued named constants from intrinsic
1309 procedures; those are inlined. */
1310 if (sym->attr.use_assoc && sym->from_intmod
1311 && sym->attr.flavor == FL_PARAMETER)
1312 intrinsic_array_parameter = true;
1313
1314 /* If use associated and whole file compilation, use the module
1315 declaration. */
1316 if (gfc_option.flag_whole_file
1317 && (sym->attr.flavor == FL_VARIABLE
1318 || sym->attr.flavor == FL_PARAMETER)
1319 && sym->attr.use_assoc
1320 && !intrinsic_array_parameter
1321 && sym->module
1322 && gfc_get_module_backend_decl (sym))
1323 {
1324 if (sym->ts.type == BT_CLASS && sym->backend_decl)
1325 GFC_DECL_CLASS(sym->backend_decl) = 1;
1326 return sym->backend_decl;
1327 }
1328
1329 if (sym->attr.flavor == FL_PROCEDURE)
1330 {
1331 /* Catch function declarations. Only used for actual parameters,
1332 procedure pointers and procptr initialization targets. */
1333 if (sym->attr.external || sym->attr.use_assoc || sym->attr.intrinsic)
1334 {
1335 decl = gfc_get_extern_function_decl (sym);
1336 gfc_set_decl_location (decl, &sym->declared_at);
1337 }
1338 else
1339 {
1340 if (!sym->backend_decl)
1341 build_function_decl (sym, false);
1342 decl = sym->backend_decl;
1343 }
1344 return decl;
1345 }
1346
1347 if (sym->attr.intrinsic)
1348 internal_error ("intrinsic variable which isn't a procedure");
1349
1350 /* Create string length decl first so that they can be used in the
1351 type declaration. */
1352 if (sym->ts.type == BT_CHARACTER)
1353 length = gfc_create_string_length (sym);
1354
1355 /* Create the decl for the variable. */
1356 decl = build_decl (sym->declared_at.lb->location,
1357 VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
1358
1359 /* Add attributes to variables. Functions are handled elsewhere. */
1360 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1361 decl_attributes (&decl, attributes, 0);
1362
1363 /* Symbols from modules should have their assembler names mangled.
1364 This is done here rather than in gfc_finish_var_decl because it
1365 is different for string length variables. */
1366 if (sym->module)
1367 {
1368 gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
1369 if (sym->attr.use_assoc && !intrinsic_array_parameter)
1370 DECL_IGNORED_P (decl) = 1;
1371 }
1372
1373 if (sym->attr.dimension || sym->attr.codimension)
1374 {
1375 /* Create variables to hold the non-constant bits of array info. */
1376 gfc_build_qualified_array (decl, sym);
1377
1378 if (sym->attr.contiguous
1379 || ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer))
1380 GFC_DECL_PACKED_ARRAY (decl) = 1;
1381 }
1382
1383 /* Remember this variable for allocation/cleanup. */
1384 if (sym->attr.dimension || sym->attr.allocatable || sym->attr.codimension
1385 || (sym->ts.type == BT_CLASS &&
1386 (CLASS_DATA (sym)->attr.dimension
1387 || CLASS_DATA (sym)->attr.allocatable))
1388 || (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
1389 /* This applies a derived type default initializer. */
1390 || (sym->ts.type == BT_DERIVED
1391 && sym->attr.save == SAVE_NONE
1392 && !sym->attr.data
1393 && !sym->attr.allocatable
1394 && (sym->value && !sym->ns->proc_name->attr.is_main_program)
1395 && !(sym->attr.use_assoc && !intrinsic_array_parameter)))
1396 gfc_defer_symbol_init (sym);
1397
1398 gfc_finish_var_decl (decl, sym);
1399
1400 if (sym->ts.type == BT_CHARACTER)
1401 {
1402 /* Character variables need special handling. */
1403 gfc_allocate_lang_decl (decl);
1404
1405 if (TREE_CODE (length) != INTEGER_CST)
1406 {
1407 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1408
1409 if (sym->module)
1410 {
1411 /* Also prefix the mangled name for symbols from modules. */
1412 strcpy (&name[1], sym->name);
1413 name[0] = '.';
1414 strcpy (&name[1],
1415 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
1416 gfc_set_decl_assembler_name (decl, get_identifier (name));
1417 }
1418 gfc_finish_var_decl (length, sym);
1419 gcc_assert (!sym->value);
1420 }
1421 }
1422 else if (sym->attr.subref_array_pointer)
1423 {
1424 /* We need the span for these beasts. */
1425 gfc_allocate_lang_decl (decl);
1426 }
1427
1428 if (sym->attr.subref_array_pointer)
1429 {
1430 tree span;
1431 GFC_DECL_SUBREF_ARRAY_P (decl) = 1;
1432 span = build_decl (input_location,
1433 VAR_DECL, create_tmp_var_name ("span"),
1434 gfc_array_index_type);
1435 gfc_finish_var_decl (span, sym);
1436 TREE_STATIC (span) = TREE_STATIC (decl);
1437 DECL_ARTIFICIAL (span) = 1;
1438
1439 GFC_DECL_SPAN (decl) = span;
1440 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span;
1441 }
1442
1443 if (sym->ts.type == BT_CLASS)
1444 GFC_DECL_CLASS(decl) = 1;
1445
1446 sym->backend_decl = decl;
1447
1448 if (sym->attr.assign)
1449 gfc_add_assign_aux_vars (sym);
1450
1451 if (intrinsic_array_parameter)
1452 {
1453 TREE_STATIC (decl) = 1;
1454 DECL_EXTERNAL (decl) = 0;
1455 }
1456
1457 if (TREE_STATIC (decl)
1458 && !(sym->attr.use_assoc && !intrinsic_array_parameter)
1459 && (sym->attr.save || sym->ns->proc_name->attr.is_main_program
1460 || gfc_option.flag_max_stack_var_size == 0
1461 || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
1462 && (gfc_option.coarray != GFC_FCOARRAY_LIB
1463 || !sym->attr.codimension || sym->attr.allocatable))
1464 {
1465 /* Add static initializer. For procedures, it is only needed if
1466 SAVE is specified otherwise they need to be reinitialized
1467 every time the procedure is entered. The TREE_STATIC is
1468 in this case due to -fmax-stack-var-size=. */
1469 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1470 TREE_TYPE (decl),
1471 sym->attr.dimension
1472 || (sym->attr.codimension
1473 && sym->attr.allocatable),
1474 sym->attr.pointer
1475 || sym->attr.allocatable,
1476 sym->attr.proc_pointer);
1477 }
1478
1479 if (!TREE_STATIC (decl)
1480 && POINTER_TYPE_P (TREE_TYPE (decl))
1481 && !sym->attr.pointer
1482 && !sym->attr.allocatable
1483 && !sym->attr.proc_pointer)
1484 DECL_BY_REFERENCE (decl) = 1;
1485
1486 if (sym->attr.vtab
1487 || (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0))
1488 GFC_DECL_PUSH_TOPLEVEL (decl) = 1;
1489
1490 return decl;
1491 }
1492
1493
1494 /* Substitute a temporary variable in place of the real one. */
1495
1496 void
1497 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1498 {
1499 save->attr = sym->attr;
1500 save->decl = sym->backend_decl;
1501
1502 gfc_clear_attr (&sym->attr);
1503 sym->attr.referenced = 1;
1504 sym->attr.flavor = FL_VARIABLE;
1505
1506 sym->backend_decl = decl;
1507 }
1508
1509
1510 /* Restore the original variable. */
1511
1512 void
1513 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1514 {
1515 sym->attr = save->attr;
1516 sym->backend_decl = save->decl;
1517 }
1518
1519
1520 /* Declare a procedure pointer. */
1521
1522 static tree
1523 get_proc_pointer_decl (gfc_symbol *sym)
1524 {
1525 tree decl;
1526 tree attributes;
1527
1528 decl = sym->backend_decl;
1529 if (decl)
1530 return decl;
1531
1532 decl = build_decl (input_location,
1533 VAR_DECL, get_identifier (sym->name),
1534 build_pointer_type (gfc_get_function_type (sym)));
1535
1536 if ((sym->ns->proc_name
1537 && sym->ns->proc_name->backend_decl == current_function_decl)
1538 || sym->attr.contained)
1539 gfc_add_decl_to_function (decl);
1540 else if (sym->ns->proc_name->attr.flavor != FL_MODULE)
1541 gfc_add_decl_to_parent_function (decl);
1542
1543 sym->backend_decl = decl;
1544
1545 /* If a variable is USE associated, it's always external. */
1546 if (sym->attr.use_assoc)
1547 {
1548 DECL_EXTERNAL (decl) = 1;
1549 TREE_PUBLIC (decl) = 1;
1550 }
1551 else if (sym->module && sym->ns->proc_name->attr.flavor == FL_MODULE)
1552 {
1553 /* This is the declaration of a module variable. */
1554 TREE_PUBLIC (decl) = 1;
1555 TREE_STATIC (decl) = 1;
1556 }
1557
1558 if (!sym->attr.use_assoc
1559 && (sym->attr.save != SAVE_NONE || sym->attr.data
1560 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
1561 TREE_STATIC (decl) = 1;
1562
1563 if (TREE_STATIC (decl) && sym->value)
1564 {
1565 /* Add static initializer. */
1566 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1567 TREE_TYPE (decl),
1568 sym->attr.dimension,
1569 false, true);
1570 }
1571
1572 /* Handle threadprivate procedure pointers. */
1573 if (sym->attr.threadprivate
1574 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
1575 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
1576
1577 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1578 decl_attributes (&decl, attributes, 0);
1579
1580 return decl;
1581 }
1582
1583
1584 /* Get a basic decl for an external function. */
1585
1586 tree
1587 gfc_get_extern_function_decl (gfc_symbol * sym)
1588 {
1589 tree type;
1590 tree fndecl;
1591 tree attributes;
1592 gfc_expr e;
1593 gfc_intrinsic_sym *isym;
1594 gfc_expr argexpr;
1595 char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'. */
1596 tree name;
1597 tree mangled_name;
1598 gfc_gsymbol *gsym;
1599
1600 if (sym->backend_decl)
1601 return sym->backend_decl;
1602
1603 /* We should never be creating external decls for alternate entry points.
1604 The procedure may be an alternate entry point, but we don't want/need
1605 to know that. */
1606 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1607
1608 if (sym->attr.proc_pointer)
1609 return get_proc_pointer_decl (sym);
1610
1611 /* See if this is an external procedure from the same file. If so,
1612 return the backend_decl. */
1613 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name);
1614
1615 if (gfc_option.flag_whole_file
1616 && (!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL)
1617 && !sym->backend_decl
1618 && gsym && gsym->ns
1619 && ((gsym->type == GSYM_SUBROUTINE) || (gsym->type == GSYM_FUNCTION))
1620 && (gsym->ns->proc_name->backend_decl || !sym->attr.intrinsic))
1621 {
1622 if (!gsym->ns->proc_name->backend_decl)
1623 {
1624 /* By construction, the external function cannot be
1625 a contained procedure. */
1626 locus old_loc;
1627 tree save_fn_decl = current_function_decl;
1628
1629 current_function_decl = NULL_TREE;
1630 gfc_save_backend_locus (&old_loc);
1631 push_cfun (cfun);
1632
1633 gfc_create_function_decl (gsym->ns, true);
1634
1635 pop_cfun ();
1636 gfc_restore_backend_locus (&old_loc);
1637 current_function_decl = save_fn_decl;
1638 }
1639
1640 /* If the namespace has entries, the proc_name is the
1641 entry master. Find the entry and use its backend_decl.
1642 otherwise, use the proc_name backend_decl. */
1643 if (gsym->ns->entries)
1644 {
1645 gfc_entry_list *entry = gsym->ns->entries;
1646
1647 for (; entry; entry = entry->next)
1648 {
1649 if (strcmp (gsym->name, entry->sym->name) == 0)
1650 {
1651 sym->backend_decl = entry->sym->backend_decl;
1652 break;
1653 }
1654 }
1655 }
1656 else
1657 sym->backend_decl = gsym->ns->proc_name->backend_decl;
1658
1659 if (sym->backend_decl)
1660 {
1661 /* Avoid problems of double deallocation of the backend declaration
1662 later in gfc_trans_use_stmts; cf. PR 45087. */
1663 if (sym->attr.if_source != IFSRC_DECL && sym->attr.use_assoc)
1664 sym->attr.use_assoc = 0;
1665
1666 return sym->backend_decl;
1667 }
1668 }
1669
1670 /* See if this is a module procedure from the same file. If so,
1671 return the backend_decl. */
1672 if (sym->module)
1673 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
1674
1675 if (gfc_option.flag_whole_file
1676 && gsym && gsym->ns
1677 && gsym->type == GSYM_MODULE)
1678 {
1679 gfc_symbol *s;
1680
1681 s = NULL;
1682 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
1683 if (s && s->backend_decl)
1684 {
1685 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
1686 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
1687 true);
1688 else if (sym->ts.type == BT_CHARACTER)
1689 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
1690 sym->backend_decl = s->backend_decl;
1691 return sym->backend_decl;
1692 }
1693 }
1694
1695 if (sym->attr.intrinsic)
1696 {
1697 /* Call the resolution function to get the actual name. This is
1698 a nasty hack which relies on the resolution functions only looking
1699 at the first argument. We pass NULL for the second argument
1700 otherwise things like AINT get confused. */
1701 isym = gfc_find_function (sym->name);
1702 gcc_assert (isym->resolve.f0 != NULL);
1703
1704 memset (&e, 0, sizeof (e));
1705 e.expr_type = EXPR_FUNCTION;
1706
1707 memset (&argexpr, 0, sizeof (argexpr));
1708 gcc_assert (isym->formal);
1709 argexpr.ts = isym->formal->ts;
1710
1711 if (isym->formal->next == NULL)
1712 isym->resolve.f1 (&e, &argexpr);
1713 else
1714 {
1715 if (isym->formal->next->next == NULL)
1716 isym->resolve.f2 (&e, &argexpr, NULL);
1717 else
1718 {
1719 if (isym->formal->next->next->next == NULL)
1720 isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1721 else
1722 {
1723 /* All specific intrinsics take less than 5 arguments. */
1724 gcc_assert (isym->formal->next->next->next->next == NULL);
1725 isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
1726 }
1727 }
1728 }
1729
1730 if (gfc_option.flag_f2c
1731 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1732 || e.ts.type == BT_COMPLEX))
1733 {
1734 /* Specific which needs a different implementation if f2c
1735 calling conventions are used. */
1736 sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1737 }
1738 else
1739 sprintf (s, "_gfortran_specific%s", e.value.function.name);
1740
1741 name = get_identifier (s);
1742 mangled_name = name;
1743 }
1744 else
1745 {
1746 name = gfc_sym_identifier (sym);
1747 mangled_name = gfc_sym_mangled_function_id (sym);
1748 }
1749
1750 type = gfc_get_function_type (sym);
1751 fndecl = build_decl (input_location,
1752 FUNCTION_DECL, name, type);
1753
1754 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1755 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1756 the opposite of declaring a function as static in C). */
1757 DECL_EXTERNAL (fndecl) = 1;
1758 TREE_PUBLIC (fndecl) = 1;
1759
1760 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1761 decl_attributes (&fndecl, attributes, 0);
1762
1763 gfc_set_decl_assembler_name (fndecl, mangled_name);
1764
1765 /* Set the context of this decl. */
1766 if (0 && sym->ns && sym->ns->proc_name)
1767 {
1768 /* TODO: Add external decls to the appropriate scope. */
1769 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1770 }
1771 else
1772 {
1773 /* Global declaration, e.g. intrinsic subroutine. */
1774 DECL_CONTEXT (fndecl) = NULL_TREE;
1775 }
1776
1777 /* Set attributes for PURE functions. A call to PURE function in the
1778 Fortran 95 sense is both pure and without side effects in the C
1779 sense. */
1780 if (sym->attr.pure || sym->attr.elemental)
1781 {
1782 if (sym->attr.function && !gfc_return_by_reference (sym))
1783 DECL_PURE_P (fndecl) = 1;
1784 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1785 parameters and don't use alternate returns (is this
1786 allowed?). In that case, calls to them are meaningless, and
1787 can be optimized away. See also in build_function_decl(). */
1788 TREE_SIDE_EFFECTS (fndecl) = 0;
1789 }
1790
1791 /* Mark non-returning functions. */
1792 if (sym->attr.noreturn)
1793 TREE_THIS_VOLATILE(fndecl) = 1;
1794
1795 sym->backend_decl = fndecl;
1796
1797 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1798 pushdecl_top_level (fndecl);
1799
1800 return fndecl;
1801 }
1802
1803
1804 /* Create a declaration for a procedure. For external functions (in the C
1805 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1806 a master function with alternate entry points. */
1807
1808 static void
1809 build_function_decl (gfc_symbol * sym, bool global)
1810 {
1811 tree fndecl, type, attributes;
1812 symbol_attribute attr;
1813 tree result_decl;
1814 gfc_formal_arglist *f;
1815
1816 gcc_assert (!sym->attr.external);
1817
1818 if (sym->backend_decl)
1819 return;
1820
1821 /* Set the line and filename. sym->declared_at seems to point to the
1822 last statement for subroutines, but it'll do for now. */
1823 gfc_set_backend_locus (&sym->declared_at);
1824
1825 /* Allow only one nesting level. Allow public declarations. */
1826 gcc_assert (current_function_decl == NULL_TREE
1827 || DECL_FILE_SCOPE_P (current_function_decl)
1828 || (TREE_CODE (DECL_CONTEXT (current_function_decl))
1829 == NAMESPACE_DECL));
1830
1831 type = gfc_get_function_type (sym);
1832 fndecl = build_decl (input_location,
1833 FUNCTION_DECL, gfc_sym_identifier (sym), type);
1834
1835 attr = sym->attr;
1836
1837 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1838 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1839 the opposite of declaring a function as static in C). */
1840 DECL_EXTERNAL (fndecl) = 0;
1841
1842 if (!current_function_decl
1843 && !sym->attr.entry_master && !sym->attr.is_main_program)
1844 TREE_PUBLIC (fndecl) = 1;
1845
1846 attributes = add_attributes_to_decl (attr, NULL_TREE);
1847 decl_attributes (&fndecl, attributes, 0);
1848
1849 /* Figure out the return type of the declared function, and build a
1850 RESULT_DECL for it. If this is a subroutine with alternate
1851 returns, build a RESULT_DECL for it. */
1852 result_decl = NULL_TREE;
1853 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1854 if (attr.function)
1855 {
1856 if (gfc_return_by_reference (sym))
1857 type = void_type_node;
1858 else
1859 {
1860 if (sym->result != sym)
1861 result_decl = gfc_sym_identifier (sym->result);
1862
1863 type = TREE_TYPE (TREE_TYPE (fndecl));
1864 }
1865 }
1866 else
1867 {
1868 /* Look for alternate return placeholders. */
1869 int has_alternate_returns = 0;
1870 for (f = sym->formal; f; f = f->next)
1871 {
1872 if (f->sym == NULL)
1873 {
1874 has_alternate_returns = 1;
1875 break;
1876 }
1877 }
1878
1879 if (has_alternate_returns)
1880 type = integer_type_node;
1881 else
1882 type = void_type_node;
1883 }
1884
1885 result_decl = build_decl (input_location,
1886 RESULT_DECL, result_decl, type);
1887 DECL_ARTIFICIAL (result_decl) = 1;
1888 DECL_IGNORED_P (result_decl) = 1;
1889 DECL_CONTEXT (result_decl) = fndecl;
1890 DECL_RESULT (fndecl) = result_decl;
1891
1892 /* Don't call layout_decl for a RESULT_DECL.
1893 layout_decl (result_decl, 0); */
1894
1895 /* TREE_STATIC means the function body is defined here. */
1896 TREE_STATIC (fndecl) = 1;
1897
1898 /* Set attributes for PURE functions. A call to a PURE function in the
1899 Fortran 95 sense is both pure and without side effects in the C
1900 sense. */
1901 if (attr.pure || attr.elemental)
1902 {
1903 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1904 including an alternate return. In that case it can also be
1905 marked as PURE. See also in gfc_get_extern_function_decl(). */
1906 if (attr.function && !gfc_return_by_reference (sym))
1907 DECL_PURE_P (fndecl) = 1;
1908 TREE_SIDE_EFFECTS (fndecl) = 0;
1909 }
1910
1911
1912 /* Layout the function declaration and put it in the binding level
1913 of the current function. */
1914
1915 if (global
1916 || (sym->name[0] == '_' && strncmp ("__copy", sym->name, 6) == 0))
1917 pushdecl_top_level (fndecl);
1918 else
1919 pushdecl (fndecl);
1920
1921 /* Perform name mangling if this is a top level or module procedure. */
1922 if (current_function_decl == NULL_TREE)
1923 gfc_set_decl_assembler_name (fndecl, gfc_sym_mangled_function_id (sym));
1924
1925 sym->backend_decl = fndecl;
1926 }
1927
1928
1929 /* Create the DECL_ARGUMENTS for a procedure. */
1930
1931 static void
1932 create_function_arglist (gfc_symbol * sym)
1933 {
1934 tree fndecl;
1935 gfc_formal_arglist *f;
1936 tree typelist, hidden_typelist;
1937 tree arglist, hidden_arglist;
1938 tree type;
1939 tree parm;
1940
1941 fndecl = sym->backend_decl;
1942
1943 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1944 the new FUNCTION_DECL node. */
1945 arglist = NULL_TREE;
1946 hidden_arglist = NULL_TREE;
1947 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1948
1949 if (sym->attr.entry_master)
1950 {
1951 type = TREE_VALUE (typelist);
1952 parm = build_decl (input_location,
1953 PARM_DECL, get_identifier ("__entry"), type);
1954
1955 DECL_CONTEXT (parm) = fndecl;
1956 DECL_ARG_TYPE (parm) = type;
1957 TREE_READONLY (parm) = 1;
1958 gfc_finish_decl (parm);
1959 DECL_ARTIFICIAL (parm) = 1;
1960
1961 arglist = chainon (arglist, parm);
1962 typelist = TREE_CHAIN (typelist);
1963 }
1964
1965 if (gfc_return_by_reference (sym))
1966 {
1967 tree type = TREE_VALUE (typelist), length = NULL;
1968
1969 if (sym->ts.type == BT_CHARACTER)
1970 {
1971 /* Length of character result. */
1972 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1973
1974 length = build_decl (input_location,
1975 PARM_DECL,
1976 get_identifier (".__result"),
1977 len_type);
1978 if (!sym->ts.u.cl->length)
1979 {
1980 sym->ts.u.cl->backend_decl = length;
1981 TREE_USED (length) = 1;
1982 }
1983 gcc_assert (TREE_CODE (length) == PARM_DECL);
1984 DECL_CONTEXT (length) = fndecl;
1985 DECL_ARG_TYPE (length) = len_type;
1986 TREE_READONLY (length) = 1;
1987 DECL_ARTIFICIAL (length) = 1;
1988 gfc_finish_decl (length);
1989 if (sym->ts.u.cl->backend_decl == NULL
1990 || sym->ts.u.cl->backend_decl == length)
1991 {
1992 gfc_symbol *arg;
1993 tree backend_decl;
1994
1995 if (sym->ts.u.cl->backend_decl == NULL)
1996 {
1997 tree len = build_decl (input_location,
1998 VAR_DECL,
1999 get_identifier ("..__result"),
2000 gfc_charlen_type_node);
2001 DECL_ARTIFICIAL (len) = 1;
2002 TREE_USED (len) = 1;
2003 sym->ts.u.cl->backend_decl = len;
2004 }
2005
2006 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2007 arg = sym->result ? sym->result : sym;
2008 backend_decl = arg->backend_decl;
2009 /* Temporary clear it, so that gfc_sym_type creates complete
2010 type. */
2011 arg->backend_decl = NULL;
2012 type = gfc_sym_type (arg);
2013 arg->backend_decl = backend_decl;
2014 type = build_reference_type (type);
2015 }
2016 }
2017
2018 parm = build_decl (input_location,
2019 PARM_DECL, get_identifier ("__result"), type);
2020
2021 DECL_CONTEXT (parm) = fndecl;
2022 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2023 TREE_READONLY (parm) = 1;
2024 DECL_ARTIFICIAL (parm) = 1;
2025 gfc_finish_decl (parm);
2026
2027 arglist = chainon (arglist, parm);
2028 typelist = TREE_CHAIN (typelist);
2029
2030 if (sym->ts.type == BT_CHARACTER)
2031 {
2032 gfc_allocate_lang_decl (parm);
2033 arglist = chainon (arglist, length);
2034 typelist = TREE_CHAIN (typelist);
2035 }
2036 }
2037
2038 hidden_typelist = typelist;
2039 for (f = sym->formal; f; f = f->next)
2040 if (f->sym != NULL) /* Ignore alternate returns. */
2041 hidden_typelist = TREE_CHAIN (hidden_typelist);
2042
2043 for (f = sym->formal; f; f = f->next)
2044 {
2045 char name[GFC_MAX_SYMBOL_LEN + 2];
2046
2047 /* Ignore alternate returns. */
2048 if (f->sym == NULL)
2049 continue;
2050
2051 type = TREE_VALUE (typelist);
2052
2053 if (f->sym->ts.type == BT_CHARACTER
2054 && (!sym->attr.is_bind_c || sym->attr.entry_master))
2055 {
2056 tree len_type = TREE_VALUE (hidden_typelist);
2057 tree length = NULL_TREE;
2058 if (!f->sym->ts.deferred)
2059 gcc_assert (len_type == gfc_charlen_type_node);
2060 else
2061 gcc_assert (POINTER_TYPE_P (len_type));
2062
2063 strcpy (&name[1], f->sym->name);
2064 name[0] = '_';
2065 length = build_decl (input_location,
2066 PARM_DECL, get_identifier (name), len_type);
2067
2068 hidden_arglist = chainon (hidden_arglist, length);
2069 DECL_CONTEXT (length) = fndecl;
2070 DECL_ARTIFICIAL (length) = 1;
2071 DECL_ARG_TYPE (length) = len_type;
2072 TREE_READONLY (length) = 1;
2073 gfc_finish_decl (length);
2074
2075 /* Remember the passed value. */
2076 if (f->sym->ts.u.cl->passed_length != NULL)
2077 {
2078 /* This can happen if the same type is used for multiple
2079 arguments. We need to copy cl as otherwise
2080 cl->passed_length gets overwritten. */
2081 f->sym->ts.u.cl = gfc_new_charlen (f->sym->ns, f->sym->ts.u.cl);
2082 }
2083 f->sym->ts.u.cl->passed_length = length;
2084
2085 /* Use the passed value for assumed length variables. */
2086 if (!f->sym->ts.u.cl->length)
2087 {
2088 TREE_USED (length) = 1;
2089 gcc_assert (!f->sym->ts.u.cl->backend_decl);
2090 f->sym->ts.u.cl->backend_decl = length;
2091 }
2092
2093 hidden_typelist = TREE_CHAIN (hidden_typelist);
2094
2095 if (f->sym->ts.u.cl->backend_decl == NULL
2096 || f->sym->ts.u.cl->backend_decl == length)
2097 {
2098 if (f->sym->ts.u.cl->backend_decl == NULL)
2099 gfc_create_string_length (f->sym);
2100
2101 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2102 if (f->sym->attr.flavor == FL_PROCEDURE)
2103 type = build_pointer_type (gfc_get_function_type (f->sym));
2104 else
2105 type = gfc_sym_type (f->sym);
2106 }
2107 }
2108
2109 /* For non-constant length array arguments, make sure they use
2110 a different type node from TYPE_ARG_TYPES type. */
2111 if (f->sym->attr.dimension
2112 && type == TREE_VALUE (typelist)
2113 && TREE_CODE (type) == POINTER_TYPE
2114 && GFC_ARRAY_TYPE_P (type)
2115 && f->sym->as->type != AS_ASSUMED_SIZE
2116 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
2117 {
2118 if (f->sym->attr.flavor == FL_PROCEDURE)
2119 type = build_pointer_type (gfc_get_function_type (f->sym));
2120 else
2121 type = gfc_sym_type (f->sym);
2122 }
2123
2124 if (f->sym->attr.proc_pointer)
2125 type = build_pointer_type (type);
2126
2127 if (f->sym->attr.volatile_)
2128 type = build_qualified_type (type, TYPE_QUAL_VOLATILE);
2129
2130 /* Build the argument declaration. */
2131 parm = build_decl (input_location,
2132 PARM_DECL, gfc_sym_identifier (f->sym), type);
2133
2134 if (f->sym->attr.volatile_)
2135 {
2136 TREE_THIS_VOLATILE (parm) = 1;
2137 TREE_SIDE_EFFECTS (parm) = 1;
2138 }
2139
2140 /* Fill in arg stuff. */
2141 DECL_CONTEXT (parm) = fndecl;
2142 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2143 /* All implementation args are read-only. */
2144 TREE_READONLY (parm) = 1;
2145 if (POINTER_TYPE_P (type)
2146 && (!f->sym->attr.proc_pointer
2147 && f->sym->attr.flavor != FL_PROCEDURE))
2148 DECL_BY_REFERENCE (parm) = 1;
2149
2150 gfc_finish_decl (parm);
2151
2152 f->sym->backend_decl = parm;
2153
2154 /* Coarrays which are descriptorless or assumed-shape pass with
2155 -fcoarray=lib the token and the offset as hidden arguments. */
2156 if (f->sym->attr.codimension
2157 && gfc_option.coarray == GFC_FCOARRAY_LIB
2158 && !f->sym->attr.allocatable)
2159 {
2160 tree caf_type;
2161 tree token;
2162 tree offset;
2163
2164 gcc_assert (f->sym->backend_decl != NULL_TREE
2165 && !sym->attr.is_bind_c);
2166 caf_type = TREE_TYPE (f->sym->backend_decl);
2167
2168 token = build_decl (input_location, PARM_DECL,
2169 create_tmp_var_name ("caf_token"),
2170 build_qualified_type (pvoid_type_node,
2171 TYPE_QUAL_RESTRICT));
2172 if (f->sym->as->type == AS_ASSUMED_SHAPE)
2173 {
2174 gcc_assert (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL
2175 || GFC_DECL_TOKEN (f->sym->backend_decl) == NULL_TREE);
2176 if (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL)
2177 gfc_allocate_lang_decl (f->sym->backend_decl);
2178 GFC_DECL_TOKEN (f->sym->backend_decl) = token;
2179 }
2180 else
2181 {
2182 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) == NULL_TREE);
2183 GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) = token;
2184 }
2185
2186 DECL_CONTEXT (token) = fndecl;
2187 DECL_ARTIFICIAL (token) = 1;
2188 DECL_ARG_TYPE (token) = TREE_VALUE (typelist);
2189 TREE_READONLY (token) = 1;
2190 hidden_arglist = chainon (hidden_arglist, token);
2191 gfc_finish_decl (token);
2192
2193 offset = build_decl (input_location, PARM_DECL,
2194 create_tmp_var_name ("caf_offset"),
2195 gfc_array_index_type);
2196
2197 if (f->sym->as->type == AS_ASSUMED_SHAPE)
2198 {
2199 gcc_assert (GFC_DECL_CAF_OFFSET (f->sym->backend_decl)
2200 == NULL_TREE);
2201 GFC_DECL_CAF_OFFSET (f->sym->backend_decl) = offset;
2202 }
2203 else
2204 {
2205 gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) == NULL_TREE);
2206 GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) = offset;
2207 }
2208 DECL_CONTEXT (offset) = fndecl;
2209 DECL_ARTIFICIAL (offset) = 1;
2210 DECL_ARG_TYPE (offset) = TREE_VALUE (typelist);
2211 TREE_READONLY (offset) = 1;
2212 hidden_arglist = chainon (hidden_arglist, offset);
2213 gfc_finish_decl (offset);
2214 }
2215
2216 arglist = chainon (arglist, parm);
2217 typelist = TREE_CHAIN (typelist);
2218 }
2219
2220 /* Add the hidden string length parameters, unless the procedure
2221 is bind(C). */
2222 if (!sym->attr.is_bind_c)
2223 arglist = chainon (arglist, hidden_arglist);
2224
2225 gcc_assert (hidden_typelist == NULL_TREE
2226 || TREE_VALUE (hidden_typelist) == void_type_node);
2227 DECL_ARGUMENTS (fndecl) = arglist;
2228 }
2229
2230 /* Do the setup necessary before generating the body of a function. */
2231
2232 static void
2233 trans_function_start (gfc_symbol * sym)
2234 {
2235 tree fndecl;
2236
2237 fndecl = sym->backend_decl;
2238
2239 /* Let GCC know the current scope is this function. */
2240 current_function_decl = fndecl;
2241
2242 /* Let the world know what we're about to do. */
2243 announce_function (fndecl);
2244
2245 if (DECL_FILE_SCOPE_P (fndecl))
2246 {
2247 /* Create RTL for function declaration. */
2248 rest_of_decl_compilation (fndecl, 1, 0);
2249 }
2250
2251 /* Create RTL for function definition. */
2252 make_decl_rtl (fndecl);
2253
2254 init_function_start (fndecl);
2255
2256 /* function.c requires a push at the start of the function. */
2257 pushlevel (0);
2258 }
2259
2260 /* Create thunks for alternate entry points. */
2261
2262 static void
2263 build_entry_thunks (gfc_namespace * ns, bool global)
2264 {
2265 gfc_formal_arglist *formal;
2266 gfc_formal_arglist *thunk_formal;
2267 gfc_entry_list *el;
2268 gfc_symbol *thunk_sym;
2269 stmtblock_t body;
2270 tree thunk_fndecl;
2271 tree tmp;
2272 locus old_loc;
2273
2274 /* This should always be a toplevel function. */
2275 gcc_assert (current_function_decl == NULL_TREE);
2276
2277 gfc_save_backend_locus (&old_loc);
2278 for (el = ns->entries; el; el = el->next)
2279 {
2280 VEC(tree,gc) *args = NULL;
2281 VEC(tree,gc) *string_args = NULL;
2282
2283 thunk_sym = el->sym;
2284
2285 build_function_decl (thunk_sym, global);
2286 create_function_arglist (thunk_sym);
2287
2288 trans_function_start (thunk_sym);
2289
2290 thunk_fndecl = thunk_sym->backend_decl;
2291
2292 gfc_init_block (&body);
2293
2294 /* Pass extra parameter identifying this entry point. */
2295 tmp = build_int_cst (gfc_array_index_type, el->id);
2296 VEC_safe_push (tree, gc, args, tmp);
2297
2298 if (thunk_sym->attr.function)
2299 {
2300 if (gfc_return_by_reference (ns->proc_name))
2301 {
2302 tree ref = DECL_ARGUMENTS (current_function_decl);
2303 VEC_safe_push (tree, gc, args, ref);
2304 if (ns->proc_name->ts.type == BT_CHARACTER)
2305 VEC_safe_push (tree, gc, args, DECL_CHAIN (ref));
2306 }
2307 }
2308
2309 for (formal = ns->proc_name->formal; formal; formal = formal->next)
2310 {
2311 /* Ignore alternate returns. */
2312 if (formal->sym == NULL)
2313 continue;
2314
2315 /* We don't have a clever way of identifying arguments, so resort to
2316 a brute-force search. */
2317 for (thunk_formal = thunk_sym->formal;
2318 thunk_formal;
2319 thunk_formal = thunk_formal->next)
2320 {
2321 if (thunk_formal->sym == formal->sym)
2322 break;
2323 }
2324
2325 if (thunk_formal)
2326 {
2327 /* Pass the argument. */
2328 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
2329 VEC_safe_push (tree, gc, args, thunk_formal->sym->backend_decl);
2330 if (formal->sym->ts.type == BT_CHARACTER)
2331 {
2332 tmp = thunk_formal->sym->ts.u.cl->backend_decl;
2333 VEC_safe_push (tree, gc, string_args, tmp);
2334 }
2335 }
2336 else
2337 {
2338 /* Pass NULL for a missing argument. */
2339 VEC_safe_push (tree, gc, args, null_pointer_node);
2340 if (formal->sym->ts.type == BT_CHARACTER)
2341 {
2342 tmp = build_int_cst (gfc_charlen_type_node, 0);
2343 VEC_safe_push (tree, gc, string_args, tmp);
2344 }
2345 }
2346 }
2347
2348 /* Call the master function. */
2349 VEC_safe_splice (tree, gc, args, string_args);
2350 tmp = ns->proc_name->backend_decl;
2351 tmp = build_call_expr_loc_vec (input_location, tmp, args);
2352 if (ns->proc_name->attr.mixed_entry_master)
2353 {
2354 tree union_decl, field;
2355 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
2356
2357 union_decl = build_decl (input_location,
2358 VAR_DECL, get_identifier ("__result"),
2359 TREE_TYPE (master_type));
2360 DECL_ARTIFICIAL (union_decl) = 1;
2361 DECL_EXTERNAL (union_decl) = 0;
2362 TREE_PUBLIC (union_decl) = 0;
2363 TREE_USED (union_decl) = 1;
2364 layout_decl (union_decl, 0);
2365 pushdecl (union_decl);
2366
2367 DECL_CONTEXT (union_decl) = current_function_decl;
2368 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2369 TREE_TYPE (union_decl), union_decl, tmp);
2370 gfc_add_expr_to_block (&body, tmp);
2371
2372 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
2373 field; field = DECL_CHAIN (field))
2374 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2375 thunk_sym->result->name) == 0)
2376 break;
2377 gcc_assert (field != NULL_TREE);
2378 tmp = fold_build3_loc (input_location, COMPONENT_REF,
2379 TREE_TYPE (field), union_decl, field,
2380 NULL_TREE);
2381 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2382 TREE_TYPE (DECL_RESULT (current_function_decl)),
2383 DECL_RESULT (current_function_decl), tmp);
2384 tmp = build1_v (RETURN_EXPR, tmp);
2385 }
2386 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
2387 != void_type_node)
2388 {
2389 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2390 TREE_TYPE (DECL_RESULT (current_function_decl)),
2391 DECL_RESULT (current_function_decl), tmp);
2392 tmp = build1_v (RETURN_EXPR, tmp);
2393 }
2394 gfc_add_expr_to_block (&body, tmp);
2395
2396 /* Finish off this function and send it for code generation. */
2397 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
2398 tmp = getdecls ();
2399 poplevel (1, 0, 1);
2400 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
2401 DECL_SAVED_TREE (thunk_fndecl)
2402 = build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl),
2403 DECL_INITIAL (thunk_fndecl));
2404
2405 /* Output the GENERIC tree. */
2406 dump_function (TDI_original, thunk_fndecl);
2407
2408 /* Store the end of the function, so that we get good line number
2409 info for the epilogue. */
2410 cfun->function_end_locus = input_location;
2411
2412 /* We're leaving the context of this function, so zap cfun.
2413 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2414 tree_rest_of_compilation. */
2415 set_cfun (NULL);
2416
2417 current_function_decl = NULL_TREE;
2418
2419 cgraph_finalize_function (thunk_fndecl, true);
2420
2421 /* We share the symbols in the formal argument list with other entry
2422 points and the master function. Clear them so that they are
2423 recreated for each function. */
2424 for (formal = thunk_sym->formal; formal; formal = formal->next)
2425 if (formal->sym != NULL) /* Ignore alternate returns. */
2426 {
2427 formal->sym->backend_decl = NULL_TREE;
2428 if (formal->sym->ts.type == BT_CHARACTER)
2429 formal->sym->ts.u.cl->backend_decl = NULL_TREE;
2430 }
2431
2432 if (thunk_sym->attr.function)
2433 {
2434 if (thunk_sym->ts.type == BT_CHARACTER)
2435 thunk_sym->ts.u.cl->backend_decl = NULL_TREE;
2436 if (thunk_sym->result->ts.type == BT_CHARACTER)
2437 thunk_sym->result->ts.u.cl->backend_decl = NULL_TREE;
2438 }
2439 }
2440
2441 gfc_restore_backend_locus (&old_loc);
2442 }
2443
2444
2445 /* Create a decl for a function, and create any thunks for alternate entry
2446 points. If global is true, generate the function in the global binding
2447 level, otherwise in the current binding level (which can be global). */
2448
2449 void
2450 gfc_create_function_decl (gfc_namespace * ns, bool global)
2451 {
2452 /* Create a declaration for the master function. */
2453 build_function_decl (ns->proc_name, global);
2454
2455 /* Compile the entry thunks. */
2456 if (ns->entries)
2457 build_entry_thunks (ns, global);
2458
2459 /* Now create the read argument list. */
2460 create_function_arglist (ns->proc_name);
2461 }
2462
2463 /* Return the decl used to hold the function return value. If
2464 parent_flag is set, the context is the parent_scope. */
2465
2466 tree
2467 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
2468 {
2469 tree decl;
2470 tree length;
2471 tree this_fake_result_decl;
2472 tree this_function_decl;
2473
2474 char name[GFC_MAX_SYMBOL_LEN + 10];
2475
2476 if (parent_flag)
2477 {
2478 this_fake_result_decl = parent_fake_result_decl;
2479 this_function_decl = DECL_CONTEXT (current_function_decl);
2480 }
2481 else
2482 {
2483 this_fake_result_decl = current_fake_result_decl;
2484 this_function_decl = current_function_decl;
2485 }
2486
2487 if (sym
2488 && sym->ns->proc_name->backend_decl == this_function_decl
2489 && sym->ns->proc_name->attr.entry_master
2490 && sym != sym->ns->proc_name)
2491 {
2492 tree t = NULL, var;
2493 if (this_fake_result_decl != NULL)
2494 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
2495 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
2496 break;
2497 if (t)
2498 return TREE_VALUE (t);
2499 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
2500
2501 if (parent_flag)
2502 this_fake_result_decl = parent_fake_result_decl;
2503 else
2504 this_fake_result_decl = current_fake_result_decl;
2505
2506 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
2507 {
2508 tree field;
2509
2510 for (field = TYPE_FIELDS (TREE_TYPE (decl));
2511 field; field = DECL_CHAIN (field))
2512 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2513 sym->name) == 0)
2514 break;
2515
2516 gcc_assert (field != NULL_TREE);
2517 decl = fold_build3_loc (input_location, COMPONENT_REF,
2518 TREE_TYPE (field), decl, field, NULL_TREE);
2519 }
2520
2521 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
2522 if (parent_flag)
2523 gfc_add_decl_to_parent_function (var);
2524 else
2525 gfc_add_decl_to_function (var);
2526
2527 SET_DECL_VALUE_EXPR (var, decl);
2528 DECL_HAS_VALUE_EXPR_P (var) = 1;
2529 GFC_DECL_RESULT (var) = 1;
2530
2531 TREE_CHAIN (this_fake_result_decl)
2532 = tree_cons (get_identifier (sym->name), var,
2533 TREE_CHAIN (this_fake_result_decl));
2534 return var;
2535 }
2536
2537 if (this_fake_result_decl != NULL_TREE)
2538 return TREE_VALUE (this_fake_result_decl);
2539
2540 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2541 sym is NULL. */
2542 if (!sym)
2543 return NULL_TREE;
2544
2545 if (sym->ts.type == BT_CHARACTER)
2546 {
2547 if (sym->ts.u.cl->backend_decl == NULL_TREE)
2548 length = gfc_create_string_length (sym);
2549 else
2550 length = sym->ts.u.cl->backend_decl;
2551 if (TREE_CODE (length) == VAR_DECL
2552 && DECL_CONTEXT (length) == NULL_TREE)
2553 gfc_add_decl_to_function (length);
2554 }
2555
2556 if (gfc_return_by_reference (sym))
2557 {
2558 decl = DECL_ARGUMENTS (this_function_decl);
2559
2560 if (sym->ns->proc_name->backend_decl == this_function_decl
2561 && sym->ns->proc_name->attr.entry_master)
2562 decl = DECL_CHAIN (decl);
2563
2564 TREE_USED (decl) = 1;
2565 if (sym->as)
2566 decl = gfc_build_dummy_array_decl (sym, decl);
2567 }
2568 else
2569 {
2570 sprintf (name, "__result_%.20s",
2571 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
2572
2573 if (!sym->attr.mixed_entry_master && sym->attr.function)
2574 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2575 VAR_DECL, get_identifier (name),
2576 gfc_sym_type (sym));
2577 else
2578 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2579 VAR_DECL, get_identifier (name),
2580 TREE_TYPE (TREE_TYPE (this_function_decl)));
2581 DECL_ARTIFICIAL (decl) = 1;
2582 DECL_EXTERNAL (decl) = 0;
2583 TREE_PUBLIC (decl) = 0;
2584 TREE_USED (decl) = 1;
2585 GFC_DECL_RESULT (decl) = 1;
2586 TREE_ADDRESSABLE (decl) = 1;
2587
2588 layout_decl (decl, 0);
2589
2590 if (parent_flag)
2591 gfc_add_decl_to_parent_function (decl);
2592 else
2593 gfc_add_decl_to_function (decl);
2594 }
2595
2596 if (parent_flag)
2597 parent_fake_result_decl = build_tree_list (NULL, decl);
2598 else
2599 current_fake_result_decl = build_tree_list (NULL, decl);
2600
2601 return decl;
2602 }
2603
2604
2605 /* Builds a function decl. The remaining parameters are the types of the
2606 function arguments. Negative nargs indicates a varargs function. */
2607
2608 static tree
2609 build_library_function_decl_1 (tree name, const char *spec,
2610 tree rettype, int nargs, va_list p)
2611 {
2612 VEC(tree,gc) *arglist;
2613 tree fntype;
2614 tree fndecl;
2615 int n;
2616
2617 /* Library functions must be declared with global scope. */
2618 gcc_assert (current_function_decl == NULL_TREE);
2619
2620 /* Create a list of the argument types. */
2621 arglist = VEC_alloc (tree, gc, abs (nargs));
2622 for (n = abs (nargs); n > 0; n--)
2623 {
2624 tree argtype = va_arg (p, tree);
2625 VEC_quick_push (tree, arglist, argtype);
2626 }
2627
2628 /* Build the function type and decl. */
2629 if (nargs >= 0)
2630 fntype = build_function_type_vec (rettype, arglist);
2631 else
2632 fntype = build_varargs_function_type_vec (rettype, arglist);
2633 if (spec)
2634 {
2635 tree attr_args = build_tree_list (NULL_TREE,
2636 build_string (strlen (spec), spec));
2637 tree attrs = tree_cons (get_identifier ("fn spec"),
2638 attr_args, TYPE_ATTRIBUTES (fntype));
2639 fntype = build_type_attribute_variant (fntype, attrs);
2640 }
2641 fndecl = build_decl (input_location,
2642 FUNCTION_DECL, name, fntype);
2643
2644 /* Mark this decl as external. */
2645 DECL_EXTERNAL (fndecl) = 1;
2646 TREE_PUBLIC (fndecl) = 1;
2647
2648 pushdecl (fndecl);
2649
2650 rest_of_decl_compilation (fndecl, 1, 0);
2651
2652 return fndecl;
2653 }
2654
2655 /* Builds a function decl. The remaining parameters are the types of the
2656 function arguments. Negative nargs indicates a varargs function. */
2657
2658 tree
2659 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
2660 {
2661 tree ret;
2662 va_list args;
2663 va_start (args, nargs);
2664 ret = build_library_function_decl_1 (name, NULL, rettype, nargs, args);
2665 va_end (args);
2666 return ret;
2667 }
2668
2669 /* Builds a function decl. The remaining parameters are the types of the
2670 function arguments. Negative nargs indicates a varargs function.
2671 The SPEC parameter specifies the function argument and return type
2672 specification according to the fnspec function type attribute. */
2673
2674 tree
2675 gfc_build_library_function_decl_with_spec (tree name, const char *spec,
2676 tree rettype, int nargs, ...)
2677 {
2678 tree ret;
2679 va_list args;
2680 va_start (args, nargs);
2681 ret = build_library_function_decl_1 (name, spec, rettype, nargs, args);
2682 va_end (args);
2683 return ret;
2684 }
2685
2686 static void
2687 gfc_build_intrinsic_function_decls (void)
2688 {
2689 tree gfc_int4_type_node = gfc_get_int_type (4);
2690 tree gfc_int8_type_node = gfc_get_int_type (8);
2691 tree gfc_int16_type_node = gfc_get_int_type (16);
2692 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2693 tree pchar1_type_node = gfc_get_pchar_type (1);
2694 tree pchar4_type_node = gfc_get_pchar_type (4);
2695
2696 /* String functions. */
2697 gfor_fndecl_compare_string = gfc_build_library_function_decl_with_spec (
2698 get_identifier (PREFIX("compare_string")), "..R.R",
2699 integer_type_node, 4, gfc_charlen_type_node, pchar1_type_node,
2700 gfc_charlen_type_node, pchar1_type_node);
2701 DECL_PURE_P (gfor_fndecl_compare_string) = 1;
2702 TREE_NOTHROW (gfor_fndecl_compare_string) = 1;
2703
2704 gfor_fndecl_concat_string = gfc_build_library_function_decl_with_spec (
2705 get_identifier (PREFIX("concat_string")), "..W.R.R",
2706 void_type_node, 6, gfc_charlen_type_node, pchar1_type_node,
2707 gfc_charlen_type_node, pchar1_type_node,
2708 gfc_charlen_type_node, pchar1_type_node);
2709 TREE_NOTHROW (gfor_fndecl_concat_string) = 1;
2710
2711 gfor_fndecl_string_len_trim = gfc_build_library_function_decl_with_spec (
2712 get_identifier (PREFIX("string_len_trim")), "..R",
2713 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar1_type_node);
2714 DECL_PURE_P (gfor_fndecl_string_len_trim) = 1;
2715 TREE_NOTHROW (gfor_fndecl_string_len_trim) = 1;
2716
2717 gfor_fndecl_string_index = gfc_build_library_function_decl_with_spec (
2718 get_identifier (PREFIX("string_index")), "..R.R.",
2719 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2720 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2721 DECL_PURE_P (gfor_fndecl_string_index) = 1;
2722 TREE_NOTHROW (gfor_fndecl_string_index) = 1;
2723
2724 gfor_fndecl_string_scan = gfc_build_library_function_decl_with_spec (
2725 get_identifier (PREFIX("string_scan")), "..R.R.",
2726 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2727 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2728 DECL_PURE_P (gfor_fndecl_string_scan) = 1;
2729 TREE_NOTHROW (gfor_fndecl_string_scan) = 1;
2730
2731 gfor_fndecl_string_verify = gfc_build_library_function_decl_with_spec (
2732 get_identifier (PREFIX("string_verify")), "..R.R.",
2733 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2734 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2735 DECL_PURE_P (gfor_fndecl_string_verify) = 1;
2736 TREE_NOTHROW (gfor_fndecl_string_verify) = 1;
2737
2738 gfor_fndecl_string_trim = gfc_build_library_function_decl_with_spec (
2739 get_identifier (PREFIX("string_trim")), ".Ww.R",
2740 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2741 build_pointer_type (pchar1_type_node), gfc_charlen_type_node,
2742 pchar1_type_node);
2743
2744 gfor_fndecl_string_minmax = gfc_build_library_function_decl_with_spec (
2745 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2746 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2747 build_pointer_type (pchar1_type_node), integer_type_node,
2748 integer_type_node);
2749
2750 gfor_fndecl_adjustl = gfc_build_library_function_decl_with_spec (
2751 get_identifier (PREFIX("adjustl")), ".W.R",
2752 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2753 pchar1_type_node);
2754 TREE_NOTHROW (gfor_fndecl_adjustl) = 1;
2755
2756 gfor_fndecl_adjustr = gfc_build_library_function_decl_with_spec (
2757 get_identifier (PREFIX("adjustr")), ".W.R",
2758 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2759 pchar1_type_node);
2760 TREE_NOTHROW (gfor_fndecl_adjustr) = 1;
2761
2762 gfor_fndecl_select_string = gfc_build_library_function_decl_with_spec (
2763 get_identifier (PREFIX("select_string")), ".R.R.",
2764 integer_type_node, 4, pvoid_type_node, integer_type_node,
2765 pchar1_type_node, gfc_charlen_type_node);
2766 DECL_PURE_P (gfor_fndecl_select_string) = 1;
2767 TREE_NOTHROW (gfor_fndecl_select_string) = 1;
2768
2769 gfor_fndecl_compare_string_char4 = gfc_build_library_function_decl_with_spec (
2770 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2771 integer_type_node, 4, gfc_charlen_type_node, pchar4_type_node,
2772 gfc_charlen_type_node, pchar4_type_node);
2773 DECL_PURE_P (gfor_fndecl_compare_string_char4) = 1;
2774 TREE_NOTHROW (gfor_fndecl_compare_string_char4) = 1;
2775
2776 gfor_fndecl_concat_string_char4 = gfc_build_library_function_decl_with_spec (
2777 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2778 void_type_node, 6, gfc_charlen_type_node, pchar4_type_node,
2779 gfc_charlen_type_node, pchar4_type_node, gfc_charlen_type_node,
2780 pchar4_type_node);
2781 TREE_NOTHROW (gfor_fndecl_concat_string_char4) = 1;
2782
2783 gfor_fndecl_string_len_trim_char4 = gfc_build_library_function_decl_with_spec (
2784 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2785 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar4_type_node);
2786 DECL_PURE_P (gfor_fndecl_string_len_trim_char4) = 1;
2787 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4) = 1;
2788
2789 gfor_fndecl_string_index_char4 = gfc_build_library_function_decl_with_spec (
2790 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2791 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2792 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2793 DECL_PURE_P (gfor_fndecl_string_index_char4) = 1;
2794 TREE_NOTHROW (gfor_fndecl_string_index_char4) = 1;
2795
2796 gfor_fndecl_string_scan_char4 = gfc_build_library_function_decl_with_spec (
2797 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2798 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2799 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2800 DECL_PURE_P (gfor_fndecl_string_scan_char4) = 1;
2801 TREE_NOTHROW (gfor_fndecl_string_scan_char4) = 1;
2802
2803 gfor_fndecl_string_verify_char4 = gfc_build_library_function_decl_with_spec (
2804 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2805 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2806 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2807 DECL_PURE_P (gfor_fndecl_string_verify_char4) = 1;
2808 TREE_NOTHROW (gfor_fndecl_string_verify_char4) = 1;
2809
2810 gfor_fndecl_string_trim_char4 = gfc_build_library_function_decl_with_spec (
2811 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2812 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2813 build_pointer_type (pchar4_type_node), gfc_charlen_type_node,
2814 pchar4_type_node);
2815
2816 gfor_fndecl_string_minmax_char4 = gfc_build_library_function_decl_with_spec (
2817 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2818 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2819 build_pointer_type (pchar4_type_node), integer_type_node,
2820 integer_type_node);
2821
2822 gfor_fndecl_adjustl_char4 = gfc_build_library_function_decl_with_spec (
2823 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2824 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2825 pchar4_type_node);
2826 TREE_NOTHROW (gfor_fndecl_adjustl_char4) = 1;
2827
2828 gfor_fndecl_adjustr_char4 = gfc_build_library_function_decl_with_spec (
2829 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2830 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2831 pchar4_type_node);
2832 TREE_NOTHROW (gfor_fndecl_adjustr_char4) = 1;
2833
2834 gfor_fndecl_select_string_char4 = gfc_build_library_function_decl_with_spec (
2835 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2836 integer_type_node, 4, pvoid_type_node, integer_type_node,
2837 pvoid_type_node, gfc_charlen_type_node);
2838 DECL_PURE_P (gfor_fndecl_select_string_char4) = 1;
2839 TREE_NOTHROW (gfor_fndecl_select_string_char4) = 1;
2840
2841
2842 /* Conversion between character kinds. */
2843
2844 gfor_fndecl_convert_char1_to_char4 = gfc_build_library_function_decl_with_spec (
2845 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2846 void_type_node, 3, build_pointer_type (pchar4_type_node),
2847 gfc_charlen_type_node, pchar1_type_node);
2848
2849 gfor_fndecl_convert_char4_to_char1 = gfc_build_library_function_decl_with_spec (
2850 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
2851 void_type_node, 3, build_pointer_type (pchar1_type_node),
2852 gfc_charlen_type_node, pchar4_type_node);
2853
2854 /* Misc. functions. */
2855
2856 gfor_fndecl_ttynam = gfc_build_library_function_decl_with_spec (
2857 get_identifier (PREFIX("ttynam")), ".W",
2858 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
2859 integer_type_node);
2860
2861 gfor_fndecl_fdate = gfc_build_library_function_decl_with_spec (
2862 get_identifier (PREFIX("fdate")), ".W",
2863 void_type_node, 2, pchar_type_node, gfc_charlen_type_node);
2864
2865 gfor_fndecl_ctime = gfc_build_library_function_decl_with_spec (
2866 get_identifier (PREFIX("ctime")), ".W",
2867 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
2868 gfc_int8_type_node);
2869
2870 gfor_fndecl_sc_kind = gfc_build_library_function_decl_with_spec (
2871 get_identifier (PREFIX("selected_char_kind")), "..R",
2872 gfc_int4_type_node, 2, gfc_charlen_type_node, pchar_type_node);
2873 DECL_PURE_P (gfor_fndecl_sc_kind) = 1;
2874 TREE_NOTHROW (gfor_fndecl_sc_kind) = 1;
2875
2876 gfor_fndecl_si_kind = gfc_build_library_function_decl_with_spec (
2877 get_identifier (PREFIX("selected_int_kind")), ".R",
2878 gfc_int4_type_node, 1, pvoid_type_node);
2879 DECL_PURE_P (gfor_fndecl_si_kind) = 1;
2880 TREE_NOTHROW (gfor_fndecl_si_kind) = 1;
2881
2882 gfor_fndecl_sr_kind = gfc_build_library_function_decl_with_spec (
2883 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
2884 gfc_int4_type_node, 3, pvoid_type_node, pvoid_type_node,
2885 pvoid_type_node);
2886 DECL_PURE_P (gfor_fndecl_sr_kind) = 1;
2887 TREE_NOTHROW (gfor_fndecl_sr_kind) = 1;
2888
2889 /* Power functions. */
2890 {
2891 tree ctype, rtype, itype, jtype;
2892 int rkind, ikind, jkind;
2893 #define NIKINDS 3
2894 #define NRKINDS 4
2895 static int ikinds[NIKINDS] = {4, 8, 16};
2896 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2897 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2898
2899 for (ikind=0; ikind < NIKINDS; ikind++)
2900 {
2901 itype = gfc_get_int_type (ikinds[ikind]);
2902
2903 for (jkind=0; jkind < NIKINDS; jkind++)
2904 {
2905 jtype = gfc_get_int_type (ikinds[jkind]);
2906 if (itype && jtype)
2907 {
2908 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2909 ikinds[jkind]);
2910 gfor_fndecl_math_powi[jkind][ikind].integer =
2911 gfc_build_library_function_decl (get_identifier (name),
2912 jtype, 2, jtype, itype);
2913 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2914 TREE_NOTHROW (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2915 }
2916 }
2917
2918 for (rkind = 0; rkind < NRKINDS; rkind ++)
2919 {
2920 rtype = gfc_get_real_type (rkinds[rkind]);
2921 if (rtype && itype)
2922 {
2923 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2924 ikinds[ikind]);
2925 gfor_fndecl_math_powi[rkind][ikind].real =
2926 gfc_build_library_function_decl (get_identifier (name),
2927 rtype, 2, rtype, itype);
2928 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2929 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2930 }
2931
2932 ctype = gfc_get_complex_type (rkinds[rkind]);
2933 if (ctype && itype)
2934 {
2935 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2936 ikinds[ikind]);
2937 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2938 gfc_build_library_function_decl (get_identifier (name),
2939 ctype, 2,ctype, itype);
2940 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2941 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2942 }
2943 }
2944 }
2945 #undef NIKINDS
2946 #undef NRKINDS
2947 }
2948
2949 gfor_fndecl_math_ishftc4 = gfc_build_library_function_decl (
2950 get_identifier (PREFIX("ishftc4")),
2951 gfc_int4_type_node, 3, gfc_int4_type_node, gfc_int4_type_node,
2952 gfc_int4_type_node);
2953 TREE_READONLY (gfor_fndecl_math_ishftc4) = 1;
2954 TREE_NOTHROW (gfor_fndecl_math_ishftc4) = 1;
2955
2956 gfor_fndecl_math_ishftc8 = gfc_build_library_function_decl (
2957 get_identifier (PREFIX("ishftc8")),
2958 gfc_int8_type_node, 3, gfc_int8_type_node, gfc_int4_type_node,
2959 gfc_int4_type_node);
2960 TREE_READONLY (gfor_fndecl_math_ishftc8) = 1;
2961 TREE_NOTHROW (gfor_fndecl_math_ishftc8) = 1;
2962
2963 if (gfc_int16_type_node)
2964 {
2965 gfor_fndecl_math_ishftc16 = gfc_build_library_function_decl (
2966 get_identifier (PREFIX("ishftc16")),
2967 gfc_int16_type_node, 3, gfc_int16_type_node, gfc_int4_type_node,
2968 gfc_int4_type_node);
2969 TREE_READONLY (gfor_fndecl_math_ishftc16) = 1;
2970 TREE_NOTHROW (gfor_fndecl_math_ishftc16) = 1;
2971 }
2972
2973 /* BLAS functions. */
2974 {
2975 tree pint = build_pointer_type (integer_type_node);
2976 tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
2977 tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
2978 tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
2979 tree pz = build_pointer_type
2980 (gfc_get_complex_type (gfc_default_double_kind));
2981
2982 gfor_fndecl_sgemm = gfc_build_library_function_decl
2983 (get_identifier
2984 (gfc_option.flag_underscoring ? "sgemm_"
2985 : "sgemm"),
2986 void_type_node, 15, pchar_type_node,
2987 pchar_type_node, pint, pint, pint, ps, ps, pint,
2988 ps, pint, ps, ps, pint, integer_type_node,
2989 integer_type_node);
2990 gfor_fndecl_dgemm = gfc_build_library_function_decl
2991 (get_identifier
2992 (gfc_option.flag_underscoring ? "dgemm_"
2993 : "dgemm"),
2994 void_type_node, 15, pchar_type_node,
2995 pchar_type_node, pint, pint, pint, pd, pd, pint,
2996 pd, pint, pd, pd, pint, integer_type_node,
2997 integer_type_node);
2998 gfor_fndecl_cgemm = gfc_build_library_function_decl
2999 (get_identifier
3000 (gfc_option.flag_underscoring ? "cgemm_"
3001 : "cgemm"),
3002 void_type_node, 15, pchar_type_node,
3003 pchar_type_node, pint, pint, pint, pc, pc, pint,
3004 pc, pint, pc, pc, pint, integer_type_node,
3005 integer_type_node);
3006 gfor_fndecl_zgemm = gfc_build_library_function_decl
3007 (get_identifier
3008 (gfc_option.flag_underscoring ? "zgemm_"
3009 : "zgemm"),
3010 void_type_node, 15, pchar_type_node,
3011 pchar_type_node, pint, pint, pint, pz, pz, pint,
3012 pz, pint, pz, pz, pint, integer_type_node,
3013 integer_type_node);
3014 }
3015
3016 /* Other functions. */
3017 gfor_fndecl_size0 = gfc_build_library_function_decl_with_spec (
3018 get_identifier (PREFIX("size0")), ".R",
3019 gfc_array_index_type, 1, pvoid_type_node);
3020 DECL_PURE_P (gfor_fndecl_size0) = 1;
3021 TREE_NOTHROW (gfor_fndecl_size0) = 1;
3022
3023 gfor_fndecl_size1 = gfc_build_library_function_decl_with_spec (
3024 get_identifier (PREFIX("size1")), ".R",
3025 gfc_array_index_type, 2, pvoid_type_node, gfc_array_index_type);
3026 DECL_PURE_P (gfor_fndecl_size1) = 1;
3027 TREE_NOTHROW (gfor_fndecl_size1) = 1;
3028
3029 gfor_fndecl_iargc = gfc_build_library_function_decl (
3030 get_identifier (PREFIX ("iargc")), gfc_int4_type_node, 0);
3031 TREE_NOTHROW (gfor_fndecl_iargc) = 1;
3032 }
3033
3034
3035 /* Make prototypes for runtime library functions. */
3036
3037 void
3038 gfc_build_builtin_function_decls (void)
3039 {
3040 tree gfc_int4_type_node = gfc_get_int_type (4);
3041
3042 gfor_fndecl_stop_numeric = gfc_build_library_function_decl (
3043 get_identifier (PREFIX("stop_numeric")),
3044 void_type_node, 1, gfc_int4_type_node);
3045 /* STOP doesn't return. */
3046 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
3047
3048 gfor_fndecl_stop_numeric_f08 = gfc_build_library_function_decl (
3049 get_identifier (PREFIX("stop_numeric_f08")),
3050 void_type_node, 1, gfc_int4_type_node);
3051 /* STOP doesn't return. */
3052 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08) = 1;
3053
3054 gfor_fndecl_stop_string = gfc_build_library_function_decl_with_spec (
3055 get_identifier (PREFIX("stop_string")), ".R.",
3056 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3057 /* STOP doesn't return. */
3058 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
3059
3060 gfor_fndecl_error_stop_numeric = gfc_build_library_function_decl (
3061 get_identifier (PREFIX("error_stop_numeric")),
3062 void_type_node, 1, gfc_int4_type_node);
3063 /* ERROR STOP doesn't return. */
3064 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric) = 1;
3065
3066 gfor_fndecl_error_stop_string = gfc_build_library_function_decl_with_spec (
3067 get_identifier (PREFIX("error_stop_string")), ".R.",
3068 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3069 /* ERROR STOP doesn't return. */
3070 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string) = 1;
3071
3072 gfor_fndecl_pause_numeric = gfc_build_library_function_decl (
3073 get_identifier (PREFIX("pause_numeric")),
3074 void_type_node, 1, gfc_int4_type_node);
3075
3076 gfor_fndecl_pause_string = gfc_build_library_function_decl_with_spec (
3077 get_identifier (PREFIX("pause_string")), ".R.",
3078 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3079
3080 gfor_fndecl_runtime_error = gfc_build_library_function_decl_with_spec (
3081 get_identifier (PREFIX("runtime_error")), ".R",
3082 void_type_node, -1, pchar_type_node);
3083 /* The runtime_error function does not return. */
3084 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
3085
3086 gfor_fndecl_runtime_error_at = gfc_build_library_function_decl_with_spec (
3087 get_identifier (PREFIX("runtime_error_at")), ".RR",
3088 void_type_node, -2, pchar_type_node, pchar_type_node);
3089 /* The runtime_error_at function does not return. */
3090 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
3091
3092 gfor_fndecl_runtime_warning_at = gfc_build_library_function_decl_with_spec (
3093 get_identifier (PREFIX("runtime_warning_at")), ".RR",
3094 void_type_node, -2, pchar_type_node, pchar_type_node);
3095
3096 gfor_fndecl_generate_error = gfc_build_library_function_decl_with_spec (
3097 get_identifier (PREFIX("generate_error")), ".R.R",
3098 void_type_node, 3, pvoid_type_node, integer_type_node,
3099 pchar_type_node);
3100
3101 gfor_fndecl_os_error = gfc_build_library_function_decl_with_spec (
3102 get_identifier (PREFIX("os_error")), ".R",
3103 void_type_node, 1, pchar_type_node);
3104 /* The runtime_error function does not return. */
3105 TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
3106
3107 gfor_fndecl_set_args = gfc_build_library_function_decl (
3108 get_identifier (PREFIX("set_args")),
3109 void_type_node, 2, integer_type_node,
3110 build_pointer_type (pchar_type_node));
3111
3112 gfor_fndecl_set_fpe = gfc_build_library_function_decl (
3113 get_identifier (PREFIX("set_fpe")),
3114 void_type_node, 1, integer_type_node);
3115
3116 /* Keep the array dimension in sync with the call, later in this file. */
3117 gfor_fndecl_set_options = gfc_build_library_function_decl_with_spec (
3118 get_identifier (PREFIX("set_options")), "..R",
3119 void_type_node, 2, integer_type_node,
3120 build_pointer_type (integer_type_node));
3121
3122 gfor_fndecl_set_convert = gfc_build_library_function_decl (
3123 get_identifier (PREFIX("set_convert")),
3124 void_type_node, 1, integer_type_node);
3125
3126 gfor_fndecl_set_record_marker = gfc_build_library_function_decl (
3127 get_identifier (PREFIX("set_record_marker")),
3128 void_type_node, 1, integer_type_node);
3129
3130 gfor_fndecl_set_max_subrecord_length = gfc_build_library_function_decl (
3131 get_identifier (PREFIX("set_max_subrecord_length")),
3132 void_type_node, 1, integer_type_node);
3133
3134 gfor_fndecl_in_pack = gfc_build_library_function_decl_with_spec (
3135 get_identifier (PREFIX("internal_pack")), ".r",
3136 pvoid_type_node, 1, pvoid_type_node);
3137
3138 gfor_fndecl_in_unpack = gfc_build_library_function_decl_with_spec (
3139 get_identifier (PREFIX("internal_unpack")), ".wR",
3140 void_type_node, 2, pvoid_type_node, pvoid_type_node);
3141
3142 gfor_fndecl_associated = gfc_build_library_function_decl_with_spec (
3143 get_identifier (PREFIX("associated")), ".RR",
3144 integer_type_node, 2, ppvoid_type_node, ppvoid_type_node);
3145 DECL_PURE_P (gfor_fndecl_associated) = 1;
3146 TREE_NOTHROW (gfor_fndecl_associated) = 1;
3147
3148 /* Coarray library calls. */
3149 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
3150 {
3151 tree pint_type, pppchar_type;
3152
3153 pint_type = build_pointer_type (integer_type_node);
3154 pppchar_type
3155 = build_pointer_type (build_pointer_type (pchar_type_node));
3156
3157 gfor_fndecl_caf_init = gfc_build_library_function_decl (
3158 get_identifier (PREFIX("caf_init")), void_type_node,
3159 4, pint_type, pppchar_type, pint_type, pint_type);
3160
3161 gfor_fndecl_caf_finalize = gfc_build_library_function_decl (
3162 get_identifier (PREFIX("caf_finalize")), void_type_node, 0);
3163
3164 gfor_fndecl_caf_register = gfc_build_library_function_decl_with_spec (
3165 get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node, 6,
3166 size_type_node, integer_type_node, ppvoid_type_node, pint_type,
3167 pchar_type_node, integer_type_node);
3168
3169 gfor_fndecl_caf_deregister = gfc_build_library_function_decl_with_spec (
3170 get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node, 4,
3171 ppvoid_type_node, pint_type, pchar_type_node, integer_type_node);
3172
3173 gfor_fndecl_caf_critical = gfc_build_library_function_decl (
3174 get_identifier (PREFIX("caf_critical")), void_type_node, 0);
3175
3176 gfor_fndecl_caf_end_critical = gfc_build_library_function_decl (
3177 get_identifier (PREFIX("caf_end_critical")), void_type_node, 0);
3178
3179 gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
3180 get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node,
3181 3, pint_type, build_pointer_type (pchar_type_node), integer_type_node);
3182
3183 gfor_fndecl_caf_sync_images = gfc_build_library_function_decl_with_spec (
3184 get_identifier (PREFIX("caf_sync_images")), ".RRWW", void_type_node,
3185 5, integer_type_node, pint_type, pint_type,
3186 build_pointer_type (pchar_type_node), integer_type_node);
3187
3188 gfor_fndecl_caf_error_stop = gfc_build_library_function_decl (
3189 get_identifier (PREFIX("caf_error_stop")),
3190 void_type_node, 1, gfc_int4_type_node);
3191 /* CAF's ERROR STOP doesn't return. */
3192 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop) = 1;
3193
3194 gfor_fndecl_caf_error_stop_str = gfc_build_library_function_decl_with_spec (
3195 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3196 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3197 /* CAF's ERROR STOP doesn't return. */
3198 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str) = 1;
3199 }
3200
3201 gfc_build_intrinsic_function_decls ();
3202 gfc_build_intrinsic_lib_fndecls ();
3203 gfc_build_io_library_fndecls ();
3204 }
3205
3206
3207 /* Evaluate the length of dummy character variables. */
3208
3209 static void
3210 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl,
3211 gfc_wrapped_block *block)
3212 {
3213 stmtblock_t init;
3214
3215 gfc_finish_decl (cl->backend_decl);
3216
3217 gfc_start_block (&init);
3218
3219 /* Evaluate the string length expression. */
3220 gfc_conv_string_length (cl, NULL, &init);
3221
3222 gfc_trans_vla_type_sizes (sym, &init);
3223
3224 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3225 }
3226
3227
3228 /* Allocate and cleanup an automatic character variable. */
3229
3230 static void
3231 gfc_trans_auto_character_variable (gfc_symbol * sym, gfc_wrapped_block * block)
3232 {
3233 stmtblock_t init;
3234 tree decl;
3235 tree tmp;
3236
3237 gcc_assert (sym->backend_decl);
3238 gcc_assert (sym->ts.u.cl && sym->ts.u.cl->length);
3239
3240 gfc_init_block (&init);
3241
3242 /* Evaluate the string length expression. */
3243 gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
3244
3245 gfc_trans_vla_type_sizes (sym, &init);
3246
3247 decl = sym->backend_decl;
3248
3249 /* Emit a DECL_EXPR for this variable, which will cause the
3250 gimplifier to allocate storage, and all that good stuff. */
3251 tmp = fold_build1_loc (input_location, DECL_EXPR, TREE_TYPE (decl), decl);
3252 gfc_add_expr_to_block (&init, tmp);
3253
3254 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3255 }
3256
3257 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3258
3259 static void
3260 gfc_trans_assign_aux_var (gfc_symbol * sym, gfc_wrapped_block * block)
3261 {
3262 stmtblock_t init;
3263
3264 gcc_assert (sym->backend_decl);
3265 gfc_start_block (&init);
3266
3267 /* Set the initial value to length. See the comments in
3268 function gfc_add_assign_aux_vars in this file. */
3269 gfc_add_modify (&init, GFC_DECL_STRING_LEN (sym->backend_decl),
3270 build_int_cst (gfc_charlen_type_node, -2));
3271
3272 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3273 }
3274
3275 static void
3276 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
3277 {
3278 tree t = *tp, var, val;
3279
3280 if (t == NULL || t == error_mark_node)
3281 return;
3282 if (TREE_CONSTANT (t) || DECL_P (t))
3283 return;
3284
3285 if (TREE_CODE (t) == SAVE_EXPR)
3286 {
3287 if (SAVE_EXPR_RESOLVED_P (t))
3288 {
3289 *tp = TREE_OPERAND (t, 0);
3290 return;
3291 }
3292 val = TREE_OPERAND (t, 0);
3293 }
3294 else
3295 val = t;
3296
3297 var = gfc_create_var_np (TREE_TYPE (t), NULL);
3298 gfc_add_decl_to_function (var);
3299 gfc_add_modify (body, var, val);
3300 if (TREE_CODE (t) == SAVE_EXPR)
3301 TREE_OPERAND (t, 0) = var;
3302 *tp = var;
3303 }
3304
3305 static void
3306 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
3307 {
3308 tree t;
3309
3310 if (type == NULL || type == error_mark_node)
3311 return;
3312
3313 type = TYPE_MAIN_VARIANT (type);
3314
3315 if (TREE_CODE (type) == INTEGER_TYPE)
3316 {
3317 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
3318 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
3319
3320 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3321 {
3322 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
3323 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
3324 }
3325 }
3326 else if (TREE_CODE (type) == ARRAY_TYPE)
3327 {
3328 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
3329 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
3330 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
3331 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
3332
3333 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3334 {
3335 TYPE_SIZE (t) = TYPE_SIZE (type);
3336 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
3337 }
3338 }
3339 }
3340
3341 /* Make sure all type sizes and array domains are either constant,
3342 or variable or parameter decls. This is a simplified variant
3343 of gimplify_type_sizes, but we can't use it here, as none of the
3344 variables in the expressions have been gimplified yet.
3345 As type sizes and domains for various variable length arrays
3346 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3347 time, without this routine gimplify_type_sizes in the middle-end
3348 could result in the type sizes being gimplified earlier than where
3349 those variables are initialized. */
3350
3351 void
3352 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
3353 {
3354 tree type = TREE_TYPE (sym->backend_decl);
3355
3356 if (TREE_CODE (type) == FUNCTION_TYPE
3357 && (sym->attr.function || sym->attr.result || sym->attr.entry))
3358 {
3359 if (! current_fake_result_decl)
3360 return;
3361
3362 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
3363 }
3364
3365 while (POINTER_TYPE_P (type))
3366 type = TREE_TYPE (type);
3367
3368 if (GFC_DESCRIPTOR_TYPE_P (type))
3369 {
3370 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
3371
3372 while (POINTER_TYPE_P (etype))
3373 etype = TREE_TYPE (etype);
3374
3375 gfc_trans_vla_type_sizes_1 (etype, body);
3376 }
3377
3378 gfc_trans_vla_type_sizes_1 (type, body);
3379 }
3380
3381
3382 /* Initialize a derived type by building an lvalue from the symbol
3383 and using trans_assignment to do the work. Set dealloc to false
3384 if no deallocation prior the assignment is needed. */
3385 void
3386 gfc_init_default_dt (gfc_symbol * sym, stmtblock_t * block, bool dealloc)
3387 {
3388 gfc_expr *e;
3389 tree tmp;
3390 tree present;
3391
3392 gcc_assert (block);
3393
3394 gcc_assert (!sym->attr.allocatable);
3395 gfc_set_sym_referenced (sym);
3396 e = gfc_lval_expr_from_sym (sym);
3397 tmp = gfc_trans_assignment (e, sym->value, false, dealloc);
3398 if (sym->attr.dummy && (sym->attr.optional
3399 || sym->ns->proc_name->attr.entry_master))
3400 {
3401 present = gfc_conv_expr_present (sym);
3402 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
3403 tmp, build_empty_stmt (input_location));
3404 }
3405 gfc_add_expr_to_block (block, tmp);
3406 gfc_free_expr (e);
3407 }
3408
3409
3410 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3411 them their default initializer, if they do not have allocatable
3412 components, they have their allocatable components deallocated. */
3413
3414 static void
3415 init_intent_out_dt (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3416 {
3417 stmtblock_t init;
3418 gfc_formal_arglist *f;
3419 tree tmp;
3420 tree present;
3421
3422 gfc_init_block (&init);
3423 for (f = proc_sym->formal; f; f = f->next)
3424 if (f->sym && f->sym->attr.intent == INTENT_OUT
3425 && !f->sym->attr.pointer
3426 && f->sym->ts.type == BT_DERIVED)
3427 {
3428 if (f->sym->ts.u.derived->attr.alloc_comp && !f->sym->value)
3429 {
3430 tmp = gfc_deallocate_alloc_comp (f->sym->ts.u.derived,
3431 f->sym->backend_decl,
3432 f->sym->as ? f->sym->as->rank : 0);
3433
3434 if (f->sym->attr.optional
3435 || f->sym->ns->proc_name->attr.entry_master)
3436 {
3437 present = gfc_conv_expr_present (f->sym);
3438 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3439 present, tmp,
3440 build_empty_stmt (input_location));
3441 }
3442
3443 gfc_add_expr_to_block (&init, tmp);
3444 }
3445 else if (f->sym->value)
3446 gfc_init_default_dt (f->sym, &init, true);
3447 }
3448 else if (f->sym && f->sym->attr.intent == INTENT_OUT
3449 && f->sym->ts.type == BT_CLASS
3450 && !CLASS_DATA (f->sym)->attr.class_pointer
3451 && CLASS_DATA (f->sym)->ts.u.derived->attr.alloc_comp)
3452 {
3453 tree decl = build_fold_indirect_ref_loc (input_location,
3454 f->sym->backend_decl);
3455 tmp = CLASS_DATA (f->sym)->backend_decl;
3456 tmp = fold_build3_loc (input_location, COMPONENT_REF,
3457 TREE_TYPE (tmp), decl, tmp, NULL_TREE);
3458 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3459 tmp = gfc_deallocate_alloc_comp (CLASS_DATA (f->sym)->ts.u.derived,
3460 tmp,
3461 CLASS_DATA (f->sym)->as ?
3462 CLASS_DATA (f->sym)->as->rank : 0);
3463
3464 if (f->sym->attr.optional || f->sym->ns->proc_name->attr.entry_master)
3465 {
3466 present = gfc_conv_expr_present (f->sym);
3467 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3468 present, tmp,
3469 build_empty_stmt (input_location));
3470 }
3471
3472 gfc_add_expr_to_block (&init, tmp);
3473 }
3474
3475 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3476 }
3477
3478
3479 /* Generate function entry and exit code, and add it to the function body.
3480 This includes:
3481 Allocation and initialization of array variables.
3482 Allocation of character string variables.
3483 Initialization and possibly repacking of dummy arrays.
3484 Initialization of ASSIGN statement auxiliary variable.
3485 Initialization of ASSOCIATE names.
3486 Automatic deallocation. */
3487
3488 void
3489 gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3490 {
3491 locus loc;
3492 gfc_symbol *sym;
3493 gfc_formal_arglist *f;
3494 stmtblock_t tmpblock;
3495 bool seen_trans_deferred_array = false;
3496 tree tmp = NULL;
3497 gfc_expr *e;
3498 gfc_se se;
3499 stmtblock_t init;
3500
3501 /* Deal with implicit return variables. Explicit return variables will
3502 already have been added. */
3503 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
3504 {
3505 if (!current_fake_result_decl)
3506 {
3507 gfc_entry_list *el = NULL;
3508 if (proc_sym->attr.entry_master)
3509 {
3510 for (el = proc_sym->ns->entries; el; el = el->next)
3511 if (el->sym != el->sym->result)
3512 break;
3513 }
3514 /* TODO: move to the appropriate place in resolve.c. */
3515 if (warn_return_type && el == NULL)
3516 gfc_warning ("Return value of function '%s' at %L not set",
3517 proc_sym->name, &proc_sym->declared_at);
3518 }
3519 else if (proc_sym->as)
3520 {
3521 tree result = TREE_VALUE (current_fake_result_decl);
3522 gfc_trans_dummy_array_bias (proc_sym, result, block);
3523
3524 /* An automatic character length, pointer array result. */
3525 if (proc_sym->ts.type == BT_CHARACTER
3526 && TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3527 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3528 }
3529 else if (proc_sym->ts.type == BT_CHARACTER)
3530 {
3531 if (proc_sym->ts.deferred)
3532 {
3533 tmp = NULL;
3534 gfc_save_backend_locus (&loc);
3535 gfc_set_backend_locus (&proc_sym->declared_at);
3536 gfc_start_block (&init);
3537 /* Zero the string length on entry. */
3538 gfc_add_modify (&init, proc_sym->ts.u.cl->backend_decl,
3539 build_int_cst (gfc_charlen_type_node, 0));
3540 /* Null the pointer. */
3541 e = gfc_lval_expr_from_sym (proc_sym);
3542 gfc_init_se (&se, NULL);
3543 se.want_pointer = 1;
3544 gfc_conv_expr (&se, e);
3545 gfc_free_expr (e);
3546 tmp = se.expr;
3547 gfc_add_modify (&init, tmp,
3548 fold_convert (TREE_TYPE (se.expr),
3549 null_pointer_node));
3550 gfc_restore_backend_locus (&loc);
3551
3552 /* Pass back the string length on exit. */
3553 tmp = proc_sym->ts.u.cl->passed_length;
3554 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3555 tmp = fold_convert (gfc_charlen_type_node, tmp);
3556 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3557 gfc_charlen_type_node, tmp,
3558 proc_sym->ts.u.cl->backend_decl);
3559 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3560 }
3561 else if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3562 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3563 }
3564 else
3565 gcc_assert (gfc_option.flag_f2c
3566 && proc_sym->ts.type == BT_COMPLEX);
3567 }
3568
3569 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3570 should be done here so that the offsets and lbounds of arrays
3571 are available. */
3572 gfc_save_backend_locus (&loc);
3573 gfc_set_backend_locus (&proc_sym->declared_at);
3574 init_intent_out_dt (proc_sym, block);
3575 gfc_restore_backend_locus (&loc);
3576
3577 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
3578 {
3579 bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
3580 && sym->ts.u.derived->attr.alloc_comp;
3581 if (sym->assoc)
3582 continue;
3583
3584 if (sym->attr.subref_array_pointer
3585 && GFC_DECL_SPAN (sym->backend_decl)
3586 && !TREE_STATIC (GFC_DECL_SPAN (sym->backend_decl)))
3587 {
3588 gfc_init_block (&tmpblock);
3589 gfc_add_modify (&tmpblock, GFC_DECL_SPAN (sym->backend_decl),
3590 build_int_cst (gfc_array_index_type, 0));
3591 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3592 NULL_TREE);
3593 }
3594
3595 if (sym->attr.dimension || sym->attr.codimension)
3596 {
3597 /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT. */
3598 array_type tmp = sym->as->type;
3599 if (tmp == AS_ASSUMED_SIZE && sym->as->cp_was_assumed)
3600 tmp = AS_EXPLICIT;
3601 switch (tmp)
3602 {
3603 case AS_EXPLICIT:
3604 if (sym->attr.dummy || sym->attr.result)
3605 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3606 else if (sym->attr.pointer || sym->attr.allocatable)
3607 {
3608 if (TREE_STATIC (sym->backend_decl))
3609 {
3610 gfc_save_backend_locus (&loc);
3611 gfc_set_backend_locus (&sym->declared_at);
3612 gfc_trans_static_array_pointer (sym);
3613 gfc_restore_backend_locus (&loc);
3614 }
3615 else
3616 {
3617 seen_trans_deferred_array = true;
3618 gfc_trans_deferred_array (sym, block);
3619 }
3620 }
3621 else if (sym->attr.codimension && TREE_STATIC (sym->backend_decl))
3622 {
3623 gfc_init_block (&tmpblock);
3624 gfc_trans_array_cobounds (TREE_TYPE (sym->backend_decl),
3625 &tmpblock, sym);
3626 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3627 NULL_TREE);
3628 continue;
3629 }
3630 else if (gfc_option.coarray != GFC_FCOARRAY_LIB)
3631 {
3632 gfc_save_backend_locus (&loc);
3633 gfc_set_backend_locus (&sym->declared_at);
3634
3635 if (sym_has_alloc_comp)
3636 {
3637 seen_trans_deferred_array = true;
3638 gfc_trans_deferred_array (sym, block);
3639 }
3640 else if (sym->ts.type == BT_DERIVED
3641 && sym->value
3642 && !sym->attr.data
3643 && sym->attr.save == SAVE_NONE)
3644 {
3645 gfc_start_block (&tmpblock);
3646 gfc_init_default_dt (sym, &tmpblock, false);
3647 gfc_add_init_cleanup (block,
3648 gfc_finish_block (&tmpblock),
3649 NULL_TREE);
3650 }
3651
3652 gfc_trans_auto_array_allocation (sym->backend_decl,
3653 sym, block);
3654 gfc_restore_backend_locus (&loc);
3655 }
3656 break;
3657
3658 case AS_ASSUMED_SIZE:
3659 /* Must be a dummy parameter. */
3660 gcc_assert (sym->attr.dummy || sym->as->cp_was_assumed);
3661
3662 /* We should always pass assumed size arrays the g77 way. */
3663 if (sym->attr.dummy)
3664 gfc_trans_g77_array (sym, block);
3665 break;
3666
3667 case AS_ASSUMED_SHAPE:
3668 /* Must be a dummy parameter. */
3669 gcc_assert (sym->attr.dummy);
3670
3671 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3672 break;
3673
3674 case AS_DEFERRED:
3675 seen_trans_deferred_array = true;
3676 gfc_trans_deferred_array (sym, block);
3677 break;
3678
3679 default:
3680 gcc_unreachable ();
3681 }
3682 if (sym_has_alloc_comp && !seen_trans_deferred_array)
3683 gfc_trans_deferred_array (sym, block);
3684 }
3685 else if ((!sym->attr.dummy || sym->ts.deferred)
3686 && (sym->ts.type == BT_CLASS
3687 && CLASS_DATA (sym)->attr.pointer))
3688 continue;
3689 else if ((!sym->attr.dummy || sym->ts.deferred)
3690 && (sym->attr.allocatable
3691 || (sym->ts.type == BT_CLASS
3692 && CLASS_DATA (sym)->attr.allocatable)))
3693 {
3694 if (!sym->attr.save)
3695 {
3696 tree descriptor = NULL_TREE;
3697
3698 /* Nullify and automatic deallocation of allocatable
3699 scalars. */
3700 e = gfc_lval_expr_from_sym (sym);
3701 if (sym->ts.type == BT_CLASS)
3702 gfc_add_data_component (e);
3703
3704 gfc_init_se (&se, NULL);
3705 if (sym->ts.type != BT_CLASS
3706 || sym->ts.u.derived->attr.dimension
3707 || sym->ts.u.derived->attr.codimension)
3708 {
3709 se.want_pointer = 1;
3710 gfc_conv_expr (&se, e);
3711 }
3712 else if (sym->ts.type == BT_CLASS
3713 && !CLASS_DATA (sym)->attr.dimension
3714 && !CLASS_DATA (sym)->attr.codimension)
3715 {
3716 se.want_pointer = 1;
3717 gfc_conv_expr (&se, e);
3718 }
3719 else
3720 {
3721 gfc_conv_expr (&se, e);
3722 descriptor = se.expr;
3723 se.expr = gfc_conv_descriptor_data_addr (se.expr);
3724 se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
3725 }
3726 gfc_free_expr (e);
3727
3728 gfc_save_backend_locus (&loc);
3729 gfc_set_backend_locus (&sym->declared_at);
3730 gfc_start_block (&init);
3731
3732 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3733 {
3734 /* Nullify when entering the scope. */
3735 gfc_add_modify (&init, se.expr,
3736 fold_convert (TREE_TYPE (se.expr),
3737 null_pointer_node));
3738 }
3739
3740 if ((sym->attr.dummy ||sym->attr.result)
3741 && sym->ts.type == BT_CHARACTER
3742 && sym->ts.deferred)
3743 {
3744 /* Character length passed by reference. */
3745 tmp = sym->ts.u.cl->passed_length;
3746 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3747 tmp = fold_convert (gfc_charlen_type_node, tmp);
3748
3749 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3750 /* Zero the string length when entering the scope. */
3751 gfc_add_modify (&init, sym->ts.u.cl->backend_decl,
3752 build_int_cst (gfc_charlen_type_node, 0));
3753 else
3754 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
3755
3756 gfc_restore_backend_locus (&loc);
3757
3758 /* Pass the final character length back. */
3759 if (sym->attr.intent != INTENT_IN)
3760 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3761 gfc_charlen_type_node, tmp,
3762 sym->ts.u.cl->backend_decl);
3763 else
3764 tmp = NULL_TREE;
3765 }
3766 else
3767 gfc_restore_backend_locus (&loc);
3768
3769 /* Deallocate when leaving the scope. Nullifying is not
3770 needed. */
3771 if (!sym->attr.result && !sym->attr.dummy)
3772 {
3773 if (sym->ts.type == BT_CLASS
3774 && CLASS_DATA (sym)->attr.codimension)
3775 tmp = gfc_deallocate_with_status (descriptor, NULL_TREE,
3776 NULL_TREE, NULL_TREE,
3777 NULL_TREE, true, NULL,
3778 true);
3779 else
3780 tmp = gfc_deallocate_scalar_with_status (se.expr, NULL,
3781 true, NULL,
3782 sym->ts);
3783 }
3784 if (sym->ts.type == BT_CLASS)
3785 {
3786 /* Initialize _vptr to declared type. */
3787 gfc_symbol *vtab = gfc_find_derived_vtab (sym->ts.u.derived);
3788 tree rhs;
3789
3790 gfc_save_backend_locus (&loc);
3791 gfc_set_backend_locus (&sym->declared_at);
3792 e = gfc_lval_expr_from_sym (sym);
3793 gfc_add_vptr_component (e);
3794 gfc_init_se (&se, NULL);
3795 se.want_pointer = 1;
3796 gfc_conv_expr (&se, e);
3797 gfc_free_expr (e);
3798 rhs = gfc_build_addr_expr (TREE_TYPE (se.expr),
3799 gfc_get_symbol_decl (vtab));
3800 gfc_add_modify (&init, se.expr, rhs);
3801 gfc_restore_backend_locus (&loc);
3802 }
3803
3804 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3805 }
3806 }
3807 else if (sym->ts.type == BT_CHARACTER && sym->ts.deferred)
3808 {
3809 tree tmp = NULL;
3810 stmtblock_t init;
3811
3812 /* If we get to here, all that should be left are pointers. */
3813 gcc_assert (sym->attr.pointer);
3814
3815 if (sym->attr.dummy)
3816 {
3817 gfc_start_block (&init);
3818
3819 /* Character length passed by reference. */
3820 tmp = sym->ts.u.cl->passed_length;
3821 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3822 tmp = fold_convert (gfc_charlen_type_node, tmp);
3823 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
3824 /* Pass the final character length back. */
3825 if (sym->attr.intent != INTENT_IN)
3826 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3827 gfc_charlen_type_node, tmp,
3828 sym->ts.u.cl->backend_decl);
3829 else
3830 tmp = NULL_TREE;
3831 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3832 }
3833 }
3834 else if (sym->ts.deferred)
3835 gfc_fatal_error ("Deferred type parameter not yet supported");
3836 else if (sym_has_alloc_comp)
3837 gfc_trans_deferred_array (sym, block);
3838 else if (sym->ts.type == BT_CHARACTER)
3839 {
3840 gfc_save_backend_locus (&loc);
3841 gfc_set_backend_locus (&sym->declared_at);
3842 if (sym->attr.dummy || sym->attr.result)
3843 gfc_trans_dummy_character (sym, sym->ts.u.cl, block);
3844 else
3845 gfc_trans_auto_character_variable (sym, block);
3846 gfc_restore_backend_locus (&loc);
3847 }
3848 else if (sym->attr.assign)
3849 {
3850 gfc_save_backend_locus (&loc);
3851 gfc_set_backend_locus (&sym->declared_at);
3852 gfc_trans_assign_aux_var (sym, block);
3853 gfc_restore_backend_locus (&loc);
3854 }
3855 else if (sym->ts.type == BT_DERIVED
3856 && sym->value
3857 && !sym->attr.data
3858 && sym->attr.save == SAVE_NONE)
3859 {
3860 gfc_start_block (&tmpblock);
3861 gfc_init_default_dt (sym, &tmpblock, false);
3862 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3863 NULL_TREE);
3864 }
3865 else
3866 gcc_unreachable ();
3867 }
3868
3869 gfc_init_block (&tmpblock);
3870
3871 for (f = proc_sym->formal; f; f = f->next)
3872 {
3873 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
3874 {
3875 gcc_assert (f->sym->ts.u.cl->backend_decl != NULL);
3876 if (TREE_CODE (f->sym->ts.u.cl->backend_decl) == PARM_DECL)
3877 gfc_trans_vla_type_sizes (f->sym, &tmpblock);
3878 }
3879 }
3880
3881 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
3882 && current_fake_result_decl != NULL)
3883 {
3884 gcc_assert (proc_sym->ts.u.cl->backend_decl != NULL);
3885 if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == PARM_DECL)
3886 gfc_trans_vla_type_sizes (proc_sym, &tmpblock);
3887 }
3888
3889 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE);
3890 }
3891
3892 static GTY ((param_is (struct module_htab_entry))) htab_t module_htab;
3893
3894 /* Hash and equality functions for module_htab. */
3895
3896 static hashval_t
3897 module_htab_do_hash (const void *x)
3898 {
3899 return htab_hash_string (((const struct module_htab_entry *)x)->name);
3900 }
3901
3902 static int
3903 module_htab_eq (const void *x1, const void *x2)
3904 {
3905 return strcmp ((((const struct module_htab_entry *)x1)->name),
3906 (const char *)x2) == 0;
3907 }
3908
3909 /* Hash and equality functions for module_htab's decls. */
3910
3911 static hashval_t
3912 module_htab_decls_hash (const void *x)
3913 {
3914 const_tree t = (const_tree) x;
3915 const_tree n = DECL_NAME (t);
3916 if (n == NULL_TREE)
3917 n = TYPE_NAME (TREE_TYPE (t));
3918 return htab_hash_string (IDENTIFIER_POINTER (n));
3919 }
3920
3921 static int
3922 module_htab_decls_eq (const void *x1, const void *x2)
3923 {
3924 const_tree t1 = (const_tree) x1;
3925 const_tree n1 = DECL_NAME (t1);
3926 if (n1 == NULL_TREE)
3927 n1 = TYPE_NAME (TREE_TYPE (t1));
3928 return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0;
3929 }
3930
3931 struct module_htab_entry *
3932 gfc_find_module (const char *name)
3933 {
3934 void **slot;
3935
3936 if (! module_htab)
3937 module_htab = htab_create_ggc (10, module_htab_do_hash,
3938 module_htab_eq, NULL);
3939
3940 slot = htab_find_slot_with_hash (module_htab, name,
3941 htab_hash_string (name), INSERT);
3942 if (*slot == NULL)
3943 {
3944 struct module_htab_entry *entry = ggc_alloc_cleared_module_htab_entry ();
3945
3946 entry->name = gfc_get_string (name);
3947 entry->decls = htab_create_ggc (10, module_htab_decls_hash,
3948 module_htab_decls_eq, NULL);
3949 *slot = (void *) entry;
3950 }
3951 return (struct module_htab_entry *) *slot;
3952 }
3953
3954 void
3955 gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
3956 {
3957 void **slot;
3958 const char *name;
3959
3960 if (DECL_NAME (decl))
3961 name = IDENTIFIER_POINTER (DECL_NAME (decl));
3962 else
3963 {
3964 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
3965 name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
3966 }
3967 slot = htab_find_slot_with_hash (entry->decls, name,
3968 htab_hash_string (name), INSERT);
3969 if (*slot == NULL)
3970 *slot = (void *) decl;
3971 }
3972
3973 static struct module_htab_entry *cur_module;
3974
3975 /* Output an initialized decl for a module variable. */
3976
3977 static void
3978 gfc_create_module_variable (gfc_symbol * sym)
3979 {
3980 tree decl;
3981
3982 /* Module functions with alternate entries are dealt with later and
3983 would get caught by the next condition. */
3984 if (sym->attr.entry)
3985 return;
3986
3987 /* Make sure we convert the types of the derived types from iso_c_binding
3988 into (void *). */
3989 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3990 && sym->ts.type == BT_DERIVED)
3991 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3992
3993 if (sym->attr.flavor == FL_DERIVED
3994 && sym->backend_decl
3995 && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
3996 {
3997 decl = sym->backend_decl;
3998 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3999
4000 /* -fwhole-file mixes up the contexts so these asserts are unnecessary. */
4001 if (!(gfc_option.flag_whole_file && sym->attr.use_assoc))
4002 {
4003 gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
4004 || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
4005 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
4006 || DECL_CONTEXT (TYPE_STUB_DECL (decl))
4007 == sym->ns->proc_name->backend_decl);
4008 }
4009 TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4010 DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
4011 gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
4012 }
4013
4014 /* Only output variables, procedure pointers and array valued,
4015 or derived type, parameters. */
4016 if (sym->attr.flavor != FL_VARIABLE
4017 && !(sym->attr.flavor == FL_PARAMETER
4018 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
4019 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
4020 return;
4021
4022 if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
4023 {
4024 decl = sym->backend_decl;
4025 gcc_assert (DECL_FILE_SCOPE_P (decl));
4026 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
4027 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4028 gfc_module_add_decl (cur_module, decl);
4029 }
4030
4031 /* Don't generate variables from other modules. Variables from
4032 COMMONs will already have been generated. */
4033 if (sym->attr.use_assoc || sym->attr.in_common)
4034 return;
4035
4036 /* Equivalenced variables arrive here after creation. */
4037 if (sym->backend_decl
4038 && (sym->equiv_built || sym->attr.in_equivalence))
4039 return;
4040
4041 if (sym->backend_decl && !sym->attr.vtab && !sym->attr.target)
4042 internal_error ("backend decl for module variable %s already exists",
4043 sym->name);
4044
4045 /* We always want module variables to be created. */
4046 sym->attr.referenced = 1;
4047 /* Create the decl. */
4048 decl = gfc_get_symbol_decl (sym);
4049
4050 /* Create the variable. */
4051 pushdecl (decl);
4052 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
4053 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4054 rest_of_decl_compilation (decl, 1, 0);
4055 gfc_module_add_decl (cur_module, decl);
4056
4057 /* Also add length of strings. */
4058 if (sym->ts.type == BT_CHARACTER)
4059 {
4060 tree length;
4061
4062 length = sym->ts.u.cl->backend_decl;
4063 gcc_assert (length || sym->attr.proc_pointer);
4064 if (length && !INTEGER_CST_P (length))
4065 {
4066 pushdecl (length);
4067 rest_of_decl_compilation (length, 1, 0);
4068 }
4069 }
4070
4071 if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
4072 && sym->attr.referenced && !sym->attr.use_assoc)
4073 has_coarray_vars = true;
4074 }
4075
4076 /* Emit debug information for USE statements. */
4077
4078 static void
4079 gfc_trans_use_stmts (gfc_namespace * ns)
4080 {
4081 gfc_use_list *use_stmt;
4082 for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
4083 {
4084 struct module_htab_entry *entry
4085 = gfc_find_module (use_stmt->module_name);
4086 gfc_use_rename *rent;
4087
4088 if (entry->namespace_decl == NULL)
4089 {
4090 entry->namespace_decl
4091 = build_decl (input_location,
4092 NAMESPACE_DECL,
4093 get_identifier (use_stmt->module_name),
4094 void_type_node);
4095 DECL_EXTERNAL (entry->namespace_decl) = 1;
4096 }
4097 gfc_set_backend_locus (&use_stmt->where);
4098 if (!use_stmt->only_flag)
4099 (*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
4100 NULL_TREE,
4101 ns->proc_name->backend_decl,
4102 false);
4103 for (rent = use_stmt->rename; rent; rent = rent->next)
4104 {
4105 tree decl, local_name;
4106 void **slot;
4107
4108 if (rent->op != INTRINSIC_NONE)
4109 continue;
4110
4111 slot = htab_find_slot_with_hash (entry->decls, rent->use_name,
4112 htab_hash_string (rent->use_name),
4113 INSERT);
4114 if (*slot == NULL)
4115 {
4116 gfc_symtree *st;
4117
4118 st = gfc_find_symtree (ns->sym_root,
4119 rent->local_name[0]
4120 ? rent->local_name : rent->use_name);
4121
4122 /* The following can happen if a derived type is renamed. */
4123 if (!st)
4124 {
4125 char *name;
4126 name = xstrdup (rent->local_name[0]
4127 ? rent->local_name : rent->use_name);
4128 name[0] = (char) TOUPPER ((unsigned char) name[0]);
4129 st = gfc_find_symtree (ns->sym_root, name);
4130 free (name);
4131 gcc_assert (st);
4132 }
4133
4134 /* Sometimes, generic interfaces wind up being over-ruled by a
4135 local symbol (see PR41062). */
4136 if (!st->n.sym->attr.use_assoc)
4137 continue;
4138
4139 if (st->n.sym->backend_decl
4140 && DECL_P (st->n.sym->backend_decl)
4141 && st->n.sym->module
4142 && strcmp (st->n.sym->module, use_stmt->module_name) == 0)
4143 {
4144 gcc_assert (DECL_EXTERNAL (entry->namespace_decl)
4145 || (TREE_CODE (st->n.sym->backend_decl)
4146 != VAR_DECL));
4147 decl = copy_node (st->n.sym->backend_decl);
4148 DECL_CONTEXT (decl) = entry->namespace_decl;
4149 DECL_EXTERNAL (decl) = 1;
4150 DECL_IGNORED_P (decl) = 0;
4151 DECL_INITIAL (decl) = NULL_TREE;
4152 }
4153 else
4154 {
4155 *slot = error_mark_node;
4156 htab_clear_slot (entry->decls, slot);
4157 continue;
4158 }
4159 *slot = decl;
4160 }
4161 decl = (tree) *slot;
4162 if (rent->local_name[0])
4163 local_name = get_identifier (rent->local_name);
4164 else
4165 local_name = NULL_TREE;
4166 gfc_set_backend_locus (&rent->where);
4167 (*debug_hooks->imported_module_or_decl) (decl, local_name,
4168 ns->proc_name->backend_decl,
4169 !use_stmt->only_flag);
4170 }
4171 }
4172 }
4173
4174
4175 /* Return true if expr is a constant initializer that gfc_conv_initializer
4176 will handle. */
4177
4178 static bool
4179 check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array,
4180 bool pointer)
4181 {
4182 gfc_constructor *c;
4183 gfc_component *cm;
4184
4185 if (pointer)
4186 return true;
4187 else if (array)
4188 {
4189 if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL)
4190 return true;
4191 else if (expr->expr_type == EXPR_STRUCTURE)
4192 return check_constant_initializer (expr, ts, false, false);
4193 else if (expr->expr_type != EXPR_ARRAY)
4194 return false;
4195 for (c = gfc_constructor_first (expr->value.constructor);
4196 c; c = gfc_constructor_next (c))
4197 {
4198 if (c->iterator)
4199 return false;
4200 if (c->expr->expr_type == EXPR_STRUCTURE)
4201 {
4202 if (!check_constant_initializer (c->expr, ts, false, false))
4203 return false;
4204 }
4205 else if (c->expr->expr_type != EXPR_CONSTANT)
4206 return false;
4207 }
4208 return true;
4209 }
4210 else switch (ts->type)
4211 {
4212 case BT_DERIVED:
4213 if (expr->expr_type != EXPR_STRUCTURE)
4214 return false;
4215 cm = expr->ts.u.derived->components;
4216 for (c = gfc_constructor_first (expr->value.constructor);
4217 c; c = gfc_constructor_next (c), cm = cm->next)
4218 {
4219 if (!c->expr || cm->attr.allocatable)
4220 continue;
4221 if (!check_constant_initializer (c->expr, &cm->ts,
4222 cm->attr.dimension,
4223 cm->attr.pointer))
4224 return false;
4225 }
4226 return true;
4227 default:
4228 return expr->expr_type == EXPR_CONSTANT;
4229 }
4230 }
4231
4232 /* Emit debug info for parameters and unreferenced variables with
4233 initializers. */
4234
4235 static void
4236 gfc_emit_parameter_debug_info (gfc_symbol *sym)
4237 {
4238 tree decl;
4239
4240 if (sym->attr.flavor != FL_PARAMETER
4241 && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced))
4242 return;
4243
4244 if (sym->backend_decl != NULL
4245 || sym->value == NULL
4246 || sym->attr.use_assoc
4247 || sym->attr.dummy
4248 || sym->attr.result
4249 || sym->attr.function
4250 || sym->attr.intrinsic
4251 || sym->attr.pointer
4252 || sym->attr.allocatable
4253 || sym->attr.cray_pointee
4254 || sym->attr.threadprivate
4255 || sym->attr.is_bind_c
4256 || sym->attr.subref_array_pointer
4257 || sym->attr.assign)
4258 return;
4259
4260 if (sym->ts.type == BT_CHARACTER)
4261 {
4262 gfc_conv_const_charlen (sym->ts.u.cl);
4263 if (sym->ts.u.cl->backend_decl == NULL
4264 || TREE_CODE (sym->ts.u.cl->backend_decl) != INTEGER_CST)
4265 return;
4266 }
4267 else if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
4268 return;
4269
4270 if (sym->as)
4271 {
4272 int n;
4273
4274 if (sym->as->type != AS_EXPLICIT)
4275 return;
4276 for (n = 0; n < sym->as->rank; n++)
4277 if (sym->as->lower[n]->expr_type != EXPR_CONSTANT
4278 || sym->as->upper[n] == NULL
4279 || sym->as->upper[n]->expr_type != EXPR_CONSTANT)
4280 return;
4281 }
4282
4283 if (!check_constant_initializer (sym->value, &sym->ts,
4284 sym->attr.dimension, false))
4285 return;
4286
4287 if (gfc_option.coarray == GFC_FCOARRAY_LIB && sym->attr.codimension)
4288 return;
4289
4290 /* Create the decl for the variable or constant. */
4291 decl = build_decl (input_location,
4292 sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL,
4293 gfc_sym_identifier (sym), gfc_sym_type (sym));
4294 if (sym->attr.flavor == FL_PARAMETER)
4295 TREE_READONLY (decl) = 1;
4296 gfc_set_decl_location (decl, &sym->declared_at);
4297 if (sym->attr.dimension)
4298 GFC_DECL_PACKED_ARRAY (decl) = 1;
4299 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4300 TREE_STATIC (decl) = 1;
4301 TREE_USED (decl) = 1;
4302 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
4303 TREE_PUBLIC (decl) = 1;
4304 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
4305 TREE_TYPE (decl),
4306 sym->attr.dimension,
4307 false, false);
4308 debug_hooks->global_decl (decl);
4309 }
4310
4311
4312 static void
4313 generate_coarray_sym_init (gfc_symbol *sym)
4314 {
4315 tree tmp, size, decl, token;
4316
4317 if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
4318 || sym->attr.use_assoc || !sym->attr.referenced)
4319 return;
4320
4321 decl = sym->backend_decl;
4322 TREE_USED(decl) = 1;
4323 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
4324
4325 /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
4326 to make sure the variable is not optimized away. */
4327 DECL_PRESERVE_P (DECL_CONTEXT (decl)) = 1;
4328
4329 size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl)));
4330
4331 /* Ensure that we do not have size=0 for zero-sized arrays. */
4332 size = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
4333 fold_convert (size_type_node, size),
4334 build_int_cst (size_type_node, 1));
4335
4336 if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)))
4337 {
4338 tmp = GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl));
4339 size = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
4340 fold_convert (size_type_node, tmp), size);
4341 }
4342
4343 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl)) != NULL_TREE);
4344 token = gfc_build_addr_expr (ppvoid_type_node,
4345 GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl)));
4346
4347 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size,
4348 build_int_cst (integer_type_node,
4349 GFC_CAF_COARRAY_STATIC), /* type. */
4350 token, null_pointer_node, /* token, stat. */
4351 null_pointer_node, /* errgmsg, errmsg_len. */
4352 build_int_cst (integer_type_node, 0));
4353
4354 gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl), tmp));
4355
4356
4357 /* Handle "static" initializer. */
4358 if (sym->value)
4359 {
4360 sym->attr.pointer = 1;
4361 tmp = gfc_trans_assignment (gfc_lval_expr_from_sym (sym), sym->value,
4362 true, false);
4363 sym->attr.pointer = 0;
4364 gfc_add_expr_to_block (&caf_init_block, tmp);
4365 }
4366 }
4367
4368
4369 /* Generate constructor function to initialize static, nonallocatable
4370 coarrays. */
4371
4372 static void
4373 generate_coarray_init (gfc_namespace * ns __attribute((unused)))
4374 {
4375 tree fndecl, tmp, decl, save_fn_decl;
4376
4377 save_fn_decl = current_function_decl;
4378 push_function_context ();
4379
4380 tmp = build_function_type_list (void_type_node, NULL_TREE);
4381 fndecl = build_decl (input_location, FUNCTION_DECL,
4382 create_tmp_var_name ("_caf_init"), tmp);
4383
4384 DECL_STATIC_CONSTRUCTOR (fndecl) = 1;
4385 SET_DECL_INIT_PRIORITY (fndecl, DEFAULT_INIT_PRIORITY);
4386
4387 decl = build_decl (input_location, RESULT_DECL, NULL_TREE, void_type_node);
4388 DECL_ARTIFICIAL (decl) = 1;
4389 DECL_IGNORED_P (decl) = 1;
4390 DECL_CONTEXT (decl) = fndecl;
4391 DECL_RESULT (fndecl) = decl;
4392
4393 pushdecl (fndecl);
4394 current_function_decl = fndecl;
4395 announce_function (fndecl);
4396
4397 rest_of_decl_compilation (fndecl, 0, 0);
4398 make_decl_rtl (fndecl);
4399 init_function_start (fndecl);
4400
4401 pushlevel (0);
4402 gfc_init_block (&caf_init_block);
4403
4404 gfc_traverse_ns (ns, generate_coarray_sym_init);
4405
4406 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&caf_init_block);
4407 decl = getdecls ();
4408
4409 poplevel (1, 0, 1);
4410 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
4411
4412 DECL_SAVED_TREE (fndecl)
4413 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
4414 DECL_INITIAL (fndecl));
4415 dump_function (TDI_original, fndecl);
4416
4417 cfun->function_end_locus = input_location;
4418 set_cfun (NULL);
4419
4420 if (decl_function_context (fndecl))
4421 (void) cgraph_create_node (fndecl);
4422 else
4423 cgraph_finalize_function (fndecl, true);
4424
4425 pop_function_context ();
4426 current_function_decl = save_fn_decl;
4427 }
4428
4429
4430 /* Generate all the required code for module variables. */
4431
4432 void
4433 gfc_generate_module_vars (gfc_namespace * ns)
4434 {
4435 module_namespace = ns;
4436 cur_module = gfc_find_module (ns->proc_name->name);
4437
4438 /* Check if the frontend left the namespace in a reasonable state. */
4439 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
4440
4441 /* Generate COMMON blocks. */
4442 gfc_trans_common (ns);
4443
4444 has_coarray_vars = false;
4445
4446 /* Create decls for all the module variables. */
4447 gfc_traverse_ns (ns, gfc_create_module_variable);
4448
4449 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
4450 generate_coarray_init (ns);
4451
4452 cur_module = NULL;
4453
4454 gfc_trans_use_stmts (ns);
4455 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
4456 }
4457
4458
4459 static void
4460 gfc_generate_contained_functions (gfc_namespace * parent)
4461 {
4462 gfc_namespace *ns;
4463
4464 /* We create all the prototypes before generating any code. */
4465 for (ns = parent->contained; ns; ns = ns->sibling)
4466 {
4467 /* Skip namespaces from used modules. */
4468 if (ns->parent != parent)
4469 continue;
4470
4471 gfc_create_function_decl (ns, false);
4472 }
4473
4474 for (ns = parent->contained; ns; ns = ns->sibling)
4475 {
4476 /* Skip namespaces from used modules. */
4477 if (ns->parent != parent)
4478 continue;
4479
4480 gfc_generate_function_code (ns);
4481 }
4482 }
4483
4484
4485 /* Drill down through expressions for the array specification bounds and
4486 character length calling generate_local_decl for all those variables
4487 that have not already been declared. */
4488
4489 static void
4490 generate_local_decl (gfc_symbol *);
4491
4492 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4493
4494 static bool
4495 expr_decls (gfc_expr *e, gfc_symbol *sym,
4496 int *f ATTRIBUTE_UNUSED)
4497 {
4498 if (e->expr_type != EXPR_VARIABLE
4499 || sym == e->symtree->n.sym
4500 || e->symtree->n.sym->mark
4501 || e->symtree->n.sym->ns != sym->ns)
4502 return false;
4503
4504 generate_local_decl (e->symtree->n.sym);
4505 return false;
4506 }
4507
4508 static void
4509 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
4510 {
4511 gfc_traverse_expr (e, sym, expr_decls, 0);
4512 }
4513
4514
4515 /* Check for dependencies in the character length and array spec. */
4516
4517 static void
4518 generate_dependency_declarations (gfc_symbol *sym)
4519 {
4520 int i;
4521
4522 if (sym->ts.type == BT_CHARACTER
4523 && sym->ts.u.cl
4524 && sym->ts.u.cl->length
4525 && sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4526 generate_expr_decls (sym, sym->ts.u.cl->length);
4527
4528 if (sym->as && sym->as->rank)
4529 {
4530 for (i = 0; i < sym->as->rank; i++)
4531 {
4532 generate_expr_decls (sym, sym->as->lower[i]);
4533 generate_expr_decls (sym, sym->as->upper[i]);
4534 }
4535 }
4536 }
4537
4538
4539 /* Generate decls for all local variables. We do this to ensure correct
4540 handling of expressions which only appear in the specification of
4541 other functions. */
4542
4543 static void
4544 generate_local_decl (gfc_symbol * sym)
4545 {
4546 if (sym->attr.flavor == FL_VARIABLE)
4547 {
4548 if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
4549 && sym->attr.referenced && !sym->attr.use_assoc)
4550 has_coarray_vars = true;
4551
4552 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
4553 generate_dependency_declarations (sym);
4554
4555 if (sym->attr.referenced)
4556 gfc_get_symbol_decl (sym);
4557
4558 /* Warnings for unused dummy arguments. */
4559 else if (sym->attr.dummy)
4560 {
4561 /* INTENT(out) dummy arguments are likely meant to be set. */
4562 if (gfc_option.warn_unused_dummy_argument
4563 && sym->attr.intent == INTENT_OUT)
4564 {
4565 if (sym->ts.type != BT_DERIVED)
4566 gfc_warning ("Dummy argument '%s' at %L was declared "
4567 "INTENT(OUT) but was not set", sym->name,
4568 &sym->declared_at);
4569 else if (!gfc_has_default_initializer (sym->ts.u.derived))
4570 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4571 "declared INTENT(OUT) but was not set and "
4572 "does not have a default initializer",
4573 sym->name, &sym->declared_at);
4574 if (sym->backend_decl != NULL_TREE)
4575 TREE_NO_WARNING(sym->backend_decl) = 1;
4576 }
4577 else if (gfc_option.warn_unused_dummy_argument)
4578 {
4579 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
4580 &sym->declared_at);
4581 if (sym->backend_decl != NULL_TREE)
4582 TREE_NO_WARNING(sym->backend_decl) = 1;
4583 }
4584 }
4585
4586 /* Warn for unused variables, but not if they're inside a common
4587 block, a namelist, or are use-associated. */
4588 else if (warn_unused_variable
4589 && !(sym->attr.in_common || sym->attr.use_assoc || sym->mark
4590 || sym->attr.in_namelist))
4591 {
4592 gfc_warning ("Unused variable '%s' declared at %L", sym->name,
4593 &sym->declared_at);
4594 if (sym->backend_decl != NULL_TREE)
4595 TREE_NO_WARNING(sym->backend_decl) = 1;
4596 }
4597 else if (warn_unused_variable && sym->attr.use_only)
4598 {
4599 gfc_warning ("Unused module variable '%s' which has been explicitly "
4600 "imported at %L", sym->name, &sym->declared_at);
4601 if (sym->backend_decl != NULL_TREE)
4602 TREE_NO_WARNING(sym->backend_decl) = 1;
4603 }
4604
4605 /* For variable length CHARACTER parameters, the PARM_DECL already
4606 references the length variable, so force gfc_get_symbol_decl
4607 even when not referenced. If optimize > 0, it will be optimized
4608 away anyway. But do this only after emitting -Wunused-parameter
4609 warning if requested. */
4610 if (sym->attr.dummy && !sym->attr.referenced
4611 && sym->ts.type == BT_CHARACTER
4612 && sym->ts.u.cl->backend_decl != NULL
4613 && TREE_CODE (sym->ts.u.cl->backend_decl) == VAR_DECL)
4614 {
4615 sym->attr.referenced = 1;
4616 gfc_get_symbol_decl (sym);
4617 }
4618
4619 /* INTENT(out) dummy arguments and result variables with allocatable
4620 components are reset by default and need to be set referenced to
4621 generate the code for nullification and automatic lengths. */
4622 if (!sym->attr.referenced
4623 && sym->ts.type == BT_DERIVED
4624 && sym->ts.u.derived->attr.alloc_comp
4625 && !sym->attr.pointer
4626 && ((sym->attr.dummy && sym->attr.intent == INTENT_OUT)
4627 ||
4628 (sym->attr.result && sym != sym->result)))
4629 {
4630 sym->attr.referenced = 1;
4631 gfc_get_symbol_decl (sym);
4632 }
4633
4634 /* Check for dependencies in the array specification and string
4635 length, adding the necessary declarations to the function. We
4636 mark the symbol now, as well as in traverse_ns, to prevent
4637 getting stuck in a circular dependency. */
4638 sym->mark = 1;
4639 }
4640 else if (sym->attr.flavor == FL_PARAMETER)
4641 {
4642 if (warn_unused_parameter
4643 && !sym->attr.referenced)
4644 {
4645 if (!sym->attr.use_assoc)
4646 gfc_warning ("Unused parameter '%s' declared at %L", sym->name,
4647 &sym->declared_at);
4648 else if (sym->attr.use_only)
4649 gfc_warning ("Unused parameter '%s' which has been explicitly "
4650 "imported at %L", sym->name, &sym->declared_at);
4651 }
4652 }
4653 else if (sym->attr.flavor == FL_PROCEDURE)
4654 {
4655 /* TODO: move to the appropriate place in resolve.c. */
4656 if (warn_return_type
4657 && sym->attr.function
4658 && sym->result
4659 && sym != sym->result
4660 && !sym->result->attr.referenced
4661 && !sym->attr.use_assoc
4662 && sym->attr.if_source != IFSRC_IFBODY)
4663 {
4664 gfc_warning ("Return value '%s' of function '%s' declared at "
4665 "%L not set", sym->result->name, sym->name,
4666 &sym->result->declared_at);
4667
4668 /* Prevents "Unused variable" warning for RESULT variables. */
4669 sym->result->mark = 1;
4670 }
4671 }
4672
4673 if (sym->attr.dummy == 1)
4674 {
4675 /* Modify the tree type for scalar character dummy arguments of bind(c)
4676 procedures if they are passed by value. The tree type for them will
4677 be promoted to INTEGER_TYPE for the middle end, which appears to be
4678 what C would do with characters passed by-value. The value attribute
4679 implies the dummy is a scalar. */
4680 if (sym->attr.value == 1 && sym->backend_decl != NULL
4681 && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
4682 && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
4683 gfc_conv_scalar_char_value (sym, NULL, NULL);
4684 }
4685
4686 /* Make sure we convert the types of the derived types from iso_c_binding
4687 into (void *). */
4688 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
4689 && sym->ts.type == BT_DERIVED)
4690 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
4691 }
4692
4693 static void
4694 generate_local_vars (gfc_namespace * ns)
4695 {
4696 gfc_traverse_ns (ns, generate_local_decl);
4697 }
4698
4699
4700 /* Generate a switch statement to jump to the correct entry point. Also
4701 creates the label decls for the entry points. */
4702
4703 static tree
4704 gfc_trans_entry_master_switch (gfc_entry_list * el)
4705 {
4706 stmtblock_t block;
4707 tree label;
4708 tree tmp;
4709 tree val;
4710
4711 gfc_init_block (&block);
4712 for (; el; el = el->next)
4713 {
4714 /* Add the case label. */
4715 label = gfc_build_label_decl (NULL_TREE);
4716 val = build_int_cst (gfc_array_index_type, el->id);
4717 tmp = build_case_label (val, NULL_TREE, label);
4718 gfc_add_expr_to_block (&block, tmp);
4719
4720 /* And jump to the actual entry point. */
4721 label = gfc_build_label_decl (NULL_TREE);
4722 tmp = build1_v (GOTO_EXPR, label);
4723 gfc_add_expr_to_block (&block, tmp);
4724
4725 /* Save the label decl. */
4726 el->label = label;
4727 }
4728 tmp = gfc_finish_block (&block);
4729 /* The first argument selects the entry point. */
4730 val = DECL_ARGUMENTS (current_function_decl);
4731 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
4732 return tmp;
4733 }
4734
4735
4736 /* Add code to string lengths of actual arguments passed to a function against
4737 the expected lengths of the dummy arguments. */
4738
4739 static void
4740 add_argument_checking (stmtblock_t *block, gfc_symbol *sym)
4741 {
4742 gfc_formal_arglist *formal;
4743
4744 for (formal = sym->formal; formal; formal = formal->next)
4745 if (formal->sym && formal->sym->ts.type == BT_CHARACTER
4746 && !formal->sym->ts.deferred)
4747 {
4748 enum tree_code comparison;
4749 tree cond;
4750 tree argname;
4751 gfc_symbol *fsym;
4752 gfc_charlen *cl;
4753 const char *message;
4754
4755 fsym = formal->sym;
4756 cl = fsym->ts.u.cl;
4757
4758 gcc_assert (cl);
4759 gcc_assert (cl->passed_length != NULL_TREE);
4760 gcc_assert (cl->backend_decl != NULL_TREE);
4761
4762 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
4763 string lengths must match exactly. Otherwise, it is only required
4764 that the actual string length is *at least* the expected one.
4765 Sequence association allows for a mismatch of the string length
4766 if the actual argument is (part of) an array, but only if the
4767 dummy argument is an array. (See "Sequence association" in
4768 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
4769 if (fsym->attr.pointer || fsym->attr.allocatable
4770 || (fsym->as && fsym->as->type == AS_ASSUMED_SHAPE))
4771 {
4772 comparison = NE_EXPR;
4773 message = _("Actual string length does not match the declared one"
4774 " for dummy argument '%s' (%ld/%ld)");
4775 }
4776 else if (fsym->as && fsym->as->rank != 0)
4777 continue;
4778 else
4779 {
4780 comparison = LT_EXPR;
4781 message = _("Actual string length is shorter than the declared one"
4782 " for dummy argument '%s' (%ld/%ld)");
4783 }
4784
4785 /* Build the condition. For optional arguments, an actual length
4786 of 0 is also acceptable if the associated string is NULL, which
4787 means the argument was not passed. */
4788 cond = fold_build2_loc (input_location, comparison, boolean_type_node,
4789 cl->passed_length, cl->backend_decl);
4790 if (fsym->attr.optional)
4791 {
4792 tree not_absent;
4793 tree not_0length;
4794 tree absent_failed;
4795
4796 not_0length = fold_build2_loc (input_location, NE_EXPR,
4797 boolean_type_node,
4798 cl->passed_length,
4799 build_zero_cst (gfc_charlen_type_node));
4800 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
4801 fsym->attr.referenced = 1;
4802 not_absent = gfc_conv_expr_present (fsym);
4803
4804 absent_failed = fold_build2_loc (input_location, TRUTH_OR_EXPR,
4805 boolean_type_node, not_0length,
4806 not_absent);
4807
4808 cond = fold_build2_loc (input_location, TRUTH_AND_EXPR,
4809 boolean_type_node, cond, absent_failed);
4810 }
4811
4812 /* Build the runtime check. */
4813 argname = gfc_build_cstring_const (fsym->name);
4814 argname = gfc_build_addr_expr (pchar_type_node, argname);
4815 gfc_trans_runtime_check (true, false, cond, block, &fsym->declared_at,
4816 message, argname,
4817 fold_convert (long_integer_type_node,
4818 cl->passed_length),
4819 fold_convert (long_integer_type_node,
4820 cl->backend_decl));
4821 }
4822 }
4823
4824
4825 /* Generate the _gfortran_caf_this_image and _gfortran_caf_num_images
4826 global variables for -fcoarray=lib. They are placed into the translation
4827 unit of the main program. Make sure that in one TU (the one of the main
4828 program), the first call to gfc_init_coarray_decl is done with true.
4829 Otherwise, expect link errors. */
4830
4831 void
4832 gfc_init_coarray_decl (bool main_tu)
4833 {
4834 tree save_fn_decl;
4835
4836 if (gfc_option.coarray != GFC_FCOARRAY_LIB)
4837 return;
4838
4839 if (gfort_gvar_caf_this_image || gfort_gvar_caf_num_images)
4840 return;
4841
4842 save_fn_decl = current_function_decl;
4843 current_function_decl = NULL_TREE;
4844 push_cfun (cfun);
4845
4846 gfort_gvar_caf_this_image
4847 = build_decl (input_location, VAR_DECL,
4848 get_identifier (PREFIX("caf_this_image")),
4849 integer_type_node);
4850 DECL_ARTIFICIAL (gfort_gvar_caf_this_image) = 1;
4851 TREE_USED (gfort_gvar_caf_this_image) = 1;
4852 TREE_PUBLIC (gfort_gvar_caf_this_image) = 1;
4853 TREE_READONLY (gfort_gvar_caf_this_image) = 0;
4854
4855 if (main_tu)
4856 TREE_STATIC (gfort_gvar_caf_this_image) = 1;
4857 else
4858 DECL_EXTERNAL (gfort_gvar_caf_this_image) = 1;
4859
4860 pushdecl_top_level (gfort_gvar_caf_this_image);
4861
4862 gfort_gvar_caf_num_images
4863 = build_decl (input_location, VAR_DECL,
4864 get_identifier (PREFIX("caf_num_images")),
4865 integer_type_node);
4866 DECL_ARTIFICIAL (gfort_gvar_caf_num_images) = 1;
4867 TREE_USED (gfort_gvar_caf_num_images) = 1;
4868 TREE_PUBLIC (gfort_gvar_caf_num_images) = 1;
4869 TREE_READONLY (gfort_gvar_caf_num_images) = 0;
4870
4871 if (main_tu)
4872 TREE_STATIC (gfort_gvar_caf_num_images) = 1;
4873 else
4874 DECL_EXTERNAL (gfort_gvar_caf_num_images) = 1;
4875
4876 pushdecl_top_level (gfort_gvar_caf_num_images);
4877
4878 pop_cfun ();
4879 current_function_decl = save_fn_decl;
4880 }
4881
4882
4883 static void
4884 create_main_function (tree fndecl)
4885 {
4886 tree old_context;
4887 tree ftn_main;
4888 tree tmp, decl, result_decl, argc, argv, typelist, arglist;
4889 stmtblock_t body;
4890
4891 old_context = current_function_decl;
4892
4893 if (old_context)
4894 {
4895 push_function_context ();
4896 saved_parent_function_decls = saved_function_decls;
4897 saved_function_decls = NULL_TREE;
4898 }
4899
4900 /* main() function must be declared with global scope. */
4901 gcc_assert (current_function_decl == NULL_TREE);
4902
4903 /* Declare the function. */
4904 tmp = build_function_type_list (integer_type_node, integer_type_node,
4905 build_pointer_type (pchar_type_node),
4906 NULL_TREE);
4907 main_identifier_node = get_identifier ("main");
4908 ftn_main = build_decl (input_location, FUNCTION_DECL,
4909 main_identifier_node, tmp);
4910 DECL_EXTERNAL (ftn_main) = 0;
4911 TREE_PUBLIC (ftn_main) = 1;
4912 TREE_STATIC (ftn_main) = 1;
4913 DECL_ATTRIBUTES (ftn_main)
4914 = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
4915
4916 /* Setup the result declaration (for "return 0"). */
4917 result_decl = build_decl (input_location,
4918 RESULT_DECL, NULL_TREE, integer_type_node);
4919 DECL_ARTIFICIAL (result_decl) = 1;
4920 DECL_IGNORED_P (result_decl) = 1;
4921 DECL_CONTEXT (result_decl) = ftn_main;
4922 DECL_RESULT (ftn_main) = result_decl;
4923
4924 pushdecl (ftn_main);
4925
4926 /* Get the arguments. */
4927
4928 arglist = NULL_TREE;
4929 typelist = TYPE_ARG_TYPES (TREE_TYPE (ftn_main));
4930
4931 tmp = TREE_VALUE (typelist);
4932 argc = build_decl (input_location, PARM_DECL, get_identifier ("argc"), tmp);
4933 DECL_CONTEXT (argc) = ftn_main;
4934 DECL_ARG_TYPE (argc) = TREE_VALUE (typelist);
4935 TREE_READONLY (argc) = 1;
4936 gfc_finish_decl (argc);
4937 arglist = chainon (arglist, argc);
4938
4939 typelist = TREE_CHAIN (typelist);
4940 tmp = TREE_VALUE (typelist);
4941 argv = build_decl (input_location, PARM_DECL, get_identifier ("argv"), tmp);
4942 DECL_CONTEXT (argv) = ftn_main;
4943 DECL_ARG_TYPE (argv) = TREE_VALUE (typelist);
4944 TREE_READONLY (argv) = 1;
4945 DECL_BY_REFERENCE (argv) = 1;
4946 gfc_finish_decl (argv);
4947 arglist = chainon (arglist, argv);
4948
4949 DECL_ARGUMENTS (ftn_main) = arglist;
4950 current_function_decl = ftn_main;
4951 announce_function (ftn_main);
4952
4953 rest_of_decl_compilation (ftn_main, 1, 0);
4954 make_decl_rtl (ftn_main);
4955 init_function_start (ftn_main);
4956 pushlevel (0);
4957
4958 gfc_init_block (&body);
4959
4960 /* Call some libgfortran initialization routines, call then MAIN__(). */
4961
4962 /* Call _gfortran_caf_init (*argc, ***argv, *this_image, *num_images). */
4963 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
4964 {
4965 tree pint_type, pppchar_type;
4966 pint_type = build_pointer_type (integer_type_node);
4967 pppchar_type
4968 = build_pointer_type (build_pointer_type (pchar_type_node));
4969
4970 gfc_init_coarray_decl (true);
4971 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_init, 4,
4972 gfc_build_addr_expr (pint_type, argc),
4973 gfc_build_addr_expr (pppchar_type, argv),
4974 gfc_build_addr_expr (pint_type, gfort_gvar_caf_this_image),
4975 gfc_build_addr_expr (pint_type, gfort_gvar_caf_num_images));
4976 gfc_add_expr_to_block (&body, tmp);
4977 }
4978
4979 /* Call _gfortran_set_args (argc, argv). */
4980 TREE_USED (argc) = 1;
4981 TREE_USED (argv) = 1;
4982 tmp = build_call_expr_loc (input_location,
4983 gfor_fndecl_set_args, 2, argc, argv);
4984 gfc_add_expr_to_block (&body, tmp);
4985
4986 /* Add a call to set_options to set up the runtime library Fortran
4987 language standard parameters. */
4988 {
4989 tree array_type, array, var;
4990 VEC(constructor_elt,gc) *v = NULL;
4991
4992 /* Passing a new option to the library requires four modifications:
4993 + add it to the tree_cons list below
4994 + change the array size in the call to build_array_type
4995 + change the first argument to the library call
4996 gfor_fndecl_set_options
4997 + modify the library (runtime/compile_options.c)! */
4998
4999 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5000 build_int_cst (integer_type_node,
5001 gfc_option.warn_std));
5002 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5003 build_int_cst (integer_type_node,
5004 gfc_option.allow_std));
5005 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5006 build_int_cst (integer_type_node, pedantic));
5007 /* TODO: This is the old -fdump-core option, which is unused but
5008 passed due to ABI compatibility; remove when bumping the
5009 library ABI. */
5010 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5011 build_int_cst (integer_type_node,
5012 0));
5013 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5014 build_int_cst (integer_type_node,
5015 gfc_option.flag_backtrace));
5016 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5017 build_int_cst (integer_type_node,
5018 gfc_option.flag_sign_zero));
5019 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5020 build_int_cst (integer_type_node,
5021 (gfc_option.rtcheck
5022 & GFC_RTCHECK_BOUNDS)));
5023 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5024 build_int_cst (integer_type_node,
5025 gfc_option.flag_range_check));
5026
5027 array_type = build_array_type (integer_type_node,
5028 build_index_type (size_int (7)));
5029 array = build_constructor (array_type, v);
5030 TREE_CONSTANT (array) = 1;
5031 TREE_STATIC (array) = 1;
5032
5033 /* Create a static variable to hold the jump table. */
5034 var = gfc_create_var (array_type, "options");
5035 TREE_CONSTANT (var) = 1;
5036 TREE_STATIC (var) = 1;
5037 TREE_READONLY (var) = 1;
5038 DECL_INITIAL (var) = array;
5039 var = gfc_build_addr_expr (build_pointer_type (integer_type_node), var);
5040
5041 tmp = build_call_expr_loc (input_location,
5042 gfor_fndecl_set_options, 2,
5043 build_int_cst (integer_type_node, 8), var);
5044 gfc_add_expr_to_block (&body, tmp);
5045 }
5046
5047 /* If -ffpe-trap option was provided, add a call to set_fpe so that
5048 the library will raise a FPE when needed. */
5049 if (gfc_option.fpe != 0)
5050 {
5051 tmp = build_call_expr_loc (input_location,
5052 gfor_fndecl_set_fpe, 1,
5053 build_int_cst (integer_type_node,
5054 gfc_option.fpe));
5055 gfc_add_expr_to_block (&body, tmp);
5056 }
5057
5058 /* If this is the main program and an -fconvert option was provided,
5059 add a call to set_convert. */
5060
5061 if (gfc_option.convert != GFC_CONVERT_NATIVE)
5062 {
5063 tmp = build_call_expr_loc (input_location,
5064 gfor_fndecl_set_convert, 1,
5065 build_int_cst (integer_type_node,
5066 gfc_option.convert));
5067 gfc_add_expr_to_block (&body, tmp);
5068 }
5069
5070 /* If this is the main program and an -frecord-marker option was provided,
5071 add a call to set_record_marker. */
5072
5073 if (gfc_option.record_marker != 0)
5074 {
5075 tmp = build_call_expr_loc (input_location,
5076 gfor_fndecl_set_record_marker, 1,
5077 build_int_cst (integer_type_node,
5078 gfc_option.record_marker));
5079 gfc_add_expr_to_block (&body, tmp);
5080 }
5081
5082 if (gfc_option.max_subrecord_length != 0)
5083 {
5084 tmp = build_call_expr_loc (input_location,
5085 gfor_fndecl_set_max_subrecord_length, 1,
5086 build_int_cst (integer_type_node,
5087 gfc_option.max_subrecord_length));
5088 gfc_add_expr_to_block (&body, tmp);
5089 }
5090
5091 /* Call MAIN__(). */
5092 tmp = build_call_expr_loc (input_location,
5093 fndecl, 0);
5094 gfc_add_expr_to_block (&body, tmp);
5095
5096 /* Mark MAIN__ as used. */
5097 TREE_USED (fndecl) = 1;
5098
5099 /* Coarray: Call _gfortran_caf_finalize(void). */
5100 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
5101 {
5102 /* Per F2008, 8.5.1 END of the main program implies a
5103 SYNC MEMORY. */
5104 tmp = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
5105 tmp = build_call_expr_loc (input_location, tmp, 0);
5106 gfc_add_expr_to_block (&body, tmp);
5107
5108 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_finalize, 0);
5109 gfc_add_expr_to_block (&body, tmp);
5110 }
5111
5112 /* "return 0". */
5113 tmp = fold_build2_loc (input_location, MODIFY_EXPR, integer_type_node,
5114 DECL_RESULT (ftn_main),
5115 build_int_cst (integer_type_node, 0));
5116 tmp = build1_v (RETURN_EXPR, tmp);
5117 gfc_add_expr_to_block (&body, tmp);
5118
5119
5120 DECL_SAVED_TREE (ftn_main) = gfc_finish_block (&body);
5121 decl = getdecls ();
5122
5123 /* Finish off this function and send it for code generation. */
5124 poplevel (1, 0, 1);
5125 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main)) = ftn_main;
5126
5127 DECL_SAVED_TREE (ftn_main)
5128 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (ftn_main),
5129 DECL_INITIAL (ftn_main));
5130
5131 /* Output the GENERIC tree. */
5132 dump_function (TDI_original, ftn_main);
5133
5134 cgraph_finalize_function (ftn_main, true);
5135
5136 if (old_context)
5137 {
5138 pop_function_context ();
5139 saved_function_decls = saved_parent_function_decls;
5140 }
5141 current_function_decl = old_context;
5142 }
5143
5144
5145 /* Get the result expression for a procedure. */
5146
5147 static tree
5148 get_proc_result (gfc_symbol* sym)
5149 {
5150 if (sym->attr.subroutine || sym == sym->result)
5151 {
5152 if (current_fake_result_decl != NULL)
5153 return TREE_VALUE (current_fake_result_decl);
5154
5155 return NULL_TREE;
5156 }
5157
5158 return sym->result->backend_decl;
5159 }
5160
5161
5162 /* Generate an appropriate return-statement for a procedure. */
5163
5164 tree
5165 gfc_generate_return (void)
5166 {
5167 gfc_symbol* sym;
5168 tree result;
5169 tree fndecl;
5170
5171 sym = current_procedure_symbol;
5172 fndecl = sym->backend_decl;
5173
5174 if (TREE_TYPE (DECL_RESULT (fndecl)) == void_type_node)
5175 result = NULL_TREE;
5176 else
5177 {
5178 result = get_proc_result (sym);
5179
5180 /* Set the return value to the dummy result variable. The
5181 types may be different for scalar default REAL functions
5182 with -ff2c, therefore we have to convert. */
5183 if (result != NULL_TREE)
5184 {
5185 result = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
5186 result = fold_build2_loc (input_location, MODIFY_EXPR,
5187 TREE_TYPE (result), DECL_RESULT (fndecl),
5188 result);
5189 }
5190 }
5191
5192 return build1_v (RETURN_EXPR, result);
5193 }
5194
5195
5196 /* Generate code for a function. */
5197
5198 void
5199 gfc_generate_function_code (gfc_namespace * ns)
5200 {
5201 tree fndecl;
5202 tree old_context;
5203 tree decl;
5204 tree tmp;
5205 stmtblock_t init, cleanup;
5206 stmtblock_t body;
5207 gfc_wrapped_block try_block;
5208 tree recurcheckvar = NULL_TREE;
5209 gfc_symbol *sym;
5210 gfc_symbol *previous_procedure_symbol;
5211 int rank;
5212 bool is_recursive;
5213
5214 sym = ns->proc_name;
5215 previous_procedure_symbol = current_procedure_symbol;
5216 current_procedure_symbol = sym;
5217
5218 /* Check that the frontend isn't still using this. */
5219 gcc_assert (sym->tlink == NULL);
5220 sym->tlink = sym;
5221
5222 /* Create the declaration for functions with global scope. */
5223 if (!sym->backend_decl)
5224 gfc_create_function_decl (ns, false);
5225
5226 fndecl = sym->backend_decl;
5227 old_context = current_function_decl;
5228
5229 if (old_context)
5230 {
5231 push_function_context ();
5232 saved_parent_function_decls = saved_function_decls;
5233 saved_function_decls = NULL_TREE;
5234 }
5235
5236 trans_function_start (sym);
5237
5238 gfc_init_block (&init);
5239
5240 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
5241 {
5242 /* Copy length backend_decls to all entry point result
5243 symbols. */
5244 gfc_entry_list *el;
5245 tree backend_decl;
5246
5247 gfc_conv_const_charlen (ns->proc_name->ts.u.cl);
5248 backend_decl = ns->proc_name->result->ts.u.cl->backend_decl;
5249 for (el = ns->entries; el; el = el->next)
5250 el->sym->result->ts.u.cl->backend_decl = backend_decl;
5251 }
5252
5253 /* Translate COMMON blocks. */
5254 gfc_trans_common (ns);
5255
5256 /* Null the parent fake result declaration if this namespace is
5257 a module function or an external procedures. */
5258 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
5259 || ns->parent == NULL)
5260 parent_fake_result_decl = NULL_TREE;
5261
5262 gfc_generate_contained_functions (ns);
5263
5264 nonlocal_dummy_decls = NULL;
5265 nonlocal_dummy_decl_pset = NULL;
5266
5267 has_coarray_vars = false;
5268 generate_local_vars (ns);
5269
5270 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
5271 generate_coarray_init (ns);
5272
5273 /* Keep the parent fake result declaration in module functions
5274 or external procedures. */
5275 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
5276 || ns->parent == NULL)
5277 current_fake_result_decl = parent_fake_result_decl;
5278 else
5279 current_fake_result_decl = NULL_TREE;
5280
5281 is_recursive = sym->attr.recursive
5282 || (sym->attr.entry_master
5283 && sym->ns->entries->sym->attr.recursive);
5284 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
5285 && !is_recursive
5286 && !gfc_option.flag_recursive)
5287 {
5288 char * msg;
5289
5290 asprintf (&msg, "Recursive call to nonrecursive procedure '%s'",
5291 sym->name);
5292 recurcheckvar = gfc_create_var (boolean_type_node, "is_recursive");
5293 TREE_STATIC (recurcheckvar) = 1;
5294 DECL_INITIAL (recurcheckvar) = boolean_false_node;
5295 gfc_add_expr_to_block (&init, recurcheckvar);
5296 gfc_trans_runtime_check (true, false, recurcheckvar, &init,
5297 &sym->declared_at, msg);
5298 gfc_add_modify (&init, recurcheckvar, boolean_true_node);
5299 free (msg);
5300 }
5301
5302 /* Now generate the code for the body of this function. */
5303 gfc_init_block (&body);
5304
5305 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
5306 && sym->attr.subroutine)
5307 {
5308 tree alternate_return;
5309 alternate_return = gfc_get_fake_result_decl (sym, 0);
5310 gfc_add_modify (&body, alternate_return, integer_zero_node);
5311 }
5312
5313 if (ns->entries)
5314 {
5315 /* Jump to the correct entry point. */
5316 tmp = gfc_trans_entry_master_switch (ns->entries);
5317 gfc_add_expr_to_block (&body, tmp);
5318 }
5319
5320 /* If bounds-checking is enabled, generate code to check passed in actual
5321 arguments against the expected dummy argument attributes (e.g. string
5322 lengths). */
5323 if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !sym->attr.is_bind_c)
5324 add_argument_checking (&body, sym);
5325
5326 tmp = gfc_trans_code (ns->code);
5327 gfc_add_expr_to_block (&body, tmp);
5328
5329 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
5330 {
5331 tree result = get_proc_result (sym);
5332
5333 if (result != NULL_TREE && sym->attr.function && !sym->attr.pointer)
5334 {
5335 if (sym->attr.allocatable && sym->attr.dimension == 0
5336 && sym->result == sym)
5337 gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
5338 null_pointer_node));
5339 else if (sym->ts.type == BT_CLASS
5340 && CLASS_DATA (sym)->attr.allocatable
5341 && sym->attr.dimension == 0 && sym->result == sym)
5342 {
5343 tmp = CLASS_DATA (sym)->backend_decl;
5344 tmp = fold_build3_loc (input_location, COMPONENT_REF,
5345 TREE_TYPE (tmp), result, tmp, NULL_TREE);
5346 gfc_add_modify (&init, tmp, fold_convert (TREE_TYPE (tmp),
5347 null_pointer_node));
5348 }
5349 else if (sym->ts.type == BT_DERIVED
5350 && sym->ts.u.derived->attr.alloc_comp
5351 && !sym->attr.allocatable)
5352 {
5353 rank = sym->as ? sym->as->rank : 0;
5354 tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, result, rank);
5355 gfc_add_expr_to_block (&init, tmp);
5356 }
5357 }
5358
5359 if (result == NULL_TREE)
5360 {
5361 /* TODO: move to the appropriate place in resolve.c. */
5362 if (warn_return_type && sym == sym->result)
5363 gfc_warning ("Return value of function '%s' at %L not set",
5364 sym->name, &sym->declared_at);
5365 if (warn_return_type)
5366 TREE_NO_WARNING(sym->backend_decl) = 1;
5367 }
5368 else
5369 gfc_add_expr_to_block (&body, gfc_generate_return ());
5370 }
5371
5372 gfc_init_block (&cleanup);
5373
5374 /* Reset recursion-check variable. */
5375 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
5376 && !is_recursive
5377 && !gfc_option.gfc_flag_openmp
5378 && recurcheckvar != NULL_TREE)
5379 {
5380 gfc_add_modify (&cleanup, recurcheckvar, boolean_false_node);
5381 recurcheckvar = NULL;
5382 }
5383
5384 /* Finish the function body and add init and cleanup code. */
5385 tmp = gfc_finish_block (&body);
5386 gfc_start_wrapped_block (&try_block, tmp);
5387 /* Add code to create and cleanup arrays. */
5388 gfc_trans_deferred_vars (sym, &try_block);
5389 gfc_add_init_cleanup (&try_block, gfc_finish_block (&init),
5390 gfc_finish_block (&cleanup));
5391
5392 /* Add all the decls we created during processing. */
5393 decl = saved_function_decls;
5394 while (decl)
5395 {
5396 tree next;
5397
5398 next = DECL_CHAIN (decl);
5399 DECL_CHAIN (decl) = NULL_TREE;
5400 if (GFC_DECL_PUSH_TOPLEVEL (decl))
5401 pushdecl_top_level (decl);
5402 else
5403 pushdecl (decl);
5404 decl = next;
5405 }
5406 saved_function_decls = NULL_TREE;
5407
5408 DECL_SAVED_TREE (fndecl) = gfc_finish_wrapped_block (&try_block);
5409 decl = getdecls ();
5410
5411 /* Finish off this function and send it for code generation. */
5412 poplevel (1, 0, 1);
5413 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5414
5415 DECL_SAVED_TREE (fndecl)
5416 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5417 DECL_INITIAL (fndecl));
5418
5419 if (nonlocal_dummy_decls)
5420 {
5421 BLOCK_VARS (DECL_INITIAL (fndecl))
5422 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl)), nonlocal_dummy_decls);
5423 pointer_set_destroy (nonlocal_dummy_decl_pset);
5424 nonlocal_dummy_decls = NULL;
5425 nonlocal_dummy_decl_pset = NULL;
5426 }
5427
5428 /* Output the GENERIC tree. */
5429 dump_function (TDI_original, fndecl);
5430
5431 /* Store the end of the function, so that we get good line number
5432 info for the epilogue. */
5433 cfun->function_end_locus = input_location;
5434
5435 /* We're leaving the context of this function, so zap cfun.
5436 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5437 tree_rest_of_compilation. */
5438 set_cfun (NULL);
5439
5440 if (old_context)
5441 {
5442 pop_function_context ();
5443 saved_function_decls = saved_parent_function_decls;
5444 }
5445 current_function_decl = old_context;
5446
5447 if (decl_function_context (fndecl) && !gfc_option.coarray == GFC_FCOARRAY_LIB
5448 && has_coarray_vars)
5449 /* Register this function with cgraph just far enough to get it
5450 added to our parent's nested function list.
5451 If there are static coarrays in this function, the nested _caf_init
5452 function has already called cgraph_create_node, which also created
5453 the cgraph node for this function. */
5454 (void) cgraph_create_node (fndecl);
5455 else
5456 cgraph_finalize_function (fndecl, true);
5457
5458 gfc_trans_use_stmts (ns);
5459 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
5460
5461 if (sym->attr.is_main_program)
5462 create_main_function (fndecl);
5463
5464 current_procedure_symbol = previous_procedure_symbol;
5465 }
5466
5467
5468 void
5469 gfc_generate_constructors (void)
5470 {
5471 gcc_assert (gfc_static_ctors == NULL_TREE);
5472 #if 0
5473 tree fnname;
5474 tree type;
5475 tree fndecl;
5476 tree decl;
5477 tree tmp;
5478
5479 if (gfc_static_ctors == NULL_TREE)
5480 return;
5481
5482 fnname = get_file_function_name ("I");
5483 type = build_function_type_list (void_type_node, NULL_TREE);
5484
5485 fndecl = build_decl (input_location,
5486 FUNCTION_DECL, fnname, type);
5487 TREE_PUBLIC (fndecl) = 1;
5488
5489 decl = build_decl (input_location,
5490 RESULT_DECL, NULL_TREE, void_type_node);
5491 DECL_ARTIFICIAL (decl) = 1;
5492 DECL_IGNORED_P (decl) = 1;
5493 DECL_CONTEXT (decl) = fndecl;
5494 DECL_RESULT (fndecl) = decl;
5495
5496 pushdecl (fndecl);
5497
5498 current_function_decl = fndecl;
5499
5500 rest_of_decl_compilation (fndecl, 1, 0);
5501
5502 make_decl_rtl (fndecl);
5503
5504 init_function_start (fndecl);
5505
5506 pushlevel (0);
5507
5508 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
5509 {
5510 tmp = build_call_expr_loc (input_location,
5511 TREE_VALUE (gfc_static_ctors), 0);
5512 DECL_SAVED_TREE (fndecl) = build_stmt (input_location, EXPR_STMT, tmp);
5513 }
5514
5515 decl = getdecls ();
5516 poplevel (1, 0, 1);
5517
5518 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5519 DECL_SAVED_TREE (fndecl)
5520 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5521 DECL_INITIAL (fndecl));
5522
5523 free_after_parsing (cfun);
5524 free_after_compilation (cfun);
5525
5526 tree_rest_of_compilation (fndecl);
5527
5528 current_function_decl = NULL_TREE;
5529 #endif
5530 }
5531
5532 /* Translates a BLOCK DATA program unit. This means emitting the
5533 commons contained therein plus their initializations. We also emit
5534 a globally visible symbol to make sure that each BLOCK DATA program
5535 unit remains unique. */
5536
5537 void
5538 gfc_generate_block_data (gfc_namespace * ns)
5539 {
5540 tree decl;
5541 tree id;
5542
5543 /* Tell the backend the source location of the block data. */
5544 if (ns->proc_name)
5545 gfc_set_backend_locus (&ns->proc_name->declared_at);
5546 else
5547 gfc_set_backend_locus (&gfc_current_locus);
5548
5549 /* Process the DATA statements. */
5550 gfc_trans_common (ns);
5551
5552 /* Create a global symbol with the mane of the block data. This is to
5553 generate linker errors if the same name is used twice. It is never
5554 really used. */
5555 if (ns->proc_name)
5556 id = gfc_sym_mangled_function_id (ns->proc_name);
5557 else
5558 id = get_identifier ("__BLOCK_DATA__");
5559
5560 decl = build_decl (input_location,
5561 VAR_DECL, id, gfc_array_index_type);
5562 TREE_PUBLIC (decl) = 1;
5563 TREE_STATIC (decl) = 1;
5564 DECL_IGNORED_P (decl) = 1;
5565
5566 pushdecl (decl);
5567 rest_of_decl_compilation (decl, 1, 0);
5568 }
5569
5570
5571 /* Process the local variables of a BLOCK construct. */
5572
5573 void
5574 gfc_process_block_locals (gfc_namespace* ns)
5575 {
5576 tree decl;
5577
5578 gcc_assert (saved_local_decls == NULL_TREE);
5579 has_coarray_vars = false;
5580
5581 generate_local_vars (ns);
5582
5583 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
5584 generate_coarray_init (ns);
5585
5586 decl = saved_local_decls;
5587 while (decl)
5588 {
5589 tree next;
5590
5591 next = DECL_CHAIN (decl);
5592 DECL_CHAIN (decl) = NULL_TREE;
5593 pushdecl (decl);
5594 decl = next;
5595 }
5596 saved_local_decls = NULL_TREE;
5597 }
5598
5599
5600 #include "gt-fortran-trans-decl.h"