1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4 Free Software Foundation, Inc.
5 Contributed by Paul Brook
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* trans-decl.c -- Handling of backend function and variable decls, etc */
27 #include "coretypes.h"
30 #include "tree-dump.h"
31 #include "gimple.h" /* For create_tmp_var_raw. */
33 #include "diagnostic-core.h" /* For internal_error. */
34 #include "toplev.h" /* For announce_function. */
35 #include "output.h" /* For decl_default_tls_model. */
42 #include "pointer-set.h"
43 #include "constructor.h"
45 #include "trans-types.h"
46 #include "trans-array.h"
47 #include "trans-const.h"
48 /* Only for gfc_trans_code. Shouldn't need to include this. */
49 #include "trans-stmt.h"
51 #define MAX_LABEL_VALUE 99999
54 /* Holds the result of the function if no result variable specified. */
56 static GTY(()) tree current_fake_result_decl;
57 static GTY(()) tree parent_fake_result_decl;
60 /* Holds the variable DECLs for the current function. */
62 static GTY(()) tree saved_function_decls;
63 static GTY(()) tree saved_parent_function_decls;
65 static struct pointer_set_t *nonlocal_dummy_decl_pset;
66 static GTY(()) tree nonlocal_dummy_decls;
68 /* Holds the variable DECLs that are locals. */
70 static GTY(()) tree saved_local_decls;
72 /* The namespace of the module we're currently generating. Only used while
73 outputting decls for module variables. Do not rely on this being set. */
75 static gfc_namespace *module_namespace;
77 /* The currently processed procedure symbol. */
78 static gfc_symbol* current_procedure_symbol = NULL;
81 /* With -fcoarray=lib: For generating the registering call
82 of static coarrays. */
83 static bool has_coarray_vars;
84 static stmtblock_t caf_init_block;
87 /* List of static constructor functions. */
89 tree gfc_static_ctors;
92 /* Function declarations for builtin library functions. */
94 tree gfor_fndecl_pause_numeric;
95 tree gfor_fndecl_pause_string;
96 tree gfor_fndecl_stop_numeric;
97 tree gfor_fndecl_stop_numeric_f08;
98 tree gfor_fndecl_stop_string;
99 tree gfor_fndecl_error_stop_numeric;
100 tree gfor_fndecl_error_stop_string;
101 tree gfor_fndecl_runtime_error;
102 tree gfor_fndecl_runtime_error_at;
103 tree gfor_fndecl_runtime_warning_at;
104 tree gfor_fndecl_os_error;
105 tree gfor_fndecl_generate_error;
106 tree gfor_fndecl_set_args;
107 tree gfor_fndecl_set_fpe;
108 tree gfor_fndecl_set_options;
109 tree gfor_fndecl_set_convert;
110 tree gfor_fndecl_set_record_marker;
111 tree gfor_fndecl_set_max_subrecord_length;
112 tree gfor_fndecl_ctime;
113 tree gfor_fndecl_fdate;
114 tree gfor_fndecl_ttynam;
115 tree gfor_fndecl_in_pack;
116 tree gfor_fndecl_in_unpack;
117 tree gfor_fndecl_associated;
120 /* Coarray run-time library function decls. */
121 tree gfor_fndecl_caf_init;
122 tree gfor_fndecl_caf_finalize;
123 tree gfor_fndecl_caf_register;
124 tree gfor_fndecl_caf_critical;
125 tree gfor_fndecl_caf_end_critical;
126 tree gfor_fndecl_caf_sync_all;
127 tree gfor_fndecl_caf_sync_images;
128 tree gfor_fndecl_caf_error_stop;
129 tree gfor_fndecl_caf_error_stop_str;
131 /* Coarray global variables for num_images/this_image. */
133 tree gfort_gvar_caf_num_images;
134 tree gfort_gvar_caf_this_image;
137 /* Math functions. Many other math functions are handled in
138 trans-intrinsic.c. */
140 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
141 tree gfor_fndecl_math_ishftc4;
142 tree gfor_fndecl_math_ishftc8;
143 tree gfor_fndecl_math_ishftc16;
146 /* String functions. */
148 tree gfor_fndecl_compare_string;
149 tree gfor_fndecl_concat_string;
150 tree gfor_fndecl_string_len_trim;
151 tree gfor_fndecl_string_index;
152 tree gfor_fndecl_string_scan;
153 tree gfor_fndecl_string_verify;
154 tree gfor_fndecl_string_trim;
155 tree gfor_fndecl_string_minmax;
156 tree gfor_fndecl_adjustl;
157 tree gfor_fndecl_adjustr;
158 tree gfor_fndecl_select_string;
159 tree gfor_fndecl_compare_string_char4;
160 tree gfor_fndecl_concat_string_char4;
161 tree gfor_fndecl_string_len_trim_char4;
162 tree gfor_fndecl_string_index_char4;
163 tree gfor_fndecl_string_scan_char4;
164 tree gfor_fndecl_string_verify_char4;
165 tree gfor_fndecl_string_trim_char4;
166 tree gfor_fndecl_string_minmax_char4;
167 tree gfor_fndecl_adjustl_char4;
168 tree gfor_fndecl_adjustr_char4;
169 tree gfor_fndecl_select_string_char4;
172 /* Conversion between character kinds. */
173 tree gfor_fndecl_convert_char1_to_char4;
174 tree gfor_fndecl_convert_char4_to_char1;
177 /* Other misc. runtime library functions. */
178 tree gfor_fndecl_size0;
179 tree gfor_fndecl_size1;
180 tree gfor_fndecl_iargc;
182 /* Intrinsic functions implemented in Fortran. */
183 tree gfor_fndecl_sc_kind;
184 tree gfor_fndecl_si_kind;
185 tree gfor_fndecl_sr_kind;
187 /* BLAS gemm functions. */
188 tree gfor_fndecl_sgemm;
189 tree gfor_fndecl_dgemm;
190 tree gfor_fndecl_cgemm;
191 tree gfor_fndecl_zgemm;
195 gfc_add_decl_to_parent_function (tree decl)
198 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
199 DECL_NONLOCAL (decl) = 1;
200 DECL_CHAIN (decl) = saved_parent_function_decls;
201 saved_parent_function_decls = decl;
205 gfc_add_decl_to_function (tree decl)
208 TREE_USED (decl) = 1;
209 DECL_CONTEXT (decl) = current_function_decl;
210 DECL_CHAIN (decl) = saved_function_decls;
211 saved_function_decls = decl;
215 add_decl_as_local (tree decl)
218 TREE_USED (decl) = 1;
219 DECL_CONTEXT (decl) = current_function_decl;
220 DECL_CHAIN (decl) = saved_local_decls;
221 saved_local_decls = decl;
225 /* Build a backend label declaration. Set TREE_USED for named labels.
226 The context of the label is always the current_function_decl. All
227 labels are marked artificial. */
230 gfc_build_label_decl (tree label_id)
232 /* 2^32 temporaries should be enough. */
233 static unsigned int tmp_num = 1;
237 if (label_id == NULL_TREE)
239 /* Build an internal label name. */
240 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
241 label_id = get_identifier (label_name);
246 /* Build the LABEL_DECL node. Labels have no type. */
247 label_decl = build_decl (input_location,
248 LABEL_DECL, label_id, void_type_node);
249 DECL_CONTEXT (label_decl) = current_function_decl;
250 DECL_MODE (label_decl) = VOIDmode;
252 /* We always define the label as used, even if the original source
253 file never references the label. We don't want all kinds of
254 spurious warnings for old-style Fortran code with too many
256 TREE_USED (label_decl) = 1;
258 DECL_ARTIFICIAL (label_decl) = 1;
263 /* Set the backend source location of a decl. */
266 gfc_set_decl_location (tree decl, locus * loc)
268 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
272 /* Return the backend label declaration for a given label structure,
273 or create it if it doesn't exist yet. */
276 gfc_get_label_decl (gfc_st_label * lp)
278 if (lp->backend_decl)
279 return lp->backend_decl;
282 char label_name[GFC_MAX_SYMBOL_LEN + 1];
285 /* Validate the label declaration from the front end. */
286 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
288 /* Build a mangled name for the label. */
289 sprintf (label_name, "__label_%.6d", lp->value);
291 /* Build the LABEL_DECL node. */
292 label_decl = gfc_build_label_decl (get_identifier (label_name));
294 /* Tell the debugger where the label came from. */
295 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
296 gfc_set_decl_location (label_decl, &lp->where);
298 DECL_ARTIFICIAL (label_decl) = 1;
300 /* Store the label in the label list and return the LABEL_DECL. */
301 lp->backend_decl = label_decl;
307 /* Convert a gfc_symbol to an identifier of the same name. */
310 gfc_sym_identifier (gfc_symbol * sym)
312 if (sym->attr.is_main_program && strcmp (sym->name, "main") == 0)
313 return (get_identifier ("MAIN__"));
315 return (get_identifier (sym->name));
319 /* Construct mangled name from symbol name. */
322 gfc_sym_mangled_identifier (gfc_symbol * sym)
324 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
326 /* Prevent the mangling of identifiers that have an assigned
327 binding label (mainly those that are bind(c)). */
328 if (sym->attr.is_bind_c == 1
329 && sym->binding_label[0] != '\0')
330 return get_identifier(sym->binding_label);
332 if (sym->module == NULL)
333 return gfc_sym_identifier (sym);
336 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
337 return get_identifier (name);
342 /* Construct mangled function name from symbol name. */
345 gfc_sym_mangled_function_id (gfc_symbol * sym)
348 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
350 /* It may be possible to simply use the binding label if it's
351 provided, and remove the other checks. Then we could use it
352 for other things if we wished. */
353 if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
354 sym->binding_label[0] != '\0')
355 /* use the binding label rather than the mangled name */
356 return get_identifier (sym->binding_label);
358 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
359 || (sym->module != NULL && (sym->attr.external
360 || sym->attr.if_source == IFSRC_IFBODY)))
362 /* Main program is mangled into MAIN__. */
363 if (sym->attr.is_main_program)
364 return get_identifier ("MAIN__");
366 /* Intrinsic procedures are never mangled. */
367 if (sym->attr.proc == PROC_INTRINSIC)
368 return get_identifier (sym->name);
370 if (gfc_option.flag_underscoring)
372 has_underscore = strchr (sym->name, '_') != 0;
373 if (gfc_option.flag_second_underscore && has_underscore)
374 snprintf (name, sizeof name, "%s__", sym->name);
376 snprintf (name, sizeof name, "%s_", sym->name);
377 return get_identifier (name);
380 return get_identifier (sym->name);
384 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
385 return get_identifier (name);
391 gfc_set_decl_assembler_name (tree decl, tree name)
393 tree target_mangled = targetm.mangle_decl_assembler_name (decl, name);
394 SET_DECL_ASSEMBLER_NAME (decl, target_mangled);
398 /* Returns true if a variable of specified size should go on the stack. */
401 gfc_can_put_var_on_stack (tree size)
403 unsigned HOST_WIDE_INT low;
405 if (!INTEGER_CST_P (size))
408 if (gfc_option.flag_max_stack_var_size < 0)
411 if (TREE_INT_CST_HIGH (size) != 0)
414 low = TREE_INT_CST_LOW (size);
415 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
418 /* TODO: Set a per-function stack size limit. */
424 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
425 an expression involving its corresponding pointer. There are
426 2 cases; one for variable size arrays, and one for everything else,
427 because variable-sized arrays require one fewer level of
431 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
433 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
436 /* Parameters need to be dereferenced. */
437 if (sym->cp_pointer->attr.dummy)
438 ptr_decl = build_fold_indirect_ref_loc (input_location,
441 /* Check to see if we're dealing with a variable-sized array. */
442 if (sym->attr.dimension
443 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
445 /* These decls will be dereferenced later, so we don't dereference
447 value = convert (TREE_TYPE (decl), ptr_decl);
451 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
453 value = build_fold_indirect_ref_loc (input_location,
457 SET_DECL_VALUE_EXPR (decl, value);
458 DECL_HAS_VALUE_EXPR_P (decl) = 1;
459 GFC_DECL_CRAY_POINTEE (decl) = 1;
460 /* This is a fake variable just for debugging purposes. */
461 TREE_ASM_WRITTEN (decl) = 1;
465 /* Finish processing of a declaration without an initial value. */
468 gfc_finish_decl (tree decl)
470 gcc_assert (TREE_CODE (decl) == PARM_DECL
471 || DECL_INITIAL (decl) == NULL_TREE);
473 if (TREE_CODE (decl) != VAR_DECL)
476 if (DECL_SIZE (decl) == NULL_TREE
477 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
478 layout_decl (decl, 0);
480 /* A few consistency checks. */
481 /* A static variable with an incomplete type is an error if it is
482 initialized. Also if it is not file scope. Otherwise, let it
483 through, but if it is not `extern' then it may cause an error
485 /* An automatic variable with an incomplete type is an error. */
487 /* We should know the storage size. */
488 gcc_assert (DECL_SIZE (decl) != NULL_TREE
489 || (TREE_STATIC (decl)
490 ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
491 : DECL_EXTERNAL (decl)));
493 /* The storage size should be constant. */
494 gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
496 || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
500 /* Apply symbol attributes to a variable, and add it to the function scope. */
503 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
506 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
507 This is the equivalent of the TARGET variables.
508 We also need to set this if the variable is passed by reference in a
511 /* Set DECL_VALUE_EXPR for Cray Pointees. */
512 if (sym->attr.cray_pointee)
513 gfc_finish_cray_pointee (decl, sym);
515 if (sym->attr.target)
516 TREE_ADDRESSABLE (decl) = 1;
517 /* If it wasn't used we wouldn't be getting it. */
518 TREE_USED (decl) = 1;
520 if (sym->attr.flavor == FL_PARAMETER
521 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
522 TREE_READONLY (decl) = 1;
524 /* Chain this decl to the pending declarations. Don't do pushdecl()
525 because this would add them to the current scope rather than the
527 if (current_function_decl != NULL_TREE)
529 if (sym->ns->proc_name->backend_decl == current_function_decl
530 || sym->result == sym)
531 gfc_add_decl_to_function (decl);
532 else if (sym->ns->proc_name->attr.flavor == FL_LABEL)
533 /* This is a BLOCK construct. */
534 add_decl_as_local (decl);
536 gfc_add_decl_to_parent_function (decl);
539 if (sym->attr.cray_pointee)
542 if(sym->attr.is_bind_c == 1)
544 /* We need to put variables that are bind(c) into the common
545 segment of the object file, because this is what C would do.
546 gfortran would typically put them in either the BSS or
547 initialized data segments, and only mark them as common if
548 they were part of common blocks. However, if they are not put
549 into common space, then C cannot initialize global Fortran
550 variables that it interoperates with and the draft says that
551 either Fortran or C should be able to initialize it (but not
552 both, of course.) (J3/04-007, section 15.3). */
553 TREE_PUBLIC(decl) = 1;
554 DECL_COMMON(decl) = 1;
557 /* If a variable is USE associated, it's always external. */
558 if (sym->attr.use_assoc)
560 DECL_EXTERNAL (decl) = 1;
561 TREE_PUBLIC (decl) = 1;
563 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
565 /* TODO: Don't set sym->module for result or dummy variables. */
566 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
567 /* This is the declaration of a module variable. */
568 TREE_PUBLIC (decl) = 1;
569 TREE_STATIC (decl) = 1;
572 /* Derived types are a bit peculiar because of the possibility of
573 a default initializer; this must be applied each time the variable
574 comes into scope it therefore need not be static. These variables
575 are SAVE_NONE but have an initializer. Otherwise explicitly
576 initialized variables are SAVE_IMPLICIT and explicitly saved are
578 if (!sym->attr.use_assoc
579 && (sym->attr.save != SAVE_NONE || sym->attr.data
580 || (sym->value && sym->ns->proc_name->attr.is_main_program)
581 || (gfc_option.coarray == GFC_FCOARRAY_LIB
582 && sym->attr.codimension && !sym->attr.allocatable)))
583 TREE_STATIC (decl) = 1;
585 if (sym->attr.volatile_)
587 TREE_THIS_VOLATILE (decl) = 1;
588 TREE_SIDE_EFFECTS (decl) = 1;
589 new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
590 TREE_TYPE (decl) = new_type;
593 /* Keep variables larger than max-stack-var-size off stack. */
594 if (!sym->ns->proc_name->attr.recursive
595 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
596 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
597 /* Put variable length auto array pointers always into stack. */
598 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
599 || sym->attr.dimension == 0
600 || sym->as->type != AS_EXPLICIT
602 || sym->attr.allocatable)
603 && !DECL_ARTIFICIAL (decl))
604 TREE_STATIC (decl) = 1;
606 /* Handle threadprivate variables. */
607 if (sym->attr.threadprivate
608 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
609 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
611 if (!sym->attr.target
612 && !sym->attr.pointer
613 && !sym->attr.cray_pointee
614 && !sym->attr.proc_pointer)
615 DECL_RESTRICTED_P (decl) = 1;
619 /* Allocate the lang-specific part of a decl. */
622 gfc_allocate_lang_decl (tree decl)
624 DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof
628 /* Remember a symbol to generate initialization/cleanup code at function
632 gfc_defer_symbol_init (gfc_symbol * sym)
638 /* Don't add a symbol twice. */
642 last = head = sym->ns->proc_name;
645 /* Make sure that setup code for dummy variables which are used in the
646 setup of other variables is generated first. */
649 /* Find the first dummy arg seen after us, or the first non-dummy arg.
650 This is a circular list, so don't go past the head. */
652 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
658 /* Insert in between last and p. */
664 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
665 backend_decl for a module symbol, if it all ready exists. If the
666 module gsymbol does not exist, it is created. If the symbol does
667 not exist, it is added to the gsymbol namespace. Returns true if
668 an existing backend_decl is found. */
671 gfc_get_module_backend_decl (gfc_symbol *sym)
677 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
679 if (!gsym || (gsym->ns && gsym->type == GSYM_MODULE))
685 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
691 gsym = gfc_get_gsymbol (sym->module);
692 gsym->type = GSYM_MODULE;
693 gsym->ns = gfc_get_namespace (NULL, 0);
696 st = gfc_new_symtree (&gsym->ns->sym_root, sym->name);
700 else if (sym->attr.flavor == FL_DERIVED)
702 if (s && s->attr.flavor == FL_PROCEDURE)
705 gcc_assert (s->attr.generic);
706 for (intr = s->generic; intr; intr = intr->next)
707 if (intr->sym->attr.flavor == FL_DERIVED)
714 if (!s->backend_decl)
715 s->backend_decl = gfc_get_derived_type (s);
716 gfc_copy_dt_decls_ifequal (s, sym, true);
719 else if (s->backend_decl)
721 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
722 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
724 else if (sym->ts.type == BT_CHARACTER)
725 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
726 sym->backend_decl = s->backend_decl;
734 /* Create an array index type variable with function scope. */
737 create_index_var (const char * pfx, int nest)
741 decl = gfc_create_var_np (gfc_array_index_type, pfx);
743 gfc_add_decl_to_parent_function (decl);
745 gfc_add_decl_to_function (decl);
750 /* Create variables to hold all the non-constant bits of info for a
751 descriptorless array. Remember these in the lang-specific part of the
755 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
760 gfc_namespace* procns;
762 type = TREE_TYPE (decl);
764 /* We just use the descriptor, if there is one. */
765 if (GFC_DESCRIPTOR_TYPE_P (type))
768 gcc_assert (GFC_ARRAY_TYPE_P (type));
769 procns = gfc_find_proc_namespace (sym->ns);
770 nest = (procns->proc_name->backend_decl != current_function_decl)
771 && !sym->attr.contained;
773 if (sym->attr.codimension && gfc_option.coarray == GFC_FCOARRAY_LIB
774 && sym->as->type != AS_ASSUMED_SHAPE
775 && GFC_TYPE_ARRAY_CAF_TOKEN (type) == NULL_TREE)
779 token = gfc_create_var_np (build_qualified_type (pvoid_type_node,
782 GFC_TYPE_ARRAY_CAF_TOKEN (type) = token;
783 DECL_ARTIFICIAL (token) = 1;
784 TREE_STATIC (token) = 1;
785 gfc_add_decl_to_function (token);
788 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
790 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
792 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
793 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
795 /* Don't try to use the unknown bound for assumed shape arrays. */
796 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
797 && (sym->as->type != AS_ASSUMED_SIZE
798 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
800 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
801 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
804 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
806 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
807 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
810 for (dim = GFC_TYPE_ARRAY_RANK (type);
811 dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type); dim++)
813 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
815 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
816 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
818 /* Don't try to use the unknown ubound for the last coarray dimension. */
819 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
820 && dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type) - 1)
822 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
823 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
826 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
828 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
830 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
833 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
835 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
838 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
839 && sym->as->type != AS_ASSUMED_SIZE)
841 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
842 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
845 if (POINTER_TYPE_P (type))
847 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
848 gcc_assert (TYPE_LANG_SPECIFIC (type)
849 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
850 type = TREE_TYPE (type);
853 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
857 size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
858 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
859 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
861 TYPE_DOMAIN (type) = range;
865 if (TYPE_NAME (type) != NULL_TREE
866 && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE
867 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL)
869 tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
871 for (dim = 0; dim < sym->as->rank - 1; dim++)
873 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
874 gtype = TREE_TYPE (gtype);
876 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
877 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL)
878 TYPE_NAME (type) = NULL_TREE;
881 if (TYPE_NAME (type) == NULL_TREE)
883 tree gtype = TREE_TYPE (type), rtype, type_decl;
885 for (dim = sym->as->rank - 1; dim >= 0; dim--)
888 lbound = GFC_TYPE_ARRAY_LBOUND (type, dim);
889 ubound = GFC_TYPE_ARRAY_UBOUND (type, dim);
890 rtype = build_range_type (gfc_array_index_type, lbound, ubound);
891 gtype = build_array_type (gtype, rtype);
892 /* Ensure the bound variables aren't optimized out at -O0.
893 For -O1 and above they often will be optimized out, but
894 can be tracked by VTA. Also set DECL_NAMELESS, so that
895 the artificial lbound.N or ubound.N DECL_NAME doesn't
896 end up in debug info. */
897 if (lbound && TREE_CODE (lbound) == VAR_DECL
898 && DECL_ARTIFICIAL (lbound) && DECL_IGNORED_P (lbound))
900 if (DECL_NAME (lbound)
901 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound)),
903 DECL_NAMELESS (lbound) = 1;
904 DECL_IGNORED_P (lbound) = 0;
906 if (ubound && TREE_CODE (ubound) == VAR_DECL
907 && DECL_ARTIFICIAL (ubound) && DECL_IGNORED_P (ubound))
909 if (DECL_NAME (ubound)
910 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound)),
912 DECL_NAMELESS (ubound) = 1;
913 DECL_IGNORED_P (ubound) = 0;
916 TYPE_NAME (type) = type_decl = build_decl (input_location,
917 TYPE_DECL, NULL, gtype);
918 DECL_ORIGINAL_TYPE (type_decl) = gtype;
923 /* For some dummy arguments we don't use the actual argument directly.
924 Instead we create a local decl and use that. This allows us to perform
925 initialization, and construct full type information. */
928 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
938 if (sym->attr.pointer || sym->attr.allocatable)
941 /* Add to list of variables if not a fake result variable. */
942 if (sym->attr.result || sym->attr.dummy)
943 gfc_defer_symbol_init (sym);
945 type = TREE_TYPE (dummy);
946 gcc_assert (TREE_CODE (dummy) == PARM_DECL
947 && POINTER_TYPE_P (type));
949 /* Do we know the element size? */
950 known_size = sym->ts.type != BT_CHARACTER
951 || INTEGER_CST_P (sym->ts.u.cl->backend_decl);
953 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
955 /* For descriptorless arrays with known element size the actual
956 argument is sufficient. */
957 gcc_assert (GFC_ARRAY_TYPE_P (type));
958 gfc_build_qualified_array (dummy, sym);
962 type = TREE_TYPE (type);
963 if (GFC_DESCRIPTOR_TYPE_P (type))
965 /* Create a descriptorless array pointer. */
969 /* Even when -frepack-arrays is used, symbols with TARGET attribute
971 if (!gfc_option.flag_repack_arrays || sym->attr.target)
973 if (as->type == AS_ASSUMED_SIZE)
974 packed = PACKED_FULL;
978 if (as->type == AS_EXPLICIT)
980 packed = PACKED_FULL;
981 for (n = 0; n < as->rank; n++)
985 && as->upper[n]->expr_type == EXPR_CONSTANT
986 && as->lower[n]->expr_type == EXPR_CONSTANT))
987 packed = PACKED_PARTIAL;
991 packed = PACKED_PARTIAL;
994 type = gfc_typenode_for_spec (&sym->ts);
995 type = gfc_get_nodesc_array_type (type, sym->as, packed,
1000 /* We now have an expression for the element size, so create a fully
1001 qualified type. Reset sym->backend decl or this will just return the
1003 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1004 sym->backend_decl = NULL_TREE;
1005 type = gfc_sym_type (sym);
1006 packed = PACKED_FULL;
1009 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
1010 decl = build_decl (input_location,
1011 VAR_DECL, get_identifier (name), type);
1013 DECL_ARTIFICIAL (decl) = 1;
1014 DECL_NAMELESS (decl) = 1;
1015 TREE_PUBLIC (decl) = 0;
1016 TREE_STATIC (decl) = 0;
1017 DECL_EXTERNAL (decl) = 0;
1019 /* We should never get deferred shape arrays here. We used to because of
1021 gcc_assert (sym->as->type != AS_DEFERRED);
1023 if (packed == PACKED_PARTIAL)
1024 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
1025 else if (packed == PACKED_FULL)
1026 GFC_DECL_PACKED_ARRAY (decl) = 1;
1028 gfc_build_qualified_array (decl, sym);
1030 if (DECL_LANG_SPECIFIC (dummy))
1031 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
1033 gfc_allocate_lang_decl (decl);
1035 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
1037 if (sym->ns->proc_name->backend_decl == current_function_decl
1038 || sym->attr.contained)
1039 gfc_add_decl_to_function (decl);
1041 gfc_add_decl_to_parent_function (decl);
1046 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
1047 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
1048 pointing to the artificial variable for debug info purposes. */
1051 gfc_nonlocal_dummy_array_decl (gfc_symbol *sym)
1055 if (! nonlocal_dummy_decl_pset)
1056 nonlocal_dummy_decl_pset = pointer_set_create ();
1058 if (pointer_set_insert (nonlocal_dummy_decl_pset, sym->backend_decl))
1061 dummy = GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl);
1062 decl = build_decl (input_location, VAR_DECL, DECL_NAME (dummy),
1063 TREE_TYPE (sym->backend_decl));
1064 DECL_ARTIFICIAL (decl) = 0;
1065 TREE_USED (decl) = 1;
1066 TREE_PUBLIC (decl) = 0;
1067 TREE_STATIC (decl) = 0;
1068 DECL_EXTERNAL (decl) = 0;
1069 if (DECL_BY_REFERENCE (dummy))
1070 DECL_BY_REFERENCE (decl) = 1;
1071 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (sym->backend_decl);
1072 SET_DECL_VALUE_EXPR (decl, sym->backend_decl);
1073 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1074 DECL_CONTEXT (decl) = DECL_CONTEXT (sym->backend_decl);
1075 DECL_CHAIN (decl) = nonlocal_dummy_decls;
1076 nonlocal_dummy_decls = decl;
1079 /* Return a constant or a variable to use as a string length. Does not
1080 add the decl to the current scope. */
1083 gfc_create_string_length (gfc_symbol * sym)
1085 gcc_assert (sym->ts.u.cl);
1086 gfc_conv_const_charlen (sym->ts.u.cl);
1088 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1091 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1093 /* Also prefix the mangled name. */
1094 strcpy (&name[1], sym->name);
1096 length = build_decl (input_location,
1097 VAR_DECL, get_identifier (name),
1098 gfc_charlen_type_node);
1099 DECL_ARTIFICIAL (length) = 1;
1100 TREE_USED (length) = 1;
1101 if (sym->ns->proc_name->tlink != NULL)
1102 gfc_defer_symbol_init (sym);
1104 sym->ts.u.cl->backend_decl = length;
1107 gcc_assert (sym->ts.u.cl->backend_decl != NULL_TREE);
1108 return sym->ts.u.cl->backend_decl;
1111 /* If a variable is assigned a label, we add another two auxiliary
1115 gfc_add_assign_aux_vars (gfc_symbol * sym)
1121 gcc_assert (sym->backend_decl);
1123 decl = sym->backend_decl;
1124 gfc_allocate_lang_decl (decl);
1125 GFC_DECL_ASSIGN (decl) = 1;
1126 length = build_decl (input_location,
1127 VAR_DECL, create_tmp_var_name (sym->name),
1128 gfc_charlen_type_node);
1129 addr = build_decl (input_location,
1130 VAR_DECL, create_tmp_var_name (sym->name),
1132 gfc_finish_var_decl (length, sym);
1133 gfc_finish_var_decl (addr, sym);
1134 /* STRING_LENGTH is also used as flag. Less than -1 means that
1135 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1136 target label's address. Otherwise, value is the length of a format string
1137 and ASSIGN_ADDR is its address. */
1138 if (TREE_STATIC (length))
1139 DECL_INITIAL (length) = build_int_cst (gfc_charlen_type_node, -2);
1141 gfc_defer_symbol_init (sym);
1143 GFC_DECL_STRING_LEN (decl) = length;
1144 GFC_DECL_ASSIGN_ADDR (decl) = addr;
1149 add_attributes_to_decl (symbol_attribute sym_attr, tree list)
1154 for (id = 0; id < EXT_ATTR_NUM; id++)
1155 if (sym_attr.ext_attr & (1 << id))
1157 attr = build_tree_list (
1158 get_identifier (ext_attr_list[id].middle_end_name),
1160 list = chainon (list, attr);
1167 static void build_function_decl (gfc_symbol * sym, bool global);
1170 /* Return the decl for a gfc_symbol, create it if it doesn't already
1174 gfc_get_symbol_decl (gfc_symbol * sym)
1177 tree length = NULL_TREE;
1180 bool intrinsic_array_parameter = false;
1182 gcc_assert (sym->attr.referenced
1183 || sym->attr.use_assoc
1184 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY
1185 || (sym->module && sym->attr.if_source != IFSRC_DECL
1186 && sym->backend_decl));
1188 if (sym->ns && sym->ns->proc_name && sym->ns->proc_name->attr.function)
1189 byref = gfc_return_by_reference (sym->ns->proc_name);
1193 /* Make sure that the vtab for the declared type is completed. */
1194 if (sym->ts.type == BT_CLASS)
1196 gfc_component *c = CLASS_DATA (sym);
1197 if (!c->ts.u.derived->backend_decl)
1199 gfc_find_derived_vtab (c->ts.u.derived);
1200 gfc_get_derived_type (sym->ts.u.derived);
1204 /* All deferred character length procedures need to retain the backend
1205 decl, which is a pointer to the character length in the caller's
1206 namespace and to declare a local character length. */
1207 if (!byref && sym->attr.function
1208 && sym->ts.type == BT_CHARACTER
1210 && sym->ts.u.cl->passed_length == NULL
1211 && sym->ts.u.cl->backend_decl
1212 && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL)
1214 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1215 sym->ts.u.cl->backend_decl = NULL_TREE;
1216 length = gfc_create_string_length (sym);
1219 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
1221 /* Return via extra parameter. */
1222 if (sym->attr.result && byref
1223 && !sym->backend_decl)
1226 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
1227 /* For entry master function skip over the __entry
1229 if (sym->ns->proc_name->attr.entry_master)
1230 sym->backend_decl = DECL_CHAIN (sym->backend_decl);
1233 /* Dummy variables should already have been created. */
1234 gcc_assert (sym->backend_decl);
1236 /* Create a character length variable. */
1237 if (sym->ts.type == BT_CHARACTER)
1239 /* For a deferred dummy, make a new string length variable. */
1240 if (sym->ts.deferred
1242 (sym->ts.u.cl->passed_length == sym->ts.u.cl->backend_decl))
1243 sym->ts.u.cl->backend_decl = NULL_TREE;
1245 if (sym->ts.deferred && sym->attr.result
1246 && sym->ts.u.cl->passed_length == NULL
1247 && sym->ts.u.cl->backend_decl)
1249 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1250 sym->ts.u.cl->backend_decl = NULL_TREE;
1253 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1254 length = gfc_create_string_length (sym);
1256 length = sym->ts.u.cl->backend_decl;
1257 if (TREE_CODE (length) == VAR_DECL
1258 && DECL_FILE_SCOPE_P (length))
1260 /* Add the string length to the same context as the symbol. */
1261 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
1262 gfc_add_decl_to_function (length);
1264 gfc_add_decl_to_parent_function (length);
1266 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
1267 DECL_CONTEXT (length));
1269 gfc_defer_symbol_init (sym);
1273 /* Use a copy of the descriptor for dummy arrays. */
1274 if ((sym->attr.dimension || sym->attr.codimension)
1275 && !TREE_USED (sym->backend_decl))
1277 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
1278 /* Prevent the dummy from being detected as unused if it is copied. */
1279 if (sym->backend_decl != NULL && decl != sym->backend_decl)
1280 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1281 sym->backend_decl = decl;
1284 TREE_USED (sym->backend_decl) = 1;
1285 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
1287 gfc_add_assign_aux_vars (sym);
1290 if (sym->attr.dimension
1291 && DECL_LANG_SPECIFIC (sym->backend_decl)
1292 && GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl)
1293 && DECL_CONTEXT (sym->backend_decl) != current_function_decl)
1294 gfc_nonlocal_dummy_array_decl (sym);
1296 return sym->backend_decl;
1299 if (sym->backend_decl)
1300 return sym->backend_decl;
1302 /* Special case for array-valued named constants from intrinsic
1303 procedures; those are inlined. */
1304 if (sym->attr.use_assoc && sym->from_intmod
1305 && sym->attr.flavor == FL_PARAMETER)
1306 intrinsic_array_parameter = true;
1308 /* If use associated and whole file compilation, use the module
1310 if (gfc_option.flag_whole_file
1311 && (sym->attr.flavor == FL_VARIABLE
1312 || sym->attr.flavor == FL_PARAMETER)
1313 && sym->attr.use_assoc
1314 && !intrinsic_array_parameter
1316 && gfc_get_module_backend_decl (sym))
1317 return sym->backend_decl;
1319 if (sym->attr.flavor == FL_PROCEDURE)
1321 /* Catch function declarations. Only used for actual parameters,
1322 procedure pointers and procptr initialization targets. */
1323 if (sym->attr.external || sym->attr.use_assoc || sym->attr.intrinsic)
1325 decl = gfc_get_extern_function_decl (sym);
1326 gfc_set_decl_location (decl, &sym->declared_at);
1330 if (!sym->backend_decl)
1331 build_function_decl (sym, false);
1332 decl = sym->backend_decl;
1337 if (sym->attr.intrinsic)
1338 internal_error ("intrinsic variable which isn't a procedure");
1340 /* Create string length decl first so that they can be used in the
1341 type declaration. */
1342 if (sym->ts.type == BT_CHARACTER)
1343 length = gfc_create_string_length (sym);
1345 /* Create the decl for the variable. */
1346 decl = build_decl (sym->declared_at.lb->location,
1347 VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
1349 /* Add attributes to variables. Functions are handled elsewhere. */
1350 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1351 decl_attributes (&decl, attributes, 0);
1353 /* Symbols from modules should have their assembler names mangled.
1354 This is done here rather than in gfc_finish_var_decl because it
1355 is different for string length variables. */
1358 gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
1359 if (sym->attr.use_assoc && !intrinsic_array_parameter)
1360 DECL_IGNORED_P (decl) = 1;
1363 if (sym->attr.dimension || sym->attr.codimension)
1365 /* Create variables to hold the non-constant bits of array info. */
1366 gfc_build_qualified_array (decl, sym);
1368 if (sym->attr.contiguous
1369 || ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer))
1370 GFC_DECL_PACKED_ARRAY (decl) = 1;
1373 /* Remember this variable for allocation/cleanup. */
1374 if (sym->attr.dimension || sym->attr.allocatable || sym->attr.codimension
1375 || (sym->ts.type == BT_CLASS &&
1376 (CLASS_DATA (sym)->attr.dimension
1377 || CLASS_DATA (sym)->attr.allocatable))
1378 || (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
1379 /* This applies a derived type default initializer. */
1380 || (sym->ts.type == BT_DERIVED
1381 && sym->attr.save == SAVE_NONE
1383 && !sym->attr.allocatable
1384 && (sym->value && !sym->ns->proc_name->attr.is_main_program)
1385 && !(sym->attr.use_assoc && !intrinsic_array_parameter)))
1386 gfc_defer_symbol_init (sym);
1388 gfc_finish_var_decl (decl, sym);
1390 if (sym->ts.type == BT_CHARACTER)
1392 /* Character variables need special handling. */
1393 gfc_allocate_lang_decl (decl);
1395 if (TREE_CODE (length) != INTEGER_CST)
1397 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1401 /* Also prefix the mangled name for symbols from modules. */
1402 strcpy (&name[1], sym->name);
1405 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
1406 gfc_set_decl_assembler_name (decl, get_identifier (name));
1408 gfc_finish_var_decl (length, sym);
1409 gcc_assert (!sym->value);
1412 else if (sym->attr.subref_array_pointer)
1414 /* We need the span for these beasts. */
1415 gfc_allocate_lang_decl (decl);
1418 if (sym->attr.subref_array_pointer)
1421 GFC_DECL_SUBREF_ARRAY_P (decl) = 1;
1422 span = build_decl (input_location,
1423 VAR_DECL, create_tmp_var_name ("span"),
1424 gfc_array_index_type);
1425 gfc_finish_var_decl (span, sym);
1426 TREE_STATIC (span) = TREE_STATIC (decl);
1427 DECL_ARTIFICIAL (span) = 1;
1428 DECL_INITIAL (span) = build_int_cst (gfc_array_index_type, 0);
1430 GFC_DECL_SPAN (decl) = span;
1431 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span;
1434 sym->backend_decl = decl;
1436 if (sym->attr.assign)
1437 gfc_add_assign_aux_vars (sym);
1439 if (intrinsic_array_parameter)
1441 TREE_STATIC (decl) = 1;
1442 DECL_EXTERNAL (decl) = 0;
1445 if (TREE_STATIC (decl)
1446 && !(sym->attr.use_assoc && !intrinsic_array_parameter)
1447 && (sym->attr.save || sym->ns->proc_name->attr.is_main_program
1448 || gfc_option.flag_max_stack_var_size == 0
1449 || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
1450 && (gfc_option.coarray != GFC_FCOARRAY_LIB
1451 || !sym->attr.codimension || sym->attr.allocatable))
1453 /* Add static initializer. For procedures, it is only needed if
1454 SAVE is specified otherwise they need to be reinitialized
1455 every time the procedure is entered. The TREE_STATIC is
1456 in this case due to -fmax-stack-var-size=. */
1457 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1460 || (sym->attr.codimension
1461 && sym->attr.allocatable),
1463 || sym->attr.allocatable,
1464 sym->attr.proc_pointer);
1467 if (!TREE_STATIC (decl)
1468 && POINTER_TYPE_P (TREE_TYPE (decl))
1469 && !sym->attr.pointer
1470 && !sym->attr.allocatable
1471 && !sym->attr.proc_pointer)
1472 DECL_BY_REFERENCE (decl) = 1;
1475 || (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0))
1476 GFC_DECL_PUSH_TOPLEVEL (decl) = 1;
1482 /* Substitute a temporary variable in place of the real one. */
1485 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1487 save->attr = sym->attr;
1488 save->decl = sym->backend_decl;
1490 gfc_clear_attr (&sym->attr);
1491 sym->attr.referenced = 1;
1492 sym->attr.flavor = FL_VARIABLE;
1494 sym->backend_decl = decl;
1498 /* Restore the original variable. */
1501 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1503 sym->attr = save->attr;
1504 sym->backend_decl = save->decl;
1508 /* Declare a procedure pointer. */
1511 get_proc_pointer_decl (gfc_symbol *sym)
1516 decl = sym->backend_decl;
1520 decl = build_decl (input_location,
1521 VAR_DECL, get_identifier (sym->name),
1522 build_pointer_type (gfc_get_function_type (sym)));
1524 if ((sym->ns->proc_name
1525 && sym->ns->proc_name->backend_decl == current_function_decl)
1526 || sym->attr.contained)
1527 gfc_add_decl_to_function (decl);
1528 else if (sym->ns->proc_name->attr.flavor != FL_MODULE)
1529 gfc_add_decl_to_parent_function (decl);
1531 sym->backend_decl = decl;
1533 /* If a variable is USE associated, it's always external. */
1534 if (sym->attr.use_assoc)
1536 DECL_EXTERNAL (decl) = 1;
1537 TREE_PUBLIC (decl) = 1;
1539 else if (sym->module && sym->ns->proc_name->attr.flavor == FL_MODULE)
1541 /* This is the declaration of a module variable. */
1542 TREE_PUBLIC (decl) = 1;
1543 TREE_STATIC (decl) = 1;
1546 if (!sym->attr.use_assoc
1547 && (sym->attr.save != SAVE_NONE || sym->attr.data
1548 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
1549 TREE_STATIC (decl) = 1;
1551 if (TREE_STATIC (decl) && sym->value)
1553 /* Add static initializer. */
1554 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1556 sym->attr.dimension,
1560 /* Handle threadprivate procedure pointers. */
1561 if (sym->attr.threadprivate
1562 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
1563 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
1565 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1566 decl_attributes (&decl, attributes, 0);
1572 /* Get a basic decl for an external function. */
1575 gfc_get_extern_function_decl (gfc_symbol * sym)
1581 gfc_intrinsic_sym *isym;
1583 char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'. */
1588 if (sym->backend_decl)
1589 return sym->backend_decl;
1591 /* We should never be creating external decls for alternate entry points.
1592 The procedure may be an alternate entry point, but we don't want/need
1594 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1596 if (sym->attr.proc_pointer)
1597 return get_proc_pointer_decl (sym);
1599 /* See if this is an external procedure from the same file. If so,
1600 return the backend_decl. */
1601 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name);
1603 if (gfc_option.flag_whole_file
1604 && (!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL)
1605 && !sym->backend_decl
1607 && ((gsym->type == GSYM_SUBROUTINE) || (gsym->type == GSYM_FUNCTION))
1608 && (gsym->ns->proc_name->backend_decl || !sym->attr.intrinsic))
1610 if (!gsym->ns->proc_name->backend_decl)
1612 /* By construction, the external function cannot be
1613 a contained procedure. */
1615 tree save_fn_decl = current_function_decl;
1617 current_function_decl = NULL_TREE;
1618 gfc_save_backend_locus (&old_loc);
1621 gfc_create_function_decl (gsym->ns, true);
1624 gfc_restore_backend_locus (&old_loc);
1625 current_function_decl = save_fn_decl;
1628 /* If the namespace has entries, the proc_name is the
1629 entry master. Find the entry and use its backend_decl.
1630 otherwise, use the proc_name backend_decl. */
1631 if (gsym->ns->entries)
1633 gfc_entry_list *entry = gsym->ns->entries;
1635 for (; entry; entry = entry->next)
1637 if (strcmp (gsym->name, entry->sym->name) == 0)
1639 sym->backend_decl = entry->sym->backend_decl;
1645 sym->backend_decl = gsym->ns->proc_name->backend_decl;
1647 if (sym->backend_decl)
1649 /* Avoid problems of double deallocation of the backend declaration
1650 later in gfc_trans_use_stmts; cf. PR 45087. */
1651 if (sym->attr.if_source != IFSRC_DECL && sym->attr.use_assoc)
1652 sym->attr.use_assoc = 0;
1654 return sym->backend_decl;
1658 /* See if this is a module procedure from the same file. If so,
1659 return the backend_decl. */
1661 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
1663 if (gfc_option.flag_whole_file
1665 && gsym->type == GSYM_MODULE)
1670 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
1671 if (s && s->backend_decl)
1673 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
1674 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
1676 else if (sym->ts.type == BT_CHARACTER)
1677 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
1678 sym->backend_decl = s->backend_decl;
1679 return sym->backend_decl;
1683 if (sym->attr.intrinsic)
1685 /* Call the resolution function to get the actual name. This is
1686 a nasty hack which relies on the resolution functions only looking
1687 at the first argument. We pass NULL for the second argument
1688 otherwise things like AINT get confused. */
1689 isym = gfc_find_function (sym->name);
1690 gcc_assert (isym->resolve.f0 != NULL);
1692 memset (&e, 0, sizeof (e));
1693 e.expr_type = EXPR_FUNCTION;
1695 memset (&argexpr, 0, sizeof (argexpr));
1696 gcc_assert (isym->formal);
1697 argexpr.ts = isym->formal->ts;
1699 if (isym->formal->next == NULL)
1700 isym->resolve.f1 (&e, &argexpr);
1703 if (isym->formal->next->next == NULL)
1704 isym->resolve.f2 (&e, &argexpr, NULL);
1707 if (isym->formal->next->next->next == NULL)
1708 isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1711 /* All specific intrinsics take less than 5 arguments. */
1712 gcc_assert (isym->formal->next->next->next->next == NULL);
1713 isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
1718 if (gfc_option.flag_f2c
1719 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1720 || e.ts.type == BT_COMPLEX))
1722 /* Specific which needs a different implementation if f2c
1723 calling conventions are used. */
1724 sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1727 sprintf (s, "_gfortran_specific%s", e.value.function.name);
1729 name = get_identifier (s);
1730 mangled_name = name;
1734 name = gfc_sym_identifier (sym);
1735 mangled_name = gfc_sym_mangled_function_id (sym);
1738 type = gfc_get_function_type (sym);
1739 fndecl = build_decl (input_location,
1740 FUNCTION_DECL, name, type);
1742 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1743 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1744 the opposite of declaring a function as static in C). */
1745 DECL_EXTERNAL (fndecl) = 1;
1746 TREE_PUBLIC (fndecl) = 1;
1748 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1749 decl_attributes (&fndecl, attributes, 0);
1751 gfc_set_decl_assembler_name (fndecl, mangled_name);
1753 /* Set the context of this decl. */
1754 if (0 && sym->ns && sym->ns->proc_name)
1756 /* TODO: Add external decls to the appropriate scope. */
1757 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1761 /* Global declaration, e.g. intrinsic subroutine. */
1762 DECL_CONTEXT (fndecl) = NULL_TREE;
1765 /* Set attributes for PURE functions. A call to PURE function in the
1766 Fortran 95 sense is both pure and without side effects in the C
1768 if (sym->attr.pure || sym->attr.elemental)
1770 if (sym->attr.function && !gfc_return_by_reference (sym))
1771 DECL_PURE_P (fndecl) = 1;
1772 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1773 parameters and don't use alternate returns (is this
1774 allowed?). In that case, calls to them are meaningless, and
1775 can be optimized away. See also in build_function_decl(). */
1776 TREE_SIDE_EFFECTS (fndecl) = 0;
1779 /* Mark non-returning functions. */
1780 if (sym->attr.noreturn)
1781 TREE_THIS_VOLATILE(fndecl) = 1;
1783 sym->backend_decl = fndecl;
1785 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1786 pushdecl_top_level (fndecl);
1792 /* Create a declaration for a procedure. For external functions (in the C
1793 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1794 a master function with alternate entry points. */
1797 build_function_decl (gfc_symbol * sym, bool global)
1799 tree fndecl, type, attributes;
1800 symbol_attribute attr;
1802 gfc_formal_arglist *f;
1804 gcc_assert (!sym->attr.external);
1806 if (sym->backend_decl)
1809 /* Set the line and filename. sym->declared_at seems to point to the
1810 last statement for subroutines, but it'll do for now. */
1811 gfc_set_backend_locus (&sym->declared_at);
1813 /* Allow only one nesting level. Allow public declarations. */
1814 gcc_assert (current_function_decl == NULL_TREE
1815 || DECL_FILE_SCOPE_P (current_function_decl)
1816 || (TREE_CODE (DECL_CONTEXT (current_function_decl))
1817 == NAMESPACE_DECL));
1819 type = gfc_get_function_type (sym);
1820 fndecl = build_decl (input_location,
1821 FUNCTION_DECL, gfc_sym_identifier (sym), type);
1825 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1826 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1827 the opposite of declaring a function as static in C). */
1828 DECL_EXTERNAL (fndecl) = 0;
1830 if (!current_function_decl
1831 && !sym->attr.entry_master && !sym->attr.is_main_program)
1832 TREE_PUBLIC (fndecl) = 1;
1834 attributes = add_attributes_to_decl (attr, NULL_TREE);
1835 decl_attributes (&fndecl, attributes, 0);
1837 /* Figure out the return type of the declared function, and build a
1838 RESULT_DECL for it. If this is a subroutine with alternate
1839 returns, build a RESULT_DECL for it. */
1840 result_decl = NULL_TREE;
1841 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1844 if (gfc_return_by_reference (sym))
1845 type = void_type_node;
1848 if (sym->result != sym)
1849 result_decl = gfc_sym_identifier (sym->result);
1851 type = TREE_TYPE (TREE_TYPE (fndecl));
1856 /* Look for alternate return placeholders. */
1857 int has_alternate_returns = 0;
1858 for (f = sym->formal; f; f = f->next)
1862 has_alternate_returns = 1;
1867 if (has_alternate_returns)
1868 type = integer_type_node;
1870 type = void_type_node;
1873 result_decl = build_decl (input_location,
1874 RESULT_DECL, result_decl, type);
1875 DECL_ARTIFICIAL (result_decl) = 1;
1876 DECL_IGNORED_P (result_decl) = 1;
1877 DECL_CONTEXT (result_decl) = fndecl;
1878 DECL_RESULT (fndecl) = result_decl;
1880 /* Don't call layout_decl for a RESULT_DECL.
1881 layout_decl (result_decl, 0); */
1883 /* TREE_STATIC means the function body is defined here. */
1884 TREE_STATIC (fndecl) = 1;
1886 /* Set attributes for PURE functions. A call to a PURE function in the
1887 Fortran 95 sense is both pure and without side effects in the C
1889 if (attr.pure || attr.elemental)
1891 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1892 including an alternate return. In that case it can also be
1893 marked as PURE. See also in gfc_get_extern_function_decl(). */
1894 if (attr.function && !gfc_return_by_reference (sym))
1895 DECL_PURE_P (fndecl) = 1;
1896 TREE_SIDE_EFFECTS (fndecl) = 0;
1900 /* Layout the function declaration and put it in the binding level
1901 of the current function. */
1904 || (sym->name[0] == '_' && strncmp ("__copy", sym->name, 6) == 0))
1905 pushdecl_top_level (fndecl);
1909 /* Perform name mangling if this is a top level or module procedure. */
1910 if (current_function_decl == NULL_TREE)
1911 gfc_set_decl_assembler_name (fndecl, gfc_sym_mangled_function_id (sym));
1913 sym->backend_decl = fndecl;
1917 /* Create the DECL_ARGUMENTS for a procedure. */
1920 create_function_arglist (gfc_symbol * sym)
1923 gfc_formal_arglist *f;
1924 tree typelist, hidden_typelist;
1925 tree arglist, hidden_arglist;
1929 fndecl = sym->backend_decl;
1931 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1932 the new FUNCTION_DECL node. */
1933 arglist = NULL_TREE;
1934 hidden_arglist = NULL_TREE;
1935 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1937 if (sym->attr.entry_master)
1939 type = TREE_VALUE (typelist);
1940 parm = build_decl (input_location,
1941 PARM_DECL, get_identifier ("__entry"), type);
1943 DECL_CONTEXT (parm) = fndecl;
1944 DECL_ARG_TYPE (parm) = type;
1945 TREE_READONLY (parm) = 1;
1946 gfc_finish_decl (parm);
1947 DECL_ARTIFICIAL (parm) = 1;
1949 arglist = chainon (arglist, parm);
1950 typelist = TREE_CHAIN (typelist);
1953 if (gfc_return_by_reference (sym))
1955 tree type = TREE_VALUE (typelist), length = NULL;
1957 if (sym->ts.type == BT_CHARACTER)
1959 /* Length of character result. */
1960 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1962 length = build_decl (input_location,
1964 get_identifier (".__result"),
1966 if (!sym->ts.u.cl->length)
1968 sym->ts.u.cl->backend_decl = length;
1969 TREE_USED (length) = 1;
1971 gcc_assert (TREE_CODE (length) == PARM_DECL);
1972 DECL_CONTEXT (length) = fndecl;
1973 DECL_ARG_TYPE (length) = len_type;
1974 TREE_READONLY (length) = 1;
1975 DECL_ARTIFICIAL (length) = 1;
1976 gfc_finish_decl (length);
1977 if (sym->ts.u.cl->backend_decl == NULL
1978 || sym->ts.u.cl->backend_decl == length)
1983 if (sym->ts.u.cl->backend_decl == NULL)
1985 tree len = build_decl (input_location,
1987 get_identifier ("..__result"),
1988 gfc_charlen_type_node);
1989 DECL_ARTIFICIAL (len) = 1;
1990 TREE_USED (len) = 1;
1991 sym->ts.u.cl->backend_decl = len;
1994 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1995 arg = sym->result ? sym->result : sym;
1996 backend_decl = arg->backend_decl;
1997 /* Temporary clear it, so that gfc_sym_type creates complete
1999 arg->backend_decl = NULL;
2000 type = gfc_sym_type (arg);
2001 arg->backend_decl = backend_decl;
2002 type = build_reference_type (type);
2006 parm = build_decl (input_location,
2007 PARM_DECL, get_identifier ("__result"), type);
2009 DECL_CONTEXT (parm) = fndecl;
2010 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2011 TREE_READONLY (parm) = 1;
2012 DECL_ARTIFICIAL (parm) = 1;
2013 gfc_finish_decl (parm);
2015 arglist = chainon (arglist, parm);
2016 typelist = TREE_CHAIN (typelist);
2018 if (sym->ts.type == BT_CHARACTER)
2020 gfc_allocate_lang_decl (parm);
2021 arglist = chainon (arglist, length);
2022 typelist = TREE_CHAIN (typelist);
2026 hidden_typelist = typelist;
2027 for (f = sym->formal; f; f = f->next)
2028 if (f->sym != NULL) /* Ignore alternate returns. */
2029 hidden_typelist = TREE_CHAIN (hidden_typelist);
2031 for (f = sym->formal; f; f = f->next)
2033 char name[GFC_MAX_SYMBOL_LEN + 2];
2035 /* Ignore alternate returns. */
2039 type = TREE_VALUE (typelist);
2041 if (f->sym->ts.type == BT_CHARACTER
2042 && (!sym->attr.is_bind_c || sym->attr.entry_master))
2044 tree len_type = TREE_VALUE (hidden_typelist);
2045 tree length = NULL_TREE;
2046 if (!f->sym->ts.deferred)
2047 gcc_assert (len_type == gfc_charlen_type_node);
2049 gcc_assert (POINTER_TYPE_P (len_type));
2051 strcpy (&name[1], f->sym->name);
2053 length = build_decl (input_location,
2054 PARM_DECL, get_identifier (name), len_type);
2056 hidden_arglist = chainon (hidden_arglist, length);
2057 DECL_CONTEXT (length) = fndecl;
2058 DECL_ARTIFICIAL (length) = 1;
2059 DECL_ARG_TYPE (length) = len_type;
2060 TREE_READONLY (length) = 1;
2061 gfc_finish_decl (length);
2063 /* Remember the passed value. */
2064 if (f->sym->ts.u.cl->passed_length != NULL)
2066 /* This can happen if the same type is used for multiple
2067 arguments. We need to copy cl as otherwise
2068 cl->passed_length gets overwritten. */
2069 f->sym->ts.u.cl = gfc_new_charlen (f->sym->ns, f->sym->ts.u.cl);
2071 f->sym->ts.u.cl->passed_length = length;
2073 /* Use the passed value for assumed length variables. */
2074 if (!f->sym->ts.u.cl->length)
2076 TREE_USED (length) = 1;
2077 gcc_assert (!f->sym->ts.u.cl->backend_decl);
2078 f->sym->ts.u.cl->backend_decl = length;
2081 hidden_typelist = TREE_CHAIN (hidden_typelist);
2083 if (f->sym->ts.u.cl->backend_decl == NULL
2084 || f->sym->ts.u.cl->backend_decl == length)
2086 if (f->sym->ts.u.cl->backend_decl == NULL)
2087 gfc_create_string_length (f->sym);
2089 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2090 if (f->sym->attr.flavor == FL_PROCEDURE)
2091 type = build_pointer_type (gfc_get_function_type (f->sym));
2093 type = gfc_sym_type (f->sym);
2097 /* For non-constant length array arguments, make sure they use
2098 a different type node from TYPE_ARG_TYPES type. */
2099 if (f->sym->attr.dimension
2100 && type == TREE_VALUE (typelist)
2101 && TREE_CODE (type) == POINTER_TYPE
2102 && GFC_ARRAY_TYPE_P (type)
2103 && f->sym->as->type != AS_ASSUMED_SIZE
2104 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
2106 if (f->sym->attr.flavor == FL_PROCEDURE)
2107 type = build_pointer_type (gfc_get_function_type (f->sym));
2109 type = gfc_sym_type (f->sym);
2112 if (f->sym->attr.proc_pointer)
2113 type = build_pointer_type (type);
2115 if (f->sym->attr.volatile_)
2116 type = build_qualified_type (type, TYPE_QUAL_VOLATILE);
2118 /* Build the argument declaration. */
2119 parm = build_decl (input_location,
2120 PARM_DECL, gfc_sym_identifier (f->sym), type);
2122 if (f->sym->attr.volatile_)
2124 TREE_THIS_VOLATILE (parm) = 1;
2125 TREE_SIDE_EFFECTS (parm) = 1;
2128 /* Fill in arg stuff. */
2129 DECL_CONTEXT (parm) = fndecl;
2130 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2131 /* All implementation args are read-only. */
2132 TREE_READONLY (parm) = 1;
2133 if (POINTER_TYPE_P (type)
2134 && (!f->sym->attr.proc_pointer
2135 && f->sym->attr.flavor != FL_PROCEDURE))
2136 DECL_BY_REFERENCE (parm) = 1;
2138 gfc_finish_decl (parm);
2140 f->sym->backend_decl = parm;
2142 /* Coarrays which are descriptorless or assumed-shape pass with
2143 -fcoarray=lib the token and the offset as hidden arguments. */
2144 if (f->sym->attr.codimension
2145 && gfc_option.coarray == GFC_FCOARRAY_LIB
2146 && !f->sym->attr.allocatable)
2152 gcc_assert (f->sym->backend_decl != NULL_TREE
2153 && !sym->attr.is_bind_c);
2154 caf_type = TREE_TYPE (f->sym->backend_decl);
2156 token = build_decl (input_location, PARM_DECL,
2157 create_tmp_var_name ("caf_token"),
2158 build_qualified_type (pvoid_type_node,
2159 TYPE_QUAL_RESTRICT));
2160 if (f->sym->as->type == AS_ASSUMED_SHAPE)
2162 gcc_assert (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL
2163 || GFC_DECL_TOKEN (f->sym->backend_decl) == NULL_TREE);
2164 if (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL)
2165 gfc_allocate_lang_decl (f->sym->backend_decl);
2166 GFC_DECL_TOKEN (f->sym->backend_decl) = token;
2170 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) == NULL_TREE);
2171 GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) = token;
2174 DECL_CONTEXT (token) = fndecl;
2175 DECL_ARTIFICIAL (token) = 1;
2176 DECL_ARG_TYPE (token) = TREE_VALUE (typelist);
2177 TREE_READONLY (token) = 1;
2178 hidden_arglist = chainon (hidden_arglist, token);
2179 gfc_finish_decl (token);
2181 offset = build_decl (input_location, PARM_DECL,
2182 create_tmp_var_name ("caf_offset"),
2183 gfc_array_index_type);
2185 if (f->sym->as->type == AS_ASSUMED_SHAPE)
2187 gcc_assert (GFC_DECL_CAF_OFFSET (f->sym->backend_decl)
2189 GFC_DECL_CAF_OFFSET (f->sym->backend_decl) = offset;
2193 gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) == NULL_TREE);
2194 GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) = offset;
2196 DECL_CONTEXT (offset) = fndecl;
2197 DECL_ARTIFICIAL (offset) = 1;
2198 DECL_ARG_TYPE (offset) = TREE_VALUE (typelist);
2199 TREE_READONLY (offset) = 1;
2200 hidden_arglist = chainon (hidden_arglist, offset);
2201 gfc_finish_decl (offset);
2204 arglist = chainon (arglist, parm);
2205 typelist = TREE_CHAIN (typelist);
2208 /* Add the hidden string length parameters, unless the procedure
2210 if (!sym->attr.is_bind_c)
2211 arglist = chainon (arglist, hidden_arglist);
2213 gcc_assert (hidden_typelist == NULL_TREE
2214 || TREE_VALUE (hidden_typelist) == void_type_node);
2215 DECL_ARGUMENTS (fndecl) = arglist;
2218 /* Do the setup necessary before generating the body of a function. */
2221 trans_function_start (gfc_symbol * sym)
2225 fndecl = sym->backend_decl;
2227 /* Let GCC know the current scope is this function. */
2228 current_function_decl = fndecl;
2230 /* Let the world know what we're about to do. */
2231 announce_function (fndecl);
2233 if (DECL_FILE_SCOPE_P (fndecl))
2235 /* Create RTL for function declaration. */
2236 rest_of_decl_compilation (fndecl, 1, 0);
2239 /* Create RTL for function definition. */
2240 make_decl_rtl (fndecl);
2242 init_function_start (fndecl);
2244 /* function.c requires a push at the start of the function. */
2248 /* Create thunks for alternate entry points. */
2251 build_entry_thunks (gfc_namespace * ns, bool global)
2253 gfc_formal_arglist *formal;
2254 gfc_formal_arglist *thunk_formal;
2256 gfc_symbol *thunk_sym;
2262 /* This should always be a toplevel function. */
2263 gcc_assert (current_function_decl == NULL_TREE);
2265 gfc_save_backend_locus (&old_loc);
2266 for (el = ns->entries; el; el = el->next)
2268 VEC(tree,gc) *args = NULL;
2269 VEC(tree,gc) *string_args = NULL;
2271 thunk_sym = el->sym;
2273 build_function_decl (thunk_sym, global);
2274 create_function_arglist (thunk_sym);
2276 trans_function_start (thunk_sym);
2278 thunk_fndecl = thunk_sym->backend_decl;
2280 gfc_init_block (&body);
2282 /* Pass extra parameter identifying this entry point. */
2283 tmp = build_int_cst (gfc_array_index_type, el->id);
2284 VEC_safe_push (tree, gc, args, tmp);
2286 if (thunk_sym->attr.function)
2288 if (gfc_return_by_reference (ns->proc_name))
2290 tree ref = DECL_ARGUMENTS (current_function_decl);
2291 VEC_safe_push (tree, gc, args, ref);
2292 if (ns->proc_name->ts.type == BT_CHARACTER)
2293 VEC_safe_push (tree, gc, args, DECL_CHAIN (ref));
2297 for (formal = ns->proc_name->formal; formal; formal = formal->next)
2299 /* Ignore alternate returns. */
2300 if (formal->sym == NULL)
2303 /* We don't have a clever way of identifying arguments, so resort to
2304 a brute-force search. */
2305 for (thunk_formal = thunk_sym->formal;
2307 thunk_formal = thunk_formal->next)
2309 if (thunk_formal->sym == formal->sym)
2315 /* Pass the argument. */
2316 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
2317 VEC_safe_push (tree, gc, args, thunk_formal->sym->backend_decl);
2318 if (formal->sym->ts.type == BT_CHARACTER)
2320 tmp = thunk_formal->sym->ts.u.cl->backend_decl;
2321 VEC_safe_push (tree, gc, string_args, tmp);
2326 /* Pass NULL for a missing argument. */
2327 VEC_safe_push (tree, gc, args, null_pointer_node);
2328 if (formal->sym->ts.type == BT_CHARACTER)
2330 tmp = build_int_cst (gfc_charlen_type_node, 0);
2331 VEC_safe_push (tree, gc, string_args, tmp);
2336 /* Call the master function. */
2337 VEC_safe_splice (tree, gc, args, string_args);
2338 tmp = ns->proc_name->backend_decl;
2339 tmp = build_call_expr_loc_vec (input_location, tmp, args);
2340 if (ns->proc_name->attr.mixed_entry_master)
2342 tree union_decl, field;
2343 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
2345 union_decl = build_decl (input_location,
2346 VAR_DECL, get_identifier ("__result"),
2347 TREE_TYPE (master_type));
2348 DECL_ARTIFICIAL (union_decl) = 1;
2349 DECL_EXTERNAL (union_decl) = 0;
2350 TREE_PUBLIC (union_decl) = 0;
2351 TREE_USED (union_decl) = 1;
2352 layout_decl (union_decl, 0);
2353 pushdecl (union_decl);
2355 DECL_CONTEXT (union_decl) = current_function_decl;
2356 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2357 TREE_TYPE (union_decl), union_decl, tmp);
2358 gfc_add_expr_to_block (&body, tmp);
2360 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
2361 field; field = DECL_CHAIN (field))
2362 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2363 thunk_sym->result->name) == 0)
2365 gcc_assert (field != NULL_TREE);
2366 tmp = fold_build3_loc (input_location, COMPONENT_REF,
2367 TREE_TYPE (field), union_decl, field,
2369 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2370 TREE_TYPE (DECL_RESULT (current_function_decl)),
2371 DECL_RESULT (current_function_decl), tmp);
2372 tmp = build1_v (RETURN_EXPR, tmp);
2374 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
2377 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2378 TREE_TYPE (DECL_RESULT (current_function_decl)),
2379 DECL_RESULT (current_function_decl), tmp);
2380 tmp = build1_v (RETURN_EXPR, tmp);
2382 gfc_add_expr_to_block (&body, tmp);
2384 /* Finish off this function and send it for code generation. */
2385 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
2388 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
2389 DECL_SAVED_TREE (thunk_fndecl)
2390 = build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl),
2391 DECL_INITIAL (thunk_fndecl));
2393 /* Output the GENERIC tree. */
2394 dump_function (TDI_original, thunk_fndecl);
2396 /* Store the end of the function, so that we get good line number
2397 info for the epilogue. */
2398 cfun->function_end_locus = input_location;
2400 /* We're leaving the context of this function, so zap cfun.
2401 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2402 tree_rest_of_compilation. */
2405 current_function_decl = NULL_TREE;
2407 cgraph_finalize_function (thunk_fndecl, true);
2409 /* We share the symbols in the formal argument list with other entry
2410 points and the master function. Clear them so that they are
2411 recreated for each function. */
2412 for (formal = thunk_sym->formal; formal; formal = formal->next)
2413 if (formal->sym != NULL) /* Ignore alternate returns. */
2415 formal->sym->backend_decl = NULL_TREE;
2416 if (formal->sym->ts.type == BT_CHARACTER)
2417 formal->sym->ts.u.cl->backend_decl = NULL_TREE;
2420 if (thunk_sym->attr.function)
2422 if (thunk_sym->ts.type == BT_CHARACTER)
2423 thunk_sym->ts.u.cl->backend_decl = NULL_TREE;
2424 if (thunk_sym->result->ts.type == BT_CHARACTER)
2425 thunk_sym->result->ts.u.cl->backend_decl = NULL_TREE;
2429 gfc_restore_backend_locus (&old_loc);
2433 /* Create a decl for a function, and create any thunks for alternate entry
2434 points. If global is true, generate the function in the global binding
2435 level, otherwise in the current binding level (which can be global). */
2438 gfc_create_function_decl (gfc_namespace * ns, bool global)
2440 /* Create a declaration for the master function. */
2441 build_function_decl (ns->proc_name, global);
2443 /* Compile the entry thunks. */
2445 build_entry_thunks (ns, global);
2447 /* Now create the read argument list. */
2448 create_function_arglist (ns->proc_name);
2451 /* Return the decl used to hold the function return value. If
2452 parent_flag is set, the context is the parent_scope. */
2455 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
2459 tree this_fake_result_decl;
2460 tree this_function_decl;
2462 char name[GFC_MAX_SYMBOL_LEN + 10];
2466 this_fake_result_decl = parent_fake_result_decl;
2467 this_function_decl = DECL_CONTEXT (current_function_decl);
2471 this_fake_result_decl = current_fake_result_decl;
2472 this_function_decl = current_function_decl;
2476 && sym->ns->proc_name->backend_decl == this_function_decl
2477 && sym->ns->proc_name->attr.entry_master
2478 && sym != sym->ns->proc_name)
2481 if (this_fake_result_decl != NULL)
2482 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
2483 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
2486 return TREE_VALUE (t);
2487 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
2490 this_fake_result_decl = parent_fake_result_decl;
2492 this_fake_result_decl = current_fake_result_decl;
2494 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
2498 for (field = TYPE_FIELDS (TREE_TYPE (decl));
2499 field; field = DECL_CHAIN (field))
2500 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2504 gcc_assert (field != NULL_TREE);
2505 decl = fold_build3_loc (input_location, COMPONENT_REF,
2506 TREE_TYPE (field), decl, field, NULL_TREE);
2509 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
2511 gfc_add_decl_to_parent_function (var);
2513 gfc_add_decl_to_function (var);
2515 SET_DECL_VALUE_EXPR (var, decl);
2516 DECL_HAS_VALUE_EXPR_P (var) = 1;
2517 GFC_DECL_RESULT (var) = 1;
2519 TREE_CHAIN (this_fake_result_decl)
2520 = tree_cons (get_identifier (sym->name), var,
2521 TREE_CHAIN (this_fake_result_decl));
2525 if (this_fake_result_decl != NULL_TREE)
2526 return TREE_VALUE (this_fake_result_decl);
2528 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2533 if (sym->ts.type == BT_CHARACTER)
2535 if (sym->ts.u.cl->backend_decl == NULL_TREE)
2536 length = gfc_create_string_length (sym);
2538 length = sym->ts.u.cl->backend_decl;
2539 if (TREE_CODE (length) == VAR_DECL
2540 && DECL_CONTEXT (length) == NULL_TREE)
2541 gfc_add_decl_to_function (length);
2544 if (gfc_return_by_reference (sym))
2546 decl = DECL_ARGUMENTS (this_function_decl);
2548 if (sym->ns->proc_name->backend_decl == this_function_decl
2549 && sym->ns->proc_name->attr.entry_master)
2550 decl = DECL_CHAIN (decl);
2552 TREE_USED (decl) = 1;
2554 decl = gfc_build_dummy_array_decl (sym, decl);
2558 sprintf (name, "__result_%.20s",
2559 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
2561 if (!sym->attr.mixed_entry_master && sym->attr.function)
2562 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2563 VAR_DECL, get_identifier (name),
2564 gfc_sym_type (sym));
2566 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2567 VAR_DECL, get_identifier (name),
2568 TREE_TYPE (TREE_TYPE (this_function_decl)));
2569 DECL_ARTIFICIAL (decl) = 1;
2570 DECL_EXTERNAL (decl) = 0;
2571 TREE_PUBLIC (decl) = 0;
2572 TREE_USED (decl) = 1;
2573 GFC_DECL_RESULT (decl) = 1;
2574 TREE_ADDRESSABLE (decl) = 1;
2576 layout_decl (decl, 0);
2579 gfc_add_decl_to_parent_function (decl);
2581 gfc_add_decl_to_function (decl);
2585 parent_fake_result_decl = build_tree_list (NULL, decl);
2587 current_fake_result_decl = build_tree_list (NULL, decl);
2593 /* Builds a function decl. The remaining parameters are the types of the
2594 function arguments. Negative nargs indicates a varargs function. */
2597 build_library_function_decl_1 (tree name, const char *spec,
2598 tree rettype, int nargs, va_list p)
2600 VEC(tree,gc) *arglist;
2605 /* Library functions must be declared with global scope. */
2606 gcc_assert (current_function_decl == NULL_TREE);
2608 /* Create a list of the argument types. */
2609 arglist = VEC_alloc (tree, gc, abs (nargs));
2610 for (n = abs (nargs); n > 0; n--)
2612 tree argtype = va_arg (p, tree);
2613 VEC_quick_push (tree, arglist, argtype);
2616 /* Build the function type and decl. */
2618 fntype = build_function_type_vec (rettype, arglist);
2620 fntype = build_varargs_function_type_vec (rettype, arglist);
2623 tree attr_args = build_tree_list (NULL_TREE,
2624 build_string (strlen (spec), spec));
2625 tree attrs = tree_cons (get_identifier ("fn spec"),
2626 attr_args, TYPE_ATTRIBUTES (fntype));
2627 fntype = build_type_attribute_variant (fntype, attrs);
2629 fndecl = build_decl (input_location,
2630 FUNCTION_DECL, name, fntype);
2632 /* Mark this decl as external. */
2633 DECL_EXTERNAL (fndecl) = 1;
2634 TREE_PUBLIC (fndecl) = 1;
2638 rest_of_decl_compilation (fndecl, 1, 0);
2643 /* Builds a function decl. The remaining parameters are the types of the
2644 function arguments. Negative nargs indicates a varargs function. */
2647 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
2651 va_start (args, nargs);
2652 ret = build_library_function_decl_1 (name, NULL, rettype, nargs, args);
2657 /* Builds a function decl. The remaining parameters are the types of the
2658 function arguments. Negative nargs indicates a varargs function.
2659 The SPEC parameter specifies the function argument and return type
2660 specification according to the fnspec function type attribute. */
2663 gfc_build_library_function_decl_with_spec (tree name, const char *spec,
2664 tree rettype, int nargs, ...)
2668 va_start (args, nargs);
2669 ret = build_library_function_decl_1 (name, spec, rettype, nargs, args);
2675 gfc_build_intrinsic_function_decls (void)
2677 tree gfc_int4_type_node = gfc_get_int_type (4);
2678 tree gfc_int8_type_node = gfc_get_int_type (8);
2679 tree gfc_int16_type_node = gfc_get_int_type (16);
2680 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2681 tree pchar1_type_node = gfc_get_pchar_type (1);
2682 tree pchar4_type_node = gfc_get_pchar_type (4);
2684 /* String functions. */
2685 gfor_fndecl_compare_string = gfc_build_library_function_decl_with_spec (
2686 get_identifier (PREFIX("compare_string")), "..R.R",
2687 integer_type_node, 4, gfc_charlen_type_node, pchar1_type_node,
2688 gfc_charlen_type_node, pchar1_type_node);
2689 DECL_PURE_P (gfor_fndecl_compare_string) = 1;
2690 TREE_NOTHROW (gfor_fndecl_compare_string) = 1;
2692 gfor_fndecl_concat_string = gfc_build_library_function_decl_with_spec (
2693 get_identifier (PREFIX("concat_string")), "..W.R.R",
2694 void_type_node, 6, gfc_charlen_type_node, pchar1_type_node,
2695 gfc_charlen_type_node, pchar1_type_node,
2696 gfc_charlen_type_node, pchar1_type_node);
2697 TREE_NOTHROW (gfor_fndecl_concat_string) = 1;
2699 gfor_fndecl_string_len_trim = gfc_build_library_function_decl_with_spec (
2700 get_identifier (PREFIX("string_len_trim")), "..R",
2701 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar1_type_node);
2702 DECL_PURE_P (gfor_fndecl_string_len_trim) = 1;
2703 TREE_NOTHROW (gfor_fndecl_string_len_trim) = 1;
2705 gfor_fndecl_string_index = gfc_build_library_function_decl_with_spec (
2706 get_identifier (PREFIX("string_index")), "..R.R.",
2707 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2708 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2709 DECL_PURE_P (gfor_fndecl_string_index) = 1;
2710 TREE_NOTHROW (gfor_fndecl_string_index) = 1;
2712 gfor_fndecl_string_scan = gfc_build_library_function_decl_with_spec (
2713 get_identifier (PREFIX("string_scan")), "..R.R.",
2714 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2715 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2716 DECL_PURE_P (gfor_fndecl_string_scan) = 1;
2717 TREE_NOTHROW (gfor_fndecl_string_scan) = 1;
2719 gfor_fndecl_string_verify = gfc_build_library_function_decl_with_spec (
2720 get_identifier (PREFIX("string_verify")), "..R.R.",
2721 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2722 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2723 DECL_PURE_P (gfor_fndecl_string_verify) = 1;
2724 TREE_NOTHROW (gfor_fndecl_string_verify) = 1;
2726 gfor_fndecl_string_trim = gfc_build_library_function_decl_with_spec (
2727 get_identifier (PREFIX("string_trim")), ".Ww.R",
2728 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2729 build_pointer_type (pchar1_type_node), gfc_charlen_type_node,
2732 gfor_fndecl_string_minmax = gfc_build_library_function_decl_with_spec (
2733 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2734 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2735 build_pointer_type (pchar1_type_node), integer_type_node,
2738 gfor_fndecl_adjustl = gfc_build_library_function_decl_with_spec (
2739 get_identifier (PREFIX("adjustl")), ".W.R",
2740 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2742 TREE_NOTHROW (gfor_fndecl_adjustl) = 1;
2744 gfor_fndecl_adjustr = gfc_build_library_function_decl_with_spec (
2745 get_identifier (PREFIX("adjustr")), ".W.R",
2746 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2748 TREE_NOTHROW (gfor_fndecl_adjustr) = 1;
2750 gfor_fndecl_select_string = gfc_build_library_function_decl_with_spec (
2751 get_identifier (PREFIX("select_string")), ".R.R.",
2752 integer_type_node, 4, pvoid_type_node, integer_type_node,
2753 pchar1_type_node, gfc_charlen_type_node);
2754 DECL_PURE_P (gfor_fndecl_select_string) = 1;
2755 TREE_NOTHROW (gfor_fndecl_select_string) = 1;
2757 gfor_fndecl_compare_string_char4 = gfc_build_library_function_decl_with_spec (
2758 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2759 integer_type_node, 4, gfc_charlen_type_node, pchar4_type_node,
2760 gfc_charlen_type_node, pchar4_type_node);
2761 DECL_PURE_P (gfor_fndecl_compare_string_char4) = 1;
2762 TREE_NOTHROW (gfor_fndecl_compare_string_char4) = 1;
2764 gfor_fndecl_concat_string_char4 = gfc_build_library_function_decl_with_spec (
2765 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2766 void_type_node, 6, gfc_charlen_type_node, pchar4_type_node,
2767 gfc_charlen_type_node, pchar4_type_node, gfc_charlen_type_node,
2769 TREE_NOTHROW (gfor_fndecl_concat_string_char4) = 1;
2771 gfor_fndecl_string_len_trim_char4 = gfc_build_library_function_decl_with_spec (
2772 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2773 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar4_type_node);
2774 DECL_PURE_P (gfor_fndecl_string_len_trim_char4) = 1;
2775 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4) = 1;
2777 gfor_fndecl_string_index_char4 = gfc_build_library_function_decl_with_spec (
2778 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2779 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2780 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2781 DECL_PURE_P (gfor_fndecl_string_index_char4) = 1;
2782 TREE_NOTHROW (gfor_fndecl_string_index_char4) = 1;
2784 gfor_fndecl_string_scan_char4 = gfc_build_library_function_decl_with_spec (
2785 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2786 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2787 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2788 DECL_PURE_P (gfor_fndecl_string_scan_char4) = 1;
2789 TREE_NOTHROW (gfor_fndecl_string_scan_char4) = 1;
2791 gfor_fndecl_string_verify_char4 = gfc_build_library_function_decl_with_spec (
2792 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2793 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2794 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2795 DECL_PURE_P (gfor_fndecl_string_verify_char4) = 1;
2796 TREE_NOTHROW (gfor_fndecl_string_verify_char4) = 1;
2798 gfor_fndecl_string_trim_char4 = gfc_build_library_function_decl_with_spec (
2799 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2800 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2801 build_pointer_type (pchar4_type_node), gfc_charlen_type_node,
2804 gfor_fndecl_string_minmax_char4 = gfc_build_library_function_decl_with_spec (
2805 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2806 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2807 build_pointer_type (pchar4_type_node), integer_type_node,
2810 gfor_fndecl_adjustl_char4 = gfc_build_library_function_decl_with_spec (
2811 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2812 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2814 TREE_NOTHROW (gfor_fndecl_adjustl_char4) = 1;
2816 gfor_fndecl_adjustr_char4 = gfc_build_library_function_decl_with_spec (
2817 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2818 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2820 TREE_NOTHROW (gfor_fndecl_adjustr_char4) = 1;
2822 gfor_fndecl_select_string_char4 = gfc_build_library_function_decl_with_spec (
2823 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2824 integer_type_node, 4, pvoid_type_node, integer_type_node,
2825 pvoid_type_node, gfc_charlen_type_node);
2826 DECL_PURE_P (gfor_fndecl_select_string_char4) = 1;
2827 TREE_NOTHROW (gfor_fndecl_select_string_char4) = 1;
2830 /* Conversion between character kinds. */
2832 gfor_fndecl_convert_char1_to_char4 = gfc_build_library_function_decl_with_spec (
2833 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2834 void_type_node, 3, build_pointer_type (pchar4_type_node),
2835 gfc_charlen_type_node, pchar1_type_node);
2837 gfor_fndecl_convert_char4_to_char1 = gfc_build_library_function_decl_with_spec (
2838 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
2839 void_type_node, 3, build_pointer_type (pchar1_type_node),
2840 gfc_charlen_type_node, pchar4_type_node);
2842 /* Misc. functions. */
2844 gfor_fndecl_ttynam = gfc_build_library_function_decl_with_spec (
2845 get_identifier (PREFIX("ttynam")), ".W",
2846 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
2849 gfor_fndecl_fdate = gfc_build_library_function_decl_with_spec (
2850 get_identifier (PREFIX("fdate")), ".W",
2851 void_type_node, 2, pchar_type_node, gfc_charlen_type_node);
2853 gfor_fndecl_ctime = gfc_build_library_function_decl_with_spec (
2854 get_identifier (PREFIX("ctime")), ".W",
2855 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
2856 gfc_int8_type_node);
2858 gfor_fndecl_sc_kind = gfc_build_library_function_decl_with_spec (
2859 get_identifier (PREFIX("selected_char_kind")), "..R",
2860 gfc_int4_type_node, 2, gfc_charlen_type_node, pchar_type_node);
2861 DECL_PURE_P (gfor_fndecl_sc_kind) = 1;
2862 TREE_NOTHROW (gfor_fndecl_sc_kind) = 1;
2864 gfor_fndecl_si_kind = gfc_build_library_function_decl_with_spec (
2865 get_identifier (PREFIX("selected_int_kind")), ".R",
2866 gfc_int4_type_node, 1, pvoid_type_node);
2867 DECL_PURE_P (gfor_fndecl_si_kind) = 1;
2868 TREE_NOTHROW (gfor_fndecl_si_kind) = 1;
2870 gfor_fndecl_sr_kind = gfc_build_library_function_decl_with_spec (
2871 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
2872 gfc_int4_type_node, 3, pvoid_type_node, pvoid_type_node,
2874 DECL_PURE_P (gfor_fndecl_sr_kind) = 1;
2875 TREE_NOTHROW (gfor_fndecl_sr_kind) = 1;
2877 /* Power functions. */
2879 tree ctype, rtype, itype, jtype;
2880 int rkind, ikind, jkind;
2883 static int ikinds[NIKINDS] = {4, 8, 16};
2884 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2885 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2887 for (ikind=0; ikind < NIKINDS; ikind++)
2889 itype = gfc_get_int_type (ikinds[ikind]);
2891 for (jkind=0; jkind < NIKINDS; jkind++)
2893 jtype = gfc_get_int_type (ikinds[jkind]);
2896 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2898 gfor_fndecl_math_powi[jkind][ikind].integer =
2899 gfc_build_library_function_decl (get_identifier (name),
2900 jtype, 2, jtype, itype);
2901 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2902 TREE_NOTHROW (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2906 for (rkind = 0; rkind < NRKINDS; rkind ++)
2908 rtype = gfc_get_real_type (rkinds[rkind]);
2911 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2913 gfor_fndecl_math_powi[rkind][ikind].real =
2914 gfc_build_library_function_decl (get_identifier (name),
2915 rtype, 2, rtype, itype);
2916 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2917 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2920 ctype = gfc_get_complex_type (rkinds[rkind]);
2923 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2925 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2926 gfc_build_library_function_decl (get_identifier (name),
2927 ctype, 2,ctype, itype);
2928 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2929 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2937 gfor_fndecl_math_ishftc4 = gfc_build_library_function_decl (
2938 get_identifier (PREFIX("ishftc4")),
2939 gfc_int4_type_node, 3, gfc_int4_type_node, gfc_int4_type_node,
2940 gfc_int4_type_node);
2941 TREE_READONLY (gfor_fndecl_math_ishftc4) = 1;
2942 TREE_NOTHROW (gfor_fndecl_math_ishftc4) = 1;
2944 gfor_fndecl_math_ishftc8 = gfc_build_library_function_decl (
2945 get_identifier (PREFIX("ishftc8")),
2946 gfc_int8_type_node, 3, gfc_int8_type_node, gfc_int4_type_node,
2947 gfc_int4_type_node);
2948 TREE_READONLY (gfor_fndecl_math_ishftc8) = 1;
2949 TREE_NOTHROW (gfor_fndecl_math_ishftc8) = 1;
2951 if (gfc_int16_type_node)
2953 gfor_fndecl_math_ishftc16 = gfc_build_library_function_decl (
2954 get_identifier (PREFIX("ishftc16")),
2955 gfc_int16_type_node, 3, gfc_int16_type_node, gfc_int4_type_node,
2956 gfc_int4_type_node);
2957 TREE_READONLY (gfor_fndecl_math_ishftc16) = 1;
2958 TREE_NOTHROW (gfor_fndecl_math_ishftc16) = 1;
2961 /* BLAS functions. */
2963 tree pint = build_pointer_type (integer_type_node);
2964 tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
2965 tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
2966 tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
2967 tree pz = build_pointer_type
2968 (gfc_get_complex_type (gfc_default_double_kind));
2970 gfor_fndecl_sgemm = gfc_build_library_function_decl
2972 (gfc_option.flag_underscoring ? "sgemm_"
2974 void_type_node, 15, pchar_type_node,
2975 pchar_type_node, pint, pint, pint, ps, ps, pint,
2976 ps, pint, ps, ps, pint, integer_type_node,
2978 gfor_fndecl_dgemm = gfc_build_library_function_decl
2980 (gfc_option.flag_underscoring ? "dgemm_"
2982 void_type_node, 15, pchar_type_node,
2983 pchar_type_node, pint, pint, pint, pd, pd, pint,
2984 pd, pint, pd, pd, pint, integer_type_node,
2986 gfor_fndecl_cgemm = gfc_build_library_function_decl
2988 (gfc_option.flag_underscoring ? "cgemm_"
2990 void_type_node, 15, pchar_type_node,
2991 pchar_type_node, pint, pint, pint, pc, pc, pint,
2992 pc, pint, pc, pc, pint, integer_type_node,
2994 gfor_fndecl_zgemm = gfc_build_library_function_decl
2996 (gfc_option.flag_underscoring ? "zgemm_"
2998 void_type_node, 15, pchar_type_node,
2999 pchar_type_node, pint, pint, pint, pz, pz, pint,
3000 pz, pint, pz, pz, pint, integer_type_node,
3004 /* Other functions. */
3005 gfor_fndecl_size0 = gfc_build_library_function_decl_with_spec (
3006 get_identifier (PREFIX("size0")), ".R",
3007 gfc_array_index_type, 1, pvoid_type_node);
3008 DECL_PURE_P (gfor_fndecl_size0) = 1;
3009 TREE_NOTHROW (gfor_fndecl_size0) = 1;
3011 gfor_fndecl_size1 = gfc_build_library_function_decl_with_spec (
3012 get_identifier (PREFIX("size1")), ".R",
3013 gfc_array_index_type, 2, pvoid_type_node, gfc_array_index_type);
3014 DECL_PURE_P (gfor_fndecl_size1) = 1;
3015 TREE_NOTHROW (gfor_fndecl_size1) = 1;
3017 gfor_fndecl_iargc = gfc_build_library_function_decl (
3018 get_identifier (PREFIX ("iargc")), gfc_int4_type_node, 0);
3019 TREE_NOTHROW (gfor_fndecl_iargc) = 1;
3023 /* Make prototypes for runtime library functions. */
3026 gfc_build_builtin_function_decls (void)
3028 tree gfc_int4_type_node = gfc_get_int_type (4);
3030 gfor_fndecl_stop_numeric = gfc_build_library_function_decl (
3031 get_identifier (PREFIX("stop_numeric")),
3032 void_type_node, 1, gfc_int4_type_node);
3033 /* STOP doesn't return. */
3034 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
3036 gfor_fndecl_stop_numeric_f08 = gfc_build_library_function_decl (
3037 get_identifier (PREFIX("stop_numeric_f08")),
3038 void_type_node, 1, gfc_int4_type_node);
3039 /* STOP doesn't return. */
3040 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08) = 1;
3042 gfor_fndecl_stop_string = gfc_build_library_function_decl_with_spec (
3043 get_identifier (PREFIX("stop_string")), ".R.",
3044 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3045 /* STOP doesn't return. */
3046 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
3048 gfor_fndecl_error_stop_numeric = gfc_build_library_function_decl (
3049 get_identifier (PREFIX("error_stop_numeric")),
3050 void_type_node, 1, gfc_int4_type_node);
3051 /* ERROR STOP doesn't return. */
3052 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric) = 1;
3054 gfor_fndecl_error_stop_string = gfc_build_library_function_decl_with_spec (
3055 get_identifier (PREFIX("error_stop_string")), ".R.",
3056 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3057 /* ERROR STOP doesn't return. */
3058 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string) = 1;
3060 gfor_fndecl_pause_numeric = gfc_build_library_function_decl (
3061 get_identifier (PREFIX("pause_numeric")),
3062 void_type_node, 1, gfc_int4_type_node);
3064 gfor_fndecl_pause_string = gfc_build_library_function_decl_with_spec (
3065 get_identifier (PREFIX("pause_string")), ".R.",
3066 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3068 gfor_fndecl_runtime_error = gfc_build_library_function_decl_with_spec (
3069 get_identifier (PREFIX("runtime_error")), ".R",
3070 void_type_node, -1, pchar_type_node);
3071 /* The runtime_error function does not return. */
3072 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
3074 gfor_fndecl_runtime_error_at = gfc_build_library_function_decl_with_spec (
3075 get_identifier (PREFIX("runtime_error_at")), ".RR",
3076 void_type_node, -2, pchar_type_node, pchar_type_node);
3077 /* The runtime_error_at function does not return. */
3078 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
3080 gfor_fndecl_runtime_warning_at = gfc_build_library_function_decl_with_spec (
3081 get_identifier (PREFIX("runtime_warning_at")), ".RR",
3082 void_type_node, -2, pchar_type_node, pchar_type_node);
3084 gfor_fndecl_generate_error = gfc_build_library_function_decl_with_spec (
3085 get_identifier (PREFIX("generate_error")), ".R.R",
3086 void_type_node, 3, pvoid_type_node, integer_type_node,
3089 gfor_fndecl_os_error = gfc_build_library_function_decl_with_spec (
3090 get_identifier (PREFIX("os_error")), ".R",
3091 void_type_node, 1, pchar_type_node);
3092 /* The runtime_error function does not return. */
3093 TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
3095 gfor_fndecl_set_args = gfc_build_library_function_decl (
3096 get_identifier (PREFIX("set_args")),
3097 void_type_node, 2, integer_type_node,
3098 build_pointer_type (pchar_type_node));
3100 gfor_fndecl_set_fpe = gfc_build_library_function_decl (
3101 get_identifier (PREFIX("set_fpe")),
3102 void_type_node, 1, integer_type_node);
3104 /* Keep the array dimension in sync with the call, later in this file. */
3105 gfor_fndecl_set_options = gfc_build_library_function_decl_with_spec (
3106 get_identifier (PREFIX("set_options")), "..R",
3107 void_type_node, 2, integer_type_node,
3108 build_pointer_type (integer_type_node));
3110 gfor_fndecl_set_convert = gfc_build_library_function_decl (
3111 get_identifier (PREFIX("set_convert")),
3112 void_type_node, 1, integer_type_node);
3114 gfor_fndecl_set_record_marker = gfc_build_library_function_decl (
3115 get_identifier (PREFIX("set_record_marker")),
3116 void_type_node, 1, integer_type_node);
3118 gfor_fndecl_set_max_subrecord_length = gfc_build_library_function_decl (
3119 get_identifier (PREFIX("set_max_subrecord_length")),
3120 void_type_node, 1, integer_type_node);
3122 gfor_fndecl_in_pack = gfc_build_library_function_decl_with_spec (
3123 get_identifier (PREFIX("internal_pack")), ".r",
3124 pvoid_type_node, 1, pvoid_type_node);
3126 gfor_fndecl_in_unpack = gfc_build_library_function_decl_with_spec (
3127 get_identifier (PREFIX("internal_unpack")), ".wR",
3128 void_type_node, 2, pvoid_type_node, pvoid_type_node);
3130 gfor_fndecl_associated = gfc_build_library_function_decl_with_spec (
3131 get_identifier (PREFIX("associated")), ".RR",
3132 integer_type_node, 2, ppvoid_type_node, ppvoid_type_node);
3133 DECL_PURE_P (gfor_fndecl_associated) = 1;
3134 TREE_NOTHROW (gfor_fndecl_associated) = 1;
3136 /* Coarray library calls. */
3137 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
3139 tree pint_type, pppchar_type;
3141 pint_type = build_pointer_type (integer_type_node);
3143 = build_pointer_type (build_pointer_type (pchar_type_node));
3145 gfor_fndecl_caf_init = gfc_build_library_function_decl (
3146 get_identifier (PREFIX("caf_init")), void_type_node,
3147 4, pint_type, pppchar_type, pint_type, pint_type);
3149 gfor_fndecl_caf_finalize = gfc_build_library_function_decl (
3150 get_identifier (PREFIX("caf_finalize")), void_type_node, 0);
3152 gfor_fndecl_caf_register = gfc_build_library_function_decl_with_spec (
3153 get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node, 6,
3154 size_type_node, integer_type_node, ppvoid_type_node, pint_type,
3155 build_pointer_type (pchar_type_node), integer_type_node);
3157 gfor_fndecl_caf_critical = gfc_build_library_function_decl (
3158 get_identifier (PREFIX("caf_critical")), void_type_node, 0);
3160 gfor_fndecl_caf_end_critical = gfc_build_library_function_decl (
3161 get_identifier (PREFIX("caf_end_critical")), void_type_node, 0);
3163 gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
3164 get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node,
3165 3, pint_type, build_pointer_type (pchar_type_node), integer_type_node);
3167 gfor_fndecl_caf_sync_images = gfc_build_library_function_decl_with_spec (
3168 get_identifier (PREFIX("caf_sync_images")), ".RRWW", void_type_node,
3169 5, integer_type_node, pint_type, pint_type,
3170 build_pointer_type (pchar_type_node), integer_type_node);
3172 gfor_fndecl_caf_error_stop = gfc_build_library_function_decl (
3173 get_identifier (PREFIX("caf_error_stop")),
3174 void_type_node, 1, gfc_int4_type_node);
3175 /* CAF's ERROR STOP doesn't return. */
3176 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop) = 1;
3178 gfor_fndecl_caf_error_stop_str = gfc_build_library_function_decl_with_spec (
3179 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3180 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3181 /* CAF's ERROR STOP doesn't return. */
3182 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str) = 1;
3185 gfc_build_intrinsic_function_decls ();
3186 gfc_build_intrinsic_lib_fndecls ();
3187 gfc_build_io_library_fndecls ();
3191 /* Evaluate the length of dummy character variables. */
3194 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl,
3195 gfc_wrapped_block *block)
3199 gfc_finish_decl (cl->backend_decl);
3201 gfc_start_block (&init);
3203 /* Evaluate the string length expression. */
3204 gfc_conv_string_length (cl, NULL, &init);
3206 gfc_trans_vla_type_sizes (sym, &init);
3208 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3212 /* Allocate and cleanup an automatic character variable. */
3215 gfc_trans_auto_character_variable (gfc_symbol * sym, gfc_wrapped_block * block)
3221 gcc_assert (sym->backend_decl);
3222 gcc_assert (sym->ts.u.cl && sym->ts.u.cl->length);
3224 gfc_init_block (&init);
3226 /* Evaluate the string length expression. */
3227 gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
3229 gfc_trans_vla_type_sizes (sym, &init);
3231 decl = sym->backend_decl;
3233 /* Emit a DECL_EXPR for this variable, which will cause the
3234 gimplifier to allocate storage, and all that good stuff. */
3235 tmp = fold_build1_loc (input_location, DECL_EXPR, TREE_TYPE (decl), decl);
3236 gfc_add_expr_to_block (&init, tmp);
3238 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3241 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3244 gfc_trans_assign_aux_var (gfc_symbol * sym, gfc_wrapped_block * block)
3248 gcc_assert (sym->backend_decl);
3249 gfc_start_block (&init);
3251 /* Set the initial value to length. See the comments in
3252 function gfc_add_assign_aux_vars in this file. */
3253 gfc_add_modify (&init, GFC_DECL_STRING_LEN (sym->backend_decl),
3254 build_int_cst (gfc_charlen_type_node, -2));
3256 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3260 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
3262 tree t = *tp, var, val;
3264 if (t == NULL || t == error_mark_node)
3266 if (TREE_CONSTANT (t) || DECL_P (t))
3269 if (TREE_CODE (t) == SAVE_EXPR)
3271 if (SAVE_EXPR_RESOLVED_P (t))
3273 *tp = TREE_OPERAND (t, 0);
3276 val = TREE_OPERAND (t, 0);
3281 var = gfc_create_var_np (TREE_TYPE (t), NULL);
3282 gfc_add_decl_to_function (var);
3283 gfc_add_modify (body, var, val);
3284 if (TREE_CODE (t) == SAVE_EXPR)
3285 TREE_OPERAND (t, 0) = var;
3290 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
3294 if (type == NULL || type == error_mark_node)
3297 type = TYPE_MAIN_VARIANT (type);
3299 if (TREE_CODE (type) == INTEGER_TYPE)
3301 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
3302 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
3304 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3306 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
3307 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
3310 else if (TREE_CODE (type) == ARRAY_TYPE)
3312 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
3313 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
3314 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
3315 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
3317 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3319 TYPE_SIZE (t) = TYPE_SIZE (type);
3320 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
3325 /* Make sure all type sizes and array domains are either constant,
3326 or variable or parameter decls. This is a simplified variant
3327 of gimplify_type_sizes, but we can't use it here, as none of the
3328 variables in the expressions have been gimplified yet.
3329 As type sizes and domains for various variable length arrays
3330 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3331 time, without this routine gimplify_type_sizes in the middle-end
3332 could result in the type sizes being gimplified earlier than where
3333 those variables are initialized. */
3336 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
3338 tree type = TREE_TYPE (sym->backend_decl);
3340 if (TREE_CODE (type) == FUNCTION_TYPE
3341 && (sym->attr.function || sym->attr.result || sym->attr.entry))
3343 if (! current_fake_result_decl)
3346 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
3349 while (POINTER_TYPE_P (type))
3350 type = TREE_TYPE (type);
3352 if (GFC_DESCRIPTOR_TYPE_P (type))
3354 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
3356 while (POINTER_TYPE_P (etype))
3357 etype = TREE_TYPE (etype);
3359 gfc_trans_vla_type_sizes_1 (etype, body);
3362 gfc_trans_vla_type_sizes_1 (type, body);
3366 /* Initialize a derived type by building an lvalue from the symbol
3367 and using trans_assignment to do the work. Set dealloc to false
3368 if no deallocation prior the assignment is needed. */
3370 gfc_init_default_dt (gfc_symbol * sym, stmtblock_t * block, bool dealloc)
3378 gcc_assert (!sym->attr.allocatable);
3379 gfc_set_sym_referenced (sym);
3380 e = gfc_lval_expr_from_sym (sym);
3381 tmp = gfc_trans_assignment (e, sym->value, false, dealloc);
3382 if (sym->attr.dummy && (sym->attr.optional
3383 || sym->ns->proc_name->attr.entry_master))
3385 present = gfc_conv_expr_present (sym);
3386 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
3387 tmp, build_empty_stmt (input_location));
3389 gfc_add_expr_to_block (block, tmp);
3394 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3395 them their default initializer, if they do not have allocatable
3396 components, they have their allocatable components deallocated. */
3399 init_intent_out_dt (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3402 gfc_formal_arglist *f;
3406 gfc_init_block (&init);
3407 for (f = proc_sym->formal; f; f = f->next)
3408 if (f->sym && f->sym->attr.intent == INTENT_OUT
3409 && !f->sym->attr.pointer
3410 && f->sym->ts.type == BT_DERIVED)
3412 if (f->sym->ts.u.derived->attr.alloc_comp && !f->sym->value)
3414 tmp = gfc_deallocate_alloc_comp (f->sym->ts.u.derived,
3415 f->sym->backend_decl,
3416 f->sym->as ? f->sym->as->rank : 0);
3418 if (f->sym->attr.optional
3419 || f->sym->ns->proc_name->attr.entry_master)
3421 present = gfc_conv_expr_present (f->sym);
3422 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3424 build_empty_stmt (input_location));
3427 gfc_add_expr_to_block (&init, tmp);
3429 else if (f->sym->value)
3430 gfc_init_default_dt (f->sym, &init, true);
3432 else if (f->sym && f->sym->attr.intent == INTENT_OUT
3433 && f->sym->ts.type == BT_CLASS
3434 && !CLASS_DATA (f->sym)->attr.class_pointer
3435 && CLASS_DATA (f->sym)->ts.u.derived->attr.alloc_comp)
3437 tree decl = build_fold_indirect_ref_loc (input_location,
3438 f->sym->backend_decl);
3439 tmp = CLASS_DATA (f->sym)->backend_decl;
3440 tmp = fold_build3_loc (input_location, COMPONENT_REF,
3441 TREE_TYPE (tmp), decl, tmp, NULL_TREE);
3442 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3443 tmp = gfc_deallocate_alloc_comp (CLASS_DATA (f->sym)->ts.u.derived,
3445 CLASS_DATA (f->sym)->as ?
3446 CLASS_DATA (f->sym)->as->rank : 0);
3448 if (f->sym->attr.optional || f->sym->ns->proc_name->attr.entry_master)
3450 present = gfc_conv_expr_present (f->sym);
3451 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3453 build_empty_stmt (input_location));
3456 gfc_add_expr_to_block (&init, tmp);
3459 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3463 /* Generate function entry and exit code, and add it to the function body.
3465 Allocation and initialization of array variables.
3466 Allocation of character string variables.
3467 Initialization and possibly repacking of dummy arrays.
3468 Initialization of ASSIGN statement auxiliary variable.
3469 Initialization of ASSOCIATE names.
3470 Automatic deallocation. */
3473 gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3477 gfc_formal_arglist *f;
3478 stmtblock_t tmpblock;
3479 bool seen_trans_deferred_array = false;
3485 /* Deal with implicit return variables. Explicit return variables will
3486 already have been added. */
3487 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
3489 if (!current_fake_result_decl)
3491 gfc_entry_list *el = NULL;
3492 if (proc_sym->attr.entry_master)
3494 for (el = proc_sym->ns->entries; el; el = el->next)
3495 if (el->sym != el->sym->result)
3498 /* TODO: move to the appropriate place in resolve.c. */
3499 if (warn_return_type && el == NULL)
3500 gfc_warning ("Return value of function '%s' at %L not set",
3501 proc_sym->name, &proc_sym->declared_at);
3503 else if (proc_sym->as)
3505 tree result = TREE_VALUE (current_fake_result_decl);
3506 gfc_trans_dummy_array_bias (proc_sym, result, block);
3508 /* An automatic character length, pointer array result. */
3509 if (proc_sym->ts.type == BT_CHARACTER
3510 && TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3511 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3513 else if (proc_sym->ts.type == BT_CHARACTER)
3515 if (proc_sym->ts.deferred)
3518 gfc_save_backend_locus (&loc);
3519 gfc_set_backend_locus (&proc_sym->declared_at);
3520 gfc_start_block (&init);
3521 /* Zero the string length on entry. */
3522 gfc_add_modify (&init, proc_sym->ts.u.cl->backend_decl,
3523 build_int_cst (gfc_charlen_type_node, 0));
3524 /* Null the pointer. */
3525 e = gfc_lval_expr_from_sym (proc_sym);
3526 gfc_init_se (&se, NULL);
3527 se.want_pointer = 1;
3528 gfc_conv_expr (&se, e);
3531 gfc_add_modify (&init, tmp,
3532 fold_convert (TREE_TYPE (se.expr),
3533 null_pointer_node));
3534 gfc_restore_backend_locus (&loc);
3536 /* Pass back the string length on exit. */
3537 tmp = proc_sym->ts.u.cl->passed_length;
3538 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3539 tmp = fold_convert (gfc_charlen_type_node, tmp);
3540 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3541 gfc_charlen_type_node, tmp,
3542 proc_sym->ts.u.cl->backend_decl);
3543 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3545 else if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3546 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3549 gcc_assert (gfc_option.flag_f2c
3550 && proc_sym->ts.type == BT_COMPLEX);
3553 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3554 should be done here so that the offsets and lbounds of arrays
3556 gfc_save_backend_locus (&loc);
3557 gfc_set_backend_locus (&proc_sym->declared_at);
3558 init_intent_out_dt (proc_sym, block);
3559 gfc_restore_backend_locus (&loc);
3561 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
3563 bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
3564 && sym->ts.u.derived->attr.alloc_comp;
3568 if (sym->attr.dimension || sym->attr.codimension)
3570 /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT. */
3571 array_type tmp = sym->as->type;
3572 if (tmp == AS_ASSUMED_SIZE && sym->as->cp_was_assumed)
3577 if (sym->attr.dummy || sym->attr.result)
3578 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3579 else if (sym->attr.pointer || sym->attr.allocatable)
3581 if (TREE_STATIC (sym->backend_decl))
3583 gfc_save_backend_locus (&loc);
3584 gfc_set_backend_locus (&sym->declared_at);
3585 gfc_trans_static_array_pointer (sym);
3586 gfc_restore_backend_locus (&loc);
3590 seen_trans_deferred_array = true;
3591 gfc_trans_deferred_array (sym, block);
3594 else if (sym->attr.codimension && TREE_STATIC (sym->backend_decl))
3596 gfc_init_block (&tmpblock);
3597 gfc_trans_array_cobounds (TREE_TYPE (sym->backend_decl),
3599 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3603 else if (gfc_option.coarray != GFC_FCOARRAY_LIB)
3605 gfc_save_backend_locus (&loc);
3606 gfc_set_backend_locus (&sym->declared_at);
3608 if (sym_has_alloc_comp)
3610 seen_trans_deferred_array = true;
3611 gfc_trans_deferred_array (sym, block);
3613 else if (sym->ts.type == BT_DERIVED
3616 && sym->attr.save == SAVE_NONE)
3618 gfc_start_block (&tmpblock);
3619 gfc_init_default_dt (sym, &tmpblock, false);
3620 gfc_add_init_cleanup (block,
3621 gfc_finish_block (&tmpblock),
3625 gfc_trans_auto_array_allocation (sym->backend_decl,
3627 gfc_restore_backend_locus (&loc);
3631 case AS_ASSUMED_SIZE:
3632 /* Must be a dummy parameter. */
3633 gcc_assert (sym->attr.dummy || sym->as->cp_was_assumed);
3635 /* We should always pass assumed size arrays the g77 way. */
3636 if (sym->attr.dummy)
3637 gfc_trans_g77_array (sym, block);
3640 case AS_ASSUMED_SHAPE:
3641 /* Must be a dummy parameter. */
3642 gcc_assert (sym->attr.dummy);
3644 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3648 seen_trans_deferred_array = true;
3649 gfc_trans_deferred_array (sym, block);
3655 if (sym_has_alloc_comp && !seen_trans_deferred_array)
3656 gfc_trans_deferred_array (sym, block);
3658 else if ((!sym->attr.dummy || sym->ts.deferred)
3659 && (sym->attr.allocatable
3660 || (sym->ts.type == BT_CLASS
3661 && CLASS_DATA (sym)->attr.allocatable)))
3663 if (!sym->attr.save)
3665 /* Nullify and automatic deallocation of allocatable
3667 e = gfc_lval_expr_from_sym (sym);
3668 if (sym->ts.type == BT_CLASS)
3669 gfc_add_data_component (e);
3671 gfc_init_se (&se, NULL);
3672 se.want_pointer = 1;
3673 gfc_conv_expr (&se, e);
3676 gfc_save_backend_locus (&loc);
3677 gfc_set_backend_locus (&sym->declared_at);
3678 gfc_start_block (&init);
3680 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3682 /* Nullify when entering the scope. */
3683 gfc_add_modify (&init, se.expr,
3684 fold_convert (TREE_TYPE (se.expr),
3685 null_pointer_node));
3688 if ((sym->attr.dummy ||sym->attr.result)
3689 && sym->ts.type == BT_CHARACTER
3690 && sym->ts.deferred)
3692 /* Character length passed by reference. */
3693 tmp = sym->ts.u.cl->passed_length;
3694 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3695 tmp = fold_convert (gfc_charlen_type_node, tmp);
3697 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3698 /* Zero the string length when entering the scope. */
3699 gfc_add_modify (&init, sym->ts.u.cl->backend_decl,
3700 build_int_cst (gfc_charlen_type_node, 0));
3702 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
3704 gfc_restore_backend_locus (&loc);
3706 /* Pass the final character length back. */
3707 if (sym->attr.intent != INTENT_IN)
3708 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3709 gfc_charlen_type_node, tmp,
3710 sym->ts.u.cl->backend_decl);
3715 gfc_restore_backend_locus (&loc);
3717 /* Deallocate when leaving the scope. Nullifying is not
3719 if (!sym->attr.result && !sym->attr.dummy)
3720 tmp = gfc_deallocate_scalar_with_status (se.expr, NULL, true,
3723 if (sym->ts.type == BT_CLASS)
3725 /* Initialize _vptr to declared type. */
3726 gfc_symbol *vtab = gfc_find_derived_vtab (sym->ts.u.derived);
3729 gfc_save_backend_locus (&loc);
3730 gfc_set_backend_locus (&sym->declared_at);
3731 e = gfc_lval_expr_from_sym (sym);
3732 gfc_add_vptr_component (e);
3733 gfc_init_se (&se, NULL);
3734 se.want_pointer = 1;
3735 gfc_conv_expr (&se, e);
3737 rhs = gfc_build_addr_expr (TREE_TYPE (se.expr),
3738 gfc_get_symbol_decl (vtab));
3739 gfc_add_modify (&init, se.expr, rhs);
3740 gfc_restore_backend_locus (&loc);
3743 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3746 else if (sym->ts.type == BT_CHARACTER && sym->ts.deferred)
3751 /* If we get to here, all that should be left are pointers. */
3752 gcc_assert (sym->attr.pointer);
3754 if (sym->attr.dummy)
3756 gfc_start_block (&init);
3758 /* Character length passed by reference. */
3759 tmp = sym->ts.u.cl->passed_length;
3760 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3761 tmp = fold_convert (gfc_charlen_type_node, tmp);
3762 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
3763 /* Pass the final character length back. */
3764 if (sym->attr.intent != INTENT_IN)
3765 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3766 gfc_charlen_type_node, tmp,
3767 sym->ts.u.cl->backend_decl);
3770 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3773 else if (sym->ts.deferred)
3774 gfc_fatal_error ("Deferred type parameter not yet supported");
3775 else if (sym_has_alloc_comp)
3776 gfc_trans_deferred_array (sym, block);
3777 else if (sym->ts.type == BT_CHARACTER)
3779 gfc_save_backend_locus (&loc);
3780 gfc_set_backend_locus (&sym->declared_at);
3781 if (sym->attr.dummy || sym->attr.result)
3782 gfc_trans_dummy_character (sym, sym->ts.u.cl, block);
3784 gfc_trans_auto_character_variable (sym, block);
3785 gfc_restore_backend_locus (&loc);
3787 else if (sym->attr.assign)
3789 gfc_save_backend_locus (&loc);
3790 gfc_set_backend_locus (&sym->declared_at);
3791 gfc_trans_assign_aux_var (sym, block);
3792 gfc_restore_backend_locus (&loc);
3794 else if (sym->ts.type == BT_DERIVED
3797 && sym->attr.save == SAVE_NONE)
3799 gfc_start_block (&tmpblock);
3800 gfc_init_default_dt (sym, &tmpblock, false);
3801 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3808 gfc_init_block (&tmpblock);
3810 for (f = proc_sym->formal; f; f = f->next)
3812 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
3814 gcc_assert (f->sym->ts.u.cl->backend_decl != NULL);
3815 if (TREE_CODE (f->sym->ts.u.cl->backend_decl) == PARM_DECL)
3816 gfc_trans_vla_type_sizes (f->sym, &tmpblock);
3820 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
3821 && current_fake_result_decl != NULL)
3823 gcc_assert (proc_sym->ts.u.cl->backend_decl != NULL);
3824 if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == PARM_DECL)
3825 gfc_trans_vla_type_sizes (proc_sym, &tmpblock);
3828 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE);
3831 static GTY ((param_is (struct module_htab_entry))) htab_t module_htab;
3833 /* Hash and equality functions for module_htab. */
3836 module_htab_do_hash (const void *x)
3838 return htab_hash_string (((const struct module_htab_entry *)x)->name);
3842 module_htab_eq (const void *x1, const void *x2)
3844 return strcmp ((((const struct module_htab_entry *)x1)->name),
3845 (const char *)x2) == 0;
3848 /* Hash and equality functions for module_htab's decls. */
3851 module_htab_decls_hash (const void *x)
3853 const_tree t = (const_tree) x;
3854 const_tree n = DECL_NAME (t);
3856 n = TYPE_NAME (TREE_TYPE (t));
3857 return htab_hash_string (IDENTIFIER_POINTER (n));
3861 module_htab_decls_eq (const void *x1, const void *x2)
3863 const_tree t1 = (const_tree) x1;
3864 const_tree n1 = DECL_NAME (t1);
3865 if (n1 == NULL_TREE)
3866 n1 = TYPE_NAME (TREE_TYPE (t1));
3867 return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0;
3870 struct module_htab_entry *
3871 gfc_find_module (const char *name)
3876 module_htab = htab_create_ggc (10, module_htab_do_hash,
3877 module_htab_eq, NULL);
3879 slot = htab_find_slot_with_hash (module_htab, name,
3880 htab_hash_string (name), INSERT);
3883 struct module_htab_entry *entry = ggc_alloc_cleared_module_htab_entry ();
3885 entry->name = gfc_get_string (name);
3886 entry->decls = htab_create_ggc (10, module_htab_decls_hash,
3887 module_htab_decls_eq, NULL);
3888 *slot = (void *) entry;
3890 return (struct module_htab_entry *) *slot;
3894 gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
3899 if (DECL_NAME (decl))
3900 name = IDENTIFIER_POINTER (DECL_NAME (decl));
3903 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
3904 name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
3906 slot = htab_find_slot_with_hash (entry->decls, name,
3907 htab_hash_string (name), INSERT);
3909 *slot = (void *) decl;
3912 static struct module_htab_entry *cur_module;
3914 /* Output an initialized decl for a module variable. */
3917 gfc_create_module_variable (gfc_symbol * sym)
3921 /* Module functions with alternate entries are dealt with later and
3922 would get caught by the next condition. */
3923 if (sym->attr.entry)
3926 /* Make sure we convert the types of the derived types from iso_c_binding
3928 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3929 && sym->ts.type == BT_DERIVED)
3930 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3932 if (sym->attr.flavor == FL_DERIVED
3933 && sym->backend_decl
3934 && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
3936 decl = sym->backend_decl;
3937 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3939 /* -fwhole-file mixes up the contexts so these asserts are unnecessary. */
3940 if (!(gfc_option.flag_whole_file && sym->attr.use_assoc))
3942 gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
3943 || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
3944 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
3945 || DECL_CONTEXT (TYPE_STUB_DECL (decl))
3946 == sym->ns->proc_name->backend_decl);
3948 TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3949 DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
3950 gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
3953 /* Only output variables, procedure pointers and array valued,
3954 or derived type, parameters. */
3955 if (sym->attr.flavor != FL_VARIABLE
3956 && !(sym->attr.flavor == FL_PARAMETER
3957 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
3958 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
3961 if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
3963 decl = sym->backend_decl;
3964 gcc_assert (DECL_FILE_SCOPE_P (decl));
3965 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3966 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3967 gfc_module_add_decl (cur_module, decl);
3970 /* Don't generate variables from other modules. Variables from
3971 COMMONs will already have been generated. */
3972 if (sym->attr.use_assoc || sym->attr.in_common)
3975 /* Equivalenced variables arrive here after creation. */
3976 if (sym->backend_decl
3977 && (sym->equiv_built || sym->attr.in_equivalence))
3980 if (sym->backend_decl && !sym->attr.vtab && !sym->attr.target)
3981 internal_error ("backend decl for module variable %s already exists",
3984 /* We always want module variables to be created. */
3985 sym->attr.referenced = 1;
3986 /* Create the decl. */
3987 decl = gfc_get_symbol_decl (sym);
3989 /* Create the variable. */
3991 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3992 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3993 rest_of_decl_compilation (decl, 1, 0);
3994 gfc_module_add_decl (cur_module, decl);
3996 /* Also add length of strings. */
3997 if (sym->ts.type == BT_CHARACTER)
4001 length = sym->ts.u.cl->backend_decl;
4002 gcc_assert (length || sym->attr.proc_pointer);
4003 if (length && !INTEGER_CST_P (length))
4006 rest_of_decl_compilation (length, 1, 0);
4010 if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
4011 && sym->attr.referenced && !sym->attr.use_assoc)
4012 has_coarray_vars = true;
4015 /* Emit debug information for USE statements. */
4018 gfc_trans_use_stmts (gfc_namespace * ns)
4020 gfc_use_list *use_stmt;
4021 for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
4023 struct module_htab_entry *entry
4024 = gfc_find_module (use_stmt->module_name);
4025 gfc_use_rename *rent;
4027 if (entry->namespace_decl == NULL)
4029 entry->namespace_decl
4030 = build_decl (input_location,
4032 get_identifier (use_stmt->module_name),
4034 DECL_EXTERNAL (entry->namespace_decl) = 1;
4036 gfc_set_backend_locus (&use_stmt->where);
4037 if (!use_stmt->only_flag)
4038 (*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
4040 ns->proc_name->backend_decl,
4042 for (rent = use_stmt->rename; rent; rent = rent->next)
4044 tree decl, local_name;
4047 if (rent->op != INTRINSIC_NONE)
4050 slot = htab_find_slot_with_hash (entry->decls, rent->use_name,
4051 htab_hash_string (rent->use_name),
4057 st = gfc_find_symtree (ns->sym_root,
4059 ? rent->local_name : rent->use_name);
4061 /* The following can happen if a derived type is renamed. */
4065 name = xstrdup (rent->local_name[0]
4066 ? rent->local_name : rent->use_name);
4067 name[0] = (char) TOUPPER ((unsigned char) name[0]);
4068 st = gfc_find_symtree (ns->sym_root, name);
4073 /* Sometimes, generic interfaces wind up being over-ruled by a
4074 local symbol (see PR41062). */
4075 if (!st->n.sym->attr.use_assoc)
4078 if (st->n.sym->backend_decl
4079 && DECL_P (st->n.sym->backend_decl)
4080 && st->n.sym->module
4081 && strcmp (st->n.sym->module, use_stmt->module_name) == 0)
4083 gcc_assert (DECL_EXTERNAL (entry->namespace_decl)
4084 || (TREE_CODE (st->n.sym->backend_decl)
4086 decl = copy_node (st->n.sym->backend_decl);
4087 DECL_CONTEXT (decl) = entry->namespace_decl;
4088 DECL_EXTERNAL (decl) = 1;
4089 DECL_IGNORED_P (decl) = 0;
4090 DECL_INITIAL (decl) = NULL_TREE;
4094 *slot = error_mark_node;
4095 htab_clear_slot (entry->decls, slot);
4100 decl = (tree) *slot;
4101 if (rent->local_name[0])
4102 local_name = get_identifier (rent->local_name);
4104 local_name = NULL_TREE;
4105 gfc_set_backend_locus (&rent->where);
4106 (*debug_hooks->imported_module_or_decl) (decl, local_name,
4107 ns->proc_name->backend_decl,
4108 !use_stmt->only_flag);
4114 /* Return true if expr is a constant initializer that gfc_conv_initializer
4118 check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array,
4128 if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL)
4130 else if (expr->expr_type == EXPR_STRUCTURE)
4131 return check_constant_initializer (expr, ts, false, false);
4132 else if (expr->expr_type != EXPR_ARRAY)
4134 for (c = gfc_constructor_first (expr->value.constructor);
4135 c; c = gfc_constructor_next (c))
4139 if (c->expr->expr_type == EXPR_STRUCTURE)
4141 if (!check_constant_initializer (c->expr, ts, false, false))
4144 else if (c->expr->expr_type != EXPR_CONSTANT)
4149 else switch (ts->type)
4152 if (expr->expr_type != EXPR_STRUCTURE)
4154 cm = expr->ts.u.derived->components;
4155 for (c = gfc_constructor_first (expr->value.constructor);
4156 c; c = gfc_constructor_next (c), cm = cm->next)
4158 if (!c->expr || cm->attr.allocatable)
4160 if (!check_constant_initializer (c->expr, &cm->ts,
4167 return expr->expr_type == EXPR_CONSTANT;
4171 /* Emit debug info for parameters and unreferenced variables with
4175 gfc_emit_parameter_debug_info (gfc_symbol *sym)
4179 if (sym->attr.flavor != FL_PARAMETER
4180 && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced))
4183 if (sym->backend_decl != NULL
4184 || sym->value == NULL
4185 || sym->attr.use_assoc
4188 || sym->attr.function
4189 || sym->attr.intrinsic
4190 || sym->attr.pointer
4191 || sym->attr.allocatable
4192 || sym->attr.cray_pointee
4193 || sym->attr.threadprivate
4194 || sym->attr.is_bind_c
4195 || sym->attr.subref_array_pointer
4196 || sym->attr.assign)
4199 if (sym->ts.type == BT_CHARACTER)
4201 gfc_conv_const_charlen (sym->ts.u.cl);
4202 if (sym->ts.u.cl->backend_decl == NULL
4203 || TREE_CODE (sym->ts.u.cl->backend_decl) != INTEGER_CST)
4206 else if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
4213 if (sym->as->type != AS_EXPLICIT)
4215 for (n = 0; n < sym->as->rank; n++)
4216 if (sym->as->lower[n]->expr_type != EXPR_CONSTANT
4217 || sym->as->upper[n] == NULL
4218 || sym->as->upper[n]->expr_type != EXPR_CONSTANT)
4222 if (!check_constant_initializer (sym->value, &sym->ts,
4223 sym->attr.dimension, false))
4226 if (gfc_option.coarray == GFC_FCOARRAY_LIB && sym->attr.codimension)
4229 /* Create the decl for the variable or constant. */
4230 decl = build_decl (input_location,
4231 sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL,
4232 gfc_sym_identifier (sym), gfc_sym_type (sym));
4233 if (sym->attr.flavor == FL_PARAMETER)
4234 TREE_READONLY (decl) = 1;
4235 gfc_set_decl_location (decl, &sym->declared_at);
4236 if (sym->attr.dimension)
4237 GFC_DECL_PACKED_ARRAY (decl) = 1;
4238 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4239 TREE_STATIC (decl) = 1;
4240 TREE_USED (decl) = 1;
4241 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
4242 TREE_PUBLIC (decl) = 1;
4243 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
4245 sym->attr.dimension,
4247 debug_hooks->global_decl (decl);
4252 generate_coarray_sym_init (gfc_symbol *sym)
4254 tree tmp, size, decl, token;
4256 if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
4257 || sym->attr.use_assoc || !sym->attr.referenced)
4260 decl = sym->backend_decl;
4261 TREE_USED(decl) = 1;
4262 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
4264 /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
4265 to make sure the variable is not optimized away. */
4266 DECL_PRESERVE_P (DECL_CONTEXT (decl)) = 1;
4268 size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl)));
4270 /* Ensure that we do not have size=0 for zero-sized arrays. */
4271 size = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
4272 fold_convert (size_type_node, size),
4273 build_int_cst (size_type_node, 1));
4275 if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)))
4277 tmp = GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl));
4278 size = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
4279 fold_convert (size_type_node, tmp), size);
4282 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl)) != NULL_TREE);
4283 token = gfc_build_addr_expr (ppvoid_type_node,
4284 GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl)));
4286 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size,
4287 build_int_cst (integer_type_node,
4288 GFC_CAF_COARRAY_STATIC), /* type. */
4289 token, null_pointer_node, /* token, stat. */
4290 null_pointer_node, /* errgmsg, errmsg_len. */
4291 build_int_cst (integer_type_node, 0));
4293 gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl), tmp));
4296 /* Handle "static" initializer. */
4299 sym->attr.pointer = 1;
4300 tmp = gfc_trans_assignment (gfc_lval_expr_from_sym (sym), sym->value,
4302 sym->attr.pointer = 0;
4303 gfc_add_expr_to_block (&caf_init_block, tmp);
4308 /* Generate constructor function to initialize static, nonallocatable
4312 generate_coarray_init (gfc_namespace * ns __attribute((unused)))
4314 tree fndecl, tmp, decl, save_fn_decl;
4316 save_fn_decl = current_function_decl;
4317 push_function_context ();
4319 tmp = build_function_type_list (void_type_node, NULL_TREE);
4320 fndecl = build_decl (input_location, FUNCTION_DECL,
4321 create_tmp_var_name ("_caf_init"), tmp);
4323 DECL_STATIC_CONSTRUCTOR (fndecl) = 1;
4324 SET_DECL_INIT_PRIORITY (fndecl, DEFAULT_INIT_PRIORITY);
4326 decl = build_decl (input_location, RESULT_DECL, NULL_TREE, void_type_node);
4327 DECL_ARTIFICIAL (decl) = 1;
4328 DECL_IGNORED_P (decl) = 1;
4329 DECL_CONTEXT (decl) = fndecl;
4330 DECL_RESULT (fndecl) = decl;
4333 current_function_decl = fndecl;
4334 announce_function (fndecl);
4336 rest_of_decl_compilation (fndecl, 0, 0);
4337 make_decl_rtl (fndecl);
4338 init_function_start (fndecl);
4341 gfc_init_block (&caf_init_block);
4343 gfc_traverse_ns (ns, generate_coarray_sym_init);
4345 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&caf_init_block);
4349 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
4351 DECL_SAVED_TREE (fndecl)
4352 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
4353 DECL_INITIAL (fndecl));
4354 dump_function (TDI_original, fndecl);
4356 cfun->function_end_locus = input_location;
4359 if (decl_function_context (fndecl))
4360 (void) cgraph_create_node (fndecl);
4362 cgraph_finalize_function (fndecl, true);
4364 pop_function_context ();
4365 current_function_decl = save_fn_decl;
4369 /* Generate all the required code for module variables. */
4372 gfc_generate_module_vars (gfc_namespace * ns)
4374 module_namespace = ns;
4375 cur_module = gfc_find_module (ns->proc_name->name);
4377 /* Check if the frontend left the namespace in a reasonable state. */
4378 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
4380 /* Generate COMMON blocks. */
4381 gfc_trans_common (ns);
4383 has_coarray_vars = false;
4385 /* Create decls for all the module variables. */
4386 gfc_traverse_ns (ns, gfc_create_module_variable);
4388 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
4389 generate_coarray_init (ns);
4393 gfc_trans_use_stmts (ns);
4394 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
4399 gfc_generate_contained_functions (gfc_namespace * parent)
4403 /* We create all the prototypes before generating any code. */
4404 for (ns = parent->contained; ns; ns = ns->sibling)
4406 /* Skip namespaces from used modules. */
4407 if (ns->parent != parent)
4410 gfc_create_function_decl (ns, false);
4413 for (ns = parent->contained; ns; ns = ns->sibling)
4415 /* Skip namespaces from used modules. */
4416 if (ns->parent != parent)
4419 gfc_generate_function_code (ns);
4424 /* Drill down through expressions for the array specification bounds and
4425 character length calling generate_local_decl for all those variables
4426 that have not already been declared. */
4429 generate_local_decl (gfc_symbol *);
4431 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4434 expr_decls (gfc_expr *e, gfc_symbol *sym,
4435 int *f ATTRIBUTE_UNUSED)
4437 if (e->expr_type != EXPR_VARIABLE
4438 || sym == e->symtree->n.sym
4439 || e->symtree->n.sym->mark
4440 || e->symtree->n.sym->ns != sym->ns)
4443 generate_local_decl (e->symtree->n.sym);
4448 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
4450 gfc_traverse_expr (e, sym, expr_decls, 0);
4454 /* Check for dependencies in the character length and array spec. */
4457 generate_dependency_declarations (gfc_symbol *sym)
4461 if (sym->ts.type == BT_CHARACTER
4463 && sym->ts.u.cl->length
4464 && sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4465 generate_expr_decls (sym, sym->ts.u.cl->length);
4467 if (sym->as && sym->as->rank)
4469 for (i = 0; i < sym->as->rank; i++)
4471 generate_expr_decls (sym, sym->as->lower[i]);
4472 generate_expr_decls (sym, sym->as->upper[i]);
4478 /* Generate decls for all local variables. We do this to ensure correct
4479 handling of expressions which only appear in the specification of
4483 generate_local_decl (gfc_symbol * sym)
4485 if (sym->attr.flavor == FL_VARIABLE)
4487 if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
4488 && sym->attr.referenced && !sym->attr.use_assoc)
4489 has_coarray_vars = true;
4491 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
4492 generate_dependency_declarations (sym);
4494 if (sym->attr.referenced)
4495 gfc_get_symbol_decl (sym);
4497 /* Warnings for unused dummy arguments. */
4498 else if (sym->attr.dummy)
4500 /* INTENT(out) dummy arguments are likely meant to be set. */
4501 if (gfc_option.warn_unused_dummy_argument
4502 && sym->attr.intent == INTENT_OUT)
4504 if (sym->ts.type != BT_DERIVED)
4505 gfc_warning ("Dummy argument '%s' at %L was declared "
4506 "INTENT(OUT) but was not set", sym->name,
4508 else if (!gfc_has_default_initializer (sym->ts.u.derived))
4509 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4510 "declared INTENT(OUT) but was not set and "
4511 "does not have a default initializer",
4512 sym->name, &sym->declared_at);
4514 else if (gfc_option.warn_unused_dummy_argument)
4515 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
4519 /* Warn for unused variables, but not if they're inside a common
4520 block, a namelist, or are use-associated. */
4521 else if (warn_unused_variable
4522 && !(sym->attr.in_common || sym->attr.use_assoc || sym->mark
4523 || sym->attr.in_namelist))
4524 gfc_warning ("Unused variable '%s' declared at %L", sym->name,
4526 else if (warn_unused_variable && sym->attr.use_only)
4527 gfc_warning ("Unused module variable '%s' which has been explicitly "
4528 "imported at %L", sym->name, &sym->declared_at);
4530 /* For variable length CHARACTER parameters, the PARM_DECL already
4531 references the length variable, so force gfc_get_symbol_decl
4532 even when not referenced. If optimize > 0, it will be optimized
4533 away anyway. But do this only after emitting -Wunused-parameter
4534 warning if requested. */
4535 if (sym->attr.dummy && !sym->attr.referenced
4536 && sym->ts.type == BT_CHARACTER
4537 && sym->ts.u.cl->backend_decl != NULL
4538 && TREE_CODE (sym->ts.u.cl->backend_decl) == VAR_DECL)
4540 sym->attr.referenced = 1;
4541 gfc_get_symbol_decl (sym);
4544 /* INTENT(out) dummy arguments and result variables with allocatable
4545 components are reset by default and need to be set referenced to
4546 generate the code for nullification and automatic lengths. */
4547 if (!sym->attr.referenced
4548 && sym->ts.type == BT_DERIVED
4549 && sym->ts.u.derived->attr.alloc_comp
4550 && !sym->attr.pointer
4551 && ((sym->attr.dummy && sym->attr.intent == INTENT_OUT)
4553 (sym->attr.result && sym != sym->result)))
4555 sym->attr.referenced = 1;
4556 gfc_get_symbol_decl (sym);
4559 /* Check for dependencies in the array specification and string
4560 length, adding the necessary declarations to the function. We
4561 mark the symbol now, as well as in traverse_ns, to prevent
4562 getting stuck in a circular dependency. */
4565 /* We do not want the middle-end to warn about unused parameters
4566 as this was already done above. */
4567 if (sym->attr.dummy && sym->backend_decl != NULL_TREE)
4568 TREE_NO_WARNING(sym->backend_decl) = 1;
4570 else if (sym->attr.flavor == FL_PARAMETER)
4572 if (warn_unused_parameter
4573 && !sym->attr.referenced)
4575 if (!sym->attr.use_assoc)
4576 gfc_warning ("Unused parameter '%s' declared at %L", sym->name,
4578 else if (sym->attr.use_only)
4579 gfc_warning ("Unused parameter '%s' which has been explicitly "
4580 "imported at %L", sym->name, &sym->declared_at);
4583 else if (sym->attr.flavor == FL_PROCEDURE)
4585 /* TODO: move to the appropriate place in resolve.c. */
4586 if (warn_return_type
4587 && sym->attr.function
4589 && sym != sym->result
4590 && !sym->result->attr.referenced
4591 && !sym->attr.use_assoc
4592 && sym->attr.if_source != IFSRC_IFBODY)
4594 gfc_warning ("Return value '%s' of function '%s' declared at "
4595 "%L not set", sym->result->name, sym->name,
4596 &sym->result->declared_at);
4598 /* Prevents "Unused variable" warning for RESULT variables. */
4599 sym->result->mark = 1;
4603 if (sym->attr.dummy == 1)
4605 /* Modify the tree type for scalar character dummy arguments of bind(c)
4606 procedures if they are passed by value. The tree type for them will
4607 be promoted to INTEGER_TYPE for the middle end, which appears to be
4608 what C would do with characters passed by-value. The value attribute
4609 implies the dummy is a scalar. */
4610 if (sym->attr.value == 1 && sym->backend_decl != NULL
4611 && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
4612 && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
4613 gfc_conv_scalar_char_value (sym, NULL, NULL);
4616 /* Make sure we convert the types of the derived types from iso_c_binding
4618 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
4619 && sym->ts.type == BT_DERIVED)
4620 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
4624 generate_local_vars (gfc_namespace * ns)
4626 gfc_traverse_ns (ns, generate_local_decl);
4630 /* Generate a switch statement to jump to the correct entry point. Also
4631 creates the label decls for the entry points. */
4634 gfc_trans_entry_master_switch (gfc_entry_list * el)
4641 gfc_init_block (&block);
4642 for (; el; el = el->next)
4644 /* Add the case label. */
4645 label = gfc_build_label_decl (NULL_TREE);
4646 val = build_int_cst (gfc_array_index_type, el->id);
4647 tmp = build_case_label (val, NULL_TREE, label);
4648 gfc_add_expr_to_block (&block, tmp);
4650 /* And jump to the actual entry point. */
4651 label = gfc_build_label_decl (NULL_TREE);
4652 tmp = build1_v (GOTO_EXPR, label);
4653 gfc_add_expr_to_block (&block, tmp);
4655 /* Save the label decl. */
4658 tmp = gfc_finish_block (&block);
4659 /* The first argument selects the entry point. */
4660 val = DECL_ARGUMENTS (current_function_decl);
4661 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
4666 /* Add code to string lengths of actual arguments passed to a function against
4667 the expected lengths of the dummy arguments. */
4670 add_argument_checking (stmtblock_t *block, gfc_symbol *sym)
4672 gfc_formal_arglist *formal;
4674 for (formal = sym->formal; formal; formal = formal->next)
4675 if (formal->sym && formal->sym->ts.type == BT_CHARACTER)
4677 enum tree_code comparison;
4682 const char *message;
4688 gcc_assert (cl->passed_length != NULL_TREE);
4689 gcc_assert (cl->backend_decl != NULL_TREE);
4691 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
4692 string lengths must match exactly. Otherwise, it is only required
4693 that the actual string length is *at least* the expected one.
4694 Sequence association allows for a mismatch of the string length
4695 if the actual argument is (part of) an array, but only if the
4696 dummy argument is an array. (See "Sequence association" in
4697 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
4698 if (fsym->attr.pointer || fsym->attr.allocatable
4699 || (fsym->as && fsym->as->type == AS_ASSUMED_SHAPE))
4701 comparison = NE_EXPR;
4702 message = _("Actual string length does not match the declared one"
4703 " for dummy argument '%s' (%ld/%ld)");
4705 else if (fsym->as && fsym->as->rank != 0)
4709 comparison = LT_EXPR;
4710 message = _("Actual string length is shorter than the declared one"
4711 " for dummy argument '%s' (%ld/%ld)");
4714 /* Build the condition. For optional arguments, an actual length
4715 of 0 is also acceptable if the associated string is NULL, which
4716 means the argument was not passed. */
4717 cond = fold_build2_loc (input_location, comparison, boolean_type_node,
4718 cl->passed_length, cl->backend_decl);
4719 if (fsym->attr.optional)
4725 not_0length = fold_build2_loc (input_location, NE_EXPR,
4728 build_zero_cst (gfc_charlen_type_node));
4729 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
4730 fsym->attr.referenced = 1;
4731 not_absent = gfc_conv_expr_present (fsym);
4733 absent_failed = fold_build2_loc (input_location, TRUTH_OR_EXPR,
4734 boolean_type_node, not_0length,
4737 cond = fold_build2_loc (input_location, TRUTH_AND_EXPR,
4738 boolean_type_node, cond, absent_failed);
4741 /* Build the runtime check. */
4742 argname = gfc_build_cstring_const (fsym->name);
4743 argname = gfc_build_addr_expr (pchar_type_node, argname);
4744 gfc_trans_runtime_check (true, false, cond, block, &fsym->declared_at,
4746 fold_convert (long_integer_type_node,
4748 fold_convert (long_integer_type_node,
4754 /* Generate the _gfortran_caf_this_image and _gfortran_caf_num_images
4755 global variables for -fcoarray=lib. They are placed into the translation
4756 unit of the main program. Make sure that in one TU (the one of the main
4757 program), the first call to gfc_init_coarray_decl is done with true.
4758 Otherwise, expect link errors. */
4761 gfc_init_coarray_decl (bool main_tu)
4765 if (gfc_option.coarray != GFC_FCOARRAY_LIB)
4768 if (gfort_gvar_caf_this_image || gfort_gvar_caf_num_images)
4771 save_fn_decl = current_function_decl;
4772 current_function_decl = NULL_TREE;
4775 gfort_gvar_caf_this_image
4776 = build_decl (input_location, VAR_DECL,
4777 get_identifier (PREFIX("caf_this_image")),
4779 DECL_ARTIFICIAL (gfort_gvar_caf_this_image) = 1;
4780 TREE_USED (gfort_gvar_caf_this_image) = 1;
4781 TREE_PUBLIC (gfort_gvar_caf_this_image) = 1;
4782 TREE_READONLY (gfort_gvar_caf_this_image) = 0;
4785 TREE_STATIC (gfort_gvar_caf_this_image) = 1;
4787 DECL_EXTERNAL (gfort_gvar_caf_this_image) = 1;
4789 pushdecl_top_level (gfort_gvar_caf_this_image);
4791 gfort_gvar_caf_num_images
4792 = build_decl (input_location, VAR_DECL,
4793 get_identifier (PREFIX("caf_num_images")),
4795 DECL_ARTIFICIAL (gfort_gvar_caf_num_images) = 1;
4796 TREE_USED (gfort_gvar_caf_num_images) = 1;
4797 TREE_PUBLIC (gfort_gvar_caf_num_images) = 1;
4798 TREE_READONLY (gfort_gvar_caf_num_images) = 0;
4801 TREE_STATIC (gfort_gvar_caf_num_images) = 1;
4803 DECL_EXTERNAL (gfort_gvar_caf_num_images) = 1;
4805 pushdecl_top_level (gfort_gvar_caf_num_images);
4808 current_function_decl = save_fn_decl;
4813 create_main_function (tree fndecl)
4817 tree tmp, decl, result_decl, argc, argv, typelist, arglist;
4820 old_context = current_function_decl;
4824 push_function_context ();
4825 saved_parent_function_decls = saved_function_decls;
4826 saved_function_decls = NULL_TREE;
4829 /* main() function must be declared with global scope. */
4830 gcc_assert (current_function_decl == NULL_TREE);
4832 /* Declare the function. */
4833 tmp = build_function_type_list (integer_type_node, integer_type_node,
4834 build_pointer_type (pchar_type_node),
4836 main_identifier_node = get_identifier ("main");
4837 ftn_main = build_decl (input_location, FUNCTION_DECL,
4838 main_identifier_node, tmp);
4839 DECL_EXTERNAL (ftn_main) = 0;
4840 TREE_PUBLIC (ftn_main) = 1;
4841 TREE_STATIC (ftn_main) = 1;
4842 DECL_ATTRIBUTES (ftn_main)
4843 = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
4845 /* Setup the result declaration (for "return 0"). */
4846 result_decl = build_decl (input_location,
4847 RESULT_DECL, NULL_TREE, integer_type_node);
4848 DECL_ARTIFICIAL (result_decl) = 1;
4849 DECL_IGNORED_P (result_decl) = 1;
4850 DECL_CONTEXT (result_decl) = ftn_main;
4851 DECL_RESULT (ftn_main) = result_decl;
4853 pushdecl (ftn_main);
4855 /* Get the arguments. */
4857 arglist = NULL_TREE;
4858 typelist = TYPE_ARG_TYPES (TREE_TYPE (ftn_main));
4860 tmp = TREE_VALUE (typelist);
4861 argc = build_decl (input_location, PARM_DECL, get_identifier ("argc"), tmp);
4862 DECL_CONTEXT (argc) = ftn_main;
4863 DECL_ARG_TYPE (argc) = TREE_VALUE (typelist);
4864 TREE_READONLY (argc) = 1;
4865 gfc_finish_decl (argc);
4866 arglist = chainon (arglist, argc);
4868 typelist = TREE_CHAIN (typelist);
4869 tmp = TREE_VALUE (typelist);
4870 argv = build_decl (input_location, PARM_DECL, get_identifier ("argv"), tmp);
4871 DECL_CONTEXT (argv) = ftn_main;
4872 DECL_ARG_TYPE (argv) = TREE_VALUE (typelist);
4873 TREE_READONLY (argv) = 1;
4874 DECL_BY_REFERENCE (argv) = 1;
4875 gfc_finish_decl (argv);
4876 arglist = chainon (arglist, argv);
4878 DECL_ARGUMENTS (ftn_main) = arglist;
4879 current_function_decl = ftn_main;
4880 announce_function (ftn_main);
4882 rest_of_decl_compilation (ftn_main, 1, 0);
4883 make_decl_rtl (ftn_main);
4884 init_function_start (ftn_main);
4887 gfc_init_block (&body);
4889 /* Call some libgfortran initialization routines, call then MAIN__(). */
4891 /* Call _gfortran_caf_init (*argc, ***argv, *this_image, *num_images). */
4892 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
4894 tree pint_type, pppchar_type;
4895 pint_type = build_pointer_type (integer_type_node);
4897 = build_pointer_type (build_pointer_type (pchar_type_node));
4899 gfc_init_coarray_decl (true);
4900 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_init, 4,
4901 gfc_build_addr_expr (pint_type, argc),
4902 gfc_build_addr_expr (pppchar_type, argv),
4903 gfc_build_addr_expr (pint_type, gfort_gvar_caf_this_image),
4904 gfc_build_addr_expr (pint_type, gfort_gvar_caf_num_images));
4905 gfc_add_expr_to_block (&body, tmp);
4908 /* Call _gfortran_set_args (argc, argv). */
4909 TREE_USED (argc) = 1;
4910 TREE_USED (argv) = 1;
4911 tmp = build_call_expr_loc (input_location,
4912 gfor_fndecl_set_args, 2, argc, argv);
4913 gfc_add_expr_to_block (&body, tmp);
4915 /* Add a call to set_options to set up the runtime library Fortran
4916 language standard parameters. */
4918 tree array_type, array, var;
4919 VEC(constructor_elt,gc) *v = NULL;
4921 /* Passing a new option to the library requires four modifications:
4922 + add it to the tree_cons list below
4923 + change the array size in the call to build_array_type
4924 + change the first argument to the library call
4925 gfor_fndecl_set_options
4926 + modify the library (runtime/compile_options.c)! */
4928 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4929 build_int_cst (integer_type_node,
4930 gfc_option.warn_std));
4931 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4932 build_int_cst (integer_type_node,
4933 gfc_option.allow_std));
4934 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4935 build_int_cst (integer_type_node, pedantic));
4936 /* TODO: This is the old -fdump-core option, which is unused but
4937 passed due to ABI compatibility; remove when bumping the
4939 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4940 build_int_cst (integer_type_node,
4942 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4943 build_int_cst (integer_type_node,
4944 gfc_option.flag_backtrace));
4945 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4946 build_int_cst (integer_type_node,
4947 gfc_option.flag_sign_zero));
4948 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4949 build_int_cst (integer_type_node,
4951 & GFC_RTCHECK_BOUNDS)));
4952 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4953 build_int_cst (integer_type_node,
4954 gfc_option.flag_range_check));
4956 array_type = build_array_type (integer_type_node,
4957 build_index_type (size_int (7)));
4958 array = build_constructor (array_type, v);
4959 TREE_CONSTANT (array) = 1;
4960 TREE_STATIC (array) = 1;
4962 /* Create a static variable to hold the jump table. */
4963 var = gfc_create_var (array_type, "options");
4964 TREE_CONSTANT (var) = 1;
4965 TREE_STATIC (var) = 1;
4966 TREE_READONLY (var) = 1;
4967 DECL_INITIAL (var) = array;
4968 var = gfc_build_addr_expr (build_pointer_type (integer_type_node), var);
4970 tmp = build_call_expr_loc (input_location,
4971 gfor_fndecl_set_options, 2,
4972 build_int_cst (integer_type_node, 8), var);
4973 gfc_add_expr_to_block (&body, tmp);
4976 /* If -ffpe-trap option was provided, add a call to set_fpe so that
4977 the library will raise a FPE when needed. */
4978 if (gfc_option.fpe != 0)
4980 tmp = build_call_expr_loc (input_location,
4981 gfor_fndecl_set_fpe, 1,
4982 build_int_cst (integer_type_node,
4984 gfc_add_expr_to_block (&body, tmp);
4987 /* If this is the main program and an -fconvert option was provided,
4988 add a call to set_convert. */
4990 if (gfc_option.convert != GFC_CONVERT_NATIVE)
4992 tmp = build_call_expr_loc (input_location,
4993 gfor_fndecl_set_convert, 1,
4994 build_int_cst (integer_type_node,
4995 gfc_option.convert));
4996 gfc_add_expr_to_block (&body, tmp);
4999 /* If this is the main program and an -frecord-marker option was provided,
5000 add a call to set_record_marker. */
5002 if (gfc_option.record_marker != 0)
5004 tmp = build_call_expr_loc (input_location,
5005 gfor_fndecl_set_record_marker, 1,
5006 build_int_cst (integer_type_node,
5007 gfc_option.record_marker));
5008 gfc_add_expr_to_block (&body, tmp);
5011 if (gfc_option.max_subrecord_length != 0)
5013 tmp = build_call_expr_loc (input_location,
5014 gfor_fndecl_set_max_subrecord_length, 1,
5015 build_int_cst (integer_type_node,
5016 gfc_option.max_subrecord_length));
5017 gfc_add_expr_to_block (&body, tmp);
5020 /* Call MAIN__(). */
5021 tmp = build_call_expr_loc (input_location,
5023 gfc_add_expr_to_block (&body, tmp);
5025 /* Mark MAIN__ as used. */
5026 TREE_USED (fndecl) = 1;
5028 /* Coarray: Call _gfortran_caf_finalize(void). */
5029 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
5031 /* Per F2008, 8.5.1 END of the main program implies a
5033 tmp = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
5034 tmp = build_call_expr_loc (input_location, tmp, 0);
5035 gfc_add_expr_to_block (&body, tmp);
5037 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_finalize, 0);
5038 gfc_add_expr_to_block (&body, tmp);
5042 tmp = fold_build2_loc (input_location, MODIFY_EXPR, integer_type_node,
5043 DECL_RESULT (ftn_main),
5044 build_int_cst (integer_type_node, 0));
5045 tmp = build1_v (RETURN_EXPR, tmp);
5046 gfc_add_expr_to_block (&body, tmp);
5049 DECL_SAVED_TREE (ftn_main) = gfc_finish_block (&body);
5052 /* Finish off this function and send it for code generation. */
5054 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main)) = ftn_main;
5056 DECL_SAVED_TREE (ftn_main)
5057 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (ftn_main),
5058 DECL_INITIAL (ftn_main));
5060 /* Output the GENERIC tree. */
5061 dump_function (TDI_original, ftn_main);
5063 cgraph_finalize_function (ftn_main, true);
5067 pop_function_context ();
5068 saved_function_decls = saved_parent_function_decls;
5070 current_function_decl = old_context;
5074 /* Get the result expression for a procedure. */
5077 get_proc_result (gfc_symbol* sym)
5079 if (sym->attr.subroutine || sym == sym->result)
5081 if (current_fake_result_decl != NULL)
5082 return TREE_VALUE (current_fake_result_decl);
5087 return sym->result->backend_decl;
5091 /* Generate an appropriate return-statement for a procedure. */
5094 gfc_generate_return (void)
5100 sym = current_procedure_symbol;
5101 fndecl = sym->backend_decl;
5103 if (TREE_TYPE (DECL_RESULT (fndecl)) == void_type_node)
5107 result = get_proc_result (sym);
5109 /* Set the return value to the dummy result variable. The
5110 types may be different for scalar default REAL functions
5111 with -ff2c, therefore we have to convert. */
5112 if (result != NULL_TREE)
5114 result = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
5115 result = fold_build2_loc (input_location, MODIFY_EXPR,
5116 TREE_TYPE (result), DECL_RESULT (fndecl),
5121 return build1_v (RETURN_EXPR, result);
5125 /* Generate code for a function. */
5128 gfc_generate_function_code (gfc_namespace * ns)
5134 stmtblock_t init, cleanup;
5136 gfc_wrapped_block try_block;
5137 tree recurcheckvar = NULL_TREE;
5139 gfc_symbol *previous_procedure_symbol;
5143 sym = ns->proc_name;
5144 previous_procedure_symbol = current_procedure_symbol;
5145 current_procedure_symbol = sym;
5147 /* Check that the frontend isn't still using this. */
5148 gcc_assert (sym->tlink == NULL);
5151 /* Create the declaration for functions with global scope. */
5152 if (!sym->backend_decl)
5153 gfc_create_function_decl (ns, false);
5155 fndecl = sym->backend_decl;
5156 old_context = current_function_decl;
5160 push_function_context ();
5161 saved_parent_function_decls = saved_function_decls;
5162 saved_function_decls = NULL_TREE;
5165 trans_function_start (sym);
5167 gfc_init_block (&init);
5169 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
5171 /* Copy length backend_decls to all entry point result
5176 gfc_conv_const_charlen (ns->proc_name->ts.u.cl);
5177 backend_decl = ns->proc_name->result->ts.u.cl->backend_decl;
5178 for (el = ns->entries; el; el = el->next)
5179 el->sym->result->ts.u.cl->backend_decl = backend_decl;
5182 /* Translate COMMON blocks. */
5183 gfc_trans_common (ns);
5185 /* Null the parent fake result declaration if this namespace is
5186 a module function or an external procedures. */
5187 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
5188 || ns->parent == NULL)
5189 parent_fake_result_decl = NULL_TREE;
5191 gfc_generate_contained_functions (ns);
5193 nonlocal_dummy_decls = NULL;
5194 nonlocal_dummy_decl_pset = NULL;
5196 has_coarray_vars = false;
5197 generate_local_vars (ns);
5199 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
5200 generate_coarray_init (ns);
5202 /* Keep the parent fake result declaration in module functions
5203 or external procedures. */
5204 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
5205 || ns->parent == NULL)
5206 current_fake_result_decl = parent_fake_result_decl;
5208 current_fake_result_decl = NULL_TREE;
5210 is_recursive = sym->attr.recursive
5211 || (sym->attr.entry_master
5212 && sym->ns->entries->sym->attr.recursive);
5213 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
5215 && !gfc_option.flag_recursive)
5219 asprintf (&msg, "Recursive call to nonrecursive procedure '%s'",
5221 recurcheckvar = gfc_create_var (boolean_type_node, "is_recursive");
5222 TREE_STATIC (recurcheckvar) = 1;
5223 DECL_INITIAL (recurcheckvar) = boolean_false_node;
5224 gfc_add_expr_to_block (&init, recurcheckvar);
5225 gfc_trans_runtime_check (true, false, recurcheckvar, &init,
5226 &sym->declared_at, msg);
5227 gfc_add_modify (&init, recurcheckvar, boolean_true_node);
5231 /* Now generate the code for the body of this function. */
5232 gfc_init_block (&body);
5234 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
5235 && sym->attr.subroutine)
5237 tree alternate_return;
5238 alternate_return = gfc_get_fake_result_decl (sym, 0);
5239 gfc_add_modify (&body, alternate_return, integer_zero_node);
5244 /* Jump to the correct entry point. */
5245 tmp = gfc_trans_entry_master_switch (ns->entries);
5246 gfc_add_expr_to_block (&body, tmp);
5249 /* If bounds-checking is enabled, generate code to check passed in actual
5250 arguments against the expected dummy argument attributes (e.g. string
5252 if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !sym->attr.is_bind_c)
5253 add_argument_checking (&body, sym);
5255 tmp = gfc_trans_code (ns->code);
5256 gfc_add_expr_to_block (&body, tmp);
5258 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
5260 tree result = get_proc_result (sym);
5262 if (result != NULL_TREE && sym->attr.function && !sym->attr.pointer)
5264 if (sym->attr.allocatable && sym->attr.dimension == 0
5265 && sym->result == sym)
5266 gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
5267 null_pointer_node));
5268 else if (sym->ts.type == BT_CLASS
5269 && CLASS_DATA (sym)->attr.allocatable
5270 && sym->attr.dimension == 0 && sym->result == sym)
5272 tmp = CLASS_DATA (sym)->backend_decl;
5273 tmp = fold_build3_loc (input_location, COMPONENT_REF,
5274 TREE_TYPE (tmp), result, tmp, NULL_TREE);
5275 gfc_add_modify (&init, tmp, fold_convert (TREE_TYPE (tmp),
5276 null_pointer_node));
5278 else if (sym->ts.type == BT_DERIVED
5279 && sym->ts.u.derived->attr.alloc_comp
5280 && !sym->attr.allocatable)
5282 rank = sym->as ? sym->as->rank : 0;
5283 tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, result, rank);
5284 gfc_add_expr_to_block (&init, tmp);
5288 if (result == NULL_TREE)
5290 /* TODO: move to the appropriate place in resolve.c. */
5291 if (warn_return_type && !sym->attr.referenced && sym == sym->result)
5292 gfc_warning ("Return value of function '%s' at %L not set",
5293 sym->name, &sym->declared_at);
5295 TREE_NO_WARNING(sym->backend_decl) = 1;
5298 gfc_add_expr_to_block (&body, gfc_generate_return ());
5301 gfc_init_block (&cleanup);
5303 /* Reset recursion-check variable. */
5304 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
5306 && !gfc_option.gfc_flag_openmp
5307 && recurcheckvar != NULL_TREE)
5309 gfc_add_modify (&cleanup, recurcheckvar, boolean_false_node);
5310 recurcheckvar = NULL;
5313 /* Finish the function body and add init and cleanup code. */
5314 tmp = gfc_finish_block (&body);
5315 gfc_start_wrapped_block (&try_block, tmp);
5316 /* Add code to create and cleanup arrays. */
5317 gfc_trans_deferred_vars (sym, &try_block);
5318 gfc_add_init_cleanup (&try_block, gfc_finish_block (&init),
5319 gfc_finish_block (&cleanup));
5321 /* Add all the decls we created during processing. */
5322 decl = saved_function_decls;
5327 next = DECL_CHAIN (decl);
5328 DECL_CHAIN (decl) = NULL_TREE;
5329 if (GFC_DECL_PUSH_TOPLEVEL (decl))
5330 pushdecl_top_level (decl);
5335 saved_function_decls = NULL_TREE;
5337 DECL_SAVED_TREE (fndecl) = gfc_finish_wrapped_block (&try_block);
5340 /* Finish off this function and send it for code generation. */
5342 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5344 DECL_SAVED_TREE (fndecl)
5345 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5346 DECL_INITIAL (fndecl));
5348 if (nonlocal_dummy_decls)
5350 BLOCK_VARS (DECL_INITIAL (fndecl))
5351 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl)), nonlocal_dummy_decls);
5352 pointer_set_destroy (nonlocal_dummy_decl_pset);
5353 nonlocal_dummy_decls = NULL;
5354 nonlocal_dummy_decl_pset = NULL;
5357 /* Output the GENERIC tree. */
5358 dump_function (TDI_original, fndecl);
5360 /* Store the end of the function, so that we get good line number
5361 info for the epilogue. */
5362 cfun->function_end_locus = input_location;
5364 /* We're leaving the context of this function, so zap cfun.
5365 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5366 tree_rest_of_compilation. */
5371 pop_function_context ();
5372 saved_function_decls = saved_parent_function_decls;
5374 current_function_decl = old_context;
5376 if (decl_function_context (fndecl) && !gfc_option.coarray == GFC_FCOARRAY_LIB
5377 && has_coarray_vars)
5378 /* Register this function with cgraph just far enough to get it
5379 added to our parent's nested function list.
5380 If there are static coarrays in this function, the nested _caf_init
5381 function has already called cgraph_create_node, which also created
5382 the cgraph node for this function. */
5383 (void) cgraph_create_node (fndecl);
5385 cgraph_finalize_function (fndecl, true);
5387 gfc_trans_use_stmts (ns);
5388 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
5390 if (sym->attr.is_main_program)
5391 create_main_function (fndecl);
5393 current_procedure_symbol = previous_procedure_symbol;
5398 gfc_generate_constructors (void)
5400 gcc_assert (gfc_static_ctors == NULL_TREE);
5408 if (gfc_static_ctors == NULL_TREE)
5411 fnname = get_file_function_name ("I");
5412 type = build_function_type_list (void_type_node, NULL_TREE);
5414 fndecl = build_decl (input_location,
5415 FUNCTION_DECL, fnname, type);
5416 TREE_PUBLIC (fndecl) = 1;
5418 decl = build_decl (input_location,
5419 RESULT_DECL, NULL_TREE, void_type_node);
5420 DECL_ARTIFICIAL (decl) = 1;
5421 DECL_IGNORED_P (decl) = 1;
5422 DECL_CONTEXT (decl) = fndecl;
5423 DECL_RESULT (fndecl) = decl;
5427 current_function_decl = fndecl;
5429 rest_of_decl_compilation (fndecl, 1, 0);
5431 make_decl_rtl (fndecl);
5433 init_function_start (fndecl);
5437 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
5439 tmp = build_call_expr_loc (input_location,
5440 TREE_VALUE (gfc_static_ctors), 0);
5441 DECL_SAVED_TREE (fndecl) = build_stmt (input_location, EXPR_STMT, tmp);
5447 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5448 DECL_SAVED_TREE (fndecl)
5449 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5450 DECL_INITIAL (fndecl));
5452 free_after_parsing (cfun);
5453 free_after_compilation (cfun);
5455 tree_rest_of_compilation (fndecl);
5457 current_function_decl = NULL_TREE;
5461 /* Translates a BLOCK DATA program unit. This means emitting the
5462 commons contained therein plus their initializations. We also emit
5463 a globally visible symbol to make sure that each BLOCK DATA program
5464 unit remains unique. */
5467 gfc_generate_block_data (gfc_namespace * ns)
5472 /* Tell the backend the source location of the block data. */
5474 gfc_set_backend_locus (&ns->proc_name->declared_at);
5476 gfc_set_backend_locus (&gfc_current_locus);
5478 /* Process the DATA statements. */
5479 gfc_trans_common (ns);
5481 /* Create a global symbol with the mane of the block data. This is to
5482 generate linker errors if the same name is used twice. It is never
5485 id = gfc_sym_mangled_function_id (ns->proc_name);
5487 id = get_identifier ("__BLOCK_DATA__");
5489 decl = build_decl (input_location,
5490 VAR_DECL, id, gfc_array_index_type);
5491 TREE_PUBLIC (decl) = 1;
5492 TREE_STATIC (decl) = 1;
5493 DECL_IGNORED_P (decl) = 1;
5496 rest_of_decl_compilation (decl, 1, 0);
5500 /* Process the local variables of a BLOCK construct. */
5503 gfc_process_block_locals (gfc_namespace* ns)
5507 gcc_assert (saved_local_decls == NULL_TREE);
5508 has_coarray_vars = false;
5510 generate_local_vars (ns);
5512 if (gfc_option.coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
5513 generate_coarray_init (ns);
5515 decl = saved_local_decls;
5520 next = DECL_CHAIN (decl);
5521 DECL_CHAIN (decl) = NULL_TREE;
5525 saved_local_decls = NULL_TREE;
5529 #include "gt-fortran-trans-decl.h"