1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
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 3, 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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* trans-decl.c -- Handling of backend function and variable decls, etc */
26 #include "coretypes.h"
28 #include "tree-dump.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_pause_numeric;
78 tree gfor_fndecl_pause_string;
79 tree gfor_fndecl_stop_numeric;
80 tree gfor_fndecl_stop_string;
81 tree gfor_fndecl_runtime_error;
82 tree gfor_fndecl_runtime_error_at;
83 tree gfor_fndecl_runtime_warning_at;
84 tree gfor_fndecl_os_error;
85 tree gfor_fndecl_generate_error;
86 tree gfor_fndecl_set_fpe;
87 tree gfor_fndecl_set_options;
88 tree gfor_fndecl_set_convert;
89 tree gfor_fndecl_set_record_marker;
90 tree gfor_fndecl_set_max_subrecord_length;
91 tree gfor_fndecl_ctime;
92 tree gfor_fndecl_fdate;
93 tree gfor_fndecl_ttynam;
94 tree gfor_fndecl_in_pack;
95 tree gfor_fndecl_in_unpack;
96 tree gfor_fndecl_associated;
99 /* Math functions. Many other math functions are handled in
100 trans-intrinsic.c. */
102 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
103 tree gfor_fndecl_math_ishftc4;
104 tree gfor_fndecl_math_ishftc8;
105 tree gfor_fndecl_math_ishftc16;
108 /* String functions. */
110 tree gfor_fndecl_compare_string;
111 tree gfor_fndecl_concat_string;
112 tree gfor_fndecl_string_len_trim;
113 tree gfor_fndecl_string_index;
114 tree gfor_fndecl_string_scan;
115 tree gfor_fndecl_string_verify;
116 tree gfor_fndecl_string_trim;
117 tree gfor_fndecl_string_minmax;
118 tree gfor_fndecl_adjustl;
119 tree gfor_fndecl_adjustr;
120 tree gfor_fndecl_select_string;
121 tree gfor_fndecl_compare_string_char4;
122 tree gfor_fndecl_concat_string_char4;
123 tree gfor_fndecl_string_len_trim_char4;
124 tree gfor_fndecl_string_index_char4;
125 tree gfor_fndecl_string_scan_char4;
126 tree gfor_fndecl_string_verify_char4;
127 tree gfor_fndecl_string_trim_char4;
128 tree gfor_fndecl_string_minmax_char4;
129 tree gfor_fndecl_adjustl_char4;
130 tree gfor_fndecl_adjustr_char4;
131 tree gfor_fndecl_select_string_char4;
134 /* Conversion between character kinds. */
135 tree gfor_fndecl_convert_char1_to_char4;
136 tree gfor_fndecl_convert_char4_to_char1;
139 /* Other misc. runtime library functions. */
141 tree gfor_fndecl_size0;
142 tree gfor_fndecl_size1;
143 tree gfor_fndecl_iargc;
145 /* Intrinsic functions implemented in Fortran. */
146 tree gfor_fndecl_sc_kind;
147 tree gfor_fndecl_si_kind;
148 tree gfor_fndecl_sr_kind;
150 /* BLAS gemm functions. */
151 tree gfor_fndecl_sgemm;
152 tree gfor_fndecl_dgemm;
153 tree gfor_fndecl_cgemm;
154 tree gfor_fndecl_zgemm;
158 gfc_add_decl_to_parent_function (tree decl)
161 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
162 DECL_NONLOCAL (decl) = 1;
163 TREE_CHAIN (decl) = saved_parent_function_decls;
164 saved_parent_function_decls = decl;
168 gfc_add_decl_to_function (tree decl)
171 TREE_USED (decl) = 1;
172 DECL_CONTEXT (decl) = current_function_decl;
173 TREE_CHAIN (decl) = saved_function_decls;
174 saved_function_decls = decl;
178 /* Build a backend label declaration. Set TREE_USED for named labels.
179 The context of the label is always the current_function_decl. All
180 labels are marked artificial. */
183 gfc_build_label_decl (tree label_id)
185 /* 2^32 temporaries should be enough. */
186 static unsigned int tmp_num = 1;
190 if (label_id == NULL_TREE)
192 /* Build an internal label name. */
193 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
194 label_id = get_identifier (label_name);
199 /* Build the LABEL_DECL node. Labels have no type. */
200 label_decl = build_decl (LABEL_DECL, label_id, void_type_node);
201 DECL_CONTEXT (label_decl) = current_function_decl;
202 DECL_MODE (label_decl) = VOIDmode;
204 /* We always define the label as used, even if the original source
205 file never references the label. We don't want all kinds of
206 spurious warnings for old-style Fortran code with too many
208 TREE_USED (label_decl) = 1;
210 DECL_ARTIFICIAL (label_decl) = 1;
215 /* Returns the return label for the current function. */
218 gfc_get_return_label (void)
220 char name[GFC_MAX_SYMBOL_LEN + 10];
222 if (current_function_return_label)
223 return current_function_return_label;
225 sprintf (name, "__return_%s",
226 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
228 current_function_return_label =
229 gfc_build_label_decl (get_identifier (name));
231 DECL_ARTIFICIAL (current_function_return_label) = 1;
233 return current_function_return_label;
237 /* Set the backend source location of a decl. */
240 gfc_set_decl_location (tree decl, locus * loc)
242 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
246 /* Return the backend label declaration for a given label structure,
247 or create it if it doesn't exist yet. */
250 gfc_get_label_decl (gfc_st_label * lp)
252 if (lp->backend_decl)
253 return lp->backend_decl;
256 char label_name[GFC_MAX_SYMBOL_LEN + 1];
259 /* Validate the label declaration from the front end. */
260 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
262 /* Build a mangled name for the label. */
263 sprintf (label_name, "__label_%.6d", lp->value);
265 /* Build the LABEL_DECL node. */
266 label_decl = gfc_build_label_decl (get_identifier (label_name));
268 /* Tell the debugger where the label came from. */
269 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
270 gfc_set_decl_location (label_decl, &lp->where);
272 DECL_ARTIFICIAL (label_decl) = 1;
274 /* Store the label in the label list and return the LABEL_DECL. */
275 lp->backend_decl = label_decl;
281 /* Convert a gfc_symbol to an identifier of the same name. */
284 gfc_sym_identifier (gfc_symbol * sym)
286 return (get_identifier (sym->name));
290 /* Construct mangled name from symbol name. */
293 gfc_sym_mangled_identifier (gfc_symbol * sym)
295 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
297 /* Prevent the mangling of identifiers that have an assigned
298 binding label (mainly those that are bind(c)). */
299 if (sym->attr.is_bind_c == 1
300 && sym->binding_label[0] != '\0')
301 return get_identifier(sym->binding_label);
303 if (sym->module == NULL)
304 return gfc_sym_identifier (sym);
307 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
308 return get_identifier (name);
313 /* Construct mangled function name from symbol name. */
316 gfc_sym_mangled_function_id (gfc_symbol * sym)
319 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
321 /* It may be possible to simply use the binding label if it's
322 provided, and remove the other checks. Then we could use it
323 for other things if we wished. */
324 if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
325 sym->binding_label[0] != '\0')
326 /* use the binding label rather than the mangled name */
327 return get_identifier (sym->binding_label);
329 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
330 || (sym->module != NULL && (sym->attr.external
331 || sym->attr.if_source == IFSRC_IFBODY)))
333 /* Main program is mangled into MAIN__. */
334 if (sym->attr.is_main_program)
335 return get_identifier ("MAIN__");
337 /* Intrinsic procedures are never mangled. */
338 if (sym->attr.proc == PROC_INTRINSIC)
339 return get_identifier (sym->name);
341 if (gfc_option.flag_underscoring)
343 has_underscore = strchr (sym->name, '_') != 0;
344 if (gfc_option.flag_second_underscore && has_underscore)
345 snprintf (name, sizeof name, "%s__", sym->name);
347 snprintf (name, sizeof name, "%s_", sym->name);
348 return get_identifier (name);
351 return get_identifier (sym->name);
355 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
356 return get_identifier (name);
361 /* Returns true if a variable of specified size should go on the stack. */
364 gfc_can_put_var_on_stack (tree size)
366 unsigned HOST_WIDE_INT low;
368 if (!INTEGER_CST_P (size))
371 if (gfc_option.flag_max_stack_var_size < 0)
374 if (TREE_INT_CST_HIGH (size) != 0)
377 low = TREE_INT_CST_LOW (size);
378 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
381 /* TODO: Set a per-function stack size limit. */
387 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
388 an expression involving its corresponding pointer. There are
389 2 cases; one for variable size arrays, and one for everything else,
390 because variable-sized arrays require one fewer level of
394 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
396 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
399 /* Parameters need to be dereferenced. */
400 if (sym->cp_pointer->attr.dummy)
401 ptr_decl = build_fold_indirect_ref (ptr_decl);
403 /* Check to see if we're dealing with a variable-sized array. */
404 if (sym->attr.dimension
405 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
407 /* These decls will be dereferenced later, so we don't dereference
409 value = convert (TREE_TYPE (decl), ptr_decl);
413 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
415 value = build_fold_indirect_ref (ptr_decl);
418 SET_DECL_VALUE_EXPR (decl, value);
419 DECL_HAS_VALUE_EXPR_P (decl) = 1;
420 GFC_DECL_CRAY_POINTEE (decl) = 1;
421 /* This is a fake variable just for debugging purposes. */
422 TREE_ASM_WRITTEN (decl) = 1;
426 /* Finish processing of a declaration without an initial value. */
429 gfc_finish_decl (tree decl)
431 gcc_assert (TREE_CODE (decl) == PARM_DECL
432 || DECL_INITIAL (decl) == NULL_TREE);
434 if (TREE_CODE (decl) != VAR_DECL)
437 if (DECL_SIZE (decl) == NULL_TREE
438 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
439 layout_decl (decl, 0);
441 /* A few consistency checks. */
442 /* A static variable with an incomplete type is an error if it is
443 initialized. Also if it is not file scope. Otherwise, let it
444 through, but if it is not `extern' then it may cause an error
446 /* An automatic variable with an incomplete type is an error. */
448 /* We should know the storage size. */
449 gcc_assert (DECL_SIZE (decl) != NULL_TREE
450 || (TREE_STATIC (decl)
451 ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
452 : DECL_EXTERNAL (decl)));
454 /* The storage size should be constant. */
455 gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
457 || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
461 /* Apply symbol attributes to a variable, and add it to the function scope. */
464 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
467 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
468 This is the equivalent of the TARGET variables.
469 We also need to set this if the variable is passed by reference in a
472 /* Set DECL_VALUE_EXPR for Cray Pointees. */
473 if (sym->attr.cray_pointee)
474 gfc_finish_cray_pointee (decl, sym);
476 if (sym->attr.target)
477 TREE_ADDRESSABLE (decl) = 1;
478 /* If it wasn't used we wouldn't be getting it. */
479 TREE_USED (decl) = 1;
481 /* Chain this decl to the pending declarations. Don't do pushdecl()
482 because this would add them to the current scope rather than the
484 if (current_function_decl != NULL_TREE)
486 if (sym->ns->proc_name->backend_decl == current_function_decl
487 || sym->result == sym)
488 gfc_add_decl_to_function (decl);
490 gfc_add_decl_to_parent_function (decl);
493 if (sym->attr.cray_pointee)
496 if(sym->attr.is_bind_c == 1)
498 /* We need to put variables that are bind(c) into the common
499 segment of the object file, because this is what C would do.
500 gfortran would typically put them in either the BSS or
501 initialized data segments, and only mark them as common if
502 they were part of common blocks. However, if they are not put
503 into common space, then C cannot initialize global fortran
504 variables that it interoperates with and the draft says that
505 either Fortran or C should be able to initialize it (but not
506 both, of course.) (J3/04-007, section 15.3). */
507 TREE_PUBLIC(decl) = 1;
508 DECL_COMMON(decl) = 1;
511 /* If a variable is USE associated, it's always external. */
512 if (sym->attr.use_assoc)
514 DECL_EXTERNAL (decl) = 1;
515 TREE_PUBLIC (decl) = 1;
517 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
519 /* TODO: Don't set sym->module for result or dummy variables. */
520 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
521 /* This is the declaration of a module variable. */
522 TREE_PUBLIC (decl) = 1;
523 TREE_STATIC (decl) = 1;
526 /* Derived types are a bit peculiar because of the possibility of
527 a default initializer; this must be applied each time the variable
528 comes into scope it therefore need not be static. These variables
529 are SAVE_NONE but have an initializer. Otherwise explicitly
530 initialized variables are SAVE_IMPLICIT and explicitly saved are
532 if (!sym->attr.use_assoc
533 && (sym->attr.save != SAVE_NONE || sym->attr.data
534 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
535 TREE_STATIC (decl) = 1;
537 if (sym->attr.volatile_)
539 TREE_THIS_VOLATILE (decl) = 1;
540 new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
541 TREE_TYPE (decl) = new_type;
544 /* Keep variables larger than max-stack-var-size off stack. */
545 if (!sym->ns->proc_name->attr.recursive
546 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
547 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
548 /* Put variable length auto array pointers always into stack. */
549 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
550 || sym->attr.dimension == 0
551 || sym->as->type != AS_EXPLICIT
553 || sym->attr.allocatable)
554 && !DECL_ARTIFICIAL (decl))
555 TREE_STATIC (decl) = 1;
557 /* Handle threadprivate variables. */
558 if (sym->attr.threadprivate
559 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
560 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
564 /* Allocate the lang-specific part of a decl. */
567 gfc_allocate_lang_decl (tree decl)
569 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
570 ggc_alloc_cleared (sizeof (struct lang_decl));
573 /* Remember a symbol to generate initialization/cleanup code at function
577 gfc_defer_symbol_init (gfc_symbol * sym)
583 /* Don't add a symbol twice. */
587 last = head = sym->ns->proc_name;
590 /* Make sure that setup code for dummy variables which are used in the
591 setup of other variables is generated first. */
594 /* Find the first dummy arg seen after us, or the first non-dummy arg.
595 This is a circular list, so don't go past the head. */
597 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
603 /* Insert in between last and p. */
609 /* Create an array index type variable with function scope. */
612 create_index_var (const char * pfx, int nest)
616 decl = gfc_create_var_np (gfc_array_index_type, pfx);
618 gfc_add_decl_to_parent_function (decl);
620 gfc_add_decl_to_function (decl);
625 /* Create variables to hold all the non-constant bits of info for a
626 descriptorless array. Remember these in the lang-specific part of the
630 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
636 type = TREE_TYPE (decl);
638 /* We just use the descriptor, if there is one. */
639 if (GFC_DESCRIPTOR_TYPE_P (type))
642 gcc_assert (GFC_ARRAY_TYPE_P (type));
643 nest = (sym->ns->proc_name->backend_decl != current_function_decl)
644 && !sym->attr.contained;
646 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
648 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
650 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
651 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
653 /* Don't try to use the unknown bound for assumed shape arrays. */
654 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
655 && (sym->as->type != AS_ASSUMED_SIZE
656 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
658 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
659 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
662 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
664 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
665 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
668 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
670 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
672 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
675 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
677 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
680 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
681 && sym->as->type != AS_ASSUMED_SIZE)
683 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
684 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
687 if (POINTER_TYPE_P (type))
689 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
690 gcc_assert (TYPE_LANG_SPECIFIC (type)
691 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
692 type = TREE_TYPE (type);
695 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
699 size = fold_build2 (MINUS_EXPR, gfc_array_index_type,
700 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
701 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
703 TYPE_DOMAIN (type) = range;
709 /* For some dummy arguments we don't use the actual argument directly.
710 Instead we create a local decl and use that. This allows us to perform
711 initialization, and construct full type information. */
714 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
724 if (sym->attr.pointer || sym->attr.allocatable)
727 /* Add to list of variables if not a fake result variable. */
728 if (sym->attr.result || sym->attr.dummy)
729 gfc_defer_symbol_init (sym);
731 type = TREE_TYPE (dummy);
732 gcc_assert (TREE_CODE (dummy) == PARM_DECL
733 && POINTER_TYPE_P (type));
735 /* Do we know the element size? */
736 known_size = sym->ts.type != BT_CHARACTER
737 || INTEGER_CST_P (sym->ts.cl->backend_decl);
739 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
741 /* For descriptorless arrays with known element size the actual
742 argument is sufficient. */
743 gcc_assert (GFC_ARRAY_TYPE_P (type));
744 gfc_build_qualified_array (dummy, sym);
748 type = TREE_TYPE (type);
749 if (GFC_DESCRIPTOR_TYPE_P (type))
751 /* Create a descriptorless array pointer. */
755 /* Even when -frepack-arrays is used, symbols with TARGET attribute
757 if (!gfc_option.flag_repack_arrays || sym->attr.target)
759 if (as->type == AS_ASSUMED_SIZE)
760 packed = PACKED_FULL;
764 if (as->type == AS_EXPLICIT)
766 packed = PACKED_FULL;
767 for (n = 0; n < as->rank; n++)
771 && as->upper[n]->expr_type == EXPR_CONSTANT
772 && as->lower[n]->expr_type == EXPR_CONSTANT))
773 packed = PACKED_PARTIAL;
777 packed = PACKED_PARTIAL;
780 type = gfc_typenode_for_spec (&sym->ts);
781 type = gfc_get_nodesc_array_type (type, sym->as, packed);
785 /* We now have an expression for the element size, so create a fully
786 qualified type. Reset sym->backend decl or this will just return the
788 DECL_ARTIFICIAL (sym->backend_decl) = 1;
789 sym->backend_decl = NULL_TREE;
790 type = gfc_sym_type (sym);
791 packed = PACKED_FULL;
794 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
795 decl = build_decl (VAR_DECL, get_identifier (name), type);
797 DECL_ARTIFICIAL (decl) = 1;
798 TREE_PUBLIC (decl) = 0;
799 TREE_STATIC (decl) = 0;
800 DECL_EXTERNAL (decl) = 0;
802 /* We should never get deferred shape arrays here. We used to because of
804 gcc_assert (sym->as->type != AS_DEFERRED);
806 if (packed == PACKED_PARTIAL)
807 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
808 else if (packed == PACKED_FULL)
809 GFC_DECL_PACKED_ARRAY (decl) = 1;
811 gfc_build_qualified_array (decl, sym);
813 if (DECL_LANG_SPECIFIC (dummy))
814 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
816 gfc_allocate_lang_decl (decl);
818 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
820 if (sym->ns->proc_name->backend_decl == current_function_decl
821 || sym->attr.contained)
822 gfc_add_decl_to_function (decl);
824 gfc_add_decl_to_parent_function (decl);
830 /* Return a constant or a variable to use as a string length. Does not
831 add the decl to the current scope. */
834 gfc_create_string_length (gfc_symbol * sym)
838 gcc_assert (sym->ts.cl);
839 gfc_conv_const_charlen (sym->ts.cl);
841 if (sym->ts.cl->backend_decl == NULL_TREE)
843 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
845 /* Also prefix the mangled name. */
846 strcpy (&name[1], sym->name);
848 length = build_decl (VAR_DECL, get_identifier (name),
849 gfc_charlen_type_node);
850 DECL_ARTIFICIAL (length) = 1;
851 TREE_USED (length) = 1;
852 if (sym->ns->proc_name->tlink != NULL)
853 gfc_defer_symbol_init (sym);
854 sym->ts.cl->backend_decl = length;
857 return sym->ts.cl->backend_decl;
860 /* If a variable is assigned a label, we add another two auxiliary
864 gfc_add_assign_aux_vars (gfc_symbol * sym)
870 gcc_assert (sym->backend_decl);
872 decl = sym->backend_decl;
873 gfc_allocate_lang_decl (decl);
874 GFC_DECL_ASSIGN (decl) = 1;
875 length = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
876 gfc_charlen_type_node);
877 addr = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
879 gfc_finish_var_decl (length, sym);
880 gfc_finish_var_decl (addr, sym);
881 /* STRING_LENGTH is also used as flag. Less than -1 means that
882 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
883 target label's address. Otherwise, value is the length of a format string
884 and ASSIGN_ADDR is its address. */
885 if (TREE_STATIC (length))
886 DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
888 gfc_defer_symbol_init (sym);
890 GFC_DECL_STRING_LEN (decl) = length;
891 GFC_DECL_ASSIGN_ADDR (decl) = addr;
894 /* Return the decl for a gfc_symbol, create it if it doesn't already
898 gfc_get_symbol_decl (gfc_symbol * sym)
901 tree length = NULL_TREE;
904 gcc_assert (sym->attr.referenced
905 || sym->attr.use_assoc
906 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY);
908 if (sym->ns && sym->ns->proc_name->attr.function)
909 byref = gfc_return_by_reference (sym->ns->proc_name);
913 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
915 /* Return via extra parameter. */
916 if (sym->attr.result && byref
917 && !sym->backend_decl)
920 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
921 /* For entry master function skip over the __entry
923 if (sym->ns->proc_name->attr.entry_master)
924 sym->backend_decl = TREE_CHAIN (sym->backend_decl);
927 /* Dummy variables should already have been created. */
928 gcc_assert (sym->backend_decl);
930 /* Create a character length variable. */
931 if (sym->ts.type == BT_CHARACTER)
933 if (sym->ts.cl->backend_decl == NULL_TREE)
934 length = gfc_create_string_length (sym);
936 length = sym->ts.cl->backend_decl;
937 if (TREE_CODE (length) == VAR_DECL
938 && DECL_CONTEXT (length) == NULL_TREE)
940 /* Add the string length to the same context as the symbol. */
941 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
942 gfc_add_decl_to_function (length);
944 gfc_add_decl_to_parent_function (length);
946 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
947 DECL_CONTEXT (length));
949 gfc_defer_symbol_init (sym);
953 /* Use a copy of the descriptor for dummy arrays. */
954 if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
956 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
957 /* Prevent the dummy from being detected as unused if it is copied. */
958 if (sym->backend_decl != NULL && decl != sym->backend_decl)
959 DECL_ARTIFICIAL (sym->backend_decl) = 1;
960 sym->backend_decl = decl;
963 TREE_USED (sym->backend_decl) = 1;
964 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
966 gfc_add_assign_aux_vars (sym);
968 return sym->backend_decl;
971 if (sym->backend_decl)
972 return sym->backend_decl;
974 /* Catch function declarations. Only used for actual parameters. */
975 if (sym->attr.flavor == FL_PROCEDURE)
977 decl = gfc_get_extern_function_decl (sym);
981 if (sym->attr.intrinsic)
982 internal_error ("intrinsic variable which isn't a procedure");
984 /* Create string length decl first so that they can be used in the
986 if (sym->ts.type == BT_CHARACTER)
987 length = gfc_create_string_length (sym);
989 /* Create the decl for the variable. */
990 decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
992 gfc_set_decl_location (decl, &sym->declared_at);
994 /* Symbols from modules should have their assembler names mangled.
995 This is done here rather than in gfc_finish_var_decl because it
996 is different for string length variables. */
999 SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym));
1000 if (sym->attr.use_assoc)
1001 DECL_IGNORED_P (decl) = 1;
1004 if (sym->attr.dimension)
1006 /* Create variables to hold the non-constant bits of array info. */
1007 gfc_build_qualified_array (decl, sym);
1009 /* Remember this variable for allocation/cleanup. */
1010 gfc_defer_symbol_init (sym);
1012 if ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer)
1013 GFC_DECL_PACKED_ARRAY (decl) = 1;
1016 if (sym->ts.type == BT_DERIVED && sym->ts.derived->attr.alloc_comp)
1017 gfc_defer_symbol_init (sym);
1018 /* This applies a derived type default initializer. */
1019 else if (sym->ts.type == BT_DERIVED
1020 && sym->attr.save == SAVE_NONE
1022 && !sym->attr.allocatable
1023 && (sym->value && !sym->ns->proc_name->attr.is_main_program)
1024 && !sym->attr.use_assoc)
1025 gfc_defer_symbol_init (sym);
1027 gfc_finish_var_decl (decl, sym);
1029 if (sym->ts.type == BT_CHARACTER)
1031 /* Character variables need special handling. */
1032 gfc_allocate_lang_decl (decl);
1034 if (TREE_CODE (length) != INTEGER_CST)
1036 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1040 /* Also prefix the mangled name for symbols from modules. */
1041 strcpy (&name[1], sym->name);
1044 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
1045 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (name));
1047 gfc_finish_var_decl (length, sym);
1048 gcc_assert (!sym->value);
1051 else if (sym->attr.subref_array_pointer)
1053 /* We need the span for these beasts. */
1054 gfc_allocate_lang_decl (decl);
1057 if (sym->attr.subref_array_pointer)
1060 GFC_DECL_SUBREF_ARRAY_P (decl) = 1;
1061 span = build_decl (VAR_DECL, create_tmp_var_name ("span"),
1062 gfc_array_index_type);
1063 gfc_finish_var_decl (span, sym);
1064 TREE_STATIC (span) = 1;
1065 DECL_INITIAL (span) = build_int_cst (NULL_TREE, 0);
1067 GFC_DECL_SPAN (decl) = span;
1070 sym->backend_decl = decl;
1072 if (sym->attr.assign)
1073 gfc_add_assign_aux_vars (sym);
1075 if (TREE_STATIC (decl) && !sym->attr.use_assoc)
1077 /* Add static initializer. */
1078 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1079 TREE_TYPE (decl), sym->attr.dimension,
1080 sym->attr.pointer || sym->attr.allocatable);
1087 /* Substitute a temporary variable in place of the real one. */
1090 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1092 save->attr = sym->attr;
1093 save->decl = sym->backend_decl;
1095 gfc_clear_attr (&sym->attr);
1096 sym->attr.referenced = 1;
1097 sym->attr.flavor = FL_VARIABLE;
1099 sym->backend_decl = decl;
1103 /* Restore the original variable. */
1106 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1108 sym->attr = save->attr;
1109 sym->backend_decl = save->decl;
1113 /* Declare a procedure pointer. */
1116 get_proc_pointer_decl (gfc_symbol *sym)
1120 decl = sym->backend_decl;
1124 decl = build_decl (VAR_DECL, get_identifier (sym->name),
1125 build_pointer_type (gfc_get_function_type (sym)));
1127 if (sym->ns->proc_name->backend_decl == current_function_decl
1128 || sym->attr.contained)
1129 gfc_add_decl_to_function (decl);
1131 gfc_add_decl_to_parent_function (decl);
1133 sym->backend_decl = decl;
1135 if (!sym->attr.use_assoc
1136 && (sym->attr.save != SAVE_NONE || sym->attr.data
1137 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
1138 TREE_STATIC (decl) = 1;
1140 if (TREE_STATIC (decl) && sym->value)
1142 /* Add static initializer. */
1143 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1144 TREE_TYPE (decl), sym->attr.dimension, sym->attr.proc_pointer);
1151 /* Get a basic decl for an external function. */
1154 gfc_get_extern_function_decl (gfc_symbol * sym)
1159 gfc_intrinsic_sym *isym;
1161 char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'. */
1165 if (sym->backend_decl)
1166 return sym->backend_decl;
1168 /* We should never be creating external decls for alternate entry points.
1169 The procedure may be an alternate entry point, but we don't want/need
1171 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1173 if (sym->attr.proc_pointer)
1174 return get_proc_pointer_decl (sym);
1176 if (sym->attr.intrinsic)
1178 /* Call the resolution function to get the actual name. This is
1179 a nasty hack which relies on the resolution functions only looking
1180 at the first argument. We pass NULL for the second argument
1181 otherwise things like AINT get confused. */
1182 isym = gfc_find_function (sym->name);
1183 gcc_assert (isym->resolve.f0 != NULL);
1185 memset (&e, 0, sizeof (e));
1186 e.expr_type = EXPR_FUNCTION;
1188 memset (&argexpr, 0, sizeof (argexpr));
1189 gcc_assert (isym->formal);
1190 argexpr.ts = isym->formal->ts;
1192 if (isym->formal->next == NULL)
1193 isym->resolve.f1 (&e, &argexpr);
1196 if (isym->formal->next->next == NULL)
1197 isym->resolve.f2 (&e, &argexpr, NULL);
1200 if (isym->formal->next->next->next == NULL)
1201 isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1204 /* All specific intrinsics take less than 5 arguments. */
1205 gcc_assert (isym->formal->next->next->next->next == NULL);
1206 isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
1211 if (gfc_option.flag_f2c
1212 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1213 || e.ts.type == BT_COMPLEX))
1215 /* Specific which needs a different implementation if f2c
1216 calling conventions are used. */
1217 sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1220 sprintf (s, "_gfortran_specific%s", e.value.function.name);
1222 name = get_identifier (s);
1223 mangled_name = name;
1227 name = gfc_sym_identifier (sym);
1228 mangled_name = gfc_sym_mangled_function_id (sym);
1231 type = gfc_get_function_type (sym);
1232 fndecl = build_decl (FUNCTION_DECL, name, type);
1234 SET_DECL_ASSEMBLER_NAME (fndecl, mangled_name);
1235 /* If the return type is a pointer, avoid alias issues by setting
1236 DECL_IS_MALLOC to nonzero. This means that the function should be
1237 treated as if it were a malloc, meaning it returns a pointer that
1239 if (POINTER_TYPE_P (type))
1240 DECL_IS_MALLOC (fndecl) = 1;
1242 /* Set the context of this decl. */
1243 if (0 && sym->ns && sym->ns->proc_name)
1245 /* TODO: Add external decls to the appropriate scope. */
1246 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1250 /* Global declaration, e.g. intrinsic subroutine. */
1251 DECL_CONTEXT (fndecl) = NULL_TREE;
1254 DECL_EXTERNAL (fndecl) = 1;
1256 /* This specifies if a function is globally addressable, i.e. it is
1257 the opposite of declaring static in C. */
1258 TREE_PUBLIC (fndecl) = 1;
1260 /* Set attributes for PURE functions. A call to PURE function in the
1261 Fortran 95 sense is both pure and without side effects in the C
1263 if (sym->attr.pure || sym->attr.elemental)
1265 if (sym->attr.function && !gfc_return_by_reference (sym))
1266 DECL_PURE_P (fndecl) = 1;
1267 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1268 parameters and don't use alternate returns (is this
1269 allowed?). In that case, calls to them are meaningless, and
1270 can be optimized away. See also in build_function_decl(). */
1271 TREE_SIDE_EFFECTS (fndecl) = 0;
1274 /* Mark non-returning functions. */
1275 if (sym->attr.noreturn)
1276 TREE_THIS_VOLATILE(fndecl) = 1;
1278 sym->backend_decl = fndecl;
1280 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1281 pushdecl_top_level (fndecl);
1287 /* Create a declaration for a procedure. For external functions (in the C
1288 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1289 a master function with alternate entry points. */
1292 build_function_decl (gfc_symbol * sym)
1295 symbol_attribute attr;
1297 gfc_formal_arglist *f;
1299 gcc_assert (!sym->backend_decl);
1300 gcc_assert (!sym->attr.external);
1302 /* Set the line and filename. sym->declared_at seems to point to the
1303 last statement for subroutines, but it'll do for now. */
1304 gfc_set_backend_locus (&sym->declared_at);
1306 /* Allow only one nesting level. Allow public declarations. */
1307 gcc_assert (current_function_decl == NULL_TREE
1308 || DECL_CONTEXT (current_function_decl) == NULL_TREE
1309 || TREE_CODE (DECL_CONTEXT (current_function_decl))
1312 type = gfc_get_function_type (sym);
1313 fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type);
1315 /* Perform name mangling if this is a top level or module procedure. */
1316 if (current_function_decl == NULL_TREE)
1317 SET_DECL_ASSEMBLER_NAME (fndecl, gfc_sym_mangled_function_id (sym));
1319 /* Figure out the return type of the declared function, and build a
1320 RESULT_DECL for it. If this is a subroutine with alternate
1321 returns, build a RESULT_DECL for it. */
1324 result_decl = NULL_TREE;
1325 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1328 if (gfc_return_by_reference (sym))
1329 type = void_type_node;
1332 if (sym->result != sym)
1333 result_decl = gfc_sym_identifier (sym->result);
1335 type = TREE_TYPE (TREE_TYPE (fndecl));
1340 /* Look for alternate return placeholders. */
1341 int has_alternate_returns = 0;
1342 for (f = sym->formal; f; f = f->next)
1346 has_alternate_returns = 1;
1351 if (has_alternate_returns)
1352 type = integer_type_node;
1354 type = void_type_node;
1357 result_decl = build_decl (RESULT_DECL, result_decl, type);
1358 DECL_ARTIFICIAL (result_decl) = 1;
1359 DECL_IGNORED_P (result_decl) = 1;
1360 DECL_CONTEXT (result_decl) = fndecl;
1361 DECL_RESULT (fndecl) = result_decl;
1363 /* Don't call layout_decl for a RESULT_DECL.
1364 layout_decl (result_decl, 0); */
1366 /* If the return type is a pointer, avoid alias issues by setting
1367 DECL_IS_MALLOC to nonzero. This means that the function should be
1368 treated as if it were a malloc, meaning it returns a pointer that
1370 if (POINTER_TYPE_P (type))
1371 DECL_IS_MALLOC (fndecl) = 1;
1373 /* Set up all attributes for the function. */
1374 DECL_CONTEXT (fndecl) = current_function_decl;
1375 DECL_EXTERNAL (fndecl) = 0;
1377 /* This specifies if a function is globally visible, i.e. it is
1378 the opposite of declaring static in C. */
1379 if (DECL_CONTEXT (fndecl) == NULL_TREE
1380 && !sym->attr.entry_master)
1381 TREE_PUBLIC (fndecl) = 1;
1383 /* TREE_STATIC means the function body is defined here. */
1384 TREE_STATIC (fndecl) = 1;
1386 /* Set attributes for PURE functions. A call to a PURE function in the
1387 Fortran 95 sense is both pure and without side effects in the C
1389 if (attr.pure || attr.elemental)
1391 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1392 including an alternate return. In that case it can also be
1393 marked as PURE. See also in gfc_get_extern_function_decl(). */
1394 if (attr.function && !gfc_return_by_reference (sym))
1395 DECL_PURE_P (fndecl) = 1;
1396 TREE_SIDE_EFFECTS (fndecl) = 0;
1399 /* For -fwhole-program to work well, the main program needs to have the
1400 "externally_visible" attribute. */
1401 if (attr.is_main_program)
1402 DECL_ATTRIBUTES (fndecl)
1403 = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
1405 /* Layout the function declaration and put it in the binding level
1406 of the current function. */
1409 sym->backend_decl = fndecl;
1413 /* Create the DECL_ARGUMENTS for a procedure. */
1416 create_function_arglist (gfc_symbol * sym)
1419 gfc_formal_arglist *f;
1420 tree typelist, hidden_typelist;
1421 tree arglist, hidden_arglist;
1425 fndecl = sym->backend_decl;
1427 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1428 the new FUNCTION_DECL node. */
1429 arglist = NULL_TREE;
1430 hidden_arglist = NULL_TREE;
1431 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1433 if (sym->attr.entry_master)
1435 type = TREE_VALUE (typelist);
1436 parm = build_decl (PARM_DECL, get_identifier ("__entry"), type);
1438 DECL_CONTEXT (parm) = fndecl;
1439 DECL_ARG_TYPE (parm) = type;
1440 TREE_READONLY (parm) = 1;
1441 gfc_finish_decl (parm);
1442 DECL_ARTIFICIAL (parm) = 1;
1444 arglist = chainon (arglist, parm);
1445 typelist = TREE_CHAIN (typelist);
1448 if (gfc_return_by_reference (sym))
1450 tree type = TREE_VALUE (typelist), length = NULL;
1452 if (sym->ts.type == BT_CHARACTER)
1454 /* Length of character result. */
1455 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1456 gcc_assert (len_type == gfc_charlen_type_node);
1458 length = build_decl (PARM_DECL,
1459 get_identifier (".__result"),
1461 if (!sym->ts.cl->length)
1463 sym->ts.cl->backend_decl = length;
1464 TREE_USED (length) = 1;
1466 gcc_assert (TREE_CODE (length) == PARM_DECL);
1467 DECL_CONTEXT (length) = fndecl;
1468 DECL_ARG_TYPE (length) = len_type;
1469 TREE_READONLY (length) = 1;
1470 DECL_ARTIFICIAL (length) = 1;
1471 gfc_finish_decl (length);
1472 if (sym->ts.cl->backend_decl == NULL
1473 || sym->ts.cl->backend_decl == length)
1478 if (sym->ts.cl->backend_decl == NULL)
1480 tree len = build_decl (VAR_DECL,
1481 get_identifier ("..__result"),
1482 gfc_charlen_type_node);
1483 DECL_ARTIFICIAL (len) = 1;
1484 TREE_USED (len) = 1;
1485 sym->ts.cl->backend_decl = len;
1488 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1489 arg = sym->result ? sym->result : sym;
1490 backend_decl = arg->backend_decl;
1491 /* Temporary clear it, so that gfc_sym_type creates complete
1493 arg->backend_decl = NULL;
1494 type = gfc_sym_type (arg);
1495 arg->backend_decl = backend_decl;
1496 type = build_reference_type (type);
1500 parm = build_decl (PARM_DECL, get_identifier ("__result"), type);
1502 DECL_CONTEXT (parm) = fndecl;
1503 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1504 TREE_READONLY (parm) = 1;
1505 DECL_ARTIFICIAL (parm) = 1;
1506 gfc_finish_decl (parm);
1508 arglist = chainon (arglist, parm);
1509 typelist = TREE_CHAIN (typelist);
1511 if (sym->ts.type == BT_CHARACTER)
1513 gfc_allocate_lang_decl (parm);
1514 arglist = chainon (arglist, length);
1515 typelist = TREE_CHAIN (typelist);
1519 hidden_typelist = typelist;
1520 for (f = sym->formal; f; f = f->next)
1521 if (f->sym != NULL) /* Ignore alternate returns. */
1522 hidden_typelist = TREE_CHAIN (hidden_typelist);
1524 for (f = sym->formal; f; f = f->next)
1526 char name[GFC_MAX_SYMBOL_LEN + 2];
1528 /* Ignore alternate returns. */
1532 type = TREE_VALUE (typelist);
1534 if (f->sym->ts.type == BT_CHARACTER)
1536 tree len_type = TREE_VALUE (hidden_typelist);
1537 tree length = NULL_TREE;
1538 gcc_assert (len_type == gfc_charlen_type_node);
1540 strcpy (&name[1], f->sym->name);
1542 length = build_decl (PARM_DECL, get_identifier (name), len_type);
1544 hidden_arglist = chainon (hidden_arglist, length);
1545 DECL_CONTEXT (length) = fndecl;
1546 DECL_ARTIFICIAL (length) = 1;
1547 DECL_ARG_TYPE (length) = len_type;
1548 TREE_READONLY (length) = 1;
1549 gfc_finish_decl (length);
1551 /* TODO: Check string lengths when -fbounds-check. */
1553 /* Use the passed value for assumed length variables. */
1554 if (!f->sym->ts.cl->length)
1556 TREE_USED (length) = 1;
1557 gcc_assert (!f->sym->ts.cl->backend_decl);
1558 f->sym->ts.cl->backend_decl = length;
1561 hidden_typelist = TREE_CHAIN (hidden_typelist);
1563 if (f->sym->ts.cl->backend_decl == NULL
1564 || f->sym->ts.cl->backend_decl == length)
1566 if (f->sym->ts.cl->backend_decl == NULL)
1567 gfc_create_string_length (f->sym);
1569 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1570 if (f->sym->attr.flavor == FL_PROCEDURE)
1571 type = build_pointer_type (gfc_get_function_type (f->sym));
1573 type = gfc_sym_type (f->sym);
1577 /* For non-constant length array arguments, make sure they use
1578 a different type node from TYPE_ARG_TYPES type. */
1579 if (f->sym->attr.dimension
1580 && type == TREE_VALUE (typelist)
1581 && TREE_CODE (type) == POINTER_TYPE
1582 && GFC_ARRAY_TYPE_P (type)
1583 && f->sym->as->type != AS_ASSUMED_SIZE
1584 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
1586 if (f->sym->attr.flavor == FL_PROCEDURE)
1587 type = build_pointer_type (gfc_get_function_type (f->sym));
1589 type = gfc_sym_type (f->sym);
1592 if (f->sym->attr.proc_pointer)
1593 type = build_pointer_type (type);
1595 /* Build the argument declaration. */
1596 parm = build_decl (PARM_DECL, gfc_sym_identifier (f->sym), type);
1598 /* Fill in arg stuff. */
1599 DECL_CONTEXT (parm) = fndecl;
1600 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1601 /* All implementation args are read-only. */
1602 TREE_READONLY (parm) = 1;
1604 gfc_finish_decl (parm);
1606 f->sym->backend_decl = parm;
1608 arglist = chainon (arglist, parm);
1609 typelist = TREE_CHAIN (typelist);
1612 /* Add the hidden string length parameters, unless the procedure
1614 if (!sym->attr.is_bind_c)
1615 arglist = chainon (arglist, hidden_arglist);
1617 gcc_assert (hidden_typelist == NULL_TREE
1618 || TREE_VALUE (hidden_typelist) == void_type_node);
1619 DECL_ARGUMENTS (fndecl) = arglist;
1622 /* Convert FNDECL's code to GIMPLE and handle any nested functions. */
1625 gfc_gimplify_function (tree fndecl)
1627 struct cgraph_node *cgn;
1629 gimplify_function_tree (fndecl);
1630 dump_function (TDI_generic, fndecl);
1632 /* Generate errors for structured block violations. */
1633 /* ??? Could be done as part of resolve_labels. */
1635 diagnose_omp_structured_block_errors (fndecl);
1637 /* Convert all nested functions to GIMPLE now. We do things in this order
1638 so that items like VLA sizes are expanded properly in the context of the
1639 correct function. */
1640 cgn = cgraph_node (fndecl);
1641 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1642 gfc_gimplify_function (cgn->decl);
1646 /* Do the setup necessary before generating the body of a function. */
1649 trans_function_start (gfc_symbol * sym)
1653 fndecl = sym->backend_decl;
1655 /* Let GCC know the current scope is this function. */
1656 current_function_decl = fndecl;
1658 /* Let the world know what we're about to do. */
1659 announce_function (fndecl);
1661 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1663 /* Create RTL for function declaration. */
1664 rest_of_decl_compilation (fndecl, 1, 0);
1667 /* Create RTL for function definition. */
1668 make_decl_rtl (fndecl);
1670 init_function_start (fndecl);
1672 /* Even though we're inside a function body, we still don't want to
1673 call expand_expr to calculate the size of a variable-sized array.
1674 We haven't necessarily assigned RTL to all variables yet, so it's
1675 not safe to try to expand expressions involving them. */
1676 cfun->dont_save_pending_sizes_p = 1;
1678 /* function.c requires a push at the start of the function. */
1682 /* Create thunks for alternate entry points. */
1685 build_entry_thunks (gfc_namespace * ns)
1687 gfc_formal_arglist *formal;
1688 gfc_formal_arglist *thunk_formal;
1690 gfc_symbol *thunk_sym;
1698 /* This should always be a toplevel function. */
1699 gcc_assert (current_function_decl == NULL_TREE);
1701 gfc_get_backend_locus (&old_loc);
1702 for (el = ns->entries; el; el = el->next)
1704 thunk_sym = el->sym;
1706 build_function_decl (thunk_sym);
1707 create_function_arglist (thunk_sym);
1709 trans_function_start (thunk_sym);
1711 thunk_fndecl = thunk_sym->backend_decl;
1713 gfc_start_block (&body);
1715 /* Pass extra parameter identifying this entry point. */
1716 tmp = build_int_cst (gfc_array_index_type, el->id);
1717 args = tree_cons (NULL_TREE, tmp, NULL_TREE);
1718 string_args = NULL_TREE;
1720 if (thunk_sym->attr.function)
1722 if (gfc_return_by_reference (ns->proc_name))
1724 tree ref = DECL_ARGUMENTS (current_function_decl);
1725 args = tree_cons (NULL_TREE, ref, args);
1726 if (ns->proc_name->ts.type == BT_CHARACTER)
1727 args = tree_cons (NULL_TREE, TREE_CHAIN (ref),
1732 for (formal = ns->proc_name->formal; formal; formal = formal->next)
1734 /* Ignore alternate returns. */
1735 if (formal->sym == NULL)
1738 /* We don't have a clever way of identifying arguments, so resort to
1739 a brute-force search. */
1740 for (thunk_formal = thunk_sym->formal;
1742 thunk_formal = thunk_formal->next)
1744 if (thunk_formal->sym == formal->sym)
1750 /* Pass the argument. */
1751 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
1752 args = tree_cons (NULL_TREE, thunk_formal->sym->backend_decl,
1754 if (formal->sym->ts.type == BT_CHARACTER)
1756 tmp = thunk_formal->sym->ts.cl->backend_decl;
1757 string_args = tree_cons (NULL_TREE, tmp, string_args);
1762 /* Pass NULL for a missing argument. */
1763 args = tree_cons (NULL_TREE, null_pointer_node, args);
1764 if (formal->sym->ts.type == BT_CHARACTER)
1766 tmp = build_int_cst (gfc_charlen_type_node, 0);
1767 string_args = tree_cons (NULL_TREE, tmp, string_args);
1772 /* Call the master function. */
1773 args = nreverse (args);
1774 args = chainon (args, nreverse (string_args));
1775 tmp = ns->proc_name->backend_decl;
1776 tmp = build_function_call_expr (tmp, args);
1777 if (ns->proc_name->attr.mixed_entry_master)
1779 tree union_decl, field;
1780 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
1782 union_decl = build_decl (VAR_DECL, get_identifier ("__result"),
1783 TREE_TYPE (master_type));
1784 DECL_ARTIFICIAL (union_decl) = 1;
1785 DECL_EXTERNAL (union_decl) = 0;
1786 TREE_PUBLIC (union_decl) = 0;
1787 TREE_USED (union_decl) = 1;
1788 layout_decl (union_decl, 0);
1789 pushdecl (union_decl);
1791 DECL_CONTEXT (union_decl) = current_function_decl;
1792 tmp = fold_build2 (MODIFY_EXPR, TREE_TYPE (union_decl),
1794 gfc_add_expr_to_block (&body, tmp);
1796 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
1797 field; field = TREE_CHAIN (field))
1798 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1799 thunk_sym->result->name) == 0)
1801 gcc_assert (field != NULL_TREE);
1802 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
1803 union_decl, field, NULL_TREE);
1804 tmp = fold_build2 (MODIFY_EXPR,
1805 TREE_TYPE (DECL_RESULT (current_function_decl)),
1806 DECL_RESULT (current_function_decl), tmp);
1807 tmp = build1_v (RETURN_EXPR, tmp);
1809 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
1812 tmp = fold_build2 (MODIFY_EXPR,
1813 TREE_TYPE (DECL_RESULT (current_function_decl)),
1814 DECL_RESULT (current_function_decl), tmp);
1815 tmp = build1_v (RETURN_EXPR, tmp);
1817 gfc_add_expr_to_block (&body, tmp);
1819 /* Finish off this function and send it for code generation. */
1820 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
1822 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
1824 /* Output the GENERIC tree. */
1825 dump_function (TDI_original, thunk_fndecl);
1827 /* Store the end of the function, so that we get good line number
1828 info for the epilogue. */
1829 cfun->function_end_locus = input_location;
1831 /* We're leaving the context of this function, so zap cfun.
1832 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1833 tree_rest_of_compilation. */
1836 current_function_decl = NULL_TREE;
1838 gfc_gimplify_function (thunk_fndecl);
1839 cgraph_finalize_function (thunk_fndecl, false);
1841 /* We share the symbols in the formal argument list with other entry
1842 points and the master function. Clear them so that they are
1843 recreated for each function. */
1844 for (formal = thunk_sym->formal; formal; formal = formal->next)
1845 if (formal->sym != NULL) /* Ignore alternate returns. */
1847 formal->sym->backend_decl = NULL_TREE;
1848 if (formal->sym->ts.type == BT_CHARACTER)
1849 formal->sym->ts.cl->backend_decl = NULL_TREE;
1852 if (thunk_sym->attr.function)
1854 if (thunk_sym->ts.type == BT_CHARACTER)
1855 thunk_sym->ts.cl->backend_decl = NULL_TREE;
1856 if (thunk_sym->result->ts.type == BT_CHARACTER)
1857 thunk_sym->result->ts.cl->backend_decl = NULL_TREE;
1861 gfc_set_backend_locus (&old_loc);
1865 /* Create a decl for a function, and create any thunks for alternate entry
1869 gfc_create_function_decl (gfc_namespace * ns)
1871 /* Create a declaration for the master function. */
1872 build_function_decl (ns->proc_name);
1874 /* Compile the entry thunks. */
1876 build_entry_thunks (ns);
1878 /* Now create the read argument list. */
1879 create_function_arglist (ns->proc_name);
1882 /* Return the decl used to hold the function return value. If
1883 parent_flag is set, the context is the parent_scope. */
1886 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
1890 tree this_fake_result_decl;
1891 tree this_function_decl;
1893 char name[GFC_MAX_SYMBOL_LEN + 10];
1897 this_fake_result_decl = parent_fake_result_decl;
1898 this_function_decl = DECL_CONTEXT (current_function_decl);
1902 this_fake_result_decl = current_fake_result_decl;
1903 this_function_decl = current_function_decl;
1907 && sym->ns->proc_name->backend_decl == this_function_decl
1908 && sym->ns->proc_name->attr.entry_master
1909 && sym != sym->ns->proc_name)
1912 if (this_fake_result_decl != NULL)
1913 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
1914 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
1917 return TREE_VALUE (t);
1918 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
1921 this_fake_result_decl = parent_fake_result_decl;
1923 this_fake_result_decl = current_fake_result_decl;
1925 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
1929 for (field = TYPE_FIELDS (TREE_TYPE (decl));
1930 field; field = TREE_CHAIN (field))
1931 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1935 gcc_assert (field != NULL_TREE);
1936 decl = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
1937 decl, field, NULL_TREE);
1940 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
1942 gfc_add_decl_to_parent_function (var);
1944 gfc_add_decl_to_function (var);
1946 SET_DECL_VALUE_EXPR (var, decl);
1947 DECL_HAS_VALUE_EXPR_P (var) = 1;
1948 GFC_DECL_RESULT (var) = 1;
1950 TREE_CHAIN (this_fake_result_decl)
1951 = tree_cons (get_identifier (sym->name), var,
1952 TREE_CHAIN (this_fake_result_decl));
1956 if (this_fake_result_decl != NULL_TREE)
1957 return TREE_VALUE (this_fake_result_decl);
1959 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
1964 if (sym->ts.type == BT_CHARACTER)
1966 if (sym->ts.cl->backend_decl == NULL_TREE)
1967 length = gfc_create_string_length (sym);
1969 length = sym->ts.cl->backend_decl;
1970 if (TREE_CODE (length) == VAR_DECL
1971 && DECL_CONTEXT (length) == NULL_TREE)
1972 gfc_add_decl_to_function (length);
1975 if (gfc_return_by_reference (sym))
1977 decl = DECL_ARGUMENTS (this_function_decl);
1979 if (sym->ns->proc_name->backend_decl == this_function_decl
1980 && sym->ns->proc_name->attr.entry_master)
1981 decl = TREE_CHAIN (decl);
1983 TREE_USED (decl) = 1;
1985 decl = gfc_build_dummy_array_decl (sym, decl);
1989 sprintf (name, "__result_%.20s",
1990 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
1992 if (!sym->attr.mixed_entry_master && sym->attr.function)
1993 decl = build_decl (VAR_DECL, get_identifier (name),
1994 gfc_sym_type (sym));
1996 decl = build_decl (VAR_DECL, get_identifier (name),
1997 TREE_TYPE (TREE_TYPE (this_function_decl)));
1998 DECL_ARTIFICIAL (decl) = 1;
1999 DECL_EXTERNAL (decl) = 0;
2000 TREE_PUBLIC (decl) = 0;
2001 TREE_USED (decl) = 1;
2002 GFC_DECL_RESULT (decl) = 1;
2003 TREE_ADDRESSABLE (decl) = 1;
2005 layout_decl (decl, 0);
2008 gfc_add_decl_to_parent_function (decl);
2010 gfc_add_decl_to_function (decl);
2014 parent_fake_result_decl = build_tree_list (NULL, decl);
2016 current_fake_result_decl = build_tree_list (NULL, decl);
2022 /* Builds a function decl. The remaining parameters are the types of the
2023 function arguments. Negative nargs indicates a varargs function. */
2026 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
2035 /* Library functions must be declared with global scope. */
2036 gcc_assert (current_function_decl == NULL_TREE);
2038 va_start (p, nargs);
2041 /* Create a list of the argument types. */
2042 for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
2044 argtype = va_arg (p, tree);
2045 arglist = gfc_chainon_list (arglist, argtype);
2050 /* Terminate the list. */
2051 arglist = gfc_chainon_list (arglist, void_type_node);
2054 /* Build the function type and decl. */
2055 fntype = build_function_type (rettype, arglist);
2056 fndecl = build_decl (FUNCTION_DECL, name, fntype);
2058 /* Mark this decl as external. */
2059 DECL_EXTERNAL (fndecl) = 1;
2060 TREE_PUBLIC (fndecl) = 1;
2066 rest_of_decl_compilation (fndecl, 1, 0);
2072 gfc_build_intrinsic_function_decls (void)
2074 tree gfc_int4_type_node = gfc_get_int_type (4);
2075 tree gfc_int8_type_node = gfc_get_int_type (8);
2076 tree gfc_int16_type_node = gfc_get_int_type (16);
2077 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2078 tree pchar1_type_node = gfc_get_pchar_type (1);
2079 tree pchar4_type_node = gfc_get_pchar_type (4);
2081 /* String functions. */
2082 gfor_fndecl_compare_string =
2083 gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
2084 integer_type_node, 4,
2085 gfc_charlen_type_node, pchar1_type_node,
2086 gfc_charlen_type_node, pchar1_type_node);
2088 gfor_fndecl_concat_string =
2089 gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
2091 gfc_charlen_type_node, pchar1_type_node,
2092 gfc_charlen_type_node, pchar1_type_node,
2093 gfc_charlen_type_node, pchar1_type_node);
2095 gfor_fndecl_string_len_trim =
2096 gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
2097 gfc_int4_type_node, 2,
2098 gfc_charlen_type_node, pchar1_type_node);
2100 gfor_fndecl_string_index =
2101 gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
2102 gfc_int4_type_node, 5,
2103 gfc_charlen_type_node, pchar1_type_node,
2104 gfc_charlen_type_node, pchar1_type_node,
2105 gfc_logical4_type_node);
2107 gfor_fndecl_string_scan =
2108 gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
2109 gfc_int4_type_node, 5,
2110 gfc_charlen_type_node, pchar1_type_node,
2111 gfc_charlen_type_node, pchar1_type_node,
2112 gfc_logical4_type_node);
2114 gfor_fndecl_string_verify =
2115 gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
2116 gfc_int4_type_node, 5,
2117 gfc_charlen_type_node, pchar1_type_node,
2118 gfc_charlen_type_node, pchar1_type_node,
2119 gfc_logical4_type_node);
2121 gfor_fndecl_string_trim =
2122 gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
2124 build_pointer_type (gfc_charlen_type_node),
2125 build_pointer_type (pchar1_type_node),
2126 gfc_charlen_type_node, pchar1_type_node);
2128 gfor_fndecl_string_minmax =
2129 gfc_build_library_function_decl (get_identifier (PREFIX("string_minmax")),
2131 build_pointer_type (gfc_charlen_type_node),
2132 build_pointer_type (pchar1_type_node),
2133 integer_type_node, integer_type_node);
2135 gfor_fndecl_adjustl =
2136 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
2137 void_type_node, 3, pchar1_type_node,
2138 gfc_charlen_type_node, pchar1_type_node);
2140 gfor_fndecl_adjustr =
2141 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
2142 void_type_node, 3, pchar1_type_node,
2143 gfc_charlen_type_node, pchar1_type_node);
2145 gfor_fndecl_select_string =
2146 gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
2147 integer_type_node, 4, pvoid_type_node,
2148 integer_type_node, pchar1_type_node,
2149 gfc_charlen_type_node);
2151 gfor_fndecl_compare_string_char4 =
2152 gfc_build_library_function_decl (get_identifier
2153 (PREFIX("compare_string_char4")),
2154 integer_type_node, 4,
2155 gfc_charlen_type_node, pchar4_type_node,
2156 gfc_charlen_type_node, pchar4_type_node);
2158 gfor_fndecl_concat_string_char4 =
2159 gfc_build_library_function_decl (get_identifier
2160 (PREFIX("concat_string_char4")),
2162 gfc_charlen_type_node, pchar4_type_node,
2163 gfc_charlen_type_node, pchar4_type_node,
2164 gfc_charlen_type_node, pchar4_type_node);
2166 gfor_fndecl_string_len_trim_char4 =
2167 gfc_build_library_function_decl (get_identifier
2168 (PREFIX("string_len_trim_char4")),
2169 gfc_charlen_type_node, 2,
2170 gfc_charlen_type_node, pchar4_type_node);
2172 gfor_fndecl_string_index_char4 =
2173 gfc_build_library_function_decl (get_identifier
2174 (PREFIX("string_index_char4")),
2175 gfc_charlen_type_node, 5,
2176 gfc_charlen_type_node, pchar4_type_node,
2177 gfc_charlen_type_node, pchar4_type_node,
2178 gfc_logical4_type_node);
2180 gfor_fndecl_string_scan_char4 =
2181 gfc_build_library_function_decl (get_identifier
2182 (PREFIX("string_scan_char4")),
2183 gfc_charlen_type_node, 5,
2184 gfc_charlen_type_node, pchar4_type_node,
2185 gfc_charlen_type_node, pchar4_type_node,
2186 gfc_logical4_type_node);
2188 gfor_fndecl_string_verify_char4 =
2189 gfc_build_library_function_decl (get_identifier
2190 (PREFIX("string_verify_char4")),
2191 gfc_charlen_type_node, 5,
2192 gfc_charlen_type_node, pchar4_type_node,
2193 gfc_charlen_type_node, pchar4_type_node,
2194 gfc_logical4_type_node);
2196 gfor_fndecl_string_trim_char4 =
2197 gfc_build_library_function_decl (get_identifier
2198 (PREFIX("string_trim_char4")),
2200 build_pointer_type (gfc_charlen_type_node),
2201 build_pointer_type (pchar4_type_node),
2202 gfc_charlen_type_node, pchar4_type_node);
2204 gfor_fndecl_string_minmax_char4 =
2205 gfc_build_library_function_decl (get_identifier
2206 (PREFIX("string_minmax_char4")),
2208 build_pointer_type (gfc_charlen_type_node),
2209 build_pointer_type (pchar4_type_node),
2210 integer_type_node, integer_type_node);
2212 gfor_fndecl_adjustl_char4 =
2213 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl_char4")),
2214 void_type_node, 3, pchar4_type_node,
2215 gfc_charlen_type_node, pchar4_type_node);
2217 gfor_fndecl_adjustr_char4 =
2218 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr_char4")),
2219 void_type_node, 3, pchar4_type_node,
2220 gfc_charlen_type_node, pchar4_type_node);
2222 gfor_fndecl_select_string_char4 =
2223 gfc_build_library_function_decl (get_identifier
2224 (PREFIX("select_string_char4")),
2225 integer_type_node, 4, pvoid_type_node,
2226 integer_type_node, pvoid_type_node,
2227 gfc_charlen_type_node);
2230 /* Conversion between character kinds. */
2232 gfor_fndecl_convert_char1_to_char4 =
2233 gfc_build_library_function_decl (get_identifier
2234 (PREFIX("convert_char1_to_char4")),
2236 build_pointer_type (pchar4_type_node),
2237 gfc_charlen_type_node, pchar1_type_node);
2239 gfor_fndecl_convert_char4_to_char1 =
2240 gfc_build_library_function_decl (get_identifier
2241 (PREFIX("convert_char4_to_char1")),
2243 build_pointer_type (pchar1_type_node),
2244 gfc_charlen_type_node, pchar4_type_node);
2246 /* Misc. functions. */
2248 gfor_fndecl_ttynam =
2249 gfc_build_library_function_decl (get_identifier (PREFIX("ttynam")),
2253 gfc_charlen_type_node,
2257 gfc_build_library_function_decl (get_identifier (PREFIX("fdate")),
2261 gfc_charlen_type_node);
2264 gfc_build_library_function_decl (get_identifier (PREFIX("ctime")),
2268 gfc_charlen_type_node,
2269 gfc_int8_type_node);
2271 gfor_fndecl_sc_kind =
2272 gfc_build_library_function_decl (get_identifier
2273 (PREFIX("selected_char_kind")),
2274 gfc_int4_type_node, 2,
2275 gfc_charlen_type_node, pchar_type_node);
2277 gfor_fndecl_si_kind =
2278 gfc_build_library_function_decl (get_identifier
2279 (PREFIX("selected_int_kind")),
2280 gfc_int4_type_node, 1, pvoid_type_node);
2282 gfor_fndecl_sr_kind =
2283 gfc_build_library_function_decl (get_identifier
2284 (PREFIX("selected_real_kind")),
2285 gfc_int4_type_node, 2,
2286 pvoid_type_node, pvoid_type_node);
2288 /* Power functions. */
2290 tree ctype, rtype, itype, jtype;
2291 int rkind, ikind, jkind;
2294 static int ikinds[NIKINDS] = {4, 8, 16};
2295 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2296 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2298 for (ikind=0; ikind < NIKINDS; ikind++)
2300 itype = gfc_get_int_type (ikinds[ikind]);
2302 for (jkind=0; jkind < NIKINDS; jkind++)
2304 jtype = gfc_get_int_type (ikinds[jkind]);
2307 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2309 gfor_fndecl_math_powi[jkind][ikind].integer =
2310 gfc_build_library_function_decl (get_identifier (name),
2311 jtype, 2, jtype, itype);
2312 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2316 for (rkind = 0; rkind < NRKINDS; rkind ++)
2318 rtype = gfc_get_real_type (rkinds[rkind]);
2321 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2323 gfor_fndecl_math_powi[rkind][ikind].real =
2324 gfc_build_library_function_decl (get_identifier (name),
2325 rtype, 2, rtype, itype);
2326 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2329 ctype = gfc_get_complex_type (rkinds[rkind]);
2332 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2334 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2335 gfc_build_library_function_decl (get_identifier (name),
2336 ctype, 2,ctype, itype);
2337 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2345 gfor_fndecl_math_ishftc4 =
2346 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
2348 3, gfc_int4_type_node,
2349 gfc_int4_type_node, gfc_int4_type_node);
2350 gfor_fndecl_math_ishftc8 =
2351 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
2353 3, gfc_int8_type_node,
2354 gfc_int4_type_node, gfc_int4_type_node);
2355 if (gfc_int16_type_node)
2356 gfor_fndecl_math_ishftc16 =
2357 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc16")),
2358 gfc_int16_type_node, 3,
2359 gfc_int16_type_node,
2361 gfc_int4_type_node);
2363 /* BLAS functions. */
2365 tree pint = build_pointer_type (integer_type_node);
2366 tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
2367 tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
2368 tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
2369 tree pz = build_pointer_type
2370 (gfc_get_complex_type (gfc_default_double_kind));
2372 gfor_fndecl_sgemm = gfc_build_library_function_decl
2374 (gfc_option.flag_underscoring ? "sgemm_"
2376 void_type_node, 15, pchar_type_node,
2377 pchar_type_node, pint, pint, pint, ps, ps, pint,
2378 ps, pint, ps, ps, pint, integer_type_node,
2380 gfor_fndecl_dgemm = gfc_build_library_function_decl
2382 (gfc_option.flag_underscoring ? "dgemm_"
2384 void_type_node, 15, pchar_type_node,
2385 pchar_type_node, pint, pint, pint, pd, pd, pint,
2386 pd, pint, pd, pd, pint, integer_type_node,
2388 gfor_fndecl_cgemm = gfc_build_library_function_decl
2390 (gfc_option.flag_underscoring ? "cgemm_"
2392 void_type_node, 15, pchar_type_node,
2393 pchar_type_node, pint, pint, pint, pc, pc, pint,
2394 pc, pint, pc, pc, pint, integer_type_node,
2396 gfor_fndecl_zgemm = gfc_build_library_function_decl
2398 (gfc_option.flag_underscoring ? "zgemm_"
2400 void_type_node, 15, pchar_type_node,
2401 pchar_type_node, pint, pint, pint, pz, pz, pint,
2402 pz, pint, pz, pz, pint, integer_type_node,
2406 /* Other functions. */
2408 gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
2409 gfc_array_index_type,
2410 1, pvoid_type_node);
2412 gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
2413 gfc_array_index_type,
2415 gfc_array_index_type);
2418 gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
2424 /* Make prototypes for runtime library functions. */
2427 gfc_build_builtin_function_decls (void)
2429 tree gfc_int4_type_node = gfc_get_int_type (4);
2431 gfor_fndecl_stop_numeric =
2432 gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
2433 void_type_node, 1, gfc_int4_type_node);
2434 /* Stop doesn't return. */
2435 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
2437 gfor_fndecl_stop_string =
2438 gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
2439 void_type_node, 2, pchar_type_node,
2440 gfc_int4_type_node);
2441 /* Stop doesn't return. */
2442 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
2444 gfor_fndecl_pause_numeric =
2445 gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
2446 void_type_node, 1, gfc_int4_type_node);
2448 gfor_fndecl_pause_string =
2449 gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
2450 void_type_node, 2, pchar_type_node,
2451 gfc_int4_type_node);
2453 gfor_fndecl_runtime_error =
2454 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
2455 void_type_node, -1, pchar_type_node);
2456 /* The runtime_error function does not return. */
2457 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
2459 gfor_fndecl_runtime_error_at =
2460 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error_at")),
2461 void_type_node, -2, pchar_type_node,
2463 /* The runtime_error_at function does not return. */
2464 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
2466 gfor_fndecl_runtime_warning_at =
2467 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_warning_at")),
2468 void_type_node, -2, pchar_type_node,
2470 gfor_fndecl_generate_error =
2471 gfc_build_library_function_decl (get_identifier (PREFIX("generate_error")),
2472 void_type_node, 3, pvoid_type_node,
2473 integer_type_node, pchar_type_node);
2475 gfor_fndecl_os_error =
2476 gfc_build_library_function_decl (get_identifier (PREFIX("os_error")),
2477 void_type_node, 1, pchar_type_node);
2478 /* The runtime_error function does not return. */
2479 TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
2481 gfor_fndecl_set_fpe =
2482 gfc_build_library_function_decl (get_identifier (PREFIX("set_fpe")),
2483 void_type_node, 1, integer_type_node);
2485 /* Keep the array dimension in sync with the call, later in this file. */
2486 gfor_fndecl_set_options =
2487 gfc_build_library_function_decl (get_identifier (PREFIX("set_options")),
2488 void_type_node, 2, integer_type_node,
2491 gfor_fndecl_set_convert =
2492 gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")),
2493 void_type_node, 1, integer_type_node);
2495 gfor_fndecl_set_record_marker =
2496 gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")),
2497 void_type_node, 1, integer_type_node);
2499 gfor_fndecl_set_max_subrecord_length =
2500 gfc_build_library_function_decl (get_identifier (PREFIX("set_max_subrecord_length")),
2501 void_type_node, 1, integer_type_node);
2503 gfor_fndecl_in_pack = gfc_build_library_function_decl (
2504 get_identifier (PREFIX("internal_pack")),
2505 pvoid_type_node, 1, pvoid_type_node);
2507 gfor_fndecl_in_unpack = gfc_build_library_function_decl (
2508 get_identifier (PREFIX("internal_unpack")),
2509 void_type_node, 2, pvoid_type_node, pvoid_type_node);
2511 gfor_fndecl_associated =
2512 gfc_build_library_function_decl (
2513 get_identifier (PREFIX("associated")),
2514 integer_type_node, 2, ppvoid_type_node,
2517 gfc_build_intrinsic_function_decls ();
2518 gfc_build_intrinsic_lib_fndecls ();
2519 gfc_build_io_library_fndecls ();
2523 /* Evaluate the length of dummy character variables. */
2526 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl, tree fnbody)
2530 gfc_finish_decl (cl->backend_decl);
2532 gfc_start_block (&body);
2534 /* Evaluate the string length expression. */
2535 gfc_conv_string_length (cl, &body);
2537 gfc_trans_vla_type_sizes (sym, &body);
2539 gfc_add_expr_to_block (&body, fnbody);
2540 return gfc_finish_block (&body);
2544 /* Allocate and cleanup an automatic character variable. */
2547 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
2553 gcc_assert (sym->backend_decl);
2554 gcc_assert (sym->ts.cl && sym->ts.cl->length);
2556 gfc_start_block (&body);
2558 /* Evaluate the string length expression. */
2559 gfc_conv_string_length (sym->ts.cl, &body);
2561 gfc_trans_vla_type_sizes (sym, &body);
2563 decl = sym->backend_decl;
2565 /* Emit a DECL_EXPR for this variable, which will cause the
2566 gimplifier to allocate storage, and all that good stuff. */
2567 tmp = fold_build1 (DECL_EXPR, TREE_TYPE (decl), decl);
2568 gfc_add_expr_to_block (&body, tmp);
2570 gfc_add_expr_to_block (&body, fnbody);
2571 return gfc_finish_block (&body);
2574 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
2577 gfc_trans_assign_aux_var (gfc_symbol * sym, tree fnbody)
2581 gcc_assert (sym->backend_decl);
2582 gfc_start_block (&body);
2584 /* Set the initial value to length. See the comments in
2585 function gfc_add_assign_aux_vars in this file. */
2586 gfc_add_modify (&body, GFC_DECL_STRING_LEN (sym->backend_decl),
2587 build_int_cst (NULL_TREE, -2));
2589 gfc_add_expr_to_block (&body, fnbody);
2590 return gfc_finish_block (&body);
2594 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
2596 tree t = *tp, var, val;
2598 if (t == NULL || t == error_mark_node)
2600 if (TREE_CONSTANT (t) || DECL_P (t))
2603 if (TREE_CODE (t) == SAVE_EXPR)
2605 if (SAVE_EXPR_RESOLVED_P (t))
2607 *tp = TREE_OPERAND (t, 0);
2610 val = TREE_OPERAND (t, 0);
2615 var = gfc_create_var_np (TREE_TYPE (t), NULL);
2616 gfc_add_decl_to_function (var);
2617 gfc_add_modify (body, var, val);
2618 if (TREE_CODE (t) == SAVE_EXPR)
2619 TREE_OPERAND (t, 0) = var;
2624 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
2628 if (type == NULL || type == error_mark_node)
2631 type = TYPE_MAIN_VARIANT (type);
2633 if (TREE_CODE (type) == INTEGER_TYPE)
2635 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
2636 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
2638 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2640 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
2641 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
2644 else if (TREE_CODE (type) == ARRAY_TYPE)
2646 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
2647 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
2648 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
2649 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
2651 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2653 TYPE_SIZE (t) = TYPE_SIZE (type);
2654 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
2659 /* Make sure all type sizes and array domains are either constant,
2660 or variable or parameter decls. This is a simplified variant
2661 of gimplify_type_sizes, but we can't use it here, as none of the
2662 variables in the expressions have been gimplified yet.
2663 As type sizes and domains for various variable length arrays
2664 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
2665 time, without this routine gimplify_type_sizes in the middle-end
2666 could result in the type sizes being gimplified earlier than where
2667 those variables are initialized. */
2670 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
2672 tree type = TREE_TYPE (sym->backend_decl);
2674 if (TREE_CODE (type) == FUNCTION_TYPE
2675 && (sym->attr.function || sym->attr.result || sym->attr.entry))
2677 if (! current_fake_result_decl)
2680 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
2683 while (POINTER_TYPE_P (type))
2684 type = TREE_TYPE (type);
2686 if (GFC_DESCRIPTOR_TYPE_P (type))
2688 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2690 while (POINTER_TYPE_P (etype))
2691 etype = TREE_TYPE (etype);
2693 gfc_trans_vla_type_sizes_1 (etype, body);
2696 gfc_trans_vla_type_sizes_1 (type, body);
2700 /* Initialize a derived type by building an lvalue from the symbol
2701 and using trans_assignment to do the work. */
2703 gfc_init_default_dt (gfc_symbol * sym, tree body)
2705 stmtblock_t fnblock;
2710 gfc_init_block (&fnblock);
2711 gcc_assert (!sym->attr.allocatable);
2712 gfc_set_sym_referenced (sym);
2713 e = gfc_lval_expr_from_sym (sym);
2714 tmp = gfc_trans_assignment (e, sym->value, false);
2715 if (sym->attr.dummy)
2717 present = gfc_conv_expr_present (sym);
2718 tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present,
2719 tmp, build_empty_stmt ());
2721 gfc_add_expr_to_block (&fnblock, tmp);
2724 gfc_add_expr_to_block (&fnblock, body);
2725 return gfc_finish_block (&fnblock);
2729 /* Initialize INTENT(OUT) derived type dummies. */
2731 init_intent_out_dt (gfc_symbol * proc_sym, tree body)
2733 stmtblock_t fnblock;
2734 gfc_formal_arglist *f;
2736 gfc_init_block (&fnblock);
2737 for (f = proc_sym->formal; f; f = f->next)
2738 if (f->sym && f->sym->attr.intent == INTENT_OUT
2739 && f->sym->ts.type == BT_DERIVED
2740 && !f->sym->ts.derived->attr.alloc_comp
2742 body = gfc_init_default_dt (f->sym, body);
2744 gfc_add_expr_to_block (&fnblock, body);
2745 return gfc_finish_block (&fnblock);
2749 /* Generate function entry and exit code, and add it to the function body.
2751 Allocation and initialization of array variables.
2752 Allocation of character string variables.
2753 Initialization and possibly repacking of dummy arrays.
2754 Initialization of ASSIGN statement auxiliary variable. */
2757 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2761 gfc_formal_arglist *f;
2763 bool seen_trans_deferred_array = false;
2765 /* Deal with implicit return variables. Explicit return variables will
2766 already have been added. */
2767 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2769 if (!current_fake_result_decl)
2771 gfc_entry_list *el = NULL;
2772 if (proc_sym->attr.entry_master)
2774 for (el = proc_sym->ns->entries; el; el = el->next)
2775 if (el->sym != el->sym->result)
2778 /* TODO: move to the appropriate place in resolve.c. */
2779 if (warn_return_type && el == NULL)
2780 gfc_warning ("Return value of function '%s' at %L not set",
2781 proc_sym->name, &proc_sym->declared_at);
2783 else if (proc_sym->as)
2785 tree result = TREE_VALUE (current_fake_result_decl);
2786 fnbody = gfc_trans_dummy_array_bias (proc_sym, result, fnbody);
2788 /* An automatic character length, pointer array result. */
2789 if (proc_sym->ts.type == BT_CHARACTER
2790 && TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2791 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2794 else if (proc_sym->ts.type == BT_CHARACTER)
2796 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2797 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2801 gcc_assert (gfc_option.flag_f2c
2802 && proc_sym->ts.type == BT_COMPLEX);
2805 /* Initialize the INTENT(OUT) derived type dummy arguments. This
2806 should be done here so that the offsets and lbounds of arrays
2808 fnbody = init_intent_out_dt (proc_sym, fnbody);
2810 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2812 bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
2813 && sym->ts.derived->attr.alloc_comp;
2814 if (sym->attr.dimension)
2816 switch (sym->as->type)
2819 if (sym->attr.dummy || sym->attr.result)
2821 gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2822 else if (sym->attr.pointer || sym->attr.allocatable)
2824 if (TREE_STATIC (sym->backend_decl))
2825 gfc_trans_static_array_pointer (sym);
2828 seen_trans_deferred_array = true;
2829 fnbody = gfc_trans_deferred_array (sym, fnbody);
2834 if (sym_has_alloc_comp)
2836 seen_trans_deferred_array = true;
2837 fnbody = gfc_trans_deferred_array (sym, fnbody);
2839 else if (sym->ts.type == BT_DERIVED
2842 && sym->attr.save == SAVE_NONE)
2843 fnbody = gfc_init_default_dt (sym, fnbody);
2845 gfc_get_backend_locus (&loc);
2846 gfc_set_backend_locus (&sym->declared_at);
2847 fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2849 gfc_set_backend_locus (&loc);
2853 case AS_ASSUMED_SIZE:
2854 /* Must be a dummy parameter. */
2855 gcc_assert (sym->attr.dummy);
2857 /* We should always pass assumed size arrays the g77 way. */
2858 fnbody = gfc_trans_g77_array (sym, fnbody);
2861 case AS_ASSUMED_SHAPE:
2862 /* Must be a dummy parameter. */
2863 gcc_assert (sym->attr.dummy);
2865 fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2870 seen_trans_deferred_array = true;
2871 fnbody = gfc_trans_deferred_array (sym, fnbody);
2877 if (sym_has_alloc_comp && !seen_trans_deferred_array)
2878 fnbody = gfc_trans_deferred_array (sym, fnbody);
2880 else if (sym_has_alloc_comp)
2881 fnbody = gfc_trans_deferred_array (sym, fnbody);
2882 else if (sym->ts.type == BT_CHARACTER)
2884 gfc_get_backend_locus (&loc);
2885 gfc_set_backend_locus (&sym->declared_at);
2886 if (sym->attr.dummy || sym->attr.result)
2887 fnbody = gfc_trans_dummy_character (sym, sym->ts.cl, fnbody);
2889 fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2890 gfc_set_backend_locus (&loc);
2892 else if (sym->attr.assign)
2894 gfc_get_backend_locus (&loc);
2895 gfc_set_backend_locus (&sym->declared_at);
2896 fnbody = gfc_trans_assign_aux_var (sym, fnbody);
2897 gfc_set_backend_locus (&loc);
2899 else if (sym->ts.type == BT_DERIVED
2902 && sym->attr.save == SAVE_NONE)
2903 fnbody = gfc_init_default_dt (sym, fnbody);
2908 gfc_init_block (&body);
2910 for (f = proc_sym->formal; f; f = f->next)
2912 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
2914 gcc_assert (f->sym->ts.cl->backend_decl != NULL);
2915 if (TREE_CODE (f->sym->ts.cl->backend_decl) == PARM_DECL)
2916 gfc_trans_vla_type_sizes (f->sym, &body);
2920 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
2921 && current_fake_result_decl != NULL)
2923 gcc_assert (proc_sym->ts.cl->backend_decl != NULL);
2924 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == PARM_DECL)
2925 gfc_trans_vla_type_sizes (proc_sym, &body);
2928 gfc_add_expr_to_block (&body, fnbody);
2929 return gfc_finish_block (&body);
2932 static GTY ((param_is (struct module_htab_entry))) htab_t module_htab;
2934 /* Hash and equality functions for module_htab. */
2937 module_htab_do_hash (const void *x)
2939 return htab_hash_string (((const struct module_htab_entry *)x)->name);
2943 module_htab_eq (const void *x1, const void *x2)
2945 return strcmp ((((const struct module_htab_entry *)x1)->name),
2946 (const char *)x2) == 0;
2949 /* Hash and equality functions for module_htab's decls. */
2952 module_htab_decls_hash (const void *x)
2954 const_tree t = (const_tree) x;
2955 const_tree n = DECL_NAME (t);
2957 n = TYPE_NAME (TREE_TYPE (t));
2958 return htab_hash_string (IDENTIFIER_POINTER (n));
2962 module_htab_decls_eq (const void *x1, const void *x2)
2964 const_tree t1 = (const_tree) x1;
2965 const_tree n1 = DECL_NAME (t1);
2966 if (n1 == NULL_TREE)
2967 n1 = TYPE_NAME (TREE_TYPE (t1));
2968 return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0;
2971 struct module_htab_entry *
2972 gfc_find_module (const char *name)
2977 module_htab = htab_create_ggc (10, module_htab_do_hash,
2978 module_htab_eq, NULL);
2980 slot = htab_find_slot_with_hash (module_htab, name,
2981 htab_hash_string (name), INSERT);
2984 struct module_htab_entry *entry = GGC_CNEW (struct module_htab_entry);
2986 entry->name = gfc_get_string (name);
2987 entry->decls = htab_create_ggc (10, module_htab_decls_hash,
2988 module_htab_decls_eq, NULL);
2989 *slot = (void *) entry;
2991 return (struct module_htab_entry *) *slot;
2995 gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
3000 if (DECL_NAME (decl))
3001 name = IDENTIFIER_POINTER (DECL_NAME (decl));
3004 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
3005 name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
3007 slot = htab_find_slot_with_hash (entry->decls, name,
3008 htab_hash_string (name), INSERT);
3010 *slot = (void *) decl;
3013 static struct module_htab_entry *cur_module;
3015 /* Output an initialized decl for a module variable. */
3018 gfc_create_module_variable (gfc_symbol * sym)
3022 /* Module functions with alternate entries are dealt with later and
3023 would get caught by the next condition. */
3024 if (sym->attr.entry)
3027 /* Make sure we convert the types of the derived types from iso_c_binding
3029 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3030 && sym->ts.type == BT_DERIVED)
3031 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3033 if (sym->attr.flavor == FL_DERIVED
3034 && sym->backend_decl
3035 && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
3037 decl = sym->backend_decl;
3038 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3039 gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
3040 || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
3041 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
3042 || DECL_CONTEXT (TYPE_STUB_DECL (decl))
3043 == sym->ns->proc_name->backend_decl);
3044 TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3045 DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
3046 gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
3049 /* Only output variables and array valued, or derived type,
3051 if (sym->attr.flavor != FL_VARIABLE
3052 && !(sym->attr.flavor == FL_PARAMETER
3053 && (sym->attr.dimension || sym->ts.type == BT_DERIVED)))
3056 if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
3058 decl = sym->backend_decl;
3059 gcc_assert (DECL_CONTEXT (decl) == NULL_TREE);
3060 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3061 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3062 gfc_module_add_decl (cur_module, decl);
3065 /* Don't generate variables from other modules. Variables from
3066 COMMONs will already have been generated. */
3067 if (sym->attr.use_assoc || sym->attr.in_common)
3070 /* Equivalenced variables arrive here after creation. */
3071 if (sym->backend_decl
3072 && (sym->equiv_built || sym->attr.in_equivalence))
3075 if (sym->backend_decl)
3076 internal_error ("backend decl for module variable %s already exists",
3079 /* We always want module variables to be created. */
3080 sym->attr.referenced = 1;
3081 /* Create the decl. */
3082 decl = gfc_get_symbol_decl (sym);
3084 /* Create the variable. */
3086 gcc_assert (DECL_CONTEXT (decl) == NULL_TREE);
3087 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3088 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3089 rest_of_decl_compilation (decl, 1, 0);
3090 gfc_module_add_decl (cur_module, decl);
3092 /* Also add length of strings. */
3093 if (sym->ts.type == BT_CHARACTER)
3097 length = sym->ts.cl->backend_decl;
3098 if (!INTEGER_CST_P (length))
3101 rest_of_decl_compilation (length, 1, 0);
3107 /* Generate all the required code for module variables. */
3110 gfc_generate_module_vars (gfc_namespace * ns)
3112 module_namespace = ns;
3113 cur_module = gfc_find_module (ns->proc_name->name);
3115 /* Check if the frontend left the namespace in a reasonable state. */
3116 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
3118 /* Generate COMMON blocks. */
3119 gfc_trans_common (ns);
3121 /* Create decls for all the module variables. */
3122 gfc_traverse_ns (ns, gfc_create_module_variable);
3128 gfc_trans_use_stmts (gfc_namespace * ns)
3130 gfc_use_list *use_stmt;
3131 for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
3133 struct module_htab_entry *entry
3134 = gfc_find_module (use_stmt->module_name);
3135 gfc_use_rename *rent;
3137 if (entry->namespace_decl == NULL)
3139 entry->namespace_decl
3140 = build_decl (NAMESPACE_DECL,
3141 get_identifier (use_stmt->module_name),
3143 DECL_EXTERNAL (entry->namespace_decl) = 1;
3145 if (!use_stmt->only_flag)
3146 (*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
3148 ns->proc_name->backend_decl,
3150 for (rent = use_stmt->rename; rent; rent = rent->next)
3152 tree decl, local_name;
3155 if (rent->op != INTRINSIC_NONE)
3158 slot = htab_find_slot_with_hash (entry->decls, rent->use_name,
3159 htab_hash_string (rent->use_name),
3165 st = gfc_find_symtree (ns->sym_root,
3167 ? rent->local_name : rent->use_name);
3168 gcc_assert (st && st->n.sym->attr.use_assoc);
3169 if (st->n.sym->backend_decl && DECL_P (st->n.sym->backend_decl))
3171 gcc_assert (DECL_EXTERNAL (entry->namespace_decl));
3172 decl = copy_node (st->n.sym->backend_decl);
3173 DECL_CONTEXT (decl) = entry->namespace_decl;
3174 DECL_EXTERNAL (decl) = 1;
3175 DECL_IGNORED_P (decl) = 0;
3176 DECL_INITIAL (decl) = NULL_TREE;
3180 *slot = error_mark_node;
3181 htab_clear_slot (entry->decls, slot);
3186 decl = (tree) *slot;
3187 if (rent->local_name[0])
3188 local_name = get_identifier (rent->local_name);
3190 local_name = NULL_TREE;
3191 (*debug_hooks->imported_module_or_decl) (decl, local_name,
3192 ns->proc_name->backend_decl,
3193 !use_stmt->only_flag);
3199 gfc_generate_contained_functions (gfc_namespace * parent)
3203 /* We create all the prototypes before generating any code. */
3204 for (ns = parent->contained; ns; ns = ns->sibling)
3206 /* Skip namespaces from used modules. */
3207 if (ns->parent != parent)
3210 gfc_create_function_decl (ns);
3213 for (ns = parent->contained; ns; ns = ns->sibling)
3215 /* Skip namespaces from used modules. */
3216 if (ns->parent != parent)
3219 gfc_generate_function_code (ns);
3224 /* Drill down through expressions for the array specification bounds and
3225 character length calling generate_local_decl for all those variables
3226 that have not already been declared. */
3229 generate_local_decl (gfc_symbol *);
3231 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
3234 expr_decls (gfc_expr *e, gfc_symbol *sym,
3235 int *f ATTRIBUTE_UNUSED)
3237 if (e->expr_type != EXPR_VARIABLE
3238 || sym == e->symtree->n.sym
3239 || e->symtree->n.sym->mark
3240 || e->symtree->n.sym->ns != sym->ns)
3243 generate_local_decl (e->symtree->n.sym);
3248 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
3250 gfc_traverse_expr (e, sym, expr_decls, 0);
3254 /* Check for dependencies in the character length and array spec. */
3257 generate_dependency_declarations (gfc_symbol *sym)
3261 if (sym->ts.type == BT_CHARACTER
3263 && sym->ts.cl->length
3264 && sym->ts.cl->length->expr_type != EXPR_CONSTANT)
3265 generate_expr_decls (sym, sym->ts.cl->length);
3267 if (sym->as && sym->as->rank)
3269 for (i = 0; i < sym->as->rank; i++)
3271 generate_expr_decls (sym, sym->as->lower[i]);
3272 generate_expr_decls (sym, sym->as->upper[i]);
3278 /* Generate decls for all local variables. We do this to ensure correct
3279 handling of expressions which only appear in the specification of
3283 generate_local_decl (gfc_symbol * sym)
3285 if (sym->attr.flavor == FL_VARIABLE)
3287 /* Check for dependencies in the array specification and string
3288 length, adding the necessary declarations to the function. We
3289 mark the symbol now, as well as in traverse_ns, to prevent
3290 getting stuck in a circular dependency. */
3292 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
3293 generate_dependency_declarations (sym);
3295 if (sym->attr.referenced)
3296 gfc_get_symbol_decl (sym);
3297 /* INTENT(out) dummy arguments are likely meant to be set. */
3298 else if (warn_unused_variable
3300 && sym->attr.intent == INTENT_OUT)
3301 gfc_warning ("Dummy argument '%s' at %L was declared INTENT(OUT) but was not set",
3302 sym->name, &sym->declared_at);
3303 /* Specific warning for unused dummy arguments. */
3304 else if (warn_unused_variable && sym->attr.dummy)
3305 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
3307 /* Warn for unused variables, but not if they're inside a common
3308 block or are use-associated. */
3309 else if (warn_unused_variable
3310 && !(sym->attr.in_common || sym->attr.use_assoc || sym->mark))
3311 gfc_warning ("Unused variable '%s' declared at %L", sym->name,
3313 /* For variable length CHARACTER parameters, the PARM_DECL already
3314 references the length variable, so force gfc_get_symbol_decl
3315 even when not referenced. If optimize > 0, it will be optimized
3316 away anyway. But do this only after emitting -Wunused-parameter
3317 warning if requested. */
3318 if (sym->attr.dummy && ! sym->attr.referenced
3319 && sym->ts.type == BT_CHARACTER
3320 && sym->ts.cl->backend_decl != NULL
3321 && TREE_CODE (sym->ts.cl->backend_decl) == VAR_DECL)
3323 sym->attr.referenced = 1;
3324 gfc_get_symbol_decl (sym);
3327 /* We do not want the middle-end to warn about unused parameters
3328 as this was already done above. */
3329 if (sym->attr.dummy && sym->backend_decl != NULL_TREE)
3330 TREE_NO_WARNING(sym->backend_decl) = 1;
3332 else if (sym->attr.flavor == FL_PARAMETER)
3334 if (warn_unused_parameter
3335 && !sym->attr.referenced
3336 && !sym->attr.use_assoc)
3337 gfc_warning ("Unused parameter '%s' declared at %L", sym->name,
3340 else if (sym->attr.flavor == FL_PROCEDURE)
3342 /* TODO: move to the appropriate place in resolve.c. */
3343 if (warn_return_type
3344 && sym->attr.function
3346 && sym != sym->result
3347 && !sym->result->attr.referenced
3348 && !sym->attr.use_assoc
3349 && sym->attr.if_source != IFSRC_IFBODY)
3351 gfc_warning ("Return value '%s' of function '%s' declared at "
3352 "%L not set", sym->result->name, sym->name,
3353 &sym->result->declared_at);
3355 /* Prevents "Unused variable" warning for RESULT variables. */
3356 sym->mark = sym->result->mark = 1;
3360 if (sym->attr.dummy == 1)
3362 /* Modify the tree type for scalar character dummy arguments of bind(c)
3363 procedures if they are passed by value. The tree type for them will
3364 be promoted to INTEGER_TYPE for the middle end, which appears to be
3365 what C would do with characters passed by-value. The value attribute
3366 implies the dummy is a scalar. */
3367 if (sym->attr.value == 1 && sym->backend_decl != NULL
3368 && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
3369 && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
3370 gfc_conv_scalar_char_value (sym, NULL, NULL);
3373 /* Make sure we convert the types of the derived types from iso_c_binding
3375 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3376 && sym->ts.type == BT_DERIVED)
3377 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3381 generate_local_vars (gfc_namespace * ns)
3383 gfc_traverse_ns (ns, generate_local_decl);
3387 /* Generate a switch statement to jump to the correct entry point. Also
3388 creates the label decls for the entry points. */
3391 gfc_trans_entry_master_switch (gfc_entry_list * el)
3398 gfc_init_block (&block);
3399 for (; el; el = el->next)
3401 /* Add the case label. */
3402 label = gfc_build_label_decl (NULL_TREE);
3403 val = build_int_cst (gfc_array_index_type, el->id);
3404 tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
3405 gfc_add_expr_to_block (&block, tmp);
3407 /* And jump to the actual entry point. */
3408 label = gfc_build_label_decl (NULL_TREE);
3409 tmp = build1_v (GOTO_EXPR, label);
3410 gfc_add_expr_to_block (&block, tmp);
3412 /* Save the label decl. */
3415 tmp = gfc_finish_block (&block);
3416 /* The first argument selects the entry point. */
3417 val = DECL_ARGUMENTS (current_function_decl);
3418 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
3423 /* Generate code for a function. */
3426 gfc_generate_function_code (gfc_namespace * ns)
3439 sym = ns->proc_name;
3441 /* Check that the frontend isn't still using this. */
3442 gcc_assert (sym->tlink == NULL);
3445 /* Create the declaration for functions with global scope. */
3446 if (!sym->backend_decl)
3447 gfc_create_function_decl (ns);
3449 fndecl = sym->backend_decl;
3450 old_context = current_function_decl;
3454 push_function_context ();
3455 saved_parent_function_decls = saved_function_decls;
3456 saved_function_decls = NULL_TREE;
3459 trans_function_start (sym);
3461 gfc_start_block (&block);
3463 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
3465 /* Copy length backend_decls to all entry point result
3470 gfc_conv_const_charlen (ns->proc_name->ts.cl);
3471 backend_decl = ns->proc_name->result->ts.cl->backend_decl;
3472 for (el = ns->entries; el; el = el->next)
3473 el->sym->result->ts.cl->backend_decl = backend_decl;
3476 /* Translate COMMON blocks. */
3477 gfc_trans_common (ns);
3479 /* Null the parent fake result declaration if this namespace is
3480 a module function or an external procedures. */
3481 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3482 || ns->parent == NULL)
3483 parent_fake_result_decl = NULL_TREE;
3485 gfc_generate_contained_functions (ns);
3487 generate_local_vars (ns);
3489 /* Keep the parent fake result declaration in module functions
3490 or external procedures. */
3491 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3492 || ns->parent == NULL)
3493 current_fake_result_decl = parent_fake_result_decl;
3495 current_fake_result_decl = NULL_TREE;
3497 current_function_return_label = NULL;
3499 /* Now generate the code for the body of this function. */
3500 gfc_init_block (&body);
3502 /* If this is the main program, add a call to set_options to set up the
3503 runtime library Fortran language standard parameters. */
3504 if (sym->attr.is_main_program)
3506 tree array_type, array, var;
3508 /* Passing a new option to the library requires four modifications:
3509 + add it to the tree_cons list below
3510 + change the array size in the call to build_array_type
3511 + change the first argument to the library call
3512 gfor_fndecl_set_options
3513 + modify the library (runtime/compile_options.c)! */
3514 array = tree_cons (NULL_TREE,
3515 build_int_cst (integer_type_node,
3516 gfc_option.warn_std), NULL_TREE);
3517 array = tree_cons (NULL_TREE,
3518 build_int_cst (integer_type_node,
3519 gfc_option.allow_std), array);
3520 array = tree_cons (NULL_TREE,
3521 build_int_cst (integer_type_node, pedantic), array);
3522 array = tree_cons (NULL_TREE,
3523 build_int_cst (integer_type_node,
3524 gfc_option.flag_dump_core), array);
3525 array = tree_cons (NULL_TREE,
3526 build_int_cst (integer_type_node,
3527 gfc_option.flag_backtrace), array);
3528 array = tree_cons (NULL_TREE,
3529 build_int_cst (integer_type_node,
3530 gfc_option.flag_sign_zero), array);
3532 array = tree_cons (NULL_TREE,
3533 build_int_cst (integer_type_node,
3534 flag_bounds_check), array);
3536 array = tree_cons (NULL_TREE,
3537 build_int_cst (integer_type_node,
3538 gfc_option.flag_range_check), array);
3540 array_type = build_array_type (integer_type_node,
3541 build_index_type (build_int_cst (NULL_TREE,
3543 array = build_constructor_from_list (array_type, nreverse (array));
3544 TREE_CONSTANT (array) = 1;
3545 TREE_STATIC (array) = 1;
3547 /* Create a static variable to hold the jump table. */
3548 var = gfc_create_var (array_type, "options");
3549 TREE_CONSTANT (var) = 1;
3550 TREE_STATIC (var) = 1;
3551 TREE_READONLY (var) = 1;
3552 DECL_INITIAL (var) = array;
3553 var = gfc_build_addr_expr (pvoid_type_node, var);
3555 tmp = build_call_expr (gfor_fndecl_set_options, 2,
3556 build_int_cst (integer_type_node, 8), var);
3557 gfc_add_expr_to_block (&body, tmp);
3560 /* If this is the main program and a -ffpe-trap option was provided,
3561 add a call to set_fpe so that the library will raise a FPE when
3563 if (sym->attr.is_main_program && gfc_option.fpe != 0)
3565 tmp = build_call_expr (gfor_fndecl_set_fpe, 1,
3566 build_int_cst (integer_type_node,
3568 gfc_add_expr_to_block (&body, tmp);
3571 /* If this is the main program and an -fconvert option was provided,
3572 add a call to set_convert. */
3574 if (sym->attr.is_main_program && gfc_option.convert != GFC_CONVERT_NATIVE)
3576 tmp = build_call_expr (gfor_fndecl_set_convert, 1,
3577 build_int_cst (integer_type_node,
3578 gfc_option.convert));
3579 gfc_add_expr_to_block (&body, tmp);
3582 /* If this is the main program and an -frecord-marker option was provided,
3583 add a call to set_record_marker. */
3585 if (sym->attr.is_main_program && gfc_option.record_marker != 0)
3587 tmp = build_call_expr (gfor_fndecl_set_record_marker, 1,
3588 build_int_cst (integer_type_node,
3589 gfc_option.record_marker));
3590 gfc_add_expr_to_block (&body, tmp);
3593 if (sym->attr.is_main_program && gfc_option.max_subrecord_length != 0)
3595 tmp = build_call_expr (gfor_fndecl_set_max_subrecord_length,
3597 build_int_cst (integer_type_node,
3598 gfc_option.max_subrecord_length));
3599 gfc_add_expr_to_block (&body, tmp);
3602 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
3603 && sym->attr.subroutine)
3605 tree alternate_return;
3606 alternate_return = gfc_get_fake_result_decl (sym, 0);
3607 gfc_add_modify (&body, alternate_return, integer_zero_node);
3612 /* Jump to the correct entry point. */
3613 tmp = gfc_trans_entry_master_switch (ns->entries);
3614 gfc_add_expr_to_block (&body, tmp);
3617 tmp = gfc_trans_code (ns->code);
3618 gfc_add_expr_to_block (&body, tmp);
3620 /* Add a return label if needed. */
3621 if (current_function_return_label)
3623 tmp = build1_v (LABEL_EXPR, current_function_return_label);
3624 gfc_add_expr_to_block (&body, tmp);
3627 tmp = gfc_finish_block (&body);
3628 /* Add code to create and cleanup arrays. */
3629 tmp = gfc_trans_deferred_vars (sym, tmp);
3631 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
3633 if (sym->attr.subroutine || sym == sym->result)
3635 if (current_fake_result_decl != NULL)
3636 result = TREE_VALUE (current_fake_result_decl);
3639 current_fake_result_decl = NULL_TREE;
3642 result = sym->result->backend_decl;
3644 if (result != NULL_TREE && sym->attr.function
3645 && sym->ts.type == BT_DERIVED
3646 && sym->ts.derived->attr.alloc_comp
3647 && !sym->attr.pointer)
3649 rank = sym->as ? sym->as->rank : 0;
3650 tmp2 = gfc_nullify_alloc_comp (sym->ts.derived, result, rank);
3651 gfc_add_expr_to_block (&block, tmp2);
3654 gfc_add_expr_to_block (&block, tmp);
3656 if (result == NULL_TREE)
3658 /* TODO: move to the appropriate place in resolve.c. */
3659 if (warn_return_type && !sym->attr.referenced && sym == sym->result)
3660 gfc_warning ("Return value of function '%s' at %L not set",
3661 sym->name, &sym->declared_at);
3663 TREE_NO_WARNING(sym->backend_decl) = 1;
3667 /* Set the return value to the dummy result variable. The
3668 types may be different for scalar default REAL functions
3669 with -ff2c, therefore we have to convert. */
3670 tmp = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
3671 tmp = fold_build2 (MODIFY_EXPR, TREE_TYPE (tmp),
3672 DECL_RESULT (fndecl), tmp);
3673 tmp = build1_v (RETURN_EXPR, tmp);
3674 gfc_add_expr_to_block (&block, tmp);
3678 gfc_add_expr_to_block (&block, tmp);
3681 /* Add all the decls we created during processing. */
3682 decl = saved_function_decls;
3687 next = TREE_CHAIN (decl);
3688 TREE_CHAIN (decl) = NULL_TREE;
3692 saved_function_decls = NULL_TREE;
3694 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
3696 /* Finish off this function and send it for code generation. */
3698 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3700 /* Output the GENERIC tree. */
3701 dump_function (TDI_original, fndecl);
3703 /* Store the end of the function, so that we get good line number
3704 info for the epilogue. */
3705 cfun->function_end_locus = input_location;
3707 /* We're leaving the context of this function, so zap cfun.
3708 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
3709 tree_rest_of_compilation. */
3714 pop_function_context ();
3715 saved_function_decls = saved_parent_function_decls;
3717 current_function_decl = old_context;
3719 if (decl_function_context (fndecl))
3720 /* Register this function with cgraph just far enough to get it
3721 added to our parent's nested function list. */
3722 (void) cgraph_node (fndecl);
3725 gfc_gimplify_function (fndecl);
3726 cgraph_finalize_function (fndecl, false);
3729 gfc_trans_use_stmts (ns);
3733 gfc_generate_constructors (void)
3735 gcc_assert (gfc_static_ctors == NULL_TREE);
3743 if (gfc_static_ctors == NULL_TREE)
3746 fnname = get_file_function_name ("I");
3747 type = build_function_type (void_type_node,
3748 gfc_chainon_list (NULL_TREE, void_type_node));
3750 fndecl = build_decl (FUNCTION_DECL, fnname, type);
3751 TREE_PUBLIC (fndecl) = 1;
3753 decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
3754 DECL_ARTIFICIAL (decl) = 1;
3755 DECL_IGNORED_P (decl) = 1;
3756 DECL_CONTEXT (decl) = fndecl;
3757 DECL_RESULT (fndecl) = decl;
3761 current_function_decl = fndecl;
3763 rest_of_decl_compilation (fndecl, 1, 0);
3765 make_decl_rtl (fndecl);
3767 init_function_start (fndecl);
3771 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
3773 tmp = build_call_expr (TREE_VALUE (gfc_static_ctors), 0);
3774 DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
3779 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3781 free_after_parsing (cfun);
3782 free_after_compilation (cfun);
3784 tree_rest_of_compilation (fndecl);
3786 current_function_decl = NULL_TREE;
3790 /* Translates a BLOCK DATA program unit. This means emitting the
3791 commons contained therein plus their initializations. We also emit
3792 a globally visible symbol to make sure that each BLOCK DATA program
3793 unit remains unique. */
3796 gfc_generate_block_data (gfc_namespace * ns)
3801 /* Tell the backend the source location of the block data. */
3803 gfc_set_backend_locus (&ns->proc_name->declared_at);
3805 gfc_set_backend_locus (&gfc_current_locus);
3807 /* Process the DATA statements. */
3808 gfc_trans_common (ns);
3810 /* Create a global symbol with the mane of the block data. This is to
3811 generate linker errors if the same name is used twice. It is never
3814 id = gfc_sym_mangled_function_id (ns->proc_name);
3816 id = get_identifier ("__BLOCK_DATA__");
3818 decl = build_decl (VAR_DECL, id, gfc_array_index_type);
3819 TREE_PUBLIC (decl) = 1;
3820 TREE_STATIC (decl) = 1;
3821 DECL_IGNORED_P (decl) = 1;
3824 rest_of_decl_compilation (decl, 1, 0);
3828 #include "gt-fortran-trans-decl.h"