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 /* Finish processing of a declaration and install its initial value. */
323 gfc_finish_decl (tree decl
, tree init
)
325 if (TREE_CODE (decl
) == PARM_DECL
)
326 gcc_assert (init
== NULL_TREE
);
327 /* Remember that PARM_DECL doesn't have a DECL_INITIAL field per se
328 -- it overlaps DECL_ARG_TYPE. */
329 else if (init
== NULL_TREE
)
330 gcc_assert (DECL_INITIAL (decl
) == NULL_TREE
);
332 gcc_assert (DECL_INITIAL (decl
) == error_mark_node
);
334 if (init
!= NULL_TREE
)
336 if (TREE_CODE (decl
) != TYPE_DECL
)
337 DECL_INITIAL (decl
) = init
;
340 /* typedef foo = bar; store the type of bar as the type of foo. */
341 TREE_TYPE (decl
) = TREE_TYPE (init
);
342 DECL_INITIAL (decl
) = init
= 0;
346 if (TREE_CODE (decl
) == VAR_DECL
)
348 if (DECL_SIZE (decl
) == NULL_TREE
349 && TYPE_SIZE (TREE_TYPE (decl
)) != NULL_TREE
)
350 layout_decl (decl
, 0);
352 /* A static variable with an incomplete type is an error if it is
353 initialized. Also if it is not file scope. Otherwise, let it
354 through, but if it is not `extern' then it may cause an error
356 /* An automatic variable with an incomplete type is an error. */
357 if (DECL_SIZE (decl
) == NULL_TREE
358 && (TREE_STATIC (decl
) ? (DECL_INITIAL (decl
) != 0
359 || DECL_CONTEXT (decl
) != 0)
360 : !DECL_EXTERNAL (decl
)))
362 gfc_fatal_error ("storage size not known");
365 if ((DECL_EXTERNAL (decl
) || TREE_STATIC (decl
))
366 && (DECL_SIZE (decl
) != 0)
367 && (TREE_CODE (DECL_SIZE (decl
)) != INTEGER_CST
))
369 gfc_fatal_error ("storage size not constant");
376 /* Apply symbol attributes to a variable, and add it to the function scope. */
379 gfc_finish_var_decl (tree decl
, gfc_symbol
* sym
)
381 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
382 This is the equivalent of the TARGET variables.
383 We also need to set this if the variable is passed by reference in a
385 if (sym
->attr
.target
)
386 TREE_ADDRESSABLE (decl
) = 1;
387 /* If it wasn't used we wouldn't be getting it. */
388 TREE_USED (decl
) = 1;
390 /* Chain this decl to the pending declarations. Don't do pushdecl()
391 because this would add them to the current scope rather than the
393 if (current_function_decl
!= NULL_TREE
)
395 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
)
396 gfc_add_decl_to_function (decl
);
398 gfc_add_decl_to_parent_function (decl
);
401 /* If a variable is USE associated, it's always external. */
402 if (sym
->attr
.use_assoc
)
404 DECL_EXTERNAL (decl
) = 1;
405 TREE_PUBLIC (decl
) = 1;
407 else if (sym
->module
&& !sym
->attr
.result
&& !sym
->attr
.dummy
)
409 /* TODO: Don't set sym->module for result or dummy variables. */
410 gcc_assert (current_function_decl
== NULL_TREE
);
411 /* This is the declaration of a module variable. */
412 TREE_PUBLIC (decl
) = 1;
413 TREE_STATIC (decl
) = 1;
416 if ((sym
->attr
.save
|| sym
->attr
.data
|| sym
->value
)
417 && !sym
->attr
.use_assoc
)
418 TREE_STATIC (decl
) = 1;
420 /* Keep variables larger than max-stack-var-size off stack. */
421 if (!sym
->ns
->proc_name
->attr
.recursive
422 && INTEGER_CST_P (DECL_SIZE_UNIT (decl
))
423 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl
)))
424 TREE_STATIC (decl
) = 1;
428 /* Allocate the lang-specific part of a decl. */
431 gfc_allocate_lang_decl (tree decl
)
433 DECL_LANG_SPECIFIC (decl
) = (struct lang_decl
*)
434 ggc_alloc_cleared (sizeof (struct lang_decl
));
437 /* Remember a symbol to generate initialization/cleanup code at function
441 gfc_defer_symbol_init (gfc_symbol
* sym
)
447 /* Don't add a symbol twice. */
451 last
= head
= sym
->ns
->proc_name
;
454 /* Make sure that setup code for dummy variables which are used in the
455 setup of other variables is generated first. */
458 /* Find the first dummy arg seen after us, or the first non-dummy arg.
459 This is a circular list, so don't go past the head. */
461 && (!p
->attr
.dummy
|| p
->dummy_order
> sym
->dummy_order
))
467 /* Insert in between last and p. */
473 /* Create an array index type variable with function scope. */
476 create_index_var (const char * pfx
, int nest
)
480 decl
= gfc_create_var_np (gfc_array_index_type
, pfx
);
482 gfc_add_decl_to_parent_function (decl
);
484 gfc_add_decl_to_function (decl
);
489 /* Create variables to hold all the non-constant bits of info for a
490 descriptorless array. Remember these in the lang-specific part of the
494 gfc_build_qualified_array (tree decl
, gfc_symbol
* sym
)
500 type
= TREE_TYPE (decl
);
502 /* We just use the descriptor, if there is one. */
503 if (GFC_DESCRIPTOR_TYPE_P (type
))
506 gcc_assert (GFC_ARRAY_TYPE_P (type
));
507 nest
= (sym
->ns
->proc_name
->backend_decl
!= current_function_decl
)
508 && !sym
->attr
.contained
;
510 for (dim
= 0; dim
< GFC_TYPE_ARRAY_RANK (type
); dim
++)
512 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
513 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
514 /* Don't try to use the unkown bound for assumed shape arrays. */
515 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
516 && (sym
->as
->type
!= AS_ASSUMED_SIZE
517 || dim
< GFC_TYPE_ARRAY_RANK (type
) - 1))
518 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
520 if (GFC_TYPE_ARRAY_STRIDE (type
, dim
) == NULL_TREE
)
521 GFC_TYPE_ARRAY_STRIDE (type
, dim
) = create_index_var ("stride", nest
);
523 if (GFC_TYPE_ARRAY_OFFSET (type
) == NULL_TREE
)
525 GFC_TYPE_ARRAY_OFFSET (type
) = gfc_create_var_np (gfc_array_index_type
,
528 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type
));
530 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type
));
535 /* For some dummy arguments we don't use the actual argument directly.
536 Instead we create a local decl and use that. This allows us to preform
537 initialization, and construct full type information. */
540 gfc_build_dummy_array_decl (gfc_symbol
* sym
, tree dummy
)
550 if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
553 /* Add to list of variables if not a fake result variable. */
554 if (sym
->attr
.result
|| sym
->attr
.dummy
)
555 gfc_defer_symbol_init (sym
);
557 type
= TREE_TYPE (dummy
);
558 gcc_assert (TREE_CODE (dummy
) == PARM_DECL
559 && POINTER_TYPE_P (type
));
561 /* Do we know the element size? */
562 known_size
= sym
->ts
.type
!= BT_CHARACTER
563 || INTEGER_CST_P (sym
->ts
.cl
->backend_decl
);
565 if (known_size
&& !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type
)))
567 /* For descriptorless arrays with known element size the actual
568 argument is sufficient. */
569 gcc_assert (GFC_ARRAY_TYPE_P (type
));
570 gfc_build_qualified_array (dummy
, sym
);
574 type
= TREE_TYPE (type
);
575 if (GFC_DESCRIPTOR_TYPE_P (type
))
577 /* Create a decriptorless array pointer. */
580 if (!gfc_option
.flag_repack_arrays
)
582 if (as
->type
== AS_ASSUMED_SIZE
)
587 if (as
->type
== AS_EXPLICIT
)
590 for (n
= 0; n
< as
->rank
; n
++)
594 && as
->upper
[n
]->expr_type
== EXPR_CONSTANT
595 && as
->lower
[n
]->expr_type
== EXPR_CONSTANT
))
603 type
= gfc_typenode_for_spec (&sym
->ts
);
604 type
= gfc_get_nodesc_array_type (type
, sym
->as
, packed
);
608 /* We now have an expression for the element size, so create a fully
609 qualified type. Reset sym->backend decl or this will just return the
611 sym
->backend_decl
= NULL_TREE
;
612 type
= gfc_sym_type (sym
);
616 ASM_FORMAT_PRIVATE_NAME (name
, IDENTIFIER_POINTER (DECL_NAME (dummy
)), 0);
617 decl
= build_decl (VAR_DECL
, get_identifier (name
), type
);
619 DECL_ARTIFICIAL (decl
) = 1;
620 TREE_PUBLIC (decl
) = 0;
621 TREE_STATIC (decl
) = 0;
622 DECL_EXTERNAL (decl
) = 0;
624 /* We should never get deferred shape arrays here. We used to because of
626 gcc_assert (sym
->as
->type
!= AS_DEFERRED
);
631 GFC_DECL_PARTIAL_PACKED_ARRAY (decl
) = 1;
635 GFC_DECL_PACKED_ARRAY (decl
) = 1;
639 gfc_build_qualified_array (decl
, sym
);
641 if (DECL_LANG_SPECIFIC (dummy
))
642 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (dummy
);
644 gfc_allocate_lang_decl (decl
);
646 GFC_DECL_SAVED_DESCRIPTOR (decl
) = dummy
;
648 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
649 || sym
->attr
.contained
)
650 gfc_add_decl_to_function (decl
);
652 gfc_add_decl_to_parent_function (decl
);
658 /* Return a constant or a variable to use as a string length. Does not
659 add the decl to the current scope. */
662 gfc_create_string_length (gfc_symbol
* sym
)
666 gcc_assert (sym
->ts
.cl
);
667 gfc_conv_const_charlen (sym
->ts
.cl
);
669 if (sym
->ts
.cl
->backend_decl
== NULL_TREE
)
671 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 2];
673 /* Also prefix the mangled name. */
674 strcpy (&name
[1], sym
->name
);
676 length
= build_decl (VAR_DECL
, get_identifier (name
),
677 gfc_charlen_type_node
);
678 DECL_ARTIFICIAL (length
) = 1;
679 TREE_USED (length
) = 1;
680 gfc_defer_symbol_init (sym
);
681 sym
->ts
.cl
->backend_decl
= length
;
684 return sym
->ts
.cl
->backend_decl
;
688 /* Return the decl for a gfc_symbol, create it if it doesn't already
692 gfc_get_symbol_decl (gfc_symbol
* sym
)
695 tree length
= NULL_TREE
;
698 gcc_assert (sym
->attr
.referenced
);
700 if (sym
->ns
&& sym
->ns
->proc_name
->attr
.function
)
701 byref
= gfc_return_by_reference (sym
->ns
->proc_name
);
705 if ((sym
->attr
.dummy
&& ! sym
->attr
.function
) || (sym
->attr
.result
&& byref
))
707 /* Return via extra parameter. */
708 if (sym
->attr
.result
&& byref
709 && !sym
->backend_decl
)
712 DECL_ARGUMENTS (sym
->ns
->proc_name
->backend_decl
);
715 /* Dummy variables should already have been created. */
716 gcc_assert (sym
->backend_decl
);
718 /* Create a character length variable. */
719 if (sym
->ts
.type
== BT_CHARACTER
)
721 if (sym
->ts
.cl
->backend_decl
== NULL_TREE
)
723 length
= gfc_create_string_length (sym
);
724 if (TREE_CODE (length
) != INTEGER_CST
)
726 gfc_finish_var_decl (length
, sym
);
727 gfc_defer_symbol_init (sym
);
732 /* Use a copy of the descriptor for dummy arrays. */
733 if (sym
->attr
.dimension
&& !TREE_USED (sym
->backend_decl
))
736 gfc_build_dummy_array_decl (sym
, sym
->backend_decl
);
739 TREE_USED (sym
->backend_decl
) = 1;
740 return sym
->backend_decl
;
743 if (sym
->backend_decl
)
744 return sym
->backend_decl
;
746 /* Catch function declarations. Only used for actual parameters. */
747 if (sym
->attr
.flavor
== FL_PROCEDURE
)
749 decl
= gfc_get_extern_function_decl (sym
);
753 if (sym
->attr
.intrinsic
)
754 internal_error ("intrinsic variable which isn't a procedure");
756 /* Create string length decl first so that they can be used in the
758 if (sym
->ts
.type
== BT_CHARACTER
)
759 length
= gfc_create_string_length (sym
);
761 /* Create the decl for the variable. */
762 decl
= build_decl (VAR_DECL
, gfc_sym_identifier (sym
), gfc_sym_type (sym
));
764 gfc_set_decl_location (decl
, &sym
->declared_at
);
766 /* Symbols from modules should have their assembler names mangled.
767 This is done here rather than in gfc_finish_var_decl because it
768 is different for string length variables. */
770 SET_DECL_ASSEMBLER_NAME (decl
, gfc_sym_mangled_identifier (sym
));
772 if (sym
->attr
.dimension
)
774 /* Create variables to hold the non-constant bits of array info. */
775 gfc_build_qualified_array (decl
, sym
);
777 /* Remember this variable for allocation/cleanup. */
778 gfc_defer_symbol_init (sym
);
780 if ((sym
->attr
.allocatable
|| !sym
->attr
.dummy
) && !sym
->attr
.pointer
)
781 GFC_DECL_PACKED_ARRAY (decl
) = 1;
784 gfc_finish_var_decl (decl
, sym
);
786 if (sym
->attr
.assign
)
788 gfc_allocate_lang_decl (decl
);
789 GFC_DECL_ASSIGN (decl
) = 1;
790 length
= gfc_create_var (gfc_charlen_type_node
, sym
->name
);
791 GFC_DECL_STRING_LEN (decl
) = length
;
792 GFC_DECL_ASSIGN_ADDR (decl
) = gfc_create_var (pvoid_type_node
, sym
->name
);
793 /* TODO: Need to check we don't change TREE_STATIC (decl) later. */
794 TREE_STATIC (length
) = TREE_STATIC (decl
);
795 /* STRING_LENGTH is also used as flag. Less than -1 means that
796 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
797 target label's address. Other value is the length of format string
798 and ASSIGN_ADDR is the address of format string. */
799 DECL_INITIAL (length
) = build_int_cst (NULL_TREE
, -2);
802 if (sym
->ts
.type
== BT_CHARACTER
)
804 /* Character variables need special handling. */
805 gfc_allocate_lang_decl (decl
);
807 if (TREE_CODE (length
) != INTEGER_CST
)
809 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 2];
813 /* Also prefix the mangled name for symbols from modules. */
814 strcpy (&name
[1], sym
->name
);
817 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length
)));
818 SET_DECL_ASSEMBLER_NAME (decl
, get_identifier (name
));
820 gfc_finish_var_decl (length
, sym
);
821 gcc_assert (!sym
->value
);
824 sym
->backend_decl
= decl
;
826 if (TREE_STATIC (decl
) && !sym
->attr
.use_assoc
)
828 /* Add static initializer. */
829 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
830 TREE_TYPE (decl
), sym
->attr
.dimension
,
831 sym
->attr
.pointer
|| sym
->attr
.allocatable
);
838 /* Substitute a temporary variable in place of the real one. */
841 gfc_shadow_sym (gfc_symbol
* sym
, tree decl
, gfc_saved_var
* save
)
843 save
->attr
= sym
->attr
;
844 save
->decl
= sym
->backend_decl
;
846 gfc_clear_attr (&sym
->attr
);
847 sym
->attr
.referenced
= 1;
848 sym
->attr
.flavor
= FL_VARIABLE
;
850 sym
->backend_decl
= decl
;
854 /* Restore the original variable. */
857 gfc_restore_sym (gfc_symbol
* sym
, gfc_saved_var
* save
)
859 sym
->attr
= save
->attr
;
860 sym
->backend_decl
= save
->decl
;
864 /* Get a basic decl for an external function. */
867 gfc_get_extern_function_decl (gfc_symbol
* sym
)
872 gfc_intrinsic_sym
*isym
;
874 char s
[GFC_MAX_SYMBOL_LEN
];
878 if (sym
->backend_decl
)
879 return sym
->backend_decl
;
881 /* We should never be creating external decls for alternate entry points.
882 The procedure may be an alternate entry point, but we don't want/need
884 gcc_assert (!(sym
->attr
.entry
|| sym
->attr
.entry_master
));
886 if (sym
->attr
.intrinsic
)
888 /* Call the resolution function to get the actual name. This is
889 a nasty hack which relies on the resolution functions only looking
890 at the first argument. We pass NULL for the second argument
891 otherwise things like AINT get confused. */
892 isym
= gfc_find_function (sym
->name
);
893 gcc_assert (isym
->resolve
.f0
!= NULL
);
895 memset (&e
, 0, sizeof (e
));
896 e
.expr_type
= EXPR_FUNCTION
;
898 memset (&argexpr
, 0, sizeof (argexpr
));
899 gcc_assert (isym
->formal
);
900 argexpr
.ts
= isym
->formal
->ts
;
902 if (isym
->formal
->next
== NULL
)
903 isym
->resolve
.f1 (&e
, &argexpr
);
906 /* All specific intrinsics take one or two arguments. */
907 gcc_assert (isym
->formal
->next
->next
== NULL
);
908 isym
->resolve
.f2 (&e
, &argexpr
, NULL
);
910 sprintf (s
, "specific%s", e
.value
.function
.name
);
911 name
= get_identifier (s
);
916 name
= gfc_sym_identifier (sym
);
917 mangled_name
= gfc_sym_mangled_function_id (sym
);
920 type
= gfc_get_function_type (sym
);
921 fndecl
= build_decl (FUNCTION_DECL
, name
, type
);
923 SET_DECL_ASSEMBLER_NAME (fndecl
, mangled_name
);
924 /* If the return type is a pointer, avoid alias issues by setting
925 DECL_IS_MALLOC to nonzero. This means that the function should be
926 treated as if it were a malloc, meaning it returns a pointer that
928 if (POINTER_TYPE_P (type
))
929 DECL_IS_MALLOC (fndecl
) = 1;
931 /* Set the context of this decl. */
932 if (0 && sym
->ns
&& sym
->ns
->proc_name
)
934 /* TODO: Add external decls to the appropriate scope. */
935 DECL_CONTEXT (fndecl
) = sym
->ns
->proc_name
->backend_decl
;
939 /* Global declaration, e.g. intrinsic subroutine. */
940 DECL_CONTEXT (fndecl
) = NULL_TREE
;
943 DECL_EXTERNAL (fndecl
) = 1;
945 /* This specifies if a function is globally addressable, i.e. it is
946 the opposite of declaring static in C. */
947 TREE_PUBLIC (fndecl
) = 1;
949 /* Set attributes for PURE functions. A call to PURE function in the
950 Fortran 95 sense is both pure and without side effects in the C
952 if (sym
->attr
.pure
|| sym
->attr
.elemental
)
954 if (sym
->attr
.function
)
955 DECL_IS_PURE (fndecl
) = 1;
956 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
957 parameters and don't use alternate returns (is this
958 allowed?). In that case, calls to them are meaningless, and
959 can be optimized away. See also in build_function_decl(). */
960 TREE_SIDE_EFFECTS (fndecl
) = 0;
963 sym
->backend_decl
= fndecl
;
965 if (DECL_CONTEXT (fndecl
) == NULL_TREE
)
966 pushdecl_top_level (fndecl
);
972 /* Create a declaration for a procedure. For external functions (in the C
973 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
974 a master function with alternate entry points. */
977 build_function_decl (gfc_symbol
* sym
)
980 symbol_attribute attr
;
982 gfc_formal_arglist
*f
;
984 gcc_assert (!sym
->backend_decl
);
985 gcc_assert (!sym
->attr
.external
);
987 /* Set the line and filename. sym->declared_at seems to point to the
988 last statement for subroutines, but it'll do for now. */
989 gfc_set_backend_locus (&sym
->declared_at
);
991 /* Allow only one nesting level. Allow public declarations. */
992 gcc_assert (current_function_decl
== NULL_TREE
993 || DECL_CONTEXT (current_function_decl
) == NULL_TREE
);
995 type
= gfc_get_function_type (sym
);
996 fndecl
= build_decl (FUNCTION_DECL
, gfc_sym_identifier (sym
), type
);
998 /* Perform name mangling if this is a top level or module procedure. */
999 if (current_function_decl
== NULL_TREE
)
1000 SET_DECL_ASSEMBLER_NAME (fndecl
, gfc_sym_mangled_function_id (sym
));
1002 /* Figure out the return type of the declared function, and build a
1003 RESULT_DECL for it. If this is a subroutine with alternate
1004 returns, build a RESULT_DECL for it. */
1007 result_decl
= NULL_TREE
;
1008 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1011 if (gfc_return_by_reference (sym
))
1012 type
= void_type_node
;
1015 if (sym
->result
!= sym
)
1016 result_decl
= gfc_sym_identifier (sym
->result
);
1018 type
= TREE_TYPE (TREE_TYPE (fndecl
));
1023 /* Look for alternate return placeholders. */
1024 int has_alternate_returns
= 0;
1025 for (f
= sym
->formal
; f
; f
= f
->next
)
1029 has_alternate_returns
= 1;
1034 if (has_alternate_returns
)
1035 type
= integer_type_node
;
1037 type
= void_type_node
;
1040 result_decl
= build_decl (RESULT_DECL
, result_decl
, type
);
1041 DECL_ARTIFICIAL (result_decl
) = 1;
1042 DECL_IGNORED_P (result_decl
) = 1;
1043 DECL_CONTEXT (result_decl
) = fndecl
;
1044 DECL_RESULT (fndecl
) = result_decl
;
1046 /* Don't call layout_decl for a RESULT_DECL.
1047 layout_decl (result_decl, 0); */
1049 /* If the return type is a pointer, avoid alias issues by setting
1050 DECL_IS_MALLOC to nonzero. This means that the function should be
1051 treated as if it were a malloc, meaning it returns a pointer that
1053 if (POINTER_TYPE_P (type
))
1054 DECL_IS_MALLOC (fndecl
) = 1;
1056 /* Set up all attributes for the function. */
1057 DECL_CONTEXT (fndecl
) = current_function_decl
;
1058 DECL_EXTERNAL (fndecl
) = 0;
1060 /* This specifies if a function is globally visible, i.e. it is
1061 the opposite of declaring static in C. */
1062 if (DECL_CONTEXT (fndecl
) == NULL_TREE
1063 && !sym
->attr
.entry_master
)
1064 TREE_PUBLIC (fndecl
) = 1;
1066 /* TREE_STATIC means the function body is defined here. */
1067 TREE_STATIC (fndecl
) = 1;
1069 /* Set attributes for PURE functions. A call to a PURE function in the
1070 Fortran 95 sense is both pure and without side effects in the C
1072 if (attr
.pure
|| attr
.elemental
)
1074 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1075 including a alternate return. In that case it can also be
1076 marked as PURE. See also in gfc_get_extern_function_decl(). */
1078 DECL_IS_PURE (fndecl
) = 1;
1079 TREE_SIDE_EFFECTS (fndecl
) = 0;
1082 /* Layout the function declaration and put it in the binding level
1083 of the current function. */
1086 sym
->backend_decl
= fndecl
;
1090 /* Create the DECL_ARGUMENTS for a procedure. */
1093 create_function_arglist (gfc_symbol
* sym
)
1096 gfc_formal_arglist
*f
;
1103 fndecl
= sym
->backend_decl
;
1105 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1106 the new FUNCTION_DECL node. */
1107 arglist
= NULL_TREE
;
1108 typelist
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
1110 if (sym
->attr
.entry_master
)
1112 type
= TREE_VALUE (typelist
);
1113 parm
= build_decl (PARM_DECL
, get_identifier ("__entry"), type
);
1115 DECL_CONTEXT (parm
) = fndecl
;
1116 DECL_ARG_TYPE (parm
) = type
;
1117 TREE_READONLY (parm
) = 1;
1118 gfc_finish_decl (parm
, NULL_TREE
);
1120 arglist
= chainon (arglist
, parm
);
1121 typelist
= TREE_CHAIN (typelist
);
1124 if (gfc_return_by_reference (sym
))
1126 type
= TREE_VALUE (typelist
);
1127 parm
= build_decl (PARM_DECL
, get_identifier ("__result"), type
);
1129 DECL_CONTEXT (parm
) = fndecl
;
1130 DECL_ARG_TYPE (parm
) = type
;
1131 TREE_READONLY (parm
) = 1;
1132 DECL_ARTIFICIAL (parm
) = 1;
1133 gfc_finish_decl (parm
, NULL_TREE
);
1135 arglist
= chainon (arglist
, parm
);
1136 typelist
= TREE_CHAIN (typelist
);
1138 if (sym
->ts
.type
== BT_CHARACTER
)
1140 gfc_allocate_lang_decl (parm
);
1142 /* Length of character result. */
1143 type
= TREE_VALUE (typelist
);
1144 gcc_assert (type
== gfc_charlen_type_node
);
1146 length
= build_decl (PARM_DECL
,
1147 get_identifier (".__result"),
1149 if (!sym
->ts
.cl
->length
)
1151 sym
->ts
.cl
->backend_decl
= length
;
1152 TREE_USED (length
) = 1;
1154 gcc_assert (TREE_CODE (length
) == PARM_DECL
);
1155 arglist
= chainon (arglist
, length
);
1156 typelist
= TREE_CHAIN (typelist
);
1157 DECL_CONTEXT (length
) = fndecl
;
1158 DECL_ARG_TYPE (length
) = type
;
1159 TREE_READONLY (length
) = 1;
1160 DECL_ARTIFICIAL (length
) = 1;
1161 gfc_finish_decl (length
, NULL_TREE
);
1165 for (f
= sym
->formal
; f
; f
= f
->next
)
1167 if (f
->sym
!= NULL
) /* ignore alternate returns. */
1171 type
= TREE_VALUE (typelist
);
1173 /* Build a the argument declaration. */
1174 parm
= build_decl (PARM_DECL
,
1175 gfc_sym_identifier (f
->sym
), type
);
1177 /* Fill in arg stuff. */
1178 DECL_CONTEXT (parm
) = fndecl
;
1179 DECL_ARG_TYPE (parm
) = type
;
1180 DECL_ARG_TYPE_AS_WRITTEN (parm
) = type
;
1181 /* All implementation args are read-only. */
1182 TREE_READONLY (parm
) = 1;
1184 gfc_finish_decl (parm
, NULL_TREE
);
1186 f
->sym
->backend_decl
= parm
;
1188 arglist
= chainon (arglist
, parm
);
1189 typelist
= TREE_CHAIN (typelist
);
1193 /* Add the hidden string length parameters. */
1195 for (f
= sym
->formal
; f
; f
= f
->next
)
1197 char name
[GFC_MAX_SYMBOL_LEN
+ 2];
1198 /* Ignore alternate returns. */
1202 if (f
->sym
->ts
.type
!= BT_CHARACTER
)
1205 parm
= f
->sym
->backend_decl
;
1206 type
= TREE_VALUE (typelist
);
1207 gcc_assert (type
== gfc_charlen_type_node
);
1209 strcpy (&name
[1], f
->sym
->name
);
1211 length
= build_decl (PARM_DECL
, get_identifier (name
), type
);
1213 arglist
= chainon (arglist
, length
);
1214 DECL_CONTEXT (length
) = fndecl
;
1215 DECL_ARTIFICIAL (length
) = 1;
1216 DECL_ARG_TYPE (length
) = type
;
1217 TREE_READONLY (length
) = 1;
1218 gfc_finish_decl (length
, NULL_TREE
);
1220 /* TODO: Check string lengths when -fbounds-check. */
1222 /* Use the passed value for assumed length variables. */
1223 if (!f
->sym
->ts
.cl
->length
)
1225 TREE_USED (length
) = 1;
1226 if (!f
->sym
->ts
.cl
->backend_decl
)
1227 f
->sym
->ts
.cl
->backend_decl
= length
;
1230 /* there is already another variable using this
1231 gfc_charlen node, build a new one for this variable
1232 and chain it into the list of gfc_charlens.
1233 This happens for e.g. in the case
1235 since CHARACTER declarations on the same line share
1236 the same gfc_charlen node. */
1239 cl
= gfc_get_charlen ();
1240 cl
->backend_decl
= length
;
1241 cl
->next
= f
->sym
->ts
.cl
->next
;
1242 f
->sym
->ts
.cl
->next
= cl
;
1247 parm
= TREE_CHAIN (parm
);
1248 typelist
= TREE_CHAIN (typelist
);
1251 gcc_assert (TREE_VALUE (typelist
) == void_type_node
);
1252 DECL_ARGUMENTS (fndecl
) = arglist
;
1255 /* Convert FNDECL's code to GIMPLE and handle any nested functions. */
1258 gfc_gimplify_function (tree fndecl
)
1260 struct cgraph_node
*cgn
;
1262 gimplify_function_tree (fndecl
);
1263 dump_function (TDI_generic
, fndecl
);
1265 /* Convert all nested functions to GIMPLE now. We do things in this order
1266 so that items like VLA sizes are expanded properly in the context of the
1267 correct function. */
1268 cgn
= cgraph_node (fndecl
);
1269 for (cgn
= cgn
->nested
; cgn
; cgn
= cgn
->next_nested
)
1270 gfc_gimplify_function (cgn
->decl
);
1274 /* Do the setup necessary before generating the body of a function. */
1277 trans_function_start (gfc_symbol
* sym
)
1281 fndecl
= sym
->backend_decl
;
1283 /* Let GCC know the current scope is this function. */
1284 current_function_decl
= fndecl
;
1286 /* Let the world know what we're about to do. */
1287 announce_function (fndecl
);
1289 if (DECL_CONTEXT (fndecl
) == NULL_TREE
)
1291 /* Create RTL for function declaration. */
1292 rest_of_decl_compilation (fndecl
, 1, 0);
1295 /* Create RTL for function definition. */
1296 make_decl_rtl (fndecl
);
1298 init_function_start (fndecl
);
1300 /* Even though we're inside a function body, we still don't want to
1301 call expand_expr to calculate the size of a variable-sized array.
1302 We haven't necessarily assigned RTL to all variables yet, so it's
1303 not safe to try to expand expressions involving them. */
1304 cfun
->x_dont_save_pending_sizes_p
= 1;
1306 /* function.c requires a push at the start of the function. */
1310 /* Create thunks for alternate entry points. */
1313 build_entry_thunks (gfc_namespace
* ns
)
1315 gfc_formal_arglist
*formal
;
1316 gfc_formal_arglist
*thunk_formal
;
1318 gfc_symbol
*thunk_sym
;
1326 /* This should always be a toplevel function. */
1327 gcc_assert (current_function_decl
== NULL_TREE
);
1329 gfc_get_backend_locus (&old_loc
);
1330 for (el
= ns
->entries
; el
; el
= el
->next
)
1332 thunk_sym
= el
->sym
;
1334 build_function_decl (thunk_sym
);
1335 create_function_arglist (thunk_sym
);
1337 trans_function_start (thunk_sym
);
1339 thunk_fndecl
= thunk_sym
->backend_decl
;
1341 gfc_start_block (&body
);
1343 /* Pass extra parameter identifying this entry point. */
1344 tmp
= build_int_cst (gfc_array_index_type
, el
->id
);
1345 args
= tree_cons (NULL_TREE
, tmp
, NULL_TREE
);
1346 string_args
= NULL_TREE
;
1348 /* TODO: Pass return by reference parameters. */
1349 if (ns
->proc_name
->attr
.function
)
1350 gfc_todo_error ("Functons with multiple entry points");
1352 for (formal
= ns
->proc_name
->formal
; formal
; formal
= formal
->next
)
1354 /* We don't have a clever way of identifying arguments, so resort to
1355 a brute-force search. */
1356 for (thunk_formal
= thunk_sym
->formal
;
1358 thunk_formal
= thunk_formal
->next
)
1360 if (thunk_formal
->sym
== formal
->sym
)
1366 /* Pass the argument. */
1367 args
= tree_cons (NULL_TREE
, thunk_formal
->sym
->backend_decl
,
1369 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
1371 tmp
= thunk_formal
->sym
->ts
.cl
->backend_decl
;
1372 string_args
= tree_cons (NULL_TREE
, tmp
, string_args
);
1377 /* Pass NULL for a missing argument. */
1378 args
= tree_cons (NULL_TREE
, null_pointer_node
, args
);
1379 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
1381 tmp
= convert (gfc_charlen_type_node
, integer_zero_node
);
1382 string_args
= tree_cons (NULL_TREE
, tmp
, string_args
);
1387 /* Call the master function. */
1388 args
= nreverse (args
);
1389 args
= chainon (args
, nreverse (string_args
));
1390 tmp
= ns
->proc_name
->backend_decl
;
1391 tmp
= gfc_build_function_call (tmp
, args
);
1392 /* TODO: function return value. */
1393 gfc_add_expr_to_block (&body
, tmp
);
1395 /* Finish off this function and send it for code generation. */
1396 DECL_SAVED_TREE (thunk_fndecl
) = gfc_finish_block (&body
);
1398 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl
)) = thunk_fndecl
;
1400 /* Output the GENERIC tree. */
1401 dump_function (TDI_original
, thunk_fndecl
);
1403 /* Store the end of the function, so that we get good line number
1404 info for the epilogue. */
1405 cfun
->function_end_locus
= input_location
;
1407 /* We're leaving the context of this function, so zap cfun.
1408 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1409 tree_rest_of_compilation. */
1412 current_function_decl
= NULL_TREE
;
1414 gfc_gimplify_function (thunk_fndecl
);
1415 cgraph_finalize_function (thunk_fndecl
, false);
1417 /* We share the symbols in the formal argument list with other entry
1418 points and the master function. Clear them so that they are
1419 recreated for each function. */
1420 for (formal
= thunk_sym
->formal
; formal
; formal
= formal
->next
)
1422 formal
->sym
->backend_decl
= NULL_TREE
;
1423 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
1424 formal
->sym
->ts
.cl
->backend_decl
= NULL_TREE
;
1428 gfc_set_backend_locus (&old_loc
);
1432 /* Create a decl for a function, and create any thunks for alternate entry
1436 gfc_create_function_decl (gfc_namespace
* ns
)
1438 /* Create a declaration for the master function. */
1439 build_function_decl (ns
->proc_name
);
1441 /* Compile the entry thunks. */
1443 build_entry_thunks (ns
);
1445 /* Now create the read argument list. */
1446 create_function_arglist (ns
->proc_name
);
1449 /* Return the decl used to hold the function return value. */
1452 gfc_get_fake_result_decl (gfc_symbol
* sym
)
1457 char name
[GFC_MAX_SYMBOL_LEN
+ 10];
1459 if (current_fake_result_decl
!= NULL_TREE
)
1460 return current_fake_result_decl
;
1462 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
1467 if (sym
->ts
.type
== BT_CHARACTER
1468 && !sym
->ts
.cl
->backend_decl
)
1470 length
= gfc_create_string_length (sym
);
1471 gfc_finish_var_decl (length
, sym
);
1474 if (gfc_return_by_reference (sym
))
1476 decl
= DECL_ARGUMENTS (sym
->backend_decl
);
1478 TREE_USED (decl
) = 1;
1480 decl
= gfc_build_dummy_array_decl (sym
, decl
);
1484 sprintf (name
, "__result_%.20s",
1485 IDENTIFIER_POINTER (DECL_NAME (current_function_decl
)));
1487 decl
= build_decl (VAR_DECL
, get_identifier (name
),
1488 TREE_TYPE (TREE_TYPE (current_function_decl
)));
1490 DECL_ARTIFICIAL (decl
) = 1;
1491 DECL_EXTERNAL (decl
) = 0;
1492 TREE_PUBLIC (decl
) = 0;
1493 TREE_USED (decl
) = 1;
1495 layout_decl (decl
, 0);
1497 gfc_add_decl_to_function (decl
);
1500 current_fake_result_decl
= decl
;
1506 /* Builds a function decl. The remaining parameters are the types of the
1507 function arguments. Negative nargs indicates a varargs function. */
1510 gfc_build_library_function_decl (tree name
, tree rettype
, int nargs
, ...)
1519 /* Library functions must be declared with global scope. */
1520 gcc_assert (current_function_decl
== NULL_TREE
);
1522 va_start (p
, nargs
);
1525 /* Create a list of the argument types. */
1526 for (arglist
= NULL_TREE
, n
= abs (nargs
); n
> 0; n
--)
1528 argtype
= va_arg (p
, tree
);
1529 arglist
= gfc_chainon_list (arglist
, argtype
);
1534 /* Terminate the list. */
1535 arglist
= gfc_chainon_list (arglist
, void_type_node
);
1538 /* Build the function type and decl. */
1539 fntype
= build_function_type (rettype
, arglist
);
1540 fndecl
= build_decl (FUNCTION_DECL
, name
, fntype
);
1542 /* Mark this decl as external. */
1543 DECL_EXTERNAL (fndecl
) = 1;
1544 TREE_PUBLIC (fndecl
) = 1;
1550 rest_of_decl_compilation (fndecl
, 1, 0);
1556 gfc_build_intrinsic_function_decls (void)
1558 tree gfc_int4_type_node
= gfc_get_int_type (4);
1559 tree gfc_int8_type_node
= gfc_get_int_type (8);
1560 tree gfc_logical4_type_node
= gfc_get_logical_type (4);
1561 tree gfc_real4_type_node
= gfc_get_real_type (4);
1562 tree gfc_real8_type_node
= gfc_get_real_type (8);
1563 tree gfc_complex4_type_node
= gfc_get_complex_type (4);
1564 tree gfc_complex8_type_node
= gfc_get_complex_type (8);
1566 /* String functions. */
1567 gfor_fndecl_copy_string
=
1568 gfc_build_library_function_decl (get_identifier (PREFIX("copy_string")),
1571 gfc_charlen_type_node
, pchar_type_node
,
1572 gfc_charlen_type_node
, pchar_type_node
);
1574 gfor_fndecl_compare_string
=
1575 gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
1578 gfc_charlen_type_node
, pchar_type_node
,
1579 gfc_charlen_type_node
, pchar_type_node
);
1581 gfor_fndecl_concat_string
=
1582 gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
1585 gfc_charlen_type_node
, pchar_type_node
,
1586 gfc_charlen_type_node
, pchar_type_node
,
1587 gfc_charlen_type_node
, pchar_type_node
);
1589 gfor_fndecl_string_len_trim
=
1590 gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
1592 2, gfc_charlen_type_node
,
1595 gfor_fndecl_string_index
=
1596 gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
1598 5, gfc_charlen_type_node
, pchar_type_node
,
1599 gfc_charlen_type_node
, pchar_type_node
,
1600 gfc_logical4_type_node
);
1602 gfor_fndecl_string_scan
=
1603 gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
1605 5, gfc_charlen_type_node
, pchar_type_node
,
1606 gfc_charlen_type_node
, pchar_type_node
,
1607 gfc_logical4_type_node
);
1609 gfor_fndecl_string_verify
=
1610 gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
1612 5, gfc_charlen_type_node
, pchar_type_node
,
1613 gfc_charlen_type_node
, pchar_type_node
,
1614 gfc_logical4_type_node
);
1616 gfor_fndecl_string_trim
=
1617 gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
1620 build_pointer_type (gfc_charlen_type_node
),
1622 gfc_charlen_type_node
,
1625 gfor_fndecl_string_repeat
=
1626 gfc_build_library_function_decl (get_identifier (PREFIX("string_repeat")),
1630 gfc_charlen_type_node
,
1632 gfc_int4_type_node
);
1634 gfor_fndecl_adjustl
=
1635 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
1639 gfc_charlen_type_node
, pchar_type_node
);
1641 gfor_fndecl_adjustr
=
1642 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
1646 gfc_charlen_type_node
, pchar_type_node
);
1648 gfor_fndecl_si_kind
=
1649 gfc_build_library_function_decl (get_identifier ("selected_int_kind"),
1654 gfor_fndecl_sr_kind
=
1655 gfc_build_library_function_decl (get_identifier ("selected_real_kind"),
1660 /* Power functions. */
1666 static int kinds
[2] = {4, 8};
1667 char name
[PREFIX_LEN
+ 10]; /* _gfortran_pow_?n_?n */
1669 for (ikind
=0; ikind
< 2; ikind
++)
1671 itype
= gfc_get_int_type (kinds
[ikind
]);
1672 for (kind
= 0; kind
< 2; kind
++)
1674 type
= gfc_get_int_type (kinds
[kind
]);
1675 sprintf(name
, PREFIX("pow_i%d_i%d"), kinds
[kind
], kinds
[ikind
]);
1676 gfor_fndecl_math_powi
[kind
][ikind
].integer
=
1677 gfc_build_library_function_decl (get_identifier (name
),
1678 type
, 2, type
, itype
);
1680 type
= gfc_get_real_type (kinds
[kind
]);
1681 sprintf(name
, PREFIX("pow_r%d_i%d"), kinds
[kind
], kinds
[ikind
]);
1682 gfor_fndecl_math_powi
[kind
][ikind
].real
=
1683 gfc_build_library_function_decl (get_identifier (name
),
1684 type
, 2, type
, itype
);
1686 type
= gfc_get_complex_type (kinds
[kind
]);
1687 sprintf(name
, PREFIX("pow_c%d_i%d"), kinds
[kind
], kinds
[ikind
]);
1688 gfor_fndecl_math_powi
[kind
][ikind
].cmplx
=
1689 gfc_build_library_function_decl (get_identifier (name
),
1690 type
, 2, type
, itype
);
1695 gfor_fndecl_math_cpowf
=
1696 gfc_build_library_function_decl (get_identifier ("cpowf"),
1697 gfc_complex4_type_node
,
1698 1, gfc_complex4_type_node
);
1699 gfor_fndecl_math_cpow
=
1700 gfc_build_library_function_decl (get_identifier ("cpow"),
1701 gfc_complex8_type_node
,
1702 1, gfc_complex8_type_node
);
1703 gfor_fndecl_math_ishftc4
=
1704 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
1706 3, gfc_int4_type_node
,
1707 gfc_int4_type_node
, gfc_int4_type_node
);
1708 gfor_fndecl_math_ishftc8
=
1709 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
1711 3, gfc_int8_type_node
,
1712 gfc_int8_type_node
, gfc_int8_type_node
);
1713 gfor_fndecl_math_exponent4
=
1714 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r4")),
1716 1, gfc_real4_type_node
);
1717 gfor_fndecl_math_exponent8
=
1718 gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r8")),
1720 1, gfc_real8_type_node
);
1722 /* Other functions. */
1724 gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
1725 gfc_array_index_type
,
1726 1, pvoid_type_node
);
1728 gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
1729 gfc_array_index_type
,
1731 gfc_array_index_type
);
1734 gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
1740 /* Make prototypes for runtime library functions. */
1743 gfc_build_builtin_function_decls (void)
1745 tree gfc_int4_type_node
= gfc_get_int_type (4);
1746 tree gfc_int8_type_node
= gfc_get_int_type (8);
1747 tree gfc_logical4_type_node
= gfc_get_logical_type (4);
1749 gfor_fndecl_internal_malloc
=
1750 gfc_build_library_function_decl (get_identifier (PREFIX("internal_malloc")),
1751 pvoid_type_node
, 1, gfc_int4_type_node
);
1753 gfor_fndecl_internal_malloc64
=
1754 gfc_build_library_function_decl (get_identifier
1755 (PREFIX("internal_malloc64")),
1756 pvoid_type_node
, 1, gfc_int8_type_node
);
1758 gfor_fndecl_internal_free
=
1759 gfc_build_library_function_decl (get_identifier (PREFIX("internal_free")),
1760 void_type_node
, 1, pvoid_type_node
);
1762 gfor_fndecl_allocate
=
1763 gfc_build_library_function_decl (get_identifier (PREFIX("allocate")),
1764 void_type_node
, 2, ppvoid_type_node
,
1765 gfc_int4_type_node
);
1767 gfor_fndecl_allocate64
=
1768 gfc_build_library_function_decl (get_identifier (PREFIX("allocate64")),
1769 void_type_node
, 2, ppvoid_type_node
,
1770 gfc_int8_type_node
);
1772 gfor_fndecl_deallocate
=
1773 gfc_build_library_function_decl (get_identifier (PREFIX("deallocate")),
1774 void_type_node
, 1, ppvoid_type_node
);
1776 gfor_fndecl_stop_numeric
=
1777 gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
1778 void_type_node
, 1, gfc_int4_type_node
);
1780 gfor_fndecl_stop_string
=
1781 gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
1782 void_type_node
, 2, pchar_type_node
,
1783 gfc_int4_type_node
);
1785 gfor_fndecl_pause_numeric
=
1786 gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
1787 void_type_node
, 1, gfc_int4_type_node
);
1789 gfor_fndecl_pause_string
=
1790 gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
1791 void_type_node
, 2, pchar_type_node
,
1792 gfc_int4_type_node
);
1794 gfor_fndecl_select_string
=
1795 gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
1796 pvoid_type_node
, 0);
1798 gfor_fndecl_runtime_error
=
1799 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
1802 pchar_type_node
, pchar_type_node
,
1803 gfc_int4_type_node
);
1805 gfor_fndecl_in_pack
= gfc_build_library_function_decl (
1806 get_identifier (PREFIX("internal_pack")),
1807 pvoid_type_node
, 1, pvoid_type_node
);
1809 gfor_fndecl_in_unpack
= gfc_build_library_function_decl (
1810 get_identifier (PREFIX("internal_unpack")),
1811 pvoid_type_node
, 1, pvoid_type_node
);
1813 gfor_fndecl_associated
=
1814 gfc_build_library_function_decl (
1815 get_identifier (PREFIX("associated")),
1816 gfc_logical4_type_node
,
1821 gfc_build_intrinsic_function_decls ();
1822 gfc_build_intrinsic_lib_fndecls ();
1823 gfc_build_io_library_fndecls ();
1827 /* Evaluate the length of dummy character variables. */
1830 gfc_trans_dummy_character (gfc_charlen
* cl
, tree fnbody
)
1834 gfc_finish_decl (cl
->backend_decl
, NULL_TREE
);
1836 gfc_start_block (&body
);
1838 /* Evaluate the string length expression. */
1839 gfc_trans_init_string_length (cl
, &body
);
1841 gfc_add_expr_to_block (&body
, fnbody
);
1842 return gfc_finish_block (&body
);
1846 /* Allocate and cleanup an automatic character variable. */
1849 gfc_trans_auto_character_variable (gfc_symbol
* sym
, tree fnbody
)
1855 gcc_assert (sym
->backend_decl
);
1856 gcc_assert (sym
->ts
.cl
&& sym
->ts
.cl
->length
);
1858 gfc_start_block (&body
);
1860 /* Evaluate the string length expression. */
1861 gfc_trans_init_string_length (sym
->ts
.cl
, &body
);
1863 decl
= sym
->backend_decl
;
1865 /* Emit a DECL_EXPR for this variable, which will cause the
1866 gimplifier to allocate storage, and all that good stuff. */
1867 tmp
= build1 (DECL_EXPR
, TREE_TYPE (decl
), decl
);
1868 gfc_add_expr_to_block (&body
, tmp
);
1870 gfc_add_expr_to_block (&body
, fnbody
);
1871 return gfc_finish_block (&body
);
1875 /* Generate function entry and exit code, and add it to the function body.
1877 Allocation and initialization of array variables.
1878 Allocation of character string variables.
1879 Initialization and possibly repacking of dummy arrays. */
1882 gfc_trans_deferred_vars (gfc_symbol
* proc_sym
, tree fnbody
)
1887 /* Deal with implicit return variables. Explicit return variables will
1888 already have been added. */
1889 if (gfc_return_by_reference (proc_sym
) && proc_sym
->result
== proc_sym
)
1891 if (!current_fake_result_decl
)
1893 warning ("Function does not return a value");
1899 fnbody
= gfc_trans_dummy_array_bias (proc_sym
,
1900 current_fake_result_decl
,
1903 else if (proc_sym
->ts
.type
== BT_CHARACTER
)
1905 if (TREE_CODE (proc_sym
->ts
.cl
->backend_decl
) == VAR_DECL
)
1906 fnbody
= gfc_trans_dummy_character (proc_sym
->ts
.cl
, fnbody
);
1909 gfc_todo_error ("Deferred non-array return by reference");
1912 for (sym
= proc_sym
->tlink
; sym
!= proc_sym
; sym
= sym
->tlink
)
1914 if (sym
->attr
.dimension
)
1916 switch (sym
->as
->type
)
1919 if (sym
->attr
.dummy
|| sym
->attr
.result
)
1921 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, fnbody
);
1922 else if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
1924 if (TREE_STATIC (sym
->backend_decl
))
1925 gfc_trans_static_array_pointer (sym
);
1927 fnbody
= gfc_trans_deferred_array (sym
, fnbody
);
1931 gfc_get_backend_locus (&loc
);
1932 gfc_set_backend_locus (&sym
->declared_at
);
1933 fnbody
= gfc_trans_auto_array_allocation (sym
->backend_decl
,
1935 gfc_set_backend_locus (&loc
);
1939 case AS_ASSUMED_SIZE
:
1940 /* Must be a dummy parameter. */
1941 gcc_assert (sym
->attr
.dummy
);
1943 /* We should always pass assumed size arrays the g77 way. */
1944 fnbody
= gfc_trans_g77_array (sym
, fnbody
);
1947 case AS_ASSUMED_SHAPE
:
1948 /* Must be a dummy parameter. */
1949 gcc_assert (sym
->attr
.dummy
);
1951 fnbody
= gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
,
1956 fnbody
= gfc_trans_deferred_array (sym
, fnbody
);
1963 else if (sym
->ts
.type
== BT_CHARACTER
)
1965 gfc_get_backend_locus (&loc
);
1966 gfc_set_backend_locus (&sym
->declared_at
);
1967 if (sym
->attr
.dummy
|| sym
->attr
.result
)
1968 fnbody
= gfc_trans_dummy_character (sym
->ts
.cl
, fnbody
);
1970 fnbody
= gfc_trans_auto_character_variable (sym
, fnbody
);
1971 gfc_set_backend_locus (&loc
);
1981 /* Output an initialized decl for a module variable. */
1984 gfc_create_module_variable (gfc_symbol
* sym
)
1988 /* Only output symbols from this module. */
1989 if (sym
->ns
!= module_namespace
)
1991 /* I don't think this should ever happen. */
1992 internal_error ("module symbol %s in wrong namespace", sym
->name
);
1995 /* Only output variables and array valued parameters. */
1996 if (sym
->attr
.flavor
!= FL_VARIABLE
1997 && (sym
->attr
.flavor
!= FL_PARAMETER
|| sym
->attr
.dimension
== 0))
2000 /* Don't generate variables from other modules. Variables from
2001 COMMONs will already have been generated. */
2002 if (sym
->attr
.use_assoc
|| sym
->attr
.in_common
)
2005 if (sym
->backend_decl
)
2006 internal_error ("backend decl for module variable %s already exists",
2009 /* We always want module variables to be created. */
2010 sym
->attr
.referenced
= 1;
2011 /* Create the decl. */
2012 decl
= gfc_get_symbol_decl (sym
);
2014 /* Create the variable. */
2016 rest_of_decl_compilation (decl
, 1, 0);
2018 /* Also add length of strings. */
2019 if (sym
->ts
.type
== BT_CHARACTER
)
2023 length
= sym
->ts
.cl
->backend_decl
;
2024 if (!INTEGER_CST_P (length
))
2027 rest_of_decl_compilation (length
, 1, 0);
2033 /* Generate all the required code for module variables. */
2036 gfc_generate_module_vars (gfc_namespace
* ns
)
2038 module_namespace
= ns
;
2040 /* Check if the frontend left the namespace in a reasonable state. */
2041 gcc_assert (ns
->proc_name
&& !ns
->proc_name
->tlink
);
2043 /* Generate COMMON blocks. */
2044 gfc_trans_common (ns
);
2046 /* Create decls for all the module variables. */
2047 gfc_traverse_ns (ns
, gfc_create_module_variable
);
2051 gfc_generate_contained_functions (gfc_namespace
* parent
)
2055 /* We create all the prototypes before generating any code. */
2056 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
2058 /* Skip namespaces from used modules. */
2059 if (ns
->parent
!= parent
)
2062 gfc_create_function_decl (ns
);
2065 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
2067 /* Skip namespaces from used modules. */
2068 if (ns
->parent
!= parent
)
2071 gfc_generate_function_code (ns
);
2076 /* Generate decls for all local variables. We do this to ensure correct
2077 handling of expressions which only appear in the specification of
2081 generate_local_decl (gfc_symbol
* sym
)
2083 if (sym
->attr
.flavor
== FL_VARIABLE
)
2085 if (sym
->attr
.referenced
)
2086 gfc_get_symbol_decl (sym
);
2087 else if (sym
->attr
.dummy
&& warn_unused_parameter
)
2088 warning ("unused parameter %qs", sym
->name
);
2089 /* Warn for unused variables, but not if they're inside a common
2090 block or are use-associated. */
2091 else if (warn_unused_variable
2092 && !(sym
->attr
.in_common
|| sym
->attr
.use_assoc
))
2093 warning ("unused variable %qs", sym
->name
);
2098 generate_local_vars (gfc_namespace
* ns
)
2100 gfc_traverse_ns (ns
, generate_local_decl
);
2104 /* Generate a switch statement to jump to the correct entry point. Also
2105 creates the label decls for the entry points. */
2108 gfc_trans_entry_master_switch (gfc_entry_list
* el
)
2115 gfc_init_block (&block
);
2116 for (; el
; el
= el
->next
)
2118 /* Add the case label. */
2119 label
= gfc_build_label_decl (NULL_TREE
);
2120 val
= build_int_cst (gfc_array_index_type
, el
->id
);
2121 tmp
= build3_v (CASE_LABEL_EXPR
, val
, NULL_TREE
, label
);
2122 gfc_add_expr_to_block (&block
, tmp
);
2124 /* And jump to the actual entry point. */
2125 label
= gfc_build_label_decl (NULL_TREE
);
2126 tmp
= build1_v (GOTO_EXPR
, label
);
2127 gfc_add_expr_to_block (&block
, tmp
);
2129 /* Save the label decl. */
2132 tmp
= gfc_finish_block (&block
);
2133 /* The first argument selects the entry point. */
2134 val
= DECL_ARGUMENTS (current_function_decl
);
2135 tmp
= build3_v (SWITCH_EXPR
, val
, tmp
, NULL_TREE
);
2140 /* Generate code for a function. */
2143 gfc_generate_function_code (gfc_namespace
* ns
)
2154 sym
= ns
->proc_name
;
2156 /* Check that the frontend isn't still using this. */
2157 gcc_assert (sym
->tlink
== NULL
);
2160 /* Create the declaration for functions with global scope. */
2161 if (!sym
->backend_decl
)
2162 gfc_create_function_decl (ns
);
2164 fndecl
= sym
->backend_decl
;
2165 old_context
= current_function_decl
;
2169 push_function_context ();
2170 saved_parent_function_decls
= saved_function_decls
;
2171 saved_function_decls
= NULL_TREE
;
2174 trans_function_start (sym
);
2176 /* Will be created as needed. */
2177 current_fake_result_decl
= NULL_TREE
;
2179 gfc_start_block (&block
);
2181 gfc_generate_contained_functions (ns
);
2183 /* Translate COMMON blocks. */
2184 gfc_trans_common (ns
);
2186 generate_local_vars (ns
);
2188 current_function_return_label
= NULL
;
2190 /* Now generate the code for the body of this function. */
2191 gfc_init_block (&body
);
2193 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
2194 && sym
->attr
.subroutine
)
2196 tree alternate_return
;
2197 alternate_return
= gfc_get_fake_result_decl (sym
);
2198 gfc_add_modify_expr (&body
, alternate_return
, integer_zero_node
);
2203 /* Jump to the correct entry point. */
2204 tmp
= gfc_trans_entry_master_switch (ns
->entries
);
2205 gfc_add_expr_to_block (&body
, tmp
);
2208 tmp
= gfc_trans_code (ns
->code
);
2209 gfc_add_expr_to_block (&body
, tmp
);
2211 /* Add a return label if needed. */
2212 if (current_function_return_label
)
2214 tmp
= build1_v (LABEL_EXPR
, current_function_return_label
);
2215 gfc_add_expr_to_block (&body
, tmp
);
2218 tmp
= gfc_finish_block (&body
);
2219 /* Add code to create and cleanup arrays. */
2220 tmp
= gfc_trans_deferred_vars (sym
, tmp
);
2221 gfc_add_expr_to_block (&block
, tmp
);
2223 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
)
2225 if (sym
->attr
.subroutine
|| sym
== sym
->result
)
2227 result
= current_fake_result_decl
;
2228 current_fake_result_decl
= NULL_TREE
;
2231 result
= sym
->result
->backend_decl
;
2233 if (result
== NULL_TREE
)
2234 warning ("Function return value not set");
2237 /* Set the return value to the dummy result variable. */
2238 tmp
= build2 (MODIFY_EXPR
, TREE_TYPE (result
),
2239 DECL_RESULT (fndecl
), result
);
2240 tmp
= build1_v (RETURN_EXPR
, tmp
);
2241 gfc_add_expr_to_block (&block
, tmp
);
2245 /* Add all the decls we created during processing. */
2246 decl
= saved_function_decls
;
2251 next
= TREE_CHAIN (decl
);
2252 TREE_CHAIN (decl
) = NULL_TREE
;
2256 saved_function_decls
= NULL_TREE
;
2258 DECL_SAVED_TREE (fndecl
) = gfc_finish_block (&block
);
2260 /* Finish off this function and send it for code generation. */
2262 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
2264 /* Output the GENERIC tree. */
2265 dump_function (TDI_original
, fndecl
);
2267 /* Store the end of the function, so that we get good line number
2268 info for the epilogue. */
2269 cfun
->function_end_locus
= input_location
;
2271 /* We're leaving the context of this function, so zap cfun.
2272 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2273 tree_rest_of_compilation. */
2278 pop_function_context ();
2279 saved_function_decls
= saved_parent_function_decls
;
2281 current_function_decl
= old_context
;
2283 if (decl_function_context (fndecl
))
2284 /* Register this function with cgraph just far enough to get it
2285 added to our parent's nested function list. */
2286 (void) cgraph_node (fndecl
);
2289 gfc_gimplify_function (fndecl
);
2290 cgraph_finalize_function (fndecl
, false);
2295 gfc_generate_constructors (void)
2297 gcc_assert (gfc_static_ctors
== NULL_TREE
);
2305 if (gfc_static_ctors
== NULL_TREE
)
2308 fnname
= get_file_function_name ('I');
2309 type
= build_function_type (void_type_node
,
2310 gfc_chainon_list (NULL_TREE
, void_type_node
));
2312 fndecl
= build_decl (FUNCTION_DECL
, fnname
, type
);
2313 TREE_PUBLIC (fndecl
) = 1;
2315 decl
= build_decl (RESULT_DECL
, NULL_TREE
, void_type_node
);
2316 DECL_ARTIFICIAL (decl
) = 1;
2317 DECL_IGNORED_P (decl
) = 1;
2318 DECL_CONTEXT (decl
) = fndecl
;
2319 DECL_RESULT (fndecl
) = decl
;
2323 current_function_decl
= fndecl
;
2325 rest_of_decl_compilation (fndecl
, 1, 0);
2327 make_decl_rtl (fndecl
);
2329 init_function_start (fndecl
);
2333 for (; gfc_static_ctors
; gfc_static_ctors
= TREE_CHAIN (gfc_static_ctors
))
2336 gfc_build_function_call (TREE_VALUE (gfc_static_ctors
), NULL_TREE
);
2337 DECL_SAVED_TREE (fndecl
) = build_stmt (EXPR_STMT
, tmp
);
2342 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
2344 free_after_parsing (cfun
);
2345 free_after_compilation (cfun
);
2347 tree_rest_of_compilation (fndecl
);
2349 current_function_decl
= NULL_TREE
;
2353 /* Translates a BLOCK DATA program unit. This means emitting the
2354 commons contained therein plus their initializations. We also emit
2355 a globally visible symbol to make sure that each BLOCK DATA program
2356 unit remains unique. */
2359 gfc_generate_block_data (gfc_namespace
* ns
)
2364 /* Tell the backend the source location of the block data. */
2366 gfc_set_backend_locus (&ns
->proc_name
->declared_at
);
2368 gfc_set_backend_locus (&gfc_current_locus
);
2370 /* Process the DATA statements. */
2371 gfc_trans_common (ns
);
2373 /* Create a global symbol with the mane of the block data. This is to
2374 generate linker errors if the same name is used twice. It is never
2377 id
= gfc_sym_mangled_function_id (ns
->proc_name
);
2379 id
= get_identifier ("__BLOCK_DATA__");
2381 decl
= build_decl (VAR_DECL
, id
, gfc_array_index_type
);
2382 TREE_PUBLIC (decl
) = 1;
2383 TREE_STATIC (decl
) = 1;
2386 rest_of_decl_compilation (decl
, 1, 0);
2389 #include "gt-fortran-trans-decl.h"