1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Paul Brook
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 /* trans-decl.c -- Handling of backend function and variable decls, etc */
26 #include "coretypes.h"
28 #include "tree-dump.h"
29 #include "tree-gimple.h"
40 #include "trans-types.h"
41 #include "trans-array.h"
42 #include "trans-const.h"
43 /* Only for gfc_trans_code. Shouldn't need to include this. */
44 #include "trans-stmt.h"
46 #define MAX_LABEL_VALUE 99999
49 /* Holds the result of the function if no result variable specified. */
51 static GTY(()) tree current_fake_result_decl;
53 static GTY(()) tree current_function_return_label;
56 /* Holds the variable DECLs for the current function. */
58 static GTY(()) tree saved_function_decls = NULL_TREE;
59 static GTY(()) tree saved_parent_function_decls = NULL_TREE;
62 /* The namespace of the module we're currently generating. Only used while
63 outputting decls for module variables. Do not rely on this being set. */
65 static gfc_namespace *module_namespace;
68 /* List of static constructor functions. */
70 tree gfc_static_ctors;
73 /* Function declarations for builtin library functions. */
75 tree gfor_fndecl_internal_malloc;
76 tree gfor_fndecl_internal_malloc64;
77 tree gfor_fndecl_internal_free;
78 tree gfor_fndecl_allocate;
79 tree gfor_fndecl_allocate64;
80 tree gfor_fndecl_deallocate;
81 tree gfor_fndecl_pause_numeric;
82 tree gfor_fndecl_pause_string;
83 tree gfor_fndecl_stop_numeric;
84 tree gfor_fndecl_stop_string;
85 tree gfor_fndecl_select_string;
86 tree gfor_fndecl_runtime_error;
87 tree gfor_fndecl_in_pack;
88 tree gfor_fndecl_in_unpack;
89 tree gfor_fndecl_associated;
92 /* Math functions. Many other math functions are handled in
95 gfc_powdecl_list gfor_fndecl_math_powi[3][2];
96 tree gfor_fndecl_math_cpowf;
97 tree gfor_fndecl_math_cpow;
98 tree gfor_fndecl_math_ishftc4;
99 tree gfor_fndecl_math_ishftc8;
100 tree gfor_fndecl_math_exponent4;
101 tree gfor_fndecl_math_exponent8;
104 /* String functions. */
106 tree gfor_fndecl_copy_string;
107 tree gfor_fndecl_compare_string;
108 tree gfor_fndecl_concat_string;
109 tree gfor_fndecl_string_len_trim;
110 tree gfor_fndecl_string_index;
111 tree gfor_fndecl_string_scan;
112 tree gfor_fndecl_string_verify;
113 tree gfor_fndecl_string_trim;
114 tree gfor_fndecl_string_repeat;
115 tree gfor_fndecl_adjustl;
116 tree gfor_fndecl_adjustr;
119 /* Other misc. runtime library functions. */
121 tree gfor_fndecl_size0;
122 tree gfor_fndecl_size1;
123 tree gfor_fndecl_iargc;
125 /* Intrinsic functions implemented in FORTRAN. */
126 tree gfor_fndecl_si_kind;
127 tree gfor_fndecl_sr_kind;
131 gfc_add_decl_to_parent_function (tree decl)
134 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
135 DECL_NONLOCAL (decl) = 1;
136 TREE_CHAIN (decl) = saved_parent_function_decls;
137 saved_parent_function_decls = decl;
141 gfc_add_decl_to_function (tree decl)
144 TREE_USED (decl) = 1;
145 DECL_CONTEXT (decl) = current_function_decl;
146 TREE_CHAIN (decl) = saved_function_decls;
147 saved_function_decls = decl;
151 /* Build a backend label declaration. Set TREE_USED for named labels.
152 The context of the label is always the current_function_decl. All
153 labels are marked artificial. */
156 gfc_build_label_decl (tree label_id)
158 /* 2^32 temporaries should be enough. */
159 static unsigned int tmp_num = 1;
163 if (label_id == NULL_TREE)
165 /* Build an internal label name. */
166 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
167 label_id = get_identifier (label_name);
172 /* Build the LABEL_DECL node. Labels have no type. */
173 label_decl = build_decl (LABEL_DECL, label_id, void_type_node);
174 DECL_CONTEXT (label_decl) = current_function_decl;
175 DECL_MODE (label_decl) = VOIDmode;
177 /* We always define the label as used, even if the original source
178 file never references the label. We don't want all kinds of
179 spurious warnings for old-style Fortran code with too many
181 TREE_USED (label_decl) = 1;
183 DECL_ARTIFICIAL (label_decl) = 1;
188 /* Returns the return label for the current function. */
191 gfc_get_return_label (void)
193 char name[GFC_MAX_SYMBOL_LEN + 10];
195 if (current_function_return_label)
196 return current_function_return_label;
198 sprintf (name, "__return_%s",
199 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
201 current_function_return_label =
202 gfc_build_label_decl (get_identifier (name));
204 DECL_ARTIFICIAL (current_function_return_label) = 1;
206 return current_function_return_label;
210 /* Set the backend source location of a decl. */
213 gfc_set_decl_location (tree decl, locus * loc)
215 #ifdef USE_MAPPED_LOCATION
216 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
218 DECL_SOURCE_LINE (decl) = loc->lb->linenum;
219 DECL_SOURCE_FILE (decl) = loc->lb->file->filename;
224 /* Return the backend label declaration for a given label structure,
225 or create it if it doesn't exist yet. */
228 gfc_get_label_decl (gfc_st_label * lp)
230 if (lp->backend_decl)
231 return lp->backend_decl;
234 char label_name[GFC_MAX_SYMBOL_LEN + 1];
237 /* Validate the label declaration from the front end. */
238 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
240 /* Build a mangled name for the label. */
241 sprintf (label_name, "__label_%.6d", lp->value);
243 /* Build the LABEL_DECL node. */
244 label_decl = gfc_build_label_decl (get_identifier (label_name));
246 /* Tell the debugger where the label came from. */
247 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
248 gfc_set_decl_location (label_decl, &lp->where);
250 DECL_ARTIFICIAL (label_decl) = 1;
252 /* Store the label in the label list and return the LABEL_DECL. */
253 lp->backend_decl = label_decl;
259 /* Convert a gfc_symbol to an identifier of the same name. */
262 gfc_sym_identifier (gfc_symbol * sym)
264 return (get_identifier (sym->name));
268 /* Construct mangled name from symbol name. */
271 gfc_sym_mangled_identifier (gfc_symbol * sym)
273 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
275 if (sym->module == NULL)
276 return gfc_sym_identifier (sym);
279 snprintf (name, sizeof name, "__%s__%s", sym->module, sym->name);
280 return get_identifier (name);
285 /* Construct mangled function name from symbol name. */
288 gfc_sym_mangled_function_id (gfc_symbol * sym)
291 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
293 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
294 || (sym->module != NULL && sym->attr.if_source == IFSRC_IFBODY))
296 if (strcmp (sym->name, "MAIN__") == 0
297 || sym->attr.proc == PROC_INTRINSIC)
298 return get_identifier (sym->name);
300 if (gfc_option.flag_underscoring)
302 has_underscore = strchr (sym->name, '_') != 0;
303 if (gfc_option.flag_second_underscore && has_underscore)
304 snprintf (name, sizeof name, "%s__", sym->name);
306 snprintf (name, sizeof name, "%s_", sym->name);
307 return get_identifier (name);
310 return get_identifier (sym->name);
314 snprintf (name, sizeof name, "__%s__%s", sym->module, sym->name);
315 return get_identifier (name);
320 /* Returns true if a variable of specified size should go on the stack. */
323 gfc_can_put_var_on_stack (tree size)
325 unsigned HOST_WIDE_INT low;
327 if (!INTEGER_CST_P (size))
330 if (gfc_option.flag_max_stack_var_size < 0)
333 if (TREE_INT_CST_HIGH (size) != 0)
336 low = TREE_INT_CST_LOW (size);
337 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
340 /* TODO: Set a per-function stack size limit. */
346 /* Finish processing of a declaration and install its initial value. */
349 gfc_finish_decl (tree decl, tree init)
351 if (TREE_CODE (decl) == PARM_DECL)
352 gcc_assert (init == NULL_TREE);
353 /* Remember that PARM_DECL doesn't have a DECL_INITIAL field per se
354 -- it overlaps DECL_ARG_TYPE. */
355 else if (init == NULL_TREE)
356 gcc_assert (DECL_INITIAL (decl) == NULL_TREE);
358 gcc_assert (DECL_INITIAL (decl) == error_mark_node);
360 if (init != NULL_TREE)
362 if (TREE_CODE (decl) != TYPE_DECL)
363 DECL_INITIAL (decl) = init;
366 /* typedef foo = bar; store the type of bar as the type of foo. */
367 TREE_TYPE (decl) = TREE_TYPE (init);
368 DECL_INITIAL (decl) = init = 0;
372 if (TREE_CODE (decl) == VAR_DECL)
374 if (DECL_SIZE (decl) == NULL_TREE
375 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
376 layout_decl (decl, 0);
378 /* A static variable with an incomplete type is an error if it is
379 initialized. Also if it is not file scope. Otherwise, let it
380 through, but if it is not `extern' then it may cause an error
382 /* An automatic variable with an incomplete type is an error. */
383 if (DECL_SIZE (decl) == NULL_TREE
384 && (TREE_STATIC (decl) ? (DECL_INITIAL (decl) != 0
385 || DECL_CONTEXT (decl) != 0)
386 : !DECL_EXTERNAL (decl)))
388 gfc_fatal_error ("storage size not known");
391 if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
392 && (DECL_SIZE (decl) != 0)
393 && (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST))
395 gfc_fatal_error ("storage size not constant");
402 /* Apply symbol attributes to a variable, and add it to the function scope. */
405 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
407 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
408 This is the equivalent of the TARGET variables.
409 We also need to set this if the variable is passed by reference in a
411 if (sym->attr.target)
412 TREE_ADDRESSABLE (decl) = 1;
413 /* If it wasn't used we wouldn't be getting it. */
414 TREE_USED (decl) = 1;
416 /* Chain this decl to the pending declarations. Don't do pushdecl()
417 because this would add them to the current scope rather than the
419 if (current_function_decl != NULL_TREE)
421 if (sym->ns->proc_name->backend_decl == current_function_decl)
422 gfc_add_decl_to_function (decl);
424 gfc_add_decl_to_parent_function (decl);
427 /* If a variable is USE associated, it's always external. */
428 if (sym->attr.use_assoc)
430 DECL_EXTERNAL (decl) = 1;
431 TREE_PUBLIC (decl) = 1;
433 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
435 /* TODO: Don't set sym->module for result or dummy variables. */
436 gcc_assert (current_function_decl == NULL_TREE);
437 /* This is the declaration of a module variable. */
438 TREE_PUBLIC (decl) = 1;
439 TREE_STATIC (decl) = 1;
442 if ((sym->attr.save || sym->attr.data || sym->value)
443 && !sym->attr.use_assoc)
444 TREE_STATIC (decl) = 1;
446 /* Keep variables larger than max-stack-var-size off stack. */
447 if (!sym->ns->proc_name->attr.recursive
448 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
449 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl)))
450 TREE_STATIC (decl) = 1;
454 /* Allocate the lang-specific part of a decl. */
457 gfc_allocate_lang_decl (tree decl)
459 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
460 ggc_alloc_cleared (sizeof (struct lang_decl));
463 /* Remember a symbol to generate initialization/cleanup code at function
467 gfc_defer_symbol_init (gfc_symbol * sym)
473 /* Don't add a symbol twice. */
477 last = head = sym->ns->proc_name;
480 /* Make sure that setup code for dummy variables which are used in the
481 setup of other variables is generated first. */
484 /* Find the first dummy arg seen after us, or the first non-dummy arg.
485 This is a circular list, so don't go past the head. */
487 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
493 /* Insert in between last and p. */
499 /* Create an array index type variable with function scope. */
502 create_index_var (const char * pfx, int nest)
506 decl = gfc_create_var_np (gfc_array_index_type, pfx);
508 gfc_add_decl_to_parent_function (decl);
510 gfc_add_decl_to_function (decl);
515 /* Create variables to hold all the non-constant bits of info for a
516 descriptorless array. Remember these in the lang-specific part of the
520 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
526 type = TREE_TYPE (decl);
528 /* We just use the descriptor, if there is one. */
529 if (GFC_DESCRIPTOR_TYPE_P (type))
532 gcc_assert (GFC_ARRAY_TYPE_P (type));
533 nest = (sym->ns->proc_name->backend_decl != current_function_decl)
534 && !sym->attr.contained;
536 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
538 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
539 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
540 /* Don't try to use the unkown bound for assumed shape arrays. */
541 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
542 && (sym->as->type != AS_ASSUMED_SIZE
543 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
544 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
546 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
547 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
549 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
551 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
554 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
556 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
561 /* For some dummy arguments we don't use the actual argument directly.
562 Instead we create a local decl and use that. This allows us to perform
563 initialization, and construct full type information. */
566 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
576 if (sym->attr.pointer || sym->attr.allocatable)
579 /* Add to list of variables if not a fake result variable. */
580 if (sym->attr.result || sym->attr.dummy)
581 gfc_defer_symbol_init (sym);
583 type = TREE_TYPE (dummy);
584 gcc_assert (TREE_CODE (dummy) == PARM_DECL
585 && POINTER_TYPE_P (type));
587 /* Do we know the element size? */
588 known_size = sym->ts.type != BT_CHARACTER
589 || INTEGER_CST_P (sym->ts.cl->backend_decl);
591 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
593 /* For descriptorless arrays with known element size the actual
594 argument is sufficient. */
595 gcc_assert (GFC_ARRAY_TYPE_P (type));
596 gfc_build_qualified_array (dummy, sym);
600 type = TREE_TYPE (type);
601 if (GFC_DESCRIPTOR_TYPE_P (type))
603 /* Create a decriptorless array pointer. */
606 if (!gfc_option.flag_repack_arrays)
608 if (as->type == AS_ASSUMED_SIZE)
613 if (as->type == AS_EXPLICIT)
616 for (n = 0; n < as->rank; n++)
620 && as->upper[n]->expr_type == EXPR_CONSTANT
621 && as->lower[n]->expr_type == EXPR_CONSTANT))
629 type = gfc_typenode_for_spec (&sym->ts);
630 type = gfc_get_nodesc_array_type (type, sym->as, packed);
634 /* We now have an expression for the element size, so create a fully
635 qualified type. Reset sym->backend decl or this will just return the
637 sym->backend_decl = NULL_TREE;
638 type = gfc_sym_type (sym);
642 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
643 decl = build_decl (VAR_DECL, get_identifier (name), type);
645 DECL_ARTIFICIAL (decl) = 1;
646 TREE_PUBLIC (decl) = 0;
647 TREE_STATIC (decl) = 0;
648 DECL_EXTERNAL (decl) = 0;
650 /* We should never get deferred shape arrays here. We used to because of
652 gcc_assert (sym->as->type != AS_DEFERRED);
657 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
661 GFC_DECL_PACKED_ARRAY (decl) = 1;
665 gfc_build_qualified_array (decl, sym);
667 if (DECL_LANG_SPECIFIC (dummy))
668 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
670 gfc_allocate_lang_decl (decl);
672 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
674 if (sym->ns->proc_name->backend_decl == current_function_decl
675 || sym->attr.contained)
676 gfc_add_decl_to_function (decl);
678 gfc_add_decl_to_parent_function (decl);
684 /* Return a constant or a variable to use as a string length. Does not
685 add the decl to the current scope. */
688 gfc_create_string_length (gfc_symbol * sym)
692 gcc_assert (sym->ts.cl);
693 gfc_conv_const_charlen (sym->ts.cl);
695 if (sym->ts.cl->backend_decl == NULL_TREE)
697 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
699 /* Also prefix the mangled name. */
700 strcpy (&name[1], sym->name);
702 length = build_decl (VAR_DECL, get_identifier (name),
703 gfc_charlen_type_node);
704 DECL_ARTIFICIAL (length) = 1;
705 TREE_USED (length) = 1;
706 gfc_defer_symbol_init (sym);
707 sym->ts.cl->backend_decl = length;
710 return sym->ts.cl->backend_decl;
714 /* Return the decl for a gfc_symbol, create it if it doesn't already
718 gfc_get_symbol_decl (gfc_symbol * sym)
721 tree length = NULL_TREE;
724 gcc_assert (sym->attr.referenced);
726 if (sym->ns && sym->ns->proc_name->attr.function)
727 byref = gfc_return_by_reference (sym->ns->proc_name);
731 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
733 /* Return via extra parameter. */
734 if (sym->attr.result && byref
735 && !sym->backend_decl)
738 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
739 /* For entry master function skip over the __entry
741 if (sym->ns->proc_name->attr.entry_master)
742 sym->backend_decl = TREE_CHAIN (sym->backend_decl);
745 /* Dummy variables should already have been created. */
746 gcc_assert (sym->backend_decl);
748 /* Create a character length variable. */
749 if (sym->ts.type == BT_CHARACTER)
751 if (sym->ts.cl->backend_decl == NULL_TREE)
753 length = gfc_create_string_length (sym);
754 if (TREE_CODE (length) != INTEGER_CST)
756 gfc_finish_var_decl (length, sym);
757 gfc_defer_symbol_init (sym);
762 /* Use a copy of the descriptor for dummy arrays. */
763 if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
766 gfc_build_dummy_array_decl (sym, sym->backend_decl);
769 TREE_USED (sym->backend_decl) = 1;
770 return sym->backend_decl;
773 if (sym->backend_decl)
774 return sym->backend_decl;
776 /* Catch function declarations. Only used for actual parameters. */
777 if (sym->attr.flavor == FL_PROCEDURE)
779 decl = gfc_get_extern_function_decl (sym);
783 if (sym->attr.intrinsic)
784 internal_error ("intrinsic variable which isn't a procedure");
786 /* Create string length decl first so that they can be used in the
788 if (sym->ts.type == BT_CHARACTER)
789 length = gfc_create_string_length (sym);
791 /* Create the decl for the variable. */
792 decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
794 gfc_set_decl_location (decl, &sym->declared_at);
796 /* Symbols from modules should have their assembler names mangled.
797 This is done here rather than in gfc_finish_var_decl because it
798 is different for string length variables. */
800 SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym));
802 if (sym->attr.dimension)
804 /* Create variables to hold the non-constant bits of array info. */
805 gfc_build_qualified_array (decl, sym);
807 /* Remember this variable for allocation/cleanup. */
808 gfc_defer_symbol_init (sym);
810 if ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer)
811 GFC_DECL_PACKED_ARRAY (decl) = 1;
814 gfc_finish_var_decl (decl, sym);
816 if (sym->attr.assign)
818 gfc_allocate_lang_decl (decl);
819 GFC_DECL_ASSIGN (decl) = 1;
820 length = gfc_create_var (gfc_charlen_type_node, sym->name);
821 GFC_DECL_STRING_LEN (decl) = length;
822 GFC_DECL_ASSIGN_ADDR (decl) = gfc_create_var (pvoid_type_node, sym->name);
823 /* TODO: Need to check we don't change TREE_STATIC (decl) later. */
824 TREE_STATIC (length) = TREE_STATIC (decl);
825 /* STRING_LENGTH is also used as flag. Less than -1 means that
826 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
827 target label's address. Other value is the length of format string
828 and ASSIGN_ADDR is the address of format string. */
829 DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
832 if (sym->ts.type == BT_CHARACTER)
834 /* Character variables need special handling. */
835 gfc_allocate_lang_decl (decl);
837 if (TREE_CODE (length) != INTEGER_CST)
839 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
843 /* Also prefix the mangled name for symbols from modules. */
844 strcpy (&name[1], sym->name);
847 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
848 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (name));
850 gfc_finish_var_decl (length, sym);
851 gcc_assert (!sym->value);
854 sym->backend_decl = decl;
856 if (TREE_STATIC (decl) && !sym->attr.use_assoc)
858 /* Add static initializer. */
859 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
860 TREE_TYPE (decl), sym->attr.dimension,
861 sym->attr.pointer || sym->attr.allocatable);
868 /* Substitute a temporary variable in place of the real one. */
871 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
873 save->attr = sym->attr;
874 save->decl = sym->backend_decl;
876 gfc_clear_attr (&sym->attr);
877 sym->attr.referenced = 1;
878 sym->attr.flavor = FL_VARIABLE;
880 sym->backend_decl = decl;
884 /* Restore the original variable. */
887 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
889 sym->attr = save->attr;
890 sym->backend_decl = save->decl;
894 /* Get a basic decl for an external function. */
897 gfc_get_extern_function_decl (gfc_symbol * sym)
902 gfc_intrinsic_sym *isym;
904 char s[GFC_MAX_SYMBOL_LEN];
908 if (sym->backend_decl)
909 return sym->backend_decl;
911 /* We should never be creating external decls for alternate entry points.
912 The procedure may be an alternate entry point, but we don't want/need
914 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
916 if (sym->attr.intrinsic)
918 /* Call the resolution function to get the actual name. This is
919 a nasty hack which relies on the resolution functions only looking
920 at the first argument. We pass NULL for the second argument
921 otherwise things like AINT get confused. */
922 isym = gfc_find_function (sym->name);
923 gcc_assert (isym->resolve.f0 != NULL);
925 memset (&e, 0, sizeof (e));
926 e.expr_type = EXPR_FUNCTION;
928 memset (&argexpr, 0, sizeof (argexpr));
929 gcc_assert (isym->formal);
930 argexpr.ts = isym->formal->ts;
932 if (isym->formal->next == NULL)
933 isym->resolve.f1 (&e, &argexpr);
936 /* All specific intrinsics take one or two arguments. */
937 gcc_assert (isym->formal->next->next == NULL);
938 isym->resolve.f2 (&e, &argexpr, NULL);
940 sprintf (s, "specific%s", e.value.function.name);
941 name = get_identifier (s);
946 name = gfc_sym_identifier (sym);
947 mangled_name = gfc_sym_mangled_function_id (sym);
950 type = gfc_get_function_type (sym);
951 fndecl = build_decl (FUNCTION_DECL, name, type);
953 SET_DECL_ASSEMBLER_NAME (fndecl, mangled_name);
954 /* If the return type is a pointer, avoid alias issues by setting
955 DECL_IS_MALLOC to nonzero. This means that the function should be
956 treated as if it were a malloc, meaning it returns a pointer that
958 if (POINTER_TYPE_P (type))
959 DECL_IS_MALLOC (fndecl) = 1;
961 /* Set the context of this decl. */
962 if (0 && sym->ns && sym->ns->proc_name)
964 /* TODO: Add external decls to the appropriate scope. */
965 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
969 /* Global declaration, e.g. intrinsic subroutine. */
970 DECL_CONTEXT (fndecl) = NULL_TREE;
973 DECL_EXTERNAL (fndecl) = 1;
975 /* This specifies if a function is globally addressable, i.e. it is
976 the opposite of declaring static in C. */
977 TREE_PUBLIC (fndecl) = 1;
979 /* Set attributes for PURE functions. A call to PURE function in the
980 Fortran 95 sense is both pure and without side effects in the C
982 if (sym->attr.pure || sym->attr.elemental)
984 if (sym->attr.function)
985 DECL_IS_PURE (fndecl) = 1;
986 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
987 parameters and don't use alternate returns (is this
988 allowed?). In that case, calls to them are meaningless, and
989 can be optimized away. See also in build_function_decl(). */
990 TREE_SIDE_EFFECTS (fndecl) = 0;
993 sym->backend_decl = fndecl;
995 if (DECL_CONTEXT (fndecl) == NULL_TREE)
996 pushdecl_top_level (fndecl);
1002 /* Create a declaration for a procedure. For external functions (in the C
1003 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1004 a master function with alternate entry points. */
1007 build_function_decl (gfc_symbol * sym)
1010 symbol_attribute attr;
1012 gfc_formal_arglist *f;
1014 gcc_assert (!sym->backend_decl);
1015 gcc_assert (!sym->attr.external);
1017 /* Set the line and filename. sym->declared_at seems to point to the
1018 last statement for subroutines, but it'll do for now. */
1019 gfc_set_backend_locus (&sym->declared_at);
1021 /* Allow only one nesting level. Allow public declarations. */
1022 gcc_assert (current_function_decl == NULL_TREE
1023 || DECL_CONTEXT (current_function_decl) == NULL_TREE);
1025 type = gfc_get_function_type (sym);
1026 fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type);
1028 /* Perform name mangling if this is a top level or module procedure. */
1029 if (current_function_decl == NULL_TREE)
1030 SET_DECL_ASSEMBLER_NAME (fndecl, gfc_sym_mangled_function_id (sym));
1032 /* Figure out the return type of the declared function, and build a
1033 RESULT_DECL for it. If this is a subroutine with alternate
1034 returns, build a RESULT_DECL for it. */
1037 result_decl = NULL_TREE;
1038 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1041 if (gfc_return_by_reference (sym))
1042 type = void_type_node;
1045 if (sym->result != sym)
1046 result_decl = gfc_sym_identifier (sym->result);
1048 type = TREE_TYPE (TREE_TYPE (fndecl));
1053 /* Look for alternate return placeholders. */
1054 int has_alternate_returns = 0;
1055 for (f = sym->formal; f; f = f->next)
1059 has_alternate_returns = 1;
1064 if (has_alternate_returns)
1065 type = integer_type_node;
1067 type = void_type_node;
1070 result_decl = build_decl (RESULT_DECL, result_decl, type);
1071 DECL_ARTIFICIAL (result_decl) = 1;
1072 DECL_IGNORED_P (result_decl) = 1;
1073 DECL_CONTEXT (result_decl) = fndecl;
1074 DECL_RESULT (fndecl) = result_decl;
1076 /* Don't call layout_decl for a RESULT_DECL.
1077 layout_decl (result_decl, 0); */
1079 /* If the return type is a pointer, avoid alias issues by setting
1080 DECL_IS_MALLOC to nonzero. This means that the function should be
1081 treated as if it were a malloc, meaning it returns a pointer that
1083 if (POINTER_TYPE_P (type))
1084 DECL_IS_MALLOC (fndecl) = 1;
1086 /* Set up all attributes for the function. */
1087 DECL_CONTEXT (fndecl) = current_function_decl;
1088 DECL_EXTERNAL (fndecl) = 0;
1090 /* This specifies if a function is globally visible, i.e. it is
1091 the opposite of declaring static in C. */
1092 if (DECL_CONTEXT (fndecl) == NULL_TREE
1093 && !sym->attr.entry_master)
1094 TREE_PUBLIC (fndecl) = 1;
1096 /* TREE_STATIC means the function body is defined here. */
1097 TREE_STATIC (fndecl) = 1;
1099 /* Set attributes for PURE functions. A call to a PURE function in the
1100 Fortran 95 sense is both pure and without side effects in the C
1102 if (attr.pure || attr.elemental)
1104 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1105 including a alternate return. In that case it can also be
1106 marked as PURE. See also in gfc_get_extern_function_decl(). */
1108 DECL_IS_PURE (fndecl) = 1;
1109 TREE_SIDE_EFFECTS (fndecl) = 0;
1112 /* Layout the function declaration and put it in the binding level
1113 of the current function. */
1116 sym->backend_decl = fndecl;
1120 /* Create the DECL_ARGUMENTS for a procedure. */
1123 create_function_arglist (gfc_symbol * sym)
1126 gfc_formal_arglist *f;
1133 fndecl = sym->backend_decl;
1135 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1136 the new FUNCTION_DECL node. */
1137 arglist = NULL_TREE;
1138 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1140 if (sym->attr.entry_master)
1142 type = TREE_VALUE (typelist);
1143 parm = build_decl (PARM_DECL, get_identifier ("__entry"), type);
1145 DECL_CONTEXT (parm) = fndecl;
1146 DECL_ARG_TYPE (parm) = type;
1147 TREE_READONLY (parm) = 1;
1148 gfc_finish_decl (parm, NULL_TREE);
1150 arglist = chainon (arglist, parm);
1151 typelist = TREE_CHAIN (typelist);
1154 if (gfc_return_by_reference (sym))
1156 type = TREE_VALUE (typelist);
1157 parm = build_decl (PARM_DECL, get_identifier ("__result"), type);
1159 DECL_CONTEXT (parm) = fndecl;
1160 DECL_ARG_TYPE (parm) = type;
1161 TREE_READONLY (parm) = 1;
1162 DECL_ARTIFICIAL (parm) = 1;
1163 gfc_finish_decl (parm, NULL_TREE);
1165 arglist = chainon (arglist, parm);
1166 typelist = TREE_CHAIN (typelist);
1168 if (sym->ts.type == BT_CHARACTER)
1170 gfc_allocate_lang_decl (parm);
1172 /* Length of character result. */
1173 type = TREE_VALUE (typelist);
1174 gcc_assert (type == gfc_charlen_type_node);
1176 length = build_decl (PARM_DECL,
1177 get_identifier (".__result"),
1179 if (!sym->ts.cl->length)
1181 sym->ts.cl->backend_decl = length;
1182 TREE_USED (length) = 1;
1184 gcc_assert (TREE_CODE (length) == PARM_DECL);
1185 arglist = chainon (arglist, length);
1186 typelist = TREE_CHAIN (typelist);
1187 DECL_CONTEXT (length) = fndecl;
1188 DECL_ARG_TYPE (length) = type;
1189 TREE_READONLY (length) = 1;
1190 DECL_ARTIFICIAL (length) = 1;
1191 gfc_finish_decl (length, NULL_TREE);
1195 for (f = sym->formal; f; f = f->next)
1197 if (f->sym != NULL) /* ignore alternate returns. */
1201 type = TREE_VALUE (typelist);
1203 /* Build a the argument declaration. */
1204 parm = build_decl (PARM_DECL,
1205 gfc_sym_identifier (f->sym), type);
1207 /* Fill in arg stuff. */
1208 DECL_CONTEXT (parm) = fndecl;
1209 DECL_ARG_TYPE (parm) = type;
1210 DECL_ARG_TYPE_AS_WRITTEN (parm) = type;
1211 /* All implementation args are read-only. */
1212 TREE_READONLY (parm) = 1;
1214 gfc_finish_decl (parm, NULL_TREE);
1216 f->sym->backend_decl = parm;
1218 arglist = chainon (arglist, parm);
1219 typelist = TREE_CHAIN (typelist);
1223 /* Add the hidden string length parameters. */
1225 for (f = sym->formal; f; f = f->next)
1227 char name[GFC_MAX_SYMBOL_LEN + 2];
1228 /* Ignore alternate returns. */
1232 if (f->sym->ts.type != BT_CHARACTER)
1235 parm = f->sym->backend_decl;
1236 type = TREE_VALUE (typelist);
1237 gcc_assert (type == gfc_charlen_type_node);
1239 strcpy (&name[1], f->sym->name);
1241 length = build_decl (PARM_DECL, get_identifier (name), type);
1243 arglist = chainon (arglist, length);
1244 DECL_CONTEXT (length) = fndecl;
1245 DECL_ARTIFICIAL (length) = 1;
1246 DECL_ARG_TYPE (length) = type;
1247 TREE_READONLY (length) = 1;
1248 gfc_finish_decl (length, NULL_TREE);
1250 /* TODO: Check string lengths when -fbounds-check. */
1252 /* Use the passed value for assumed length variables. */
1253 if (!f->sym->ts.cl->length)
1255 TREE_USED (length) = 1;
1256 if (!f->sym->ts.cl->backend_decl)
1257 f->sym->ts.cl->backend_decl = length;
1260 /* there is already another variable using this
1261 gfc_charlen node, build a new one for this variable
1262 and chain it into the list of gfc_charlens.
1263 This happens for e.g. in the case
1265 since CHARACTER declarations on the same line share
1266 the same gfc_charlen node. */
1269 cl = gfc_get_charlen ();
1270 cl->backend_decl = length;
1271 cl->next = f->sym->ts.cl->next;
1272 f->sym->ts.cl->next = cl;
1277 parm = TREE_CHAIN (parm);
1278 typelist = TREE_CHAIN (typelist);
1281 gcc_assert (TREE_VALUE (typelist) == void_type_node);
1282 DECL_ARGUMENTS (fndecl) = arglist;
1285 /* Convert FNDECL's code to GIMPLE and handle any nested functions. */
1288 gfc_gimplify_function (tree fndecl)
1290 struct cgraph_node *cgn;
1292 gimplify_function_tree (fndecl);
1293 dump_function (TDI_generic, fndecl);
1295 /* Convert all nested functions to GIMPLE now. We do things in this order
1296 so that items like VLA sizes are expanded properly in the context of the
1297 correct function. */
1298 cgn = cgraph_node (fndecl);
1299 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1300 gfc_gimplify_function (cgn->decl);
1304 /* Do the setup necessary before generating the body of a function. */
1307 trans_function_start (gfc_symbol * sym)
1311 fndecl = sym->backend_decl;
1313 /* Let GCC know the current scope is this function. */
1314 current_function_decl = fndecl;
1316 /* Let the world know what we're about to do. */
1317 announce_function (fndecl);
1319 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1321 /* Create RTL for function declaration. */
1322 rest_of_decl_compilation (fndecl, 1, 0);
1325 /* Create RTL for function definition. */
1326 make_decl_rtl (fndecl);
1328 init_function_start (fndecl);
1330 /* Even though we're inside a function body, we still don't want to
1331 call expand_expr to calculate the size of a variable-sized array.
1332 We haven't necessarily assigned RTL to all variables yet, so it's
1333 not safe to try to expand expressions involving them. */
1334 cfun->x_dont_save_pending_sizes_p = 1;
1336 /* function.c requires a push at the start of the function. */
1340 /* Create thunks for alternate entry points. */
1343 build_entry_thunks (gfc_namespace * ns)
1345 gfc_formal_arglist *formal;
1346 gfc_formal_arglist *thunk_formal;
1348 gfc_symbol *thunk_sym;
1356 /* This should always be a toplevel function. */
1357 gcc_assert (current_function_decl == NULL_TREE);
1359 gfc_get_backend_locus (&old_loc);
1360 for (el = ns->entries; el; el = el->next)
1362 thunk_sym = el->sym;
1364 build_function_decl (thunk_sym);
1365 create_function_arglist (thunk_sym);
1367 trans_function_start (thunk_sym);
1369 thunk_fndecl = thunk_sym->backend_decl;
1371 gfc_start_block (&body);
1373 /* Pass extra parameter identifying this entry point. */
1374 tmp = build_int_cst (gfc_array_index_type, el->id);
1375 args = tree_cons (NULL_TREE, tmp, NULL_TREE);
1376 string_args = NULL_TREE;
1378 if (thunk_sym->attr.function)
1380 if (gfc_return_by_reference (ns->proc_name))
1382 tree ref = DECL_ARGUMENTS (current_function_decl);
1383 args = tree_cons (NULL_TREE, ref, args);
1384 if (ns->proc_name->ts.type == BT_CHARACTER)
1385 args = tree_cons (NULL_TREE, TREE_CHAIN (ref),
1390 for (formal = ns->proc_name->formal; formal; formal = formal->next)
1392 /* Ignore alternate returns. */
1393 if (formal->sym == NULL)
1396 /* We don't have a clever way of identifying arguments, so resort to
1397 a brute-force search. */
1398 for (thunk_formal = thunk_sym->formal;
1400 thunk_formal = thunk_formal->next)
1402 if (thunk_formal->sym == formal->sym)
1408 /* Pass the argument. */
1409 args = tree_cons (NULL_TREE, thunk_formal->sym->backend_decl,
1411 if (formal->sym->ts.type == BT_CHARACTER)
1413 tmp = thunk_formal->sym->ts.cl->backend_decl;
1414 string_args = tree_cons (NULL_TREE, tmp, string_args);
1419 /* Pass NULL for a missing argument. */
1420 args = tree_cons (NULL_TREE, null_pointer_node, args);
1421 if (formal->sym->ts.type == BT_CHARACTER)
1423 tmp = convert (gfc_charlen_type_node, integer_zero_node);
1424 string_args = tree_cons (NULL_TREE, tmp, string_args);
1429 /* Call the master function. */
1430 args = nreverse (args);
1431 args = chainon (args, nreverse (string_args));
1432 tmp = ns->proc_name->backend_decl;
1433 tmp = gfc_build_function_call (tmp, args);
1434 if (ns->proc_name->attr.mixed_entry_master)
1436 tree union_decl, field;
1437 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
1439 union_decl = build_decl (VAR_DECL, get_identifier ("__result"),
1440 TREE_TYPE (master_type));
1441 DECL_ARTIFICIAL (union_decl) = 1;
1442 DECL_EXTERNAL (union_decl) = 0;
1443 TREE_PUBLIC (union_decl) = 0;
1444 TREE_USED (union_decl) = 1;
1445 layout_decl (union_decl, 0);
1446 pushdecl (union_decl);
1448 DECL_CONTEXT (union_decl) = current_function_decl;
1449 tmp = build2 (MODIFY_EXPR,
1450 TREE_TYPE (union_decl),
1452 gfc_add_expr_to_block (&body, tmp);
1454 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
1455 field; field = TREE_CHAIN (field))
1456 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1457 thunk_sym->result->name) == 0)
1459 gcc_assert (field != NULL_TREE);
1460 tmp = build3 (COMPONENT_REF, TREE_TYPE (field), union_decl, field,
1462 tmp = build2 (MODIFY_EXPR,
1463 TREE_TYPE (DECL_RESULT (current_function_decl)),
1464 DECL_RESULT (current_function_decl), tmp);
1465 tmp = build1_v (RETURN_EXPR, tmp);
1467 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
1470 tmp = build2 (MODIFY_EXPR,
1471 TREE_TYPE (DECL_RESULT (current_function_decl)),
1472 DECL_RESULT (current_function_decl), tmp);
1473 tmp = build1_v (RETURN_EXPR, tmp);
1475 gfc_add_expr_to_block (&body, tmp);
1477 /* Finish off this function and send it for code generation. */
1478 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
1480 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
1482 /* Output the GENERIC tree. */
1483 dump_function (TDI_original, thunk_fndecl);
1485 /* Store the end of the function, so that we get good line number
1486 info for the epilogue. */
1487 cfun->function_end_locus = input_location;
1489 /* We're leaving the context of this function, so zap cfun.
1490 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1491 tree_rest_of_compilation. */
1494 current_function_decl = NULL_TREE;
1496 gfc_gimplify_function (thunk_fndecl);
1497 cgraph_finalize_function (thunk_fndecl, false);
1499 /* We share the symbols in the formal argument list with other entry
1500 points and the master function. Clear them so that they are
1501 recreated for each function. */
1502 for (formal = thunk_sym->formal; formal; formal = formal->next)
1503 if (formal->sym != NULL) /* Ignore alternate returns. */
1505 formal->sym->backend_decl = NULL_TREE;
1506 if (formal->sym->ts.type == BT_CHARACTER)
1507 formal->sym->ts.cl->backend_decl = NULL_TREE;
1510 if (thunk_sym->attr.function)
1512 if (thunk_sym->ts.type == BT_CHARACTER)
1513 thunk_sym->ts.cl->backend_decl = NULL_TREE;
1514 if (thunk_sym->result->ts.type == BT_CHARACTER)
1515 thunk_sym->result->ts.cl->backend_decl = NULL_TREE;
1519 gfc_set_backend_locus (&old_loc);
1523 /* Create a decl for a function, and create any thunks for alternate entry
1527 gfc_create_function_decl (gfc_namespace * ns)
1529 /* Create a declaration for the master function. */
1530 build_function_decl (ns->proc_name);
1532 /* Compile the entry thunks. */
1534 build_entry_thunks (ns);
1536 /* Now create the read argument list. */
1537 create_function_arglist (ns->proc_name);
1540 /* Return the decl used to hold the function return value. */
1543 gfc_get_fake_result_decl (gfc_symbol * sym)
1548 char name[GFC_MAX_SYMBOL_LEN + 10];
1551 && sym->ns->proc_name->backend_decl == current_function_decl
1552 && sym->ns->proc_name->attr.mixed_entry_master
1553 && sym != sym->ns->proc_name)
1555 decl = gfc_get_fake_result_decl (sym->ns->proc_name);
1560 for (field = TYPE_FIELDS (TREE_TYPE (decl));
1561 field; field = TREE_CHAIN (field))
1562 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1566 gcc_assert (field != NULL_TREE);
1567 decl = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field,
1573 if (current_fake_result_decl != NULL_TREE)
1574 return current_fake_result_decl;
1576 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
1581 if (sym->ts.type == BT_CHARACTER
1582 && !sym->ts.cl->backend_decl)
1584 length = gfc_create_string_length (sym);
1585 gfc_finish_var_decl (length, sym);
1588 if (gfc_return_by_reference (sym))
1590 decl = DECL_ARGUMENTS (current_function_decl);
1592 if (sym->ns->proc_name->backend_decl == current_function_decl
1593 && sym->ns->proc_name->attr.entry_master)
1594 decl = TREE_CHAIN (decl);
1596 TREE_USED (decl) = 1;
1598 decl = gfc_build_dummy_array_decl (sym, decl);
1602 sprintf (name, "__result_%.20s",
1603 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
1605 decl = build_decl (VAR_DECL, get_identifier (name),
1606 TREE_TYPE (TREE_TYPE (current_function_decl)));
1608 DECL_ARTIFICIAL (decl) = 1;
1609 DECL_EXTERNAL (decl) = 0;
1610 TREE_PUBLIC (decl) = 0;
1611 TREE_USED (decl) = 1;
1613 layout_decl (decl, 0);
1615 gfc_add_decl_to_function (decl);
1618 current_fake_result_decl = decl;
1624 /* Builds a function decl. The remaining parameters are the types of the
1625 function arguments. Negative nargs indicates a varargs function. */
1628 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
1637 /* Library functions must be declared with global scope. */
1638 gcc_assert (current_function_decl == NULL_TREE);
1640 va_start (p, nargs);
1643 /* Create a list of the argument types. */
1644 for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
1646 argtype = va_arg (p, tree);
1647 arglist = gfc_chainon_list (arglist, argtype);
1652 /* Terminate the list. */
1653 arglist = gfc_chainon_list (arglist, void_type_node);
1656 /* Build the function type and decl. */
1657 fntype = build_function_type (rettype, arglist);
1658 fndecl = build_decl (FUNCTION_DECL, name, fntype);
1660 /* Mark this decl as external. */
1661 DECL_EXTERNAL (fndecl) = 1;
1662 TREE_PUBLIC (fndecl) = 1;
1668 rest_of_decl_compilation (fndecl, 1, 0);
1674 gfc_build_intrinsic_function_decls (void)
1676 tree gfc_int4_type_node = gfc_get_int_type (4);
1677 tree gfc_int8_type_node = gfc_get_int_type (8);
1678 tree gfc_logical4_type_node = gfc_get_logical_type (4);
1679 tree gfc_real4_type_node = gfc_get_real_type (4);
1680 tree gfc_real8_type_node = gfc_get_real_type (8);
1681 tree gfc_complex4_type_node = gfc_get_complex_type (4);
1682 tree gfc_complex8_type_node = gfc_get_complex_type (8);
1684 /* String functions. */
1685 gfor_fndecl_copy_string =
1686 gfc_build_library_function_decl (get_identifier (PREFIX("copy_string")),
1689 gfc_charlen_type_node, pchar_type_node,
1690 gfc_charlen_type_node, pchar_type_node);
1692 gfor_fndecl_compare_string =
1693 gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
1696 gfc_charlen_type_node, pchar_type_node,
1697 gfc_charlen_type_node, pchar_type_node);
1699 gfor_fndecl_concat_string =
1700 gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
1703 gfc_charlen_type_node, pchar_type_node,
1704 gfc_charlen_type_node, pchar_type_node,
1705 gfc_charlen_type_node, pchar_type_node);
1707 gfor_fndecl_string_len_trim =
1708 gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
1710 2, gfc_charlen_type_node,
1713 gfor_fndecl_string_index =
1714 gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
1716 5, gfc_charlen_type_node, pchar_type_node,
1717 gfc_charlen_type_node, pchar_type_node,
1718 gfc_logical4_type_node);
1720 gfor_fndecl_string_scan =
1721 gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
1723 5, gfc_charlen_type_node, pchar_type_node,
1724 gfc_charlen_type_node, pchar_type_node,
1725 gfc_logical4_type_node);
1727 gfor_fndecl_string_verify =
1728 gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
1730 5, gfc_charlen_type_node, pchar_type_node,
1731 gfc_charlen_type_node, pchar_type_node,
1732 gfc_logical4_type_node);
1734 gfor_fndecl_string_trim =
1735 gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
1738 build_pointer_type (gfc_charlen_type_node),
1740 gfc_charlen_type_node,
1743 gfor_fndecl_string_repeat =
1744 gfc_build_library_function_decl (get_identifier (PREFIX("string_repeat")),
1748 gfc_charlen_type_node,
1750 gfc_int4_type_node);
1752 gfor_fndecl_adjustl =
1753 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
1757 gfc_charlen_type_node, pchar_type_node);
1759 gfor_fndecl_adjustr =
1760 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
1764 gfc_charlen_type_node, pchar_type_node);
1766 gfor_fndecl_si_kind =
1767 gfc_build_library_function_decl (get_identifier ("selected_int_kind"),
1772 gfor_fndecl_sr_kind =
1773 gfc_build_library_function_decl (get_identifier ("selected_real_kind"),
1778 /* Power functions. */
1784 static int kinds[2] = {4, 8};
1785 char name[PREFIX_LEN + 10]; /* _gfortran_pow_?n_?n */
1787 for (ikind=0; ikind < 2; ikind++)
1789 itype = gfc_get_int_type (kinds[ikind]);
1790 for (kind = 0; kind < 2; kind ++)
1792 type = gfc_get_int_type (kinds[kind]);
1793 sprintf(name, PREFIX("pow_i%d_i%d"), kinds[kind], kinds[ikind]);
1794 gfor_fndecl_math_powi[kind][ikind].integer =
1795 gfc_build_library_function_decl (get_identifier (name),
1796 type, 2, type, itype);
1798 type = gfc_get_real_type (kinds[kind]);
1799 sprintf(name, PREFIX("pow_r%d_i%d"), kinds[kind], kinds[ikind]);
1800 gfor_fndecl_math_powi[kind][ikind].real =
1801 gfc_build_library_function_decl (get_identifier (name),
1802 type, 2, type, itype);
1804 type = gfc_get_complex_type (kinds[kind]);
1805 sprintf(name, PREFIX("pow_c%d_i%d"), kinds[kind], kinds[ikind]);
1806 gfor_fndecl_math_powi[kind][ikind].cmplx =
1807 gfc_build_library_function_decl (get_identifier (name),
1808 type, 2, type, itype);
1813 gfor_fndecl_math_cpowf =
1814 gfc_build_library_function_decl (get_identifier ("cpowf"),
1815 gfc_complex4_type_node,
1816 1, gfc_complex4_type_node);
1817 gfor_fndecl_math_cpow =
1818 gfc_build_library_function_decl (get_identifier ("cpow"),
1819 gfc_complex8_type_node,
1820 1, gfc_complex8_type_node);
1821 gfor_fndecl_math_ishftc4 =
1822 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
1824 3, gfc_int4_type_node,
1825 gfc_int4_type_node, gfc_int4_type_node);
1826 gfor_fndecl_math_ishftc8 =
1827 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
1829 3, gfc_int8_type_node,
1830 gfc_int8_type_node, gfc_int8_type_node);
1831 gfor_fndecl_math_exponent4 =
1832 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r4")),
1834 1, gfc_real4_type_node);
1835 gfor_fndecl_math_exponent8 =
1836 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r8")),
1838 1, gfc_real8_type_node);
1840 /* Other functions. */
1842 gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
1843 gfc_array_index_type,
1844 1, pvoid_type_node);
1846 gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
1847 gfc_array_index_type,
1849 gfc_array_index_type);
1852 gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
1858 /* Make prototypes for runtime library functions. */
1861 gfc_build_builtin_function_decls (void)
1863 tree gfc_int4_type_node = gfc_get_int_type (4);
1864 tree gfc_int8_type_node = gfc_get_int_type (8);
1865 tree gfc_logical4_type_node = gfc_get_logical_type (4);
1867 gfor_fndecl_internal_malloc =
1868 gfc_build_library_function_decl (get_identifier (PREFIX("internal_malloc")),
1869 pvoid_type_node, 1, gfc_int4_type_node);
1871 gfor_fndecl_internal_malloc64 =
1872 gfc_build_library_function_decl (get_identifier
1873 (PREFIX("internal_malloc64")),
1874 pvoid_type_node, 1, gfc_int8_type_node);
1876 gfor_fndecl_internal_free =
1877 gfc_build_library_function_decl (get_identifier (PREFIX("internal_free")),
1878 void_type_node, 1, pvoid_type_node);
1880 gfor_fndecl_allocate =
1881 gfc_build_library_function_decl (get_identifier (PREFIX("allocate")),
1882 void_type_node, 2, ppvoid_type_node,
1883 gfc_int4_type_node);
1885 gfor_fndecl_allocate64 =
1886 gfc_build_library_function_decl (get_identifier (PREFIX("allocate64")),
1887 void_type_node, 2, ppvoid_type_node,
1888 gfc_int8_type_node);
1890 gfor_fndecl_deallocate =
1891 gfc_build_library_function_decl (get_identifier (PREFIX("deallocate")),
1892 void_type_node, 1, ppvoid_type_node);
1894 gfor_fndecl_stop_numeric =
1895 gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
1896 void_type_node, 1, gfc_int4_type_node);
1898 gfor_fndecl_stop_string =
1899 gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
1900 void_type_node, 2, pchar_type_node,
1901 gfc_int4_type_node);
1903 gfor_fndecl_pause_numeric =
1904 gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
1905 void_type_node, 1, gfc_int4_type_node);
1907 gfor_fndecl_pause_string =
1908 gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
1909 void_type_node, 2, pchar_type_node,
1910 gfc_int4_type_node);
1912 gfor_fndecl_select_string =
1913 gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
1914 pvoid_type_node, 0);
1916 gfor_fndecl_runtime_error =
1917 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
1920 pchar_type_node, pchar_type_node,
1921 gfc_int4_type_node);
1923 gfor_fndecl_in_pack = gfc_build_library_function_decl (
1924 get_identifier (PREFIX("internal_pack")),
1925 pvoid_type_node, 1, pvoid_type_node);
1927 gfor_fndecl_in_unpack = gfc_build_library_function_decl (
1928 get_identifier (PREFIX("internal_unpack")),
1929 pvoid_type_node, 1, pvoid_type_node);
1931 gfor_fndecl_associated =
1932 gfc_build_library_function_decl (
1933 get_identifier (PREFIX("associated")),
1934 gfc_logical4_type_node,
1939 gfc_build_intrinsic_function_decls ();
1940 gfc_build_intrinsic_lib_fndecls ();
1941 gfc_build_io_library_fndecls ();
1945 /* Evaluate the length of dummy character variables. */
1948 gfc_trans_dummy_character (gfc_charlen * cl, tree fnbody)
1952 gfc_finish_decl (cl->backend_decl, NULL_TREE);
1954 gfc_start_block (&body);
1956 /* Evaluate the string length expression. */
1957 gfc_trans_init_string_length (cl, &body);
1959 gfc_add_expr_to_block (&body, fnbody);
1960 return gfc_finish_block (&body);
1964 /* Allocate and cleanup an automatic character variable. */
1967 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
1973 gcc_assert (sym->backend_decl);
1974 gcc_assert (sym->ts.cl && sym->ts.cl->length);
1976 gfc_start_block (&body);
1978 /* Evaluate the string length expression. */
1979 gfc_trans_init_string_length (sym->ts.cl, &body);
1981 decl = sym->backend_decl;
1983 /* Emit a DECL_EXPR for this variable, which will cause the
1984 gimplifier to allocate storage, and all that good stuff. */
1985 tmp = build1 (DECL_EXPR, TREE_TYPE (decl), decl);
1986 gfc_add_expr_to_block (&body, tmp);
1988 gfc_add_expr_to_block (&body, fnbody);
1989 return gfc_finish_block (&body);
1993 /* Generate function entry and exit code, and add it to the function body.
1995 Allocation and initialization of array variables.
1996 Allocation of character string variables.
1997 Initialization and possibly repacking of dummy arrays. */
2000 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2005 /* Deal with implicit return variables. Explicit return variables will
2006 already have been added. */
2007 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2009 if (!current_fake_result_decl)
2011 gfc_entry_list *el = NULL;
2012 if (proc_sym->attr.entry_master)
2014 for (el = proc_sym->ns->entries; el; el = el->next)
2015 if (el->sym != el->sym->result)
2019 warning (0, "Function does not return a value");
2021 else if (proc_sym->as)
2023 fnbody = gfc_trans_dummy_array_bias (proc_sym,
2024 current_fake_result_decl,
2027 else if (proc_sym->ts.type == BT_CHARACTER)
2029 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2030 fnbody = gfc_trans_dummy_character (proc_sym->ts.cl, fnbody);
2033 gfc_todo_error ("Deferred non-array return by reference");
2036 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2038 if (sym->attr.dimension)
2040 switch (sym->as->type)
2043 if (sym->attr.dummy || sym->attr.result)
2045 gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2046 else if (sym->attr.pointer || sym->attr.allocatable)
2048 if (TREE_STATIC (sym->backend_decl))
2049 gfc_trans_static_array_pointer (sym);
2051 fnbody = gfc_trans_deferred_array (sym, fnbody);
2055 gfc_get_backend_locus (&loc);
2056 gfc_set_backend_locus (&sym->declared_at);
2057 fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2059 gfc_set_backend_locus (&loc);
2063 case AS_ASSUMED_SIZE:
2064 /* Must be a dummy parameter. */
2065 gcc_assert (sym->attr.dummy);
2067 /* We should always pass assumed size arrays the g77 way. */
2068 fnbody = gfc_trans_g77_array (sym, fnbody);
2071 case AS_ASSUMED_SHAPE:
2072 /* Must be a dummy parameter. */
2073 gcc_assert (sym->attr.dummy);
2075 fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2080 fnbody = gfc_trans_deferred_array (sym, fnbody);
2087 else if (sym->ts.type == BT_CHARACTER)
2089 gfc_get_backend_locus (&loc);
2090 gfc_set_backend_locus (&sym->declared_at);
2091 if (sym->attr.dummy || sym->attr.result)
2092 fnbody = gfc_trans_dummy_character (sym->ts.cl, fnbody);
2094 fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2095 gfc_set_backend_locus (&loc);
2105 /* Output an initialized decl for a module variable. */
2108 gfc_create_module_variable (gfc_symbol * sym)
2112 /* Only output symbols from this module. */
2113 if (sym->ns != module_namespace)
2115 /* I don't think this should ever happen. */
2116 internal_error ("module symbol %s in wrong namespace", sym->name);
2119 /* Only output variables and array valued parameters. */
2120 if (sym->attr.flavor != FL_VARIABLE
2121 && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0))
2124 /* Don't generate variables from other modules. Variables from
2125 COMMONs will already have been generated. */
2126 if (sym->attr.use_assoc || sym->attr.in_common)
2129 if (sym->backend_decl)
2130 internal_error ("backend decl for module variable %s already exists",
2133 /* We always want module variables to be created. */
2134 sym->attr.referenced = 1;
2135 /* Create the decl. */
2136 decl = gfc_get_symbol_decl (sym);
2138 /* Create the variable. */
2140 rest_of_decl_compilation (decl, 1, 0);
2142 /* Also add length of strings. */
2143 if (sym->ts.type == BT_CHARACTER)
2147 length = sym->ts.cl->backend_decl;
2148 if (!INTEGER_CST_P (length))
2151 rest_of_decl_compilation (length, 1, 0);
2157 /* Generate all the required code for module variables. */
2160 gfc_generate_module_vars (gfc_namespace * ns)
2162 module_namespace = ns;
2164 /* Check if the frontend left the namespace in a reasonable state. */
2165 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
2167 /* Generate COMMON blocks. */
2168 gfc_trans_common (ns);
2170 /* Create decls for all the module variables. */
2171 gfc_traverse_ns (ns, gfc_create_module_variable);
2175 gfc_generate_contained_functions (gfc_namespace * parent)
2179 /* We create all the prototypes before generating any code. */
2180 for (ns = parent->contained; ns; ns = ns->sibling)
2182 /* Skip namespaces from used modules. */
2183 if (ns->parent != parent)
2186 gfc_create_function_decl (ns);
2189 for (ns = parent->contained; ns; ns = ns->sibling)
2191 /* Skip namespaces from used modules. */
2192 if (ns->parent != parent)
2195 gfc_generate_function_code (ns);
2200 /* Generate decls for all local variables. We do this to ensure correct
2201 handling of expressions which only appear in the specification of
2205 generate_local_decl (gfc_symbol * sym)
2207 if (sym->attr.flavor == FL_VARIABLE)
2209 if (sym->attr.referenced)
2210 gfc_get_symbol_decl (sym);
2211 else if (sym->attr.dummy && warn_unused_parameter)
2212 warning (0, "unused parameter %qs", sym->name);
2213 /* Warn for unused variables, but not if they're inside a common
2214 block or are use-associated. */
2215 else if (warn_unused_variable
2216 && !(sym->attr.in_common || sym->attr.use_assoc))
2217 warning (0, "unused variable %qs", sym->name);
2222 generate_local_vars (gfc_namespace * ns)
2224 gfc_traverse_ns (ns, generate_local_decl);
2228 /* Generate a switch statement to jump to the correct entry point. Also
2229 creates the label decls for the entry points. */
2232 gfc_trans_entry_master_switch (gfc_entry_list * el)
2239 gfc_init_block (&block);
2240 for (; el; el = el->next)
2242 /* Add the case label. */
2243 label = gfc_build_label_decl (NULL_TREE);
2244 val = build_int_cst (gfc_array_index_type, el->id);
2245 tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
2246 gfc_add_expr_to_block (&block, tmp);
2248 /* And jump to the actual entry point. */
2249 label = gfc_build_label_decl (NULL_TREE);
2250 tmp = build1_v (GOTO_EXPR, label);
2251 gfc_add_expr_to_block (&block, tmp);
2253 /* Save the label decl. */
2256 tmp = gfc_finish_block (&block);
2257 /* The first argument selects the entry point. */
2258 val = DECL_ARGUMENTS (current_function_decl);
2259 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
2264 /* Generate code for a function. */
2267 gfc_generate_function_code (gfc_namespace * ns)
2278 sym = ns->proc_name;
2280 /* Check that the frontend isn't still using this. */
2281 gcc_assert (sym->tlink == NULL);
2284 /* Create the declaration for functions with global scope. */
2285 if (!sym->backend_decl)
2286 gfc_create_function_decl (ns);
2288 fndecl = sym->backend_decl;
2289 old_context = current_function_decl;
2293 push_function_context ();
2294 saved_parent_function_decls = saved_function_decls;
2295 saved_function_decls = NULL_TREE;
2298 trans_function_start (sym);
2300 /* Will be created as needed. */
2301 current_fake_result_decl = NULL_TREE;
2303 gfc_start_block (&block);
2305 gfc_generate_contained_functions (ns);
2307 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
2309 /* Copy length backend_decls to all entry point result
2314 gfc_conv_const_charlen (ns->proc_name->ts.cl);
2315 backend_decl = ns->proc_name->result->ts.cl->backend_decl;
2316 for (el = ns->entries; el; el = el->next)
2317 el->sym->result->ts.cl->backend_decl = backend_decl;
2320 /* Translate COMMON blocks. */
2321 gfc_trans_common (ns);
2323 generate_local_vars (ns);
2325 current_function_return_label = NULL;
2327 /* Now generate the code for the body of this function. */
2328 gfc_init_block (&body);
2330 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
2331 && sym->attr.subroutine)
2333 tree alternate_return;
2334 alternate_return = gfc_get_fake_result_decl (sym);
2335 gfc_add_modify_expr (&body, alternate_return, integer_zero_node);
2340 /* Jump to the correct entry point. */
2341 tmp = gfc_trans_entry_master_switch (ns->entries);
2342 gfc_add_expr_to_block (&body, tmp);
2345 tmp = gfc_trans_code (ns->code);
2346 gfc_add_expr_to_block (&body, tmp);
2348 /* Add a return label if needed. */
2349 if (current_function_return_label)
2351 tmp = build1_v (LABEL_EXPR, current_function_return_label);
2352 gfc_add_expr_to_block (&body, tmp);
2355 tmp = gfc_finish_block (&body);
2356 /* Add code to create and cleanup arrays. */
2357 tmp = gfc_trans_deferred_vars (sym, tmp);
2358 gfc_add_expr_to_block (&block, tmp);
2360 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
2362 if (sym->attr.subroutine || sym == sym->result)
2364 result = current_fake_result_decl;
2365 current_fake_result_decl = NULL_TREE;
2368 result = sym->result->backend_decl;
2370 if (result == NULL_TREE)
2371 warning (0, "Function return value not set");
2374 /* Set the return value to the dummy result variable. */
2375 tmp = build2 (MODIFY_EXPR, TREE_TYPE (result),
2376 DECL_RESULT (fndecl), result);
2377 tmp = build1_v (RETURN_EXPR, tmp);
2378 gfc_add_expr_to_block (&block, tmp);
2382 /* Add all the decls we created during processing. */
2383 decl = saved_function_decls;
2388 next = TREE_CHAIN (decl);
2389 TREE_CHAIN (decl) = NULL_TREE;
2393 saved_function_decls = NULL_TREE;
2395 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
2397 /* Finish off this function and send it for code generation. */
2399 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
2401 /* Output the GENERIC tree. */
2402 dump_function (TDI_original, fndecl);
2404 /* Store the end of the function, so that we get good line number
2405 info for the epilogue. */
2406 cfun->function_end_locus = input_location;
2408 /* We're leaving the context of this function, so zap cfun.
2409 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2410 tree_rest_of_compilation. */
2415 pop_function_context ();
2416 saved_function_decls = saved_parent_function_decls;
2418 current_function_decl = old_context;
2420 if (decl_function_context (fndecl))
2421 /* Register this function with cgraph just far enough to get it
2422 added to our parent's nested function list. */
2423 (void) cgraph_node (fndecl);
2426 gfc_gimplify_function (fndecl);
2427 cgraph_finalize_function (fndecl, false);
2432 gfc_generate_constructors (void)
2434 gcc_assert (gfc_static_ctors == NULL_TREE);
2442 if (gfc_static_ctors == NULL_TREE)
2445 fnname = get_file_function_name ('I');
2446 type = build_function_type (void_type_node,
2447 gfc_chainon_list (NULL_TREE, void_type_node));
2449 fndecl = build_decl (FUNCTION_DECL, fnname, type);
2450 TREE_PUBLIC (fndecl) = 1;
2452 decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
2453 DECL_ARTIFICIAL (decl) = 1;
2454 DECL_IGNORED_P (decl) = 1;
2455 DECL_CONTEXT (decl) = fndecl;
2456 DECL_RESULT (fndecl) = decl;
2460 current_function_decl = fndecl;
2462 rest_of_decl_compilation (fndecl, 1, 0);
2464 make_decl_rtl (fndecl);
2466 init_function_start (fndecl);
2470 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
2473 gfc_build_function_call (TREE_VALUE (gfc_static_ctors), NULL_TREE);
2474 DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
2479 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
2481 free_after_parsing (cfun);
2482 free_after_compilation (cfun);
2484 tree_rest_of_compilation (fndecl);
2486 current_function_decl = NULL_TREE;
2490 /* Translates a BLOCK DATA program unit. This means emitting the
2491 commons contained therein plus their initializations. We also emit
2492 a globally visible symbol to make sure that each BLOCK DATA program
2493 unit remains unique. */
2496 gfc_generate_block_data (gfc_namespace * ns)
2501 /* Tell the backend the source location of the block data. */
2503 gfc_set_backend_locus (&ns->proc_name->declared_at);
2505 gfc_set_backend_locus (&gfc_current_locus);
2507 /* Process the DATA statements. */
2508 gfc_trans_common (ns);
2510 /* Create a global symbol with the mane of the block data. This is to
2511 generate linker errors if the same name is used twice. It is never
2514 id = gfc_sym_mangled_function_id (ns->proc_name);
2516 id = get_identifier ("__BLOCK_DATA__");
2518 decl = build_decl (VAR_DECL, id, gfc_array_index_type);
2519 TREE_PUBLIC (decl) = 1;
2520 TREE_STATIC (decl) = 1;
2523 rest_of_decl_compilation (decl, 1, 0);
2526 #include "gt-fortran-trans-decl.h"