1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
4 Contributed by Paul Brook
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
23 /* trans-decl.c -- Handling of backend function and variable decls, etc */
27 #include "coretypes.h"
29 #include "tree-dump.h"
30 #include "tree-gimple.h"
41 #include "trans-types.h"
42 #include "trans-array.h"
43 #include "trans-const.h"
44 /* Only for gfc_trans_code. Shouldn't need to include this. */
45 #include "trans-stmt.h"
47 #define MAX_LABEL_VALUE 99999
50 /* Holds the result of the function if no result variable specified. */
52 static GTY(()) tree current_fake_result_decl;
53 static GTY(()) tree parent_fake_result_decl;
55 static GTY(()) tree current_function_return_label;
58 /* Holds the variable DECLs for the current function. */
60 static GTY(()) tree saved_function_decls;
61 static GTY(()) tree saved_parent_function_decls;
64 /* The namespace of the module we're currently generating. Only used while
65 outputting decls for module variables. Do not rely on this being set. */
67 static gfc_namespace *module_namespace;
70 /* List of static constructor functions. */
72 tree gfc_static_ctors;
75 /* Function declarations for builtin library functions. */
77 tree gfor_fndecl_internal_malloc;
78 tree gfor_fndecl_internal_malloc64;
79 tree gfor_fndecl_internal_realloc;
80 tree gfor_fndecl_internal_realloc64;
81 tree gfor_fndecl_internal_free;
82 tree gfor_fndecl_allocate;
83 tree gfor_fndecl_allocate64;
84 tree gfor_fndecl_allocate_array;
85 tree gfor_fndecl_allocate64_array;
86 tree gfor_fndecl_deallocate;
87 tree gfor_fndecl_pause_numeric;
88 tree gfor_fndecl_pause_string;
89 tree gfor_fndecl_stop_numeric;
90 tree gfor_fndecl_stop_string;
91 tree gfor_fndecl_select_string;
92 tree gfor_fndecl_runtime_error;
93 tree gfor_fndecl_set_fpe;
94 tree gfor_fndecl_set_std;
95 tree gfor_fndecl_set_convert;
96 tree gfor_fndecl_set_record_marker;
97 tree gfor_fndecl_ctime;
98 tree gfor_fndecl_fdate;
99 tree gfor_fndecl_ttynam;
100 tree gfor_fndecl_in_pack;
101 tree gfor_fndecl_in_unpack;
102 tree gfor_fndecl_associated;
105 /* Math functions. Many other math functions are handled in
106 trans-intrinsic.c. */
108 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
109 tree gfor_fndecl_math_cpowf;
110 tree gfor_fndecl_math_cpow;
111 tree gfor_fndecl_math_cpowl10;
112 tree gfor_fndecl_math_cpowl16;
113 tree gfor_fndecl_math_ishftc4;
114 tree gfor_fndecl_math_ishftc8;
115 tree gfor_fndecl_math_ishftc16;
116 tree gfor_fndecl_math_exponent4;
117 tree gfor_fndecl_math_exponent8;
118 tree gfor_fndecl_math_exponent10;
119 tree gfor_fndecl_math_exponent16;
122 /* String functions. */
124 tree gfor_fndecl_compare_string;
125 tree gfor_fndecl_concat_string;
126 tree gfor_fndecl_string_len_trim;
127 tree gfor_fndecl_string_index;
128 tree gfor_fndecl_string_scan;
129 tree gfor_fndecl_string_verify;
130 tree gfor_fndecl_string_trim;
131 tree gfor_fndecl_string_repeat;
132 tree gfor_fndecl_adjustl;
133 tree gfor_fndecl_adjustr;
136 /* Other misc. runtime library functions. */
138 tree gfor_fndecl_size0;
139 tree gfor_fndecl_size1;
140 tree gfor_fndecl_iargc;
142 /* Intrinsic functions implemented in FORTRAN. */
143 tree gfor_fndecl_si_kind;
144 tree gfor_fndecl_sr_kind;
148 gfc_add_decl_to_parent_function (tree decl)
151 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
152 DECL_NONLOCAL (decl) = 1;
153 TREE_CHAIN (decl) = saved_parent_function_decls;
154 saved_parent_function_decls = decl;
158 gfc_add_decl_to_function (tree decl)
161 TREE_USED (decl) = 1;
162 DECL_CONTEXT (decl) = current_function_decl;
163 TREE_CHAIN (decl) = saved_function_decls;
164 saved_function_decls = decl;
168 /* Build a backend label declaration. Set TREE_USED for named labels.
169 The context of the label is always the current_function_decl. All
170 labels are marked artificial. */
173 gfc_build_label_decl (tree label_id)
175 /* 2^32 temporaries should be enough. */
176 static unsigned int tmp_num = 1;
180 if (label_id == NULL_TREE)
182 /* Build an internal label name. */
183 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
184 label_id = get_identifier (label_name);
189 /* Build the LABEL_DECL node. Labels have no type. */
190 label_decl = build_decl (LABEL_DECL, label_id, void_type_node);
191 DECL_CONTEXT (label_decl) = current_function_decl;
192 DECL_MODE (label_decl) = VOIDmode;
194 /* We always define the label as used, even if the original source
195 file never references the label. We don't want all kinds of
196 spurious warnings for old-style Fortran code with too many
198 TREE_USED (label_decl) = 1;
200 DECL_ARTIFICIAL (label_decl) = 1;
205 /* Returns the return label for the current function. */
208 gfc_get_return_label (void)
210 char name[GFC_MAX_SYMBOL_LEN + 10];
212 if (current_function_return_label)
213 return current_function_return_label;
215 sprintf (name, "__return_%s",
216 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
218 current_function_return_label =
219 gfc_build_label_decl (get_identifier (name));
221 DECL_ARTIFICIAL (current_function_return_label) = 1;
223 return current_function_return_label;
227 /* Set the backend source location of a decl. */
230 gfc_set_decl_location (tree decl, locus * loc)
232 #ifdef USE_MAPPED_LOCATION
233 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
235 DECL_SOURCE_LINE (decl) = loc->lb->linenum;
236 DECL_SOURCE_FILE (decl) = loc->lb->file->filename;
241 /* Return the backend label declaration for a given label structure,
242 or create it if it doesn't exist yet. */
245 gfc_get_label_decl (gfc_st_label * lp)
247 if (lp->backend_decl)
248 return lp->backend_decl;
251 char label_name[GFC_MAX_SYMBOL_LEN + 1];
254 /* Validate the label declaration from the front end. */
255 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
257 /* Build a mangled name for the label. */
258 sprintf (label_name, "__label_%.6d", lp->value);
260 /* Build the LABEL_DECL node. */
261 label_decl = gfc_build_label_decl (get_identifier (label_name));
263 /* Tell the debugger where the label came from. */
264 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
265 gfc_set_decl_location (label_decl, &lp->where);
267 DECL_ARTIFICIAL (label_decl) = 1;
269 /* Store the label in the label list and return the LABEL_DECL. */
270 lp->backend_decl = label_decl;
276 /* Convert a gfc_symbol to an identifier of the same name. */
279 gfc_sym_identifier (gfc_symbol * sym)
281 return (get_identifier (sym->name));
285 /* Construct mangled name from symbol name. */
288 gfc_sym_mangled_identifier (gfc_symbol * sym)
290 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
292 if (sym->module == NULL)
293 return gfc_sym_identifier (sym);
296 snprintf (name, sizeof name, "__%s__%s", sym->module, sym->name);
297 return get_identifier (name);
302 /* Construct mangled function name from symbol name. */
305 gfc_sym_mangled_function_id (gfc_symbol * sym)
308 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
310 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
311 || (sym->module != NULL && sym->attr.if_source == IFSRC_IFBODY))
313 if (strcmp (sym->name, "MAIN__") == 0
314 || sym->attr.proc == PROC_INTRINSIC)
315 return get_identifier (sym->name);
317 if (gfc_option.flag_underscoring)
319 has_underscore = strchr (sym->name, '_') != 0;
320 if (gfc_option.flag_second_underscore && has_underscore)
321 snprintf (name, sizeof name, "%s__", sym->name);
323 snprintf (name, sizeof name, "%s_", sym->name);
324 return get_identifier (name);
327 return get_identifier (sym->name);
331 snprintf (name, sizeof name, "__%s__%s", sym->module, sym->name);
332 return get_identifier (name);
337 /* Returns true if a variable of specified size should go on the stack. */
340 gfc_can_put_var_on_stack (tree size)
342 unsigned HOST_WIDE_INT low;
344 if (!INTEGER_CST_P (size))
347 if (gfc_option.flag_max_stack_var_size < 0)
350 if (TREE_INT_CST_HIGH (size) != 0)
353 low = TREE_INT_CST_LOW (size);
354 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
357 /* TODO: Set a per-function stack size limit. */
363 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
364 an expression involving its corresponding pointer. There are
365 2 cases; one for variable size arrays, and one for everything else,
366 because variable-sized arrays require one fewer level of
370 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
372 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
375 /* Parameters need to be dereferenced. */
376 if (sym->cp_pointer->attr.dummy)
377 ptr_decl = build_fold_indirect_ref (ptr_decl);
379 /* Check to see if we're dealing with a variable-sized array. */
380 if (sym->attr.dimension
381 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
383 /* These decls will be dereferenced later, so we don't dereference
385 value = convert (TREE_TYPE (decl), ptr_decl);
389 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
391 value = build_fold_indirect_ref (ptr_decl);
394 SET_DECL_VALUE_EXPR (decl, value);
395 DECL_HAS_VALUE_EXPR_P (decl) = 1;
396 GFC_DECL_CRAY_POINTEE (decl) = 1;
397 /* This is a fake variable just for debugging purposes. */
398 TREE_ASM_WRITTEN (decl) = 1;
402 /* Finish processing of a declaration and install its initial value. */
405 gfc_finish_decl (tree decl, tree init)
407 if (TREE_CODE (decl) == PARM_DECL)
408 gcc_assert (init == NULL_TREE);
409 /* Remember that PARM_DECL doesn't have a DECL_INITIAL field per se
410 -- it overlaps DECL_ARG_TYPE. */
411 else if (init == NULL_TREE)
412 gcc_assert (DECL_INITIAL (decl) == NULL_TREE);
414 gcc_assert (DECL_INITIAL (decl) == error_mark_node);
416 if (init != NULL_TREE)
418 if (TREE_CODE (decl) != TYPE_DECL)
419 DECL_INITIAL (decl) = init;
422 /* typedef foo = bar; store the type of bar as the type of foo. */
423 TREE_TYPE (decl) = TREE_TYPE (init);
424 DECL_INITIAL (decl) = init = 0;
428 if (TREE_CODE (decl) == VAR_DECL)
430 if (DECL_SIZE (decl) == NULL_TREE
431 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
432 layout_decl (decl, 0);
434 /* A static variable with an incomplete type is an error if it is
435 initialized. Also if it is not file scope. Otherwise, let it
436 through, but if it is not `extern' then it may cause an error
438 /* An automatic variable with an incomplete type is an error. */
439 if (DECL_SIZE (decl) == NULL_TREE
440 && (TREE_STATIC (decl) ? (DECL_INITIAL (decl) != 0
441 || DECL_CONTEXT (decl) != 0)
442 : !DECL_EXTERNAL (decl)))
444 gfc_fatal_error ("storage size not known");
447 if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
448 && (DECL_SIZE (decl) != 0)
449 && (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST))
451 gfc_fatal_error ("storage size not constant");
458 /* Apply symbol attributes to a variable, and add it to the function scope. */
461 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
463 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
464 This is the equivalent of the TARGET variables.
465 We also need to set this if the variable is passed by reference in a
468 /* Set DECL_VALUE_EXPR for Cray Pointees. */
469 if (sym->attr.cray_pointee)
470 gfc_finish_cray_pointee (decl, sym);
472 if (sym->attr.target)
473 TREE_ADDRESSABLE (decl) = 1;
474 /* If it wasn't used we wouldn't be getting it. */
475 TREE_USED (decl) = 1;
477 /* Chain this decl to the pending declarations. Don't do pushdecl()
478 because this would add them to the current scope rather than the
480 if (current_function_decl != NULL_TREE)
482 if (sym->ns->proc_name->backend_decl == current_function_decl
483 || sym->result == sym)
484 gfc_add_decl_to_function (decl);
486 gfc_add_decl_to_parent_function (decl);
489 if (sym->attr.cray_pointee)
492 /* If a variable is USE associated, it's always external. */
493 if (sym->attr.use_assoc)
495 DECL_EXTERNAL (decl) = 1;
496 TREE_PUBLIC (decl) = 1;
498 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
500 /* TODO: Don't set sym->module for result or dummy variables. */
501 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
502 /* This is the declaration of a module variable. */
503 TREE_PUBLIC (decl) = 1;
504 TREE_STATIC (decl) = 1;
507 if ((sym->attr.save || sym->attr.data || sym->value)
508 && !sym->attr.use_assoc)
509 TREE_STATIC (decl) = 1;
511 /* Keep variables larger than max-stack-var-size off stack. */
512 if (!sym->ns->proc_name->attr.recursive
513 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
514 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl)))
515 TREE_STATIC (decl) = 1;
517 /* Handle threadprivate variables. */
518 if (sym->attr.threadprivate && targetm.have_tls
519 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
520 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
524 /* Allocate the lang-specific part of a decl. */
527 gfc_allocate_lang_decl (tree decl)
529 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
530 ggc_alloc_cleared (sizeof (struct lang_decl));
533 /* Remember a symbol to generate initialization/cleanup code at function
537 gfc_defer_symbol_init (gfc_symbol * sym)
543 /* Don't add a symbol twice. */
547 last = head = sym->ns->proc_name;
550 /* Make sure that setup code for dummy variables which are used in the
551 setup of other variables is generated first. */
554 /* Find the first dummy arg seen after us, or the first non-dummy arg.
555 This is a circular list, so don't go past the head. */
557 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
563 /* Insert in between last and p. */
569 /* Create an array index type variable with function scope. */
572 create_index_var (const char * pfx, int nest)
576 decl = gfc_create_var_np (gfc_array_index_type, pfx);
578 gfc_add_decl_to_parent_function (decl);
580 gfc_add_decl_to_function (decl);
585 /* Create variables to hold all the non-constant bits of info for a
586 descriptorless array. Remember these in the lang-specific part of the
590 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
596 type = TREE_TYPE (decl);
598 /* We just use the descriptor, if there is one. */
599 if (GFC_DESCRIPTOR_TYPE_P (type))
602 gcc_assert (GFC_ARRAY_TYPE_P (type));
603 nest = (sym->ns->proc_name->backend_decl != current_function_decl)
604 && !sym->attr.contained;
606 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
608 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
609 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
610 /* Don't try to use the unknown bound for assumed shape arrays. */
611 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
612 && (sym->as->type != AS_ASSUMED_SIZE
613 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
614 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
616 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
617 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
619 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
621 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
624 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
626 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
629 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
630 && sym->as->type != AS_ASSUMED_SIZE)
631 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
633 if (POINTER_TYPE_P (type))
635 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
636 gcc_assert (TYPE_LANG_SPECIFIC (type)
637 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
638 type = TREE_TYPE (type);
641 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
645 size = build2 (MINUS_EXPR, gfc_array_index_type,
646 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
647 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
649 TYPE_DOMAIN (type) = range;
655 /* For some dummy arguments we don't use the actual argument directly.
656 Instead we create a local decl and use that. This allows us to perform
657 initialization, and construct full type information. */
660 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
670 if (sym->attr.pointer || sym->attr.allocatable)
673 /* Add to list of variables if not a fake result variable. */
674 if (sym->attr.result || sym->attr.dummy)
675 gfc_defer_symbol_init (sym);
677 type = TREE_TYPE (dummy);
678 gcc_assert (TREE_CODE (dummy) == PARM_DECL
679 && POINTER_TYPE_P (type));
681 /* Do we know the element size? */
682 known_size = sym->ts.type != BT_CHARACTER
683 || INTEGER_CST_P (sym->ts.cl->backend_decl);
685 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
687 /* For descriptorless arrays with known element size the actual
688 argument is sufficient. */
689 gcc_assert (GFC_ARRAY_TYPE_P (type));
690 gfc_build_qualified_array (dummy, sym);
694 type = TREE_TYPE (type);
695 if (GFC_DESCRIPTOR_TYPE_P (type))
697 /* Create a decriptorless array pointer. */
700 if (!gfc_option.flag_repack_arrays)
702 if (as->type == AS_ASSUMED_SIZE)
707 if (as->type == AS_EXPLICIT)
710 for (n = 0; n < as->rank; n++)
714 && as->upper[n]->expr_type == EXPR_CONSTANT
715 && as->lower[n]->expr_type == EXPR_CONSTANT))
723 type = gfc_typenode_for_spec (&sym->ts);
724 type = gfc_get_nodesc_array_type (type, sym->as, packed);
728 /* We now have an expression for the element size, so create a fully
729 qualified type. Reset sym->backend decl or this will just return the
731 DECL_ARTIFICIAL (sym->backend_decl) = 1;
732 sym->backend_decl = NULL_TREE;
733 type = gfc_sym_type (sym);
737 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
738 decl = build_decl (VAR_DECL, get_identifier (name), type);
740 DECL_ARTIFICIAL (decl) = 1;
741 TREE_PUBLIC (decl) = 0;
742 TREE_STATIC (decl) = 0;
743 DECL_EXTERNAL (decl) = 0;
745 /* We should never get deferred shape arrays here. We used to because of
747 gcc_assert (sym->as->type != AS_DEFERRED);
752 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
756 GFC_DECL_PACKED_ARRAY (decl) = 1;
760 gfc_build_qualified_array (decl, sym);
762 if (DECL_LANG_SPECIFIC (dummy))
763 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
765 gfc_allocate_lang_decl (decl);
767 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
769 if (sym->ns->proc_name->backend_decl == current_function_decl
770 || sym->attr.contained)
771 gfc_add_decl_to_function (decl);
773 gfc_add_decl_to_parent_function (decl);
779 /* Return a constant or a variable to use as a string length. Does not
780 add the decl to the current scope. */
783 gfc_create_string_length (gfc_symbol * sym)
787 gcc_assert (sym->ts.cl);
788 gfc_conv_const_charlen (sym->ts.cl);
790 if (sym->ts.cl->backend_decl == NULL_TREE)
792 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
794 /* Also prefix the mangled name. */
795 strcpy (&name[1], sym->name);
797 length = build_decl (VAR_DECL, get_identifier (name),
798 gfc_charlen_type_node);
799 DECL_ARTIFICIAL (length) = 1;
800 TREE_USED (length) = 1;
801 if (sym->ns->proc_name->tlink != NULL)
802 gfc_defer_symbol_init (sym);
803 sym->ts.cl->backend_decl = length;
806 return sym->ts.cl->backend_decl;
809 /* If a variable is assigned a label, we add another two auxiliary
813 gfc_add_assign_aux_vars (gfc_symbol * sym)
819 gcc_assert (sym->backend_decl);
821 decl = sym->backend_decl;
822 gfc_allocate_lang_decl (decl);
823 GFC_DECL_ASSIGN (decl) = 1;
824 length = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
825 gfc_charlen_type_node);
826 addr = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
828 gfc_finish_var_decl (length, sym);
829 gfc_finish_var_decl (addr, sym);
830 /* STRING_LENGTH is also used as flag. Less than -1 means that
831 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
832 target label's address. Otherwise, value is the length of a format string
833 and ASSIGN_ADDR is its address. */
834 if (TREE_STATIC (length))
835 DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
837 gfc_defer_symbol_init (sym);
839 GFC_DECL_STRING_LEN (decl) = length;
840 GFC_DECL_ASSIGN_ADDR (decl) = addr;
843 /* Return the decl for a gfc_symbol, create it if it doesn't already
847 gfc_get_symbol_decl (gfc_symbol * sym)
850 tree length = NULL_TREE;
853 gcc_assert (sym->attr.referenced
854 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY);
856 if (sym->ns && sym->ns->proc_name->attr.function)
857 byref = gfc_return_by_reference (sym->ns->proc_name);
861 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
863 /* Return via extra parameter. */
864 if (sym->attr.result && byref
865 && !sym->backend_decl)
868 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
869 /* For entry master function skip over the __entry
871 if (sym->ns->proc_name->attr.entry_master)
872 sym->backend_decl = TREE_CHAIN (sym->backend_decl);
875 /* Dummy variables should already have been created. */
876 gcc_assert (sym->backend_decl);
878 /* Create a character length variable. */
879 if (sym->ts.type == BT_CHARACTER)
881 if (sym->ts.cl->backend_decl == NULL_TREE)
882 length = gfc_create_string_length (sym);
884 length = sym->ts.cl->backend_decl;
885 if (TREE_CODE (length) == VAR_DECL
886 && DECL_CONTEXT (length) == NULL_TREE)
888 /* Add the string length to the same context as the symbol. */
889 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
890 gfc_add_decl_to_function (length);
892 gfc_add_decl_to_parent_function (length);
894 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
895 DECL_CONTEXT (length));
897 gfc_defer_symbol_init (sym);
901 /* Use a copy of the descriptor for dummy arrays. */
902 if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
904 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
905 /* Prevent the dummy from being detected as unused if it is copied. */
906 if (sym->backend_decl != NULL && decl != sym->backend_decl)
907 DECL_ARTIFICIAL (sym->backend_decl) = 1;
908 sym->backend_decl = decl;
911 TREE_USED (sym->backend_decl) = 1;
912 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
914 gfc_add_assign_aux_vars (sym);
916 return sym->backend_decl;
919 if (sym->backend_decl)
920 return sym->backend_decl;
922 /* Catch function declarations. Only used for actual parameters. */
923 if (sym->attr.flavor == FL_PROCEDURE)
925 decl = gfc_get_extern_function_decl (sym);
929 if (sym->attr.intrinsic)
930 internal_error ("intrinsic variable which isn't a procedure");
932 /* Create string length decl first so that they can be used in the
934 if (sym->ts.type == BT_CHARACTER)
935 length = gfc_create_string_length (sym);
937 /* Create the decl for the variable. */
938 decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
940 gfc_set_decl_location (decl, &sym->declared_at);
942 /* Symbols from modules should have their assembler names mangled.
943 This is done here rather than in gfc_finish_var_decl because it
944 is different for string length variables. */
946 SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym));
948 if (sym->attr.dimension)
950 /* Create variables to hold the non-constant bits of array info. */
951 gfc_build_qualified_array (decl, sym);
953 /* Remember this variable for allocation/cleanup. */
954 gfc_defer_symbol_init (sym);
956 if ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer)
957 GFC_DECL_PACKED_ARRAY (decl) = 1;
960 gfc_finish_var_decl (decl, sym);
962 if (sym->ts.type == BT_CHARACTER)
964 /* Character variables need special handling. */
965 gfc_allocate_lang_decl (decl);
967 if (TREE_CODE (length) != INTEGER_CST)
969 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
973 /* Also prefix the mangled name for symbols from modules. */
974 strcpy (&name[1], sym->name);
977 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
978 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (name));
980 gfc_finish_var_decl (length, sym);
981 gcc_assert (!sym->value);
984 sym->backend_decl = decl;
986 if (sym->attr.assign)
988 gfc_add_assign_aux_vars (sym);
991 if (TREE_STATIC (decl) && !sym->attr.use_assoc)
993 /* Add static initializer. */
994 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
995 TREE_TYPE (decl), sym->attr.dimension,
996 sym->attr.pointer || sym->attr.allocatable);
1003 /* Substitute a temporary variable in place of the real one. */
1006 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1008 save->attr = sym->attr;
1009 save->decl = sym->backend_decl;
1011 gfc_clear_attr (&sym->attr);
1012 sym->attr.referenced = 1;
1013 sym->attr.flavor = FL_VARIABLE;
1015 sym->backend_decl = decl;
1019 /* Restore the original variable. */
1022 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1024 sym->attr = save->attr;
1025 sym->backend_decl = save->decl;
1029 /* Get a basic decl for an external function. */
1032 gfc_get_extern_function_decl (gfc_symbol * sym)
1037 gfc_intrinsic_sym *isym;
1039 char s[GFC_MAX_SYMBOL_LEN + 13]; /* "f2c_specific" and '\0'. */
1043 if (sym->backend_decl)
1044 return sym->backend_decl;
1046 /* We should never be creating external decls for alternate entry points.
1047 The procedure may be an alternate entry point, but we don't want/need
1049 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1051 if (sym->attr.intrinsic)
1053 /* Call the resolution function to get the actual name. This is
1054 a nasty hack which relies on the resolution functions only looking
1055 at the first argument. We pass NULL for the second argument
1056 otherwise things like AINT get confused. */
1057 isym = gfc_find_function (sym->name);
1058 gcc_assert (isym->resolve.f0 != NULL);
1060 memset (&e, 0, sizeof (e));
1061 e.expr_type = EXPR_FUNCTION;
1063 memset (&argexpr, 0, sizeof (argexpr));
1064 gcc_assert (isym->formal);
1065 argexpr.ts = isym->formal->ts;
1067 if (isym->formal->next == NULL)
1068 isym->resolve.f1 (&e, &argexpr);
1071 /* All specific intrinsics take one or two arguments. */
1072 gcc_assert (isym->formal->next->next == NULL);
1073 isym->resolve.f2 (&e, &argexpr, NULL);
1076 if (gfc_option.flag_f2c
1077 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1078 || e.ts.type == BT_COMPLEX))
1080 /* Specific which needs a different implementation if f2c
1081 calling conventions are used. */
1082 sprintf (s, "f2c_specific%s", e.value.function.name);
1085 sprintf (s, "specific%s", e.value.function.name);
1087 name = get_identifier (s);
1088 mangled_name = name;
1092 name = gfc_sym_identifier (sym);
1093 mangled_name = gfc_sym_mangled_function_id (sym);
1096 type = gfc_get_function_type (sym);
1097 fndecl = build_decl (FUNCTION_DECL, name, type);
1099 SET_DECL_ASSEMBLER_NAME (fndecl, mangled_name);
1100 /* If the return type is a pointer, avoid alias issues by setting
1101 DECL_IS_MALLOC to nonzero. This means that the function should be
1102 treated as if it were a malloc, meaning it returns a pointer that
1104 if (POINTER_TYPE_P (type))
1105 DECL_IS_MALLOC (fndecl) = 1;
1107 /* Set the context of this decl. */
1108 if (0 && sym->ns && sym->ns->proc_name)
1110 /* TODO: Add external decls to the appropriate scope. */
1111 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1115 /* Global declaration, e.g. intrinsic subroutine. */
1116 DECL_CONTEXT (fndecl) = NULL_TREE;
1119 DECL_EXTERNAL (fndecl) = 1;
1121 /* This specifies if a function is globally addressable, i.e. it is
1122 the opposite of declaring static in C. */
1123 TREE_PUBLIC (fndecl) = 1;
1125 /* Set attributes for PURE functions. A call to PURE function in the
1126 Fortran 95 sense is both pure and without side effects in the C
1128 if (sym->attr.pure || sym->attr.elemental)
1130 if (sym->attr.function && !gfc_return_by_reference (sym))
1131 DECL_IS_PURE (fndecl) = 1;
1132 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1133 parameters and don't use alternate returns (is this
1134 allowed?). In that case, calls to them are meaningless, and
1135 can be optimized away. See also in build_function_decl(). */
1136 TREE_SIDE_EFFECTS (fndecl) = 0;
1139 /* Mark non-returning functions. */
1140 if (sym->attr.noreturn)
1141 TREE_THIS_VOLATILE(fndecl) = 1;
1143 sym->backend_decl = fndecl;
1145 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1146 pushdecl_top_level (fndecl);
1152 /* Create a declaration for a procedure. For external functions (in the C
1153 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1154 a master function with alternate entry points. */
1157 build_function_decl (gfc_symbol * sym)
1160 symbol_attribute attr;
1162 gfc_formal_arglist *f;
1164 gcc_assert (!sym->backend_decl);
1165 gcc_assert (!sym->attr.external);
1167 /* Set the line and filename. sym->declared_at seems to point to the
1168 last statement for subroutines, but it'll do for now. */
1169 gfc_set_backend_locus (&sym->declared_at);
1171 /* Allow only one nesting level. Allow public declarations. */
1172 gcc_assert (current_function_decl == NULL_TREE
1173 || DECL_CONTEXT (current_function_decl) == NULL_TREE);
1175 type = gfc_get_function_type (sym);
1176 fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type);
1178 /* Perform name mangling if this is a top level or module procedure. */
1179 if (current_function_decl == NULL_TREE)
1180 SET_DECL_ASSEMBLER_NAME (fndecl, gfc_sym_mangled_function_id (sym));
1182 /* Figure out the return type of the declared function, and build a
1183 RESULT_DECL for it. If this is a subroutine with alternate
1184 returns, build a RESULT_DECL for it. */
1187 result_decl = NULL_TREE;
1188 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1191 if (gfc_return_by_reference (sym))
1192 type = void_type_node;
1195 if (sym->result != sym)
1196 result_decl = gfc_sym_identifier (sym->result);
1198 type = TREE_TYPE (TREE_TYPE (fndecl));
1203 /* Look for alternate return placeholders. */
1204 int has_alternate_returns = 0;
1205 for (f = sym->formal; f; f = f->next)
1209 has_alternate_returns = 1;
1214 if (has_alternate_returns)
1215 type = integer_type_node;
1217 type = void_type_node;
1220 result_decl = build_decl (RESULT_DECL, result_decl, type);
1221 DECL_ARTIFICIAL (result_decl) = 1;
1222 DECL_IGNORED_P (result_decl) = 1;
1223 DECL_CONTEXT (result_decl) = fndecl;
1224 DECL_RESULT (fndecl) = result_decl;
1226 /* Don't call layout_decl for a RESULT_DECL.
1227 layout_decl (result_decl, 0); */
1229 /* If the return type is a pointer, avoid alias issues by setting
1230 DECL_IS_MALLOC to nonzero. This means that the function should be
1231 treated as if it were a malloc, meaning it returns a pointer that
1233 if (POINTER_TYPE_P (type))
1234 DECL_IS_MALLOC (fndecl) = 1;
1236 /* Set up all attributes for the function. */
1237 DECL_CONTEXT (fndecl) = current_function_decl;
1238 DECL_EXTERNAL (fndecl) = 0;
1240 /* This specifies if a function is globally visible, i.e. it is
1241 the opposite of declaring static in C. */
1242 if (DECL_CONTEXT (fndecl) == NULL_TREE
1243 && !sym->attr.entry_master)
1244 TREE_PUBLIC (fndecl) = 1;
1246 /* TREE_STATIC means the function body is defined here. */
1247 TREE_STATIC (fndecl) = 1;
1249 /* Set attributes for PURE functions. A call to a PURE function in the
1250 Fortran 95 sense is both pure and without side effects in the C
1252 if (attr.pure || attr.elemental)
1254 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1255 including a alternate return. In that case it can also be
1256 marked as PURE. See also in gfc_get_extern_function_decl(). */
1257 if (attr.function && !gfc_return_by_reference (sym))
1258 DECL_IS_PURE (fndecl) = 1;
1259 TREE_SIDE_EFFECTS (fndecl) = 0;
1262 /* Layout the function declaration and put it in the binding level
1263 of the current function. */
1266 sym->backend_decl = fndecl;
1270 /* Create the DECL_ARGUMENTS for a procedure. */
1273 create_function_arglist (gfc_symbol * sym)
1276 gfc_formal_arglist *f;
1277 tree typelist, hidden_typelist;
1278 tree arglist, hidden_arglist;
1282 fndecl = sym->backend_decl;
1284 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1285 the new FUNCTION_DECL node. */
1286 arglist = NULL_TREE;
1287 hidden_arglist = NULL_TREE;
1288 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1290 if (sym->attr.entry_master)
1292 type = TREE_VALUE (typelist);
1293 parm = build_decl (PARM_DECL, get_identifier ("__entry"), type);
1295 DECL_CONTEXT (parm) = fndecl;
1296 DECL_ARG_TYPE (parm) = type;
1297 TREE_READONLY (parm) = 1;
1298 gfc_finish_decl (parm, NULL_TREE);
1299 DECL_ARTIFICIAL (parm) = 1;
1301 arglist = chainon (arglist, parm);
1302 typelist = TREE_CHAIN (typelist);
1305 if (gfc_return_by_reference (sym))
1307 tree type = TREE_VALUE (typelist), length = NULL;
1309 if (sym->ts.type == BT_CHARACTER)
1311 /* Length of character result. */
1312 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1313 gcc_assert (len_type == gfc_charlen_type_node);
1315 length = build_decl (PARM_DECL,
1316 get_identifier (".__result"),
1318 if (!sym->ts.cl->length)
1320 sym->ts.cl->backend_decl = length;
1321 TREE_USED (length) = 1;
1323 gcc_assert (TREE_CODE (length) == PARM_DECL);
1324 DECL_CONTEXT (length) = fndecl;
1325 DECL_ARG_TYPE (length) = len_type;
1326 TREE_READONLY (length) = 1;
1327 DECL_ARTIFICIAL (length) = 1;
1328 gfc_finish_decl (length, NULL_TREE);
1329 if (sym->ts.cl->backend_decl == NULL
1330 || sym->ts.cl->backend_decl == length)
1335 if (sym->ts.cl->backend_decl == NULL)
1337 tree len = build_decl (VAR_DECL,
1338 get_identifier ("..__result"),
1339 gfc_charlen_type_node);
1340 DECL_ARTIFICIAL (len) = 1;
1341 TREE_USED (len) = 1;
1342 sym->ts.cl->backend_decl = len;
1345 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1346 arg = sym->result ? sym->result : sym;
1347 backend_decl = arg->backend_decl;
1348 /* Temporary clear it, so that gfc_sym_type creates complete
1350 arg->backend_decl = NULL;
1351 type = gfc_sym_type (arg);
1352 arg->backend_decl = backend_decl;
1353 type = build_reference_type (type);
1357 parm = build_decl (PARM_DECL, get_identifier ("__result"), type);
1359 DECL_CONTEXT (parm) = fndecl;
1360 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1361 TREE_READONLY (parm) = 1;
1362 DECL_ARTIFICIAL (parm) = 1;
1363 gfc_finish_decl (parm, NULL_TREE);
1365 arglist = chainon (arglist, parm);
1366 typelist = TREE_CHAIN (typelist);
1368 if (sym->ts.type == BT_CHARACTER)
1370 gfc_allocate_lang_decl (parm);
1371 arglist = chainon (arglist, length);
1372 typelist = TREE_CHAIN (typelist);
1376 hidden_typelist = typelist;
1377 for (f = sym->formal; f; f = f->next)
1378 if (f->sym != NULL) /* Ignore alternate returns. */
1379 hidden_typelist = TREE_CHAIN (hidden_typelist);
1381 for (f = sym->formal; f; f = f->next)
1383 char name[GFC_MAX_SYMBOL_LEN + 2];
1385 /* Ignore alternate returns. */
1389 type = TREE_VALUE (typelist);
1391 if (f->sym->ts.type == BT_CHARACTER)
1393 tree len_type = TREE_VALUE (hidden_typelist);
1394 tree length = NULL_TREE;
1395 gcc_assert (len_type == gfc_charlen_type_node);
1397 strcpy (&name[1], f->sym->name);
1399 length = build_decl (PARM_DECL, get_identifier (name), len_type);
1401 hidden_arglist = chainon (hidden_arglist, length);
1402 DECL_CONTEXT (length) = fndecl;
1403 DECL_ARTIFICIAL (length) = 1;
1404 DECL_ARG_TYPE (length) = len_type;
1405 TREE_READONLY (length) = 1;
1406 gfc_finish_decl (length, NULL_TREE);
1408 /* TODO: Check string lengths when -fbounds-check. */
1410 /* Use the passed value for assumed length variables. */
1411 if (!f->sym->ts.cl->length)
1413 TREE_USED (length) = 1;
1414 if (!f->sym->ts.cl->backend_decl)
1415 f->sym->ts.cl->backend_decl = length;
1418 /* there is already another variable using this
1419 gfc_charlen node, build a new one for this variable
1420 and chain it into the list of gfc_charlens.
1421 This happens for e.g. in the case
1423 since CHARACTER declarations on the same line share
1424 the same gfc_charlen node. */
1427 cl = gfc_get_charlen ();
1428 cl->backend_decl = length;
1429 cl->next = f->sym->ts.cl->next;
1430 f->sym->ts.cl->next = cl;
1435 hidden_typelist = TREE_CHAIN (hidden_typelist);
1437 if (f->sym->ts.cl->backend_decl == NULL
1438 || f->sym->ts.cl->backend_decl == length)
1440 if (f->sym->ts.cl->backend_decl == NULL)
1441 gfc_create_string_length (f->sym);
1443 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1444 if (f->sym->attr.flavor == FL_PROCEDURE)
1445 type = build_pointer_type (gfc_get_function_type (f->sym));
1447 type = gfc_sym_type (f->sym);
1451 /* For non-constant length array arguments, make sure they use
1452 a different type node from TYPE_ARG_TYPES type. */
1453 if (f->sym->attr.dimension
1454 && type == TREE_VALUE (typelist)
1455 && TREE_CODE (type) == POINTER_TYPE
1456 && GFC_ARRAY_TYPE_P (type)
1457 && f->sym->as->type != AS_ASSUMED_SIZE
1458 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
1460 if (f->sym->attr.flavor == FL_PROCEDURE)
1461 type = build_pointer_type (gfc_get_function_type (f->sym));
1463 type = gfc_sym_type (f->sym);
1466 /* Build a the argument declaration. */
1467 parm = build_decl (PARM_DECL, gfc_sym_identifier (f->sym), type);
1469 /* Fill in arg stuff. */
1470 DECL_CONTEXT (parm) = fndecl;
1471 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1472 /* All implementation args are read-only. */
1473 TREE_READONLY (parm) = 1;
1475 gfc_finish_decl (parm, NULL_TREE);
1477 f->sym->backend_decl = parm;
1479 arglist = chainon (arglist, parm);
1480 typelist = TREE_CHAIN (typelist);
1483 /* Add the hidden string length parameters. */
1484 arglist = chainon (arglist, hidden_arglist);
1486 gcc_assert (TREE_VALUE (hidden_typelist) == void_type_node);
1487 DECL_ARGUMENTS (fndecl) = arglist;
1490 /* Convert FNDECL's code to GIMPLE and handle any nested functions. */
1493 gfc_gimplify_function (tree fndecl)
1495 struct cgraph_node *cgn;
1497 gimplify_function_tree (fndecl);
1498 dump_function (TDI_generic, fndecl);
1500 /* Generate errors for structured block violations. */
1501 /* ??? Could be done as part of resolve_labels. */
1503 diagnose_omp_structured_block_errors (fndecl);
1505 /* Convert all nested functions to GIMPLE now. We do things in this order
1506 so that items like VLA sizes are expanded properly in the context of the
1507 correct function. */
1508 cgn = cgraph_node (fndecl);
1509 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1510 gfc_gimplify_function (cgn->decl);
1514 /* Do the setup necessary before generating the body of a function. */
1517 trans_function_start (gfc_symbol * sym)
1521 fndecl = sym->backend_decl;
1523 /* Let GCC know the current scope is this function. */
1524 current_function_decl = fndecl;
1526 /* Let the world know what we're about to do. */
1527 announce_function (fndecl);
1529 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1531 /* Create RTL for function declaration. */
1532 rest_of_decl_compilation (fndecl, 1, 0);
1535 /* Create RTL for function definition. */
1536 make_decl_rtl (fndecl);
1538 init_function_start (fndecl);
1540 /* Even though we're inside a function body, we still don't want to
1541 call expand_expr to calculate the size of a variable-sized array.
1542 We haven't necessarily assigned RTL to all variables yet, so it's
1543 not safe to try to expand expressions involving them. */
1544 cfun->x_dont_save_pending_sizes_p = 1;
1546 /* function.c requires a push at the start of the function. */
1550 /* Create thunks for alternate entry points. */
1553 build_entry_thunks (gfc_namespace * ns)
1555 gfc_formal_arglist *formal;
1556 gfc_formal_arglist *thunk_formal;
1558 gfc_symbol *thunk_sym;
1566 /* This should always be a toplevel function. */
1567 gcc_assert (current_function_decl == NULL_TREE);
1569 gfc_get_backend_locus (&old_loc);
1570 for (el = ns->entries; el; el = el->next)
1572 thunk_sym = el->sym;
1574 build_function_decl (thunk_sym);
1575 create_function_arglist (thunk_sym);
1577 trans_function_start (thunk_sym);
1579 thunk_fndecl = thunk_sym->backend_decl;
1581 gfc_start_block (&body);
1583 /* Pass extra parameter identifying this entry point. */
1584 tmp = build_int_cst (gfc_array_index_type, el->id);
1585 args = tree_cons (NULL_TREE, tmp, NULL_TREE);
1586 string_args = NULL_TREE;
1588 if (thunk_sym->attr.function)
1590 if (gfc_return_by_reference (ns->proc_name))
1592 tree ref = DECL_ARGUMENTS (current_function_decl);
1593 args = tree_cons (NULL_TREE, ref, args);
1594 if (ns->proc_name->ts.type == BT_CHARACTER)
1595 args = tree_cons (NULL_TREE, TREE_CHAIN (ref),
1600 for (formal = ns->proc_name->formal; formal; formal = formal->next)
1602 /* Ignore alternate returns. */
1603 if (formal->sym == NULL)
1606 /* We don't have a clever way of identifying arguments, so resort to
1607 a brute-force search. */
1608 for (thunk_formal = thunk_sym->formal;
1610 thunk_formal = thunk_formal->next)
1612 if (thunk_formal->sym == formal->sym)
1618 /* Pass the argument. */
1619 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
1620 args = tree_cons (NULL_TREE, thunk_formal->sym->backend_decl,
1622 if (formal->sym->ts.type == BT_CHARACTER)
1624 tmp = thunk_formal->sym->ts.cl->backend_decl;
1625 string_args = tree_cons (NULL_TREE, tmp, string_args);
1630 /* Pass NULL for a missing argument. */
1631 args = tree_cons (NULL_TREE, null_pointer_node, args);
1632 if (formal->sym->ts.type == BT_CHARACTER)
1634 tmp = build_int_cst (gfc_charlen_type_node, 0);
1635 string_args = tree_cons (NULL_TREE, tmp, string_args);
1640 /* Call the master function. */
1641 args = nreverse (args);
1642 args = chainon (args, nreverse (string_args));
1643 tmp = ns->proc_name->backend_decl;
1644 tmp = build_function_call_expr (tmp, args);
1645 if (ns->proc_name->attr.mixed_entry_master)
1647 tree union_decl, field;
1648 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
1650 union_decl = build_decl (VAR_DECL, get_identifier ("__result"),
1651 TREE_TYPE (master_type));
1652 DECL_ARTIFICIAL (union_decl) = 1;
1653 DECL_EXTERNAL (union_decl) = 0;
1654 TREE_PUBLIC (union_decl) = 0;
1655 TREE_USED (union_decl) = 1;
1656 layout_decl (union_decl, 0);
1657 pushdecl (union_decl);
1659 DECL_CONTEXT (union_decl) = current_function_decl;
1660 tmp = build2 (MODIFY_EXPR,
1661 TREE_TYPE (union_decl),
1663 gfc_add_expr_to_block (&body, tmp);
1665 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
1666 field; field = TREE_CHAIN (field))
1667 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1668 thunk_sym->result->name) == 0)
1670 gcc_assert (field != NULL_TREE);
1671 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), union_decl, field,
1673 tmp = build2 (MODIFY_EXPR,
1674 TREE_TYPE (DECL_RESULT (current_function_decl)),
1675 DECL_RESULT (current_function_decl), tmp);
1676 tmp = build1_v (RETURN_EXPR, tmp);
1678 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
1681 tmp = build2 (MODIFY_EXPR,
1682 TREE_TYPE (DECL_RESULT (current_function_decl)),
1683 DECL_RESULT (current_function_decl), tmp);
1684 tmp = build1_v (RETURN_EXPR, tmp);
1686 gfc_add_expr_to_block (&body, tmp);
1688 /* Finish off this function and send it for code generation. */
1689 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
1691 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
1693 /* Output the GENERIC tree. */
1694 dump_function (TDI_original, thunk_fndecl);
1696 /* Store the end of the function, so that we get good line number
1697 info for the epilogue. */
1698 cfun->function_end_locus = input_location;
1700 /* We're leaving the context of this function, so zap cfun.
1701 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1702 tree_rest_of_compilation. */
1705 current_function_decl = NULL_TREE;
1707 gfc_gimplify_function (thunk_fndecl);
1708 cgraph_finalize_function (thunk_fndecl, false);
1710 /* We share the symbols in the formal argument list with other entry
1711 points and the master function. Clear them so that they are
1712 recreated for each function. */
1713 for (formal = thunk_sym->formal; formal; formal = formal->next)
1714 if (formal->sym != NULL) /* Ignore alternate returns. */
1716 formal->sym->backend_decl = NULL_TREE;
1717 if (formal->sym->ts.type == BT_CHARACTER)
1718 formal->sym->ts.cl->backend_decl = NULL_TREE;
1721 if (thunk_sym->attr.function)
1723 if (thunk_sym->ts.type == BT_CHARACTER)
1724 thunk_sym->ts.cl->backend_decl = NULL_TREE;
1725 if (thunk_sym->result->ts.type == BT_CHARACTER)
1726 thunk_sym->result->ts.cl->backend_decl = NULL_TREE;
1730 gfc_set_backend_locus (&old_loc);
1734 /* Create a decl for a function, and create any thunks for alternate entry
1738 gfc_create_function_decl (gfc_namespace * ns)
1740 /* Create a declaration for the master function. */
1741 build_function_decl (ns->proc_name);
1743 /* Compile the entry thunks. */
1745 build_entry_thunks (ns);
1747 /* Now create the read argument list. */
1748 create_function_arglist (ns->proc_name);
1751 /* Return the decl used to hold the function return value. If
1752 parent_flag is set, the context is the parent_scope*/
1755 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
1759 tree this_fake_result_decl;
1760 tree this_function_decl;
1762 char name[GFC_MAX_SYMBOL_LEN + 10];
1766 this_fake_result_decl = parent_fake_result_decl;
1767 this_function_decl = DECL_CONTEXT (current_function_decl);
1771 this_fake_result_decl = current_fake_result_decl;
1772 this_function_decl = current_function_decl;
1776 && sym->ns->proc_name->backend_decl == this_function_decl
1777 && sym->ns->proc_name->attr.entry_master
1778 && sym != sym->ns->proc_name)
1781 if (this_fake_result_decl != NULL)
1782 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
1783 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
1786 return TREE_VALUE (t);
1787 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
1790 this_fake_result_decl = parent_fake_result_decl;
1792 this_fake_result_decl = current_fake_result_decl;
1794 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
1798 for (field = TYPE_FIELDS (TREE_TYPE (decl));
1799 field; field = TREE_CHAIN (field))
1800 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1804 gcc_assert (field != NULL_TREE);
1805 decl = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field,
1809 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
1811 gfc_add_decl_to_parent_function (var);
1813 gfc_add_decl_to_function (var);
1815 SET_DECL_VALUE_EXPR (var, decl);
1816 DECL_HAS_VALUE_EXPR_P (var) = 1;
1817 GFC_DECL_RESULT (var) = 1;
1819 TREE_CHAIN (this_fake_result_decl)
1820 = tree_cons (get_identifier (sym->name), var,
1821 TREE_CHAIN (this_fake_result_decl));
1825 if (this_fake_result_decl != NULL_TREE)
1826 return TREE_VALUE (this_fake_result_decl);
1828 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
1833 if (sym->ts.type == BT_CHARACTER)
1835 if (sym->ts.cl->backend_decl == NULL_TREE)
1836 length = gfc_create_string_length (sym);
1838 length = sym->ts.cl->backend_decl;
1839 if (TREE_CODE (length) == VAR_DECL
1840 && DECL_CONTEXT (length) == NULL_TREE)
1841 gfc_add_decl_to_function (length);
1844 if (gfc_return_by_reference (sym))
1846 decl = DECL_ARGUMENTS (this_function_decl);
1848 if (sym->ns->proc_name->backend_decl == this_function_decl
1849 && sym->ns->proc_name->attr.entry_master)
1850 decl = TREE_CHAIN (decl);
1852 TREE_USED (decl) = 1;
1854 decl = gfc_build_dummy_array_decl (sym, decl);
1858 sprintf (name, "__result_%.20s",
1859 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
1861 decl = build_decl (VAR_DECL, get_identifier (name),
1862 TREE_TYPE (TREE_TYPE (this_function_decl)));
1864 DECL_ARTIFICIAL (decl) = 1;
1865 DECL_EXTERNAL (decl) = 0;
1866 TREE_PUBLIC (decl) = 0;
1867 TREE_USED (decl) = 1;
1868 GFC_DECL_RESULT (decl) = 1;
1870 layout_decl (decl, 0);
1873 gfc_add_decl_to_parent_function (decl);
1875 gfc_add_decl_to_function (decl);
1879 parent_fake_result_decl = build_tree_list (NULL, decl);
1881 current_fake_result_decl = build_tree_list (NULL, decl);
1887 /* Builds a function decl. The remaining parameters are the types of the
1888 function arguments. Negative nargs indicates a varargs function. */
1891 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
1900 /* Library functions must be declared with global scope. */
1901 gcc_assert (current_function_decl == NULL_TREE);
1903 va_start (p, nargs);
1906 /* Create a list of the argument types. */
1907 for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
1909 argtype = va_arg (p, tree);
1910 arglist = gfc_chainon_list (arglist, argtype);
1915 /* Terminate the list. */
1916 arglist = gfc_chainon_list (arglist, void_type_node);
1919 /* Build the function type and decl. */
1920 fntype = build_function_type (rettype, arglist);
1921 fndecl = build_decl (FUNCTION_DECL, name, fntype);
1923 /* Mark this decl as external. */
1924 DECL_EXTERNAL (fndecl) = 1;
1925 TREE_PUBLIC (fndecl) = 1;
1931 rest_of_decl_compilation (fndecl, 1, 0);
1937 gfc_build_intrinsic_function_decls (void)
1939 tree gfc_int4_type_node = gfc_get_int_type (4);
1940 tree gfc_int8_type_node = gfc_get_int_type (8);
1941 tree gfc_int16_type_node = gfc_get_int_type (16);
1942 tree gfc_logical4_type_node = gfc_get_logical_type (4);
1943 tree gfc_real4_type_node = gfc_get_real_type (4);
1944 tree gfc_real8_type_node = gfc_get_real_type (8);
1945 tree gfc_real10_type_node = gfc_get_real_type (10);
1946 tree gfc_real16_type_node = gfc_get_real_type (16);
1947 tree gfc_complex4_type_node = gfc_get_complex_type (4);
1948 tree gfc_complex8_type_node = gfc_get_complex_type (8);
1949 tree gfc_complex10_type_node = gfc_get_complex_type (10);
1950 tree gfc_complex16_type_node = gfc_get_complex_type (16);
1951 tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
1953 /* String functions. */
1954 gfor_fndecl_compare_string =
1955 gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
1958 gfc_charlen_type_node, pchar_type_node,
1959 gfc_charlen_type_node, pchar_type_node);
1961 gfor_fndecl_concat_string =
1962 gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
1965 gfc_charlen_type_node, pchar_type_node,
1966 gfc_charlen_type_node, pchar_type_node,
1967 gfc_charlen_type_node, pchar_type_node);
1969 gfor_fndecl_string_len_trim =
1970 gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
1972 2, gfc_charlen_type_node,
1975 gfor_fndecl_string_index =
1976 gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
1978 5, gfc_charlen_type_node, pchar_type_node,
1979 gfc_charlen_type_node, pchar_type_node,
1980 gfc_logical4_type_node);
1982 gfor_fndecl_string_scan =
1983 gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
1985 5, gfc_charlen_type_node, pchar_type_node,
1986 gfc_charlen_type_node, pchar_type_node,
1987 gfc_logical4_type_node);
1989 gfor_fndecl_string_verify =
1990 gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
1992 5, gfc_charlen_type_node, pchar_type_node,
1993 gfc_charlen_type_node, pchar_type_node,
1994 gfc_logical4_type_node);
1996 gfor_fndecl_string_trim =
1997 gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
2000 build_pointer_type (gfc_charlen_type_node),
2002 gfc_charlen_type_node,
2005 gfor_fndecl_string_repeat =
2006 gfc_build_library_function_decl (get_identifier (PREFIX("string_repeat")),
2010 gfc_charlen_type_node,
2012 gfc_int4_type_node);
2014 gfor_fndecl_ttynam =
2015 gfc_build_library_function_decl (get_identifier (PREFIX("ttynam")),
2019 gfc_charlen_type_node,
2020 gfc_c_int_type_node);
2023 gfc_build_library_function_decl (get_identifier (PREFIX("fdate")),
2027 gfc_charlen_type_node);
2030 gfc_build_library_function_decl (get_identifier (PREFIX("ctime")),
2034 gfc_charlen_type_node,
2035 gfc_int8_type_node);
2037 gfor_fndecl_adjustl =
2038 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
2042 gfc_charlen_type_node, pchar_type_node);
2044 gfor_fndecl_adjustr =
2045 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
2049 gfc_charlen_type_node, pchar_type_node);
2051 gfor_fndecl_si_kind =
2052 gfc_build_library_function_decl (get_identifier ("selected_int_kind"),
2057 gfor_fndecl_sr_kind =
2058 gfc_build_library_function_decl (get_identifier ("selected_real_kind"),
2063 /* Power functions. */
2065 tree ctype, rtype, itype, jtype;
2066 int rkind, ikind, jkind;
2069 static int ikinds[NIKINDS] = {4, 8, 16};
2070 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2071 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2073 for (ikind=0; ikind < NIKINDS; ikind++)
2075 itype = gfc_get_int_type (ikinds[ikind]);
2077 for (jkind=0; jkind < NIKINDS; jkind++)
2079 jtype = gfc_get_int_type (ikinds[jkind]);
2082 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2084 gfor_fndecl_math_powi[jkind][ikind].integer =
2085 gfc_build_library_function_decl (get_identifier (name),
2086 jtype, 2, jtype, itype);
2090 for (rkind = 0; rkind < NRKINDS; rkind ++)
2092 rtype = gfc_get_real_type (rkinds[rkind]);
2095 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2097 gfor_fndecl_math_powi[rkind][ikind].real =
2098 gfc_build_library_function_decl (get_identifier (name),
2099 rtype, 2, rtype, itype);
2102 ctype = gfc_get_complex_type (rkinds[rkind]);
2105 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2107 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2108 gfc_build_library_function_decl (get_identifier (name),
2109 ctype, 2,ctype, itype);
2117 gfor_fndecl_math_cpowf =
2118 gfc_build_library_function_decl (get_identifier ("cpowf"),
2119 gfc_complex4_type_node,
2120 1, gfc_complex4_type_node);
2121 gfor_fndecl_math_cpow =
2122 gfc_build_library_function_decl (get_identifier ("cpow"),
2123 gfc_complex8_type_node,
2124 1, gfc_complex8_type_node);
2125 if (gfc_complex10_type_node)
2126 gfor_fndecl_math_cpowl10 =
2127 gfc_build_library_function_decl (get_identifier ("cpowl"),
2128 gfc_complex10_type_node, 1,
2129 gfc_complex10_type_node);
2130 if (gfc_complex16_type_node)
2131 gfor_fndecl_math_cpowl16 =
2132 gfc_build_library_function_decl (get_identifier ("cpowl"),
2133 gfc_complex16_type_node, 1,
2134 gfc_complex16_type_node);
2136 gfor_fndecl_math_ishftc4 =
2137 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
2139 3, gfc_int4_type_node,
2140 gfc_int4_type_node, gfc_int4_type_node);
2141 gfor_fndecl_math_ishftc8 =
2142 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
2144 3, gfc_int8_type_node,
2145 gfc_int4_type_node, gfc_int4_type_node);
2146 if (gfc_int16_type_node)
2147 gfor_fndecl_math_ishftc16 =
2148 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc16")),
2149 gfc_int16_type_node, 3,
2150 gfc_int16_type_node,
2152 gfc_int4_type_node);
2154 gfor_fndecl_math_exponent4 =
2155 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r4")),
2157 1, gfc_real4_type_node);
2158 gfor_fndecl_math_exponent8 =
2159 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r8")),
2161 1, gfc_real8_type_node);
2162 if (gfc_real10_type_node)
2163 gfor_fndecl_math_exponent10 =
2164 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r10")),
2165 gfc_int4_type_node, 1,
2166 gfc_real10_type_node);
2167 if (gfc_real16_type_node)
2168 gfor_fndecl_math_exponent16 =
2169 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r16")),
2170 gfc_int4_type_node, 1,
2171 gfc_real16_type_node);
2173 /* Other functions. */
2175 gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
2176 gfc_array_index_type,
2177 1, pvoid_type_node);
2179 gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
2180 gfc_array_index_type,
2182 gfc_array_index_type);
2185 gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
2191 /* Make prototypes for runtime library functions. */
2194 gfc_build_builtin_function_decls (void)
2196 tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
2197 tree gfc_int4_type_node = gfc_get_int_type (4);
2198 tree gfc_int8_type_node = gfc_get_int_type (8);
2199 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2200 tree gfc_pint4_type_node = build_pointer_type (gfc_int4_type_node);
2202 /* Treat these two internal malloc wrappers as malloc. */
2203 gfor_fndecl_internal_malloc =
2204 gfc_build_library_function_decl (get_identifier (PREFIX("internal_malloc")),
2205 pvoid_type_node, 1, gfc_int4_type_node);
2206 DECL_IS_MALLOC (gfor_fndecl_internal_malloc) = 1;
2208 gfor_fndecl_internal_malloc64 =
2209 gfc_build_library_function_decl (get_identifier
2210 (PREFIX("internal_malloc64")),
2211 pvoid_type_node, 1, gfc_int8_type_node);
2212 DECL_IS_MALLOC (gfor_fndecl_internal_malloc64) = 1;
2214 gfor_fndecl_internal_realloc =
2215 gfc_build_library_function_decl (get_identifier
2216 (PREFIX("internal_realloc")),
2217 pvoid_type_node, 2, pvoid_type_node,
2218 gfc_int4_type_node);
2220 gfor_fndecl_internal_realloc64 =
2221 gfc_build_library_function_decl (get_identifier
2222 (PREFIX("internal_realloc64")),
2223 pvoid_type_node, 2, pvoid_type_node,
2224 gfc_int8_type_node);
2226 gfor_fndecl_internal_free =
2227 gfc_build_library_function_decl (get_identifier (PREFIX("internal_free")),
2228 void_type_node, 1, pvoid_type_node);
2230 gfor_fndecl_allocate =
2231 gfc_build_library_function_decl (get_identifier (PREFIX("allocate")),
2232 void_type_node, 2, ppvoid_type_node,
2233 gfc_int4_type_node);
2235 gfor_fndecl_allocate64 =
2236 gfc_build_library_function_decl (get_identifier (PREFIX("allocate64")),
2237 void_type_node, 2, ppvoid_type_node,
2238 gfc_int8_type_node);
2240 gfor_fndecl_allocate_array =
2241 gfc_build_library_function_decl (get_identifier (PREFIX("allocate_array")),
2242 void_type_node, 2, ppvoid_type_node,
2243 gfc_int4_type_node);
2245 gfor_fndecl_allocate64_array =
2246 gfc_build_library_function_decl (get_identifier (PREFIX("allocate64_array")),
2247 void_type_node, 2, ppvoid_type_node,
2248 gfc_int8_type_node);
2250 gfor_fndecl_deallocate =
2251 gfc_build_library_function_decl (get_identifier (PREFIX("deallocate")),
2252 void_type_node, 2, ppvoid_type_node,
2253 gfc_pint4_type_node);
2255 gfor_fndecl_stop_numeric =
2256 gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
2257 void_type_node, 1, gfc_int4_type_node);
2259 /* Stop doesn't return. */
2260 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
2262 gfor_fndecl_stop_string =
2263 gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
2264 void_type_node, 2, pchar_type_node,
2265 gfc_int4_type_node);
2266 /* Stop doesn't return. */
2267 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
2269 gfor_fndecl_pause_numeric =
2270 gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
2271 void_type_node, 1, gfc_int4_type_node);
2273 gfor_fndecl_pause_string =
2274 gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
2275 void_type_node, 2, pchar_type_node,
2276 gfc_int4_type_node);
2278 gfor_fndecl_select_string =
2279 gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
2280 pvoid_type_node, 0);
2282 gfor_fndecl_runtime_error =
2283 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
2284 void_type_node, 1, pchar_type_node);
2285 /* The runtime_error function does not return. */
2286 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
2288 gfor_fndecl_set_fpe =
2289 gfc_build_library_function_decl (get_identifier (PREFIX("set_fpe")),
2290 void_type_node, 1, gfc_c_int_type_node);
2292 gfor_fndecl_set_std =
2293 gfc_build_library_function_decl (get_identifier (PREFIX("set_std")),
2298 gfc_int4_type_node);
2300 gfor_fndecl_set_convert =
2301 gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")),
2302 void_type_node, 1, gfc_c_int_type_node);
2304 gfor_fndecl_set_record_marker =
2305 gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")),
2306 void_type_node, 1, gfc_c_int_type_node);
2308 gfor_fndecl_in_pack = gfc_build_library_function_decl (
2309 get_identifier (PREFIX("internal_pack")),
2310 pvoid_type_node, 1, pvoid_type_node);
2312 gfor_fndecl_in_unpack = gfc_build_library_function_decl (
2313 get_identifier (PREFIX("internal_unpack")),
2314 pvoid_type_node, 1, pvoid_type_node);
2316 gfor_fndecl_associated =
2317 gfc_build_library_function_decl (
2318 get_identifier (PREFIX("associated")),
2319 gfc_logical4_type_node,
2324 gfc_build_intrinsic_function_decls ();
2325 gfc_build_intrinsic_lib_fndecls ();
2326 gfc_build_io_library_fndecls ();
2330 /* Evaluate the length of dummy character variables. */
2333 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl, tree fnbody)
2337 gfc_finish_decl (cl->backend_decl, NULL_TREE);
2339 gfc_start_block (&body);
2341 /* Evaluate the string length expression. */
2342 gfc_trans_init_string_length (cl, &body);
2344 gfc_trans_vla_type_sizes (sym, &body);
2346 gfc_add_expr_to_block (&body, fnbody);
2347 return gfc_finish_block (&body);
2351 /* Allocate and cleanup an automatic character variable. */
2354 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
2360 gcc_assert (sym->backend_decl);
2361 gcc_assert (sym->ts.cl && sym->ts.cl->length);
2363 gfc_start_block (&body);
2365 /* Evaluate the string length expression. */
2366 gfc_trans_init_string_length (sym->ts.cl, &body);
2368 gfc_trans_vla_type_sizes (sym, &body);
2370 decl = sym->backend_decl;
2372 /* Emit a DECL_EXPR for this variable, which will cause the
2373 gimplifier to allocate storage, and all that good stuff. */
2374 tmp = build1 (DECL_EXPR, TREE_TYPE (decl), decl);
2375 gfc_add_expr_to_block (&body, tmp);
2377 gfc_add_expr_to_block (&body, fnbody);
2378 return gfc_finish_block (&body);
2381 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
2384 gfc_trans_assign_aux_var (gfc_symbol * sym, tree fnbody)
2388 gcc_assert (sym->backend_decl);
2389 gfc_start_block (&body);
2391 /* Set the initial value to length. See the comments in
2392 function gfc_add_assign_aux_vars in this file. */
2393 gfc_add_modify_expr (&body, GFC_DECL_STRING_LEN (sym->backend_decl),
2394 build_int_cst (NULL_TREE, -2));
2396 gfc_add_expr_to_block (&body, fnbody);
2397 return gfc_finish_block (&body);
2401 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
2403 tree t = *tp, var, val;
2405 if (t == NULL || t == error_mark_node)
2407 if (TREE_CONSTANT (t) || DECL_P (t))
2410 if (TREE_CODE (t) == SAVE_EXPR)
2412 if (SAVE_EXPR_RESOLVED_P (t))
2414 *tp = TREE_OPERAND (t, 0);
2417 val = TREE_OPERAND (t, 0);
2422 var = gfc_create_var_np (TREE_TYPE (t), NULL);
2423 gfc_add_decl_to_function (var);
2424 gfc_add_modify_expr (body, var, val);
2425 if (TREE_CODE (t) == SAVE_EXPR)
2426 TREE_OPERAND (t, 0) = var;
2431 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
2435 if (type == NULL || type == error_mark_node)
2438 type = TYPE_MAIN_VARIANT (type);
2440 if (TREE_CODE (type) == INTEGER_TYPE)
2442 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
2443 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
2445 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2447 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
2448 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
2451 else if (TREE_CODE (type) == ARRAY_TYPE)
2453 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
2454 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
2455 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
2456 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
2458 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2460 TYPE_SIZE (t) = TYPE_SIZE (type);
2461 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
2466 /* Make sure all type sizes and array domains are either constant,
2467 or variable or parameter decls. This is a simplified variant
2468 of gimplify_type_sizes, but we can't use it here, as none of the
2469 variables in the expressions have been gimplified yet.
2470 As type sizes and domains for various variable length arrays
2471 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
2472 time, without this routine gimplify_type_sizes in the middle-end
2473 could result in the type sizes being gimplified earlier than where
2474 those variables are initialized. */
2477 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
2479 tree type = TREE_TYPE (sym->backend_decl);
2481 if (TREE_CODE (type) == FUNCTION_TYPE
2482 && (sym->attr.function || sym->attr.result || sym->attr.entry))
2484 if (! current_fake_result_decl)
2487 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
2490 while (POINTER_TYPE_P (type))
2491 type = TREE_TYPE (type);
2493 if (GFC_DESCRIPTOR_TYPE_P (type))
2495 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2497 while (POINTER_TYPE_P (etype))
2498 etype = TREE_TYPE (etype);
2500 gfc_trans_vla_type_sizes_1 (etype, body);
2503 gfc_trans_vla_type_sizes_1 (type, body);
2507 /* Generate function entry and exit code, and add it to the function body.
2509 Allocation and initialization of array variables.
2510 Allocation of character string variables.
2511 Initialization and possibly repacking of dummy arrays.
2512 Initialization of ASSIGN statement auxiliary variable. */
2515 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2519 gfc_formal_arglist *f;
2522 /* Deal with implicit return variables. Explicit return variables will
2523 already have been added. */
2524 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2526 if (!current_fake_result_decl)
2528 gfc_entry_list *el = NULL;
2529 if (proc_sym->attr.entry_master)
2531 for (el = proc_sym->ns->entries; el; el = el->next)
2532 if (el->sym != el->sym->result)
2536 warning (0, "Function does not return a value");
2538 else if (proc_sym->as)
2540 tree result = TREE_VALUE (current_fake_result_decl);
2541 fnbody = gfc_trans_dummy_array_bias (proc_sym, result, fnbody);
2543 /* An automatic character length, pointer array result. */
2544 if (proc_sym->ts.type == BT_CHARACTER
2545 && TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2546 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2549 else if (proc_sym->ts.type == BT_CHARACTER)
2551 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2552 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2556 gcc_assert (gfc_option.flag_f2c
2557 && proc_sym->ts.type == BT_COMPLEX);
2560 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2562 if (sym->attr.dimension)
2564 switch (sym->as->type)
2567 if (sym->attr.dummy || sym->attr.result)
2569 gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2570 else if (sym->attr.pointer || sym->attr.allocatable)
2572 if (TREE_STATIC (sym->backend_decl))
2573 gfc_trans_static_array_pointer (sym);
2575 fnbody = gfc_trans_deferred_array (sym, fnbody);
2579 gfc_get_backend_locus (&loc);
2580 gfc_set_backend_locus (&sym->declared_at);
2581 fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2583 gfc_set_backend_locus (&loc);
2587 case AS_ASSUMED_SIZE:
2588 /* Must be a dummy parameter. */
2589 gcc_assert (sym->attr.dummy);
2591 /* We should always pass assumed size arrays the g77 way. */
2592 fnbody = gfc_trans_g77_array (sym, fnbody);
2595 case AS_ASSUMED_SHAPE:
2596 /* Must be a dummy parameter. */
2597 gcc_assert (sym->attr.dummy);
2599 fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2604 fnbody = gfc_trans_deferred_array (sym, fnbody);
2611 else if (sym->ts.type == BT_CHARACTER)
2613 gfc_get_backend_locus (&loc);
2614 gfc_set_backend_locus (&sym->declared_at);
2615 if (sym->attr.dummy || sym->attr.result)
2616 fnbody = gfc_trans_dummy_character (sym, sym->ts.cl, fnbody);
2618 fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2619 gfc_set_backend_locus (&loc);
2621 else if (sym->attr.assign)
2623 gfc_get_backend_locus (&loc);
2624 gfc_set_backend_locus (&sym->declared_at);
2625 fnbody = gfc_trans_assign_aux_var (sym, fnbody);
2626 gfc_set_backend_locus (&loc);
2632 gfc_init_block (&body);
2634 for (f = proc_sym->formal; f; f = f->next)
2635 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
2637 gcc_assert (f->sym->ts.cl->backend_decl != NULL);
2638 if (TREE_CODE (f->sym->ts.cl->backend_decl) == PARM_DECL)
2639 gfc_trans_vla_type_sizes (f->sym, &body);
2642 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
2643 && current_fake_result_decl != NULL)
2645 gcc_assert (proc_sym->ts.cl->backend_decl != NULL);
2646 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == PARM_DECL)
2647 gfc_trans_vla_type_sizes (proc_sym, &body);
2650 gfc_add_expr_to_block (&body, fnbody);
2651 return gfc_finish_block (&body);
2655 /* Output an initialized decl for a module variable. */
2658 gfc_create_module_variable (gfc_symbol * sym)
2662 /* Module functions with alternate entries are dealt with later and
2663 would get caught by the next condition. */
2664 if (sym->attr.entry)
2667 /* Only output symbols from this module. */
2668 if (sym->ns != module_namespace)
2670 /* I don't think this should ever happen. */
2671 internal_error ("module symbol %s in wrong namespace", sym->name);
2674 /* Only output variables and array valued parameters. */
2675 if (sym->attr.flavor != FL_VARIABLE
2676 && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0))
2679 /* Don't generate variables from other modules. Variables from
2680 COMMONs will already have been generated. */
2681 if (sym->attr.use_assoc || sym->attr.in_common)
2684 /* Equivalenced variables arrive here after creation. */
2685 if (sym->backend_decl
2686 && (sym->equiv_built || sym->attr.in_equivalence))
2689 if (sym->backend_decl)
2690 internal_error ("backend decl for module variable %s already exists",
2693 /* We always want module variables to be created. */
2694 sym->attr.referenced = 1;
2695 /* Create the decl. */
2696 decl = gfc_get_symbol_decl (sym);
2698 /* Create the variable. */
2700 rest_of_decl_compilation (decl, 1, 0);
2702 /* Also add length of strings. */
2703 if (sym->ts.type == BT_CHARACTER)
2707 length = sym->ts.cl->backend_decl;
2708 if (!INTEGER_CST_P (length))
2711 rest_of_decl_compilation (length, 1, 0);
2717 /* Generate all the required code for module variables. */
2720 gfc_generate_module_vars (gfc_namespace * ns)
2722 module_namespace = ns;
2724 /* Check if the frontend left the namespace in a reasonable state. */
2725 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
2727 /* Generate COMMON blocks. */
2728 gfc_trans_common (ns);
2730 /* Create decls for all the module variables. */
2731 gfc_traverse_ns (ns, gfc_create_module_variable);
2735 gfc_generate_contained_functions (gfc_namespace * parent)
2739 /* We create all the prototypes before generating any code. */
2740 for (ns = parent->contained; ns; ns = ns->sibling)
2742 /* Skip namespaces from used modules. */
2743 if (ns->parent != parent)
2746 gfc_create_function_decl (ns);
2749 for (ns = parent->contained; ns; ns = ns->sibling)
2751 /* Skip namespaces from used modules. */
2752 if (ns->parent != parent)
2755 gfc_generate_function_code (ns);
2760 /* Drill down through expressions for the array specification bounds and
2761 character length calling generate_local_decl for all those variables
2762 that have not already been declared. */
2765 generate_local_decl (gfc_symbol *);
2768 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
2770 gfc_actual_arglist *arg;
2777 switch (e->expr_type)
2780 for (arg = e->value.function.actual; arg; arg = arg->next)
2781 generate_expr_decls (sym, arg->expr);
2784 /* If the variable is not the same as the dependent, 'sym', and
2785 it is not marked as being declared and it is in the same
2786 namespace as 'sym', add it to the local declarations. */
2788 if (sym == e->symtree->n.sym
2789 || e->symtree->n.sym->mark
2790 || e->symtree->n.sym->ns != sym->ns)
2793 generate_local_decl (e->symtree->n.sym);
2797 generate_expr_decls (sym, e->value.op.op1);
2798 generate_expr_decls (sym, e->value.op.op2);
2807 for (ref = e->ref; ref; ref = ref->next)
2812 for (i = 0; i < ref->u.ar.dimen; i++)
2814 generate_expr_decls (sym, ref->u.ar.start[i]);
2815 generate_expr_decls (sym, ref->u.ar.end[i]);
2816 generate_expr_decls (sym, ref->u.ar.stride[i]);
2821 generate_expr_decls (sym, ref->u.ss.start);
2822 generate_expr_decls (sym, ref->u.ss.end);
2826 if (ref->u.c.component->ts.type == BT_CHARACTER
2827 && ref->u.c.component->ts.cl->length->expr_type
2829 generate_expr_decls (sym, ref->u.c.component->ts.cl->length);
2831 if (ref->u.c.component->as)
2832 for (i = 0; i < ref->u.c.component->as->rank; i++)
2834 generate_expr_decls (sym, ref->u.c.component->as->lower[i]);
2835 generate_expr_decls (sym, ref->u.c.component->as->upper[i]);
2844 /* Check for dependencies in the character length and array spec. */
2847 generate_dependency_declarations (gfc_symbol *sym)
2851 if (sym->ts.type == BT_CHARACTER
2852 && sym->ts.cl->length->expr_type != EXPR_CONSTANT)
2853 generate_expr_decls (sym, sym->ts.cl->length);
2855 if (sym->as && sym->as->rank)
2857 for (i = 0; i < sym->as->rank; i++)
2859 generate_expr_decls (sym, sym->as->lower[i]);
2860 generate_expr_decls (sym, sym->as->upper[i]);
2866 /* Generate decls for all local variables. We do this to ensure correct
2867 handling of expressions which only appear in the specification of
2871 generate_local_decl (gfc_symbol * sym)
2873 if (sym->attr.flavor == FL_VARIABLE)
2875 /* Check for dependencies in the array specification and string
2876 length, adding the necessary declarations to the function. We
2877 mark the symbol now, as well as in traverse_ns, to prevent
2878 getting stuck in a circular dependency. */
2880 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
2881 generate_dependency_declarations (sym);
2883 if (sym->attr.referenced)
2884 gfc_get_symbol_decl (sym);
2885 else if (sym->attr.dummy && warn_unused_parameter)
2886 warning (0, "unused parameter %qs", sym->name);
2887 /* Warn for unused variables, but not if they're inside a common
2888 block or are use-associated. */
2889 else if (warn_unused_variable
2890 && !(sym->attr.in_common || sym->attr.use_assoc))
2891 warning (0, "unused variable %qs", sym->name);
2892 /* For variable length CHARACTER parameters, the PARM_DECL already
2893 references the length variable, so force gfc_get_symbol_decl
2894 even when not referenced. If optimize > 0, it will be optimized
2895 away anyway. But do this only after emitting -Wunused-parameter
2896 warning if requested. */
2897 if (sym->attr.dummy && ! sym->attr.referenced
2898 && sym->ts.type == BT_CHARACTER
2899 && sym->ts.cl->backend_decl != NULL
2900 && TREE_CODE (sym->ts.cl->backend_decl) == VAR_DECL)
2902 sym->attr.referenced = 1;
2903 gfc_get_symbol_decl (sym);
2909 generate_local_vars (gfc_namespace * ns)
2911 gfc_traverse_ns (ns, generate_local_decl);
2915 /* Generate a switch statement to jump to the correct entry point. Also
2916 creates the label decls for the entry points. */
2919 gfc_trans_entry_master_switch (gfc_entry_list * el)
2926 gfc_init_block (&block);
2927 for (; el; el = el->next)
2929 /* Add the case label. */
2930 label = gfc_build_label_decl (NULL_TREE);
2931 val = build_int_cst (gfc_array_index_type, el->id);
2932 tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
2933 gfc_add_expr_to_block (&block, tmp);
2935 /* And jump to the actual entry point. */
2936 label = gfc_build_label_decl (NULL_TREE);
2937 tmp = build1_v (GOTO_EXPR, label);
2938 gfc_add_expr_to_block (&block, tmp);
2940 /* Save the label decl. */
2943 tmp = gfc_finish_block (&block);
2944 /* The first argument selects the entry point. */
2945 val = DECL_ARGUMENTS (current_function_decl);
2946 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
2951 /* Generate code for a function. */
2954 gfc_generate_function_code (gfc_namespace * ns)
2965 sym = ns->proc_name;
2967 /* Check that the frontend isn't still using this. */
2968 gcc_assert (sym->tlink == NULL);
2971 /* Create the declaration for functions with global scope. */
2972 if (!sym->backend_decl)
2973 gfc_create_function_decl (ns);
2975 fndecl = sym->backend_decl;
2976 old_context = current_function_decl;
2980 push_function_context ();
2981 saved_parent_function_decls = saved_function_decls;
2982 saved_function_decls = NULL_TREE;
2985 trans_function_start (sym);
2987 gfc_start_block (&block);
2989 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
2991 /* Copy length backend_decls to all entry point result
2996 gfc_conv_const_charlen (ns->proc_name->ts.cl);
2997 backend_decl = ns->proc_name->result->ts.cl->backend_decl;
2998 for (el = ns->entries; el; el = el->next)
2999 el->sym->result->ts.cl->backend_decl = backend_decl;
3002 /* Translate COMMON blocks. */
3003 gfc_trans_common (ns);
3005 /* Null the parent fake result declaration if this namespace is
3006 a module function or an external procedures. */
3007 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3008 || ns->parent == NULL)
3009 parent_fake_result_decl = NULL_TREE;
3011 gfc_generate_contained_functions (ns);
3013 generate_local_vars (ns);
3015 /* Keep the parent fake result declaration in module functions
3016 or external procedures. */
3017 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3018 || ns->parent == NULL)
3019 current_fake_result_decl = parent_fake_result_decl;
3021 current_fake_result_decl = NULL_TREE;
3023 current_function_return_label = NULL;
3025 /* Now generate the code for the body of this function. */
3026 gfc_init_block (&body);
3028 /* If this is the main program, add a call to set_std to set up the
3029 runtime library Fortran language standard parameters. */
3031 if (sym->attr.is_main_program)
3033 tree arglist, gfc_int4_type_node;
3035 gfc_int4_type_node = gfc_get_int_type (4);
3036 arglist = gfc_chainon_list (NULL_TREE,
3037 build_int_cst (gfc_int4_type_node,
3038 gfc_option.warn_std));
3039 arglist = gfc_chainon_list (arglist,
3040 build_int_cst (gfc_int4_type_node,
3041 gfc_option.allow_std));
3042 arglist = gfc_chainon_list (arglist,
3043 build_int_cst (gfc_int4_type_node,
3045 tmp = build_function_call_expr (gfor_fndecl_set_std, arglist);
3046 gfc_add_expr_to_block (&body, tmp);
3049 /* If this is the main program and a -ffpe-trap option was provided,
3050 add a call to set_fpe so that the library will raise a FPE when
3052 if (sym->attr.is_main_program && gfc_option.fpe != 0)
3054 tree arglist, gfc_c_int_type_node;
3056 gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3057 arglist = gfc_chainon_list (NULL_TREE,
3058 build_int_cst (gfc_c_int_type_node,
3060 tmp = build_function_call_expr (gfor_fndecl_set_fpe, arglist);
3061 gfc_add_expr_to_block (&body, tmp);
3064 /* If this is the main program and an -fconvert option was provided,
3065 add a call to set_convert. */
3067 if (sym->attr.is_main_program && gfc_option.convert != CONVERT_NATIVE)
3069 tree arglist, gfc_c_int_type_node;
3071 gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3072 arglist = gfc_chainon_list (NULL_TREE,
3073 build_int_cst (gfc_c_int_type_node,
3074 gfc_option.convert));
3075 tmp = build_function_call_expr (gfor_fndecl_set_convert, arglist);
3076 gfc_add_expr_to_block (&body, tmp);
3079 /* If this is the main program and an -frecord-marker option was provided,
3080 add a call to set_record_marker. */
3082 if (sym->attr.is_main_program && gfc_option.record_marker != 0)
3084 tree arglist, gfc_c_int_type_node;
3086 gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3087 arglist = gfc_chainon_list (NULL_TREE,
3088 build_int_cst (gfc_c_int_type_node,
3089 gfc_option.record_marker));
3090 tmp = build_function_call_expr (gfor_fndecl_set_record_marker, arglist);
3091 gfc_add_expr_to_block (&body, tmp);
3095 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
3096 && sym->attr.subroutine)
3098 tree alternate_return;
3099 alternate_return = gfc_get_fake_result_decl (sym, 0);
3100 gfc_add_modify_expr (&body, alternate_return, integer_zero_node);
3105 /* Jump to the correct entry point. */
3106 tmp = gfc_trans_entry_master_switch (ns->entries);
3107 gfc_add_expr_to_block (&body, tmp);
3110 tmp = gfc_trans_code (ns->code);
3111 gfc_add_expr_to_block (&body, tmp);
3113 /* Add a return label if needed. */
3114 if (current_function_return_label)
3116 tmp = build1_v (LABEL_EXPR, current_function_return_label);
3117 gfc_add_expr_to_block (&body, tmp);
3120 tmp = gfc_finish_block (&body);
3121 /* Add code to create and cleanup arrays. */
3122 tmp = gfc_trans_deferred_vars (sym, tmp);
3123 gfc_add_expr_to_block (&block, tmp);
3125 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
3127 if (sym->attr.subroutine || sym == sym->result)
3129 if (current_fake_result_decl != NULL)
3130 result = TREE_VALUE (current_fake_result_decl);
3133 current_fake_result_decl = NULL_TREE;
3136 result = sym->result->backend_decl;
3138 if (result == NULL_TREE)
3139 warning (0, "Function return value not set");
3142 /* Set the return value to the dummy result variable. */
3143 tmp = build2 (MODIFY_EXPR, TREE_TYPE (result),
3144 DECL_RESULT (fndecl), result);
3145 tmp = build1_v (RETURN_EXPR, tmp);
3146 gfc_add_expr_to_block (&block, tmp);
3150 /* Add all the decls we created during processing. */
3151 decl = saved_function_decls;
3156 next = TREE_CHAIN (decl);
3157 TREE_CHAIN (decl) = NULL_TREE;
3161 saved_function_decls = NULL_TREE;
3163 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
3165 /* Finish off this function and send it for code generation. */
3167 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3169 /* Output the GENERIC tree. */
3170 dump_function (TDI_original, fndecl);
3172 /* Store the end of the function, so that we get good line number
3173 info for the epilogue. */
3174 cfun->function_end_locus = input_location;
3176 /* We're leaving the context of this function, so zap cfun.
3177 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
3178 tree_rest_of_compilation. */
3183 pop_function_context ();
3184 saved_function_decls = saved_parent_function_decls;
3186 current_function_decl = old_context;
3188 if (decl_function_context (fndecl))
3189 /* Register this function with cgraph just far enough to get it
3190 added to our parent's nested function list. */
3191 (void) cgraph_node (fndecl);
3194 gfc_gimplify_function (fndecl);
3195 cgraph_finalize_function (fndecl, false);
3200 gfc_generate_constructors (void)
3202 gcc_assert (gfc_static_ctors == NULL_TREE);
3210 if (gfc_static_ctors == NULL_TREE)
3213 fnname = get_file_function_name ('I');
3214 type = build_function_type (void_type_node,
3215 gfc_chainon_list (NULL_TREE, void_type_node));
3217 fndecl = build_decl (FUNCTION_DECL, fnname, type);
3218 TREE_PUBLIC (fndecl) = 1;
3220 decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
3221 DECL_ARTIFICIAL (decl) = 1;
3222 DECL_IGNORED_P (decl) = 1;
3223 DECL_CONTEXT (decl) = fndecl;
3224 DECL_RESULT (fndecl) = decl;
3228 current_function_decl = fndecl;
3230 rest_of_decl_compilation (fndecl, 1, 0);
3232 make_decl_rtl (fndecl);
3234 init_function_start (fndecl);
3238 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
3241 build_function_call_expr (TREE_VALUE (gfc_static_ctors), NULL_TREE);
3242 DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
3247 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3249 free_after_parsing (cfun);
3250 free_after_compilation (cfun);
3252 tree_rest_of_compilation (fndecl);
3254 current_function_decl = NULL_TREE;
3258 /* Translates a BLOCK DATA program unit. This means emitting the
3259 commons contained therein plus their initializations. We also emit
3260 a globally visible symbol to make sure that each BLOCK DATA program
3261 unit remains unique. */
3264 gfc_generate_block_data (gfc_namespace * ns)
3269 /* Tell the backend the source location of the block data. */
3271 gfc_set_backend_locus (&ns->proc_name->declared_at);
3273 gfc_set_backend_locus (&gfc_current_locus);
3275 /* Process the DATA statements. */
3276 gfc_trans_common (ns);
3278 /* Create a global symbol with the mane of the block data. This is to
3279 generate linker errors if the same name is used twice. It is never
3282 id = gfc_sym_mangled_function_id (ns->proc_name);
3284 id = get_identifier ("__BLOCK_DATA__");
3286 decl = build_decl (VAR_DECL, id, gfc_array_index_type);
3287 TREE_PUBLIC (decl) = 1;
3288 TREE_STATIC (decl) = 1;
3291 rest_of_decl_compilation (decl, 1, 0);
3295 #include "gt-fortran-trans-decl.h"