PR c/60226
[official-gcc.git] / gcc / fortran / trans-decl.c
blob93c59b11b669f900efa8a52f92a3baf2899187a0
1 /* Backend function setup
2 Copyright (C) 2002-2014 Free Software Foundation, Inc.
3 Contributed by Paul Brook
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* trans-decl.c -- Handling of backend function and variable decls, etc */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "stringpool.h"
29 #include "stor-layout.h"
30 #include "varasm.h"
31 #include "attribs.h"
32 #include "tree-dump.h"
33 #include "gimple-expr.h" /* For create_tmp_var_raw. */
34 #include "ggc.h"
35 #include "diagnostic-core.h" /* For internal_error. */
36 #include "toplev.h" /* For announce_function. */
37 #include "target.h"
38 #include "function.h"
39 #include "flags.h"
40 #include "cgraph.h"
41 #include "debug.h"
42 #include "gfortran.h"
43 #include "pointer-set.h"
44 #include "constructor.h"
45 #include "trans.h"
46 #include "trans-types.h"
47 #include "trans-array.h"
48 #include "trans-const.h"
49 /* Only for gfc_trans_code. Shouldn't need to include this. */
50 #include "trans-stmt.h"
52 #define MAX_LABEL_VALUE 99999
55 /* Holds the result of the function if no result variable specified. */
57 static GTY(()) tree current_fake_result_decl;
58 static GTY(()) tree parent_fake_result_decl;
61 /* Holds the variable DECLs for the current function. */
63 static GTY(()) tree saved_function_decls;
64 static GTY(()) tree saved_parent_function_decls;
66 static struct pointer_set_t *nonlocal_dummy_decl_pset;
67 static GTY(()) tree nonlocal_dummy_decls;
69 /* Holds the variable DECLs that are locals. */
71 static GTY(()) tree saved_local_decls;
73 /* The namespace of the module we're currently generating. Only used while
74 outputting decls for module variables. Do not rely on this being set. */
76 static gfc_namespace *module_namespace;
78 /* The currently processed procedure symbol. */
79 static gfc_symbol* current_procedure_symbol = NULL;
82 /* With -fcoarray=lib: For generating the registering call
83 of static coarrays. */
84 static bool has_coarray_vars;
85 static stmtblock_t caf_init_block;
88 /* List of static constructor functions. */
90 tree gfc_static_ctors;
93 /* Whether we've seen a symbol from an IEEE module in the namespace. */
94 static int seen_ieee_symbol;
96 /* Function declarations for builtin library functions. */
98 tree gfor_fndecl_pause_numeric;
99 tree gfor_fndecl_pause_string;
100 tree gfor_fndecl_stop_numeric;
101 tree gfor_fndecl_stop_numeric_f08;
102 tree gfor_fndecl_stop_string;
103 tree gfor_fndecl_error_stop_numeric;
104 tree gfor_fndecl_error_stop_string;
105 tree gfor_fndecl_runtime_error;
106 tree gfor_fndecl_runtime_error_at;
107 tree gfor_fndecl_runtime_warning_at;
108 tree gfor_fndecl_os_error;
109 tree gfor_fndecl_generate_error;
110 tree gfor_fndecl_set_args;
111 tree gfor_fndecl_set_fpe;
112 tree gfor_fndecl_set_options;
113 tree gfor_fndecl_set_convert;
114 tree gfor_fndecl_set_record_marker;
115 tree gfor_fndecl_set_max_subrecord_length;
116 tree gfor_fndecl_ctime;
117 tree gfor_fndecl_fdate;
118 tree gfor_fndecl_ttynam;
119 tree gfor_fndecl_in_pack;
120 tree gfor_fndecl_in_unpack;
121 tree gfor_fndecl_associated;
122 tree gfor_fndecl_system_clock4;
123 tree gfor_fndecl_system_clock8;
124 tree gfor_fndecl_ieee_procedure_entry;
125 tree gfor_fndecl_ieee_procedure_exit;
128 /* Coarray run-time library function decls. */
129 tree gfor_fndecl_caf_init;
130 tree gfor_fndecl_caf_finalize;
131 tree gfor_fndecl_caf_this_image;
132 tree gfor_fndecl_caf_num_images;
133 tree gfor_fndecl_caf_register;
134 tree gfor_fndecl_caf_deregister;
135 tree gfor_fndecl_caf_get;
136 tree gfor_fndecl_caf_send;
137 tree gfor_fndecl_caf_sendget;
138 tree gfor_fndecl_caf_critical;
139 tree gfor_fndecl_caf_end_critical;
140 tree gfor_fndecl_caf_sync_all;
141 tree gfor_fndecl_caf_sync_images;
142 tree gfor_fndecl_caf_error_stop;
143 tree gfor_fndecl_caf_error_stop_str;
144 tree gfor_fndecl_co_max;
145 tree gfor_fndecl_co_min;
146 tree gfor_fndecl_co_sum;
149 /* Math functions. Many other math functions are handled in
150 trans-intrinsic.c. */
152 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
153 tree gfor_fndecl_math_ishftc4;
154 tree gfor_fndecl_math_ishftc8;
155 tree gfor_fndecl_math_ishftc16;
158 /* String functions. */
160 tree gfor_fndecl_compare_string;
161 tree gfor_fndecl_concat_string;
162 tree gfor_fndecl_string_len_trim;
163 tree gfor_fndecl_string_index;
164 tree gfor_fndecl_string_scan;
165 tree gfor_fndecl_string_verify;
166 tree gfor_fndecl_string_trim;
167 tree gfor_fndecl_string_minmax;
168 tree gfor_fndecl_adjustl;
169 tree gfor_fndecl_adjustr;
170 tree gfor_fndecl_select_string;
171 tree gfor_fndecl_compare_string_char4;
172 tree gfor_fndecl_concat_string_char4;
173 tree gfor_fndecl_string_len_trim_char4;
174 tree gfor_fndecl_string_index_char4;
175 tree gfor_fndecl_string_scan_char4;
176 tree gfor_fndecl_string_verify_char4;
177 tree gfor_fndecl_string_trim_char4;
178 tree gfor_fndecl_string_minmax_char4;
179 tree gfor_fndecl_adjustl_char4;
180 tree gfor_fndecl_adjustr_char4;
181 tree gfor_fndecl_select_string_char4;
184 /* Conversion between character kinds. */
185 tree gfor_fndecl_convert_char1_to_char4;
186 tree gfor_fndecl_convert_char4_to_char1;
189 /* Other misc. runtime library functions. */
190 tree gfor_fndecl_size0;
191 tree gfor_fndecl_size1;
192 tree gfor_fndecl_iargc;
194 /* Intrinsic functions implemented in Fortran. */
195 tree gfor_fndecl_sc_kind;
196 tree gfor_fndecl_si_kind;
197 tree gfor_fndecl_sr_kind;
199 /* BLAS gemm functions. */
200 tree gfor_fndecl_sgemm;
201 tree gfor_fndecl_dgemm;
202 tree gfor_fndecl_cgemm;
203 tree gfor_fndecl_zgemm;
206 static void
207 gfc_add_decl_to_parent_function (tree decl)
209 gcc_assert (decl);
210 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
211 DECL_NONLOCAL (decl) = 1;
212 DECL_CHAIN (decl) = saved_parent_function_decls;
213 saved_parent_function_decls = decl;
216 void
217 gfc_add_decl_to_function (tree decl)
219 gcc_assert (decl);
220 TREE_USED (decl) = 1;
221 DECL_CONTEXT (decl) = current_function_decl;
222 DECL_CHAIN (decl) = saved_function_decls;
223 saved_function_decls = decl;
226 static void
227 add_decl_as_local (tree decl)
229 gcc_assert (decl);
230 TREE_USED (decl) = 1;
231 DECL_CONTEXT (decl) = current_function_decl;
232 DECL_CHAIN (decl) = saved_local_decls;
233 saved_local_decls = decl;
237 /* Build a backend label declaration. Set TREE_USED for named labels.
238 The context of the label is always the current_function_decl. All
239 labels are marked artificial. */
241 tree
242 gfc_build_label_decl (tree label_id)
244 /* 2^32 temporaries should be enough. */
245 static unsigned int tmp_num = 1;
246 tree label_decl;
247 char *label_name;
249 if (label_id == NULL_TREE)
251 /* Build an internal label name. */
252 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
253 label_id = get_identifier (label_name);
255 else
256 label_name = NULL;
258 /* Build the LABEL_DECL node. Labels have no type. */
259 label_decl = build_decl (input_location,
260 LABEL_DECL, label_id, void_type_node);
261 DECL_CONTEXT (label_decl) = current_function_decl;
262 DECL_MODE (label_decl) = VOIDmode;
264 /* We always define the label as used, even if the original source
265 file never references the label. We don't want all kinds of
266 spurious warnings for old-style Fortran code with too many
267 labels. */
268 TREE_USED (label_decl) = 1;
270 DECL_ARTIFICIAL (label_decl) = 1;
271 return label_decl;
275 /* Set the backend source location of a decl. */
277 void
278 gfc_set_decl_location (tree decl, locus * loc)
280 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
284 /* Return the backend label declaration for a given label structure,
285 or create it if it doesn't exist yet. */
287 tree
288 gfc_get_label_decl (gfc_st_label * lp)
290 if (lp->backend_decl)
291 return lp->backend_decl;
292 else
294 char label_name[GFC_MAX_SYMBOL_LEN + 1];
295 tree label_decl;
297 /* Validate the label declaration from the front end. */
298 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
300 /* Build a mangled name for the label. */
301 sprintf (label_name, "__label_%.6d", lp->value);
303 /* Build the LABEL_DECL node. */
304 label_decl = gfc_build_label_decl (get_identifier (label_name));
306 /* Tell the debugger where the label came from. */
307 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
308 gfc_set_decl_location (label_decl, &lp->where);
309 else
310 DECL_ARTIFICIAL (label_decl) = 1;
312 /* Store the label in the label list and return the LABEL_DECL. */
313 lp->backend_decl = label_decl;
314 return label_decl;
319 /* Convert a gfc_symbol to an identifier of the same name. */
321 static tree
322 gfc_sym_identifier (gfc_symbol * sym)
324 if (sym->attr.is_main_program && strcmp (sym->name, "main") == 0)
325 return (get_identifier ("MAIN__"));
326 else
327 return (get_identifier (sym->name));
331 /* Construct mangled name from symbol name. */
333 static tree
334 gfc_sym_mangled_identifier (gfc_symbol * sym)
336 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
338 /* Prevent the mangling of identifiers that have an assigned
339 binding label (mainly those that are bind(c)). */
340 if (sym->attr.is_bind_c == 1 && sym->binding_label)
341 return get_identifier (sym->binding_label);
343 if (sym->module == NULL)
344 return gfc_sym_identifier (sym);
345 else
347 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
348 return get_identifier (name);
353 /* Construct mangled function name from symbol name. */
355 static tree
356 gfc_sym_mangled_function_id (gfc_symbol * sym)
358 int has_underscore;
359 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
361 /* It may be possible to simply use the binding label if it's
362 provided, and remove the other checks. Then we could use it
363 for other things if we wished. */
364 if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
365 sym->binding_label)
366 /* use the binding label rather than the mangled name */
367 return get_identifier (sym->binding_label);
369 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
370 || (sym->module != NULL && (sym->attr.external
371 || sym->attr.if_source == IFSRC_IFBODY)))
373 /* Main program is mangled into MAIN__. */
374 if (sym->attr.is_main_program)
375 return get_identifier ("MAIN__");
377 /* Intrinsic procedures are never mangled. */
378 if (sym->attr.proc == PROC_INTRINSIC)
379 return get_identifier (sym->name);
381 if (gfc_option.flag_underscoring)
383 has_underscore = strchr (sym->name, '_') != 0;
384 if (gfc_option.flag_second_underscore && has_underscore)
385 snprintf (name, sizeof name, "%s__", sym->name);
386 else
387 snprintf (name, sizeof name, "%s_", sym->name);
388 return get_identifier (name);
390 else
391 return get_identifier (sym->name);
393 else
395 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
396 return get_identifier (name);
401 void
402 gfc_set_decl_assembler_name (tree decl, tree name)
404 tree target_mangled = targetm.mangle_decl_assembler_name (decl, name);
405 SET_DECL_ASSEMBLER_NAME (decl, target_mangled);
409 /* Returns true if a variable of specified size should go on the stack. */
412 gfc_can_put_var_on_stack (tree size)
414 unsigned HOST_WIDE_INT low;
416 if (!INTEGER_CST_P (size))
417 return 0;
419 if (gfc_option.flag_max_stack_var_size < 0)
420 return 1;
422 if (!tree_fits_uhwi_p (size))
423 return 0;
425 low = TREE_INT_CST_LOW (size);
426 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
427 return 0;
429 /* TODO: Set a per-function stack size limit. */
431 return 1;
435 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
436 an expression involving its corresponding pointer. There are
437 2 cases; one for variable size arrays, and one for everything else,
438 because variable-sized arrays require one fewer level of
439 indirection. */
441 static void
442 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
444 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
445 tree value;
447 /* Parameters need to be dereferenced. */
448 if (sym->cp_pointer->attr.dummy)
449 ptr_decl = build_fold_indirect_ref_loc (input_location,
450 ptr_decl);
452 /* Check to see if we're dealing with a variable-sized array. */
453 if (sym->attr.dimension
454 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
456 /* These decls will be dereferenced later, so we don't dereference
457 them here. */
458 value = convert (TREE_TYPE (decl), ptr_decl);
460 else
462 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
463 ptr_decl);
464 value = build_fold_indirect_ref_loc (input_location,
465 ptr_decl);
468 SET_DECL_VALUE_EXPR (decl, value);
469 DECL_HAS_VALUE_EXPR_P (decl) = 1;
470 GFC_DECL_CRAY_POINTEE (decl) = 1;
474 /* Finish processing of a declaration without an initial value. */
476 static void
477 gfc_finish_decl (tree decl)
479 gcc_assert (TREE_CODE (decl) == PARM_DECL
480 || DECL_INITIAL (decl) == NULL_TREE);
482 if (TREE_CODE (decl) != VAR_DECL)
483 return;
485 if (DECL_SIZE (decl) == NULL_TREE
486 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
487 layout_decl (decl, 0);
489 /* A few consistency checks. */
490 /* A static variable with an incomplete type is an error if it is
491 initialized. Also if it is not file scope. Otherwise, let it
492 through, but if it is not `extern' then it may cause an error
493 message later. */
494 /* An automatic variable with an incomplete type is an error. */
496 /* We should know the storage size. */
497 gcc_assert (DECL_SIZE (decl) != NULL_TREE
498 || (TREE_STATIC (decl)
499 ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
500 : DECL_EXTERNAL (decl)));
502 /* The storage size should be constant. */
503 gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
504 || !DECL_SIZE (decl)
505 || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
509 /* Handle setting of GFC_DECL_SCALAR* on DECL. */
511 void
512 gfc_finish_decl_attrs (tree decl, symbol_attribute *attr)
514 if (!attr->dimension && !attr->codimension)
516 /* Handle scalar allocatable variables. */
517 if (attr->allocatable)
519 gfc_allocate_lang_decl (decl);
520 GFC_DECL_SCALAR_ALLOCATABLE (decl) = 1;
522 /* Handle scalar pointer variables. */
523 if (attr->pointer)
525 gfc_allocate_lang_decl (decl);
526 GFC_DECL_SCALAR_POINTER (decl) = 1;
532 /* Apply symbol attributes to a variable, and add it to the function scope. */
534 static void
535 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
537 tree new_type;
538 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
539 This is the equivalent of the TARGET variables.
540 We also need to set this if the variable is passed by reference in a
541 CALL statement. */
543 /* Set DECL_VALUE_EXPR for Cray Pointees. */
544 if (sym->attr.cray_pointee)
545 gfc_finish_cray_pointee (decl, sym);
547 if (sym->attr.target)
548 TREE_ADDRESSABLE (decl) = 1;
549 /* If it wasn't used we wouldn't be getting it. */
550 TREE_USED (decl) = 1;
552 if (sym->attr.flavor == FL_PARAMETER
553 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
554 TREE_READONLY (decl) = 1;
556 /* Chain this decl to the pending declarations. Don't do pushdecl()
557 because this would add them to the current scope rather than the
558 function scope. */
559 if (current_function_decl != NULL_TREE)
561 if (sym->ns->proc_name->backend_decl == current_function_decl
562 || sym->result == sym)
563 gfc_add_decl_to_function (decl);
564 else if (sym->ns->proc_name->attr.flavor == FL_LABEL)
565 /* This is a BLOCK construct. */
566 add_decl_as_local (decl);
567 else
568 gfc_add_decl_to_parent_function (decl);
571 if (sym->attr.cray_pointee)
572 return;
574 if(sym->attr.is_bind_c == 1 && sym->binding_label)
576 /* We need to put variables that are bind(c) into the common
577 segment of the object file, because this is what C would do.
578 gfortran would typically put them in either the BSS or
579 initialized data segments, and only mark them as common if
580 they were part of common blocks. However, if they are not put
581 into common space, then C cannot initialize global Fortran
582 variables that it interoperates with and the draft says that
583 either Fortran or C should be able to initialize it (but not
584 both, of course.) (J3/04-007, section 15.3). */
585 TREE_PUBLIC(decl) = 1;
586 DECL_COMMON(decl) = 1;
589 /* If a variable is USE associated, it's always external. */
590 if (sym->attr.use_assoc)
592 DECL_EXTERNAL (decl) = 1;
593 TREE_PUBLIC (decl) = 1;
595 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
597 /* TODO: Don't set sym->module for result or dummy variables. */
598 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
600 if (sym->attr.access != ACCESS_PRIVATE || sym->attr.public_used)
601 TREE_PUBLIC (decl) = 1;
602 TREE_STATIC (decl) = 1;
605 /* Derived types are a bit peculiar because of the possibility of
606 a default initializer; this must be applied each time the variable
607 comes into scope it therefore need not be static. These variables
608 are SAVE_NONE but have an initializer. Otherwise explicitly
609 initialized variables are SAVE_IMPLICIT and explicitly saved are
610 SAVE_EXPLICIT. */
611 if (!sym->attr.use_assoc
612 && (sym->attr.save != SAVE_NONE || sym->attr.data
613 || (sym->value && sym->ns->proc_name->attr.is_main_program)
614 || (gfc_option.coarray == GFC_FCOARRAY_LIB
615 && sym->attr.codimension && !sym->attr.allocatable)))
616 TREE_STATIC (decl) = 1;
618 if (sym->attr.volatile_)
620 TREE_THIS_VOLATILE (decl) = 1;
621 TREE_SIDE_EFFECTS (decl) = 1;
622 new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
623 TREE_TYPE (decl) = new_type;
626 /* Keep variables larger than max-stack-var-size off stack. */
627 if (!sym->ns->proc_name->attr.recursive
628 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
629 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
630 /* Put variable length auto array pointers always into stack. */
631 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
632 || sym->attr.dimension == 0
633 || sym->as->type != AS_EXPLICIT
634 || sym->attr.pointer
635 || sym->attr.allocatable)
636 && !DECL_ARTIFICIAL (decl))
637 TREE_STATIC (decl) = 1;
639 /* Handle threadprivate variables. */
640 if (sym->attr.threadprivate
641 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
642 set_decl_tls_model (decl, decl_default_tls_model (decl));
644 gfc_finish_decl_attrs (decl, &sym->attr);
648 /* Allocate the lang-specific part of a decl. */
650 void
651 gfc_allocate_lang_decl (tree decl)
653 if (DECL_LANG_SPECIFIC (decl) == NULL)
654 DECL_LANG_SPECIFIC (decl) = ggc_cleared_alloc<struct lang_decl> ();
657 /* Remember a symbol to generate initialization/cleanup code at function
658 entry/exit. */
660 static void
661 gfc_defer_symbol_init (gfc_symbol * sym)
663 gfc_symbol *p;
664 gfc_symbol *last;
665 gfc_symbol *head;
667 /* Don't add a symbol twice. */
668 if (sym->tlink)
669 return;
671 last = head = sym->ns->proc_name;
672 p = last->tlink;
674 /* Make sure that setup code for dummy variables which are used in the
675 setup of other variables is generated first. */
676 if (sym->attr.dummy)
678 /* Find the first dummy arg seen after us, or the first non-dummy arg.
679 This is a circular list, so don't go past the head. */
680 while (p != head
681 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
683 last = p;
684 p = p->tlink;
687 /* Insert in between last and p. */
688 last->tlink = sym;
689 sym->tlink = p;
693 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
694 backend_decl for a module symbol, if it all ready exists. If the
695 module gsymbol does not exist, it is created. If the symbol does
696 not exist, it is added to the gsymbol namespace. Returns true if
697 an existing backend_decl is found. */
699 bool
700 gfc_get_module_backend_decl (gfc_symbol *sym)
702 gfc_gsymbol *gsym;
703 gfc_symbol *s;
704 gfc_symtree *st;
706 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
708 if (!gsym || (gsym->ns && gsym->type == GSYM_MODULE))
710 st = NULL;
711 s = NULL;
713 if (gsym)
714 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
716 if (!s)
718 if (!gsym)
720 gsym = gfc_get_gsymbol (sym->module);
721 gsym->type = GSYM_MODULE;
722 gsym->ns = gfc_get_namespace (NULL, 0);
725 st = gfc_new_symtree (&gsym->ns->sym_root, sym->name);
726 st->n.sym = sym;
727 sym->refs++;
729 else if (sym->attr.flavor == FL_DERIVED)
731 if (s && s->attr.flavor == FL_PROCEDURE)
733 gfc_interface *intr;
734 gcc_assert (s->attr.generic);
735 for (intr = s->generic; intr; intr = intr->next)
736 if (intr->sym->attr.flavor == FL_DERIVED)
738 s = intr->sym;
739 break;
743 if (!s->backend_decl)
744 s->backend_decl = gfc_get_derived_type (s);
745 gfc_copy_dt_decls_ifequal (s, sym, true);
746 return true;
748 else if (s->backend_decl)
750 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
751 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
752 true);
753 else if (sym->ts.type == BT_CHARACTER)
754 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
755 sym->backend_decl = s->backend_decl;
756 return true;
759 return false;
763 /* Create an array index type variable with function scope. */
765 static tree
766 create_index_var (const char * pfx, int nest)
768 tree decl;
770 decl = gfc_create_var_np (gfc_array_index_type, pfx);
771 if (nest)
772 gfc_add_decl_to_parent_function (decl);
773 else
774 gfc_add_decl_to_function (decl);
775 return decl;
779 /* Create variables to hold all the non-constant bits of info for a
780 descriptorless array. Remember these in the lang-specific part of the
781 type. */
783 static void
784 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
786 tree type;
787 int dim;
788 int nest;
789 gfc_namespace* procns;
791 type = TREE_TYPE (decl);
793 /* We just use the descriptor, if there is one. */
794 if (GFC_DESCRIPTOR_TYPE_P (type))
795 return;
797 gcc_assert (GFC_ARRAY_TYPE_P (type));
798 procns = gfc_find_proc_namespace (sym->ns);
799 nest = (procns->proc_name->backend_decl != current_function_decl)
800 && !sym->attr.contained;
802 if (sym->attr.codimension && gfc_option.coarray == GFC_FCOARRAY_LIB
803 && sym->as->type != AS_ASSUMED_SHAPE
804 && GFC_TYPE_ARRAY_CAF_TOKEN (type) == NULL_TREE)
806 tree token;
808 token = gfc_create_var_np (build_qualified_type (pvoid_type_node,
809 TYPE_QUAL_RESTRICT),
810 "caf_token");
811 GFC_TYPE_ARRAY_CAF_TOKEN (type) = token;
812 DECL_ARTIFICIAL (token) = 1;
813 TREE_STATIC (token) = 1;
814 gfc_add_decl_to_function (token);
817 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
819 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
821 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
822 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
824 /* Don't try to use the unknown bound for assumed shape arrays. */
825 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
826 && (sym->as->type != AS_ASSUMED_SIZE
827 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
829 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
830 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
833 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
835 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
836 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
839 for (dim = GFC_TYPE_ARRAY_RANK (type);
840 dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type); dim++)
842 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
844 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
845 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
847 /* Don't try to use the unknown ubound for the last coarray dimension. */
848 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
849 && dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type) - 1)
851 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
852 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
855 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
857 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
858 "offset");
859 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
861 if (nest)
862 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
863 else
864 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
867 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
868 && sym->as->type != AS_ASSUMED_SIZE)
870 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
871 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
874 if (POINTER_TYPE_P (type))
876 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
877 gcc_assert (TYPE_LANG_SPECIFIC (type)
878 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
879 type = TREE_TYPE (type);
882 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
884 tree size, range;
886 size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
887 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
888 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
889 size);
890 TYPE_DOMAIN (type) = range;
891 layout_type (type);
894 if (TYPE_NAME (type) != NULL_TREE
895 && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE
896 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL)
898 tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
900 for (dim = 0; dim < sym->as->rank - 1; dim++)
902 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
903 gtype = TREE_TYPE (gtype);
905 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
906 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL)
907 TYPE_NAME (type) = NULL_TREE;
910 if (TYPE_NAME (type) == NULL_TREE)
912 tree gtype = TREE_TYPE (type), rtype, type_decl;
914 for (dim = sym->as->rank - 1; dim >= 0; dim--)
916 tree lbound, ubound;
917 lbound = GFC_TYPE_ARRAY_LBOUND (type, dim);
918 ubound = GFC_TYPE_ARRAY_UBOUND (type, dim);
919 rtype = build_range_type (gfc_array_index_type, lbound, ubound);
920 gtype = build_array_type (gtype, rtype);
921 /* Ensure the bound variables aren't optimized out at -O0.
922 For -O1 and above they often will be optimized out, but
923 can be tracked by VTA. Also set DECL_NAMELESS, so that
924 the artificial lbound.N or ubound.N DECL_NAME doesn't
925 end up in debug info. */
926 if (lbound && TREE_CODE (lbound) == VAR_DECL
927 && DECL_ARTIFICIAL (lbound) && DECL_IGNORED_P (lbound))
929 if (DECL_NAME (lbound)
930 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound)),
931 "lbound") != 0)
932 DECL_NAMELESS (lbound) = 1;
933 DECL_IGNORED_P (lbound) = 0;
935 if (ubound && TREE_CODE (ubound) == VAR_DECL
936 && DECL_ARTIFICIAL (ubound) && DECL_IGNORED_P (ubound))
938 if (DECL_NAME (ubound)
939 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound)),
940 "ubound") != 0)
941 DECL_NAMELESS (ubound) = 1;
942 DECL_IGNORED_P (ubound) = 0;
945 TYPE_NAME (type) = type_decl = build_decl (input_location,
946 TYPE_DECL, NULL, gtype);
947 DECL_ORIGINAL_TYPE (type_decl) = gtype;
952 /* For some dummy arguments we don't use the actual argument directly.
953 Instead we create a local decl and use that. This allows us to perform
954 initialization, and construct full type information. */
956 static tree
957 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
959 tree decl;
960 tree type;
961 gfc_array_spec *as;
962 char *name;
963 gfc_packed packed;
964 int n;
965 bool known_size;
967 if (sym->attr.pointer || sym->attr.allocatable
968 || (sym->as && sym->as->type == AS_ASSUMED_RANK))
969 return dummy;
971 /* Add to list of variables if not a fake result variable. */
972 if (sym->attr.result || sym->attr.dummy)
973 gfc_defer_symbol_init (sym);
975 type = TREE_TYPE (dummy);
976 gcc_assert (TREE_CODE (dummy) == PARM_DECL
977 && POINTER_TYPE_P (type));
979 /* Do we know the element size? */
980 known_size = sym->ts.type != BT_CHARACTER
981 || INTEGER_CST_P (sym->ts.u.cl->backend_decl);
983 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
985 /* For descriptorless arrays with known element size the actual
986 argument is sufficient. */
987 gcc_assert (GFC_ARRAY_TYPE_P (type));
988 gfc_build_qualified_array (dummy, sym);
989 return dummy;
992 type = TREE_TYPE (type);
993 if (GFC_DESCRIPTOR_TYPE_P (type))
995 /* Create a descriptorless array pointer. */
996 as = sym->as;
997 packed = PACKED_NO;
999 /* Even when -frepack-arrays is used, symbols with TARGET attribute
1000 are not repacked. */
1001 if (!gfc_option.flag_repack_arrays || sym->attr.target)
1003 if (as->type == AS_ASSUMED_SIZE)
1004 packed = PACKED_FULL;
1006 else
1008 if (as->type == AS_EXPLICIT)
1010 packed = PACKED_FULL;
1011 for (n = 0; n < as->rank; n++)
1013 if (!(as->upper[n]
1014 && as->lower[n]
1015 && as->upper[n]->expr_type == EXPR_CONSTANT
1016 && as->lower[n]->expr_type == EXPR_CONSTANT))
1018 packed = PACKED_PARTIAL;
1019 break;
1023 else
1024 packed = PACKED_PARTIAL;
1027 type = gfc_typenode_for_spec (&sym->ts);
1028 type = gfc_get_nodesc_array_type (type, sym->as, packed,
1029 !sym->attr.target);
1031 else
1033 /* We now have an expression for the element size, so create a fully
1034 qualified type. Reset sym->backend decl or this will just return the
1035 old type. */
1036 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1037 sym->backend_decl = NULL_TREE;
1038 type = gfc_sym_type (sym);
1039 packed = PACKED_FULL;
1042 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
1043 decl = build_decl (input_location,
1044 VAR_DECL, get_identifier (name), type);
1046 DECL_ARTIFICIAL (decl) = 1;
1047 DECL_NAMELESS (decl) = 1;
1048 TREE_PUBLIC (decl) = 0;
1049 TREE_STATIC (decl) = 0;
1050 DECL_EXTERNAL (decl) = 0;
1052 /* Avoid uninitialized warnings for optional dummy arguments. */
1053 if (sym->attr.optional)
1054 TREE_NO_WARNING (decl) = 1;
1056 /* We should never get deferred shape arrays here. We used to because of
1057 frontend bugs. */
1058 gcc_assert (sym->as->type != AS_DEFERRED);
1060 if (packed == PACKED_PARTIAL)
1061 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
1062 else if (packed == PACKED_FULL)
1063 GFC_DECL_PACKED_ARRAY (decl) = 1;
1065 gfc_build_qualified_array (decl, sym);
1067 if (DECL_LANG_SPECIFIC (dummy))
1068 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
1069 else
1070 gfc_allocate_lang_decl (decl);
1072 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
1074 if (sym->ns->proc_name->backend_decl == current_function_decl
1075 || sym->attr.contained)
1076 gfc_add_decl_to_function (decl);
1077 else
1078 gfc_add_decl_to_parent_function (decl);
1080 return decl;
1083 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
1084 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
1085 pointing to the artificial variable for debug info purposes. */
1087 static void
1088 gfc_nonlocal_dummy_array_decl (gfc_symbol *sym)
1090 tree decl, dummy;
1092 if (! nonlocal_dummy_decl_pset)
1093 nonlocal_dummy_decl_pset = pointer_set_create ();
1095 if (pointer_set_insert (nonlocal_dummy_decl_pset, sym->backend_decl))
1096 return;
1098 dummy = GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl);
1099 decl = build_decl (input_location, VAR_DECL, DECL_NAME (dummy),
1100 TREE_TYPE (sym->backend_decl));
1101 DECL_ARTIFICIAL (decl) = 0;
1102 TREE_USED (decl) = 1;
1103 TREE_PUBLIC (decl) = 0;
1104 TREE_STATIC (decl) = 0;
1105 DECL_EXTERNAL (decl) = 0;
1106 if (DECL_BY_REFERENCE (dummy))
1107 DECL_BY_REFERENCE (decl) = 1;
1108 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (sym->backend_decl);
1109 SET_DECL_VALUE_EXPR (decl, sym->backend_decl);
1110 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1111 DECL_CONTEXT (decl) = DECL_CONTEXT (sym->backend_decl);
1112 DECL_CHAIN (decl) = nonlocal_dummy_decls;
1113 nonlocal_dummy_decls = decl;
1116 /* Return a constant or a variable to use as a string length. Does not
1117 add the decl to the current scope. */
1119 static tree
1120 gfc_create_string_length (gfc_symbol * sym)
1122 gcc_assert (sym->ts.u.cl);
1123 gfc_conv_const_charlen (sym->ts.u.cl);
1125 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1127 tree length;
1128 const char *name;
1130 /* The string length variable shall be in static memory if it is either
1131 explicitly SAVED, a module variable or with -fno-automatic. Only
1132 relevant is "len=:" - otherwise, it is either a constant length or
1133 it is an automatic variable. */
1134 bool static_length = sym->attr.save
1135 || sym->ns->proc_name->attr.flavor == FL_MODULE
1136 || (gfc_option.flag_max_stack_var_size == 0
1137 && sym->ts.deferred && !sym->attr.dummy
1138 && !sym->attr.result && !sym->attr.function);
1140 /* Also prefix the mangled name. We need to call GFC_PREFIX for static
1141 variables as some systems do not support the "." in the assembler name.
1142 For nonstatic variables, the "." does not appear in assembler. */
1143 if (static_length)
1145 if (sym->module)
1146 name = gfc_get_string (GFC_PREFIX ("%s_MOD_%s"), sym->module,
1147 sym->name);
1148 else
1149 name = gfc_get_string (GFC_PREFIX ("%s"), sym->name);
1151 else if (sym->module)
1152 name = gfc_get_string (".__%s_MOD_%s", sym->module, sym->name);
1153 else
1154 name = gfc_get_string (".%s", sym->name);
1156 length = build_decl (input_location,
1157 VAR_DECL, get_identifier (name),
1158 gfc_charlen_type_node);
1159 DECL_ARTIFICIAL (length) = 1;
1160 TREE_USED (length) = 1;
1161 if (sym->ns->proc_name->tlink != NULL)
1162 gfc_defer_symbol_init (sym);
1164 sym->ts.u.cl->backend_decl = length;
1166 if (static_length)
1167 TREE_STATIC (length) = 1;
1169 if (sym->ns->proc_name->attr.flavor == FL_MODULE
1170 && (sym->attr.access != ACCESS_PRIVATE || sym->attr.public_used))
1171 TREE_PUBLIC (length) = 1;
1174 gcc_assert (sym->ts.u.cl->backend_decl != NULL_TREE);
1175 return sym->ts.u.cl->backend_decl;
1178 /* If a variable is assigned a label, we add another two auxiliary
1179 variables. */
1181 static void
1182 gfc_add_assign_aux_vars (gfc_symbol * sym)
1184 tree addr;
1185 tree length;
1186 tree decl;
1188 gcc_assert (sym->backend_decl);
1190 decl = sym->backend_decl;
1191 gfc_allocate_lang_decl (decl);
1192 GFC_DECL_ASSIGN (decl) = 1;
1193 length = build_decl (input_location,
1194 VAR_DECL, create_tmp_var_name (sym->name),
1195 gfc_charlen_type_node);
1196 addr = build_decl (input_location,
1197 VAR_DECL, create_tmp_var_name (sym->name),
1198 pvoid_type_node);
1199 gfc_finish_var_decl (length, sym);
1200 gfc_finish_var_decl (addr, sym);
1201 /* STRING_LENGTH is also used as flag. Less than -1 means that
1202 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1203 target label's address. Otherwise, value is the length of a format string
1204 and ASSIGN_ADDR is its address. */
1205 if (TREE_STATIC (length))
1206 DECL_INITIAL (length) = build_int_cst (gfc_charlen_type_node, -2);
1207 else
1208 gfc_defer_symbol_init (sym);
1210 GFC_DECL_STRING_LEN (decl) = length;
1211 GFC_DECL_ASSIGN_ADDR (decl) = addr;
1215 static tree
1216 add_attributes_to_decl (symbol_attribute sym_attr, tree list)
1218 unsigned id;
1219 tree attr;
1221 for (id = 0; id < EXT_ATTR_NUM; id++)
1222 if (sym_attr.ext_attr & (1 << id))
1224 attr = build_tree_list (
1225 get_identifier (ext_attr_list[id].middle_end_name),
1226 NULL_TREE);
1227 list = chainon (list, attr);
1230 if (sym_attr.omp_declare_target)
1231 list = tree_cons (get_identifier ("omp declare target"),
1232 NULL_TREE, list);
1234 return list;
1238 static void build_function_decl (gfc_symbol * sym, bool global);
1241 /* Return the decl for a gfc_symbol, create it if it doesn't already
1242 exist. */
1244 tree
1245 gfc_get_symbol_decl (gfc_symbol * sym)
1247 tree decl;
1248 tree length = NULL_TREE;
1249 tree attributes;
1250 int byref;
1251 bool intrinsic_array_parameter = false;
1252 bool fun_or_res;
1254 gcc_assert (sym->attr.referenced
1255 || sym->attr.flavor == FL_PROCEDURE
1256 || sym->attr.use_assoc
1257 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY
1258 || (sym->module && sym->attr.if_source != IFSRC_DECL
1259 && sym->backend_decl));
1261 if (sym->ns && sym->ns->proc_name && sym->ns->proc_name->attr.function)
1262 byref = gfc_return_by_reference (sym->ns->proc_name);
1263 else
1264 byref = 0;
1266 /* Make sure that the vtab for the declared type is completed. */
1267 if (sym->ts.type == BT_CLASS)
1269 gfc_component *c = CLASS_DATA (sym);
1270 if (!c->ts.u.derived->backend_decl)
1272 gfc_find_derived_vtab (c->ts.u.derived);
1273 gfc_get_derived_type (sym->ts.u.derived);
1277 /* All deferred character length procedures need to retain the backend
1278 decl, which is a pointer to the character length in the caller's
1279 namespace and to declare a local character length. */
1280 if (!byref && sym->attr.function
1281 && sym->ts.type == BT_CHARACTER
1282 && sym->ts.deferred
1283 && sym->ts.u.cl->passed_length == NULL
1284 && sym->ts.u.cl->backend_decl
1285 && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL)
1287 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1288 sym->ts.u.cl->backend_decl = NULL_TREE;
1289 length = gfc_create_string_length (sym);
1292 fun_or_res = byref && (sym->attr.result
1293 || (sym->attr.function && sym->ts.deferred));
1294 if ((sym->attr.dummy && ! sym->attr.function) || fun_or_res)
1296 /* Return via extra parameter. */
1297 if (sym->attr.result && byref
1298 && !sym->backend_decl)
1300 sym->backend_decl =
1301 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
1302 /* For entry master function skip over the __entry
1303 argument. */
1304 if (sym->ns->proc_name->attr.entry_master)
1305 sym->backend_decl = DECL_CHAIN (sym->backend_decl);
1308 /* Dummy variables should already have been created. */
1309 gcc_assert (sym->backend_decl);
1311 /* Create a character length variable. */
1312 if (sym->ts.type == BT_CHARACTER)
1314 /* For a deferred dummy, make a new string length variable. */
1315 if (sym->ts.deferred
1317 (sym->ts.u.cl->passed_length == sym->ts.u.cl->backend_decl))
1318 sym->ts.u.cl->backend_decl = NULL_TREE;
1320 if (sym->ts.deferred && fun_or_res
1321 && sym->ts.u.cl->passed_length == NULL
1322 && sym->ts.u.cl->backend_decl)
1324 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1325 sym->ts.u.cl->backend_decl = NULL_TREE;
1328 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1329 length = gfc_create_string_length (sym);
1330 else
1331 length = sym->ts.u.cl->backend_decl;
1332 if (TREE_CODE (length) == VAR_DECL
1333 && DECL_FILE_SCOPE_P (length))
1335 /* Add the string length to the same context as the symbol. */
1336 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
1337 gfc_add_decl_to_function (length);
1338 else
1339 gfc_add_decl_to_parent_function (length);
1341 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
1342 DECL_CONTEXT (length));
1344 gfc_defer_symbol_init (sym);
1348 /* Use a copy of the descriptor for dummy arrays. */
1349 if ((sym->attr.dimension || sym->attr.codimension)
1350 && !TREE_USED (sym->backend_decl))
1352 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
1353 /* Prevent the dummy from being detected as unused if it is copied. */
1354 if (sym->backend_decl != NULL && decl != sym->backend_decl)
1355 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1356 sym->backend_decl = decl;
1359 TREE_USED (sym->backend_decl) = 1;
1360 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
1362 gfc_add_assign_aux_vars (sym);
1365 if (sym->attr.dimension
1366 && DECL_LANG_SPECIFIC (sym->backend_decl)
1367 && GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl)
1368 && DECL_CONTEXT (sym->backend_decl) != current_function_decl)
1369 gfc_nonlocal_dummy_array_decl (sym);
1371 if (sym->ts.type == BT_CLASS && sym->backend_decl)
1372 GFC_DECL_CLASS(sym->backend_decl) = 1;
1374 if (sym->ts.type == BT_CLASS && sym->backend_decl)
1375 GFC_DECL_CLASS(sym->backend_decl) = 1;
1376 return sym->backend_decl;
1379 if (sym->backend_decl)
1380 return sym->backend_decl;
1382 /* Special case for array-valued named constants from intrinsic
1383 procedures; those are inlined. */
1384 if (sym->attr.use_assoc && sym->attr.flavor == FL_PARAMETER
1385 && (sym->from_intmod == INTMOD_ISO_FORTRAN_ENV
1386 || sym->from_intmod == INTMOD_ISO_C_BINDING))
1387 intrinsic_array_parameter = true;
1389 /* If use associated compilation, use the module
1390 declaration. */
1391 if ((sym->attr.flavor == FL_VARIABLE
1392 || sym->attr.flavor == FL_PARAMETER)
1393 && sym->attr.use_assoc
1394 && !intrinsic_array_parameter
1395 && sym->module
1396 && gfc_get_module_backend_decl (sym))
1398 if (sym->ts.type == BT_CLASS && sym->backend_decl)
1399 GFC_DECL_CLASS(sym->backend_decl) = 1;
1400 return sym->backend_decl;
1403 if (sym->attr.flavor == FL_PROCEDURE)
1405 /* Catch functions. Only used for actual parameters,
1406 procedure pointers and procptr initialization targets. */
1407 if (sym->attr.use_assoc || sym->attr.intrinsic
1408 || sym->attr.if_source != IFSRC_DECL)
1410 decl = gfc_get_extern_function_decl (sym);
1411 gfc_set_decl_location (decl, &sym->declared_at);
1413 else
1415 if (!sym->backend_decl)
1416 build_function_decl (sym, false);
1417 decl = sym->backend_decl;
1419 return decl;
1422 if (sym->attr.intrinsic)
1423 internal_error ("intrinsic variable which isn't a procedure");
1425 /* Create string length decl first so that they can be used in the
1426 type declaration. */
1427 if (sym->ts.type == BT_CHARACTER)
1428 length = gfc_create_string_length (sym);
1430 /* Create the decl for the variable. */
1431 decl = build_decl (sym->declared_at.lb->location,
1432 VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
1434 /* Add attributes to variables. Functions are handled elsewhere. */
1435 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1436 decl_attributes (&decl, attributes, 0);
1438 /* Symbols from modules should have their assembler names mangled.
1439 This is done here rather than in gfc_finish_var_decl because it
1440 is different for string length variables. */
1441 if (sym->module)
1443 gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
1444 if (sym->attr.use_assoc && !intrinsic_array_parameter)
1445 DECL_IGNORED_P (decl) = 1;
1448 if (sym->attr.select_type_temporary)
1450 DECL_ARTIFICIAL (decl) = 1;
1451 DECL_IGNORED_P (decl) = 1;
1454 if (sym->attr.dimension || sym->attr.codimension)
1456 /* Create variables to hold the non-constant bits of array info. */
1457 gfc_build_qualified_array (decl, sym);
1459 if (sym->attr.contiguous
1460 || ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer))
1461 GFC_DECL_PACKED_ARRAY (decl) = 1;
1464 /* Remember this variable for allocation/cleanup. */
1465 if (sym->attr.dimension || sym->attr.allocatable || sym->attr.codimension
1466 || (sym->ts.type == BT_CLASS &&
1467 (CLASS_DATA (sym)->attr.dimension
1468 || CLASS_DATA (sym)->attr.allocatable))
1469 || (sym->ts.type == BT_DERIVED
1470 && (sym->ts.u.derived->attr.alloc_comp
1471 || (!sym->attr.pointer && !sym->attr.artificial && !sym->attr.save
1472 && !sym->ns->proc_name->attr.is_main_program
1473 && gfc_is_finalizable (sym->ts.u.derived, NULL))))
1474 /* This applies a derived type default initializer. */
1475 || (sym->ts.type == BT_DERIVED
1476 && sym->attr.save == SAVE_NONE
1477 && !sym->attr.data
1478 && !sym->attr.allocatable
1479 && (sym->value && !sym->ns->proc_name->attr.is_main_program)
1480 && !(sym->attr.use_assoc && !intrinsic_array_parameter)))
1481 gfc_defer_symbol_init (sym);
1483 gfc_finish_var_decl (decl, sym);
1485 if (sym->ts.type == BT_CHARACTER)
1487 /* Character variables need special handling. */
1488 gfc_allocate_lang_decl (decl);
1490 if (TREE_CODE (length) != INTEGER_CST)
1492 gfc_finish_var_decl (length, sym);
1493 gcc_assert (!sym->value);
1496 else if (sym->attr.subref_array_pointer)
1498 /* We need the span for these beasts. */
1499 gfc_allocate_lang_decl (decl);
1502 if (sym->attr.subref_array_pointer)
1504 tree span;
1505 GFC_DECL_SUBREF_ARRAY_P (decl) = 1;
1506 span = build_decl (input_location,
1507 VAR_DECL, create_tmp_var_name ("span"),
1508 gfc_array_index_type);
1509 gfc_finish_var_decl (span, sym);
1510 TREE_STATIC (span) = TREE_STATIC (decl);
1511 DECL_ARTIFICIAL (span) = 1;
1513 GFC_DECL_SPAN (decl) = span;
1514 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span;
1517 if (sym->ts.type == BT_CLASS)
1518 GFC_DECL_CLASS(decl) = 1;
1520 sym->backend_decl = decl;
1522 if (sym->attr.assign)
1523 gfc_add_assign_aux_vars (sym);
1525 if (intrinsic_array_parameter)
1527 TREE_STATIC (decl) = 1;
1528 DECL_EXTERNAL (decl) = 0;
1531 if (TREE_STATIC (decl)
1532 && !(sym->attr.use_assoc && !intrinsic_array_parameter)
1533 && (sym->attr.save || sym->ns->proc_name->attr.is_main_program
1534 || gfc_option.flag_max_stack_var_size == 0
1535 || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
1536 && (gfc_option.coarray != GFC_FCOARRAY_LIB
1537 || !sym->attr.codimension || sym->attr.allocatable))
1539 /* Add static initializer. For procedures, it is only needed if
1540 SAVE is specified otherwise they need to be reinitialized
1541 every time the procedure is entered. The TREE_STATIC is
1542 in this case due to -fmax-stack-var-size=. */
1544 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1545 TREE_TYPE (decl), sym->attr.dimension
1546 || (sym->attr.codimension
1547 && sym->attr.allocatable),
1548 sym->attr.pointer || sym->attr.allocatable
1549 || sym->ts.type == BT_CLASS,
1550 sym->attr.proc_pointer);
1553 if (!TREE_STATIC (decl)
1554 && POINTER_TYPE_P (TREE_TYPE (decl))
1555 && !sym->attr.pointer
1556 && !sym->attr.allocatable
1557 && !sym->attr.proc_pointer
1558 && !sym->attr.select_type_temporary)
1559 DECL_BY_REFERENCE (decl) = 1;
1561 if (sym->attr.associate_var)
1562 GFC_DECL_ASSOCIATE_VAR_P (decl) = 1;
1564 if (sym->attr.vtab
1565 || (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0))
1566 TREE_READONLY (decl) = 1;
1568 return decl;
1572 /* Substitute a temporary variable in place of the real one. */
1574 void
1575 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1577 save->attr = sym->attr;
1578 save->decl = sym->backend_decl;
1580 gfc_clear_attr (&sym->attr);
1581 sym->attr.referenced = 1;
1582 sym->attr.flavor = FL_VARIABLE;
1584 sym->backend_decl = decl;
1588 /* Restore the original variable. */
1590 void
1591 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1593 sym->attr = save->attr;
1594 sym->backend_decl = save->decl;
1598 /* Declare a procedure pointer. */
1600 static tree
1601 get_proc_pointer_decl (gfc_symbol *sym)
1603 tree decl;
1604 tree attributes;
1606 decl = sym->backend_decl;
1607 if (decl)
1608 return decl;
1610 decl = build_decl (input_location,
1611 VAR_DECL, get_identifier (sym->name),
1612 build_pointer_type (gfc_get_function_type (sym)));
1614 if (sym->module)
1616 /* Apply name mangling. */
1617 gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
1618 if (sym->attr.use_assoc)
1619 DECL_IGNORED_P (decl) = 1;
1622 if ((sym->ns->proc_name
1623 && sym->ns->proc_name->backend_decl == current_function_decl)
1624 || sym->attr.contained)
1625 gfc_add_decl_to_function (decl);
1626 else if (sym->ns->proc_name->attr.flavor != FL_MODULE)
1627 gfc_add_decl_to_parent_function (decl);
1629 sym->backend_decl = decl;
1631 /* If a variable is USE associated, it's always external. */
1632 if (sym->attr.use_assoc)
1634 DECL_EXTERNAL (decl) = 1;
1635 TREE_PUBLIC (decl) = 1;
1637 else if (sym->module && sym->ns->proc_name->attr.flavor == FL_MODULE)
1639 /* This is the declaration of a module variable. */
1640 TREE_PUBLIC (decl) = 1;
1641 TREE_STATIC (decl) = 1;
1644 if (!sym->attr.use_assoc
1645 && (sym->attr.save != SAVE_NONE || sym->attr.data
1646 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
1647 TREE_STATIC (decl) = 1;
1649 if (TREE_STATIC (decl) && sym->value)
1651 /* Add static initializer. */
1652 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1653 TREE_TYPE (decl),
1654 sym->attr.dimension,
1655 false, true);
1658 /* Handle threadprivate procedure pointers. */
1659 if (sym->attr.threadprivate
1660 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
1661 set_decl_tls_model (decl, decl_default_tls_model (decl));
1663 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1664 decl_attributes (&decl, attributes, 0);
1666 return decl;
1670 /* Get a basic decl for an external function. */
1672 tree
1673 gfc_get_extern_function_decl (gfc_symbol * sym)
1675 tree type;
1676 tree fndecl;
1677 tree attributes;
1678 gfc_expr e;
1679 gfc_intrinsic_sym *isym;
1680 gfc_expr argexpr;
1681 char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'. */
1682 tree name;
1683 tree mangled_name;
1684 gfc_gsymbol *gsym;
1686 if (sym->backend_decl)
1687 return sym->backend_decl;
1689 /* We should never be creating external decls for alternate entry points.
1690 The procedure may be an alternate entry point, but we don't want/need
1691 to know that. */
1692 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1694 if (sym->attr.proc_pointer)
1695 return get_proc_pointer_decl (sym);
1697 /* See if this is an external procedure from the same file. If so,
1698 return the backend_decl. */
1699 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label
1700 ? sym->binding_label : sym->name);
1702 if (gsym && !gsym->defined)
1703 gsym = NULL;
1705 /* This can happen because of C binding. */
1706 if (gsym && gsym->ns && gsym->ns->proc_name
1707 && gsym->ns->proc_name->attr.flavor == FL_MODULE)
1708 goto module_sym;
1710 if ((!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL)
1711 && !sym->backend_decl
1712 && gsym && gsym->ns
1713 && ((gsym->type == GSYM_SUBROUTINE) || (gsym->type == GSYM_FUNCTION))
1714 && (gsym->ns->proc_name->backend_decl || !sym->attr.intrinsic))
1716 if (!gsym->ns->proc_name->backend_decl)
1718 /* By construction, the external function cannot be
1719 a contained procedure. */
1720 locus old_loc;
1722 gfc_save_backend_locus (&old_loc);
1723 push_cfun (NULL);
1725 gfc_create_function_decl (gsym->ns, true);
1727 pop_cfun ();
1728 gfc_restore_backend_locus (&old_loc);
1731 /* If the namespace has entries, the proc_name is the
1732 entry master. Find the entry and use its backend_decl.
1733 otherwise, use the proc_name backend_decl. */
1734 if (gsym->ns->entries)
1736 gfc_entry_list *entry = gsym->ns->entries;
1738 for (; entry; entry = entry->next)
1740 if (strcmp (gsym->name, entry->sym->name) == 0)
1742 sym->backend_decl = entry->sym->backend_decl;
1743 break;
1747 else
1748 sym->backend_decl = gsym->ns->proc_name->backend_decl;
1750 if (sym->backend_decl)
1752 /* Avoid problems of double deallocation of the backend declaration
1753 later in gfc_trans_use_stmts; cf. PR 45087. */
1754 if (sym->attr.if_source != IFSRC_DECL && sym->attr.use_assoc)
1755 sym->attr.use_assoc = 0;
1757 return sym->backend_decl;
1761 /* See if this is a module procedure from the same file. If so,
1762 return the backend_decl. */
1763 if (sym->module)
1764 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
1766 module_sym:
1767 if (gsym && gsym->ns
1768 && (gsym->type == GSYM_MODULE
1769 || (gsym->ns->proc_name && gsym->ns->proc_name->attr.flavor == FL_MODULE)))
1771 gfc_symbol *s;
1773 s = NULL;
1774 if (gsym->type == GSYM_MODULE)
1775 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
1776 else
1777 gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &s);
1779 if (s && s->backend_decl)
1781 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
1782 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
1783 true);
1784 else if (sym->ts.type == BT_CHARACTER)
1785 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
1786 sym->backend_decl = s->backend_decl;
1787 return sym->backend_decl;
1791 if (sym->attr.intrinsic)
1793 /* Call the resolution function to get the actual name. This is
1794 a nasty hack which relies on the resolution functions only looking
1795 at the first argument. We pass NULL for the second argument
1796 otherwise things like AINT get confused. */
1797 isym = gfc_find_function (sym->name);
1798 gcc_assert (isym->resolve.f0 != NULL);
1800 memset (&e, 0, sizeof (e));
1801 e.expr_type = EXPR_FUNCTION;
1803 memset (&argexpr, 0, sizeof (argexpr));
1804 gcc_assert (isym->formal);
1805 argexpr.ts = isym->formal->ts;
1807 if (isym->formal->next == NULL)
1808 isym->resolve.f1 (&e, &argexpr);
1809 else
1811 if (isym->formal->next->next == NULL)
1812 isym->resolve.f2 (&e, &argexpr, NULL);
1813 else
1815 if (isym->formal->next->next->next == NULL)
1816 isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1817 else
1819 /* All specific intrinsics take less than 5 arguments. */
1820 gcc_assert (isym->formal->next->next->next->next == NULL);
1821 isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
1826 if (gfc_option.flag_f2c
1827 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1828 || e.ts.type == BT_COMPLEX))
1830 /* Specific which needs a different implementation if f2c
1831 calling conventions are used. */
1832 sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1834 else
1835 sprintf (s, "_gfortran_specific%s", e.value.function.name);
1837 name = get_identifier (s);
1838 mangled_name = name;
1840 else
1842 name = gfc_sym_identifier (sym);
1843 mangled_name = gfc_sym_mangled_function_id (sym);
1846 type = gfc_get_function_type (sym);
1847 fndecl = build_decl (input_location,
1848 FUNCTION_DECL, name, type);
1850 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1851 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1852 the opposite of declaring a function as static in C). */
1853 DECL_EXTERNAL (fndecl) = 1;
1854 TREE_PUBLIC (fndecl) = 1;
1856 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1857 decl_attributes (&fndecl, attributes, 0);
1859 gfc_set_decl_assembler_name (fndecl, mangled_name);
1861 /* Set the context of this decl. */
1862 if (0 && sym->ns && sym->ns->proc_name)
1864 /* TODO: Add external decls to the appropriate scope. */
1865 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1867 else
1869 /* Global declaration, e.g. intrinsic subroutine. */
1870 DECL_CONTEXT (fndecl) = NULL_TREE;
1873 /* Set attributes for PURE functions. A call to PURE function in the
1874 Fortran 95 sense is both pure and without side effects in the C
1875 sense. */
1876 if (sym->attr.pure || sym->attr.implicit_pure)
1878 if (sym->attr.function && !gfc_return_by_reference (sym))
1879 DECL_PURE_P (fndecl) = 1;
1880 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1881 parameters and don't use alternate returns (is this
1882 allowed?). In that case, calls to them are meaningless, and
1883 can be optimized away. See also in build_function_decl(). */
1884 TREE_SIDE_EFFECTS (fndecl) = 0;
1887 /* Mark non-returning functions. */
1888 if (sym->attr.noreturn)
1889 TREE_THIS_VOLATILE(fndecl) = 1;
1891 sym->backend_decl = fndecl;
1893 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1894 pushdecl_top_level (fndecl);
1896 if (sym->formal_ns
1897 && sym->formal_ns->proc_name == sym
1898 && sym->formal_ns->omp_declare_simd)
1899 gfc_trans_omp_declare_simd (sym->formal_ns);
1901 return fndecl;
1905 /* Create a declaration for a procedure. For external functions (in the C
1906 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1907 a master function with alternate entry points. */
1909 static void
1910 build_function_decl (gfc_symbol * sym, bool global)
1912 tree fndecl, type, attributes;
1913 symbol_attribute attr;
1914 tree result_decl;
1915 gfc_formal_arglist *f;
1917 gcc_assert (!sym->attr.external);
1919 if (sym->backend_decl)
1920 return;
1922 /* Set the line and filename. sym->declared_at seems to point to the
1923 last statement for subroutines, but it'll do for now. */
1924 gfc_set_backend_locus (&sym->declared_at);
1926 /* Allow only one nesting level. Allow public declarations. */
1927 gcc_assert (current_function_decl == NULL_TREE
1928 || DECL_FILE_SCOPE_P (current_function_decl)
1929 || (TREE_CODE (DECL_CONTEXT (current_function_decl))
1930 == NAMESPACE_DECL));
1932 type = gfc_get_function_type (sym);
1933 fndecl = build_decl (input_location,
1934 FUNCTION_DECL, gfc_sym_identifier (sym), type);
1936 attr = sym->attr;
1938 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1939 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1940 the opposite of declaring a function as static in C). */
1941 DECL_EXTERNAL (fndecl) = 0;
1943 if (sym->attr.access == ACCESS_UNKNOWN && sym->module
1944 && (sym->ns->default_access == ACCESS_PRIVATE
1945 || (sym->ns->default_access == ACCESS_UNKNOWN
1946 && gfc_option.flag_module_private)))
1947 sym->attr.access = ACCESS_PRIVATE;
1949 if (!current_function_decl
1950 && !sym->attr.entry_master && !sym->attr.is_main_program
1951 && (sym->attr.access != ACCESS_PRIVATE || sym->binding_label
1952 || sym->attr.public_used))
1953 TREE_PUBLIC (fndecl) = 1;
1955 if (sym->attr.referenced || sym->attr.entry_master)
1956 TREE_USED (fndecl) = 1;
1958 attributes = add_attributes_to_decl (attr, NULL_TREE);
1959 decl_attributes (&fndecl, attributes, 0);
1961 /* Figure out the return type of the declared function, and build a
1962 RESULT_DECL for it. If this is a subroutine with alternate
1963 returns, build a RESULT_DECL for it. */
1964 result_decl = NULL_TREE;
1965 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1966 if (attr.function)
1968 if (gfc_return_by_reference (sym))
1969 type = void_type_node;
1970 else
1972 if (sym->result != sym)
1973 result_decl = gfc_sym_identifier (sym->result);
1975 type = TREE_TYPE (TREE_TYPE (fndecl));
1978 else
1980 /* Look for alternate return placeholders. */
1981 int has_alternate_returns = 0;
1982 for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
1984 if (f->sym == NULL)
1986 has_alternate_returns = 1;
1987 break;
1991 if (has_alternate_returns)
1992 type = integer_type_node;
1993 else
1994 type = void_type_node;
1997 result_decl = build_decl (input_location,
1998 RESULT_DECL, result_decl, type);
1999 DECL_ARTIFICIAL (result_decl) = 1;
2000 DECL_IGNORED_P (result_decl) = 1;
2001 DECL_CONTEXT (result_decl) = fndecl;
2002 DECL_RESULT (fndecl) = result_decl;
2004 /* Don't call layout_decl for a RESULT_DECL.
2005 layout_decl (result_decl, 0); */
2007 /* TREE_STATIC means the function body is defined here. */
2008 TREE_STATIC (fndecl) = 1;
2010 /* Set attributes for PURE functions. A call to a PURE function in the
2011 Fortran 95 sense is both pure and without side effects in the C
2012 sense. */
2013 if (attr.pure || attr.implicit_pure)
2015 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
2016 including an alternate return. In that case it can also be
2017 marked as PURE. See also in gfc_get_extern_function_decl(). */
2018 if (attr.function && !gfc_return_by_reference (sym))
2019 DECL_PURE_P (fndecl) = 1;
2020 TREE_SIDE_EFFECTS (fndecl) = 0;
2024 /* Layout the function declaration and put it in the binding level
2025 of the current function. */
2027 if (global)
2028 pushdecl_top_level (fndecl);
2029 else
2030 pushdecl (fndecl);
2032 /* Perform name mangling if this is a top level or module procedure. */
2033 if (current_function_decl == NULL_TREE)
2034 gfc_set_decl_assembler_name (fndecl, gfc_sym_mangled_function_id (sym));
2036 sym->backend_decl = fndecl;
2040 /* Create the DECL_ARGUMENTS for a procedure. */
2042 static void
2043 create_function_arglist (gfc_symbol * sym)
2045 tree fndecl;
2046 gfc_formal_arglist *f;
2047 tree typelist, hidden_typelist;
2048 tree arglist, hidden_arglist;
2049 tree type;
2050 tree parm;
2052 fndecl = sym->backend_decl;
2054 /* Build formal argument list. Make sure that their TREE_CONTEXT is
2055 the new FUNCTION_DECL node. */
2056 arglist = NULL_TREE;
2057 hidden_arglist = NULL_TREE;
2058 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2060 if (sym->attr.entry_master)
2062 type = TREE_VALUE (typelist);
2063 parm = build_decl (input_location,
2064 PARM_DECL, get_identifier ("__entry"), type);
2066 DECL_CONTEXT (parm) = fndecl;
2067 DECL_ARG_TYPE (parm) = type;
2068 TREE_READONLY (parm) = 1;
2069 gfc_finish_decl (parm);
2070 DECL_ARTIFICIAL (parm) = 1;
2072 arglist = chainon (arglist, parm);
2073 typelist = TREE_CHAIN (typelist);
2076 if (gfc_return_by_reference (sym))
2078 tree type = TREE_VALUE (typelist), length = NULL;
2080 if (sym->ts.type == BT_CHARACTER)
2082 /* Length of character result. */
2083 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
2085 length = build_decl (input_location,
2086 PARM_DECL,
2087 get_identifier (".__result"),
2088 len_type);
2089 if (!sym->ts.u.cl->length)
2091 sym->ts.u.cl->backend_decl = length;
2092 TREE_USED (length) = 1;
2094 gcc_assert (TREE_CODE (length) == PARM_DECL);
2095 DECL_CONTEXT (length) = fndecl;
2096 DECL_ARG_TYPE (length) = len_type;
2097 TREE_READONLY (length) = 1;
2098 DECL_ARTIFICIAL (length) = 1;
2099 gfc_finish_decl (length);
2100 if (sym->ts.u.cl->backend_decl == NULL
2101 || sym->ts.u.cl->backend_decl == length)
2103 gfc_symbol *arg;
2104 tree backend_decl;
2106 if (sym->ts.u.cl->backend_decl == NULL)
2108 tree len = build_decl (input_location,
2109 VAR_DECL,
2110 get_identifier ("..__result"),
2111 gfc_charlen_type_node);
2112 DECL_ARTIFICIAL (len) = 1;
2113 TREE_USED (len) = 1;
2114 sym->ts.u.cl->backend_decl = len;
2117 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2118 arg = sym->result ? sym->result : sym;
2119 backend_decl = arg->backend_decl;
2120 /* Temporary clear it, so that gfc_sym_type creates complete
2121 type. */
2122 arg->backend_decl = NULL;
2123 type = gfc_sym_type (arg);
2124 arg->backend_decl = backend_decl;
2125 type = build_reference_type (type);
2129 parm = build_decl (input_location,
2130 PARM_DECL, get_identifier ("__result"), type);
2132 DECL_CONTEXT (parm) = fndecl;
2133 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2134 TREE_READONLY (parm) = 1;
2135 DECL_ARTIFICIAL (parm) = 1;
2136 gfc_finish_decl (parm);
2138 arglist = chainon (arglist, parm);
2139 typelist = TREE_CHAIN (typelist);
2141 if (sym->ts.type == BT_CHARACTER)
2143 gfc_allocate_lang_decl (parm);
2144 arglist = chainon (arglist, length);
2145 typelist = TREE_CHAIN (typelist);
2149 hidden_typelist = typelist;
2150 for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
2151 if (f->sym != NULL) /* Ignore alternate returns. */
2152 hidden_typelist = TREE_CHAIN (hidden_typelist);
2154 for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
2156 char name[GFC_MAX_SYMBOL_LEN + 2];
2158 /* Ignore alternate returns. */
2159 if (f->sym == NULL)
2160 continue;
2162 type = TREE_VALUE (typelist);
2164 if (f->sym->ts.type == BT_CHARACTER
2165 && (!sym->attr.is_bind_c || sym->attr.entry_master))
2167 tree len_type = TREE_VALUE (hidden_typelist);
2168 tree length = NULL_TREE;
2169 if (!f->sym->ts.deferred)
2170 gcc_assert (len_type == gfc_charlen_type_node);
2171 else
2172 gcc_assert (POINTER_TYPE_P (len_type));
2174 strcpy (&name[1], f->sym->name);
2175 name[0] = '_';
2176 length = build_decl (input_location,
2177 PARM_DECL, get_identifier (name), len_type);
2179 hidden_arglist = chainon (hidden_arglist, length);
2180 DECL_CONTEXT (length) = fndecl;
2181 DECL_ARTIFICIAL (length) = 1;
2182 DECL_ARG_TYPE (length) = len_type;
2183 TREE_READONLY (length) = 1;
2184 gfc_finish_decl (length);
2186 /* Remember the passed value. */
2187 if (!f->sym->ts.u.cl || f->sym->ts.u.cl->passed_length)
2189 /* This can happen if the same type is used for multiple
2190 arguments. We need to copy cl as otherwise
2191 cl->passed_length gets overwritten. */
2192 f->sym->ts.u.cl = gfc_new_charlen (f->sym->ns, f->sym->ts.u.cl);
2194 f->sym->ts.u.cl->passed_length = length;
2196 /* Use the passed value for assumed length variables. */
2197 if (!f->sym->ts.u.cl->length)
2199 TREE_USED (length) = 1;
2200 gcc_assert (!f->sym->ts.u.cl->backend_decl);
2201 f->sym->ts.u.cl->backend_decl = length;
2204 hidden_typelist = TREE_CHAIN (hidden_typelist);
2206 if (f->sym->ts.u.cl->backend_decl == NULL
2207 || f->sym->ts.u.cl->backend_decl == length)
2209 if (f->sym->ts.u.cl->backend_decl == NULL)
2210 gfc_create_string_length (f->sym);
2212 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2213 if (f->sym->attr.flavor == FL_PROCEDURE)
2214 type = build_pointer_type (gfc_get_function_type (f->sym));
2215 else
2216 type = gfc_sym_type (f->sym);
2219 /* For noncharacter scalar intrinsic types, VALUE passes the value,
2220 hence, the optional status cannot be transferred via a NULL pointer.
2221 Thus, we will use a hidden argument in that case. */
2222 else if (f->sym->attr.optional && f->sym->attr.value
2223 && !f->sym->attr.dimension && f->sym->ts.type != BT_CLASS
2224 && f->sym->ts.type != BT_DERIVED)
2226 tree tmp;
2227 strcpy (&name[1], f->sym->name);
2228 name[0] = '_';
2229 tmp = build_decl (input_location,
2230 PARM_DECL, get_identifier (name),
2231 boolean_type_node);
2233 hidden_arglist = chainon (hidden_arglist, tmp);
2234 DECL_CONTEXT (tmp) = fndecl;
2235 DECL_ARTIFICIAL (tmp) = 1;
2236 DECL_ARG_TYPE (tmp) = boolean_type_node;
2237 TREE_READONLY (tmp) = 1;
2238 gfc_finish_decl (tmp);
2241 /* For non-constant length array arguments, make sure they use
2242 a different type node from TYPE_ARG_TYPES type. */
2243 if (f->sym->attr.dimension
2244 && type == TREE_VALUE (typelist)
2245 && TREE_CODE (type) == POINTER_TYPE
2246 && GFC_ARRAY_TYPE_P (type)
2247 && f->sym->as->type != AS_ASSUMED_SIZE
2248 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
2250 if (f->sym->attr.flavor == FL_PROCEDURE)
2251 type = build_pointer_type (gfc_get_function_type (f->sym));
2252 else
2253 type = gfc_sym_type (f->sym);
2256 if (f->sym->attr.proc_pointer)
2257 type = build_pointer_type (type);
2259 if (f->sym->attr.volatile_)
2260 type = build_qualified_type (type, TYPE_QUAL_VOLATILE);
2262 /* Build the argument declaration. */
2263 parm = build_decl (input_location,
2264 PARM_DECL, gfc_sym_identifier (f->sym), type);
2266 if (f->sym->attr.volatile_)
2268 TREE_THIS_VOLATILE (parm) = 1;
2269 TREE_SIDE_EFFECTS (parm) = 1;
2272 /* Fill in arg stuff. */
2273 DECL_CONTEXT (parm) = fndecl;
2274 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2275 /* All implementation args are read-only. */
2276 TREE_READONLY (parm) = 1;
2277 if (POINTER_TYPE_P (type)
2278 && (!f->sym->attr.proc_pointer
2279 && f->sym->attr.flavor != FL_PROCEDURE))
2280 DECL_BY_REFERENCE (parm) = 1;
2282 gfc_finish_decl (parm);
2283 gfc_finish_decl_attrs (parm, &f->sym->attr);
2285 f->sym->backend_decl = parm;
2287 /* Coarrays which are descriptorless or assumed-shape pass with
2288 -fcoarray=lib the token and the offset as hidden arguments. */
2289 if (gfc_option.coarray == GFC_FCOARRAY_LIB
2290 && ((f->sym->ts.type != BT_CLASS && f->sym->attr.codimension
2291 && !f->sym->attr.allocatable)
2292 || (f->sym->ts.type == BT_CLASS
2293 && CLASS_DATA (f->sym)->attr.codimension
2294 && !CLASS_DATA (f->sym)->attr.allocatable)))
2296 tree caf_type;
2297 tree token;
2298 tree offset;
2300 gcc_assert (f->sym->backend_decl != NULL_TREE
2301 && !sym->attr.is_bind_c);
2302 caf_type = f->sym->ts.type == BT_CLASS
2303 ? TREE_TYPE (CLASS_DATA (f->sym)->backend_decl)
2304 : TREE_TYPE (f->sym->backend_decl);
2306 token = build_decl (input_location, PARM_DECL,
2307 create_tmp_var_name ("caf_token"),
2308 build_qualified_type (pvoid_type_node,
2309 TYPE_QUAL_RESTRICT));
2310 if ((f->sym->ts.type != BT_CLASS
2311 && f->sym->as->type != AS_DEFERRED)
2312 || (f->sym->ts.type == BT_CLASS
2313 && CLASS_DATA (f->sym)->as->type != AS_DEFERRED))
2315 gcc_assert (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL
2316 || GFC_DECL_TOKEN (f->sym->backend_decl) == NULL_TREE);
2317 if (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL)
2318 gfc_allocate_lang_decl (f->sym->backend_decl);
2319 GFC_DECL_TOKEN (f->sym->backend_decl) = token;
2321 else
2323 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) == NULL_TREE);
2324 GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) = token;
2327 DECL_CONTEXT (token) = fndecl;
2328 DECL_ARTIFICIAL (token) = 1;
2329 DECL_ARG_TYPE (token) = TREE_VALUE (typelist);
2330 TREE_READONLY (token) = 1;
2331 hidden_arglist = chainon (hidden_arglist, token);
2332 gfc_finish_decl (token);
2334 offset = build_decl (input_location, PARM_DECL,
2335 create_tmp_var_name ("caf_offset"),
2336 gfc_array_index_type);
2338 if ((f->sym->ts.type != BT_CLASS
2339 && f->sym->as->type != AS_DEFERRED)
2340 || (f->sym->ts.type == BT_CLASS
2341 && CLASS_DATA (f->sym)->as->type != AS_DEFERRED))
2343 gcc_assert (GFC_DECL_CAF_OFFSET (f->sym->backend_decl)
2344 == NULL_TREE);
2345 GFC_DECL_CAF_OFFSET (f->sym->backend_decl) = offset;
2347 else
2349 gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) == NULL_TREE);
2350 GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) = offset;
2352 DECL_CONTEXT (offset) = fndecl;
2353 DECL_ARTIFICIAL (offset) = 1;
2354 DECL_ARG_TYPE (offset) = TREE_VALUE (typelist);
2355 TREE_READONLY (offset) = 1;
2356 hidden_arglist = chainon (hidden_arglist, offset);
2357 gfc_finish_decl (offset);
2360 arglist = chainon (arglist, parm);
2361 typelist = TREE_CHAIN (typelist);
2364 /* Add the hidden string length parameters, unless the procedure
2365 is bind(C). */
2366 if (!sym->attr.is_bind_c)
2367 arglist = chainon (arglist, hidden_arglist);
2369 gcc_assert (hidden_typelist == NULL_TREE
2370 || TREE_VALUE (hidden_typelist) == void_type_node);
2371 DECL_ARGUMENTS (fndecl) = arglist;
2374 /* Do the setup necessary before generating the body of a function. */
2376 static void
2377 trans_function_start (gfc_symbol * sym)
2379 tree fndecl;
2381 fndecl = sym->backend_decl;
2383 /* Let GCC know the current scope is this function. */
2384 current_function_decl = fndecl;
2386 /* Let the world know what we're about to do. */
2387 announce_function (fndecl);
2389 if (DECL_FILE_SCOPE_P (fndecl))
2391 /* Create RTL for function declaration. */
2392 rest_of_decl_compilation (fndecl, 1, 0);
2395 /* Create RTL for function definition. */
2396 make_decl_rtl (fndecl);
2398 allocate_struct_function (fndecl, false);
2400 /* function.c requires a push at the start of the function. */
2401 pushlevel ();
2404 /* Create thunks for alternate entry points. */
2406 static void
2407 build_entry_thunks (gfc_namespace * ns, bool global)
2409 gfc_formal_arglist *formal;
2410 gfc_formal_arglist *thunk_formal;
2411 gfc_entry_list *el;
2412 gfc_symbol *thunk_sym;
2413 stmtblock_t body;
2414 tree thunk_fndecl;
2415 tree tmp;
2416 locus old_loc;
2418 /* This should always be a toplevel function. */
2419 gcc_assert (current_function_decl == NULL_TREE);
2421 gfc_save_backend_locus (&old_loc);
2422 for (el = ns->entries; el; el = el->next)
2424 vec<tree, va_gc> *args = NULL;
2425 vec<tree, va_gc> *string_args = NULL;
2427 thunk_sym = el->sym;
2429 build_function_decl (thunk_sym, global);
2430 create_function_arglist (thunk_sym);
2432 trans_function_start (thunk_sym);
2434 thunk_fndecl = thunk_sym->backend_decl;
2436 gfc_init_block (&body);
2438 /* Pass extra parameter identifying this entry point. */
2439 tmp = build_int_cst (gfc_array_index_type, el->id);
2440 vec_safe_push (args, tmp);
2442 if (thunk_sym->attr.function)
2444 if (gfc_return_by_reference (ns->proc_name))
2446 tree ref = DECL_ARGUMENTS (current_function_decl);
2447 vec_safe_push (args, ref);
2448 if (ns->proc_name->ts.type == BT_CHARACTER)
2449 vec_safe_push (args, DECL_CHAIN (ref));
2453 for (formal = gfc_sym_get_dummy_args (ns->proc_name); formal;
2454 formal = formal->next)
2456 /* Ignore alternate returns. */
2457 if (formal->sym == NULL)
2458 continue;
2460 /* We don't have a clever way of identifying arguments, so resort to
2461 a brute-force search. */
2462 for (thunk_formal = gfc_sym_get_dummy_args (thunk_sym);
2463 thunk_formal;
2464 thunk_formal = thunk_formal->next)
2466 if (thunk_formal->sym == formal->sym)
2467 break;
2470 if (thunk_formal)
2472 /* Pass the argument. */
2473 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
2474 vec_safe_push (args, thunk_formal->sym->backend_decl);
2475 if (formal->sym->ts.type == BT_CHARACTER)
2477 tmp = thunk_formal->sym->ts.u.cl->backend_decl;
2478 vec_safe_push (string_args, tmp);
2481 else
2483 /* Pass NULL for a missing argument. */
2484 vec_safe_push (args, null_pointer_node);
2485 if (formal->sym->ts.type == BT_CHARACTER)
2487 tmp = build_int_cst (gfc_charlen_type_node, 0);
2488 vec_safe_push (string_args, tmp);
2493 /* Call the master function. */
2494 vec_safe_splice (args, string_args);
2495 tmp = ns->proc_name->backend_decl;
2496 tmp = build_call_expr_loc_vec (input_location, tmp, args);
2497 if (ns->proc_name->attr.mixed_entry_master)
2499 tree union_decl, field;
2500 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
2502 union_decl = build_decl (input_location,
2503 VAR_DECL, get_identifier ("__result"),
2504 TREE_TYPE (master_type));
2505 DECL_ARTIFICIAL (union_decl) = 1;
2506 DECL_EXTERNAL (union_decl) = 0;
2507 TREE_PUBLIC (union_decl) = 0;
2508 TREE_USED (union_decl) = 1;
2509 layout_decl (union_decl, 0);
2510 pushdecl (union_decl);
2512 DECL_CONTEXT (union_decl) = current_function_decl;
2513 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2514 TREE_TYPE (union_decl), union_decl, tmp);
2515 gfc_add_expr_to_block (&body, tmp);
2517 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
2518 field; field = DECL_CHAIN (field))
2519 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2520 thunk_sym->result->name) == 0)
2521 break;
2522 gcc_assert (field != NULL_TREE);
2523 tmp = fold_build3_loc (input_location, COMPONENT_REF,
2524 TREE_TYPE (field), union_decl, field,
2525 NULL_TREE);
2526 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2527 TREE_TYPE (DECL_RESULT (current_function_decl)),
2528 DECL_RESULT (current_function_decl), tmp);
2529 tmp = build1_v (RETURN_EXPR, tmp);
2531 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
2532 != void_type_node)
2534 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2535 TREE_TYPE (DECL_RESULT (current_function_decl)),
2536 DECL_RESULT (current_function_decl), tmp);
2537 tmp = build1_v (RETURN_EXPR, tmp);
2539 gfc_add_expr_to_block (&body, tmp);
2541 /* Finish off this function and send it for code generation. */
2542 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
2543 tmp = getdecls ();
2544 poplevel (1, 1);
2545 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
2546 DECL_SAVED_TREE (thunk_fndecl)
2547 = build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl),
2548 DECL_INITIAL (thunk_fndecl));
2550 /* Output the GENERIC tree. */
2551 dump_function (TDI_original, thunk_fndecl);
2553 /* Store the end of the function, so that we get good line number
2554 info for the epilogue. */
2555 cfun->function_end_locus = input_location;
2557 /* We're leaving the context of this function, so zap cfun.
2558 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2559 tree_rest_of_compilation. */
2560 set_cfun (NULL);
2562 current_function_decl = NULL_TREE;
2564 cgraph_finalize_function (thunk_fndecl, true);
2566 /* We share the symbols in the formal argument list with other entry
2567 points and the master function. Clear them so that they are
2568 recreated for each function. */
2569 for (formal = gfc_sym_get_dummy_args (thunk_sym); formal;
2570 formal = formal->next)
2571 if (formal->sym != NULL) /* Ignore alternate returns. */
2573 formal->sym->backend_decl = NULL_TREE;
2574 if (formal->sym->ts.type == BT_CHARACTER)
2575 formal->sym->ts.u.cl->backend_decl = NULL_TREE;
2578 if (thunk_sym->attr.function)
2580 if (thunk_sym->ts.type == BT_CHARACTER)
2581 thunk_sym->ts.u.cl->backend_decl = NULL_TREE;
2582 if (thunk_sym->result->ts.type == BT_CHARACTER)
2583 thunk_sym->result->ts.u.cl->backend_decl = NULL_TREE;
2587 gfc_restore_backend_locus (&old_loc);
2591 /* Create a decl for a function, and create any thunks for alternate entry
2592 points. If global is true, generate the function in the global binding
2593 level, otherwise in the current binding level (which can be global). */
2595 void
2596 gfc_create_function_decl (gfc_namespace * ns, bool global)
2598 /* Create a declaration for the master function. */
2599 build_function_decl (ns->proc_name, global);
2601 /* Compile the entry thunks. */
2602 if (ns->entries)
2603 build_entry_thunks (ns, global);
2605 /* Now create the read argument list. */
2606 create_function_arglist (ns->proc_name);
2608 if (ns->omp_declare_simd)
2609 gfc_trans_omp_declare_simd (ns);
2612 /* Return the decl used to hold the function return value. If
2613 parent_flag is set, the context is the parent_scope. */
2615 tree
2616 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
2618 tree decl;
2619 tree length;
2620 tree this_fake_result_decl;
2621 tree this_function_decl;
2623 char name[GFC_MAX_SYMBOL_LEN + 10];
2625 if (parent_flag)
2627 this_fake_result_decl = parent_fake_result_decl;
2628 this_function_decl = DECL_CONTEXT (current_function_decl);
2630 else
2632 this_fake_result_decl = current_fake_result_decl;
2633 this_function_decl = current_function_decl;
2636 if (sym
2637 && sym->ns->proc_name->backend_decl == this_function_decl
2638 && sym->ns->proc_name->attr.entry_master
2639 && sym != sym->ns->proc_name)
2641 tree t = NULL, var;
2642 if (this_fake_result_decl != NULL)
2643 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
2644 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
2645 break;
2646 if (t)
2647 return TREE_VALUE (t);
2648 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
2650 if (parent_flag)
2651 this_fake_result_decl = parent_fake_result_decl;
2652 else
2653 this_fake_result_decl = current_fake_result_decl;
2655 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
2657 tree field;
2659 for (field = TYPE_FIELDS (TREE_TYPE (decl));
2660 field; field = DECL_CHAIN (field))
2661 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2662 sym->name) == 0)
2663 break;
2665 gcc_assert (field != NULL_TREE);
2666 decl = fold_build3_loc (input_location, COMPONENT_REF,
2667 TREE_TYPE (field), decl, field, NULL_TREE);
2670 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
2671 if (parent_flag)
2672 gfc_add_decl_to_parent_function (var);
2673 else
2674 gfc_add_decl_to_function (var);
2676 SET_DECL_VALUE_EXPR (var, decl);
2677 DECL_HAS_VALUE_EXPR_P (var) = 1;
2678 GFC_DECL_RESULT (var) = 1;
2680 TREE_CHAIN (this_fake_result_decl)
2681 = tree_cons (get_identifier (sym->name), var,
2682 TREE_CHAIN (this_fake_result_decl));
2683 return var;
2686 if (this_fake_result_decl != NULL_TREE)
2687 return TREE_VALUE (this_fake_result_decl);
2689 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2690 sym is NULL. */
2691 if (!sym)
2692 return NULL_TREE;
2694 if (sym->ts.type == BT_CHARACTER)
2696 if (sym->ts.u.cl->backend_decl == NULL_TREE)
2697 length = gfc_create_string_length (sym);
2698 else
2699 length = sym->ts.u.cl->backend_decl;
2700 if (TREE_CODE (length) == VAR_DECL
2701 && DECL_CONTEXT (length) == NULL_TREE)
2702 gfc_add_decl_to_function (length);
2705 if (gfc_return_by_reference (sym))
2707 decl = DECL_ARGUMENTS (this_function_decl);
2709 if (sym->ns->proc_name->backend_decl == this_function_decl
2710 && sym->ns->proc_name->attr.entry_master)
2711 decl = DECL_CHAIN (decl);
2713 TREE_USED (decl) = 1;
2714 if (sym->as)
2715 decl = gfc_build_dummy_array_decl (sym, decl);
2717 else
2719 sprintf (name, "__result_%.20s",
2720 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
2722 if (!sym->attr.mixed_entry_master && sym->attr.function)
2723 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2724 VAR_DECL, get_identifier (name),
2725 gfc_sym_type (sym));
2726 else
2727 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2728 VAR_DECL, get_identifier (name),
2729 TREE_TYPE (TREE_TYPE (this_function_decl)));
2730 DECL_ARTIFICIAL (decl) = 1;
2731 DECL_EXTERNAL (decl) = 0;
2732 TREE_PUBLIC (decl) = 0;
2733 TREE_USED (decl) = 1;
2734 GFC_DECL_RESULT (decl) = 1;
2735 TREE_ADDRESSABLE (decl) = 1;
2737 layout_decl (decl, 0);
2738 gfc_finish_decl_attrs (decl, &sym->attr);
2740 if (parent_flag)
2741 gfc_add_decl_to_parent_function (decl);
2742 else
2743 gfc_add_decl_to_function (decl);
2746 if (parent_flag)
2747 parent_fake_result_decl = build_tree_list (NULL, decl);
2748 else
2749 current_fake_result_decl = build_tree_list (NULL, decl);
2751 return decl;
2755 /* Builds a function decl. The remaining parameters are the types of the
2756 function arguments. Negative nargs indicates a varargs function. */
2758 static tree
2759 build_library_function_decl_1 (tree name, const char *spec,
2760 tree rettype, int nargs, va_list p)
2762 vec<tree, va_gc> *arglist;
2763 tree fntype;
2764 tree fndecl;
2765 int n;
2767 /* Library functions must be declared with global scope. */
2768 gcc_assert (current_function_decl == NULL_TREE);
2770 /* Create a list of the argument types. */
2771 vec_alloc (arglist, abs (nargs));
2772 for (n = abs (nargs); n > 0; n--)
2774 tree argtype = va_arg (p, tree);
2775 arglist->quick_push (argtype);
2778 /* Build the function type and decl. */
2779 if (nargs >= 0)
2780 fntype = build_function_type_vec (rettype, arglist);
2781 else
2782 fntype = build_varargs_function_type_vec (rettype, arglist);
2783 if (spec)
2785 tree attr_args = build_tree_list (NULL_TREE,
2786 build_string (strlen (spec), spec));
2787 tree attrs = tree_cons (get_identifier ("fn spec"),
2788 attr_args, TYPE_ATTRIBUTES (fntype));
2789 fntype = build_type_attribute_variant (fntype, attrs);
2791 fndecl = build_decl (input_location,
2792 FUNCTION_DECL, name, fntype);
2794 /* Mark this decl as external. */
2795 DECL_EXTERNAL (fndecl) = 1;
2796 TREE_PUBLIC (fndecl) = 1;
2798 pushdecl (fndecl);
2800 rest_of_decl_compilation (fndecl, 1, 0);
2802 return fndecl;
2805 /* Builds a function decl. The remaining parameters are the types of the
2806 function arguments. Negative nargs indicates a varargs function. */
2808 tree
2809 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
2811 tree ret;
2812 va_list args;
2813 va_start (args, nargs);
2814 ret = build_library_function_decl_1 (name, NULL, rettype, nargs, args);
2815 va_end (args);
2816 return ret;
2819 /* Builds a function decl. The remaining parameters are the types of the
2820 function arguments. Negative nargs indicates a varargs function.
2821 The SPEC parameter specifies the function argument and return type
2822 specification according to the fnspec function type attribute. */
2824 tree
2825 gfc_build_library_function_decl_with_spec (tree name, const char *spec,
2826 tree rettype, int nargs, ...)
2828 tree ret;
2829 va_list args;
2830 va_start (args, nargs);
2831 ret = build_library_function_decl_1 (name, spec, rettype, nargs, args);
2832 va_end (args);
2833 return ret;
2836 static void
2837 gfc_build_intrinsic_function_decls (void)
2839 tree gfc_int4_type_node = gfc_get_int_type (4);
2840 tree gfc_pint4_type_node = build_pointer_type (gfc_int4_type_node);
2841 tree gfc_int8_type_node = gfc_get_int_type (8);
2842 tree gfc_pint8_type_node = build_pointer_type (gfc_int8_type_node);
2843 tree gfc_int16_type_node = gfc_get_int_type (16);
2844 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2845 tree pchar1_type_node = gfc_get_pchar_type (1);
2846 tree pchar4_type_node = gfc_get_pchar_type (4);
2848 /* String functions. */
2849 gfor_fndecl_compare_string = gfc_build_library_function_decl_with_spec (
2850 get_identifier (PREFIX("compare_string")), "..R.R",
2851 integer_type_node, 4, gfc_charlen_type_node, pchar1_type_node,
2852 gfc_charlen_type_node, pchar1_type_node);
2853 DECL_PURE_P (gfor_fndecl_compare_string) = 1;
2854 TREE_NOTHROW (gfor_fndecl_compare_string) = 1;
2856 gfor_fndecl_concat_string = gfc_build_library_function_decl_with_spec (
2857 get_identifier (PREFIX("concat_string")), "..W.R.R",
2858 void_type_node, 6, gfc_charlen_type_node, pchar1_type_node,
2859 gfc_charlen_type_node, pchar1_type_node,
2860 gfc_charlen_type_node, pchar1_type_node);
2861 TREE_NOTHROW (gfor_fndecl_concat_string) = 1;
2863 gfor_fndecl_string_len_trim = gfc_build_library_function_decl_with_spec (
2864 get_identifier (PREFIX("string_len_trim")), "..R",
2865 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar1_type_node);
2866 DECL_PURE_P (gfor_fndecl_string_len_trim) = 1;
2867 TREE_NOTHROW (gfor_fndecl_string_len_trim) = 1;
2869 gfor_fndecl_string_index = gfc_build_library_function_decl_with_spec (
2870 get_identifier (PREFIX("string_index")), "..R.R.",
2871 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2872 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2873 DECL_PURE_P (gfor_fndecl_string_index) = 1;
2874 TREE_NOTHROW (gfor_fndecl_string_index) = 1;
2876 gfor_fndecl_string_scan = gfc_build_library_function_decl_with_spec (
2877 get_identifier (PREFIX("string_scan")), "..R.R.",
2878 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2879 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2880 DECL_PURE_P (gfor_fndecl_string_scan) = 1;
2881 TREE_NOTHROW (gfor_fndecl_string_scan) = 1;
2883 gfor_fndecl_string_verify = gfc_build_library_function_decl_with_spec (
2884 get_identifier (PREFIX("string_verify")), "..R.R.",
2885 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2886 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2887 DECL_PURE_P (gfor_fndecl_string_verify) = 1;
2888 TREE_NOTHROW (gfor_fndecl_string_verify) = 1;
2890 gfor_fndecl_string_trim = gfc_build_library_function_decl_with_spec (
2891 get_identifier (PREFIX("string_trim")), ".Ww.R",
2892 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2893 build_pointer_type (pchar1_type_node), gfc_charlen_type_node,
2894 pchar1_type_node);
2896 gfor_fndecl_string_minmax = gfc_build_library_function_decl_with_spec (
2897 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2898 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2899 build_pointer_type (pchar1_type_node), integer_type_node,
2900 integer_type_node);
2902 gfor_fndecl_adjustl = gfc_build_library_function_decl_with_spec (
2903 get_identifier (PREFIX("adjustl")), ".W.R",
2904 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2905 pchar1_type_node);
2906 TREE_NOTHROW (gfor_fndecl_adjustl) = 1;
2908 gfor_fndecl_adjustr = gfc_build_library_function_decl_with_spec (
2909 get_identifier (PREFIX("adjustr")), ".W.R",
2910 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2911 pchar1_type_node);
2912 TREE_NOTHROW (gfor_fndecl_adjustr) = 1;
2914 gfor_fndecl_select_string = gfc_build_library_function_decl_with_spec (
2915 get_identifier (PREFIX("select_string")), ".R.R.",
2916 integer_type_node, 4, pvoid_type_node, integer_type_node,
2917 pchar1_type_node, gfc_charlen_type_node);
2918 DECL_PURE_P (gfor_fndecl_select_string) = 1;
2919 TREE_NOTHROW (gfor_fndecl_select_string) = 1;
2921 gfor_fndecl_compare_string_char4 = gfc_build_library_function_decl_with_spec (
2922 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2923 integer_type_node, 4, gfc_charlen_type_node, pchar4_type_node,
2924 gfc_charlen_type_node, pchar4_type_node);
2925 DECL_PURE_P (gfor_fndecl_compare_string_char4) = 1;
2926 TREE_NOTHROW (gfor_fndecl_compare_string_char4) = 1;
2928 gfor_fndecl_concat_string_char4 = gfc_build_library_function_decl_with_spec (
2929 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2930 void_type_node, 6, gfc_charlen_type_node, pchar4_type_node,
2931 gfc_charlen_type_node, pchar4_type_node, gfc_charlen_type_node,
2932 pchar4_type_node);
2933 TREE_NOTHROW (gfor_fndecl_concat_string_char4) = 1;
2935 gfor_fndecl_string_len_trim_char4 = gfc_build_library_function_decl_with_spec (
2936 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2937 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar4_type_node);
2938 DECL_PURE_P (gfor_fndecl_string_len_trim_char4) = 1;
2939 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4) = 1;
2941 gfor_fndecl_string_index_char4 = gfc_build_library_function_decl_with_spec (
2942 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2943 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2944 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2945 DECL_PURE_P (gfor_fndecl_string_index_char4) = 1;
2946 TREE_NOTHROW (gfor_fndecl_string_index_char4) = 1;
2948 gfor_fndecl_string_scan_char4 = gfc_build_library_function_decl_with_spec (
2949 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2950 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2951 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2952 DECL_PURE_P (gfor_fndecl_string_scan_char4) = 1;
2953 TREE_NOTHROW (gfor_fndecl_string_scan_char4) = 1;
2955 gfor_fndecl_string_verify_char4 = gfc_build_library_function_decl_with_spec (
2956 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2957 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2958 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2959 DECL_PURE_P (gfor_fndecl_string_verify_char4) = 1;
2960 TREE_NOTHROW (gfor_fndecl_string_verify_char4) = 1;
2962 gfor_fndecl_string_trim_char4 = gfc_build_library_function_decl_with_spec (
2963 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2964 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2965 build_pointer_type (pchar4_type_node), gfc_charlen_type_node,
2966 pchar4_type_node);
2968 gfor_fndecl_string_minmax_char4 = gfc_build_library_function_decl_with_spec (
2969 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2970 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2971 build_pointer_type (pchar4_type_node), integer_type_node,
2972 integer_type_node);
2974 gfor_fndecl_adjustl_char4 = gfc_build_library_function_decl_with_spec (
2975 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2976 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2977 pchar4_type_node);
2978 TREE_NOTHROW (gfor_fndecl_adjustl_char4) = 1;
2980 gfor_fndecl_adjustr_char4 = gfc_build_library_function_decl_with_spec (
2981 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2982 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2983 pchar4_type_node);
2984 TREE_NOTHROW (gfor_fndecl_adjustr_char4) = 1;
2986 gfor_fndecl_select_string_char4 = gfc_build_library_function_decl_with_spec (
2987 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2988 integer_type_node, 4, pvoid_type_node, integer_type_node,
2989 pvoid_type_node, gfc_charlen_type_node);
2990 DECL_PURE_P (gfor_fndecl_select_string_char4) = 1;
2991 TREE_NOTHROW (gfor_fndecl_select_string_char4) = 1;
2994 /* Conversion between character kinds. */
2996 gfor_fndecl_convert_char1_to_char4 = gfc_build_library_function_decl_with_spec (
2997 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2998 void_type_node, 3, build_pointer_type (pchar4_type_node),
2999 gfc_charlen_type_node, pchar1_type_node);
3001 gfor_fndecl_convert_char4_to_char1 = gfc_build_library_function_decl_with_spec (
3002 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
3003 void_type_node, 3, build_pointer_type (pchar1_type_node),
3004 gfc_charlen_type_node, pchar4_type_node);
3006 /* Misc. functions. */
3008 gfor_fndecl_ttynam = gfc_build_library_function_decl_with_spec (
3009 get_identifier (PREFIX("ttynam")), ".W",
3010 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
3011 integer_type_node);
3013 gfor_fndecl_fdate = gfc_build_library_function_decl_with_spec (
3014 get_identifier (PREFIX("fdate")), ".W",
3015 void_type_node, 2, pchar_type_node, gfc_charlen_type_node);
3017 gfor_fndecl_ctime = gfc_build_library_function_decl_with_spec (
3018 get_identifier (PREFIX("ctime")), ".W",
3019 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
3020 gfc_int8_type_node);
3022 gfor_fndecl_sc_kind = gfc_build_library_function_decl_with_spec (
3023 get_identifier (PREFIX("selected_char_kind")), "..R",
3024 gfc_int4_type_node, 2, gfc_charlen_type_node, pchar_type_node);
3025 DECL_PURE_P (gfor_fndecl_sc_kind) = 1;
3026 TREE_NOTHROW (gfor_fndecl_sc_kind) = 1;
3028 gfor_fndecl_si_kind = gfc_build_library_function_decl_with_spec (
3029 get_identifier (PREFIX("selected_int_kind")), ".R",
3030 gfc_int4_type_node, 1, pvoid_type_node);
3031 DECL_PURE_P (gfor_fndecl_si_kind) = 1;
3032 TREE_NOTHROW (gfor_fndecl_si_kind) = 1;
3034 gfor_fndecl_sr_kind = gfc_build_library_function_decl_with_spec (
3035 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
3036 gfc_int4_type_node, 3, pvoid_type_node, pvoid_type_node,
3037 pvoid_type_node);
3038 DECL_PURE_P (gfor_fndecl_sr_kind) = 1;
3039 TREE_NOTHROW (gfor_fndecl_sr_kind) = 1;
3041 gfor_fndecl_system_clock4 = gfc_build_library_function_decl (
3042 get_identifier (PREFIX("system_clock_4")),
3043 void_type_node, 3, gfc_pint4_type_node, gfc_pint4_type_node,
3044 gfc_pint4_type_node);
3046 gfor_fndecl_system_clock8 = gfc_build_library_function_decl (
3047 get_identifier (PREFIX("system_clock_8")),
3048 void_type_node, 3, gfc_pint8_type_node, gfc_pint8_type_node,
3049 gfc_pint8_type_node);
3051 /* Power functions. */
3053 tree ctype, rtype, itype, jtype;
3054 int rkind, ikind, jkind;
3055 #define NIKINDS 3
3056 #define NRKINDS 4
3057 static int ikinds[NIKINDS] = {4, 8, 16};
3058 static int rkinds[NRKINDS] = {4, 8, 10, 16};
3059 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
3061 for (ikind=0; ikind < NIKINDS; ikind++)
3063 itype = gfc_get_int_type (ikinds[ikind]);
3065 for (jkind=0; jkind < NIKINDS; jkind++)
3067 jtype = gfc_get_int_type (ikinds[jkind]);
3068 if (itype && jtype)
3070 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
3071 ikinds[jkind]);
3072 gfor_fndecl_math_powi[jkind][ikind].integer =
3073 gfc_build_library_function_decl (get_identifier (name),
3074 jtype, 2, jtype, itype);
3075 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
3076 TREE_NOTHROW (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
3080 for (rkind = 0; rkind < NRKINDS; rkind ++)
3082 rtype = gfc_get_real_type (rkinds[rkind]);
3083 if (rtype && itype)
3085 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
3086 ikinds[ikind]);
3087 gfor_fndecl_math_powi[rkind][ikind].real =
3088 gfc_build_library_function_decl (get_identifier (name),
3089 rtype, 2, rtype, itype);
3090 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
3091 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
3094 ctype = gfc_get_complex_type (rkinds[rkind]);
3095 if (ctype && itype)
3097 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
3098 ikinds[ikind]);
3099 gfor_fndecl_math_powi[rkind][ikind].cmplx =
3100 gfc_build_library_function_decl (get_identifier (name),
3101 ctype, 2,ctype, itype);
3102 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
3103 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
3107 #undef NIKINDS
3108 #undef NRKINDS
3111 gfor_fndecl_math_ishftc4 = gfc_build_library_function_decl (
3112 get_identifier (PREFIX("ishftc4")),
3113 gfc_int4_type_node, 3, gfc_int4_type_node, gfc_int4_type_node,
3114 gfc_int4_type_node);
3115 TREE_READONLY (gfor_fndecl_math_ishftc4) = 1;
3116 TREE_NOTHROW (gfor_fndecl_math_ishftc4) = 1;
3118 gfor_fndecl_math_ishftc8 = gfc_build_library_function_decl (
3119 get_identifier (PREFIX("ishftc8")),
3120 gfc_int8_type_node, 3, gfc_int8_type_node, gfc_int4_type_node,
3121 gfc_int4_type_node);
3122 TREE_READONLY (gfor_fndecl_math_ishftc8) = 1;
3123 TREE_NOTHROW (gfor_fndecl_math_ishftc8) = 1;
3125 if (gfc_int16_type_node)
3127 gfor_fndecl_math_ishftc16 = gfc_build_library_function_decl (
3128 get_identifier (PREFIX("ishftc16")),
3129 gfc_int16_type_node, 3, gfc_int16_type_node, gfc_int4_type_node,
3130 gfc_int4_type_node);
3131 TREE_READONLY (gfor_fndecl_math_ishftc16) = 1;
3132 TREE_NOTHROW (gfor_fndecl_math_ishftc16) = 1;
3135 /* BLAS functions. */
3137 tree pint = build_pointer_type (integer_type_node);
3138 tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
3139 tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
3140 tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
3141 tree pz = build_pointer_type
3142 (gfc_get_complex_type (gfc_default_double_kind));
3144 gfor_fndecl_sgemm = gfc_build_library_function_decl
3145 (get_identifier
3146 (gfc_option.flag_underscoring ? "sgemm_"
3147 : "sgemm"),
3148 void_type_node, 15, pchar_type_node,
3149 pchar_type_node, pint, pint, pint, ps, ps, pint,
3150 ps, pint, ps, ps, pint, integer_type_node,
3151 integer_type_node);
3152 gfor_fndecl_dgemm = gfc_build_library_function_decl
3153 (get_identifier
3154 (gfc_option.flag_underscoring ? "dgemm_"
3155 : "dgemm"),
3156 void_type_node, 15, pchar_type_node,
3157 pchar_type_node, pint, pint, pint, pd, pd, pint,
3158 pd, pint, pd, pd, pint, integer_type_node,
3159 integer_type_node);
3160 gfor_fndecl_cgemm = gfc_build_library_function_decl
3161 (get_identifier
3162 (gfc_option.flag_underscoring ? "cgemm_"
3163 : "cgemm"),
3164 void_type_node, 15, pchar_type_node,
3165 pchar_type_node, pint, pint, pint, pc, pc, pint,
3166 pc, pint, pc, pc, pint, integer_type_node,
3167 integer_type_node);
3168 gfor_fndecl_zgemm = gfc_build_library_function_decl
3169 (get_identifier
3170 (gfc_option.flag_underscoring ? "zgemm_"
3171 : "zgemm"),
3172 void_type_node, 15, pchar_type_node,
3173 pchar_type_node, pint, pint, pint, pz, pz, pint,
3174 pz, pint, pz, pz, pint, integer_type_node,
3175 integer_type_node);
3178 /* Other functions. */
3179 gfor_fndecl_size0 = gfc_build_library_function_decl_with_spec (
3180 get_identifier (PREFIX("size0")), ".R",
3181 gfc_array_index_type, 1, pvoid_type_node);
3182 DECL_PURE_P (gfor_fndecl_size0) = 1;
3183 TREE_NOTHROW (gfor_fndecl_size0) = 1;
3185 gfor_fndecl_size1 = gfc_build_library_function_decl_with_spec (
3186 get_identifier (PREFIX("size1")), ".R",
3187 gfc_array_index_type, 2, pvoid_type_node, gfc_array_index_type);
3188 DECL_PURE_P (gfor_fndecl_size1) = 1;
3189 TREE_NOTHROW (gfor_fndecl_size1) = 1;
3191 gfor_fndecl_iargc = gfc_build_library_function_decl (
3192 get_identifier (PREFIX ("iargc")), gfc_int4_type_node, 0);
3193 TREE_NOTHROW (gfor_fndecl_iargc) = 1;
3197 /* Make prototypes for runtime library functions. */
3199 void
3200 gfc_build_builtin_function_decls (void)
3202 tree gfc_int4_type_node = gfc_get_int_type (4);
3204 gfor_fndecl_stop_numeric = gfc_build_library_function_decl (
3205 get_identifier (PREFIX("stop_numeric")),
3206 void_type_node, 1, gfc_int4_type_node);
3207 /* STOP doesn't return. */
3208 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
3210 gfor_fndecl_stop_numeric_f08 = gfc_build_library_function_decl (
3211 get_identifier (PREFIX("stop_numeric_f08")),
3212 void_type_node, 1, gfc_int4_type_node);
3213 /* STOP doesn't return. */
3214 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08) = 1;
3216 gfor_fndecl_stop_string = gfc_build_library_function_decl_with_spec (
3217 get_identifier (PREFIX("stop_string")), ".R.",
3218 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3219 /* STOP doesn't return. */
3220 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
3222 gfor_fndecl_error_stop_numeric = gfc_build_library_function_decl (
3223 get_identifier (PREFIX("error_stop_numeric")),
3224 void_type_node, 1, gfc_int4_type_node);
3225 /* ERROR STOP doesn't return. */
3226 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric) = 1;
3228 gfor_fndecl_error_stop_string = gfc_build_library_function_decl_with_spec (
3229 get_identifier (PREFIX("error_stop_string")), ".R.",
3230 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3231 /* ERROR STOP doesn't return. */
3232 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string) = 1;
3234 gfor_fndecl_pause_numeric = gfc_build_library_function_decl (
3235 get_identifier (PREFIX("pause_numeric")),
3236 void_type_node, 1, gfc_int4_type_node);
3238 gfor_fndecl_pause_string = gfc_build_library_function_decl_with_spec (
3239 get_identifier (PREFIX("pause_string")), ".R.",
3240 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3242 gfor_fndecl_runtime_error = gfc_build_library_function_decl_with_spec (
3243 get_identifier (PREFIX("runtime_error")), ".R",
3244 void_type_node, -1, pchar_type_node);
3245 /* The runtime_error function does not return. */
3246 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
3248 gfor_fndecl_runtime_error_at = gfc_build_library_function_decl_with_spec (
3249 get_identifier (PREFIX("runtime_error_at")), ".RR",
3250 void_type_node, -2, pchar_type_node, pchar_type_node);
3251 /* The runtime_error_at function does not return. */
3252 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
3254 gfor_fndecl_runtime_warning_at = gfc_build_library_function_decl_with_spec (
3255 get_identifier (PREFIX("runtime_warning_at")), ".RR",
3256 void_type_node, -2, pchar_type_node, pchar_type_node);
3258 gfor_fndecl_generate_error = gfc_build_library_function_decl_with_spec (
3259 get_identifier (PREFIX("generate_error")), ".R.R",
3260 void_type_node, 3, pvoid_type_node, integer_type_node,
3261 pchar_type_node);
3263 gfor_fndecl_os_error = gfc_build_library_function_decl_with_spec (
3264 get_identifier (PREFIX("os_error")), ".R",
3265 void_type_node, 1, pchar_type_node);
3266 /* The runtime_error function does not return. */
3267 TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
3269 gfor_fndecl_set_args = gfc_build_library_function_decl (
3270 get_identifier (PREFIX("set_args")),
3271 void_type_node, 2, integer_type_node,
3272 build_pointer_type (pchar_type_node));
3274 gfor_fndecl_set_fpe = gfc_build_library_function_decl (
3275 get_identifier (PREFIX("set_fpe")),
3276 void_type_node, 1, integer_type_node);
3278 gfor_fndecl_ieee_procedure_entry = gfc_build_library_function_decl (
3279 get_identifier (PREFIX("ieee_procedure_entry")),
3280 void_type_node, 1, pvoid_type_node);
3282 gfor_fndecl_ieee_procedure_exit = gfc_build_library_function_decl (
3283 get_identifier (PREFIX("ieee_procedure_exit")),
3284 void_type_node, 1, pvoid_type_node);
3286 /* Keep the array dimension in sync with the call, later in this file. */
3287 gfor_fndecl_set_options = gfc_build_library_function_decl_with_spec (
3288 get_identifier (PREFIX("set_options")), "..R",
3289 void_type_node, 2, integer_type_node,
3290 build_pointer_type (integer_type_node));
3292 gfor_fndecl_set_convert = gfc_build_library_function_decl (
3293 get_identifier (PREFIX("set_convert")),
3294 void_type_node, 1, integer_type_node);
3296 gfor_fndecl_set_record_marker = gfc_build_library_function_decl (
3297 get_identifier (PREFIX("set_record_marker")),
3298 void_type_node, 1, integer_type_node);
3300 gfor_fndecl_set_max_subrecord_length = gfc_build_library_function_decl (
3301 get_identifier (PREFIX("set_max_subrecord_length")),
3302 void_type_node, 1, integer_type_node);
3304 gfor_fndecl_in_pack = gfc_build_library_function_decl_with_spec (
3305 get_identifier (PREFIX("internal_pack")), ".r",
3306 pvoid_type_node, 1, pvoid_type_node);
3308 gfor_fndecl_in_unpack = gfc_build_library_function_decl_with_spec (
3309 get_identifier (PREFIX("internal_unpack")), ".wR",
3310 void_type_node, 2, pvoid_type_node, pvoid_type_node);
3312 gfor_fndecl_associated = gfc_build_library_function_decl_with_spec (
3313 get_identifier (PREFIX("associated")), ".RR",
3314 integer_type_node, 2, ppvoid_type_node, ppvoid_type_node);
3315 DECL_PURE_P (gfor_fndecl_associated) = 1;
3316 TREE_NOTHROW (gfor_fndecl_associated) = 1;
3318 /* Coarray library calls. */
3319 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
3321 tree pint_type, pppchar_type;
3323 pint_type = build_pointer_type (integer_type_node);
3324 pppchar_type
3325 = build_pointer_type (build_pointer_type (pchar_type_node));
3327 gfor_fndecl_caf_init = gfc_build_library_function_decl (
3328 get_identifier (PREFIX("caf_init")), void_type_node,
3329 2, pint_type, pppchar_type);
3331 gfor_fndecl_caf_finalize = gfc_build_library_function_decl (
3332 get_identifier (PREFIX("caf_finalize")), void_type_node, 0);
3334 gfor_fndecl_caf_this_image = gfc_build_library_function_decl (
3335 get_identifier (PREFIX("caf_this_image")), integer_type_node,
3336 1, integer_type_node);
3338 gfor_fndecl_caf_num_images = gfc_build_library_function_decl (
3339 get_identifier (PREFIX("caf_num_images")), integer_type_node,
3340 2, integer_type_node, integer_type_node);
3342 gfor_fndecl_caf_register = gfc_build_library_function_decl_with_spec (
3343 get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node, 6,
3344 size_type_node, integer_type_node, ppvoid_type_node, pint_type,
3345 pchar_type_node, integer_type_node);
3347 gfor_fndecl_caf_deregister = gfc_build_library_function_decl_with_spec (
3348 get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node, 4,
3349 ppvoid_type_node, pint_type, pchar_type_node, integer_type_node);
3351 gfor_fndecl_caf_get = gfc_build_library_function_decl_with_spec (
3352 get_identifier (PREFIX("caf_get")), ".R.RRRW", void_type_node, 8,
3353 pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node,
3354 pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node);
3356 gfor_fndecl_caf_send = gfc_build_library_function_decl_with_spec (
3357 get_identifier (PREFIX("caf_send")), ".R.RRRR", void_type_node, 8,
3358 pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node,
3359 pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node);
3361 gfor_fndecl_caf_sendget = gfc_build_library_function_decl_with_spec (
3362 get_identifier (PREFIX("caf_sendget")), ".R.RRRR.RRR", void_type_node,
3363 12, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node,
3364 pvoid_type_node, pvoid_type_node, size_type_node, integer_type_node,
3365 pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node);
3367 gfor_fndecl_caf_critical = gfc_build_library_function_decl (
3368 get_identifier (PREFIX("caf_critical")), void_type_node, 0);
3370 gfor_fndecl_caf_end_critical = gfc_build_library_function_decl (
3371 get_identifier (PREFIX("caf_end_critical")), void_type_node, 0);
3373 gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
3374 get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node,
3375 3, pint_type, pchar_type_node, integer_type_node);
3377 gfor_fndecl_caf_sync_images = gfc_build_library_function_decl_with_spec (
3378 get_identifier (PREFIX("caf_sync_images")), ".RRWW", void_type_node,
3379 5, integer_type_node, pint_type, pint_type,
3380 pchar_type_node, integer_type_node);
3382 gfor_fndecl_caf_error_stop = gfc_build_library_function_decl (
3383 get_identifier (PREFIX("caf_error_stop")),
3384 void_type_node, 1, gfc_int4_type_node);
3385 /* CAF's ERROR STOP doesn't return. */
3386 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop) = 1;
3388 gfor_fndecl_caf_error_stop_str = gfc_build_library_function_decl_with_spec (
3389 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3390 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3391 /* CAF's ERROR STOP doesn't return. */
3392 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str) = 1;
3394 gfor_fndecl_co_max = gfc_build_library_function_decl_with_spec (
3395 get_identifier (PREFIX("caf_co_max")), "W.WW",
3396 void_type_node, 6, pvoid_type_node, integer_type_node,
3397 pint_type, pchar_type_node, integer_type_node, integer_type_node);
3399 gfor_fndecl_co_min = gfc_build_library_function_decl_with_spec (
3400 get_identifier (PREFIX("caf_co_min")), "W.WW",
3401 void_type_node, 6, pvoid_type_node, integer_type_node,
3402 pint_type, pchar_type_node, integer_type_node, integer_type_node);
3404 gfor_fndecl_co_sum = gfc_build_library_function_decl_with_spec (
3405 get_identifier (PREFIX("caf_co_sum")), "W.WW",
3406 void_type_node, 5, pvoid_type_node, integer_type_node,
3407 pint_type, pchar_type_node, integer_type_node);
3410 gfc_build_intrinsic_function_decls ();
3411 gfc_build_intrinsic_lib_fndecls ();
3412 gfc_build_io_library_fndecls ();
3416 /* Evaluate the length of dummy character variables. */
3418 static void
3419 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl,
3420 gfc_wrapped_block *block)
3422 stmtblock_t init;
3424 gfc_finish_decl (cl->backend_decl);
3426 gfc_start_block (&init);
3428 /* Evaluate the string length expression. */
3429 gfc_conv_string_length (cl, NULL, &init);
3431 gfc_trans_vla_type_sizes (sym, &init);
3433 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3437 /* Allocate and cleanup an automatic character variable. */
3439 static void
3440 gfc_trans_auto_character_variable (gfc_symbol * sym, gfc_wrapped_block * block)
3442 stmtblock_t init;
3443 tree decl;
3444 tree tmp;
3446 gcc_assert (sym->backend_decl);
3447 gcc_assert (sym->ts.u.cl && sym->ts.u.cl->length);
3449 gfc_init_block (&init);
3451 /* Evaluate the string length expression. */
3452 gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
3454 gfc_trans_vla_type_sizes (sym, &init);
3456 decl = sym->backend_decl;
3458 /* Emit a DECL_EXPR for this variable, which will cause the
3459 gimplifier to allocate storage, and all that good stuff. */
3460 tmp = fold_build1_loc (input_location, DECL_EXPR, TREE_TYPE (decl), decl);
3461 gfc_add_expr_to_block (&init, tmp);
3463 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3466 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3468 static void
3469 gfc_trans_assign_aux_var (gfc_symbol * sym, gfc_wrapped_block * block)
3471 stmtblock_t init;
3473 gcc_assert (sym->backend_decl);
3474 gfc_start_block (&init);
3476 /* Set the initial value to length. See the comments in
3477 function gfc_add_assign_aux_vars in this file. */
3478 gfc_add_modify (&init, GFC_DECL_STRING_LEN (sym->backend_decl),
3479 build_int_cst (gfc_charlen_type_node, -2));
3481 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3484 static void
3485 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
3487 tree t = *tp, var, val;
3489 if (t == NULL || t == error_mark_node)
3490 return;
3491 if (TREE_CONSTANT (t) || DECL_P (t))
3492 return;
3494 if (TREE_CODE (t) == SAVE_EXPR)
3496 if (SAVE_EXPR_RESOLVED_P (t))
3498 *tp = TREE_OPERAND (t, 0);
3499 return;
3501 val = TREE_OPERAND (t, 0);
3503 else
3504 val = t;
3506 var = gfc_create_var_np (TREE_TYPE (t), NULL);
3507 gfc_add_decl_to_function (var);
3508 gfc_add_modify (body, var, val);
3509 if (TREE_CODE (t) == SAVE_EXPR)
3510 TREE_OPERAND (t, 0) = var;
3511 *tp = var;
3514 static void
3515 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
3517 tree t;
3519 if (type == NULL || type == error_mark_node)
3520 return;
3522 type = TYPE_MAIN_VARIANT (type);
3524 if (TREE_CODE (type) == INTEGER_TYPE)
3526 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
3527 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
3529 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3531 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
3532 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
3535 else if (TREE_CODE (type) == ARRAY_TYPE)
3537 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
3538 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
3539 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
3540 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
3542 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3544 TYPE_SIZE (t) = TYPE_SIZE (type);
3545 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
3550 /* Make sure all type sizes and array domains are either constant,
3551 or variable or parameter decls. This is a simplified variant
3552 of gimplify_type_sizes, but we can't use it here, as none of the
3553 variables in the expressions have been gimplified yet.
3554 As type sizes and domains for various variable length arrays
3555 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3556 time, without this routine gimplify_type_sizes in the middle-end
3557 could result in the type sizes being gimplified earlier than where
3558 those variables are initialized. */
3560 void
3561 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
3563 tree type = TREE_TYPE (sym->backend_decl);
3565 if (TREE_CODE (type) == FUNCTION_TYPE
3566 && (sym->attr.function || sym->attr.result || sym->attr.entry))
3568 if (! current_fake_result_decl)
3569 return;
3571 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
3574 while (POINTER_TYPE_P (type))
3575 type = TREE_TYPE (type);
3577 if (GFC_DESCRIPTOR_TYPE_P (type))
3579 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
3581 while (POINTER_TYPE_P (etype))
3582 etype = TREE_TYPE (etype);
3584 gfc_trans_vla_type_sizes_1 (etype, body);
3587 gfc_trans_vla_type_sizes_1 (type, body);
3591 /* Initialize a derived type by building an lvalue from the symbol
3592 and using trans_assignment to do the work. Set dealloc to false
3593 if no deallocation prior the assignment is needed. */
3594 void
3595 gfc_init_default_dt (gfc_symbol * sym, stmtblock_t * block, bool dealloc)
3597 gfc_expr *e;
3598 tree tmp;
3599 tree present;
3601 gcc_assert (block);
3603 gcc_assert (!sym->attr.allocatable);
3604 gfc_set_sym_referenced (sym);
3605 e = gfc_lval_expr_from_sym (sym);
3606 tmp = gfc_trans_assignment (e, sym->value, false, dealloc);
3607 if (sym->attr.dummy && (sym->attr.optional
3608 || sym->ns->proc_name->attr.entry_master))
3610 present = gfc_conv_expr_present (sym);
3611 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
3612 tmp, build_empty_stmt (input_location));
3614 gfc_add_expr_to_block (block, tmp);
3615 gfc_free_expr (e);
3619 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3620 them their default initializer, if they do not have allocatable
3621 components, they have their allocatable components deallocated. */
3623 static void
3624 init_intent_out_dt (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3626 stmtblock_t init;
3627 gfc_formal_arglist *f;
3628 tree tmp;
3629 tree present;
3631 gfc_init_block (&init);
3632 for (f = gfc_sym_get_dummy_args (proc_sym); f; f = f->next)
3633 if (f->sym && f->sym->attr.intent == INTENT_OUT
3634 && !f->sym->attr.pointer
3635 && f->sym->ts.type == BT_DERIVED)
3637 tmp = NULL_TREE;
3639 /* Note: Allocatables are excluded as they are already handled
3640 by the caller. */
3641 if (!f->sym->attr.allocatable
3642 && gfc_is_finalizable (f->sym->ts.u.derived, NULL))
3644 stmtblock_t block;
3645 gfc_expr *e;
3647 gfc_init_block (&block);
3648 f->sym->attr.referenced = 1;
3649 e = gfc_lval_expr_from_sym (f->sym);
3650 gfc_add_finalizer_call (&block, e);
3651 gfc_free_expr (e);
3652 tmp = gfc_finish_block (&block);
3655 if (tmp == NULL_TREE && !f->sym->attr.allocatable
3656 && f->sym->ts.u.derived->attr.alloc_comp && !f->sym->value)
3657 tmp = gfc_deallocate_alloc_comp (f->sym->ts.u.derived,
3658 f->sym->backend_decl,
3659 f->sym->as ? f->sym->as->rank : 0);
3661 if (tmp != NULL_TREE && (f->sym->attr.optional
3662 || f->sym->ns->proc_name->attr.entry_master))
3664 present = gfc_conv_expr_present (f->sym);
3665 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3666 present, tmp, build_empty_stmt (input_location));
3669 if (tmp != NULL_TREE)
3670 gfc_add_expr_to_block (&init, tmp);
3671 else if (f->sym->value && !f->sym->attr.allocatable)
3672 gfc_init_default_dt (f->sym, &init, true);
3674 else if (f->sym && f->sym->attr.intent == INTENT_OUT
3675 && f->sym->ts.type == BT_CLASS
3676 && !CLASS_DATA (f->sym)->attr.class_pointer
3677 && !CLASS_DATA (f->sym)->attr.allocatable)
3679 stmtblock_t block;
3680 gfc_expr *e;
3682 gfc_init_block (&block);
3683 f->sym->attr.referenced = 1;
3684 e = gfc_lval_expr_from_sym (f->sym);
3685 gfc_add_finalizer_call (&block, e);
3686 gfc_free_expr (e);
3687 tmp = gfc_finish_block (&block);
3689 if (f->sym->attr.optional || f->sym->ns->proc_name->attr.entry_master)
3691 present = gfc_conv_expr_present (f->sym);
3692 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3693 present, tmp,
3694 build_empty_stmt (input_location));
3697 gfc_add_expr_to_block (&init, tmp);
3700 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3704 /* Generate function entry and exit code, and add it to the function body.
3705 This includes:
3706 Allocation and initialization of array variables.
3707 Allocation of character string variables.
3708 Initialization and possibly repacking of dummy arrays.
3709 Initialization of ASSIGN statement auxiliary variable.
3710 Initialization of ASSOCIATE names.
3711 Automatic deallocation. */
3713 void
3714 gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3716 locus loc;
3717 gfc_symbol *sym;
3718 gfc_formal_arglist *f;
3719 stmtblock_t tmpblock;
3720 bool seen_trans_deferred_array = false;
3721 tree tmp = NULL;
3722 gfc_expr *e;
3723 gfc_se se;
3724 stmtblock_t init;
3726 /* Deal with implicit return variables. Explicit return variables will
3727 already have been added. */
3728 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
3730 if (!current_fake_result_decl)
3732 gfc_entry_list *el = NULL;
3733 if (proc_sym->attr.entry_master)
3735 for (el = proc_sym->ns->entries; el; el = el->next)
3736 if (el->sym != el->sym->result)
3737 break;
3739 /* TODO: move to the appropriate place in resolve.c. */
3740 if (warn_return_type && el == NULL)
3741 gfc_warning ("Return value of function '%s' at %L not set",
3742 proc_sym->name, &proc_sym->declared_at);
3744 else if (proc_sym->as)
3746 tree result = TREE_VALUE (current_fake_result_decl);
3747 gfc_trans_dummy_array_bias (proc_sym, result, block);
3749 /* An automatic character length, pointer array result. */
3750 if (proc_sym->ts.type == BT_CHARACTER
3751 && TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3752 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3754 else if (proc_sym->ts.type == BT_CHARACTER)
3756 if (proc_sym->ts.deferred)
3758 tmp = NULL;
3759 gfc_save_backend_locus (&loc);
3760 gfc_set_backend_locus (&proc_sym->declared_at);
3761 gfc_start_block (&init);
3762 /* Zero the string length on entry. */
3763 gfc_add_modify (&init, proc_sym->ts.u.cl->backend_decl,
3764 build_int_cst (gfc_charlen_type_node, 0));
3765 /* Null the pointer. */
3766 e = gfc_lval_expr_from_sym (proc_sym);
3767 gfc_init_se (&se, NULL);
3768 se.want_pointer = 1;
3769 gfc_conv_expr (&se, e);
3770 gfc_free_expr (e);
3771 tmp = se.expr;
3772 gfc_add_modify (&init, tmp,
3773 fold_convert (TREE_TYPE (se.expr),
3774 null_pointer_node));
3775 gfc_restore_backend_locus (&loc);
3777 /* Pass back the string length on exit. */
3778 tmp = proc_sym->ts.u.cl->passed_length;
3779 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3780 tmp = fold_convert (gfc_charlen_type_node, tmp);
3781 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3782 gfc_charlen_type_node, tmp,
3783 proc_sym->ts.u.cl->backend_decl);
3784 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3786 else if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3787 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3789 else
3790 gcc_assert (gfc_option.flag_f2c
3791 && proc_sym->ts.type == BT_COMPLEX);
3794 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3795 should be done here so that the offsets and lbounds of arrays
3796 are available. */
3797 gfc_save_backend_locus (&loc);
3798 gfc_set_backend_locus (&proc_sym->declared_at);
3799 init_intent_out_dt (proc_sym, block);
3800 gfc_restore_backend_locus (&loc);
3802 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
3804 bool alloc_comp_or_fini = (sym->ts.type == BT_DERIVED)
3805 && (sym->ts.u.derived->attr.alloc_comp
3806 || gfc_is_finalizable (sym->ts.u.derived,
3807 NULL));
3808 if (sym->assoc)
3809 continue;
3811 if (sym->attr.subref_array_pointer
3812 && GFC_DECL_SPAN (sym->backend_decl)
3813 && !TREE_STATIC (GFC_DECL_SPAN (sym->backend_decl)))
3815 gfc_init_block (&tmpblock);
3816 gfc_add_modify (&tmpblock, GFC_DECL_SPAN (sym->backend_decl),
3817 build_int_cst (gfc_array_index_type, 0));
3818 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3819 NULL_TREE);
3822 if (sym->ts.type == BT_CLASS
3823 && (sym->attr.save || gfc_option.flag_max_stack_var_size == 0)
3824 && CLASS_DATA (sym)->attr.allocatable)
3826 tree vptr;
3828 if (UNLIMITED_POLY (sym))
3829 vptr = null_pointer_node;
3830 else
3832 gfc_symbol *vsym;
3833 vsym = gfc_find_derived_vtab (sym->ts.u.derived);
3834 vptr = gfc_get_symbol_decl (vsym);
3835 vptr = gfc_build_addr_expr (NULL, vptr);
3838 if (CLASS_DATA (sym)->attr.dimension
3839 || (CLASS_DATA (sym)->attr.codimension
3840 && gfc_option.coarray != GFC_FCOARRAY_LIB))
3842 tmp = gfc_class_data_get (sym->backend_decl);
3843 tmp = gfc_build_null_descriptor (TREE_TYPE (tmp));
3845 else
3846 tmp = null_pointer_node;
3848 DECL_INITIAL (sym->backend_decl)
3849 = gfc_class_set_static_fields (sym->backend_decl, vptr, tmp);
3850 TREE_CONSTANT (DECL_INITIAL (sym->backend_decl)) = 1;
3852 else if (sym->attr.dimension || sym->attr.codimension)
3854 /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT. */
3855 array_type tmp = sym->as->type;
3856 if (tmp == AS_ASSUMED_SIZE && sym->as->cp_was_assumed)
3857 tmp = AS_EXPLICIT;
3858 switch (tmp)
3860 case AS_EXPLICIT:
3861 if (sym->attr.dummy || sym->attr.result)
3862 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3863 else if (sym->attr.pointer || sym->attr.allocatable)
3865 if (TREE_STATIC (sym->backend_decl))
3867 gfc_save_backend_locus (&loc);
3868 gfc_set_backend_locus (&sym->declared_at);
3869 gfc_trans_static_array_pointer (sym);
3870 gfc_restore_backend_locus (&loc);
3872 else
3874 seen_trans_deferred_array = true;
3875 gfc_trans_deferred_array (sym, block);
3878 else if (sym->attr.codimension && TREE_STATIC (sym->backend_decl))
3880 gfc_init_block (&tmpblock);
3881 gfc_trans_array_cobounds (TREE_TYPE (sym->backend_decl),
3882 &tmpblock, sym);
3883 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3884 NULL_TREE);
3885 continue;
3887 else
3889 gfc_save_backend_locus (&loc);
3890 gfc_set_backend_locus (&sym->declared_at);
3892 if (alloc_comp_or_fini)
3894 seen_trans_deferred_array = true;
3895 gfc_trans_deferred_array (sym, block);
3897 else if (sym->ts.type == BT_DERIVED
3898 && sym->value
3899 && !sym->attr.data
3900 && sym->attr.save == SAVE_NONE)
3902 gfc_start_block (&tmpblock);
3903 gfc_init_default_dt (sym, &tmpblock, false);
3904 gfc_add_init_cleanup (block,
3905 gfc_finish_block (&tmpblock),
3906 NULL_TREE);
3909 gfc_trans_auto_array_allocation (sym->backend_decl,
3910 sym, block);
3911 gfc_restore_backend_locus (&loc);
3913 break;
3915 case AS_ASSUMED_SIZE:
3916 /* Must be a dummy parameter. */
3917 gcc_assert (sym->attr.dummy || sym->as->cp_was_assumed);
3919 /* We should always pass assumed size arrays the g77 way. */
3920 if (sym->attr.dummy)
3921 gfc_trans_g77_array (sym, block);
3922 break;
3924 case AS_ASSUMED_SHAPE:
3925 /* Must be a dummy parameter. */
3926 gcc_assert (sym->attr.dummy);
3928 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3929 break;
3931 case AS_ASSUMED_RANK:
3932 case AS_DEFERRED:
3933 seen_trans_deferred_array = true;
3934 gfc_trans_deferred_array (sym, block);
3935 break;
3937 default:
3938 gcc_unreachable ();
3940 if (alloc_comp_or_fini && !seen_trans_deferred_array)
3941 gfc_trans_deferred_array (sym, block);
3943 else if ((!sym->attr.dummy || sym->ts.deferred)
3944 && (sym->ts.type == BT_CLASS
3945 && CLASS_DATA (sym)->attr.class_pointer))
3946 continue;
3947 else if ((!sym->attr.dummy || sym->ts.deferred)
3948 && (sym->attr.allocatable
3949 || (sym->ts.type == BT_CLASS
3950 && CLASS_DATA (sym)->attr.allocatable)))
3952 if (!sym->attr.save && gfc_option.flag_max_stack_var_size != 0)
3954 tree descriptor = NULL_TREE;
3956 /* Nullify and automatic deallocation of allocatable
3957 scalars. */
3958 e = gfc_lval_expr_from_sym (sym);
3959 if (sym->ts.type == BT_CLASS)
3960 gfc_add_data_component (e);
3962 gfc_init_se (&se, NULL);
3963 if (sym->ts.type != BT_CLASS
3964 || sym->ts.u.derived->attr.dimension
3965 || sym->ts.u.derived->attr.codimension)
3967 se.want_pointer = 1;
3968 gfc_conv_expr (&se, e);
3970 else if (sym->ts.type == BT_CLASS
3971 && !CLASS_DATA (sym)->attr.dimension
3972 && !CLASS_DATA (sym)->attr.codimension)
3974 se.want_pointer = 1;
3975 gfc_conv_expr (&se, e);
3977 else
3979 gfc_conv_expr (&se, e);
3980 descriptor = se.expr;
3981 se.expr = gfc_conv_descriptor_data_addr (se.expr);
3982 se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
3984 gfc_free_expr (e);
3986 gfc_save_backend_locus (&loc);
3987 gfc_set_backend_locus (&sym->declared_at);
3988 gfc_start_block (&init);
3990 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3992 /* Nullify when entering the scope. */
3993 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3994 TREE_TYPE (se.expr), se.expr,
3995 fold_convert (TREE_TYPE (se.expr),
3996 null_pointer_node));
3997 if (sym->attr.optional)
3999 tree present = gfc_conv_expr_present (sym);
4000 tmp = build3_loc (input_location, COND_EXPR,
4001 void_type_node, present, tmp,
4002 build_empty_stmt (input_location));
4004 gfc_add_expr_to_block (&init, tmp);
4007 if ((sym->attr.dummy || sym->attr.result)
4008 && sym->ts.type == BT_CHARACTER
4009 && sym->ts.deferred)
4011 /* Character length passed by reference. */
4012 tmp = sym->ts.u.cl->passed_length;
4013 tmp = build_fold_indirect_ref_loc (input_location, tmp);
4014 tmp = fold_convert (gfc_charlen_type_node, tmp);
4016 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
4017 /* Zero the string length when entering the scope. */
4018 gfc_add_modify (&init, sym->ts.u.cl->backend_decl,
4019 build_int_cst (gfc_charlen_type_node, 0));
4020 else
4022 tree tmp2;
4024 tmp2 = fold_build2_loc (input_location, MODIFY_EXPR,
4025 gfc_charlen_type_node,
4026 sym->ts.u.cl->backend_decl, tmp);
4027 if (sym->attr.optional)
4029 tree present = gfc_conv_expr_present (sym);
4030 tmp2 = build3_loc (input_location, COND_EXPR,
4031 void_type_node, present, tmp2,
4032 build_empty_stmt (input_location));
4034 gfc_add_expr_to_block (&init, tmp2);
4037 gfc_restore_backend_locus (&loc);
4039 /* Pass the final character length back. */
4040 if (sym->attr.intent != INTENT_IN)
4042 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
4043 gfc_charlen_type_node, tmp,
4044 sym->ts.u.cl->backend_decl);
4045 if (sym->attr.optional)
4047 tree present = gfc_conv_expr_present (sym);
4048 tmp = build3_loc (input_location, COND_EXPR,
4049 void_type_node, present, tmp,
4050 build_empty_stmt (input_location));
4053 else
4054 tmp = NULL_TREE;
4056 else
4057 gfc_restore_backend_locus (&loc);
4059 /* Deallocate when leaving the scope. Nullifying is not
4060 needed. */
4061 if (!sym->attr.result && !sym->attr.dummy
4062 && !sym->ns->proc_name->attr.is_main_program)
4064 if (sym->ts.type == BT_CLASS
4065 && CLASS_DATA (sym)->attr.codimension)
4066 tmp = gfc_deallocate_with_status (descriptor, NULL_TREE,
4067 NULL_TREE, NULL_TREE,
4068 NULL_TREE, true, NULL,
4069 true);
4070 else
4072 gfc_expr *expr = gfc_lval_expr_from_sym (sym);
4073 tmp = gfc_deallocate_scalar_with_status (se.expr, NULL_TREE,
4074 true, expr, sym->ts);
4075 gfc_free_expr (expr);
4078 if (sym->ts.type == BT_CLASS)
4080 /* Initialize _vptr to declared type. */
4081 gfc_symbol *vtab;
4082 tree rhs;
4084 gfc_save_backend_locus (&loc);
4085 gfc_set_backend_locus (&sym->declared_at);
4086 e = gfc_lval_expr_from_sym (sym);
4087 gfc_add_vptr_component (e);
4088 gfc_init_se (&se, NULL);
4089 se.want_pointer = 1;
4090 gfc_conv_expr (&se, e);
4091 gfc_free_expr (e);
4092 if (UNLIMITED_POLY (sym))
4093 rhs = build_int_cst (TREE_TYPE (se.expr), 0);
4094 else
4096 vtab = gfc_find_derived_vtab (sym->ts.u.derived);
4097 rhs = gfc_build_addr_expr (TREE_TYPE (se.expr),
4098 gfc_get_symbol_decl (vtab));
4100 gfc_add_modify (&init, se.expr, rhs);
4101 gfc_restore_backend_locus (&loc);
4104 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
4107 else if (sym->ts.type == BT_CHARACTER && sym->ts.deferred)
4109 tree tmp = NULL;
4110 stmtblock_t init;
4112 /* If we get to here, all that should be left are pointers. */
4113 gcc_assert (sym->attr.pointer);
4115 if (sym->attr.dummy)
4117 gfc_start_block (&init);
4119 /* Character length passed by reference. */
4120 tmp = sym->ts.u.cl->passed_length;
4121 tmp = build_fold_indirect_ref_loc (input_location, tmp);
4122 tmp = fold_convert (gfc_charlen_type_node, tmp);
4123 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
4124 /* Pass the final character length back. */
4125 if (sym->attr.intent != INTENT_IN)
4126 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
4127 gfc_charlen_type_node, tmp,
4128 sym->ts.u.cl->backend_decl);
4129 else
4130 tmp = NULL_TREE;
4131 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
4134 else if (sym->ts.deferred)
4135 gfc_fatal_error ("Deferred type parameter not yet supported");
4136 else if (alloc_comp_or_fini)
4137 gfc_trans_deferred_array (sym, block);
4138 else if (sym->ts.type == BT_CHARACTER)
4140 gfc_save_backend_locus (&loc);
4141 gfc_set_backend_locus (&sym->declared_at);
4142 if (sym->attr.dummy || sym->attr.result)
4143 gfc_trans_dummy_character (sym, sym->ts.u.cl, block);
4144 else
4145 gfc_trans_auto_character_variable (sym, block);
4146 gfc_restore_backend_locus (&loc);
4148 else if (sym->attr.assign)
4150 gfc_save_backend_locus (&loc);
4151 gfc_set_backend_locus (&sym->declared_at);
4152 gfc_trans_assign_aux_var (sym, block);
4153 gfc_restore_backend_locus (&loc);
4155 else if (sym->ts.type == BT_DERIVED
4156 && sym->value
4157 && !sym->attr.data
4158 && sym->attr.save == SAVE_NONE)
4160 gfc_start_block (&tmpblock);
4161 gfc_init_default_dt (sym, &tmpblock, false);
4162 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
4163 NULL_TREE);
4165 else if (!(UNLIMITED_POLY(sym)))
4166 gcc_unreachable ();
4169 gfc_init_block (&tmpblock);
4171 for (f = gfc_sym_get_dummy_args (proc_sym); f; f = f->next)
4173 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
4175 gcc_assert (f->sym->ts.u.cl->backend_decl != NULL);
4176 if (TREE_CODE (f->sym->ts.u.cl->backend_decl) == PARM_DECL)
4177 gfc_trans_vla_type_sizes (f->sym, &tmpblock);
4181 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
4182 && current_fake_result_decl != NULL)
4184 gcc_assert (proc_sym->ts.u.cl->backend_decl != NULL);
4185 if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == PARM_DECL)
4186 gfc_trans_vla_type_sizes (proc_sym, &tmpblock);
4189 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE);
4192 static GTY ((param_is (struct module_htab_entry))) htab_t module_htab;
4194 /* Hash and equality functions for module_htab. */
4196 static hashval_t
4197 module_htab_do_hash (const void *x)
4199 return htab_hash_string (((const struct module_htab_entry *)x)->name);
4202 static int
4203 module_htab_eq (const void *x1, const void *x2)
4205 return strcmp ((((const struct module_htab_entry *)x1)->name),
4206 (const char *)x2) == 0;
4209 /* Hash and equality functions for module_htab's decls. */
4211 static hashval_t
4212 module_htab_decls_hash (const void *x)
4214 const_tree t = (const_tree) x;
4215 const_tree n = DECL_NAME (t);
4216 if (n == NULL_TREE)
4217 n = TYPE_NAME (TREE_TYPE (t));
4218 return htab_hash_string (IDENTIFIER_POINTER (n));
4221 static int
4222 module_htab_decls_eq (const void *x1, const void *x2)
4224 const_tree t1 = (const_tree) x1;
4225 const_tree n1 = DECL_NAME (t1);
4226 if (n1 == NULL_TREE)
4227 n1 = TYPE_NAME (TREE_TYPE (t1));
4228 return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0;
4231 struct module_htab_entry *
4232 gfc_find_module (const char *name)
4234 void **slot;
4236 if (! module_htab)
4237 module_htab = htab_create_ggc (10, module_htab_do_hash,
4238 module_htab_eq, NULL);
4240 slot = htab_find_slot_with_hash (module_htab, name,
4241 htab_hash_string (name), INSERT);
4242 if (*slot == NULL)
4244 module_htab_entry *entry = ggc_cleared_alloc<module_htab_entry> ();
4246 entry->name = gfc_get_string (name);
4247 entry->decls = htab_create_ggc (10, module_htab_decls_hash,
4248 module_htab_decls_eq, NULL);
4249 *slot = (void *) entry;
4251 return (struct module_htab_entry *) *slot;
4254 void
4255 gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
4257 void **slot;
4258 const char *name;
4260 if (DECL_NAME (decl))
4261 name = IDENTIFIER_POINTER (DECL_NAME (decl));
4262 else
4264 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
4265 name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
4267 slot = htab_find_slot_with_hash (entry->decls, name,
4268 htab_hash_string (name), INSERT);
4269 if (*slot == NULL)
4270 *slot = (void *) decl;
4273 static struct module_htab_entry *cur_module;
4276 /* Generate debugging symbols for namelists. This function must come after
4277 generate_local_decl to ensure that the variables in the namelist are
4278 already declared. */
4280 static tree
4281 generate_namelist_decl (gfc_symbol * sym)
4283 gfc_namelist *nml;
4284 tree decl;
4285 vec<constructor_elt, va_gc> *nml_decls = NULL;
4287 gcc_assert (sym->attr.flavor == FL_NAMELIST);
4288 for (nml = sym->namelist; nml; nml = nml->next)
4290 if (nml->sym->backend_decl == NULL_TREE)
4292 nml->sym->attr.referenced = 1;
4293 nml->sym->backend_decl = gfc_get_symbol_decl (nml->sym);
4295 DECL_IGNORED_P (nml->sym->backend_decl) = 0;
4296 CONSTRUCTOR_APPEND_ELT (nml_decls, NULL_TREE, nml->sym->backend_decl);
4299 decl = make_node (NAMELIST_DECL);
4300 TREE_TYPE (decl) = void_type_node;
4301 NAMELIST_DECL_ASSOCIATED_DECL (decl) = build_constructor (NULL_TREE, nml_decls);
4302 DECL_NAME (decl) = get_identifier (sym->name);
4303 return decl;
4307 /* Output an initialized decl for a module variable. */
4309 static void
4310 gfc_create_module_variable (gfc_symbol * sym)
4312 tree decl;
4314 /* Module functions with alternate entries are dealt with later and
4315 would get caught by the next condition. */
4316 if (sym->attr.entry)
4317 return;
4319 /* Make sure we convert the types of the derived types from iso_c_binding
4320 into (void *). */
4321 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
4322 && sym->ts.type == BT_DERIVED)
4323 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
4325 if (sym->attr.flavor == FL_DERIVED
4326 && sym->backend_decl
4327 && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
4329 decl = sym->backend_decl;
4330 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
4332 if (!sym->attr.use_assoc)
4334 gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
4335 || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
4336 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
4337 || DECL_CONTEXT (TYPE_STUB_DECL (decl))
4338 == sym->ns->proc_name->backend_decl);
4340 TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4341 DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
4342 gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
4345 /* Only output variables, procedure pointers and array valued,
4346 or derived type, parameters. */
4347 if (sym->attr.flavor != FL_VARIABLE
4348 && !(sym->attr.flavor == FL_PARAMETER
4349 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
4350 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
4351 return;
4353 if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
4355 decl = sym->backend_decl;
4356 gcc_assert (DECL_FILE_SCOPE_P (decl));
4357 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
4358 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4359 gfc_module_add_decl (cur_module, decl);
4362 /* Don't generate variables from other modules. Variables from
4363 COMMONs and Cray pointees will already have been generated. */
4364 if (sym->attr.use_assoc || sym->attr.in_common || sym->attr.cray_pointee)
4365 return;
4367 /* Equivalenced variables arrive here after creation. */
4368 if (sym->backend_decl
4369 && (sym->equiv_built || sym->attr.in_equivalence))
4370 return;
4372 if (sym->backend_decl && !sym->attr.vtab && !sym->attr.target)
4373 internal_error ("backend decl for module variable %s already exists",
4374 sym->name);
4376 if (sym->module && !sym->attr.result && !sym->attr.dummy
4377 && (sym->attr.access == ACCESS_UNKNOWN
4378 && (sym->ns->default_access == ACCESS_PRIVATE
4379 || (sym->ns->default_access == ACCESS_UNKNOWN
4380 && gfc_option.flag_module_private))))
4381 sym->attr.access = ACCESS_PRIVATE;
4383 if (warn_unused_variable && !sym->attr.referenced
4384 && sym->attr.access == ACCESS_PRIVATE)
4385 gfc_warning ("Unused PRIVATE module variable '%s' declared at %L",
4386 sym->name, &sym->declared_at);
4388 /* We always want module variables to be created. */
4389 sym->attr.referenced = 1;
4390 /* Create the decl. */
4391 decl = gfc_get_symbol_decl (sym);
4393 /* Create the variable. */
4394 pushdecl (decl);
4395 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
4396 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4397 rest_of_decl_compilation (decl, 1, 0);
4398 gfc_module_add_decl (cur_module, decl);
4400 /* Also add length of strings. */
4401 if (sym->ts.type == BT_CHARACTER)
4403 tree length;
4405 length = sym->ts.u.cl->backend_decl;
4406 gcc_assert (length || sym->attr.proc_pointer);
4407 if (length && !INTEGER_CST_P (length))
4409 pushdecl (length);
4410 rest_of_decl_compilation (length, 1, 0);
4414 if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
4415 && sym->attr.referenced && !sym->attr.use_assoc)
4416 has_coarray_vars = true;
4419 /* Emit debug information for USE statements. */
4421 static void
4422 gfc_trans_use_stmts (gfc_namespace * ns)
4424 gfc_use_list *use_stmt;
4425 for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
4427 struct module_htab_entry *entry
4428 = gfc_find_module (use_stmt->module_name);
4429 gfc_use_rename *rent;
4431 if (entry->namespace_decl == NULL)
4433 entry->namespace_decl
4434 = build_decl (input_location,
4435 NAMESPACE_DECL,
4436 get_identifier (use_stmt->module_name),
4437 void_type_node);
4438 DECL_EXTERNAL (entry->namespace_decl) = 1;
4440 gfc_set_backend_locus (&use_stmt->where);
4441 if (!use_stmt->only_flag)
4442 (*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
4443 NULL_TREE,
4444 ns->proc_name->backend_decl,
4445 false);
4446 for (rent = use_stmt->rename; rent; rent = rent->next)
4448 tree decl, local_name;
4449 void **slot;
4451 if (rent->op != INTRINSIC_NONE)
4452 continue;
4454 slot = htab_find_slot_with_hash (entry->decls, rent->use_name,
4455 htab_hash_string (rent->use_name),
4456 INSERT);
4457 if (*slot == NULL)
4459 gfc_symtree *st;
4461 st = gfc_find_symtree (ns->sym_root,
4462 rent->local_name[0]
4463 ? rent->local_name : rent->use_name);
4465 /* The following can happen if a derived type is renamed. */
4466 if (!st)
4468 char *name;
4469 name = xstrdup (rent->local_name[0]
4470 ? rent->local_name : rent->use_name);
4471 name[0] = (char) TOUPPER ((unsigned char) name[0]);
4472 st = gfc_find_symtree (ns->sym_root, name);
4473 free (name);
4474 gcc_assert (st);
4477 /* Sometimes, generic interfaces wind up being over-ruled by a
4478 local symbol (see PR41062). */
4479 if (!st->n.sym->attr.use_assoc)
4480 continue;
4482 if (st->n.sym->backend_decl
4483 && DECL_P (st->n.sym->backend_decl)
4484 && st->n.sym->module
4485 && strcmp (st->n.sym->module, use_stmt->module_name) == 0)
4487 gcc_assert (DECL_EXTERNAL (entry->namespace_decl)
4488 || (TREE_CODE (st->n.sym->backend_decl)
4489 != VAR_DECL));
4490 decl = copy_node (st->n.sym->backend_decl);
4491 DECL_CONTEXT (decl) = entry->namespace_decl;
4492 DECL_EXTERNAL (decl) = 1;
4493 DECL_IGNORED_P (decl) = 0;
4494 DECL_INITIAL (decl) = NULL_TREE;
4496 else if (st->n.sym->attr.flavor == FL_NAMELIST
4497 && st->n.sym->attr.use_only
4498 && st->n.sym->module
4499 && strcmp (st->n.sym->module, use_stmt->module_name)
4500 == 0)
4502 decl = generate_namelist_decl (st->n.sym);
4503 DECL_CONTEXT (decl) = entry->namespace_decl;
4504 DECL_EXTERNAL (decl) = 1;
4505 DECL_IGNORED_P (decl) = 0;
4506 DECL_INITIAL (decl) = NULL_TREE;
4508 else
4510 *slot = error_mark_node;
4511 htab_clear_slot (entry->decls, slot);
4512 continue;
4514 *slot = decl;
4516 decl = (tree) *slot;
4517 if (rent->local_name[0])
4518 local_name = get_identifier (rent->local_name);
4519 else
4520 local_name = NULL_TREE;
4521 gfc_set_backend_locus (&rent->where);
4522 (*debug_hooks->imported_module_or_decl) (decl, local_name,
4523 ns->proc_name->backend_decl,
4524 !use_stmt->only_flag);
4530 /* Return true if expr is a constant initializer that gfc_conv_initializer
4531 will handle. */
4533 static bool
4534 check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array,
4535 bool pointer)
4537 gfc_constructor *c;
4538 gfc_component *cm;
4540 if (pointer)
4541 return true;
4542 else if (array)
4544 if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL)
4545 return true;
4546 else if (expr->expr_type == EXPR_STRUCTURE)
4547 return check_constant_initializer (expr, ts, false, false);
4548 else if (expr->expr_type != EXPR_ARRAY)
4549 return false;
4550 for (c = gfc_constructor_first (expr->value.constructor);
4551 c; c = gfc_constructor_next (c))
4553 if (c->iterator)
4554 return false;
4555 if (c->expr->expr_type == EXPR_STRUCTURE)
4557 if (!check_constant_initializer (c->expr, ts, false, false))
4558 return false;
4560 else if (c->expr->expr_type != EXPR_CONSTANT)
4561 return false;
4563 return true;
4565 else switch (ts->type)
4567 case BT_DERIVED:
4568 if (expr->expr_type != EXPR_STRUCTURE)
4569 return false;
4570 cm = expr->ts.u.derived->components;
4571 for (c = gfc_constructor_first (expr->value.constructor);
4572 c; c = gfc_constructor_next (c), cm = cm->next)
4574 if (!c->expr || cm->attr.allocatable)
4575 continue;
4576 if (!check_constant_initializer (c->expr, &cm->ts,
4577 cm->attr.dimension,
4578 cm->attr.pointer))
4579 return false;
4581 return true;
4582 default:
4583 return expr->expr_type == EXPR_CONSTANT;
4587 /* Emit debug info for parameters and unreferenced variables with
4588 initializers. */
4590 static void
4591 gfc_emit_parameter_debug_info (gfc_symbol *sym)
4593 tree decl;
4595 if (sym->attr.flavor != FL_PARAMETER
4596 && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced))
4597 return;
4599 if (sym->backend_decl != NULL
4600 || sym->value == NULL
4601 || sym->attr.use_assoc
4602 || sym->attr.dummy
4603 || sym->attr.result
4604 || sym->attr.function
4605 || sym->attr.intrinsic
4606 || sym->attr.pointer
4607 || sym->attr.allocatable
4608 || sym->attr.cray_pointee
4609 || sym->attr.threadprivate
4610 || sym->attr.is_bind_c
4611 || sym->attr.subref_array_pointer
4612 || sym->attr.assign)
4613 return;
4615 if (sym->ts.type == BT_CHARACTER)
4617 gfc_conv_const_charlen (sym->ts.u.cl);
4618 if (sym->ts.u.cl->backend_decl == NULL
4619 || TREE_CODE (sym->ts.u.cl->backend_decl) != INTEGER_CST)
4620 return;
4622 else if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
4623 return;
4625 if (sym->as)
4627 int n;
4629 if (sym->as->type != AS_EXPLICIT)
4630 return;
4631 for (n = 0; n < sym->as->rank; n++)
4632 if (sym->as->lower[n]->expr_type != EXPR_CONSTANT
4633 || sym->as->upper[n] == NULL
4634 || sym->as->upper[n]->expr_type != EXPR_CONSTANT)
4635 return;
4638 if (!check_constant_initializer (sym->value, &sym->ts,
4639 sym->attr.dimension, false))
4640 return;
4642 if (gfc_option.coarray == GFC_FCOARRAY_LIB && sym->attr.codimension)
4643 return;
4645 /* Create the decl for the variable or constant. */
4646 decl = build_decl (input_location,
4647 sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL,
4648 gfc_sym_identifier (sym), gfc_sym_type (sym));
4649 if (sym->attr.flavor == FL_PARAMETER)
4650 TREE_READONLY (decl) = 1;
4651 gfc_set_decl_location (decl, &sym->declared_at);
4652 if (sym->attr.dimension)
4653 GFC_DECL_PACKED_ARRAY (decl) = 1;
4654 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4655 TREE_STATIC (decl) = 1;
4656 TREE_USED (decl) = 1;
4657 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
4658 TREE_PUBLIC (decl) = 1;
4659 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
4660 TREE_TYPE (decl),
4661 sym->attr.dimension,
4662 false, false);
4663 debug_hooks->global_decl (decl);
4667 static void
4668 generate_coarray_sym_init (gfc_symbol *sym)
4670 tree tmp, size, decl, token;
4672 if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
4673 || sym->attr.use_assoc || !sym->attr.referenced
4674 || sym->attr.select_type_temporary)
4675 return;
4677 decl = sym->backend_decl;
4678 TREE_USED(decl) = 1;
4679 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
4681 /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
4682 to make sure the variable is not optimized away. */
4683 DECL_PRESERVE_P (DECL_CONTEXT (decl)) = 1;
4685 size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl)));
4687 /* Ensure that we do not have size=0 for zero-sized arrays. */
4688 size = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
4689 fold_convert (size_type_node, size),
4690 build_int_cst (size_type_node, 1));
4692 if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)))
4694 tmp = GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl));
4695 size = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
4696 fold_convert (size_type_node, tmp), size);
4699 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl)) != NULL_TREE);
4700 token = gfc_build_addr_expr (ppvoid_type_node,
4701 GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl)));
4703 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size,
4704 build_int_cst (integer_type_node,
4705 GFC_CAF_COARRAY_STATIC), /* type. */
4706 token, null_pointer_node, /* token, stat. */
4707 null_pointer_node, /* errgmsg, errmsg_len. */
4708 build_int_cst (integer_type_node, 0));
4710 gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl), tmp));
4713 /* Handle "static" initializer. */
4714 if (sym->value)
4716 sym->attr.pointer = 1;
4717 tmp = gfc_trans_assignment (gfc_lval_expr_from_sym (sym), sym->value,
4718 true, false);
4719 sym->attr.pointer = 0;
4720 gfc_add_expr_to_block (&caf_init_block, tmp);
4725 /* Generate constructor function to initialize static, nonallocatable
4726 coarrays. */
4728 static void
4729 generate_coarray_init (gfc_namespace * ns __attribute((unused)))
4731 tree fndecl, tmp, decl, save_fn_decl;
4733 save_fn_decl = current_function_decl;
4734 push_function_context ();
4736 tmp = build_function_type_list (void_type_node, NULL_TREE);
4737 fndecl = build_decl (input_location, FUNCTION_DECL,
4738 create_tmp_var_name ("_caf_init"), tmp);
4740 DECL_STATIC_CONSTRUCTOR (fndecl) = 1;
4741 SET_DECL_INIT_PRIORITY (fndecl, DEFAULT_INIT_PRIORITY);
4743 decl = build_decl (input_location, RESULT_DECL, NULL_TREE, void_type_node);
4744 DECL_ARTIFICIAL (decl) = 1;
4745 DECL_IGNORED_P (decl) = 1;
4746 DECL_CONTEXT (decl) = fndecl;
4747 DECL_RESULT (fndecl) = decl;
4749 pushdecl (fndecl);
4750 current_function_decl = fndecl;
4751 announce_function (fndecl);
4753 rest_of_decl_compilation (fndecl, 0, 0);
4754 make_decl_rtl (fndecl);
4755 allocate_struct_function (fndecl, false);
4757 pushlevel ();
4758 gfc_init_block (&caf_init_block);
4760 gfc_traverse_ns (ns, generate_coarray_sym_init);
4762 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&caf_init_block);
4763 decl = getdecls ();
4765 poplevel (1, 1);
4766 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
4768 DECL_SAVED_TREE (fndecl)
4769 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
4770 DECL_INITIAL (fndecl));
4771 dump_function (TDI_original, fndecl);
4773 cfun->function_end_locus = input_location;
4774 set_cfun (NULL);
4776 if (decl_function_context (fndecl))
4777 (void) cgraph_create_node (fndecl);
4778 else
4779 cgraph_finalize_function (fndecl, true);
4781 pop_function_context ();
4782 current_function_decl = save_fn_decl;
4786 static void
4787 create_module_nml_decl (gfc_symbol *sym)
4789 if (sym->attr.flavor == FL_NAMELIST)
4791 tree decl = generate_namelist_decl (sym);
4792 pushdecl (decl);
4793 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
4794 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4795 rest_of_decl_compilation (decl, 1, 0);
4796 gfc_module_add_decl (cur_module, decl);
4801 /* Generate all the required code for module variables. */
4803 void
4804 gfc_generate_module_vars (gfc_namespace * ns)
4806 module_namespace = ns;
4807 cur_module = gfc_find_module (ns->proc_name->name);
4809 /* Check if the frontend left the namespace in a reasonable state. */
4810 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
4812 /* Generate COMMON blocks. */
4813 gfc_trans_common (ns);
4815 has_coarray_vars = false;
4817 /* Create decls for all the module variables. */
4818 gfc_traverse_ns (ns, gfc_create_module_variable);
4819 gfc_traverse_ns (ns, create_module_nml_decl);
4821 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
4822 generate_coarray_init (ns);
4824 cur_module = NULL;
4826 gfc_trans_use_stmts (ns);
4827 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
4831 static void
4832 gfc_generate_contained_functions (gfc_namespace * parent)
4834 gfc_namespace *ns;
4836 /* We create all the prototypes before generating any code. */
4837 for (ns = parent->contained; ns; ns = ns->sibling)
4839 /* Skip namespaces from used modules. */
4840 if (ns->parent != parent)
4841 continue;
4843 gfc_create_function_decl (ns, false);
4846 for (ns = parent->contained; ns; ns = ns->sibling)
4848 /* Skip namespaces from used modules. */
4849 if (ns->parent != parent)
4850 continue;
4852 gfc_generate_function_code (ns);
4857 /* Drill down through expressions for the array specification bounds and
4858 character length calling generate_local_decl for all those variables
4859 that have not already been declared. */
4861 static void
4862 generate_local_decl (gfc_symbol *);
4864 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4866 static bool
4867 expr_decls (gfc_expr *e, gfc_symbol *sym,
4868 int *f ATTRIBUTE_UNUSED)
4870 if (e->expr_type != EXPR_VARIABLE
4871 || sym == e->symtree->n.sym
4872 || e->symtree->n.sym->mark
4873 || e->symtree->n.sym->ns != sym->ns)
4874 return false;
4876 generate_local_decl (e->symtree->n.sym);
4877 return false;
4880 static void
4881 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
4883 gfc_traverse_expr (e, sym, expr_decls, 0);
4887 /* Check for dependencies in the character length and array spec. */
4889 static void
4890 generate_dependency_declarations (gfc_symbol *sym)
4892 int i;
4894 if (sym->ts.type == BT_CHARACTER
4895 && sym->ts.u.cl
4896 && sym->ts.u.cl->length
4897 && sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4898 generate_expr_decls (sym, sym->ts.u.cl->length);
4900 if (sym->as && sym->as->rank)
4902 for (i = 0; i < sym->as->rank; i++)
4904 generate_expr_decls (sym, sym->as->lower[i]);
4905 generate_expr_decls (sym, sym->as->upper[i]);
4911 /* Generate decls for all local variables. We do this to ensure correct
4912 handling of expressions which only appear in the specification of
4913 other functions. */
4915 static void
4916 generate_local_decl (gfc_symbol * sym)
4918 if (sym->attr.flavor == FL_VARIABLE)
4920 if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
4921 && sym->attr.referenced && !sym->attr.use_assoc)
4922 has_coarray_vars = true;
4924 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
4925 generate_dependency_declarations (sym);
4927 if (sym->attr.referenced)
4928 gfc_get_symbol_decl (sym);
4930 /* Warnings for unused dummy arguments. */
4931 else if (sym->attr.dummy && !sym->attr.in_namelist)
4933 /* INTENT(out) dummy arguments are likely meant to be set. */
4934 if (gfc_option.warn_unused_dummy_argument
4935 && sym->attr.intent == INTENT_OUT)
4937 if (sym->ts.type != BT_DERIVED)
4938 gfc_warning ("Dummy argument '%s' at %L was declared "
4939 "INTENT(OUT) but was not set", sym->name,
4940 &sym->declared_at);
4941 else if (!gfc_has_default_initializer (sym->ts.u.derived)
4942 && !sym->ts.u.derived->attr.zero_comp)
4943 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4944 "declared INTENT(OUT) but was not set and "
4945 "does not have a default initializer",
4946 sym->name, &sym->declared_at);
4947 if (sym->backend_decl != NULL_TREE)
4948 TREE_NO_WARNING(sym->backend_decl) = 1;
4950 else if (gfc_option.warn_unused_dummy_argument)
4952 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
4953 &sym->declared_at);
4954 if (sym->backend_decl != NULL_TREE)
4955 TREE_NO_WARNING(sym->backend_decl) = 1;
4959 /* Warn for unused variables, but not if they're inside a common
4960 block or a namelist. */
4961 else if (warn_unused_variable
4962 && !(sym->attr.in_common || sym->mark || sym->attr.in_namelist))
4964 if (sym->attr.use_only)
4966 gfc_warning ("Unused module variable '%s' which has been "
4967 "explicitly imported at %L", sym->name,
4968 &sym->declared_at);
4969 if (sym->backend_decl != NULL_TREE)
4970 TREE_NO_WARNING(sym->backend_decl) = 1;
4972 else if (!sym->attr.use_assoc)
4974 gfc_warning ("Unused variable '%s' declared at %L",
4975 sym->name, &sym->declared_at);
4976 if (sym->backend_decl != NULL_TREE)
4977 TREE_NO_WARNING(sym->backend_decl) = 1;
4981 /* For variable length CHARACTER parameters, the PARM_DECL already
4982 references the length variable, so force gfc_get_symbol_decl
4983 even when not referenced. If optimize > 0, it will be optimized
4984 away anyway. But do this only after emitting -Wunused-parameter
4985 warning if requested. */
4986 if (sym->attr.dummy && !sym->attr.referenced
4987 && sym->ts.type == BT_CHARACTER
4988 && sym->ts.u.cl->backend_decl != NULL
4989 && TREE_CODE (sym->ts.u.cl->backend_decl) == VAR_DECL)
4991 sym->attr.referenced = 1;
4992 gfc_get_symbol_decl (sym);
4995 /* INTENT(out) dummy arguments and result variables with allocatable
4996 components are reset by default and need to be set referenced to
4997 generate the code for nullification and automatic lengths. */
4998 if (!sym->attr.referenced
4999 && sym->ts.type == BT_DERIVED
5000 && sym->ts.u.derived->attr.alloc_comp
5001 && !sym->attr.pointer
5002 && ((sym->attr.dummy && sym->attr.intent == INTENT_OUT)
5004 (sym->attr.result && sym != sym->result)))
5006 sym->attr.referenced = 1;
5007 gfc_get_symbol_decl (sym);
5010 /* Check for dependencies in the array specification and string
5011 length, adding the necessary declarations to the function. We
5012 mark the symbol now, as well as in traverse_ns, to prevent
5013 getting stuck in a circular dependency. */
5014 sym->mark = 1;
5016 else if (sym->attr.flavor == FL_PARAMETER)
5018 if (warn_unused_parameter
5019 && !sym->attr.referenced)
5021 if (!sym->attr.use_assoc)
5022 gfc_warning ("Unused parameter '%s' declared at %L", sym->name,
5023 &sym->declared_at);
5024 else if (sym->attr.use_only)
5025 gfc_warning ("Unused parameter '%s' which has been explicitly "
5026 "imported at %L", sym->name, &sym->declared_at);
5029 else if (sym->attr.flavor == FL_PROCEDURE)
5031 /* TODO: move to the appropriate place in resolve.c. */
5032 if (warn_return_type
5033 && sym->attr.function
5034 && sym->result
5035 && sym != sym->result
5036 && !sym->result->attr.referenced
5037 && !sym->attr.use_assoc
5038 && sym->attr.if_source != IFSRC_IFBODY)
5040 gfc_warning ("Return value '%s' of function '%s' declared at "
5041 "%L not set", sym->result->name, sym->name,
5042 &sym->result->declared_at);
5044 /* Prevents "Unused variable" warning for RESULT variables. */
5045 sym->result->mark = 1;
5049 if (sym->attr.dummy == 1)
5051 /* Modify the tree type for scalar character dummy arguments of bind(c)
5052 procedures if they are passed by value. The tree type for them will
5053 be promoted to INTEGER_TYPE for the middle end, which appears to be
5054 what C would do with characters passed by-value. The value attribute
5055 implies the dummy is a scalar. */
5056 if (sym->attr.value == 1 && sym->backend_decl != NULL
5057 && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
5058 && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
5059 gfc_conv_scalar_char_value (sym, NULL, NULL);
5061 /* Unused procedure passed as dummy argument. */
5062 if (sym->attr.flavor == FL_PROCEDURE)
5064 if (!sym->attr.referenced)
5066 if (gfc_option.warn_unused_dummy_argument)
5067 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
5068 &sym->declared_at);
5071 /* Silence bogus "unused parameter" warnings from the
5072 middle end. */
5073 if (sym->backend_decl != NULL_TREE)
5074 TREE_NO_WARNING (sym->backend_decl) = 1;
5078 /* Make sure we convert the types of the derived types from iso_c_binding
5079 into (void *). */
5080 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
5081 && sym->ts.type == BT_DERIVED)
5082 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
5086 static void
5087 generate_local_nml_decl (gfc_symbol * sym)
5089 if (sym->attr.flavor == FL_NAMELIST && !sym->attr.use_assoc)
5091 tree decl = generate_namelist_decl (sym);
5092 pushdecl (decl);
5097 static void
5098 generate_local_vars (gfc_namespace * ns)
5100 gfc_traverse_ns (ns, generate_local_decl);
5101 gfc_traverse_ns (ns, generate_local_nml_decl);
5105 /* Generate a switch statement to jump to the correct entry point. Also
5106 creates the label decls for the entry points. */
5108 static tree
5109 gfc_trans_entry_master_switch (gfc_entry_list * el)
5111 stmtblock_t block;
5112 tree label;
5113 tree tmp;
5114 tree val;
5116 gfc_init_block (&block);
5117 for (; el; el = el->next)
5119 /* Add the case label. */
5120 label = gfc_build_label_decl (NULL_TREE);
5121 val = build_int_cst (gfc_array_index_type, el->id);
5122 tmp = build_case_label (val, NULL_TREE, label);
5123 gfc_add_expr_to_block (&block, tmp);
5125 /* And jump to the actual entry point. */
5126 label = gfc_build_label_decl (NULL_TREE);
5127 tmp = build1_v (GOTO_EXPR, label);
5128 gfc_add_expr_to_block (&block, tmp);
5130 /* Save the label decl. */
5131 el->label = label;
5133 tmp = gfc_finish_block (&block);
5134 /* The first argument selects the entry point. */
5135 val = DECL_ARGUMENTS (current_function_decl);
5136 tmp = fold_build3_loc (input_location, SWITCH_EXPR, NULL_TREE,
5137 val, tmp, NULL_TREE);
5138 return tmp;
5142 /* Add code to string lengths of actual arguments passed to a function against
5143 the expected lengths of the dummy arguments. */
5145 static void
5146 add_argument_checking (stmtblock_t *block, gfc_symbol *sym)
5148 gfc_formal_arglist *formal;
5150 for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
5151 if (formal->sym && formal->sym->ts.type == BT_CHARACTER
5152 && !formal->sym->ts.deferred)
5154 enum tree_code comparison;
5155 tree cond;
5156 tree argname;
5157 gfc_symbol *fsym;
5158 gfc_charlen *cl;
5159 const char *message;
5161 fsym = formal->sym;
5162 cl = fsym->ts.u.cl;
5164 gcc_assert (cl);
5165 gcc_assert (cl->passed_length != NULL_TREE);
5166 gcc_assert (cl->backend_decl != NULL_TREE);
5168 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
5169 string lengths must match exactly. Otherwise, it is only required
5170 that the actual string length is *at least* the expected one.
5171 Sequence association allows for a mismatch of the string length
5172 if the actual argument is (part of) an array, but only if the
5173 dummy argument is an array. (See "Sequence association" in
5174 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
5175 if (fsym->attr.pointer || fsym->attr.allocatable
5176 || (fsym->as && (fsym->as->type == AS_ASSUMED_SHAPE
5177 || fsym->as->type == AS_ASSUMED_RANK)))
5179 comparison = NE_EXPR;
5180 message = _("Actual string length does not match the declared one"
5181 " for dummy argument '%s' (%ld/%ld)");
5183 else if (fsym->as && fsym->as->rank != 0)
5184 continue;
5185 else
5187 comparison = LT_EXPR;
5188 message = _("Actual string length is shorter than the declared one"
5189 " for dummy argument '%s' (%ld/%ld)");
5192 /* Build the condition. For optional arguments, an actual length
5193 of 0 is also acceptable if the associated string is NULL, which
5194 means the argument was not passed. */
5195 cond = fold_build2_loc (input_location, comparison, boolean_type_node,
5196 cl->passed_length, cl->backend_decl);
5197 if (fsym->attr.optional)
5199 tree not_absent;
5200 tree not_0length;
5201 tree absent_failed;
5203 not_0length = fold_build2_loc (input_location, NE_EXPR,
5204 boolean_type_node,
5205 cl->passed_length,
5206 build_zero_cst (gfc_charlen_type_node));
5207 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
5208 fsym->attr.referenced = 1;
5209 not_absent = gfc_conv_expr_present (fsym);
5211 absent_failed = fold_build2_loc (input_location, TRUTH_OR_EXPR,
5212 boolean_type_node, not_0length,
5213 not_absent);
5215 cond = fold_build2_loc (input_location, TRUTH_AND_EXPR,
5216 boolean_type_node, cond, absent_failed);
5219 /* Build the runtime check. */
5220 argname = gfc_build_cstring_const (fsym->name);
5221 argname = gfc_build_addr_expr (pchar_type_node, argname);
5222 gfc_trans_runtime_check (true, false, cond, block, &fsym->declared_at,
5223 message, argname,
5224 fold_convert (long_integer_type_node,
5225 cl->passed_length),
5226 fold_convert (long_integer_type_node,
5227 cl->backend_decl));
5232 static void
5233 create_main_function (tree fndecl)
5235 tree old_context;
5236 tree ftn_main;
5237 tree tmp, decl, result_decl, argc, argv, typelist, arglist;
5238 stmtblock_t body;
5240 old_context = current_function_decl;
5242 if (old_context)
5244 push_function_context ();
5245 saved_parent_function_decls = saved_function_decls;
5246 saved_function_decls = NULL_TREE;
5249 /* main() function must be declared with global scope. */
5250 gcc_assert (current_function_decl == NULL_TREE);
5252 /* Declare the function. */
5253 tmp = build_function_type_list (integer_type_node, integer_type_node,
5254 build_pointer_type (pchar_type_node),
5255 NULL_TREE);
5256 main_identifier_node = get_identifier ("main");
5257 ftn_main = build_decl (input_location, FUNCTION_DECL,
5258 main_identifier_node, tmp);
5259 DECL_EXTERNAL (ftn_main) = 0;
5260 TREE_PUBLIC (ftn_main) = 1;
5261 TREE_STATIC (ftn_main) = 1;
5262 DECL_ATTRIBUTES (ftn_main)
5263 = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
5265 /* Setup the result declaration (for "return 0"). */
5266 result_decl = build_decl (input_location,
5267 RESULT_DECL, NULL_TREE, integer_type_node);
5268 DECL_ARTIFICIAL (result_decl) = 1;
5269 DECL_IGNORED_P (result_decl) = 1;
5270 DECL_CONTEXT (result_decl) = ftn_main;
5271 DECL_RESULT (ftn_main) = result_decl;
5273 pushdecl (ftn_main);
5275 /* Get the arguments. */
5277 arglist = NULL_TREE;
5278 typelist = TYPE_ARG_TYPES (TREE_TYPE (ftn_main));
5280 tmp = TREE_VALUE (typelist);
5281 argc = build_decl (input_location, PARM_DECL, get_identifier ("argc"), tmp);
5282 DECL_CONTEXT (argc) = ftn_main;
5283 DECL_ARG_TYPE (argc) = TREE_VALUE (typelist);
5284 TREE_READONLY (argc) = 1;
5285 gfc_finish_decl (argc);
5286 arglist = chainon (arglist, argc);
5288 typelist = TREE_CHAIN (typelist);
5289 tmp = TREE_VALUE (typelist);
5290 argv = build_decl (input_location, PARM_DECL, get_identifier ("argv"), tmp);
5291 DECL_CONTEXT (argv) = ftn_main;
5292 DECL_ARG_TYPE (argv) = TREE_VALUE (typelist);
5293 TREE_READONLY (argv) = 1;
5294 DECL_BY_REFERENCE (argv) = 1;
5295 gfc_finish_decl (argv);
5296 arglist = chainon (arglist, argv);
5298 DECL_ARGUMENTS (ftn_main) = arglist;
5299 current_function_decl = ftn_main;
5300 announce_function (ftn_main);
5302 rest_of_decl_compilation (ftn_main, 1, 0);
5303 make_decl_rtl (ftn_main);
5304 allocate_struct_function (ftn_main, false);
5305 pushlevel ();
5307 gfc_init_block (&body);
5309 /* Call some libgfortran initialization routines, call then MAIN__(). */
5311 /* Call _gfortran_caf_init (*argc, ***argv). */
5312 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
5314 tree pint_type, pppchar_type;
5315 pint_type = build_pointer_type (integer_type_node);
5316 pppchar_type
5317 = build_pointer_type (build_pointer_type (pchar_type_node));
5319 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_init, 2,
5320 gfc_build_addr_expr (pint_type, argc),
5321 gfc_build_addr_expr (pppchar_type, argv));
5322 gfc_add_expr_to_block (&body, tmp);
5325 /* Call _gfortran_set_args (argc, argv). */
5326 TREE_USED (argc) = 1;
5327 TREE_USED (argv) = 1;
5328 tmp = build_call_expr_loc (input_location,
5329 gfor_fndecl_set_args, 2, argc, argv);
5330 gfc_add_expr_to_block (&body, tmp);
5332 /* Add a call to set_options to set up the runtime library Fortran
5333 language standard parameters. */
5335 tree array_type, array, var;
5336 vec<constructor_elt, va_gc> *v = NULL;
5338 /* Passing a new option to the library requires four modifications:
5339 + add it to the tree_cons list below
5340 + change the array size in the call to build_array_type
5341 + change the first argument to the library call
5342 gfor_fndecl_set_options
5343 + modify the library (runtime/compile_options.c)! */
5345 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5346 build_int_cst (integer_type_node,
5347 gfc_option.warn_std));
5348 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5349 build_int_cst (integer_type_node,
5350 gfc_option.allow_std));
5351 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5352 build_int_cst (integer_type_node, pedantic));
5353 /* TODO: This is the old -fdump-core option, which is unused but
5354 passed due to ABI compatibility; remove when bumping the
5355 library ABI. */
5356 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5357 build_int_cst (integer_type_node,
5358 0));
5359 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5360 build_int_cst (integer_type_node,
5361 gfc_option.flag_backtrace));
5362 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5363 build_int_cst (integer_type_node,
5364 gfc_option.flag_sign_zero));
5365 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5366 build_int_cst (integer_type_node,
5367 (gfc_option.rtcheck
5368 & GFC_RTCHECK_BOUNDS)));
5369 /* TODO: This is the -frange-check option, which no longer affects
5370 library behavior; when bumping the library ABI this slot can be
5371 reused for something else. As it is the last element in the
5372 array, we can instead leave it out altogether. */
5373 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5374 build_int_cst (integer_type_node, 0));
5375 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5376 build_int_cst (integer_type_node,
5377 gfc_option.fpe_summary));
5379 array_type = build_array_type (integer_type_node,
5380 build_index_type (size_int (8)));
5381 array = build_constructor (array_type, v);
5382 TREE_CONSTANT (array) = 1;
5383 TREE_STATIC (array) = 1;
5385 /* Create a static variable to hold the jump table. */
5386 var = gfc_create_var (array_type, "options");
5387 TREE_CONSTANT (var) = 1;
5388 TREE_STATIC (var) = 1;
5389 TREE_READONLY (var) = 1;
5390 DECL_INITIAL (var) = array;
5391 var = gfc_build_addr_expr (build_pointer_type (integer_type_node), var);
5393 tmp = build_call_expr_loc (input_location,
5394 gfor_fndecl_set_options, 2,
5395 build_int_cst (integer_type_node, 9), var);
5396 gfc_add_expr_to_block (&body, tmp);
5399 /* If -ffpe-trap option was provided, add a call to set_fpe so that
5400 the library will raise a FPE when needed. */
5401 if (gfc_option.fpe != 0)
5403 tmp = build_call_expr_loc (input_location,
5404 gfor_fndecl_set_fpe, 1,
5405 build_int_cst (integer_type_node,
5406 gfc_option.fpe));
5407 gfc_add_expr_to_block (&body, tmp);
5410 /* If this is the main program and an -fconvert option was provided,
5411 add a call to set_convert. */
5413 if (gfc_option.convert != GFC_CONVERT_NATIVE)
5415 tmp = build_call_expr_loc (input_location,
5416 gfor_fndecl_set_convert, 1,
5417 build_int_cst (integer_type_node,
5418 gfc_option.convert));
5419 gfc_add_expr_to_block (&body, tmp);
5422 /* If this is the main program and an -frecord-marker option was provided,
5423 add a call to set_record_marker. */
5425 if (gfc_option.record_marker != 0)
5427 tmp = build_call_expr_loc (input_location,
5428 gfor_fndecl_set_record_marker, 1,
5429 build_int_cst (integer_type_node,
5430 gfc_option.record_marker));
5431 gfc_add_expr_to_block (&body, tmp);
5434 if (gfc_option.max_subrecord_length != 0)
5436 tmp = build_call_expr_loc (input_location,
5437 gfor_fndecl_set_max_subrecord_length, 1,
5438 build_int_cst (integer_type_node,
5439 gfc_option.max_subrecord_length));
5440 gfc_add_expr_to_block (&body, tmp);
5443 /* Call MAIN__(). */
5444 tmp = build_call_expr_loc (input_location,
5445 fndecl, 0);
5446 gfc_add_expr_to_block (&body, tmp);
5448 /* Mark MAIN__ as used. */
5449 TREE_USED (fndecl) = 1;
5451 /* Coarray: Call _gfortran_caf_finalize(void). */
5452 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
5454 /* Per F2008, 8.5.1 END of the main program implies a
5455 SYNC MEMORY. */
5456 tmp = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
5457 tmp = build_call_expr_loc (input_location, tmp, 0);
5458 gfc_add_expr_to_block (&body, tmp);
5460 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_finalize, 0);
5461 gfc_add_expr_to_block (&body, tmp);
5464 /* "return 0". */
5465 tmp = fold_build2_loc (input_location, MODIFY_EXPR, integer_type_node,
5466 DECL_RESULT (ftn_main),
5467 build_int_cst (integer_type_node, 0));
5468 tmp = build1_v (RETURN_EXPR, tmp);
5469 gfc_add_expr_to_block (&body, tmp);
5472 DECL_SAVED_TREE (ftn_main) = gfc_finish_block (&body);
5473 decl = getdecls ();
5475 /* Finish off this function and send it for code generation. */
5476 poplevel (1, 1);
5477 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main)) = ftn_main;
5479 DECL_SAVED_TREE (ftn_main)
5480 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (ftn_main),
5481 DECL_INITIAL (ftn_main));
5483 /* Output the GENERIC tree. */
5484 dump_function (TDI_original, ftn_main);
5486 cgraph_finalize_function (ftn_main, true);
5488 if (old_context)
5490 pop_function_context ();
5491 saved_function_decls = saved_parent_function_decls;
5493 current_function_decl = old_context;
5497 /* Get the result expression for a procedure. */
5499 static tree
5500 get_proc_result (gfc_symbol* sym)
5502 if (sym->attr.subroutine || sym == sym->result)
5504 if (current_fake_result_decl != NULL)
5505 return TREE_VALUE (current_fake_result_decl);
5507 return NULL_TREE;
5510 return sym->result->backend_decl;
5514 /* Generate an appropriate return-statement for a procedure. */
5516 tree
5517 gfc_generate_return (void)
5519 gfc_symbol* sym;
5520 tree result;
5521 tree fndecl;
5523 sym = current_procedure_symbol;
5524 fndecl = sym->backend_decl;
5526 if (TREE_TYPE (DECL_RESULT (fndecl)) == void_type_node)
5527 result = NULL_TREE;
5528 else
5530 result = get_proc_result (sym);
5532 /* Set the return value to the dummy result variable. The
5533 types may be different for scalar default REAL functions
5534 with -ff2c, therefore we have to convert. */
5535 if (result != NULL_TREE)
5537 result = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
5538 result = fold_build2_loc (input_location, MODIFY_EXPR,
5539 TREE_TYPE (result), DECL_RESULT (fndecl),
5540 result);
5544 return build1_v (RETURN_EXPR, result);
5548 static void
5549 is_from_ieee_module (gfc_symbol *sym)
5551 if (sym->from_intmod == INTMOD_IEEE_FEATURES
5552 || sym->from_intmod == INTMOD_IEEE_EXCEPTIONS
5553 || sym->from_intmod == INTMOD_IEEE_ARITHMETIC)
5554 seen_ieee_symbol = 1;
5558 static int
5559 is_ieee_module_used (gfc_namespace *ns)
5561 seen_ieee_symbol = 0;
5562 gfc_traverse_ns (ns, is_from_ieee_module);
5563 return seen_ieee_symbol;
5567 static tree
5568 save_fp_state (stmtblock_t *block)
5570 tree type, fpstate, tmp;
5572 type = build_array_type (char_type_node,
5573 build_range_type (size_type_node, size_zero_node,
5574 size_int (32)));
5575 fpstate = gfc_create_var (type, "fpstate");
5576 fpstate = gfc_build_addr_expr (pvoid_type_node, fpstate);
5578 tmp = build_call_expr_loc (input_location, gfor_fndecl_ieee_procedure_entry,
5579 1, fpstate);
5580 gfc_add_expr_to_block (block, tmp);
5582 return fpstate;
5586 static void
5587 restore_fp_state (stmtblock_t *block, tree fpstate)
5589 tree tmp;
5591 tmp = build_call_expr_loc (input_location, gfor_fndecl_ieee_procedure_exit,
5592 1, fpstate);
5593 gfc_add_expr_to_block (block, tmp);
5597 /* Generate code for a function. */
5599 void
5600 gfc_generate_function_code (gfc_namespace * ns)
5602 tree fndecl;
5603 tree old_context;
5604 tree decl;
5605 tree tmp;
5606 tree fpstate = NULL_TREE;
5607 stmtblock_t init, cleanup;
5608 stmtblock_t body;
5609 gfc_wrapped_block try_block;
5610 tree recurcheckvar = NULL_TREE;
5611 gfc_symbol *sym;
5612 gfc_symbol *previous_procedure_symbol;
5613 int rank, ieee;
5614 bool is_recursive;
5616 sym = ns->proc_name;
5617 previous_procedure_symbol = current_procedure_symbol;
5618 current_procedure_symbol = sym;
5620 /* Check that the frontend isn't still using this. */
5621 gcc_assert (sym->tlink == NULL);
5622 sym->tlink = sym;
5624 /* Create the declaration for functions with global scope. */
5625 if (!sym->backend_decl)
5626 gfc_create_function_decl (ns, false);
5628 fndecl = sym->backend_decl;
5629 old_context = current_function_decl;
5631 if (old_context)
5633 push_function_context ();
5634 saved_parent_function_decls = saved_function_decls;
5635 saved_function_decls = NULL_TREE;
5638 trans_function_start (sym);
5640 gfc_init_block (&init);
5642 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
5644 /* Copy length backend_decls to all entry point result
5645 symbols. */
5646 gfc_entry_list *el;
5647 tree backend_decl;
5649 gfc_conv_const_charlen (ns->proc_name->ts.u.cl);
5650 backend_decl = ns->proc_name->result->ts.u.cl->backend_decl;
5651 for (el = ns->entries; el; el = el->next)
5652 el->sym->result->ts.u.cl->backend_decl = backend_decl;
5655 /* Translate COMMON blocks. */
5656 gfc_trans_common (ns);
5658 /* Null the parent fake result declaration if this namespace is
5659 a module function or an external procedures. */
5660 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
5661 || ns->parent == NULL)
5662 parent_fake_result_decl = NULL_TREE;
5664 gfc_generate_contained_functions (ns);
5666 nonlocal_dummy_decls = NULL;
5667 nonlocal_dummy_decl_pset = NULL;
5669 has_coarray_vars = false;
5670 generate_local_vars (ns);
5672 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
5673 generate_coarray_init (ns);
5675 /* Keep the parent fake result declaration in module functions
5676 or external procedures. */
5677 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
5678 || ns->parent == NULL)
5679 current_fake_result_decl = parent_fake_result_decl;
5680 else
5681 current_fake_result_decl = NULL_TREE;
5683 is_recursive = sym->attr.recursive
5684 || (sym->attr.entry_master
5685 && sym->ns->entries->sym->attr.recursive);
5686 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
5687 && !is_recursive
5688 && !gfc_option.flag_recursive)
5690 char * msg;
5692 asprintf (&msg, "Recursive call to nonrecursive procedure '%s'",
5693 sym->name);
5694 recurcheckvar = gfc_create_var (boolean_type_node, "is_recursive");
5695 TREE_STATIC (recurcheckvar) = 1;
5696 DECL_INITIAL (recurcheckvar) = boolean_false_node;
5697 gfc_add_expr_to_block (&init, recurcheckvar);
5698 gfc_trans_runtime_check (true, false, recurcheckvar, &init,
5699 &sym->declared_at, msg);
5700 gfc_add_modify (&init, recurcheckvar, boolean_true_node);
5701 free (msg);
5704 /* Check if an IEEE module is used in the procedure. If so, save
5705 the floating point state. */
5706 ieee = is_ieee_module_used (ns);
5707 if (ieee)
5708 fpstate = save_fp_state (&init);
5710 /* Now generate the code for the body of this function. */
5711 gfc_init_block (&body);
5713 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
5714 && sym->attr.subroutine)
5716 tree alternate_return;
5717 alternate_return = gfc_get_fake_result_decl (sym, 0);
5718 gfc_add_modify (&body, alternate_return, integer_zero_node);
5721 if (ns->entries)
5723 /* Jump to the correct entry point. */
5724 tmp = gfc_trans_entry_master_switch (ns->entries);
5725 gfc_add_expr_to_block (&body, tmp);
5728 /* If bounds-checking is enabled, generate code to check passed in actual
5729 arguments against the expected dummy argument attributes (e.g. string
5730 lengths). */
5731 if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !sym->attr.is_bind_c)
5732 add_argument_checking (&body, sym);
5734 tmp = gfc_trans_code (ns->code);
5735 gfc_add_expr_to_block (&body, tmp);
5737 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
5739 tree result = get_proc_result (sym);
5741 if (result != NULL_TREE && sym->attr.function && !sym->attr.pointer)
5743 if (sym->attr.allocatable && sym->attr.dimension == 0
5744 && sym->result == sym)
5745 gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
5746 null_pointer_node));
5747 else if (sym->ts.type == BT_CLASS
5748 && CLASS_DATA (sym)->attr.allocatable
5749 && CLASS_DATA (sym)->attr.dimension == 0
5750 && sym->result == sym)
5752 tmp = CLASS_DATA (sym)->backend_decl;
5753 tmp = fold_build3_loc (input_location, COMPONENT_REF,
5754 TREE_TYPE (tmp), result, tmp, NULL_TREE);
5755 gfc_add_modify (&init, tmp, fold_convert (TREE_TYPE (tmp),
5756 null_pointer_node));
5758 else if (sym->ts.type == BT_DERIVED
5759 && sym->ts.u.derived->attr.alloc_comp
5760 && !sym->attr.allocatable)
5762 rank = sym->as ? sym->as->rank : 0;
5763 tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, result, rank);
5764 gfc_add_expr_to_block (&init, tmp);
5768 if (result == NULL_TREE)
5770 /* TODO: move to the appropriate place in resolve.c. */
5771 if (warn_return_type && sym == sym->result)
5772 gfc_warning ("Return value of function '%s' at %L not set",
5773 sym->name, &sym->declared_at);
5774 if (warn_return_type)
5775 TREE_NO_WARNING(sym->backend_decl) = 1;
5777 else
5778 gfc_add_expr_to_block (&body, gfc_generate_return ());
5781 gfc_init_block (&cleanup);
5783 /* Reset recursion-check variable. */
5784 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
5785 && !is_recursive
5786 && !gfc_option.gfc_flag_openmp
5787 && recurcheckvar != NULL_TREE)
5789 gfc_add_modify (&cleanup, recurcheckvar, boolean_false_node);
5790 recurcheckvar = NULL;
5793 /* If IEEE modules are loaded, restore the floating-point state. */
5794 if (ieee)
5795 restore_fp_state (&cleanup, fpstate);
5797 /* Finish the function body and add init and cleanup code. */
5798 tmp = gfc_finish_block (&body);
5799 gfc_start_wrapped_block (&try_block, tmp);
5800 /* Add code to create and cleanup arrays. */
5801 gfc_trans_deferred_vars (sym, &try_block);
5802 gfc_add_init_cleanup (&try_block, gfc_finish_block (&init),
5803 gfc_finish_block (&cleanup));
5805 /* Add all the decls we created during processing. */
5806 decl = saved_function_decls;
5807 while (decl)
5809 tree next;
5811 next = DECL_CHAIN (decl);
5812 DECL_CHAIN (decl) = NULL_TREE;
5813 pushdecl (decl);
5814 decl = next;
5816 saved_function_decls = NULL_TREE;
5818 DECL_SAVED_TREE (fndecl) = gfc_finish_wrapped_block (&try_block);
5819 decl = getdecls ();
5821 /* Finish off this function and send it for code generation. */
5822 poplevel (1, 1);
5823 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5825 DECL_SAVED_TREE (fndecl)
5826 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5827 DECL_INITIAL (fndecl));
5829 if (nonlocal_dummy_decls)
5831 BLOCK_VARS (DECL_INITIAL (fndecl))
5832 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl)), nonlocal_dummy_decls);
5833 pointer_set_destroy (nonlocal_dummy_decl_pset);
5834 nonlocal_dummy_decls = NULL;
5835 nonlocal_dummy_decl_pset = NULL;
5838 /* Output the GENERIC tree. */
5839 dump_function (TDI_original, fndecl);
5841 /* Store the end of the function, so that we get good line number
5842 info for the epilogue. */
5843 cfun->function_end_locus = input_location;
5845 /* We're leaving the context of this function, so zap cfun.
5846 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5847 tree_rest_of_compilation. */
5848 set_cfun (NULL);
5850 if (old_context)
5852 pop_function_context ();
5853 saved_function_decls = saved_parent_function_decls;
5855 current_function_decl = old_context;
5857 if (decl_function_context (fndecl))
5859 /* Register this function with cgraph just far enough to get it
5860 added to our parent's nested function list.
5861 If there are static coarrays in this function, the nested _caf_init
5862 function has already called cgraph_create_node, which also created
5863 the cgraph node for this function. */
5864 if (!has_coarray_vars || gfc_option.coarray != GFC_FCOARRAY_LIB)
5865 (void) cgraph_create_node (fndecl);
5867 else
5868 cgraph_finalize_function (fndecl, true);
5870 gfc_trans_use_stmts (ns);
5871 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
5873 if (sym->attr.is_main_program)
5874 create_main_function (fndecl);
5876 current_procedure_symbol = previous_procedure_symbol;
5880 void
5881 gfc_generate_constructors (void)
5883 gcc_assert (gfc_static_ctors == NULL_TREE);
5884 #if 0
5885 tree fnname;
5886 tree type;
5887 tree fndecl;
5888 tree decl;
5889 tree tmp;
5891 if (gfc_static_ctors == NULL_TREE)
5892 return;
5894 fnname = get_file_function_name ("I");
5895 type = build_function_type_list (void_type_node, NULL_TREE);
5897 fndecl = build_decl (input_location,
5898 FUNCTION_DECL, fnname, type);
5899 TREE_PUBLIC (fndecl) = 1;
5901 decl = build_decl (input_location,
5902 RESULT_DECL, NULL_TREE, void_type_node);
5903 DECL_ARTIFICIAL (decl) = 1;
5904 DECL_IGNORED_P (decl) = 1;
5905 DECL_CONTEXT (decl) = fndecl;
5906 DECL_RESULT (fndecl) = decl;
5908 pushdecl (fndecl);
5910 current_function_decl = fndecl;
5912 rest_of_decl_compilation (fndecl, 1, 0);
5914 make_decl_rtl (fndecl);
5916 allocate_struct_function (fndecl, false);
5918 pushlevel ();
5920 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
5922 tmp = build_call_expr_loc (input_location,
5923 TREE_VALUE (gfc_static_ctors), 0);
5924 DECL_SAVED_TREE (fndecl) = build_stmt (input_location, EXPR_STMT, tmp);
5927 decl = getdecls ();
5928 poplevel (1, 1);
5930 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5931 DECL_SAVED_TREE (fndecl)
5932 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5933 DECL_INITIAL (fndecl));
5935 free_after_parsing (cfun);
5936 free_after_compilation (cfun);
5938 tree_rest_of_compilation (fndecl);
5940 current_function_decl = NULL_TREE;
5941 #endif
5944 /* Translates a BLOCK DATA program unit. This means emitting the
5945 commons contained therein plus their initializations. We also emit
5946 a globally visible symbol to make sure that each BLOCK DATA program
5947 unit remains unique. */
5949 void
5950 gfc_generate_block_data (gfc_namespace * ns)
5952 tree decl;
5953 tree id;
5955 /* Tell the backend the source location of the block data. */
5956 if (ns->proc_name)
5957 gfc_set_backend_locus (&ns->proc_name->declared_at);
5958 else
5959 gfc_set_backend_locus (&gfc_current_locus);
5961 /* Process the DATA statements. */
5962 gfc_trans_common (ns);
5964 /* Create a global symbol with the mane of the block data. This is to
5965 generate linker errors if the same name is used twice. It is never
5966 really used. */
5967 if (ns->proc_name)
5968 id = gfc_sym_mangled_function_id (ns->proc_name);
5969 else
5970 id = get_identifier ("__BLOCK_DATA__");
5972 decl = build_decl (input_location,
5973 VAR_DECL, id, gfc_array_index_type);
5974 TREE_PUBLIC (decl) = 1;
5975 TREE_STATIC (decl) = 1;
5976 DECL_IGNORED_P (decl) = 1;
5978 pushdecl (decl);
5979 rest_of_decl_compilation (decl, 1, 0);
5983 /* Process the local variables of a BLOCK construct. */
5985 void
5986 gfc_process_block_locals (gfc_namespace* ns)
5988 tree decl;
5990 gcc_assert (saved_local_decls == NULL_TREE);
5991 has_coarray_vars = false;
5993 generate_local_vars (ns);
5995 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
5996 generate_coarray_init (ns);
5998 decl = saved_local_decls;
5999 while (decl)
6001 tree next;
6003 next = DECL_CHAIN (decl);
6004 DECL_CHAIN (decl) = NULL_TREE;
6005 pushdecl (decl);
6006 decl = next;
6008 saved_local_decls = NULL_TREE;
6012 #include "gt-fortran-trans-decl.h"