1 /* Backend function setup
2 Copyright (C) 2002-2013 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* trans-decl.c -- Handling of backend function and variable decls, etc */
25 #include "coretypes.h"
28 #include "tree-dump.h"
29 #include "gimple.h" /* For create_tmp_var_raw. */
31 #include "diagnostic-core.h" /* For internal_error. */
32 #include "toplev.h" /* For announce_function. */
39 #include "pointer-set.h"
40 #include "constructor.h"
42 #include "trans-types.h"
43 #include "trans-array.h"
44 #include "trans-const.h"
45 /* Only for gfc_trans_code. Shouldn't need to include this. */
46 #include "trans-stmt.h"
48 #define MAX_LABEL_VALUE 99999
51 /* Holds the result of the function if no result variable specified. */
53 static GTY(()) tree current_fake_result_decl
;
54 static GTY(()) tree parent_fake_result_decl
;
57 /* Holds the variable DECLs for the current function. */
59 static GTY(()) tree saved_function_decls
;
60 static GTY(()) tree saved_parent_function_decls
;
62 static struct pointer_set_t
*nonlocal_dummy_decl_pset
;
63 static GTY(()) tree nonlocal_dummy_decls
;
65 /* Holds the variable DECLs that are locals. */
67 static GTY(()) tree saved_local_decls
;
69 /* The namespace of the module we're currently generating. Only used while
70 outputting decls for module variables. Do not rely on this being set. */
72 static gfc_namespace
*module_namespace
;
74 /* The currently processed procedure symbol. */
75 static gfc_symbol
* current_procedure_symbol
= NULL
;
78 /* With -fcoarray=lib: For generating the registering call
79 of static coarrays. */
80 static bool has_coarray_vars
;
81 static stmtblock_t caf_init_block
;
84 /* List of static constructor functions. */
86 tree gfc_static_ctors
;
89 /* Function declarations for builtin library functions. */
91 tree gfor_fndecl_pause_numeric
;
92 tree gfor_fndecl_pause_string
;
93 tree gfor_fndecl_stop_numeric
;
94 tree gfor_fndecl_stop_numeric_f08
;
95 tree gfor_fndecl_stop_string
;
96 tree gfor_fndecl_error_stop_numeric
;
97 tree gfor_fndecl_error_stop_string
;
98 tree gfor_fndecl_runtime_error
;
99 tree gfor_fndecl_runtime_error_at
;
100 tree gfor_fndecl_runtime_warning_at
;
101 tree gfor_fndecl_os_error
;
102 tree gfor_fndecl_generate_error
;
103 tree gfor_fndecl_set_args
;
104 tree gfor_fndecl_set_fpe
;
105 tree gfor_fndecl_set_options
;
106 tree gfor_fndecl_set_convert
;
107 tree gfor_fndecl_set_record_marker
;
108 tree gfor_fndecl_set_max_subrecord_length
;
109 tree gfor_fndecl_ctime
;
110 tree gfor_fndecl_fdate
;
111 tree gfor_fndecl_ttynam
;
112 tree gfor_fndecl_in_pack
;
113 tree gfor_fndecl_in_unpack
;
114 tree gfor_fndecl_associated
;
117 /* Coarray run-time library function decls. */
118 tree gfor_fndecl_caf_init
;
119 tree gfor_fndecl_caf_finalize
;
120 tree gfor_fndecl_caf_register
;
121 tree gfor_fndecl_caf_deregister
;
122 tree gfor_fndecl_caf_critical
;
123 tree gfor_fndecl_caf_end_critical
;
124 tree gfor_fndecl_caf_sync_all
;
125 tree gfor_fndecl_caf_sync_images
;
126 tree gfor_fndecl_caf_error_stop
;
127 tree gfor_fndecl_caf_error_stop_str
;
129 /* Coarray global variables for num_images/this_image. */
131 tree gfort_gvar_caf_num_images
;
132 tree gfort_gvar_caf_this_image
;
135 /* Math functions. Many other math functions are handled in
136 trans-intrinsic.c. */
138 gfc_powdecl_list gfor_fndecl_math_powi
[4][3];
139 tree gfor_fndecl_math_ishftc4
;
140 tree gfor_fndecl_math_ishftc8
;
141 tree gfor_fndecl_math_ishftc16
;
144 /* String functions. */
146 tree gfor_fndecl_compare_string
;
147 tree gfor_fndecl_concat_string
;
148 tree gfor_fndecl_string_len_trim
;
149 tree gfor_fndecl_string_index
;
150 tree gfor_fndecl_string_scan
;
151 tree gfor_fndecl_string_verify
;
152 tree gfor_fndecl_string_trim
;
153 tree gfor_fndecl_string_minmax
;
154 tree gfor_fndecl_adjustl
;
155 tree gfor_fndecl_adjustr
;
156 tree gfor_fndecl_select_string
;
157 tree gfor_fndecl_compare_string_char4
;
158 tree gfor_fndecl_concat_string_char4
;
159 tree gfor_fndecl_string_len_trim_char4
;
160 tree gfor_fndecl_string_index_char4
;
161 tree gfor_fndecl_string_scan_char4
;
162 tree gfor_fndecl_string_verify_char4
;
163 tree gfor_fndecl_string_trim_char4
;
164 tree gfor_fndecl_string_minmax_char4
;
165 tree gfor_fndecl_adjustl_char4
;
166 tree gfor_fndecl_adjustr_char4
;
167 tree gfor_fndecl_select_string_char4
;
170 /* Conversion between character kinds. */
171 tree gfor_fndecl_convert_char1_to_char4
;
172 tree gfor_fndecl_convert_char4_to_char1
;
175 /* Other misc. runtime library functions. */
176 tree gfor_fndecl_size0
;
177 tree gfor_fndecl_size1
;
178 tree gfor_fndecl_iargc
;
180 /* Intrinsic functions implemented in Fortran. */
181 tree gfor_fndecl_sc_kind
;
182 tree gfor_fndecl_si_kind
;
183 tree gfor_fndecl_sr_kind
;
185 /* BLAS gemm functions. */
186 tree gfor_fndecl_sgemm
;
187 tree gfor_fndecl_dgemm
;
188 tree gfor_fndecl_cgemm
;
189 tree gfor_fndecl_zgemm
;
193 gfc_add_decl_to_parent_function (tree decl
)
196 DECL_CONTEXT (decl
) = DECL_CONTEXT (current_function_decl
);
197 DECL_NONLOCAL (decl
) = 1;
198 DECL_CHAIN (decl
) = saved_parent_function_decls
;
199 saved_parent_function_decls
= decl
;
203 gfc_add_decl_to_function (tree decl
)
206 TREE_USED (decl
) = 1;
207 DECL_CONTEXT (decl
) = current_function_decl
;
208 DECL_CHAIN (decl
) = saved_function_decls
;
209 saved_function_decls
= decl
;
213 add_decl_as_local (tree decl
)
216 TREE_USED (decl
) = 1;
217 DECL_CONTEXT (decl
) = current_function_decl
;
218 DECL_CHAIN (decl
) = saved_local_decls
;
219 saved_local_decls
= decl
;
223 /* Build a backend label declaration. Set TREE_USED for named labels.
224 The context of the label is always the current_function_decl. All
225 labels are marked artificial. */
228 gfc_build_label_decl (tree label_id
)
230 /* 2^32 temporaries should be enough. */
231 static unsigned int tmp_num
= 1;
235 if (label_id
== NULL_TREE
)
237 /* Build an internal label name. */
238 ASM_FORMAT_PRIVATE_NAME (label_name
, "L", tmp_num
++);
239 label_id
= get_identifier (label_name
);
244 /* Build the LABEL_DECL node. Labels have no type. */
245 label_decl
= build_decl (input_location
,
246 LABEL_DECL
, label_id
, void_type_node
);
247 DECL_CONTEXT (label_decl
) = current_function_decl
;
248 DECL_MODE (label_decl
) = VOIDmode
;
250 /* We always define the label as used, even if the original source
251 file never references the label. We don't want all kinds of
252 spurious warnings for old-style Fortran code with too many
254 TREE_USED (label_decl
) = 1;
256 DECL_ARTIFICIAL (label_decl
) = 1;
261 /* Set the backend source location of a decl. */
264 gfc_set_decl_location (tree decl
, locus
* loc
)
266 DECL_SOURCE_LOCATION (decl
) = loc
->lb
->location
;
270 /* Return the backend label declaration for a given label structure,
271 or create it if it doesn't exist yet. */
274 gfc_get_label_decl (gfc_st_label
* lp
)
276 if (lp
->backend_decl
)
277 return lp
->backend_decl
;
280 char label_name
[GFC_MAX_SYMBOL_LEN
+ 1];
283 /* Validate the label declaration from the front end. */
284 gcc_assert (lp
!= NULL
&& lp
->value
<= MAX_LABEL_VALUE
);
286 /* Build a mangled name for the label. */
287 sprintf (label_name
, "__label_%.6d", lp
->value
);
289 /* Build the LABEL_DECL node. */
290 label_decl
= gfc_build_label_decl (get_identifier (label_name
));
292 /* Tell the debugger where the label came from. */
293 if (lp
->value
<= MAX_LABEL_VALUE
) /* An internal label. */
294 gfc_set_decl_location (label_decl
, &lp
->where
);
296 DECL_ARTIFICIAL (label_decl
) = 1;
298 /* Store the label in the label list and return the LABEL_DECL. */
299 lp
->backend_decl
= label_decl
;
305 /* Convert a gfc_symbol to an identifier of the same name. */
308 gfc_sym_identifier (gfc_symbol
* sym
)
310 if (sym
->attr
.is_main_program
&& strcmp (sym
->name
, "main") == 0)
311 return (get_identifier ("MAIN__"));
313 return (get_identifier (sym
->name
));
317 /* Construct mangled name from symbol name. */
320 gfc_sym_mangled_identifier (gfc_symbol
* sym
)
322 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 1];
324 /* Prevent the mangling of identifiers that have an assigned
325 binding label (mainly those that are bind(c)). */
326 if (sym
->attr
.is_bind_c
== 1 && sym
->binding_label
)
327 return get_identifier (sym
->binding_label
);
329 if (sym
->module
== NULL
)
330 return gfc_sym_identifier (sym
);
333 snprintf (name
, sizeof name
, "__%s_MOD_%s", sym
->module
, sym
->name
);
334 return get_identifier (name
);
339 /* Construct mangled function name from symbol name. */
342 gfc_sym_mangled_function_id (gfc_symbol
* sym
)
345 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 1];
347 /* It may be possible to simply use the binding label if it's
348 provided, and remove the other checks. Then we could use it
349 for other things if we wished. */
350 if ((sym
->attr
.is_bind_c
== 1 || sym
->attr
.is_iso_c
== 1) &&
352 /* use the binding label rather than the mangled name */
353 return get_identifier (sym
->binding_label
);
355 if (sym
->module
== NULL
|| sym
->attr
.proc
== PROC_EXTERNAL
356 || (sym
->module
!= NULL
&& (sym
->attr
.external
357 || sym
->attr
.if_source
== IFSRC_IFBODY
)))
359 /* Main program is mangled into MAIN__. */
360 if (sym
->attr
.is_main_program
)
361 return get_identifier ("MAIN__");
363 /* Intrinsic procedures are never mangled. */
364 if (sym
->attr
.proc
== PROC_INTRINSIC
)
365 return get_identifier (sym
->name
);
367 if (gfc_option
.flag_underscoring
)
369 has_underscore
= strchr (sym
->name
, '_') != 0;
370 if (gfc_option
.flag_second_underscore
&& has_underscore
)
371 snprintf (name
, sizeof name
, "%s__", sym
->name
);
373 snprintf (name
, sizeof name
, "%s_", sym
->name
);
374 return get_identifier (name
);
377 return get_identifier (sym
->name
);
381 snprintf (name
, sizeof name
, "__%s_MOD_%s", sym
->module
, sym
->name
);
382 return get_identifier (name
);
388 gfc_set_decl_assembler_name (tree decl
, tree name
)
390 tree target_mangled
= targetm
.mangle_decl_assembler_name (decl
, name
);
391 SET_DECL_ASSEMBLER_NAME (decl
, target_mangled
);
395 /* Returns true if a variable of specified size should go on the stack. */
398 gfc_can_put_var_on_stack (tree size
)
400 unsigned HOST_WIDE_INT low
;
402 if (!INTEGER_CST_P (size
))
405 if (gfc_option
.flag_max_stack_var_size
< 0)
408 if (TREE_INT_CST_HIGH (size
) != 0)
411 low
= TREE_INT_CST_LOW (size
);
412 if (low
> (unsigned HOST_WIDE_INT
) gfc_option
.flag_max_stack_var_size
)
415 /* TODO: Set a per-function stack size limit. */
421 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
422 an expression involving its corresponding pointer. There are
423 2 cases; one for variable size arrays, and one for everything else,
424 because variable-sized arrays require one fewer level of
428 gfc_finish_cray_pointee (tree decl
, gfc_symbol
*sym
)
430 tree ptr_decl
= gfc_get_symbol_decl (sym
->cp_pointer
);
433 /* Parameters need to be dereferenced. */
434 if (sym
->cp_pointer
->attr
.dummy
)
435 ptr_decl
= build_fold_indirect_ref_loc (input_location
,
438 /* Check to see if we're dealing with a variable-sized array. */
439 if (sym
->attr
.dimension
440 && TREE_CODE (TREE_TYPE (decl
)) == POINTER_TYPE
)
442 /* These decls will be dereferenced later, so we don't dereference
444 value
= convert (TREE_TYPE (decl
), ptr_decl
);
448 ptr_decl
= convert (build_pointer_type (TREE_TYPE (decl
)),
450 value
= build_fold_indirect_ref_loc (input_location
,
454 SET_DECL_VALUE_EXPR (decl
, value
);
455 DECL_HAS_VALUE_EXPR_P (decl
) = 1;
456 GFC_DECL_CRAY_POINTEE (decl
) = 1;
460 /* Finish processing of a declaration without an initial value. */
463 gfc_finish_decl (tree decl
)
465 gcc_assert (TREE_CODE (decl
) == PARM_DECL
466 || DECL_INITIAL (decl
) == NULL_TREE
);
468 if (TREE_CODE (decl
) != VAR_DECL
)
471 if (DECL_SIZE (decl
) == NULL_TREE
472 && TYPE_SIZE (TREE_TYPE (decl
)) != NULL_TREE
)
473 layout_decl (decl
, 0);
475 /* A few consistency checks. */
476 /* A static variable with an incomplete type is an error if it is
477 initialized. Also if it is not file scope. Otherwise, let it
478 through, but if it is not `extern' then it may cause an error
480 /* An automatic variable with an incomplete type is an error. */
482 /* We should know the storage size. */
483 gcc_assert (DECL_SIZE (decl
) != NULL_TREE
484 || (TREE_STATIC (decl
)
485 ? (!DECL_INITIAL (decl
) || !DECL_CONTEXT (decl
))
486 : DECL_EXTERNAL (decl
)));
488 /* The storage size should be constant. */
489 gcc_assert ((!DECL_EXTERNAL (decl
) && !TREE_STATIC (decl
))
491 || TREE_CODE (DECL_SIZE (decl
)) == INTEGER_CST
);
495 /* Apply symbol attributes to a variable, and add it to the function scope. */
498 gfc_finish_var_decl (tree decl
, gfc_symbol
* sym
)
501 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
502 This is the equivalent of the TARGET variables.
503 We also need to set this if the variable is passed by reference in a
506 /* Set DECL_VALUE_EXPR for Cray Pointees. */
507 if (sym
->attr
.cray_pointee
)
508 gfc_finish_cray_pointee (decl
, sym
);
510 if (sym
->attr
.target
)
511 TREE_ADDRESSABLE (decl
) = 1;
512 /* If it wasn't used we wouldn't be getting it. */
513 TREE_USED (decl
) = 1;
515 if (sym
->attr
.flavor
== FL_PARAMETER
516 && (sym
->attr
.dimension
|| sym
->ts
.type
== BT_DERIVED
))
517 TREE_READONLY (decl
) = 1;
519 /* Chain this decl to the pending declarations. Don't do pushdecl()
520 because this would add them to the current scope rather than the
522 if (current_function_decl
!= NULL_TREE
)
524 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
525 || sym
->result
== sym
)
526 gfc_add_decl_to_function (decl
);
527 else if (sym
->ns
->proc_name
->attr
.flavor
== FL_LABEL
)
528 /* This is a BLOCK construct. */
529 add_decl_as_local (decl
);
531 gfc_add_decl_to_parent_function (decl
);
534 if (sym
->attr
.cray_pointee
)
537 if(sym
->attr
.is_bind_c
== 1 && sym
->binding_label
)
539 /* We need to put variables that are bind(c) into the common
540 segment of the object file, because this is what C would do.
541 gfortran would typically put them in either the BSS or
542 initialized data segments, and only mark them as common if
543 they were part of common blocks. However, if they are not put
544 into common space, then C cannot initialize global Fortran
545 variables that it interoperates with and the draft says that
546 either Fortran or C should be able to initialize it (but not
547 both, of course.) (J3/04-007, section 15.3). */
548 TREE_PUBLIC(decl
) = 1;
549 DECL_COMMON(decl
) = 1;
552 /* If a variable is USE associated, it's always external. */
553 if (sym
->attr
.use_assoc
)
555 DECL_EXTERNAL (decl
) = 1;
556 TREE_PUBLIC (decl
) = 1;
558 else if (sym
->module
&& !sym
->attr
.result
&& !sym
->attr
.dummy
)
560 /* TODO: Don't set sym->module for result or dummy variables. */
561 gcc_assert (current_function_decl
== NULL_TREE
|| sym
->result
== sym
);
562 /* This is the declaration of a module variable. */
563 if (sym
->attr
.access
== ACCESS_UNKNOWN
564 && (sym
->ns
->default_access
== ACCESS_PRIVATE
565 || (sym
->ns
->default_access
== ACCESS_UNKNOWN
566 && gfc_option
.flag_module_private
)))
567 sym
->attr
.access
= ACCESS_PRIVATE
;
569 if (sym
->attr
.access
!= ACCESS_PRIVATE
|| sym
->attr
.public_used
)
570 TREE_PUBLIC (decl
) = 1;
571 TREE_STATIC (decl
) = 1;
574 /* Derived types are a bit peculiar because of the possibility of
575 a default initializer; this must be applied each time the variable
576 comes into scope it therefore need not be static. These variables
577 are SAVE_NONE but have an initializer. Otherwise explicitly
578 initialized variables are SAVE_IMPLICIT and explicitly saved are
580 if (!sym
->attr
.use_assoc
581 && (sym
->attr
.save
!= SAVE_NONE
|| sym
->attr
.data
582 || (sym
->value
&& sym
->ns
->proc_name
->attr
.is_main_program
)
583 || (gfc_option
.coarray
== GFC_FCOARRAY_LIB
584 && sym
->attr
.codimension
&& !sym
->attr
.allocatable
)))
585 TREE_STATIC (decl
) = 1;
587 if (sym
->attr
.volatile_
)
589 TREE_THIS_VOLATILE (decl
) = 1;
590 TREE_SIDE_EFFECTS (decl
) = 1;
591 new_type
= build_qualified_type (TREE_TYPE (decl
), TYPE_QUAL_VOLATILE
);
592 TREE_TYPE (decl
) = new_type
;
595 /* Keep variables larger than max-stack-var-size off stack. */
596 if (!sym
->ns
->proc_name
->attr
.recursive
597 && INTEGER_CST_P (DECL_SIZE_UNIT (decl
))
598 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl
))
599 /* Put variable length auto array pointers always into stack. */
600 && (TREE_CODE (TREE_TYPE (decl
)) != POINTER_TYPE
601 || sym
->attr
.dimension
== 0
602 || sym
->as
->type
!= AS_EXPLICIT
604 || sym
->attr
.allocatable
)
605 && !DECL_ARTIFICIAL (decl
))
606 TREE_STATIC (decl
) = 1;
608 /* Handle threadprivate variables. */
609 if (sym
->attr
.threadprivate
610 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
611 DECL_TLS_MODEL (decl
) = decl_default_tls_model (decl
);
615 /* Allocate the lang-specific part of a decl. */
618 gfc_allocate_lang_decl (tree decl
)
620 DECL_LANG_SPECIFIC (decl
) = ggc_alloc_cleared_lang_decl(sizeof
624 /* Remember a symbol to generate initialization/cleanup code at function
628 gfc_defer_symbol_init (gfc_symbol
* sym
)
634 /* Don't add a symbol twice. */
638 last
= head
= sym
->ns
->proc_name
;
641 /* Make sure that setup code for dummy variables which are used in the
642 setup of other variables is generated first. */
645 /* Find the first dummy arg seen after us, or the first non-dummy arg.
646 This is a circular list, so don't go past the head. */
648 && (!p
->attr
.dummy
|| p
->dummy_order
> sym
->dummy_order
))
654 /* Insert in between last and p. */
660 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
661 backend_decl for a module symbol, if it all ready exists. If the
662 module gsymbol does not exist, it is created. If the symbol does
663 not exist, it is added to the gsymbol namespace. Returns true if
664 an existing backend_decl is found. */
667 gfc_get_module_backend_decl (gfc_symbol
*sym
)
673 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->module
);
675 if (!gsym
|| (gsym
->ns
&& gsym
->type
== GSYM_MODULE
))
681 gfc_find_symbol (sym
->name
, gsym
->ns
, 0, &s
);
687 gsym
= gfc_get_gsymbol (sym
->module
);
688 gsym
->type
= GSYM_MODULE
;
689 gsym
->ns
= gfc_get_namespace (NULL
, 0);
692 st
= gfc_new_symtree (&gsym
->ns
->sym_root
, sym
->name
);
696 else if (sym
->attr
.flavor
== FL_DERIVED
)
698 if (s
&& s
->attr
.flavor
== FL_PROCEDURE
)
701 gcc_assert (s
->attr
.generic
);
702 for (intr
= s
->generic
; intr
; intr
= intr
->next
)
703 if (intr
->sym
->attr
.flavor
== FL_DERIVED
)
710 if (!s
->backend_decl
)
711 s
->backend_decl
= gfc_get_derived_type (s
);
712 gfc_copy_dt_decls_ifequal (s
, sym
, true);
715 else if (s
->backend_decl
)
717 if (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
)
718 gfc_copy_dt_decls_ifequal (s
->ts
.u
.derived
, sym
->ts
.u
.derived
,
720 else if (sym
->ts
.type
== BT_CHARACTER
)
721 sym
->ts
.u
.cl
->backend_decl
= s
->ts
.u
.cl
->backend_decl
;
722 sym
->backend_decl
= s
->backend_decl
;
730 /* Create an array index type variable with function scope. */
733 create_index_var (const char * pfx
, int nest
)
737 decl
= gfc_create_var_np (gfc_array_index_type
, pfx
);
739 gfc_add_decl_to_parent_function (decl
);
741 gfc_add_decl_to_function (decl
);
746 /* Create variables to hold all the non-constant bits of info for a
747 descriptorless array. Remember these in the lang-specific part of the
751 gfc_build_qualified_array (tree decl
, gfc_symbol
* sym
)
756 gfc_namespace
* procns
;
758 type
= TREE_TYPE (decl
);
760 /* We just use the descriptor, if there is one. */
761 if (GFC_DESCRIPTOR_TYPE_P (type
))
764 gcc_assert (GFC_ARRAY_TYPE_P (type
));
765 procns
= gfc_find_proc_namespace (sym
->ns
);
766 nest
= (procns
->proc_name
->backend_decl
!= current_function_decl
)
767 && !sym
->attr
.contained
;
769 if (sym
->attr
.codimension
&& gfc_option
.coarray
== GFC_FCOARRAY_LIB
770 && sym
->as
->type
!= AS_ASSUMED_SHAPE
771 && GFC_TYPE_ARRAY_CAF_TOKEN (type
) == NULL_TREE
)
775 token
= gfc_create_var_np (build_qualified_type (pvoid_type_node
,
778 GFC_TYPE_ARRAY_CAF_TOKEN (type
) = token
;
779 DECL_ARTIFICIAL (token
) = 1;
780 TREE_STATIC (token
) = 1;
781 gfc_add_decl_to_function (token
);
784 for (dim
= 0; dim
< GFC_TYPE_ARRAY_RANK (type
); dim
++)
786 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
788 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
789 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type
, dim
)) = 1;
791 /* Don't try to use the unknown bound for assumed shape arrays. */
792 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
793 && (sym
->as
->type
!= AS_ASSUMED_SIZE
794 || dim
< GFC_TYPE_ARRAY_RANK (type
) - 1))
796 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
797 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type
, dim
)) = 1;
800 if (GFC_TYPE_ARRAY_STRIDE (type
, dim
) == NULL_TREE
)
802 GFC_TYPE_ARRAY_STRIDE (type
, dim
) = create_index_var ("stride", nest
);
803 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type
, dim
)) = 1;
806 for (dim
= GFC_TYPE_ARRAY_RANK (type
);
807 dim
< GFC_TYPE_ARRAY_RANK (type
) + GFC_TYPE_ARRAY_CORANK (type
); dim
++)
809 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
811 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
812 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type
, dim
)) = 1;
814 /* Don't try to use the unknown ubound for the last coarray dimension. */
815 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
816 && dim
< GFC_TYPE_ARRAY_RANK (type
) + GFC_TYPE_ARRAY_CORANK (type
) - 1)
818 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
819 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type
, dim
)) = 1;
822 if (GFC_TYPE_ARRAY_OFFSET (type
) == NULL_TREE
)
824 GFC_TYPE_ARRAY_OFFSET (type
) = gfc_create_var_np (gfc_array_index_type
,
826 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type
)) = 1;
829 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type
));
831 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type
));
834 if (GFC_TYPE_ARRAY_SIZE (type
) == NULL_TREE
835 && sym
->as
->type
!= AS_ASSUMED_SIZE
)
837 GFC_TYPE_ARRAY_SIZE (type
) = create_index_var ("size", nest
);
838 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type
)) = 1;
841 if (POINTER_TYPE_P (type
))
843 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type
)));
844 gcc_assert (TYPE_LANG_SPECIFIC (type
)
845 == TYPE_LANG_SPECIFIC (TREE_TYPE (type
)));
846 type
= TREE_TYPE (type
);
849 if (! COMPLETE_TYPE_P (type
) && GFC_TYPE_ARRAY_SIZE (type
))
853 size
= fold_build2_loc (input_location
, MINUS_EXPR
, gfc_array_index_type
,
854 GFC_TYPE_ARRAY_SIZE (type
), gfc_index_one_node
);
855 range
= build_range_type (gfc_array_index_type
, gfc_index_zero_node
,
857 TYPE_DOMAIN (type
) = range
;
861 if (TYPE_NAME (type
) != NULL_TREE
862 && GFC_TYPE_ARRAY_UBOUND (type
, sym
->as
->rank
- 1) != NULL_TREE
863 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type
, sym
->as
->rank
- 1)) == VAR_DECL
)
865 tree gtype
= DECL_ORIGINAL_TYPE (TYPE_NAME (type
));
867 for (dim
= 0; dim
< sym
->as
->rank
- 1; dim
++)
869 gcc_assert (TREE_CODE (gtype
) == ARRAY_TYPE
);
870 gtype
= TREE_TYPE (gtype
);
872 gcc_assert (TREE_CODE (gtype
) == ARRAY_TYPE
);
873 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype
)) == NULL
)
874 TYPE_NAME (type
) = NULL_TREE
;
877 if (TYPE_NAME (type
) == NULL_TREE
)
879 tree gtype
= TREE_TYPE (type
), rtype
, type_decl
;
881 for (dim
= sym
->as
->rank
- 1; dim
>= 0; dim
--)
884 lbound
= GFC_TYPE_ARRAY_LBOUND (type
, dim
);
885 ubound
= GFC_TYPE_ARRAY_UBOUND (type
, dim
);
886 rtype
= build_range_type (gfc_array_index_type
, lbound
, ubound
);
887 gtype
= build_array_type (gtype
, rtype
);
888 /* Ensure the bound variables aren't optimized out at -O0.
889 For -O1 and above they often will be optimized out, but
890 can be tracked by VTA. Also set DECL_NAMELESS, so that
891 the artificial lbound.N or ubound.N DECL_NAME doesn't
892 end up in debug info. */
893 if (lbound
&& TREE_CODE (lbound
) == VAR_DECL
894 && DECL_ARTIFICIAL (lbound
) && DECL_IGNORED_P (lbound
))
896 if (DECL_NAME (lbound
)
897 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound
)),
899 DECL_NAMELESS (lbound
) = 1;
900 DECL_IGNORED_P (lbound
) = 0;
902 if (ubound
&& TREE_CODE (ubound
) == VAR_DECL
903 && DECL_ARTIFICIAL (ubound
) && DECL_IGNORED_P (ubound
))
905 if (DECL_NAME (ubound
)
906 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound
)),
908 DECL_NAMELESS (ubound
) = 1;
909 DECL_IGNORED_P (ubound
) = 0;
912 TYPE_NAME (type
) = type_decl
= build_decl (input_location
,
913 TYPE_DECL
, NULL
, gtype
);
914 DECL_ORIGINAL_TYPE (type_decl
) = gtype
;
919 /* For some dummy arguments we don't use the actual argument directly.
920 Instead we create a local decl and use that. This allows us to perform
921 initialization, and construct full type information. */
924 gfc_build_dummy_array_decl (gfc_symbol
* sym
, tree dummy
)
934 if (sym
->attr
.pointer
|| sym
->attr
.allocatable
935 || (sym
->as
&& sym
->as
->type
== AS_ASSUMED_RANK
))
938 /* Add to list of variables if not a fake result variable. */
939 if (sym
->attr
.result
|| sym
->attr
.dummy
)
940 gfc_defer_symbol_init (sym
);
942 type
= TREE_TYPE (dummy
);
943 gcc_assert (TREE_CODE (dummy
) == PARM_DECL
944 && POINTER_TYPE_P (type
));
946 /* Do we know the element size? */
947 known_size
= sym
->ts
.type
!= BT_CHARACTER
948 || INTEGER_CST_P (sym
->ts
.u
.cl
->backend_decl
);
950 if (known_size
&& !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type
)))
952 /* For descriptorless arrays with known element size the actual
953 argument is sufficient. */
954 gcc_assert (GFC_ARRAY_TYPE_P (type
));
955 gfc_build_qualified_array (dummy
, sym
);
959 type
= TREE_TYPE (type
);
960 if (GFC_DESCRIPTOR_TYPE_P (type
))
962 /* Create a descriptorless array pointer. */
966 /* Even when -frepack-arrays is used, symbols with TARGET attribute
968 if (!gfc_option
.flag_repack_arrays
|| sym
->attr
.target
)
970 if (as
->type
== AS_ASSUMED_SIZE
)
971 packed
= PACKED_FULL
;
975 if (as
->type
== AS_EXPLICIT
)
977 packed
= PACKED_FULL
;
978 for (n
= 0; n
< as
->rank
; n
++)
982 && as
->upper
[n
]->expr_type
== EXPR_CONSTANT
983 && as
->lower
[n
]->expr_type
== EXPR_CONSTANT
))
984 packed
= PACKED_PARTIAL
;
988 packed
= PACKED_PARTIAL
;
991 type
= gfc_typenode_for_spec (&sym
->ts
);
992 type
= gfc_get_nodesc_array_type (type
, sym
->as
, packed
,
997 /* We now have an expression for the element size, so create a fully
998 qualified type. Reset sym->backend decl or this will just return the
1000 DECL_ARTIFICIAL (sym
->backend_decl
) = 1;
1001 sym
->backend_decl
= NULL_TREE
;
1002 type
= gfc_sym_type (sym
);
1003 packed
= PACKED_FULL
;
1006 ASM_FORMAT_PRIVATE_NAME (name
, IDENTIFIER_POINTER (DECL_NAME (dummy
)), 0);
1007 decl
= build_decl (input_location
,
1008 VAR_DECL
, get_identifier (name
), type
);
1010 DECL_ARTIFICIAL (decl
) = 1;
1011 DECL_NAMELESS (decl
) = 1;
1012 TREE_PUBLIC (decl
) = 0;
1013 TREE_STATIC (decl
) = 0;
1014 DECL_EXTERNAL (decl
) = 0;
1016 /* We should never get deferred shape arrays here. We used to because of
1018 gcc_assert (sym
->as
->type
!= AS_DEFERRED
);
1020 if (packed
== PACKED_PARTIAL
)
1021 GFC_DECL_PARTIAL_PACKED_ARRAY (decl
) = 1;
1022 else if (packed
== PACKED_FULL
)
1023 GFC_DECL_PACKED_ARRAY (decl
) = 1;
1025 gfc_build_qualified_array (decl
, sym
);
1027 if (DECL_LANG_SPECIFIC (dummy
))
1028 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (dummy
);
1030 gfc_allocate_lang_decl (decl
);
1032 GFC_DECL_SAVED_DESCRIPTOR (decl
) = dummy
;
1034 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
1035 || sym
->attr
.contained
)
1036 gfc_add_decl_to_function (decl
);
1038 gfc_add_decl_to_parent_function (decl
);
1043 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
1044 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
1045 pointing to the artificial variable for debug info purposes. */
1048 gfc_nonlocal_dummy_array_decl (gfc_symbol
*sym
)
1052 if (! nonlocal_dummy_decl_pset
)
1053 nonlocal_dummy_decl_pset
= pointer_set_create ();
1055 if (pointer_set_insert (nonlocal_dummy_decl_pset
, sym
->backend_decl
))
1058 dummy
= GFC_DECL_SAVED_DESCRIPTOR (sym
->backend_decl
);
1059 decl
= build_decl (input_location
, VAR_DECL
, DECL_NAME (dummy
),
1060 TREE_TYPE (sym
->backend_decl
));
1061 DECL_ARTIFICIAL (decl
) = 0;
1062 TREE_USED (decl
) = 1;
1063 TREE_PUBLIC (decl
) = 0;
1064 TREE_STATIC (decl
) = 0;
1065 DECL_EXTERNAL (decl
) = 0;
1066 if (DECL_BY_REFERENCE (dummy
))
1067 DECL_BY_REFERENCE (decl
) = 1;
1068 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (sym
->backend_decl
);
1069 SET_DECL_VALUE_EXPR (decl
, sym
->backend_decl
);
1070 DECL_HAS_VALUE_EXPR_P (decl
) = 1;
1071 DECL_CONTEXT (decl
) = DECL_CONTEXT (sym
->backend_decl
);
1072 DECL_CHAIN (decl
) = nonlocal_dummy_decls
;
1073 nonlocal_dummy_decls
= decl
;
1076 /* Return a constant or a variable to use as a string length. Does not
1077 add the decl to the current scope. */
1080 gfc_create_string_length (gfc_symbol
* sym
)
1082 gcc_assert (sym
->ts
.u
.cl
);
1083 gfc_conv_const_charlen (sym
->ts
.u
.cl
);
1085 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
1090 /* The string length variable shall be in static memory if it is either
1091 explicitly SAVED, a module variable or with -fno-automatic. Only
1092 relevant is "len=:" - otherwise, it is either a constant length or
1093 it is an automatic variable. */
1094 bool static_length
= sym
->attr
.save
1095 || sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
1096 || (gfc_option
.flag_max_stack_var_size
== 0
1097 && sym
->ts
.deferred
&& !sym
->attr
.dummy
1098 && !sym
->attr
.result
&& !sym
->attr
.function
);
1100 /* Also prefix the mangled name. We need to call GFC_PREFIX for static
1101 variables as some systems do not support the "." in the assembler name.
1102 For nonstatic variables, the "." does not appear in assembler. */
1106 name
= gfc_get_string (GFC_PREFIX ("%s_MOD_%s"), sym
->module
,
1109 name
= gfc_get_string (GFC_PREFIX ("%s"), sym
->name
);
1111 else if (sym
->module
)
1112 name
= gfc_get_string (".__%s_MOD_%s", sym
->module
, sym
->name
);
1114 name
= gfc_get_string (".%s", sym
->name
);
1116 length
= build_decl (input_location
,
1117 VAR_DECL
, get_identifier (name
),
1118 gfc_charlen_type_node
);
1119 DECL_ARTIFICIAL (length
) = 1;
1120 TREE_USED (length
) = 1;
1121 if (sym
->ns
->proc_name
->tlink
!= NULL
)
1122 gfc_defer_symbol_init (sym
);
1124 sym
->ts
.u
.cl
->backend_decl
= length
;
1127 TREE_STATIC (length
) = 1;
1129 if (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
1130 && (sym
->attr
.access
!= ACCESS_PRIVATE
|| sym
->attr
.public_used
))
1131 TREE_PUBLIC (length
) = 1;
1134 gcc_assert (sym
->ts
.u
.cl
->backend_decl
!= NULL_TREE
);
1135 return sym
->ts
.u
.cl
->backend_decl
;
1138 /* If a variable is assigned a label, we add another two auxiliary
1142 gfc_add_assign_aux_vars (gfc_symbol
* sym
)
1148 gcc_assert (sym
->backend_decl
);
1150 decl
= sym
->backend_decl
;
1151 gfc_allocate_lang_decl (decl
);
1152 GFC_DECL_ASSIGN (decl
) = 1;
1153 length
= build_decl (input_location
,
1154 VAR_DECL
, create_tmp_var_name (sym
->name
),
1155 gfc_charlen_type_node
);
1156 addr
= build_decl (input_location
,
1157 VAR_DECL
, create_tmp_var_name (sym
->name
),
1159 gfc_finish_var_decl (length
, sym
);
1160 gfc_finish_var_decl (addr
, sym
);
1161 /* STRING_LENGTH is also used as flag. Less than -1 means that
1162 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1163 target label's address. Otherwise, value is the length of a format string
1164 and ASSIGN_ADDR is its address. */
1165 if (TREE_STATIC (length
))
1166 DECL_INITIAL (length
) = build_int_cst (gfc_charlen_type_node
, -2);
1168 gfc_defer_symbol_init (sym
);
1170 GFC_DECL_STRING_LEN (decl
) = length
;
1171 GFC_DECL_ASSIGN_ADDR (decl
) = addr
;
1176 add_attributes_to_decl (symbol_attribute sym_attr
, tree list
)
1181 for (id
= 0; id
< EXT_ATTR_NUM
; id
++)
1182 if (sym_attr
.ext_attr
& (1 << id
))
1184 attr
= build_tree_list (
1185 get_identifier (ext_attr_list
[id
].middle_end_name
),
1187 list
= chainon (list
, attr
);
1194 static void build_function_decl (gfc_symbol
* sym
, bool global
);
1197 /* Return the decl for a gfc_symbol, create it if it doesn't already
1201 gfc_get_symbol_decl (gfc_symbol
* sym
)
1204 tree length
= NULL_TREE
;
1207 bool intrinsic_array_parameter
= false;
1210 gcc_assert (sym
->attr
.referenced
1211 || sym
->attr
.flavor
== FL_PROCEDURE
1212 || sym
->attr
.use_assoc
1213 || sym
->ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
1214 || (sym
->module
&& sym
->attr
.if_source
!= IFSRC_DECL
1215 && sym
->backend_decl
));
1217 if (sym
->ns
&& sym
->ns
->proc_name
&& sym
->ns
->proc_name
->attr
.function
)
1218 byref
= gfc_return_by_reference (sym
->ns
->proc_name
);
1222 /* Make sure that the vtab for the declared type is completed. */
1223 if (sym
->ts
.type
== BT_CLASS
)
1225 gfc_component
*c
= CLASS_DATA (sym
);
1226 if (!c
->ts
.u
.derived
->backend_decl
)
1228 gfc_find_derived_vtab (c
->ts
.u
.derived
);
1229 gfc_get_derived_type (sym
->ts
.u
.derived
);
1233 /* All deferred character length procedures need to retain the backend
1234 decl, which is a pointer to the character length in the caller's
1235 namespace and to declare a local character length. */
1236 if (!byref
&& sym
->attr
.function
1237 && sym
->ts
.type
== BT_CHARACTER
1239 && sym
->ts
.u
.cl
->passed_length
== NULL
1240 && sym
->ts
.u
.cl
->backend_decl
1241 && TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
1243 sym
->ts
.u
.cl
->passed_length
= sym
->ts
.u
.cl
->backend_decl
;
1244 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1245 length
= gfc_create_string_length (sym
);
1248 fun_or_res
= byref
&& (sym
->attr
.result
1249 || (sym
->attr
.function
&& sym
->ts
.deferred
));
1250 if ((sym
->attr
.dummy
&& ! sym
->attr
.function
) || fun_or_res
)
1252 /* Return via extra parameter. */
1253 if (sym
->attr
.result
&& byref
1254 && !sym
->backend_decl
)
1257 DECL_ARGUMENTS (sym
->ns
->proc_name
->backend_decl
);
1258 /* For entry master function skip over the __entry
1260 if (sym
->ns
->proc_name
->attr
.entry_master
)
1261 sym
->backend_decl
= DECL_CHAIN (sym
->backend_decl
);
1264 /* Dummy variables should already have been created. */
1265 gcc_assert (sym
->backend_decl
);
1267 /* Create a character length variable. */
1268 if (sym
->ts
.type
== BT_CHARACTER
)
1270 /* For a deferred dummy, make a new string length variable. */
1271 if (sym
->ts
.deferred
1273 (sym
->ts
.u
.cl
->passed_length
== sym
->ts
.u
.cl
->backend_decl
))
1274 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1276 if (sym
->ts
.deferred
&& fun_or_res
1277 && sym
->ts
.u
.cl
->passed_length
== NULL
1278 && sym
->ts
.u
.cl
->backend_decl
)
1280 sym
->ts
.u
.cl
->passed_length
= sym
->ts
.u
.cl
->backend_decl
;
1281 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1284 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
1285 length
= gfc_create_string_length (sym
);
1287 length
= sym
->ts
.u
.cl
->backend_decl
;
1288 if (TREE_CODE (length
) == VAR_DECL
1289 && DECL_FILE_SCOPE_P (length
))
1291 /* Add the string length to the same context as the symbol. */
1292 if (DECL_CONTEXT (sym
->backend_decl
) == current_function_decl
)
1293 gfc_add_decl_to_function (length
);
1295 gfc_add_decl_to_parent_function (length
);
1297 gcc_assert (DECL_CONTEXT (sym
->backend_decl
) ==
1298 DECL_CONTEXT (length
));
1300 gfc_defer_symbol_init (sym
);
1304 /* Use a copy of the descriptor for dummy arrays. */
1305 if ((sym
->attr
.dimension
|| sym
->attr
.codimension
)
1306 && !TREE_USED (sym
->backend_decl
))
1308 decl
= gfc_build_dummy_array_decl (sym
, sym
->backend_decl
);
1309 /* Prevent the dummy from being detected as unused if it is copied. */
1310 if (sym
->backend_decl
!= NULL
&& decl
!= sym
->backend_decl
)
1311 DECL_ARTIFICIAL (sym
->backend_decl
) = 1;
1312 sym
->backend_decl
= decl
;
1315 TREE_USED (sym
->backend_decl
) = 1;
1316 if (sym
->attr
.assign
&& GFC_DECL_ASSIGN (sym
->backend_decl
) == 0)
1318 gfc_add_assign_aux_vars (sym
);
1321 if (sym
->attr
.dimension
1322 && DECL_LANG_SPECIFIC (sym
->backend_decl
)
1323 && GFC_DECL_SAVED_DESCRIPTOR (sym
->backend_decl
)
1324 && DECL_CONTEXT (sym
->backend_decl
) != current_function_decl
)
1325 gfc_nonlocal_dummy_array_decl (sym
);
1327 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1328 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1330 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1331 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1332 return sym
->backend_decl
;
1335 if (sym
->backend_decl
)
1336 return sym
->backend_decl
;
1338 /* Special case for array-valued named constants from intrinsic
1339 procedures; those are inlined. */
1340 if (sym
->attr
.use_assoc
&& sym
->from_intmod
1341 && sym
->attr
.flavor
== FL_PARAMETER
)
1342 intrinsic_array_parameter
= true;
1344 /* If use associated compilation, use the module
1346 if ((sym
->attr
.flavor
== FL_VARIABLE
1347 || sym
->attr
.flavor
== FL_PARAMETER
)
1348 && sym
->attr
.use_assoc
1349 && !intrinsic_array_parameter
1351 && gfc_get_module_backend_decl (sym
))
1353 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1354 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1355 return sym
->backend_decl
;
1358 if (sym
->attr
.flavor
== FL_PROCEDURE
)
1360 /* Catch function declarations. Only used for actual parameters,
1361 procedure pointers and procptr initialization targets. */
1362 if (sym
->attr
.external
|| sym
->attr
.use_assoc
|| sym
->attr
.intrinsic
)
1364 decl
= gfc_get_extern_function_decl (sym
);
1365 gfc_set_decl_location (decl
, &sym
->declared_at
);
1369 if (!sym
->backend_decl
)
1370 build_function_decl (sym
, false);
1371 decl
= sym
->backend_decl
;
1376 if (sym
->attr
.intrinsic
)
1377 internal_error ("intrinsic variable which isn't a procedure");
1379 /* Create string length decl first so that they can be used in the
1380 type declaration. */
1381 if (sym
->ts
.type
== BT_CHARACTER
)
1382 length
= gfc_create_string_length (sym
);
1384 /* Create the decl for the variable. */
1385 decl
= build_decl (sym
->declared_at
.lb
->location
,
1386 VAR_DECL
, gfc_sym_identifier (sym
), gfc_sym_type (sym
));
1388 /* Add attributes to variables. Functions are handled elsewhere. */
1389 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1390 decl_attributes (&decl
, attributes
, 0);
1392 /* Symbols from modules should have their assembler names mangled.
1393 This is done here rather than in gfc_finish_var_decl because it
1394 is different for string length variables. */
1397 gfc_set_decl_assembler_name (decl
, gfc_sym_mangled_identifier (sym
));
1398 if (sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)
1399 DECL_IGNORED_P (decl
) = 1;
1402 if (sym
->attr
.select_type_temporary
)
1404 DECL_ARTIFICIAL (decl
) = 1;
1405 DECL_IGNORED_P (decl
) = 1;
1408 if (sym
->attr
.dimension
|| sym
->attr
.codimension
)
1410 /* Create variables to hold the non-constant bits of array info. */
1411 gfc_build_qualified_array (decl
, sym
);
1413 if (sym
->attr
.contiguous
1414 || ((sym
->attr
.allocatable
|| !sym
->attr
.dummy
) && !sym
->attr
.pointer
))
1415 GFC_DECL_PACKED_ARRAY (decl
) = 1;
1418 /* Remember this variable for allocation/cleanup. */
1419 if (sym
->attr
.dimension
|| sym
->attr
.allocatable
|| sym
->attr
.codimension
1420 || (sym
->ts
.type
== BT_CLASS
&&
1421 (CLASS_DATA (sym
)->attr
.dimension
1422 || CLASS_DATA (sym
)->attr
.allocatable
))
1423 || (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
->attr
.alloc_comp
)
1424 /* This applies a derived type default initializer. */
1425 || (sym
->ts
.type
== BT_DERIVED
1426 && sym
->attr
.save
== SAVE_NONE
1428 && !sym
->attr
.allocatable
1429 && (sym
->value
&& !sym
->ns
->proc_name
->attr
.is_main_program
)
1430 && !(sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)))
1431 gfc_defer_symbol_init (sym
);
1433 gfc_finish_var_decl (decl
, sym
);
1435 if (sym
->ts
.type
== BT_CHARACTER
)
1437 /* Character variables need special handling. */
1438 gfc_allocate_lang_decl (decl
);
1440 if (TREE_CODE (length
) != INTEGER_CST
)
1442 gfc_finish_var_decl (length
, sym
);
1443 gcc_assert (!sym
->value
);
1446 else if (sym
->attr
.subref_array_pointer
)
1448 /* We need the span for these beasts. */
1449 gfc_allocate_lang_decl (decl
);
1452 if (sym
->attr
.subref_array_pointer
)
1455 GFC_DECL_SUBREF_ARRAY_P (decl
) = 1;
1456 span
= build_decl (input_location
,
1457 VAR_DECL
, create_tmp_var_name ("span"),
1458 gfc_array_index_type
);
1459 gfc_finish_var_decl (span
, sym
);
1460 TREE_STATIC (span
) = TREE_STATIC (decl
);
1461 DECL_ARTIFICIAL (span
) = 1;
1463 GFC_DECL_SPAN (decl
) = span
;
1464 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl
)) = span
;
1467 if (sym
->ts
.type
== BT_CLASS
)
1468 GFC_DECL_CLASS(decl
) = 1;
1470 sym
->backend_decl
= decl
;
1472 if (sym
->attr
.assign
)
1473 gfc_add_assign_aux_vars (sym
);
1475 if (intrinsic_array_parameter
)
1477 TREE_STATIC (decl
) = 1;
1478 DECL_EXTERNAL (decl
) = 0;
1481 if (TREE_STATIC (decl
)
1482 && !(sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)
1483 && (sym
->attr
.save
|| sym
->ns
->proc_name
->attr
.is_main_program
1484 || gfc_option
.flag_max_stack_var_size
== 0
1485 || sym
->attr
.data
|| sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1486 && (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
1487 || !sym
->attr
.codimension
|| sym
->attr
.allocatable
))
1489 /* Add static initializer. For procedures, it is only needed if
1490 SAVE is specified otherwise they need to be reinitialized
1491 every time the procedure is entered. The TREE_STATIC is
1492 in this case due to -fmax-stack-var-size=. */
1493 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
1496 || (sym
->attr
.codimension
1497 && sym
->attr
.allocatable
),
1499 || sym
->attr
.allocatable
,
1500 sym
->attr
.proc_pointer
);
1503 if (!TREE_STATIC (decl
)
1504 && POINTER_TYPE_P (TREE_TYPE (decl
))
1505 && !sym
->attr
.pointer
1506 && !sym
->attr
.allocatable
1507 && !sym
->attr
.proc_pointer
1508 && !sym
->attr
.select_type_temporary
)
1509 DECL_BY_REFERENCE (decl
) = 1;
1512 || (sym
->name
[0] == '_' && strncmp ("__def_init", sym
->name
, 10) == 0))
1513 TREE_READONLY (decl
) = 1;
1519 /* Substitute a temporary variable in place of the real one. */
1522 gfc_shadow_sym (gfc_symbol
* sym
, tree decl
, gfc_saved_var
* save
)
1524 save
->attr
= sym
->attr
;
1525 save
->decl
= sym
->backend_decl
;
1527 gfc_clear_attr (&sym
->attr
);
1528 sym
->attr
.referenced
= 1;
1529 sym
->attr
.flavor
= FL_VARIABLE
;
1531 sym
->backend_decl
= decl
;
1535 /* Restore the original variable. */
1538 gfc_restore_sym (gfc_symbol
* sym
, gfc_saved_var
* save
)
1540 sym
->attr
= save
->attr
;
1541 sym
->backend_decl
= save
->decl
;
1545 /* Declare a procedure pointer. */
1548 get_proc_pointer_decl (gfc_symbol
*sym
)
1553 decl
= sym
->backend_decl
;
1557 decl
= build_decl (input_location
,
1558 VAR_DECL
, get_identifier (sym
->name
),
1559 build_pointer_type (gfc_get_function_type (sym
)));
1563 /* Apply name mangling. */
1564 gfc_set_decl_assembler_name (decl
, gfc_sym_mangled_identifier (sym
));
1565 if (sym
->attr
.use_assoc
)
1566 DECL_IGNORED_P (decl
) = 1;
1569 if ((sym
->ns
->proc_name
1570 && sym
->ns
->proc_name
->backend_decl
== current_function_decl
)
1571 || sym
->attr
.contained
)
1572 gfc_add_decl_to_function (decl
);
1573 else if (sym
->ns
->proc_name
->attr
.flavor
!= FL_MODULE
)
1574 gfc_add_decl_to_parent_function (decl
);
1576 sym
->backend_decl
= decl
;
1578 /* If a variable is USE associated, it's always external. */
1579 if (sym
->attr
.use_assoc
)
1581 DECL_EXTERNAL (decl
) = 1;
1582 TREE_PUBLIC (decl
) = 1;
1584 else if (sym
->module
&& sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1586 /* This is the declaration of a module variable. */
1587 TREE_PUBLIC (decl
) = 1;
1588 TREE_STATIC (decl
) = 1;
1591 if (!sym
->attr
.use_assoc
1592 && (sym
->attr
.save
!= SAVE_NONE
|| sym
->attr
.data
1593 || (sym
->value
&& sym
->ns
->proc_name
->attr
.is_main_program
)))
1594 TREE_STATIC (decl
) = 1;
1596 if (TREE_STATIC (decl
) && sym
->value
)
1598 /* Add static initializer. */
1599 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
1601 sym
->attr
.dimension
,
1605 /* Handle threadprivate procedure pointers. */
1606 if (sym
->attr
.threadprivate
1607 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1608 DECL_TLS_MODEL (decl
) = decl_default_tls_model (decl
);
1610 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1611 decl_attributes (&decl
, attributes
, 0);
1617 /* Get a basic decl for an external function. */
1620 gfc_get_extern_function_decl (gfc_symbol
* sym
)
1626 gfc_intrinsic_sym
*isym
;
1628 char s
[GFC_MAX_SYMBOL_LEN
+ 23]; /* "_gfortran_f2c_specific" and '\0'. */
1633 if (sym
->backend_decl
)
1634 return sym
->backend_decl
;
1636 /* We should never be creating external decls for alternate entry points.
1637 The procedure may be an alternate entry point, but we don't want/need
1639 gcc_assert (!(sym
->attr
.entry
|| sym
->attr
.entry_master
));
1641 if (sym
->attr
.proc_pointer
)
1642 return get_proc_pointer_decl (sym
);
1644 /* See if this is an external procedure from the same file. If so,
1645 return the backend_decl. */
1646 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->name
);
1648 if ((!sym
->attr
.use_assoc
|| sym
->attr
.if_source
!= IFSRC_DECL
)
1649 && !sym
->backend_decl
1651 && ((gsym
->type
== GSYM_SUBROUTINE
) || (gsym
->type
== GSYM_FUNCTION
))
1652 && (gsym
->ns
->proc_name
->backend_decl
|| !sym
->attr
.intrinsic
))
1654 if (!gsym
->ns
->proc_name
->backend_decl
)
1656 /* By construction, the external function cannot be
1657 a contained procedure. */
1660 gfc_save_backend_locus (&old_loc
);
1663 gfc_create_function_decl (gsym
->ns
, true);
1666 gfc_restore_backend_locus (&old_loc
);
1669 /* If the namespace has entries, the proc_name is the
1670 entry master. Find the entry and use its backend_decl.
1671 otherwise, use the proc_name backend_decl. */
1672 if (gsym
->ns
->entries
)
1674 gfc_entry_list
*entry
= gsym
->ns
->entries
;
1676 for (; entry
; entry
= entry
->next
)
1678 if (strcmp (gsym
->name
, entry
->sym
->name
) == 0)
1680 sym
->backend_decl
= entry
->sym
->backend_decl
;
1686 sym
->backend_decl
= gsym
->ns
->proc_name
->backend_decl
;
1688 if (sym
->backend_decl
)
1690 /* Avoid problems of double deallocation of the backend declaration
1691 later in gfc_trans_use_stmts; cf. PR 45087. */
1692 if (sym
->attr
.if_source
!= IFSRC_DECL
&& sym
->attr
.use_assoc
)
1693 sym
->attr
.use_assoc
= 0;
1695 return sym
->backend_decl
;
1699 /* See if this is a module procedure from the same file. If so,
1700 return the backend_decl. */
1702 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->module
);
1704 if (gsym
&& gsym
->ns
&& gsym
->type
== GSYM_MODULE
)
1709 gfc_find_symbol (sym
->name
, gsym
->ns
, 0, &s
);
1710 if (s
&& s
->backend_decl
)
1712 if (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
)
1713 gfc_copy_dt_decls_ifequal (s
->ts
.u
.derived
, sym
->ts
.u
.derived
,
1715 else if (sym
->ts
.type
== BT_CHARACTER
)
1716 sym
->ts
.u
.cl
->backend_decl
= s
->ts
.u
.cl
->backend_decl
;
1717 sym
->backend_decl
= s
->backend_decl
;
1718 return sym
->backend_decl
;
1722 if (sym
->attr
.intrinsic
)
1724 /* Call the resolution function to get the actual name. This is
1725 a nasty hack which relies on the resolution functions only looking
1726 at the first argument. We pass NULL for the second argument
1727 otherwise things like AINT get confused. */
1728 isym
= gfc_find_function (sym
->name
);
1729 gcc_assert (isym
->resolve
.f0
!= NULL
);
1731 memset (&e
, 0, sizeof (e
));
1732 e
.expr_type
= EXPR_FUNCTION
;
1734 memset (&argexpr
, 0, sizeof (argexpr
));
1735 gcc_assert (isym
->formal
);
1736 argexpr
.ts
= isym
->formal
->ts
;
1738 if (isym
->formal
->next
== NULL
)
1739 isym
->resolve
.f1 (&e
, &argexpr
);
1742 if (isym
->formal
->next
->next
== NULL
)
1743 isym
->resolve
.f2 (&e
, &argexpr
, NULL
);
1746 if (isym
->formal
->next
->next
->next
== NULL
)
1747 isym
->resolve
.f3 (&e
, &argexpr
, NULL
, NULL
);
1750 /* All specific intrinsics take less than 5 arguments. */
1751 gcc_assert (isym
->formal
->next
->next
->next
->next
== NULL
);
1752 isym
->resolve
.f4 (&e
, &argexpr
, NULL
, NULL
, NULL
);
1757 if (gfc_option
.flag_f2c
1758 && ((e
.ts
.type
== BT_REAL
&& e
.ts
.kind
== gfc_default_real_kind
)
1759 || e
.ts
.type
== BT_COMPLEX
))
1761 /* Specific which needs a different implementation if f2c
1762 calling conventions are used. */
1763 sprintf (s
, "_gfortran_f2c_specific%s", e
.value
.function
.name
);
1766 sprintf (s
, "_gfortran_specific%s", e
.value
.function
.name
);
1768 name
= get_identifier (s
);
1769 mangled_name
= name
;
1773 name
= gfc_sym_identifier (sym
);
1774 mangled_name
= gfc_sym_mangled_function_id (sym
);
1777 type
= gfc_get_function_type (sym
);
1778 fndecl
= build_decl (input_location
,
1779 FUNCTION_DECL
, name
, type
);
1781 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1782 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1783 the opposite of declaring a function as static in C). */
1784 DECL_EXTERNAL (fndecl
) = 1;
1785 TREE_PUBLIC (fndecl
) = 1;
1787 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1788 decl_attributes (&fndecl
, attributes
, 0);
1790 gfc_set_decl_assembler_name (fndecl
, mangled_name
);
1792 /* Set the context of this decl. */
1793 if (0 && sym
->ns
&& sym
->ns
->proc_name
)
1795 /* TODO: Add external decls to the appropriate scope. */
1796 DECL_CONTEXT (fndecl
) = sym
->ns
->proc_name
->backend_decl
;
1800 /* Global declaration, e.g. intrinsic subroutine. */
1801 DECL_CONTEXT (fndecl
) = NULL_TREE
;
1804 /* Set attributes for PURE functions. A call to PURE function in the
1805 Fortran 95 sense is both pure and without side effects in the C
1807 if (sym
->attr
.pure
|| sym
->attr
.implicit_pure
)
1809 if (sym
->attr
.function
&& !gfc_return_by_reference (sym
))
1810 DECL_PURE_P (fndecl
) = 1;
1811 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1812 parameters and don't use alternate returns (is this
1813 allowed?). In that case, calls to them are meaningless, and
1814 can be optimized away. See also in build_function_decl(). */
1815 TREE_SIDE_EFFECTS (fndecl
) = 0;
1818 /* Mark non-returning functions. */
1819 if (sym
->attr
.noreturn
)
1820 TREE_THIS_VOLATILE(fndecl
) = 1;
1822 sym
->backend_decl
= fndecl
;
1824 if (DECL_CONTEXT (fndecl
) == NULL_TREE
)
1825 pushdecl_top_level (fndecl
);
1831 /* Create a declaration for a procedure. For external functions (in the C
1832 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1833 a master function with alternate entry points. */
1836 build_function_decl (gfc_symbol
* sym
, bool global
)
1838 tree fndecl
, type
, attributes
;
1839 symbol_attribute attr
;
1841 gfc_formal_arglist
*f
;
1843 gcc_assert (!sym
->attr
.external
);
1845 if (sym
->backend_decl
)
1848 /* Set the line and filename. sym->declared_at seems to point to the
1849 last statement for subroutines, but it'll do for now. */
1850 gfc_set_backend_locus (&sym
->declared_at
);
1852 /* Allow only one nesting level. Allow public declarations. */
1853 gcc_assert (current_function_decl
== NULL_TREE
1854 || DECL_FILE_SCOPE_P (current_function_decl
)
1855 || (TREE_CODE (DECL_CONTEXT (current_function_decl
))
1856 == NAMESPACE_DECL
));
1858 type
= gfc_get_function_type (sym
);
1859 fndecl
= build_decl (input_location
,
1860 FUNCTION_DECL
, gfc_sym_identifier (sym
), type
);
1864 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1865 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1866 the opposite of declaring a function as static in C). */
1867 DECL_EXTERNAL (fndecl
) = 0;
1869 if (sym
->attr
.access
== ACCESS_UNKNOWN
&& sym
->module
1870 && (sym
->ns
->default_access
== ACCESS_PRIVATE
1871 || (sym
->ns
->default_access
== ACCESS_UNKNOWN
1872 && gfc_option
.flag_module_private
)))
1873 sym
->attr
.access
= ACCESS_PRIVATE
;
1875 if (!current_function_decl
1876 && !sym
->attr
.entry_master
&& !sym
->attr
.is_main_program
1877 && (sym
->attr
.access
!= ACCESS_PRIVATE
|| sym
->binding_label
1878 || sym
->attr
.public_used
))
1879 TREE_PUBLIC (fndecl
) = 1;
1881 if (sym
->attr
.referenced
|| sym
->attr
.entry_master
)
1882 TREE_USED (fndecl
) = 1;
1884 attributes
= add_attributes_to_decl (attr
, NULL_TREE
);
1885 decl_attributes (&fndecl
, attributes
, 0);
1887 /* Figure out the return type of the declared function, and build a
1888 RESULT_DECL for it. If this is a subroutine with alternate
1889 returns, build a RESULT_DECL for it. */
1890 result_decl
= NULL_TREE
;
1891 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1894 if (gfc_return_by_reference (sym
))
1895 type
= void_type_node
;
1898 if (sym
->result
!= sym
)
1899 result_decl
= gfc_sym_identifier (sym
->result
);
1901 type
= TREE_TYPE (TREE_TYPE (fndecl
));
1906 /* Look for alternate return placeholders. */
1907 int has_alternate_returns
= 0;
1908 for (f
= gfc_sym_get_dummy_args (sym
); f
; f
= f
->next
)
1912 has_alternate_returns
= 1;
1917 if (has_alternate_returns
)
1918 type
= integer_type_node
;
1920 type
= void_type_node
;
1923 result_decl
= build_decl (input_location
,
1924 RESULT_DECL
, result_decl
, type
);
1925 DECL_ARTIFICIAL (result_decl
) = 1;
1926 DECL_IGNORED_P (result_decl
) = 1;
1927 DECL_CONTEXT (result_decl
) = fndecl
;
1928 DECL_RESULT (fndecl
) = result_decl
;
1930 /* Don't call layout_decl for a RESULT_DECL.
1931 layout_decl (result_decl, 0); */
1933 /* TREE_STATIC means the function body is defined here. */
1934 TREE_STATIC (fndecl
) = 1;
1936 /* Set attributes for PURE functions. A call to a PURE function in the
1937 Fortran 95 sense is both pure and without side effects in the C
1939 if (attr
.pure
|| attr
.implicit_pure
)
1941 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1942 including an alternate return. In that case it can also be
1943 marked as PURE. See also in gfc_get_extern_function_decl(). */
1944 if (attr
.function
&& !gfc_return_by_reference (sym
))
1945 DECL_PURE_P (fndecl
) = 1;
1946 TREE_SIDE_EFFECTS (fndecl
) = 0;
1950 /* Layout the function declaration and put it in the binding level
1951 of the current function. */
1954 pushdecl_top_level (fndecl
);
1958 /* Perform name mangling if this is a top level or module procedure. */
1959 if (current_function_decl
== NULL_TREE
)
1960 gfc_set_decl_assembler_name (fndecl
, gfc_sym_mangled_function_id (sym
));
1962 sym
->backend_decl
= fndecl
;
1966 /* Create the DECL_ARGUMENTS for a procedure. */
1969 create_function_arglist (gfc_symbol
* sym
)
1972 gfc_formal_arglist
*f
;
1973 tree typelist
, hidden_typelist
;
1974 tree arglist
, hidden_arglist
;
1978 fndecl
= sym
->backend_decl
;
1980 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1981 the new FUNCTION_DECL node. */
1982 arglist
= NULL_TREE
;
1983 hidden_arglist
= NULL_TREE
;
1984 typelist
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
1986 if (sym
->attr
.entry_master
)
1988 type
= TREE_VALUE (typelist
);
1989 parm
= build_decl (input_location
,
1990 PARM_DECL
, get_identifier ("__entry"), type
);
1992 DECL_CONTEXT (parm
) = fndecl
;
1993 DECL_ARG_TYPE (parm
) = type
;
1994 TREE_READONLY (parm
) = 1;
1995 gfc_finish_decl (parm
);
1996 DECL_ARTIFICIAL (parm
) = 1;
1998 arglist
= chainon (arglist
, parm
);
1999 typelist
= TREE_CHAIN (typelist
);
2002 if (gfc_return_by_reference (sym
))
2004 tree type
= TREE_VALUE (typelist
), length
= NULL
;
2006 if (sym
->ts
.type
== BT_CHARACTER
)
2008 /* Length of character result. */
2009 tree len_type
= TREE_VALUE (TREE_CHAIN (typelist
));
2011 length
= build_decl (input_location
,
2013 get_identifier (".__result"),
2015 if (!sym
->ts
.u
.cl
->length
)
2017 sym
->ts
.u
.cl
->backend_decl
= length
;
2018 TREE_USED (length
) = 1;
2020 gcc_assert (TREE_CODE (length
) == PARM_DECL
);
2021 DECL_CONTEXT (length
) = fndecl
;
2022 DECL_ARG_TYPE (length
) = len_type
;
2023 TREE_READONLY (length
) = 1;
2024 DECL_ARTIFICIAL (length
) = 1;
2025 gfc_finish_decl (length
);
2026 if (sym
->ts
.u
.cl
->backend_decl
== NULL
2027 || sym
->ts
.u
.cl
->backend_decl
== length
)
2032 if (sym
->ts
.u
.cl
->backend_decl
== NULL
)
2034 tree len
= build_decl (input_location
,
2036 get_identifier ("..__result"),
2037 gfc_charlen_type_node
);
2038 DECL_ARTIFICIAL (len
) = 1;
2039 TREE_USED (len
) = 1;
2040 sym
->ts
.u
.cl
->backend_decl
= len
;
2043 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2044 arg
= sym
->result
? sym
->result
: sym
;
2045 backend_decl
= arg
->backend_decl
;
2046 /* Temporary clear it, so that gfc_sym_type creates complete
2048 arg
->backend_decl
= NULL
;
2049 type
= gfc_sym_type (arg
);
2050 arg
->backend_decl
= backend_decl
;
2051 type
= build_reference_type (type
);
2055 parm
= build_decl (input_location
,
2056 PARM_DECL
, get_identifier ("__result"), type
);
2058 DECL_CONTEXT (parm
) = fndecl
;
2059 DECL_ARG_TYPE (parm
) = TREE_VALUE (typelist
);
2060 TREE_READONLY (parm
) = 1;
2061 DECL_ARTIFICIAL (parm
) = 1;
2062 gfc_finish_decl (parm
);
2064 arglist
= chainon (arglist
, parm
);
2065 typelist
= TREE_CHAIN (typelist
);
2067 if (sym
->ts
.type
== BT_CHARACTER
)
2069 gfc_allocate_lang_decl (parm
);
2070 arglist
= chainon (arglist
, length
);
2071 typelist
= TREE_CHAIN (typelist
);
2075 hidden_typelist
= typelist
;
2076 for (f
= gfc_sym_get_dummy_args (sym
); f
; f
= f
->next
)
2077 if (f
->sym
!= NULL
) /* Ignore alternate returns. */
2078 hidden_typelist
= TREE_CHAIN (hidden_typelist
);
2080 for (f
= gfc_sym_get_dummy_args (sym
); f
; f
= f
->next
)
2082 char name
[GFC_MAX_SYMBOL_LEN
+ 2];
2084 /* Ignore alternate returns. */
2088 type
= TREE_VALUE (typelist
);
2090 if (f
->sym
->ts
.type
== BT_CHARACTER
2091 && (!sym
->attr
.is_bind_c
|| sym
->attr
.entry_master
))
2093 tree len_type
= TREE_VALUE (hidden_typelist
);
2094 tree length
= NULL_TREE
;
2095 if (!f
->sym
->ts
.deferred
)
2096 gcc_assert (len_type
== gfc_charlen_type_node
);
2098 gcc_assert (POINTER_TYPE_P (len_type
));
2100 strcpy (&name
[1], f
->sym
->name
);
2102 length
= build_decl (input_location
,
2103 PARM_DECL
, get_identifier (name
), len_type
);
2105 hidden_arglist
= chainon (hidden_arglist
, length
);
2106 DECL_CONTEXT (length
) = fndecl
;
2107 DECL_ARTIFICIAL (length
) = 1;
2108 DECL_ARG_TYPE (length
) = len_type
;
2109 TREE_READONLY (length
) = 1;
2110 gfc_finish_decl (length
);
2112 /* Remember the passed value. */
2113 if (!f
->sym
->ts
.u
.cl
|| f
->sym
->ts
.u
.cl
->passed_length
)
2115 /* This can happen if the same type is used for multiple
2116 arguments. We need to copy cl as otherwise
2117 cl->passed_length gets overwritten. */
2118 f
->sym
->ts
.u
.cl
= gfc_new_charlen (f
->sym
->ns
, f
->sym
->ts
.u
.cl
);
2120 f
->sym
->ts
.u
.cl
->passed_length
= length
;
2122 /* Use the passed value for assumed length variables. */
2123 if (!f
->sym
->ts
.u
.cl
->length
)
2125 TREE_USED (length
) = 1;
2126 gcc_assert (!f
->sym
->ts
.u
.cl
->backend_decl
);
2127 f
->sym
->ts
.u
.cl
->backend_decl
= length
;
2130 hidden_typelist
= TREE_CHAIN (hidden_typelist
);
2132 if (f
->sym
->ts
.u
.cl
->backend_decl
== NULL
2133 || f
->sym
->ts
.u
.cl
->backend_decl
== length
)
2135 if (f
->sym
->ts
.u
.cl
->backend_decl
== NULL
)
2136 gfc_create_string_length (f
->sym
);
2138 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2139 if (f
->sym
->attr
.flavor
== FL_PROCEDURE
)
2140 type
= build_pointer_type (gfc_get_function_type (f
->sym
));
2142 type
= gfc_sym_type (f
->sym
);
2145 /* For noncharacter scalar intrinsic types, VALUE passes the value,
2146 hence, the optional status cannot be transfered via a NULL pointer.
2147 Thus, we will use a hidden argument in that case. */
2148 else if (f
->sym
->attr
.optional
&& f
->sym
->attr
.value
2149 && !f
->sym
->attr
.dimension
&& !f
->sym
->ts
.type
!= BT_CLASS
2150 && f
->sym
->ts
.type
!= BT_DERIVED
)
2153 strcpy (&name
[1], f
->sym
->name
);
2155 tmp
= build_decl (input_location
,
2156 PARM_DECL
, get_identifier (name
),
2159 hidden_arglist
= chainon (hidden_arglist
, tmp
);
2160 DECL_CONTEXT (tmp
) = fndecl
;
2161 DECL_ARTIFICIAL (tmp
) = 1;
2162 DECL_ARG_TYPE (tmp
) = boolean_type_node
;
2163 TREE_READONLY (tmp
) = 1;
2164 gfc_finish_decl (tmp
);
2167 /* For non-constant length array arguments, make sure they use
2168 a different type node from TYPE_ARG_TYPES type. */
2169 if (f
->sym
->attr
.dimension
2170 && type
== TREE_VALUE (typelist
)
2171 && TREE_CODE (type
) == POINTER_TYPE
2172 && GFC_ARRAY_TYPE_P (type
)
2173 && f
->sym
->as
->type
!= AS_ASSUMED_SIZE
2174 && ! COMPLETE_TYPE_P (TREE_TYPE (type
)))
2176 if (f
->sym
->attr
.flavor
== FL_PROCEDURE
)
2177 type
= build_pointer_type (gfc_get_function_type (f
->sym
));
2179 type
= gfc_sym_type (f
->sym
);
2182 if (f
->sym
->attr
.proc_pointer
)
2183 type
= build_pointer_type (type
);
2185 if (f
->sym
->attr
.volatile_
)
2186 type
= build_qualified_type (type
, TYPE_QUAL_VOLATILE
);
2188 /* Build the argument declaration. */
2189 parm
= build_decl (input_location
,
2190 PARM_DECL
, gfc_sym_identifier (f
->sym
), type
);
2192 if (f
->sym
->attr
.volatile_
)
2194 TREE_THIS_VOLATILE (parm
) = 1;
2195 TREE_SIDE_EFFECTS (parm
) = 1;
2198 /* Fill in arg stuff. */
2199 DECL_CONTEXT (parm
) = fndecl
;
2200 DECL_ARG_TYPE (parm
) = TREE_VALUE (typelist
);
2201 /* All implementation args are read-only. */
2202 TREE_READONLY (parm
) = 1;
2203 if (POINTER_TYPE_P (type
)
2204 && (!f
->sym
->attr
.proc_pointer
2205 && f
->sym
->attr
.flavor
!= FL_PROCEDURE
))
2206 DECL_BY_REFERENCE (parm
) = 1;
2208 gfc_finish_decl (parm
);
2210 f
->sym
->backend_decl
= parm
;
2212 /* Coarrays which are descriptorless or assumed-shape pass with
2213 -fcoarray=lib the token and the offset as hidden arguments. */
2214 if (f
->sym
->attr
.codimension
2215 && gfc_option
.coarray
== GFC_FCOARRAY_LIB
2216 && !f
->sym
->attr
.allocatable
)
2222 gcc_assert (f
->sym
->backend_decl
!= NULL_TREE
2223 && !sym
->attr
.is_bind_c
);
2224 caf_type
= TREE_TYPE (f
->sym
->backend_decl
);
2226 token
= build_decl (input_location
, PARM_DECL
,
2227 create_tmp_var_name ("caf_token"),
2228 build_qualified_type (pvoid_type_node
,
2229 TYPE_QUAL_RESTRICT
));
2230 if (f
->sym
->as
->type
== AS_ASSUMED_SHAPE
)
2232 gcc_assert (DECL_LANG_SPECIFIC (f
->sym
->backend_decl
) == NULL
2233 || GFC_DECL_TOKEN (f
->sym
->backend_decl
) == NULL_TREE
);
2234 if (DECL_LANG_SPECIFIC (f
->sym
->backend_decl
) == NULL
)
2235 gfc_allocate_lang_decl (f
->sym
->backend_decl
);
2236 GFC_DECL_TOKEN (f
->sym
->backend_decl
) = token
;
2240 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) == NULL_TREE
);
2241 GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) = token
;
2244 DECL_CONTEXT (token
) = fndecl
;
2245 DECL_ARTIFICIAL (token
) = 1;
2246 DECL_ARG_TYPE (token
) = TREE_VALUE (typelist
);
2247 TREE_READONLY (token
) = 1;
2248 hidden_arglist
= chainon (hidden_arglist
, token
);
2249 gfc_finish_decl (token
);
2251 offset
= build_decl (input_location
, PARM_DECL
,
2252 create_tmp_var_name ("caf_offset"),
2253 gfc_array_index_type
);
2255 if (f
->sym
->as
->type
== AS_ASSUMED_SHAPE
)
2257 gcc_assert (GFC_DECL_CAF_OFFSET (f
->sym
->backend_decl
)
2259 GFC_DECL_CAF_OFFSET (f
->sym
->backend_decl
) = offset
;
2263 gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type
) == NULL_TREE
);
2264 GFC_TYPE_ARRAY_CAF_OFFSET (caf_type
) = offset
;
2266 DECL_CONTEXT (offset
) = fndecl
;
2267 DECL_ARTIFICIAL (offset
) = 1;
2268 DECL_ARG_TYPE (offset
) = TREE_VALUE (typelist
);
2269 TREE_READONLY (offset
) = 1;
2270 hidden_arglist
= chainon (hidden_arglist
, offset
);
2271 gfc_finish_decl (offset
);
2274 arglist
= chainon (arglist
, parm
);
2275 typelist
= TREE_CHAIN (typelist
);
2278 /* Add the hidden string length parameters, unless the procedure
2280 if (!sym
->attr
.is_bind_c
)
2281 arglist
= chainon (arglist
, hidden_arglist
);
2283 gcc_assert (hidden_typelist
== NULL_TREE
2284 || TREE_VALUE (hidden_typelist
) == void_type_node
);
2285 DECL_ARGUMENTS (fndecl
) = arglist
;
2288 /* Do the setup necessary before generating the body of a function. */
2291 trans_function_start (gfc_symbol
* sym
)
2295 fndecl
= sym
->backend_decl
;
2297 /* Let GCC know the current scope is this function. */
2298 current_function_decl
= fndecl
;
2300 /* Let the world know what we're about to do. */
2301 announce_function (fndecl
);
2303 if (DECL_FILE_SCOPE_P (fndecl
))
2305 /* Create RTL for function declaration. */
2306 rest_of_decl_compilation (fndecl
, 1, 0);
2309 /* Create RTL for function definition. */
2310 make_decl_rtl (fndecl
);
2312 allocate_struct_function (fndecl
, false);
2314 /* function.c requires a push at the start of the function. */
2318 /* Create thunks for alternate entry points. */
2321 build_entry_thunks (gfc_namespace
* ns
, bool global
)
2323 gfc_formal_arglist
*formal
;
2324 gfc_formal_arglist
*thunk_formal
;
2326 gfc_symbol
*thunk_sym
;
2332 /* This should always be a toplevel function. */
2333 gcc_assert (current_function_decl
== NULL_TREE
);
2335 gfc_save_backend_locus (&old_loc
);
2336 for (el
= ns
->entries
; el
; el
= el
->next
)
2338 vec
<tree
, va_gc
> *args
= NULL
;
2339 vec
<tree
, va_gc
> *string_args
= NULL
;
2341 thunk_sym
= el
->sym
;
2343 build_function_decl (thunk_sym
, global
);
2344 create_function_arglist (thunk_sym
);
2346 trans_function_start (thunk_sym
);
2348 thunk_fndecl
= thunk_sym
->backend_decl
;
2350 gfc_init_block (&body
);
2352 /* Pass extra parameter identifying this entry point. */
2353 tmp
= build_int_cst (gfc_array_index_type
, el
->id
);
2354 vec_safe_push (args
, tmp
);
2356 if (thunk_sym
->attr
.function
)
2358 if (gfc_return_by_reference (ns
->proc_name
))
2360 tree ref
= DECL_ARGUMENTS (current_function_decl
);
2361 vec_safe_push (args
, ref
);
2362 if (ns
->proc_name
->ts
.type
== BT_CHARACTER
)
2363 vec_safe_push (args
, DECL_CHAIN (ref
));
2367 for (formal
= gfc_sym_get_dummy_args (ns
->proc_name
); formal
;
2368 formal
= formal
->next
)
2370 /* Ignore alternate returns. */
2371 if (formal
->sym
== NULL
)
2374 /* We don't have a clever way of identifying arguments, so resort to
2375 a brute-force search. */
2376 for (thunk_formal
= gfc_sym_get_dummy_args (thunk_sym
);
2378 thunk_formal
= thunk_formal
->next
)
2380 if (thunk_formal
->sym
== formal
->sym
)
2386 /* Pass the argument. */
2387 DECL_ARTIFICIAL (thunk_formal
->sym
->backend_decl
) = 1;
2388 vec_safe_push (args
, thunk_formal
->sym
->backend_decl
);
2389 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2391 tmp
= thunk_formal
->sym
->ts
.u
.cl
->backend_decl
;
2392 vec_safe_push (string_args
, tmp
);
2397 /* Pass NULL for a missing argument. */
2398 vec_safe_push (args
, null_pointer_node
);
2399 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2401 tmp
= build_int_cst (gfc_charlen_type_node
, 0);
2402 vec_safe_push (string_args
, tmp
);
2407 /* Call the master function. */
2408 vec_safe_splice (args
, string_args
);
2409 tmp
= ns
->proc_name
->backend_decl
;
2410 tmp
= build_call_expr_loc_vec (input_location
, tmp
, args
);
2411 if (ns
->proc_name
->attr
.mixed_entry_master
)
2413 tree union_decl
, field
;
2414 tree master_type
= TREE_TYPE (ns
->proc_name
->backend_decl
);
2416 union_decl
= build_decl (input_location
,
2417 VAR_DECL
, get_identifier ("__result"),
2418 TREE_TYPE (master_type
));
2419 DECL_ARTIFICIAL (union_decl
) = 1;
2420 DECL_EXTERNAL (union_decl
) = 0;
2421 TREE_PUBLIC (union_decl
) = 0;
2422 TREE_USED (union_decl
) = 1;
2423 layout_decl (union_decl
, 0);
2424 pushdecl (union_decl
);
2426 DECL_CONTEXT (union_decl
) = current_function_decl
;
2427 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2428 TREE_TYPE (union_decl
), union_decl
, tmp
);
2429 gfc_add_expr_to_block (&body
, tmp
);
2431 for (field
= TYPE_FIELDS (TREE_TYPE (union_decl
));
2432 field
; field
= DECL_CHAIN (field
))
2433 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field
)),
2434 thunk_sym
->result
->name
) == 0)
2436 gcc_assert (field
!= NULL_TREE
);
2437 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
2438 TREE_TYPE (field
), union_decl
, field
,
2440 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2441 TREE_TYPE (DECL_RESULT (current_function_decl
)),
2442 DECL_RESULT (current_function_decl
), tmp
);
2443 tmp
= build1_v (RETURN_EXPR
, tmp
);
2445 else if (TREE_TYPE (DECL_RESULT (current_function_decl
))
2448 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2449 TREE_TYPE (DECL_RESULT (current_function_decl
)),
2450 DECL_RESULT (current_function_decl
), tmp
);
2451 tmp
= build1_v (RETURN_EXPR
, tmp
);
2453 gfc_add_expr_to_block (&body
, tmp
);
2455 /* Finish off this function and send it for code generation. */
2456 DECL_SAVED_TREE (thunk_fndecl
) = gfc_finish_block (&body
);
2459 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl
)) = thunk_fndecl
;
2460 DECL_SAVED_TREE (thunk_fndecl
)
2461 = build3_v (BIND_EXPR
, tmp
, DECL_SAVED_TREE (thunk_fndecl
),
2462 DECL_INITIAL (thunk_fndecl
));
2464 /* Output the GENERIC tree. */
2465 dump_function (TDI_original
, thunk_fndecl
);
2467 /* Store the end of the function, so that we get good line number
2468 info for the epilogue. */
2469 cfun
->function_end_locus
= input_location
;
2471 /* We're leaving the context of this function, so zap cfun.
2472 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2473 tree_rest_of_compilation. */
2476 current_function_decl
= NULL_TREE
;
2478 cgraph_finalize_function (thunk_fndecl
, true);
2480 /* We share the symbols in the formal argument list with other entry
2481 points and the master function. Clear them so that they are
2482 recreated for each function. */
2483 for (formal
= gfc_sym_get_dummy_args (thunk_sym
); formal
;
2484 formal
= formal
->next
)
2485 if (formal
->sym
!= NULL
) /* Ignore alternate returns. */
2487 formal
->sym
->backend_decl
= NULL_TREE
;
2488 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2489 formal
->sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2492 if (thunk_sym
->attr
.function
)
2494 if (thunk_sym
->ts
.type
== BT_CHARACTER
)
2495 thunk_sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2496 if (thunk_sym
->result
->ts
.type
== BT_CHARACTER
)
2497 thunk_sym
->result
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2501 gfc_restore_backend_locus (&old_loc
);
2505 /* Create a decl for a function, and create any thunks for alternate entry
2506 points. If global is true, generate the function in the global binding
2507 level, otherwise in the current binding level (which can be global). */
2510 gfc_create_function_decl (gfc_namespace
* ns
, bool global
)
2512 /* Create a declaration for the master function. */
2513 build_function_decl (ns
->proc_name
, global
);
2515 /* Compile the entry thunks. */
2517 build_entry_thunks (ns
, global
);
2519 /* Now create the read argument list. */
2520 create_function_arglist (ns
->proc_name
);
2523 /* Return the decl used to hold the function return value. If
2524 parent_flag is set, the context is the parent_scope. */
2527 gfc_get_fake_result_decl (gfc_symbol
* sym
, int parent_flag
)
2531 tree this_fake_result_decl
;
2532 tree this_function_decl
;
2534 char name
[GFC_MAX_SYMBOL_LEN
+ 10];
2538 this_fake_result_decl
= parent_fake_result_decl
;
2539 this_function_decl
= DECL_CONTEXT (current_function_decl
);
2543 this_fake_result_decl
= current_fake_result_decl
;
2544 this_function_decl
= current_function_decl
;
2548 && sym
->ns
->proc_name
->backend_decl
== this_function_decl
2549 && sym
->ns
->proc_name
->attr
.entry_master
2550 && sym
!= sym
->ns
->proc_name
)
2553 if (this_fake_result_decl
!= NULL
)
2554 for (t
= TREE_CHAIN (this_fake_result_decl
); t
; t
= TREE_CHAIN (t
))
2555 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t
)), sym
->name
) == 0)
2558 return TREE_VALUE (t
);
2559 decl
= gfc_get_fake_result_decl (sym
->ns
->proc_name
, parent_flag
);
2562 this_fake_result_decl
= parent_fake_result_decl
;
2564 this_fake_result_decl
= current_fake_result_decl
;
2566 if (decl
&& sym
->ns
->proc_name
->attr
.mixed_entry_master
)
2570 for (field
= TYPE_FIELDS (TREE_TYPE (decl
));
2571 field
; field
= DECL_CHAIN (field
))
2572 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field
)),
2576 gcc_assert (field
!= NULL_TREE
);
2577 decl
= fold_build3_loc (input_location
, COMPONENT_REF
,
2578 TREE_TYPE (field
), decl
, field
, NULL_TREE
);
2581 var
= create_tmp_var_raw (TREE_TYPE (decl
), sym
->name
);
2583 gfc_add_decl_to_parent_function (var
);
2585 gfc_add_decl_to_function (var
);
2587 SET_DECL_VALUE_EXPR (var
, decl
);
2588 DECL_HAS_VALUE_EXPR_P (var
) = 1;
2589 GFC_DECL_RESULT (var
) = 1;
2591 TREE_CHAIN (this_fake_result_decl
)
2592 = tree_cons (get_identifier (sym
->name
), var
,
2593 TREE_CHAIN (this_fake_result_decl
));
2597 if (this_fake_result_decl
!= NULL_TREE
)
2598 return TREE_VALUE (this_fake_result_decl
);
2600 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2605 if (sym
->ts
.type
== BT_CHARACTER
)
2607 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
2608 length
= gfc_create_string_length (sym
);
2610 length
= sym
->ts
.u
.cl
->backend_decl
;
2611 if (TREE_CODE (length
) == VAR_DECL
2612 && DECL_CONTEXT (length
) == NULL_TREE
)
2613 gfc_add_decl_to_function (length
);
2616 if (gfc_return_by_reference (sym
))
2618 decl
= DECL_ARGUMENTS (this_function_decl
);
2620 if (sym
->ns
->proc_name
->backend_decl
== this_function_decl
2621 && sym
->ns
->proc_name
->attr
.entry_master
)
2622 decl
= DECL_CHAIN (decl
);
2624 TREE_USED (decl
) = 1;
2626 decl
= gfc_build_dummy_array_decl (sym
, decl
);
2630 sprintf (name
, "__result_%.20s",
2631 IDENTIFIER_POINTER (DECL_NAME (this_function_decl
)));
2633 if (!sym
->attr
.mixed_entry_master
&& sym
->attr
.function
)
2634 decl
= build_decl (DECL_SOURCE_LOCATION (this_function_decl
),
2635 VAR_DECL
, get_identifier (name
),
2636 gfc_sym_type (sym
));
2638 decl
= build_decl (DECL_SOURCE_LOCATION (this_function_decl
),
2639 VAR_DECL
, get_identifier (name
),
2640 TREE_TYPE (TREE_TYPE (this_function_decl
)));
2641 DECL_ARTIFICIAL (decl
) = 1;
2642 DECL_EXTERNAL (decl
) = 0;
2643 TREE_PUBLIC (decl
) = 0;
2644 TREE_USED (decl
) = 1;
2645 GFC_DECL_RESULT (decl
) = 1;
2646 TREE_ADDRESSABLE (decl
) = 1;
2648 layout_decl (decl
, 0);
2651 gfc_add_decl_to_parent_function (decl
);
2653 gfc_add_decl_to_function (decl
);
2657 parent_fake_result_decl
= build_tree_list (NULL
, decl
);
2659 current_fake_result_decl
= build_tree_list (NULL
, decl
);
2665 /* Builds a function decl. The remaining parameters are the types of the
2666 function arguments. Negative nargs indicates a varargs function. */
2669 build_library_function_decl_1 (tree name
, const char *spec
,
2670 tree rettype
, int nargs
, va_list p
)
2672 vec
<tree
, va_gc
> *arglist
;
2677 /* Library functions must be declared with global scope. */
2678 gcc_assert (current_function_decl
== NULL_TREE
);
2680 /* Create a list of the argument types. */
2681 vec_alloc (arglist
, abs (nargs
));
2682 for (n
= abs (nargs
); n
> 0; n
--)
2684 tree argtype
= va_arg (p
, tree
);
2685 arglist
->quick_push (argtype
);
2688 /* Build the function type and decl. */
2690 fntype
= build_function_type_vec (rettype
, arglist
);
2692 fntype
= build_varargs_function_type_vec (rettype
, arglist
);
2695 tree attr_args
= build_tree_list (NULL_TREE
,
2696 build_string (strlen (spec
), spec
));
2697 tree attrs
= tree_cons (get_identifier ("fn spec"),
2698 attr_args
, TYPE_ATTRIBUTES (fntype
));
2699 fntype
= build_type_attribute_variant (fntype
, attrs
);
2701 fndecl
= build_decl (input_location
,
2702 FUNCTION_DECL
, name
, fntype
);
2704 /* Mark this decl as external. */
2705 DECL_EXTERNAL (fndecl
) = 1;
2706 TREE_PUBLIC (fndecl
) = 1;
2710 rest_of_decl_compilation (fndecl
, 1, 0);
2715 /* Builds a function decl. The remaining parameters are the types of the
2716 function arguments. Negative nargs indicates a varargs function. */
2719 gfc_build_library_function_decl (tree name
, tree rettype
, int nargs
, ...)
2723 va_start (args
, nargs
);
2724 ret
= build_library_function_decl_1 (name
, NULL
, rettype
, nargs
, args
);
2729 /* Builds a function decl. The remaining parameters are the types of the
2730 function arguments. Negative nargs indicates a varargs function.
2731 The SPEC parameter specifies the function argument and return type
2732 specification according to the fnspec function type attribute. */
2735 gfc_build_library_function_decl_with_spec (tree name
, const char *spec
,
2736 tree rettype
, int nargs
, ...)
2740 va_start (args
, nargs
);
2741 ret
= build_library_function_decl_1 (name
, spec
, rettype
, nargs
, args
);
2747 gfc_build_intrinsic_function_decls (void)
2749 tree gfc_int4_type_node
= gfc_get_int_type (4);
2750 tree gfc_int8_type_node
= gfc_get_int_type (8);
2751 tree gfc_int16_type_node
= gfc_get_int_type (16);
2752 tree gfc_logical4_type_node
= gfc_get_logical_type (4);
2753 tree pchar1_type_node
= gfc_get_pchar_type (1);
2754 tree pchar4_type_node
= gfc_get_pchar_type (4);
2756 /* String functions. */
2757 gfor_fndecl_compare_string
= gfc_build_library_function_decl_with_spec (
2758 get_identifier (PREFIX("compare_string")), "..R.R",
2759 integer_type_node
, 4, gfc_charlen_type_node
, pchar1_type_node
,
2760 gfc_charlen_type_node
, pchar1_type_node
);
2761 DECL_PURE_P (gfor_fndecl_compare_string
) = 1;
2762 TREE_NOTHROW (gfor_fndecl_compare_string
) = 1;
2764 gfor_fndecl_concat_string
= gfc_build_library_function_decl_with_spec (
2765 get_identifier (PREFIX("concat_string")), "..W.R.R",
2766 void_type_node
, 6, gfc_charlen_type_node
, pchar1_type_node
,
2767 gfc_charlen_type_node
, pchar1_type_node
,
2768 gfc_charlen_type_node
, pchar1_type_node
);
2769 TREE_NOTHROW (gfor_fndecl_concat_string
) = 1;
2771 gfor_fndecl_string_len_trim
= gfc_build_library_function_decl_with_spec (
2772 get_identifier (PREFIX("string_len_trim")), "..R",
2773 gfc_charlen_type_node
, 2, gfc_charlen_type_node
, pchar1_type_node
);
2774 DECL_PURE_P (gfor_fndecl_string_len_trim
) = 1;
2775 TREE_NOTHROW (gfor_fndecl_string_len_trim
) = 1;
2777 gfor_fndecl_string_index
= gfc_build_library_function_decl_with_spec (
2778 get_identifier (PREFIX("string_index")), "..R.R.",
2779 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2780 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2781 DECL_PURE_P (gfor_fndecl_string_index
) = 1;
2782 TREE_NOTHROW (gfor_fndecl_string_index
) = 1;
2784 gfor_fndecl_string_scan
= gfc_build_library_function_decl_with_spec (
2785 get_identifier (PREFIX("string_scan")), "..R.R.",
2786 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2787 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2788 DECL_PURE_P (gfor_fndecl_string_scan
) = 1;
2789 TREE_NOTHROW (gfor_fndecl_string_scan
) = 1;
2791 gfor_fndecl_string_verify
= gfc_build_library_function_decl_with_spec (
2792 get_identifier (PREFIX("string_verify")), "..R.R.",
2793 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2794 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2795 DECL_PURE_P (gfor_fndecl_string_verify
) = 1;
2796 TREE_NOTHROW (gfor_fndecl_string_verify
) = 1;
2798 gfor_fndecl_string_trim
= gfc_build_library_function_decl_with_spec (
2799 get_identifier (PREFIX("string_trim")), ".Ww.R",
2800 void_type_node
, 4, build_pointer_type (gfc_charlen_type_node
),
2801 build_pointer_type (pchar1_type_node
), gfc_charlen_type_node
,
2804 gfor_fndecl_string_minmax
= gfc_build_library_function_decl_with_spec (
2805 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2806 void_type_node
, -4, build_pointer_type (gfc_charlen_type_node
),
2807 build_pointer_type (pchar1_type_node
), integer_type_node
,
2810 gfor_fndecl_adjustl
= gfc_build_library_function_decl_with_spec (
2811 get_identifier (PREFIX("adjustl")), ".W.R",
2812 void_type_node
, 3, pchar1_type_node
, gfc_charlen_type_node
,
2814 TREE_NOTHROW (gfor_fndecl_adjustl
) = 1;
2816 gfor_fndecl_adjustr
= gfc_build_library_function_decl_with_spec (
2817 get_identifier (PREFIX("adjustr")), ".W.R",
2818 void_type_node
, 3, pchar1_type_node
, gfc_charlen_type_node
,
2820 TREE_NOTHROW (gfor_fndecl_adjustr
) = 1;
2822 gfor_fndecl_select_string
= gfc_build_library_function_decl_with_spec (
2823 get_identifier (PREFIX("select_string")), ".R.R.",
2824 integer_type_node
, 4, pvoid_type_node
, integer_type_node
,
2825 pchar1_type_node
, gfc_charlen_type_node
);
2826 DECL_PURE_P (gfor_fndecl_select_string
) = 1;
2827 TREE_NOTHROW (gfor_fndecl_select_string
) = 1;
2829 gfor_fndecl_compare_string_char4
= gfc_build_library_function_decl_with_spec (
2830 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2831 integer_type_node
, 4, gfc_charlen_type_node
, pchar4_type_node
,
2832 gfc_charlen_type_node
, pchar4_type_node
);
2833 DECL_PURE_P (gfor_fndecl_compare_string_char4
) = 1;
2834 TREE_NOTHROW (gfor_fndecl_compare_string_char4
) = 1;
2836 gfor_fndecl_concat_string_char4
= gfc_build_library_function_decl_with_spec (
2837 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2838 void_type_node
, 6, gfc_charlen_type_node
, pchar4_type_node
,
2839 gfc_charlen_type_node
, pchar4_type_node
, gfc_charlen_type_node
,
2841 TREE_NOTHROW (gfor_fndecl_concat_string_char4
) = 1;
2843 gfor_fndecl_string_len_trim_char4
= gfc_build_library_function_decl_with_spec (
2844 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2845 gfc_charlen_type_node
, 2, gfc_charlen_type_node
, pchar4_type_node
);
2846 DECL_PURE_P (gfor_fndecl_string_len_trim_char4
) = 1;
2847 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4
) = 1;
2849 gfor_fndecl_string_index_char4
= gfc_build_library_function_decl_with_spec (
2850 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2851 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2852 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2853 DECL_PURE_P (gfor_fndecl_string_index_char4
) = 1;
2854 TREE_NOTHROW (gfor_fndecl_string_index_char4
) = 1;
2856 gfor_fndecl_string_scan_char4
= gfc_build_library_function_decl_with_spec (
2857 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2858 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2859 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2860 DECL_PURE_P (gfor_fndecl_string_scan_char4
) = 1;
2861 TREE_NOTHROW (gfor_fndecl_string_scan_char4
) = 1;
2863 gfor_fndecl_string_verify_char4
= gfc_build_library_function_decl_with_spec (
2864 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2865 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2866 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2867 DECL_PURE_P (gfor_fndecl_string_verify_char4
) = 1;
2868 TREE_NOTHROW (gfor_fndecl_string_verify_char4
) = 1;
2870 gfor_fndecl_string_trim_char4
= gfc_build_library_function_decl_with_spec (
2871 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2872 void_type_node
, 4, build_pointer_type (gfc_charlen_type_node
),
2873 build_pointer_type (pchar4_type_node
), gfc_charlen_type_node
,
2876 gfor_fndecl_string_minmax_char4
= gfc_build_library_function_decl_with_spec (
2877 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2878 void_type_node
, -4, build_pointer_type (gfc_charlen_type_node
),
2879 build_pointer_type (pchar4_type_node
), integer_type_node
,
2882 gfor_fndecl_adjustl_char4
= gfc_build_library_function_decl_with_spec (
2883 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2884 void_type_node
, 3, pchar4_type_node
, gfc_charlen_type_node
,
2886 TREE_NOTHROW (gfor_fndecl_adjustl_char4
) = 1;
2888 gfor_fndecl_adjustr_char4
= gfc_build_library_function_decl_with_spec (
2889 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2890 void_type_node
, 3, pchar4_type_node
, gfc_charlen_type_node
,
2892 TREE_NOTHROW (gfor_fndecl_adjustr_char4
) = 1;
2894 gfor_fndecl_select_string_char4
= gfc_build_library_function_decl_with_spec (
2895 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2896 integer_type_node
, 4, pvoid_type_node
, integer_type_node
,
2897 pvoid_type_node
, gfc_charlen_type_node
);
2898 DECL_PURE_P (gfor_fndecl_select_string_char4
) = 1;
2899 TREE_NOTHROW (gfor_fndecl_select_string_char4
) = 1;
2902 /* Conversion between character kinds. */
2904 gfor_fndecl_convert_char1_to_char4
= gfc_build_library_function_decl_with_spec (
2905 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2906 void_type_node
, 3, build_pointer_type (pchar4_type_node
),
2907 gfc_charlen_type_node
, pchar1_type_node
);
2909 gfor_fndecl_convert_char4_to_char1
= gfc_build_library_function_decl_with_spec (
2910 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
2911 void_type_node
, 3, build_pointer_type (pchar1_type_node
),
2912 gfc_charlen_type_node
, pchar4_type_node
);
2914 /* Misc. functions. */
2916 gfor_fndecl_ttynam
= gfc_build_library_function_decl_with_spec (
2917 get_identifier (PREFIX("ttynam")), ".W",
2918 void_type_node
, 3, pchar_type_node
, gfc_charlen_type_node
,
2921 gfor_fndecl_fdate
= gfc_build_library_function_decl_with_spec (
2922 get_identifier (PREFIX("fdate")), ".W",
2923 void_type_node
, 2, pchar_type_node
, gfc_charlen_type_node
);
2925 gfor_fndecl_ctime
= gfc_build_library_function_decl_with_spec (
2926 get_identifier (PREFIX("ctime")), ".W",
2927 void_type_node
, 3, pchar_type_node
, gfc_charlen_type_node
,
2928 gfc_int8_type_node
);
2930 gfor_fndecl_sc_kind
= gfc_build_library_function_decl_with_spec (
2931 get_identifier (PREFIX("selected_char_kind")), "..R",
2932 gfc_int4_type_node
, 2, gfc_charlen_type_node
, pchar_type_node
);
2933 DECL_PURE_P (gfor_fndecl_sc_kind
) = 1;
2934 TREE_NOTHROW (gfor_fndecl_sc_kind
) = 1;
2936 gfor_fndecl_si_kind
= gfc_build_library_function_decl_with_spec (
2937 get_identifier (PREFIX("selected_int_kind")), ".R",
2938 gfc_int4_type_node
, 1, pvoid_type_node
);
2939 DECL_PURE_P (gfor_fndecl_si_kind
) = 1;
2940 TREE_NOTHROW (gfor_fndecl_si_kind
) = 1;
2942 gfor_fndecl_sr_kind
= gfc_build_library_function_decl_with_spec (
2943 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
2944 gfc_int4_type_node
, 3, pvoid_type_node
, pvoid_type_node
,
2946 DECL_PURE_P (gfor_fndecl_sr_kind
) = 1;
2947 TREE_NOTHROW (gfor_fndecl_sr_kind
) = 1;
2949 /* Power functions. */
2951 tree ctype
, rtype
, itype
, jtype
;
2952 int rkind
, ikind
, jkind
;
2955 static int ikinds
[NIKINDS
] = {4, 8, 16};
2956 static int rkinds
[NRKINDS
] = {4, 8, 10, 16};
2957 char name
[PREFIX_LEN
+ 12]; /* _gfortran_pow_?n_?n */
2959 for (ikind
=0; ikind
< NIKINDS
; ikind
++)
2961 itype
= gfc_get_int_type (ikinds
[ikind
]);
2963 for (jkind
=0; jkind
< NIKINDS
; jkind
++)
2965 jtype
= gfc_get_int_type (ikinds
[jkind
]);
2968 sprintf(name
, PREFIX("pow_i%d_i%d"), ikinds
[ikind
],
2970 gfor_fndecl_math_powi
[jkind
][ikind
].integer
=
2971 gfc_build_library_function_decl (get_identifier (name
),
2972 jtype
, 2, jtype
, itype
);
2973 TREE_READONLY (gfor_fndecl_math_powi
[jkind
][ikind
].integer
) = 1;
2974 TREE_NOTHROW (gfor_fndecl_math_powi
[jkind
][ikind
].integer
) = 1;
2978 for (rkind
= 0; rkind
< NRKINDS
; rkind
++)
2980 rtype
= gfc_get_real_type (rkinds
[rkind
]);
2983 sprintf(name
, PREFIX("pow_r%d_i%d"), rkinds
[rkind
],
2985 gfor_fndecl_math_powi
[rkind
][ikind
].real
=
2986 gfc_build_library_function_decl (get_identifier (name
),
2987 rtype
, 2, rtype
, itype
);
2988 TREE_READONLY (gfor_fndecl_math_powi
[rkind
][ikind
].real
) = 1;
2989 TREE_NOTHROW (gfor_fndecl_math_powi
[rkind
][ikind
].real
) = 1;
2992 ctype
= gfc_get_complex_type (rkinds
[rkind
]);
2995 sprintf(name
, PREFIX("pow_c%d_i%d"), rkinds
[rkind
],
2997 gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
=
2998 gfc_build_library_function_decl (get_identifier (name
),
2999 ctype
, 2,ctype
, itype
);
3000 TREE_READONLY (gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
) = 1;
3001 TREE_NOTHROW (gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
) = 1;
3009 gfor_fndecl_math_ishftc4
= gfc_build_library_function_decl (
3010 get_identifier (PREFIX("ishftc4")),
3011 gfc_int4_type_node
, 3, gfc_int4_type_node
, gfc_int4_type_node
,
3012 gfc_int4_type_node
);
3013 TREE_READONLY (gfor_fndecl_math_ishftc4
) = 1;
3014 TREE_NOTHROW (gfor_fndecl_math_ishftc4
) = 1;
3016 gfor_fndecl_math_ishftc8
= gfc_build_library_function_decl (
3017 get_identifier (PREFIX("ishftc8")),
3018 gfc_int8_type_node
, 3, gfc_int8_type_node
, gfc_int4_type_node
,
3019 gfc_int4_type_node
);
3020 TREE_READONLY (gfor_fndecl_math_ishftc8
) = 1;
3021 TREE_NOTHROW (gfor_fndecl_math_ishftc8
) = 1;
3023 if (gfc_int16_type_node
)
3025 gfor_fndecl_math_ishftc16
= gfc_build_library_function_decl (
3026 get_identifier (PREFIX("ishftc16")),
3027 gfc_int16_type_node
, 3, gfc_int16_type_node
, gfc_int4_type_node
,
3028 gfc_int4_type_node
);
3029 TREE_READONLY (gfor_fndecl_math_ishftc16
) = 1;
3030 TREE_NOTHROW (gfor_fndecl_math_ishftc16
) = 1;
3033 /* BLAS functions. */
3035 tree pint
= build_pointer_type (integer_type_node
);
3036 tree ps
= build_pointer_type (gfc_get_real_type (gfc_default_real_kind
));
3037 tree pd
= build_pointer_type (gfc_get_real_type (gfc_default_double_kind
));
3038 tree pc
= build_pointer_type (gfc_get_complex_type (gfc_default_real_kind
));
3039 tree pz
= build_pointer_type
3040 (gfc_get_complex_type (gfc_default_double_kind
));
3042 gfor_fndecl_sgemm
= gfc_build_library_function_decl
3044 (gfc_option
.flag_underscoring
? "sgemm_"
3046 void_type_node
, 15, pchar_type_node
,
3047 pchar_type_node
, pint
, pint
, pint
, ps
, ps
, pint
,
3048 ps
, pint
, ps
, ps
, pint
, integer_type_node
,
3050 gfor_fndecl_dgemm
= gfc_build_library_function_decl
3052 (gfc_option
.flag_underscoring
? "dgemm_"
3054 void_type_node
, 15, pchar_type_node
,
3055 pchar_type_node
, pint
, pint
, pint
, pd
, pd
, pint
,
3056 pd
, pint
, pd
, pd
, pint
, integer_type_node
,
3058 gfor_fndecl_cgemm
= gfc_build_library_function_decl
3060 (gfc_option
.flag_underscoring
? "cgemm_"
3062 void_type_node
, 15, pchar_type_node
,
3063 pchar_type_node
, pint
, pint
, pint
, pc
, pc
, pint
,
3064 pc
, pint
, pc
, pc
, pint
, integer_type_node
,
3066 gfor_fndecl_zgemm
= gfc_build_library_function_decl
3068 (gfc_option
.flag_underscoring
? "zgemm_"
3070 void_type_node
, 15, pchar_type_node
,
3071 pchar_type_node
, pint
, pint
, pint
, pz
, pz
, pint
,
3072 pz
, pint
, pz
, pz
, pint
, integer_type_node
,
3076 /* Other functions. */
3077 gfor_fndecl_size0
= gfc_build_library_function_decl_with_spec (
3078 get_identifier (PREFIX("size0")), ".R",
3079 gfc_array_index_type
, 1, pvoid_type_node
);
3080 DECL_PURE_P (gfor_fndecl_size0
) = 1;
3081 TREE_NOTHROW (gfor_fndecl_size0
) = 1;
3083 gfor_fndecl_size1
= gfc_build_library_function_decl_with_spec (
3084 get_identifier (PREFIX("size1")), ".R",
3085 gfc_array_index_type
, 2, pvoid_type_node
, gfc_array_index_type
);
3086 DECL_PURE_P (gfor_fndecl_size1
) = 1;
3087 TREE_NOTHROW (gfor_fndecl_size1
) = 1;
3089 gfor_fndecl_iargc
= gfc_build_library_function_decl (
3090 get_identifier (PREFIX ("iargc")), gfc_int4_type_node
, 0);
3091 TREE_NOTHROW (gfor_fndecl_iargc
) = 1;
3095 /* Make prototypes for runtime library functions. */
3098 gfc_build_builtin_function_decls (void)
3100 tree gfc_int4_type_node
= gfc_get_int_type (4);
3102 gfor_fndecl_stop_numeric
= gfc_build_library_function_decl (
3103 get_identifier (PREFIX("stop_numeric")),
3104 void_type_node
, 1, gfc_int4_type_node
);
3105 /* STOP doesn't return. */
3106 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric
) = 1;
3108 gfor_fndecl_stop_numeric_f08
= gfc_build_library_function_decl (
3109 get_identifier (PREFIX("stop_numeric_f08")),
3110 void_type_node
, 1, gfc_int4_type_node
);
3111 /* STOP doesn't return. */
3112 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08
) = 1;
3114 gfor_fndecl_stop_string
= gfc_build_library_function_decl_with_spec (
3115 get_identifier (PREFIX("stop_string")), ".R.",
3116 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3117 /* STOP doesn't return. */
3118 TREE_THIS_VOLATILE (gfor_fndecl_stop_string
) = 1;
3120 gfor_fndecl_error_stop_numeric
= gfc_build_library_function_decl (
3121 get_identifier (PREFIX("error_stop_numeric")),
3122 void_type_node
, 1, gfc_int4_type_node
);
3123 /* ERROR STOP doesn't return. */
3124 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric
) = 1;
3126 gfor_fndecl_error_stop_string
= gfc_build_library_function_decl_with_spec (
3127 get_identifier (PREFIX("error_stop_string")), ".R.",
3128 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3129 /* ERROR STOP doesn't return. */
3130 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string
) = 1;
3132 gfor_fndecl_pause_numeric
= gfc_build_library_function_decl (
3133 get_identifier (PREFIX("pause_numeric")),
3134 void_type_node
, 1, gfc_int4_type_node
);
3136 gfor_fndecl_pause_string
= gfc_build_library_function_decl_with_spec (
3137 get_identifier (PREFIX("pause_string")), ".R.",
3138 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3140 gfor_fndecl_runtime_error
= gfc_build_library_function_decl_with_spec (
3141 get_identifier (PREFIX("runtime_error")), ".R",
3142 void_type_node
, -1, pchar_type_node
);
3143 /* The runtime_error function does not return. */
3144 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error
) = 1;
3146 gfor_fndecl_runtime_error_at
= gfc_build_library_function_decl_with_spec (
3147 get_identifier (PREFIX("runtime_error_at")), ".RR",
3148 void_type_node
, -2, pchar_type_node
, pchar_type_node
);
3149 /* The runtime_error_at function does not return. */
3150 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at
) = 1;
3152 gfor_fndecl_runtime_warning_at
= gfc_build_library_function_decl_with_spec (
3153 get_identifier (PREFIX("runtime_warning_at")), ".RR",
3154 void_type_node
, -2, pchar_type_node
, pchar_type_node
);
3156 gfor_fndecl_generate_error
= gfc_build_library_function_decl_with_spec (
3157 get_identifier (PREFIX("generate_error")), ".R.R",
3158 void_type_node
, 3, pvoid_type_node
, integer_type_node
,
3161 gfor_fndecl_os_error
= gfc_build_library_function_decl_with_spec (
3162 get_identifier (PREFIX("os_error")), ".R",
3163 void_type_node
, 1, pchar_type_node
);
3164 /* The runtime_error function does not return. */
3165 TREE_THIS_VOLATILE (gfor_fndecl_os_error
) = 1;
3167 gfor_fndecl_set_args
= gfc_build_library_function_decl (
3168 get_identifier (PREFIX("set_args")),
3169 void_type_node
, 2, integer_type_node
,
3170 build_pointer_type (pchar_type_node
));
3172 gfor_fndecl_set_fpe
= gfc_build_library_function_decl (
3173 get_identifier (PREFIX("set_fpe")),
3174 void_type_node
, 1, integer_type_node
);
3176 /* Keep the array dimension in sync with the call, later in this file. */
3177 gfor_fndecl_set_options
= gfc_build_library_function_decl_with_spec (
3178 get_identifier (PREFIX("set_options")), "..R",
3179 void_type_node
, 2, integer_type_node
,
3180 build_pointer_type (integer_type_node
));
3182 gfor_fndecl_set_convert
= gfc_build_library_function_decl (
3183 get_identifier (PREFIX("set_convert")),
3184 void_type_node
, 1, integer_type_node
);
3186 gfor_fndecl_set_record_marker
= gfc_build_library_function_decl (
3187 get_identifier (PREFIX("set_record_marker")),
3188 void_type_node
, 1, integer_type_node
);
3190 gfor_fndecl_set_max_subrecord_length
= gfc_build_library_function_decl (
3191 get_identifier (PREFIX("set_max_subrecord_length")),
3192 void_type_node
, 1, integer_type_node
);
3194 gfor_fndecl_in_pack
= gfc_build_library_function_decl_with_spec (
3195 get_identifier (PREFIX("internal_pack")), ".r",
3196 pvoid_type_node
, 1, pvoid_type_node
);
3198 gfor_fndecl_in_unpack
= gfc_build_library_function_decl_with_spec (
3199 get_identifier (PREFIX("internal_unpack")), ".wR",
3200 void_type_node
, 2, pvoid_type_node
, pvoid_type_node
);
3202 gfor_fndecl_associated
= gfc_build_library_function_decl_with_spec (
3203 get_identifier (PREFIX("associated")), ".RR",
3204 integer_type_node
, 2, ppvoid_type_node
, ppvoid_type_node
);
3205 DECL_PURE_P (gfor_fndecl_associated
) = 1;
3206 TREE_NOTHROW (gfor_fndecl_associated
) = 1;
3208 /* Coarray library calls. */
3209 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
3211 tree pint_type
, pppchar_type
;
3213 pint_type
= build_pointer_type (integer_type_node
);
3215 = build_pointer_type (build_pointer_type (pchar_type_node
));
3217 gfor_fndecl_caf_init
= gfc_build_library_function_decl (
3218 get_identifier (PREFIX("caf_init")), void_type_node
,
3219 4, pint_type
, pppchar_type
, pint_type
, pint_type
);
3221 gfor_fndecl_caf_finalize
= gfc_build_library_function_decl (
3222 get_identifier (PREFIX("caf_finalize")), void_type_node
, 0);
3224 gfor_fndecl_caf_register
= gfc_build_library_function_decl_with_spec (
3225 get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node
, 6,
3226 size_type_node
, integer_type_node
, ppvoid_type_node
, pint_type
,
3227 pchar_type_node
, integer_type_node
);
3229 gfor_fndecl_caf_deregister
= gfc_build_library_function_decl_with_spec (
3230 get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node
, 4,
3231 ppvoid_type_node
, pint_type
, pchar_type_node
, integer_type_node
);
3233 gfor_fndecl_caf_critical
= gfc_build_library_function_decl (
3234 get_identifier (PREFIX("caf_critical")), void_type_node
, 0);
3236 gfor_fndecl_caf_end_critical
= gfc_build_library_function_decl (
3237 get_identifier (PREFIX("caf_end_critical")), void_type_node
, 0);
3239 gfor_fndecl_caf_sync_all
= gfc_build_library_function_decl_with_spec (
3240 get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node
,
3241 3, pint_type
, build_pointer_type (pchar_type_node
), integer_type_node
);
3243 gfor_fndecl_caf_sync_images
= gfc_build_library_function_decl_with_spec (
3244 get_identifier (PREFIX("caf_sync_images")), ".RRWW", void_type_node
,
3245 5, integer_type_node
, pint_type
, pint_type
,
3246 build_pointer_type (pchar_type_node
), integer_type_node
);
3248 gfor_fndecl_caf_error_stop
= gfc_build_library_function_decl (
3249 get_identifier (PREFIX("caf_error_stop")),
3250 void_type_node
, 1, gfc_int4_type_node
);
3251 /* CAF's ERROR STOP doesn't return. */
3252 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop
) = 1;
3254 gfor_fndecl_caf_error_stop_str
= gfc_build_library_function_decl_with_spec (
3255 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3256 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3257 /* CAF's ERROR STOP doesn't return. */
3258 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str
) = 1;
3261 gfc_build_intrinsic_function_decls ();
3262 gfc_build_intrinsic_lib_fndecls ();
3263 gfc_build_io_library_fndecls ();
3267 /* Evaluate the length of dummy character variables. */
3270 gfc_trans_dummy_character (gfc_symbol
*sym
, gfc_charlen
*cl
,
3271 gfc_wrapped_block
*block
)
3275 gfc_finish_decl (cl
->backend_decl
);
3277 gfc_start_block (&init
);
3279 /* Evaluate the string length expression. */
3280 gfc_conv_string_length (cl
, NULL
, &init
);
3282 gfc_trans_vla_type_sizes (sym
, &init
);
3284 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3288 /* Allocate and cleanup an automatic character variable. */
3291 gfc_trans_auto_character_variable (gfc_symbol
* sym
, gfc_wrapped_block
* block
)
3297 gcc_assert (sym
->backend_decl
);
3298 gcc_assert (sym
->ts
.u
.cl
&& sym
->ts
.u
.cl
->length
);
3300 gfc_init_block (&init
);
3302 /* Evaluate the string length expression. */
3303 gfc_conv_string_length (sym
->ts
.u
.cl
, NULL
, &init
);
3305 gfc_trans_vla_type_sizes (sym
, &init
);
3307 decl
= sym
->backend_decl
;
3309 /* Emit a DECL_EXPR for this variable, which will cause the
3310 gimplifier to allocate storage, and all that good stuff. */
3311 tmp
= fold_build1_loc (input_location
, DECL_EXPR
, TREE_TYPE (decl
), decl
);
3312 gfc_add_expr_to_block (&init
, tmp
);
3314 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3317 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3320 gfc_trans_assign_aux_var (gfc_symbol
* sym
, gfc_wrapped_block
* block
)
3324 gcc_assert (sym
->backend_decl
);
3325 gfc_start_block (&init
);
3327 /* Set the initial value to length. See the comments in
3328 function gfc_add_assign_aux_vars in this file. */
3329 gfc_add_modify (&init
, GFC_DECL_STRING_LEN (sym
->backend_decl
),
3330 build_int_cst (gfc_charlen_type_node
, -2));
3332 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3336 gfc_trans_vla_one_sizepos (tree
*tp
, stmtblock_t
*body
)
3338 tree t
= *tp
, var
, val
;
3340 if (t
== NULL
|| t
== error_mark_node
)
3342 if (TREE_CONSTANT (t
) || DECL_P (t
))
3345 if (TREE_CODE (t
) == SAVE_EXPR
)
3347 if (SAVE_EXPR_RESOLVED_P (t
))
3349 *tp
= TREE_OPERAND (t
, 0);
3352 val
= TREE_OPERAND (t
, 0);
3357 var
= gfc_create_var_np (TREE_TYPE (t
), NULL
);
3358 gfc_add_decl_to_function (var
);
3359 gfc_add_modify (body
, var
, val
);
3360 if (TREE_CODE (t
) == SAVE_EXPR
)
3361 TREE_OPERAND (t
, 0) = var
;
3366 gfc_trans_vla_type_sizes_1 (tree type
, stmtblock_t
*body
)
3370 if (type
== NULL
|| type
== error_mark_node
)
3373 type
= TYPE_MAIN_VARIANT (type
);
3375 if (TREE_CODE (type
) == INTEGER_TYPE
)
3377 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type
), body
);
3378 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type
), body
);
3380 for (t
= TYPE_NEXT_VARIANT (type
); t
; t
= TYPE_NEXT_VARIANT (t
))
3382 TYPE_MIN_VALUE (t
) = TYPE_MIN_VALUE (type
);
3383 TYPE_MAX_VALUE (t
) = TYPE_MAX_VALUE (type
);
3386 else if (TREE_CODE (type
) == ARRAY_TYPE
)
3388 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type
), body
);
3389 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type
), body
);
3390 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type
), body
);
3391 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type
), body
);
3393 for (t
= TYPE_NEXT_VARIANT (type
); t
; t
= TYPE_NEXT_VARIANT (t
))
3395 TYPE_SIZE (t
) = TYPE_SIZE (type
);
3396 TYPE_SIZE_UNIT (t
) = TYPE_SIZE_UNIT (type
);
3401 /* Make sure all type sizes and array domains are either constant,
3402 or variable or parameter decls. This is a simplified variant
3403 of gimplify_type_sizes, but we can't use it here, as none of the
3404 variables in the expressions have been gimplified yet.
3405 As type sizes and domains for various variable length arrays
3406 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3407 time, without this routine gimplify_type_sizes in the middle-end
3408 could result in the type sizes being gimplified earlier than where
3409 those variables are initialized. */
3412 gfc_trans_vla_type_sizes (gfc_symbol
*sym
, stmtblock_t
*body
)
3414 tree type
= TREE_TYPE (sym
->backend_decl
);
3416 if (TREE_CODE (type
) == FUNCTION_TYPE
3417 && (sym
->attr
.function
|| sym
->attr
.result
|| sym
->attr
.entry
))
3419 if (! current_fake_result_decl
)
3422 type
= TREE_TYPE (TREE_VALUE (current_fake_result_decl
));
3425 while (POINTER_TYPE_P (type
))
3426 type
= TREE_TYPE (type
);
3428 if (GFC_DESCRIPTOR_TYPE_P (type
))
3430 tree etype
= GFC_TYPE_ARRAY_DATAPTR_TYPE (type
);
3432 while (POINTER_TYPE_P (etype
))
3433 etype
= TREE_TYPE (etype
);
3435 gfc_trans_vla_type_sizes_1 (etype
, body
);
3438 gfc_trans_vla_type_sizes_1 (type
, body
);
3442 /* Initialize a derived type by building an lvalue from the symbol
3443 and using trans_assignment to do the work. Set dealloc to false
3444 if no deallocation prior the assignment is needed. */
3446 gfc_init_default_dt (gfc_symbol
* sym
, stmtblock_t
* block
, bool dealloc
)
3454 gcc_assert (!sym
->attr
.allocatable
);
3455 gfc_set_sym_referenced (sym
);
3456 e
= gfc_lval_expr_from_sym (sym
);
3457 tmp
= gfc_trans_assignment (e
, sym
->value
, false, dealloc
);
3458 if (sym
->attr
.dummy
&& (sym
->attr
.optional
3459 || sym
->ns
->proc_name
->attr
.entry_master
))
3461 present
= gfc_conv_expr_present (sym
);
3462 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
), present
,
3463 tmp
, build_empty_stmt (input_location
));
3465 gfc_add_expr_to_block (block
, tmp
);
3470 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3471 them their default initializer, if they do not have allocatable
3472 components, they have their allocatable components deallocated. */
3475 init_intent_out_dt (gfc_symbol
* proc_sym
, gfc_wrapped_block
* block
)
3478 gfc_formal_arglist
*f
;
3482 gfc_init_block (&init
);
3483 for (f
= gfc_sym_get_dummy_args (proc_sym
); f
; f
= f
->next
)
3484 if (f
->sym
&& f
->sym
->attr
.intent
== INTENT_OUT
3485 && !f
->sym
->attr
.pointer
3486 && f
->sym
->ts
.type
== BT_DERIVED
)
3488 if (f
->sym
->ts
.u
.derived
->attr
.alloc_comp
&& !f
->sym
->value
)
3490 tmp
= gfc_deallocate_alloc_comp (f
->sym
->ts
.u
.derived
,
3491 f
->sym
->backend_decl
,
3492 f
->sym
->as
? f
->sym
->as
->rank
: 0);
3494 if (f
->sym
->attr
.optional
3495 || f
->sym
->ns
->proc_name
->attr
.entry_master
)
3497 present
= gfc_conv_expr_present (f
->sym
);
3498 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
),
3500 build_empty_stmt (input_location
));
3503 gfc_add_expr_to_block (&init
, tmp
);
3505 else if (f
->sym
->value
)
3506 gfc_init_default_dt (f
->sym
, &init
, true);
3508 else if (f
->sym
&& f
->sym
->attr
.intent
== INTENT_OUT
3509 && f
->sym
->ts
.type
== BT_CLASS
3510 && !CLASS_DATA (f
->sym
)->attr
.class_pointer
3511 && CLASS_DATA (f
->sym
)->ts
.u
.derived
->attr
.alloc_comp
)
3513 tmp
= gfc_class_data_get (f
->sym
->backend_decl
);
3514 if (CLASS_DATA (f
->sym
)->as
== NULL
)
3515 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3516 tmp
= gfc_deallocate_alloc_comp (CLASS_DATA (f
->sym
)->ts
.u
.derived
,
3518 CLASS_DATA (f
->sym
)->as
?
3519 CLASS_DATA (f
->sym
)->as
->rank
: 0);
3521 if (f
->sym
->attr
.optional
|| f
->sym
->ns
->proc_name
->attr
.entry_master
)
3523 present
= gfc_conv_expr_present (f
->sym
);
3524 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
),
3526 build_empty_stmt (input_location
));
3529 gfc_add_expr_to_block (&init
, tmp
);
3532 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3536 /* Generate function entry and exit code, and add it to the function body.
3538 Allocation and initialization of array variables.
3539 Allocation of character string variables.
3540 Initialization and possibly repacking of dummy arrays.
3541 Initialization of ASSIGN statement auxiliary variable.
3542 Initialization of ASSOCIATE names.
3543 Automatic deallocation. */
3546 gfc_trans_deferred_vars (gfc_symbol
* proc_sym
, gfc_wrapped_block
* block
)
3550 gfc_formal_arglist
*f
;
3551 stmtblock_t tmpblock
;
3552 bool seen_trans_deferred_array
= false;
3558 /* Deal with implicit return variables. Explicit return variables will
3559 already have been added. */
3560 if (gfc_return_by_reference (proc_sym
) && proc_sym
->result
== proc_sym
)
3562 if (!current_fake_result_decl
)
3564 gfc_entry_list
*el
= NULL
;
3565 if (proc_sym
->attr
.entry_master
)
3567 for (el
= proc_sym
->ns
->entries
; el
; el
= el
->next
)
3568 if (el
->sym
!= el
->sym
->result
)
3571 /* TODO: move to the appropriate place in resolve.c. */
3572 if (warn_return_type
&& el
== NULL
)
3573 gfc_warning ("Return value of function '%s' at %L not set",
3574 proc_sym
->name
, &proc_sym
->declared_at
);
3576 else if (proc_sym
->as
)
3578 tree result
= TREE_VALUE (current_fake_result_decl
);
3579 gfc_trans_dummy_array_bias (proc_sym
, result
, block
);
3581 /* An automatic character length, pointer array result. */
3582 if (proc_sym
->ts
.type
== BT_CHARACTER
3583 && TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
3584 gfc_trans_dummy_character (proc_sym
, proc_sym
->ts
.u
.cl
, block
);
3586 else if (proc_sym
->ts
.type
== BT_CHARACTER
)
3588 if (proc_sym
->ts
.deferred
)
3591 gfc_save_backend_locus (&loc
);
3592 gfc_set_backend_locus (&proc_sym
->declared_at
);
3593 gfc_start_block (&init
);
3594 /* Zero the string length on entry. */
3595 gfc_add_modify (&init
, proc_sym
->ts
.u
.cl
->backend_decl
,
3596 build_int_cst (gfc_charlen_type_node
, 0));
3597 /* Null the pointer. */
3598 e
= gfc_lval_expr_from_sym (proc_sym
);
3599 gfc_init_se (&se
, NULL
);
3600 se
.want_pointer
= 1;
3601 gfc_conv_expr (&se
, e
);
3604 gfc_add_modify (&init
, tmp
,
3605 fold_convert (TREE_TYPE (se
.expr
),
3606 null_pointer_node
));
3607 gfc_restore_backend_locus (&loc
);
3609 /* Pass back the string length on exit. */
3610 tmp
= proc_sym
->ts
.u
.cl
->passed_length
;
3611 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3612 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3613 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3614 gfc_charlen_type_node
, tmp
,
3615 proc_sym
->ts
.u
.cl
->backend_decl
);
3616 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3618 else if (TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
3619 gfc_trans_dummy_character (proc_sym
, proc_sym
->ts
.u
.cl
, block
);
3622 gcc_assert (gfc_option
.flag_f2c
3623 && proc_sym
->ts
.type
== BT_COMPLEX
);
3626 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3627 should be done here so that the offsets and lbounds of arrays
3629 gfc_save_backend_locus (&loc
);
3630 gfc_set_backend_locus (&proc_sym
->declared_at
);
3631 init_intent_out_dt (proc_sym
, block
);
3632 gfc_restore_backend_locus (&loc
);
3634 for (sym
= proc_sym
->tlink
; sym
!= proc_sym
; sym
= sym
->tlink
)
3636 bool sym_has_alloc_comp
= (sym
->ts
.type
== BT_DERIVED
)
3637 && sym
->ts
.u
.derived
->attr
.alloc_comp
;
3641 if (sym
->attr
.subref_array_pointer
3642 && GFC_DECL_SPAN (sym
->backend_decl
)
3643 && !TREE_STATIC (GFC_DECL_SPAN (sym
->backend_decl
)))
3645 gfc_init_block (&tmpblock
);
3646 gfc_add_modify (&tmpblock
, GFC_DECL_SPAN (sym
->backend_decl
),
3647 build_int_cst (gfc_array_index_type
, 0));
3648 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3652 if (sym
->ts
.type
== BT_CLASS
&& TREE_STATIC (sym
->backend_decl
)
3653 && CLASS_DATA (sym
)->attr
.allocatable
)
3657 if (UNLIMITED_POLY (sym
))
3658 vptr
= null_pointer_node
;
3662 vsym
= gfc_find_derived_vtab (sym
->ts
.u
.derived
);
3663 vptr
= gfc_get_symbol_decl (vsym
);
3664 vptr
= gfc_build_addr_expr (NULL
, vptr
);
3667 if (CLASS_DATA (sym
)->attr
.dimension
3668 || (CLASS_DATA (sym
)->attr
.codimension
3669 && gfc_option
.coarray
!= GFC_FCOARRAY_LIB
))
3671 tmp
= gfc_class_data_get (sym
->backend_decl
);
3672 tmp
= gfc_build_null_descriptor (TREE_TYPE (tmp
));
3675 tmp
= null_pointer_node
;
3677 DECL_INITIAL (sym
->backend_decl
)
3678 = gfc_class_set_static_fields (sym
->backend_decl
, vptr
, tmp
);
3679 TREE_CONSTANT (DECL_INITIAL (sym
->backend_decl
)) = 1;
3681 else if (sym
->attr
.dimension
|| sym
->attr
.codimension
)
3683 /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT. */
3684 array_type tmp
= sym
->as
->type
;
3685 if (tmp
== AS_ASSUMED_SIZE
&& sym
->as
->cp_was_assumed
)
3690 if (sym
->attr
.dummy
|| sym
->attr
.result
)
3691 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, block
);
3692 else if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
3694 if (TREE_STATIC (sym
->backend_decl
))
3696 gfc_save_backend_locus (&loc
);
3697 gfc_set_backend_locus (&sym
->declared_at
);
3698 gfc_trans_static_array_pointer (sym
);
3699 gfc_restore_backend_locus (&loc
);
3703 seen_trans_deferred_array
= true;
3704 gfc_trans_deferred_array (sym
, block
);
3707 else if (sym
->attr
.codimension
&& TREE_STATIC (sym
->backend_decl
))
3709 gfc_init_block (&tmpblock
);
3710 gfc_trans_array_cobounds (TREE_TYPE (sym
->backend_decl
),
3712 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3716 else if (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
3718 gfc_save_backend_locus (&loc
);
3719 gfc_set_backend_locus (&sym
->declared_at
);
3721 if (sym_has_alloc_comp
)
3723 seen_trans_deferred_array
= true;
3724 gfc_trans_deferred_array (sym
, block
);
3726 else if (sym
->ts
.type
== BT_DERIVED
3729 && sym
->attr
.save
== SAVE_NONE
)
3731 gfc_start_block (&tmpblock
);
3732 gfc_init_default_dt (sym
, &tmpblock
, false);
3733 gfc_add_init_cleanup (block
,
3734 gfc_finish_block (&tmpblock
),
3738 gfc_trans_auto_array_allocation (sym
->backend_decl
,
3740 gfc_restore_backend_locus (&loc
);
3744 case AS_ASSUMED_SIZE
:
3745 /* Must be a dummy parameter. */
3746 gcc_assert (sym
->attr
.dummy
|| sym
->as
->cp_was_assumed
);
3748 /* We should always pass assumed size arrays the g77 way. */
3749 if (sym
->attr
.dummy
)
3750 gfc_trans_g77_array (sym
, block
);
3753 case AS_ASSUMED_SHAPE
:
3754 /* Must be a dummy parameter. */
3755 gcc_assert (sym
->attr
.dummy
);
3757 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, block
);
3760 case AS_ASSUMED_RANK
:
3762 seen_trans_deferred_array
= true;
3763 gfc_trans_deferred_array (sym
, block
);
3769 if (sym_has_alloc_comp
&& !seen_trans_deferred_array
)
3770 gfc_trans_deferred_array (sym
, block
);
3772 else if ((!sym
->attr
.dummy
|| sym
->ts
.deferred
)
3773 && (sym
->ts
.type
== BT_CLASS
3774 && CLASS_DATA (sym
)->attr
.class_pointer
))
3776 else if ((!sym
->attr
.dummy
|| sym
->ts
.deferred
)
3777 && (sym
->attr
.allocatable
3778 || (sym
->ts
.type
== BT_CLASS
3779 && CLASS_DATA (sym
)->attr
.allocatable
)))
3781 if (!sym
->attr
.save
&& gfc_option
.flag_max_stack_var_size
!= 0)
3783 tree descriptor
= NULL_TREE
;
3785 /* Nullify and automatic deallocation of allocatable
3787 e
= gfc_lval_expr_from_sym (sym
);
3788 if (sym
->ts
.type
== BT_CLASS
)
3789 gfc_add_data_component (e
);
3791 gfc_init_se (&se
, NULL
);
3792 if (sym
->ts
.type
!= BT_CLASS
3793 || sym
->ts
.u
.derived
->attr
.dimension
3794 || sym
->ts
.u
.derived
->attr
.codimension
)
3796 se
.want_pointer
= 1;
3797 gfc_conv_expr (&se
, e
);
3799 else if (sym
->ts
.type
== BT_CLASS
3800 && !CLASS_DATA (sym
)->attr
.dimension
3801 && !CLASS_DATA (sym
)->attr
.codimension
)
3803 se
.want_pointer
= 1;
3804 gfc_conv_expr (&se
, e
);
3808 gfc_conv_expr (&se
, e
);
3809 descriptor
= se
.expr
;
3810 se
.expr
= gfc_conv_descriptor_data_addr (se
.expr
);
3811 se
.expr
= build_fold_indirect_ref_loc (input_location
, se
.expr
);
3815 gfc_save_backend_locus (&loc
);
3816 gfc_set_backend_locus (&sym
->declared_at
);
3817 gfc_start_block (&init
);
3819 if (!sym
->attr
.dummy
|| sym
->attr
.intent
== INTENT_OUT
)
3821 /* Nullify when entering the scope. */
3822 gfc_add_modify (&init
, se
.expr
,
3823 fold_convert (TREE_TYPE (se
.expr
),
3824 null_pointer_node
));
3827 if ((sym
->attr
.dummy
||sym
->attr
.result
)
3828 && sym
->ts
.type
== BT_CHARACTER
3829 && sym
->ts
.deferred
)
3831 /* Character length passed by reference. */
3832 tmp
= sym
->ts
.u
.cl
->passed_length
;
3833 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3834 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3836 if (!sym
->attr
.dummy
|| sym
->attr
.intent
== INTENT_OUT
)
3837 /* Zero the string length when entering the scope. */
3838 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
,
3839 build_int_cst (gfc_charlen_type_node
, 0));
3841 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
, tmp
);
3843 gfc_restore_backend_locus (&loc
);
3845 /* Pass the final character length back. */
3846 if (sym
->attr
.intent
!= INTENT_IN
)
3847 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3848 gfc_charlen_type_node
, tmp
,
3849 sym
->ts
.u
.cl
->backend_decl
);
3854 gfc_restore_backend_locus (&loc
);
3856 /* Deallocate when leaving the scope. Nullifying is not
3858 if (!sym
->attr
.result
&& !sym
->attr
.dummy
)
3860 if (sym
->ts
.type
== BT_CLASS
3861 && CLASS_DATA (sym
)->attr
.codimension
)
3862 tmp
= gfc_deallocate_with_status (descriptor
, NULL_TREE
,
3863 NULL_TREE
, NULL_TREE
,
3864 NULL_TREE
, true, NULL
,
3868 gfc_expr
*expr
= gfc_lval_expr_from_sym (sym
);
3869 tmp
= gfc_deallocate_scalar_with_status (se
.expr
, NULL_TREE
,
3870 true, expr
, sym
->ts
);
3871 gfc_free_expr (expr
);
3874 if (sym
->ts
.type
== BT_CLASS
)
3876 /* Initialize _vptr to declared type. */
3880 gfc_save_backend_locus (&loc
);
3881 gfc_set_backend_locus (&sym
->declared_at
);
3882 e
= gfc_lval_expr_from_sym (sym
);
3883 gfc_add_vptr_component (e
);
3884 gfc_init_se (&se
, NULL
);
3885 se
.want_pointer
= 1;
3886 gfc_conv_expr (&se
, e
);
3888 if (UNLIMITED_POLY (sym
))
3889 rhs
= build_int_cst (TREE_TYPE (se
.expr
), 0);
3892 vtab
= gfc_find_derived_vtab (sym
->ts
.u
.derived
);
3893 rhs
= gfc_build_addr_expr (TREE_TYPE (se
.expr
),
3894 gfc_get_symbol_decl (vtab
));
3896 gfc_add_modify (&init
, se
.expr
, rhs
);
3897 gfc_restore_backend_locus (&loc
);
3900 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3903 else if (sym
->ts
.type
== BT_CHARACTER
&& sym
->ts
.deferred
)
3908 /* If we get to here, all that should be left are pointers. */
3909 gcc_assert (sym
->attr
.pointer
);
3911 if (sym
->attr
.dummy
)
3913 gfc_start_block (&init
);
3915 /* Character length passed by reference. */
3916 tmp
= sym
->ts
.u
.cl
->passed_length
;
3917 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3918 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3919 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
, tmp
);
3920 /* Pass the final character length back. */
3921 if (sym
->attr
.intent
!= INTENT_IN
)
3922 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3923 gfc_charlen_type_node
, tmp
,
3924 sym
->ts
.u
.cl
->backend_decl
);
3927 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3930 else if (sym
->ts
.deferred
)
3931 gfc_fatal_error ("Deferred type parameter not yet supported");
3932 else if (sym_has_alloc_comp
)
3933 gfc_trans_deferred_array (sym
, block
);
3934 else if (sym
->ts
.type
== BT_CHARACTER
)
3936 gfc_save_backend_locus (&loc
);
3937 gfc_set_backend_locus (&sym
->declared_at
);
3938 if (sym
->attr
.dummy
|| sym
->attr
.result
)
3939 gfc_trans_dummy_character (sym
, sym
->ts
.u
.cl
, block
);
3941 gfc_trans_auto_character_variable (sym
, block
);
3942 gfc_restore_backend_locus (&loc
);
3944 else if (sym
->attr
.assign
)
3946 gfc_save_backend_locus (&loc
);
3947 gfc_set_backend_locus (&sym
->declared_at
);
3948 gfc_trans_assign_aux_var (sym
, block
);
3949 gfc_restore_backend_locus (&loc
);
3951 else if (sym
->ts
.type
== BT_DERIVED
3954 && sym
->attr
.save
== SAVE_NONE
)
3956 gfc_start_block (&tmpblock
);
3957 gfc_init_default_dt (sym
, &tmpblock
, false);
3958 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3961 else if (!(UNLIMITED_POLY(sym
)))
3965 gfc_init_block (&tmpblock
);
3967 for (f
= gfc_sym_get_dummy_args (proc_sym
); f
; f
= f
->next
)
3969 if (f
->sym
&& f
->sym
->tlink
== NULL
&& f
->sym
->ts
.type
== BT_CHARACTER
)
3971 gcc_assert (f
->sym
->ts
.u
.cl
->backend_decl
!= NULL
);
3972 if (TREE_CODE (f
->sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
3973 gfc_trans_vla_type_sizes (f
->sym
, &tmpblock
);
3977 if (gfc_return_by_reference (proc_sym
) && proc_sym
->ts
.type
== BT_CHARACTER
3978 && current_fake_result_decl
!= NULL
)
3980 gcc_assert (proc_sym
->ts
.u
.cl
->backend_decl
!= NULL
);
3981 if (TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
3982 gfc_trans_vla_type_sizes (proc_sym
, &tmpblock
);
3985 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
), NULL_TREE
);
3988 static GTY ((param_is (struct module_htab_entry
))) htab_t module_htab
;
3990 /* Hash and equality functions for module_htab. */
3993 module_htab_do_hash (const void *x
)
3995 return htab_hash_string (((const struct module_htab_entry
*)x
)->name
);
3999 module_htab_eq (const void *x1
, const void *x2
)
4001 return strcmp ((((const struct module_htab_entry
*)x1
)->name
),
4002 (const char *)x2
) == 0;
4005 /* Hash and equality functions for module_htab's decls. */
4008 module_htab_decls_hash (const void *x
)
4010 const_tree t
= (const_tree
) x
;
4011 const_tree n
= DECL_NAME (t
);
4013 n
= TYPE_NAME (TREE_TYPE (t
));
4014 return htab_hash_string (IDENTIFIER_POINTER (n
));
4018 module_htab_decls_eq (const void *x1
, const void *x2
)
4020 const_tree t1
= (const_tree
) x1
;
4021 const_tree n1
= DECL_NAME (t1
);
4022 if (n1
== NULL_TREE
)
4023 n1
= TYPE_NAME (TREE_TYPE (t1
));
4024 return strcmp (IDENTIFIER_POINTER (n1
), (const char *) x2
) == 0;
4027 struct module_htab_entry
*
4028 gfc_find_module (const char *name
)
4033 module_htab
= htab_create_ggc (10, module_htab_do_hash
,
4034 module_htab_eq
, NULL
);
4036 slot
= htab_find_slot_with_hash (module_htab
, name
,
4037 htab_hash_string (name
), INSERT
);
4040 struct module_htab_entry
*entry
= ggc_alloc_cleared_module_htab_entry ();
4042 entry
->name
= gfc_get_string (name
);
4043 entry
->decls
= htab_create_ggc (10, module_htab_decls_hash
,
4044 module_htab_decls_eq
, NULL
);
4045 *slot
= (void *) entry
;
4047 return (struct module_htab_entry
*) *slot
;
4051 gfc_module_add_decl (struct module_htab_entry
*entry
, tree decl
)
4056 if (DECL_NAME (decl
))
4057 name
= IDENTIFIER_POINTER (DECL_NAME (decl
));
4060 gcc_assert (TREE_CODE (decl
) == TYPE_DECL
);
4061 name
= IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl
)));
4063 slot
= htab_find_slot_with_hash (entry
->decls
, name
,
4064 htab_hash_string (name
), INSERT
);
4066 *slot
= (void *) decl
;
4069 static struct module_htab_entry
*cur_module
;
4071 /* Output an initialized decl for a module variable. */
4074 gfc_create_module_variable (gfc_symbol
* sym
)
4078 /* Module functions with alternate entries are dealt with later and
4079 would get caught by the next condition. */
4080 if (sym
->attr
.entry
)
4083 /* Make sure we convert the types of the derived types from iso_c_binding
4085 if (sym
->attr
.flavor
!= FL_PROCEDURE
&& sym
->attr
.is_iso_c
4086 && sym
->ts
.type
== BT_DERIVED
)
4087 sym
->backend_decl
= gfc_typenode_for_spec (&(sym
->ts
));
4089 if (sym
->attr
.flavor
== FL_DERIVED
4090 && sym
->backend_decl
4091 && TREE_CODE (sym
->backend_decl
) == RECORD_TYPE
)
4093 decl
= sym
->backend_decl
;
4094 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4096 if (!sym
->attr
.use_assoc
)
4098 gcc_assert (TYPE_CONTEXT (decl
) == NULL_TREE
4099 || TYPE_CONTEXT (decl
) == sym
->ns
->proc_name
->backend_decl
);
4100 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl
)) == NULL_TREE
4101 || DECL_CONTEXT (TYPE_STUB_DECL (decl
))
4102 == sym
->ns
->proc_name
->backend_decl
);
4104 TYPE_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4105 DECL_CONTEXT (TYPE_STUB_DECL (decl
)) = sym
->ns
->proc_name
->backend_decl
;
4106 gfc_module_add_decl (cur_module
, TYPE_STUB_DECL (decl
));
4109 /* Only output variables, procedure pointers and array valued,
4110 or derived type, parameters. */
4111 if (sym
->attr
.flavor
!= FL_VARIABLE
4112 && !(sym
->attr
.flavor
== FL_PARAMETER
4113 && (sym
->attr
.dimension
|| sym
->ts
.type
== BT_DERIVED
))
4114 && !(sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.proc_pointer
))
4117 if ((sym
->attr
.in_common
|| sym
->attr
.in_equivalence
) && sym
->backend_decl
)
4119 decl
= sym
->backend_decl
;
4120 gcc_assert (DECL_FILE_SCOPE_P (decl
));
4121 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4122 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4123 gfc_module_add_decl (cur_module
, decl
);
4126 /* Don't generate variables from other modules. Variables from
4127 COMMONs will already have been generated. */
4128 if (sym
->attr
.use_assoc
|| sym
->attr
.in_common
)
4131 /* Equivalenced variables arrive here after creation. */
4132 if (sym
->backend_decl
4133 && (sym
->equiv_built
|| sym
->attr
.in_equivalence
))
4136 if (sym
->backend_decl
&& !sym
->attr
.vtab
&& !sym
->attr
.target
)
4137 internal_error ("backend decl for module variable %s already exists",
4140 /* We always want module variables to be created. */
4141 sym
->attr
.referenced
= 1;
4142 /* Create the decl. */
4143 decl
= gfc_get_symbol_decl (sym
);
4145 /* Create the variable. */
4147 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4148 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4149 rest_of_decl_compilation (decl
, 1, 0);
4150 gfc_module_add_decl (cur_module
, decl
);
4152 /* Also add length of strings. */
4153 if (sym
->ts
.type
== BT_CHARACTER
)
4157 length
= sym
->ts
.u
.cl
->backend_decl
;
4158 gcc_assert (length
|| sym
->attr
.proc_pointer
);
4159 if (length
&& !INTEGER_CST_P (length
))
4162 rest_of_decl_compilation (length
, 1, 0);
4166 if (sym
->attr
.codimension
&& !sym
->attr
.dummy
&& !sym
->attr
.allocatable
4167 && sym
->attr
.referenced
&& !sym
->attr
.use_assoc
)
4168 has_coarray_vars
= true;
4171 /* Emit debug information for USE statements. */
4174 gfc_trans_use_stmts (gfc_namespace
* ns
)
4176 gfc_use_list
*use_stmt
;
4177 for (use_stmt
= ns
->use_stmts
; use_stmt
; use_stmt
= use_stmt
->next
)
4179 struct module_htab_entry
*entry
4180 = gfc_find_module (use_stmt
->module_name
);
4181 gfc_use_rename
*rent
;
4183 if (entry
->namespace_decl
== NULL
)
4185 entry
->namespace_decl
4186 = build_decl (input_location
,
4188 get_identifier (use_stmt
->module_name
),
4190 DECL_EXTERNAL (entry
->namespace_decl
) = 1;
4192 gfc_set_backend_locus (&use_stmt
->where
);
4193 if (!use_stmt
->only_flag
)
4194 (*debug_hooks
->imported_module_or_decl
) (entry
->namespace_decl
,
4196 ns
->proc_name
->backend_decl
,
4198 for (rent
= use_stmt
->rename
; rent
; rent
= rent
->next
)
4200 tree decl
, local_name
;
4203 if (rent
->op
!= INTRINSIC_NONE
)
4206 slot
= htab_find_slot_with_hash (entry
->decls
, rent
->use_name
,
4207 htab_hash_string (rent
->use_name
),
4213 st
= gfc_find_symtree (ns
->sym_root
,
4215 ? rent
->local_name
: rent
->use_name
);
4217 /* The following can happen if a derived type is renamed. */
4221 name
= xstrdup (rent
->local_name
[0]
4222 ? rent
->local_name
: rent
->use_name
);
4223 name
[0] = (char) TOUPPER ((unsigned char) name
[0]);
4224 st
= gfc_find_symtree (ns
->sym_root
, name
);
4229 /* Sometimes, generic interfaces wind up being over-ruled by a
4230 local symbol (see PR41062). */
4231 if (!st
->n
.sym
->attr
.use_assoc
)
4234 if (st
->n
.sym
->backend_decl
4235 && DECL_P (st
->n
.sym
->backend_decl
)
4236 && st
->n
.sym
->module
4237 && strcmp (st
->n
.sym
->module
, use_stmt
->module_name
) == 0)
4239 gcc_assert (DECL_EXTERNAL (entry
->namespace_decl
)
4240 || (TREE_CODE (st
->n
.sym
->backend_decl
)
4242 decl
= copy_node (st
->n
.sym
->backend_decl
);
4243 DECL_CONTEXT (decl
) = entry
->namespace_decl
;
4244 DECL_EXTERNAL (decl
) = 1;
4245 DECL_IGNORED_P (decl
) = 0;
4246 DECL_INITIAL (decl
) = NULL_TREE
;
4250 *slot
= error_mark_node
;
4251 htab_clear_slot (entry
->decls
, slot
);
4256 decl
= (tree
) *slot
;
4257 if (rent
->local_name
[0])
4258 local_name
= get_identifier (rent
->local_name
);
4260 local_name
= NULL_TREE
;
4261 gfc_set_backend_locus (&rent
->where
);
4262 (*debug_hooks
->imported_module_or_decl
) (decl
, local_name
,
4263 ns
->proc_name
->backend_decl
,
4264 !use_stmt
->only_flag
);
4270 /* Return true if expr is a constant initializer that gfc_conv_initializer
4274 check_constant_initializer (gfc_expr
*expr
, gfc_typespec
*ts
, bool array
,
4284 if (expr
->expr_type
== EXPR_CONSTANT
|| expr
->expr_type
== EXPR_NULL
)
4286 else if (expr
->expr_type
== EXPR_STRUCTURE
)
4287 return check_constant_initializer (expr
, ts
, false, false);
4288 else if (expr
->expr_type
!= EXPR_ARRAY
)
4290 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4291 c
; c
= gfc_constructor_next (c
))
4295 if (c
->expr
->expr_type
== EXPR_STRUCTURE
)
4297 if (!check_constant_initializer (c
->expr
, ts
, false, false))
4300 else if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4305 else switch (ts
->type
)
4308 if (expr
->expr_type
!= EXPR_STRUCTURE
)
4310 cm
= expr
->ts
.u
.derived
->components
;
4311 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4312 c
; c
= gfc_constructor_next (c
), cm
= cm
->next
)
4314 if (!c
->expr
|| cm
->attr
.allocatable
)
4316 if (!check_constant_initializer (c
->expr
, &cm
->ts
,
4323 return expr
->expr_type
== EXPR_CONSTANT
;
4327 /* Emit debug info for parameters and unreferenced variables with
4331 gfc_emit_parameter_debug_info (gfc_symbol
*sym
)
4335 if (sym
->attr
.flavor
!= FL_PARAMETER
4336 && (sym
->attr
.flavor
!= FL_VARIABLE
|| sym
->attr
.referenced
))
4339 if (sym
->backend_decl
!= NULL
4340 || sym
->value
== NULL
4341 || sym
->attr
.use_assoc
4344 || sym
->attr
.function
4345 || sym
->attr
.intrinsic
4346 || sym
->attr
.pointer
4347 || sym
->attr
.allocatable
4348 || sym
->attr
.cray_pointee
4349 || sym
->attr
.threadprivate
4350 || sym
->attr
.is_bind_c
4351 || sym
->attr
.subref_array_pointer
4352 || sym
->attr
.assign
)
4355 if (sym
->ts
.type
== BT_CHARACTER
)
4357 gfc_conv_const_charlen (sym
->ts
.u
.cl
);
4358 if (sym
->ts
.u
.cl
->backend_decl
== NULL
4359 || TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) != INTEGER_CST
)
4362 else if (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
->attr
.alloc_comp
)
4369 if (sym
->as
->type
!= AS_EXPLICIT
)
4371 for (n
= 0; n
< sym
->as
->rank
; n
++)
4372 if (sym
->as
->lower
[n
]->expr_type
!= EXPR_CONSTANT
4373 || sym
->as
->upper
[n
] == NULL
4374 || sym
->as
->upper
[n
]->expr_type
!= EXPR_CONSTANT
)
4378 if (!check_constant_initializer (sym
->value
, &sym
->ts
,
4379 sym
->attr
.dimension
, false))
4382 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& sym
->attr
.codimension
)
4385 /* Create the decl for the variable or constant. */
4386 decl
= build_decl (input_location
,
4387 sym
->attr
.flavor
== FL_PARAMETER
? CONST_DECL
: VAR_DECL
,
4388 gfc_sym_identifier (sym
), gfc_sym_type (sym
));
4389 if (sym
->attr
.flavor
== FL_PARAMETER
)
4390 TREE_READONLY (decl
) = 1;
4391 gfc_set_decl_location (decl
, &sym
->declared_at
);
4392 if (sym
->attr
.dimension
)
4393 GFC_DECL_PACKED_ARRAY (decl
) = 1;
4394 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4395 TREE_STATIC (decl
) = 1;
4396 TREE_USED (decl
) = 1;
4397 if (DECL_CONTEXT (decl
) && TREE_CODE (DECL_CONTEXT (decl
)) == NAMESPACE_DECL
)
4398 TREE_PUBLIC (decl
) = 1;
4399 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
4401 sym
->attr
.dimension
,
4403 debug_hooks
->global_decl (decl
);
4408 generate_coarray_sym_init (gfc_symbol
*sym
)
4410 tree tmp
, size
, decl
, token
;
4412 if (sym
->attr
.dummy
|| sym
->attr
.allocatable
|| !sym
->attr
.codimension
4413 || sym
->attr
.use_assoc
|| !sym
->attr
.referenced
)
4416 decl
= sym
->backend_decl
;
4417 TREE_USED(decl
) = 1;
4418 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl
)));
4420 /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
4421 to make sure the variable is not optimized away. */
4422 DECL_PRESERVE_P (DECL_CONTEXT (decl
)) = 1;
4424 size
= TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl
)));
4426 /* Ensure that we do not have size=0 for zero-sized arrays. */
4427 size
= fold_build2_loc (input_location
, MAX_EXPR
, size_type_node
,
4428 fold_convert (size_type_node
, size
),
4429 build_int_cst (size_type_node
, 1));
4431 if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl
)))
4433 tmp
= GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl
));
4434 size
= fold_build2_loc (input_location
, MULT_EXPR
, size_type_node
,
4435 fold_convert (size_type_node
, tmp
), size
);
4438 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl
)) != NULL_TREE
);
4439 token
= gfc_build_addr_expr (ppvoid_type_node
,
4440 GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl
)));
4442 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_register
, 6, size
,
4443 build_int_cst (integer_type_node
,
4444 GFC_CAF_COARRAY_STATIC
), /* type. */
4445 token
, null_pointer_node
, /* token, stat. */
4446 null_pointer_node
, /* errgmsg, errmsg_len. */
4447 build_int_cst (integer_type_node
, 0));
4449 gfc_add_modify (&caf_init_block
, decl
, fold_convert (TREE_TYPE (decl
), tmp
));
4452 /* Handle "static" initializer. */
4455 sym
->attr
.pointer
= 1;
4456 tmp
= gfc_trans_assignment (gfc_lval_expr_from_sym (sym
), sym
->value
,
4458 sym
->attr
.pointer
= 0;
4459 gfc_add_expr_to_block (&caf_init_block
, tmp
);
4464 /* Generate constructor function to initialize static, nonallocatable
4468 generate_coarray_init (gfc_namespace
* ns
__attribute((unused
)))
4470 tree fndecl
, tmp
, decl
, save_fn_decl
;
4472 save_fn_decl
= current_function_decl
;
4473 push_function_context ();
4475 tmp
= build_function_type_list (void_type_node
, NULL_TREE
);
4476 fndecl
= build_decl (input_location
, FUNCTION_DECL
,
4477 create_tmp_var_name ("_caf_init"), tmp
);
4479 DECL_STATIC_CONSTRUCTOR (fndecl
) = 1;
4480 SET_DECL_INIT_PRIORITY (fndecl
, DEFAULT_INIT_PRIORITY
);
4482 decl
= build_decl (input_location
, RESULT_DECL
, NULL_TREE
, void_type_node
);
4483 DECL_ARTIFICIAL (decl
) = 1;
4484 DECL_IGNORED_P (decl
) = 1;
4485 DECL_CONTEXT (decl
) = fndecl
;
4486 DECL_RESULT (fndecl
) = decl
;
4489 current_function_decl
= fndecl
;
4490 announce_function (fndecl
);
4492 rest_of_decl_compilation (fndecl
, 0, 0);
4493 make_decl_rtl (fndecl
);
4494 allocate_struct_function (fndecl
, false);
4497 gfc_init_block (&caf_init_block
);
4499 gfc_traverse_ns (ns
, generate_coarray_sym_init
);
4501 DECL_SAVED_TREE (fndecl
) = gfc_finish_block (&caf_init_block
);
4505 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
4507 DECL_SAVED_TREE (fndecl
)
4508 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
4509 DECL_INITIAL (fndecl
));
4510 dump_function (TDI_original
, fndecl
);
4512 cfun
->function_end_locus
= input_location
;
4515 if (decl_function_context (fndecl
))
4516 (void) cgraph_create_node (fndecl
);
4518 cgraph_finalize_function (fndecl
, true);
4520 pop_function_context ();
4521 current_function_decl
= save_fn_decl
;
4525 /* Generate all the required code for module variables. */
4528 gfc_generate_module_vars (gfc_namespace
* ns
)
4530 module_namespace
= ns
;
4531 cur_module
= gfc_find_module (ns
->proc_name
->name
);
4533 /* Check if the frontend left the namespace in a reasonable state. */
4534 gcc_assert (ns
->proc_name
&& !ns
->proc_name
->tlink
);
4536 /* Generate COMMON blocks. */
4537 gfc_trans_common (ns
);
4539 has_coarray_vars
= false;
4541 /* Create decls for all the module variables. */
4542 gfc_traverse_ns (ns
, gfc_create_module_variable
);
4544 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
4545 generate_coarray_init (ns
);
4549 gfc_trans_use_stmts (ns
);
4550 gfc_traverse_ns (ns
, gfc_emit_parameter_debug_info
);
4555 gfc_generate_contained_functions (gfc_namespace
* parent
)
4559 /* We create all the prototypes before generating any code. */
4560 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
4562 /* Skip namespaces from used modules. */
4563 if (ns
->parent
!= parent
)
4566 gfc_create_function_decl (ns
, false);
4569 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
4571 /* Skip namespaces from used modules. */
4572 if (ns
->parent
!= parent
)
4575 gfc_generate_function_code (ns
);
4580 /* Drill down through expressions for the array specification bounds and
4581 character length calling generate_local_decl for all those variables
4582 that have not already been declared. */
4585 generate_local_decl (gfc_symbol
*);
4587 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4590 expr_decls (gfc_expr
*e
, gfc_symbol
*sym
,
4591 int *f ATTRIBUTE_UNUSED
)
4593 if (e
->expr_type
!= EXPR_VARIABLE
4594 || sym
== e
->symtree
->n
.sym
4595 || e
->symtree
->n
.sym
->mark
4596 || e
->symtree
->n
.sym
->ns
!= sym
->ns
)
4599 generate_local_decl (e
->symtree
->n
.sym
);
4604 generate_expr_decls (gfc_symbol
*sym
, gfc_expr
*e
)
4606 gfc_traverse_expr (e
, sym
, expr_decls
, 0);
4610 /* Check for dependencies in the character length and array spec. */
4613 generate_dependency_declarations (gfc_symbol
*sym
)
4617 if (sym
->ts
.type
== BT_CHARACTER
4619 && sym
->ts
.u
.cl
->length
4620 && sym
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
)
4621 generate_expr_decls (sym
, sym
->ts
.u
.cl
->length
);
4623 if (sym
->as
&& sym
->as
->rank
)
4625 for (i
= 0; i
< sym
->as
->rank
; i
++)
4627 generate_expr_decls (sym
, sym
->as
->lower
[i
]);
4628 generate_expr_decls (sym
, sym
->as
->upper
[i
]);
4634 /* Generate decls for all local variables. We do this to ensure correct
4635 handling of expressions which only appear in the specification of
4639 generate_local_decl (gfc_symbol
* sym
)
4641 if (sym
->attr
.flavor
== FL_VARIABLE
)
4643 if (sym
->attr
.codimension
&& !sym
->attr
.dummy
&& !sym
->attr
.allocatable
4644 && sym
->attr
.referenced
&& !sym
->attr
.use_assoc
)
4645 has_coarray_vars
= true;
4647 if (!sym
->attr
.dummy
&& !sym
->ns
->proc_name
->attr
.entry_master
)
4648 generate_dependency_declarations (sym
);
4650 if (sym
->attr
.referenced
)
4651 gfc_get_symbol_decl (sym
);
4653 /* Warnings for unused dummy arguments. */
4654 else if (sym
->attr
.dummy
)
4656 /* INTENT(out) dummy arguments are likely meant to be set. */
4657 if (gfc_option
.warn_unused_dummy_argument
4658 && sym
->attr
.intent
== INTENT_OUT
)
4660 if (sym
->ts
.type
!= BT_DERIVED
)
4661 gfc_warning ("Dummy argument '%s' at %L was declared "
4662 "INTENT(OUT) but was not set", sym
->name
,
4664 else if (!gfc_has_default_initializer (sym
->ts
.u
.derived
))
4665 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4666 "declared INTENT(OUT) but was not set and "
4667 "does not have a default initializer",
4668 sym
->name
, &sym
->declared_at
);
4669 if (sym
->backend_decl
!= NULL_TREE
)
4670 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4672 else if (gfc_option
.warn_unused_dummy_argument
)
4674 gfc_warning ("Unused dummy argument '%s' at %L", sym
->name
,
4676 if (sym
->backend_decl
!= NULL_TREE
)
4677 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4681 /* Warn for unused variables, but not if they're inside a common
4682 block or a namelist. */
4683 else if (warn_unused_variable
4684 && !(sym
->attr
.in_common
|| sym
->mark
|| sym
->attr
.in_namelist
))
4686 if (sym
->attr
.use_only
)
4688 gfc_warning ("Unused module variable '%s' which has been "
4689 "explicitly imported at %L", sym
->name
,
4691 if (sym
->backend_decl
!= NULL_TREE
)
4692 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4694 else if (!sym
->attr
.use_assoc
)
4696 gfc_warning ("Unused variable '%s' declared at %L",
4697 sym
->name
, &sym
->declared_at
);
4698 if (sym
->backend_decl
!= NULL_TREE
)
4699 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4703 /* For variable length CHARACTER parameters, the PARM_DECL already
4704 references the length variable, so force gfc_get_symbol_decl
4705 even when not referenced. If optimize > 0, it will be optimized
4706 away anyway. But do this only after emitting -Wunused-parameter
4707 warning if requested. */
4708 if (sym
->attr
.dummy
&& !sym
->attr
.referenced
4709 && sym
->ts
.type
== BT_CHARACTER
4710 && sym
->ts
.u
.cl
->backend_decl
!= NULL
4711 && TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
4713 sym
->attr
.referenced
= 1;
4714 gfc_get_symbol_decl (sym
);
4717 /* INTENT(out) dummy arguments and result variables with allocatable
4718 components are reset by default and need to be set referenced to
4719 generate the code for nullification and automatic lengths. */
4720 if (!sym
->attr
.referenced
4721 && sym
->ts
.type
== BT_DERIVED
4722 && sym
->ts
.u
.derived
->attr
.alloc_comp
4723 && !sym
->attr
.pointer
4724 && ((sym
->attr
.dummy
&& sym
->attr
.intent
== INTENT_OUT
)
4726 (sym
->attr
.result
&& sym
!= sym
->result
)))
4728 sym
->attr
.referenced
= 1;
4729 gfc_get_symbol_decl (sym
);
4732 /* Check for dependencies in the array specification and string
4733 length, adding the necessary declarations to the function. We
4734 mark the symbol now, as well as in traverse_ns, to prevent
4735 getting stuck in a circular dependency. */
4738 else if (sym
->attr
.flavor
== FL_PARAMETER
)
4740 if (warn_unused_parameter
4741 && !sym
->attr
.referenced
)
4743 if (!sym
->attr
.use_assoc
)
4744 gfc_warning ("Unused parameter '%s' declared at %L", sym
->name
,
4746 else if (sym
->attr
.use_only
)
4747 gfc_warning ("Unused parameter '%s' which has been explicitly "
4748 "imported at %L", sym
->name
, &sym
->declared_at
);
4751 else if (sym
->attr
.flavor
== FL_PROCEDURE
)
4753 /* TODO: move to the appropriate place in resolve.c. */
4754 if (warn_return_type
4755 && sym
->attr
.function
4757 && sym
!= sym
->result
4758 && !sym
->result
->attr
.referenced
4759 && !sym
->attr
.use_assoc
4760 && sym
->attr
.if_source
!= IFSRC_IFBODY
)
4762 gfc_warning ("Return value '%s' of function '%s' declared at "
4763 "%L not set", sym
->result
->name
, sym
->name
,
4764 &sym
->result
->declared_at
);
4766 /* Prevents "Unused variable" warning for RESULT variables. */
4767 sym
->result
->mark
= 1;
4771 if (sym
->attr
.dummy
== 1)
4773 /* Modify the tree type for scalar character dummy arguments of bind(c)
4774 procedures if they are passed by value. The tree type for them will
4775 be promoted to INTEGER_TYPE for the middle end, which appears to be
4776 what C would do with characters passed by-value. The value attribute
4777 implies the dummy is a scalar. */
4778 if (sym
->attr
.value
== 1 && sym
->backend_decl
!= NULL
4779 && sym
->ts
.type
== BT_CHARACTER
&& sym
->ts
.is_c_interop
4780 && sym
->ns
->proc_name
!= NULL
&& sym
->ns
->proc_name
->attr
.is_bind_c
)
4781 gfc_conv_scalar_char_value (sym
, NULL
, NULL
);
4783 /* Unused procedure passed as dummy argument. */
4784 if (sym
->attr
.flavor
== FL_PROCEDURE
)
4786 if (!sym
->attr
.referenced
)
4788 if (gfc_option
.warn_unused_dummy_argument
)
4789 gfc_warning ("Unused dummy argument '%s' at %L", sym
->name
,
4793 /* Silence bogus "unused parameter" warnings from the
4795 if (sym
->backend_decl
!= NULL_TREE
)
4796 TREE_NO_WARNING (sym
->backend_decl
) = 1;
4800 /* Make sure we convert the types of the derived types from iso_c_binding
4802 if (sym
->attr
.flavor
!= FL_PROCEDURE
&& sym
->attr
.is_iso_c
4803 && sym
->ts
.type
== BT_DERIVED
)
4804 sym
->backend_decl
= gfc_typenode_for_spec (&(sym
->ts
));
4808 generate_local_vars (gfc_namespace
* ns
)
4810 gfc_traverse_ns (ns
, generate_local_decl
);
4814 /* Generate a switch statement to jump to the correct entry point. Also
4815 creates the label decls for the entry points. */
4818 gfc_trans_entry_master_switch (gfc_entry_list
* el
)
4825 gfc_init_block (&block
);
4826 for (; el
; el
= el
->next
)
4828 /* Add the case label. */
4829 label
= gfc_build_label_decl (NULL_TREE
);
4830 val
= build_int_cst (gfc_array_index_type
, el
->id
);
4831 tmp
= build_case_label (val
, NULL_TREE
, label
);
4832 gfc_add_expr_to_block (&block
, tmp
);
4834 /* And jump to the actual entry point. */
4835 label
= gfc_build_label_decl (NULL_TREE
);
4836 tmp
= build1_v (GOTO_EXPR
, label
);
4837 gfc_add_expr_to_block (&block
, tmp
);
4839 /* Save the label decl. */
4842 tmp
= gfc_finish_block (&block
);
4843 /* The first argument selects the entry point. */
4844 val
= DECL_ARGUMENTS (current_function_decl
);
4845 tmp
= fold_build3_loc (input_location
, SWITCH_EXPR
, NULL_TREE
,
4846 val
, tmp
, NULL_TREE
);
4851 /* Add code to string lengths of actual arguments passed to a function against
4852 the expected lengths of the dummy arguments. */
4855 add_argument_checking (stmtblock_t
*block
, gfc_symbol
*sym
)
4857 gfc_formal_arglist
*formal
;
4859 for (formal
= gfc_sym_get_dummy_args (sym
); formal
; formal
= formal
->next
)
4860 if (formal
->sym
&& formal
->sym
->ts
.type
== BT_CHARACTER
4861 && !formal
->sym
->ts
.deferred
)
4863 enum tree_code comparison
;
4868 const char *message
;
4874 gcc_assert (cl
->passed_length
!= NULL_TREE
);
4875 gcc_assert (cl
->backend_decl
!= NULL_TREE
);
4877 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
4878 string lengths must match exactly. Otherwise, it is only required
4879 that the actual string length is *at least* the expected one.
4880 Sequence association allows for a mismatch of the string length
4881 if the actual argument is (part of) an array, but only if the
4882 dummy argument is an array. (See "Sequence association" in
4883 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
4884 if (fsym
->attr
.pointer
|| fsym
->attr
.allocatable
4885 || (fsym
->as
&& (fsym
->as
->type
== AS_ASSUMED_SHAPE
4886 || fsym
->as
->type
== AS_ASSUMED_RANK
)))
4888 comparison
= NE_EXPR
;
4889 message
= _("Actual string length does not match the declared one"
4890 " for dummy argument '%s' (%ld/%ld)");
4892 else if (fsym
->as
&& fsym
->as
->rank
!= 0)
4896 comparison
= LT_EXPR
;
4897 message
= _("Actual string length is shorter than the declared one"
4898 " for dummy argument '%s' (%ld/%ld)");
4901 /* Build the condition. For optional arguments, an actual length
4902 of 0 is also acceptable if the associated string is NULL, which
4903 means the argument was not passed. */
4904 cond
= fold_build2_loc (input_location
, comparison
, boolean_type_node
,
4905 cl
->passed_length
, cl
->backend_decl
);
4906 if (fsym
->attr
.optional
)
4912 not_0length
= fold_build2_loc (input_location
, NE_EXPR
,
4915 build_zero_cst (gfc_charlen_type_node
));
4916 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
4917 fsym
->attr
.referenced
= 1;
4918 not_absent
= gfc_conv_expr_present (fsym
);
4920 absent_failed
= fold_build2_loc (input_location
, TRUTH_OR_EXPR
,
4921 boolean_type_node
, not_0length
,
4924 cond
= fold_build2_loc (input_location
, TRUTH_AND_EXPR
,
4925 boolean_type_node
, cond
, absent_failed
);
4928 /* Build the runtime check. */
4929 argname
= gfc_build_cstring_const (fsym
->name
);
4930 argname
= gfc_build_addr_expr (pchar_type_node
, argname
);
4931 gfc_trans_runtime_check (true, false, cond
, block
, &fsym
->declared_at
,
4933 fold_convert (long_integer_type_node
,
4935 fold_convert (long_integer_type_node
,
4941 /* Generate the _gfortran_caf_this_image and _gfortran_caf_num_images
4942 global variables for -fcoarray=lib. They are placed into the translation
4943 unit of the main program. Make sure that in one TU (the one of the main
4944 program), the first call to gfc_init_coarray_decl is done with true.
4945 Otherwise, expect link errors. */
4948 gfc_init_coarray_decl (bool main_tu
)
4950 if (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
4953 if (gfort_gvar_caf_this_image
|| gfort_gvar_caf_num_images
)
4958 gfort_gvar_caf_this_image
4959 = build_decl (input_location
, VAR_DECL
,
4960 get_identifier (PREFIX("caf_this_image")),
4962 DECL_ARTIFICIAL (gfort_gvar_caf_this_image
) = 1;
4963 TREE_USED (gfort_gvar_caf_this_image
) = 1;
4964 TREE_PUBLIC (gfort_gvar_caf_this_image
) = 1;
4965 TREE_READONLY (gfort_gvar_caf_this_image
) = 0;
4968 TREE_STATIC (gfort_gvar_caf_this_image
) = 1;
4970 DECL_EXTERNAL (gfort_gvar_caf_this_image
) = 1;
4972 pushdecl_top_level (gfort_gvar_caf_this_image
);
4974 gfort_gvar_caf_num_images
4975 = build_decl (input_location
, VAR_DECL
,
4976 get_identifier (PREFIX("caf_num_images")),
4978 DECL_ARTIFICIAL (gfort_gvar_caf_num_images
) = 1;
4979 TREE_USED (gfort_gvar_caf_num_images
) = 1;
4980 TREE_PUBLIC (gfort_gvar_caf_num_images
) = 1;
4981 TREE_READONLY (gfort_gvar_caf_num_images
) = 0;
4984 TREE_STATIC (gfort_gvar_caf_num_images
) = 1;
4986 DECL_EXTERNAL (gfort_gvar_caf_num_images
) = 1;
4988 pushdecl_top_level (gfort_gvar_caf_num_images
);
4995 create_main_function (tree fndecl
)
4999 tree tmp
, decl
, result_decl
, argc
, argv
, typelist
, arglist
;
5002 old_context
= current_function_decl
;
5006 push_function_context ();
5007 saved_parent_function_decls
= saved_function_decls
;
5008 saved_function_decls
= NULL_TREE
;
5011 /* main() function must be declared with global scope. */
5012 gcc_assert (current_function_decl
== NULL_TREE
);
5014 /* Declare the function. */
5015 tmp
= build_function_type_list (integer_type_node
, integer_type_node
,
5016 build_pointer_type (pchar_type_node
),
5018 main_identifier_node
= get_identifier ("main");
5019 ftn_main
= build_decl (input_location
, FUNCTION_DECL
,
5020 main_identifier_node
, tmp
);
5021 DECL_EXTERNAL (ftn_main
) = 0;
5022 TREE_PUBLIC (ftn_main
) = 1;
5023 TREE_STATIC (ftn_main
) = 1;
5024 DECL_ATTRIBUTES (ftn_main
)
5025 = tree_cons (get_identifier("externally_visible"), NULL_TREE
, NULL_TREE
);
5027 /* Setup the result declaration (for "return 0"). */
5028 result_decl
= build_decl (input_location
,
5029 RESULT_DECL
, NULL_TREE
, integer_type_node
);
5030 DECL_ARTIFICIAL (result_decl
) = 1;
5031 DECL_IGNORED_P (result_decl
) = 1;
5032 DECL_CONTEXT (result_decl
) = ftn_main
;
5033 DECL_RESULT (ftn_main
) = result_decl
;
5035 pushdecl (ftn_main
);
5037 /* Get the arguments. */
5039 arglist
= NULL_TREE
;
5040 typelist
= TYPE_ARG_TYPES (TREE_TYPE (ftn_main
));
5042 tmp
= TREE_VALUE (typelist
);
5043 argc
= build_decl (input_location
, PARM_DECL
, get_identifier ("argc"), tmp
);
5044 DECL_CONTEXT (argc
) = ftn_main
;
5045 DECL_ARG_TYPE (argc
) = TREE_VALUE (typelist
);
5046 TREE_READONLY (argc
) = 1;
5047 gfc_finish_decl (argc
);
5048 arglist
= chainon (arglist
, argc
);
5050 typelist
= TREE_CHAIN (typelist
);
5051 tmp
= TREE_VALUE (typelist
);
5052 argv
= build_decl (input_location
, PARM_DECL
, get_identifier ("argv"), tmp
);
5053 DECL_CONTEXT (argv
) = ftn_main
;
5054 DECL_ARG_TYPE (argv
) = TREE_VALUE (typelist
);
5055 TREE_READONLY (argv
) = 1;
5056 DECL_BY_REFERENCE (argv
) = 1;
5057 gfc_finish_decl (argv
);
5058 arglist
= chainon (arglist
, argv
);
5060 DECL_ARGUMENTS (ftn_main
) = arglist
;
5061 current_function_decl
= ftn_main
;
5062 announce_function (ftn_main
);
5064 rest_of_decl_compilation (ftn_main
, 1, 0);
5065 make_decl_rtl (ftn_main
);
5066 allocate_struct_function (ftn_main
, false);
5069 gfc_init_block (&body
);
5071 /* Call some libgfortran initialization routines, call then MAIN__(). */
5073 /* Call _gfortran_caf_init (*argc, ***argv, *this_image, *num_images). */
5074 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
5076 tree pint_type
, pppchar_type
;
5077 pint_type
= build_pointer_type (integer_type_node
);
5079 = build_pointer_type (build_pointer_type (pchar_type_node
));
5081 gfc_init_coarray_decl (true);
5082 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_init
, 4,
5083 gfc_build_addr_expr (pint_type
, argc
),
5084 gfc_build_addr_expr (pppchar_type
, argv
),
5085 gfc_build_addr_expr (pint_type
, gfort_gvar_caf_this_image
),
5086 gfc_build_addr_expr (pint_type
, gfort_gvar_caf_num_images
));
5087 gfc_add_expr_to_block (&body
, tmp
);
5090 /* Call _gfortran_set_args (argc, argv). */
5091 TREE_USED (argc
) = 1;
5092 TREE_USED (argv
) = 1;
5093 tmp
= build_call_expr_loc (input_location
,
5094 gfor_fndecl_set_args
, 2, argc
, argv
);
5095 gfc_add_expr_to_block (&body
, tmp
);
5097 /* Add a call to set_options to set up the runtime library Fortran
5098 language standard parameters. */
5100 tree array_type
, array
, var
;
5101 vec
<constructor_elt
, va_gc
> *v
= NULL
;
5103 /* Passing a new option to the library requires four modifications:
5104 + add it to the tree_cons list below
5105 + change the array size in the call to build_array_type
5106 + change the first argument to the library call
5107 gfor_fndecl_set_options
5108 + modify the library (runtime/compile_options.c)! */
5110 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5111 build_int_cst (integer_type_node
,
5112 gfc_option
.warn_std
));
5113 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5114 build_int_cst (integer_type_node
,
5115 gfc_option
.allow_std
));
5116 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5117 build_int_cst (integer_type_node
, pedantic
));
5118 /* TODO: This is the old -fdump-core option, which is unused but
5119 passed due to ABI compatibility; remove when bumping the
5121 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5122 build_int_cst (integer_type_node
,
5124 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5125 build_int_cst (integer_type_node
,
5126 gfc_option
.flag_backtrace
));
5127 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5128 build_int_cst (integer_type_node
,
5129 gfc_option
.flag_sign_zero
));
5130 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5131 build_int_cst (integer_type_node
,
5133 & GFC_RTCHECK_BOUNDS
)));
5134 /* TODO: This is the -frange-check option, which no longer affects
5135 library behavior; when bumping the library ABI this slot can be
5136 reused for something else. As it is the last element in the
5137 array, we can instead leave it out altogether.
5138 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
5139 build_int_cst (integer_type_node,
5140 gfc_option.flag_range_check));
5143 array_type
= build_array_type (integer_type_node
,
5144 build_index_type (size_int (6)));
5145 array
= build_constructor (array_type
, v
);
5146 TREE_CONSTANT (array
) = 1;
5147 TREE_STATIC (array
) = 1;
5149 /* Create a static variable to hold the jump table. */
5150 var
= gfc_create_var (array_type
, "options");
5151 TREE_CONSTANT (var
) = 1;
5152 TREE_STATIC (var
) = 1;
5153 TREE_READONLY (var
) = 1;
5154 DECL_INITIAL (var
) = array
;
5155 var
= gfc_build_addr_expr (build_pointer_type (integer_type_node
), var
);
5157 tmp
= build_call_expr_loc (input_location
,
5158 gfor_fndecl_set_options
, 2,
5159 build_int_cst (integer_type_node
, 7), var
);
5160 gfc_add_expr_to_block (&body
, tmp
);
5163 /* If -ffpe-trap option was provided, add a call to set_fpe so that
5164 the library will raise a FPE when needed. */
5165 if (gfc_option
.fpe
!= 0)
5167 tmp
= build_call_expr_loc (input_location
,
5168 gfor_fndecl_set_fpe
, 1,
5169 build_int_cst (integer_type_node
,
5171 gfc_add_expr_to_block (&body
, tmp
);
5174 /* If this is the main program and an -fconvert option was provided,
5175 add a call to set_convert. */
5177 if (gfc_option
.convert
!= GFC_CONVERT_NATIVE
)
5179 tmp
= build_call_expr_loc (input_location
,
5180 gfor_fndecl_set_convert
, 1,
5181 build_int_cst (integer_type_node
,
5182 gfc_option
.convert
));
5183 gfc_add_expr_to_block (&body
, tmp
);
5186 /* If this is the main program and an -frecord-marker option was provided,
5187 add a call to set_record_marker. */
5189 if (gfc_option
.record_marker
!= 0)
5191 tmp
= build_call_expr_loc (input_location
,
5192 gfor_fndecl_set_record_marker
, 1,
5193 build_int_cst (integer_type_node
,
5194 gfc_option
.record_marker
));
5195 gfc_add_expr_to_block (&body
, tmp
);
5198 if (gfc_option
.max_subrecord_length
!= 0)
5200 tmp
= build_call_expr_loc (input_location
,
5201 gfor_fndecl_set_max_subrecord_length
, 1,
5202 build_int_cst (integer_type_node
,
5203 gfc_option
.max_subrecord_length
));
5204 gfc_add_expr_to_block (&body
, tmp
);
5207 /* Call MAIN__(). */
5208 tmp
= build_call_expr_loc (input_location
,
5210 gfc_add_expr_to_block (&body
, tmp
);
5212 /* Mark MAIN__ as used. */
5213 TREE_USED (fndecl
) = 1;
5215 /* Coarray: Call _gfortran_caf_finalize(void). */
5216 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
5218 /* Per F2008, 8.5.1 END of the main program implies a
5220 tmp
= builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE
);
5221 tmp
= build_call_expr_loc (input_location
, tmp
, 0);
5222 gfc_add_expr_to_block (&body
, tmp
);
5224 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_finalize
, 0);
5225 gfc_add_expr_to_block (&body
, tmp
);
5229 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, integer_type_node
,
5230 DECL_RESULT (ftn_main
),
5231 build_int_cst (integer_type_node
, 0));
5232 tmp
= build1_v (RETURN_EXPR
, tmp
);
5233 gfc_add_expr_to_block (&body
, tmp
);
5236 DECL_SAVED_TREE (ftn_main
) = gfc_finish_block (&body
);
5239 /* Finish off this function and send it for code generation. */
5241 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main
)) = ftn_main
;
5243 DECL_SAVED_TREE (ftn_main
)
5244 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (ftn_main
),
5245 DECL_INITIAL (ftn_main
));
5247 /* Output the GENERIC tree. */
5248 dump_function (TDI_original
, ftn_main
);
5250 cgraph_finalize_function (ftn_main
, true);
5254 pop_function_context ();
5255 saved_function_decls
= saved_parent_function_decls
;
5257 current_function_decl
= old_context
;
5261 /* Get the result expression for a procedure. */
5264 get_proc_result (gfc_symbol
* sym
)
5266 if (sym
->attr
.subroutine
|| sym
== sym
->result
)
5268 if (current_fake_result_decl
!= NULL
)
5269 return TREE_VALUE (current_fake_result_decl
);
5274 return sym
->result
->backend_decl
;
5278 /* Generate an appropriate return-statement for a procedure. */
5281 gfc_generate_return (void)
5287 sym
= current_procedure_symbol
;
5288 fndecl
= sym
->backend_decl
;
5290 if (TREE_TYPE (DECL_RESULT (fndecl
)) == void_type_node
)
5294 result
= get_proc_result (sym
);
5296 /* Set the return value to the dummy result variable. The
5297 types may be different for scalar default REAL functions
5298 with -ff2c, therefore we have to convert. */
5299 if (result
!= NULL_TREE
)
5301 result
= convert (TREE_TYPE (DECL_RESULT (fndecl
)), result
);
5302 result
= fold_build2_loc (input_location
, MODIFY_EXPR
,
5303 TREE_TYPE (result
), DECL_RESULT (fndecl
),
5308 return build1_v (RETURN_EXPR
, result
);
5312 /* Generate code for a function. */
5315 gfc_generate_function_code (gfc_namespace
* ns
)
5321 stmtblock_t init
, cleanup
;
5323 gfc_wrapped_block try_block
;
5324 tree recurcheckvar
= NULL_TREE
;
5326 gfc_symbol
*previous_procedure_symbol
;
5330 sym
= ns
->proc_name
;
5331 previous_procedure_symbol
= current_procedure_symbol
;
5332 current_procedure_symbol
= sym
;
5334 /* Check that the frontend isn't still using this. */
5335 gcc_assert (sym
->tlink
== NULL
);
5338 /* Create the declaration for functions with global scope. */
5339 if (!sym
->backend_decl
)
5340 gfc_create_function_decl (ns
, false);
5342 fndecl
= sym
->backend_decl
;
5343 old_context
= current_function_decl
;
5347 push_function_context ();
5348 saved_parent_function_decls
= saved_function_decls
;
5349 saved_function_decls
= NULL_TREE
;
5352 trans_function_start (sym
);
5354 gfc_init_block (&init
);
5356 if (ns
->entries
&& ns
->proc_name
->ts
.type
== BT_CHARACTER
)
5358 /* Copy length backend_decls to all entry point result
5363 gfc_conv_const_charlen (ns
->proc_name
->ts
.u
.cl
);
5364 backend_decl
= ns
->proc_name
->result
->ts
.u
.cl
->backend_decl
;
5365 for (el
= ns
->entries
; el
; el
= el
->next
)
5366 el
->sym
->result
->ts
.u
.cl
->backend_decl
= backend_decl
;
5369 /* Translate COMMON blocks. */
5370 gfc_trans_common (ns
);
5372 /* Null the parent fake result declaration if this namespace is
5373 a module function or an external procedures. */
5374 if ((ns
->parent
&& ns
->parent
->proc_name
->attr
.flavor
== FL_MODULE
)
5375 || ns
->parent
== NULL
)
5376 parent_fake_result_decl
= NULL_TREE
;
5378 gfc_generate_contained_functions (ns
);
5380 nonlocal_dummy_decls
= NULL
;
5381 nonlocal_dummy_decl_pset
= NULL
;
5383 has_coarray_vars
= false;
5384 generate_local_vars (ns
);
5386 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
5387 generate_coarray_init (ns
);
5389 /* Keep the parent fake result declaration in module functions
5390 or external procedures. */
5391 if ((ns
->parent
&& ns
->parent
->proc_name
->attr
.flavor
== FL_MODULE
)
5392 || ns
->parent
== NULL
)
5393 current_fake_result_decl
= parent_fake_result_decl
;
5395 current_fake_result_decl
= NULL_TREE
;
5397 is_recursive
= sym
->attr
.recursive
5398 || (sym
->attr
.entry_master
5399 && sym
->ns
->entries
->sym
->attr
.recursive
);
5400 if ((gfc_option
.rtcheck
& GFC_RTCHECK_RECURSION
)
5402 && !gfc_option
.flag_recursive
)
5406 asprintf (&msg
, "Recursive call to nonrecursive procedure '%s'",
5408 recurcheckvar
= gfc_create_var (boolean_type_node
, "is_recursive");
5409 TREE_STATIC (recurcheckvar
) = 1;
5410 DECL_INITIAL (recurcheckvar
) = boolean_false_node
;
5411 gfc_add_expr_to_block (&init
, recurcheckvar
);
5412 gfc_trans_runtime_check (true, false, recurcheckvar
, &init
,
5413 &sym
->declared_at
, msg
);
5414 gfc_add_modify (&init
, recurcheckvar
, boolean_true_node
);
5418 /* Now generate the code for the body of this function. */
5419 gfc_init_block (&body
);
5421 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
5422 && sym
->attr
.subroutine
)
5424 tree alternate_return
;
5425 alternate_return
= gfc_get_fake_result_decl (sym
, 0);
5426 gfc_add_modify (&body
, alternate_return
, integer_zero_node
);
5431 /* Jump to the correct entry point. */
5432 tmp
= gfc_trans_entry_master_switch (ns
->entries
);
5433 gfc_add_expr_to_block (&body
, tmp
);
5436 /* If bounds-checking is enabled, generate code to check passed in actual
5437 arguments against the expected dummy argument attributes (e.g. string
5439 if ((gfc_option
.rtcheck
& GFC_RTCHECK_BOUNDS
) && !sym
->attr
.is_bind_c
)
5440 add_argument_checking (&body
, sym
);
5442 tmp
= gfc_trans_code (ns
->code
);
5443 gfc_add_expr_to_block (&body
, tmp
);
5445 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
)
5447 tree result
= get_proc_result (sym
);
5449 if (result
!= NULL_TREE
&& sym
->attr
.function
&& !sym
->attr
.pointer
)
5451 if (sym
->attr
.allocatable
&& sym
->attr
.dimension
== 0
5452 && sym
->result
== sym
)
5453 gfc_add_modify (&init
, result
, fold_convert (TREE_TYPE (result
),
5454 null_pointer_node
));
5455 else if (sym
->ts
.type
== BT_CLASS
5456 && CLASS_DATA (sym
)->attr
.allocatable
5457 && CLASS_DATA (sym
)->attr
.dimension
== 0
5458 && sym
->result
== sym
)
5460 tmp
= CLASS_DATA (sym
)->backend_decl
;
5461 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
5462 TREE_TYPE (tmp
), result
, tmp
, NULL_TREE
);
5463 gfc_add_modify (&init
, tmp
, fold_convert (TREE_TYPE (tmp
),
5464 null_pointer_node
));
5466 else if (sym
->ts
.type
== BT_DERIVED
5467 && sym
->ts
.u
.derived
->attr
.alloc_comp
5468 && !sym
->attr
.allocatable
)
5470 rank
= sym
->as
? sym
->as
->rank
: 0;
5471 tmp
= gfc_nullify_alloc_comp (sym
->ts
.u
.derived
, result
, rank
);
5472 gfc_add_expr_to_block (&init
, tmp
);
5476 if (result
== NULL_TREE
)
5478 /* TODO: move to the appropriate place in resolve.c. */
5479 if (warn_return_type
&& sym
== sym
->result
)
5480 gfc_warning ("Return value of function '%s' at %L not set",
5481 sym
->name
, &sym
->declared_at
);
5482 if (warn_return_type
)
5483 TREE_NO_WARNING(sym
->backend_decl
) = 1;
5486 gfc_add_expr_to_block (&body
, gfc_generate_return ());
5489 gfc_init_block (&cleanup
);
5491 /* Reset recursion-check variable. */
5492 if ((gfc_option
.rtcheck
& GFC_RTCHECK_RECURSION
)
5494 && !gfc_option
.gfc_flag_openmp
5495 && recurcheckvar
!= NULL_TREE
)
5497 gfc_add_modify (&cleanup
, recurcheckvar
, boolean_false_node
);
5498 recurcheckvar
= NULL
;
5501 /* Finish the function body and add init and cleanup code. */
5502 tmp
= gfc_finish_block (&body
);
5503 gfc_start_wrapped_block (&try_block
, tmp
);
5504 /* Add code to create and cleanup arrays. */
5505 gfc_trans_deferred_vars (sym
, &try_block
);
5506 gfc_add_init_cleanup (&try_block
, gfc_finish_block (&init
),
5507 gfc_finish_block (&cleanup
));
5509 /* Add all the decls we created during processing. */
5510 decl
= saved_function_decls
;
5515 next
= DECL_CHAIN (decl
);
5516 DECL_CHAIN (decl
) = NULL_TREE
;
5520 saved_function_decls
= NULL_TREE
;
5522 DECL_SAVED_TREE (fndecl
) = gfc_finish_wrapped_block (&try_block
);
5525 /* Finish off this function and send it for code generation. */
5527 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
5529 DECL_SAVED_TREE (fndecl
)
5530 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
5531 DECL_INITIAL (fndecl
));
5533 if (nonlocal_dummy_decls
)
5535 BLOCK_VARS (DECL_INITIAL (fndecl
))
5536 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl
)), nonlocal_dummy_decls
);
5537 pointer_set_destroy (nonlocal_dummy_decl_pset
);
5538 nonlocal_dummy_decls
= NULL
;
5539 nonlocal_dummy_decl_pset
= NULL
;
5542 /* Output the GENERIC tree. */
5543 dump_function (TDI_original
, fndecl
);
5545 /* Store the end of the function, so that we get good line number
5546 info for the epilogue. */
5547 cfun
->function_end_locus
= input_location
;
5549 /* We're leaving the context of this function, so zap cfun.
5550 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5551 tree_rest_of_compilation. */
5556 pop_function_context ();
5557 saved_function_decls
= saved_parent_function_decls
;
5559 current_function_decl
= old_context
;
5561 if (decl_function_context (fndecl
) && gfc_option
.coarray
!= GFC_FCOARRAY_LIB
5562 && has_coarray_vars
)
5563 /* Register this function with cgraph just far enough to get it
5564 added to our parent's nested function list.
5565 If there are static coarrays in this function, the nested _caf_init
5566 function has already called cgraph_create_node, which also created
5567 the cgraph node for this function. */
5568 (void) cgraph_create_node (fndecl
);
5570 cgraph_finalize_function (fndecl
, true);
5572 gfc_trans_use_stmts (ns
);
5573 gfc_traverse_ns (ns
, gfc_emit_parameter_debug_info
);
5575 if (sym
->attr
.is_main_program
)
5576 create_main_function (fndecl
);
5578 current_procedure_symbol
= previous_procedure_symbol
;
5583 gfc_generate_constructors (void)
5585 gcc_assert (gfc_static_ctors
== NULL_TREE
);
5593 if (gfc_static_ctors
== NULL_TREE
)
5596 fnname
= get_file_function_name ("I");
5597 type
= build_function_type_list (void_type_node
, NULL_TREE
);
5599 fndecl
= build_decl (input_location
,
5600 FUNCTION_DECL
, fnname
, type
);
5601 TREE_PUBLIC (fndecl
) = 1;
5603 decl
= build_decl (input_location
,
5604 RESULT_DECL
, NULL_TREE
, void_type_node
);
5605 DECL_ARTIFICIAL (decl
) = 1;
5606 DECL_IGNORED_P (decl
) = 1;
5607 DECL_CONTEXT (decl
) = fndecl
;
5608 DECL_RESULT (fndecl
) = decl
;
5612 current_function_decl
= fndecl
;
5614 rest_of_decl_compilation (fndecl
, 1, 0);
5616 make_decl_rtl (fndecl
);
5618 allocate_struct_function (fndecl
, false);
5622 for (; gfc_static_ctors
; gfc_static_ctors
= TREE_CHAIN (gfc_static_ctors
))
5624 tmp
= build_call_expr_loc (input_location
,
5625 TREE_VALUE (gfc_static_ctors
), 0);
5626 DECL_SAVED_TREE (fndecl
) = build_stmt (input_location
, EXPR_STMT
, tmp
);
5632 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
5633 DECL_SAVED_TREE (fndecl
)
5634 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
5635 DECL_INITIAL (fndecl
));
5637 free_after_parsing (cfun
);
5638 free_after_compilation (cfun
);
5640 tree_rest_of_compilation (fndecl
);
5642 current_function_decl
= NULL_TREE
;
5646 /* Translates a BLOCK DATA program unit. This means emitting the
5647 commons contained therein plus their initializations. We also emit
5648 a globally visible symbol to make sure that each BLOCK DATA program
5649 unit remains unique. */
5652 gfc_generate_block_data (gfc_namespace
* ns
)
5657 /* Tell the backend the source location of the block data. */
5659 gfc_set_backend_locus (&ns
->proc_name
->declared_at
);
5661 gfc_set_backend_locus (&gfc_current_locus
);
5663 /* Process the DATA statements. */
5664 gfc_trans_common (ns
);
5666 /* Create a global symbol with the mane of the block data. This is to
5667 generate linker errors if the same name is used twice. It is never
5670 id
= gfc_sym_mangled_function_id (ns
->proc_name
);
5672 id
= get_identifier ("__BLOCK_DATA__");
5674 decl
= build_decl (input_location
,
5675 VAR_DECL
, id
, gfc_array_index_type
);
5676 TREE_PUBLIC (decl
) = 1;
5677 TREE_STATIC (decl
) = 1;
5678 DECL_IGNORED_P (decl
) = 1;
5681 rest_of_decl_compilation (decl
, 1, 0);
5685 /* Process the local variables of a BLOCK construct. */
5688 gfc_process_block_locals (gfc_namespace
* ns
)
5692 gcc_assert (saved_local_decls
== NULL_TREE
);
5693 has_coarray_vars
= false;
5695 generate_local_vars (ns
);
5697 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
5698 generate_coarray_init (ns
);
5700 decl
= saved_local_decls
;
5705 next
= DECL_CHAIN (decl
);
5706 DECL_CHAIN (decl
) = NULL_TREE
;
5710 saved_local_decls
= NULL_TREE
;
5714 #include "gt-fortran-trans-decl.h"