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 /* List of static constructor functions. */
83 tree gfc_static_ctors;
86 /* Function declarations for builtin library functions. */
88 tree gfor_fndecl_pause_numeric;
89 tree gfor_fndecl_pause_string;
90 tree gfor_fndecl_stop_numeric;
91 tree gfor_fndecl_stop_numeric_f08;
92 tree gfor_fndecl_stop_string;
93 tree gfor_fndecl_error_stop_numeric;
94 tree gfor_fndecl_error_stop_string;
95 tree gfor_fndecl_runtime_error;
96 tree gfor_fndecl_runtime_error_at;
97 tree gfor_fndecl_runtime_warning_at;
98 tree gfor_fndecl_os_error;
99 tree gfor_fndecl_generate_error;
100 tree gfor_fndecl_set_args;
101 tree gfor_fndecl_set_fpe;
102 tree gfor_fndecl_set_options;
103 tree gfor_fndecl_set_convert;
104 tree gfor_fndecl_set_record_marker;
105 tree gfor_fndecl_set_max_subrecord_length;
106 tree gfor_fndecl_ctime;
107 tree gfor_fndecl_fdate;
108 tree gfor_fndecl_ttynam;
109 tree gfor_fndecl_in_pack;
110 tree gfor_fndecl_in_unpack;
111 tree gfor_fndecl_associated;
114 /* Coarray run-time library function decls. */
115 tree gfor_fndecl_caf_init;
116 tree gfor_fndecl_caf_finalize;
117 tree gfor_fndecl_caf_critical;
118 tree gfor_fndecl_caf_end_critical;
119 tree gfor_fndecl_caf_sync_all;
120 tree gfor_fndecl_caf_sync_images;
121 tree gfor_fndecl_caf_error_stop;
122 tree gfor_fndecl_caf_error_stop_str;
124 /* Coarray global variables for num_images/this_image. */
126 tree gfort_gvar_caf_num_images;
127 tree gfort_gvar_caf_this_image;
130 /* Math functions. Many other math functions are handled in
131 trans-intrinsic.c. */
133 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
134 tree gfor_fndecl_math_ishftc4;
135 tree gfor_fndecl_math_ishftc8;
136 tree gfor_fndecl_math_ishftc16;
139 /* String functions. */
141 tree gfor_fndecl_compare_string;
142 tree gfor_fndecl_concat_string;
143 tree gfor_fndecl_string_len_trim;
144 tree gfor_fndecl_string_index;
145 tree gfor_fndecl_string_scan;
146 tree gfor_fndecl_string_verify;
147 tree gfor_fndecl_string_trim;
148 tree gfor_fndecl_string_minmax;
149 tree gfor_fndecl_adjustl;
150 tree gfor_fndecl_adjustr;
151 tree gfor_fndecl_select_string;
152 tree gfor_fndecl_compare_string_char4;
153 tree gfor_fndecl_concat_string_char4;
154 tree gfor_fndecl_string_len_trim_char4;
155 tree gfor_fndecl_string_index_char4;
156 tree gfor_fndecl_string_scan_char4;
157 tree gfor_fndecl_string_verify_char4;
158 tree gfor_fndecl_string_trim_char4;
159 tree gfor_fndecl_string_minmax_char4;
160 tree gfor_fndecl_adjustl_char4;
161 tree gfor_fndecl_adjustr_char4;
162 tree gfor_fndecl_select_string_char4;
165 /* Conversion between character kinds. */
166 tree gfor_fndecl_convert_char1_to_char4;
167 tree gfor_fndecl_convert_char4_to_char1;
170 /* Other misc. runtime library functions. */
171 tree gfor_fndecl_size0;
172 tree gfor_fndecl_size1;
173 tree gfor_fndecl_iargc;
175 /* Intrinsic functions implemented in Fortran. */
176 tree gfor_fndecl_sc_kind;
177 tree gfor_fndecl_si_kind;
178 tree gfor_fndecl_sr_kind;
180 /* BLAS gemm functions. */
181 tree gfor_fndecl_sgemm;
182 tree gfor_fndecl_dgemm;
183 tree gfor_fndecl_cgemm;
184 tree gfor_fndecl_zgemm;
188 gfc_add_decl_to_parent_function (tree decl)
191 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
192 DECL_NONLOCAL (decl) = 1;
193 DECL_CHAIN (decl) = saved_parent_function_decls;
194 saved_parent_function_decls = decl;
198 gfc_add_decl_to_function (tree decl)
201 TREE_USED (decl) = 1;
202 DECL_CONTEXT (decl) = current_function_decl;
203 DECL_CHAIN (decl) = saved_function_decls;
204 saved_function_decls = decl;
208 add_decl_as_local (tree decl)
211 TREE_USED (decl) = 1;
212 DECL_CONTEXT (decl) = current_function_decl;
213 DECL_CHAIN (decl) = saved_local_decls;
214 saved_local_decls = decl;
218 /* Build a backend label declaration. Set TREE_USED for named labels.
219 The context of the label is always the current_function_decl. All
220 labels are marked artificial. */
223 gfc_build_label_decl (tree label_id)
225 /* 2^32 temporaries should be enough. */
226 static unsigned int tmp_num = 1;
230 if (label_id == NULL_TREE)
232 /* Build an internal label name. */
233 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
234 label_id = get_identifier (label_name);
239 /* Build the LABEL_DECL node. Labels have no type. */
240 label_decl = build_decl (input_location,
241 LABEL_DECL, label_id, void_type_node);
242 DECL_CONTEXT (label_decl) = current_function_decl;
243 DECL_MODE (label_decl) = VOIDmode;
245 /* We always define the label as used, even if the original source
246 file never references the label. We don't want all kinds of
247 spurious warnings for old-style Fortran code with too many
249 TREE_USED (label_decl) = 1;
251 DECL_ARTIFICIAL (label_decl) = 1;
256 /* Set the backend source location of a decl. */
259 gfc_set_decl_location (tree decl, locus * loc)
261 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
265 /* Return the backend label declaration for a given label structure,
266 or create it if it doesn't exist yet. */
269 gfc_get_label_decl (gfc_st_label * lp)
271 if (lp->backend_decl)
272 return lp->backend_decl;
275 char label_name[GFC_MAX_SYMBOL_LEN + 1];
278 /* Validate the label declaration from the front end. */
279 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
281 /* Build a mangled name for the label. */
282 sprintf (label_name, "__label_%.6d", lp->value);
284 /* Build the LABEL_DECL node. */
285 label_decl = gfc_build_label_decl (get_identifier (label_name));
287 /* Tell the debugger where the label came from. */
288 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
289 gfc_set_decl_location (label_decl, &lp->where);
291 DECL_ARTIFICIAL (label_decl) = 1;
293 /* Store the label in the label list and return the LABEL_DECL. */
294 lp->backend_decl = label_decl;
300 /* Convert a gfc_symbol to an identifier of the same name. */
303 gfc_sym_identifier (gfc_symbol * sym)
305 if (sym->attr.is_main_program && strcmp (sym->name, "main") == 0)
306 return (get_identifier ("MAIN__"));
308 return (get_identifier (sym->name));
312 /* Construct mangled name from symbol name. */
315 gfc_sym_mangled_identifier (gfc_symbol * sym)
317 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
319 /* Prevent the mangling of identifiers that have an assigned
320 binding label (mainly those that are bind(c)). */
321 if (sym->attr.is_bind_c == 1
322 && sym->binding_label[0] != '\0')
323 return get_identifier(sym->binding_label);
325 if (sym->module == NULL)
326 return gfc_sym_identifier (sym);
329 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
330 return get_identifier (name);
335 /* Construct mangled function name from symbol name. */
338 gfc_sym_mangled_function_id (gfc_symbol * sym)
341 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
343 /* It may be possible to simply use the binding label if it's
344 provided, and remove the other checks. Then we could use it
345 for other things if we wished. */
346 if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
347 sym->binding_label[0] != '\0')
348 /* use the binding label rather than the mangled name */
349 return get_identifier (sym->binding_label);
351 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
352 || (sym->module != NULL && (sym->attr.external
353 || sym->attr.if_source == IFSRC_IFBODY)))
355 /* Main program is mangled into MAIN__. */
356 if (sym->attr.is_main_program)
357 return get_identifier ("MAIN__");
359 /* Intrinsic procedures are never mangled. */
360 if (sym->attr.proc == PROC_INTRINSIC)
361 return get_identifier (sym->name);
363 if (gfc_option.flag_underscoring)
365 has_underscore = strchr (sym->name, '_') != 0;
366 if (gfc_option.flag_second_underscore && has_underscore)
367 snprintf (name, sizeof name, "%s__", sym->name);
369 snprintf (name, sizeof name, "%s_", sym->name);
370 return get_identifier (name);
373 return get_identifier (sym->name);
377 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
378 return get_identifier (name);
384 gfc_set_decl_assembler_name (tree decl, tree name)
386 tree target_mangled = targetm.mangle_decl_assembler_name (decl, name);
387 SET_DECL_ASSEMBLER_NAME (decl, target_mangled);
391 /* Returns true if a variable of specified size should go on the stack. */
394 gfc_can_put_var_on_stack (tree size)
396 unsigned HOST_WIDE_INT low;
398 if (!INTEGER_CST_P (size))
401 if (gfc_option.flag_max_stack_var_size < 0)
404 if (TREE_INT_CST_HIGH (size) != 0)
407 low = TREE_INT_CST_LOW (size);
408 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
411 /* TODO: Set a per-function stack size limit. */
417 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
418 an expression involving its corresponding pointer. There are
419 2 cases; one for variable size arrays, and one for everything else,
420 because variable-sized arrays require one fewer level of
424 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
426 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
429 /* Parameters need to be dereferenced. */
430 if (sym->cp_pointer->attr.dummy)
431 ptr_decl = build_fold_indirect_ref_loc (input_location,
434 /* Check to see if we're dealing with a variable-sized array. */
435 if (sym->attr.dimension
436 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
438 /* These decls will be dereferenced later, so we don't dereference
440 value = convert (TREE_TYPE (decl), ptr_decl);
444 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
446 value = build_fold_indirect_ref_loc (input_location,
450 SET_DECL_VALUE_EXPR (decl, value);
451 DECL_HAS_VALUE_EXPR_P (decl) = 1;
452 GFC_DECL_CRAY_POINTEE (decl) = 1;
453 /* This is a fake variable just for debugging purposes. */
454 TREE_ASM_WRITTEN (decl) = 1;
458 /* Finish processing of a declaration without an initial value. */
461 gfc_finish_decl (tree decl)
463 gcc_assert (TREE_CODE (decl) == PARM_DECL
464 || DECL_INITIAL (decl) == NULL_TREE);
466 if (TREE_CODE (decl) != VAR_DECL)
469 if (DECL_SIZE (decl) == NULL_TREE
470 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
471 layout_decl (decl, 0);
473 /* A few consistency checks. */
474 /* A static variable with an incomplete type is an error if it is
475 initialized. Also if it is not file scope. Otherwise, let it
476 through, but if it is not `extern' then it may cause an error
478 /* An automatic variable with an incomplete type is an error. */
480 /* We should know the storage size. */
481 gcc_assert (DECL_SIZE (decl) != NULL_TREE
482 || (TREE_STATIC (decl)
483 ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
484 : DECL_EXTERNAL (decl)));
486 /* The storage size should be constant. */
487 gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
489 || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
493 /* Apply symbol attributes to a variable, and add it to the function scope. */
496 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
499 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
500 This is the equivalent of the TARGET variables.
501 We also need to set this if the variable is passed by reference in a
504 /* Set DECL_VALUE_EXPR for Cray Pointees. */
505 if (sym->attr.cray_pointee)
506 gfc_finish_cray_pointee (decl, sym);
508 if (sym->attr.target)
509 TREE_ADDRESSABLE (decl) = 1;
510 /* If it wasn't used we wouldn't be getting it. */
511 TREE_USED (decl) = 1;
513 /* Chain this decl to the pending declarations. Don't do pushdecl()
514 because this would add them to the current scope rather than the
516 if (current_function_decl != NULL_TREE)
518 if (sym->ns->proc_name->backend_decl == current_function_decl
519 || sym->result == sym)
520 gfc_add_decl_to_function (decl);
521 else if (sym->ns->proc_name->attr.flavor == FL_LABEL)
522 /* This is a BLOCK construct. */
523 add_decl_as_local (decl);
525 gfc_add_decl_to_parent_function (decl);
528 if (sym->attr.cray_pointee)
531 if(sym->attr.is_bind_c == 1)
533 /* We need to put variables that are bind(c) into the common
534 segment of the object file, because this is what C would do.
535 gfortran would typically put them in either the BSS or
536 initialized data segments, and only mark them as common if
537 they were part of common blocks. However, if they are not put
538 into common space, then C cannot initialize global Fortran
539 variables that it interoperates with and the draft says that
540 either Fortran or C should be able to initialize it (but not
541 both, of course.) (J3/04-007, section 15.3). */
542 TREE_PUBLIC(decl) = 1;
543 DECL_COMMON(decl) = 1;
546 /* If a variable is USE associated, it's always external. */
547 if (sym->attr.use_assoc)
549 DECL_EXTERNAL (decl) = 1;
550 TREE_PUBLIC (decl) = 1;
552 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
554 /* TODO: Don't set sym->module for result or dummy variables. */
555 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
556 /* This is the declaration of a module variable. */
557 TREE_PUBLIC (decl) = 1;
558 TREE_STATIC (decl) = 1;
561 /* Derived types are a bit peculiar because of the possibility of
562 a default initializer; this must be applied each time the variable
563 comes into scope it therefore need not be static. These variables
564 are SAVE_NONE but have an initializer. Otherwise explicitly
565 initialized variables are SAVE_IMPLICIT and explicitly saved are
567 if (!sym->attr.use_assoc
568 && (sym->attr.save != SAVE_NONE || sym->attr.data
569 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
570 TREE_STATIC (decl) = 1;
572 if (sym->attr.volatile_)
574 TREE_THIS_VOLATILE (decl) = 1;
575 TREE_SIDE_EFFECTS (decl) = 1;
576 new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
577 TREE_TYPE (decl) = new_type;
580 /* Keep variables larger than max-stack-var-size off stack. */
581 if (!sym->ns->proc_name->attr.recursive
582 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
583 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
584 /* Put variable length auto array pointers always into stack. */
585 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
586 || sym->attr.dimension == 0
587 || sym->as->type != AS_EXPLICIT
589 || sym->attr.allocatable)
590 && !DECL_ARTIFICIAL (decl))
591 TREE_STATIC (decl) = 1;
593 /* Handle threadprivate variables. */
594 if (sym->attr.threadprivate
595 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
596 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
598 if (!sym->attr.target
599 && !sym->attr.pointer
600 && !sym->attr.cray_pointee
601 && !sym->attr.proc_pointer)
602 DECL_RESTRICTED_P (decl) = 1;
606 /* Allocate the lang-specific part of a decl. */
609 gfc_allocate_lang_decl (tree decl)
611 DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof
615 /* Remember a symbol to generate initialization/cleanup code at function
619 gfc_defer_symbol_init (gfc_symbol * sym)
625 /* Don't add a symbol twice. */
629 last = head = sym->ns->proc_name;
632 /* Make sure that setup code for dummy variables which are used in the
633 setup of other variables is generated first. */
636 /* Find the first dummy arg seen after us, or the first non-dummy arg.
637 This is a circular list, so don't go past the head. */
639 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
645 /* Insert in between last and p. */
651 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
652 backend_decl for a module symbol, if it all ready exists. If the
653 module gsymbol does not exist, it is created. If the symbol does
654 not exist, it is added to the gsymbol namespace. Returns true if
655 an existing backend_decl is found. */
658 gfc_get_module_backend_decl (gfc_symbol *sym)
664 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
666 if (!gsym || (gsym->ns && gsym->type == GSYM_MODULE))
672 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
678 gsym = gfc_get_gsymbol (sym->module);
679 gsym->type = GSYM_MODULE;
680 gsym->ns = gfc_get_namespace (NULL, 0);
683 st = gfc_new_symtree (&gsym->ns->sym_root, sym->name);
687 else if (sym->attr.flavor == FL_DERIVED)
689 if (!s->backend_decl)
690 s->backend_decl = gfc_get_derived_type (s);
691 gfc_copy_dt_decls_ifequal (s, sym, true);
694 else if (s->backend_decl)
696 if (sym->ts.type == BT_DERIVED)
697 gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
699 else if (sym->ts.type == BT_CHARACTER)
700 sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
701 sym->backend_decl = s->backend_decl;
709 /* Create an array index type variable with function scope. */
712 create_index_var (const char * pfx, int nest)
716 decl = gfc_create_var_np (gfc_array_index_type, pfx);
718 gfc_add_decl_to_parent_function (decl);
720 gfc_add_decl_to_function (decl);
725 /* Create variables to hold all the non-constant bits of info for a
726 descriptorless array. Remember these in the lang-specific part of the
730 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
735 gfc_namespace* procns;
737 type = TREE_TYPE (decl);
739 /* We just use the descriptor, if there is one. */
740 if (GFC_DESCRIPTOR_TYPE_P (type))
743 gcc_assert (GFC_ARRAY_TYPE_P (type));
744 procns = gfc_find_proc_namespace (sym->ns);
745 nest = (procns->proc_name->backend_decl != current_function_decl)
746 && !sym->attr.contained;
748 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
750 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
752 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
753 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
755 /* Don't try to use the unknown bound for assumed shape arrays. */
756 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
757 && (sym->as->type != AS_ASSUMED_SIZE
758 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
760 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
761 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
764 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
766 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
767 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
770 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
772 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
774 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
777 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
779 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
782 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
783 && sym->as->type != AS_ASSUMED_SIZE)
785 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
786 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
789 if (POINTER_TYPE_P (type))
791 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
792 gcc_assert (TYPE_LANG_SPECIFIC (type)
793 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
794 type = TREE_TYPE (type);
797 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
801 size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
802 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
803 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
805 TYPE_DOMAIN (type) = range;
809 if (TYPE_NAME (type) != NULL_TREE
810 && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE
811 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL)
813 tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
815 for (dim = 0; dim < sym->as->rank - 1; dim++)
817 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
818 gtype = TREE_TYPE (gtype);
820 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
821 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL)
822 TYPE_NAME (type) = NULL_TREE;
825 if (TYPE_NAME (type) == NULL_TREE)
827 tree gtype = TREE_TYPE (type), rtype, type_decl;
829 for (dim = sym->as->rank - 1; dim >= 0; dim--)
832 lbound = GFC_TYPE_ARRAY_LBOUND (type, dim);
833 ubound = GFC_TYPE_ARRAY_UBOUND (type, dim);
834 rtype = build_range_type (gfc_array_index_type, lbound, ubound);
835 gtype = build_array_type (gtype, rtype);
836 /* Ensure the bound variables aren't optimized out at -O0.
837 For -O1 and above they often will be optimized out, but
838 can be tracked by VTA. Also set DECL_NAMELESS, so that
839 the artificial lbound.N or ubound.N DECL_NAME doesn't
840 end up in debug info. */
841 if (lbound && TREE_CODE (lbound) == VAR_DECL
842 && DECL_ARTIFICIAL (lbound) && DECL_IGNORED_P (lbound))
844 if (DECL_NAME (lbound)
845 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound)),
847 DECL_NAMELESS (lbound) = 1;
848 DECL_IGNORED_P (lbound) = 0;
850 if (ubound && TREE_CODE (ubound) == VAR_DECL
851 && DECL_ARTIFICIAL (ubound) && DECL_IGNORED_P (ubound))
853 if (DECL_NAME (ubound)
854 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound)),
856 DECL_NAMELESS (ubound) = 1;
857 DECL_IGNORED_P (ubound) = 0;
860 TYPE_NAME (type) = type_decl = build_decl (input_location,
861 TYPE_DECL, NULL, gtype);
862 DECL_ORIGINAL_TYPE (type_decl) = gtype;
867 /* For some dummy arguments we don't use the actual argument directly.
868 Instead we create a local decl and use that. This allows us to perform
869 initialization, and construct full type information. */
872 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
882 if (sym->attr.pointer || sym->attr.allocatable)
885 /* Add to list of variables if not a fake result variable. */
886 if (sym->attr.result || sym->attr.dummy)
887 gfc_defer_symbol_init (sym);
889 type = TREE_TYPE (dummy);
890 gcc_assert (TREE_CODE (dummy) == PARM_DECL
891 && POINTER_TYPE_P (type));
893 /* Do we know the element size? */
894 known_size = sym->ts.type != BT_CHARACTER
895 || INTEGER_CST_P (sym->ts.u.cl->backend_decl);
897 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
899 /* For descriptorless arrays with known element size the actual
900 argument is sufficient. */
901 gcc_assert (GFC_ARRAY_TYPE_P (type));
902 gfc_build_qualified_array (dummy, sym);
906 type = TREE_TYPE (type);
907 if (GFC_DESCRIPTOR_TYPE_P (type))
909 /* Create a descriptorless array pointer. */
913 /* Even when -frepack-arrays is used, symbols with TARGET attribute
915 if (!gfc_option.flag_repack_arrays || sym->attr.target)
917 if (as->type == AS_ASSUMED_SIZE)
918 packed = PACKED_FULL;
922 if (as->type == AS_EXPLICIT)
924 packed = PACKED_FULL;
925 for (n = 0; n < as->rank; n++)
929 && as->upper[n]->expr_type == EXPR_CONSTANT
930 && as->lower[n]->expr_type == EXPR_CONSTANT))
931 packed = PACKED_PARTIAL;
935 packed = PACKED_PARTIAL;
938 type = gfc_typenode_for_spec (&sym->ts);
939 type = gfc_get_nodesc_array_type (type, sym->as, packed,
944 /* We now have an expression for the element size, so create a fully
945 qualified type. Reset sym->backend decl or this will just return the
947 DECL_ARTIFICIAL (sym->backend_decl) = 1;
948 sym->backend_decl = NULL_TREE;
949 type = gfc_sym_type (sym);
950 packed = PACKED_FULL;
953 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
954 decl = build_decl (input_location,
955 VAR_DECL, get_identifier (name), type);
957 DECL_ARTIFICIAL (decl) = 1;
958 DECL_NAMELESS (decl) = 1;
959 TREE_PUBLIC (decl) = 0;
960 TREE_STATIC (decl) = 0;
961 DECL_EXTERNAL (decl) = 0;
963 /* We should never get deferred shape arrays here. We used to because of
965 gcc_assert (sym->as->type != AS_DEFERRED);
967 if (packed == PACKED_PARTIAL)
968 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
969 else if (packed == PACKED_FULL)
970 GFC_DECL_PACKED_ARRAY (decl) = 1;
972 gfc_build_qualified_array (decl, sym);
974 if (DECL_LANG_SPECIFIC (dummy))
975 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
977 gfc_allocate_lang_decl (decl);
979 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
981 if (sym->ns->proc_name->backend_decl == current_function_decl
982 || sym->attr.contained)
983 gfc_add_decl_to_function (decl);
985 gfc_add_decl_to_parent_function (decl);
990 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
991 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
992 pointing to the artificial variable for debug info purposes. */
995 gfc_nonlocal_dummy_array_decl (gfc_symbol *sym)
999 if (! nonlocal_dummy_decl_pset)
1000 nonlocal_dummy_decl_pset = pointer_set_create ();
1002 if (pointer_set_insert (nonlocal_dummy_decl_pset, sym->backend_decl))
1005 dummy = GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl);
1006 decl = build_decl (input_location, VAR_DECL, DECL_NAME (dummy),
1007 TREE_TYPE (sym->backend_decl));
1008 DECL_ARTIFICIAL (decl) = 0;
1009 TREE_USED (decl) = 1;
1010 TREE_PUBLIC (decl) = 0;
1011 TREE_STATIC (decl) = 0;
1012 DECL_EXTERNAL (decl) = 0;
1013 if (DECL_BY_REFERENCE (dummy))
1014 DECL_BY_REFERENCE (decl) = 1;
1015 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (sym->backend_decl);
1016 SET_DECL_VALUE_EXPR (decl, sym->backend_decl);
1017 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1018 DECL_CONTEXT (decl) = DECL_CONTEXT (sym->backend_decl);
1019 DECL_CHAIN (decl) = nonlocal_dummy_decls;
1020 nonlocal_dummy_decls = decl;
1023 /* Return a constant or a variable to use as a string length. Does not
1024 add the decl to the current scope. */
1027 gfc_create_string_length (gfc_symbol * sym)
1029 gcc_assert (sym->ts.u.cl);
1030 gfc_conv_const_charlen (sym->ts.u.cl);
1032 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1035 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1037 /* Also prefix the mangled name. */
1038 strcpy (&name[1], sym->name);
1040 length = build_decl (input_location,
1041 VAR_DECL, get_identifier (name),
1042 gfc_charlen_type_node);
1043 DECL_ARTIFICIAL (length) = 1;
1044 TREE_USED (length) = 1;
1045 if (sym->ns->proc_name->tlink != NULL)
1046 gfc_defer_symbol_init (sym);
1048 sym->ts.u.cl->backend_decl = length;
1051 gcc_assert (sym->ts.u.cl->backend_decl != NULL_TREE);
1052 return sym->ts.u.cl->backend_decl;
1055 /* If a variable is assigned a label, we add another two auxiliary
1059 gfc_add_assign_aux_vars (gfc_symbol * sym)
1065 gcc_assert (sym->backend_decl);
1067 decl = sym->backend_decl;
1068 gfc_allocate_lang_decl (decl);
1069 GFC_DECL_ASSIGN (decl) = 1;
1070 length = build_decl (input_location,
1071 VAR_DECL, create_tmp_var_name (sym->name),
1072 gfc_charlen_type_node);
1073 addr = build_decl (input_location,
1074 VAR_DECL, create_tmp_var_name (sym->name),
1076 gfc_finish_var_decl (length, sym);
1077 gfc_finish_var_decl (addr, sym);
1078 /* STRING_LENGTH is also used as flag. Less than -1 means that
1079 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1080 target label's address. Otherwise, value is the length of a format string
1081 and ASSIGN_ADDR is its address. */
1082 if (TREE_STATIC (length))
1083 DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
1085 gfc_defer_symbol_init (sym);
1087 GFC_DECL_STRING_LEN (decl) = length;
1088 GFC_DECL_ASSIGN_ADDR (decl) = addr;
1093 add_attributes_to_decl (symbol_attribute sym_attr, tree list)
1098 for (id = 0; id < EXT_ATTR_NUM; id++)
1099 if (sym_attr.ext_attr & (1 << id))
1101 attr = build_tree_list (
1102 get_identifier (ext_attr_list[id].middle_end_name),
1104 list = chainon (list, attr);
1111 static void build_function_decl (gfc_symbol * sym, bool global);
1114 /* Return the decl for a gfc_symbol, create it if it doesn't already
1118 gfc_get_symbol_decl (gfc_symbol * sym)
1121 tree length = NULL_TREE;
1124 bool intrinsic_array_parameter = false;
1126 gcc_assert (sym->attr.referenced
1127 || sym->attr.use_assoc
1128 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY
1129 || (sym->module && sym->attr.if_source != IFSRC_DECL
1130 && sym->backend_decl));
1132 if (sym->ns && sym->ns->proc_name && sym->ns->proc_name->attr.function)
1133 byref = gfc_return_by_reference (sym->ns->proc_name);
1137 /* Make sure that the vtab for the declared type is completed. */
1138 if (sym->ts.type == BT_CLASS)
1140 gfc_component *c = CLASS_DATA (sym);
1141 if (!c->ts.u.derived->backend_decl)
1142 gfc_find_derived_vtab (c->ts.u.derived);
1145 /* All deferred character length procedures need to retain the backend
1146 decl, which is a pointer to the character length in the caller's
1147 namespace and to declare a local character length. */
1148 if (!byref && sym->attr.function
1149 && sym->ts.type == BT_CHARACTER
1151 && sym->ts.u.cl->passed_length == NULL
1152 && sym->ts.u.cl->backend_decl
1153 && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL)
1155 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1156 sym->ts.u.cl->backend_decl = NULL_TREE;
1157 length = gfc_create_string_length (sym);
1160 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
1162 /* Return via extra parameter. */
1163 if (sym->attr.result && byref
1164 && !sym->backend_decl)
1167 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
1168 /* For entry master function skip over the __entry
1170 if (sym->ns->proc_name->attr.entry_master)
1171 sym->backend_decl = DECL_CHAIN (sym->backend_decl);
1174 /* Dummy variables should already have been created. */
1175 gcc_assert (sym->backend_decl);
1177 /* Create a character length variable. */
1178 if (sym->ts.type == BT_CHARACTER)
1180 /* For a deferred dummy, make a new string length variable. */
1181 if (sym->ts.deferred
1183 (sym->ts.u.cl->passed_length == sym->ts.u.cl->backend_decl))
1184 sym->ts.u.cl->backend_decl = NULL_TREE;
1186 if (sym->ts.deferred && sym->attr.result
1187 && sym->ts.u.cl->passed_length == NULL
1188 && sym->ts.u.cl->backend_decl)
1190 sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
1191 sym->ts.u.cl->backend_decl = NULL_TREE;
1194 if (sym->ts.u.cl->backend_decl == NULL_TREE)
1195 length = gfc_create_string_length (sym);
1197 length = sym->ts.u.cl->backend_decl;
1198 if (TREE_CODE (length) == VAR_DECL
1199 && DECL_FILE_SCOPE_P (length))
1201 /* Add the string length to the same context as the symbol. */
1202 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
1203 gfc_add_decl_to_function (length);
1205 gfc_add_decl_to_parent_function (length);
1207 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
1208 DECL_CONTEXT (length));
1210 gfc_defer_symbol_init (sym);
1214 /* Use a copy of the descriptor for dummy arrays. */
1215 if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
1217 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
1218 /* Prevent the dummy from being detected as unused if it is copied. */
1219 if (sym->backend_decl != NULL && decl != sym->backend_decl)
1220 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1221 sym->backend_decl = decl;
1224 TREE_USED (sym->backend_decl) = 1;
1225 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
1227 gfc_add_assign_aux_vars (sym);
1230 if (sym->attr.dimension
1231 && DECL_LANG_SPECIFIC (sym->backend_decl)
1232 && GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl)
1233 && DECL_CONTEXT (sym->backend_decl) != current_function_decl)
1234 gfc_nonlocal_dummy_array_decl (sym);
1236 return sym->backend_decl;
1239 if (sym->backend_decl)
1240 return sym->backend_decl;
1242 /* Special case for array-valued named constants from intrinsic
1243 procedures; those are inlined. */
1244 if (sym->attr.use_assoc && sym->from_intmod
1245 && sym->attr.flavor == FL_PARAMETER)
1246 intrinsic_array_parameter = true;
1248 /* If use associated and whole file compilation, use the module
1250 if (gfc_option.flag_whole_file
1251 && (sym->attr.flavor == FL_VARIABLE
1252 || sym->attr.flavor == FL_PARAMETER)
1253 && sym->attr.use_assoc
1254 && !intrinsic_array_parameter
1256 && gfc_get_module_backend_decl (sym))
1257 return sym->backend_decl;
1259 if (sym->attr.flavor == FL_PROCEDURE)
1261 /* Catch function declarations. Only used for actual parameters,
1262 procedure pointers and procptr initialization targets. */
1263 if (sym->attr.external || sym->attr.use_assoc || sym->attr.intrinsic)
1265 decl = gfc_get_extern_function_decl (sym);
1266 gfc_set_decl_location (decl, &sym->declared_at);
1270 if (!sym->backend_decl)
1271 build_function_decl (sym, false);
1272 decl = sym->backend_decl;
1277 if (sym->attr.intrinsic)
1278 internal_error ("intrinsic variable which isn't a procedure");
1280 /* Create string length decl first so that they can be used in the
1281 type declaration. */
1282 if (sym->ts.type == BT_CHARACTER)
1283 length = gfc_create_string_length (sym);
1285 /* Create the decl for the variable. */
1286 decl = build_decl (sym->declared_at.lb->location,
1287 VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
1289 /* Add attributes to variables. Functions are handled elsewhere. */
1290 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1291 decl_attributes (&decl, attributes, 0);
1293 /* Symbols from modules should have their assembler names mangled.
1294 This is done here rather than in gfc_finish_var_decl because it
1295 is different for string length variables. */
1298 gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
1299 if (sym->attr.use_assoc && !intrinsic_array_parameter)
1300 DECL_IGNORED_P (decl) = 1;
1303 if (sym->attr.dimension)
1305 /* Create variables to hold the non-constant bits of array info. */
1306 gfc_build_qualified_array (decl, sym);
1308 if (sym->attr.contiguous
1309 || ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer))
1310 GFC_DECL_PACKED_ARRAY (decl) = 1;
1313 /* Remember this variable for allocation/cleanup. */
1314 if (sym->attr.dimension || sym->attr.allocatable
1315 || (sym->ts.type == BT_CLASS &&
1316 (CLASS_DATA (sym)->attr.dimension
1317 || CLASS_DATA (sym)->attr.allocatable))
1318 || (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
1319 /* This applies a derived type default initializer. */
1320 || (sym->ts.type == BT_DERIVED
1321 && sym->attr.save == SAVE_NONE
1323 && !sym->attr.allocatable
1324 && (sym->value && !sym->ns->proc_name->attr.is_main_program)
1325 && !(sym->attr.use_assoc && !intrinsic_array_parameter)))
1326 gfc_defer_symbol_init (sym);
1328 gfc_finish_var_decl (decl, sym);
1330 if (sym->ts.type == BT_CHARACTER)
1332 /* Character variables need special handling. */
1333 gfc_allocate_lang_decl (decl);
1335 if (TREE_CODE (length) != INTEGER_CST)
1337 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1341 /* Also prefix the mangled name for symbols from modules. */
1342 strcpy (&name[1], sym->name);
1345 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
1346 gfc_set_decl_assembler_name (decl, get_identifier (name));
1348 gfc_finish_var_decl (length, sym);
1349 gcc_assert (!sym->value);
1352 else if (sym->attr.subref_array_pointer)
1354 /* We need the span for these beasts. */
1355 gfc_allocate_lang_decl (decl);
1358 if (sym->attr.subref_array_pointer)
1361 GFC_DECL_SUBREF_ARRAY_P (decl) = 1;
1362 span = build_decl (input_location,
1363 VAR_DECL, create_tmp_var_name ("span"),
1364 gfc_array_index_type);
1365 gfc_finish_var_decl (span, sym);
1366 TREE_STATIC (span) = TREE_STATIC (decl);
1367 DECL_ARTIFICIAL (span) = 1;
1368 DECL_INITIAL (span) = build_int_cst (gfc_array_index_type, 0);
1370 GFC_DECL_SPAN (decl) = span;
1371 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span;
1374 sym->backend_decl = decl;
1376 if (sym->attr.assign)
1377 gfc_add_assign_aux_vars (sym);
1379 if (intrinsic_array_parameter)
1381 TREE_STATIC (decl) = 1;
1382 DECL_EXTERNAL (decl) = 0;
1385 if (TREE_STATIC (decl)
1386 && !(sym->attr.use_assoc && !intrinsic_array_parameter)
1387 && (sym->attr.save || sym->ns->proc_name->attr.is_main_program
1388 || gfc_option.flag_max_stack_var_size == 0
1389 || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE))
1391 /* Add static initializer. For procedures, it is only needed if
1392 SAVE is specified otherwise they need to be reinitialized
1393 every time the procedure is entered. The TREE_STATIC is
1394 in this case due to -fmax-stack-var-size=. */
1395 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1397 sym->attr.dimension,
1399 || sym->attr.allocatable,
1400 sym->attr.proc_pointer);
1403 if (!TREE_STATIC (decl)
1404 && POINTER_TYPE_P (TREE_TYPE (decl))
1405 && !sym->attr.pointer
1406 && !sym->attr.allocatable
1407 && !sym->attr.proc_pointer)
1408 DECL_BY_REFERENCE (decl) = 1;
1414 /* Substitute a temporary variable in place of the real one. */
1417 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1419 save->attr = sym->attr;
1420 save->decl = sym->backend_decl;
1422 gfc_clear_attr (&sym->attr);
1423 sym->attr.referenced = 1;
1424 sym->attr.flavor = FL_VARIABLE;
1426 sym->backend_decl = decl;
1430 /* Restore the original variable. */
1433 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1435 sym->attr = save->attr;
1436 sym->backend_decl = save->decl;
1440 /* Declare a procedure pointer. */
1443 get_proc_pointer_decl (gfc_symbol *sym)
1448 decl = sym->backend_decl;
1452 decl = build_decl (input_location,
1453 VAR_DECL, get_identifier (sym->name),
1454 build_pointer_type (gfc_get_function_type (sym)));
1456 if ((sym->ns->proc_name
1457 && sym->ns->proc_name->backend_decl == current_function_decl)
1458 || sym->attr.contained)
1459 gfc_add_decl_to_function (decl);
1460 else if (sym->ns->proc_name->attr.flavor != FL_MODULE)
1461 gfc_add_decl_to_parent_function (decl);
1463 sym->backend_decl = decl;
1465 /* If a variable is USE associated, it's always external. */
1466 if (sym->attr.use_assoc)
1468 DECL_EXTERNAL (decl) = 1;
1469 TREE_PUBLIC (decl) = 1;
1471 else if (sym->module && sym->ns->proc_name->attr.flavor == FL_MODULE)
1473 /* This is the declaration of a module variable. */
1474 TREE_PUBLIC (decl) = 1;
1475 TREE_STATIC (decl) = 1;
1478 if (!sym->attr.use_assoc
1479 && (sym->attr.save != SAVE_NONE || sym->attr.data
1480 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
1481 TREE_STATIC (decl) = 1;
1483 if (TREE_STATIC (decl) && sym->value)
1485 /* Add static initializer. */
1486 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1488 sym->attr.dimension,
1492 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1493 decl_attributes (&decl, attributes, 0);
1499 /* Get a basic decl for an external function. */
1502 gfc_get_extern_function_decl (gfc_symbol * sym)
1508 gfc_intrinsic_sym *isym;
1510 char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'. */
1514 bool proc_formal_arg;
1516 if (sym->backend_decl)
1517 return sym->backend_decl;
1519 /* We should never be creating external decls for alternate entry points.
1520 The procedure may be an alternate entry point, but we don't want/need
1522 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1524 if (sym->attr.proc_pointer)
1525 return get_proc_pointer_decl (sym);
1527 /* See if this is an external procedure from the same file. If so,
1528 return the backend_decl. */
1529 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name);
1531 /* Do not use procedures that have a procedure argument because this
1532 can result in problems of multiple decls during inlining. */
1533 proc_formal_arg = false;
1534 if (gsym && gsym->ns && gsym->ns->proc_name)
1536 gfc_formal_arglist *formal = gsym->ns->proc_name->formal;
1537 for (; formal; formal = formal->next)
1539 if (formal->sym && formal->sym->attr.flavor == FL_PROCEDURE)
1541 proc_formal_arg = true;
1547 if (gfc_option.flag_whole_file
1548 && (!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL)
1549 && !sym->backend_decl
1552 && ((gsym->type == GSYM_SUBROUTINE) || (gsym->type == GSYM_FUNCTION))
1553 && (gsym->ns->proc_name->backend_decl || !sym->attr.intrinsic))
1555 if (!gsym->ns->proc_name->backend_decl)
1557 /* By construction, the external function cannot be
1558 a contained procedure. */
1560 tree save_fn_decl = current_function_decl;
1562 current_function_decl = NULL_TREE;
1563 gfc_save_backend_locus (&old_loc);
1566 gfc_create_function_decl (gsym->ns, true);
1569 gfc_restore_backend_locus (&old_loc);
1570 current_function_decl = save_fn_decl;
1573 /* If the namespace has entries, the proc_name is the
1574 entry master. Find the entry and use its backend_decl.
1575 otherwise, use the proc_name backend_decl. */
1576 if (gsym->ns->entries)
1578 gfc_entry_list *entry = gsym->ns->entries;
1580 for (; entry; entry = entry->next)
1582 if (strcmp (gsym->name, entry->sym->name) == 0)
1584 sym->backend_decl = entry->sym->backend_decl;
1590 sym->backend_decl = gsym->ns->proc_name->backend_decl;
1592 if (sym->backend_decl)
1594 /* Avoid problems of double deallocation of the backend declaration
1595 later in gfc_trans_use_stmts; cf. PR 45087. */
1596 if (sym->attr.if_source != IFSRC_DECL && sym->attr.use_assoc)
1597 sym->attr.use_assoc = 0;
1599 return sym->backend_decl;
1603 /* See if this is a module procedure from the same file. If so,
1604 return the backend_decl. */
1606 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module);
1608 if (gfc_option.flag_whole_file
1610 && gsym->type == GSYM_MODULE)
1615 gfc_find_symbol (sym->name, gsym->ns, 0, &s);
1616 if (s && s->backend_decl)
1618 sym->backend_decl = s->backend_decl;
1619 return sym->backend_decl;
1623 if (sym->attr.intrinsic)
1625 /* Call the resolution function to get the actual name. This is
1626 a nasty hack which relies on the resolution functions only looking
1627 at the first argument. We pass NULL for the second argument
1628 otherwise things like AINT get confused. */
1629 isym = gfc_find_function (sym->name);
1630 gcc_assert (isym->resolve.f0 != NULL);
1632 memset (&e, 0, sizeof (e));
1633 e.expr_type = EXPR_FUNCTION;
1635 memset (&argexpr, 0, sizeof (argexpr));
1636 gcc_assert (isym->formal);
1637 argexpr.ts = isym->formal->ts;
1639 if (isym->formal->next == NULL)
1640 isym->resolve.f1 (&e, &argexpr);
1643 if (isym->formal->next->next == NULL)
1644 isym->resolve.f2 (&e, &argexpr, NULL);
1647 if (isym->formal->next->next->next == NULL)
1648 isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1651 /* All specific intrinsics take less than 5 arguments. */
1652 gcc_assert (isym->formal->next->next->next->next == NULL);
1653 isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
1658 if (gfc_option.flag_f2c
1659 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1660 || e.ts.type == BT_COMPLEX))
1662 /* Specific which needs a different implementation if f2c
1663 calling conventions are used. */
1664 sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1667 sprintf (s, "_gfortran_specific%s", e.value.function.name);
1669 name = get_identifier (s);
1670 mangled_name = name;
1674 name = gfc_sym_identifier (sym);
1675 mangled_name = gfc_sym_mangled_function_id (sym);
1678 type = gfc_get_function_type (sym);
1679 fndecl = build_decl (input_location,
1680 FUNCTION_DECL, name, type);
1682 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1683 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1684 the the opposite of declaring a function as static in C). */
1685 DECL_EXTERNAL (fndecl) = 1;
1686 TREE_PUBLIC (fndecl) = 1;
1688 attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
1689 decl_attributes (&fndecl, attributes, 0);
1691 gfc_set_decl_assembler_name (fndecl, mangled_name);
1693 /* Set the context of this decl. */
1694 if (0 && sym->ns && sym->ns->proc_name)
1696 /* TODO: Add external decls to the appropriate scope. */
1697 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1701 /* Global declaration, e.g. intrinsic subroutine. */
1702 DECL_CONTEXT (fndecl) = NULL_TREE;
1705 /* Set attributes for PURE functions. A call to PURE function in the
1706 Fortran 95 sense is both pure and without side effects in the C
1708 if (sym->attr.pure || sym->attr.elemental)
1710 if (sym->attr.function && !gfc_return_by_reference (sym))
1711 DECL_PURE_P (fndecl) = 1;
1712 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1713 parameters and don't use alternate returns (is this
1714 allowed?). In that case, calls to them are meaningless, and
1715 can be optimized away. See also in build_function_decl(). */
1716 TREE_SIDE_EFFECTS (fndecl) = 0;
1719 /* Mark non-returning functions. */
1720 if (sym->attr.noreturn)
1721 TREE_THIS_VOLATILE(fndecl) = 1;
1723 sym->backend_decl = fndecl;
1725 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1726 pushdecl_top_level (fndecl);
1732 /* Create a declaration for a procedure. For external functions (in the C
1733 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1734 a master function with alternate entry points. */
1737 build_function_decl (gfc_symbol * sym, bool global)
1739 tree fndecl, type, attributes;
1740 symbol_attribute attr;
1742 gfc_formal_arglist *f;
1744 gcc_assert (!sym->attr.external);
1746 if (sym->backend_decl)
1749 /* Set the line and filename. sym->declared_at seems to point to the
1750 last statement for subroutines, but it'll do for now. */
1751 gfc_set_backend_locus (&sym->declared_at);
1753 /* Allow only one nesting level. Allow public declarations. */
1754 gcc_assert (current_function_decl == NULL_TREE
1755 || DECL_FILE_SCOPE_P (current_function_decl)
1756 || (TREE_CODE (DECL_CONTEXT (current_function_decl))
1757 == NAMESPACE_DECL));
1759 type = gfc_get_function_type (sym);
1760 fndecl = build_decl (input_location,
1761 FUNCTION_DECL, gfc_sym_identifier (sym), type);
1765 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1766 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1767 the the opposite of declaring a function as static in C). */
1768 DECL_EXTERNAL (fndecl) = 0;
1770 if (!current_function_decl
1771 && !sym->attr.entry_master && !sym->attr.is_main_program)
1772 TREE_PUBLIC (fndecl) = 1;
1774 attributes = add_attributes_to_decl (attr, NULL_TREE);
1775 decl_attributes (&fndecl, attributes, 0);
1777 /* Figure out the return type of the declared function, and build a
1778 RESULT_DECL for it. If this is a subroutine with alternate
1779 returns, build a RESULT_DECL for it. */
1780 result_decl = NULL_TREE;
1781 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1784 if (gfc_return_by_reference (sym))
1785 type = void_type_node;
1788 if (sym->result != sym)
1789 result_decl = gfc_sym_identifier (sym->result);
1791 type = TREE_TYPE (TREE_TYPE (fndecl));
1796 /* Look for alternate return placeholders. */
1797 int has_alternate_returns = 0;
1798 for (f = sym->formal; f; f = f->next)
1802 has_alternate_returns = 1;
1807 if (has_alternate_returns)
1808 type = integer_type_node;
1810 type = void_type_node;
1813 result_decl = build_decl (input_location,
1814 RESULT_DECL, result_decl, type);
1815 DECL_ARTIFICIAL (result_decl) = 1;
1816 DECL_IGNORED_P (result_decl) = 1;
1817 DECL_CONTEXT (result_decl) = fndecl;
1818 DECL_RESULT (fndecl) = result_decl;
1820 /* Don't call layout_decl for a RESULT_DECL.
1821 layout_decl (result_decl, 0); */
1823 /* TREE_STATIC means the function body is defined here. */
1824 TREE_STATIC (fndecl) = 1;
1826 /* Set attributes for PURE functions. A call to a PURE function in the
1827 Fortran 95 sense is both pure and without side effects in the C
1829 if (attr.pure || attr.elemental)
1831 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1832 including an alternate return. In that case it can also be
1833 marked as PURE. See also in gfc_get_extern_function_decl(). */
1834 if (attr.function && !gfc_return_by_reference (sym))
1835 DECL_PURE_P (fndecl) = 1;
1836 TREE_SIDE_EFFECTS (fndecl) = 0;
1840 /* Layout the function declaration and put it in the binding level
1841 of the current function. */
1844 pushdecl_top_level (fndecl);
1848 /* Perform name mangling if this is a top level or module procedure. */
1849 if (current_function_decl == NULL_TREE)
1850 gfc_set_decl_assembler_name (fndecl, gfc_sym_mangled_function_id (sym));
1852 sym->backend_decl = fndecl;
1856 /* Create the DECL_ARGUMENTS for a procedure. */
1859 create_function_arglist (gfc_symbol * sym)
1862 gfc_formal_arglist *f;
1863 tree typelist, hidden_typelist;
1864 tree arglist, hidden_arglist;
1868 fndecl = sym->backend_decl;
1870 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1871 the new FUNCTION_DECL node. */
1872 arglist = NULL_TREE;
1873 hidden_arglist = NULL_TREE;
1874 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1876 if (sym->attr.entry_master)
1878 type = TREE_VALUE (typelist);
1879 parm = build_decl (input_location,
1880 PARM_DECL, get_identifier ("__entry"), type);
1882 DECL_CONTEXT (parm) = fndecl;
1883 DECL_ARG_TYPE (parm) = type;
1884 TREE_READONLY (parm) = 1;
1885 gfc_finish_decl (parm);
1886 DECL_ARTIFICIAL (parm) = 1;
1888 arglist = chainon (arglist, parm);
1889 typelist = TREE_CHAIN (typelist);
1892 if (gfc_return_by_reference (sym))
1894 tree type = TREE_VALUE (typelist), length = NULL;
1896 if (sym->ts.type == BT_CHARACTER)
1898 /* Length of character result. */
1899 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1901 length = build_decl (input_location,
1903 get_identifier (".__result"),
1905 if (!sym->ts.u.cl->length)
1907 sym->ts.u.cl->backend_decl = length;
1908 TREE_USED (length) = 1;
1910 gcc_assert (TREE_CODE (length) == PARM_DECL);
1911 DECL_CONTEXT (length) = fndecl;
1912 DECL_ARG_TYPE (length) = len_type;
1913 TREE_READONLY (length) = 1;
1914 DECL_ARTIFICIAL (length) = 1;
1915 gfc_finish_decl (length);
1916 if (sym->ts.u.cl->backend_decl == NULL
1917 || sym->ts.u.cl->backend_decl == length)
1922 if (sym->ts.u.cl->backend_decl == NULL)
1924 tree len = build_decl (input_location,
1926 get_identifier ("..__result"),
1927 gfc_charlen_type_node);
1928 DECL_ARTIFICIAL (len) = 1;
1929 TREE_USED (len) = 1;
1930 sym->ts.u.cl->backend_decl = len;
1933 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1934 arg = sym->result ? sym->result : sym;
1935 backend_decl = arg->backend_decl;
1936 /* Temporary clear it, so that gfc_sym_type creates complete
1938 arg->backend_decl = NULL;
1939 type = gfc_sym_type (arg);
1940 arg->backend_decl = backend_decl;
1941 type = build_reference_type (type);
1945 parm = build_decl (input_location,
1946 PARM_DECL, get_identifier ("__result"), type);
1948 DECL_CONTEXT (parm) = fndecl;
1949 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1950 TREE_READONLY (parm) = 1;
1951 DECL_ARTIFICIAL (parm) = 1;
1952 gfc_finish_decl (parm);
1954 arglist = chainon (arglist, parm);
1955 typelist = TREE_CHAIN (typelist);
1957 if (sym->ts.type == BT_CHARACTER)
1959 gfc_allocate_lang_decl (parm);
1960 arglist = chainon (arglist, length);
1961 typelist = TREE_CHAIN (typelist);
1965 hidden_typelist = typelist;
1966 for (f = sym->formal; f; f = f->next)
1967 if (f->sym != NULL) /* Ignore alternate returns. */
1968 hidden_typelist = TREE_CHAIN (hidden_typelist);
1970 for (f = sym->formal; f; f = f->next)
1972 char name[GFC_MAX_SYMBOL_LEN + 2];
1974 /* Ignore alternate returns. */
1978 type = TREE_VALUE (typelist);
1980 if (f->sym->ts.type == BT_CHARACTER
1981 && (!sym->attr.is_bind_c || sym->attr.entry_master))
1983 tree len_type = TREE_VALUE (hidden_typelist);
1984 tree length = NULL_TREE;
1985 if (!f->sym->ts.deferred)
1986 gcc_assert (len_type == gfc_charlen_type_node);
1988 gcc_assert (POINTER_TYPE_P (len_type));
1990 strcpy (&name[1], f->sym->name);
1992 length = build_decl (input_location,
1993 PARM_DECL, get_identifier (name), len_type);
1995 hidden_arglist = chainon (hidden_arglist, length);
1996 DECL_CONTEXT (length) = fndecl;
1997 DECL_ARTIFICIAL (length) = 1;
1998 DECL_ARG_TYPE (length) = len_type;
1999 TREE_READONLY (length) = 1;
2000 gfc_finish_decl (length);
2002 /* Remember the passed value. */
2003 if (f->sym->ts.u.cl->passed_length != NULL)
2005 /* This can happen if the same type is used for multiple
2006 arguments. We need to copy cl as otherwise
2007 cl->passed_length gets overwritten. */
2008 f->sym->ts.u.cl = gfc_new_charlen (f->sym->ns, f->sym->ts.u.cl);
2010 f->sym->ts.u.cl->passed_length = length;
2012 /* Use the passed value for assumed length variables. */
2013 if (!f->sym->ts.u.cl->length)
2015 TREE_USED (length) = 1;
2016 gcc_assert (!f->sym->ts.u.cl->backend_decl);
2017 f->sym->ts.u.cl->backend_decl = length;
2020 hidden_typelist = TREE_CHAIN (hidden_typelist);
2022 if (f->sym->ts.u.cl->backend_decl == NULL
2023 || f->sym->ts.u.cl->backend_decl == length)
2025 if (f->sym->ts.u.cl->backend_decl == NULL)
2026 gfc_create_string_length (f->sym);
2028 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2029 if (f->sym->attr.flavor == FL_PROCEDURE)
2030 type = build_pointer_type (gfc_get_function_type (f->sym));
2032 type = gfc_sym_type (f->sym);
2036 /* For non-constant length array arguments, make sure they use
2037 a different type node from TYPE_ARG_TYPES type. */
2038 if (f->sym->attr.dimension
2039 && type == TREE_VALUE (typelist)
2040 && TREE_CODE (type) == POINTER_TYPE
2041 && GFC_ARRAY_TYPE_P (type)
2042 && f->sym->as->type != AS_ASSUMED_SIZE
2043 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
2045 if (f->sym->attr.flavor == FL_PROCEDURE)
2046 type = build_pointer_type (gfc_get_function_type (f->sym));
2048 type = gfc_sym_type (f->sym);
2051 if (f->sym->attr.proc_pointer)
2052 type = build_pointer_type (type);
2054 if (f->sym->attr.volatile_)
2055 type = build_qualified_type (type, TYPE_QUAL_VOLATILE);
2057 /* Build the argument declaration. */
2058 parm = build_decl (input_location,
2059 PARM_DECL, gfc_sym_identifier (f->sym), type);
2061 if (f->sym->attr.volatile_)
2063 TREE_THIS_VOLATILE (parm) = 1;
2064 TREE_SIDE_EFFECTS (parm) = 1;
2067 /* Fill in arg stuff. */
2068 DECL_CONTEXT (parm) = fndecl;
2069 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
2070 /* All implementation args are read-only. */
2071 TREE_READONLY (parm) = 1;
2072 if (POINTER_TYPE_P (type)
2073 && (!f->sym->attr.proc_pointer
2074 && f->sym->attr.flavor != FL_PROCEDURE))
2075 DECL_BY_REFERENCE (parm) = 1;
2077 gfc_finish_decl (parm);
2079 f->sym->backend_decl = parm;
2081 arglist = chainon (arglist, parm);
2082 typelist = TREE_CHAIN (typelist);
2085 /* Add the hidden string length parameters, unless the procedure
2087 if (!sym->attr.is_bind_c)
2088 arglist = chainon (arglist, hidden_arglist);
2090 gcc_assert (hidden_typelist == NULL_TREE
2091 || TREE_VALUE (hidden_typelist) == void_type_node);
2092 DECL_ARGUMENTS (fndecl) = arglist;
2095 /* Do the setup necessary before generating the body of a function. */
2098 trans_function_start (gfc_symbol * sym)
2102 fndecl = sym->backend_decl;
2104 /* Let GCC know the current scope is this function. */
2105 current_function_decl = fndecl;
2107 /* Let the world know what we're about to do. */
2108 announce_function (fndecl);
2110 if (DECL_FILE_SCOPE_P (fndecl))
2112 /* Create RTL for function declaration. */
2113 rest_of_decl_compilation (fndecl, 1, 0);
2116 /* Create RTL for function definition. */
2117 make_decl_rtl (fndecl);
2119 init_function_start (fndecl);
2121 /* Even though we're inside a function body, we still don't want to
2122 call expand_expr to calculate the size of a variable-sized array.
2123 We haven't necessarily assigned RTL to all variables yet, so it's
2124 not safe to try to expand expressions involving them. */
2125 cfun->dont_save_pending_sizes_p = 1;
2127 /* function.c requires a push at the start of the function. */
2131 /* Create thunks for alternate entry points. */
2134 build_entry_thunks (gfc_namespace * ns, bool global)
2136 gfc_formal_arglist *formal;
2137 gfc_formal_arglist *thunk_formal;
2139 gfc_symbol *thunk_sym;
2145 /* This should always be a toplevel function. */
2146 gcc_assert (current_function_decl == NULL_TREE);
2148 gfc_save_backend_locus (&old_loc);
2149 for (el = ns->entries; el; el = el->next)
2151 VEC(tree,gc) *args = NULL;
2152 VEC(tree,gc) *string_args = NULL;
2154 thunk_sym = el->sym;
2156 build_function_decl (thunk_sym, global);
2157 create_function_arglist (thunk_sym);
2159 trans_function_start (thunk_sym);
2161 thunk_fndecl = thunk_sym->backend_decl;
2163 gfc_init_block (&body);
2165 /* Pass extra parameter identifying this entry point. */
2166 tmp = build_int_cst (gfc_array_index_type, el->id);
2167 VEC_safe_push (tree, gc, args, tmp);
2169 if (thunk_sym->attr.function)
2171 if (gfc_return_by_reference (ns->proc_name))
2173 tree ref = DECL_ARGUMENTS (current_function_decl);
2174 VEC_safe_push (tree, gc, args, ref);
2175 if (ns->proc_name->ts.type == BT_CHARACTER)
2176 VEC_safe_push (tree, gc, args, DECL_CHAIN (ref));
2180 for (formal = ns->proc_name->formal; formal; formal = formal->next)
2182 /* Ignore alternate returns. */
2183 if (formal->sym == NULL)
2186 /* We don't have a clever way of identifying arguments, so resort to
2187 a brute-force search. */
2188 for (thunk_formal = thunk_sym->formal;
2190 thunk_formal = thunk_formal->next)
2192 if (thunk_formal->sym == formal->sym)
2198 /* Pass the argument. */
2199 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
2200 VEC_safe_push (tree, gc, args, thunk_formal->sym->backend_decl);
2201 if (formal->sym->ts.type == BT_CHARACTER)
2203 tmp = thunk_formal->sym->ts.u.cl->backend_decl;
2204 VEC_safe_push (tree, gc, string_args, tmp);
2209 /* Pass NULL for a missing argument. */
2210 VEC_safe_push (tree, gc, args, null_pointer_node);
2211 if (formal->sym->ts.type == BT_CHARACTER)
2213 tmp = build_int_cst (gfc_charlen_type_node, 0);
2214 VEC_safe_push (tree, gc, string_args, tmp);
2219 /* Call the master function. */
2220 VEC_safe_splice (tree, gc, args, string_args);
2221 tmp = ns->proc_name->backend_decl;
2222 tmp = build_call_expr_loc_vec (input_location, tmp, args);
2223 if (ns->proc_name->attr.mixed_entry_master)
2225 tree union_decl, field;
2226 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
2228 union_decl = build_decl (input_location,
2229 VAR_DECL, get_identifier ("__result"),
2230 TREE_TYPE (master_type));
2231 DECL_ARTIFICIAL (union_decl) = 1;
2232 DECL_EXTERNAL (union_decl) = 0;
2233 TREE_PUBLIC (union_decl) = 0;
2234 TREE_USED (union_decl) = 1;
2235 layout_decl (union_decl, 0);
2236 pushdecl (union_decl);
2238 DECL_CONTEXT (union_decl) = current_function_decl;
2239 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2240 TREE_TYPE (union_decl), union_decl, tmp);
2241 gfc_add_expr_to_block (&body, tmp);
2243 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
2244 field; field = DECL_CHAIN (field))
2245 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2246 thunk_sym->result->name) == 0)
2248 gcc_assert (field != NULL_TREE);
2249 tmp = fold_build3_loc (input_location, COMPONENT_REF,
2250 TREE_TYPE (field), union_decl, field,
2252 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2253 TREE_TYPE (DECL_RESULT (current_function_decl)),
2254 DECL_RESULT (current_function_decl), tmp);
2255 tmp = build1_v (RETURN_EXPR, tmp);
2257 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
2260 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
2261 TREE_TYPE (DECL_RESULT (current_function_decl)),
2262 DECL_RESULT (current_function_decl), tmp);
2263 tmp = build1_v (RETURN_EXPR, tmp);
2265 gfc_add_expr_to_block (&body, tmp);
2267 /* Finish off this function and send it for code generation. */
2268 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
2271 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
2272 DECL_SAVED_TREE (thunk_fndecl)
2273 = build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl),
2274 DECL_INITIAL (thunk_fndecl));
2276 /* Output the GENERIC tree. */
2277 dump_function (TDI_original, thunk_fndecl);
2279 /* Store the end of the function, so that we get good line number
2280 info for the epilogue. */
2281 cfun->function_end_locus = input_location;
2283 /* We're leaving the context of this function, so zap cfun.
2284 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2285 tree_rest_of_compilation. */
2288 current_function_decl = NULL_TREE;
2290 cgraph_finalize_function (thunk_fndecl, true);
2292 /* We share the symbols in the formal argument list with other entry
2293 points and the master function. Clear them so that they are
2294 recreated for each function. */
2295 for (formal = thunk_sym->formal; formal; formal = formal->next)
2296 if (formal->sym != NULL) /* Ignore alternate returns. */
2298 formal->sym->backend_decl = NULL_TREE;
2299 if (formal->sym->ts.type == BT_CHARACTER)
2300 formal->sym->ts.u.cl->backend_decl = NULL_TREE;
2303 if (thunk_sym->attr.function)
2305 if (thunk_sym->ts.type == BT_CHARACTER)
2306 thunk_sym->ts.u.cl->backend_decl = NULL_TREE;
2307 if (thunk_sym->result->ts.type == BT_CHARACTER)
2308 thunk_sym->result->ts.u.cl->backend_decl = NULL_TREE;
2312 gfc_restore_backend_locus (&old_loc);
2316 /* Create a decl for a function, and create any thunks for alternate entry
2317 points. If global is true, generate the function in the global binding
2318 level, otherwise in the current binding level (which can be global). */
2321 gfc_create_function_decl (gfc_namespace * ns, bool global)
2323 /* Create a declaration for the master function. */
2324 build_function_decl (ns->proc_name, global);
2326 /* Compile the entry thunks. */
2328 build_entry_thunks (ns, global);
2330 /* Now create the read argument list. */
2331 create_function_arglist (ns->proc_name);
2334 /* Return the decl used to hold the function return value. If
2335 parent_flag is set, the context is the parent_scope. */
2338 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
2342 tree this_fake_result_decl;
2343 tree this_function_decl;
2345 char name[GFC_MAX_SYMBOL_LEN + 10];
2349 this_fake_result_decl = parent_fake_result_decl;
2350 this_function_decl = DECL_CONTEXT (current_function_decl);
2354 this_fake_result_decl = current_fake_result_decl;
2355 this_function_decl = current_function_decl;
2359 && sym->ns->proc_name->backend_decl == this_function_decl
2360 && sym->ns->proc_name->attr.entry_master
2361 && sym != sym->ns->proc_name)
2364 if (this_fake_result_decl != NULL)
2365 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
2366 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
2369 return TREE_VALUE (t);
2370 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
2373 this_fake_result_decl = parent_fake_result_decl;
2375 this_fake_result_decl = current_fake_result_decl;
2377 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
2381 for (field = TYPE_FIELDS (TREE_TYPE (decl));
2382 field; field = DECL_CHAIN (field))
2383 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
2387 gcc_assert (field != NULL_TREE);
2388 decl = fold_build3_loc (input_location, COMPONENT_REF,
2389 TREE_TYPE (field), decl, field, NULL_TREE);
2392 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
2394 gfc_add_decl_to_parent_function (var);
2396 gfc_add_decl_to_function (var);
2398 SET_DECL_VALUE_EXPR (var, decl);
2399 DECL_HAS_VALUE_EXPR_P (var) = 1;
2400 GFC_DECL_RESULT (var) = 1;
2402 TREE_CHAIN (this_fake_result_decl)
2403 = tree_cons (get_identifier (sym->name), var,
2404 TREE_CHAIN (this_fake_result_decl));
2408 if (this_fake_result_decl != NULL_TREE)
2409 return TREE_VALUE (this_fake_result_decl);
2411 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2416 if (sym->ts.type == BT_CHARACTER)
2418 if (sym->ts.u.cl->backend_decl == NULL_TREE)
2419 length = gfc_create_string_length (sym);
2421 length = sym->ts.u.cl->backend_decl;
2422 if (TREE_CODE (length) == VAR_DECL
2423 && DECL_CONTEXT (length) == NULL_TREE)
2424 gfc_add_decl_to_function (length);
2427 if (gfc_return_by_reference (sym))
2429 decl = DECL_ARGUMENTS (this_function_decl);
2431 if (sym->ns->proc_name->backend_decl == this_function_decl
2432 && sym->ns->proc_name->attr.entry_master)
2433 decl = DECL_CHAIN (decl);
2435 TREE_USED (decl) = 1;
2437 decl = gfc_build_dummy_array_decl (sym, decl);
2441 sprintf (name, "__result_%.20s",
2442 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
2444 if (!sym->attr.mixed_entry_master && sym->attr.function)
2445 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2446 VAR_DECL, get_identifier (name),
2447 gfc_sym_type (sym));
2449 decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
2450 VAR_DECL, get_identifier (name),
2451 TREE_TYPE (TREE_TYPE (this_function_decl)));
2452 DECL_ARTIFICIAL (decl) = 1;
2453 DECL_EXTERNAL (decl) = 0;
2454 TREE_PUBLIC (decl) = 0;
2455 TREE_USED (decl) = 1;
2456 GFC_DECL_RESULT (decl) = 1;
2457 TREE_ADDRESSABLE (decl) = 1;
2459 layout_decl (decl, 0);
2462 gfc_add_decl_to_parent_function (decl);
2464 gfc_add_decl_to_function (decl);
2468 parent_fake_result_decl = build_tree_list (NULL, decl);
2470 current_fake_result_decl = build_tree_list (NULL, decl);
2476 /* Builds a function decl. The remaining parameters are the types of the
2477 function arguments. Negative nargs indicates a varargs function. */
2480 build_library_function_decl_1 (tree name, const char *spec,
2481 tree rettype, int nargs, va_list p)
2489 /* Library functions must be declared with global scope. */
2490 gcc_assert (current_function_decl == NULL_TREE);
2492 /* Create a list of the argument types. */
2493 for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
2495 argtype = va_arg (p, tree);
2496 arglist = gfc_chainon_list (arglist, argtype);
2501 /* Terminate the list. */
2502 arglist = chainon (arglist, void_list_node);
2505 /* Build the function type and decl. */
2506 fntype = build_function_type (rettype, arglist);
2509 tree attr_args = build_tree_list (NULL_TREE,
2510 build_string (strlen (spec), spec));
2511 tree attrs = tree_cons (get_identifier ("fn spec"),
2512 attr_args, TYPE_ATTRIBUTES (fntype));
2513 fntype = build_type_attribute_variant (fntype, attrs);
2515 fndecl = build_decl (input_location,
2516 FUNCTION_DECL, name, fntype);
2518 /* Mark this decl as external. */
2519 DECL_EXTERNAL (fndecl) = 1;
2520 TREE_PUBLIC (fndecl) = 1;
2524 rest_of_decl_compilation (fndecl, 1, 0);
2529 /* Builds a function decl. The remaining parameters are the types of the
2530 function arguments. Negative nargs indicates a varargs function. */
2533 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
2537 va_start (args, nargs);
2538 ret = build_library_function_decl_1 (name, NULL, rettype, nargs, args);
2543 /* Builds a function decl. The remaining parameters are the types of the
2544 function arguments. Negative nargs indicates a varargs function.
2545 The SPEC parameter specifies the function argument and return type
2546 specification according to the fnspec function type attribute. */
2549 gfc_build_library_function_decl_with_spec (tree name, const char *spec,
2550 tree rettype, int nargs, ...)
2554 va_start (args, nargs);
2555 ret = build_library_function_decl_1 (name, spec, rettype, nargs, args);
2561 gfc_build_intrinsic_function_decls (void)
2563 tree gfc_int4_type_node = gfc_get_int_type (4);
2564 tree gfc_int8_type_node = gfc_get_int_type (8);
2565 tree gfc_int16_type_node = gfc_get_int_type (16);
2566 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2567 tree pchar1_type_node = gfc_get_pchar_type (1);
2568 tree pchar4_type_node = gfc_get_pchar_type (4);
2570 /* String functions. */
2571 gfor_fndecl_compare_string = gfc_build_library_function_decl_with_spec (
2572 get_identifier (PREFIX("compare_string")), "..R.R",
2573 integer_type_node, 4, gfc_charlen_type_node, pchar1_type_node,
2574 gfc_charlen_type_node, pchar1_type_node);
2575 DECL_PURE_P (gfor_fndecl_compare_string) = 1;
2576 TREE_NOTHROW (gfor_fndecl_compare_string) = 1;
2578 gfor_fndecl_concat_string = gfc_build_library_function_decl_with_spec (
2579 get_identifier (PREFIX("concat_string")), "..W.R.R",
2580 void_type_node, 6, gfc_charlen_type_node, pchar1_type_node,
2581 gfc_charlen_type_node, pchar1_type_node,
2582 gfc_charlen_type_node, pchar1_type_node);
2583 TREE_NOTHROW (gfor_fndecl_concat_string) = 1;
2585 gfor_fndecl_string_len_trim = gfc_build_library_function_decl_with_spec (
2586 get_identifier (PREFIX("string_len_trim")), "..R",
2587 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar1_type_node);
2588 DECL_PURE_P (gfor_fndecl_string_len_trim) = 1;
2589 TREE_NOTHROW (gfor_fndecl_string_len_trim) = 1;
2591 gfor_fndecl_string_index = gfc_build_library_function_decl_with_spec (
2592 get_identifier (PREFIX("string_index")), "..R.R.",
2593 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2594 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2595 DECL_PURE_P (gfor_fndecl_string_index) = 1;
2596 TREE_NOTHROW (gfor_fndecl_string_index) = 1;
2598 gfor_fndecl_string_scan = gfc_build_library_function_decl_with_spec (
2599 get_identifier (PREFIX("string_scan")), "..R.R.",
2600 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2601 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2602 DECL_PURE_P (gfor_fndecl_string_scan) = 1;
2603 TREE_NOTHROW (gfor_fndecl_string_scan) = 1;
2605 gfor_fndecl_string_verify = gfc_build_library_function_decl_with_spec (
2606 get_identifier (PREFIX("string_verify")), "..R.R.",
2607 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
2608 gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
2609 DECL_PURE_P (gfor_fndecl_string_verify) = 1;
2610 TREE_NOTHROW (gfor_fndecl_string_verify) = 1;
2612 gfor_fndecl_string_trim = gfc_build_library_function_decl_with_spec (
2613 get_identifier (PREFIX("string_trim")), ".Ww.R",
2614 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2615 build_pointer_type (pchar1_type_node), gfc_charlen_type_node,
2618 gfor_fndecl_string_minmax = gfc_build_library_function_decl_with_spec (
2619 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2620 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2621 build_pointer_type (pchar1_type_node), integer_type_node,
2624 gfor_fndecl_adjustl = gfc_build_library_function_decl_with_spec (
2625 get_identifier (PREFIX("adjustl")), ".W.R",
2626 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2628 TREE_NOTHROW (gfor_fndecl_adjustl) = 1;
2630 gfor_fndecl_adjustr = gfc_build_library_function_decl_with_spec (
2631 get_identifier (PREFIX("adjustr")), ".W.R",
2632 void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
2634 TREE_NOTHROW (gfor_fndecl_adjustr) = 1;
2636 gfor_fndecl_select_string = gfc_build_library_function_decl_with_spec (
2637 get_identifier (PREFIX("select_string")), ".R.R.",
2638 integer_type_node, 4, pvoid_type_node, integer_type_node,
2639 pchar1_type_node, gfc_charlen_type_node);
2640 DECL_PURE_P (gfor_fndecl_select_string) = 1;
2641 TREE_NOTHROW (gfor_fndecl_select_string) = 1;
2643 gfor_fndecl_compare_string_char4 = gfc_build_library_function_decl_with_spec (
2644 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2645 integer_type_node, 4, gfc_charlen_type_node, pchar4_type_node,
2646 gfc_charlen_type_node, pchar4_type_node);
2647 DECL_PURE_P (gfor_fndecl_compare_string_char4) = 1;
2648 TREE_NOTHROW (gfor_fndecl_compare_string_char4) = 1;
2650 gfor_fndecl_concat_string_char4 = gfc_build_library_function_decl_with_spec (
2651 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2652 void_type_node, 6, gfc_charlen_type_node, pchar4_type_node,
2653 gfc_charlen_type_node, pchar4_type_node, gfc_charlen_type_node,
2655 TREE_NOTHROW (gfor_fndecl_concat_string_char4) = 1;
2657 gfor_fndecl_string_len_trim_char4 = gfc_build_library_function_decl_with_spec (
2658 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2659 gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar4_type_node);
2660 DECL_PURE_P (gfor_fndecl_string_len_trim_char4) = 1;
2661 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4) = 1;
2663 gfor_fndecl_string_index_char4 = gfc_build_library_function_decl_with_spec (
2664 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2665 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2666 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2667 DECL_PURE_P (gfor_fndecl_string_index_char4) = 1;
2668 TREE_NOTHROW (gfor_fndecl_string_index_char4) = 1;
2670 gfor_fndecl_string_scan_char4 = gfc_build_library_function_decl_with_spec (
2671 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2672 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2673 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2674 DECL_PURE_P (gfor_fndecl_string_scan_char4) = 1;
2675 TREE_NOTHROW (gfor_fndecl_string_scan_char4) = 1;
2677 gfor_fndecl_string_verify_char4 = gfc_build_library_function_decl_with_spec (
2678 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2679 gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
2680 gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
2681 DECL_PURE_P (gfor_fndecl_string_verify_char4) = 1;
2682 TREE_NOTHROW (gfor_fndecl_string_verify_char4) = 1;
2684 gfor_fndecl_string_trim_char4 = gfc_build_library_function_decl_with_spec (
2685 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2686 void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
2687 build_pointer_type (pchar4_type_node), gfc_charlen_type_node,
2690 gfor_fndecl_string_minmax_char4 = gfc_build_library_function_decl_with_spec (
2691 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2692 void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
2693 build_pointer_type (pchar4_type_node), integer_type_node,
2696 gfor_fndecl_adjustl_char4 = gfc_build_library_function_decl_with_spec (
2697 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2698 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2700 TREE_NOTHROW (gfor_fndecl_adjustl_char4) = 1;
2702 gfor_fndecl_adjustr_char4 = gfc_build_library_function_decl_with_spec (
2703 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2704 void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
2706 TREE_NOTHROW (gfor_fndecl_adjustr_char4) = 1;
2708 gfor_fndecl_select_string_char4 = gfc_build_library_function_decl_with_spec (
2709 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2710 integer_type_node, 4, pvoid_type_node, integer_type_node,
2711 pvoid_type_node, gfc_charlen_type_node);
2712 DECL_PURE_P (gfor_fndecl_select_string_char4) = 1;
2713 TREE_NOTHROW (gfor_fndecl_select_string_char4) = 1;
2716 /* Conversion between character kinds. */
2718 gfor_fndecl_convert_char1_to_char4 = gfc_build_library_function_decl_with_spec (
2719 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2720 void_type_node, 3, build_pointer_type (pchar4_type_node),
2721 gfc_charlen_type_node, pchar1_type_node);
2723 gfor_fndecl_convert_char4_to_char1 = gfc_build_library_function_decl_with_spec (
2724 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
2725 void_type_node, 3, build_pointer_type (pchar1_type_node),
2726 gfc_charlen_type_node, pchar4_type_node);
2728 /* Misc. functions. */
2730 gfor_fndecl_ttynam = gfc_build_library_function_decl_with_spec (
2731 get_identifier (PREFIX("ttynam")), ".W",
2732 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
2735 gfor_fndecl_fdate = gfc_build_library_function_decl_with_spec (
2736 get_identifier (PREFIX("fdate")), ".W",
2737 void_type_node, 2, pchar_type_node, gfc_charlen_type_node);
2739 gfor_fndecl_ctime = gfc_build_library_function_decl_with_spec (
2740 get_identifier (PREFIX("ctime")), ".W",
2741 void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
2742 gfc_int8_type_node);
2744 gfor_fndecl_sc_kind = gfc_build_library_function_decl_with_spec (
2745 get_identifier (PREFIX("selected_char_kind")), "..R",
2746 gfc_int4_type_node, 2, gfc_charlen_type_node, pchar_type_node);
2747 DECL_PURE_P (gfor_fndecl_sc_kind) = 1;
2748 TREE_NOTHROW (gfor_fndecl_sc_kind) = 1;
2750 gfor_fndecl_si_kind = gfc_build_library_function_decl_with_spec (
2751 get_identifier (PREFIX("selected_int_kind")), ".R",
2752 gfc_int4_type_node, 1, pvoid_type_node);
2753 DECL_PURE_P (gfor_fndecl_si_kind) = 1;
2754 TREE_NOTHROW (gfor_fndecl_si_kind) = 1;
2756 gfor_fndecl_sr_kind = gfc_build_library_function_decl_with_spec (
2757 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
2758 gfc_int4_type_node, 3, pvoid_type_node, pvoid_type_node,
2760 DECL_PURE_P (gfor_fndecl_sr_kind) = 1;
2761 TREE_NOTHROW (gfor_fndecl_sr_kind) = 1;
2763 /* Power functions. */
2765 tree ctype, rtype, itype, jtype;
2766 int rkind, ikind, jkind;
2769 static int ikinds[NIKINDS] = {4, 8, 16};
2770 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2771 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2773 for (ikind=0; ikind < NIKINDS; ikind++)
2775 itype = gfc_get_int_type (ikinds[ikind]);
2777 for (jkind=0; jkind < NIKINDS; jkind++)
2779 jtype = gfc_get_int_type (ikinds[jkind]);
2782 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2784 gfor_fndecl_math_powi[jkind][ikind].integer =
2785 gfc_build_library_function_decl (get_identifier (name),
2786 jtype, 2, jtype, itype);
2787 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2788 TREE_NOTHROW (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2792 for (rkind = 0; rkind < NRKINDS; rkind ++)
2794 rtype = gfc_get_real_type (rkinds[rkind]);
2797 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2799 gfor_fndecl_math_powi[rkind][ikind].real =
2800 gfc_build_library_function_decl (get_identifier (name),
2801 rtype, 2, rtype, itype);
2802 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2803 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2806 ctype = gfc_get_complex_type (rkinds[rkind]);
2809 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2811 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2812 gfc_build_library_function_decl (get_identifier (name),
2813 ctype, 2,ctype, itype);
2814 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2815 TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2823 gfor_fndecl_math_ishftc4 = gfc_build_library_function_decl (
2824 get_identifier (PREFIX("ishftc4")),
2825 gfc_int4_type_node, 3, gfc_int4_type_node, gfc_int4_type_node,
2826 gfc_int4_type_node);
2827 TREE_READONLY (gfor_fndecl_math_ishftc4) = 1;
2828 TREE_NOTHROW (gfor_fndecl_math_ishftc4) = 1;
2830 gfor_fndecl_math_ishftc8 = gfc_build_library_function_decl (
2831 get_identifier (PREFIX("ishftc8")),
2832 gfc_int8_type_node, 3, gfc_int8_type_node, gfc_int4_type_node,
2833 gfc_int4_type_node);
2834 TREE_READONLY (gfor_fndecl_math_ishftc8) = 1;
2835 TREE_NOTHROW (gfor_fndecl_math_ishftc8) = 1;
2837 if (gfc_int16_type_node)
2839 gfor_fndecl_math_ishftc16 = gfc_build_library_function_decl (
2840 get_identifier (PREFIX("ishftc16")),
2841 gfc_int16_type_node, 3, gfc_int16_type_node, gfc_int4_type_node,
2842 gfc_int4_type_node);
2843 TREE_READONLY (gfor_fndecl_math_ishftc16) = 1;
2844 TREE_NOTHROW (gfor_fndecl_math_ishftc16) = 1;
2847 /* BLAS functions. */
2849 tree pint = build_pointer_type (integer_type_node);
2850 tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
2851 tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
2852 tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
2853 tree pz = build_pointer_type
2854 (gfc_get_complex_type (gfc_default_double_kind));
2856 gfor_fndecl_sgemm = gfc_build_library_function_decl
2858 (gfc_option.flag_underscoring ? "sgemm_"
2860 void_type_node, 15, pchar_type_node,
2861 pchar_type_node, pint, pint, pint, ps, ps, pint,
2862 ps, pint, ps, ps, pint, integer_type_node,
2864 gfor_fndecl_dgemm = gfc_build_library_function_decl
2866 (gfc_option.flag_underscoring ? "dgemm_"
2868 void_type_node, 15, pchar_type_node,
2869 pchar_type_node, pint, pint, pint, pd, pd, pint,
2870 pd, pint, pd, pd, pint, integer_type_node,
2872 gfor_fndecl_cgemm = gfc_build_library_function_decl
2874 (gfc_option.flag_underscoring ? "cgemm_"
2876 void_type_node, 15, pchar_type_node,
2877 pchar_type_node, pint, pint, pint, pc, pc, pint,
2878 pc, pint, pc, pc, pint, integer_type_node,
2880 gfor_fndecl_zgemm = gfc_build_library_function_decl
2882 (gfc_option.flag_underscoring ? "zgemm_"
2884 void_type_node, 15, pchar_type_node,
2885 pchar_type_node, pint, pint, pint, pz, pz, pint,
2886 pz, pint, pz, pz, pint, integer_type_node,
2890 /* Other functions. */
2891 gfor_fndecl_size0 = gfc_build_library_function_decl_with_spec (
2892 get_identifier (PREFIX("size0")), ".R",
2893 gfc_array_index_type, 1, pvoid_type_node);
2894 DECL_PURE_P (gfor_fndecl_size0) = 1;
2895 TREE_NOTHROW (gfor_fndecl_size0) = 1;
2897 gfor_fndecl_size1 = gfc_build_library_function_decl_with_spec (
2898 get_identifier (PREFIX("size1")), ".R",
2899 gfc_array_index_type, 2, pvoid_type_node, gfc_array_index_type);
2900 DECL_PURE_P (gfor_fndecl_size1) = 1;
2901 TREE_NOTHROW (gfor_fndecl_size1) = 1;
2903 gfor_fndecl_iargc = gfc_build_library_function_decl (
2904 get_identifier (PREFIX ("iargc")), gfc_int4_type_node, 0);
2905 TREE_NOTHROW (gfor_fndecl_iargc) = 1;
2909 /* Make prototypes for runtime library functions. */
2912 gfc_build_builtin_function_decls (void)
2914 tree gfc_int4_type_node = gfc_get_int_type (4);
2916 gfor_fndecl_stop_numeric = gfc_build_library_function_decl (
2917 get_identifier (PREFIX("stop_numeric")),
2918 void_type_node, 1, gfc_int4_type_node);
2919 /* STOP doesn't return. */
2920 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
2922 gfor_fndecl_stop_numeric_f08 = gfc_build_library_function_decl (
2923 get_identifier (PREFIX("stop_numeric_f08")),
2924 void_type_node, 1, gfc_int4_type_node);
2925 /* STOP doesn't return. */
2926 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08) = 1;
2928 gfor_fndecl_stop_string = gfc_build_library_function_decl_with_spec (
2929 get_identifier (PREFIX("stop_string")), ".R.",
2930 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
2931 /* STOP doesn't return. */
2932 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
2934 gfor_fndecl_error_stop_numeric = gfc_build_library_function_decl (
2935 get_identifier (PREFIX("error_stop_numeric")),
2936 void_type_node, 1, gfc_int4_type_node);
2937 /* ERROR STOP doesn't return. */
2938 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric) = 1;
2940 gfor_fndecl_error_stop_string = gfc_build_library_function_decl_with_spec (
2941 get_identifier (PREFIX("error_stop_string")), ".R.",
2942 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
2943 /* ERROR STOP doesn't return. */
2944 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string) = 1;
2946 gfor_fndecl_pause_numeric = gfc_build_library_function_decl (
2947 get_identifier (PREFIX("pause_numeric")),
2948 void_type_node, 1, gfc_int4_type_node);
2950 gfor_fndecl_pause_string = gfc_build_library_function_decl_with_spec (
2951 get_identifier (PREFIX("pause_string")), ".R.",
2952 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
2954 gfor_fndecl_runtime_error = gfc_build_library_function_decl_with_spec (
2955 get_identifier (PREFIX("runtime_error")), ".R",
2956 void_type_node, -1, pchar_type_node);
2957 /* The runtime_error function does not return. */
2958 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
2960 gfor_fndecl_runtime_error_at = gfc_build_library_function_decl_with_spec (
2961 get_identifier (PREFIX("runtime_error_at")), ".RR",
2962 void_type_node, -2, pchar_type_node, pchar_type_node);
2963 /* The runtime_error_at function does not return. */
2964 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
2966 gfor_fndecl_runtime_warning_at = gfc_build_library_function_decl_with_spec (
2967 get_identifier (PREFIX("runtime_warning_at")), ".RR",
2968 void_type_node, -2, pchar_type_node, pchar_type_node);
2970 gfor_fndecl_generate_error = gfc_build_library_function_decl_with_spec (
2971 get_identifier (PREFIX("generate_error")), ".R.R",
2972 void_type_node, 3, pvoid_type_node, integer_type_node,
2975 gfor_fndecl_os_error = gfc_build_library_function_decl_with_spec (
2976 get_identifier (PREFIX("os_error")), ".R",
2977 void_type_node, 1, pchar_type_node);
2978 /* The runtime_error function does not return. */
2979 TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
2981 gfor_fndecl_set_args = gfc_build_library_function_decl (
2982 get_identifier (PREFIX("set_args")),
2983 void_type_node, 2, integer_type_node,
2984 build_pointer_type (pchar_type_node));
2986 gfor_fndecl_set_fpe = gfc_build_library_function_decl (
2987 get_identifier (PREFIX("set_fpe")),
2988 void_type_node, 1, integer_type_node);
2990 /* Keep the array dimension in sync with the call, later in this file. */
2991 gfor_fndecl_set_options = gfc_build_library_function_decl_with_spec (
2992 get_identifier (PREFIX("set_options")), "..R",
2993 void_type_node, 2, integer_type_node,
2994 build_pointer_type (integer_type_node));
2996 gfor_fndecl_set_convert = gfc_build_library_function_decl (
2997 get_identifier (PREFIX("set_convert")),
2998 void_type_node, 1, integer_type_node);
3000 gfor_fndecl_set_record_marker = gfc_build_library_function_decl (
3001 get_identifier (PREFIX("set_record_marker")),
3002 void_type_node, 1, integer_type_node);
3004 gfor_fndecl_set_max_subrecord_length = gfc_build_library_function_decl (
3005 get_identifier (PREFIX("set_max_subrecord_length")),
3006 void_type_node, 1, integer_type_node);
3008 gfor_fndecl_in_pack = gfc_build_library_function_decl_with_spec (
3009 get_identifier (PREFIX("internal_pack")), ".r",
3010 pvoid_type_node, 1, pvoid_type_node);
3012 gfor_fndecl_in_unpack = gfc_build_library_function_decl_with_spec (
3013 get_identifier (PREFIX("internal_unpack")), ".wR",
3014 void_type_node, 2, pvoid_type_node, pvoid_type_node);
3016 gfor_fndecl_associated = gfc_build_library_function_decl_with_spec (
3017 get_identifier (PREFIX("associated")), ".RR",
3018 integer_type_node, 2, ppvoid_type_node, ppvoid_type_node);
3019 DECL_PURE_P (gfor_fndecl_associated) = 1;
3020 TREE_NOTHROW (gfor_fndecl_associated) = 1;
3022 /* Coarray library calls. */
3023 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
3025 tree pint_type, pppchar_type;
3027 pint_type = build_pointer_type (integer_type_node);
3029 = build_pointer_type (build_pointer_type (pchar_type_node));
3031 gfor_fndecl_caf_init = gfc_build_library_function_decl (
3032 get_identifier (PREFIX("caf_init")), void_type_node,
3033 4, pint_type, pppchar_type, pint_type, pint_type);
3035 gfor_fndecl_caf_finalize = gfc_build_library_function_decl (
3036 get_identifier (PREFIX("caf_finalize")), void_type_node, 0);
3038 gfor_fndecl_caf_critical = gfc_build_library_function_decl (
3039 get_identifier (PREFIX("caf_critical")), void_type_node, 0);
3041 gfor_fndecl_caf_end_critical = gfc_build_library_function_decl (
3042 get_identifier (PREFIX("caf_end_critical")), void_type_node, 0);
3044 gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
3045 get_identifier (PREFIX("caf_sync_all")), ".W", integer_type_node,
3046 2, build_pointer_type (pchar_type_node), integer_type_node);
3048 gfor_fndecl_caf_sync_images = gfc_build_library_function_decl_with_spec (
3049 get_identifier (PREFIX("caf_sync_images")), ".RRW", integer_type_node,
3050 4, integer_type_node, pint_type, build_pointer_type (pchar_type_node),
3053 gfor_fndecl_caf_error_stop = gfc_build_library_function_decl (
3054 get_identifier (PREFIX("caf_error_stop")),
3055 void_type_node, 1, gfc_int4_type_node);
3056 /* CAF's ERROR STOP doesn't return. */
3057 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop) = 1;
3059 gfor_fndecl_caf_error_stop_str = gfc_build_library_function_decl_with_spec (
3060 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3061 void_type_node, 2, pchar_type_node, gfc_int4_type_node);
3062 /* CAF's ERROR STOP doesn't return. */
3063 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str) = 1;
3066 gfc_build_intrinsic_function_decls ();
3067 gfc_build_intrinsic_lib_fndecls ();
3068 gfc_build_io_library_fndecls ();
3072 /* Evaluate the length of dummy character variables. */
3075 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl,
3076 gfc_wrapped_block *block)
3080 gfc_finish_decl (cl->backend_decl);
3082 gfc_start_block (&init);
3084 /* Evaluate the string length expression. */
3085 gfc_conv_string_length (cl, NULL, &init);
3087 gfc_trans_vla_type_sizes (sym, &init);
3089 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3093 /* Allocate and cleanup an automatic character variable. */
3096 gfc_trans_auto_character_variable (gfc_symbol * sym, gfc_wrapped_block * block)
3102 gcc_assert (sym->backend_decl);
3103 gcc_assert (sym->ts.u.cl && sym->ts.u.cl->length);
3105 gfc_init_block (&init);
3107 /* Evaluate the string length expression. */
3108 gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
3110 gfc_trans_vla_type_sizes (sym, &init);
3112 decl = sym->backend_decl;
3114 /* Emit a DECL_EXPR for this variable, which will cause the
3115 gimplifier to allocate storage, and all that good stuff. */
3116 tmp = fold_build1_loc (input_location, DECL_EXPR, TREE_TYPE (decl), decl);
3117 gfc_add_expr_to_block (&init, tmp);
3119 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3122 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3125 gfc_trans_assign_aux_var (gfc_symbol * sym, gfc_wrapped_block * block)
3129 gcc_assert (sym->backend_decl);
3130 gfc_start_block (&init);
3132 /* Set the initial value to length. See the comments in
3133 function gfc_add_assign_aux_vars in this file. */
3134 gfc_add_modify (&init, GFC_DECL_STRING_LEN (sym->backend_decl),
3135 build_int_cst (NULL_TREE, -2));
3137 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3141 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
3143 tree t = *tp, var, val;
3145 if (t == NULL || t == error_mark_node)
3147 if (TREE_CONSTANT (t) || DECL_P (t))
3150 if (TREE_CODE (t) == SAVE_EXPR)
3152 if (SAVE_EXPR_RESOLVED_P (t))
3154 *tp = TREE_OPERAND (t, 0);
3157 val = TREE_OPERAND (t, 0);
3162 var = gfc_create_var_np (TREE_TYPE (t), NULL);
3163 gfc_add_decl_to_function (var);
3164 gfc_add_modify (body, var, val);
3165 if (TREE_CODE (t) == SAVE_EXPR)
3166 TREE_OPERAND (t, 0) = var;
3171 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
3175 if (type == NULL || type == error_mark_node)
3178 type = TYPE_MAIN_VARIANT (type);
3180 if (TREE_CODE (type) == INTEGER_TYPE)
3182 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
3183 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
3185 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3187 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
3188 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
3191 else if (TREE_CODE (type) == ARRAY_TYPE)
3193 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
3194 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
3195 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
3196 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
3198 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
3200 TYPE_SIZE (t) = TYPE_SIZE (type);
3201 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
3206 /* Make sure all type sizes and array domains are either constant,
3207 or variable or parameter decls. This is a simplified variant
3208 of gimplify_type_sizes, but we can't use it here, as none of the
3209 variables in the expressions have been gimplified yet.
3210 As type sizes and domains for various variable length arrays
3211 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3212 time, without this routine gimplify_type_sizes in the middle-end
3213 could result in the type sizes being gimplified earlier than where
3214 those variables are initialized. */
3217 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
3219 tree type = TREE_TYPE (sym->backend_decl);
3221 if (TREE_CODE (type) == FUNCTION_TYPE
3222 && (sym->attr.function || sym->attr.result || sym->attr.entry))
3224 if (! current_fake_result_decl)
3227 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
3230 while (POINTER_TYPE_P (type))
3231 type = TREE_TYPE (type);
3233 if (GFC_DESCRIPTOR_TYPE_P (type))
3235 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
3237 while (POINTER_TYPE_P (etype))
3238 etype = TREE_TYPE (etype);
3240 gfc_trans_vla_type_sizes_1 (etype, body);
3243 gfc_trans_vla_type_sizes_1 (type, body);
3247 /* Initialize a derived type by building an lvalue from the symbol
3248 and using trans_assignment to do the work. Set dealloc to false
3249 if no deallocation prior the assignment is needed. */
3251 gfc_init_default_dt (gfc_symbol * sym, stmtblock_t * block, bool dealloc)
3259 gcc_assert (!sym->attr.allocatable);
3260 gfc_set_sym_referenced (sym);
3261 e = gfc_lval_expr_from_sym (sym);
3262 tmp = gfc_trans_assignment (e, sym->value, false, dealloc);
3263 if (sym->attr.dummy && (sym->attr.optional
3264 || sym->ns->proc_name->attr.entry_master))
3266 present = gfc_conv_expr_present (sym);
3267 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
3268 tmp, build_empty_stmt (input_location));
3270 gfc_add_expr_to_block (block, tmp);
3275 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3276 them their default initializer, if they do not have allocatable
3277 components, they have their allocatable components deallocated. */
3280 init_intent_out_dt (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3283 gfc_formal_arglist *f;
3287 gfc_init_block (&init);
3288 for (f = proc_sym->formal; f; f = f->next)
3289 if (f->sym && f->sym->attr.intent == INTENT_OUT
3290 && !f->sym->attr.pointer
3291 && f->sym->ts.type == BT_DERIVED)
3293 if (f->sym->ts.u.derived->attr.alloc_comp && !f->sym->value)
3295 tmp = gfc_deallocate_alloc_comp (f->sym->ts.u.derived,
3296 f->sym->backend_decl,
3297 f->sym->as ? f->sym->as->rank : 0);
3299 if (f->sym->attr.optional
3300 || f->sym->ns->proc_name->attr.entry_master)
3302 present = gfc_conv_expr_present (f->sym);
3303 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3305 build_empty_stmt (input_location));
3308 gfc_add_expr_to_block (&init, tmp);
3310 else if (f->sym->value)
3311 gfc_init_default_dt (f->sym, &init, true);
3313 else if (f->sym && f->sym->attr.intent == INTENT_OUT
3314 && f->sym->ts.type == BT_CLASS
3315 && !CLASS_DATA (f->sym)->attr.class_pointer
3316 && CLASS_DATA (f->sym)->ts.u.derived->attr.alloc_comp)
3318 tree decl = build_fold_indirect_ref_loc (input_location,
3319 f->sym->backend_decl);
3320 tmp = CLASS_DATA (f->sym)->backend_decl;
3321 tmp = fold_build3_loc (input_location, COMPONENT_REF,
3322 TREE_TYPE (tmp), decl, tmp, NULL_TREE);
3323 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3324 tmp = gfc_deallocate_alloc_comp (CLASS_DATA (f->sym)->ts.u.derived,
3326 CLASS_DATA (f->sym)->as ?
3327 CLASS_DATA (f->sym)->as->rank : 0);
3329 if (f->sym->attr.optional || f->sym->ns->proc_name->attr.entry_master)
3331 present = gfc_conv_expr_present (f->sym);
3332 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
3334 build_empty_stmt (input_location));
3337 gfc_add_expr_to_block (&init, tmp);
3340 gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
3344 /* Generate function entry and exit code, and add it to the function body.
3346 Allocation and initialization of array variables.
3347 Allocation of character string variables.
3348 Initialization and possibly repacking of dummy arrays.
3349 Initialization of ASSIGN statement auxiliary variable.
3350 Initialization of ASSOCIATE names.
3351 Automatic deallocation. */
3354 gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
3358 gfc_formal_arglist *f;
3359 stmtblock_t tmpblock;
3360 bool seen_trans_deferred_array = false;
3366 /* Deal with implicit return variables. Explicit return variables will
3367 already have been added. */
3368 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
3370 if (!current_fake_result_decl)
3372 gfc_entry_list *el = NULL;
3373 if (proc_sym->attr.entry_master)
3375 for (el = proc_sym->ns->entries; el; el = el->next)
3376 if (el->sym != el->sym->result)
3379 /* TODO: move to the appropriate place in resolve.c. */
3380 if (warn_return_type && el == NULL)
3381 gfc_warning ("Return value of function '%s' at %L not set",
3382 proc_sym->name, &proc_sym->declared_at);
3384 else if (proc_sym->as)
3386 tree result = TREE_VALUE (current_fake_result_decl);
3387 gfc_trans_dummy_array_bias (proc_sym, result, block);
3389 /* An automatic character length, pointer array result. */
3390 if (proc_sym->ts.type == BT_CHARACTER
3391 && TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3392 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3394 else if (proc_sym->ts.type == BT_CHARACTER)
3396 if (proc_sym->ts.deferred)
3399 gfc_save_backend_locus (&loc);
3400 gfc_set_backend_locus (&proc_sym->declared_at);
3401 gfc_start_block (&init);
3402 /* Zero the string length on entry. */
3403 gfc_add_modify (&init, proc_sym->ts.u.cl->backend_decl,
3404 build_int_cst (gfc_charlen_type_node, 0));
3405 /* Null the pointer. */
3406 e = gfc_lval_expr_from_sym (proc_sym);
3407 gfc_init_se (&se, NULL);
3408 se.want_pointer = 1;
3409 gfc_conv_expr (&se, e);
3412 gfc_add_modify (&init, tmp,
3413 fold_convert (TREE_TYPE (se.expr),
3414 null_pointer_node));
3415 gfc_restore_backend_locus (&loc);
3417 /* Pass back the string length on exit. */
3418 tmp = proc_sym->ts.u.cl->passed_length;
3419 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3420 tmp = fold_convert (gfc_charlen_type_node, tmp);
3421 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3422 gfc_charlen_type_node, tmp,
3423 proc_sym->ts.u.cl->backend_decl);
3424 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3426 else if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL)
3427 gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
3430 gcc_assert (gfc_option.flag_f2c
3431 && proc_sym->ts.type == BT_COMPLEX);
3434 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3435 should be done here so that the offsets and lbounds of arrays
3437 gfc_save_backend_locus (&loc);
3438 gfc_set_backend_locus (&proc_sym->declared_at);
3439 init_intent_out_dt (proc_sym, block);
3440 gfc_restore_backend_locus (&loc);
3442 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
3444 bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
3445 && sym->ts.u.derived->attr.alloc_comp;
3449 if (sym->attr.dimension)
3451 switch (sym->as->type)
3454 if (sym->attr.dummy || sym->attr.result)
3455 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3456 else if (sym->attr.pointer || sym->attr.allocatable)
3458 if (TREE_STATIC (sym->backend_decl))
3460 gfc_save_backend_locus (&loc);
3461 gfc_set_backend_locus (&sym->declared_at);
3462 gfc_trans_static_array_pointer (sym);
3463 gfc_restore_backend_locus (&loc);
3467 seen_trans_deferred_array = true;
3468 gfc_trans_deferred_array (sym, block);
3473 gfc_save_backend_locus (&loc);
3474 gfc_set_backend_locus (&sym->declared_at);
3476 if (sym_has_alloc_comp)
3478 seen_trans_deferred_array = true;
3479 gfc_trans_deferred_array (sym, block);
3481 else if (sym->ts.type == BT_DERIVED
3484 && sym->attr.save == SAVE_NONE)
3486 gfc_start_block (&tmpblock);
3487 gfc_init_default_dt (sym, &tmpblock, false);
3488 gfc_add_init_cleanup (block,
3489 gfc_finish_block (&tmpblock),
3493 gfc_trans_auto_array_allocation (sym->backend_decl,
3495 gfc_restore_backend_locus (&loc);
3499 case AS_ASSUMED_SIZE:
3500 /* Must be a dummy parameter. */
3501 gcc_assert (sym->attr.dummy || sym->as->cp_was_assumed);
3503 /* We should always pass assumed size arrays the g77 way. */
3504 if (sym->attr.dummy)
3505 gfc_trans_g77_array (sym, block);
3508 case AS_ASSUMED_SHAPE:
3509 /* Must be a dummy parameter. */
3510 gcc_assert (sym->attr.dummy);
3512 gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
3516 seen_trans_deferred_array = true;
3517 gfc_trans_deferred_array (sym, block);
3523 if (sym_has_alloc_comp && !seen_trans_deferred_array)
3524 gfc_trans_deferred_array (sym, block);
3526 else if ((!sym->attr.dummy || sym->ts.deferred)
3527 && (sym->attr.allocatable
3528 || (sym->ts.type == BT_CLASS
3529 && CLASS_DATA (sym)->attr.allocatable)))
3531 if (!sym->attr.save)
3533 /* Nullify and automatic deallocation of allocatable
3535 e = gfc_lval_expr_from_sym (sym);
3536 if (sym->ts.type == BT_CLASS)
3537 gfc_add_data_component (e);
3539 gfc_init_se (&se, NULL);
3540 se.want_pointer = 1;
3541 gfc_conv_expr (&se, e);
3544 gfc_save_backend_locus (&loc);
3545 gfc_set_backend_locus (&sym->declared_at);
3546 gfc_start_block (&init);
3548 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3550 /* Nullify when entering the scope. */
3551 gfc_add_modify (&init, se.expr,
3552 fold_convert (TREE_TYPE (se.expr),
3553 null_pointer_node));
3556 if ((sym->attr.dummy ||sym->attr.result)
3557 && sym->ts.type == BT_CHARACTER
3558 && sym->ts.deferred)
3560 /* Character length passed by reference. */
3561 tmp = sym->ts.u.cl->passed_length;
3562 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3563 tmp = fold_convert (gfc_charlen_type_node, tmp);
3565 if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
3566 /* Zero the string length when entering the scope. */
3567 gfc_add_modify (&init, sym->ts.u.cl->backend_decl,
3568 build_int_cst (gfc_charlen_type_node, 0));
3570 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
3572 gfc_restore_backend_locus (&loc);
3574 /* Pass the final character length back. */
3575 if (sym->attr.intent != INTENT_IN)
3576 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3577 gfc_charlen_type_node, tmp,
3578 sym->ts.u.cl->backend_decl);
3583 gfc_restore_backend_locus (&loc);
3585 /* Deallocate when leaving the scope. Nullifying is not
3587 if (!sym->attr.result && !sym->attr.dummy)
3588 tmp = gfc_deallocate_scalar_with_status (se.expr, NULL, true,
3591 if (sym->ts.type == BT_CLASS)
3593 /* Initialize _vptr to declared type. */
3594 gfc_symbol *vtab = gfc_find_derived_vtab (sym->ts.u.derived);
3597 gfc_save_backend_locus (&loc);
3598 gfc_set_backend_locus (&sym->declared_at);
3599 e = gfc_lval_expr_from_sym (sym);
3600 gfc_add_vptr_component (e);
3601 gfc_init_se (&se, NULL);
3602 se.want_pointer = 1;
3603 gfc_conv_expr (&se, e);
3605 rhs = gfc_build_addr_expr (TREE_TYPE (se.expr),
3606 gfc_get_symbol_decl (vtab));
3607 gfc_add_modify (&init, se.expr, rhs);
3608 gfc_restore_backend_locus (&loc);
3611 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3614 else if (sym->ts.type == BT_CHARACTER && sym->ts.deferred)
3619 /* If we get to here, all that should be left are pointers. */
3620 gcc_assert (sym->attr.pointer);
3622 if (sym->attr.dummy)
3624 gfc_start_block (&init);
3626 /* Character length passed by reference. */
3627 tmp = sym->ts.u.cl->passed_length;
3628 tmp = build_fold_indirect_ref_loc (input_location, tmp);
3629 tmp = fold_convert (gfc_charlen_type_node, tmp);
3630 gfc_add_modify (&init, sym->ts.u.cl->backend_decl, tmp);
3631 /* Pass the final character length back. */
3632 if (sym->attr.intent != INTENT_IN)
3633 tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3634 gfc_charlen_type_node, tmp,
3635 sym->ts.u.cl->backend_decl);
3638 gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
3641 else if (sym->ts.deferred)
3642 gfc_fatal_error ("Deferred type parameter not yet supported");
3643 else if (sym_has_alloc_comp)
3644 gfc_trans_deferred_array (sym, block);
3645 else if (sym->ts.type == BT_CHARACTER)
3647 gfc_save_backend_locus (&loc);
3648 gfc_set_backend_locus (&sym->declared_at);
3649 if (sym->attr.dummy || sym->attr.result)
3650 gfc_trans_dummy_character (sym, sym->ts.u.cl, block);
3652 gfc_trans_auto_character_variable (sym, block);
3653 gfc_restore_backend_locus (&loc);
3655 else if (sym->attr.assign)
3657 gfc_save_backend_locus (&loc);
3658 gfc_set_backend_locus (&sym->declared_at);
3659 gfc_trans_assign_aux_var (sym, block);
3660 gfc_restore_backend_locus (&loc);
3662 else if (sym->ts.type == BT_DERIVED
3665 && sym->attr.save == SAVE_NONE)
3667 gfc_start_block (&tmpblock);
3668 gfc_init_default_dt (sym, &tmpblock, false);
3669 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
3676 gfc_init_block (&tmpblock);
3678 for (f = proc_sym->formal; f; f = f->next)
3680 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
3682 gcc_assert (f->sym->ts.u.cl->backend_decl != NULL);
3683 if (TREE_CODE (f->sym->ts.u.cl->backend_decl) == PARM_DECL)
3684 gfc_trans_vla_type_sizes (f->sym, &tmpblock);
3688 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
3689 && current_fake_result_decl != NULL)
3691 gcc_assert (proc_sym->ts.u.cl->backend_decl != NULL);
3692 if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == PARM_DECL)
3693 gfc_trans_vla_type_sizes (proc_sym, &tmpblock);
3696 gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE);
3699 static GTY ((param_is (struct module_htab_entry))) htab_t module_htab;
3701 /* Hash and equality functions for module_htab. */
3704 module_htab_do_hash (const void *x)
3706 return htab_hash_string (((const struct module_htab_entry *)x)->name);
3710 module_htab_eq (const void *x1, const void *x2)
3712 return strcmp ((((const struct module_htab_entry *)x1)->name),
3713 (const char *)x2) == 0;
3716 /* Hash and equality functions for module_htab's decls. */
3719 module_htab_decls_hash (const void *x)
3721 const_tree t = (const_tree) x;
3722 const_tree n = DECL_NAME (t);
3724 n = TYPE_NAME (TREE_TYPE (t));
3725 return htab_hash_string (IDENTIFIER_POINTER (n));
3729 module_htab_decls_eq (const void *x1, const void *x2)
3731 const_tree t1 = (const_tree) x1;
3732 const_tree n1 = DECL_NAME (t1);
3733 if (n1 == NULL_TREE)
3734 n1 = TYPE_NAME (TREE_TYPE (t1));
3735 return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0;
3738 struct module_htab_entry *
3739 gfc_find_module (const char *name)
3744 module_htab = htab_create_ggc (10, module_htab_do_hash,
3745 module_htab_eq, NULL);
3747 slot = htab_find_slot_with_hash (module_htab, name,
3748 htab_hash_string (name), INSERT);
3751 struct module_htab_entry *entry = ggc_alloc_cleared_module_htab_entry ();
3753 entry->name = gfc_get_string (name);
3754 entry->decls = htab_create_ggc (10, module_htab_decls_hash,
3755 module_htab_decls_eq, NULL);
3756 *slot = (void *) entry;
3758 return (struct module_htab_entry *) *slot;
3762 gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
3767 if (DECL_NAME (decl))
3768 name = IDENTIFIER_POINTER (DECL_NAME (decl));
3771 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
3772 name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
3774 slot = htab_find_slot_with_hash (entry->decls, name,
3775 htab_hash_string (name), INSERT);
3777 *slot = (void *) decl;
3780 static struct module_htab_entry *cur_module;
3782 /* Output an initialized decl for a module variable. */
3785 gfc_create_module_variable (gfc_symbol * sym)
3789 /* Module functions with alternate entries are dealt with later and
3790 would get caught by the next condition. */
3791 if (sym->attr.entry)
3794 /* Make sure we convert the types of the derived types from iso_c_binding
3796 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3797 && sym->ts.type == BT_DERIVED)
3798 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3800 if (sym->attr.flavor == FL_DERIVED
3801 && sym->backend_decl
3802 && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
3804 decl = sym->backend_decl;
3805 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3807 /* -fwhole-file mixes up the contexts so these asserts are unnecessary. */
3808 if (!(gfc_option.flag_whole_file && sym->attr.use_assoc))
3810 gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
3811 || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
3812 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
3813 || DECL_CONTEXT (TYPE_STUB_DECL (decl))
3814 == sym->ns->proc_name->backend_decl);
3816 TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3817 DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
3818 gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
3821 /* Only output variables, procedure pointers and array valued,
3822 or derived type, parameters. */
3823 if (sym->attr.flavor != FL_VARIABLE
3824 && !(sym->attr.flavor == FL_PARAMETER
3825 && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
3826 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
3829 if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
3831 decl = sym->backend_decl;
3832 gcc_assert (DECL_FILE_SCOPE_P (decl));
3833 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3834 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3835 gfc_module_add_decl (cur_module, decl);
3838 /* Don't generate variables from other modules. Variables from
3839 COMMONs will already have been generated. */
3840 if (sym->attr.use_assoc || sym->attr.in_common)
3843 /* Equivalenced variables arrive here after creation. */
3844 if (sym->backend_decl
3845 && (sym->equiv_built || sym->attr.in_equivalence))
3848 if (sym->backend_decl && !sym->attr.vtab && !sym->attr.target)
3849 internal_error ("backend decl for module variable %s already exists",
3852 /* We always want module variables to be created. */
3853 sym->attr.referenced = 1;
3854 /* Create the decl. */
3855 decl = gfc_get_symbol_decl (sym);
3857 /* Create the variable. */
3859 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3860 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3861 rest_of_decl_compilation (decl, 1, 0);
3862 gfc_module_add_decl (cur_module, decl);
3864 /* Also add length of strings. */
3865 if (sym->ts.type == BT_CHARACTER)
3869 length = sym->ts.u.cl->backend_decl;
3870 gcc_assert (length || sym->attr.proc_pointer);
3871 if (length && !INTEGER_CST_P (length))
3874 rest_of_decl_compilation (length, 1, 0);
3879 /* Emit debug information for USE statements. */
3882 gfc_trans_use_stmts (gfc_namespace * ns)
3884 gfc_use_list *use_stmt;
3885 for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
3887 struct module_htab_entry *entry
3888 = gfc_find_module (use_stmt->module_name);
3889 gfc_use_rename *rent;
3891 if (entry->namespace_decl == NULL)
3893 entry->namespace_decl
3894 = build_decl (input_location,
3896 get_identifier (use_stmt->module_name),
3898 DECL_EXTERNAL (entry->namespace_decl) = 1;
3900 gfc_set_backend_locus (&use_stmt->where);
3901 if (!use_stmt->only_flag)
3902 (*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
3904 ns->proc_name->backend_decl,
3906 for (rent = use_stmt->rename; rent; rent = rent->next)
3908 tree decl, local_name;
3911 if (rent->op != INTRINSIC_NONE)
3914 slot = htab_find_slot_with_hash (entry->decls, rent->use_name,
3915 htab_hash_string (rent->use_name),
3921 st = gfc_find_symtree (ns->sym_root,
3923 ? rent->local_name : rent->use_name);
3926 /* Sometimes, generic interfaces wind up being over-ruled by a
3927 local symbol (see PR41062). */
3928 if (!st->n.sym->attr.use_assoc)
3931 if (st->n.sym->backend_decl
3932 && DECL_P (st->n.sym->backend_decl)
3933 && st->n.sym->module
3934 && strcmp (st->n.sym->module, use_stmt->module_name) == 0)
3936 gcc_assert (DECL_EXTERNAL (entry->namespace_decl)
3937 || (TREE_CODE (st->n.sym->backend_decl)
3939 decl = copy_node (st->n.sym->backend_decl);
3940 DECL_CONTEXT (decl) = entry->namespace_decl;
3941 DECL_EXTERNAL (decl) = 1;
3942 DECL_IGNORED_P (decl) = 0;
3943 DECL_INITIAL (decl) = NULL_TREE;
3947 *slot = error_mark_node;
3948 htab_clear_slot (entry->decls, slot);
3953 decl = (tree) *slot;
3954 if (rent->local_name[0])
3955 local_name = get_identifier (rent->local_name);
3957 local_name = NULL_TREE;
3958 gfc_set_backend_locus (&rent->where);
3959 (*debug_hooks->imported_module_or_decl) (decl, local_name,
3960 ns->proc_name->backend_decl,
3961 !use_stmt->only_flag);
3967 /* Return true if expr is a constant initializer that gfc_conv_initializer
3971 check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array,
3981 if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL)
3983 else if (expr->expr_type == EXPR_STRUCTURE)
3984 return check_constant_initializer (expr, ts, false, false);
3985 else if (expr->expr_type != EXPR_ARRAY)
3987 for (c = gfc_constructor_first (expr->value.constructor);
3988 c; c = gfc_constructor_next (c))
3992 if (c->expr->expr_type == EXPR_STRUCTURE)
3994 if (!check_constant_initializer (c->expr, ts, false, false))
3997 else if (c->expr->expr_type != EXPR_CONSTANT)
4002 else switch (ts->type)
4005 if (expr->expr_type != EXPR_STRUCTURE)
4007 cm = expr->ts.u.derived->components;
4008 for (c = gfc_constructor_first (expr->value.constructor);
4009 c; c = gfc_constructor_next (c), cm = cm->next)
4011 if (!c->expr || cm->attr.allocatable)
4013 if (!check_constant_initializer (c->expr, &cm->ts,
4020 return expr->expr_type == EXPR_CONSTANT;
4024 /* Emit debug info for parameters and unreferenced variables with
4028 gfc_emit_parameter_debug_info (gfc_symbol *sym)
4032 if (sym->attr.flavor != FL_PARAMETER
4033 && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced))
4036 if (sym->backend_decl != NULL
4037 || sym->value == NULL
4038 || sym->attr.use_assoc
4041 || sym->attr.function
4042 || sym->attr.intrinsic
4043 || sym->attr.pointer
4044 || sym->attr.allocatable
4045 || sym->attr.cray_pointee
4046 || sym->attr.threadprivate
4047 || sym->attr.is_bind_c
4048 || sym->attr.subref_array_pointer
4049 || sym->attr.assign)
4052 if (sym->ts.type == BT_CHARACTER)
4054 gfc_conv_const_charlen (sym->ts.u.cl);
4055 if (sym->ts.u.cl->backend_decl == NULL
4056 || TREE_CODE (sym->ts.u.cl->backend_decl) != INTEGER_CST)
4059 else if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
4066 if (sym->as->type != AS_EXPLICIT)
4068 for (n = 0; n < sym->as->rank; n++)
4069 if (sym->as->lower[n]->expr_type != EXPR_CONSTANT
4070 || sym->as->upper[n] == NULL
4071 || sym->as->upper[n]->expr_type != EXPR_CONSTANT)
4075 if (!check_constant_initializer (sym->value, &sym->ts,
4076 sym->attr.dimension, false))
4079 /* Create the decl for the variable or constant. */
4080 decl = build_decl (input_location,
4081 sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL,
4082 gfc_sym_identifier (sym), gfc_sym_type (sym));
4083 if (sym->attr.flavor == FL_PARAMETER)
4084 TREE_READONLY (decl) = 1;
4085 gfc_set_decl_location (decl, &sym->declared_at);
4086 if (sym->attr.dimension)
4087 GFC_DECL_PACKED_ARRAY (decl) = 1;
4088 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
4089 TREE_STATIC (decl) = 1;
4090 TREE_USED (decl) = 1;
4091 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
4092 TREE_PUBLIC (decl) = 1;
4093 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
4095 sym->attr.dimension,
4097 debug_hooks->global_decl (decl);
4100 /* Generate all the required code for module variables. */
4103 gfc_generate_module_vars (gfc_namespace * ns)
4105 module_namespace = ns;
4106 cur_module = gfc_find_module (ns->proc_name->name);
4108 /* Check if the frontend left the namespace in a reasonable state. */
4109 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
4111 /* Generate COMMON blocks. */
4112 gfc_trans_common (ns);
4114 /* Create decls for all the module variables. */
4115 gfc_traverse_ns (ns, gfc_create_module_variable);
4119 gfc_trans_use_stmts (ns);
4120 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
4125 gfc_generate_contained_functions (gfc_namespace * parent)
4129 /* We create all the prototypes before generating any code. */
4130 for (ns = parent->contained; ns; ns = ns->sibling)
4132 /* Skip namespaces from used modules. */
4133 if (ns->parent != parent)
4136 gfc_create_function_decl (ns, false);
4139 for (ns = parent->contained; ns; ns = ns->sibling)
4141 /* Skip namespaces from used modules. */
4142 if (ns->parent != parent)
4145 gfc_generate_function_code (ns);
4150 /* Drill down through expressions for the array specification bounds and
4151 character length calling generate_local_decl for all those variables
4152 that have not already been declared. */
4155 generate_local_decl (gfc_symbol *);
4157 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4160 expr_decls (gfc_expr *e, gfc_symbol *sym,
4161 int *f ATTRIBUTE_UNUSED)
4163 if (e->expr_type != EXPR_VARIABLE
4164 || sym == e->symtree->n.sym
4165 || e->symtree->n.sym->mark
4166 || e->symtree->n.sym->ns != sym->ns)
4169 generate_local_decl (e->symtree->n.sym);
4174 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
4176 gfc_traverse_expr (e, sym, expr_decls, 0);
4180 /* Check for dependencies in the character length and array spec. */
4183 generate_dependency_declarations (gfc_symbol *sym)
4187 if (sym->ts.type == BT_CHARACTER
4189 && sym->ts.u.cl->length
4190 && sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4191 generate_expr_decls (sym, sym->ts.u.cl->length);
4193 if (sym->as && sym->as->rank)
4195 for (i = 0; i < sym->as->rank; i++)
4197 generate_expr_decls (sym, sym->as->lower[i]);
4198 generate_expr_decls (sym, sym->as->upper[i]);
4204 /* Generate decls for all local variables. We do this to ensure correct
4205 handling of expressions which only appear in the specification of
4209 generate_local_decl (gfc_symbol * sym)
4211 if (sym->attr.flavor == FL_VARIABLE)
4213 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
4214 generate_dependency_declarations (sym);
4216 if (sym->attr.referenced)
4217 gfc_get_symbol_decl (sym);
4219 /* Warnings for unused dummy arguments. */
4220 else if (sym->attr.dummy)
4222 /* INTENT(out) dummy arguments are likely meant to be set. */
4223 if (gfc_option.warn_unused_dummy_argument
4224 && sym->attr.intent == INTENT_OUT)
4226 if (sym->ts.type != BT_DERIVED)
4227 gfc_warning ("Dummy argument '%s' at %L was declared "
4228 "INTENT(OUT) but was not set", sym->name,
4230 else if (!gfc_has_default_initializer (sym->ts.u.derived))
4231 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4232 "declared INTENT(OUT) but was not set and "
4233 "does not have a default initializer",
4234 sym->name, &sym->declared_at);
4236 else if (gfc_option.warn_unused_dummy_argument)
4237 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
4241 /* Warn for unused variables, but not if they're inside a common
4242 block, a namelist, or are use-associated. */
4243 else if (warn_unused_variable
4244 && !(sym->attr.in_common || sym->attr.use_assoc || sym->mark
4245 || sym->attr.in_namelist))
4246 gfc_warning ("Unused variable '%s' declared at %L", sym->name,
4249 /* For variable length CHARACTER parameters, the PARM_DECL already
4250 references the length variable, so force gfc_get_symbol_decl
4251 even when not referenced. If optimize > 0, it will be optimized
4252 away anyway. But do this only after emitting -Wunused-parameter
4253 warning if requested. */
4254 if (sym->attr.dummy && !sym->attr.referenced
4255 && sym->ts.type == BT_CHARACTER
4256 && sym->ts.u.cl->backend_decl != NULL
4257 && TREE_CODE (sym->ts.u.cl->backend_decl) == VAR_DECL)
4259 sym->attr.referenced = 1;
4260 gfc_get_symbol_decl (sym);
4263 /* INTENT(out) dummy arguments and result variables with allocatable
4264 components are reset by default and need to be set referenced to
4265 generate the code for nullification and automatic lengths. */
4266 if (!sym->attr.referenced
4267 && sym->ts.type == BT_DERIVED
4268 && sym->ts.u.derived->attr.alloc_comp
4269 && !sym->attr.pointer
4270 && ((sym->attr.dummy && sym->attr.intent == INTENT_OUT)
4272 (sym->attr.result && sym != sym->result)))
4274 sym->attr.referenced = 1;
4275 gfc_get_symbol_decl (sym);
4278 /* Check for dependencies in the array specification and string
4279 length, adding the necessary declarations to the function. We
4280 mark the symbol now, as well as in traverse_ns, to prevent
4281 getting stuck in a circular dependency. */
4284 /* We do not want the middle-end to warn about unused parameters
4285 as this was already done above. */
4286 if (sym->attr.dummy && sym->backend_decl != NULL_TREE)
4287 TREE_NO_WARNING(sym->backend_decl) = 1;
4289 else if (sym->attr.flavor == FL_PARAMETER)
4291 if (warn_unused_parameter
4292 && !sym->attr.referenced
4293 && !sym->attr.use_assoc)
4294 gfc_warning ("Unused parameter '%s' declared at %L", sym->name,
4297 else if (sym->attr.flavor == FL_PROCEDURE)
4299 /* TODO: move to the appropriate place in resolve.c. */
4300 if (warn_return_type
4301 && sym->attr.function
4303 && sym != sym->result
4304 && !sym->result->attr.referenced
4305 && !sym->attr.use_assoc
4306 && sym->attr.if_source != IFSRC_IFBODY)
4308 gfc_warning ("Return value '%s' of function '%s' declared at "
4309 "%L not set", sym->result->name, sym->name,
4310 &sym->result->declared_at);
4312 /* Prevents "Unused variable" warning for RESULT variables. */
4313 sym->result->mark = 1;
4317 if (sym->attr.dummy == 1)
4319 /* Modify the tree type for scalar character dummy arguments of bind(c)
4320 procedures if they are passed by value. The tree type for them will
4321 be promoted to INTEGER_TYPE for the middle end, which appears to be
4322 what C would do with characters passed by-value. The value attribute
4323 implies the dummy is a scalar. */
4324 if (sym->attr.value == 1 && sym->backend_decl != NULL
4325 && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
4326 && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
4327 gfc_conv_scalar_char_value (sym, NULL, NULL);
4330 /* Make sure we convert the types of the derived types from iso_c_binding
4332 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
4333 && sym->ts.type == BT_DERIVED)
4334 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
4338 generate_local_vars (gfc_namespace * ns)
4340 gfc_traverse_ns (ns, generate_local_decl);
4344 /* Generate a switch statement to jump to the correct entry point. Also
4345 creates the label decls for the entry points. */
4348 gfc_trans_entry_master_switch (gfc_entry_list * el)
4355 gfc_init_block (&block);
4356 for (; el; el = el->next)
4358 /* Add the case label. */
4359 label = gfc_build_label_decl (NULL_TREE);
4360 val = build_int_cst (gfc_array_index_type, el->id);
4361 tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
4362 gfc_add_expr_to_block (&block, tmp);
4364 /* And jump to the actual entry point. */
4365 label = gfc_build_label_decl (NULL_TREE);
4366 tmp = build1_v (GOTO_EXPR, label);
4367 gfc_add_expr_to_block (&block, tmp);
4369 /* Save the label decl. */
4372 tmp = gfc_finish_block (&block);
4373 /* The first argument selects the entry point. */
4374 val = DECL_ARGUMENTS (current_function_decl);
4375 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
4380 /* Add code to string lengths of actual arguments passed to a function against
4381 the expected lengths of the dummy arguments. */
4384 add_argument_checking (stmtblock_t *block, gfc_symbol *sym)
4386 gfc_formal_arglist *formal;
4388 for (formal = sym->formal; formal; formal = formal->next)
4389 if (formal->sym && formal->sym->ts.type == BT_CHARACTER)
4391 enum tree_code comparison;
4396 const char *message;
4402 gcc_assert (cl->passed_length != NULL_TREE);
4403 gcc_assert (cl->backend_decl != NULL_TREE);
4405 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
4406 string lengths must match exactly. Otherwise, it is only required
4407 that the actual string length is *at least* the expected one.
4408 Sequence association allows for a mismatch of the string length
4409 if the actual argument is (part of) an array, but only if the
4410 dummy argument is an array. (See "Sequence association" in
4411 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
4412 if (fsym->attr.pointer || fsym->attr.allocatable
4413 || (fsym->as && fsym->as->type == AS_ASSUMED_SHAPE))
4415 comparison = NE_EXPR;
4416 message = _("Actual string length does not match the declared one"
4417 " for dummy argument '%s' (%ld/%ld)");
4419 else if (fsym->as && fsym->as->rank != 0)
4423 comparison = LT_EXPR;
4424 message = _("Actual string length is shorter than the declared one"
4425 " for dummy argument '%s' (%ld/%ld)");
4428 /* Build the condition. For optional arguments, an actual length
4429 of 0 is also acceptable if the associated string is NULL, which
4430 means the argument was not passed. */
4431 cond = fold_build2_loc (input_location, comparison, boolean_type_node,
4432 cl->passed_length, cl->backend_decl);
4433 if (fsym->attr.optional)
4439 not_0length = fold_build2_loc (input_location, NE_EXPR,
4442 build_zero_cst (gfc_charlen_type_node));
4443 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
4444 fsym->attr.referenced = 1;
4445 not_absent = gfc_conv_expr_present (fsym);
4447 absent_failed = fold_build2_loc (input_location, TRUTH_OR_EXPR,
4448 boolean_type_node, not_0length,
4451 cond = fold_build2_loc (input_location, TRUTH_AND_EXPR,
4452 boolean_type_node, cond, absent_failed);
4455 /* Build the runtime check. */
4456 argname = gfc_build_cstring_const (fsym->name);
4457 argname = gfc_build_addr_expr (pchar_type_node, argname);
4458 gfc_trans_runtime_check (true, false, cond, block, &fsym->declared_at,
4460 fold_convert (long_integer_type_node,
4462 fold_convert (long_integer_type_node,
4469 gfc_init_coarray_decl (void)
4471 tree save_fn_decl = current_function_decl;
4473 if (gfc_option.coarray != GFC_FCOARRAY_LIB)
4476 if (gfort_gvar_caf_this_image || gfort_gvar_caf_num_images)
4479 save_fn_decl = current_function_decl;
4480 current_function_decl = NULL_TREE;
4483 gfort_gvar_caf_this_image = gfc_create_var (integer_type_node,
4484 PREFIX("caf_this_image"));
4485 DECL_ARTIFICIAL (gfort_gvar_caf_this_image) = 1;
4486 TREE_USED (gfort_gvar_caf_this_image) = 1;
4487 TREE_PUBLIC (gfort_gvar_caf_this_image) = 1;
4488 TREE_STATIC (gfort_gvar_caf_this_image) = 1;
4490 gfort_gvar_caf_num_images = gfc_create_var (integer_type_node,
4491 PREFIX("caf_num_images"));
4492 DECL_ARTIFICIAL (gfort_gvar_caf_num_images) = 1;
4493 TREE_USED (gfort_gvar_caf_num_images) = 1;
4494 TREE_PUBLIC (gfort_gvar_caf_num_images) = 1;
4495 TREE_STATIC (gfort_gvar_caf_num_images) = 1;
4498 current_function_decl = save_fn_decl;
4503 create_main_function (tree fndecl)
4507 tree tmp, decl, result_decl, argc, argv, typelist, arglist;
4510 old_context = current_function_decl;
4514 push_function_context ();
4515 saved_parent_function_decls = saved_function_decls;
4516 saved_function_decls = NULL_TREE;
4519 /* main() function must be declared with global scope. */
4520 gcc_assert (current_function_decl == NULL_TREE);
4522 /* Declare the function. */
4523 tmp = build_function_type_list (integer_type_node, integer_type_node,
4524 build_pointer_type (pchar_type_node),
4526 main_identifier_node = get_identifier ("main");
4527 ftn_main = build_decl (input_location, FUNCTION_DECL,
4528 main_identifier_node, tmp);
4529 DECL_EXTERNAL (ftn_main) = 0;
4530 TREE_PUBLIC (ftn_main) = 1;
4531 TREE_STATIC (ftn_main) = 1;
4532 DECL_ATTRIBUTES (ftn_main)
4533 = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
4535 /* Setup the result declaration (for "return 0"). */
4536 result_decl = build_decl (input_location,
4537 RESULT_DECL, NULL_TREE, integer_type_node);
4538 DECL_ARTIFICIAL (result_decl) = 1;
4539 DECL_IGNORED_P (result_decl) = 1;
4540 DECL_CONTEXT (result_decl) = ftn_main;
4541 DECL_RESULT (ftn_main) = result_decl;
4543 pushdecl (ftn_main);
4545 /* Get the arguments. */
4547 arglist = NULL_TREE;
4548 typelist = TYPE_ARG_TYPES (TREE_TYPE (ftn_main));
4550 tmp = TREE_VALUE (typelist);
4551 argc = build_decl (input_location, PARM_DECL, get_identifier ("argc"), tmp);
4552 DECL_CONTEXT (argc) = ftn_main;
4553 DECL_ARG_TYPE (argc) = TREE_VALUE (typelist);
4554 TREE_READONLY (argc) = 1;
4555 gfc_finish_decl (argc);
4556 arglist = chainon (arglist, argc);
4558 typelist = TREE_CHAIN (typelist);
4559 tmp = TREE_VALUE (typelist);
4560 argv = build_decl (input_location, PARM_DECL, get_identifier ("argv"), tmp);
4561 DECL_CONTEXT (argv) = ftn_main;
4562 DECL_ARG_TYPE (argv) = TREE_VALUE (typelist);
4563 TREE_READONLY (argv) = 1;
4564 DECL_BY_REFERENCE (argv) = 1;
4565 gfc_finish_decl (argv);
4566 arglist = chainon (arglist, argv);
4568 DECL_ARGUMENTS (ftn_main) = arglist;
4569 current_function_decl = ftn_main;
4570 announce_function (ftn_main);
4572 rest_of_decl_compilation (ftn_main, 1, 0);
4573 make_decl_rtl (ftn_main);
4574 init_function_start (ftn_main);
4577 gfc_init_block (&body);
4579 /* Call some libgfortran initialization routines, call then MAIN__(). */
4581 /* Call _gfortran_caf_init (*argc, ***argv, *this_image, *num_images). */
4582 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
4584 tree pint_type, pppchar_type;
4585 pint_type = build_pointer_type (integer_type_node);
4587 = build_pointer_type (build_pointer_type (pchar_type_node));
4589 gfc_init_coarray_decl ();
4590 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_init, 4,
4591 gfc_build_addr_expr (pint_type, argc),
4592 gfc_build_addr_expr (pppchar_type, argv),
4593 gfc_build_addr_expr (pint_type, gfort_gvar_caf_this_image),
4594 gfc_build_addr_expr (pint_type, gfort_gvar_caf_num_images));
4595 gfc_add_expr_to_block (&body, tmp);
4598 /* Call _gfortran_set_args (argc, argv). */
4599 TREE_USED (argc) = 1;
4600 TREE_USED (argv) = 1;
4601 tmp = build_call_expr_loc (input_location,
4602 gfor_fndecl_set_args, 2, argc, argv);
4603 gfc_add_expr_to_block (&body, tmp);
4605 /* Add a call to set_options to set up the runtime library Fortran
4606 language standard parameters. */
4608 tree array_type, array, var;
4609 VEC(constructor_elt,gc) *v = NULL;
4611 /* Passing a new option to the library requires four modifications:
4612 + add it to the tree_cons list below
4613 + change the array size in the call to build_array_type
4614 + change the first argument to the library call
4615 gfor_fndecl_set_options
4616 + modify the library (runtime/compile_options.c)! */
4618 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4619 build_int_cst (integer_type_node,
4620 gfc_option.warn_std));
4621 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4622 build_int_cst (integer_type_node,
4623 gfc_option.allow_std));
4624 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4625 build_int_cst (integer_type_node, pedantic));
4626 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4627 build_int_cst (integer_type_node,
4628 gfc_option.flag_dump_core));
4629 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4630 build_int_cst (integer_type_node,
4631 gfc_option.flag_backtrace));
4632 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4633 build_int_cst (integer_type_node,
4634 gfc_option.flag_sign_zero));
4635 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4636 build_int_cst (integer_type_node,
4638 & GFC_RTCHECK_BOUNDS)));
4639 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
4640 build_int_cst (integer_type_node,
4641 gfc_option.flag_range_check));
4643 array_type = build_array_type (integer_type_node,
4644 build_index_type (build_int_cst (NULL_TREE, 7)));
4645 array = build_constructor (array_type, v);
4646 TREE_CONSTANT (array) = 1;
4647 TREE_STATIC (array) = 1;
4649 /* Create a static variable to hold the jump table. */
4650 var = gfc_create_var (array_type, "options");
4651 TREE_CONSTANT (var) = 1;
4652 TREE_STATIC (var) = 1;
4653 TREE_READONLY (var) = 1;
4654 DECL_INITIAL (var) = array;
4655 var = gfc_build_addr_expr (build_pointer_type (integer_type_node), var);
4657 tmp = build_call_expr_loc (input_location,
4658 gfor_fndecl_set_options, 2,
4659 build_int_cst (integer_type_node, 8), var);
4660 gfc_add_expr_to_block (&body, tmp);
4663 /* If -ffpe-trap option was provided, add a call to set_fpe so that
4664 the library will raise a FPE when needed. */
4665 if (gfc_option.fpe != 0)
4667 tmp = build_call_expr_loc (input_location,
4668 gfor_fndecl_set_fpe, 1,
4669 build_int_cst (integer_type_node,
4671 gfc_add_expr_to_block (&body, tmp);
4674 /* If this is the main program and an -fconvert option was provided,
4675 add a call to set_convert. */
4677 if (gfc_option.convert != GFC_CONVERT_NATIVE)
4679 tmp = build_call_expr_loc (input_location,
4680 gfor_fndecl_set_convert, 1,
4681 build_int_cst (integer_type_node,
4682 gfc_option.convert));
4683 gfc_add_expr_to_block (&body, tmp);
4686 /* If this is the main program and an -frecord-marker option was provided,
4687 add a call to set_record_marker. */
4689 if (gfc_option.record_marker != 0)
4691 tmp = build_call_expr_loc (input_location,
4692 gfor_fndecl_set_record_marker, 1,
4693 build_int_cst (integer_type_node,
4694 gfc_option.record_marker));
4695 gfc_add_expr_to_block (&body, tmp);
4698 if (gfc_option.max_subrecord_length != 0)
4700 tmp = build_call_expr_loc (input_location,
4701 gfor_fndecl_set_max_subrecord_length, 1,
4702 build_int_cst (integer_type_node,
4703 gfc_option.max_subrecord_length));
4704 gfc_add_expr_to_block (&body, tmp);
4707 /* Call MAIN__(). */
4708 tmp = build_call_expr_loc (input_location,
4710 gfc_add_expr_to_block (&body, tmp);
4712 /* Mark MAIN__ as used. */
4713 TREE_USED (fndecl) = 1;
4715 /* Coarray: Call _gfortran_caf_finalize(void). */
4716 if (gfc_option.coarray == GFC_FCOARRAY_LIB)
4718 /* Per F2008, 8.5.1 END of the main program implies a
4720 tmp = built_in_decls [BUILT_IN_SYNCHRONIZE];
4721 tmp = build_call_expr_loc (input_location, tmp, 0);
4722 gfc_add_expr_to_block (&body, tmp);
4724 tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_finalize, 0);
4725 gfc_add_expr_to_block (&body, tmp);
4729 tmp = fold_build2_loc (input_location, MODIFY_EXPR, integer_type_node,
4730 DECL_RESULT (ftn_main),
4731 build_int_cst (integer_type_node, 0));
4732 tmp = build1_v (RETURN_EXPR, tmp);
4733 gfc_add_expr_to_block (&body, tmp);
4736 DECL_SAVED_TREE (ftn_main) = gfc_finish_block (&body);
4739 /* Finish off this function and send it for code generation. */
4741 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main)) = ftn_main;
4743 DECL_SAVED_TREE (ftn_main)
4744 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (ftn_main),
4745 DECL_INITIAL (ftn_main));
4747 /* Output the GENERIC tree. */
4748 dump_function (TDI_original, ftn_main);
4750 cgraph_finalize_function (ftn_main, true);
4754 pop_function_context ();
4755 saved_function_decls = saved_parent_function_decls;
4757 current_function_decl = old_context;
4761 /* Get the result expression for a procedure. */
4764 get_proc_result (gfc_symbol* sym)
4766 if (sym->attr.subroutine || sym == sym->result)
4768 if (current_fake_result_decl != NULL)
4769 return TREE_VALUE (current_fake_result_decl);
4774 return sym->result->backend_decl;
4778 /* Generate an appropriate return-statement for a procedure. */
4781 gfc_generate_return (void)
4787 sym = current_procedure_symbol;
4788 fndecl = sym->backend_decl;
4790 if (TREE_TYPE (DECL_RESULT (fndecl)) == void_type_node)
4794 result = get_proc_result (sym);
4796 /* Set the return value to the dummy result variable. The
4797 types may be different for scalar default REAL functions
4798 with -ff2c, therefore we have to convert. */
4799 if (result != NULL_TREE)
4801 result = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
4802 result = fold_build2_loc (input_location, MODIFY_EXPR,
4803 TREE_TYPE (result), DECL_RESULT (fndecl),
4808 return build1_v (RETURN_EXPR, result);
4812 /* Generate code for a function. */
4815 gfc_generate_function_code (gfc_namespace * ns)
4821 stmtblock_t init, cleanup;
4823 gfc_wrapped_block try_block;
4824 tree recurcheckvar = NULL_TREE;
4826 gfc_symbol *previous_procedure_symbol;
4830 sym = ns->proc_name;
4831 previous_procedure_symbol = current_procedure_symbol;
4832 current_procedure_symbol = sym;
4834 /* Check that the frontend isn't still using this. */
4835 gcc_assert (sym->tlink == NULL);
4838 /* Create the declaration for functions with global scope. */
4839 if (!sym->backend_decl)
4840 gfc_create_function_decl (ns, false);
4842 fndecl = sym->backend_decl;
4843 old_context = current_function_decl;
4847 push_function_context ();
4848 saved_parent_function_decls = saved_function_decls;
4849 saved_function_decls = NULL_TREE;
4852 trans_function_start (sym);
4854 gfc_init_block (&init);
4856 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
4858 /* Copy length backend_decls to all entry point result
4863 gfc_conv_const_charlen (ns->proc_name->ts.u.cl);
4864 backend_decl = ns->proc_name->result->ts.u.cl->backend_decl;
4865 for (el = ns->entries; el; el = el->next)
4866 el->sym->result->ts.u.cl->backend_decl = backend_decl;
4869 /* Translate COMMON blocks. */
4870 gfc_trans_common (ns);
4872 /* Null the parent fake result declaration if this namespace is
4873 a module function or an external procedures. */
4874 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
4875 || ns->parent == NULL)
4876 parent_fake_result_decl = NULL_TREE;
4878 gfc_generate_contained_functions (ns);
4880 nonlocal_dummy_decls = NULL;
4881 nonlocal_dummy_decl_pset = NULL;
4883 generate_local_vars (ns);
4885 /* Keep the parent fake result declaration in module functions
4886 or external procedures. */
4887 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
4888 || ns->parent == NULL)
4889 current_fake_result_decl = parent_fake_result_decl;
4891 current_fake_result_decl = NULL_TREE;
4893 is_recursive = sym->attr.recursive
4894 || (sym->attr.entry_master
4895 && sym->ns->entries->sym->attr.recursive);
4896 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
4898 && !gfc_option.flag_recursive)
4902 asprintf (&msg, "Recursive call to nonrecursive procedure '%s'",
4904 recurcheckvar = gfc_create_var (boolean_type_node, "is_recursive");
4905 TREE_STATIC (recurcheckvar) = 1;
4906 DECL_INITIAL (recurcheckvar) = boolean_false_node;
4907 gfc_add_expr_to_block (&init, recurcheckvar);
4908 gfc_trans_runtime_check (true, false, recurcheckvar, &init,
4909 &sym->declared_at, msg);
4910 gfc_add_modify (&init, recurcheckvar, boolean_true_node);
4914 /* Now generate the code for the body of this function. */
4915 gfc_init_block (&body);
4917 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
4918 && sym->attr.subroutine)
4920 tree alternate_return;
4921 alternate_return = gfc_get_fake_result_decl (sym, 0);
4922 gfc_add_modify (&body, alternate_return, integer_zero_node);
4927 /* Jump to the correct entry point. */
4928 tmp = gfc_trans_entry_master_switch (ns->entries);
4929 gfc_add_expr_to_block (&body, tmp);
4932 /* If bounds-checking is enabled, generate code to check passed in actual
4933 arguments against the expected dummy argument attributes (e.g. string
4935 if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !sym->attr.is_bind_c)
4936 add_argument_checking (&body, sym);
4938 tmp = gfc_trans_code (ns->code);
4939 gfc_add_expr_to_block (&body, tmp);
4941 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
4943 tree result = get_proc_result (sym);
4945 if (result != NULL_TREE
4946 && sym->attr.function
4947 && !sym->attr.pointer)
4949 if (sym->attr.allocatable && sym->attr.dimension == 0
4950 && sym->result == sym)
4951 gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
4952 null_pointer_node));
4953 else if (sym->ts.type == BT_DERIVED
4954 && sym->ts.u.derived->attr.alloc_comp
4955 && !sym->attr.allocatable)
4957 rank = sym->as ? sym->as->rank : 0;
4958 tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, result, rank);
4959 gfc_add_expr_to_block (&init, tmp);
4963 if (result == NULL_TREE)
4965 /* TODO: move to the appropriate place in resolve.c. */
4966 if (warn_return_type && !sym->attr.referenced && sym == sym->result)
4967 gfc_warning ("Return value of function '%s' at %L not set",
4968 sym->name, &sym->declared_at);
4970 TREE_NO_WARNING(sym->backend_decl) = 1;
4973 gfc_add_expr_to_block (&body, gfc_generate_return ());
4976 gfc_init_block (&cleanup);
4978 /* Reset recursion-check variable. */
4979 if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
4981 && !gfc_option.gfc_flag_openmp
4982 && recurcheckvar != NULL_TREE)
4984 gfc_add_modify (&cleanup, recurcheckvar, boolean_false_node);
4985 recurcheckvar = NULL;
4988 /* Finish the function body and add init and cleanup code. */
4989 tmp = gfc_finish_block (&body);
4990 gfc_start_wrapped_block (&try_block, tmp);
4991 /* Add code to create and cleanup arrays. */
4992 gfc_trans_deferred_vars (sym, &try_block);
4993 gfc_add_init_cleanup (&try_block, gfc_finish_block (&init),
4994 gfc_finish_block (&cleanup));
4996 /* Add all the decls we created during processing. */
4997 decl = saved_function_decls;
5002 next = DECL_CHAIN (decl);
5003 DECL_CHAIN (decl) = NULL_TREE;
5007 saved_function_decls = NULL_TREE;
5009 DECL_SAVED_TREE (fndecl) = gfc_finish_wrapped_block (&try_block);
5012 /* Finish off this function and send it for code generation. */
5014 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5016 DECL_SAVED_TREE (fndecl)
5017 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5018 DECL_INITIAL (fndecl));
5020 if (nonlocal_dummy_decls)
5022 BLOCK_VARS (DECL_INITIAL (fndecl))
5023 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl)), nonlocal_dummy_decls);
5024 pointer_set_destroy (nonlocal_dummy_decl_pset);
5025 nonlocal_dummy_decls = NULL;
5026 nonlocal_dummy_decl_pset = NULL;
5029 /* Output the GENERIC tree. */
5030 dump_function (TDI_original, fndecl);
5032 /* Store the end of the function, so that we get good line number
5033 info for the epilogue. */
5034 cfun->function_end_locus = input_location;
5036 /* We're leaving the context of this function, so zap cfun.
5037 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5038 tree_rest_of_compilation. */
5043 pop_function_context ();
5044 saved_function_decls = saved_parent_function_decls;
5046 current_function_decl = old_context;
5048 if (decl_function_context (fndecl))
5049 /* Register this function with cgraph just far enough to get it
5050 added to our parent's nested function list. */
5051 (void) cgraph_node (fndecl);
5053 cgraph_finalize_function (fndecl, true);
5055 gfc_trans_use_stmts (ns);
5056 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
5058 if (sym->attr.is_main_program)
5059 create_main_function (fndecl);
5061 current_procedure_symbol = previous_procedure_symbol;
5066 gfc_generate_constructors (void)
5068 gcc_assert (gfc_static_ctors == NULL_TREE);
5076 if (gfc_static_ctors == NULL_TREE)
5079 fnname = get_file_function_name ("I");
5080 type = build_function_type_list (void_type_node, NULL_TREE);
5082 fndecl = build_decl (input_location,
5083 FUNCTION_DECL, fnname, type);
5084 TREE_PUBLIC (fndecl) = 1;
5086 decl = build_decl (input_location,
5087 RESULT_DECL, NULL_TREE, void_type_node);
5088 DECL_ARTIFICIAL (decl) = 1;
5089 DECL_IGNORED_P (decl) = 1;
5090 DECL_CONTEXT (decl) = fndecl;
5091 DECL_RESULT (fndecl) = decl;
5095 current_function_decl = fndecl;
5097 rest_of_decl_compilation (fndecl, 1, 0);
5099 make_decl_rtl (fndecl);
5101 init_function_start (fndecl);
5105 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
5107 tmp = build_call_expr_loc (input_location,
5108 TREE_VALUE (gfc_static_ctors), 0);
5109 DECL_SAVED_TREE (fndecl) = build_stmt (input_location, EXPR_STMT, tmp);
5115 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5116 DECL_SAVED_TREE (fndecl)
5117 = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
5118 DECL_INITIAL (fndecl));
5120 free_after_parsing (cfun);
5121 free_after_compilation (cfun);
5123 tree_rest_of_compilation (fndecl);
5125 current_function_decl = NULL_TREE;
5129 /* Translates a BLOCK DATA program unit. This means emitting the
5130 commons contained therein plus their initializations. We also emit
5131 a globally visible symbol to make sure that each BLOCK DATA program
5132 unit remains unique. */
5135 gfc_generate_block_data (gfc_namespace * ns)
5140 /* Tell the backend the source location of the block data. */
5142 gfc_set_backend_locus (&ns->proc_name->declared_at);
5144 gfc_set_backend_locus (&gfc_current_locus);
5146 /* Process the DATA statements. */
5147 gfc_trans_common (ns);
5149 /* Create a global symbol with the mane of the block data. This is to
5150 generate linker errors if the same name is used twice. It is never
5153 id = gfc_sym_mangled_function_id (ns->proc_name);
5155 id = get_identifier ("__BLOCK_DATA__");
5157 decl = build_decl (input_location,
5158 VAR_DECL, id, gfc_array_index_type);
5159 TREE_PUBLIC (decl) = 1;
5160 TREE_STATIC (decl) = 1;
5161 DECL_IGNORED_P (decl) = 1;
5164 rest_of_decl_compilation (decl, 1, 0);
5168 /* Process the local variables of a BLOCK construct. */
5171 gfc_process_block_locals (gfc_namespace* ns)
5175 gcc_assert (saved_local_decls == NULL_TREE);
5176 generate_local_vars (ns);
5178 decl = saved_local_decls;
5183 next = DECL_CHAIN (decl);
5184 DECL_CHAIN (decl) = NULL_TREE;
5188 saved_local_decls = NULL_TREE;
5192 #include "gt-fortran-trans-decl.h"