1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4 Free Software Foundation, Inc.
5 Contributed by Paul Brook
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* trans-decl.c -- Handling of backend function and variable decls, etc */
27 #include "coretypes.h"
30 #include "tree-dump.h"
31 #include "gimple.h" /* For create_tmp_var_raw. */
33 #include "diagnostic-core.h" /* For internal_error. */
34 #include "toplev.h" /* For announce_function. */
35 #include "output.h" /* For decl_default_tls_model. */
42 #include "pointer-set.h"
43 #include "constructor.h"
45 #include "trans-types.h"
46 #include "trans-array.h"
47 #include "trans-const.h"
48 /* Only for gfc_trans_code. Shouldn't need to include this. */
49 #include "trans-stmt.h"
51 #define MAX_LABEL_VALUE 99999
54 /* Holds the result of the function if no result variable specified. */
56 static GTY(()) tree current_fake_result_decl
;
57 static GTY(()) tree parent_fake_result_decl
;
60 /* Holds the variable DECLs for the current function. */
62 static GTY(()) tree saved_function_decls
;
63 static GTY(()) tree saved_parent_function_decls
;
65 static struct pointer_set_t
*nonlocal_dummy_decl_pset
;
66 static GTY(()) tree nonlocal_dummy_decls
;
68 /* Holds the variable DECLs that are locals. */
70 static GTY(()) tree saved_local_decls
;
72 /* The namespace of the module we're currently generating. Only used while
73 outputting decls for module variables. Do not rely on this being set. */
75 static gfc_namespace
*module_namespace
;
77 /* The currently processed procedure symbol. */
78 static gfc_symbol
* current_procedure_symbol
= NULL
;
81 /* With -fcoarray=lib: For generating the registering call
82 of static coarrays. */
83 static bool has_coarray_vars
;
84 static stmtblock_t caf_init_block
;
87 /* List of static constructor functions. */
89 tree gfc_static_ctors
;
92 /* Function declarations for builtin library functions. */
94 tree gfor_fndecl_pause_numeric
;
95 tree gfor_fndecl_pause_string
;
96 tree gfor_fndecl_stop_numeric
;
97 tree gfor_fndecl_stop_numeric_f08
;
98 tree gfor_fndecl_stop_string
;
99 tree gfor_fndecl_error_stop_numeric
;
100 tree gfor_fndecl_error_stop_string
;
101 tree gfor_fndecl_runtime_error
;
102 tree gfor_fndecl_runtime_error_at
;
103 tree gfor_fndecl_runtime_warning_at
;
104 tree gfor_fndecl_os_error
;
105 tree gfor_fndecl_generate_error
;
106 tree gfor_fndecl_set_args
;
107 tree gfor_fndecl_set_fpe
;
108 tree gfor_fndecl_set_options
;
109 tree gfor_fndecl_set_convert
;
110 tree gfor_fndecl_set_record_marker
;
111 tree gfor_fndecl_set_max_subrecord_length
;
112 tree gfor_fndecl_ctime
;
113 tree gfor_fndecl_fdate
;
114 tree gfor_fndecl_ttynam
;
115 tree gfor_fndecl_in_pack
;
116 tree gfor_fndecl_in_unpack
;
117 tree gfor_fndecl_associated
;
120 /* Coarray run-time library function decls. */
121 tree gfor_fndecl_caf_init
;
122 tree gfor_fndecl_caf_finalize
;
123 tree gfor_fndecl_caf_register
;
124 tree gfor_fndecl_caf_deregister
;
125 tree gfor_fndecl_caf_critical
;
126 tree gfor_fndecl_caf_end_critical
;
127 tree gfor_fndecl_caf_sync_all
;
128 tree gfor_fndecl_caf_sync_images
;
129 tree gfor_fndecl_caf_error_stop
;
130 tree gfor_fndecl_caf_error_stop_str
;
132 /* Coarray global variables for num_images/this_image. */
134 tree gfort_gvar_caf_num_images
;
135 tree gfort_gvar_caf_this_image
;
138 /* Math functions. Many other math functions are handled in
139 trans-intrinsic.c. */
141 gfc_powdecl_list gfor_fndecl_math_powi
[4][3];
142 tree gfor_fndecl_math_ishftc4
;
143 tree gfor_fndecl_math_ishftc8
;
144 tree gfor_fndecl_math_ishftc16
;
147 /* String functions. */
149 tree gfor_fndecl_compare_string
;
150 tree gfor_fndecl_concat_string
;
151 tree gfor_fndecl_string_len_trim
;
152 tree gfor_fndecl_string_index
;
153 tree gfor_fndecl_string_scan
;
154 tree gfor_fndecl_string_verify
;
155 tree gfor_fndecl_string_trim
;
156 tree gfor_fndecl_string_minmax
;
157 tree gfor_fndecl_adjustl
;
158 tree gfor_fndecl_adjustr
;
159 tree gfor_fndecl_select_string
;
160 tree gfor_fndecl_compare_string_char4
;
161 tree gfor_fndecl_concat_string_char4
;
162 tree gfor_fndecl_string_len_trim_char4
;
163 tree gfor_fndecl_string_index_char4
;
164 tree gfor_fndecl_string_scan_char4
;
165 tree gfor_fndecl_string_verify_char4
;
166 tree gfor_fndecl_string_trim_char4
;
167 tree gfor_fndecl_string_minmax_char4
;
168 tree gfor_fndecl_adjustl_char4
;
169 tree gfor_fndecl_adjustr_char4
;
170 tree gfor_fndecl_select_string_char4
;
173 /* Conversion between character kinds. */
174 tree gfor_fndecl_convert_char1_to_char4
;
175 tree gfor_fndecl_convert_char4_to_char1
;
178 /* Other misc. runtime library functions. */
179 tree gfor_fndecl_size0
;
180 tree gfor_fndecl_size1
;
181 tree gfor_fndecl_iargc
;
183 /* Intrinsic functions implemented in Fortran. */
184 tree gfor_fndecl_sc_kind
;
185 tree gfor_fndecl_si_kind
;
186 tree gfor_fndecl_sr_kind
;
188 /* BLAS gemm functions. */
189 tree gfor_fndecl_sgemm
;
190 tree gfor_fndecl_dgemm
;
191 tree gfor_fndecl_cgemm
;
192 tree gfor_fndecl_zgemm
;
196 gfc_add_decl_to_parent_function (tree decl
)
199 DECL_CONTEXT (decl
) = DECL_CONTEXT (current_function_decl
);
200 DECL_NONLOCAL (decl
) = 1;
201 DECL_CHAIN (decl
) = saved_parent_function_decls
;
202 saved_parent_function_decls
= decl
;
206 gfc_add_decl_to_function (tree decl
)
209 TREE_USED (decl
) = 1;
210 DECL_CONTEXT (decl
) = current_function_decl
;
211 DECL_CHAIN (decl
) = saved_function_decls
;
212 saved_function_decls
= decl
;
216 add_decl_as_local (tree decl
)
219 TREE_USED (decl
) = 1;
220 DECL_CONTEXT (decl
) = current_function_decl
;
221 DECL_CHAIN (decl
) = saved_local_decls
;
222 saved_local_decls
= decl
;
226 /* Build a backend label declaration. Set TREE_USED for named labels.
227 The context of the label is always the current_function_decl. All
228 labels are marked artificial. */
231 gfc_build_label_decl (tree label_id
)
233 /* 2^32 temporaries should be enough. */
234 static unsigned int tmp_num
= 1;
238 if (label_id
== NULL_TREE
)
240 /* Build an internal label name. */
241 ASM_FORMAT_PRIVATE_NAME (label_name
, "L", tmp_num
++);
242 label_id
= get_identifier (label_name
);
247 /* Build the LABEL_DECL node. Labels have no type. */
248 label_decl
= build_decl (input_location
,
249 LABEL_DECL
, label_id
, void_type_node
);
250 DECL_CONTEXT (label_decl
) = current_function_decl
;
251 DECL_MODE (label_decl
) = VOIDmode
;
253 /* We always define the label as used, even if the original source
254 file never references the label. We don't want all kinds of
255 spurious warnings for old-style Fortran code with too many
257 TREE_USED (label_decl
) = 1;
259 DECL_ARTIFICIAL (label_decl
) = 1;
264 /* Set the backend source location of a decl. */
267 gfc_set_decl_location (tree decl
, locus
* loc
)
269 DECL_SOURCE_LOCATION (decl
) = loc
->lb
->location
;
273 /* Return the backend label declaration for a given label structure,
274 or create it if it doesn't exist yet. */
277 gfc_get_label_decl (gfc_st_label
* lp
)
279 if (lp
->backend_decl
)
280 return lp
->backend_decl
;
283 char label_name
[GFC_MAX_SYMBOL_LEN
+ 1];
286 /* Validate the label declaration from the front end. */
287 gcc_assert (lp
!= NULL
&& lp
->value
<= MAX_LABEL_VALUE
);
289 /* Build a mangled name for the label. */
290 sprintf (label_name
, "__label_%.6d", lp
->value
);
292 /* Build the LABEL_DECL node. */
293 label_decl
= gfc_build_label_decl (get_identifier (label_name
));
295 /* Tell the debugger where the label came from. */
296 if (lp
->value
<= MAX_LABEL_VALUE
) /* An internal label. */
297 gfc_set_decl_location (label_decl
, &lp
->where
);
299 DECL_ARTIFICIAL (label_decl
) = 1;
301 /* Store the label in the label list and return the LABEL_DECL. */
302 lp
->backend_decl
= label_decl
;
308 /* Convert a gfc_symbol to an identifier of the same name. */
311 gfc_sym_identifier (gfc_symbol
* sym
)
313 if (sym
->attr
.is_main_program
&& strcmp (sym
->name
, "main") == 0)
314 return (get_identifier ("MAIN__"));
316 return (get_identifier (sym
->name
));
320 /* Construct mangled name from symbol name. */
323 gfc_sym_mangled_identifier (gfc_symbol
* sym
)
325 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 1];
327 /* Prevent the mangling of identifiers that have an assigned
328 binding label (mainly those that are bind(c)). */
329 if (sym
->attr
.is_bind_c
== 1 && sym
->binding_label
)
330 return get_identifier (sym
->binding_label
);
332 if (sym
->module
== NULL
)
333 return gfc_sym_identifier (sym
);
336 snprintf (name
, sizeof name
, "__%s_MOD_%s", sym
->module
, sym
->name
);
337 return get_identifier (name
);
342 /* Construct mangled function name from symbol name. */
345 gfc_sym_mangled_function_id (gfc_symbol
* sym
)
348 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 1];
350 /* It may be possible to simply use the binding label if it's
351 provided, and remove the other checks. Then we could use it
352 for other things if we wished. */
353 if ((sym
->attr
.is_bind_c
== 1 || sym
->attr
.is_iso_c
== 1) &&
355 /* use the binding label rather than the mangled name */
356 return get_identifier (sym
->binding_label
);
358 if (sym
->module
== NULL
|| sym
->attr
.proc
== PROC_EXTERNAL
359 || (sym
->module
!= NULL
&& (sym
->attr
.external
360 || sym
->attr
.if_source
== IFSRC_IFBODY
)))
362 /* Main program is mangled into MAIN__. */
363 if (sym
->attr
.is_main_program
)
364 return get_identifier ("MAIN__");
366 /* Intrinsic procedures are never mangled. */
367 if (sym
->attr
.proc
== PROC_INTRINSIC
)
368 return get_identifier (sym
->name
);
370 if (gfc_option
.flag_underscoring
)
372 has_underscore
= strchr (sym
->name
, '_') != 0;
373 if (gfc_option
.flag_second_underscore
&& has_underscore
)
374 snprintf (name
, sizeof name
, "%s__", sym
->name
);
376 snprintf (name
, sizeof name
, "%s_", sym
->name
);
377 return get_identifier (name
);
380 return get_identifier (sym
->name
);
384 snprintf (name
, sizeof name
, "__%s_MOD_%s", sym
->module
, sym
->name
);
385 return get_identifier (name
);
391 gfc_set_decl_assembler_name (tree decl
, tree name
)
393 tree target_mangled
= targetm
.mangle_decl_assembler_name (decl
, name
);
394 SET_DECL_ASSEMBLER_NAME (decl
, target_mangled
);
398 /* Returns true if a variable of specified size should go on the stack. */
401 gfc_can_put_var_on_stack (tree size
)
403 unsigned HOST_WIDE_INT low
;
405 if (!INTEGER_CST_P (size
))
408 if (gfc_option
.flag_max_stack_var_size
< 0)
411 if (TREE_INT_CST_HIGH (size
) != 0)
414 low
= TREE_INT_CST_LOW (size
);
415 if (low
> (unsigned HOST_WIDE_INT
) gfc_option
.flag_max_stack_var_size
)
418 /* TODO: Set a per-function stack size limit. */
424 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
425 an expression involving its corresponding pointer. There are
426 2 cases; one for variable size arrays, and one for everything else,
427 because variable-sized arrays require one fewer level of
431 gfc_finish_cray_pointee (tree decl
, gfc_symbol
*sym
)
433 tree ptr_decl
= gfc_get_symbol_decl (sym
->cp_pointer
);
436 /* Parameters need to be dereferenced. */
437 if (sym
->cp_pointer
->attr
.dummy
)
438 ptr_decl
= build_fold_indirect_ref_loc (input_location
,
441 /* Check to see if we're dealing with a variable-sized array. */
442 if (sym
->attr
.dimension
443 && TREE_CODE (TREE_TYPE (decl
)) == POINTER_TYPE
)
445 /* These decls will be dereferenced later, so we don't dereference
447 value
= convert (TREE_TYPE (decl
), ptr_decl
);
451 ptr_decl
= convert (build_pointer_type (TREE_TYPE (decl
)),
453 value
= build_fold_indirect_ref_loc (input_location
,
457 SET_DECL_VALUE_EXPR (decl
, value
);
458 DECL_HAS_VALUE_EXPR_P (decl
) = 1;
459 GFC_DECL_CRAY_POINTEE (decl
) = 1;
460 /* This is a fake variable just for debugging purposes. */
461 TREE_ASM_WRITTEN (decl
) = 1;
465 /* Finish processing of a declaration without an initial value. */
468 gfc_finish_decl (tree decl
)
470 gcc_assert (TREE_CODE (decl
) == PARM_DECL
471 || DECL_INITIAL (decl
) == NULL_TREE
);
473 if (TREE_CODE (decl
) != VAR_DECL
)
476 if (DECL_SIZE (decl
) == NULL_TREE
477 && TYPE_SIZE (TREE_TYPE (decl
)) != NULL_TREE
)
478 layout_decl (decl
, 0);
480 /* A few consistency checks. */
481 /* A static variable with an incomplete type is an error if it is
482 initialized. Also if it is not file scope. Otherwise, let it
483 through, but if it is not `extern' then it may cause an error
485 /* An automatic variable with an incomplete type is an error. */
487 /* We should know the storage size. */
488 gcc_assert (DECL_SIZE (decl
) != NULL_TREE
489 || (TREE_STATIC (decl
)
490 ? (!DECL_INITIAL (decl
) || !DECL_CONTEXT (decl
))
491 : DECL_EXTERNAL (decl
)));
493 /* The storage size should be constant. */
494 gcc_assert ((!DECL_EXTERNAL (decl
) && !TREE_STATIC (decl
))
496 || TREE_CODE (DECL_SIZE (decl
)) == INTEGER_CST
);
500 /* Apply symbol attributes to a variable, and add it to the function scope. */
503 gfc_finish_var_decl (tree decl
, gfc_symbol
* sym
)
506 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
507 This is the equivalent of the TARGET variables.
508 We also need to set this if the variable is passed by reference in a
511 /* Set DECL_VALUE_EXPR for Cray Pointees. */
512 if (sym
->attr
.cray_pointee
)
513 gfc_finish_cray_pointee (decl
, sym
);
515 if (sym
->attr
.target
)
516 TREE_ADDRESSABLE (decl
) = 1;
517 /* If it wasn't used we wouldn't be getting it. */
518 TREE_USED (decl
) = 1;
520 if (sym
->attr
.flavor
== FL_PARAMETER
521 && (sym
->attr
.dimension
|| sym
->ts
.type
== BT_DERIVED
))
522 TREE_READONLY (decl
) = 1;
524 /* Chain this decl to the pending declarations. Don't do pushdecl()
525 because this would add them to the current scope rather than the
527 if (current_function_decl
!= NULL_TREE
)
529 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
530 || sym
->result
== sym
)
531 gfc_add_decl_to_function (decl
);
532 else if (sym
->ns
->proc_name
->attr
.flavor
== FL_LABEL
)
533 /* This is a BLOCK construct. */
534 add_decl_as_local (decl
);
536 gfc_add_decl_to_parent_function (decl
);
539 if (sym
->attr
.cray_pointee
)
542 if(sym
->attr
.is_bind_c
== 1)
544 /* We need to put variables that are bind(c) into the common
545 segment of the object file, because this is what C would do.
546 gfortran would typically put them in either the BSS or
547 initialized data segments, and only mark them as common if
548 they were part of common blocks. However, if they are not put
549 into common space, then C cannot initialize global Fortran
550 variables that it interoperates with and the draft says that
551 either Fortran or C should be able to initialize it (but not
552 both, of course.) (J3/04-007, section 15.3). */
553 TREE_PUBLIC(decl
) = 1;
554 DECL_COMMON(decl
) = 1;
557 /* If a variable is USE associated, it's always external. */
558 if (sym
->attr
.use_assoc
)
560 DECL_EXTERNAL (decl
) = 1;
561 TREE_PUBLIC (decl
) = 1;
563 else if (sym
->module
&& !sym
->attr
.result
&& !sym
->attr
.dummy
)
565 /* TODO: Don't set sym->module for result or dummy variables. */
566 gcc_assert (current_function_decl
== NULL_TREE
|| sym
->result
== sym
);
567 /* This is the declaration of a module variable. */
568 TREE_PUBLIC (decl
) = 1;
569 TREE_STATIC (decl
) = 1;
572 /* Derived types are a bit peculiar because of the possibility of
573 a default initializer; this must be applied each time the variable
574 comes into scope it therefore need not be static. These variables
575 are SAVE_NONE but have an initializer. Otherwise explicitly
576 initialized variables are SAVE_IMPLICIT and explicitly saved are
578 if (!sym
->attr
.use_assoc
579 && (sym
->attr
.save
!= SAVE_NONE
|| sym
->attr
.data
580 || (sym
->value
&& sym
->ns
->proc_name
->attr
.is_main_program
)
581 || (gfc_option
.coarray
== GFC_FCOARRAY_LIB
582 && sym
->attr
.codimension
&& !sym
->attr
.allocatable
)))
583 TREE_STATIC (decl
) = 1;
585 if (sym
->attr
.volatile_
)
587 TREE_THIS_VOLATILE (decl
) = 1;
588 TREE_SIDE_EFFECTS (decl
) = 1;
589 new_type
= build_qualified_type (TREE_TYPE (decl
), TYPE_QUAL_VOLATILE
);
590 TREE_TYPE (decl
) = new_type
;
593 /* Keep variables larger than max-stack-var-size off stack. */
594 if (!sym
->ns
->proc_name
->attr
.recursive
595 && INTEGER_CST_P (DECL_SIZE_UNIT (decl
))
596 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl
))
597 /* Put variable length auto array pointers always into stack. */
598 && (TREE_CODE (TREE_TYPE (decl
)) != POINTER_TYPE
599 || sym
->attr
.dimension
== 0
600 || sym
->as
->type
!= AS_EXPLICIT
602 || sym
->attr
.allocatable
)
603 && !DECL_ARTIFICIAL (decl
))
604 TREE_STATIC (decl
) = 1;
606 /* Handle threadprivate variables. */
607 if (sym
->attr
.threadprivate
608 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
609 DECL_TLS_MODEL (decl
) = decl_default_tls_model (decl
);
611 if (!sym
->attr
.target
612 && !sym
->attr
.pointer
613 && !sym
->attr
.cray_pointee
614 && !sym
->attr
.proc_pointer
)
615 DECL_RESTRICTED_P (decl
) = 1;
619 /* Allocate the lang-specific part of a decl. */
622 gfc_allocate_lang_decl (tree decl
)
624 DECL_LANG_SPECIFIC (decl
) = ggc_alloc_cleared_lang_decl(sizeof
628 /* Remember a symbol to generate initialization/cleanup code at function
632 gfc_defer_symbol_init (gfc_symbol
* sym
)
638 /* Don't add a symbol twice. */
642 last
= head
= sym
->ns
->proc_name
;
645 /* Make sure that setup code for dummy variables which are used in the
646 setup of other variables is generated first. */
649 /* Find the first dummy arg seen after us, or the first non-dummy arg.
650 This is a circular list, so don't go past the head. */
652 && (!p
->attr
.dummy
|| p
->dummy_order
> sym
->dummy_order
))
658 /* Insert in between last and p. */
664 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
665 backend_decl for a module symbol, if it all ready exists. If the
666 module gsymbol does not exist, it is created. If the symbol does
667 not exist, it is added to the gsymbol namespace. Returns true if
668 an existing backend_decl is found. */
671 gfc_get_module_backend_decl (gfc_symbol
*sym
)
677 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->module
);
679 if (!gsym
|| (gsym
->ns
&& gsym
->type
== GSYM_MODULE
))
685 gfc_find_symbol (sym
->name
, gsym
->ns
, 0, &s
);
691 gsym
= gfc_get_gsymbol (sym
->module
);
692 gsym
->type
= GSYM_MODULE
;
693 gsym
->ns
= gfc_get_namespace (NULL
, 0);
696 st
= gfc_new_symtree (&gsym
->ns
->sym_root
, sym
->name
);
700 else if (sym
->attr
.flavor
== FL_DERIVED
)
702 if (s
&& s
->attr
.flavor
== FL_PROCEDURE
)
705 gcc_assert (s
->attr
.generic
);
706 for (intr
= s
->generic
; intr
; intr
= intr
->next
)
707 if (intr
->sym
->attr
.flavor
== FL_DERIVED
)
714 if (!s
->backend_decl
)
715 s
->backend_decl
= gfc_get_derived_type (s
);
716 gfc_copy_dt_decls_ifequal (s
, sym
, true);
719 else if (s
->backend_decl
)
721 if (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
)
722 gfc_copy_dt_decls_ifequal (s
->ts
.u
.derived
, sym
->ts
.u
.derived
,
724 else if (sym
->ts
.type
== BT_CHARACTER
)
725 sym
->ts
.u
.cl
->backend_decl
= s
->ts
.u
.cl
->backend_decl
;
726 sym
->backend_decl
= s
->backend_decl
;
734 /* Create an array index type variable with function scope. */
737 create_index_var (const char * pfx
, int nest
)
741 decl
= gfc_create_var_np (gfc_array_index_type
, pfx
);
743 gfc_add_decl_to_parent_function (decl
);
745 gfc_add_decl_to_function (decl
);
750 /* Create variables to hold all the non-constant bits of info for a
751 descriptorless array. Remember these in the lang-specific part of the
755 gfc_build_qualified_array (tree decl
, gfc_symbol
* sym
)
760 gfc_namespace
* procns
;
762 type
= TREE_TYPE (decl
);
764 /* We just use the descriptor, if there is one. */
765 if (GFC_DESCRIPTOR_TYPE_P (type
))
768 gcc_assert (GFC_ARRAY_TYPE_P (type
));
769 procns
= gfc_find_proc_namespace (sym
->ns
);
770 nest
= (procns
->proc_name
->backend_decl
!= current_function_decl
)
771 && !sym
->attr
.contained
;
773 if (sym
->attr
.codimension
&& gfc_option
.coarray
== GFC_FCOARRAY_LIB
774 && sym
->as
->type
!= AS_ASSUMED_SHAPE
775 && GFC_TYPE_ARRAY_CAF_TOKEN (type
) == NULL_TREE
)
779 token
= gfc_create_var_np (build_qualified_type (pvoid_type_node
,
782 GFC_TYPE_ARRAY_CAF_TOKEN (type
) = token
;
783 DECL_ARTIFICIAL (token
) = 1;
784 TREE_STATIC (token
) = 1;
785 gfc_add_decl_to_function (token
);
788 for (dim
= 0; dim
< GFC_TYPE_ARRAY_RANK (type
); dim
++)
790 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
792 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
793 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type
, dim
)) = 1;
795 /* Don't try to use the unknown bound for assumed shape arrays. */
796 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
797 && (sym
->as
->type
!= AS_ASSUMED_SIZE
798 || dim
< GFC_TYPE_ARRAY_RANK (type
) - 1))
800 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
801 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type
, dim
)) = 1;
804 if (GFC_TYPE_ARRAY_STRIDE (type
, dim
) == NULL_TREE
)
806 GFC_TYPE_ARRAY_STRIDE (type
, dim
) = create_index_var ("stride", nest
);
807 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type
, dim
)) = 1;
810 for (dim
= GFC_TYPE_ARRAY_RANK (type
);
811 dim
< GFC_TYPE_ARRAY_RANK (type
) + GFC_TYPE_ARRAY_CORANK (type
); dim
++)
813 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
815 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
816 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type
, dim
)) = 1;
818 /* Don't try to use the unknown ubound for the last coarray dimension. */
819 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
820 && dim
< GFC_TYPE_ARRAY_RANK (type
) + GFC_TYPE_ARRAY_CORANK (type
) - 1)
822 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
823 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type
, dim
)) = 1;
826 if (GFC_TYPE_ARRAY_OFFSET (type
) == NULL_TREE
)
828 GFC_TYPE_ARRAY_OFFSET (type
) = gfc_create_var_np (gfc_array_index_type
,
830 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type
)) = 1;
833 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type
));
835 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type
));
838 if (GFC_TYPE_ARRAY_SIZE (type
) == NULL_TREE
839 && sym
->as
->type
!= AS_ASSUMED_SIZE
)
841 GFC_TYPE_ARRAY_SIZE (type
) = create_index_var ("size", nest
);
842 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type
)) = 1;
845 if (POINTER_TYPE_P (type
))
847 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type
)));
848 gcc_assert (TYPE_LANG_SPECIFIC (type
)
849 == TYPE_LANG_SPECIFIC (TREE_TYPE (type
)));
850 type
= TREE_TYPE (type
);
853 if (! COMPLETE_TYPE_P (type
) && GFC_TYPE_ARRAY_SIZE (type
))
857 size
= fold_build2_loc (input_location
, MINUS_EXPR
, gfc_array_index_type
,
858 GFC_TYPE_ARRAY_SIZE (type
), gfc_index_one_node
);
859 range
= build_range_type (gfc_array_index_type
, gfc_index_zero_node
,
861 TYPE_DOMAIN (type
) = range
;
865 if (TYPE_NAME (type
) != NULL_TREE
866 && GFC_TYPE_ARRAY_UBOUND (type
, sym
->as
->rank
- 1) != NULL_TREE
867 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type
, sym
->as
->rank
- 1)) == VAR_DECL
)
869 tree gtype
= DECL_ORIGINAL_TYPE (TYPE_NAME (type
));
871 for (dim
= 0; dim
< sym
->as
->rank
- 1; dim
++)
873 gcc_assert (TREE_CODE (gtype
) == ARRAY_TYPE
);
874 gtype
= TREE_TYPE (gtype
);
876 gcc_assert (TREE_CODE (gtype
) == ARRAY_TYPE
);
877 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype
)) == NULL
)
878 TYPE_NAME (type
) = NULL_TREE
;
881 if (TYPE_NAME (type
) == NULL_TREE
)
883 tree gtype
= TREE_TYPE (type
), rtype
, type_decl
;
885 for (dim
= sym
->as
->rank
- 1; dim
>= 0; dim
--)
888 lbound
= GFC_TYPE_ARRAY_LBOUND (type
, dim
);
889 ubound
= GFC_TYPE_ARRAY_UBOUND (type
, dim
);
890 rtype
= build_range_type (gfc_array_index_type
, lbound
, ubound
);
891 gtype
= build_array_type (gtype
, rtype
);
892 /* Ensure the bound variables aren't optimized out at -O0.
893 For -O1 and above they often will be optimized out, but
894 can be tracked by VTA. Also set DECL_NAMELESS, so that
895 the artificial lbound.N or ubound.N DECL_NAME doesn't
896 end up in debug info. */
897 if (lbound
&& TREE_CODE (lbound
) == VAR_DECL
898 && DECL_ARTIFICIAL (lbound
) && DECL_IGNORED_P (lbound
))
900 if (DECL_NAME (lbound
)
901 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound
)),
903 DECL_NAMELESS (lbound
) = 1;
904 DECL_IGNORED_P (lbound
) = 0;
906 if (ubound
&& TREE_CODE (ubound
) == VAR_DECL
907 && DECL_ARTIFICIAL (ubound
) && DECL_IGNORED_P (ubound
))
909 if (DECL_NAME (ubound
)
910 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound
)),
912 DECL_NAMELESS (ubound
) = 1;
913 DECL_IGNORED_P (ubound
) = 0;
916 TYPE_NAME (type
) = type_decl
= build_decl (input_location
,
917 TYPE_DECL
, NULL
, gtype
);
918 DECL_ORIGINAL_TYPE (type_decl
) = gtype
;
923 /* For some dummy arguments we don't use the actual argument directly.
924 Instead we create a local decl and use that. This allows us to perform
925 initialization, and construct full type information. */
928 gfc_build_dummy_array_decl (gfc_symbol
* sym
, tree dummy
)
938 if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
941 /* Add to list of variables if not a fake result variable. */
942 if (sym
->attr
.result
|| sym
->attr
.dummy
)
943 gfc_defer_symbol_init (sym
);
945 type
= TREE_TYPE (dummy
);
946 gcc_assert (TREE_CODE (dummy
) == PARM_DECL
947 && POINTER_TYPE_P (type
));
949 /* Do we know the element size? */
950 known_size
= sym
->ts
.type
!= BT_CHARACTER
951 || INTEGER_CST_P (sym
->ts
.u
.cl
->backend_decl
);
953 if (known_size
&& !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type
)))
955 /* For descriptorless arrays with known element size the actual
956 argument is sufficient. */
957 gcc_assert (GFC_ARRAY_TYPE_P (type
));
958 gfc_build_qualified_array (dummy
, sym
);
962 type
= TREE_TYPE (type
);
963 if (GFC_DESCRIPTOR_TYPE_P (type
))
965 /* Create a descriptorless array pointer. */
969 /* Even when -frepack-arrays is used, symbols with TARGET attribute
971 if (!gfc_option
.flag_repack_arrays
|| sym
->attr
.target
)
973 if (as
->type
== AS_ASSUMED_SIZE
)
974 packed
= PACKED_FULL
;
978 if (as
->type
== AS_EXPLICIT
)
980 packed
= PACKED_FULL
;
981 for (n
= 0; n
< as
->rank
; n
++)
985 && as
->upper
[n
]->expr_type
== EXPR_CONSTANT
986 && as
->lower
[n
]->expr_type
== EXPR_CONSTANT
))
987 packed
= PACKED_PARTIAL
;
991 packed
= PACKED_PARTIAL
;
994 type
= gfc_typenode_for_spec (&sym
->ts
);
995 type
= gfc_get_nodesc_array_type (type
, sym
->as
, packed
,
1000 /* We now have an expression for the element size, so create a fully
1001 qualified type. Reset sym->backend decl or this will just return the
1003 DECL_ARTIFICIAL (sym
->backend_decl
) = 1;
1004 sym
->backend_decl
= NULL_TREE
;
1005 type
= gfc_sym_type (sym
);
1006 packed
= PACKED_FULL
;
1009 ASM_FORMAT_PRIVATE_NAME (name
, IDENTIFIER_POINTER (DECL_NAME (dummy
)), 0);
1010 decl
= build_decl (input_location
,
1011 VAR_DECL
, get_identifier (name
), type
);
1013 DECL_ARTIFICIAL (decl
) = 1;
1014 DECL_NAMELESS (decl
) = 1;
1015 TREE_PUBLIC (decl
) = 0;
1016 TREE_STATIC (decl
) = 0;
1017 DECL_EXTERNAL (decl
) = 0;
1019 /* We should never get deferred shape arrays here. We used to because of
1021 gcc_assert (sym
->as
->type
!= AS_DEFERRED
);
1023 if (packed
== PACKED_PARTIAL
)
1024 GFC_DECL_PARTIAL_PACKED_ARRAY (decl
) = 1;
1025 else if (packed
== PACKED_FULL
)
1026 GFC_DECL_PACKED_ARRAY (decl
) = 1;
1028 gfc_build_qualified_array (decl
, sym
);
1030 if (DECL_LANG_SPECIFIC (dummy
))
1031 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (dummy
);
1033 gfc_allocate_lang_decl (decl
);
1035 GFC_DECL_SAVED_DESCRIPTOR (decl
) = dummy
;
1037 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
1038 || sym
->attr
.contained
)
1039 gfc_add_decl_to_function (decl
);
1041 gfc_add_decl_to_parent_function (decl
);
1046 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
1047 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
1048 pointing to the artificial variable for debug info purposes. */
1051 gfc_nonlocal_dummy_array_decl (gfc_symbol
*sym
)
1055 if (! nonlocal_dummy_decl_pset
)
1056 nonlocal_dummy_decl_pset
= pointer_set_create ();
1058 if (pointer_set_insert (nonlocal_dummy_decl_pset
, sym
->backend_decl
))
1061 dummy
= GFC_DECL_SAVED_DESCRIPTOR (sym
->backend_decl
);
1062 decl
= build_decl (input_location
, VAR_DECL
, DECL_NAME (dummy
),
1063 TREE_TYPE (sym
->backend_decl
));
1064 DECL_ARTIFICIAL (decl
) = 0;
1065 TREE_USED (decl
) = 1;
1066 TREE_PUBLIC (decl
) = 0;
1067 TREE_STATIC (decl
) = 0;
1068 DECL_EXTERNAL (decl
) = 0;
1069 if (DECL_BY_REFERENCE (dummy
))
1070 DECL_BY_REFERENCE (decl
) = 1;
1071 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (sym
->backend_decl
);
1072 SET_DECL_VALUE_EXPR (decl
, sym
->backend_decl
);
1073 DECL_HAS_VALUE_EXPR_P (decl
) = 1;
1074 DECL_CONTEXT (decl
) = DECL_CONTEXT (sym
->backend_decl
);
1075 DECL_CHAIN (decl
) = nonlocal_dummy_decls
;
1076 nonlocal_dummy_decls
= decl
;
1079 /* Return a constant or a variable to use as a string length. Does not
1080 add the decl to the current scope. */
1083 gfc_create_string_length (gfc_symbol
* sym
)
1085 gcc_assert (sym
->ts
.u
.cl
);
1086 gfc_conv_const_charlen (sym
->ts
.u
.cl
);
1088 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
1091 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 2];
1093 /* Also prefix the mangled name. */
1094 strcpy (&name
[1], sym
->name
);
1096 length
= build_decl (input_location
,
1097 VAR_DECL
, get_identifier (name
),
1098 gfc_charlen_type_node
);
1099 DECL_ARTIFICIAL (length
) = 1;
1100 TREE_USED (length
) = 1;
1101 if (sym
->ns
->proc_name
->tlink
!= NULL
)
1102 gfc_defer_symbol_init (sym
);
1104 sym
->ts
.u
.cl
->backend_decl
= length
;
1107 gcc_assert (sym
->ts
.u
.cl
->backend_decl
!= NULL_TREE
);
1108 return sym
->ts
.u
.cl
->backend_decl
;
1111 /* If a variable is assigned a label, we add another two auxiliary
1115 gfc_add_assign_aux_vars (gfc_symbol
* sym
)
1121 gcc_assert (sym
->backend_decl
);
1123 decl
= sym
->backend_decl
;
1124 gfc_allocate_lang_decl (decl
);
1125 GFC_DECL_ASSIGN (decl
) = 1;
1126 length
= build_decl (input_location
,
1127 VAR_DECL
, create_tmp_var_name (sym
->name
),
1128 gfc_charlen_type_node
);
1129 addr
= build_decl (input_location
,
1130 VAR_DECL
, create_tmp_var_name (sym
->name
),
1132 gfc_finish_var_decl (length
, sym
);
1133 gfc_finish_var_decl (addr
, sym
);
1134 /* STRING_LENGTH is also used as flag. Less than -1 means that
1135 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1136 target label's address. Otherwise, value is the length of a format string
1137 and ASSIGN_ADDR is its address. */
1138 if (TREE_STATIC (length
))
1139 DECL_INITIAL (length
) = build_int_cst (gfc_charlen_type_node
, -2);
1141 gfc_defer_symbol_init (sym
);
1143 GFC_DECL_STRING_LEN (decl
) = length
;
1144 GFC_DECL_ASSIGN_ADDR (decl
) = addr
;
1149 add_attributes_to_decl (symbol_attribute sym_attr
, tree list
)
1154 for (id
= 0; id
< EXT_ATTR_NUM
; id
++)
1155 if (sym_attr
.ext_attr
& (1 << id
))
1157 attr
= build_tree_list (
1158 get_identifier (ext_attr_list
[id
].middle_end_name
),
1160 list
= chainon (list
, attr
);
1167 static void build_function_decl (gfc_symbol
* sym
, bool global
);
1170 /* Return the decl for a gfc_symbol, create it if it doesn't already
1174 gfc_get_symbol_decl (gfc_symbol
* sym
)
1177 tree length
= NULL_TREE
;
1180 bool intrinsic_array_parameter
= false;
1182 gcc_assert (sym
->attr
.referenced
1183 || sym
->attr
.use_assoc
1184 || sym
->ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
1185 || (sym
->module
&& sym
->attr
.if_source
!= IFSRC_DECL
1186 && sym
->backend_decl
));
1188 if (sym
->ns
&& sym
->ns
->proc_name
&& sym
->ns
->proc_name
->attr
.function
)
1189 byref
= gfc_return_by_reference (sym
->ns
->proc_name
);
1193 /* Make sure that the vtab for the declared type is completed. */
1194 if (sym
->ts
.type
== BT_CLASS
)
1196 gfc_component
*c
= CLASS_DATA (sym
);
1197 if (!c
->ts
.u
.derived
->backend_decl
)
1199 gfc_find_derived_vtab (c
->ts
.u
.derived
);
1200 gfc_get_derived_type (sym
->ts
.u
.derived
);
1204 /* All deferred character length procedures need to retain the backend
1205 decl, which is a pointer to the character length in the caller's
1206 namespace and to declare a local character length. */
1207 if (!byref
&& sym
->attr
.function
1208 && sym
->ts
.type
== BT_CHARACTER
1210 && sym
->ts
.u
.cl
->passed_length
== NULL
1211 && sym
->ts
.u
.cl
->backend_decl
1212 && TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
1214 sym
->ts
.u
.cl
->passed_length
= sym
->ts
.u
.cl
->backend_decl
;
1215 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1216 length
= gfc_create_string_length (sym
);
1219 if ((sym
->attr
.dummy
&& ! sym
->attr
.function
) || (sym
->attr
.result
&& byref
))
1221 /* Return via extra parameter. */
1222 if (sym
->attr
.result
&& byref
1223 && !sym
->backend_decl
)
1226 DECL_ARGUMENTS (sym
->ns
->proc_name
->backend_decl
);
1227 /* For entry master function skip over the __entry
1229 if (sym
->ns
->proc_name
->attr
.entry_master
)
1230 sym
->backend_decl
= DECL_CHAIN (sym
->backend_decl
);
1233 /* Dummy variables should already have been created. */
1234 gcc_assert (sym
->backend_decl
);
1236 /* Create a character length variable. */
1237 if (sym
->ts
.type
== BT_CHARACTER
)
1239 /* For a deferred dummy, make a new string length variable. */
1240 if (sym
->ts
.deferred
1242 (sym
->ts
.u
.cl
->passed_length
== sym
->ts
.u
.cl
->backend_decl
))
1243 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1245 if (sym
->ts
.deferred
&& sym
->attr
.result
1246 && sym
->ts
.u
.cl
->passed_length
== NULL
1247 && sym
->ts
.u
.cl
->backend_decl
)
1249 sym
->ts
.u
.cl
->passed_length
= sym
->ts
.u
.cl
->backend_decl
;
1250 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1253 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
1254 length
= gfc_create_string_length (sym
);
1256 length
= sym
->ts
.u
.cl
->backend_decl
;
1257 if (TREE_CODE (length
) == VAR_DECL
1258 && DECL_FILE_SCOPE_P (length
))
1260 /* Add the string length to the same context as the symbol. */
1261 if (DECL_CONTEXT (sym
->backend_decl
) == current_function_decl
)
1262 gfc_add_decl_to_function (length
);
1264 gfc_add_decl_to_parent_function (length
);
1266 gcc_assert (DECL_CONTEXT (sym
->backend_decl
) ==
1267 DECL_CONTEXT (length
));
1269 gfc_defer_symbol_init (sym
);
1273 /* Use a copy of the descriptor for dummy arrays. */
1274 if ((sym
->attr
.dimension
|| sym
->attr
.codimension
)
1275 && !TREE_USED (sym
->backend_decl
))
1277 decl
= gfc_build_dummy_array_decl (sym
, sym
->backend_decl
);
1278 /* Prevent the dummy from being detected as unused if it is copied. */
1279 if (sym
->backend_decl
!= NULL
&& decl
!= sym
->backend_decl
)
1280 DECL_ARTIFICIAL (sym
->backend_decl
) = 1;
1281 sym
->backend_decl
= decl
;
1284 TREE_USED (sym
->backend_decl
) = 1;
1285 if (sym
->attr
.assign
&& GFC_DECL_ASSIGN (sym
->backend_decl
) == 0)
1287 gfc_add_assign_aux_vars (sym
);
1290 if (sym
->attr
.dimension
1291 && DECL_LANG_SPECIFIC (sym
->backend_decl
)
1292 && GFC_DECL_SAVED_DESCRIPTOR (sym
->backend_decl
)
1293 && DECL_CONTEXT (sym
->backend_decl
) != current_function_decl
)
1294 gfc_nonlocal_dummy_array_decl (sym
);
1296 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1297 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1299 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1300 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1301 return sym
->backend_decl
;
1304 if (sym
->backend_decl
)
1305 return sym
->backend_decl
;
1307 /* Special case for array-valued named constants from intrinsic
1308 procedures; those are inlined. */
1309 if (sym
->attr
.use_assoc
&& sym
->from_intmod
1310 && sym
->attr
.flavor
== FL_PARAMETER
)
1311 intrinsic_array_parameter
= true;
1313 /* If use associated and whole file compilation, use the module
1315 if (gfc_option
.flag_whole_file
1316 && (sym
->attr
.flavor
== FL_VARIABLE
1317 || sym
->attr
.flavor
== FL_PARAMETER
)
1318 && sym
->attr
.use_assoc
1319 && !intrinsic_array_parameter
1321 && gfc_get_module_backend_decl (sym
))
1323 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1324 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1325 return sym
->backend_decl
;
1328 if (sym
->attr
.flavor
== FL_PROCEDURE
)
1330 /* Catch function declarations. Only used for actual parameters,
1331 procedure pointers and procptr initialization targets. */
1332 if (sym
->attr
.external
|| sym
->attr
.use_assoc
|| sym
->attr
.intrinsic
)
1334 decl
= gfc_get_extern_function_decl (sym
);
1335 gfc_set_decl_location (decl
, &sym
->declared_at
);
1339 if (!sym
->backend_decl
)
1340 build_function_decl (sym
, false);
1341 decl
= sym
->backend_decl
;
1346 if (sym
->attr
.intrinsic
)
1347 internal_error ("intrinsic variable which isn't a procedure");
1349 /* Create string length decl first so that they can be used in the
1350 type declaration. */
1351 if (sym
->ts
.type
== BT_CHARACTER
)
1352 length
= gfc_create_string_length (sym
);
1354 /* Create the decl for the variable. */
1355 decl
= build_decl (sym
->declared_at
.lb
->location
,
1356 VAR_DECL
, gfc_sym_identifier (sym
), gfc_sym_type (sym
));
1358 /* Add attributes to variables. Functions are handled elsewhere. */
1359 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1360 decl_attributes (&decl
, attributes
, 0);
1362 /* Symbols from modules should have their assembler names mangled.
1363 This is done here rather than in gfc_finish_var_decl because it
1364 is different for string length variables. */
1367 gfc_set_decl_assembler_name (decl
, gfc_sym_mangled_identifier (sym
));
1368 if (sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)
1369 DECL_IGNORED_P (decl
) = 1;
1372 if (sym
->attr
.dimension
|| sym
->attr
.codimension
)
1374 /* Create variables to hold the non-constant bits of array info. */
1375 gfc_build_qualified_array (decl
, sym
);
1377 if (sym
->attr
.contiguous
1378 || ((sym
->attr
.allocatable
|| !sym
->attr
.dummy
) && !sym
->attr
.pointer
))
1379 GFC_DECL_PACKED_ARRAY (decl
) = 1;
1382 /* Remember this variable for allocation/cleanup. */
1383 if (sym
->attr
.dimension
|| sym
->attr
.allocatable
|| sym
->attr
.codimension
1384 || (sym
->ts
.type
== BT_CLASS
&&
1385 (CLASS_DATA (sym
)->attr
.dimension
1386 || CLASS_DATA (sym
)->attr
.allocatable
))
1387 || (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
->attr
.alloc_comp
)
1388 /* This applies a derived type default initializer. */
1389 || (sym
->ts
.type
== BT_DERIVED
1390 && sym
->attr
.save
== SAVE_NONE
1392 && !sym
->attr
.allocatable
1393 && (sym
->value
&& !sym
->ns
->proc_name
->attr
.is_main_program
)
1394 && !(sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)))
1395 gfc_defer_symbol_init (sym
);
1397 gfc_finish_var_decl (decl
, sym
);
1399 if (sym
->ts
.type
== BT_CHARACTER
)
1401 /* Character variables need special handling. */
1402 gfc_allocate_lang_decl (decl
);
1404 if (TREE_CODE (length
) != INTEGER_CST
)
1406 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 2];
1410 /* Also prefix the mangled name for symbols from modules. */
1411 strcpy (&name
[1], sym
->name
);
1414 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length
)));
1415 gfc_set_decl_assembler_name (decl
, get_identifier (name
));
1417 gfc_finish_var_decl (length
, sym
);
1418 gcc_assert (!sym
->value
);
1421 else if (sym
->attr
.subref_array_pointer
)
1423 /* We need the span for these beasts. */
1424 gfc_allocate_lang_decl (decl
);
1427 if (sym
->attr
.subref_array_pointer
)
1430 GFC_DECL_SUBREF_ARRAY_P (decl
) = 1;
1431 span
= build_decl (input_location
,
1432 VAR_DECL
, create_tmp_var_name ("span"),
1433 gfc_array_index_type
);
1434 gfc_finish_var_decl (span
, sym
);
1435 TREE_STATIC (span
) = TREE_STATIC (decl
);
1436 DECL_ARTIFICIAL (span
) = 1;
1438 GFC_DECL_SPAN (decl
) = span
;
1439 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl
)) = span
;
1442 if (sym
->ts
.type
== BT_CLASS
)
1443 GFC_DECL_CLASS(decl
) = 1;
1445 sym
->backend_decl
= decl
;
1447 if (sym
->attr
.assign
)
1448 gfc_add_assign_aux_vars (sym
);
1450 if (intrinsic_array_parameter
)
1452 TREE_STATIC (decl
) = 1;
1453 DECL_EXTERNAL (decl
) = 0;
1456 if (TREE_STATIC (decl
)
1457 && !(sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)
1458 && (sym
->attr
.save
|| sym
->ns
->proc_name
->attr
.is_main_program
1459 || gfc_option
.flag_max_stack_var_size
== 0
1460 || sym
->attr
.data
|| sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1461 && (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
1462 || !sym
->attr
.codimension
|| sym
->attr
.allocatable
))
1464 /* Add static initializer. For procedures, it is only needed if
1465 SAVE is specified otherwise they need to be reinitialized
1466 every time the procedure is entered. The TREE_STATIC is
1467 in this case due to -fmax-stack-var-size=. */
1468 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
1471 || (sym
->attr
.codimension
1472 && sym
->attr
.allocatable
),
1474 || sym
->attr
.allocatable
,
1475 sym
->attr
.proc_pointer
);
1478 if (!TREE_STATIC (decl
)
1479 && POINTER_TYPE_P (TREE_TYPE (decl
))
1480 && !sym
->attr
.pointer
1481 && !sym
->attr
.allocatable
1482 && !sym
->attr
.proc_pointer
)
1483 DECL_BY_REFERENCE (decl
) = 1;
1486 || (sym
->name
[0] == '_' && strncmp ("__def_init", sym
->name
, 10) == 0))
1488 TREE_READONLY (decl
) = 1;
1489 GFC_DECL_PUSH_TOPLEVEL (decl
) = 1;
1496 /* Substitute a temporary variable in place of the real one. */
1499 gfc_shadow_sym (gfc_symbol
* sym
, tree decl
, gfc_saved_var
* save
)
1501 save
->attr
= sym
->attr
;
1502 save
->decl
= sym
->backend_decl
;
1504 gfc_clear_attr (&sym
->attr
);
1505 sym
->attr
.referenced
= 1;
1506 sym
->attr
.flavor
= FL_VARIABLE
;
1508 sym
->backend_decl
= decl
;
1512 /* Restore the original variable. */
1515 gfc_restore_sym (gfc_symbol
* sym
, gfc_saved_var
* save
)
1517 sym
->attr
= save
->attr
;
1518 sym
->backend_decl
= save
->decl
;
1522 /* Declare a procedure pointer. */
1525 get_proc_pointer_decl (gfc_symbol
*sym
)
1530 decl
= sym
->backend_decl
;
1534 decl
= build_decl (input_location
,
1535 VAR_DECL
, get_identifier (sym
->name
),
1536 build_pointer_type (gfc_get_function_type (sym
)));
1538 if ((sym
->ns
->proc_name
1539 && sym
->ns
->proc_name
->backend_decl
== current_function_decl
)
1540 || sym
->attr
.contained
)
1541 gfc_add_decl_to_function (decl
);
1542 else if (sym
->ns
->proc_name
->attr
.flavor
!= FL_MODULE
)
1543 gfc_add_decl_to_parent_function (decl
);
1545 sym
->backend_decl
= decl
;
1547 /* If a variable is USE associated, it's always external. */
1548 if (sym
->attr
.use_assoc
)
1550 DECL_EXTERNAL (decl
) = 1;
1551 TREE_PUBLIC (decl
) = 1;
1553 else if (sym
->module
&& sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1555 /* This is the declaration of a module variable. */
1556 TREE_PUBLIC (decl
) = 1;
1557 TREE_STATIC (decl
) = 1;
1560 if (!sym
->attr
.use_assoc
1561 && (sym
->attr
.save
!= SAVE_NONE
|| sym
->attr
.data
1562 || (sym
->value
&& sym
->ns
->proc_name
->attr
.is_main_program
)))
1563 TREE_STATIC (decl
) = 1;
1565 if (TREE_STATIC (decl
) && sym
->value
)
1567 /* Add static initializer. */
1568 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
1570 sym
->attr
.dimension
,
1574 /* Handle threadprivate procedure pointers. */
1575 if (sym
->attr
.threadprivate
1576 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1577 DECL_TLS_MODEL (decl
) = decl_default_tls_model (decl
);
1579 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1580 decl_attributes (&decl
, attributes
, 0);
1586 /* Get a basic decl for an external function. */
1589 gfc_get_extern_function_decl (gfc_symbol
* sym
)
1595 gfc_intrinsic_sym
*isym
;
1597 char s
[GFC_MAX_SYMBOL_LEN
+ 23]; /* "_gfortran_f2c_specific" and '\0'. */
1602 if (sym
->backend_decl
)
1603 return sym
->backend_decl
;
1605 /* We should never be creating external decls for alternate entry points.
1606 The procedure may be an alternate entry point, but we don't want/need
1608 gcc_assert (!(sym
->attr
.entry
|| sym
->attr
.entry_master
));
1610 if (sym
->attr
.proc_pointer
)
1611 return get_proc_pointer_decl (sym
);
1613 /* See if this is an external procedure from the same file. If so,
1614 return the backend_decl. */
1615 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->name
);
1617 if (gfc_option
.flag_whole_file
1618 && (!sym
->attr
.use_assoc
|| sym
->attr
.if_source
!= IFSRC_DECL
)
1619 && !sym
->backend_decl
1621 && ((gsym
->type
== GSYM_SUBROUTINE
) || (gsym
->type
== GSYM_FUNCTION
))
1622 && (gsym
->ns
->proc_name
->backend_decl
|| !sym
->attr
.intrinsic
))
1624 if (!gsym
->ns
->proc_name
->backend_decl
)
1626 /* By construction, the external function cannot be
1627 a contained procedure. */
1629 tree save_fn_decl
= current_function_decl
;
1631 current_function_decl
= NULL_TREE
;
1632 gfc_save_backend_locus (&old_loc
);
1635 gfc_create_function_decl (gsym
->ns
, true);
1638 gfc_restore_backend_locus (&old_loc
);
1639 current_function_decl
= save_fn_decl
;
1642 /* If the namespace has entries, the proc_name is the
1643 entry master. Find the entry and use its backend_decl.
1644 otherwise, use the proc_name backend_decl. */
1645 if (gsym
->ns
->entries
)
1647 gfc_entry_list
*entry
= gsym
->ns
->entries
;
1649 for (; entry
; entry
= entry
->next
)
1651 if (strcmp (gsym
->name
, entry
->sym
->name
) == 0)
1653 sym
->backend_decl
= entry
->sym
->backend_decl
;
1659 sym
->backend_decl
= gsym
->ns
->proc_name
->backend_decl
;
1661 if (sym
->backend_decl
)
1663 /* Avoid problems of double deallocation of the backend declaration
1664 later in gfc_trans_use_stmts; cf. PR 45087. */
1665 if (sym
->attr
.if_source
!= IFSRC_DECL
&& sym
->attr
.use_assoc
)
1666 sym
->attr
.use_assoc
= 0;
1668 return sym
->backend_decl
;
1672 /* See if this is a module procedure from the same file. If so,
1673 return the backend_decl. */
1675 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->module
);
1677 if (gfc_option
.flag_whole_file
1679 && gsym
->type
== GSYM_MODULE
)
1684 gfc_find_symbol (sym
->name
, gsym
->ns
, 0, &s
);
1685 if (s
&& s
->backend_decl
)
1687 if (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
)
1688 gfc_copy_dt_decls_ifequal (s
->ts
.u
.derived
, sym
->ts
.u
.derived
,
1690 else if (sym
->ts
.type
== BT_CHARACTER
)
1691 sym
->ts
.u
.cl
->backend_decl
= s
->ts
.u
.cl
->backend_decl
;
1692 sym
->backend_decl
= s
->backend_decl
;
1693 return sym
->backend_decl
;
1697 if (sym
->attr
.intrinsic
)
1699 /* Call the resolution function to get the actual name. This is
1700 a nasty hack which relies on the resolution functions only looking
1701 at the first argument. We pass NULL for the second argument
1702 otherwise things like AINT get confused. */
1703 isym
= gfc_find_function (sym
->name
);
1704 gcc_assert (isym
->resolve
.f0
!= NULL
);
1706 memset (&e
, 0, sizeof (e
));
1707 e
.expr_type
= EXPR_FUNCTION
;
1709 memset (&argexpr
, 0, sizeof (argexpr
));
1710 gcc_assert (isym
->formal
);
1711 argexpr
.ts
= isym
->formal
->ts
;
1713 if (isym
->formal
->next
== NULL
)
1714 isym
->resolve
.f1 (&e
, &argexpr
);
1717 if (isym
->formal
->next
->next
== NULL
)
1718 isym
->resolve
.f2 (&e
, &argexpr
, NULL
);
1721 if (isym
->formal
->next
->next
->next
== NULL
)
1722 isym
->resolve
.f3 (&e
, &argexpr
, NULL
, NULL
);
1725 /* All specific intrinsics take less than 5 arguments. */
1726 gcc_assert (isym
->formal
->next
->next
->next
->next
== NULL
);
1727 isym
->resolve
.f4 (&e
, &argexpr
, NULL
, NULL
, NULL
);
1732 if (gfc_option
.flag_f2c
1733 && ((e
.ts
.type
== BT_REAL
&& e
.ts
.kind
== gfc_default_real_kind
)
1734 || e
.ts
.type
== BT_COMPLEX
))
1736 /* Specific which needs a different implementation if f2c
1737 calling conventions are used. */
1738 sprintf (s
, "_gfortran_f2c_specific%s", e
.value
.function
.name
);
1741 sprintf (s
, "_gfortran_specific%s", e
.value
.function
.name
);
1743 name
= get_identifier (s
);
1744 mangled_name
= name
;
1748 name
= gfc_sym_identifier (sym
);
1749 mangled_name
= gfc_sym_mangled_function_id (sym
);
1752 type
= gfc_get_function_type (sym
);
1753 fndecl
= build_decl (input_location
,
1754 FUNCTION_DECL
, name
, type
);
1756 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1757 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1758 the opposite of declaring a function as static in C). */
1759 DECL_EXTERNAL (fndecl
) = 1;
1760 TREE_PUBLIC (fndecl
) = 1;
1762 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1763 decl_attributes (&fndecl
, attributes
, 0);
1765 gfc_set_decl_assembler_name (fndecl
, mangled_name
);
1767 /* Set the context of this decl. */
1768 if (0 && sym
->ns
&& sym
->ns
->proc_name
)
1770 /* TODO: Add external decls to the appropriate scope. */
1771 DECL_CONTEXT (fndecl
) = sym
->ns
->proc_name
->backend_decl
;
1775 /* Global declaration, e.g. intrinsic subroutine. */
1776 DECL_CONTEXT (fndecl
) = NULL_TREE
;
1779 /* Set attributes for PURE functions. A call to PURE function in the
1780 Fortran 95 sense is both pure and without side effects in the C
1782 if (sym
->attr
.pure
|| sym
->attr
.elemental
)
1784 if (sym
->attr
.function
&& !gfc_return_by_reference (sym
))
1785 DECL_PURE_P (fndecl
) = 1;
1786 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1787 parameters and don't use alternate returns (is this
1788 allowed?). In that case, calls to them are meaningless, and
1789 can be optimized away. See also in build_function_decl(). */
1790 TREE_SIDE_EFFECTS (fndecl
) = 0;
1793 /* Mark non-returning functions. */
1794 if (sym
->attr
.noreturn
)
1795 TREE_THIS_VOLATILE(fndecl
) = 1;
1797 sym
->backend_decl
= fndecl
;
1799 if (DECL_CONTEXT (fndecl
) == NULL_TREE
)
1800 pushdecl_top_level (fndecl
);
1806 /* Create a declaration for a procedure. For external functions (in the C
1807 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1808 a master function with alternate entry points. */
1811 build_function_decl (gfc_symbol
* sym
, bool global
)
1813 tree fndecl
, type
, attributes
;
1814 symbol_attribute attr
;
1816 gfc_formal_arglist
*f
;
1818 gcc_assert (!sym
->attr
.external
);
1820 if (sym
->backend_decl
)
1823 /* Set the line and filename. sym->declared_at seems to point to the
1824 last statement for subroutines, but it'll do for now. */
1825 gfc_set_backend_locus (&sym
->declared_at
);
1827 /* Allow only one nesting level. Allow public declarations. */
1828 gcc_assert (current_function_decl
== NULL_TREE
1829 || DECL_FILE_SCOPE_P (current_function_decl
)
1830 || (TREE_CODE (DECL_CONTEXT (current_function_decl
))
1831 == NAMESPACE_DECL
));
1833 type
= gfc_get_function_type (sym
);
1834 fndecl
= build_decl (input_location
,
1835 FUNCTION_DECL
, gfc_sym_identifier (sym
), type
);
1839 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1840 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1841 the opposite of declaring a function as static in C). */
1842 DECL_EXTERNAL (fndecl
) = 0;
1844 if (!current_function_decl
1845 && !sym
->attr
.entry_master
&& !sym
->attr
.is_main_program
)
1846 TREE_PUBLIC (fndecl
) = 1;
1848 attributes
= add_attributes_to_decl (attr
, NULL_TREE
);
1849 decl_attributes (&fndecl
, attributes
, 0);
1851 /* Figure out the return type of the declared function, and build a
1852 RESULT_DECL for it. If this is a subroutine with alternate
1853 returns, build a RESULT_DECL for it. */
1854 result_decl
= NULL_TREE
;
1855 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1858 if (gfc_return_by_reference (sym
))
1859 type
= void_type_node
;
1862 if (sym
->result
!= sym
)
1863 result_decl
= gfc_sym_identifier (sym
->result
);
1865 type
= TREE_TYPE (TREE_TYPE (fndecl
));
1870 /* Look for alternate return placeholders. */
1871 int has_alternate_returns
= 0;
1872 for (f
= sym
->formal
; f
; f
= f
->next
)
1876 has_alternate_returns
= 1;
1881 if (has_alternate_returns
)
1882 type
= integer_type_node
;
1884 type
= void_type_node
;
1887 result_decl
= build_decl (input_location
,
1888 RESULT_DECL
, result_decl
, type
);
1889 DECL_ARTIFICIAL (result_decl
) = 1;
1890 DECL_IGNORED_P (result_decl
) = 1;
1891 DECL_CONTEXT (result_decl
) = fndecl
;
1892 DECL_RESULT (fndecl
) = result_decl
;
1894 /* Don't call layout_decl for a RESULT_DECL.
1895 layout_decl (result_decl, 0); */
1897 /* TREE_STATIC means the function body is defined here. */
1898 TREE_STATIC (fndecl
) = 1;
1900 /* Set attributes for PURE functions. A call to a PURE function in the
1901 Fortran 95 sense is both pure and without side effects in the C
1903 if (attr
.pure
|| attr
.elemental
)
1905 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1906 including an alternate return. In that case it can also be
1907 marked as PURE. See also in gfc_get_extern_function_decl(). */
1908 if (attr
.function
&& !gfc_return_by_reference (sym
))
1909 DECL_PURE_P (fndecl
) = 1;
1910 TREE_SIDE_EFFECTS (fndecl
) = 0;
1914 /* Layout the function declaration and put it in the binding level
1915 of the current function. */
1918 || (sym
->name
[0] == '_' && strncmp ("__copy", sym
->name
, 6) == 0))
1919 pushdecl_top_level (fndecl
);
1923 /* Perform name mangling if this is a top level or module procedure. */
1924 if (current_function_decl
== NULL_TREE
)
1925 gfc_set_decl_assembler_name (fndecl
, gfc_sym_mangled_function_id (sym
));
1927 sym
->backend_decl
= fndecl
;
1931 /* Create the DECL_ARGUMENTS for a procedure. */
1934 create_function_arglist (gfc_symbol
* sym
)
1937 gfc_formal_arglist
*f
;
1938 tree typelist
, hidden_typelist
;
1939 tree arglist
, hidden_arglist
;
1943 fndecl
= sym
->backend_decl
;
1945 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1946 the new FUNCTION_DECL node. */
1947 arglist
= NULL_TREE
;
1948 hidden_arglist
= NULL_TREE
;
1949 typelist
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
1951 if (sym
->attr
.entry_master
)
1953 type
= TREE_VALUE (typelist
);
1954 parm
= build_decl (input_location
,
1955 PARM_DECL
, get_identifier ("__entry"), type
);
1957 DECL_CONTEXT (parm
) = fndecl
;
1958 DECL_ARG_TYPE (parm
) = type
;
1959 TREE_READONLY (parm
) = 1;
1960 gfc_finish_decl (parm
);
1961 DECL_ARTIFICIAL (parm
) = 1;
1963 arglist
= chainon (arglist
, parm
);
1964 typelist
= TREE_CHAIN (typelist
);
1967 if (gfc_return_by_reference (sym
))
1969 tree type
= TREE_VALUE (typelist
), length
= NULL
;
1971 if (sym
->ts
.type
== BT_CHARACTER
)
1973 /* Length of character result. */
1974 tree len_type
= TREE_VALUE (TREE_CHAIN (typelist
));
1976 length
= build_decl (input_location
,
1978 get_identifier (".__result"),
1980 if (!sym
->ts
.u
.cl
->length
)
1982 sym
->ts
.u
.cl
->backend_decl
= length
;
1983 TREE_USED (length
) = 1;
1985 gcc_assert (TREE_CODE (length
) == PARM_DECL
);
1986 DECL_CONTEXT (length
) = fndecl
;
1987 DECL_ARG_TYPE (length
) = len_type
;
1988 TREE_READONLY (length
) = 1;
1989 DECL_ARTIFICIAL (length
) = 1;
1990 gfc_finish_decl (length
);
1991 if (sym
->ts
.u
.cl
->backend_decl
== NULL
1992 || sym
->ts
.u
.cl
->backend_decl
== length
)
1997 if (sym
->ts
.u
.cl
->backend_decl
== NULL
)
1999 tree len
= build_decl (input_location
,
2001 get_identifier ("..__result"),
2002 gfc_charlen_type_node
);
2003 DECL_ARTIFICIAL (len
) = 1;
2004 TREE_USED (len
) = 1;
2005 sym
->ts
.u
.cl
->backend_decl
= len
;
2008 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2009 arg
= sym
->result
? sym
->result
: sym
;
2010 backend_decl
= arg
->backend_decl
;
2011 /* Temporary clear it, so that gfc_sym_type creates complete
2013 arg
->backend_decl
= NULL
;
2014 type
= gfc_sym_type (arg
);
2015 arg
->backend_decl
= backend_decl
;
2016 type
= build_reference_type (type
);
2020 parm
= build_decl (input_location
,
2021 PARM_DECL
, get_identifier ("__result"), type
);
2023 DECL_CONTEXT (parm
) = fndecl
;
2024 DECL_ARG_TYPE (parm
) = TREE_VALUE (typelist
);
2025 TREE_READONLY (parm
) = 1;
2026 DECL_ARTIFICIAL (parm
) = 1;
2027 gfc_finish_decl (parm
);
2029 arglist
= chainon (arglist
, parm
);
2030 typelist
= TREE_CHAIN (typelist
);
2032 if (sym
->ts
.type
== BT_CHARACTER
)
2034 gfc_allocate_lang_decl (parm
);
2035 arglist
= chainon (arglist
, length
);
2036 typelist
= TREE_CHAIN (typelist
);
2040 hidden_typelist
= typelist
;
2041 for (f
= sym
->formal
; f
; f
= f
->next
)
2042 if (f
->sym
!= NULL
) /* Ignore alternate returns. */
2043 hidden_typelist
= TREE_CHAIN (hidden_typelist
);
2045 for (f
= sym
->formal
; f
; f
= f
->next
)
2047 char name
[GFC_MAX_SYMBOL_LEN
+ 2];
2049 /* Ignore alternate returns. */
2053 type
= TREE_VALUE (typelist
);
2055 if (f
->sym
->ts
.type
== BT_CHARACTER
2056 && (!sym
->attr
.is_bind_c
|| sym
->attr
.entry_master
))
2058 tree len_type
= TREE_VALUE (hidden_typelist
);
2059 tree length
= NULL_TREE
;
2060 if (!f
->sym
->ts
.deferred
)
2061 gcc_assert (len_type
== gfc_charlen_type_node
);
2063 gcc_assert (POINTER_TYPE_P (len_type
));
2065 strcpy (&name
[1], f
->sym
->name
);
2067 length
= build_decl (input_location
,
2068 PARM_DECL
, get_identifier (name
), len_type
);
2070 hidden_arglist
= chainon (hidden_arglist
, length
);
2071 DECL_CONTEXT (length
) = fndecl
;
2072 DECL_ARTIFICIAL (length
) = 1;
2073 DECL_ARG_TYPE (length
) = len_type
;
2074 TREE_READONLY (length
) = 1;
2075 gfc_finish_decl (length
);
2077 /* Remember the passed value. */
2078 if (f
->sym
->ts
.u
.cl
->passed_length
!= NULL
)
2080 /* This can happen if the same type is used for multiple
2081 arguments. We need to copy cl as otherwise
2082 cl->passed_length gets overwritten. */
2083 f
->sym
->ts
.u
.cl
= gfc_new_charlen (f
->sym
->ns
, f
->sym
->ts
.u
.cl
);
2085 f
->sym
->ts
.u
.cl
->passed_length
= length
;
2087 /* Use the passed value for assumed length variables. */
2088 if (!f
->sym
->ts
.u
.cl
->length
)
2090 TREE_USED (length
) = 1;
2091 gcc_assert (!f
->sym
->ts
.u
.cl
->backend_decl
);
2092 f
->sym
->ts
.u
.cl
->backend_decl
= length
;
2095 hidden_typelist
= TREE_CHAIN (hidden_typelist
);
2097 if (f
->sym
->ts
.u
.cl
->backend_decl
== NULL
2098 || f
->sym
->ts
.u
.cl
->backend_decl
== length
)
2100 if (f
->sym
->ts
.u
.cl
->backend_decl
== NULL
)
2101 gfc_create_string_length (f
->sym
);
2103 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2104 if (f
->sym
->attr
.flavor
== FL_PROCEDURE
)
2105 type
= build_pointer_type (gfc_get_function_type (f
->sym
));
2107 type
= gfc_sym_type (f
->sym
);
2111 /* For non-constant length array arguments, make sure they use
2112 a different type node from TYPE_ARG_TYPES type. */
2113 if (f
->sym
->attr
.dimension
2114 && type
== TREE_VALUE (typelist
)
2115 && TREE_CODE (type
) == POINTER_TYPE
2116 && GFC_ARRAY_TYPE_P (type
)
2117 && f
->sym
->as
->type
!= AS_ASSUMED_SIZE
2118 && ! COMPLETE_TYPE_P (TREE_TYPE (type
)))
2120 if (f
->sym
->attr
.flavor
== FL_PROCEDURE
)
2121 type
= build_pointer_type (gfc_get_function_type (f
->sym
));
2123 type
= gfc_sym_type (f
->sym
);
2126 if (f
->sym
->attr
.proc_pointer
)
2127 type
= build_pointer_type (type
);
2129 if (f
->sym
->attr
.volatile_
)
2130 type
= build_qualified_type (type
, TYPE_QUAL_VOLATILE
);
2132 /* Build the argument declaration. */
2133 parm
= build_decl (input_location
,
2134 PARM_DECL
, gfc_sym_identifier (f
->sym
), type
);
2136 if (f
->sym
->attr
.volatile_
)
2138 TREE_THIS_VOLATILE (parm
) = 1;
2139 TREE_SIDE_EFFECTS (parm
) = 1;
2142 /* Fill in arg stuff. */
2143 DECL_CONTEXT (parm
) = fndecl
;
2144 DECL_ARG_TYPE (parm
) = TREE_VALUE (typelist
);
2145 /* All implementation args are read-only. */
2146 TREE_READONLY (parm
) = 1;
2147 if (POINTER_TYPE_P (type
)
2148 && (!f
->sym
->attr
.proc_pointer
2149 && f
->sym
->attr
.flavor
!= FL_PROCEDURE
))
2150 DECL_BY_REFERENCE (parm
) = 1;
2152 gfc_finish_decl (parm
);
2154 f
->sym
->backend_decl
= parm
;
2156 /* Coarrays which are descriptorless or assumed-shape pass with
2157 -fcoarray=lib the token and the offset as hidden arguments. */
2158 if (f
->sym
->attr
.codimension
2159 && gfc_option
.coarray
== GFC_FCOARRAY_LIB
2160 && !f
->sym
->attr
.allocatable
)
2166 gcc_assert (f
->sym
->backend_decl
!= NULL_TREE
2167 && !sym
->attr
.is_bind_c
);
2168 caf_type
= TREE_TYPE (f
->sym
->backend_decl
);
2170 token
= build_decl (input_location
, PARM_DECL
,
2171 create_tmp_var_name ("caf_token"),
2172 build_qualified_type (pvoid_type_node
,
2173 TYPE_QUAL_RESTRICT
));
2174 if (f
->sym
->as
->type
== AS_ASSUMED_SHAPE
)
2176 gcc_assert (DECL_LANG_SPECIFIC (f
->sym
->backend_decl
) == NULL
2177 || GFC_DECL_TOKEN (f
->sym
->backend_decl
) == NULL_TREE
);
2178 if (DECL_LANG_SPECIFIC (f
->sym
->backend_decl
) == NULL
)
2179 gfc_allocate_lang_decl (f
->sym
->backend_decl
);
2180 GFC_DECL_TOKEN (f
->sym
->backend_decl
) = token
;
2184 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) == NULL_TREE
);
2185 GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) = token
;
2188 DECL_CONTEXT (token
) = fndecl
;
2189 DECL_ARTIFICIAL (token
) = 1;
2190 DECL_ARG_TYPE (token
) = TREE_VALUE (typelist
);
2191 TREE_READONLY (token
) = 1;
2192 hidden_arglist
= chainon (hidden_arglist
, token
);
2193 gfc_finish_decl (token
);
2195 offset
= build_decl (input_location
, PARM_DECL
,
2196 create_tmp_var_name ("caf_offset"),
2197 gfc_array_index_type
);
2199 if (f
->sym
->as
->type
== AS_ASSUMED_SHAPE
)
2201 gcc_assert (GFC_DECL_CAF_OFFSET (f
->sym
->backend_decl
)
2203 GFC_DECL_CAF_OFFSET (f
->sym
->backend_decl
) = offset
;
2207 gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type
) == NULL_TREE
);
2208 GFC_TYPE_ARRAY_CAF_OFFSET (caf_type
) = offset
;
2210 DECL_CONTEXT (offset
) = fndecl
;
2211 DECL_ARTIFICIAL (offset
) = 1;
2212 DECL_ARG_TYPE (offset
) = TREE_VALUE (typelist
);
2213 TREE_READONLY (offset
) = 1;
2214 hidden_arglist
= chainon (hidden_arglist
, offset
);
2215 gfc_finish_decl (offset
);
2218 arglist
= chainon (arglist
, parm
);
2219 typelist
= TREE_CHAIN (typelist
);
2222 /* Add the hidden string length parameters, unless the procedure
2224 if (!sym
->attr
.is_bind_c
)
2225 arglist
= chainon (arglist
, hidden_arglist
);
2227 gcc_assert (hidden_typelist
== NULL_TREE
2228 || TREE_VALUE (hidden_typelist
) == void_type_node
);
2229 DECL_ARGUMENTS (fndecl
) = arglist
;
2232 /* Do the setup necessary before generating the body of a function. */
2235 trans_function_start (gfc_symbol
* sym
)
2239 fndecl
= sym
->backend_decl
;
2241 /* Let GCC know the current scope is this function. */
2242 current_function_decl
= fndecl
;
2244 /* Let the world know what we're about to do. */
2245 announce_function (fndecl
);
2247 if (DECL_FILE_SCOPE_P (fndecl
))
2249 /* Create RTL for function declaration. */
2250 rest_of_decl_compilation (fndecl
, 1, 0);
2253 /* Create RTL for function definition. */
2254 make_decl_rtl (fndecl
);
2256 init_function_start (fndecl
);
2258 /* function.c requires a push at the start of the function. */
2262 /* Create thunks for alternate entry points. */
2265 build_entry_thunks (gfc_namespace
* ns
, bool global
)
2267 gfc_formal_arglist
*formal
;
2268 gfc_formal_arglist
*thunk_formal
;
2270 gfc_symbol
*thunk_sym
;
2276 /* This should always be a toplevel function. */
2277 gcc_assert (current_function_decl
== NULL_TREE
);
2279 gfc_save_backend_locus (&old_loc
);
2280 for (el
= ns
->entries
; el
; el
= el
->next
)
2282 VEC(tree
,gc
) *args
= NULL
;
2283 VEC(tree
,gc
) *string_args
= NULL
;
2285 thunk_sym
= el
->sym
;
2287 build_function_decl (thunk_sym
, global
);
2288 create_function_arglist (thunk_sym
);
2290 trans_function_start (thunk_sym
);
2292 thunk_fndecl
= thunk_sym
->backend_decl
;
2294 gfc_init_block (&body
);
2296 /* Pass extra parameter identifying this entry point. */
2297 tmp
= build_int_cst (gfc_array_index_type
, el
->id
);
2298 VEC_safe_push (tree
, gc
, args
, tmp
);
2300 if (thunk_sym
->attr
.function
)
2302 if (gfc_return_by_reference (ns
->proc_name
))
2304 tree ref
= DECL_ARGUMENTS (current_function_decl
);
2305 VEC_safe_push (tree
, gc
, args
, ref
);
2306 if (ns
->proc_name
->ts
.type
== BT_CHARACTER
)
2307 VEC_safe_push (tree
, gc
, args
, DECL_CHAIN (ref
));
2311 for (formal
= ns
->proc_name
->formal
; formal
; formal
= formal
->next
)
2313 /* Ignore alternate returns. */
2314 if (formal
->sym
== NULL
)
2317 /* We don't have a clever way of identifying arguments, so resort to
2318 a brute-force search. */
2319 for (thunk_formal
= thunk_sym
->formal
;
2321 thunk_formal
= thunk_formal
->next
)
2323 if (thunk_formal
->sym
== formal
->sym
)
2329 /* Pass the argument. */
2330 DECL_ARTIFICIAL (thunk_formal
->sym
->backend_decl
) = 1;
2331 VEC_safe_push (tree
, gc
, args
, thunk_formal
->sym
->backend_decl
);
2332 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2334 tmp
= thunk_formal
->sym
->ts
.u
.cl
->backend_decl
;
2335 VEC_safe_push (tree
, gc
, string_args
, tmp
);
2340 /* Pass NULL for a missing argument. */
2341 VEC_safe_push (tree
, gc
, args
, null_pointer_node
);
2342 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2344 tmp
= build_int_cst (gfc_charlen_type_node
, 0);
2345 VEC_safe_push (tree
, gc
, string_args
, tmp
);
2350 /* Call the master function. */
2351 VEC_safe_splice (tree
, gc
, args
, string_args
);
2352 tmp
= ns
->proc_name
->backend_decl
;
2353 tmp
= build_call_expr_loc_vec (input_location
, tmp
, args
);
2354 if (ns
->proc_name
->attr
.mixed_entry_master
)
2356 tree union_decl
, field
;
2357 tree master_type
= TREE_TYPE (ns
->proc_name
->backend_decl
);
2359 union_decl
= build_decl (input_location
,
2360 VAR_DECL
, get_identifier ("__result"),
2361 TREE_TYPE (master_type
));
2362 DECL_ARTIFICIAL (union_decl
) = 1;
2363 DECL_EXTERNAL (union_decl
) = 0;
2364 TREE_PUBLIC (union_decl
) = 0;
2365 TREE_USED (union_decl
) = 1;
2366 layout_decl (union_decl
, 0);
2367 pushdecl (union_decl
);
2369 DECL_CONTEXT (union_decl
) = current_function_decl
;
2370 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2371 TREE_TYPE (union_decl
), union_decl
, tmp
);
2372 gfc_add_expr_to_block (&body
, tmp
);
2374 for (field
= TYPE_FIELDS (TREE_TYPE (union_decl
));
2375 field
; field
= DECL_CHAIN (field
))
2376 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field
)),
2377 thunk_sym
->result
->name
) == 0)
2379 gcc_assert (field
!= NULL_TREE
);
2380 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
2381 TREE_TYPE (field
), union_decl
, field
,
2383 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2384 TREE_TYPE (DECL_RESULT (current_function_decl
)),
2385 DECL_RESULT (current_function_decl
), tmp
);
2386 tmp
= build1_v (RETURN_EXPR
, tmp
);
2388 else if (TREE_TYPE (DECL_RESULT (current_function_decl
))
2391 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2392 TREE_TYPE (DECL_RESULT (current_function_decl
)),
2393 DECL_RESULT (current_function_decl
), tmp
);
2394 tmp
= build1_v (RETURN_EXPR
, tmp
);
2396 gfc_add_expr_to_block (&body
, tmp
);
2398 /* Finish off this function and send it for code generation. */
2399 DECL_SAVED_TREE (thunk_fndecl
) = gfc_finish_block (&body
);
2402 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl
)) = thunk_fndecl
;
2403 DECL_SAVED_TREE (thunk_fndecl
)
2404 = build3_v (BIND_EXPR
, tmp
, DECL_SAVED_TREE (thunk_fndecl
),
2405 DECL_INITIAL (thunk_fndecl
));
2407 /* Output the GENERIC tree. */
2408 dump_function (TDI_original
, thunk_fndecl
);
2410 /* Store the end of the function, so that we get good line number
2411 info for the epilogue. */
2412 cfun
->function_end_locus
= input_location
;
2414 /* We're leaving the context of this function, so zap cfun.
2415 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2416 tree_rest_of_compilation. */
2419 current_function_decl
= NULL_TREE
;
2421 cgraph_finalize_function (thunk_fndecl
, true);
2423 /* We share the symbols in the formal argument list with other entry
2424 points and the master function. Clear them so that they are
2425 recreated for each function. */
2426 for (formal
= thunk_sym
->formal
; formal
; formal
= formal
->next
)
2427 if (formal
->sym
!= NULL
) /* Ignore alternate returns. */
2429 formal
->sym
->backend_decl
= NULL_TREE
;
2430 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2431 formal
->sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2434 if (thunk_sym
->attr
.function
)
2436 if (thunk_sym
->ts
.type
== BT_CHARACTER
)
2437 thunk_sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2438 if (thunk_sym
->result
->ts
.type
== BT_CHARACTER
)
2439 thunk_sym
->result
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2443 gfc_restore_backend_locus (&old_loc
);
2447 /* Create a decl for a function, and create any thunks for alternate entry
2448 points. If global is true, generate the function in the global binding
2449 level, otherwise in the current binding level (which can be global). */
2452 gfc_create_function_decl (gfc_namespace
* ns
, bool global
)
2454 /* Create a declaration for the master function. */
2455 build_function_decl (ns
->proc_name
, global
);
2457 /* Compile the entry thunks. */
2459 build_entry_thunks (ns
, global
);
2461 /* Now create the read argument list. */
2462 create_function_arglist (ns
->proc_name
);
2465 /* Return the decl used to hold the function return value. If
2466 parent_flag is set, the context is the parent_scope. */
2469 gfc_get_fake_result_decl (gfc_symbol
* sym
, int parent_flag
)
2473 tree this_fake_result_decl
;
2474 tree this_function_decl
;
2476 char name
[GFC_MAX_SYMBOL_LEN
+ 10];
2480 this_fake_result_decl
= parent_fake_result_decl
;
2481 this_function_decl
= DECL_CONTEXT (current_function_decl
);
2485 this_fake_result_decl
= current_fake_result_decl
;
2486 this_function_decl
= current_function_decl
;
2490 && sym
->ns
->proc_name
->backend_decl
== this_function_decl
2491 && sym
->ns
->proc_name
->attr
.entry_master
2492 && sym
!= sym
->ns
->proc_name
)
2495 if (this_fake_result_decl
!= NULL
)
2496 for (t
= TREE_CHAIN (this_fake_result_decl
); t
; t
= TREE_CHAIN (t
))
2497 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t
)), sym
->name
) == 0)
2500 return TREE_VALUE (t
);
2501 decl
= gfc_get_fake_result_decl (sym
->ns
->proc_name
, parent_flag
);
2504 this_fake_result_decl
= parent_fake_result_decl
;
2506 this_fake_result_decl
= current_fake_result_decl
;
2508 if (decl
&& sym
->ns
->proc_name
->attr
.mixed_entry_master
)
2512 for (field
= TYPE_FIELDS (TREE_TYPE (decl
));
2513 field
; field
= DECL_CHAIN (field
))
2514 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field
)),
2518 gcc_assert (field
!= NULL_TREE
);
2519 decl
= fold_build3_loc (input_location
, COMPONENT_REF
,
2520 TREE_TYPE (field
), decl
, field
, NULL_TREE
);
2523 var
= create_tmp_var_raw (TREE_TYPE (decl
), sym
->name
);
2525 gfc_add_decl_to_parent_function (var
);
2527 gfc_add_decl_to_function (var
);
2529 SET_DECL_VALUE_EXPR (var
, decl
);
2530 DECL_HAS_VALUE_EXPR_P (var
) = 1;
2531 GFC_DECL_RESULT (var
) = 1;
2533 TREE_CHAIN (this_fake_result_decl
)
2534 = tree_cons (get_identifier (sym
->name
), var
,
2535 TREE_CHAIN (this_fake_result_decl
));
2539 if (this_fake_result_decl
!= NULL_TREE
)
2540 return TREE_VALUE (this_fake_result_decl
);
2542 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2547 if (sym
->ts
.type
== BT_CHARACTER
)
2549 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
2550 length
= gfc_create_string_length (sym
);
2552 length
= sym
->ts
.u
.cl
->backend_decl
;
2553 if (TREE_CODE (length
) == VAR_DECL
2554 && DECL_CONTEXT (length
) == NULL_TREE
)
2555 gfc_add_decl_to_function (length
);
2558 if (gfc_return_by_reference (sym
))
2560 decl
= DECL_ARGUMENTS (this_function_decl
);
2562 if (sym
->ns
->proc_name
->backend_decl
== this_function_decl
2563 && sym
->ns
->proc_name
->attr
.entry_master
)
2564 decl
= DECL_CHAIN (decl
);
2566 TREE_USED (decl
) = 1;
2568 decl
= gfc_build_dummy_array_decl (sym
, decl
);
2572 sprintf (name
, "__result_%.20s",
2573 IDENTIFIER_POINTER (DECL_NAME (this_function_decl
)));
2575 if (!sym
->attr
.mixed_entry_master
&& sym
->attr
.function
)
2576 decl
= build_decl (DECL_SOURCE_LOCATION (this_function_decl
),
2577 VAR_DECL
, get_identifier (name
),
2578 gfc_sym_type (sym
));
2580 decl
= build_decl (DECL_SOURCE_LOCATION (this_function_decl
),
2581 VAR_DECL
, get_identifier (name
),
2582 TREE_TYPE (TREE_TYPE (this_function_decl
)));
2583 DECL_ARTIFICIAL (decl
) = 1;
2584 DECL_EXTERNAL (decl
) = 0;
2585 TREE_PUBLIC (decl
) = 0;
2586 TREE_USED (decl
) = 1;
2587 GFC_DECL_RESULT (decl
) = 1;
2588 TREE_ADDRESSABLE (decl
) = 1;
2590 layout_decl (decl
, 0);
2593 gfc_add_decl_to_parent_function (decl
);
2595 gfc_add_decl_to_function (decl
);
2599 parent_fake_result_decl
= build_tree_list (NULL
, decl
);
2601 current_fake_result_decl
= build_tree_list (NULL
, decl
);
2607 /* Builds a function decl. The remaining parameters are the types of the
2608 function arguments. Negative nargs indicates a varargs function. */
2611 build_library_function_decl_1 (tree name
, const char *spec
,
2612 tree rettype
, int nargs
, va_list p
)
2614 VEC(tree
,gc
) *arglist
;
2619 /* Library functions must be declared with global scope. */
2620 gcc_assert (current_function_decl
== NULL_TREE
);
2622 /* Create a list of the argument types. */
2623 arglist
= VEC_alloc (tree
, gc
, abs (nargs
));
2624 for (n
= abs (nargs
); n
> 0; n
--)
2626 tree argtype
= va_arg (p
, tree
);
2627 VEC_quick_push (tree
, arglist
, argtype
);
2630 /* Build the function type and decl. */
2632 fntype
= build_function_type_vec (rettype
, arglist
);
2634 fntype
= build_varargs_function_type_vec (rettype
, arglist
);
2637 tree attr_args
= build_tree_list (NULL_TREE
,
2638 build_string (strlen (spec
), spec
));
2639 tree attrs
= tree_cons (get_identifier ("fn spec"),
2640 attr_args
, TYPE_ATTRIBUTES (fntype
));
2641 fntype
= build_type_attribute_variant (fntype
, attrs
);
2643 fndecl
= build_decl (input_location
,
2644 FUNCTION_DECL
, name
, fntype
);
2646 /* Mark this decl as external. */
2647 DECL_EXTERNAL (fndecl
) = 1;
2648 TREE_PUBLIC (fndecl
) = 1;
2652 rest_of_decl_compilation (fndecl
, 1, 0);
2657 /* Builds a function decl. The remaining parameters are the types of the
2658 function arguments. Negative nargs indicates a varargs function. */
2661 gfc_build_library_function_decl (tree name
, tree rettype
, int nargs
, ...)
2665 va_start (args
, nargs
);
2666 ret
= build_library_function_decl_1 (name
, NULL
, rettype
, nargs
, args
);
2671 /* Builds a function decl. The remaining parameters are the types of the
2672 function arguments. Negative nargs indicates a varargs function.
2673 The SPEC parameter specifies the function argument and return type
2674 specification according to the fnspec function type attribute. */
2677 gfc_build_library_function_decl_with_spec (tree name
, const char *spec
,
2678 tree rettype
, int nargs
, ...)
2682 va_start (args
, nargs
);
2683 ret
= build_library_function_decl_1 (name
, spec
, rettype
, nargs
, args
);
2689 gfc_build_intrinsic_function_decls (void)
2691 tree gfc_int4_type_node
= gfc_get_int_type (4);
2692 tree gfc_int8_type_node
= gfc_get_int_type (8);
2693 tree gfc_int16_type_node
= gfc_get_int_type (16);
2694 tree gfc_logical4_type_node
= gfc_get_logical_type (4);
2695 tree pchar1_type_node
= gfc_get_pchar_type (1);
2696 tree pchar4_type_node
= gfc_get_pchar_type (4);
2698 /* String functions. */
2699 gfor_fndecl_compare_string
= gfc_build_library_function_decl_with_spec (
2700 get_identifier (PREFIX("compare_string")), "..R.R",
2701 integer_type_node
, 4, gfc_charlen_type_node
, pchar1_type_node
,
2702 gfc_charlen_type_node
, pchar1_type_node
);
2703 DECL_PURE_P (gfor_fndecl_compare_string
) = 1;
2704 TREE_NOTHROW (gfor_fndecl_compare_string
) = 1;
2706 gfor_fndecl_concat_string
= gfc_build_library_function_decl_with_spec (
2707 get_identifier (PREFIX("concat_string")), "..W.R.R",
2708 void_type_node
, 6, gfc_charlen_type_node
, pchar1_type_node
,
2709 gfc_charlen_type_node
, pchar1_type_node
,
2710 gfc_charlen_type_node
, pchar1_type_node
);
2711 TREE_NOTHROW (gfor_fndecl_concat_string
) = 1;
2713 gfor_fndecl_string_len_trim
= gfc_build_library_function_decl_with_spec (
2714 get_identifier (PREFIX("string_len_trim")), "..R",
2715 gfc_charlen_type_node
, 2, gfc_charlen_type_node
, pchar1_type_node
);
2716 DECL_PURE_P (gfor_fndecl_string_len_trim
) = 1;
2717 TREE_NOTHROW (gfor_fndecl_string_len_trim
) = 1;
2719 gfor_fndecl_string_index
= gfc_build_library_function_decl_with_spec (
2720 get_identifier (PREFIX("string_index")), "..R.R.",
2721 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2722 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2723 DECL_PURE_P (gfor_fndecl_string_index
) = 1;
2724 TREE_NOTHROW (gfor_fndecl_string_index
) = 1;
2726 gfor_fndecl_string_scan
= gfc_build_library_function_decl_with_spec (
2727 get_identifier (PREFIX("string_scan")), "..R.R.",
2728 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2729 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2730 DECL_PURE_P (gfor_fndecl_string_scan
) = 1;
2731 TREE_NOTHROW (gfor_fndecl_string_scan
) = 1;
2733 gfor_fndecl_string_verify
= gfc_build_library_function_decl_with_spec (
2734 get_identifier (PREFIX("string_verify")), "..R.R.",
2735 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2736 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2737 DECL_PURE_P (gfor_fndecl_string_verify
) = 1;
2738 TREE_NOTHROW (gfor_fndecl_string_verify
) = 1;
2740 gfor_fndecl_string_trim
= gfc_build_library_function_decl_with_spec (
2741 get_identifier (PREFIX("string_trim")), ".Ww.R",
2742 void_type_node
, 4, build_pointer_type (gfc_charlen_type_node
),
2743 build_pointer_type (pchar1_type_node
), gfc_charlen_type_node
,
2746 gfor_fndecl_string_minmax
= gfc_build_library_function_decl_with_spec (
2747 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2748 void_type_node
, -4, build_pointer_type (gfc_charlen_type_node
),
2749 build_pointer_type (pchar1_type_node
), integer_type_node
,
2752 gfor_fndecl_adjustl
= gfc_build_library_function_decl_with_spec (
2753 get_identifier (PREFIX("adjustl")), ".W.R",
2754 void_type_node
, 3, pchar1_type_node
, gfc_charlen_type_node
,
2756 TREE_NOTHROW (gfor_fndecl_adjustl
) = 1;
2758 gfor_fndecl_adjustr
= gfc_build_library_function_decl_with_spec (
2759 get_identifier (PREFIX("adjustr")), ".W.R",
2760 void_type_node
, 3, pchar1_type_node
, gfc_charlen_type_node
,
2762 TREE_NOTHROW (gfor_fndecl_adjustr
) = 1;
2764 gfor_fndecl_select_string
= gfc_build_library_function_decl_with_spec (
2765 get_identifier (PREFIX("select_string")), ".R.R.",
2766 integer_type_node
, 4, pvoid_type_node
, integer_type_node
,
2767 pchar1_type_node
, gfc_charlen_type_node
);
2768 DECL_PURE_P (gfor_fndecl_select_string
) = 1;
2769 TREE_NOTHROW (gfor_fndecl_select_string
) = 1;
2771 gfor_fndecl_compare_string_char4
= gfc_build_library_function_decl_with_spec (
2772 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2773 integer_type_node
, 4, gfc_charlen_type_node
, pchar4_type_node
,
2774 gfc_charlen_type_node
, pchar4_type_node
);
2775 DECL_PURE_P (gfor_fndecl_compare_string_char4
) = 1;
2776 TREE_NOTHROW (gfor_fndecl_compare_string_char4
) = 1;
2778 gfor_fndecl_concat_string_char4
= gfc_build_library_function_decl_with_spec (
2779 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2780 void_type_node
, 6, gfc_charlen_type_node
, pchar4_type_node
,
2781 gfc_charlen_type_node
, pchar4_type_node
, gfc_charlen_type_node
,
2783 TREE_NOTHROW (gfor_fndecl_concat_string_char4
) = 1;
2785 gfor_fndecl_string_len_trim_char4
= gfc_build_library_function_decl_with_spec (
2786 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2787 gfc_charlen_type_node
, 2, gfc_charlen_type_node
, pchar4_type_node
);
2788 DECL_PURE_P (gfor_fndecl_string_len_trim_char4
) = 1;
2789 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4
) = 1;
2791 gfor_fndecl_string_index_char4
= gfc_build_library_function_decl_with_spec (
2792 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2793 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2794 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2795 DECL_PURE_P (gfor_fndecl_string_index_char4
) = 1;
2796 TREE_NOTHROW (gfor_fndecl_string_index_char4
) = 1;
2798 gfor_fndecl_string_scan_char4
= gfc_build_library_function_decl_with_spec (
2799 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2800 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2801 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2802 DECL_PURE_P (gfor_fndecl_string_scan_char4
) = 1;
2803 TREE_NOTHROW (gfor_fndecl_string_scan_char4
) = 1;
2805 gfor_fndecl_string_verify_char4
= gfc_build_library_function_decl_with_spec (
2806 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2807 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2808 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2809 DECL_PURE_P (gfor_fndecl_string_verify_char4
) = 1;
2810 TREE_NOTHROW (gfor_fndecl_string_verify_char4
) = 1;
2812 gfor_fndecl_string_trim_char4
= gfc_build_library_function_decl_with_spec (
2813 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2814 void_type_node
, 4, build_pointer_type (gfc_charlen_type_node
),
2815 build_pointer_type (pchar4_type_node
), gfc_charlen_type_node
,
2818 gfor_fndecl_string_minmax_char4
= gfc_build_library_function_decl_with_spec (
2819 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2820 void_type_node
, -4, build_pointer_type (gfc_charlen_type_node
),
2821 build_pointer_type (pchar4_type_node
), integer_type_node
,
2824 gfor_fndecl_adjustl_char4
= gfc_build_library_function_decl_with_spec (
2825 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2826 void_type_node
, 3, pchar4_type_node
, gfc_charlen_type_node
,
2828 TREE_NOTHROW (gfor_fndecl_adjustl_char4
) = 1;
2830 gfor_fndecl_adjustr_char4
= gfc_build_library_function_decl_with_spec (
2831 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2832 void_type_node
, 3, pchar4_type_node
, gfc_charlen_type_node
,
2834 TREE_NOTHROW (gfor_fndecl_adjustr_char4
) = 1;
2836 gfor_fndecl_select_string_char4
= gfc_build_library_function_decl_with_spec (
2837 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2838 integer_type_node
, 4, pvoid_type_node
, integer_type_node
,
2839 pvoid_type_node
, gfc_charlen_type_node
);
2840 DECL_PURE_P (gfor_fndecl_select_string_char4
) = 1;
2841 TREE_NOTHROW (gfor_fndecl_select_string_char4
) = 1;
2844 /* Conversion between character kinds. */
2846 gfor_fndecl_convert_char1_to_char4
= gfc_build_library_function_decl_with_spec (
2847 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2848 void_type_node
, 3, build_pointer_type (pchar4_type_node
),
2849 gfc_charlen_type_node
, pchar1_type_node
);
2851 gfor_fndecl_convert_char4_to_char1
= gfc_build_library_function_decl_with_spec (
2852 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
2853 void_type_node
, 3, build_pointer_type (pchar1_type_node
),
2854 gfc_charlen_type_node
, pchar4_type_node
);
2856 /* Misc. functions. */
2858 gfor_fndecl_ttynam
= gfc_build_library_function_decl_with_spec (
2859 get_identifier (PREFIX("ttynam")), ".W",
2860 void_type_node
, 3, pchar_type_node
, gfc_charlen_type_node
,
2863 gfor_fndecl_fdate
= gfc_build_library_function_decl_with_spec (
2864 get_identifier (PREFIX("fdate")), ".W",
2865 void_type_node
, 2, pchar_type_node
, gfc_charlen_type_node
);
2867 gfor_fndecl_ctime
= gfc_build_library_function_decl_with_spec (
2868 get_identifier (PREFIX("ctime")), ".W",
2869 void_type_node
, 3, pchar_type_node
, gfc_charlen_type_node
,
2870 gfc_int8_type_node
);
2872 gfor_fndecl_sc_kind
= gfc_build_library_function_decl_with_spec (
2873 get_identifier (PREFIX("selected_char_kind")), "..R",
2874 gfc_int4_type_node
, 2, gfc_charlen_type_node
, pchar_type_node
);
2875 DECL_PURE_P (gfor_fndecl_sc_kind
) = 1;
2876 TREE_NOTHROW (gfor_fndecl_sc_kind
) = 1;
2878 gfor_fndecl_si_kind
= gfc_build_library_function_decl_with_spec (
2879 get_identifier (PREFIX("selected_int_kind")), ".R",
2880 gfc_int4_type_node
, 1, pvoid_type_node
);
2881 DECL_PURE_P (gfor_fndecl_si_kind
) = 1;
2882 TREE_NOTHROW (gfor_fndecl_si_kind
) = 1;
2884 gfor_fndecl_sr_kind
= gfc_build_library_function_decl_with_spec (
2885 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
2886 gfc_int4_type_node
, 3, pvoid_type_node
, pvoid_type_node
,
2888 DECL_PURE_P (gfor_fndecl_sr_kind
) = 1;
2889 TREE_NOTHROW (gfor_fndecl_sr_kind
) = 1;
2891 /* Power functions. */
2893 tree ctype
, rtype
, itype
, jtype
;
2894 int rkind
, ikind
, jkind
;
2897 static int ikinds
[NIKINDS
] = {4, 8, 16};
2898 static int rkinds
[NRKINDS
] = {4, 8, 10, 16};
2899 char name
[PREFIX_LEN
+ 12]; /* _gfortran_pow_?n_?n */
2901 for (ikind
=0; ikind
< NIKINDS
; ikind
++)
2903 itype
= gfc_get_int_type (ikinds
[ikind
]);
2905 for (jkind
=0; jkind
< NIKINDS
; jkind
++)
2907 jtype
= gfc_get_int_type (ikinds
[jkind
]);
2910 sprintf(name
, PREFIX("pow_i%d_i%d"), ikinds
[ikind
],
2912 gfor_fndecl_math_powi
[jkind
][ikind
].integer
=
2913 gfc_build_library_function_decl (get_identifier (name
),
2914 jtype
, 2, jtype
, itype
);
2915 TREE_READONLY (gfor_fndecl_math_powi
[jkind
][ikind
].integer
) = 1;
2916 TREE_NOTHROW (gfor_fndecl_math_powi
[jkind
][ikind
].integer
) = 1;
2920 for (rkind
= 0; rkind
< NRKINDS
; rkind
++)
2922 rtype
= gfc_get_real_type (rkinds
[rkind
]);
2925 sprintf(name
, PREFIX("pow_r%d_i%d"), rkinds
[rkind
],
2927 gfor_fndecl_math_powi
[rkind
][ikind
].real
=
2928 gfc_build_library_function_decl (get_identifier (name
),
2929 rtype
, 2, rtype
, itype
);
2930 TREE_READONLY (gfor_fndecl_math_powi
[rkind
][ikind
].real
) = 1;
2931 TREE_NOTHROW (gfor_fndecl_math_powi
[rkind
][ikind
].real
) = 1;
2934 ctype
= gfc_get_complex_type (rkinds
[rkind
]);
2937 sprintf(name
, PREFIX("pow_c%d_i%d"), rkinds
[rkind
],
2939 gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
=
2940 gfc_build_library_function_decl (get_identifier (name
),
2941 ctype
, 2,ctype
, itype
);
2942 TREE_READONLY (gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
) = 1;
2943 TREE_NOTHROW (gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
) = 1;
2951 gfor_fndecl_math_ishftc4
= gfc_build_library_function_decl (
2952 get_identifier (PREFIX("ishftc4")),
2953 gfc_int4_type_node
, 3, gfc_int4_type_node
, gfc_int4_type_node
,
2954 gfc_int4_type_node
);
2955 TREE_READONLY (gfor_fndecl_math_ishftc4
) = 1;
2956 TREE_NOTHROW (gfor_fndecl_math_ishftc4
) = 1;
2958 gfor_fndecl_math_ishftc8
= gfc_build_library_function_decl (
2959 get_identifier (PREFIX("ishftc8")),
2960 gfc_int8_type_node
, 3, gfc_int8_type_node
, gfc_int4_type_node
,
2961 gfc_int4_type_node
);
2962 TREE_READONLY (gfor_fndecl_math_ishftc8
) = 1;
2963 TREE_NOTHROW (gfor_fndecl_math_ishftc8
) = 1;
2965 if (gfc_int16_type_node
)
2967 gfor_fndecl_math_ishftc16
= gfc_build_library_function_decl (
2968 get_identifier (PREFIX("ishftc16")),
2969 gfc_int16_type_node
, 3, gfc_int16_type_node
, gfc_int4_type_node
,
2970 gfc_int4_type_node
);
2971 TREE_READONLY (gfor_fndecl_math_ishftc16
) = 1;
2972 TREE_NOTHROW (gfor_fndecl_math_ishftc16
) = 1;
2975 /* BLAS functions. */
2977 tree pint
= build_pointer_type (integer_type_node
);
2978 tree ps
= build_pointer_type (gfc_get_real_type (gfc_default_real_kind
));
2979 tree pd
= build_pointer_type (gfc_get_real_type (gfc_default_double_kind
));
2980 tree pc
= build_pointer_type (gfc_get_complex_type (gfc_default_real_kind
));
2981 tree pz
= build_pointer_type
2982 (gfc_get_complex_type (gfc_default_double_kind
));
2984 gfor_fndecl_sgemm
= gfc_build_library_function_decl
2986 (gfc_option
.flag_underscoring
? "sgemm_"
2988 void_type_node
, 15, pchar_type_node
,
2989 pchar_type_node
, pint
, pint
, pint
, ps
, ps
, pint
,
2990 ps
, pint
, ps
, ps
, pint
, integer_type_node
,
2992 gfor_fndecl_dgemm
= gfc_build_library_function_decl
2994 (gfc_option
.flag_underscoring
? "dgemm_"
2996 void_type_node
, 15, pchar_type_node
,
2997 pchar_type_node
, pint
, pint
, pint
, pd
, pd
, pint
,
2998 pd
, pint
, pd
, pd
, pint
, integer_type_node
,
3000 gfor_fndecl_cgemm
= gfc_build_library_function_decl
3002 (gfc_option
.flag_underscoring
? "cgemm_"
3004 void_type_node
, 15, pchar_type_node
,
3005 pchar_type_node
, pint
, pint
, pint
, pc
, pc
, pint
,
3006 pc
, pint
, pc
, pc
, pint
, integer_type_node
,
3008 gfor_fndecl_zgemm
= gfc_build_library_function_decl
3010 (gfc_option
.flag_underscoring
? "zgemm_"
3012 void_type_node
, 15, pchar_type_node
,
3013 pchar_type_node
, pint
, pint
, pint
, pz
, pz
, pint
,
3014 pz
, pint
, pz
, pz
, pint
, integer_type_node
,
3018 /* Other functions. */
3019 gfor_fndecl_size0
= gfc_build_library_function_decl_with_spec (
3020 get_identifier (PREFIX("size0")), ".R",
3021 gfc_array_index_type
, 1, pvoid_type_node
);
3022 DECL_PURE_P (gfor_fndecl_size0
) = 1;
3023 TREE_NOTHROW (gfor_fndecl_size0
) = 1;
3025 gfor_fndecl_size1
= gfc_build_library_function_decl_with_spec (
3026 get_identifier (PREFIX("size1")), ".R",
3027 gfc_array_index_type
, 2, pvoid_type_node
, gfc_array_index_type
);
3028 DECL_PURE_P (gfor_fndecl_size1
) = 1;
3029 TREE_NOTHROW (gfor_fndecl_size1
) = 1;
3031 gfor_fndecl_iargc
= gfc_build_library_function_decl (
3032 get_identifier (PREFIX ("iargc")), gfc_int4_type_node
, 0);
3033 TREE_NOTHROW (gfor_fndecl_iargc
) = 1;
3037 /* Make prototypes for runtime library functions. */
3040 gfc_build_builtin_function_decls (void)
3042 tree gfc_int4_type_node
= gfc_get_int_type (4);
3044 gfor_fndecl_stop_numeric
= gfc_build_library_function_decl (
3045 get_identifier (PREFIX("stop_numeric")),
3046 void_type_node
, 1, gfc_int4_type_node
);
3047 /* STOP doesn't return. */
3048 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric
) = 1;
3050 gfor_fndecl_stop_numeric_f08
= gfc_build_library_function_decl (
3051 get_identifier (PREFIX("stop_numeric_f08")),
3052 void_type_node
, 1, gfc_int4_type_node
);
3053 /* STOP doesn't return. */
3054 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08
) = 1;
3056 gfor_fndecl_stop_string
= gfc_build_library_function_decl_with_spec (
3057 get_identifier (PREFIX("stop_string")), ".R.",
3058 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3059 /* STOP doesn't return. */
3060 TREE_THIS_VOLATILE (gfor_fndecl_stop_string
) = 1;
3062 gfor_fndecl_error_stop_numeric
= gfc_build_library_function_decl (
3063 get_identifier (PREFIX("error_stop_numeric")),
3064 void_type_node
, 1, gfc_int4_type_node
);
3065 /* ERROR STOP doesn't return. */
3066 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric
) = 1;
3068 gfor_fndecl_error_stop_string
= gfc_build_library_function_decl_with_spec (
3069 get_identifier (PREFIX("error_stop_string")), ".R.",
3070 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3071 /* ERROR STOP doesn't return. */
3072 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string
) = 1;
3074 gfor_fndecl_pause_numeric
= gfc_build_library_function_decl (
3075 get_identifier (PREFIX("pause_numeric")),
3076 void_type_node
, 1, gfc_int4_type_node
);
3078 gfor_fndecl_pause_string
= gfc_build_library_function_decl_with_spec (
3079 get_identifier (PREFIX("pause_string")), ".R.",
3080 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3082 gfor_fndecl_runtime_error
= gfc_build_library_function_decl_with_spec (
3083 get_identifier (PREFIX("runtime_error")), ".R",
3084 void_type_node
, -1, pchar_type_node
);
3085 /* The runtime_error function does not return. */
3086 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error
) = 1;
3088 gfor_fndecl_runtime_error_at
= gfc_build_library_function_decl_with_spec (
3089 get_identifier (PREFIX("runtime_error_at")), ".RR",
3090 void_type_node
, -2, pchar_type_node
, pchar_type_node
);
3091 /* The runtime_error_at function does not return. */
3092 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at
) = 1;
3094 gfor_fndecl_runtime_warning_at
= gfc_build_library_function_decl_with_spec (
3095 get_identifier (PREFIX("runtime_warning_at")), ".RR",
3096 void_type_node
, -2, pchar_type_node
, pchar_type_node
);
3098 gfor_fndecl_generate_error
= gfc_build_library_function_decl_with_spec (
3099 get_identifier (PREFIX("generate_error")), ".R.R",
3100 void_type_node
, 3, pvoid_type_node
, integer_type_node
,
3103 gfor_fndecl_os_error
= gfc_build_library_function_decl_with_spec (
3104 get_identifier (PREFIX("os_error")), ".R",
3105 void_type_node
, 1, pchar_type_node
);
3106 /* The runtime_error function does not return. */
3107 TREE_THIS_VOLATILE (gfor_fndecl_os_error
) = 1;
3109 gfor_fndecl_set_args
= gfc_build_library_function_decl (
3110 get_identifier (PREFIX("set_args")),
3111 void_type_node
, 2, integer_type_node
,
3112 build_pointer_type (pchar_type_node
));
3114 gfor_fndecl_set_fpe
= gfc_build_library_function_decl (
3115 get_identifier (PREFIX("set_fpe")),
3116 void_type_node
, 1, integer_type_node
);
3118 /* Keep the array dimension in sync with the call, later in this file. */
3119 gfor_fndecl_set_options
= gfc_build_library_function_decl_with_spec (
3120 get_identifier (PREFIX("set_options")), "..R",
3121 void_type_node
, 2, integer_type_node
,
3122 build_pointer_type (integer_type_node
));
3124 gfor_fndecl_set_convert
= gfc_build_library_function_decl (
3125 get_identifier (PREFIX("set_convert")),
3126 void_type_node
, 1, integer_type_node
);
3128 gfor_fndecl_set_record_marker
= gfc_build_library_function_decl (
3129 get_identifier (PREFIX("set_record_marker")),
3130 void_type_node
, 1, integer_type_node
);
3132 gfor_fndecl_set_max_subrecord_length
= gfc_build_library_function_decl (
3133 get_identifier (PREFIX("set_max_subrecord_length")),
3134 void_type_node
, 1, integer_type_node
);
3136 gfor_fndecl_in_pack
= gfc_build_library_function_decl_with_spec (
3137 get_identifier (PREFIX("internal_pack")), ".r",
3138 pvoid_type_node
, 1, pvoid_type_node
);
3140 gfor_fndecl_in_unpack
= gfc_build_library_function_decl_with_spec (
3141 get_identifier (PREFIX("internal_unpack")), ".wR",
3142 void_type_node
, 2, pvoid_type_node
, pvoid_type_node
);
3144 gfor_fndecl_associated
= gfc_build_library_function_decl_with_spec (
3145 get_identifier (PREFIX("associated")), ".RR",
3146 integer_type_node
, 2, ppvoid_type_node
, ppvoid_type_node
);
3147 DECL_PURE_P (gfor_fndecl_associated
) = 1;
3148 TREE_NOTHROW (gfor_fndecl_associated
) = 1;
3150 /* Coarray library calls. */
3151 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
3153 tree pint_type
, pppchar_type
;
3155 pint_type
= build_pointer_type (integer_type_node
);
3157 = build_pointer_type (build_pointer_type (pchar_type_node
));
3159 gfor_fndecl_caf_init
= gfc_build_library_function_decl (
3160 get_identifier (PREFIX("caf_init")), void_type_node
,
3161 4, pint_type
, pppchar_type
, pint_type
, pint_type
);
3163 gfor_fndecl_caf_finalize
= gfc_build_library_function_decl (
3164 get_identifier (PREFIX("caf_finalize")), void_type_node
, 0);
3166 gfor_fndecl_caf_register
= gfc_build_library_function_decl_with_spec (
3167 get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node
, 6,
3168 size_type_node
, integer_type_node
, ppvoid_type_node
, pint_type
,
3169 pchar_type_node
, integer_type_node
);
3171 gfor_fndecl_caf_deregister
= gfc_build_library_function_decl_with_spec (
3172 get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node
, 4,
3173 ppvoid_type_node
, pint_type
, pchar_type_node
, integer_type_node
);
3175 gfor_fndecl_caf_critical
= gfc_build_library_function_decl (
3176 get_identifier (PREFIX("caf_critical")), void_type_node
, 0);
3178 gfor_fndecl_caf_end_critical
= gfc_build_library_function_decl (
3179 get_identifier (PREFIX("caf_end_critical")), void_type_node
, 0);
3181 gfor_fndecl_caf_sync_all
= gfc_build_library_function_decl_with_spec (
3182 get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node
,
3183 3, pint_type
, build_pointer_type (pchar_type_node
), integer_type_node
);
3185 gfor_fndecl_caf_sync_images
= gfc_build_library_function_decl_with_spec (
3186 get_identifier (PREFIX("caf_sync_images")), ".RRWW", void_type_node
,
3187 5, integer_type_node
, pint_type
, pint_type
,
3188 build_pointer_type (pchar_type_node
), integer_type_node
);
3190 gfor_fndecl_caf_error_stop
= gfc_build_library_function_decl (
3191 get_identifier (PREFIX("caf_error_stop")),
3192 void_type_node
, 1, gfc_int4_type_node
);
3193 /* CAF's ERROR STOP doesn't return. */
3194 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop
) = 1;
3196 gfor_fndecl_caf_error_stop_str
= gfc_build_library_function_decl_with_spec (
3197 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3198 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3199 /* CAF's ERROR STOP doesn't return. */
3200 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str
) = 1;
3203 gfc_build_intrinsic_function_decls ();
3204 gfc_build_intrinsic_lib_fndecls ();
3205 gfc_build_io_library_fndecls ();
3209 /* Evaluate the length of dummy character variables. */
3212 gfc_trans_dummy_character (gfc_symbol
*sym
, gfc_charlen
*cl
,
3213 gfc_wrapped_block
*block
)
3217 gfc_finish_decl (cl
->backend_decl
);
3219 gfc_start_block (&init
);
3221 /* Evaluate the string length expression. */
3222 gfc_conv_string_length (cl
, NULL
, &init
);
3224 gfc_trans_vla_type_sizes (sym
, &init
);
3226 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3230 /* Allocate and cleanup an automatic character variable. */
3233 gfc_trans_auto_character_variable (gfc_symbol
* sym
, gfc_wrapped_block
* block
)
3239 gcc_assert (sym
->backend_decl
);
3240 gcc_assert (sym
->ts
.u
.cl
&& sym
->ts
.u
.cl
->length
);
3242 gfc_init_block (&init
);
3244 /* Evaluate the string length expression. */
3245 gfc_conv_string_length (sym
->ts
.u
.cl
, NULL
, &init
);
3247 gfc_trans_vla_type_sizes (sym
, &init
);
3249 decl
= sym
->backend_decl
;
3251 /* Emit a DECL_EXPR for this variable, which will cause the
3252 gimplifier to allocate storage, and all that good stuff. */
3253 tmp
= fold_build1_loc (input_location
, DECL_EXPR
, TREE_TYPE (decl
), decl
);
3254 gfc_add_expr_to_block (&init
, tmp
);
3256 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3259 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3262 gfc_trans_assign_aux_var (gfc_symbol
* sym
, gfc_wrapped_block
* block
)
3266 gcc_assert (sym
->backend_decl
);
3267 gfc_start_block (&init
);
3269 /* Set the initial value to length. See the comments in
3270 function gfc_add_assign_aux_vars in this file. */
3271 gfc_add_modify (&init
, GFC_DECL_STRING_LEN (sym
->backend_decl
),
3272 build_int_cst (gfc_charlen_type_node
, -2));
3274 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3278 gfc_trans_vla_one_sizepos (tree
*tp
, stmtblock_t
*body
)
3280 tree t
= *tp
, var
, val
;
3282 if (t
== NULL
|| t
== error_mark_node
)
3284 if (TREE_CONSTANT (t
) || DECL_P (t
))
3287 if (TREE_CODE (t
) == SAVE_EXPR
)
3289 if (SAVE_EXPR_RESOLVED_P (t
))
3291 *tp
= TREE_OPERAND (t
, 0);
3294 val
= TREE_OPERAND (t
, 0);
3299 var
= gfc_create_var_np (TREE_TYPE (t
), NULL
);
3300 gfc_add_decl_to_function (var
);
3301 gfc_add_modify (body
, var
, val
);
3302 if (TREE_CODE (t
) == SAVE_EXPR
)
3303 TREE_OPERAND (t
, 0) = var
;
3308 gfc_trans_vla_type_sizes_1 (tree type
, stmtblock_t
*body
)
3312 if (type
== NULL
|| type
== error_mark_node
)
3315 type
= TYPE_MAIN_VARIANT (type
);
3317 if (TREE_CODE (type
) == INTEGER_TYPE
)
3319 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type
), body
);
3320 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type
), body
);
3322 for (t
= TYPE_NEXT_VARIANT (type
); t
; t
= TYPE_NEXT_VARIANT (t
))
3324 TYPE_MIN_VALUE (t
) = TYPE_MIN_VALUE (type
);
3325 TYPE_MAX_VALUE (t
) = TYPE_MAX_VALUE (type
);
3328 else if (TREE_CODE (type
) == ARRAY_TYPE
)
3330 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type
), body
);
3331 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type
), body
);
3332 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type
), body
);
3333 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type
), body
);
3335 for (t
= TYPE_NEXT_VARIANT (type
); t
; t
= TYPE_NEXT_VARIANT (t
))
3337 TYPE_SIZE (t
) = TYPE_SIZE (type
);
3338 TYPE_SIZE_UNIT (t
) = TYPE_SIZE_UNIT (type
);
3343 /* Make sure all type sizes and array domains are either constant,
3344 or variable or parameter decls. This is a simplified variant
3345 of gimplify_type_sizes, but we can't use it here, as none of the
3346 variables in the expressions have been gimplified yet.
3347 As type sizes and domains for various variable length arrays
3348 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3349 time, without this routine gimplify_type_sizes in the middle-end
3350 could result in the type sizes being gimplified earlier than where
3351 those variables are initialized. */
3354 gfc_trans_vla_type_sizes (gfc_symbol
*sym
, stmtblock_t
*body
)
3356 tree type
= TREE_TYPE (sym
->backend_decl
);
3358 if (TREE_CODE (type
) == FUNCTION_TYPE
3359 && (sym
->attr
.function
|| sym
->attr
.result
|| sym
->attr
.entry
))
3361 if (! current_fake_result_decl
)
3364 type
= TREE_TYPE (TREE_VALUE (current_fake_result_decl
));
3367 while (POINTER_TYPE_P (type
))
3368 type
= TREE_TYPE (type
);
3370 if (GFC_DESCRIPTOR_TYPE_P (type
))
3372 tree etype
= GFC_TYPE_ARRAY_DATAPTR_TYPE (type
);
3374 while (POINTER_TYPE_P (etype
))
3375 etype
= TREE_TYPE (etype
);
3377 gfc_trans_vla_type_sizes_1 (etype
, body
);
3380 gfc_trans_vla_type_sizes_1 (type
, body
);
3384 /* Initialize a derived type by building an lvalue from the symbol
3385 and using trans_assignment to do the work. Set dealloc to false
3386 if no deallocation prior the assignment is needed. */
3388 gfc_init_default_dt (gfc_symbol
* sym
, stmtblock_t
* block
, bool dealloc
)
3396 gcc_assert (!sym
->attr
.allocatable
);
3397 gfc_set_sym_referenced (sym
);
3398 e
= gfc_lval_expr_from_sym (sym
);
3399 tmp
= gfc_trans_assignment (e
, sym
->value
, false, dealloc
);
3400 if (sym
->attr
.dummy
&& (sym
->attr
.optional
3401 || sym
->ns
->proc_name
->attr
.entry_master
))
3403 present
= gfc_conv_expr_present (sym
);
3404 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
), present
,
3405 tmp
, build_empty_stmt (input_location
));
3407 gfc_add_expr_to_block (block
, tmp
);
3412 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3413 them their default initializer, if they do not have allocatable
3414 components, they have their allocatable components deallocated. */
3417 init_intent_out_dt (gfc_symbol
* proc_sym
, gfc_wrapped_block
* block
)
3420 gfc_formal_arglist
*f
;
3424 gfc_init_block (&init
);
3425 for (f
= proc_sym
->formal
; f
; f
= f
->next
)
3426 if (f
->sym
&& f
->sym
->attr
.intent
== INTENT_OUT
3427 && !f
->sym
->attr
.pointer
3428 && f
->sym
->ts
.type
== BT_DERIVED
)
3430 if (f
->sym
->ts
.u
.derived
->attr
.alloc_comp
&& !f
->sym
->value
)
3432 tmp
= gfc_deallocate_alloc_comp (f
->sym
->ts
.u
.derived
,
3433 f
->sym
->backend_decl
,
3434 f
->sym
->as
? f
->sym
->as
->rank
: 0);
3436 if (f
->sym
->attr
.optional
3437 || f
->sym
->ns
->proc_name
->attr
.entry_master
)
3439 present
= gfc_conv_expr_present (f
->sym
);
3440 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
),
3442 build_empty_stmt (input_location
));
3445 gfc_add_expr_to_block (&init
, tmp
);
3447 else if (f
->sym
->value
)
3448 gfc_init_default_dt (f
->sym
, &init
, true);
3450 else if (f
->sym
&& f
->sym
->attr
.intent
== INTENT_OUT
3451 && f
->sym
->ts
.type
== BT_CLASS
3452 && !CLASS_DATA (f
->sym
)->attr
.class_pointer
3453 && CLASS_DATA (f
->sym
)->ts
.u
.derived
->attr
.alloc_comp
)
3455 tree decl
= build_fold_indirect_ref_loc (input_location
,
3456 f
->sym
->backend_decl
);
3457 tmp
= CLASS_DATA (f
->sym
)->backend_decl
;
3458 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
3459 TREE_TYPE (tmp
), decl
, tmp
, NULL_TREE
);
3460 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3461 tmp
= gfc_deallocate_alloc_comp (CLASS_DATA (f
->sym
)->ts
.u
.derived
,
3463 CLASS_DATA (f
->sym
)->as
?
3464 CLASS_DATA (f
->sym
)->as
->rank
: 0);
3466 if (f
->sym
->attr
.optional
|| f
->sym
->ns
->proc_name
->attr
.entry_master
)
3468 present
= gfc_conv_expr_present (f
->sym
);
3469 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
),
3471 build_empty_stmt (input_location
));
3474 gfc_add_expr_to_block (&init
, tmp
);
3477 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3481 /* Generate function entry and exit code, and add it to the function body.
3483 Allocation and initialization of array variables.
3484 Allocation of character string variables.
3485 Initialization and possibly repacking of dummy arrays.
3486 Initialization of ASSIGN statement auxiliary variable.
3487 Initialization of ASSOCIATE names.
3488 Automatic deallocation. */
3491 gfc_trans_deferred_vars (gfc_symbol
* proc_sym
, gfc_wrapped_block
* block
)
3495 gfc_formal_arglist
*f
;
3496 stmtblock_t tmpblock
;
3497 bool seen_trans_deferred_array
= false;
3503 /* Deal with implicit return variables. Explicit return variables will
3504 already have been added. */
3505 if (gfc_return_by_reference (proc_sym
) && proc_sym
->result
== proc_sym
)
3507 if (!current_fake_result_decl
)
3509 gfc_entry_list
*el
= NULL
;
3510 if (proc_sym
->attr
.entry_master
)
3512 for (el
= proc_sym
->ns
->entries
; el
; el
= el
->next
)
3513 if (el
->sym
!= el
->sym
->result
)
3516 /* TODO: move to the appropriate place in resolve.c. */
3517 if (warn_return_type
&& el
== NULL
)
3518 gfc_warning ("Return value of function '%s' at %L not set",
3519 proc_sym
->name
, &proc_sym
->declared_at
);
3521 else if (proc_sym
->as
)
3523 tree result
= TREE_VALUE (current_fake_result_decl
);
3524 gfc_trans_dummy_array_bias (proc_sym
, result
, block
);
3526 /* An automatic character length, pointer array result. */
3527 if (proc_sym
->ts
.type
== BT_CHARACTER
3528 && TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
3529 gfc_trans_dummy_character (proc_sym
, proc_sym
->ts
.u
.cl
, block
);
3531 else if (proc_sym
->ts
.type
== BT_CHARACTER
)
3533 if (proc_sym
->ts
.deferred
)
3536 gfc_save_backend_locus (&loc
);
3537 gfc_set_backend_locus (&proc_sym
->declared_at
);
3538 gfc_start_block (&init
);
3539 /* Zero the string length on entry. */
3540 gfc_add_modify (&init
, proc_sym
->ts
.u
.cl
->backend_decl
,
3541 build_int_cst (gfc_charlen_type_node
, 0));
3542 /* Null the pointer. */
3543 e
= gfc_lval_expr_from_sym (proc_sym
);
3544 gfc_init_se (&se
, NULL
);
3545 se
.want_pointer
= 1;
3546 gfc_conv_expr (&se
, e
);
3549 gfc_add_modify (&init
, tmp
,
3550 fold_convert (TREE_TYPE (se
.expr
),
3551 null_pointer_node
));
3552 gfc_restore_backend_locus (&loc
);
3554 /* Pass back the string length on exit. */
3555 tmp
= proc_sym
->ts
.u
.cl
->passed_length
;
3556 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3557 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3558 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3559 gfc_charlen_type_node
, tmp
,
3560 proc_sym
->ts
.u
.cl
->backend_decl
);
3561 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3563 else if (TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
3564 gfc_trans_dummy_character (proc_sym
, proc_sym
->ts
.u
.cl
, block
);
3567 gcc_assert (gfc_option
.flag_f2c
3568 && proc_sym
->ts
.type
== BT_COMPLEX
);
3571 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3572 should be done here so that the offsets and lbounds of arrays
3574 gfc_save_backend_locus (&loc
);
3575 gfc_set_backend_locus (&proc_sym
->declared_at
);
3576 init_intent_out_dt (proc_sym
, block
);
3577 gfc_restore_backend_locus (&loc
);
3579 for (sym
= proc_sym
->tlink
; sym
!= proc_sym
; sym
= sym
->tlink
)
3581 bool sym_has_alloc_comp
= (sym
->ts
.type
== BT_DERIVED
)
3582 && sym
->ts
.u
.derived
->attr
.alloc_comp
;
3586 if (sym
->attr
.subref_array_pointer
3587 && GFC_DECL_SPAN (sym
->backend_decl
)
3588 && !TREE_STATIC (GFC_DECL_SPAN (sym
->backend_decl
)))
3590 gfc_init_block (&tmpblock
);
3591 gfc_add_modify (&tmpblock
, GFC_DECL_SPAN (sym
->backend_decl
),
3592 build_int_cst (gfc_array_index_type
, 0));
3593 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3597 if (sym
->attr
.dimension
|| sym
->attr
.codimension
)
3599 /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT. */
3600 array_type tmp
= sym
->as
->type
;
3601 if (tmp
== AS_ASSUMED_SIZE
&& sym
->as
->cp_was_assumed
)
3606 if (sym
->attr
.dummy
|| sym
->attr
.result
)
3607 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, block
);
3608 else if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
3610 if (TREE_STATIC (sym
->backend_decl
))
3612 gfc_save_backend_locus (&loc
);
3613 gfc_set_backend_locus (&sym
->declared_at
);
3614 gfc_trans_static_array_pointer (sym
);
3615 gfc_restore_backend_locus (&loc
);
3619 seen_trans_deferred_array
= true;
3620 gfc_trans_deferred_array (sym
, block
);
3623 else if (sym
->attr
.codimension
&& TREE_STATIC (sym
->backend_decl
))
3625 gfc_init_block (&tmpblock
);
3626 gfc_trans_array_cobounds (TREE_TYPE (sym
->backend_decl
),
3628 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3632 else if (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
3634 gfc_save_backend_locus (&loc
);
3635 gfc_set_backend_locus (&sym
->declared_at
);
3637 if (sym_has_alloc_comp
)
3639 seen_trans_deferred_array
= true;
3640 gfc_trans_deferred_array (sym
, block
);
3642 else if (sym
->ts
.type
== BT_DERIVED
3645 && sym
->attr
.save
== SAVE_NONE
)
3647 gfc_start_block (&tmpblock
);
3648 gfc_init_default_dt (sym
, &tmpblock
, false);
3649 gfc_add_init_cleanup (block
,
3650 gfc_finish_block (&tmpblock
),
3654 gfc_trans_auto_array_allocation (sym
->backend_decl
,
3656 gfc_restore_backend_locus (&loc
);
3660 case AS_ASSUMED_SIZE
:
3661 /* Must be a dummy parameter. */
3662 gcc_assert (sym
->attr
.dummy
|| sym
->as
->cp_was_assumed
);
3664 /* We should always pass assumed size arrays the g77 way. */
3665 if (sym
->attr
.dummy
)
3666 gfc_trans_g77_array (sym
, block
);
3669 case AS_ASSUMED_SHAPE
:
3670 /* Must be a dummy parameter. */
3671 gcc_assert (sym
->attr
.dummy
);
3673 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, block
);
3677 seen_trans_deferred_array
= true;
3678 gfc_trans_deferred_array (sym
, block
);
3684 if (sym_has_alloc_comp
&& !seen_trans_deferred_array
)
3685 gfc_trans_deferred_array (sym
, block
);
3687 else if ((!sym
->attr
.dummy
|| sym
->ts
.deferred
)
3688 && (sym
->ts
.type
== BT_CLASS
3689 && CLASS_DATA (sym
)->attr
.class_pointer
))
3691 else if ((!sym
->attr
.dummy
|| sym
->ts
.deferred
)
3692 && (sym
->attr
.allocatable
3693 || (sym
->ts
.type
== BT_CLASS
3694 && CLASS_DATA (sym
)->attr
.allocatable
)))
3696 if (!sym
->attr
.save
)
3698 tree descriptor
= NULL_TREE
;
3700 /* Nullify and automatic deallocation of allocatable
3702 e
= gfc_lval_expr_from_sym (sym
);
3703 if (sym
->ts
.type
== BT_CLASS
)
3704 gfc_add_data_component (e
);
3706 gfc_init_se (&se
, NULL
);
3707 if (sym
->ts
.type
!= BT_CLASS
3708 || sym
->ts
.u
.derived
->attr
.dimension
3709 || sym
->ts
.u
.derived
->attr
.codimension
)
3711 se
.want_pointer
= 1;
3712 gfc_conv_expr (&se
, e
);
3714 else if (sym
->ts
.type
== BT_CLASS
3715 && !CLASS_DATA (sym
)->attr
.dimension
3716 && !CLASS_DATA (sym
)->attr
.codimension
)
3718 se
.want_pointer
= 1;
3719 gfc_conv_expr (&se
, e
);
3723 gfc_conv_expr (&se
, e
);
3724 descriptor
= se
.expr
;
3725 se
.expr
= gfc_conv_descriptor_data_addr (se
.expr
);
3726 se
.expr
= build_fold_indirect_ref_loc (input_location
, se
.expr
);
3730 gfc_save_backend_locus (&loc
);
3731 gfc_set_backend_locus (&sym
->declared_at
);
3732 gfc_start_block (&init
);
3734 if (!sym
->attr
.dummy
|| sym
->attr
.intent
== INTENT_OUT
)
3736 /* Nullify when entering the scope. */
3737 gfc_add_modify (&init
, se
.expr
,
3738 fold_convert (TREE_TYPE (se
.expr
),
3739 null_pointer_node
));
3742 if ((sym
->attr
.dummy
||sym
->attr
.result
)
3743 && sym
->ts
.type
== BT_CHARACTER
3744 && sym
->ts
.deferred
)
3746 /* Character length passed by reference. */
3747 tmp
= sym
->ts
.u
.cl
->passed_length
;
3748 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3749 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3751 if (!sym
->attr
.dummy
|| sym
->attr
.intent
== INTENT_OUT
)
3752 /* Zero the string length when entering the scope. */
3753 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
,
3754 build_int_cst (gfc_charlen_type_node
, 0));
3756 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
, tmp
);
3758 gfc_restore_backend_locus (&loc
);
3760 /* Pass the final character length back. */
3761 if (sym
->attr
.intent
!= INTENT_IN
)
3762 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3763 gfc_charlen_type_node
, tmp
,
3764 sym
->ts
.u
.cl
->backend_decl
);
3769 gfc_restore_backend_locus (&loc
);
3771 /* Deallocate when leaving the scope. Nullifying is not
3773 if (!sym
->attr
.result
&& !sym
->attr
.dummy
)
3775 if (sym
->ts
.type
== BT_CLASS
3776 && CLASS_DATA (sym
)->attr
.codimension
)
3777 tmp
= gfc_deallocate_with_status (descriptor
, NULL_TREE
,
3778 NULL_TREE
, NULL_TREE
,
3779 NULL_TREE
, true, NULL
,
3782 tmp
= gfc_deallocate_scalar_with_status (se
.expr
, NULL
,
3786 if (sym
->ts
.type
== BT_CLASS
)
3788 /* Initialize _vptr to declared type. */
3789 gfc_symbol
*vtab
= gfc_find_derived_vtab (sym
->ts
.u
.derived
);
3792 gfc_save_backend_locus (&loc
);
3793 gfc_set_backend_locus (&sym
->declared_at
);
3794 e
= gfc_lval_expr_from_sym (sym
);
3795 gfc_add_vptr_component (e
);
3796 gfc_init_se (&se
, NULL
);
3797 se
.want_pointer
= 1;
3798 gfc_conv_expr (&se
, e
);
3800 rhs
= gfc_build_addr_expr (TREE_TYPE (se
.expr
),
3801 gfc_get_symbol_decl (vtab
));
3802 gfc_add_modify (&init
, se
.expr
, rhs
);
3803 gfc_restore_backend_locus (&loc
);
3806 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3809 else if (sym
->ts
.type
== BT_CHARACTER
&& sym
->ts
.deferred
)
3814 /* If we get to here, all that should be left are pointers. */
3815 gcc_assert (sym
->attr
.pointer
);
3817 if (sym
->attr
.dummy
)
3819 gfc_start_block (&init
);
3821 /* Character length passed by reference. */
3822 tmp
= sym
->ts
.u
.cl
->passed_length
;
3823 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3824 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3825 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
, tmp
);
3826 /* Pass the final character length back. */
3827 if (sym
->attr
.intent
!= INTENT_IN
)
3828 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3829 gfc_charlen_type_node
, tmp
,
3830 sym
->ts
.u
.cl
->backend_decl
);
3833 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3836 else if (sym
->ts
.deferred
)
3837 gfc_fatal_error ("Deferred type parameter not yet supported");
3838 else if (sym_has_alloc_comp
)
3839 gfc_trans_deferred_array (sym
, block
);
3840 else if (sym
->ts
.type
== BT_CHARACTER
)
3842 gfc_save_backend_locus (&loc
);
3843 gfc_set_backend_locus (&sym
->declared_at
);
3844 if (sym
->attr
.dummy
|| sym
->attr
.result
)
3845 gfc_trans_dummy_character (sym
, sym
->ts
.u
.cl
, block
);
3847 gfc_trans_auto_character_variable (sym
, block
);
3848 gfc_restore_backend_locus (&loc
);
3850 else if (sym
->attr
.assign
)
3852 gfc_save_backend_locus (&loc
);
3853 gfc_set_backend_locus (&sym
->declared_at
);
3854 gfc_trans_assign_aux_var (sym
, block
);
3855 gfc_restore_backend_locus (&loc
);
3857 else if (sym
->ts
.type
== BT_DERIVED
3860 && sym
->attr
.save
== SAVE_NONE
)
3862 gfc_start_block (&tmpblock
);
3863 gfc_init_default_dt (sym
, &tmpblock
, false);
3864 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3871 gfc_init_block (&tmpblock
);
3873 for (f
= proc_sym
->formal
; f
; f
= f
->next
)
3875 if (f
->sym
&& f
->sym
->tlink
== NULL
&& f
->sym
->ts
.type
== BT_CHARACTER
)
3877 gcc_assert (f
->sym
->ts
.u
.cl
->backend_decl
!= NULL
);
3878 if (TREE_CODE (f
->sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
3879 gfc_trans_vla_type_sizes (f
->sym
, &tmpblock
);
3883 if (gfc_return_by_reference (proc_sym
) && proc_sym
->ts
.type
== BT_CHARACTER
3884 && current_fake_result_decl
!= NULL
)
3886 gcc_assert (proc_sym
->ts
.u
.cl
->backend_decl
!= NULL
);
3887 if (TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
3888 gfc_trans_vla_type_sizes (proc_sym
, &tmpblock
);
3891 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
), NULL_TREE
);
3894 static GTY ((param_is (struct module_htab_entry
))) htab_t module_htab
;
3896 /* Hash and equality functions for module_htab. */
3899 module_htab_do_hash (const void *x
)
3901 return htab_hash_string (((const struct module_htab_entry
*)x
)->name
);
3905 module_htab_eq (const void *x1
, const void *x2
)
3907 return strcmp ((((const struct module_htab_entry
*)x1
)->name
),
3908 (const char *)x2
) == 0;
3911 /* Hash and equality functions for module_htab's decls. */
3914 module_htab_decls_hash (const void *x
)
3916 const_tree t
= (const_tree
) x
;
3917 const_tree n
= DECL_NAME (t
);
3919 n
= TYPE_NAME (TREE_TYPE (t
));
3920 return htab_hash_string (IDENTIFIER_POINTER (n
));
3924 module_htab_decls_eq (const void *x1
, const void *x2
)
3926 const_tree t1
= (const_tree
) x1
;
3927 const_tree n1
= DECL_NAME (t1
);
3928 if (n1
== NULL_TREE
)
3929 n1
= TYPE_NAME (TREE_TYPE (t1
));
3930 return strcmp (IDENTIFIER_POINTER (n1
), (const char *) x2
) == 0;
3933 struct module_htab_entry
*
3934 gfc_find_module (const char *name
)
3939 module_htab
= htab_create_ggc (10, module_htab_do_hash
,
3940 module_htab_eq
, NULL
);
3942 slot
= htab_find_slot_with_hash (module_htab
, name
,
3943 htab_hash_string (name
), INSERT
);
3946 struct module_htab_entry
*entry
= ggc_alloc_cleared_module_htab_entry ();
3948 entry
->name
= gfc_get_string (name
);
3949 entry
->decls
= htab_create_ggc (10, module_htab_decls_hash
,
3950 module_htab_decls_eq
, NULL
);
3951 *slot
= (void *) entry
;
3953 return (struct module_htab_entry
*) *slot
;
3957 gfc_module_add_decl (struct module_htab_entry
*entry
, tree decl
)
3962 if (DECL_NAME (decl
))
3963 name
= IDENTIFIER_POINTER (DECL_NAME (decl
));
3966 gcc_assert (TREE_CODE (decl
) == TYPE_DECL
);
3967 name
= IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl
)));
3969 slot
= htab_find_slot_with_hash (entry
->decls
, name
,
3970 htab_hash_string (name
), INSERT
);
3972 *slot
= (void *) decl
;
3975 static struct module_htab_entry
*cur_module
;
3977 /* Output an initialized decl for a module variable. */
3980 gfc_create_module_variable (gfc_symbol
* sym
)
3984 /* Module functions with alternate entries are dealt with later and
3985 would get caught by the next condition. */
3986 if (sym
->attr
.entry
)
3989 /* Make sure we convert the types of the derived types from iso_c_binding
3991 if (sym
->attr
.flavor
!= FL_PROCEDURE
&& sym
->attr
.is_iso_c
3992 && sym
->ts
.type
== BT_DERIVED
)
3993 sym
->backend_decl
= gfc_typenode_for_spec (&(sym
->ts
));
3995 if (sym
->attr
.flavor
== FL_DERIVED
3996 && sym
->backend_decl
3997 && TREE_CODE (sym
->backend_decl
) == RECORD_TYPE
)
3999 decl
= sym
->backend_decl
;
4000 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4002 /* -fwhole-file mixes up the contexts so these asserts are unnecessary. */
4003 if (!(gfc_option
.flag_whole_file
&& sym
->attr
.use_assoc
))
4005 gcc_assert (TYPE_CONTEXT (decl
) == NULL_TREE
4006 || TYPE_CONTEXT (decl
) == sym
->ns
->proc_name
->backend_decl
);
4007 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl
)) == NULL_TREE
4008 || DECL_CONTEXT (TYPE_STUB_DECL (decl
))
4009 == sym
->ns
->proc_name
->backend_decl
);
4011 TYPE_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4012 DECL_CONTEXT (TYPE_STUB_DECL (decl
)) = sym
->ns
->proc_name
->backend_decl
;
4013 gfc_module_add_decl (cur_module
, TYPE_STUB_DECL (decl
));
4016 /* Only output variables, procedure pointers and array valued,
4017 or derived type, parameters. */
4018 if (sym
->attr
.flavor
!= FL_VARIABLE
4019 && !(sym
->attr
.flavor
== FL_PARAMETER
4020 && (sym
->attr
.dimension
|| sym
->ts
.type
== BT_DERIVED
))
4021 && !(sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.proc_pointer
))
4024 if ((sym
->attr
.in_common
|| sym
->attr
.in_equivalence
) && sym
->backend_decl
)
4026 decl
= sym
->backend_decl
;
4027 gcc_assert (DECL_FILE_SCOPE_P (decl
));
4028 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4029 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4030 gfc_module_add_decl (cur_module
, decl
);
4033 /* Don't generate variables from other modules. Variables from
4034 COMMONs will already have been generated. */
4035 if (sym
->attr
.use_assoc
|| sym
->attr
.in_common
)
4038 /* Equivalenced variables arrive here after creation. */
4039 if (sym
->backend_decl
4040 && (sym
->equiv_built
|| sym
->attr
.in_equivalence
))
4043 if (sym
->backend_decl
&& !sym
->attr
.vtab
&& !sym
->attr
.target
)
4044 internal_error ("backend decl for module variable %s already exists",
4047 /* We always want module variables to be created. */
4048 sym
->attr
.referenced
= 1;
4049 /* Create the decl. */
4050 decl
= gfc_get_symbol_decl (sym
);
4052 /* Create the variable. */
4054 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4055 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4056 rest_of_decl_compilation (decl
, 1, 0);
4057 gfc_module_add_decl (cur_module
, decl
);
4059 /* Also add length of strings. */
4060 if (sym
->ts
.type
== BT_CHARACTER
)
4064 length
= sym
->ts
.u
.cl
->backend_decl
;
4065 gcc_assert (length
|| sym
->attr
.proc_pointer
);
4066 if (length
&& !INTEGER_CST_P (length
))
4069 rest_of_decl_compilation (length
, 1, 0);
4073 if (sym
->attr
.codimension
&& !sym
->attr
.dummy
&& !sym
->attr
.allocatable
4074 && sym
->attr
.referenced
&& !sym
->attr
.use_assoc
)
4075 has_coarray_vars
= true;
4078 /* Emit debug information for USE statements. */
4081 gfc_trans_use_stmts (gfc_namespace
* ns
)
4083 gfc_use_list
*use_stmt
;
4084 for (use_stmt
= ns
->use_stmts
; use_stmt
; use_stmt
= use_stmt
->next
)
4086 struct module_htab_entry
*entry
4087 = gfc_find_module (use_stmt
->module_name
);
4088 gfc_use_rename
*rent
;
4090 if (entry
->namespace_decl
== NULL
)
4092 entry
->namespace_decl
4093 = build_decl (input_location
,
4095 get_identifier (use_stmt
->module_name
),
4097 DECL_EXTERNAL (entry
->namespace_decl
) = 1;
4099 gfc_set_backend_locus (&use_stmt
->where
);
4100 if (!use_stmt
->only_flag
)
4101 (*debug_hooks
->imported_module_or_decl
) (entry
->namespace_decl
,
4103 ns
->proc_name
->backend_decl
,
4105 for (rent
= use_stmt
->rename
; rent
; rent
= rent
->next
)
4107 tree decl
, local_name
;
4110 if (rent
->op
!= INTRINSIC_NONE
)
4113 slot
= htab_find_slot_with_hash (entry
->decls
, rent
->use_name
,
4114 htab_hash_string (rent
->use_name
),
4120 st
= gfc_find_symtree (ns
->sym_root
,
4122 ? rent
->local_name
: rent
->use_name
);
4124 /* The following can happen if a derived type is renamed. */
4128 name
= xstrdup (rent
->local_name
[0]
4129 ? rent
->local_name
: rent
->use_name
);
4130 name
[0] = (char) TOUPPER ((unsigned char) name
[0]);
4131 st
= gfc_find_symtree (ns
->sym_root
, name
);
4136 /* Sometimes, generic interfaces wind up being over-ruled by a
4137 local symbol (see PR41062). */
4138 if (!st
->n
.sym
->attr
.use_assoc
)
4141 if (st
->n
.sym
->backend_decl
4142 && DECL_P (st
->n
.sym
->backend_decl
)
4143 && st
->n
.sym
->module
4144 && strcmp (st
->n
.sym
->module
, use_stmt
->module_name
) == 0)
4146 gcc_assert (DECL_EXTERNAL (entry
->namespace_decl
)
4147 || (TREE_CODE (st
->n
.sym
->backend_decl
)
4149 decl
= copy_node (st
->n
.sym
->backend_decl
);
4150 DECL_CONTEXT (decl
) = entry
->namespace_decl
;
4151 DECL_EXTERNAL (decl
) = 1;
4152 DECL_IGNORED_P (decl
) = 0;
4153 DECL_INITIAL (decl
) = NULL_TREE
;
4157 *slot
= error_mark_node
;
4158 htab_clear_slot (entry
->decls
, slot
);
4163 decl
= (tree
) *slot
;
4164 if (rent
->local_name
[0])
4165 local_name
= get_identifier (rent
->local_name
);
4167 local_name
= NULL_TREE
;
4168 gfc_set_backend_locus (&rent
->where
);
4169 (*debug_hooks
->imported_module_or_decl
) (decl
, local_name
,
4170 ns
->proc_name
->backend_decl
,
4171 !use_stmt
->only_flag
);
4177 /* Return true if expr is a constant initializer that gfc_conv_initializer
4181 check_constant_initializer (gfc_expr
*expr
, gfc_typespec
*ts
, bool array
,
4191 if (expr
->expr_type
== EXPR_CONSTANT
|| expr
->expr_type
== EXPR_NULL
)
4193 else if (expr
->expr_type
== EXPR_STRUCTURE
)
4194 return check_constant_initializer (expr
, ts
, false, false);
4195 else if (expr
->expr_type
!= EXPR_ARRAY
)
4197 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4198 c
; c
= gfc_constructor_next (c
))
4202 if (c
->expr
->expr_type
== EXPR_STRUCTURE
)
4204 if (!check_constant_initializer (c
->expr
, ts
, false, false))
4207 else if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4212 else switch (ts
->type
)
4215 if (expr
->expr_type
!= EXPR_STRUCTURE
)
4217 cm
= expr
->ts
.u
.derived
->components
;
4218 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4219 c
; c
= gfc_constructor_next (c
), cm
= cm
->next
)
4221 if (!c
->expr
|| cm
->attr
.allocatable
)
4223 if (!check_constant_initializer (c
->expr
, &cm
->ts
,
4230 return expr
->expr_type
== EXPR_CONSTANT
;
4234 /* Emit debug info for parameters and unreferenced variables with
4238 gfc_emit_parameter_debug_info (gfc_symbol
*sym
)
4242 if (sym
->attr
.flavor
!= FL_PARAMETER
4243 && (sym
->attr
.flavor
!= FL_VARIABLE
|| sym
->attr
.referenced
))
4246 if (sym
->backend_decl
!= NULL
4247 || sym
->value
== NULL
4248 || sym
->attr
.use_assoc
4251 || sym
->attr
.function
4252 || sym
->attr
.intrinsic
4253 || sym
->attr
.pointer
4254 || sym
->attr
.allocatable
4255 || sym
->attr
.cray_pointee
4256 || sym
->attr
.threadprivate
4257 || sym
->attr
.is_bind_c
4258 || sym
->attr
.subref_array_pointer
4259 || sym
->attr
.assign
)
4262 if (sym
->ts
.type
== BT_CHARACTER
)
4264 gfc_conv_const_charlen (sym
->ts
.u
.cl
);
4265 if (sym
->ts
.u
.cl
->backend_decl
== NULL
4266 || TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) != INTEGER_CST
)
4269 else if (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
->attr
.alloc_comp
)
4276 if (sym
->as
->type
!= AS_EXPLICIT
)
4278 for (n
= 0; n
< sym
->as
->rank
; n
++)
4279 if (sym
->as
->lower
[n
]->expr_type
!= EXPR_CONSTANT
4280 || sym
->as
->upper
[n
] == NULL
4281 || sym
->as
->upper
[n
]->expr_type
!= EXPR_CONSTANT
)
4285 if (!check_constant_initializer (sym
->value
, &sym
->ts
,
4286 sym
->attr
.dimension
, false))
4289 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& sym
->attr
.codimension
)
4292 /* Create the decl for the variable or constant. */
4293 decl
= build_decl (input_location
,
4294 sym
->attr
.flavor
== FL_PARAMETER
? CONST_DECL
: VAR_DECL
,
4295 gfc_sym_identifier (sym
), gfc_sym_type (sym
));
4296 if (sym
->attr
.flavor
== FL_PARAMETER
)
4297 TREE_READONLY (decl
) = 1;
4298 gfc_set_decl_location (decl
, &sym
->declared_at
);
4299 if (sym
->attr
.dimension
)
4300 GFC_DECL_PACKED_ARRAY (decl
) = 1;
4301 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4302 TREE_STATIC (decl
) = 1;
4303 TREE_USED (decl
) = 1;
4304 if (DECL_CONTEXT (decl
) && TREE_CODE (DECL_CONTEXT (decl
)) == NAMESPACE_DECL
)
4305 TREE_PUBLIC (decl
) = 1;
4306 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
4308 sym
->attr
.dimension
,
4310 debug_hooks
->global_decl (decl
);
4315 generate_coarray_sym_init (gfc_symbol
*sym
)
4317 tree tmp
, size
, decl
, token
;
4319 if (sym
->attr
.dummy
|| sym
->attr
.allocatable
|| !sym
->attr
.codimension
4320 || sym
->attr
.use_assoc
|| !sym
->attr
.referenced
)
4323 decl
= sym
->backend_decl
;
4324 TREE_USED(decl
) = 1;
4325 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl
)));
4327 /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
4328 to make sure the variable is not optimized away. */
4329 DECL_PRESERVE_P (DECL_CONTEXT (decl
)) = 1;
4331 size
= TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl
)));
4333 /* Ensure that we do not have size=0 for zero-sized arrays. */
4334 size
= fold_build2_loc (input_location
, MAX_EXPR
, size_type_node
,
4335 fold_convert (size_type_node
, size
),
4336 build_int_cst (size_type_node
, 1));
4338 if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl
)))
4340 tmp
= GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl
));
4341 size
= fold_build2_loc (input_location
, MULT_EXPR
, size_type_node
,
4342 fold_convert (size_type_node
, tmp
), size
);
4345 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl
)) != NULL_TREE
);
4346 token
= gfc_build_addr_expr (ppvoid_type_node
,
4347 GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl
)));
4349 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_register
, 6, size
,
4350 build_int_cst (integer_type_node
,
4351 GFC_CAF_COARRAY_STATIC
), /* type. */
4352 token
, null_pointer_node
, /* token, stat. */
4353 null_pointer_node
, /* errgmsg, errmsg_len. */
4354 build_int_cst (integer_type_node
, 0));
4356 gfc_add_modify (&caf_init_block
, decl
, fold_convert (TREE_TYPE (decl
), tmp
));
4359 /* Handle "static" initializer. */
4362 sym
->attr
.pointer
= 1;
4363 tmp
= gfc_trans_assignment (gfc_lval_expr_from_sym (sym
), sym
->value
,
4365 sym
->attr
.pointer
= 0;
4366 gfc_add_expr_to_block (&caf_init_block
, tmp
);
4371 /* Generate constructor function to initialize static, nonallocatable
4375 generate_coarray_init (gfc_namespace
* ns
__attribute((unused
)))
4377 tree fndecl
, tmp
, decl
, save_fn_decl
;
4379 save_fn_decl
= current_function_decl
;
4380 push_function_context ();
4382 tmp
= build_function_type_list (void_type_node
, NULL_TREE
);
4383 fndecl
= build_decl (input_location
, FUNCTION_DECL
,
4384 create_tmp_var_name ("_caf_init"), tmp
);
4386 DECL_STATIC_CONSTRUCTOR (fndecl
) = 1;
4387 SET_DECL_INIT_PRIORITY (fndecl
, DEFAULT_INIT_PRIORITY
);
4389 decl
= build_decl (input_location
, RESULT_DECL
, NULL_TREE
, void_type_node
);
4390 DECL_ARTIFICIAL (decl
) = 1;
4391 DECL_IGNORED_P (decl
) = 1;
4392 DECL_CONTEXT (decl
) = fndecl
;
4393 DECL_RESULT (fndecl
) = decl
;
4396 current_function_decl
= fndecl
;
4397 announce_function (fndecl
);
4399 rest_of_decl_compilation (fndecl
, 0, 0);
4400 make_decl_rtl (fndecl
);
4401 init_function_start (fndecl
);
4404 gfc_init_block (&caf_init_block
);
4406 gfc_traverse_ns (ns
, generate_coarray_sym_init
);
4408 DECL_SAVED_TREE (fndecl
) = gfc_finish_block (&caf_init_block
);
4412 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
4414 DECL_SAVED_TREE (fndecl
)
4415 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
4416 DECL_INITIAL (fndecl
));
4417 dump_function (TDI_original
, fndecl
);
4419 cfun
->function_end_locus
= input_location
;
4422 if (decl_function_context (fndecl
))
4423 (void) cgraph_create_node (fndecl
);
4425 cgraph_finalize_function (fndecl
, true);
4427 pop_function_context ();
4428 current_function_decl
= save_fn_decl
;
4432 /* Generate all the required code for module variables. */
4435 gfc_generate_module_vars (gfc_namespace
* ns
)
4437 module_namespace
= ns
;
4438 cur_module
= gfc_find_module (ns
->proc_name
->name
);
4440 /* Check if the frontend left the namespace in a reasonable state. */
4441 gcc_assert (ns
->proc_name
&& !ns
->proc_name
->tlink
);
4443 /* Generate COMMON blocks. */
4444 gfc_trans_common (ns
);
4446 has_coarray_vars
= false;
4448 /* Create decls for all the module variables. */
4449 gfc_traverse_ns (ns
, gfc_create_module_variable
);
4451 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
4452 generate_coarray_init (ns
);
4456 gfc_trans_use_stmts (ns
);
4457 gfc_traverse_ns (ns
, gfc_emit_parameter_debug_info
);
4462 gfc_generate_contained_functions (gfc_namespace
* parent
)
4466 /* We create all the prototypes before generating any code. */
4467 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
4469 /* Skip namespaces from used modules. */
4470 if (ns
->parent
!= parent
)
4473 gfc_create_function_decl (ns
, false);
4476 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
4478 /* Skip namespaces from used modules. */
4479 if (ns
->parent
!= parent
)
4482 gfc_generate_function_code (ns
);
4487 /* Drill down through expressions for the array specification bounds and
4488 character length calling generate_local_decl for all those variables
4489 that have not already been declared. */
4492 generate_local_decl (gfc_symbol
*);
4494 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4497 expr_decls (gfc_expr
*e
, gfc_symbol
*sym
,
4498 int *f ATTRIBUTE_UNUSED
)
4500 if (e
->expr_type
!= EXPR_VARIABLE
4501 || sym
== e
->symtree
->n
.sym
4502 || e
->symtree
->n
.sym
->mark
4503 || e
->symtree
->n
.sym
->ns
!= sym
->ns
)
4506 generate_local_decl (e
->symtree
->n
.sym
);
4511 generate_expr_decls (gfc_symbol
*sym
, gfc_expr
*e
)
4513 gfc_traverse_expr (e
, sym
, expr_decls
, 0);
4517 /* Check for dependencies in the character length and array spec. */
4520 generate_dependency_declarations (gfc_symbol
*sym
)
4524 if (sym
->ts
.type
== BT_CHARACTER
4526 && sym
->ts
.u
.cl
->length
4527 && sym
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
)
4528 generate_expr_decls (sym
, sym
->ts
.u
.cl
->length
);
4530 if (sym
->as
&& sym
->as
->rank
)
4532 for (i
= 0; i
< sym
->as
->rank
; i
++)
4534 generate_expr_decls (sym
, sym
->as
->lower
[i
]);
4535 generate_expr_decls (sym
, sym
->as
->upper
[i
]);
4541 /* Generate decls for all local variables. We do this to ensure correct
4542 handling of expressions which only appear in the specification of
4546 generate_local_decl (gfc_symbol
* sym
)
4548 if (sym
->attr
.flavor
== FL_VARIABLE
)
4550 if (sym
->attr
.codimension
&& !sym
->attr
.dummy
&& !sym
->attr
.allocatable
4551 && sym
->attr
.referenced
&& !sym
->attr
.use_assoc
)
4552 has_coarray_vars
= true;
4554 if (!sym
->attr
.dummy
&& !sym
->ns
->proc_name
->attr
.entry_master
)
4555 generate_dependency_declarations (sym
);
4557 if (sym
->attr
.referenced
)
4558 gfc_get_symbol_decl (sym
);
4560 /* Warnings for unused dummy arguments. */
4561 else if (sym
->attr
.dummy
)
4563 /* INTENT(out) dummy arguments are likely meant to be set. */
4564 if (gfc_option
.warn_unused_dummy_argument
4565 && sym
->attr
.intent
== INTENT_OUT
)
4567 if (sym
->ts
.type
!= BT_DERIVED
)
4568 gfc_warning ("Dummy argument '%s' at %L was declared "
4569 "INTENT(OUT) but was not set", sym
->name
,
4571 else if (!gfc_has_default_initializer (sym
->ts
.u
.derived
))
4572 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4573 "declared INTENT(OUT) but was not set and "
4574 "does not have a default initializer",
4575 sym
->name
, &sym
->declared_at
);
4576 if (sym
->backend_decl
!= NULL_TREE
)
4577 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4579 else if (gfc_option
.warn_unused_dummy_argument
)
4581 gfc_warning ("Unused dummy argument '%s' at %L", sym
->name
,
4583 if (sym
->backend_decl
!= NULL_TREE
)
4584 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4588 /* Warn for unused variables, but not if they're inside a common
4589 block, a namelist, or are use-associated. */
4590 else if (warn_unused_variable
4591 && !(sym
->attr
.in_common
|| sym
->attr
.use_assoc
|| sym
->mark
4592 || sym
->attr
.in_namelist
))
4594 gfc_warning ("Unused variable '%s' declared at %L", sym
->name
,
4596 if (sym
->backend_decl
!= NULL_TREE
)
4597 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4599 else if (warn_unused_variable
&& sym
->attr
.use_only
)
4601 gfc_warning ("Unused module variable '%s' which has been explicitly "
4602 "imported at %L", sym
->name
, &sym
->declared_at
);
4603 if (sym
->backend_decl
!= NULL_TREE
)
4604 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4607 /* For variable length CHARACTER parameters, the PARM_DECL already
4608 references the length variable, so force gfc_get_symbol_decl
4609 even when not referenced. If optimize > 0, it will be optimized
4610 away anyway. But do this only after emitting -Wunused-parameter
4611 warning if requested. */
4612 if (sym
->attr
.dummy
&& !sym
->attr
.referenced
4613 && sym
->ts
.type
== BT_CHARACTER
4614 && sym
->ts
.u
.cl
->backend_decl
!= NULL
4615 && TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
4617 sym
->attr
.referenced
= 1;
4618 gfc_get_symbol_decl (sym
);
4621 /* INTENT(out) dummy arguments and result variables with allocatable
4622 components are reset by default and need to be set referenced to
4623 generate the code for nullification and automatic lengths. */
4624 if (!sym
->attr
.referenced
4625 && sym
->ts
.type
== BT_DERIVED
4626 && sym
->ts
.u
.derived
->attr
.alloc_comp
4627 && !sym
->attr
.pointer
4628 && ((sym
->attr
.dummy
&& sym
->attr
.intent
== INTENT_OUT
)
4630 (sym
->attr
.result
&& sym
!= sym
->result
)))
4632 sym
->attr
.referenced
= 1;
4633 gfc_get_symbol_decl (sym
);
4636 /* Check for dependencies in the array specification and string
4637 length, adding the necessary declarations to the function. We
4638 mark the symbol now, as well as in traverse_ns, to prevent
4639 getting stuck in a circular dependency. */
4642 else if (sym
->attr
.flavor
== FL_PARAMETER
)
4644 if (warn_unused_parameter
4645 && !sym
->attr
.referenced
)
4647 if (!sym
->attr
.use_assoc
)
4648 gfc_warning ("Unused parameter '%s' declared at %L", sym
->name
,
4650 else if (sym
->attr
.use_only
)
4651 gfc_warning ("Unused parameter '%s' which has been explicitly "
4652 "imported at %L", sym
->name
, &sym
->declared_at
);
4655 else if (sym
->attr
.flavor
== FL_PROCEDURE
)
4657 /* TODO: move to the appropriate place in resolve.c. */
4658 if (warn_return_type
4659 && sym
->attr
.function
4661 && sym
!= sym
->result
4662 && !sym
->result
->attr
.referenced
4663 && !sym
->attr
.use_assoc
4664 && sym
->attr
.if_source
!= IFSRC_IFBODY
)
4666 gfc_warning ("Return value '%s' of function '%s' declared at "
4667 "%L not set", sym
->result
->name
, sym
->name
,
4668 &sym
->result
->declared_at
);
4670 /* Prevents "Unused variable" warning for RESULT variables. */
4671 sym
->result
->mark
= 1;
4675 if (sym
->attr
.dummy
== 1)
4677 /* Modify the tree type for scalar character dummy arguments of bind(c)
4678 procedures if they are passed by value. The tree type for them will
4679 be promoted to INTEGER_TYPE for the middle end, which appears to be
4680 what C would do with characters passed by-value. The value attribute
4681 implies the dummy is a scalar. */
4682 if (sym
->attr
.value
== 1 && sym
->backend_decl
!= NULL
4683 && sym
->ts
.type
== BT_CHARACTER
&& sym
->ts
.is_c_interop
4684 && sym
->ns
->proc_name
!= NULL
&& sym
->ns
->proc_name
->attr
.is_bind_c
)
4685 gfc_conv_scalar_char_value (sym
, NULL
, NULL
);
4687 /* Unused procedure passed as dummy argument. */
4688 if (sym
->attr
.flavor
== FL_PROCEDURE
)
4690 if (!sym
->attr
.referenced
)
4692 if (gfc_option
.warn_unused_dummy_argument
)
4693 gfc_warning ("Unused dummy argument '%s' at %L", sym
->name
,
4697 /* Silence bogus "unused parameter" warnings from the
4699 if (sym
->backend_decl
!= NULL_TREE
)
4700 TREE_NO_WARNING (sym
->backend_decl
) = 1;
4704 /* Make sure we convert the types of the derived types from iso_c_binding
4706 if (sym
->attr
.flavor
!= FL_PROCEDURE
&& sym
->attr
.is_iso_c
4707 && sym
->ts
.type
== BT_DERIVED
)
4708 sym
->backend_decl
= gfc_typenode_for_spec (&(sym
->ts
));
4712 generate_local_vars (gfc_namespace
* ns
)
4714 gfc_traverse_ns (ns
, generate_local_decl
);
4718 /* Generate a switch statement to jump to the correct entry point. Also
4719 creates the label decls for the entry points. */
4722 gfc_trans_entry_master_switch (gfc_entry_list
* el
)
4729 gfc_init_block (&block
);
4730 for (; el
; el
= el
->next
)
4732 /* Add the case label. */
4733 label
= gfc_build_label_decl (NULL_TREE
);
4734 val
= build_int_cst (gfc_array_index_type
, el
->id
);
4735 tmp
= build_case_label (val
, NULL_TREE
, label
);
4736 gfc_add_expr_to_block (&block
, tmp
);
4738 /* And jump to the actual entry point. */
4739 label
= gfc_build_label_decl (NULL_TREE
);
4740 tmp
= build1_v (GOTO_EXPR
, label
);
4741 gfc_add_expr_to_block (&block
, tmp
);
4743 /* Save the label decl. */
4746 tmp
= gfc_finish_block (&block
);
4747 /* The first argument selects the entry point. */
4748 val
= DECL_ARGUMENTS (current_function_decl
);
4749 tmp
= build3_v (SWITCH_EXPR
, val
, tmp
, NULL_TREE
);
4754 /* Add code to string lengths of actual arguments passed to a function against
4755 the expected lengths of the dummy arguments. */
4758 add_argument_checking (stmtblock_t
*block
, gfc_symbol
*sym
)
4760 gfc_formal_arglist
*formal
;
4762 for (formal
= sym
->formal
; formal
; formal
= formal
->next
)
4763 if (formal
->sym
&& formal
->sym
->ts
.type
== BT_CHARACTER
4764 && !formal
->sym
->ts
.deferred
)
4766 enum tree_code comparison
;
4771 const char *message
;
4777 gcc_assert (cl
->passed_length
!= NULL_TREE
);
4778 gcc_assert (cl
->backend_decl
!= NULL_TREE
);
4780 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
4781 string lengths must match exactly. Otherwise, it is only required
4782 that the actual string length is *at least* the expected one.
4783 Sequence association allows for a mismatch of the string length
4784 if the actual argument is (part of) an array, but only if the
4785 dummy argument is an array. (See "Sequence association" in
4786 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
4787 if (fsym
->attr
.pointer
|| fsym
->attr
.allocatable
4788 || (fsym
->as
&& fsym
->as
->type
== AS_ASSUMED_SHAPE
))
4790 comparison
= NE_EXPR
;
4791 message
= _("Actual string length does not match the declared one"
4792 " for dummy argument '%s' (%ld/%ld)");
4794 else if (fsym
->as
&& fsym
->as
->rank
!= 0)
4798 comparison
= LT_EXPR
;
4799 message
= _("Actual string length is shorter than the declared one"
4800 " for dummy argument '%s' (%ld/%ld)");
4803 /* Build the condition. For optional arguments, an actual length
4804 of 0 is also acceptable if the associated string is NULL, which
4805 means the argument was not passed. */
4806 cond
= fold_build2_loc (input_location
, comparison
, boolean_type_node
,
4807 cl
->passed_length
, cl
->backend_decl
);
4808 if (fsym
->attr
.optional
)
4814 not_0length
= fold_build2_loc (input_location
, NE_EXPR
,
4817 build_zero_cst (gfc_charlen_type_node
));
4818 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
4819 fsym
->attr
.referenced
= 1;
4820 not_absent
= gfc_conv_expr_present (fsym
);
4822 absent_failed
= fold_build2_loc (input_location
, TRUTH_OR_EXPR
,
4823 boolean_type_node
, not_0length
,
4826 cond
= fold_build2_loc (input_location
, TRUTH_AND_EXPR
,
4827 boolean_type_node
, cond
, absent_failed
);
4830 /* Build the runtime check. */
4831 argname
= gfc_build_cstring_const (fsym
->name
);
4832 argname
= gfc_build_addr_expr (pchar_type_node
, argname
);
4833 gfc_trans_runtime_check (true, false, cond
, block
, &fsym
->declared_at
,
4835 fold_convert (long_integer_type_node
,
4837 fold_convert (long_integer_type_node
,
4843 /* Generate the _gfortran_caf_this_image and _gfortran_caf_num_images
4844 global variables for -fcoarray=lib. They are placed into the translation
4845 unit of the main program. Make sure that in one TU (the one of the main
4846 program), the first call to gfc_init_coarray_decl is done with true.
4847 Otherwise, expect link errors. */
4850 gfc_init_coarray_decl (bool main_tu
)
4854 if (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
4857 if (gfort_gvar_caf_this_image
|| gfort_gvar_caf_num_images
)
4860 save_fn_decl
= current_function_decl
;
4861 current_function_decl
= NULL_TREE
;
4864 gfort_gvar_caf_this_image
4865 = build_decl (input_location
, VAR_DECL
,
4866 get_identifier (PREFIX("caf_this_image")),
4868 DECL_ARTIFICIAL (gfort_gvar_caf_this_image
) = 1;
4869 TREE_USED (gfort_gvar_caf_this_image
) = 1;
4870 TREE_PUBLIC (gfort_gvar_caf_this_image
) = 1;
4871 TREE_READONLY (gfort_gvar_caf_this_image
) = 0;
4874 TREE_STATIC (gfort_gvar_caf_this_image
) = 1;
4876 DECL_EXTERNAL (gfort_gvar_caf_this_image
) = 1;
4878 pushdecl_top_level (gfort_gvar_caf_this_image
);
4880 gfort_gvar_caf_num_images
4881 = build_decl (input_location
, VAR_DECL
,
4882 get_identifier (PREFIX("caf_num_images")),
4884 DECL_ARTIFICIAL (gfort_gvar_caf_num_images
) = 1;
4885 TREE_USED (gfort_gvar_caf_num_images
) = 1;
4886 TREE_PUBLIC (gfort_gvar_caf_num_images
) = 1;
4887 TREE_READONLY (gfort_gvar_caf_num_images
) = 0;
4890 TREE_STATIC (gfort_gvar_caf_num_images
) = 1;
4892 DECL_EXTERNAL (gfort_gvar_caf_num_images
) = 1;
4894 pushdecl_top_level (gfort_gvar_caf_num_images
);
4897 current_function_decl
= save_fn_decl
;
4902 create_main_function (tree fndecl
)
4906 tree tmp
, decl
, result_decl
, argc
, argv
, typelist
, arglist
;
4909 old_context
= current_function_decl
;
4913 push_function_context ();
4914 saved_parent_function_decls
= saved_function_decls
;
4915 saved_function_decls
= NULL_TREE
;
4918 /* main() function must be declared with global scope. */
4919 gcc_assert (current_function_decl
== NULL_TREE
);
4921 /* Declare the function. */
4922 tmp
= build_function_type_list (integer_type_node
, integer_type_node
,
4923 build_pointer_type (pchar_type_node
),
4925 main_identifier_node
= get_identifier ("main");
4926 ftn_main
= build_decl (input_location
, FUNCTION_DECL
,
4927 main_identifier_node
, tmp
);
4928 DECL_EXTERNAL (ftn_main
) = 0;
4929 TREE_PUBLIC (ftn_main
) = 1;
4930 TREE_STATIC (ftn_main
) = 1;
4931 DECL_ATTRIBUTES (ftn_main
)
4932 = tree_cons (get_identifier("externally_visible"), NULL_TREE
, NULL_TREE
);
4934 /* Setup the result declaration (for "return 0"). */
4935 result_decl
= build_decl (input_location
,
4936 RESULT_DECL
, NULL_TREE
, integer_type_node
);
4937 DECL_ARTIFICIAL (result_decl
) = 1;
4938 DECL_IGNORED_P (result_decl
) = 1;
4939 DECL_CONTEXT (result_decl
) = ftn_main
;
4940 DECL_RESULT (ftn_main
) = result_decl
;
4942 pushdecl (ftn_main
);
4944 /* Get the arguments. */
4946 arglist
= NULL_TREE
;
4947 typelist
= TYPE_ARG_TYPES (TREE_TYPE (ftn_main
));
4949 tmp
= TREE_VALUE (typelist
);
4950 argc
= build_decl (input_location
, PARM_DECL
, get_identifier ("argc"), tmp
);
4951 DECL_CONTEXT (argc
) = ftn_main
;
4952 DECL_ARG_TYPE (argc
) = TREE_VALUE (typelist
);
4953 TREE_READONLY (argc
) = 1;
4954 gfc_finish_decl (argc
);
4955 arglist
= chainon (arglist
, argc
);
4957 typelist
= TREE_CHAIN (typelist
);
4958 tmp
= TREE_VALUE (typelist
);
4959 argv
= build_decl (input_location
, PARM_DECL
, get_identifier ("argv"), tmp
);
4960 DECL_CONTEXT (argv
) = ftn_main
;
4961 DECL_ARG_TYPE (argv
) = TREE_VALUE (typelist
);
4962 TREE_READONLY (argv
) = 1;
4963 DECL_BY_REFERENCE (argv
) = 1;
4964 gfc_finish_decl (argv
);
4965 arglist
= chainon (arglist
, argv
);
4967 DECL_ARGUMENTS (ftn_main
) = arglist
;
4968 current_function_decl
= ftn_main
;
4969 announce_function (ftn_main
);
4971 rest_of_decl_compilation (ftn_main
, 1, 0);
4972 make_decl_rtl (ftn_main
);
4973 init_function_start (ftn_main
);
4976 gfc_init_block (&body
);
4978 /* Call some libgfortran initialization routines, call then MAIN__(). */
4980 /* Call _gfortran_caf_init (*argc, ***argv, *this_image, *num_images). */
4981 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
4983 tree pint_type
, pppchar_type
;
4984 pint_type
= build_pointer_type (integer_type_node
);
4986 = build_pointer_type (build_pointer_type (pchar_type_node
));
4988 gfc_init_coarray_decl (true);
4989 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_init
, 4,
4990 gfc_build_addr_expr (pint_type
, argc
),
4991 gfc_build_addr_expr (pppchar_type
, argv
),
4992 gfc_build_addr_expr (pint_type
, gfort_gvar_caf_this_image
),
4993 gfc_build_addr_expr (pint_type
, gfort_gvar_caf_num_images
));
4994 gfc_add_expr_to_block (&body
, tmp
);
4997 /* Call _gfortran_set_args (argc, argv). */
4998 TREE_USED (argc
) = 1;
4999 TREE_USED (argv
) = 1;
5000 tmp
= build_call_expr_loc (input_location
,
5001 gfor_fndecl_set_args
, 2, argc
, argv
);
5002 gfc_add_expr_to_block (&body
, tmp
);
5004 /* Add a call to set_options to set up the runtime library Fortran
5005 language standard parameters. */
5007 tree array_type
, array
, var
;
5008 VEC(constructor_elt
,gc
) *v
= NULL
;
5010 /* Passing a new option to the library requires four modifications:
5011 + add it to the tree_cons list below
5012 + change the array size in the call to build_array_type
5013 + change the first argument to the library call
5014 gfor_fndecl_set_options
5015 + modify the library (runtime/compile_options.c)! */
5017 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5018 build_int_cst (integer_type_node
,
5019 gfc_option
.warn_std
));
5020 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5021 build_int_cst (integer_type_node
,
5022 gfc_option
.allow_std
));
5023 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5024 build_int_cst (integer_type_node
, pedantic
));
5025 /* TODO: This is the old -fdump-core option, which is unused but
5026 passed due to ABI compatibility; remove when bumping the
5028 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5029 build_int_cst (integer_type_node
,
5031 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5032 build_int_cst (integer_type_node
,
5033 gfc_option
.flag_backtrace
));
5034 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5035 build_int_cst (integer_type_node
,
5036 gfc_option
.flag_sign_zero
));
5037 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5038 build_int_cst (integer_type_node
,
5040 & GFC_RTCHECK_BOUNDS
)));
5041 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5042 build_int_cst (integer_type_node
,
5043 gfc_option
.flag_range_check
));
5045 array_type
= build_array_type (integer_type_node
,
5046 build_index_type (size_int (7)));
5047 array
= build_constructor (array_type
, v
);
5048 TREE_CONSTANT (array
) = 1;
5049 TREE_STATIC (array
) = 1;
5051 /* Create a static variable to hold the jump table. */
5052 var
= gfc_create_var (array_type
, "options");
5053 TREE_CONSTANT (var
) = 1;
5054 TREE_STATIC (var
) = 1;
5055 TREE_READONLY (var
) = 1;
5056 DECL_INITIAL (var
) = array
;
5057 var
= gfc_build_addr_expr (build_pointer_type (integer_type_node
), var
);
5059 tmp
= build_call_expr_loc (input_location
,
5060 gfor_fndecl_set_options
, 2,
5061 build_int_cst (integer_type_node
, 8), var
);
5062 gfc_add_expr_to_block (&body
, tmp
);
5065 /* If -ffpe-trap option was provided, add a call to set_fpe so that
5066 the library will raise a FPE when needed. */
5067 if (gfc_option
.fpe
!= 0)
5069 tmp
= build_call_expr_loc (input_location
,
5070 gfor_fndecl_set_fpe
, 1,
5071 build_int_cst (integer_type_node
,
5073 gfc_add_expr_to_block (&body
, tmp
);
5076 /* If this is the main program and an -fconvert option was provided,
5077 add a call to set_convert. */
5079 if (gfc_option
.convert
!= GFC_CONVERT_NATIVE
)
5081 tmp
= build_call_expr_loc (input_location
,
5082 gfor_fndecl_set_convert
, 1,
5083 build_int_cst (integer_type_node
,
5084 gfc_option
.convert
));
5085 gfc_add_expr_to_block (&body
, tmp
);
5088 /* If this is the main program and an -frecord-marker option was provided,
5089 add a call to set_record_marker. */
5091 if (gfc_option
.record_marker
!= 0)
5093 tmp
= build_call_expr_loc (input_location
,
5094 gfor_fndecl_set_record_marker
, 1,
5095 build_int_cst (integer_type_node
,
5096 gfc_option
.record_marker
));
5097 gfc_add_expr_to_block (&body
, tmp
);
5100 if (gfc_option
.max_subrecord_length
!= 0)
5102 tmp
= build_call_expr_loc (input_location
,
5103 gfor_fndecl_set_max_subrecord_length
, 1,
5104 build_int_cst (integer_type_node
,
5105 gfc_option
.max_subrecord_length
));
5106 gfc_add_expr_to_block (&body
, tmp
);
5109 /* Call MAIN__(). */
5110 tmp
= build_call_expr_loc (input_location
,
5112 gfc_add_expr_to_block (&body
, tmp
);
5114 /* Mark MAIN__ as used. */
5115 TREE_USED (fndecl
) = 1;
5117 /* Coarray: Call _gfortran_caf_finalize(void). */
5118 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
5120 /* Per F2008, 8.5.1 END of the main program implies a
5122 tmp
= builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE
);
5123 tmp
= build_call_expr_loc (input_location
, tmp
, 0);
5124 gfc_add_expr_to_block (&body
, tmp
);
5126 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_finalize
, 0);
5127 gfc_add_expr_to_block (&body
, tmp
);
5131 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, integer_type_node
,
5132 DECL_RESULT (ftn_main
),
5133 build_int_cst (integer_type_node
, 0));
5134 tmp
= build1_v (RETURN_EXPR
, tmp
);
5135 gfc_add_expr_to_block (&body
, tmp
);
5138 DECL_SAVED_TREE (ftn_main
) = gfc_finish_block (&body
);
5141 /* Finish off this function and send it for code generation. */
5143 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main
)) = ftn_main
;
5145 DECL_SAVED_TREE (ftn_main
)
5146 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (ftn_main
),
5147 DECL_INITIAL (ftn_main
));
5149 /* Output the GENERIC tree. */
5150 dump_function (TDI_original
, ftn_main
);
5152 cgraph_finalize_function (ftn_main
, true);
5156 pop_function_context ();
5157 saved_function_decls
= saved_parent_function_decls
;
5159 current_function_decl
= old_context
;
5163 /* Get the result expression for a procedure. */
5166 get_proc_result (gfc_symbol
* sym
)
5168 if (sym
->attr
.subroutine
|| sym
== sym
->result
)
5170 if (current_fake_result_decl
!= NULL
)
5171 return TREE_VALUE (current_fake_result_decl
);
5176 return sym
->result
->backend_decl
;
5180 /* Generate an appropriate return-statement for a procedure. */
5183 gfc_generate_return (void)
5189 sym
= current_procedure_symbol
;
5190 fndecl
= sym
->backend_decl
;
5192 if (TREE_TYPE (DECL_RESULT (fndecl
)) == void_type_node
)
5196 result
= get_proc_result (sym
);
5198 /* Set the return value to the dummy result variable. The
5199 types may be different for scalar default REAL functions
5200 with -ff2c, therefore we have to convert. */
5201 if (result
!= NULL_TREE
)
5203 result
= convert (TREE_TYPE (DECL_RESULT (fndecl
)), result
);
5204 result
= fold_build2_loc (input_location
, MODIFY_EXPR
,
5205 TREE_TYPE (result
), DECL_RESULT (fndecl
),
5210 return build1_v (RETURN_EXPR
, result
);
5214 /* Generate code for a function. */
5217 gfc_generate_function_code (gfc_namespace
* ns
)
5223 stmtblock_t init
, cleanup
;
5225 gfc_wrapped_block try_block
;
5226 tree recurcheckvar
= NULL_TREE
;
5228 gfc_symbol
*previous_procedure_symbol
;
5232 sym
= ns
->proc_name
;
5233 previous_procedure_symbol
= current_procedure_symbol
;
5234 current_procedure_symbol
= sym
;
5236 /* Check that the frontend isn't still using this. */
5237 gcc_assert (sym
->tlink
== NULL
);
5240 /* Create the declaration for functions with global scope. */
5241 if (!sym
->backend_decl
)
5242 gfc_create_function_decl (ns
, false);
5244 fndecl
= sym
->backend_decl
;
5245 old_context
= current_function_decl
;
5249 push_function_context ();
5250 saved_parent_function_decls
= saved_function_decls
;
5251 saved_function_decls
= NULL_TREE
;
5254 trans_function_start (sym
);
5256 gfc_init_block (&init
);
5258 if (ns
->entries
&& ns
->proc_name
->ts
.type
== BT_CHARACTER
)
5260 /* Copy length backend_decls to all entry point result
5265 gfc_conv_const_charlen (ns
->proc_name
->ts
.u
.cl
);
5266 backend_decl
= ns
->proc_name
->result
->ts
.u
.cl
->backend_decl
;
5267 for (el
= ns
->entries
; el
; el
= el
->next
)
5268 el
->sym
->result
->ts
.u
.cl
->backend_decl
= backend_decl
;
5271 /* Translate COMMON blocks. */
5272 gfc_trans_common (ns
);
5274 /* Null the parent fake result declaration if this namespace is
5275 a module function or an external procedures. */
5276 if ((ns
->parent
&& ns
->parent
->proc_name
->attr
.flavor
== FL_MODULE
)
5277 || ns
->parent
== NULL
)
5278 parent_fake_result_decl
= NULL_TREE
;
5280 gfc_generate_contained_functions (ns
);
5282 nonlocal_dummy_decls
= NULL
;
5283 nonlocal_dummy_decl_pset
= NULL
;
5285 has_coarray_vars
= false;
5286 generate_local_vars (ns
);
5288 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
5289 generate_coarray_init (ns
);
5291 /* Keep the parent fake result declaration in module functions
5292 or external procedures. */
5293 if ((ns
->parent
&& ns
->parent
->proc_name
->attr
.flavor
== FL_MODULE
)
5294 || ns
->parent
== NULL
)
5295 current_fake_result_decl
= parent_fake_result_decl
;
5297 current_fake_result_decl
= NULL_TREE
;
5299 is_recursive
= sym
->attr
.recursive
5300 || (sym
->attr
.entry_master
5301 && sym
->ns
->entries
->sym
->attr
.recursive
);
5302 if ((gfc_option
.rtcheck
& GFC_RTCHECK_RECURSION
)
5304 && !gfc_option
.flag_recursive
)
5308 asprintf (&msg
, "Recursive call to nonrecursive procedure '%s'",
5310 recurcheckvar
= gfc_create_var (boolean_type_node
, "is_recursive");
5311 TREE_STATIC (recurcheckvar
) = 1;
5312 DECL_INITIAL (recurcheckvar
) = boolean_false_node
;
5313 gfc_add_expr_to_block (&init
, recurcheckvar
);
5314 gfc_trans_runtime_check (true, false, recurcheckvar
, &init
,
5315 &sym
->declared_at
, msg
);
5316 gfc_add_modify (&init
, recurcheckvar
, boolean_true_node
);
5320 /* Now generate the code for the body of this function. */
5321 gfc_init_block (&body
);
5323 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
5324 && sym
->attr
.subroutine
)
5326 tree alternate_return
;
5327 alternate_return
= gfc_get_fake_result_decl (sym
, 0);
5328 gfc_add_modify (&body
, alternate_return
, integer_zero_node
);
5333 /* Jump to the correct entry point. */
5334 tmp
= gfc_trans_entry_master_switch (ns
->entries
);
5335 gfc_add_expr_to_block (&body
, tmp
);
5338 /* If bounds-checking is enabled, generate code to check passed in actual
5339 arguments against the expected dummy argument attributes (e.g. string
5341 if ((gfc_option
.rtcheck
& GFC_RTCHECK_BOUNDS
) && !sym
->attr
.is_bind_c
)
5342 add_argument_checking (&body
, sym
);
5344 tmp
= gfc_trans_code (ns
->code
);
5345 gfc_add_expr_to_block (&body
, tmp
);
5347 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
)
5349 tree result
= get_proc_result (sym
);
5351 if (result
!= NULL_TREE
&& sym
->attr
.function
&& !sym
->attr
.pointer
)
5353 if (sym
->attr
.allocatable
&& sym
->attr
.dimension
== 0
5354 && sym
->result
== sym
)
5355 gfc_add_modify (&init
, result
, fold_convert (TREE_TYPE (result
),
5356 null_pointer_node
));
5357 else if (sym
->ts
.type
== BT_CLASS
5358 && CLASS_DATA (sym
)->attr
.allocatable
5359 && CLASS_DATA (sym
)->attr
.dimension
== 0
5360 && sym
->result
== sym
)
5362 tmp
= CLASS_DATA (sym
)->backend_decl
;
5363 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
5364 TREE_TYPE (tmp
), result
, tmp
, NULL_TREE
);
5365 gfc_add_modify (&init
, tmp
, fold_convert (TREE_TYPE (tmp
),
5366 null_pointer_node
));
5368 else if (sym
->ts
.type
== BT_DERIVED
5369 && sym
->ts
.u
.derived
->attr
.alloc_comp
5370 && !sym
->attr
.allocatable
)
5372 rank
= sym
->as
? sym
->as
->rank
: 0;
5373 tmp
= gfc_nullify_alloc_comp (sym
->ts
.u
.derived
, result
, rank
);
5374 gfc_add_expr_to_block (&init
, tmp
);
5378 if (result
== NULL_TREE
)
5380 /* TODO: move to the appropriate place in resolve.c. */
5381 if (warn_return_type
&& sym
== sym
->result
)
5382 gfc_warning ("Return value of function '%s' at %L not set",
5383 sym
->name
, &sym
->declared_at
);
5384 if (warn_return_type
)
5385 TREE_NO_WARNING(sym
->backend_decl
) = 1;
5388 gfc_add_expr_to_block (&body
, gfc_generate_return ());
5391 gfc_init_block (&cleanup
);
5393 /* Reset recursion-check variable. */
5394 if ((gfc_option
.rtcheck
& GFC_RTCHECK_RECURSION
)
5396 && !gfc_option
.gfc_flag_openmp
5397 && recurcheckvar
!= NULL_TREE
)
5399 gfc_add_modify (&cleanup
, recurcheckvar
, boolean_false_node
);
5400 recurcheckvar
= NULL
;
5403 /* Finish the function body and add init and cleanup code. */
5404 tmp
= gfc_finish_block (&body
);
5405 gfc_start_wrapped_block (&try_block
, tmp
);
5406 /* Add code to create and cleanup arrays. */
5407 gfc_trans_deferred_vars (sym
, &try_block
);
5408 gfc_add_init_cleanup (&try_block
, gfc_finish_block (&init
),
5409 gfc_finish_block (&cleanup
));
5411 /* Add all the decls we created during processing. */
5412 decl
= saved_function_decls
;
5417 next
= DECL_CHAIN (decl
);
5418 DECL_CHAIN (decl
) = NULL_TREE
;
5419 if (GFC_DECL_PUSH_TOPLEVEL (decl
))
5420 pushdecl_top_level (decl
);
5425 saved_function_decls
= NULL_TREE
;
5427 DECL_SAVED_TREE (fndecl
) = gfc_finish_wrapped_block (&try_block
);
5430 /* Finish off this function and send it for code generation. */
5432 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
5434 DECL_SAVED_TREE (fndecl
)
5435 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
5436 DECL_INITIAL (fndecl
));
5438 if (nonlocal_dummy_decls
)
5440 BLOCK_VARS (DECL_INITIAL (fndecl
))
5441 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl
)), nonlocal_dummy_decls
);
5442 pointer_set_destroy (nonlocal_dummy_decl_pset
);
5443 nonlocal_dummy_decls
= NULL
;
5444 nonlocal_dummy_decl_pset
= NULL
;
5447 /* Output the GENERIC tree. */
5448 dump_function (TDI_original
, fndecl
);
5450 /* Store the end of the function, so that we get good line number
5451 info for the epilogue. */
5452 cfun
->function_end_locus
= input_location
;
5454 /* We're leaving the context of this function, so zap cfun.
5455 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5456 tree_rest_of_compilation. */
5461 pop_function_context ();
5462 saved_function_decls
= saved_parent_function_decls
;
5464 current_function_decl
= old_context
;
5466 if (decl_function_context (fndecl
) && !gfc_option
.coarray
== GFC_FCOARRAY_LIB
5467 && has_coarray_vars
)
5468 /* Register this function with cgraph just far enough to get it
5469 added to our parent's nested function list.
5470 If there are static coarrays in this function, the nested _caf_init
5471 function has already called cgraph_create_node, which also created
5472 the cgraph node for this function. */
5473 (void) cgraph_create_node (fndecl
);
5475 cgraph_finalize_function (fndecl
, true);
5477 gfc_trans_use_stmts (ns
);
5478 gfc_traverse_ns (ns
, gfc_emit_parameter_debug_info
);
5480 if (sym
->attr
.is_main_program
)
5481 create_main_function (fndecl
);
5483 current_procedure_symbol
= previous_procedure_symbol
;
5488 gfc_generate_constructors (void)
5490 gcc_assert (gfc_static_ctors
== NULL_TREE
);
5498 if (gfc_static_ctors
== NULL_TREE
)
5501 fnname
= get_file_function_name ("I");
5502 type
= build_function_type_list (void_type_node
, NULL_TREE
);
5504 fndecl
= build_decl (input_location
,
5505 FUNCTION_DECL
, fnname
, type
);
5506 TREE_PUBLIC (fndecl
) = 1;
5508 decl
= build_decl (input_location
,
5509 RESULT_DECL
, NULL_TREE
, void_type_node
);
5510 DECL_ARTIFICIAL (decl
) = 1;
5511 DECL_IGNORED_P (decl
) = 1;
5512 DECL_CONTEXT (decl
) = fndecl
;
5513 DECL_RESULT (fndecl
) = decl
;
5517 current_function_decl
= fndecl
;
5519 rest_of_decl_compilation (fndecl
, 1, 0);
5521 make_decl_rtl (fndecl
);
5523 init_function_start (fndecl
);
5527 for (; gfc_static_ctors
; gfc_static_ctors
= TREE_CHAIN (gfc_static_ctors
))
5529 tmp
= build_call_expr_loc (input_location
,
5530 TREE_VALUE (gfc_static_ctors
), 0);
5531 DECL_SAVED_TREE (fndecl
) = build_stmt (input_location
, EXPR_STMT
, tmp
);
5537 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
5538 DECL_SAVED_TREE (fndecl
)
5539 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
5540 DECL_INITIAL (fndecl
));
5542 free_after_parsing (cfun
);
5543 free_after_compilation (cfun
);
5545 tree_rest_of_compilation (fndecl
);
5547 current_function_decl
= NULL_TREE
;
5551 /* Translates a BLOCK DATA program unit. This means emitting the
5552 commons contained therein plus their initializations. We also emit
5553 a globally visible symbol to make sure that each BLOCK DATA program
5554 unit remains unique. */
5557 gfc_generate_block_data (gfc_namespace
* ns
)
5562 /* Tell the backend the source location of the block data. */
5564 gfc_set_backend_locus (&ns
->proc_name
->declared_at
);
5566 gfc_set_backend_locus (&gfc_current_locus
);
5568 /* Process the DATA statements. */
5569 gfc_trans_common (ns
);
5571 /* Create a global symbol with the mane of the block data. This is to
5572 generate linker errors if the same name is used twice. It is never
5575 id
= gfc_sym_mangled_function_id (ns
->proc_name
);
5577 id
= get_identifier ("__BLOCK_DATA__");
5579 decl
= build_decl (input_location
,
5580 VAR_DECL
, id
, gfc_array_index_type
);
5581 TREE_PUBLIC (decl
) = 1;
5582 TREE_STATIC (decl
) = 1;
5583 DECL_IGNORED_P (decl
) = 1;
5586 rest_of_decl_compilation (decl
, 1, 0);
5590 /* Process the local variables of a BLOCK construct. */
5593 gfc_process_block_locals (gfc_namespace
* ns
)
5597 gcc_assert (saved_local_decls
== NULL_TREE
);
5598 has_coarray_vars
= false;
5600 generate_local_vars (ns
);
5602 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
5603 generate_coarray_init (ns
);
5605 decl
= saved_local_decls
;
5610 next
= DECL_CHAIN (decl
);
5611 DECL_CHAIN (decl
) = NULL_TREE
;
5615 saved_local_decls
= NULL_TREE
;
5619 #include "gt-fortran-trans-decl.h"