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 /* Put variable length auto array pointers always into stack. */
516 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
517 || sym->attr.dimension == 0
518 || sym->as->type != AS_EXPLICIT
520 || sym->attr.allocatable)
521 && !DECL_ARTIFICIAL (decl))
522 TREE_STATIC (decl) = 1;
524 /* Handle threadprivate variables. */
525 if (sym->attr.threadprivate
526 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
527 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
531 /* Allocate the lang-specific part of a decl. */
534 gfc_allocate_lang_decl (tree decl)
536 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
537 ggc_alloc_cleared (sizeof (struct lang_decl));
540 /* Remember a symbol to generate initialization/cleanup code at function
544 gfc_defer_symbol_init (gfc_symbol * sym)
550 /* Don't add a symbol twice. */
554 last = head = sym->ns->proc_name;
557 /* Make sure that setup code for dummy variables which are used in the
558 setup of other variables is generated first. */
561 /* Find the first dummy arg seen after us, or the first non-dummy arg.
562 This is a circular list, so don't go past the head. */
564 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
570 /* Insert in between last and p. */
576 /* Create an array index type variable with function scope. */
579 create_index_var (const char * pfx, int nest)
583 decl = gfc_create_var_np (gfc_array_index_type, pfx);
585 gfc_add_decl_to_parent_function (decl);
587 gfc_add_decl_to_function (decl);
592 /* Create variables to hold all the non-constant bits of info for a
593 descriptorless array. Remember these in the lang-specific part of the
597 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
603 type = TREE_TYPE (decl);
605 /* We just use the descriptor, if there is one. */
606 if (GFC_DESCRIPTOR_TYPE_P (type))
609 gcc_assert (GFC_ARRAY_TYPE_P (type));
610 nest = (sym->ns->proc_name->backend_decl != current_function_decl)
611 && !sym->attr.contained;
613 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
615 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
616 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
617 /* Don't try to use the unknown bound for assumed shape arrays. */
618 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
619 && (sym->as->type != AS_ASSUMED_SIZE
620 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
621 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
623 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
624 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
626 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
628 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
631 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
633 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
636 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
637 && sym->as->type != AS_ASSUMED_SIZE)
638 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
640 if (POINTER_TYPE_P (type))
642 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
643 gcc_assert (TYPE_LANG_SPECIFIC (type)
644 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
645 type = TREE_TYPE (type);
648 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
652 size = build2 (MINUS_EXPR, gfc_array_index_type,
653 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
654 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
656 TYPE_DOMAIN (type) = range;
662 /* For some dummy arguments we don't use the actual argument directly.
663 Instead we create a local decl and use that. This allows us to perform
664 initialization, and construct full type information. */
667 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
677 if (sym->attr.pointer || sym->attr.allocatable)
680 /* Add to list of variables if not a fake result variable. */
681 if (sym->attr.result || sym->attr.dummy)
682 gfc_defer_symbol_init (sym);
684 type = TREE_TYPE (dummy);
685 gcc_assert (TREE_CODE (dummy) == PARM_DECL
686 && POINTER_TYPE_P (type));
688 /* Do we know the element size? */
689 known_size = sym->ts.type != BT_CHARACTER
690 || INTEGER_CST_P (sym->ts.cl->backend_decl);
692 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
694 /* For descriptorless arrays with known element size the actual
695 argument is sufficient. */
696 gcc_assert (GFC_ARRAY_TYPE_P (type));
697 gfc_build_qualified_array (dummy, sym);
701 type = TREE_TYPE (type);
702 if (GFC_DESCRIPTOR_TYPE_P (type))
704 /* Create a decriptorless array pointer. */
707 if (!gfc_option.flag_repack_arrays)
709 if (as->type == AS_ASSUMED_SIZE)
714 if (as->type == AS_EXPLICIT)
717 for (n = 0; n < as->rank; n++)
721 && as->upper[n]->expr_type == EXPR_CONSTANT
722 && as->lower[n]->expr_type == EXPR_CONSTANT))
730 type = gfc_typenode_for_spec (&sym->ts);
731 type = gfc_get_nodesc_array_type (type, sym->as, packed);
735 /* We now have an expression for the element size, so create a fully
736 qualified type. Reset sym->backend decl or this will just return the
738 DECL_ARTIFICIAL (sym->backend_decl) = 1;
739 sym->backend_decl = NULL_TREE;
740 type = gfc_sym_type (sym);
744 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
745 decl = build_decl (VAR_DECL, get_identifier (name), type);
747 DECL_ARTIFICIAL (decl) = 1;
748 TREE_PUBLIC (decl) = 0;
749 TREE_STATIC (decl) = 0;
750 DECL_EXTERNAL (decl) = 0;
752 /* We should never get deferred shape arrays here. We used to because of
754 gcc_assert (sym->as->type != AS_DEFERRED);
759 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
763 GFC_DECL_PACKED_ARRAY (decl) = 1;
767 gfc_build_qualified_array (decl, sym);
769 if (DECL_LANG_SPECIFIC (dummy))
770 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
772 gfc_allocate_lang_decl (decl);
774 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
776 if (sym->ns->proc_name->backend_decl == current_function_decl
777 || sym->attr.contained)
778 gfc_add_decl_to_function (decl);
780 gfc_add_decl_to_parent_function (decl);
786 /* Return a constant or a variable to use as a string length. Does not
787 add the decl to the current scope. */
790 gfc_create_string_length (gfc_symbol * sym)
794 gcc_assert (sym->ts.cl);
795 gfc_conv_const_charlen (sym->ts.cl);
797 if (sym->ts.cl->backend_decl == NULL_TREE)
799 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
801 /* Also prefix the mangled name. */
802 strcpy (&name[1], sym->name);
804 length = build_decl (VAR_DECL, get_identifier (name),
805 gfc_charlen_type_node);
806 DECL_ARTIFICIAL (length) = 1;
807 TREE_USED (length) = 1;
808 if (sym->ns->proc_name->tlink != NULL)
809 gfc_defer_symbol_init (sym);
810 sym->ts.cl->backend_decl = length;
813 return sym->ts.cl->backend_decl;
816 /* If a variable is assigned a label, we add another two auxiliary
820 gfc_add_assign_aux_vars (gfc_symbol * sym)
826 gcc_assert (sym->backend_decl);
828 decl = sym->backend_decl;
829 gfc_allocate_lang_decl (decl);
830 GFC_DECL_ASSIGN (decl) = 1;
831 length = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
832 gfc_charlen_type_node);
833 addr = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
835 gfc_finish_var_decl (length, sym);
836 gfc_finish_var_decl (addr, sym);
837 /* STRING_LENGTH is also used as flag. Less than -1 means that
838 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
839 target label's address. Otherwise, value is the length of a format string
840 and ASSIGN_ADDR is its address. */
841 if (TREE_STATIC (length))
842 DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
844 gfc_defer_symbol_init (sym);
846 GFC_DECL_STRING_LEN (decl) = length;
847 GFC_DECL_ASSIGN_ADDR (decl) = addr;
850 /* Return the decl for a gfc_symbol, create it if it doesn't already
854 gfc_get_symbol_decl (gfc_symbol * sym)
857 tree length = NULL_TREE;
860 gcc_assert (sym->attr.referenced
861 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY);
863 if (sym->ns && sym->ns->proc_name->attr.function)
864 byref = gfc_return_by_reference (sym->ns->proc_name);
868 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
870 /* Return via extra parameter. */
871 if (sym->attr.result && byref
872 && !sym->backend_decl)
875 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
876 /* For entry master function skip over the __entry
878 if (sym->ns->proc_name->attr.entry_master)
879 sym->backend_decl = TREE_CHAIN (sym->backend_decl);
882 /* Dummy variables should already have been created. */
883 gcc_assert (sym->backend_decl);
885 /* Create a character length variable. */
886 if (sym->ts.type == BT_CHARACTER)
888 if (sym->ts.cl->backend_decl == NULL_TREE)
889 length = gfc_create_string_length (sym);
891 length = sym->ts.cl->backend_decl;
892 if (TREE_CODE (length) == VAR_DECL
893 && DECL_CONTEXT (length) == NULL_TREE)
895 /* Add the string length to the same context as the symbol. */
896 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
897 gfc_add_decl_to_function (length);
899 gfc_add_decl_to_parent_function (length);
901 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
902 DECL_CONTEXT (length));
904 gfc_defer_symbol_init (sym);
908 /* Use a copy of the descriptor for dummy arrays. */
909 if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
911 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
912 /* Prevent the dummy from being detected as unused if it is copied. */
913 if (sym->backend_decl != NULL && decl != sym->backend_decl)
914 DECL_ARTIFICIAL (sym->backend_decl) = 1;
915 sym->backend_decl = decl;
918 TREE_USED (sym->backend_decl) = 1;
919 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
921 gfc_add_assign_aux_vars (sym);
923 return sym->backend_decl;
926 if (sym->backend_decl)
927 return sym->backend_decl;
929 /* Catch function declarations. Only used for actual parameters. */
930 if (sym->attr.flavor == FL_PROCEDURE)
932 decl = gfc_get_extern_function_decl (sym);
936 if (sym->attr.intrinsic)
937 internal_error ("intrinsic variable which isn't a procedure");
939 /* Create string length decl first so that they can be used in the
941 if (sym->ts.type == BT_CHARACTER)
942 length = gfc_create_string_length (sym);
944 /* Create the decl for the variable. */
945 decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
947 gfc_set_decl_location (decl, &sym->declared_at);
949 /* Symbols from modules should have their assembler names mangled.
950 This is done here rather than in gfc_finish_var_decl because it
951 is different for string length variables. */
953 SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym));
955 if (sym->attr.dimension)
957 /* Create variables to hold the non-constant bits of array info. */
958 gfc_build_qualified_array (decl, sym);
960 /* Remember this variable for allocation/cleanup. */
961 gfc_defer_symbol_init (sym);
963 if ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer)
964 GFC_DECL_PACKED_ARRAY (decl) = 1;
967 gfc_finish_var_decl (decl, sym);
969 if (sym->ts.type == BT_CHARACTER)
971 /* Character variables need special handling. */
972 gfc_allocate_lang_decl (decl);
974 if (TREE_CODE (length) != INTEGER_CST)
976 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
980 /* Also prefix the mangled name for symbols from modules. */
981 strcpy (&name[1], sym->name);
984 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
985 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (name));
987 gfc_finish_var_decl (length, sym);
988 gcc_assert (!sym->value);
991 sym->backend_decl = decl;
993 if (sym->attr.assign)
995 gfc_add_assign_aux_vars (sym);
998 if (TREE_STATIC (decl) && !sym->attr.use_assoc)
1000 /* Add static initializer. */
1001 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1002 TREE_TYPE (decl), sym->attr.dimension,
1003 sym->attr.pointer || sym->attr.allocatable);
1010 /* Substitute a temporary variable in place of the real one. */
1013 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1015 save->attr = sym->attr;
1016 save->decl = sym->backend_decl;
1018 gfc_clear_attr (&sym->attr);
1019 sym->attr.referenced = 1;
1020 sym->attr.flavor = FL_VARIABLE;
1022 sym->backend_decl = decl;
1026 /* Restore the original variable. */
1029 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1031 sym->attr = save->attr;
1032 sym->backend_decl = save->decl;
1036 /* Get a basic decl for an external function. */
1039 gfc_get_extern_function_decl (gfc_symbol * sym)
1044 gfc_intrinsic_sym *isym;
1046 char s[GFC_MAX_SYMBOL_LEN + 13]; /* "f2c_specific" and '\0'. */
1050 if (sym->backend_decl)
1051 return sym->backend_decl;
1053 /* We should never be creating external decls for alternate entry points.
1054 The procedure may be an alternate entry point, but we don't want/need
1056 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1058 if (sym->attr.intrinsic)
1060 /* Call the resolution function to get the actual name. This is
1061 a nasty hack which relies on the resolution functions only looking
1062 at the first argument. We pass NULL for the second argument
1063 otherwise things like AINT get confused. */
1064 isym = gfc_find_function (sym->name);
1065 gcc_assert (isym->resolve.f0 != NULL);
1067 memset (&e, 0, sizeof (e));
1068 e.expr_type = EXPR_FUNCTION;
1070 memset (&argexpr, 0, sizeof (argexpr));
1071 gcc_assert (isym->formal);
1072 argexpr.ts = isym->formal->ts;
1074 if (isym->formal->next == NULL)
1075 isym->resolve.f1 (&e, &argexpr);
1078 /* All specific intrinsics take one or two arguments. */
1079 gcc_assert (isym->formal->next->next == NULL);
1080 isym->resolve.f2 (&e, &argexpr, NULL);
1083 if (gfc_option.flag_f2c
1084 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1085 || e.ts.type == BT_COMPLEX))
1087 /* Specific which needs a different implementation if f2c
1088 calling conventions are used. */
1089 sprintf (s, "f2c_specific%s", e.value.function.name);
1092 sprintf (s, "specific%s", e.value.function.name);
1094 name = get_identifier (s);
1095 mangled_name = name;
1099 name = gfc_sym_identifier (sym);
1100 mangled_name = gfc_sym_mangled_function_id (sym);
1103 type = gfc_get_function_type (sym);
1104 fndecl = build_decl (FUNCTION_DECL, name, type);
1106 SET_DECL_ASSEMBLER_NAME (fndecl, mangled_name);
1107 /* If the return type is a pointer, avoid alias issues by setting
1108 DECL_IS_MALLOC to nonzero. This means that the function should be
1109 treated as if it were a malloc, meaning it returns a pointer that
1111 if (POINTER_TYPE_P (type))
1112 DECL_IS_MALLOC (fndecl) = 1;
1114 /* Set the context of this decl. */
1115 if (0 && sym->ns && sym->ns->proc_name)
1117 /* TODO: Add external decls to the appropriate scope. */
1118 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1122 /* Global declaration, e.g. intrinsic subroutine. */
1123 DECL_CONTEXT (fndecl) = NULL_TREE;
1126 DECL_EXTERNAL (fndecl) = 1;
1128 /* This specifies if a function is globally addressable, i.e. it is
1129 the opposite of declaring static in C. */
1130 TREE_PUBLIC (fndecl) = 1;
1132 /* Set attributes for PURE functions. A call to PURE function in the
1133 Fortran 95 sense is both pure and without side effects in the C
1135 if (sym->attr.pure || sym->attr.elemental)
1137 if (sym->attr.function && !gfc_return_by_reference (sym))
1138 DECL_IS_PURE (fndecl) = 1;
1139 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1140 parameters and don't use alternate returns (is this
1141 allowed?). In that case, calls to them are meaningless, and
1142 can be optimized away. See also in build_function_decl(). */
1143 TREE_SIDE_EFFECTS (fndecl) = 0;
1146 /* Mark non-returning functions. */
1147 if (sym->attr.noreturn)
1148 TREE_THIS_VOLATILE(fndecl) = 1;
1150 sym->backend_decl = fndecl;
1152 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1153 pushdecl_top_level (fndecl);
1159 /* Create a declaration for a procedure. For external functions (in the C
1160 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1161 a master function with alternate entry points. */
1164 build_function_decl (gfc_symbol * sym)
1167 symbol_attribute attr;
1169 gfc_formal_arglist *f;
1171 gcc_assert (!sym->backend_decl);
1172 gcc_assert (!sym->attr.external);
1174 /* Set the line and filename. sym->declared_at seems to point to the
1175 last statement for subroutines, but it'll do for now. */
1176 gfc_set_backend_locus (&sym->declared_at);
1178 /* Allow only one nesting level. Allow public declarations. */
1179 gcc_assert (current_function_decl == NULL_TREE
1180 || DECL_CONTEXT (current_function_decl) == NULL_TREE);
1182 type = gfc_get_function_type (sym);
1183 fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type);
1185 /* Perform name mangling if this is a top level or module procedure. */
1186 if (current_function_decl == NULL_TREE)
1187 SET_DECL_ASSEMBLER_NAME (fndecl, gfc_sym_mangled_function_id (sym));
1189 /* Figure out the return type of the declared function, and build a
1190 RESULT_DECL for it. If this is a subroutine with alternate
1191 returns, build a RESULT_DECL for it. */
1194 result_decl = NULL_TREE;
1195 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1198 if (gfc_return_by_reference (sym))
1199 type = void_type_node;
1202 if (sym->result != sym)
1203 result_decl = gfc_sym_identifier (sym->result);
1205 type = TREE_TYPE (TREE_TYPE (fndecl));
1210 /* Look for alternate return placeholders. */
1211 int has_alternate_returns = 0;
1212 for (f = sym->formal; f; f = f->next)
1216 has_alternate_returns = 1;
1221 if (has_alternate_returns)
1222 type = integer_type_node;
1224 type = void_type_node;
1227 result_decl = build_decl (RESULT_DECL, result_decl, type);
1228 DECL_ARTIFICIAL (result_decl) = 1;
1229 DECL_IGNORED_P (result_decl) = 1;
1230 DECL_CONTEXT (result_decl) = fndecl;
1231 DECL_RESULT (fndecl) = result_decl;
1233 /* Don't call layout_decl for a RESULT_DECL.
1234 layout_decl (result_decl, 0); */
1236 /* If the return type is a pointer, avoid alias issues by setting
1237 DECL_IS_MALLOC to nonzero. This means that the function should be
1238 treated as if it were a malloc, meaning it returns a pointer that
1240 if (POINTER_TYPE_P (type))
1241 DECL_IS_MALLOC (fndecl) = 1;
1243 /* Set up all attributes for the function. */
1244 DECL_CONTEXT (fndecl) = current_function_decl;
1245 DECL_EXTERNAL (fndecl) = 0;
1247 /* This specifies if a function is globally visible, i.e. it is
1248 the opposite of declaring static in C. */
1249 if (DECL_CONTEXT (fndecl) == NULL_TREE
1250 && !sym->attr.entry_master)
1251 TREE_PUBLIC (fndecl) = 1;
1253 /* TREE_STATIC means the function body is defined here. */
1254 TREE_STATIC (fndecl) = 1;
1256 /* Set attributes for PURE functions. A call to a PURE function in the
1257 Fortran 95 sense is both pure and without side effects in the C
1259 if (attr.pure || attr.elemental)
1261 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1262 including a alternate return. In that case it can also be
1263 marked as PURE. See also in gfc_get_extern_function_decl(). */
1264 if (attr.function && !gfc_return_by_reference (sym))
1265 DECL_IS_PURE (fndecl) = 1;
1266 TREE_SIDE_EFFECTS (fndecl) = 0;
1269 /* Layout the function declaration and put it in the binding level
1270 of the current function. */
1273 sym->backend_decl = fndecl;
1277 /* Create the DECL_ARGUMENTS for a procedure. */
1280 create_function_arglist (gfc_symbol * sym)
1283 gfc_formal_arglist *f;
1284 tree typelist, hidden_typelist;
1285 tree arglist, hidden_arglist;
1289 fndecl = sym->backend_decl;
1291 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1292 the new FUNCTION_DECL node. */
1293 arglist = NULL_TREE;
1294 hidden_arglist = NULL_TREE;
1295 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1297 if (sym->attr.entry_master)
1299 type = TREE_VALUE (typelist);
1300 parm = build_decl (PARM_DECL, get_identifier ("__entry"), type);
1302 DECL_CONTEXT (parm) = fndecl;
1303 DECL_ARG_TYPE (parm) = type;
1304 TREE_READONLY (parm) = 1;
1305 gfc_finish_decl (parm, NULL_TREE);
1306 DECL_ARTIFICIAL (parm) = 1;
1308 arglist = chainon (arglist, parm);
1309 typelist = TREE_CHAIN (typelist);
1312 if (gfc_return_by_reference (sym))
1314 tree type = TREE_VALUE (typelist), length = NULL;
1316 if (sym->ts.type == BT_CHARACTER)
1318 /* Length of character result. */
1319 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1320 gcc_assert (len_type == gfc_charlen_type_node);
1322 length = build_decl (PARM_DECL,
1323 get_identifier (".__result"),
1325 if (!sym->ts.cl->length)
1327 sym->ts.cl->backend_decl = length;
1328 TREE_USED (length) = 1;
1330 gcc_assert (TREE_CODE (length) == PARM_DECL);
1331 DECL_CONTEXT (length) = fndecl;
1332 DECL_ARG_TYPE (length) = len_type;
1333 TREE_READONLY (length) = 1;
1334 DECL_ARTIFICIAL (length) = 1;
1335 gfc_finish_decl (length, NULL_TREE);
1336 if (sym->ts.cl->backend_decl == NULL
1337 || sym->ts.cl->backend_decl == length)
1342 if (sym->ts.cl->backend_decl == NULL)
1344 tree len = build_decl (VAR_DECL,
1345 get_identifier ("..__result"),
1346 gfc_charlen_type_node);
1347 DECL_ARTIFICIAL (len) = 1;
1348 TREE_USED (len) = 1;
1349 sym->ts.cl->backend_decl = len;
1352 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1353 arg = sym->result ? sym->result : sym;
1354 backend_decl = arg->backend_decl;
1355 /* Temporary clear it, so that gfc_sym_type creates complete
1357 arg->backend_decl = NULL;
1358 type = gfc_sym_type (arg);
1359 arg->backend_decl = backend_decl;
1360 type = build_reference_type (type);
1364 parm = build_decl (PARM_DECL, get_identifier ("__result"), type);
1366 DECL_CONTEXT (parm) = fndecl;
1367 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1368 TREE_READONLY (parm) = 1;
1369 DECL_ARTIFICIAL (parm) = 1;
1370 gfc_finish_decl (parm, NULL_TREE);
1372 arglist = chainon (arglist, parm);
1373 typelist = TREE_CHAIN (typelist);
1375 if (sym->ts.type == BT_CHARACTER)
1377 gfc_allocate_lang_decl (parm);
1378 arglist = chainon (arglist, length);
1379 typelist = TREE_CHAIN (typelist);
1383 hidden_typelist = typelist;
1384 for (f = sym->formal; f; f = f->next)
1385 if (f->sym != NULL) /* Ignore alternate returns. */
1386 hidden_typelist = TREE_CHAIN (hidden_typelist);
1388 for (f = sym->formal; f; f = f->next)
1390 char name[GFC_MAX_SYMBOL_LEN + 2];
1392 /* Ignore alternate returns. */
1396 type = TREE_VALUE (typelist);
1398 if (f->sym->ts.type == BT_CHARACTER)
1400 tree len_type = TREE_VALUE (hidden_typelist);
1401 tree length = NULL_TREE;
1402 gcc_assert (len_type == gfc_charlen_type_node);
1404 strcpy (&name[1], f->sym->name);
1406 length = build_decl (PARM_DECL, get_identifier (name), len_type);
1408 hidden_arglist = chainon (hidden_arglist, length);
1409 DECL_CONTEXT (length) = fndecl;
1410 DECL_ARTIFICIAL (length) = 1;
1411 DECL_ARG_TYPE (length) = len_type;
1412 TREE_READONLY (length) = 1;
1413 gfc_finish_decl (length, NULL_TREE);
1415 /* TODO: Check string lengths when -fbounds-check. */
1417 /* Use the passed value for assumed length variables. */
1418 if (!f->sym->ts.cl->length)
1420 TREE_USED (length) = 1;
1421 if (!f->sym->ts.cl->backend_decl)
1422 f->sym->ts.cl->backend_decl = length;
1425 /* there is already another variable using this
1426 gfc_charlen node, build a new one for this variable
1427 and chain it into the list of gfc_charlens.
1428 This happens for e.g. in the case
1430 since CHARACTER declarations on the same line share
1431 the same gfc_charlen node. */
1434 cl = gfc_get_charlen ();
1435 cl->backend_decl = length;
1436 cl->next = f->sym->ts.cl->next;
1437 f->sym->ts.cl->next = cl;
1442 hidden_typelist = TREE_CHAIN (hidden_typelist);
1444 if (f->sym->ts.cl->backend_decl == NULL
1445 || f->sym->ts.cl->backend_decl == length)
1447 if (f->sym->ts.cl->backend_decl == NULL)
1448 gfc_create_string_length (f->sym);
1450 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1451 if (f->sym->attr.flavor == FL_PROCEDURE)
1452 type = build_pointer_type (gfc_get_function_type (f->sym));
1454 type = gfc_sym_type (f->sym);
1458 /* For non-constant length array arguments, make sure they use
1459 a different type node from TYPE_ARG_TYPES type. */
1460 if (f->sym->attr.dimension
1461 && type == TREE_VALUE (typelist)
1462 && TREE_CODE (type) == POINTER_TYPE
1463 && GFC_ARRAY_TYPE_P (type)
1464 && f->sym->as->type != AS_ASSUMED_SIZE
1465 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
1467 if (f->sym->attr.flavor == FL_PROCEDURE)
1468 type = build_pointer_type (gfc_get_function_type (f->sym));
1470 type = gfc_sym_type (f->sym);
1473 /* Build a the argument declaration. */
1474 parm = build_decl (PARM_DECL, gfc_sym_identifier (f->sym), type);
1476 /* Fill in arg stuff. */
1477 DECL_CONTEXT (parm) = fndecl;
1478 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1479 /* All implementation args are read-only. */
1480 TREE_READONLY (parm) = 1;
1482 gfc_finish_decl (parm, NULL_TREE);
1484 f->sym->backend_decl = parm;
1486 arglist = chainon (arglist, parm);
1487 typelist = TREE_CHAIN (typelist);
1490 /* Add the hidden string length parameters. */
1491 arglist = chainon (arglist, hidden_arglist);
1493 gcc_assert (TREE_VALUE (hidden_typelist) == void_type_node);
1494 DECL_ARGUMENTS (fndecl) = arglist;
1497 /* Convert FNDECL's code to GIMPLE and handle any nested functions. */
1500 gfc_gimplify_function (tree fndecl)
1502 struct cgraph_node *cgn;
1504 gimplify_function_tree (fndecl);
1505 dump_function (TDI_generic, fndecl);
1507 /* Generate errors for structured block violations. */
1508 /* ??? Could be done as part of resolve_labels. */
1510 diagnose_omp_structured_block_errors (fndecl);
1512 /* Convert all nested functions to GIMPLE now. We do things in this order
1513 so that items like VLA sizes are expanded properly in the context of the
1514 correct function. */
1515 cgn = cgraph_node (fndecl);
1516 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1517 gfc_gimplify_function (cgn->decl);
1521 /* Do the setup necessary before generating the body of a function. */
1524 trans_function_start (gfc_symbol * sym)
1528 fndecl = sym->backend_decl;
1530 /* Let GCC know the current scope is this function. */
1531 current_function_decl = fndecl;
1533 /* Let the world know what we're about to do. */
1534 announce_function (fndecl);
1536 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1538 /* Create RTL for function declaration. */
1539 rest_of_decl_compilation (fndecl, 1, 0);
1542 /* Create RTL for function definition. */
1543 make_decl_rtl (fndecl);
1545 init_function_start (fndecl);
1547 /* Even though we're inside a function body, we still don't want to
1548 call expand_expr to calculate the size of a variable-sized array.
1549 We haven't necessarily assigned RTL to all variables yet, so it's
1550 not safe to try to expand expressions involving them. */
1551 cfun->x_dont_save_pending_sizes_p = 1;
1553 /* function.c requires a push at the start of the function. */
1557 /* Create thunks for alternate entry points. */
1560 build_entry_thunks (gfc_namespace * ns)
1562 gfc_formal_arglist *formal;
1563 gfc_formal_arglist *thunk_formal;
1565 gfc_symbol *thunk_sym;
1573 /* This should always be a toplevel function. */
1574 gcc_assert (current_function_decl == NULL_TREE);
1576 gfc_get_backend_locus (&old_loc);
1577 for (el = ns->entries; el; el = el->next)
1579 thunk_sym = el->sym;
1581 build_function_decl (thunk_sym);
1582 create_function_arglist (thunk_sym);
1584 trans_function_start (thunk_sym);
1586 thunk_fndecl = thunk_sym->backend_decl;
1588 gfc_start_block (&body);
1590 /* Pass extra parameter identifying this entry point. */
1591 tmp = build_int_cst (gfc_array_index_type, el->id);
1592 args = tree_cons (NULL_TREE, tmp, NULL_TREE);
1593 string_args = NULL_TREE;
1595 if (thunk_sym->attr.function)
1597 if (gfc_return_by_reference (ns->proc_name))
1599 tree ref = DECL_ARGUMENTS (current_function_decl);
1600 args = tree_cons (NULL_TREE, ref, args);
1601 if (ns->proc_name->ts.type == BT_CHARACTER)
1602 args = tree_cons (NULL_TREE, TREE_CHAIN (ref),
1607 for (formal = ns->proc_name->formal; formal; formal = formal->next)
1609 /* Ignore alternate returns. */
1610 if (formal->sym == NULL)
1613 /* We don't have a clever way of identifying arguments, so resort to
1614 a brute-force search. */
1615 for (thunk_formal = thunk_sym->formal;
1617 thunk_formal = thunk_formal->next)
1619 if (thunk_formal->sym == formal->sym)
1625 /* Pass the argument. */
1626 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
1627 args = tree_cons (NULL_TREE, thunk_formal->sym->backend_decl,
1629 if (formal->sym->ts.type == BT_CHARACTER)
1631 tmp = thunk_formal->sym->ts.cl->backend_decl;
1632 string_args = tree_cons (NULL_TREE, tmp, string_args);
1637 /* Pass NULL for a missing argument. */
1638 args = tree_cons (NULL_TREE, null_pointer_node, args);
1639 if (formal->sym->ts.type == BT_CHARACTER)
1641 tmp = build_int_cst (gfc_charlen_type_node, 0);
1642 string_args = tree_cons (NULL_TREE, tmp, string_args);
1647 /* Call the master function. */
1648 args = nreverse (args);
1649 args = chainon (args, nreverse (string_args));
1650 tmp = ns->proc_name->backend_decl;
1651 tmp = build_function_call_expr (tmp, args);
1652 if (ns->proc_name->attr.mixed_entry_master)
1654 tree union_decl, field;
1655 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
1657 union_decl = build_decl (VAR_DECL, get_identifier ("__result"),
1658 TREE_TYPE (master_type));
1659 DECL_ARTIFICIAL (union_decl) = 1;
1660 DECL_EXTERNAL (union_decl) = 0;
1661 TREE_PUBLIC (union_decl) = 0;
1662 TREE_USED (union_decl) = 1;
1663 layout_decl (union_decl, 0);
1664 pushdecl (union_decl);
1666 DECL_CONTEXT (union_decl) = current_function_decl;
1667 tmp = build2 (MODIFY_EXPR,
1668 TREE_TYPE (union_decl),
1670 gfc_add_expr_to_block (&body, tmp);
1672 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
1673 field; field = TREE_CHAIN (field))
1674 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1675 thunk_sym->result->name) == 0)
1677 gcc_assert (field != NULL_TREE);
1678 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), union_decl, field,
1680 tmp = build2 (MODIFY_EXPR,
1681 TREE_TYPE (DECL_RESULT (current_function_decl)),
1682 DECL_RESULT (current_function_decl), tmp);
1683 tmp = build1_v (RETURN_EXPR, tmp);
1685 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
1688 tmp = build2 (MODIFY_EXPR,
1689 TREE_TYPE (DECL_RESULT (current_function_decl)),
1690 DECL_RESULT (current_function_decl), tmp);
1691 tmp = build1_v (RETURN_EXPR, tmp);
1693 gfc_add_expr_to_block (&body, tmp);
1695 /* Finish off this function and send it for code generation. */
1696 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
1698 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
1700 /* Output the GENERIC tree. */
1701 dump_function (TDI_original, thunk_fndecl);
1703 /* Store the end of the function, so that we get good line number
1704 info for the epilogue. */
1705 cfun->function_end_locus = input_location;
1707 /* We're leaving the context of this function, so zap cfun.
1708 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1709 tree_rest_of_compilation. */
1712 current_function_decl = NULL_TREE;
1714 gfc_gimplify_function (thunk_fndecl);
1715 cgraph_finalize_function (thunk_fndecl, false);
1717 /* We share the symbols in the formal argument list with other entry
1718 points and the master function. Clear them so that they are
1719 recreated for each function. */
1720 for (formal = thunk_sym->formal; formal; formal = formal->next)
1721 if (formal->sym != NULL) /* Ignore alternate returns. */
1723 formal->sym->backend_decl = NULL_TREE;
1724 if (formal->sym->ts.type == BT_CHARACTER)
1725 formal->sym->ts.cl->backend_decl = NULL_TREE;
1728 if (thunk_sym->attr.function)
1730 if (thunk_sym->ts.type == BT_CHARACTER)
1731 thunk_sym->ts.cl->backend_decl = NULL_TREE;
1732 if (thunk_sym->result->ts.type == BT_CHARACTER)
1733 thunk_sym->result->ts.cl->backend_decl = NULL_TREE;
1737 gfc_set_backend_locus (&old_loc);
1741 /* Create a decl for a function, and create any thunks for alternate entry
1745 gfc_create_function_decl (gfc_namespace * ns)
1747 /* Create a declaration for the master function. */
1748 build_function_decl (ns->proc_name);
1750 /* Compile the entry thunks. */
1752 build_entry_thunks (ns);
1754 /* Now create the read argument list. */
1755 create_function_arglist (ns->proc_name);
1758 /* Return the decl used to hold the function return value. If
1759 parent_flag is set, the context is the parent_scope*/
1762 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
1766 tree this_fake_result_decl;
1767 tree this_function_decl;
1769 char name[GFC_MAX_SYMBOL_LEN + 10];
1773 this_fake_result_decl = parent_fake_result_decl;
1774 this_function_decl = DECL_CONTEXT (current_function_decl);
1778 this_fake_result_decl = current_fake_result_decl;
1779 this_function_decl = current_function_decl;
1783 && sym->ns->proc_name->backend_decl == this_function_decl
1784 && sym->ns->proc_name->attr.entry_master
1785 && sym != sym->ns->proc_name)
1788 if (this_fake_result_decl != NULL)
1789 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
1790 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
1793 return TREE_VALUE (t);
1794 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
1797 this_fake_result_decl = parent_fake_result_decl;
1799 this_fake_result_decl = current_fake_result_decl;
1801 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
1805 for (field = TYPE_FIELDS (TREE_TYPE (decl));
1806 field; field = TREE_CHAIN (field))
1807 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1811 gcc_assert (field != NULL_TREE);
1812 decl = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field,
1816 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
1818 gfc_add_decl_to_parent_function (var);
1820 gfc_add_decl_to_function (var);
1822 SET_DECL_VALUE_EXPR (var, decl);
1823 DECL_HAS_VALUE_EXPR_P (var) = 1;
1824 GFC_DECL_RESULT (var) = 1;
1826 TREE_CHAIN (this_fake_result_decl)
1827 = tree_cons (get_identifier (sym->name), var,
1828 TREE_CHAIN (this_fake_result_decl));
1832 if (this_fake_result_decl != NULL_TREE)
1833 return TREE_VALUE (this_fake_result_decl);
1835 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
1840 if (sym->ts.type == BT_CHARACTER)
1842 if (sym->ts.cl->backend_decl == NULL_TREE)
1843 length = gfc_create_string_length (sym);
1845 length = sym->ts.cl->backend_decl;
1846 if (TREE_CODE (length) == VAR_DECL
1847 && DECL_CONTEXT (length) == NULL_TREE)
1848 gfc_add_decl_to_function (length);
1851 if (gfc_return_by_reference (sym))
1853 decl = DECL_ARGUMENTS (this_function_decl);
1855 if (sym->ns->proc_name->backend_decl == this_function_decl
1856 && sym->ns->proc_name->attr.entry_master)
1857 decl = TREE_CHAIN (decl);
1859 TREE_USED (decl) = 1;
1861 decl = gfc_build_dummy_array_decl (sym, decl);
1865 sprintf (name, "__result_%.20s",
1866 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
1868 decl = build_decl (VAR_DECL, get_identifier (name),
1869 TREE_TYPE (TREE_TYPE (this_function_decl)));
1871 DECL_ARTIFICIAL (decl) = 1;
1872 DECL_EXTERNAL (decl) = 0;
1873 TREE_PUBLIC (decl) = 0;
1874 TREE_USED (decl) = 1;
1875 GFC_DECL_RESULT (decl) = 1;
1876 TREE_ADDRESSABLE (decl) = 1;
1878 layout_decl (decl, 0);
1881 gfc_add_decl_to_parent_function (decl);
1883 gfc_add_decl_to_function (decl);
1887 parent_fake_result_decl = build_tree_list (NULL, decl);
1889 current_fake_result_decl = build_tree_list (NULL, decl);
1895 /* Builds a function decl. The remaining parameters are the types of the
1896 function arguments. Negative nargs indicates a varargs function. */
1899 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
1908 /* Library functions must be declared with global scope. */
1909 gcc_assert (current_function_decl == NULL_TREE);
1911 va_start (p, nargs);
1914 /* Create a list of the argument types. */
1915 for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
1917 argtype = va_arg (p, tree);
1918 arglist = gfc_chainon_list (arglist, argtype);
1923 /* Terminate the list. */
1924 arglist = gfc_chainon_list (arglist, void_type_node);
1927 /* Build the function type and decl. */
1928 fntype = build_function_type (rettype, arglist);
1929 fndecl = build_decl (FUNCTION_DECL, name, fntype);
1931 /* Mark this decl as external. */
1932 DECL_EXTERNAL (fndecl) = 1;
1933 TREE_PUBLIC (fndecl) = 1;
1939 rest_of_decl_compilation (fndecl, 1, 0);
1945 gfc_build_intrinsic_function_decls (void)
1947 tree gfc_int4_type_node = gfc_get_int_type (4);
1948 tree gfc_int8_type_node = gfc_get_int_type (8);
1949 tree gfc_int16_type_node = gfc_get_int_type (16);
1950 tree gfc_logical4_type_node = gfc_get_logical_type (4);
1951 tree gfc_real4_type_node = gfc_get_real_type (4);
1952 tree gfc_real8_type_node = gfc_get_real_type (8);
1953 tree gfc_real10_type_node = gfc_get_real_type (10);
1954 tree gfc_real16_type_node = gfc_get_real_type (16);
1955 tree gfc_complex4_type_node = gfc_get_complex_type (4);
1956 tree gfc_complex8_type_node = gfc_get_complex_type (8);
1957 tree gfc_complex10_type_node = gfc_get_complex_type (10);
1958 tree gfc_complex16_type_node = gfc_get_complex_type (16);
1959 tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
1961 /* String functions. */
1962 gfor_fndecl_compare_string =
1963 gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
1966 gfc_charlen_type_node, pchar_type_node,
1967 gfc_charlen_type_node, pchar_type_node);
1969 gfor_fndecl_concat_string =
1970 gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
1973 gfc_charlen_type_node, pchar_type_node,
1974 gfc_charlen_type_node, pchar_type_node,
1975 gfc_charlen_type_node, pchar_type_node);
1977 gfor_fndecl_string_len_trim =
1978 gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
1980 2, gfc_charlen_type_node,
1983 gfor_fndecl_string_index =
1984 gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
1986 5, gfc_charlen_type_node, pchar_type_node,
1987 gfc_charlen_type_node, pchar_type_node,
1988 gfc_logical4_type_node);
1990 gfor_fndecl_string_scan =
1991 gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
1993 5, gfc_charlen_type_node, pchar_type_node,
1994 gfc_charlen_type_node, pchar_type_node,
1995 gfc_logical4_type_node);
1997 gfor_fndecl_string_verify =
1998 gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
2000 5, gfc_charlen_type_node, pchar_type_node,
2001 gfc_charlen_type_node, pchar_type_node,
2002 gfc_logical4_type_node);
2004 gfor_fndecl_string_trim =
2005 gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
2008 build_pointer_type (gfc_charlen_type_node),
2010 gfc_charlen_type_node,
2013 gfor_fndecl_string_repeat =
2014 gfc_build_library_function_decl (get_identifier (PREFIX("string_repeat")),
2018 gfc_charlen_type_node,
2020 gfc_int4_type_node);
2022 gfor_fndecl_ttynam =
2023 gfc_build_library_function_decl (get_identifier (PREFIX("ttynam")),
2027 gfc_charlen_type_node,
2028 gfc_c_int_type_node);
2031 gfc_build_library_function_decl (get_identifier (PREFIX("fdate")),
2035 gfc_charlen_type_node);
2038 gfc_build_library_function_decl (get_identifier (PREFIX("ctime")),
2042 gfc_charlen_type_node,
2043 gfc_int8_type_node);
2045 gfor_fndecl_adjustl =
2046 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
2050 gfc_charlen_type_node, pchar_type_node);
2052 gfor_fndecl_adjustr =
2053 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
2057 gfc_charlen_type_node, pchar_type_node);
2059 gfor_fndecl_si_kind =
2060 gfc_build_library_function_decl (get_identifier ("selected_int_kind"),
2065 gfor_fndecl_sr_kind =
2066 gfc_build_library_function_decl (get_identifier ("selected_real_kind"),
2071 /* Power functions. */
2073 tree ctype, rtype, itype, jtype;
2074 int rkind, ikind, jkind;
2077 static int ikinds[NIKINDS] = {4, 8, 16};
2078 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2079 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2081 for (ikind=0; ikind < NIKINDS; ikind++)
2083 itype = gfc_get_int_type (ikinds[ikind]);
2085 for (jkind=0; jkind < NIKINDS; jkind++)
2087 jtype = gfc_get_int_type (ikinds[jkind]);
2090 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2092 gfor_fndecl_math_powi[jkind][ikind].integer =
2093 gfc_build_library_function_decl (get_identifier (name),
2094 jtype, 2, jtype, itype);
2098 for (rkind = 0; rkind < NRKINDS; rkind ++)
2100 rtype = gfc_get_real_type (rkinds[rkind]);
2103 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2105 gfor_fndecl_math_powi[rkind][ikind].real =
2106 gfc_build_library_function_decl (get_identifier (name),
2107 rtype, 2, rtype, itype);
2110 ctype = gfc_get_complex_type (rkinds[rkind]);
2113 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2115 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2116 gfc_build_library_function_decl (get_identifier (name),
2117 ctype, 2,ctype, itype);
2125 gfor_fndecl_math_cpowf =
2126 gfc_build_library_function_decl (get_identifier ("cpowf"),
2127 gfc_complex4_type_node,
2128 1, gfc_complex4_type_node);
2129 gfor_fndecl_math_cpow =
2130 gfc_build_library_function_decl (get_identifier ("cpow"),
2131 gfc_complex8_type_node,
2132 1, gfc_complex8_type_node);
2133 if (gfc_complex10_type_node)
2134 gfor_fndecl_math_cpowl10 =
2135 gfc_build_library_function_decl (get_identifier ("cpowl"),
2136 gfc_complex10_type_node, 1,
2137 gfc_complex10_type_node);
2138 if (gfc_complex16_type_node)
2139 gfor_fndecl_math_cpowl16 =
2140 gfc_build_library_function_decl (get_identifier ("cpowl"),
2141 gfc_complex16_type_node, 1,
2142 gfc_complex16_type_node);
2144 gfor_fndecl_math_ishftc4 =
2145 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
2147 3, gfc_int4_type_node,
2148 gfc_int4_type_node, gfc_int4_type_node);
2149 gfor_fndecl_math_ishftc8 =
2150 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
2152 3, gfc_int8_type_node,
2153 gfc_int4_type_node, gfc_int4_type_node);
2154 if (gfc_int16_type_node)
2155 gfor_fndecl_math_ishftc16 =
2156 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc16")),
2157 gfc_int16_type_node, 3,
2158 gfc_int16_type_node,
2160 gfc_int4_type_node);
2162 gfor_fndecl_math_exponent4 =
2163 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r4")),
2165 1, gfc_real4_type_node);
2166 gfor_fndecl_math_exponent8 =
2167 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r8")),
2169 1, gfc_real8_type_node);
2170 if (gfc_real10_type_node)
2171 gfor_fndecl_math_exponent10 =
2172 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r10")),
2173 gfc_int4_type_node, 1,
2174 gfc_real10_type_node);
2175 if (gfc_real16_type_node)
2176 gfor_fndecl_math_exponent16 =
2177 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r16")),
2178 gfc_int4_type_node, 1,
2179 gfc_real16_type_node);
2181 /* Other functions. */
2183 gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
2184 gfc_array_index_type,
2185 1, pvoid_type_node);
2187 gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
2188 gfc_array_index_type,
2190 gfc_array_index_type);
2193 gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
2199 /* Make prototypes for runtime library functions. */
2202 gfc_build_builtin_function_decls (void)
2204 tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
2205 tree gfc_int4_type_node = gfc_get_int_type (4);
2206 tree gfc_int8_type_node = gfc_get_int_type (8);
2207 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2208 tree gfc_pint4_type_node = build_pointer_type (gfc_int4_type_node);
2210 /* Treat these two internal malloc wrappers as malloc. */
2211 gfor_fndecl_internal_malloc =
2212 gfc_build_library_function_decl (get_identifier (PREFIX("internal_malloc")),
2213 pvoid_type_node, 1, gfc_int4_type_node);
2214 DECL_IS_MALLOC (gfor_fndecl_internal_malloc) = 1;
2216 gfor_fndecl_internal_malloc64 =
2217 gfc_build_library_function_decl (get_identifier
2218 (PREFIX("internal_malloc64")),
2219 pvoid_type_node, 1, gfc_int8_type_node);
2220 DECL_IS_MALLOC (gfor_fndecl_internal_malloc64) = 1;
2222 gfor_fndecl_internal_realloc =
2223 gfc_build_library_function_decl (get_identifier
2224 (PREFIX("internal_realloc")),
2225 pvoid_type_node, 2, pvoid_type_node,
2226 gfc_int4_type_node);
2228 gfor_fndecl_internal_realloc64 =
2229 gfc_build_library_function_decl (get_identifier
2230 (PREFIX("internal_realloc64")),
2231 pvoid_type_node, 2, pvoid_type_node,
2232 gfc_int8_type_node);
2234 gfor_fndecl_internal_free =
2235 gfc_build_library_function_decl (get_identifier (PREFIX("internal_free")),
2236 void_type_node, 1, pvoid_type_node);
2238 gfor_fndecl_allocate =
2239 gfc_build_library_function_decl (get_identifier (PREFIX("allocate")),
2240 void_type_node, 2, ppvoid_type_node,
2241 gfc_int4_type_node);
2243 gfor_fndecl_allocate64 =
2244 gfc_build_library_function_decl (get_identifier (PREFIX("allocate64")),
2245 void_type_node, 2, ppvoid_type_node,
2246 gfc_int8_type_node);
2248 gfor_fndecl_allocate_array =
2249 gfc_build_library_function_decl (get_identifier (PREFIX("allocate_array")),
2250 void_type_node, 2, ppvoid_type_node,
2251 gfc_int4_type_node);
2253 gfor_fndecl_allocate64_array =
2254 gfc_build_library_function_decl (get_identifier (PREFIX("allocate64_array")),
2255 void_type_node, 2, ppvoid_type_node,
2256 gfc_int8_type_node);
2258 gfor_fndecl_deallocate =
2259 gfc_build_library_function_decl (get_identifier (PREFIX("deallocate")),
2260 void_type_node, 2, ppvoid_type_node,
2261 gfc_pint4_type_node);
2263 gfor_fndecl_stop_numeric =
2264 gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
2265 void_type_node, 1, gfc_int4_type_node);
2267 /* Stop doesn't return. */
2268 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
2270 gfor_fndecl_stop_string =
2271 gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
2272 void_type_node, 2, pchar_type_node,
2273 gfc_int4_type_node);
2274 /* Stop doesn't return. */
2275 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
2277 gfor_fndecl_pause_numeric =
2278 gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
2279 void_type_node, 1, gfc_int4_type_node);
2281 gfor_fndecl_pause_string =
2282 gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
2283 void_type_node, 2, pchar_type_node,
2284 gfc_int4_type_node);
2286 gfor_fndecl_select_string =
2287 gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
2288 pvoid_type_node, 0);
2290 gfor_fndecl_runtime_error =
2291 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
2292 void_type_node, 1, pchar_type_node);
2293 /* The runtime_error function does not return. */
2294 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
2296 gfor_fndecl_set_fpe =
2297 gfc_build_library_function_decl (get_identifier (PREFIX("set_fpe")),
2298 void_type_node, 1, gfc_c_int_type_node);
2300 gfor_fndecl_set_std =
2301 gfc_build_library_function_decl (get_identifier (PREFIX("set_std")),
2306 gfc_int4_type_node);
2308 gfor_fndecl_set_convert =
2309 gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")),
2310 void_type_node, 1, gfc_c_int_type_node);
2312 gfor_fndecl_set_record_marker =
2313 gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")),
2314 void_type_node, 1, gfc_c_int_type_node);
2316 gfor_fndecl_in_pack = gfc_build_library_function_decl (
2317 get_identifier (PREFIX("internal_pack")),
2318 pvoid_type_node, 1, pvoid_type_node);
2320 gfor_fndecl_in_unpack = gfc_build_library_function_decl (
2321 get_identifier (PREFIX("internal_unpack")),
2322 pvoid_type_node, 1, pvoid_type_node);
2324 gfor_fndecl_associated =
2325 gfc_build_library_function_decl (
2326 get_identifier (PREFIX("associated")),
2327 gfc_logical4_type_node,
2332 gfc_build_intrinsic_function_decls ();
2333 gfc_build_intrinsic_lib_fndecls ();
2334 gfc_build_io_library_fndecls ();
2338 /* Evaluate the length of dummy character variables. */
2341 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl, tree fnbody)
2345 gfc_finish_decl (cl->backend_decl, NULL_TREE);
2347 gfc_start_block (&body);
2349 /* Evaluate the string length expression. */
2350 gfc_trans_init_string_length (cl, &body);
2352 gfc_trans_vla_type_sizes (sym, &body);
2354 gfc_add_expr_to_block (&body, fnbody);
2355 return gfc_finish_block (&body);
2359 /* Allocate and cleanup an automatic character variable. */
2362 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
2368 gcc_assert (sym->backend_decl);
2369 gcc_assert (sym->ts.cl && sym->ts.cl->length);
2371 gfc_start_block (&body);
2373 /* Evaluate the string length expression. */
2374 gfc_trans_init_string_length (sym->ts.cl, &body);
2376 gfc_trans_vla_type_sizes (sym, &body);
2378 decl = sym->backend_decl;
2380 /* Emit a DECL_EXPR for this variable, which will cause the
2381 gimplifier to allocate storage, and all that good stuff. */
2382 tmp = build1 (DECL_EXPR, TREE_TYPE (decl), decl);
2383 gfc_add_expr_to_block (&body, tmp);
2385 gfc_add_expr_to_block (&body, fnbody);
2386 return gfc_finish_block (&body);
2389 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
2392 gfc_trans_assign_aux_var (gfc_symbol * sym, tree fnbody)
2396 gcc_assert (sym->backend_decl);
2397 gfc_start_block (&body);
2399 /* Set the initial value to length. See the comments in
2400 function gfc_add_assign_aux_vars in this file. */
2401 gfc_add_modify_expr (&body, GFC_DECL_STRING_LEN (sym->backend_decl),
2402 build_int_cst (NULL_TREE, -2));
2404 gfc_add_expr_to_block (&body, fnbody);
2405 return gfc_finish_block (&body);
2409 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
2411 tree t = *tp, var, val;
2413 if (t == NULL || t == error_mark_node)
2415 if (TREE_CONSTANT (t) || DECL_P (t))
2418 if (TREE_CODE (t) == SAVE_EXPR)
2420 if (SAVE_EXPR_RESOLVED_P (t))
2422 *tp = TREE_OPERAND (t, 0);
2425 val = TREE_OPERAND (t, 0);
2430 var = gfc_create_var_np (TREE_TYPE (t), NULL);
2431 gfc_add_decl_to_function (var);
2432 gfc_add_modify_expr (body, var, val);
2433 if (TREE_CODE (t) == SAVE_EXPR)
2434 TREE_OPERAND (t, 0) = var;
2439 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
2443 if (type == NULL || type == error_mark_node)
2446 type = TYPE_MAIN_VARIANT (type);
2448 if (TREE_CODE (type) == INTEGER_TYPE)
2450 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
2451 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
2453 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2455 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
2456 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
2459 else if (TREE_CODE (type) == ARRAY_TYPE)
2461 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
2462 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
2463 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
2464 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
2466 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2468 TYPE_SIZE (t) = TYPE_SIZE (type);
2469 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
2474 /* Make sure all type sizes and array domains are either constant,
2475 or variable or parameter decls. This is a simplified variant
2476 of gimplify_type_sizes, but we can't use it here, as none of the
2477 variables in the expressions have been gimplified yet.
2478 As type sizes and domains for various variable length arrays
2479 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
2480 time, without this routine gimplify_type_sizes in the middle-end
2481 could result in the type sizes being gimplified earlier than where
2482 those variables are initialized. */
2485 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
2487 tree type = TREE_TYPE (sym->backend_decl);
2489 if (TREE_CODE (type) == FUNCTION_TYPE
2490 && (sym->attr.function || sym->attr.result || sym->attr.entry))
2492 if (! current_fake_result_decl)
2495 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
2498 while (POINTER_TYPE_P (type))
2499 type = TREE_TYPE (type);
2501 if (GFC_DESCRIPTOR_TYPE_P (type))
2503 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2505 while (POINTER_TYPE_P (etype))
2506 etype = TREE_TYPE (etype);
2508 gfc_trans_vla_type_sizes_1 (etype, body);
2511 gfc_trans_vla_type_sizes_1 (type, body);
2515 /* Generate function entry and exit code, and add it to the function body.
2517 Allocation and initialization of array variables.
2518 Allocation of character string variables.
2519 Initialization and possibly repacking of dummy arrays.
2520 Initialization of ASSIGN statement auxiliary variable. */
2523 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2527 gfc_formal_arglist *f;
2530 /* Deal with implicit return variables. Explicit return variables will
2531 already have been added. */
2532 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2534 if (!current_fake_result_decl)
2536 gfc_entry_list *el = NULL;
2537 if (proc_sym->attr.entry_master)
2539 for (el = proc_sym->ns->entries; el; el = el->next)
2540 if (el->sym != el->sym->result)
2544 warning (0, "Function does not return a value");
2546 else if (proc_sym->as)
2548 tree result = TREE_VALUE (current_fake_result_decl);
2549 fnbody = gfc_trans_dummy_array_bias (proc_sym, result, fnbody);
2551 /* An automatic character length, pointer array result. */
2552 if (proc_sym->ts.type == BT_CHARACTER
2553 && TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2554 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2557 else if (proc_sym->ts.type == BT_CHARACTER)
2559 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2560 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2564 gcc_assert (gfc_option.flag_f2c
2565 && proc_sym->ts.type == BT_COMPLEX);
2568 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2570 if (sym->attr.dimension)
2572 switch (sym->as->type)
2575 if (sym->attr.dummy || sym->attr.result)
2577 gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2578 else if (sym->attr.pointer || sym->attr.allocatable)
2580 if (TREE_STATIC (sym->backend_decl))
2581 gfc_trans_static_array_pointer (sym);
2583 fnbody = gfc_trans_deferred_array (sym, fnbody);
2587 gfc_get_backend_locus (&loc);
2588 gfc_set_backend_locus (&sym->declared_at);
2589 fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2591 gfc_set_backend_locus (&loc);
2595 case AS_ASSUMED_SIZE:
2596 /* Must be a dummy parameter. */
2597 gcc_assert (sym->attr.dummy);
2599 /* We should always pass assumed size arrays the g77 way. */
2600 fnbody = gfc_trans_g77_array (sym, fnbody);
2603 case AS_ASSUMED_SHAPE:
2604 /* Must be a dummy parameter. */
2605 gcc_assert (sym->attr.dummy);
2607 fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2612 fnbody = gfc_trans_deferred_array (sym, fnbody);
2619 else if (sym->ts.type == BT_CHARACTER)
2621 gfc_get_backend_locus (&loc);
2622 gfc_set_backend_locus (&sym->declared_at);
2623 if (sym->attr.dummy || sym->attr.result)
2624 fnbody = gfc_trans_dummy_character (sym, sym->ts.cl, fnbody);
2626 fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2627 gfc_set_backend_locus (&loc);
2629 else if (sym->attr.assign)
2631 gfc_get_backend_locus (&loc);
2632 gfc_set_backend_locus (&sym->declared_at);
2633 fnbody = gfc_trans_assign_aux_var (sym, fnbody);
2634 gfc_set_backend_locus (&loc);
2640 gfc_init_block (&body);
2642 for (f = proc_sym->formal; f; f = f->next)
2643 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
2645 gcc_assert (f->sym->ts.cl->backend_decl != NULL);
2646 if (TREE_CODE (f->sym->ts.cl->backend_decl) == PARM_DECL)
2647 gfc_trans_vla_type_sizes (f->sym, &body);
2650 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
2651 && current_fake_result_decl != NULL)
2653 gcc_assert (proc_sym->ts.cl->backend_decl != NULL);
2654 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == PARM_DECL)
2655 gfc_trans_vla_type_sizes (proc_sym, &body);
2658 gfc_add_expr_to_block (&body, fnbody);
2659 return gfc_finish_block (&body);
2663 /* Output an initialized decl for a module variable. */
2666 gfc_create_module_variable (gfc_symbol * sym)
2670 /* Module functions with alternate entries are dealt with later and
2671 would get caught by the next condition. */
2672 if (sym->attr.entry)
2675 /* Only output symbols from this module. */
2676 if (sym->ns != module_namespace)
2678 /* I don't think this should ever happen. */
2679 internal_error ("module symbol %s in wrong namespace", sym->name);
2682 /* Only output variables and array valued parameters. */
2683 if (sym->attr.flavor != FL_VARIABLE
2684 && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0))
2687 /* Don't generate variables from other modules. Variables from
2688 COMMONs will already have been generated. */
2689 if (sym->attr.use_assoc || sym->attr.in_common)
2692 /* Equivalenced variables arrive here after creation. */
2693 if (sym->backend_decl
2694 && (sym->equiv_built || sym->attr.in_equivalence))
2697 if (sym->backend_decl)
2698 internal_error ("backend decl for module variable %s already exists",
2701 /* We always want module variables to be created. */
2702 sym->attr.referenced = 1;
2703 /* Create the decl. */
2704 decl = gfc_get_symbol_decl (sym);
2706 /* Create the variable. */
2708 rest_of_decl_compilation (decl, 1, 0);
2710 /* Also add length of strings. */
2711 if (sym->ts.type == BT_CHARACTER)
2715 length = sym->ts.cl->backend_decl;
2716 if (!INTEGER_CST_P (length))
2719 rest_of_decl_compilation (length, 1, 0);
2725 /* Generate all the required code for module variables. */
2728 gfc_generate_module_vars (gfc_namespace * ns)
2730 module_namespace = ns;
2732 /* Check if the frontend left the namespace in a reasonable state. */
2733 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
2735 /* Generate COMMON blocks. */
2736 gfc_trans_common (ns);
2738 /* Create decls for all the module variables. */
2739 gfc_traverse_ns (ns, gfc_create_module_variable);
2743 gfc_generate_contained_functions (gfc_namespace * parent)
2747 /* We create all the prototypes before generating any code. */
2748 for (ns = parent->contained; ns; ns = ns->sibling)
2750 /* Skip namespaces from used modules. */
2751 if (ns->parent != parent)
2754 gfc_create_function_decl (ns);
2757 for (ns = parent->contained; ns; ns = ns->sibling)
2759 /* Skip namespaces from used modules. */
2760 if (ns->parent != parent)
2763 gfc_generate_function_code (ns);
2768 /* Drill down through expressions for the array specification bounds and
2769 character length calling generate_local_decl for all those variables
2770 that have not already been declared. */
2773 generate_local_decl (gfc_symbol *);
2776 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
2778 gfc_actual_arglist *arg;
2785 switch (e->expr_type)
2788 for (arg = e->value.function.actual; arg; arg = arg->next)
2789 generate_expr_decls (sym, arg->expr);
2792 /* If the variable is not the same as the dependent, 'sym', and
2793 it is not marked as being declared and it is in the same
2794 namespace as 'sym', add it to the local declarations. */
2796 if (sym == e->symtree->n.sym
2797 || e->symtree->n.sym->mark
2798 || e->symtree->n.sym->ns != sym->ns)
2801 generate_local_decl (e->symtree->n.sym);
2805 generate_expr_decls (sym, e->value.op.op1);
2806 generate_expr_decls (sym, e->value.op.op2);
2815 for (ref = e->ref; ref; ref = ref->next)
2820 for (i = 0; i < ref->u.ar.dimen; i++)
2822 generate_expr_decls (sym, ref->u.ar.start[i]);
2823 generate_expr_decls (sym, ref->u.ar.end[i]);
2824 generate_expr_decls (sym, ref->u.ar.stride[i]);
2829 generate_expr_decls (sym, ref->u.ss.start);
2830 generate_expr_decls (sym, ref->u.ss.end);
2834 if (ref->u.c.component->ts.type == BT_CHARACTER
2835 && ref->u.c.component->ts.cl->length->expr_type
2837 generate_expr_decls (sym, ref->u.c.component->ts.cl->length);
2839 if (ref->u.c.component->as)
2840 for (i = 0; i < ref->u.c.component->as->rank; i++)
2842 generate_expr_decls (sym, ref->u.c.component->as->lower[i]);
2843 generate_expr_decls (sym, ref->u.c.component->as->upper[i]);
2852 /* Check for dependencies in the character length and array spec. */
2855 generate_dependency_declarations (gfc_symbol *sym)
2859 if (sym->ts.type == BT_CHARACTER
2860 && sym->ts.cl->length->expr_type != EXPR_CONSTANT)
2861 generate_expr_decls (sym, sym->ts.cl->length);
2863 if (sym->as && sym->as->rank)
2865 for (i = 0; i < sym->as->rank; i++)
2867 generate_expr_decls (sym, sym->as->lower[i]);
2868 generate_expr_decls (sym, sym->as->upper[i]);
2874 /* Generate decls for all local variables. We do this to ensure correct
2875 handling of expressions which only appear in the specification of
2879 generate_local_decl (gfc_symbol * sym)
2881 if (sym->attr.flavor == FL_VARIABLE)
2883 /* Check for dependencies in the array specification and string
2884 length, adding the necessary declarations to the function. We
2885 mark the symbol now, as well as in traverse_ns, to prevent
2886 getting stuck in a circular dependency. */
2888 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
2889 generate_dependency_declarations (sym);
2891 if (sym->attr.referenced)
2892 gfc_get_symbol_decl (sym);
2893 else if (sym->attr.dummy && warn_unused_parameter)
2894 gfc_warning ("Unused parameter %s declared at %L", sym->name,
2896 /* Warn for unused variables, but not if they're inside a common
2897 block or are use-associated. */
2898 else if (warn_unused_variable
2899 && !(sym->attr.in_common || sym->attr.use_assoc))
2900 gfc_warning ("Unused variable %s declared at %L", sym->name,
2902 /* For variable length CHARACTER parameters, the PARM_DECL already
2903 references the length variable, so force gfc_get_symbol_decl
2904 even when not referenced. If optimize > 0, it will be optimized
2905 away anyway. But do this only after emitting -Wunused-parameter
2906 warning if requested. */
2907 if (sym->attr.dummy && ! sym->attr.referenced
2908 && sym->ts.type == BT_CHARACTER
2909 && sym->ts.cl->backend_decl != NULL
2910 && TREE_CODE (sym->ts.cl->backend_decl) == VAR_DECL)
2912 sym->attr.referenced = 1;
2913 gfc_get_symbol_decl (sym);
2919 generate_local_vars (gfc_namespace * ns)
2921 gfc_traverse_ns (ns, generate_local_decl);
2925 /* Generate a switch statement to jump to the correct entry point. Also
2926 creates the label decls for the entry points. */
2929 gfc_trans_entry_master_switch (gfc_entry_list * el)
2936 gfc_init_block (&block);
2937 for (; el; el = el->next)
2939 /* Add the case label. */
2940 label = gfc_build_label_decl (NULL_TREE);
2941 val = build_int_cst (gfc_array_index_type, el->id);
2942 tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
2943 gfc_add_expr_to_block (&block, tmp);
2945 /* And jump to the actual entry point. */
2946 label = gfc_build_label_decl (NULL_TREE);
2947 tmp = build1_v (GOTO_EXPR, label);
2948 gfc_add_expr_to_block (&block, tmp);
2950 /* Save the label decl. */
2953 tmp = gfc_finish_block (&block);
2954 /* The first argument selects the entry point. */
2955 val = DECL_ARGUMENTS (current_function_decl);
2956 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
2961 /* Generate code for a function. */
2964 gfc_generate_function_code (gfc_namespace * ns)
2975 sym = ns->proc_name;
2977 /* Check that the frontend isn't still using this. */
2978 gcc_assert (sym->tlink == NULL);
2981 /* Create the declaration for functions with global scope. */
2982 if (!sym->backend_decl)
2983 gfc_create_function_decl (ns);
2985 fndecl = sym->backend_decl;
2986 old_context = current_function_decl;
2990 push_function_context ();
2991 saved_parent_function_decls = saved_function_decls;
2992 saved_function_decls = NULL_TREE;
2995 trans_function_start (sym);
2997 gfc_start_block (&block);
2999 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
3001 /* Copy length backend_decls to all entry point result
3006 gfc_conv_const_charlen (ns->proc_name->ts.cl);
3007 backend_decl = ns->proc_name->result->ts.cl->backend_decl;
3008 for (el = ns->entries; el; el = el->next)
3009 el->sym->result->ts.cl->backend_decl = backend_decl;
3012 /* Translate COMMON blocks. */
3013 gfc_trans_common (ns);
3015 /* Null the parent fake result declaration if this namespace is
3016 a module function or an external procedures. */
3017 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3018 || ns->parent == NULL)
3019 parent_fake_result_decl = NULL_TREE;
3021 gfc_generate_contained_functions (ns);
3023 generate_local_vars (ns);
3025 /* Keep the parent fake result declaration in module functions
3026 or external procedures. */
3027 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3028 || ns->parent == NULL)
3029 current_fake_result_decl = parent_fake_result_decl;
3031 current_fake_result_decl = NULL_TREE;
3033 current_function_return_label = NULL;
3035 /* Now generate the code for the body of this function. */
3036 gfc_init_block (&body);
3038 /* If this is the main program, add a call to set_std to set up the
3039 runtime library Fortran language standard parameters. */
3041 if (sym->attr.is_main_program)
3043 tree arglist, gfc_int4_type_node;
3045 gfc_int4_type_node = gfc_get_int_type (4);
3046 arglist = gfc_chainon_list (NULL_TREE,
3047 build_int_cst (gfc_int4_type_node,
3048 gfc_option.warn_std));
3049 arglist = gfc_chainon_list (arglist,
3050 build_int_cst (gfc_int4_type_node,
3051 gfc_option.allow_std));
3052 arglist = gfc_chainon_list (arglist,
3053 build_int_cst (gfc_int4_type_node,
3055 tmp = build_function_call_expr (gfor_fndecl_set_std, arglist);
3056 gfc_add_expr_to_block (&body, tmp);
3059 /* If this is the main program and a -ffpe-trap option was provided,
3060 add a call to set_fpe so that the library will raise a FPE when
3062 if (sym->attr.is_main_program && gfc_option.fpe != 0)
3064 tree arglist, gfc_c_int_type_node;
3066 gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3067 arglist = gfc_chainon_list (NULL_TREE,
3068 build_int_cst (gfc_c_int_type_node,
3070 tmp = build_function_call_expr (gfor_fndecl_set_fpe, arglist);
3071 gfc_add_expr_to_block (&body, tmp);
3074 /* If this is the main program and an -fconvert option was provided,
3075 add a call to set_convert. */
3077 if (sym->attr.is_main_program && gfc_option.convert != CONVERT_NATIVE)
3079 tree arglist, gfc_c_int_type_node;
3081 gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3082 arglist = gfc_chainon_list (NULL_TREE,
3083 build_int_cst (gfc_c_int_type_node,
3084 gfc_option.convert));
3085 tmp = build_function_call_expr (gfor_fndecl_set_convert, arglist);
3086 gfc_add_expr_to_block (&body, tmp);
3089 /* If this is the main program and an -frecord-marker option was provided,
3090 add a call to set_record_marker. */
3092 if (sym->attr.is_main_program && gfc_option.record_marker != 0)
3094 tree arglist, gfc_c_int_type_node;
3096 gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3097 arglist = gfc_chainon_list (NULL_TREE,
3098 build_int_cst (gfc_c_int_type_node,
3099 gfc_option.record_marker));
3100 tmp = build_function_call_expr (gfor_fndecl_set_record_marker, arglist);
3101 gfc_add_expr_to_block (&body, tmp);
3105 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
3106 && sym->attr.subroutine)
3108 tree alternate_return;
3109 alternate_return = gfc_get_fake_result_decl (sym, 0);
3110 gfc_add_modify_expr (&body, alternate_return, integer_zero_node);
3115 /* Jump to the correct entry point. */
3116 tmp = gfc_trans_entry_master_switch (ns->entries);
3117 gfc_add_expr_to_block (&body, tmp);
3120 tmp = gfc_trans_code (ns->code);
3121 gfc_add_expr_to_block (&body, tmp);
3123 /* Add a return label if needed. */
3124 if (current_function_return_label)
3126 tmp = build1_v (LABEL_EXPR, current_function_return_label);
3127 gfc_add_expr_to_block (&body, tmp);
3130 tmp = gfc_finish_block (&body);
3131 /* Add code to create and cleanup arrays. */
3132 tmp = gfc_trans_deferred_vars (sym, tmp);
3133 gfc_add_expr_to_block (&block, tmp);
3135 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
3137 if (sym->attr.subroutine || sym == sym->result)
3139 if (current_fake_result_decl != NULL)
3140 result = TREE_VALUE (current_fake_result_decl);
3143 current_fake_result_decl = NULL_TREE;
3146 result = sym->result->backend_decl;
3148 if (result == NULL_TREE)
3149 warning (0, "Function return value not set");
3152 /* Set the return value to the dummy result variable. */
3153 tmp = build2 (MODIFY_EXPR, TREE_TYPE (result),
3154 DECL_RESULT (fndecl), result);
3155 tmp = build1_v (RETURN_EXPR, tmp);
3156 gfc_add_expr_to_block (&block, tmp);
3160 /* Add all the decls we created during processing. */
3161 decl = saved_function_decls;
3166 next = TREE_CHAIN (decl);
3167 TREE_CHAIN (decl) = NULL_TREE;
3171 saved_function_decls = NULL_TREE;
3173 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
3175 /* Finish off this function and send it for code generation. */
3177 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3179 /* Output the GENERIC tree. */
3180 dump_function (TDI_original, fndecl);
3182 /* Store the end of the function, so that we get good line number
3183 info for the epilogue. */
3184 cfun->function_end_locus = input_location;
3186 /* We're leaving the context of this function, so zap cfun.
3187 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
3188 tree_rest_of_compilation. */
3193 pop_function_context ();
3194 saved_function_decls = saved_parent_function_decls;
3196 current_function_decl = old_context;
3198 if (decl_function_context (fndecl))
3199 /* Register this function with cgraph just far enough to get it
3200 added to our parent's nested function list. */
3201 (void) cgraph_node (fndecl);
3204 gfc_gimplify_function (fndecl);
3205 cgraph_finalize_function (fndecl, false);
3210 gfc_generate_constructors (void)
3212 gcc_assert (gfc_static_ctors == NULL_TREE);
3220 if (gfc_static_ctors == NULL_TREE)
3223 fnname = get_file_function_name ('I');
3224 type = build_function_type (void_type_node,
3225 gfc_chainon_list (NULL_TREE, void_type_node));
3227 fndecl = build_decl (FUNCTION_DECL, fnname, type);
3228 TREE_PUBLIC (fndecl) = 1;
3230 decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
3231 DECL_ARTIFICIAL (decl) = 1;
3232 DECL_IGNORED_P (decl) = 1;
3233 DECL_CONTEXT (decl) = fndecl;
3234 DECL_RESULT (fndecl) = decl;
3238 current_function_decl = fndecl;
3240 rest_of_decl_compilation (fndecl, 1, 0);
3242 make_decl_rtl (fndecl);
3244 init_function_start (fndecl);
3248 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
3251 build_function_call_expr (TREE_VALUE (gfc_static_ctors), NULL_TREE);
3252 DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
3257 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3259 free_after_parsing (cfun);
3260 free_after_compilation (cfun);
3262 tree_rest_of_compilation (fndecl);
3264 current_function_decl = NULL_TREE;
3268 /* Translates a BLOCK DATA program unit. This means emitting the
3269 commons contained therein plus their initializations. We also emit
3270 a globally visible symbol to make sure that each BLOCK DATA program
3271 unit remains unique. */
3274 gfc_generate_block_data (gfc_namespace * ns)
3279 /* Tell the backend the source location of the block data. */
3281 gfc_set_backend_locus (&ns->proc_name->declared_at);
3283 gfc_set_backend_locus (&gfc_current_locus);
3285 /* Process the DATA statements. */
3286 gfc_trans_common (ns);
3288 /* Create a global symbol with the mane of the block data. This is to
3289 generate linker errors if the same name is used twice. It is never
3292 id = gfc_sym_mangled_function_id (ns->proc_name);
3294 id = get_identifier ("__BLOCK_DATA__");
3296 decl = build_decl (VAR_DECL, id, gfc_array_index_type);
3297 TREE_PUBLIC (decl) = 1;
3298 TREE_STATIC (decl) = 1;
3301 rest_of_decl_compilation (decl, 1, 0);
3305 #include "gt-fortran-trans-decl.h"