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 && sym
->binding_label
)
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 if (sym
->attr
.access
!= ACCESS_PRIVATE
|| sym
->attr
.public_used
)
569 TREE_PUBLIC (decl
) = 1;
570 TREE_STATIC (decl
) = 1;
573 /* Derived types are a bit peculiar because of the possibility of
574 a default initializer; this must be applied each time the variable
575 comes into scope it therefore need not be static. These variables
576 are SAVE_NONE but have an initializer. Otherwise explicitly
577 initialized variables are SAVE_IMPLICIT and explicitly saved are
579 if (!sym
->attr
.use_assoc
580 && (sym
->attr
.save
!= SAVE_NONE
|| sym
->attr
.data
581 || (sym
->value
&& sym
->ns
->proc_name
->attr
.is_main_program
)
582 || (gfc_option
.coarray
== GFC_FCOARRAY_LIB
583 && sym
->attr
.codimension
&& !sym
->attr
.allocatable
)))
584 TREE_STATIC (decl
) = 1;
586 if (sym
->attr
.volatile_
)
588 TREE_THIS_VOLATILE (decl
) = 1;
589 TREE_SIDE_EFFECTS (decl
) = 1;
590 new_type
= build_qualified_type (TREE_TYPE (decl
), TYPE_QUAL_VOLATILE
);
591 TREE_TYPE (decl
) = new_type
;
594 /* Keep variables larger than max-stack-var-size off stack. */
595 if (!sym
->ns
->proc_name
->attr
.recursive
596 && INTEGER_CST_P (DECL_SIZE_UNIT (decl
))
597 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl
))
598 /* Put variable length auto array pointers always into stack. */
599 && (TREE_CODE (TREE_TYPE (decl
)) != POINTER_TYPE
600 || sym
->attr
.dimension
== 0
601 || sym
->as
->type
!= AS_EXPLICIT
603 || sym
->attr
.allocatable
)
604 && !DECL_ARTIFICIAL (decl
))
605 TREE_STATIC (decl
) = 1;
607 /* Handle threadprivate variables. */
608 if (sym
->attr
.threadprivate
609 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
610 DECL_TLS_MODEL (decl
) = decl_default_tls_model (decl
);
612 if (!sym
->attr
.target
613 && !sym
->attr
.pointer
614 && !sym
->attr
.cray_pointee
615 && !sym
->attr
.proc_pointer
)
616 DECL_RESTRICTED_P (decl
) = 1;
620 /* Allocate the lang-specific part of a decl. */
623 gfc_allocate_lang_decl (tree decl
)
625 DECL_LANG_SPECIFIC (decl
) = ggc_alloc_cleared_lang_decl(sizeof
629 /* Remember a symbol to generate initialization/cleanup code at function
633 gfc_defer_symbol_init (gfc_symbol
* sym
)
639 /* Don't add a symbol twice. */
643 last
= head
= sym
->ns
->proc_name
;
646 /* Make sure that setup code for dummy variables which are used in the
647 setup of other variables is generated first. */
650 /* Find the first dummy arg seen after us, or the first non-dummy arg.
651 This is a circular list, so don't go past the head. */
653 && (!p
->attr
.dummy
|| p
->dummy_order
> sym
->dummy_order
))
659 /* Insert in between last and p. */
665 /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
666 backend_decl for a module symbol, if it all ready exists. If the
667 module gsymbol does not exist, it is created. If the symbol does
668 not exist, it is added to the gsymbol namespace. Returns true if
669 an existing backend_decl is found. */
672 gfc_get_module_backend_decl (gfc_symbol
*sym
)
678 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->module
);
680 if (!gsym
|| (gsym
->ns
&& gsym
->type
== GSYM_MODULE
))
686 gfc_find_symbol (sym
->name
, gsym
->ns
, 0, &s
);
692 gsym
= gfc_get_gsymbol (sym
->module
);
693 gsym
->type
= GSYM_MODULE
;
694 gsym
->ns
= gfc_get_namespace (NULL
, 0);
697 st
= gfc_new_symtree (&gsym
->ns
->sym_root
, sym
->name
);
701 else if (sym
->attr
.flavor
== FL_DERIVED
)
703 if (s
&& s
->attr
.flavor
== FL_PROCEDURE
)
706 gcc_assert (s
->attr
.generic
);
707 for (intr
= s
->generic
; intr
; intr
= intr
->next
)
708 if (intr
->sym
->attr
.flavor
== FL_DERIVED
)
715 if (!s
->backend_decl
)
716 s
->backend_decl
= gfc_get_derived_type (s
);
717 gfc_copy_dt_decls_ifequal (s
, sym
, true);
720 else if (s
->backend_decl
)
722 if (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
)
723 gfc_copy_dt_decls_ifequal (s
->ts
.u
.derived
, sym
->ts
.u
.derived
,
725 else if (sym
->ts
.type
== BT_CHARACTER
)
726 sym
->ts
.u
.cl
->backend_decl
= s
->ts
.u
.cl
->backend_decl
;
727 sym
->backend_decl
= s
->backend_decl
;
735 /* Create an array index type variable with function scope. */
738 create_index_var (const char * pfx
, int nest
)
742 decl
= gfc_create_var_np (gfc_array_index_type
, pfx
);
744 gfc_add_decl_to_parent_function (decl
);
746 gfc_add_decl_to_function (decl
);
751 /* Create variables to hold all the non-constant bits of info for a
752 descriptorless array. Remember these in the lang-specific part of the
756 gfc_build_qualified_array (tree decl
, gfc_symbol
* sym
)
761 gfc_namespace
* procns
;
763 type
= TREE_TYPE (decl
);
765 /* We just use the descriptor, if there is one. */
766 if (GFC_DESCRIPTOR_TYPE_P (type
))
769 gcc_assert (GFC_ARRAY_TYPE_P (type
));
770 procns
= gfc_find_proc_namespace (sym
->ns
);
771 nest
= (procns
->proc_name
->backend_decl
!= current_function_decl
)
772 && !sym
->attr
.contained
;
774 if (sym
->attr
.codimension
&& gfc_option
.coarray
== GFC_FCOARRAY_LIB
775 && sym
->as
->type
!= AS_ASSUMED_SHAPE
776 && GFC_TYPE_ARRAY_CAF_TOKEN (type
) == NULL_TREE
)
780 token
= gfc_create_var_np (build_qualified_type (pvoid_type_node
,
783 GFC_TYPE_ARRAY_CAF_TOKEN (type
) = token
;
784 DECL_ARTIFICIAL (token
) = 1;
785 TREE_STATIC (token
) = 1;
786 gfc_add_decl_to_function (token
);
789 for (dim
= 0; dim
< GFC_TYPE_ARRAY_RANK (type
); dim
++)
791 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
793 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
794 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type
, dim
)) = 1;
796 /* Don't try to use the unknown bound for assumed shape arrays. */
797 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
798 && (sym
->as
->type
!= AS_ASSUMED_SIZE
799 || dim
< GFC_TYPE_ARRAY_RANK (type
) - 1))
801 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
802 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type
, dim
)) = 1;
805 if (GFC_TYPE_ARRAY_STRIDE (type
, dim
) == NULL_TREE
)
807 GFC_TYPE_ARRAY_STRIDE (type
, dim
) = create_index_var ("stride", nest
);
808 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type
, dim
)) = 1;
811 for (dim
= GFC_TYPE_ARRAY_RANK (type
);
812 dim
< GFC_TYPE_ARRAY_RANK (type
) + GFC_TYPE_ARRAY_CORANK (type
); dim
++)
814 if (GFC_TYPE_ARRAY_LBOUND (type
, dim
) == NULL_TREE
)
816 GFC_TYPE_ARRAY_LBOUND (type
, dim
) = create_index_var ("lbound", nest
);
817 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type
, dim
)) = 1;
819 /* Don't try to use the unknown ubound for the last coarray dimension. */
820 if (GFC_TYPE_ARRAY_UBOUND (type
, dim
) == NULL_TREE
821 && dim
< GFC_TYPE_ARRAY_RANK (type
) + GFC_TYPE_ARRAY_CORANK (type
) - 1)
823 GFC_TYPE_ARRAY_UBOUND (type
, dim
) = create_index_var ("ubound", nest
);
824 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type
, dim
)) = 1;
827 if (GFC_TYPE_ARRAY_OFFSET (type
) == NULL_TREE
)
829 GFC_TYPE_ARRAY_OFFSET (type
) = gfc_create_var_np (gfc_array_index_type
,
831 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type
)) = 1;
834 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type
));
836 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type
));
839 if (GFC_TYPE_ARRAY_SIZE (type
) == NULL_TREE
840 && sym
->as
->type
!= AS_ASSUMED_SIZE
)
842 GFC_TYPE_ARRAY_SIZE (type
) = create_index_var ("size", nest
);
843 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type
)) = 1;
846 if (POINTER_TYPE_P (type
))
848 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type
)));
849 gcc_assert (TYPE_LANG_SPECIFIC (type
)
850 == TYPE_LANG_SPECIFIC (TREE_TYPE (type
)));
851 type
= TREE_TYPE (type
);
854 if (! COMPLETE_TYPE_P (type
) && GFC_TYPE_ARRAY_SIZE (type
))
858 size
= fold_build2_loc (input_location
, MINUS_EXPR
, gfc_array_index_type
,
859 GFC_TYPE_ARRAY_SIZE (type
), gfc_index_one_node
);
860 range
= build_range_type (gfc_array_index_type
, gfc_index_zero_node
,
862 TYPE_DOMAIN (type
) = range
;
866 if (TYPE_NAME (type
) != NULL_TREE
867 && GFC_TYPE_ARRAY_UBOUND (type
, sym
->as
->rank
- 1) != NULL_TREE
868 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type
, sym
->as
->rank
- 1)) == VAR_DECL
)
870 tree gtype
= DECL_ORIGINAL_TYPE (TYPE_NAME (type
));
872 for (dim
= 0; dim
< sym
->as
->rank
- 1; dim
++)
874 gcc_assert (TREE_CODE (gtype
) == ARRAY_TYPE
);
875 gtype
= TREE_TYPE (gtype
);
877 gcc_assert (TREE_CODE (gtype
) == ARRAY_TYPE
);
878 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype
)) == NULL
)
879 TYPE_NAME (type
) = NULL_TREE
;
882 if (TYPE_NAME (type
) == NULL_TREE
)
884 tree gtype
= TREE_TYPE (type
), rtype
, type_decl
;
886 for (dim
= sym
->as
->rank
- 1; dim
>= 0; dim
--)
889 lbound
= GFC_TYPE_ARRAY_LBOUND (type
, dim
);
890 ubound
= GFC_TYPE_ARRAY_UBOUND (type
, dim
);
891 rtype
= build_range_type (gfc_array_index_type
, lbound
, ubound
);
892 gtype
= build_array_type (gtype
, rtype
);
893 /* Ensure the bound variables aren't optimized out at -O0.
894 For -O1 and above they often will be optimized out, but
895 can be tracked by VTA. Also set DECL_NAMELESS, so that
896 the artificial lbound.N or ubound.N DECL_NAME doesn't
897 end up in debug info. */
898 if (lbound
&& TREE_CODE (lbound
) == VAR_DECL
899 && DECL_ARTIFICIAL (lbound
) && DECL_IGNORED_P (lbound
))
901 if (DECL_NAME (lbound
)
902 && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound
)),
904 DECL_NAMELESS (lbound
) = 1;
905 DECL_IGNORED_P (lbound
) = 0;
907 if (ubound
&& TREE_CODE (ubound
) == VAR_DECL
908 && DECL_ARTIFICIAL (ubound
) && DECL_IGNORED_P (ubound
))
910 if (DECL_NAME (ubound
)
911 && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound
)),
913 DECL_NAMELESS (ubound
) = 1;
914 DECL_IGNORED_P (ubound
) = 0;
917 TYPE_NAME (type
) = type_decl
= build_decl (input_location
,
918 TYPE_DECL
, NULL
, gtype
);
919 DECL_ORIGINAL_TYPE (type_decl
) = gtype
;
924 /* For some dummy arguments we don't use the actual argument directly.
925 Instead we create a local decl and use that. This allows us to perform
926 initialization, and construct full type information. */
929 gfc_build_dummy_array_decl (gfc_symbol
* sym
, tree dummy
)
939 if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
942 /* Add to list of variables if not a fake result variable. */
943 if (sym
->attr
.result
|| sym
->attr
.dummy
)
944 gfc_defer_symbol_init (sym
);
946 type
= TREE_TYPE (dummy
);
947 gcc_assert (TREE_CODE (dummy
) == PARM_DECL
948 && POINTER_TYPE_P (type
));
950 /* Do we know the element size? */
951 known_size
= sym
->ts
.type
!= BT_CHARACTER
952 || INTEGER_CST_P (sym
->ts
.u
.cl
->backend_decl
);
954 if (known_size
&& !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type
)))
956 /* For descriptorless arrays with known element size the actual
957 argument is sufficient. */
958 gcc_assert (GFC_ARRAY_TYPE_P (type
));
959 gfc_build_qualified_array (dummy
, sym
);
963 type
= TREE_TYPE (type
);
964 if (GFC_DESCRIPTOR_TYPE_P (type
))
966 /* Create a descriptorless array pointer. */
970 /* Even when -frepack-arrays is used, symbols with TARGET attribute
972 if (!gfc_option
.flag_repack_arrays
|| sym
->attr
.target
)
974 if (as
->type
== AS_ASSUMED_SIZE
)
975 packed
= PACKED_FULL
;
979 if (as
->type
== AS_EXPLICIT
)
981 packed
= PACKED_FULL
;
982 for (n
= 0; n
< as
->rank
; n
++)
986 && as
->upper
[n
]->expr_type
== EXPR_CONSTANT
987 && as
->lower
[n
]->expr_type
== EXPR_CONSTANT
))
988 packed
= PACKED_PARTIAL
;
992 packed
= PACKED_PARTIAL
;
995 type
= gfc_typenode_for_spec (&sym
->ts
);
996 type
= gfc_get_nodesc_array_type (type
, sym
->as
, packed
,
1001 /* We now have an expression for the element size, so create a fully
1002 qualified type. Reset sym->backend decl or this will just return the
1004 DECL_ARTIFICIAL (sym
->backend_decl
) = 1;
1005 sym
->backend_decl
= NULL_TREE
;
1006 type
= gfc_sym_type (sym
);
1007 packed
= PACKED_FULL
;
1010 ASM_FORMAT_PRIVATE_NAME (name
, IDENTIFIER_POINTER (DECL_NAME (dummy
)), 0);
1011 decl
= build_decl (input_location
,
1012 VAR_DECL
, get_identifier (name
), type
);
1014 DECL_ARTIFICIAL (decl
) = 1;
1015 DECL_NAMELESS (decl
) = 1;
1016 TREE_PUBLIC (decl
) = 0;
1017 TREE_STATIC (decl
) = 0;
1018 DECL_EXTERNAL (decl
) = 0;
1020 /* We should never get deferred shape arrays here. We used to because of
1022 gcc_assert (sym
->as
->type
!= AS_DEFERRED
);
1024 if (packed
== PACKED_PARTIAL
)
1025 GFC_DECL_PARTIAL_PACKED_ARRAY (decl
) = 1;
1026 else if (packed
== PACKED_FULL
)
1027 GFC_DECL_PACKED_ARRAY (decl
) = 1;
1029 gfc_build_qualified_array (decl
, sym
);
1031 if (DECL_LANG_SPECIFIC (dummy
))
1032 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (dummy
);
1034 gfc_allocate_lang_decl (decl
);
1036 GFC_DECL_SAVED_DESCRIPTOR (decl
) = dummy
;
1038 if (sym
->ns
->proc_name
->backend_decl
== current_function_decl
1039 || sym
->attr
.contained
)
1040 gfc_add_decl_to_function (decl
);
1042 gfc_add_decl_to_parent_function (decl
);
1047 /* For symbol SYM with GFC_DECL_SAVED_DESCRIPTOR used in contained
1048 function add a VAR_DECL to the current function with DECL_VALUE_EXPR
1049 pointing to the artificial variable for debug info purposes. */
1052 gfc_nonlocal_dummy_array_decl (gfc_symbol
*sym
)
1056 if (! nonlocal_dummy_decl_pset
)
1057 nonlocal_dummy_decl_pset
= pointer_set_create ();
1059 if (pointer_set_insert (nonlocal_dummy_decl_pset
, sym
->backend_decl
))
1062 dummy
= GFC_DECL_SAVED_DESCRIPTOR (sym
->backend_decl
);
1063 decl
= build_decl (input_location
, VAR_DECL
, DECL_NAME (dummy
),
1064 TREE_TYPE (sym
->backend_decl
));
1065 DECL_ARTIFICIAL (decl
) = 0;
1066 TREE_USED (decl
) = 1;
1067 TREE_PUBLIC (decl
) = 0;
1068 TREE_STATIC (decl
) = 0;
1069 DECL_EXTERNAL (decl
) = 0;
1070 if (DECL_BY_REFERENCE (dummy
))
1071 DECL_BY_REFERENCE (decl
) = 1;
1072 DECL_LANG_SPECIFIC (decl
) = DECL_LANG_SPECIFIC (sym
->backend_decl
);
1073 SET_DECL_VALUE_EXPR (decl
, sym
->backend_decl
);
1074 DECL_HAS_VALUE_EXPR_P (decl
) = 1;
1075 DECL_CONTEXT (decl
) = DECL_CONTEXT (sym
->backend_decl
);
1076 DECL_CHAIN (decl
) = nonlocal_dummy_decls
;
1077 nonlocal_dummy_decls
= decl
;
1080 /* Return a constant or a variable to use as a string length. Does not
1081 add the decl to the current scope. */
1084 gfc_create_string_length (gfc_symbol
* sym
)
1086 gcc_assert (sym
->ts
.u
.cl
);
1087 gfc_conv_const_charlen (sym
->ts
.u
.cl
);
1089 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
1092 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 2];
1094 /* Also prefix the mangled name. */
1095 strcpy (&name
[1], sym
->name
);
1097 length
= build_decl (input_location
,
1098 VAR_DECL
, get_identifier (name
),
1099 gfc_charlen_type_node
);
1100 DECL_ARTIFICIAL (length
) = 1;
1101 TREE_USED (length
) = 1;
1102 if (sym
->ns
->proc_name
->tlink
!= NULL
)
1103 gfc_defer_symbol_init (sym
);
1105 sym
->ts
.u
.cl
->backend_decl
= length
;
1108 gcc_assert (sym
->ts
.u
.cl
->backend_decl
!= NULL_TREE
);
1109 return sym
->ts
.u
.cl
->backend_decl
;
1112 /* If a variable is assigned a label, we add another two auxiliary
1116 gfc_add_assign_aux_vars (gfc_symbol
* sym
)
1122 gcc_assert (sym
->backend_decl
);
1124 decl
= sym
->backend_decl
;
1125 gfc_allocate_lang_decl (decl
);
1126 GFC_DECL_ASSIGN (decl
) = 1;
1127 length
= build_decl (input_location
,
1128 VAR_DECL
, create_tmp_var_name (sym
->name
),
1129 gfc_charlen_type_node
);
1130 addr
= build_decl (input_location
,
1131 VAR_DECL
, create_tmp_var_name (sym
->name
),
1133 gfc_finish_var_decl (length
, sym
);
1134 gfc_finish_var_decl (addr
, sym
);
1135 /* STRING_LENGTH is also used as flag. Less than -1 means that
1136 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
1137 target label's address. Otherwise, value is the length of a format string
1138 and ASSIGN_ADDR is its address. */
1139 if (TREE_STATIC (length
))
1140 DECL_INITIAL (length
) = build_int_cst (gfc_charlen_type_node
, -2);
1142 gfc_defer_symbol_init (sym
);
1144 GFC_DECL_STRING_LEN (decl
) = length
;
1145 GFC_DECL_ASSIGN_ADDR (decl
) = addr
;
1150 add_attributes_to_decl (symbol_attribute sym_attr
, tree list
)
1155 for (id
= 0; id
< EXT_ATTR_NUM
; id
++)
1156 if (sym_attr
.ext_attr
& (1 << id
))
1158 attr
= build_tree_list (
1159 get_identifier (ext_attr_list
[id
].middle_end_name
),
1161 list
= chainon (list
, attr
);
1168 static void build_function_decl (gfc_symbol
* sym
, bool global
);
1171 /* Return the decl for a gfc_symbol, create it if it doesn't already
1175 gfc_get_symbol_decl (gfc_symbol
* sym
)
1178 tree length
= NULL_TREE
;
1181 bool intrinsic_array_parameter
= false;
1183 gcc_assert (sym
->attr
.referenced
1184 || sym
->attr
.use_assoc
1185 || sym
->ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
1186 || (sym
->module
&& sym
->attr
.if_source
!= IFSRC_DECL
1187 && sym
->backend_decl
));
1189 if (sym
->ns
&& sym
->ns
->proc_name
&& sym
->ns
->proc_name
->attr
.function
)
1190 byref
= gfc_return_by_reference (sym
->ns
->proc_name
);
1194 /* Make sure that the vtab for the declared type is completed. */
1195 if (sym
->ts
.type
== BT_CLASS
)
1197 gfc_component
*c
= CLASS_DATA (sym
);
1198 if (!c
->ts
.u
.derived
->backend_decl
)
1200 gfc_find_derived_vtab (c
->ts
.u
.derived
);
1201 gfc_get_derived_type (sym
->ts
.u
.derived
);
1205 /* All deferred character length procedures need to retain the backend
1206 decl, which is a pointer to the character length in the caller's
1207 namespace and to declare a local character length. */
1208 if (!byref
&& sym
->attr
.function
1209 && sym
->ts
.type
== BT_CHARACTER
1211 && sym
->ts
.u
.cl
->passed_length
== NULL
1212 && sym
->ts
.u
.cl
->backend_decl
1213 && TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
1215 sym
->ts
.u
.cl
->passed_length
= sym
->ts
.u
.cl
->backend_decl
;
1216 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1217 length
= gfc_create_string_length (sym
);
1220 if ((sym
->attr
.dummy
&& ! sym
->attr
.function
) || (sym
->attr
.result
&& byref
))
1222 /* Return via extra parameter. */
1223 if (sym
->attr
.result
&& byref
1224 && !sym
->backend_decl
)
1227 DECL_ARGUMENTS (sym
->ns
->proc_name
->backend_decl
);
1228 /* For entry master function skip over the __entry
1230 if (sym
->ns
->proc_name
->attr
.entry_master
)
1231 sym
->backend_decl
= DECL_CHAIN (sym
->backend_decl
);
1234 /* Dummy variables should already have been created. */
1235 gcc_assert (sym
->backend_decl
);
1237 /* Create a character length variable. */
1238 if (sym
->ts
.type
== BT_CHARACTER
)
1240 /* For a deferred dummy, make a new string length variable. */
1241 if (sym
->ts
.deferred
1243 (sym
->ts
.u
.cl
->passed_length
== sym
->ts
.u
.cl
->backend_decl
))
1244 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1246 if (sym
->ts
.deferred
&& sym
->attr
.result
1247 && sym
->ts
.u
.cl
->passed_length
== NULL
1248 && sym
->ts
.u
.cl
->backend_decl
)
1250 sym
->ts
.u
.cl
->passed_length
= sym
->ts
.u
.cl
->backend_decl
;
1251 sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
1254 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
1255 length
= gfc_create_string_length (sym
);
1257 length
= sym
->ts
.u
.cl
->backend_decl
;
1258 if (TREE_CODE (length
) == VAR_DECL
1259 && DECL_FILE_SCOPE_P (length
))
1261 /* Add the string length to the same context as the symbol. */
1262 if (DECL_CONTEXT (sym
->backend_decl
) == current_function_decl
)
1263 gfc_add_decl_to_function (length
);
1265 gfc_add_decl_to_parent_function (length
);
1267 gcc_assert (DECL_CONTEXT (sym
->backend_decl
) ==
1268 DECL_CONTEXT (length
));
1270 gfc_defer_symbol_init (sym
);
1274 /* Use a copy of the descriptor for dummy arrays. */
1275 if ((sym
->attr
.dimension
|| sym
->attr
.codimension
)
1276 && !TREE_USED (sym
->backend_decl
))
1278 decl
= gfc_build_dummy_array_decl (sym
, sym
->backend_decl
);
1279 /* Prevent the dummy from being detected as unused if it is copied. */
1280 if (sym
->backend_decl
!= NULL
&& decl
!= sym
->backend_decl
)
1281 DECL_ARTIFICIAL (sym
->backend_decl
) = 1;
1282 sym
->backend_decl
= decl
;
1285 TREE_USED (sym
->backend_decl
) = 1;
1286 if (sym
->attr
.assign
&& GFC_DECL_ASSIGN (sym
->backend_decl
) == 0)
1288 gfc_add_assign_aux_vars (sym
);
1291 if (sym
->attr
.dimension
1292 && DECL_LANG_SPECIFIC (sym
->backend_decl
)
1293 && GFC_DECL_SAVED_DESCRIPTOR (sym
->backend_decl
)
1294 && DECL_CONTEXT (sym
->backend_decl
) != current_function_decl
)
1295 gfc_nonlocal_dummy_array_decl (sym
);
1297 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1298 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1300 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1301 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1302 return sym
->backend_decl
;
1305 if (sym
->backend_decl
)
1306 return sym
->backend_decl
;
1308 /* Special case for array-valued named constants from intrinsic
1309 procedures; those are inlined. */
1310 if (sym
->attr
.use_assoc
&& sym
->from_intmod
1311 && sym
->attr
.flavor
== FL_PARAMETER
)
1312 intrinsic_array_parameter
= true;
1314 /* If use associated and whole file compilation, use the module
1316 if (gfc_option
.flag_whole_file
1317 && (sym
->attr
.flavor
== FL_VARIABLE
1318 || sym
->attr
.flavor
== FL_PARAMETER
)
1319 && sym
->attr
.use_assoc
1320 && !intrinsic_array_parameter
1322 && gfc_get_module_backend_decl (sym
))
1324 if (sym
->ts
.type
== BT_CLASS
&& sym
->backend_decl
)
1325 GFC_DECL_CLASS(sym
->backend_decl
) = 1;
1326 return sym
->backend_decl
;
1329 if (sym
->attr
.flavor
== FL_PROCEDURE
)
1331 /* Catch function declarations. Only used for actual parameters,
1332 procedure pointers and procptr initialization targets. */
1333 if (sym
->attr
.external
|| sym
->attr
.use_assoc
|| sym
->attr
.intrinsic
)
1335 decl
= gfc_get_extern_function_decl (sym
);
1336 gfc_set_decl_location (decl
, &sym
->declared_at
);
1340 if (!sym
->backend_decl
)
1341 build_function_decl (sym
, false);
1342 decl
= sym
->backend_decl
;
1347 if (sym
->attr
.intrinsic
)
1348 internal_error ("intrinsic variable which isn't a procedure");
1350 /* Create string length decl first so that they can be used in the
1351 type declaration. */
1352 if (sym
->ts
.type
== BT_CHARACTER
)
1353 length
= gfc_create_string_length (sym
);
1355 /* Create the decl for the variable. */
1356 decl
= build_decl (sym
->declared_at
.lb
->location
,
1357 VAR_DECL
, gfc_sym_identifier (sym
), gfc_sym_type (sym
));
1359 /* Add attributes to variables. Functions are handled elsewhere. */
1360 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1361 decl_attributes (&decl
, attributes
, 0);
1363 /* Symbols from modules should have their assembler names mangled.
1364 This is done here rather than in gfc_finish_var_decl because it
1365 is different for string length variables. */
1368 gfc_set_decl_assembler_name (decl
, gfc_sym_mangled_identifier (sym
));
1369 if (sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)
1370 DECL_IGNORED_P (decl
) = 1;
1373 if (sym
->attr
.dimension
|| sym
->attr
.codimension
)
1375 /* Create variables to hold the non-constant bits of array info. */
1376 gfc_build_qualified_array (decl
, sym
);
1378 if (sym
->attr
.contiguous
1379 || ((sym
->attr
.allocatable
|| !sym
->attr
.dummy
) && !sym
->attr
.pointer
))
1380 GFC_DECL_PACKED_ARRAY (decl
) = 1;
1383 /* Remember this variable for allocation/cleanup. */
1384 if (sym
->attr
.dimension
|| sym
->attr
.allocatable
|| sym
->attr
.codimension
1385 || (sym
->ts
.type
== BT_CLASS
&&
1386 (CLASS_DATA (sym
)->attr
.dimension
1387 || CLASS_DATA (sym
)->attr
.allocatable
))
1388 || (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
->attr
.alloc_comp
)
1389 /* This applies a derived type default initializer. */
1390 || (sym
->ts
.type
== BT_DERIVED
1391 && sym
->attr
.save
== SAVE_NONE
1393 && !sym
->attr
.allocatable
1394 && (sym
->value
&& !sym
->ns
->proc_name
->attr
.is_main_program
)
1395 && !(sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)))
1396 gfc_defer_symbol_init (sym
);
1398 gfc_finish_var_decl (decl
, sym
);
1400 if (sym
->ts
.type
== BT_CHARACTER
)
1402 /* Character variables need special handling. */
1403 gfc_allocate_lang_decl (decl
);
1405 if (TREE_CODE (length
) != INTEGER_CST
)
1407 char name
[GFC_MAX_MANGLED_SYMBOL_LEN
+ 2];
1411 /* Also prefix the mangled name for symbols from modules. */
1412 strcpy (&name
[1], sym
->name
);
1415 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length
)));
1416 gfc_set_decl_assembler_name (decl
, get_identifier (name
));
1418 gfc_finish_var_decl (length
, sym
);
1419 gcc_assert (!sym
->value
);
1422 else if (sym
->attr
.subref_array_pointer
)
1424 /* We need the span for these beasts. */
1425 gfc_allocate_lang_decl (decl
);
1428 if (sym
->attr
.subref_array_pointer
)
1431 GFC_DECL_SUBREF_ARRAY_P (decl
) = 1;
1432 span
= build_decl (input_location
,
1433 VAR_DECL
, create_tmp_var_name ("span"),
1434 gfc_array_index_type
);
1435 gfc_finish_var_decl (span
, sym
);
1436 TREE_STATIC (span
) = TREE_STATIC (decl
);
1437 DECL_ARTIFICIAL (span
) = 1;
1439 GFC_DECL_SPAN (decl
) = span
;
1440 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl
)) = span
;
1443 if (sym
->ts
.type
== BT_CLASS
)
1444 GFC_DECL_CLASS(decl
) = 1;
1446 sym
->backend_decl
= decl
;
1448 if (sym
->attr
.assign
)
1449 gfc_add_assign_aux_vars (sym
);
1451 if (intrinsic_array_parameter
)
1453 TREE_STATIC (decl
) = 1;
1454 DECL_EXTERNAL (decl
) = 0;
1457 if (TREE_STATIC (decl
)
1458 && !(sym
->attr
.use_assoc
&& !intrinsic_array_parameter
)
1459 && (sym
->attr
.save
|| sym
->ns
->proc_name
->attr
.is_main_program
1460 || gfc_option
.flag_max_stack_var_size
== 0
1461 || sym
->attr
.data
|| sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1462 && (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
1463 || !sym
->attr
.codimension
|| sym
->attr
.allocatable
))
1465 /* Add static initializer. For procedures, it is only needed if
1466 SAVE is specified otherwise they need to be reinitialized
1467 every time the procedure is entered. The TREE_STATIC is
1468 in this case due to -fmax-stack-var-size=. */
1469 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
1472 || (sym
->attr
.codimension
1473 && sym
->attr
.allocatable
),
1475 || sym
->attr
.allocatable
,
1476 sym
->attr
.proc_pointer
);
1479 if (!TREE_STATIC (decl
)
1480 && POINTER_TYPE_P (TREE_TYPE (decl
))
1481 && !sym
->attr
.pointer
1482 && !sym
->attr
.allocatable
1483 && !sym
->attr
.proc_pointer
)
1484 DECL_BY_REFERENCE (decl
) = 1;
1487 || (sym
->name
[0] == '_' && strncmp ("__def_init", sym
->name
, 10) == 0))
1489 TREE_READONLY (decl
) = 1;
1490 GFC_DECL_PUSH_TOPLEVEL (decl
) = 1;
1497 /* Substitute a temporary variable in place of the real one. */
1500 gfc_shadow_sym (gfc_symbol
* sym
, tree decl
, gfc_saved_var
* save
)
1502 save
->attr
= sym
->attr
;
1503 save
->decl
= sym
->backend_decl
;
1505 gfc_clear_attr (&sym
->attr
);
1506 sym
->attr
.referenced
= 1;
1507 sym
->attr
.flavor
= FL_VARIABLE
;
1509 sym
->backend_decl
= decl
;
1513 /* Restore the original variable. */
1516 gfc_restore_sym (gfc_symbol
* sym
, gfc_saved_var
* save
)
1518 sym
->attr
= save
->attr
;
1519 sym
->backend_decl
= save
->decl
;
1523 /* Declare a procedure pointer. */
1526 get_proc_pointer_decl (gfc_symbol
*sym
)
1531 decl
= sym
->backend_decl
;
1535 decl
= build_decl (input_location
,
1536 VAR_DECL
, get_identifier (sym
->name
),
1537 build_pointer_type (gfc_get_function_type (sym
)));
1539 if ((sym
->ns
->proc_name
1540 && sym
->ns
->proc_name
->backend_decl
== current_function_decl
)
1541 || sym
->attr
.contained
)
1542 gfc_add_decl_to_function (decl
);
1543 else if (sym
->ns
->proc_name
->attr
.flavor
!= FL_MODULE
)
1544 gfc_add_decl_to_parent_function (decl
);
1546 sym
->backend_decl
= decl
;
1548 /* If a variable is USE associated, it's always external. */
1549 if (sym
->attr
.use_assoc
)
1551 DECL_EXTERNAL (decl
) = 1;
1552 TREE_PUBLIC (decl
) = 1;
1554 else if (sym
->module
&& sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1556 /* This is the declaration of a module variable. */
1557 TREE_PUBLIC (decl
) = 1;
1558 TREE_STATIC (decl
) = 1;
1561 if (!sym
->attr
.use_assoc
1562 && (sym
->attr
.save
!= SAVE_NONE
|| sym
->attr
.data
1563 || (sym
->value
&& sym
->ns
->proc_name
->attr
.is_main_program
)))
1564 TREE_STATIC (decl
) = 1;
1566 if (TREE_STATIC (decl
) && sym
->value
)
1568 /* Add static initializer. */
1569 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
1571 sym
->attr
.dimension
,
1575 /* Handle threadprivate procedure pointers. */
1576 if (sym
->attr
.threadprivate
1577 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1578 DECL_TLS_MODEL (decl
) = decl_default_tls_model (decl
);
1580 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1581 decl_attributes (&decl
, attributes
, 0);
1587 /* Get a basic decl for an external function. */
1590 gfc_get_extern_function_decl (gfc_symbol
* sym
)
1596 gfc_intrinsic_sym
*isym
;
1598 char s
[GFC_MAX_SYMBOL_LEN
+ 23]; /* "_gfortran_f2c_specific" and '\0'. */
1603 if (sym
->backend_decl
)
1604 return sym
->backend_decl
;
1606 /* We should never be creating external decls for alternate entry points.
1607 The procedure may be an alternate entry point, but we don't want/need
1609 gcc_assert (!(sym
->attr
.entry
|| sym
->attr
.entry_master
));
1611 if (sym
->attr
.proc_pointer
)
1612 return get_proc_pointer_decl (sym
);
1614 /* See if this is an external procedure from the same file. If so,
1615 return the backend_decl. */
1616 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->name
);
1618 if (gfc_option
.flag_whole_file
1619 && (!sym
->attr
.use_assoc
|| sym
->attr
.if_source
!= IFSRC_DECL
)
1620 && !sym
->backend_decl
1622 && ((gsym
->type
== GSYM_SUBROUTINE
) || (gsym
->type
== GSYM_FUNCTION
))
1623 && (gsym
->ns
->proc_name
->backend_decl
|| !sym
->attr
.intrinsic
))
1625 if (!gsym
->ns
->proc_name
->backend_decl
)
1627 /* By construction, the external function cannot be
1628 a contained procedure. */
1630 tree save_fn_decl
= current_function_decl
;
1632 current_function_decl
= NULL_TREE
;
1633 gfc_save_backend_locus (&old_loc
);
1636 gfc_create_function_decl (gsym
->ns
, true);
1639 gfc_restore_backend_locus (&old_loc
);
1640 current_function_decl
= save_fn_decl
;
1643 /* If the namespace has entries, the proc_name is the
1644 entry master. Find the entry and use its backend_decl.
1645 otherwise, use the proc_name backend_decl. */
1646 if (gsym
->ns
->entries
)
1648 gfc_entry_list
*entry
= gsym
->ns
->entries
;
1650 for (; entry
; entry
= entry
->next
)
1652 if (strcmp (gsym
->name
, entry
->sym
->name
) == 0)
1654 sym
->backend_decl
= entry
->sym
->backend_decl
;
1660 sym
->backend_decl
= gsym
->ns
->proc_name
->backend_decl
;
1662 if (sym
->backend_decl
)
1664 /* Avoid problems of double deallocation of the backend declaration
1665 later in gfc_trans_use_stmts; cf. PR 45087. */
1666 if (sym
->attr
.if_source
!= IFSRC_DECL
&& sym
->attr
.use_assoc
)
1667 sym
->attr
.use_assoc
= 0;
1669 return sym
->backend_decl
;
1673 /* See if this is a module procedure from the same file. If so,
1674 return the backend_decl. */
1676 gsym
= gfc_find_gsymbol (gfc_gsym_root
, sym
->module
);
1678 if (gfc_option
.flag_whole_file
1680 && gsym
->type
== GSYM_MODULE
)
1685 gfc_find_symbol (sym
->name
, gsym
->ns
, 0, &s
);
1686 if (s
&& s
->backend_decl
)
1688 if (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
)
1689 gfc_copy_dt_decls_ifequal (s
->ts
.u
.derived
, sym
->ts
.u
.derived
,
1691 else if (sym
->ts
.type
== BT_CHARACTER
)
1692 sym
->ts
.u
.cl
->backend_decl
= s
->ts
.u
.cl
->backend_decl
;
1693 sym
->backend_decl
= s
->backend_decl
;
1694 return sym
->backend_decl
;
1698 if (sym
->attr
.intrinsic
)
1700 /* Call the resolution function to get the actual name. This is
1701 a nasty hack which relies on the resolution functions only looking
1702 at the first argument. We pass NULL for the second argument
1703 otherwise things like AINT get confused. */
1704 isym
= gfc_find_function (sym
->name
);
1705 gcc_assert (isym
->resolve
.f0
!= NULL
);
1707 memset (&e
, 0, sizeof (e
));
1708 e
.expr_type
= EXPR_FUNCTION
;
1710 memset (&argexpr
, 0, sizeof (argexpr
));
1711 gcc_assert (isym
->formal
);
1712 argexpr
.ts
= isym
->formal
->ts
;
1714 if (isym
->formal
->next
== NULL
)
1715 isym
->resolve
.f1 (&e
, &argexpr
);
1718 if (isym
->formal
->next
->next
== NULL
)
1719 isym
->resolve
.f2 (&e
, &argexpr
, NULL
);
1722 if (isym
->formal
->next
->next
->next
== NULL
)
1723 isym
->resolve
.f3 (&e
, &argexpr
, NULL
, NULL
);
1726 /* All specific intrinsics take less than 5 arguments. */
1727 gcc_assert (isym
->formal
->next
->next
->next
->next
== NULL
);
1728 isym
->resolve
.f4 (&e
, &argexpr
, NULL
, NULL
, NULL
);
1733 if (gfc_option
.flag_f2c
1734 && ((e
.ts
.type
== BT_REAL
&& e
.ts
.kind
== gfc_default_real_kind
)
1735 || e
.ts
.type
== BT_COMPLEX
))
1737 /* Specific which needs a different implementation if f2c
1738 calling conventions are used. */
1739 sprintf (s
, "_gfortran_f2c_specific%s", e
.value
.function
.name
);
1742 sprintf (s
, "_gfortran_specific%s", e
.value
.function
.name
);
1744 name
= get_identifier (s
);
1745 mangled_name
= name
;
1749 name
= gfc_sym_identifier (sym
);
1750 mangled_name
= gfc_sym_mangled_function_id (sym
);
1753 type
= gfc_get_function_type (sym
);
1754 fndecl
= build_decl (input_location
,
1755 FUNCTION_DECL
, name
, type
);
1757 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1758 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1759 the opposite of declaring a function as static in C). */
1760 DECL_EXTERNAL (fndecl
) = 1;
1761 TREE_PUBLIC (fndecl
) = 1;
1763 attributes
= add_attributes_to_decl (sym
->attr
, NULL_TREE
);
1764 decl_attributes (&fndecl
, attributes
, 0);
1766 gfc_set_decl_assembler_name (fndecl
, mangled_name
);
1768 /* Set the context of this decl. */
1769 if (0 && sym
->ns
&& sym
->ns
->proc_name
)
1771 /* TODO: Add external decls to the appropriate scope. */
1772 DECL_CONTEXT (fndecl
) = sym
->ns
->proc_name
->backend_decl
;
1776 /* Global declaration, e.g. intrinsic subroutine. */
1777 DECL_CONTEXT (fndecl
) = NULL_TREE
;
1780 /* Set attributes for PURE functions. A call to PURE function in the
1781 Fortran 95 sense is both pure and without side effects in the C
1783 if (sym
->attr
.pure
|| sym
->attr
.elemental
)
1785 if (sym
->attr
.function
&& !gfc_return_by_reference (sym
))
1786 DECL_PURE_P (fndecl
) = 1;
1787 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1788 parameters and don't use alternate returns (is this
1789 allowed?). In that case, calls to them are meaningless, and
1790 can be optimized away. See also in build_function_decl(). */
1791 TREE_SIDE_EFFECTS (fndecl
) = 0;
1794 /* Mark non-returning functions. */
1795 if (sym
->attr
.noreturn
)
1796 TREE_THIS_VOLATILE(fndecl
) = 1;
1798 sym
->backend_decl
= fndecl
;
1800 if (DECL_CONTEXT (fndecl
) == NULL_TREE
)
1801 pushdecl_top_level (fndecl
);
1807 /* Create a declaration for a procedure. For external functions (in the C
1808 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1809 a master function with alternate entry points. */
1812 build_function_decl (gfc_symbol
* sym
, bool global
)
1814 tree fndecl
, type
, attributes
;
1815 symbol_attribute attr
;
1817 gfc_formal_arglist
*f
;
1819 gcc_assert (!sym
->attr
.external
);
1821 if (sym
->backend_decl
)
1824 /* Set the line and filename. sym->declared_at seems to point to the
1825 last statement for subroutines, but it'll do for now. */
1826 gfc_set_backend_locus (&sym
->declared_at
);
1828 /* Allow only one nesting level. Allow public declarations. */
1829 gcc_assert (current_function_decl
== NULL_TREE
1830 || DECL_FILE_SCOPE_P (current_function_decl
)
1831 || (TREE_CODE (DECL_CONTEXT (current_function_decl
))
1832 == NAMESPACE_DECL
));
1834 type
= gfc_get_function_type (sym
);
1835 fndecl
= build_decl (input_location
,
1836 FUNCTION_DECL
, gfc_sym_identifier (sym
), type
);
1840 /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
1841 TREE_PUBLIC specifies whether a function is globally addressable (i.e.
1842 the opposite of declaring a function as static in C). */
1843 DECL_EXTERNAL (fndecl
) = 0;
1845 if (!current_function_decl
1846 && !sym
->attr
.entry_master
&& !sym
->attr
.is_main_program
1847 && (sym
->attr
.access
!= ACCESS_PRIVATE
|| sym
->binding_label
1848 || sym
->attr
.public_used
))
1849 TREE_PUBLIC (fndecl
) = 1;
1851 attributes
= add_attributes_to_decl (attr
, NULL_TREE
);
1852 decl_attributes (&fndecl
, attributes
, 0);
1854 /* Figure out the return type of the declared function, and build a
1855 RESULT_DECL for it. If this is a subroutine with alternate
1856 returns, build a RESULT_DECL for it. */
1857 result_decl
= NULL_TREE
;
1858 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1861 if (gfc_return_by_reference (sym
))
1862 type
= void_type_node
;
1865 if (sym
->result
!= sym
)
1866 result_decl
= gfc_sym_identifier (sym
->result
);
1868 type
= TREE_TYPE (TREE_TYPE (fndecl
));
1873 /* Look for alternate return placeholders. */
1874 int has_alternate_returns
= 0;
1875 for (f
= sym
->formal
; f
; f
= f
->next
)
1879 has_alternate_returns
= 1;
1884 if (has_alternate_returns
)
1885 type
= integer_type_node
;
1887 type
= void_type_node
;
1890 result_decl
= build_decl (input_location
,
1891 RESULT_DECL
, result_decl
, type
);
1892 DECL_ARTIFICIAL (result_decl
) = 1;
1893 DECL_IGNORED_P (result_decl
) = 1;
1894 DECL_CONTEXT (result_decl
) = fndecl
;
1895 DECL_RESULT (fndecl
) = result_decl
;
1897 /* Don't call layout_decl for a RESULT_DECL.
1898 layout_decl (result_decl, 0); */
1900 /* TREE_STATIC means the function body is defined here. */
1901 TREE_STATIC (fndecl
) = 1;
1903 /* Set attributes for PURE functions. A call to a PURE function in the
1904 Fortran 95 sense is both pure and without side effects in the C
1906 if (attr
.pure
|| attr
.elemental
)
1908 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1909 including an alternate return. In that case it can also be
1910 marked as PURE. See also in gfc_get_extern_function_decl(). */
1911 if (attr
.function
&& !gfc_return_by_reference (sym
))
1912 DECL_PURE_P (fndecl
) = 1;
1913 TREE_SIDE_EFFECTS (fndecl
) = 0;
1917 /* Layout the function declaration and put it in the binding level
1918 of the current function. */
1921 || (sym
->name
[0] == '_' && strncmp ("__copy", sym
->name
, 6) == 0))
1922 pushdecl_top_level (fndecl
);
1926 /* Perform name mangling if this is a top level or module procedure. */
1927 if (current_function_decl
== NULL_TREE
)
1928 gfc_set_decl_assembler_name (fndecl
, gfc_sym_mangled_function_id (sym
));
1930 sym
->backend_decl
= fndecl
;
1934 /* Create the DECL_ARGUMENTS for a procedure. */
1937 create_function_arglist (gfc_symbol
* sym
)
1940 gfc_formal_arglist
*f
;
1941 tree typelist
, hidden_typelist
;
1942 tree arglist
, hidden_arglist
;
1946 fndecl
= sym
->backend_decl
;
1948 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1949 the new FUNCTION_DECL node. */
1950 arglist
= NULL_TREE
;
1951 hidden_arglist
= NULL_TREE
;
1952 typelist
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
1954 if (sym
->attr
.entry_master
)
1956 type
= TREE_VALUE (typelist
);
1957 parm
= build_decl (input_location
,
1958 PARM_DECL
, get_identifier ("__entry"), type
);
1960 DECL_CONTEXT (parm
) = fndecl
;
1961 DECL_ARG_TYPE (parm
) = type
;
1962 TREE_READONLY (parm
) = 1;
1963 gfc_finish_decl (parm
);
1964 DECL_ARTIFICIAL (parm
) = 1;
1966 arglist
= chainon (arglist
, parm
);
1967 typelist
= TREE_CHAIN (typelist
);
1970 if (gfc_return_by_reference (sym
))
1972 tree type
= TREE_VALUE (typelist
), length
= NULL
;
1974 if (sym
->ts
.type
== BT_CHARACTER
)
1976 /* Length of character result. */
1977 tree len_type
= TREE_VALUE (TREE_CHAIN (typelist
));
1979 length
= build_decl (input_location
,
1981 get_identifier (".__result"),
1983 if (!sym
->ts
.u
.cl
->length
)
1985 sym
->ts
.u
.cl
->backend_decl
= length
;
1986 TREE_USED (length
) = 1;
1988 gcc_assert (TREE_CODE (length
) == PARM_DECL
);
1989 DECL_CONTEXT (length
) = fndecl
;
1990 DECL_ARG_TYPE (length
) = len_type
;
1991 TREE_READONLY (length
) = 1;
1992 DECL_ARTIFICIAL (length
) = 1;
1993 gfc_finish_decl (length
);
1994 if (sym
->ts
.u
.cl
->backend_decl
== NULL
1995 || sym
->ts
.u
.cl
->backend_decl
== length
)
2000 if (sym
->ts
.u
.cl
->backend_decl
== NULL
)
2002 tree len
= build_decl (input_location
,
2004 get_identifier ("..__result"),
2005 gfc_charlen_type_node
);
2006 DECL_ARTIFICIAL (len
) = 1;
2007 TREE_USED (len
) = 1;
2008 sym
->ts
.u
.cl
->backend_decl
= len
;
2011 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2012 arg
= sym
->result
? sym
->result
: sym
;
2013 backend_decl
= arg
->backend_decl
;
2014 /* Temporary clear it, so that gfc_sym_type creates complete
2016 arg
->backend_decl
= NULL
;
2017 type
= gfc_sym_type (arg
);
2018 arg
->backend_decl
= backend_decl
;
2019 type
= build_reference_type (type
);
2023 parm
= build_decl (input_location
,
2024 PARM_DECL
, get_identifier ("__result"), type
);
2026 DECL_CONTEXT (parm
) = fndecl
;
2027 DECL_ARG_TYPE (parm
) = TREE_VALUE (typelist
);
2028 TREE_READONLY (parm
) = 1;
2029 DECL_ARTIFICIAL (parm
) = 1;
2030 gfc_finish_decl (parm
);
2032 arglist
= chainon (arglist
, parm
);
2033 typelist
= TREE_CHAIN (typelist
);
2035 if (sym
->ts
.type
== BT_CHARACTER
)
2037 gfc_allocate_lang_decl (parm
);
2038 arglist
= chainon (arglist
, length
);
2039 typelist
= TREE_CHAIN (typelist
);
2043 hidden_typelist
= typelist
;
2044 for (f
= sym
->formal
; f
; f
= f
->next
)
2045 if (f
->sym
!= NULL
) /* Ignore alternate returns. */
2046 hidden_typelist
= TREE_CHAIN (hidden_typelist
);
2048 for (f
= sym
->formal
; f
; f
= f
->next
)
2050 char name
[GFC_MAX_SYMBOL_LEN
+ 2];
2052 /* Ignore alternate returns. */
2056 type
= TREE_VALUE (typelist
);
2058 if (f
->sym
->ts
.type
== BT_CHARACTER
2059 && (!sym
->attr
.is_bind_c
|| sym
->attr
.entry_master
))
2061 tree len_type
= TREE_VALUE (hidden_typelist
);
2062 tree length
= NULL_TREE
;
2063 if (!f
->sym
->ts
.deferred
)
2064 gcc_assert (len_type
== gfc_charlen_type_node
);
2066 gcc_assert (POINTER_TYPE_P (len_type
));
2068 strcpy (&name
[1], f
->sym
->name
);
2070 length
= build_decl (input_location
,
2071 PARM_DECL
, get_identifier (name
), len_type
);
2073 hidden_arglist
= chainon (hidden_arglist
, length
);
2074 DECL_CONTEXT (length
) = fndecl
;
2075 DECL_ARTIFICIAL (length
) = 1;
2076 DECL_ARG_TYPE (length
) = len_type
;
2077 TREE_READONLY (length
) = 1;
2078 gfc_finish_decl (length
);
2080 /* Remember the passed value. */
2081 if (f
->sym
->ts
.u
.cl
->passed_length
!= NULL
)
2083 /* This can happen if the same type is used for multiple
2084 arguments. We need to copy cl as otherwise
2085 cl->passed_length gets overwritten. */
2086 f
->sym
->ts
.u
.cl
= gfc_new_charlen (f
->sym
->ns
, f
->sym
->ts
.u
.cl
);
2088 f
->sym
->ts
.u
.cl
->passed_length
= length
;
2090 /* Use the passed value for assumed length variables. */
2091 if (!f
->sym
->ts
.u
.cl
->length
)
2093 TREE_USED (length
) = 1;
2094 gcc_assert (!f
->sym
->ts
.u
.cl
->backend_decl
);
2095 f
->sym
->ts
.u
.cl
->backend_decl
= length
;
2098 hidden_typelist
= TREE_CHAIN (hidden_typelist
);
2100 if (f
->sym
->ts
.u
.cl
->backend_decl
== NULL
2101 || f
->sym
->ts
.u
.cl
->backend_decl
== length
)
2103 if (f
->sym
->ts
.u
.cl
->backend_decl
== NULL
)
2104 gfc_create_string_length (f
->sym
);
2106 /* Make sure PARM_DECL type doesn't point to incomplete type. */
2107 if (f
->sym
->attr
.flavor
== FL_PROCEDURE
)
2108 type
= build_pointer_type (gfc_get_function_type (f
->sym
));
2110 type
= gfc_sym_type (f
->sym
);
2114 /* For non-constant length array arguments, make sure they use
2115 a different type node from TYPE_ARG_TYPES type. */
2116 if (f
->sym
->attr
.dimension
2117 && type
== TREE_VALUE (typelist
)
2118 && TREE_CODE (type
) == POINTER_TYPE
2119 && GFC_ARRAY_TYPE_P (type
)
2120 && f
->sym
->as
->type
!= AS_ASSUMED_SIZE
2121 && ! COMPLETE_TYPE_P (TREE_TYPE (type
)))
2123 if (f
->sym
->attr
.flavor
== FL_PROCEDURE
)
2124 type
= build_pointer_type (gfc_get_function_type (f
->sym
));
2126 type
= gfc_sym_type (f
->sym
);
2129 if (f
->sym
->attr
.proc_pointer
)
2130 type
= build_pointer_type (type
);
2132 if (f
->sym
->attr
.volatile_
)
2133 type
= build_qualified_type (type
, TYPE_QUAL_VOLATILE
);
2135 /* Build the argument declaration. */
2136 parm
= build_decl (input_location
,
2137 PARM_DECL
, gfc_sym_identifier (f
->sym
), type
);
2139 if (f
->sym
->attr
.volatile_
)
2141 TREE_THIS_VOLATILE (parm
) = 1;
2142 TREE_SIDE_EFFECTS (parm
) = 1;
2145 /* Fill in arg stuff. */
2146 DECL_CONTEXT (parm
) = fndecl
;
2147 DECL_ARG_TYPE (parm
) = TREE_VALUE (typelist
);
2148 /* All implementation args are read-only. */
2149 TREE_READONLY (parm
) = 1;
2150 if (POINTER_TYPE_P (type
)
2151 && (!f
->sym
->attr
.proc_pointer
2152 && f
->sym
->attr
.flavor
!= FL_PROCEDURE
))
2153 DECL_BY_REFERENCE (parm
) = 1;
2155 gfc_finish_decl (parm
);
2157 f
->sym
->backend_decl
= parm
;
2159 /* Coarrays which are descriptorless or assumed-shape pass with
2160 -fcoarray=lib the token and the offset as hidden arguments. */
2161 if (f
->sym
->attr
.codimension
2162 && gfc_option
.coarray
== GFC_FCOARRAY_LIB
2163 && !f
->sym
->attr
.allocatable
)
2169 gcc_assert (f
->sym
->backend_decl
!= NULL_TREE
2170 && !sym
->attr
.is_bind_c
);
2171 caf_type
= TREE_TYPE (f
->sym
->backend_decl
);
2173 token
= build_decl (input_location
, PARM_DECL
,
2174 create_tmp_var_name ("caf_token"),
2175 build_qualified_type (pvoid_type_node
,
2176 TYPE_QUAL_RESTRICT
));
2177 if (f
->sym
->as
->type
== AS_ASSUMED_SHAPE
)
2179 gcc_assert (DECL_LANG_SPECIFIC (f
->sym
->backend_decl
) == NULL
2180 || GFC_DECL_TOKEN (f
->sym
->backend_decl
) == NULL_TREE
);
2181 if (DECL_LANG_SPECIFIC (f
->sym
->backend_decl
) == NULL
)
2182 gfc_allocate_lang_decl (f
->sym
->backend_decl
);
2183 GFC_DECL_TOKEN (f
->sym
->backend_decl
) = token
;
2187 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) == NULL_TREE
);
2188 GFC_TYPE_ARRAY_CAF_TOKEN (caf_type
) = token
;
2191 DECL_CONTEXT (token
) = fndecl
;
2192 DECL_ARTIFICIAL (token
) = 1;
2193 DECL_ARG_TYPE (token
) = TREE_VALUE (typelist
);
2194 TREE_READONLY (token
) = 1;
2195 hidden_arglist
= chainon (hidden_arglist
, token
);
2196 gfc_finish_decl (token
);
2198 offset
= build_decl (input_location
, PARM_DECL
,
2199 create_tmp_var_name ("caf_offset"),
2200 gfc_array_index_type
);
2202 if (f
->sym
->as
->type
== AS_ASSUMED_SHAPE
)
2204 gcc_assert (GFC_DECL_CAF_OFFSET (f
->sym
->backend_decl
)
2206 GFC_DECL_CAF_OFFSET (f
->sym
->backend_decl
) = offset
;
2210 gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type
) == NULL_TREE
);
2211 GFC_TYPE_ARRAY_CAF_OFFSET (caf_type
) = offset
;
2213 DECL_CONTEXT (offset
) = fndecl
;
2214 DECL_ARTIFICIAL (offset
) = 1;
2215 DECL_ARG_TYPE (offset
) = TREE_VALUE (typelist
);
2216 TREE_READONLY (offset
) = 1;
2217 hidden_arglist
= chainon (hidden_arglist
, offset
);
2218 gfc_finish_decl (offset
);
2221 arglist
= chainon (arglist
, parm
);
2222 typelist
= TREE_CHAIN (typelist
);
2225 /* Add the hidden string length parameters, unless the procedure
2227 if (!sym
->attr
.is_bind_c
)
2228 arglist
= chainon (arglist
, hidden_arglist
);
2230 gcc_assert (hidden_typelist
== NULL_TREE
2231 || TREE_VALUE (hidden_typelist
) == void_type_node
);
2232 DECL_ARGUMENTS (fndecl
) = arglist
;
2235 /* Do the setup necessary before generating the body of a function. */
2238 trans_function_start (gfc_symbol
* sym
)
2242 fndecl
= sym
->backend_decl
;
2244 /* Let GCC know the current scope is this function. */
2245 current_function_decl
= fndecl
;
2247 /* Let the world know what we're about to do. */
2248 announce_function (fndecl
);
2250 if (DECL_FILE_SCOPE_P (fndecl
))
2252 /* Create RTL for function declaration. */
2253 rest_of_decl_compilation (fndecl
, 1, 0);
2256 /* Create RTL for function definition. */
2257 make_decl_rtl (fndecl
);
2259 init_function_start (fndecl
);
2261 /* function.c requires a push at the start of the function. */
2265 /* Create thunks for alternate entry points. */
2268 build_entry_thunks (gfc_namespace
* ns
, bool global
)
2270 gfc_formal_arglist
*formal
;
2271 gfc_formal_arglist
*thunk_formal
;
2273 gfc_symbol
*thunk_sym
;
2279 /* This should always be a toplevel function. */
2280 gcc_assert (current_function_decl
== NULL_TREE
);
2282 gfc_save_backend_locus (&old_loc
);
2283 for (el
= ns
->entries
; el
; el
= el
->next
)
2285 VEC(tree
,gc
) *args
= NULL
;
2286 VEC(tree
,gc
) *string_args
= NULL
;
2288 thunk_sym
= el
->sym
;
2290 build_function_decl (thunk_sym
, global
);
2291 create_function_arglist (thunk_sym
);
2293 trans_function_start (thunk_sym
);
2295 thunk_fndecl
= thunk_sym
->backend_decl
;
2297 gfc_init_block (&body
);
2299 /* Pass extra parameter identifying this entry point. */
2300 tmp
= build_int_cst (gfc_array_index_type
, el
->id
);
2301 VEC_safe_push (tree
, gc
, args
, tmp
);
2303 if (thunk_sym
->attr
.function
)
2305 if (gfc_return_by_reference (ns
->proc_name
))
2307 tree ref
= DECL_ARGUMENTS (current_function_decl
);
2308 VEC_safe_push (tree
, gc
, args
, ref
);
2309 if (ns
->proc_name
->ts
.type
== BT_CHARACTER
)
2310 VEC_safe_push (tree
, gc
, args
, DECL_CHAIN (ref
));
2314 for (formal
= ns
->proc_name
->formal
; formal
; formal
= formal
->next
)
2316 /* Ignore alternate returns. */
2317 if (formal
->sym
== NULL
)
2320 /* We don't have a clever way of identifying arguments, so resort to
2321 a brute-force search. */
2322 for (thunk_formal
= thunk_sym
->formal
;
2324 thunk_formal
= thunk_formal
->next
)
2326 if (thunk_formal
->sym
== formal
->sym
)
2332 /* Pass the argument. */
2333 DECL_ARTIFICIAL (thunk_formal
->sym
->backend_decl
) = 1;
2334 VEC_safe_push (tree
, gc
, args
, thunk_formal
->sym
->backend_decl
);
2335 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2337 tmp
= thunk_formal
->sym
->ts
.u
.cl
->backend_decl
;
2338 VEC_safe_push (tree
, gc
, string_args
, tmp
);
2343 /* Pass NULL for a missing argument. */
2344 VEC_safe_push (tree
, gc
, args
, null_pointer_node
);
2345 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2347 tmp
= build_int_cst (gfc_charlen_type_node
, 0);
2348 VEC_safe_push (tree
, gc
, string_args
, tmp
);
2353 /* Call the master function. */
2354 VEC_safe_splice (tree
, gc
, args
, string_args
);
2355 tmp
= ns
->proc_name
->backend_decl
;
2356 tmp
= build_call_expr_loc_vec (input_location
, tmp
, args
);
2357 if (ns
->proc_name
->attr
.mixed_entry_master
)
2359 tree union_decl
, field
;
2360 tree master_type
= TREE_TYPE (ns
->proc_name
->backend_decl
);
2362 union_decl
= build_decl (input_location
,
2363 VAR_DECL
, get_identifier ("__result"),
2364 TREE_TYPE (master_type
));
2365 DECL_ARTIFICIAL (union_decl
) = 1;
2366 DECL_EXTERNAL (union_decl
) = 0;
2367 TREE_PUBLIC (union_decl
) = 0;
2368 TREE_USED (union_decl
) = 1;
2369 layout_decl (union_decl
, 0);
2370 pushdecl (union_decl
);
2372 DECL_CONTEXT (union_decl
) = current_function_decl
;
2373 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2374 TREE_TYPE (union_decl
), union_decl
, tmp
);
2375 gfc_add_expr_to_block (&body
, tmp
);
2377 for (field
= TYPE_FIELDS (TREE_TYPE (union_decl
));
2378 field
; field
= DECL_CHAIN (field
))
2379 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field
)),
2380 thunk_sym
->result
->name
) == 0)
2382 gcc_assert (field
!= NULL_TREE
);
2383 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
2384 TREE_TYPE (field
), union_decl
, field
,
2386 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2387 TREE_TYPE (DECL_RESULT (current_function_decl
)),
2388 DECL_RESULT (current_function_decl
), tmp
);
2389 tmp
= build1_v (RETURN_EXPR
, tmp
);
2391 else if (TREE_TYPE (DECL_RESULT (current_function_decl
))
2394 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
2395 TREE_TYPE (DECL_RESULT (current_function_decl
)),
2396 DECL_RESULT (current_function_decl
), tmp
);
2397 tmp
= build1_v (RETURN_EXPR
, tmp
);
2399 gfc_add_expr_to_block (&body
, tmp
);
2401 /* Finish off this function and send it for code generation. */
2402 DECL_SAVED_TREE (thunk_fndecl
) = gfc_finish_block (&body
);
2405 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl
)) = thunk_fndecl
;
2406 DECL_SAVED_TREE (thunk_fndecl
)
2407 = build3_v (BIND_EXPR
, tmp
, DECL_SAVED_TREE (thunk_fndecl
),
2408 DECL_INITIAL (thunk_fndecl
));
2410 /* Output the GENERIC tree. */
2411 dump_function (TDI_original
, thunk_fndecl
);
2413 /* Store the end of the function, so that we get good line number
2414 info for the epilogue. */
2415 cfun
->function_end_locus
= input_location
;
2417 /* We're leaving the context of this function, so zap cfun.
2418 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
2419 tree_rest_of_compilation. */
2422 current_function_decl
= NULL_TREE
;
2424 cgraph_finalize_function (thunk_fndecl
, true);
2426 /* We share the symbols in the formal argument list with other entry
2427 points and the master function. Clear them so that they are
2428 recreated for each function. */
2429 for (formal
= thunk_sym
->formal
; formal
; formal
= formal
->next
)
2430 if (formal
->sym
!= NULL
) /* Ignore alternate returns. */
2432 formal
->sym
->backend_decl
= NULL_TREE
;
2433 if (formal
->sym
->ts
.type
== BT_CHARACTER
)
2434 formal
->sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2437 if (thunk_sym
->attr
.function
)
2439 if (thunk_sym
->ts
.type
== BT_CHARACTER
)
2440 thunk_sym
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2441 if (thunk_sym
->result
->ts
.type
== BT_CHARACTER
)
2442 thunk_sym
->result
->ts
.u
.cl
->backend_decl
= NULL_TREE
;
2446 gfc_restore_backend_locus (&old_loc
);
2450 /* Create a decl for a function, and create any thunks for alternate entry
2451 points. If global is true, generate the function in the global binding
2452 level, otherwise in the current binding level (which can be global). */
2455 gfc_create_function_decl (gfc_namespace
* ns
, bool global
)
2457 /* Create a declaration for the master function. */
2458 build_function_decl (ns
->proc_name
, global
);
2460 /* Compile the entry thunks. */
2462 build_entry_thunks (ns
, global
);
2464 /* Now create the read argument list. */
2465 create_function_arglist (ns
->proc_name
);
2468 /* Return the decl used to hold the function return value. If
2469 parent_flag is set, the context is the parent_scope. */
2472 gfc_get_fake_result_decl (gfc_symbol
* sym
, int parent_flag
)
2476 tree this_fake_result_decl
;
2477 tree this_function_decl
;
2479 char name
[GFC_MAX_SYMBOL_LEN
+ 10];
2483 this_fake_result_decl
= parent_fake_result_decl
;
2484 this_function_decl
= DECL_CONTEXT (current_function_decl
);
2488 this_fake_result_decl
= current_fake_result_decl
;
2489 this_function_decl
= current_function_decl
;
2493 && sym
->ns
->proc_name
->backend_decl
== this_function_decl
2494 && sym
->ns
->proc_name
->attr
.entry_master
2495 && sym
!= sym
->ns
->proc_name
)
2498 if (this_fake_result_decl
!= NULL
)
2499 for (t
= TREE_CHAIN (this_fake_result_decl
); t
; t
= TREE_CHAIN (t
))
2500 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t
)), sym
->name
) == 0)
2503 return TREE_VALUE (t
);
2504 decl
= gfc_get_fake_result_decl (sym
->ns
->proc_name
, parent_flag
);
2507 this_fake_result_decl
= parent_fake_result_decl
;
2509 this_fake_result_decl
= current_fake_result_decl
;
2511 if (decl
&& sym
->ns
->proc_name
->attr
.mixed_entry_master
)
2515 for (field
= TYPE_FIELDS (TREE_TYPE (decl
));
2516 field
; field
= DECL_CHAIN (field
))
2517 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field
)),
2521 gcc_assert (field
!= NULL_TREE
);
2522 decl
= fold_build3_loc (input_location
, COMPONENT_REF
,
2523 TREE_TYPE (field
), decl
, field
, NULL_TREE
);
2526 var
= create_tmp_var_raw (TREE_TYPE (decl
), sym
->name
);
2528 gfc_add_decl_to_parent_function (var
);
2530 gfc_add_decl_to_function (var
);
2532 SET_DECL_VALUE_EXPR (var
, decl
);
2533 DECL_HAS_VALUE_EXPR_P (var
) = 1;
2534 GFC_DECL_RESULT (var
) = 1;
2536 TREE_CHAIN (this_fake_result_decl
)
2537 = tree_cons (get_identifier (sym
->name
), var
,
2538 TREE_CHAIN (this_fake_result_decl
));
2542 if (this_fake_result_decl
!= NULL_TREE
)
2543 return TREE_VALUE (this_fake_result_decl
);
2545 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2550 if (sym
->ts
.type
== BT_CHARACTER
)
2552 if (sym
->ts
.u
.cl
->backend_decl
== NULL_TREE
)
2553 length
= gfc_create_string_length (sym
);
2555 length
= sym
->ts
.u
.cl
->backend_decl
;
2556 if (TREE_CODE (length
) == VAR_DECL
2557 && DECL_CONTEXT (length
) == NULL_TREE
)
2558 gfc_add_decl_to_function (length
);
2561 if (gfc_return_by_reference (sym
))
2563 decl
= DECL_ARGUMENTS (this_function_decl
);
2565 if (sym
->ns
->proc_name
->backend_decl
== this_function_decl
2566 && sym
->ns
->proc_name
->attr
.entry_master
)
2567 decl
= DECL_CHAIN (decl
);
2569 TREE_USED (decl
) = 1;
2571 decl
= gfc_build_dummy_array_decl (sym
, decl
);
2575 sprintf (name
, "__result_%.20s",
2576 IDENTIFIER_POINTER (DECL_NAME (this_function_decl
)));
2578 if (!sym
->attr
.mixed_entry_master
&& sym
->attr
.function
)
2579 decl
= build_decl (DECL_SOURCE_LOCATION (this_function_decl
),
2580 VAR_DECL
, get_identifier (name
),
2581 gfc_sym_type (sym
));
2583 decl
= build_decl (DECL_SOURCE_LOCATION (this_function_decl
),
2584 VAR_DECL
, get_identifier (name
),
2585 TREE_TYPE (TREE_TYPE (this_function_decl
)));
2586 DECL_ARTIFICIAL (decl
) = 1;
2587 DECL_EXTERNAL (decl
) = 0;
2588 TREE_PUBLIC (decl
) = 0;
2589 TREE_USED (decl
) = 1;
2590 GFC_DECL_RESULT (decl
) = 1;
2591 TREE_ADDRESSABLE (decl
) = 1;
2593 layout_decl (decl
, 0);
2596 gfc_add_decl_to_parent_function (decl
);
2598 gfc_add_decl_to_function (decl
);
2602 parent_fake_result_decl
= build_tree_list (NULL
, decl
);
2604 current_fake_result_decl
= build_tree_list (NULL
, decl
);
2610 /* Builds a function decl. The remaining parameters are the types of the
2611 function arguments. Negative nargs indicates a varargs function. */
2614 build_library_function_decl_1 (tree name
, const char *spec
,
2615 tree rettype
, int nargs
, va_list p
)
2617 VEC(tree
,gc
) *arglist
;
2622 /* Library functions must be declared with global scope. */
2623 gcc_assert (current_function_decl
== NULL_TREE
);
2625 /* Create a list of the argument types. */
2626 arglist
= VEC_alloc (tree
, gc
, abs (nargs
));
2627 for (n
= abs (nargs
); n
> 0; n
--)
2629 tree argtype
= va_arg (p
, tree
);
2630 VEC_quick_push (tree
, arglist
, argtype
);
2633 /* Build the function type and decl. */
2635 fntype
= build_function_type_vec (rettype
, arglist
);
2637 fntype
= build_varargs_function_type_vec (rettype
, arglist
);
2640 tree attr_args
= build_tree_list (NULL_TREE
,
2641 build_string (strlen (spec
), spec
));
2642 tree attrs
= tree_cons (get_identifier ("fn spec"),
2643 attr_args
, TYPE_ATTRIBUTES (fntype
));
2644 fntype
= build_type_attribute_variant (fntype
, attrs
);
2646 fndecl
= build_decl (input_location
,
2647 FUNCTION_DECL
, name
, fntype
);
2649 /* Mark this decl as external. */
2650 DECL_EXTERNAL (fndecl
) = 1;
2651 TREE_PUBLIC (fndecl
) = 1;
2655 rest_of_decl_compilation (fndecl
, 1, 0);
2660 /* Builds a function decl. The remaining parameters are the types of the
2661 function arguments. Negative nargs indicates a varargs function. */
2664 gfc_build_library_function_decl (tree name
, tree rettype
, int nargs
, ...)
2668 va_start (args
, nargs
);
2669 ret
= build_library_function_decl_1 (name
, NULL
, rettype
, nargs
, args
);
2674 /* Builds a function decl. The remaining parameters are the types of the
2675 function arguments. Negative nargs indicates a varargs function.
2676 The SPEC parameter specifies the function argument and return type
2677 specification according to the fnspec function type attribute. */
2680 gfc_build_library_function_decl_with_spec (tree name
, const char *spec
,
2681 tree rettype
, int nargs
, ...)
2685 va_start (args
, nargs
);
2686 ret
= build_library_function_decl_1 (name
, spec
, rettype
, nargs
, args
);
2692 gfc_build_intrinsic_function_decls (void)
2694 tree gfc_int4_type_node
= gfc_get_int_type (4);
2695 tree gfc_int8_type_node
= gfc_get_int_type (8);
2696 tree gfc_int16_type_node
= gfc_get_int_type (16);
2697 tree gfc_logical4_type_node
= gfc_get_logical_type (4);
2698 tree pchar1_type_node
= gfc_get_pchar_type (1);
2699 tree pchar4_type_node
= gfc_get_pchar_type (4);
2701 /* String functions. */
2702 gfor_fndecl_compare_string
= gfc_build_library_function_decl_with_spec (
2703 get_identifier (PREFIX("compare_string")), "..R.R",
2704 integer_type_node
, 4, gfc_charlen_type_node
, pchar1_type_node
,
2705 gfc_charlen_type_node
, pchar1_type_node
);
2706 DECL_PURE_P (gfor_fndecl_compare_string
) = 1;
2707 TREE_NOTHROW (gfor_fndecl_compare_string
) = 1;
2709 gfor_fndecl_concat_string
= gfc_build_library_function_decl_with_spec (
2710 get_identifier (PREFIX("concat_string")), "..W.R.R",
2711 void_type_node
, 6, gfc_charlen_type_node
, pchar1_type_node
,
2712 gfc_charlen_type_node
, pchar1_type_node
,
2713 gfc_charlen_type_node
, pchar1_type_node
);
2714 TREE_NOTHROW (gfor_fndecl_concat_string
) = 1;
2716 gfor_fndecl_string_len_trim
= gfc_build_library_function_decl_with_spec (
2717 get_identifier (PREFIX("string_len_trim")), "..R",
2718 gfc_charlen_type_node
, 2, gfc_charlen_type_node
, pchar1_type_node
);
2719 DECL_PURE_P (gfor_fndecl_string_len_trim
) = 1;
2720 TREE_NOTHROW (gfor_fndecl_string_len_trim
) = 1;
2722 gfor_fndecl_string_index
= gfc_build_library_function_decl_with_spec (
2723 get_identifier (PREFIX("string_index")), "..R.R.",
2724 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2725 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2726 DECL_PURE_P (gfor_fndecl_string_index
) = 1;
2727 TREE_NOTHROW (gfor_fndecl_string_index
) = 1;
2729 gfor_fndecl_string_scan
= gfc_build_library_function_decl_with_spec (
2730 get_identifier (PREFIX("string_scan")), "..R.R.",
2731 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2732 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2733 DECL_PURE_P (gfor_fndecl_string_scan
) = 1;
2734 TREE_NOTHROW (gfor_fndecl_string_scan
) = 1;
2736 gfor_fndecl_string_verify
= gfc_build_library_function_decl_with_spec (
2737 get_identifier (PREFIX("string_verify")), "..R.R.",
2738 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar1_type_node
,
2739 gfc_charlen_type_node
, pchar1_type_node
, gfc_logical4_type_node
);
2740 DECL_PURE_P (gfor_fndecl_string_verify
) = 1;
2741 TREE_NOTHROW (gfor_fndecl_string_verify
) = 1;
2743 gfor_fndecl_string_trim
= gfc_build_library_function_decl_with_spec (
2744 get_identifier (PREFIX("string_trim")), ".Ww.R",
2745 void_type_node
, 4, build_pointer_type (gfc_charlen_type_node
),
2746 build_pointer_type (pchar1_type_node
), gfc_charlen_type_node
,
2749 gfor_fndecl_string_minmax
= gfc_build_library_function_decl_with_spec (
2750 get_identifier (PREFIX("string_minmax")), ".Ww.R",
2751 void_type_node
, -4, build_pointer_type (gfc_charlen_type_node
),
2752 build_pointer_type (pchar1_type_node
), integer_type_node
,
2755 gfor_fndecl_adjustl
= gfc_build_library_function_decl_with_spec (
2756 get_identifier (PREFIX("adjustl")), ".W.R",
2757 void_type_node
, 3, pchar1_type_node
, gfc_charlen_type_node
,
2759 TREE_NOTHROW (gfor_fndecl_adjustl
) = 1;
2761 gfor_fndecl_adjustr
= gfc_build_library_function_decl_with_spec (
2762 get_identifier (PREFIX("adjustr")), ".W.R",
2763 void_type_node
, 3, pchar1_type_node
, gfc_charlen_type_node
,
2765 TREE_NOTHROW (gfor_fndecl_adjustr
) = 1;
2767 gfor_fndecl_select_string
= gfc_build_library_function_decl_with_spec (
2768 get_identifier (PREFIX("select_string")), ".R.R.",
2769 integer_type_node
, 4, pvoid_type_node
, integer_type_node
,
2770 pchar1_type_node
, gfc_charlen_type_node
);
2771 DECL_PURE_P (gfor_fndecl_select_string
) = 1;
2772 TREE_NOTHROW (gfor_fndecl_select_string
) = 1;
2774 gfor_fndecl_compare_string_char4
= gfc_build_library_function_decl_with_spec (
2775 get_identifier (PREFIX("compare_string_char4")), "..R.R",
2776 integer_type_node
, 4, gfc_charlen_type_node
, pchar4_type_node
,
2777 gfc_charlen_type_node
, pchar4_type_node
);
2778 DECL_PURE_P (gfor_fndecl_compare_string_char4
) = 1;
2779 TREE_NOTHROW (gfor_fndecl_compare_string_char4
) = 1;
2781 gfor_fndecl_concat_string_char4
= gfc_build_library_function_decl_with_spec (
2782 get_identifier (PREFIX("concat_string_char4")), "..W.R.R",
2783 void_type_node
, 6, gfc_charlen_type_node
, pchar4_type_node
,
2784 gfc_charlen_type_node
, pchar4_type_node
, gfc_charlen_type_node
,
2786 TREE_NOTHROW (gfor_fndecl_concat_string_char4
) = 1;
2788 gfor_fndecl_string_len_trim_char4
= gfc_build_library_function_decl_with_spec (
2789 get_identifier (PREFIX("string_len_trim_char4")), "..R",
2790 gfc_charlen_type_node
, 2, gfc_charlen_type_node
, pchar4_type_node
);
2791 DECL_PURE_P (gfor_fndecl_string_len_trim_char4
) = 1;
2792 TREE_NOTHROW (gfor_fndecl_string_len_trim_char4
) = 1;
2794 gfor_fndecl_string_index_char4
= gfc_build_library_function_decl_with_spec (
2795 get_identifier (PREFIX("string_index_char4")), "..R.R.",
2796 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2797 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2798 DECL_PURE_P (gfor_fndecl_string_index_char4
) = 1;
2799 TREE_NOTHROW (gfor_fndecl_string_index_char4
) = 1;
2801 gfor_fndecl_string_scan_char4
= gfc_build_library_function_decl_with_spec (
2802 get_identifier (PREFIX("string_scan_char4")), "..R.R.",
2803 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2804 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2805 DECL_PURE_P (gfor_fndecl_string_scan_char4
) = 1;
2806 TREE_NOTHROW (gfor_fndecl_string_scan_char4
) = 1;
2808 gfor_fndecl_string_verify_char4
= gfc_build_library_function_decl_with_spec (
2809 get_identifier (PREFIX("string_verify_char4")), "..R.R.",
2810 gfc_charlen_type_node
, 5, gfc_charlen_type_node
, pchar4_type_node
,
2811 gfc_charlen_type_node
, pchar4_type_node
, gfc_logical4_type_node
);
2812 DECL_PURE_P (gfor_fndecl_string_verify_char4
) = 1;
2813 TREE_NOTHROW (gfor_fndecl_string_verify_char4
) = 1;
2815 gfor_fndecl_string_trim_char4
= gfc_build_library_function_decl_with_spec (
2816 get_identifier (PREFIX("string_trim_char4")), ".Ww.R",
2817 void_type_node
, 4, build_pointer_type (gfc_charlen_type_node
),
2818 build_pointer_type (pchar4_type_node
), gfc_charlen_type_node
,
2821 gfor_fndecl_string_minmax_char4
= gfc_build_library_function_decl_with_spec (
2822 get_identifier (PREFIX("string_minmax_char4")), ".Ww.R",
2823 void_type_node
, -4, build_pointer_type (gfc_charlen_type_node
),
2824 build_pointer_type (pchar4_type_node
), integer_type_node
,
2827 gfor_fndecl_adjustl_char4
= gfc_build_library_function_decl_with_spec (
2828 get_identifier (PREFIX("adjustl_char4")), ".W.R",
2829 void_type_node
, 3, pchar4_type_node
, gfc_charlen_type_node
,
2831 TREE_NOTHROW (gfor_fndecl_adjustl_char4
) = 1;
2833 gfor_fndecl_adjustr_char4
= gfc_build_library_function_decl_with_spec (
2834 get_identifier (PREFIX("adjustr_char4")), ".W.R",
2835 void_type_node
, 3, pchar4_type_node
, gfc_charlen_type_node
,
2837 TREE_NOTHROW (gfor_fndecl_adjustr_char4
) = 1;
2839 gfor_fndecl_select_string_char4
= gfc_build_library_function_decl_with_spec (
2840 get_identifier (PREFIX("select_string_char4")), ".R.R.",
2841 integer_type_node
, 4, pvoid_type_node
, integer_type_node
,
2842 pvoid_type_node
, gfc_charlen_type_node
);
2843 DECL_PURE_P (gfor_fndecl_select_string_char4
) = 1;
2844 TREE_NOTHROW (gfor_fndecl_select_string_char4
) = 1;
2847 /* Conversion between character kinds. */
2849 gfor_fndecl_convert_char1_to_char4
= gfc_build_library_function_decl_with_spec (
2850 get_identifier (PREFIX("convert_char1_to_char4")), ".w.R",
2851 void_type_node
, 3, build_pointer_type (pchar4_type_node
),
2852 gfc_charlen_type_node
, pchar1_type_node
);
2854 gfor_fndecl_convert_char4_to_char1
= gfc_build_library_function_decl_with_spec (
2855 get_identifier (PREFIX("convert_char4_to_char1")), ".w.R",
2856 void_type_node
, 3, build_pointer_type (pchar1_type_node
),
2857 gfc_charlen_type_node
, pchar4_type_node
);
2859 /* Misc. functions. */
2861 gfor_fndecl_ttynam
= gfc_build_library_function_decl_with_spec (
2862 get_identifier (PREFIX("ttynam")), ".W",
2863 void_type_node
, 3, pchar_type_node
, gfc_charlen_type_node
,
2866 gfor_fndecl_fdate
= gfc_build_library_function_decl_with_spec (
2867 get_identifier (PREFIX("fdate")), ".W",
2868 void_type_node
, 2, pchar_type_node
, gfc_charlen_type_node
);
2870 gfor_fndecl_ctime
= gfc_build_library_function_decl_with_spec (
2871 get_identifier (PREFIX("ctime")), ".W",
2872 void_type_node
, 3, pchar_type_node
, gfc_charlen_type_node
,
2873 gfc_int8_type_node
);
2875 gfor_fndecl_sc_kind
= gfc_build_library_function_decl_with_spec (
2876 get_identifier (PREFIX("selected_char_kind")), "..R",
2877 gfc_int4_type_node
, 2, gfc_charlen_type_node
, pchar_type_node
);
2878 DECL_PURE_P (gfor_fndecl_sc_kind
) = 1;
2879 TREE_NOTHROW (gfor_fndecl_sc_kind
) = 1;
2881 gfor_fndecl_si_kind
= gfc_build_library_function_decl_with_spec (
2882 get_identifier (PREFIX("selected_int_kind")), ".R",
2883 gfc_int4_type_node
, 1, pvoid_type_node
);
2884 DECL_PURE_P (gfor_fndecl_si_kind
) = 1;
2885 TREE_NOTHROW (gfor_fndecl_si_kind
) = 1;
2887 gfor_fndecl_sr_kind
= gfc_build_library_function_decl_with_spec (
2888 get_identifier (PREFIX("selected_real_kind2008")), ".RR",
2889 gfc_int4_type_node
, 3, pvoid_type_node
, pvoid_type_node
,
2891 DECL_PURE_P (gfor_fndecl_sr_kind
) = 1;
2892 TREE_NOTHROW (gfor_fndecl_sr_kind
) = 1;
2894 /* Power functions. */
2896 tree ctype
, rtype
, itype
, jtype
;
2897 int rkind
, ikind
, jkind
;
2900 static int ikinds
[NIKINDS
] = {4, 8, 16};
2901 static int rkinds
[NRKINDS
] = {4, 8, 10, 16};
2902 char name
[PREFIX_LEN
+ 12]; /* _gfortran_pow_?n_?n */
2904 for (ikind
=0; ikind
< NIKINDS
; ikind
++)
2906 itype
= gfc_get_int_type (ikinds
[ikind
]);
2908 for (jkind
=0; jkind
< NIKINDS
; jkind
++)
2910 jtype
= gfc_get_int_type (ikinds
[jkind
]);
2913 sprintf(name
, PREFIX("pow_i%d_i%d"), ikinds
[ikind
],
2915 gfor_fndecl_math_powi
[jkind
][ikind
].integer
=
2916 gfc_build_library_function_decl (get_identifier (name
),
2917 jtype
, 2, jtype
, itype
);
2918 TREE_READONLY (gfor_fndecl_math_powi
[jkind
][ikind
].integer
) = 1;
2919 TREE_NOTHROW (gfor_fndecl_math_powi
[jkind
][ikind
].integer
) = 1;
2923 for (rkind
= 0; rkind
< NRKINDS
; rkind
++)
2925 rtype
= gfc_get_real_type (rkinds
[rkind
]);
2928 sprintf(name
, PREFIX("pow_r%d_i%d"), rkinds
[rkind
],
2930 gfor_fndecl_math_powi
[rkind
][ikind
].real
=
2931 gfc_build_library_function_decl (get_identifier (name
),
2932 rtype
, 2, rtype
, itype
);
2933 TREE_READONLY (gfor_fndecl_math_powi
[rkind
][ikind
].real
) = 1;
2934 TREE_NOTHROW (gfor_fndecl_math_powi
[rkind
][ikind
].real
) = 1;
2937 ctype
= gfc_get_complex_type (rkinds
[rkind
]);
2940 sprintf(name
, PREFIX("pow_c%d_i%d"), rkinds
[rkind
],
2942 gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
=
2943 gfc_build_library_function_decl (get_identifier (name
),
2944 ctype
, 2,ctype
, itype
);
2945 TREE_READONLY (gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
) = 1;
2946 TREE_NOTHROW (gfor_fndecl_math_powi
[rkind
][ikind
].cmplx
) = 1;
2954 gfor_fndecl_math_ishftc4
= gfc_build_library_function_decl (
2955 get_identifier (PREFIX("ishftc4")),
2956 gfc_int4_type_node
, 3, gfc_int4_type_node
, gfc_int4_type_node
,
2957 gfc_int4_type_node
);
2958 TREE_READONLY (gfor_fndecl_math_ishftc4
) = 1;
2959 TREE_NOTHROW (gfor_fndecl_math_ishftc4
) = 1;
2961 gfor_fndecl_math_ishftc8
= gfc_build_library_function_decl (
2962 get_identifier (PREFIX("ishftc8")),
2963 gfc_int8_type_node
, 3, gfc_int8_type_node
, gfc_int4_type_node
,
2964 gfc_int4_type_node
);
2965 TREE_READONLY (gfor_fndecl_math_ishftc8
) = 1;
2966 TREE_NOTHROW (gfor_fndecl_math_ishftc8
) = 1;
2968 if (gfc_int16_type_node
)
2970 gfor_fndecl_math_ishftc16
= gfc_build_library_function_decl (
2971 get_identifier (PREFIX("ishftc16")),
2972 gfc_int16_type_node
, 3, gfc_int16_type_node
, gfc_int4_type_node
,
2973 gfc_int4_type_node
);
2974 TREE_READONLY (gfor_fndecl_math_ishftc16
) = 1;
2975 TREE_NOTHROW (gfor_fndecl_math_ishftc16
) = 1;
2978 /* BLAS functions. */
2980 tree pint
= build_pointer_type (integer_type_node
);
2981 tree ps
= build_pointer_type (gfc_get_real_type (gfc_default_real_kind
));
2982 tree pd
= build_pointer_type (gfc_get_real_type (gfc_default_double_kind
));
2983 tree pc
= build_pointer_type (gfc_get_complex_type (gfc_default_real_kind
));
2984 tree pz
= build_pointer_type
2985 (gfc_get_complex_type (gfc_default_double_kind
));
2987 gfor_fndecl_sgemm
= gfc_build_library_function_decl
2989 (gfc_option
.flag_underscoring
? "sgemm_"
2991 void_type_node
, 15, pchar_type_node
,
2992 pchar_type_node
, pint
, pint
, pint
, ps
, ps
, pint
,
2993 ps
, pint
, ps
, ps
, pint
, integer_type_node
,
2995 gfor_fndecl_dgemm
= gfc_build_library_function_decl
2997 (gfc_option
.flag_underscoring
? "dgemm_"
2999 void_type_node
, 15, pchar_type_node
,
3000 pchar_type_node
, pint
, pint
, pint
, pd
, pd
, pint
,
3001 pd
, pint
, pd
, pd
, pint
, integer_type_node
,
3003 gfor_fndecl_cgemm
= gfc_build_library_function_decl
3005 (gfc_option
.flag_underscoring
? "cgemm_"
3007 void_type_node
, 15, pchar_type_node
,
3008 pchar_type_node
, pint
, pint
, pint
, pc
, pc
, pint
,
3009 pc
, pint
, pc
, pc
, pint
, integer_type_node
,
3011 gfor_fndecl_zgemm
= gfc_build_library_function_decl
3013 (gfc_option
.flag_underscoring
? "zgemm_"
3015 void_type_node
, 15, pchar_type_node
,
3016 pchar_type_node
, pint
, pint
, pint
, pz
, pz
, pint
,
3017 pz
, pint
, pz
, pz
, pint
, integer_type_node
,
3021 /* Other functions. */
3022 gfor_fndecl_size0
= gfc_build_library_function_decl_with_spec (
3023 get_identifier (PREFIX("size0")), ".R",
3024 gfc_array_index_type
, 1, pvoid_type_node
);
3025 DECL_PURE_P (gfor_fndecl_size0
) = 1;
3026 TREE_NOTHROW (gfor_fndecl_size0
) = 1;
3028 gfor_fndecl_size1
= gfc_build_library_function_decl_with_spec (
3029 get_identifier (PREFIX("size1")), ".R",
3030 gfc_array_index_type
, 2, pvoid_type_node
, gfc_array_index_type
);
3031 DECL_PURE_P (gfor_fndecl_size1
) = 1;
3032 TREE_NOTHROW (gfor_fndecl_size1
) = 1;
3034 gfor_fndecl_iargc
= gfc_build_library_function_decl (
3035 get_identifier (PREFIX ("iargc")), gfc_int4_type_node
, 0);
3036 TREE_NOTHROW (gfor_fndecl_iargc
) = 1;
3040 /* Make prototypes for runtime library functions. */
3043 gfc_build_builtin_function_decls (void)
3045 tree gfc_int4_type_node
= gfc_get_int_type (4);
3047 gfor_fndecl_stop_numeric
= gfc_build_library_function_decl (
3048 get_identifier (PREFIX("stop_numeric")),
3049 void_type_node
, 1, gfc_int4_type_node
);
3050 /* STOP doesn't return. */
3051 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric
) = 1;
3053 gfor_fndecl_stop_numeric_f08
= gfc_build_library_function_decl (
3054 get_identifier (PREFIX("stop_numeric_f08")),
3055 void_type_node
, 1, gfc_int4_type_node
);
3056 /* STOP doesn't return. */
3057 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08
) = 1;
3059 gfor_fndecl_stop_string
= gfc_build_library_function_decl_with_spec (
3060 get_identifier (PREFIX("stop_string")), ".R.",
3061 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3062 /* STOP doesn't return. */
3063 TREE_THIS_VOLATILE (gfor_fndecl_stop_string
) = 1;
3065 gfor_fndecl_error_stop_numeric
= gfc_build_library_function_decl (
3066 get_identifier (PREFIX("error_stop_numeric")),
3067 void_type_node
, 1, gfc_int4_type_node
);
3068 /* ERROR STOP doesn't return. */
3069 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric
) = 1;
3071 gfor_fndecl_error_stop_string
= gfc_build_library_function_decl_with_spec (
3072 get_identifier (PREFIX("error_stop_string")), ".R.",
3073 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3074 /* ERROR STOP doesn't return. */
3075 TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string
) = 1;
3077 gfor_fndecl_pause_numeric
= gfc_build_library_function_decl (
3078 get_identifier (PREFIX("pause_numeric")),
3079 void_type_node
, 1, gfc_int4_type_node
);
3081 gfor_fndecl_pause_string
= gfc_build_library_function_decl_with_spec (
3082 get_identifier (PREFIX("pause_string")), ".R.",
3083 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3085 gfor_fndecl_runtime_error
= gfc_build_library_function_decl_with_spec (
3086 get_identifier (PREFIX("runtime_error")), ".R",
3087 void_type_node
, -1, pchar_type_node
);
3088 /* The runtime_error function does not return. */
3089 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error
) = 1;
3091 gfor_fndecl_runtime_error_at
= gfc_build_library_function_decl_with_spec (
3092 get_identifier (PREFIX("runtime_error_at")), ".RR",
3093 void_type_node
, -2, pchar_type_node
, pchar_type_node
);
3094 /* The runtime_error_at function does not return. */
3095 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at
) = 1;
3097 gfor_fndecl_runtime_warning_at
= gfc_build_library_function_decl_with_spec (
3098 get_identifier (PREFIX("runtime_warning_at")), ".RR",
3099 void_type_node
, -2, pchar_type_node
, pchar_type_node
);
3101 gfor_fndecl_generate_error
= gfc_build_library_function_decl_with_spec (
3102 get_identifier (PREFIX("generate_error")), ".R.R",
3103 void_type_node
, 3, pvoid_type_node
, integer_type_node
,
3106 gfor_fndecl_os_error
= gfc_build_library_function_decl_with_spec (
3107 get_identifier (PREFIX("os_error")), ".R",
3108 void_type_node
, 1, pchar_type_node
);
3109 /* The runtime_error function does not return. */
3110 TREE_THIS_VOLATILE (gfor_fndecl_os_error
) = 1;
3112 gfor_fndecl_set_args
= gfc_build_library_function_decl (
3113 get_identifier (PREFIX("set_args")),
3114 void_type_node
, 2, integer_type_node
,
3115 build_pointer_type (pchar_type_node
));
3117 gfor_fndecl_set_fpe
= gfc_build_library_function_decl (
3118 get_identifier (PREFIX("set_fpe")),
3119 void_type_node
, 1, integer_type_node
);
3121 /* Keep the array dimension in sync with the call, later in this file. */
3122 gfor_fndecl_set_options
= gfc_build_library_function_decl_with_spec (
3123 get_identifier (PREFIX("set_options")), "..R",
3124 void_type_node
, 2, integer_type_node
,
3125 build_pointer_type (integer_type_node
));
3127 gfor_fndecl_set_convert
= gfc_build_library_function_decl (
3128 get_identifier (PREFIX("set_convert")),
3129 void_type_node
, 1, integer_type_node
);
3131 gfor_fndecl_set_record_marker
= gfc_build_library_function_decl (
3132 get_identifier (PREFIX("set_record_marker")),
3133 void_type_node
, 1, integer_type_node
);
3135 gfor_fndecl_set_max_subrecord_length
= gfc_build_library_function_decl (
3136 get_identifier (PREFIX("set_max_subrecord_length")),
3137 void_type_node
, 1, integer_type_node
);
3139 gfor_fndecl_in_pack
= gfc_build_library_function_decl_with_spec (
3140 get_identifier (PREFIX("internal_pack")), ".r",
3141 pvoid_type_node
, 1, pvoid_type_node
);
3143 gfor_fndecl_in_unpack
= gfc_build_library_function_decl_with_spec (
3144 get_identifier (PREFIX("internal_unpack")), ".wR",
3145 void_type_node
, 2, pvoid_type_node
, pvoid_type_node
);
3147 gfor_fndecl_associated
= gfc_build_library_function_decl_with_spec (
3148 get_identifier (PREFIX("associated")), ".RR",
3149 integer_type_node
, 2, ppvoid_type_node
, ppvoid_type_node
);
3150 DECL_PURE_P (gfor_fndecl_associated
) = 1;
3151 TREE_NOTHROW (gfor_fndecl_associated
) = 1;
3153 /* Coarray library calls. */
3154 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
3156 tree pint_type
, pppchar_type
;
3158 pint_type
= build_pointer_type (integer_type_node
);
3160 = build_pointer_type (build_pointer_type (pchar_type_node
));
3162 gfor_fndecl_caf_init
= gfc_build_library_function_decl (
3163 get_identifier (PREFIX("caf_init")), void_type_node
,
3164 4, pint_type
, pppchar_type
, pint_type
, pint_type
);
3166 gfor_fndecl_caf_finalize
= gfc_build_library_function_decl (
3167 get_identifier (PREFIX("caf_finalize")), void_type_node
, 0);
3169 gfor_fndecl_caf_register
= gfc_build_library_function_decl_with_spec (
3170 get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node
, 6,
3171 size_type_node
, integer_type_node
, ppvoid_type_node
, pint_type
,
3172 pchar_type_node
, integer_type_node
);
3174 gfor_fndecl_caf_deregister
= gfc_build_library_function_decl_with_spec (
3175 get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node
, 4,
3176 ppvoid_type_node
, pint_type
, pchar_type_node
, integer_type_node
);
3178 gfor_fndecl_caf_critical
= gfc_build_library_function_decl (
3179 get_identifier (PREFIX("caf_critical")), void_type_node
, 0);
3181 gfor_fndecl_caf_end_critical
= gfc_build_library_function_decl (
3182 get_identifier (PREFIX("caf_end_critical")), void_type_node
, 0);
3184 gfor_fndecl_caf_sync_all
= gfc_build_library_function_decl_with_spec (
3185 get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node
,
3186 3, pint_type
, build_pointer_type (pchar_type_node
), integer_type_node
);
3188 gfor_fndecl_caf_sync_images
= gfc_build_library_function_decl_with_spec (
3189 get_identifier (PREFIX("caf_sync_images")), ".RRWW", void_type_node
,
3190 5, integer_type_node
, pint_type
, pint_type
,
3191 build_pointer_type (pchar_type_node
), integer_type_node
);
3193 gfor_fndecl_caf_error_stop
= gfc_build_library_function_decl (
3194 get_identifier (PREFIX("caf_error_stop")),
3195 void_type_node
, 1, gfc_int4_type_node
);
3196 /* CAF's ERROR STOP doesn't return. */
3197 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop
) = 1;
3199 gfor_fndecl_caf_error_stop_str
= gfc_build_library_function_decl_with_spec (
3200 get_identifier (PREFIX("caf_error_stop_str")), ".R.",
3201 void_type_node
, 2, pchar_type_node
, gfc_int4_type_node
);
3202 /* CAF's ERROR STOP doesn't return. */
3203 TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str
) = 1;
3206 gfc_build_intrinsic_function_decls ();
3207 gfc_build_intrinsic_lib_fndecls ();
3208 gfc_build_io_library_fndecls ();
3212 /* Evaluate the length of dummy character variables. */
3215 gfc_trans_dummy_character (gfc_symbol
*sym
, gfc_charlen
*cl
,
3216 gfc_wrapped_block
*block
)
3220 gfc_finish_decl (cl
->backend_decl
);
3222 gfc_start_block (&init
);
3224 /* Evaluate the string length expression. */
3225 gfc_conv_string_length (cl
, NULL
, &init
);
3227 gfc_trans_vla_type_sizes (sym
, &init
);
3229 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3233 /* Allocate and cleanup an automatic character variable. */
3236 gfc_trans_auto_character_variable (gfc_symbol
* sym
, gfc_wrapped_block
* block
)
3242 gcc_assert (sym
->backend_decl
);
3243 gcc_assert (sym
->ts
.u
.cl
&& sym
->ts
.u
.cl
->length
);
3245 gfc_init_block (&init
);
3247 /* Evaluate the string length expression. */
3248 gfc_conv_string_length (sym
->ts
.u
.cl
, NULL
, &init
);
3250 gfc_trans_vla_type_sizes (sym
, &init
);
3252 decl
= sym
->backend_decl
;
3254 /* Emit a DECL_EXPR for this variable, which will cause the
3255 gimplifier to allocate storage, and all that good stuff. */
3256 tmp
= fold_build1_loc (input_location
, DECL_EXPR
, TREE_TYPE (decl
), decl
);
3257 gfc_add_expr_to_block (&init
, tmp
);
3259 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3262 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
3265 gfc_trans_assign_aux_var (gfc_symbol
* sym
, gfc_wrapped_block
* block
)
3269 gcc_assert (sym
->backend_decl
);
3270 gfc_start_block (&init
);
3272 /* Set the initial value to length. See the comments in
3273 function gfc_add_assign_aux_vars in this file. */
3274 gfc_add_modify (&init
, GFC_DECL_STRING_LEN (sym
->backend_decl
),
3275 build_int_cst (gfc_charlen_type_node
, -2));
3277 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3281 gfc_trans_vla_one_sizepos (tree
*tp
, stmtblock_t
*body
)
3283 tree t
= *tp
, var
, val
;
3285 if (t
== NULL
|| t
== error_mark_node
)
3287 if (TREE_CONSTANT (t
) || DECL_P (t
))
3290 if (TREE_CODE (t
) == SAVE_EXPR
)
3292 if (SAVE_EXPR_RESOLVED_P (t
))
3294 *tp
= TREE_OPERAND (t
, 0);
3297 val
= TREE_OPERAND (t
, 0);
3302 var
= gfc_create_var_np (TREE_TYPE (t
), NULL
);
3303 gfc_add_decl_to_function (var
);
3304 gfc_add_modify (body
, var
, val
);
3305 if (TREE_CODE (t
) == SAVE_EXPR
)
3306 TREE_OPERAND (t
, 0) = var
;
3311 gfc_trans_vla_type_sizes_1 (tree type
, stmtblock_t
*body
)
3315 if (type
== NULL
|| type
== error_mark_node
)
3318 type
= TYPE_MAIN_VARIANT (type
);
3320 if (TREE_CODE (type
) == INTEGER_TYPE
)
3322 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type
), body
);
3323 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type
), body
);
3325 for (t
= TYPE_NEXT_VARIANT (type
); t
; t
= TYPE_NEXT_VARIANT (t
))
3327 TYPE_MIN_VALUE (t
) = TYPE_MIN_VALUE (type
);
3328 TYPE_MAX_VALUE (t
) = TYPE_MAX_VALUE (type
);
3331 else if (TREE_CODE (type
) == ARRAY_TYPE
)
3333 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type
), body
);
3334 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type
), body
);
3335 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type
), body
);
3336 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type
), body
);
3338 for (t
= TYPE_NEXT_VARIANT (type
); t
; t
= TYPE_NEXT_VARIANT (t
))
3340 TYPE_SIZE (t
) = TYPE_SIZE (type
);
3341 TYPE_SIZE_UNIT (t
) = TYPE_SIZE_UNIT (type
);
3346 /* Make sure all type sizes and array domains are either constant,
3347 or variable or parameter decls. This is a simplified variant
3348 of gimplify_type_sizes, but we can't use it here, as none of the
3349 variables in the expressions have been gimplified yet.
3350 As type sizes and domains for various variable length arrays
3351 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
3352 time, without this routine gimplify_type_sizes in the middle-end
3353 could result in the type sizes being gimplified earlier than where
3354 those variables are initialized. */
3357 gfc_trans_vla_type_sizes (gfc_symbol
*sym
, stmtblock_t
*body
)
3359 tree type
= TREE_TYPE (sym
->backend_decl
);
3361 if (TREE_CODE (type
) == FUNCTION_TYPE
3362 && (sym
->attr
.function
|| sym
->attr
.result
|| sym
->attr
.entry
))
3364 if (! current_fake_result_decl
)
3367 type
= TREE_TYPE (TREE_VALUE (current_fake_result_decl
));
3370 while (POINTER_TYPE_P (type
))
3371 type
= TREE_TYPE (type
);
3373 if (GFC_DESCRIPTOR_TYPE_P (type
))
3375 tree etype
= GFC_TYPE_ARRAY_DATAPTR_TYPE (type
);
3377 while (POINTER_TYPE_P (etype
))
3378 etype
= TREE_TYPE (etype
);
3380 gfc_trans_vla_type_sizes_1 (etype
, body
);
3383 gfc_trans_vla_type_sizes_1 (type
, body
);
3387 /* Initialize a derived type by building an lvalue from the symbol
3388 and using trans_assignment to do the work. Set dealloc to false
3389 if no deallocation prior the assignment is needed. */
3391 gfc_init_default_dt (gfc_symbol
* sym
, stmtblock_t
* block
, bool dealloc
)
3399 gcc_assert (!sym
->attr
.allocatable
);
3400 gfc_set_sym_referenced (sym
);
3401 e
= gfc_lval_expr_from_sym (sym
);
3402 tmp
= gfc_trans_assignment (e
, sym
->value
, false, dealloc
);
3403 if (sym
->attr
.dummy
&& (sym
->attr
.optional
3404 || sym
->ns
->proc_name
->attr
.entry_master
))
3406 present
= gfc_conv_expr_present (sym
);
3407 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
), present
,
3408 tmp
, build_empty_stmt (input_location
));
3410 gfc_add_expr_to_block (block
, tmp
);
3415 /* Initialize INTENT(OUT) derived type dummies. As well as giving
3416 them their default initializer, if they do not have allocatable
3417 components, they have their allocatable components deallocated. */
3420 init_intent_out_dt (gfc_symbol
* proc_sym
, gfc_wrapped_block
* block
)
3423 gfc_formal_arglist
*f
;
3427 gfc_init_block (&init
);
3428 for (f
= proc_sym
->formal
; f
; f
= f
->next
)
3429 if (f
->sym
&& f
->sym
->attr
.intent
== INTENT_OUT
3430 && !f
->sym
->attr
.pointer
3431 && f
->sym
->ts
.type
== BT_DERIVED
)
3433 if (f
->sym
->ts
.u
.derived
->attr
.alloc_comp
&& !f
->sym
->value
)
3435 tmp
= gfc_deallocate_alloc_comp (f
->sym
->ts
.u
.derived
,
3436 f
->sym
->backend_decl
,
3437 f
->sym
->as
? f
->sym
->as
->rank
: 0);
3439 if (f
->sym
->attr
.optional
3440 || f
->sym
->ns
->proc_name
->attr
.entry_master
)
3442 present
= gfc_conv_expr_present (f
->sym
);
3443 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
),
3445 build_empty_stmt (input_location
));
3448 gfc_add_expr_to_block (&init
, tmp
);
3450 else if (f
->sym
->value
)
3451 gfc_init_default_dt (f
->sym
, &init
, true);
3453 else if (f
->sym
&& f
->sym
->attr
.intent
== INTENT_OUT
3454 && f
->sym
->ts
.type
== BT_CLASS
3455 && !CLASS_DATA (f
->sym
)->attr
.class_pointer
3456 && CLASS_DATA (f
->sym
)->ts
.u
.derived
->attr
.alloc_comp
)
3458 tree decl
= build_fold_indirect_ref_loc (input_location
,
3459 f
->sym
->backend_decl
);
3460 tmp
= CLASS_DATA (f
->sym
)->backend_decl
;
3461 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
3462 TREE_TYPE (tmp
), decl
, tmp
, NULL_TREE
);
3463 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3464 tmp
= gfc_deallocate_alloc_comp (CLASS_DATA (f
->sym
)->ts
.u
.derived
,
3466 CLASS_DATA (f
->sym
)->as
?
3467 CLASS_DATA (f
->sym
)->as
->rank
: 0);
3469 if (f
->sym
->attr
.optional
|| f
->sym
->ns
->proc_name
->attr
.entry_master
)
3471 present
= gfc_conv_expr_present (f
->sym
);
3472 tmp
= build3_loc (input_location
, COND_EXPR
, TREE_TYPE (tmp
),
3474 build_empty_stmt (input_location
));
3477 gfc_add_expr_to_block (&init
, tmp
);
3480 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), NULL_TREE
);
3484 /* Generate function entry and exit code, and add it to the function body.
3486 Allocation and initialization of array variables.
3487 Allocation of character string variables.
3488 Initialization and possibly repacking of dummy arrays.
3489 Initialization of ASSIGN statement auxiliary variable.
3490 Initialization of ASSOCIATE names.
3491 Automatic deallocation. */
3494 gfc_trans_deferred_vars (gfc_symbol
* proc_sym
, gfc_wrapped_block
* block
)
3498 gfc_formal_arglist
*f
;
3499 stmtblock_t tmpblock
;
3500 bool seen_trans_deferred_array
= false;
3506 /* Deal with implicit return variables. Explicit return variables will
3507 already have been added. */
3508 if (gfc_return_by_reference (proc_sym
) && proc_sym
->result
== proc_sym
)
3510 if (!current_fake_result_decl
)
3512 gfc_entry_list
*el
= NULL
;
3513 if (proc_sym
->attr
.entry_master
)
3515 for (el
= proc_sym
->ns
->entries
; el
; el
= el
->next
)
3516 if (el
->sym
!= el
->sym
->result
)
3519 /* TODO: move to the appropriate place in resolve.c. */
3520 if (warn_return_type
&& el
== NULL
)
3521 gfc_warning ("Return value of function '%s' at %L not set",
3522 proc_sym
->name
, &proc_sym
->declared_at
);
3524 else if (proc_sym
->as
)
3526 tree result
= TREE_VALUE (current_fake_result_decl
);
3527 gfc_trans_dummy_array_bias (proc_sym
, result
, block
);
3529 /* An automatic character length, pointer array result. */
3530 if (proc_sym
->ts
.type
== BT_CHARACTER
3531 && TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
3532 gfc_trans_dummy_character (proc_sym
, proc_sym
->ts
.u
.cl
, block
);
3534 else if (proc_sym
->ts
.type
== BT_CHARACTER
)
3536 if (proc_sym
->ts
.deferred
)
3539 gfc_save_backend_locus (&loc
);
3540 gfc_set_backend_locus (&proc_sym
->declared_at
);
3541 gfc_start_block (&init
);
3542 /* Zero the string length on entry. */
3543 gfc_add_modify (&init
, proc_sym
->ts
.u
.cl
->backend_decl
,
3544 build_int_cst (gfc_charlen_type_node
, 0));
3545 /* Null the pointer. */
3546 e
= gfc_lval_expr_from_sym (proc_sym
);
3547 gfc_init_se (&se
, NULL
);
3548 se
.want_pointer
= 1;
3549 gfc_conv_expr (&se
, e
);
3552 gfc_add_modify (&init
, tmp
,
3553 fold_convert (TREE_TYPE (se
.expr
),
3554 null_pointer_node
));
3555 gfc_restore_backend_locus (&loc
);
3557 /* Pass back the string length on exit. */
3558 tmp
= proc_sym
->ts
.u
.cl
->passed_length
;
3559 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3560 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3561 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3562 gfc_charlen_type_node
, tmp
,
3563 proc_sym
->ts
.u
.cl
->backend_decl
);
3564 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3566 else if (TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
3567 gfc_trans_dummy_character (proc_sym
, proc_sym
->ts
.u
.cl
, block
);
3570 gcc_assert (gfc_option
.flag_f2c
3571 && proc_sym
->ts
.type
== BT_COMPLEX
);
3574 /* Initialize the INTENT(OUT) derived type dummy arguments. This
3575 should be done here so that the offsets and lbounds of arrays
3577 gfc_save_backend_locus (&loc
);
3578 gfc_set_backend_locus (&proc_sym
->declared_at
);
3579 init_intent_out_dt (proc_sym
, block
);
3580 gfc_restore_backend_locus (&loc
);
3582 for (sym
= proc_sym
->tlink
; sym
!= proc_sym
; sym
= sym
->tlink
)
3584 bool sym_has_alloc_comp
= (sym
->ts
.type
== BT_DERIVED
)
3585 && sym
->ts
.u
.derived
->attr
.alloc_comp
;
3589 if (sym
->attr
.subref_array_pointer
3590 && GFC_DECL_SPAN (sym
->backend_decl
)
3591 && !TREE_STATIC (GFC_DECL_SPAN (sym
->backend_decl
)))
3593 gfc_init_block (&tmpblock
);
3594 gfc_add_modify (&tmpblock
, GFC_DECL_SPAN (sym
->backend_decl
),
3595 build_int_cst (gfc_array_index_type
, 0));
3596 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3600 if (sym
->attr
.dimension
|| sym
->attr
.codimension
)
3602 /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT. */
3603 array_type tmp
= sym
->as
->type
;
3604 if (tmp
== AS_ASSUMED_SIZE
&& sym
->as
->cp_was_assumed
)
3609 if (sym
->attr
.dummy
|| sym
->attr
.result
)
3610 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, block
);
3611 else if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
3613 if (TREE_STATIC (sym
->backend_decl
))
3615 gfc_save_backend_locus (&loc
);
3616 gfc_set_backend_locus (&sym
->declared_at
);
3617 gfc_trans_static_array_pointer (sym
);
3618 gfc_restore_backend_locus (&loc
);
3622 seen_trans_deferred_array
= true;
3623 gfc_trans_deferred_array (sym
, block
);
3626 else if (sym
->attr
.codimension
&& TREE_STATIC (sym
->backend_decl
))
3628 gfc_init_block (&tmpblock
);
3629 gfc_trans_array_cobounds (TREE_TYPE (sym
->backend_decl
),
3631 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3635 else if (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
3637 gfc_save_backend_locus (&loc
);
3638 gfc_set_backend_locus (&sym
->declared_at
);
3640 if (sym_has_alloc_comp
)
3642 seen_trans_deferred_array
= true;
3643 gfc_trans_deferred_array (sym
, block
);
3645 else if (sym
->ts
.type
== BT_DERIVED
3648 && sym
->attr
.save
== SAVE_NONE
)
3650 gfc_start_block (&tmpblock
);
3651 gfc_init_default_dt (sym
, &tmpblock
, false);
3652 gfc_add_init_cleanup (block
,
3653 gfc_finish_block (&tmpblock
),
3657 gfc_trans_auto_array_allocation (sym
->backend_decl
,
3659 gfc_restore_backend_locus (&loc
);
3663 case AS_ASSUMED_SIZE
:
3664 /* Must be a dummy parameter. */
3665 gcc_assert (sym
->attr
.dummy
|| sym
->as
->cp_was_assumed
);
3667 /* We should always pass assumed size arrays the g77 way. */
3668 if (sym
->attr
.dummy
)
3669 gfc_trans_g77_array (sym
, block
);
3672 case AS_ASSUMED_SHAPE
:
3673 /* Must be a dummy parameter. */
3674 gcc_assert (sym
->attr
.dummy
);
3676 gfc_trans_dummy_array_bias (sym
, sym
->backend_decl
, block
);
3680 seen_trans_deferred_array
= true;
3681 gfc_trans_deferred_array (sym
, block
);
3687 if (sym_has_alloc_comp
&& !seen_trans_deferred_array
)
3688 gfc_trans_deferred_array (sym
, block
);
3690 else if ((!sym
->attr
.dummy
|| sym
->ts
.deferred
)
3691 && (sym
->ts
.type
== BT_CLASS
3692 && CLASS_DATA (sym
)->attr
.class_pointer
))
3694 else if ((!sym
->attr
.dummy
|| sym
->ts
.deferred
)
3695 && (sym
->attr
.allocatable
3696 || (sym
->ts
.type
== BT_CLASS
3697 && CLASS_DATA (sym
)->attr
.allocatable
)))
3699 if (!sym
->attr
.save
)
3701 tree descriptor
= NULL_TREE
;
3703 /* Nullify and automatic deallocation of allocatable
3705 e
= gfc_lval_expr_from_sym (sym
);
3706 if (sym
->ts
.type
== BT_CLASS
)
3707 gfc_add_data_component (e
);
3709 gfc_init_se (&se
, NULL
);
3710 if (sym
->ts
.type
!= BT_CLASS
3711 || sym
->ts
.u
.derived
->attr
.dimension
3712 || sym
->ts
.u
.derived
->attr
.codimension
)
3714 se
.want_pointer
= 1;
3715 gfc_conv_expr (&se
, e
);
3717 else if (sym
->ts
.type
== BT_CLASS
3718 && !CLASS_DATA (sym
)->attr
.dimension
3719 && !CLASS_DATA (sym
)->attr
.codimension
)
3721 se
.want_pointer
= 1;
3722 gfc_conv_expr (&se
, e
);
3726 gfc_conv_expr (&se
, e
);
3727 descriptor
= se
.expr
;
3728 se
.expr
= gfc_conv_descriptor_data_addr (se
.expr
);
3729 se
.expr
= build_fold_indirect_ref_loc (input_location
, se
.expr
);
3733 gfc_save_backend_locus (&loc
);
3734 gfc_set_backend_locus (&sym
->declared_at
);
3735 gfc_start_block (&init
);
3737 if (!sym
->attr
.dummy
|| sym
->attr
.intent
== INTENT_OUT
)
3739 /* Nullify when entering the scope. */
3740 gfc_add_modify (&init
, se
.expr
,
3741 fold_convert (TREE_TYPE (se
.expr
),
3742 null_pointer_node
));
3745 if ((sym
->attr
.dummy
||sym
->attr
.result
)
3746 && sym
->ts
.type
== BT_CHARACTER
3747 && sym
->ts
.deferred
)
3749 /* Character length passed by reference. */
3750 tmp
= sym
->ts
.u
.cl
->passed_length
;
3751 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3752 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3754 if (!sym
->attr
.dummy
|| sym
->attr
.intent
== INTENT_OUT
)
3755 /* Zero the string length when entering the scope. */
3756 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
,
3757 build_int_cst (gfc_charlen_type_node
, 0));
3759 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
, tmp
);
3761 gfc_restore_backend_locus (&loc
);
3763 /* Pass the final character length back. */
3764 if (sym
->attr
.intent
!= INTENT_IN
)
3765 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3766 gfc_charlen_type_node
, tmp
,
3767 sym
->ts
.u
.cl
->backend_decl
);
3772 gfc_restore_backend_locus (&loc
);
3774 /* Deallocate when leaving the scope. Nullifying is not
3776 if (!sym
->attr
.result
&& !sym
->attr
.dummy
)
3778 if (sym
->ts
.type
== BT_CLASS
3779 && CLASS_DATA (sym
)->attr
.codimension
)
3780 tmp
= gfc_deallocate_with_status (descriptor
, NULL_TREE
,
3781 NULL_TREE
, NULL_TREE
,
3782 NULL_TREE
, true, NULL
,
3785 tmp
= gfc_deallocate_scalar_with_status (se
.expr
, NULL
,
3789 if (sym
->ts
.type
== BT_CLASS
)
3791 /* Initialize _vptr to declared type. */
3792 gfc_symbol
*vtab
= gfc_find_derived_vtab (sym
->ts
.u
.derived
);
3795 gfc_save_backend_locus (&loc
);
3796 gfc_set_backend_locus (&sym
->declared_at
);
3797 e
= gfc_lval_expr_from_sym (sym
);
3798 gfc_add_vptr_component (e
);
3799 gfc_init_se (&se
, NULL
);
3800 se
.want_pointer
= 1;
3801 gfc_conv_expr (&se
, e
);
3803 rhs
= gfc_build_addr_expr (TREE_TYPE (se
.expr
),
3804 gfc_get_symbol_decl (vtab
));
3805 gfc_add_modify (&init
, se
.expr
, rhs
);
3806 gfc_restore_backend_locus (&loc
);
3809 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3812 else if (sym
->ts
.type
== BT_CHARACTER
&& sym
->ts
.deferred
)
3817 /* If we get to here, all that should be left are pointers. */
3818 gcc_assert (sym
->attr
.pointer
);
3820 if (sym
->attr
.dummy
)
3822 gfc_start_block (&init
);
3824 /* Character length passed by reference. */
3825 tmp
= sym
->ts
.u
.cl
->passed_length
;
3826 tmp
= build_fold_indirect_ref_loc (input_location
, tmp
);
3827 tmp
= fold_convert (gfc_charlen_type_node
, tmp
);
3828 gfc_add_modify (&init
, sym
->ts
.u
.cl
->backend_decl
, tmp
);
3829 /* Pass the final character length back. */
3830 if (sym
->attr
.intent
!= INTENT_IN
)
3831 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
,
3832 gfc_charlen_type_node
, tmp
,
3833 sym
->ts
.u
.cl
->backend_decl
);
3836 gfc_add_init_cleanup (block
, gfc_finish_block (&init
), tmp
);
3839 else if (sym
->ts
.deferred
)
3840 gfc_fatal_error ("Deferred type parameter not yet supported");
3841 else if (sym_has_alloc_comp
)
3842 gfc_trans_deferred_array (sym
, block
);
3843 else if (sym
->ts
.type
== BT_CHARACTER
)
3845 gfc_save_backend_locus (&loc
);
3846 gfc_set_backend_locus (&sym
->declared_at
);
3847 if (sym
->attr
.dummy
|| sym
->attr
.result
)
3848 gfc_trans_dummy_character (sym
, sym
->ts
.u
.cl
, block
);
3850 gfc_trans_auto_character_variable (sym
, block
);
3851 gfc_restore_backend_locus (&loc
);
3853 else if (sym
->attr
.assign
)
3855 gfc_save_backend_locus (&loc
);
3856 gfc_set_backend_locus (&sym
->declared_at
);
3857 gfc_trans_assign_aux_var (sym
, block
);
3858 gfc_restore_backend_locus (&loc
);
3860 else if (sym
->ts
.type
== BT_DERIVED
3863 && sym
->attr
.save
== SAVE_NONE
)
3865 gfc_start_block (&tmpblock
);
3866 gfc_init_default_dt (sym
, &tmpblock
, false);
3867 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
),
3874 gfc_init_block (&tmpblock
);
3876 for (f
= proc_sym
->formal
; f
; f
= f
->next
)
3878 if (f
->sym
&& f
->sym
->tlink
== NULL
&& f
->sym
->ts
.type
== BT_CHARACTER
)
3880 gcc_assert (f
->sym
->ts
.u
.cl
->backend_decl
!= NULL
);
3881 if (TREE_CODE (f
->sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
3882 gfc_trans_vla_type_sizes (f
->sym
, &tmpblock
);
3886 if (gfc_return_by_reference (proc_sym
) && proc_sym
->ts
.type
== BT_CHARACTER
3887 && current_fake_result_decl
!= NULL
)
3889 gcc_assert (proc_sym
->ts
.u
.cl
->backend_decl
!= NULL
);
3890 if (TREE_CODE (proc_sym
->ts
.u
.cl
->backend_decl
) == PARM_DECL
)
3891 gfc_trans_vla_type_sizes (proc_sym
, &tmpblock
);
3894 gfc_add_init_cleanup (block
, gfc_finish_block (&tmpblock
), NULL_TREE
);
3897 static GTY ((param_is (struct module_htab_entry
))) htab_t module_htab
;
3899 /* Hash and equality functions for module_htab. */
3902 module_htab_do_hash (const void *x
)
3904 return htab_hash_string (((const struct module_htab_entry
*)x
)->name
);
3908 module_htab_eq (const void *x1
, const void *x2
)
3910 return strcmp ((((const struct module_htab_entry
*)x1
)->name
),
3911 (const char *)x2
) == 0;
3914 /* Hash and equality functions for module_htab's decls. */
3917 module_htab_decls_hash (const void *x
)
3919 const_tree t
= (const_tree
) x
;
3920 const_tree n
= DECL_NAME (t
);
3922 n
= TYPE_NAME (TREE_TYPE (t
));
3923 return htab_hash_string (IDENTIFIER_POINTER (n
));
3927 module_htab_decls_eq (const void *x1
, const void *x2
)
3929 const_tree t1
= (const_tree
) x1
;
3930 const_tree n1
= DECL_NAME (t1
);
3931 if (n1
== NULL_TREE
)
3932 n1
= TYPE_NAME (TREE_TYPE (t1
));
3933 return strcmp (IDENTIFIER_POINTER (n1
), (const char *) x2
) == 0;
3936 struct module_htab_entry
*
3937 gfc_find_module (const char *name
)
3942 module_htab
= htab_create_ggc (10, module_htab_do_hash
,
3943 module_htab_eq
, NULL
);
3945 slot
= htab_find_slot_with_hash (module_htab
, name
,
3946 htab_hash_string (name
), INSERT
);
3949 struct module_htab_entry
*entry
= ggc_alloc_cleared_module_htab_entry ();
3951 entry
->name
= gfc_get_string (name
);
3952 entry
->decls
= htab_create_ggc (10, module_htab_decls_hash
,
3953 module_htab_decls_eq
, NULL
);
3954 *slot
= (void *) entry
;
3956 return (struct module_htab_entry
*) *slot
;
3960 gfc_module_add_decl (struct module_htab_entry
*entry
, tree decl
)
3965 if (DECL_NAME (decl
))
3966 name
= IDENTIFIER_POINTER (DECL_NAME (decl
));
3969 gcc_assert (TREE_CODE (decl
) == TYPE_DECL
);
3970 name
= IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl
)));
3972 slot
= htab_find_slot_with_hash (entry
->decls
, name
,
3973 htab_hash_string (name
), INSERT
);
3975 *slot
= (void *) decl
;
3978 static struct module_htab_entry
*cur_module
;
3980 /* Output an initialized decl for a module variable. */
3983 gfc_create_module_variable (gfc_symbol
* sym
)
3987 /* Module functions with alternate entries are dealt with later and
3988 would get caught by the next condition. */
3989 if (sym
->attr
.entry
)
3992 /* Make sure we convert the types of the derived types from iso_c_binding
3994 if (sym
->attr
.flavor
!= FL_PROCEDURE
&& sym
->attr
.is_iso_c
3995 && sym
->ts
.type
== BT_DERIVED
)
3996 sym
->backend_decl
= gfc_typenode_for_spec (&(sym
->ts
));
3998 if (sym
->attr
.flavor
== FL_DERIVED
3999 && sym
->backend_decl
4000 && TREE_CODE (sym
->backend_decl
) == RECORD_TYPE
)
4002 decl
= sym
->backend_decl
;
4003 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4005 /* -fwhole-file mixes up the contexts so these asserts are unnecessary. */
4006 if (!(gfc_option
.flag_whole_file
&& sym
->attr
.use_assoc
))
4008 gcc_assert (TYPE_CONTEXT (decl
) == NULL_TREE
4009 || TYPE_CONTEXT (decl
) == sym
->ns
->proc_name
->backend_decl
);
4010 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl
)) == NULL_TREE
4011 || DECL_CONTEXT (TYPE_STUB_DECL (decl
))
4012 == sym
->ns
->proc_name
->backend_decl
);
4014 TYPE_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4015 DECL_CONTEXT (TYPE_STUB_DECL (decl
)) = sym
->ns
->proc_name
->backend_decl
;
4016 gfc_module_add_decl (cur_module
, TYPE_STUB_DECL (decl
));
4019 /* Only output variables, procedure pointers and array valued,
4020 or derived type, parameters. */
4021 if (sym
->attr
.flavor
!= FL_VARIABLE
4022 && !(sym
->attr
.flavor
== FL_PARAMETER
4023 && (sym
->attr
.dimension
|| sym
->ts
.type
== BT_DERIVED
))
4024 && !(sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.proc_pointer
))
4027 if ((sym
->attr
.in_common
|| sym
->attr
.in_equivalence
) && sym
->backend_decl
)
4029 decl
= sym
->backend_decl
;
4030 gcc_assert (DECL_FILE_SCOPE_P (decl
));
4031 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4032 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4033 gfc_module_add_decl (cur_module
, decl
);
4036 /* Don't generate variables from other modules. Variables from
4037 COMMONs will already have been generated. */
4038 if (sym
->attr
.use_assoc
|| sym
->attr
.in_common
)
4041 /* Equivalenced variables arrive here after creation. */
4042 if (sym
->backend_decl
4043 && (sym
->equiv_built
|| sym
->attr
.in_equivalence
))
4046 if (sym
->backend_decl
&& !sym
->attr
.vtab
&& !sym
->attr
.target
)
4047 internal_error ("backend decl for module variable %s already exists",
4050 /* We always want module variables to be created. */
4051 sym
->attr
.referenced
= 1;
4052 /* Create the decl. */
4053 decl
= gfc_get_symbol_decl (sym
);
4055 /* Create the variable. */
4057 gcc_assert (sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
);
4058 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4059 rest_of_decl_compilation (decl
, 1, 0);
4060 gfc_module_add_decl (cur_module
, decl
);
4062 /* Also add length of strings. */
4063 if (sym
->ts
.type
== BT_CHARACTER
)
4067 length
= sym
->ts
.u
.cl
->backend_decl
;
4068 gcc_assert (length
|| sym
->attr
.proc_pointer
);
4069 if (length
&& !INTEGER_CST_P (length
))
4072 rest_of_decl_compilation (length
, 1, 0);
4076 if (sym
->attr
.codimension
&& !sym
->attr
.dummy
&& !sym
->attr
.allocatable
4077 && sym
->attr
.referenced
&& !sym
->attr
.use_assoc
)
4078 has_coarray_vars
= true;
4081 /* Emit debug information for USE statements. */
4084 gfc_trans_use_stmts (gfc_namespace
* ns
)
4086 gfc_use_list
*use_stmt
;
4087 for (use_stmt
= ns
->use_stmts
; use_stmt
; use_stmt
= use_stmt
->next
)
4089 struct module_htab_entry
*entry
4090 = gfc_find_module (use_stmt
->module_name
);
4091 gfc_use_rename
*rent
;
4093 if (entry
->namespace_decl
== NULL
)
4095 entry
->namespace_decl
4096 = build_decl (input_location
,
4098 get_identifier (use_stmt
->module_name
),
4100 DECL_EXTERNAL (entry
->namespace_decl
) = 1;
4102 gfc_set_backend_locus (&use_stmt
->where
);
4103 if (!use_stmt
->only_flag
)
4104 (*debug_hooks
->imported_module_or_decl
) (entry
->namespace_decl
,
4106 ns
->proc_name
->backend_decl
,
4108 for (rent
= use_stmt
->rename
; rent
; rent
= rent
->next
)
4110 tree decl
, local_name
;
4113 if (rent
->op
!= INTRINSIC_NONE
)
4116 slot
= htab_find_slot_with_hash (entry
->decls
, rent
->use_name
,
4117 htab_hash_string (rent
->use_name
),
4123 st
= gfc_find_symtree (ns
->sym_root
,
4125 ? rent
->local_name
: rent
->use_name
);
4127 /* The following can happen if a derived type is renamed. */
4131 name
= xstrdup (rent
->local_name
[0]
4132 ? rent
->local_name
: rent
->use_name
);
4133 name
[0] = (char) TOUPPER ((unsigned char) name
[0]);
4134 st
= gfc_find_symtree (ns
->sym_root
, name
);
4139 /* Sometimes, generic interfaces wind up being over-ruled by a
4140 local symbol (see PR41062). */
4141 if (!st
->n
.sym
->attr
.use_assoc
)
4144 if (st
->n
.sym
->backend_decl
4145 && DECL_P (st
->n
.sym
->backend_decl
)
4146 && st
->n
.sym
->module
4147 && strcmp (st
->n
.sym
->module
, use_stmt
->module_name
) == 0)
4149 gcc_assert (DECL_EXTERNAL (entry
->namespace_decl
)
4150 || (TREE_CODE (st
->n
.sym
->backend_decl
)
4152 decl
= copy_node (st
->n
.sym
->backend_decl
);
4153 DECL_CONTEXT (decl
) = entry
->namespace_decl
;
4154 DECL_EXTERNAL (decl
) = 1;
4155 DECL_IGNORED_P (decl
) = 0;
4156 DECL_INITIAL (decl
) = NULL_TREE
;
4160 *slot
= error_mark_node
;
4161 htab_clear_slot (entry
->decls
, slot
);
4166 decl
= (tree
) *slot
;
4167 if (rent
->local_name
[0])
4168 local_name
= get_identifier (rent
->local_name
);
4170 local_name
= NULL_TREE
;
4171 gfc_set_backend_locus (&rent
->where
);
4172 (*debug_hooks
->imported_module_or_decl
) (decl
, local_name
,
4173 ns
->proc_name
->backend_decl
,
4174 !use_stmt
->only_flag
);
4180 /* Return true if expr is a constant initializer that gfc_conv_initializer
4184 check_constant_initializer (gfc_expr
*expr
, gfc_typespec
*ts
, bool array
,
4194 if (expr
->expr_type
== EXPR_CONSTANT
|| expr
->expr_type
== EXPR_NULL
)
4196 else if (expr
->expr_type
== EXPR_STRUCTURE
)
4197 return check_constant_initializer (expr
, ts
, false, false);
4198 else if (expr
->expr_type
!= EXPR_ARRAY
)
4200 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4201 c
; c
= gfc_constructor_next (c
))
4205 if (c
->expr
->expr_type
== EXPR_STRUCTURE
)
4207 if (!check_constant_initializer (c
->expr
, ts
, false, false))
4210 else if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4215 else switch (ts
->type
)
4218 if (expr
->expr_type
!= EXPR_STRUCTURE
)
4220 cm
= expr
->ts
.u
.derived
->components
;
4221 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4222 c
; c
= gfc_constructor_next (c
), cm
= cm
->next
)
4224 if (!c
->expr
|| cm
->attr
.allocatable
)
4226 if (!check_constant_initializer (c
->expr
, &cm
->ts
,
4233 return expr
->expr_type
== EXPR_CONSTANT
;
4237 /* Emit debug info for parameters and unreferenced variables with
4241 gfc_emit_parameter_debug_info (gfc_symbol
*sym
)
4245 if (sym
->attr
.flavor
!= FL_PARAMETER
4246 && (sym
->attr
.flavor
!= FL_VARIABLE
|| sym
->attr
.referenced
))
4249 if (sym
->backend_decl
!= NULL
4250 || sym
->value
== NULL
4251 || sym
->attr
.use_assoc
4254 || sym
->attr
.function
4255 || sym
->attr
.intrinsic
4256 || sym
->attr
.pointer
4257 || sym
->attr
.allocatable
4258 || sym
->attr
.cray_pointee
4259 || sym
->attr
.threadprivate
4260 || sym
->attr
.is_bind_c
4261 || sym
->attr
.subref_array_pointer
4262 || sym
->attr
.assign
)
4265 if (sym
->ts
.type
== BT_CHARACTER
)
4267 gfc_conv_const_charlen (sym
->ts
.u
.cl
);
4268 if (sym
->ts
.u
.cl
->backend_decl
== NULL
4269 || TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) != INTEGER_CST
)
4272 else if (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
->attr
.alloc_comp
)
4279 if (sym
->as
->type
!= AS_EXPLICIT
)
4281 for (n
= 0; n
< sym
->as
->rank
; n
++)
4282 if (sym
->as
->lower
[n
]->expr_type
!= EXPR_CONSTANT
4283 || sym
->as
->upper
[n
] == NULL
4284 || sym
->as
->upper
[n
]->expr_type
!= EXPR_CONSTANT
)
4288 if (!check_constant_initializer (sym
->value
, &sym
->ts
,
4289 sym
->attr
.dimension
, false))
4292 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& sym
->attr
.codimension
)
4295 /* Create the decl for the variable or constant. */
4296 decl
= build_decl (input_location
,
4297 sym
->attr
.flavor
== FL_PARAMETER
? CONST_DECL
: VAR_DECL
,
4298 gfc_sym_identifier (sym
), gfc_sym_type (sym
));
4299 if (sym
->attr
.flavor
== FL_PARAMETER
)
4300 TREE_READONLY (decl
) = 1;
4301 gfc_set_decl_location (decl
, &sym
->declared_at
);
4302 if (sym
->attr
.dimension
)
4303 GFC_DECL_PACKED_ARRAY (decl
) = 1;
4304 DECL_CONTEXT (decl
) = sym
->ns
->proc_name
->backend_decl
;
4305 TREE_STATIC (decl
) = 1;
4306 TREE_USED (decl
) = 1;
4307 if (DECL_CONTEXT (decl
) && TREE_CODE (DECL_CONTEXT (decl
)) == NAMESPACE_DECL
)
4308 TREE_PUBLIC (decl
) = 1;
4309 DECL_INITIAL (decl
) = gfc_conv_initializer (sym
->value
, &sym
->ts
,
4311 sym
->attr
.dimension
,
4313 debug_hooks
->global_decl (decl
);
4318 generate_coarray_sym_init (gfc_symbol
*sym
)
4320 tree tmp
, size
, decl
, token
;
4322 if (sym
->attr
.dummy
|| sym
->attr
.allocatable
|| !sym
->attr
.codimension
4323 || sym
->attr
.use_assoc
|| !sym
->attr
.referenced
)
4326 decl
= sym
->backend_decl
;
4327 TREE_USED(decl
) = 1;
4328 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl
)));
4330 /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
4331 to make sure the variable is not optimized away. */
4332 DECL_PRESERVE_P (DECL_CONTEXT (decl
)) = 1;
4334 size
= TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl
)));
4336 /* Ensure that we do not have size=0 for zero-sized arrays. */
4337 size
= fold_build2_loc (input_location
, MAX_EXPR
, size_type_node
,
4338 fold_convert (size_type_node
, size
),
4339 build_int_cst (size_type_node
, 1));
4341 if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl
)))
4343 tmp
= GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl
));
4344 size
= fold_build2_loc (input_location
, MULT_EXPR
, size_type_node
,
4345 fold_convert (size_type_node
, tmp
), size
);
4348 gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl
)) != NULL_TREE
);
4349 token
= gfc_build_addr_expr (ppvoid_type_node
,
4350 GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl
)));
4352 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_register
, 6, size
,
4353 build_int_cst (integer_type_node
,
4354 GFC_CAF_COARRAY_STATIC
), /* type. */
4355 token
, null_pointer_node
, /* token, stat. */
4356 null_pointer_node
, /* errgmsg, errmsg_len. */
4357 build_int_cst (integer_type_node
, 0));
4359 gfc_add_modify (&caf_init_block
, decl
, fold_convert (TREE_TYPE (decl
), tmp
));
4362 /* Handle "static" initializer. */
4365 sym
->attr
.pointer
= 1;
4366 tmp
= gfc_trans_assignment (gfc_lval_expr_from_sym (sym
), sym
->value
,
4368 sym
->attr
.pointer
= 0;
4369 gfc_add_expr_to_block (&caf_init_block
, tmp
);
4374 /* Generate constructor function to initialize static, nonallocatable
4378 generate_coarray_init (gfc_namespace
* ns
__attribute((unused
)))
4380 tree fndecl
, tmp
, decl
, save_fn_decl
;
4382 save_fn_decl
= current_function_decl
;
4383 push_function_context ();
4385 tmp
= build_function_type_list (void_type_node
, NULL_TREE
);
4386 fndecl
= build_decl (input_location
, FUNCTION_DECL
,
4387 create_tmp_var_name ("_caf_init"), tmp
);
4389 DECL_STATIC_CONSTRUCTOR (fndecl
) = 1;
4390 SET_DECL_INIT_PRIORITY (fndecl
, DEFAULT_INIT_PRIORITY
);
4392 decl
= build_decl (input_location
, RESULT_DECL
, NULL_TREE
, void_type_node
);
4393 DECL_ARTIFICIAL (decl
) = 1;
4394 DECL_IGNORED_P (decl
) = 1;
4395 DECL_CONTEXT (decl
) = fndecl
;
4396 DECL_RESULT (fndecl
) = decl
;
4399 current_function_decl
= fndecl
;
4400 announce_function (fndecl
);
4402 rest_of_decl_compilation (fndecl
, 0, 0);
4403 make_decl_rtl (fndecl
);
4404 init_function_start (fndecl
);
4407 gfc_init_block (&caf_init_block
);
4409 gfc_traverse_ns (ns
, generate_coarray_sym_init
);
4411 DECL_SAVED_TREE (fndecl
) = gfc_finish_block (&caf_init_block
);
4415 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
4417 DECL_SAVED_TREE (fndecl
)
4418 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
4419 DECL_INITIAL (fndecl
));
4420 dump_function (TDI_original
, fndecl
);
4422 cfun
->function_end_locus
= input_location
;
4425 if (decl_function_context (fndecl
))
4426 (void) cgraph_create_node (fndecl
);
4428 cgraph_finalize_function (fndecl
, true);
4430 pop_function_context ();
4431 current_function_decl
= save_fn_decl
;
4435 /* Generate all the required code for module variables. */
4438 gfc_generate_module_vars (gfc_namespace
* ns
)
4440 module_namespace
= ns
;
4441 cur_module
= gfc_find_module (ns
->proc_name
->name
);
4443 /* Check if the frontend left the namespace in a reasonable state. */
4444 gcc_assert (ns
->proc_name
&& !ns
->proc_name
->tlink
);
4446 /* Generate COMMON blocks. */
4447 gfc_trans_common (ns
);
4449 has_coarray_vars
= false;
4451 /* Create decls for all the module variables. */
4452 gfc_traverse_ns (ns
, gfc_create_module_variable
);
4454 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
4455 generate_coarray_init (ns
);
4459 gfc_trans_use_stmts (ns
);
4460 gfc_traverse_ns (ns
, gfc_emit_parameter_debug_info
);
4465 gfc_generate_contained_functions (gfc_namespace
* parent
)
4469 /* We create all the prototypes before generating any code. */
4470 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
4472 /* Skip namespaces from used modules. */
4473 if (ns
->parent
!= parent
)
4476 gfc_create_function_decl (ns
, false);
4479 for (ns
= parent
->contained
; ns
; ns
= ns
->sibling
)
4481 /* Skip namespaces from used modules. */
4482 if (ns
->parent
!= parent
)
4485 gfc_generate_function_code (ns
);
4490 /* Drill down through expressions for the array specification bounds and
4491 character length calling generate_local_decl for all those variables
4492 that have not already been declared. */
4495 generate_local_decl (gfc_symbol
*);
4497 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4500 expr_decls (gfc_expr
*e
, gfc_symbol
*sym
,
4501 int *f ATTRIBUTE_UNUSED
)
4503 if (e
->expr_type
!= EXPR_VARIABLE
4504 || sym
== e
->symtree
->n
.sym
4505 || e
->symtree
->n
.sym
->mark
4506 || e
->symtree
->n
.sym
->ns
!= sym
->ns
)
4509 generate_local_decl (e
->symtree
->n
.sym
);
4514 generate_expr_decls (gfc_symbol
*sym
, gfc_expr
*e
)
4516 gfc_traverse_expr (e
, sym
, expr_decls
, 0);
4520 /* Check for dependencies in the character length and array spec. */
4523 generate_dependency_declarations (gfc_symbol
*sym
)
4527 if (sym
->ts
.type
== BT_CHARACTER
4529 && sym
->ts
.u
.cl
->length
4530 && sym
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
)
4531 generate_expr_decls (sym
, sym
->ts
.u
.cl
->length
);
4533 if (sym
->as
&& sym
->as
->rank
)
4535 for (i
= 0; i
< sym
->as
->rank
; i
++)
4537 generate_expr_decls (sym
, sym
->as
->lower
[i
]);
4538 generate_expr_decls (sym
, sym
->as
->upper
[i
]);
4544 /* Generate decls for all local variables. We do this to ensure correct
4545 handling of expressions which only appear in the specification of
4549 generate_local_decl (gfc_symbol
* sym
)
4551 if (sym
->attr
.flavor
== FL_VARIABLE
)
4553 if (sym
->attr
.codimension
&& !sym
->attr
.dummy
&& !sym
->attr
.allocatable
4554 && sym
->attr
.referenced
&& !sym
->attr
.use_assoc
)
4555 has_coarray_vars
= true;
4557 if (!sym
->attr
.dummy
&& !sym
->ns
->proc_name
->attr
.entry_master
)
4558 generate_dependency_declarations (sym
);
4560 if (sym
->attr
.referenced
)
4561 gfc_get_symbol_decl (sym
);
4563 /* Warnings for unused dummy arguments. */
4564 else if (sym
->attr
.dummy
)
4566 /* INTENT(out) dummy arguments are likely meant to be set. */
4567 if (gfc_option
.warn_unused_dummy_argument
4568 && sym
->attr
.intent
== INTENT_OUT
)
4570 if (sym
->ts
.type
!= BT_DERIVED
)
4571 gfc_warning ("Dummy argument '%s' at %L was declared "
4572 "INTENT(OUT) but was not set", sym
->name
,
4574 else if (!gfc_has_default_initializer (sym
->ts
.u
.derived
))
4575 gfc_warning ("Derived-type dummy argument '%s' at %L was "
4576 "declared INTENT(OUT) but was not set and "
4577 "does not have a default initializer",
4578 sym
->name
, &sym
->declared_at
);
4579 if (sym
->backend_decl
!= NULL_TREE
)
4580 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4582 else if (gfc_option
.warn_unused_dummy_argument
)
4584 gfc_warning ("Unused dummy argument '%s' at %L", sym
->name
,
4586 if (sym
->backend_decl
!= NULL_TREE
)
4587 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4591 /* Warn for unused variables, but not if they're inside a common
4592 block, a namelist, or are use-associated. */
4593 else if (warn_unused_variable
4594 && !(sym
->attr
.in_common
|| sym
->attr
.use_assoc
|| sym
->mark
4595 || sym
->attr
.in_namelist
))
4597 gfc_warning ("Unused variable '%s' declared at %L", sym
->name
,
4599 if (sym
->backend_decl
!= NULL_TREE
)
4600 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4602 else if (warn_unused_variable
&& sym
->attr
.use_only
)
4604 gfc_warning ("Unused module variable '%s' which has been explicitly "
4605 "imported at %L", sym
->name
, &sym
->declared_at
);
4606 if (sym
->backend_decl
!= NULL_TREE
)
4607 TREE_NO_WARNING(sym
->backend_decl
) = 1;
4610 /* For variable length CHARACTER parameters, the PARM_DECL already
4611 references the length variable, so force gfc_get_symbol_decl
4612 even when not referenced. If optimize > 0, it will be optimized
4613 away anyway. But do this only after emitting -Wunused-parameter
4614 warning if requested. */
4615 if (sym
->attr
.dummy
&& !sym
->attr
.referenced
4616 && sym
->ts
.type
== BT_CHARACTER
4617 && sym
->ts
.u
.cl
->backend_decl
!= NULL
4618 && TREE_CODE (sym
->ts
.u
.cl
->backend_decl
) == VAR_DECL
)
4620 sym
->attr
.referenced
= 1;
4621 gfc_get_symbol_decl (sym
);
4624 /* INTENT(out) dummy arguments and result variables with allocatable
4625 components are reset by default and need to be set referenced to
4626 generate the code for nullification and automatic lengths. */
4627 if (!sym
->attr
.referenced
4628 && sym
->ts
.type
== BT_DERIVED
4629 && sym
->ts
.u
.derived
->attr
.alloc_comp
4630 && !sym
->attr
.pointer
4631 && ((sym
->attr
.dummy
&& sym
->attr
.intent
== INTENT_OUT
)
4633 (sym
->attr
.result
&& sym
!= sym
->result
)))
4635 sym
->attr
.referenced
= 1;
4636 gfc_get_symbol_decl (sym
);
4639 /* Check for dependencies in the array specification and string
4640 length, adding the necessary declarations to the function. We
4641 mark the symbol now, as well as in traverse_ns, to prevent
4642 getting stuck in a circular dependency. */
4645 else if (sym
->attr
.flavor
== FL_PARAMETER
)
4647 if (warn_unused_parameter
4648 && !sym
->attr
.referenced
)
4650 if (!sym
->attr
.use_assoc
)
4651 gfc_warning ("Unused parameter '%s' declared at %L", sym
->name
,
4653 else if (sym
->attr
.use_only
)
4654 gfc_warning ("Unused parameter '%s' which has been explicitly "
4655 "imported at %L", sym
->name
, &sym
->declared_at
);
4658 else if (sym
->attr
.flavor
== FL_PROCEDURE
)
4660 /* TODO: move to the appropriate place in resolve.c. */
4661 if (warn_return_type
4662 && sym
->attr
.function
4664 && sym
!= sym
->result
4665 && !sym
->result
->attr
.referenced
4666 && !sym
->attr
.use_assoc
4667 && sym
->attr
.if_source
!= IFSRC_IFBODY
)
4669 gfc_warning ("Return value '%s' of function '%s' declared at "
4670 "%L not set", sym
->result
->name
, sym
->name
,
4671 &sym
->result
->declared_at
);
4673 /* Prevents "Unused variable" warning for RESULT variables. */
4674 sym
->result
->mark
= 1;
4678 if (sym
->attr
.dummy
== 1)
4680 /* Modify the tree type for scalar character dummy arguments of bind(c)
4681 procedures if they are passed by value. The tree type for them will
4682 be promoted to INTEGER_TYPE for the middle end, which appears to be
4683 what C would do with characters passed by-value. The value attribute
4684 implies the dummy is a scalar. */
4685 if (sym
->attr
.value
== 1 && sym
->backend_decl
!= NULL
4686 && sym
->ts
.type
== BT_CHARACTER
&& sym
->ts
.is_c_interop
4687 && sym
->ns
->proc_name
!= NULL
&& sym
->ns
->proc_name
->attr
.is_bind_c
)
4688 gfc_conv_scalar_char_value (sym
, NULL
, NULL
);
4690 /* Unused procedure passed as dummy argument. */
4691 if (sym
->attr
.flavor
== FL_PROCEDURE
)
4693 if (!sym
->attr
.referenced
)
4695 if (gfc_option
.warn_unused_dummy_argument
)
4696 gfc_warning ("Unused dummy argument '%s' at %L", sym
->name
,
4700 /* Silence bogus "unused parameter" warnings from the
4702 if (sym
->backend_decl
!= NULL_TREE
)
4703 TREE_NO_WARNING (sym
->backend_decl
) = 1;
4707 /* Make sure we convert the types of the derived types from iso_c_binding
4709 if (sym
->attr
.flavor
!= FL_PROCEDURE
&& sym
->attr
.is_iso_c
4710 && sym
->ts
.type
== BT_DERIVED
)
4711 sym
->backend_decl
= gfc_typenode_for_spec (&(sym
->ts
));
4715 generate_local_vars (gfc_namespace
* ns
)
4717 gfc_traverse_ns (ns
, generate_local_decl
);
4721 /* Generate a switch statement to jump to the correct entry point. Also
4722 creates the label decls for the entry points. */
4725 gfc_trans_entry_master_switch (gfc_entry_list
* el
)
4732 gfc_init_block (&block
);
4733 for (; el
; el
= el
->next
)
4735 /* Add the case label. */
4736 label
= gfc_build_label_decl (NULL_TREE
);
4737 val
= build_int_cst (gfc_array_index_type
, el
->id
);
4738 tmp
= build_case_label (val
, NULL_TREE
, label
);
4739 gfc_add_expr_to_block (&block
, tmp
);
4741 /* And jump to the actual entry point. */
4742 label
= gfc_build_label_decl (NULL_TREE
);
4743 tmp
= build1_v (GOTO_EXPR
, label
);
4744 gfc_add_expr_to_block (&block
, tmp
);
4746 /* Save the label decl. */
4749 tmp
= gfc_finish_block (&block
);
4750 /* The first argument selects the entry point. */
4751 val
= DECL_ARGUMENTS (current_function_decl
);
4752 tmp
= fold_build3_loc (input_location
, SWITCH_EXPR
, NULL_TREE
,
4753 val
, tmp
, NULL_TREE
);
4758 /* Add code to string lengths of actual arguments passed to a function against
4759 the expected lengths of the dummy arguments. */
4762 add_argument_checking (stmtblock_t
*block
, gfc_symbol
*sym
)
4764 gfc_formal_arglist
*formal
;
4766 for (formal
= sym
->formal
; formal
; formal
= formal
->next
)
4767 if (formal
->sym
&& formal
->sym
->ts
.type
== BT_CHARACTER
4768 && !formal
->sym
->ts
.deferred
)
4770 enum tree_code comparison
;
4775 const char *message
;
4781 gcc_assert (cl
->passed_length
!= NULL_TREE
);
4782 gcc_assert (cl
->backend_decl
!= NULL_TREE
);
4784 /* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
4785 string lengths must match exactly. Otherwise, it is only required
4786 that the actual string length is *at least* the expected one.
4787 Sequence association allows for a mismatch of the string length
4788 if the actual argument is (part of) an array, but only if the
4789 dummy argument is an array. (See "Sequence association" in
4790 Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.) */
4791 if (fsym
->attr
.pointer
|| fsym
->attr
.allocatable
4792 || (fsym
->as
&& fsym
->as
->type
== AS_ASSUMED_SHAPE
))
4794 comparison
= NE_EXPR
;
4795 message
= _("Actual string length does not match the declared one"
4796 " for dummy argument '%s' (%ld/%ld)");
4798 else if (fsym
->as
&& fsym
->as
->rank
!= 0)
4802 comparison
= LT_EXPR
;
4803 message
= _("Actual string length is shorter than the declared one"
4804 " for dummy argument '%s' (%ld/%ld)");
4807 /* Build the condition. For optional arguments, an actual length
4808 of 0 is also acceptable if the associated string is NULL, which
4809 means the argument was not passed. */
4810 cond
= fold_build2_loc (input_location
, comparison
, boolean_type_node
,
4811 cl
->passed_length
, cl
->backend_decl
);
4812 if (fsym
->attr
.optional
)
4818 not_0length
= fold_build2_loc (input_location
, NE_EXPR
,
4821 build_zero_cst (gfc_charlen_type_node
));
4822 /* The symbol needs to be referenced for gfc_get_symbol_decl. */
4823 fsym
->attr
.referenced
= 1;
4824 not_absent
= gfc_conv_expr_present (fsym
);
4826 absent_failed
= fold_build2_loc (input_location
, TRUTH_OR_EXPR
,
4827 boolean_type_node
, not_0length
,
4830 cond
= fold_build2_loc (input_location
, TRUTH_AND_EXPR
,
4831 boolean_type_node
, cond
, absent_failed
);
4834 /* Build the runtime check. */
4835 argname
= gfc_build_cstring_const (fsym
->name
);
4836 argname
= gfc_build_addr_expr (pchar_type_node
, argname
);
4837 gfc_trans_runtime_check (true, false, cond
, block
, &fsym
->declared_at
,
4839 fold_convert (long_integer_type_node
,
4841 fold_convert (long_integer_type_node
,
4847 /* Generate the _gfortran_caf_this_image and _gfortran_caf_num_images
4848 global variables for -fcoarray=lib. They are placed into the translation
4849 unit of the main program. Make sure that in one TU (the one of the main
4850 program), the first call to gfc_init_coarray_decl is done with true.
4851 Otherwise, expect link errors. */
4854 gfc_init_coarray_decl (bool main_tu
)
4858 if (gfc_option
.coarray
!= GFC_FCOARRAY_LIB
)
4861 if (gfort_gvar_caf_this_image
|| gfort_gvar_caf_num_images
)
4864 save_fn_decl
= current_function_decl
;
4865 current_function_decl
= NULL_TREE
;
4868 gfort_gvar_caf_this_image
4869 = build_decl (input_location
, VAR_DECL
,
4870 get_identifier (PREFIX("caf_this_image")),
4872 DECL_ARTIFICIAL (gfort_gvar_caf_this_image
) = 1;
4873 TREE_USED (gfort_gvar_caf_this_image
) = 1;
4874 TREE_PUBLIC (gfort_gvar_caf_this_image
) = 1;
4875 TREE_READONLY (gfort_gvar_caf_this_image
) = 0;
4878 TREE_STATIC (gfort_gvar_caf_this_image
) = 1;
4880 DECL_EXTERNAL (gfort_gvar_caf_this_image
) = 1;
4882 pushdecl_top_level (gfort_gvar_caf_this_image
);
4884 gfort_gvar_caf_num_images
4885 = build_decl (input_location
, VAR_DECL
,
4886 get_identifier (PREFIX("caf_num_images")),
4888 DECL_ARTIFICIAL (gfort_gvar_caf_num_images
) = 1;
4889 TREE_USED (gfort_gvar_caf_num_images
) = 1;
4890 TREE_PUBLIC (gfort_gvar_caf_num_images
) = 1;
4891 TREE_READONLY (gfort_gvar_caf_num_images
) = 0;
4894 TREE_STATIC (gfort_gvar_caf_num_images
) = 1;
4896 DECL_EXTERNAL (gfort_gvar_caf_num_images
) = 1;
4898 pushdecl_top_level (gfort_gvar_caf_num_images
);
4901 current_function_decl
= save_fn_decl
;
4906 create_main_function (tree fndecl
)
4910 tree tmp
, decl
, result_decl
, argc
, argv
, typelist
, arglist
;
4913 old_context
= current_function_decl
;
4917 push_function_context ();
4918 saved_parent_function_decls
= saved_function_decls
;
4919 saved_function_decls
= NULL_TREE
;
4922 /* main() function must be declared with global scope. */
4923 gcc_assert (current_function_decl
== NULL_TREE
);
4925 /* Declare the function. */
4926 tmp
= build_function_type_list (integer_type_node
, integer_type_node
,
4927 build_pointer_type (pchar_type_node
),
4929 main_identifier_node
= get_identifier ("main");
4930 ftn_main
= build_decl (input_location
, FUNCTION_DECL
,
4931 main_identifier_node
, tmp
);
4932 DECL_EXTERNAL (ftn_main
) = 0;
4933 TREE_PUBLIC (ftn_main
) = 1;
4934 TREE_STATIC (ftn_main
) = 1;
4935 DECL_ATTRIBUTES (ftn_main
)
4936 = tree_cons (get_identifier("externally_visible"), NULL_TREE
, NULL_TREE
);
4938 /* Setup the result declaration (for "return 0"). */
4939 result_decl
= build_decl (input_location
,
4940 RESULT_DECL
, NULL_TREE
, integer_type_node
);
4941 DECL_ARTIFICIAL (result_decl
) = 1;
4942 DECL_IGNORED_P (result_decl
) = 1;
4943 DECL_CONTEXT (result_decl
) = ftn_main
;
4944 DECL_RESULT (ftn_main
) = result_decl
;
4946 pushdecl (ftn_main
);
4948 /* Get the arguments. */
4950 arglist
= NULL_TREE
;
4951 typelist
= TYPE_ARG_TYPES (TREE_TYPE (ftn_main
));
4953 tmp
= TREE_VALUE (typelist
);
4954 argc
= build_decl (input_location
, PARM_DECL
, get_identifier ("argc"), tmp
);
4955 DECL_CONTEXT (argc
) = ftn_main
;
4956 DECL_ARG_TYPE (argc
) = TREE_VALUE (typelist
);
4957 TREE_READONLY (argc
) = 1;
4958 gfc_finish_decl (argc
);
4959 arglist
= chainon (arglist
, argc
);
4961 typelist
= TREE_CHAIN (typelist
);
4962 tmp
= TREE_VALUE (typelist
);
4963 argv
= build_decl (input_location
, PARM_DECL
, get_identifier ("argv"), tmp
);
4964 DECL_CONTEXT (argv
) = ftn_main
;
4965 DECL_ARG_TYPE (argv
) = TREE_VALUE (typelist
);
4966 TREE_READONLY (argv
) = 1;
4967 DECL_BY_REFERENCE (argv
) = 1;
4968 gfc_finish_decl (argv
);
4969 arglist
= chainon (arglist
, argv
);
4971 DECL_ARGUMENTS (ftn_main
) = arglist
;
4972 current_function_decl
= ftn_main
;
4973 announce_function (ftn_main
);
4975 rest_of_decl_compilation (ftn_main
, 1, 0);
4976 make_decl_rtl (ftn_main
);
4977 init_function_start (ftn_main
);
4980 gfc_init_block (&body
);
4982 /* Call some libgfortran initialization routines, call then MAIN__(). */
4984 /* Call _gfortran_caf_init (*argc, ***argv, *this_image, *num_images). */
4985 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
4987 tree pint_type
, pppchar_type
;
4988 pint_type
= build_pointer_type (integer_type_node
);
4990 = build_pointer_type (build_pointer_type (pchar_type_node
));
4992 gfc_init_coarray_decl (true);
4993 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_init
, 4,
4994 gfc_build_addr_expr (pint_type
, argc
),
4995 gfc_build_addr_expr (pppchar_type
, argv
),
4996 gfc_build_addr_expr (pint_type
, gfort_gvar_caf_this_image
),
4997 gfc_build_addr_expr (pint_type
, gfort_gvar_caf_num_images
));
4998 gfc_add_expr_to_block (&body
, tmp
);
5001 /* Call _gfortran_set_args (argc, argv). */
5002 TREE_USED (argc
) = 1;
5003 TREE_USED (argv
) = 1;
5004 tmp
= build_call_expr_loc (input_location
,
5005 gfor_fndecl_set_args
, 2, argc
, argv
);
5006 gfc_add_expr_to_block (&body
, tmp
);
5008 /* Add a call to set_options to set up the runtime library Fortran
5009 language standard parameters. */
5011 tree array_type
, array
, var
;
5012 VEC(constructor_elt
,gc
) *v
= NULL
;
5014 /* Passing a new option to the library requires four modifications:
5015 + add it to the tree_cons list below
5016 + change the array size in the call to build_array_type
5017 + change the first argument to the library call
5018 gfor_fndecl_set_options
5019 + modify the library (runtime/compile_options.c)! */
5021 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5022 build_int_cst (integer_type_node
,
5023 gfc_option
.warn_std
));
5024 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5025 build_int_cst (integer_type_node
,
5026 gfc_option
.allow_std
));
5027 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5028 build_int_cst (integer_type_node
, pedantic
));
5029 /* TODO: This is the old -fdump-core option, which is unused but
5030 passed due to ABI compatibility; remove when bumping the
5032 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5033 build_int_cst (integer_type_node
,
5035 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5036 build_int_cst (integer_type_node
,
5037 gfc_option
.flag_backtrace
));
5038 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5039 build_int_cst (integer_type_node
,
5040 gfc_option
.flag_sign_zero
));
5041 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5042 build_int_cst (integer_type_node
,
5044 & GFC_RTCHECK_BOUNDS
)));
5045 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
5046 build_int_cst (integer_type_node
,
5047 gfc_option
.flag_range_check
));
5049 array_type
= build_array_type (integer_type_node
,
5050 build_index_type (size_int (7)));
5051 array
= build_constructor (array_type
, v
);
5052 TREE_CONSTANT (array
) = 1;
5053 TREE_STATIC (array
) = 1;
5055 /* Create a static variable to hold the jump table. */
5056 var
= gfc_create_var (array_type
, "options");
5057 TREE_CONSTANT (var
) = 1;
5058 TREE_STATIC (var
) = 1;
5059 TREE_READONLY (var
) = 1;
5060 DECL_INITIAL (var
) = array
;
5061 var
= gfc_build_addr_expr (build_pointer_type (integer_type_node
), var
);
5063 tmp
= build_call_expr_loc (input_location
,
5064 gfor_fndecl_set_options
, 2,
5065 build_int_cst (integer_type_node
, 8), var
);
5066 gfc_add_expr_to_block (&body
, tmp
);
5069 /* If -ffpe-trap option was provided, add a call to set_fpe so that
5070 the library will raise a FPE when needed. */
5071 if (gfc_option
.fpe
!= 0)
5073 tmp
= build_call_expr_loc (input_location
,
5074 gfor_fndecl_set_fpe
, 1,
5075 build_int_cst (integer_type_node
,
5077 gfc_add_expr_to_block (&body
, tmp
);
5080 /* If this is the main program and an -fconvert option was provided,
5081 add a call to set_convert. */
5083 if (gfc_option
.convert
!= GFC_CONVERT_NATIVE
)
5085 tmp
= build_call_expr_loc (input_location
,
5086 gfor_fndecl_set_convert
, 1,
5087 build_int_cst (integer_type_node
,
5088 gfc_option
.convert
));
5089 gfc_add_expr_to_block (&body
, tmp
);
5092 /* If this is the main program and an -frecord-marker option was provided,
5093 add a call to set_record_marker. */
5095 if (gfc_option
.record_marker
!= 0)
5097 tmp
= build_call_expr_loc (input_location
,
5098 gfor_fndecl_set_record_marker
, 1,
5099 build_int_cst (integer_type_node
,
5100 gfc_option
.record_marker
));
5101 gfc_add_expr_to_block (&body
, tmp
);
5104 if (gfc_option
.max_subrecord_length
!= 0)
5106 tmp
= build_call_expr_loc (input_location
,
5107 gfor_fndecl_set_max_subrecord_length
, 1,
5108 build_int_cst (integer_type_node
,
5109 gfc_option
.max_subrecord_length
));
5110 gfc_add_expr_to_block (&body
, tmp
);
5113 /* Call MAIN__(). */
5114 tmp
= build_call_expr_loc (input_location
,
5116 gfc_add_expr_to_block (&body
, tmp
);
5118 /* Mark MAIN__ as used. */
5119 TREE_USED (fndecl
) = 1;
5121 /* Coarray: Call _gfortran_caf_finalize(void). */
5122 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
)
5124 /* Per F2008, 8.5.1 END of the main program implies a
5126 tmp
= builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE
);
5127 tmp
= build_call_expr_loc (input_location
, tmp
, 0);
5128 gfc_add_expr_to_block (&body
, tmp
);
5130 tmp
= build_call_expr_loc (input_location
, gfor_fndecl_caf_finalize
, 0);
5131 gfc_add_expr_to_block (&body
, tmp
);
5135 tmp
= fold_build2_loc (input_location
, MODIFY_EXPR
, integer_type_node
,
5136 DECL_RESULT (ftn_main
),
5137 build_int_cst (integer_type_node
, 0));
5138 tmp
= build1_v (RETURN_EXPR
, tmp
);
5139 gfc_add_expr_to_block (&body
, tmp
);
5142 DECL_SAVED_TREE (ftn_main
) = gfc_finish_block (&body
);
5145 /* Finish off this function and send it for code generation. */
5147 BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main
)) = ftn_main
;
5149 DECL_SAVED_TREE (ftn_main
)
5150 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (ftn_main
),
5151 DECL_INITIAL (ftn_main
));
5153 /* Output the GENERIC tree. */
5154 dump_function (TDI_original
, ftn_main
);
5156 cgraph_finalize_function (ftn_main
, true);
5160 pop_function_context ();
5161 saved_function_decls
= saved_parent_function_decls
;
5163 current_function_decl
= old_context
;
5167 /* Get the result expression for a procedure. */
5170 get_proc_result (gfc_symbol
* sym
)
5172 if (sym
->attr
.subroutine
|| sym
== sym
->result
)
5174 if (current_fake_result_decl
!= NULL
)
5175 return TREE_VALUE (current_fake_result_decl
);
5180 return sym
->result
->backend_decl
;
5184 /* Generate an appropriate return-statement for a procedure. */
5187 gfc_generate_return (void)
5193 sym
= current_procedure_symbol
;
5194 fndecl
= sym
->backend_decl
;
5196 if (TREE_TYPE (DECL_RESULT (fndecl
)) == void_type_node
)
5200 result
= get_proc_result (sym
);
5202 /* Set the return value to the dummy result variable. The
5203 types may be different for scalar default REAL functions
5204 with -ff2c, therefore we have to convert. */
5205 if (result
!= NULL_TREE
)
5207 result
= convert (TREE_TYPE (DECL_RESULT (fndecl
)), result
);
5208 result
= fold_build2_loc (input_location
, MODIFY_EXPR
,
5209 TREE_TYPE (result
), DECL_RESULT (fndecl
),
5214 return build1_v (RETURN_EXPR
, result
);
5218 /* Generate code for a function. */
5221 gfc_generate_function_code (gfc_namespace
* ns
)
5227 stmtblock_t init
, cleanup
;
5229 gfc_wrapped_block try_block
;
5230 tree recurcheckvar
= NULL_TREE
;
5232 gfc_symbol
*previous_procedure_symbol
;
5236 sym
= ns
->proc_name
;
5237 previous_procedure_symbol
= current_procedure_symbol
;
5238 current_procedure_symbol
= sym
;
5240 /* Check that the frontend isn't still using this. */
5241 gcc_assert (sym
->tlink
== NULL
);
5244 /* Create the declaration for functions with global scope. */
5245 if (!sym
->backend_decl
)
5246 gfc_create_function_decl (ns
, false);
5248 fndecl
= sym
->backend_decl
;
5249 old_context
= current_function_decl
;
5253 push_function_context ();
5254 saved_parent_function_decls
= saved_function_decls
;
5255 saved_function_decls
= NULL_TREE
;
5258 trans_function_start (sym
);
5260 gfc_init_block (&init
);
5262 if (ns
->entries
&& ns
->proc_name
->ts
.type
== BT_CHARACTER
)
5264 /* Copy length backend_decls to all entry point result
5269 gfc_conv_const_charlen (ns
->proc_name
->ts
.u
.cl
);
5270 backend_decl
= ns
->proc_name
->result
->ts
.u
.cl
->backend_decl
;
5271 for (el
= ns
->entries
; el
; el
= el
->next
)
5272 el
->sym
->result
->ts
.u
.cl
->backend_decl
= backend_decl
;
5275 /* Translate COMMON blocks. */
5276 gfc_trans_common (ns
);
5278 /* Null the parent fake result declaration if this namespace is
5279 a module function or an external procedures. */
5280 if ((ns
->parent
&& ns
->parent
->proc_name
->attr
.flavor
== FL_MODULE
)
5281 || ns
->parent
== NULL
)
5282 parent_fake_result_decl
= NULL_TREE
;
5284 gfc_generate_contained_functions (ns
);
5286 nonlocal_dummy_decls
= NULL
;
5287 nonlocal_dummy_decl_pset
= NULL
;
5289 has_coarray_vars
= false;
5290 generate_local_vars (ns
);
5292 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
5293 generate_coarray_init (ns
);
5295 /* Keep the parent fake result declaration in module functions
5296 or external procedures. */
5297 if ((ns
->parent
&& ns
->parent
->proc_name
->attr
.flavor
== FL_MODULE
)
5298 || ns
->parent
== NULL
)
5299 current_fake_result_decl
= parent_fake_result_decl
;
5301 current_fake_result_decl
= NULL_TREE
;
5303 is_recursive
= sym
->attr
.recursive
5304 || (sym
->attr
.entry_master
5305 && sym
->ns
->entries
->sym
->attr
.recursive
);
5306 if ((gfc_option
.rtcheck
& GFC_RTCHECK_RECURSION
)
5308 && !gfc_option
.flag_recursive
)
5312 asprintf (&msg
, "Recursive call to nonrecursive procedure '%s'",
5314 recurcheckvar
= gfc_create_var (boolean_type_node
, "is_recursive");
5315 TREE_STATIC (recurcheckvar
) = 1;
5316 DECL_INITIAL (recurcheckvar
) = boolean_false_node
;
5317 gfc_add_expr_to_block (&init
, recurcheckvar
);
5318 gfc_trans_runtime_check (true, false, recurcheckvar
, &init
,
5319 &sym
->declared_at
, msg
);
5320 gfc_add_modify (&init
, recurcheckvar
, boolean_true_node
);
5324 /* Now generate the code for the body of this function. */
5325 gfc_init_block (&body
);
5327 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
5328 && sym
->attr
.subroutine
)
5330 tree alternate_return
;
5331 alternate_return
= gfc_get_fake_result_decl (sym
, 0);
5332 gfc_add_modify (&body
, alternate_return
, integer_zero_node
);
5337 /* Jump to the correct entry point. */
5338 tmp
= gfc_trans_entry_master_switch (ns
->entries
);
5339 gfc_add_expr_to_block (&body
, tmp
);
5342 /* If bounds-checking is enabled, generate code to check passed in actual
5343 arguments against the expected dummy argument attributes (e.g. string
5345 if ((gfc_option
.rtcheck
& GFC_RTCHECK_BOUNDS
) && !sym
->attr
.is_bind_c
)
5346 add_argument_checking (&body
, sym
);
5348 tmp
= gfc_trans_code (ns
->code
);
5349 gfc_add_expr_to_block (&body
, tmp
);
5351 if (TREE_TYPE (DECL_RESULT (fndecl
)) != void_type_node
)
5353 tree result
= get_proc_result (sym
);
5355 if (result
!= NULL_TREE
&& sym
->attr
.function
&& !sym
->attr
.pointer
)
5357 if (sym
->attr
.allocatable
&& sym
->attr
.dimension
== 0
5358 && sym
->result
== sym
)
5359 gfc_add_modify (&init
, result
, fold_convert (TREE_TYPE (result
),
5360 null_pointer_node
));
5361 else if (sym
->ts
.type
== BT_CLASS
5362 && CLASS_DATA (sym
)->attr
.allocatable
5363 && CLASS_DATA (sym
)->attr
.dimension
== 0
5364 && sym
->result
== sym
)
5366 tmp
= CLASS_DATA (sym
)->backend_decl
;
5367 tmp
= fold_build3_loc (input_location
, COMPONENT_REF
,
5368 TREE_TYPE (tmp
), result
, tmp
, NULL_TREE
);
5369 gfc_add_modify (&init
, tmp
, fold_convert (TREE_TYPE (tmp
),
5370 null_pointer_node
));
5372 else if (sym
->ts
.type
== BT_DERIVED
5373 && sym
->ts
.u
.derived
->attr
.alloc_comp
5374 && !sym
->attr
.allocatable
)
5376 rank
= sym
->as
? sym
->as
->rank
: 0;
5377 tmp
= gfc_nullify_alloc_comp (sym
->ts
.u
.derived
, result
, rank
);
5378 gfc_add_expr_to_block (&init
, tmp
);
5382 if (result
== NULL_TREE
)
5384 /* TODO: move to the appropriate place in resolve.c. */
5385 if (warn_return_type
&& sym
== sym
->result
)
5386 gfc_warning ("Return value of function '%s' at %L not set",
5387 sym
->name
, &sym
->declared_at
);
5388 if (warn_return_type
)
5389 TREE_NO_WARNING(sym
->backend_decl
) = 1;
5392 gfc_add_expr_to_block (&body
, gfc_generate_return ());
5395 gfc_init_block (&cleanup
);
5397 /* Reset recursion-check variable. */
5398 if ((gfc_option
.rtcheck
& GFC_RTCHECK_RECURSION
)
5400 && !gfc_option
.gfc_flag_openmp
5401 && recurcheckvar
!= NULL_TREE
)
5403 gfc_add_modify (&cleanup
, recurcheckvar
, boolean_false_node
);
5404 recurcheckvar
= NULL
;
5407 /* Finish the function body and add init and cleanup code. */
5408 tmp
= gfc_finish_block (&body
);
5409 gfc_start_wrapped_block (&try_block
, tmp
);
5410 /* Add code to create and cleanup arrays. */
5411 gfc_trans_deferred_vars (sym
, &try_block
);
5412 gfc_add_init_cleanup (&try_block
, gfc_finish_block (&init
),
5413 gfc_finish_block (&cleanup
));
5415 /* Add all the decls we created during processing. */
5416 decl
= saved_function_decls
;
5421 next
= DECL_CHAIN (decl
);
5422 DECL_CHAIN (decl
) = NULL_TREE
;
5423 if (GFC_DECL_PUSH_TOPLEVEL (decl
))
5424 pushdecl_top_level (decl
);
5429 saved_function_decls
= NULL_TREE
;
5431 DECL_SAVED_TREE (fndecl
) = gfc_finish_wrapped_block (&try_block
);
5434 /* Finish off this function and send it for code generation. */
5436 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
5438 DECL_SAVED_TREE (fndecl
)
5439 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
5440 DECL_INITIAL (fndecl
));
5442 if (nonlocal_dummy_decls
)
5444 BLOCK_VARS (DECL_INITIAL (fndecl
))
5445 = chainon (BLOCK_VARS (DECL_INITIAL (fndecl
)), nonlocal_dummy_decls
);
5446 pointer_set_destroy (nonlocal_dummy_decl_pset
);
5447 nonlocal_dummy_decls
= NULL
;
5448 nonlocal_dummy_decl_pset
= NULL
;
5451 /* Output the GENERIC tree. */
5452 dump_function (TDI_original
, fndecl
);
5454 /* Store the end of the function, so that we get good line number
5455 info for the epilogue. */
5456 cfun
->function_end_locus
= input_location
;
5458 /* We're leaving the context of this function, so zap cfun.
5459 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
5460 tree_rest_of_compilation. */
5465 pop_function_context ();
5466 saved_function_decls
= saved_parent_function_decls
;
5468 current_function_decl
= old_context
;
5470 if (decl_function_context (fndecl
) && !gfc_option
.coarray
== GFC_FCOARRAY_LIB
5471 && has_coarray_vars
)
5472 /* Register this function with cgraph just far enough to get it
5473 added to our parent's nested function list.
5474 If there are static coarrays in this function, the nested _caf_init
5475 function has already called cgraph_create_node, which also created
5476 the cgraph node for this function. */
5477 (void) cgraph_create_node (fndecl
);
5479 cgraph_finalize_function (fndecl
, true);
5481 gfc_trans_use_stmts (ns
);
5482 gfc_traverse_ns (ns
, gfc_emit_parameter_debug_info
);
5484 if (sym
->attr
.is_main_program
)
5485 create_main_function (fndecl
);
5487 current_procedure_symbol
= previous_procedure_symbol
;
5492 gfc_generate_constructors (void)
5494 gcc_assert (gfc_static_ctors
== NULL_TREE
);
5502 if (gfc_static_ctors
== NULL_TREE
)
5505 fnname
= get_file_function_name ("I");
5506 type
= build_function_type_list (void_type_node
, NULL_TREE
);
5508 fndecl
= build_decl (input_location
,
5509 FUNCTION_DECL
, fnname
, type
);
5510 TREE_PUBLIC (fndecl
) = 1;
5512 decl
= build_decl (input_location
,
5513 RESULT_DECL
, NULL_TREE
, void_type_node
);
5514 DECL_ARTIFICIAL (decl
) = 1;
5515 DECL_IGNORED_P (decl
) = 1;
5516 DECL_CONTEXT (decl
) = fndecl
;
5517 DECL_RESULT (fndecl
) = decl
;
5521 current_function_decl
= fndecl
;
5523 rest_of_decl_compilation (fndecl
, 1, 0);
5525 make_decl_rtl (fndecl
);
5527 init_function_start (fndecl
);
5531 for (; gfc_static_ctors
; gfc_static_ctors
= TREE_CHAIN (gfc_static_ctors
))
5533 tmp
= build_call_expr_loc (input_location
,
5534 TREE_VALUE (gfc_static_ctors
), 0);
5535 DECL_SAVED_TREE (fndecl
) = build_stmt (input_location
, EXPR_STMT
, tmp
);
5541 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
5542 DECL_SAVED_TREE (fndecl
)
5543 = build3_v (BIND_EXPR
, decl
, DECL_SAVED_TREE (fndecl
),
5544 DECL_INITIAL (fndecl
));
5546 free_after_parsing (cfun
);
5547 free_after_compilation (cfun
);
5549 tree_rest_of_compilation (fndecl
);
5551 current_function_decl
= NULL_TREE
;
5555 /* Translates a BLOCK DATA program unit. This means emitting the
5556 commons contained therein plus their initializations. We also emit
5557 a globally visible symbol to make sure that each BLOCK DATA program
5558 unit remains unique. */
5561 gfc_generate_block_data (gfc_namespace
* ns
)
5566 /* Tell the backend the source location of the block data. */
5568 gfc_set_backend_locus (&ns
->proc_name
->declared_at
);
5570 gfc_set_backend_locus (&gfc_current_locus
);
5572 /* Process the DATA statements. */
5573 gfc_trans_common (ns
);
5575 /* Create a global symbol with the mane of the block data. This is to
5576 generate linker errors if the same name is used twice. It is never
5579 id
= gfc_sym_mangled_function_id (ns
->proc_name
);
5581 id
= get_identifier ("__BLOCK_DATA__");
5583 decl
= build_decl (input_location
,
5584 VAR_DECL
, id
, gfc_array_index_type
);
5585 TREE_PUBLIC (decl
) = 1;
5586 TREE_STATIC (decl
) = 1;
5587 DECL_IGNORED_P (decl
) = 1;
5590 rest_of_decl_compilation (decl
, 1, 0);
5594 /* Process the local variables of a BLOCK construct. */
5597 gfc_process_block_locals (gfc_namespace
* ns
)
5601 gcc_assert (saved_local_decls
== NULL_TREE
);
5602 has_coarray_vars
= false;
5604 generate_local_vars (ns
);
5606 if (gfc_option
.coarray
== GFC_FCOARRAY_LIB
&& has_coarray_vars
)
5607 generate_coarray_init (ns
);
5609 decl
= saved_local_decls
;
5614 next
= DECL_CHAIN (decl
);
5615 DECL_CHAIN (decl
) = NULL_TREE
;
5619 saved_local_decls
= NULL_TREE
;
5623 #include "gt-fortran-trans-decl.h"