2008-10-02 Richard Guenther <rguenther@suse.de>
[official-gcc.git] / gcc / fortran / trans-decl.c
blob20253e668ca252ab6a893a65767cf69ac8e2a065
1 /* Backend function setup
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
3 Foundation, Inc.
4 Contributed by Paul Brook
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* trans-decl.c -- Handling of backend function and variable decls, etc */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tree.h"
28 #include "tree-dump.h"
29 #include "gimple.h"
30 #include "ggc.h"
31 #include "toplev.h"
32 #include "tm.h"
33 #include "rtl.h"
34 #include "target.h"
35 #include "function.h"
36 #include "flags.h"
37 #include "cgraph.h"
38 #include "debug.h"
39 #include "gfortran.h"
40 #include "trans.h"
41 #include "trans-types.h"
42 #include "trans-array.h"
43 #include "trans-const.h"
44 /* Only for gfc_trans_code. Shouldn't need to include this. */
45 #include "trans-stmt.h"
47 #define MAX_LABEL_VALUE 99999
50 /* Holds the result of the function if no result variable specified. */
52 static GTY(()) tree current_fake_result_decl;
53 static GTY(()) tree parent_fake_result_decl;
55 static GTY(()) tree current_function_return_label;
58 /* Holds the variable DECLs for the current function. */
60 static GTY(()) tree saved_function_decls;
61 static GTY(()) tree saved_parent_function_decls;
64 /* The namespace of the module we're currently generating. Only used while
65 outputting decls for module variables. Do not rely on this being set. */
67 static gfc_namespace *module_namespace;
70 /* List of static constructor functions. */
72 tree gfc_static_ctors;
75 /* Function declarations for builtin library functions. */
77 tree gfor_fndecl_pause_numeric;
78 tree gfor_fndecl_pause_string;
79 tree gfor_fndecl_stop_numeric;
80 tree gfor_fndecl_stop_string;
81 tree gfor_fndecl_runtime_error;
82 tree gfor_fndecl_runtime_error_at;
83 tree gfor_fndecl_runtime_warning_at;
84 tree gfor_fndecl_os_error;
85 tree gfor_fndecl_generate_error;
86 tree gfor_fndecl_set_fpe;
87 tree gfor_fndecl_set_options;
88 tree gfor_fndecl_set_convert;
89 tree gfor_fndecl_set_record_marker;
90 tree gfor_fndecl_set_max_subrecord_length;
91 tree gfor_fndecl_ctime;
92 tree gfor_fndecl_fdate;
93 tree gfor_fndecl_ttynam;
94 tree gfor_fndecl_in_pack;
95 tree gfor_fndecl_in_unpack;
96 tree gfor_fndecl_associated;
99 /* Math functions. Many other math functions are handled in
100 trans-intrinsic.c. */
102 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
103 tree gfor_fndecl_math_ishftc4;
104 tree gfor_fndecl_math_ishftc8;
105 tree gfor_fndecl_math_ishftc16;
108 /* String functions. */
110 tree gfor_fndecl_compare_string;
111 tree gfor_fndecl_concat_string;
112 tree gfor_fndecl_string_len_trim;
113 tree gfor_fndecl_string_index;
114 tree gfor_fndecl_string_scan;
115 tree gfor_fndecl_string_verify;
116 tree gfor_fndecl_string_trim;
117 tree gfor_fndecl_string_minmax;
118 tree gfor_fndecl_adjustl;
119 tree gfor_fndecl_adjustr;
120 tree gfor_fndecl_select_string;
121 tree gfor_fndecl_compare_string_char4;
122 tree gfor_fndecl_concat_string_char4;
123 tree gfor_fndecl_string_len_trim_char4;
124 tree gfor_fndecl_string_index_char4;
125 tree gfor_fndecl_string_scan_char4;
126 tree gfor_fndecl_string_verify_char4;
127 tree gfor_fndecl_string_trim_char4;
128 tree gfor_fndecl_string_minmax_char4;
129 tree gfor_fndecl_adjustl_char4;
130 tree gfor_fndecl_adjustr_char4;
131 tree gfor_fndecl_select_string_char4;
134 /* Conversion between character kinds. */
135 tree gfor_fndecl_convert_char1_to_char4;
136 tree gfor_fndecl_convert_char4_to_char1;
139 /* Other misc. runtime library functions. */
141 tree gfor_fndecl_size0;
142 tree gfor_fndecl_size1;
143 tree gfor_fndecl_iargc;
145 /* Intrinsic functions implemented in Fortran. */
146 tree gfor_fndecl_sc_kind;
147 tree gfor_fndecl_si_kind;
148 tree gfor_fndecl_sr_kind;
150 /* BLAS gemm functions. */
151 tree gfor_fndecl_sgemm;
152 tree gfor_fndecl_dgemm;
153 tree gfor_fndecl_cgemm;
154 tree gfor_fndecl_zgemm;
157 static void
158 gfc_add_decl_to_parent_function (tree decl)
160 gcc_assert (decl);
161 DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
162 DECL_NONLOCAL (decl) = 1;
163 TREE_CHAIN (decl) = saved_parent_function_decls;
164 saved_parent_function_decls = decl;
167 void
168 gfc_add_decl_to_function (tree decl)
170 gcc_assert (decl);
171 TREE_USED (decl) = 1;
172 DECL_CONTEXT (decl) = current_function_decl;
173 TREE_CHAIN (decl) = saved_function_decls;
174 saved_function_decls = decl;
178 /* Build a backend label declaration. Set TREE_USED for named labels.
179 The context of the label is always the current_function_decl. All
180 labels are marked artificial. */
182 tree
183 gfc_build_label_decl (tree label_id)
185 /* 2^32 temporaries should be enough. */
186 static unsigned int tmp_num = 1;
187 tree label_decl;
188 char *label_name;
190 if (label_id == NULL_TREE)
192 /* Build an internal label name. */
193 ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
194 label_id = get_identifier (label_name);
196 else
197 label_name = NULL;
199 /* Build the LABEL_DECL node. Labels have no type. */
200 label_decl = build_decl (LABEL_DECL, label_id, void_type_node);
201 DECL_CONTEXT (label_decl) = current_function_decl;
202 DECL_MODE (label_decl) = VOIDmode;
204 /* We always define the label as used, even if the original source
205 file never references the label. We don't want all kinds of
206 spurious warnings for old-style Fortran code with too many
207 labels. */
208 TREE_USED (label_decl) = 1;
210 DECL_ARTIFICIAL (label_decl) = 1;
211 return label_decl;
215 /* Returns the return label for the current function. */
217 tree
218 gfc_get_return_label (void)
220 char name[GFC_MAX_SYMBOL_LEN + 10];
222 if (current_function_return_label)
223 return current_function_return_label;
225 sprintf (name, "__return_%s",
226 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
228 current_function_return_label =
229 gfc_build_label_decl (get_identifier (name));
231 DECL_ARTIFICIAL (current_function_return_label) = 1;
233 return current_function_return_label;
237 /* Set the backend source location of a decl. */
239 void
240 gfc_set_decl_location (tree decl, locus * loc)
242 DECL_SOURCE_LOCATION (decl) = loc->lb->location;
246 /* Return the backend label declaration for a given label structure,
247 or create it if it doesn't exist yet. */
249 tree
250 gfc_get_label_decl (gfc_st_label * lp)
252 if (lp->backend_decl)
253 return lp->backend_decl;
254 else
256 char label_name[GFC_MAX_SYMBOL_LEN + 1];
257 tree label_decl;
259 /* Validate the label declaration from the front end. */
260 gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
262 /* Build a mangled name for the label. */
263 sprintf (label_name, "__label_%.6d", lp->value);
265 /* Build the LABEL_DECL node. */
266 label_decl = gfc_build_label_decl (get_identifier (label_name));
268 /* Tell the debugger where the label came from. */
269 if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
270 gfc_set_decl_location (label_decl, &lp->where);
271 else
272 DECL_ARTIFICIAL (label_decl) = 1;
274 /* Store the label in the label list and return the LABEL_DECL. */
275 lp->backend_decl = label_decl;
276 return label_decl;
281 /* Convert a gfc_symbol to an identifier of the same name. */
283 static tree
284 gfc_sym_identifier (gfc_symbol * sym)
286 return (get_identifier (sym->name));
290 /* Construct mangled name from symbol name. */
292 static tree
293 gfc_sym_mangled_identifier (gfc_symbol * sym)
295 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
297 /* Prevent the mangling of identifiers that have an assigned
298 binding label (mainly those that are bind(c)). */
299 if (sym->attr.is_bind_c == 1
300 && sym->binding_label[0] != '\0')
301 return get_identifier(sym->binding_label);
303 if (sym->module == NULL)
304 return gfc_sym_identifier (sym);
305 else
307 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
308 return get_identifier (name);
313 /* Construct mangled function name from symbol name. */
315 static tree
316 gfc_sym_mangled_function_id (gfc_symbol * sym)
318 int has_underscore;
319 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
321 /* It may be possible to simply use the binding label if it's
322 provided, and remove the other checks. Then we could use it
323 for other things if we wished. */
324 if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
325 sym->binding_label[0] != '\0')
326 /* use the binding label rather than the mangled name */
327 return get_identifier (sym->binding_label);
329 if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
330 || (sym->module != NULL && (sym->attr.external
331 || sym->attr.if_source == IFSRC_IFBODY)))
333 /* Main program is mangled into MAIN__. */
334 if (sym->attr.is_main_program)
335 return get_identifier ("MAIN__");
337 /* Intrinsic procedures are never mangled. */
338 if (sym->attr.proc == PROC_INTRINSIC)
339 return get_identifier (sym->name);
341 if (gfc_option.flag_underscoring)
343 has_underscore = strchr (sym->name, '_') != 0;
344 if (gfc_option.flag_second_underscore && has_underscore)
345 snprintf (name, sizeof name, "%s__", sym->name);
346 else
347 snprintf (name, sizeof name, "%s_", sym->name);
348 return get_identifier (name);
350 else
351 return get_identifier (sym->name);
353 else
355 snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
356 return get_identifier (name);
361 /* Returns true if a variable of specified size should go on the stack. */
364 gfc_can_put_var_on_stack (tree size)
366 unsigned HOST_WIDE_INT low;
368 if (!INTEGER_CST_P (size))
369 return 0;
371 if (gfc_option.flag_max_stack_var_size < 0)
372 return 1;
374 if (TREE_INT_CST_HIGH (size) != 0)
375 return 0;
377 low = TREE_INT_CST_LOW (size);
378 if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
379 return 0;
381 /* TODO: Set a per-function stack size limit. */
383 return 1;
387 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
388 an expression involving its corresponding pointer. There are
389 2 cases; one for variable size arrays, and one for everything else,
390 because variable-sized arrays require one fewer level of
391 indirection. */
393 static void
394 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
396 tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
397 tree value;
399 /* Parameters need to be dereferenced. */
400 if (sym->cp_pointer->attr.dummy)
401 ptr_decl = build_fold_indirect_ref (ptr_decl);
403 /* Check to see if we're dealing with a variable-sized array. */
404 if (sym->attr.dimension
405 && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
407 /* These decls will be dereferenced later, so we don't dereference
408 them here. */
409 value = convert (TREE_TYPE (decl), ptr_decl);
411 else
413 ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
414 ptr_decl);
415 value = build_fold_indirect_ref (ptr_decl);
418 SET_DECL_VALUE_EXPR (decl, value);
419 DECL_HAS_VALUE_EXPR_P (decl) = 1;
420 GFC_DECL_CRAY_POINTEE (decl) = 1;
421 /* This is a fake variable just for debugging purposes. */
422 TREE_ASM_WRITTEN (decl) = 1;
426 /* Finish processing of a declaration without an initial value. */
428 static void
429 gfc_finish_decl (tree decl)
431 gcc_assert (TREE_CODE (decl) == PARM_DECL
432 || DECL_INITIAL (decl) == NULL_TREE);
434 if (TREE_CODE (decl) != VAR_DECL)
435 return;
437 if (DECL_SIZE (decl) == NULL_TREE
438 && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
439 layout_decl (decl, 0);
441 /* A few consistency checks. */
442 /* A static variable with an incomplete type is an error if it is
443 initialized. Also if it is not file scope. Otherwise, let it
444 through, but if it is not `extern' then it may cause an error
445 message later. */
446 /* An automatic variable with an incomplete type is an error. */
448 /* We should know the storage size. */
449 gcc_assert (DECL_SIZE (decl) != NULL_TREE
450 || (TREE_STATIC (decl)
451 ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
452 : DECL_EXTERNAL (decl)));
454 /* The storage size should be constant. */
455 gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
456 || !DECL_SIZE (decl)
457 || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
461 /* Apply symbol attributes to a variable, and add it to the function scope. */
463 static void
464 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
466 tree new_type;
467 /* TREE_ADDRESSABLE means the address of this variable is actually needed.
468 This is the equivalent of the TARGET variables.
469 We also need to set this if the variable is passed by reference in a
470 CALL statement. */
472 /* Set DECL_VALUE_EXPR for Cray Pointees. */
473 if (sym->attr.cray_pointee)
474 gfc_finish_cray_pointee (decl, sym);
476 if (sym->attr.target)
477 TREE_ADDRESSABLE (decl) = 1;
478 /* If it wasn't used we wouldn't be getting it. */
479 TREE_USED (decl) = 1;
481 /* Chain this decl to the pending declarations. Don't do pushdecl()
482 because this would add them to the current scope rather than the
483 function scope. */
484 if (current_function_decl != NULL_TREE)
486 if (sym->ns->proc_name->backend_decl == current_function_decl
487 || sym->result == sym)
488 gfc_add_decl_to_function (decl);
489 else
490 gfc_add_decl_to_parent_function (decl);
493 if (sym->attr.cray_pointee)
494 return;
496 if(sym->attr.is_bind_c == 1)
498 /* We need to put variables that are bind(c) into the common
499 segment of the object file, because this is what C would do.
500 gfortran would typically put them in either the BSS or
501 initialized data segments, and only mark them as common if
502 they were part of common blocks. However, if they are not put
503 into common space, then C cannot initialize global fortran
504 variables that it interoperates with and the draft says that
505 either Fortran or C should be able to initialize it (but not
506 both, of course.) (J3/04-007, section 15.3). */
507 TREE_PUBLIC(decl) = 1;
508 DECL_COMMON(decl) = 1;
511 /* If a variable is USE associated, it's always external. */
512 if (sym->attr.use_assoc)
514 DECL_EXTERNAL (decl) = 1;
515 TREE_PUBLIC (decl) = 1;
517 else if (sym->module && !sym->attr.result && !sym->attr.dummy)
519 /* TODO: Don't set sym->module for result or dummy variables. */
520 gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
521 /* This is the declaration of a module variable. */
522 TREE_PUBLIC (decl) = 1;
523 TREE_STATIC (decl) = 1;
526 /* Derived types are a bit peculiar because of the possibility of
527 a default initializer; this must be applied each time the variable
528 comes into scope it therefore need not be static. These variables
529 are SAVE_NONE but have an initializer. Otherwise explicitly
530 initialized variables are SAVE_IMPLICIT and explicitly saved are
531 SAVE_EXPLICIT. */
532 if (!sym->attr.use_assoc
533 && (sym->attr.save != SAVE_NONE || sym->attr.data
534 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
535 TREE_STATIC (decl) = 1;
537 if (sym->attr.volatile_)
539 TREE_THIS_VOLATILE (decl) = 1;
540 new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
541 TREE_TYPE (decl) = new_type;
544 /* Keep variables larger than max-stack-var-size off stack. */
545 if (!sym->ns->proc_name->attr.recursive
546 && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
547 && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
548 /* Put variable length auto array pointers always into stack. */
549 && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
550 || sym->attr.dimension == 0
551 || sym->as->type != AS_EXPLICIT
552 || sym->attr.pointer
553 || sym->attr.allocatable)
554 && !DECL_ARTIFICIAL (decl))
555 TREE_STATIC (decl) = 1;
557 /* Handle threadprivate variables. */
558 if (sym->attr.threadprivate
559 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
560 DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
564 /* Allocate the lang-specific part of a decl. */
566 void
567 gfc_allocate_lang_decl (tree decl)
569 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
570 ggc_alloc_cleared (sizeof (struct lang_decl));
573 /* Remember a symbol to generate initialization/cleanup code at function
574 entry/exit. */
576 static void
577 gfc_defer_symbol_init (gfc_symbol * sym)
579 gfc_symbol *p;
580 gfc_symbol *last;
581 gfc_symbol *head;
583 /* Don't add a symbol twice. */
584 if (sym->tlink)
585 return;
587 last = head = sym->ns->proc_name;
588 p = last->tlink;
590 /* Make sure that setup code for dummy variables which are used in the
591 setup of other variables is generated first. */
592 if (sym->attr.dummy)
594 /* Find the first dummy arg seen after us, or the first non-dummy arg.
595 This is a circular list, so don't go past the head. */
596 while (p != head
597 && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
599 last = p;
600 p = p->tlink;
603 /* Insert in between last and p. */
604 last->tlink = sym;
605 sym->tlink = p;
609 /* Create an array index type variable with function scope. */
611 static tree
612 create_index_var (const char * pfx, int nest)
614 tree decl;
616 decl = gfc_create_var_np (gfc_array_index_type, pfx);
617 if (nest)
618 gfc_add_decl_to_parent_function (decl);
619 else
620 gfc_add_decl_to_function (decl);
621 return decl;
625 /* Create variables to hold all the non-constant bits of info for a
626 descriptorless array. Remember these in the lang-specific part of the
627 type. */
629 static void
630 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
632 tree type;
633 int dim;
634 int nest;
636 type = TREE_TYPE (decl);
638 /* We just use the descriptor, if there is one. */
639 if (GFC_DESCRIPTOR_TYPE_P (type))
640 return;
642 gcc_assert (GFC_ARRAY_TYPE_P (type));
643 nest = (sym->ns->proc_name->backend_decl != current_function_decl)
644 && !sym->attr.contained;
646 for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
648 if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
650 GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
651 TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
653 /* Don't try to use the unknown bound for assumed shape arrays. */
654 if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
655 && (sym->as->type != AS_ASSUMED_SIZE
656 || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
658 GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
659 TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
662 if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
664 GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
665 TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
668 if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
670 GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
671 "offset");
672 TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
674 if (nest)
675 gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
676 else
677 gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
680 if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
681 && sym->as->type != AS_ASSUMED_SIZE)
683 GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
684 TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
687 if (POINTER_TYPE_P (type))
689 gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
690 gcc_assert (TYPE_LANG_SPECIFIC (type)
691 == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
692 type = TREE_TYPE (type);
695 if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
697 tree size, range;
699 size = fold_build2 (MINUS_EXPR, gfc_array_index_type,
700 GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
701 range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
702 size);
703 TYPE_DOMAIN (type) = range;
704 layout_type (type);
707 if (nest || write_symbols == NO_DEBUG)
708 return;
710 if (TYPE_NAME (type) != NULL_TREE
711 && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE
712 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL)
714 tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
716 for (dim = 0; dim < sym->as->rank - 1; dim++)
718 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
719 gtype = TREE_TYPE (gtype);
721 gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
722 if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL)
723 TYPE_NAME (type) = NULL_TREE;
726 if (TYPE_NAME (type) == NULL_TREE)
728 tree gtype = TREE_TYPE (type), rtype, type_decl;
730 for (dim = sym->as->rank - 1; dim >= 0; dim--)
732 rtype = build_range_type (gfc_array_index_type,
733 GFC_TYPE_ARRAY_LBOUND (type, dim),
734 GFC_TYPE_ARRAY_UBOUND (type, dim));
735 gtype = build_array_type (gtype, rtype);
736 /* Ensure the bound variables aren't optimized out at -O0. */
737 if (!optimize)
739 if (GFC_TYPE_ARRAY_LBOUND (type, dim)
740 && TREE_CODE (GFC_TYPE_ARRAY_LBOUND (type, dim)) == VAR_DECL)
741 DECL_IGNORED_P (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 0;
742 if (GFC_TYPE_ARRAY_UBOUND (type, dim)
743 && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, dim)) == VAR_DECL)
744 DECL_IGNORED_P (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 0;
747 TYPE_NAME (type) = type_decl = build_decl (TYPE_DECL, NULL, gtype);
748 DECL_ORIGINAL_TYPE (type_decl) = gtype;
753 /* For some dummy arguments we don't use the actual argument directly.
754 Instead we create a local decl and use that. This allows us to perform
755 initialization, and construct full type information. */
757 static tree
758 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
760 tree decl;
761 tree type;
762 gfc_array_spec *as;
763 char *name;
764 gfc_packed packed;
765 int n;
766 bool known_size;
768 if (sym->attr.pointer || sym->attr.allocatable)
769 return dummy;
771 /* Add to list of variables if not a fake result variable. */
772 if (sym->attr.result || sym->attr.dummy)
773 gfc_defer_symbol_init (sym);
775 type = TREE_TYPE (dummy);
776 gcc_assert (TREE_CODE (dummy) == PARM_DECL
777 && POINTER_TYPE_P (type));
779 /* Do we know the element size? */
780 known_size = sym->ts.type != BT_CHARACTER
781 || INTEGER_CST_P (sym->ts.cl->backend_decl);
783 if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
785 /* For descriptorless arrays with known element size the actual
786 argument is sufficient. */
787 gcc_assert (GFC_ARRAY_TYPE_P (type));
788 gfc_build_qualified_array (dummy, sym);
789 return dummy;
792 type = TREE_TYPE (type);
793 if (GFC_DESCRIPTOR_TYPE_P (type))
795 /* Create a descriptorless array pointer. */
796 as = sym->as;
797 packed = PACKED_NO;
799 /* Even when -frepack-arrays is used, symbols with TARGET attribute
800 are not repacked. */
801 if (!gfc_option.flag_repack_arrays || sym->attr.target)
803 if (as->type == AS_ASSUMED_SIZE)
804 packed = PACKED_FULL;
806 else
808 if (as->type == AS_EXPLICIT)
810 packed = PACKED_FULL;
811 for (n = 0; n < as->rank; n++)
813 if (!(as->upper[n]
814 && as->lower[n]
815 && as->upper[n]->expr_type == EXPR_CONSTANT
816 && as->lower[n]->expr_type == EXPR_CONSTANT))
817 packed = PACKED_PARTIAL;
820 else
821 packed = PACKED_PARTIAL;
824 type = gfc_typenode_for_spec (&sym->ts);
825 type = gfc_get_nodesc_array_type (type, sym->as, packed);
827 else
829 /* We now have an expression for the element size, so create a fully
830 qualified type. Reset sym->backend decl or this will just return the
831 old type. */
832 DECL_ARTIFICIAL (sym->backend_decl) = 1;
833 sym->backend_decl = NULL_TREE;
834 type = gfc_sym_type (sym);
835 packed = PACKED_FULL;
838 ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
839 decl = build_decl (VAR_DECL, get_identifier (name), type);
841 DECL_ARTIFICIAL (decl) = 1;
842 TREE_PUBLIC (decl) = 0;
843 TREE_STATIC (decl) = 0;
844 DECL_EXTERNAL (decl) = 0;
846 /* We should never get deferred shape arrays here. We used to because of
847 frontend bugs. */
848 gcc_assert (sym->as->type != AS_DEFERRED);
850 if (packed == PACKED_PARTIAL)
851 GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
852 else if (packed == PACKED_FULL)
853 GFC_DECL_PACKED_ARRAY (decl) = 1;
855 gfc_build_qualified_array (decl, sym);
857 if (DECL_LANG_SPECIFIC (dummy))
858 DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
859 else
860 gfc_allocate_lang_decl (decl);
862 GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
864 if (sym->ns->proc_name->backend_decl == current_function_decl
865 || sym->attr.contained)
866 gfc_add_decl_to_function (decl);
867 else
868 gfc_add_decl_to_parent_function (decl);
870 return decl;
874 /* Return a constant or a variable to use as a string length. Does not
875 add the decl to the current scope. */
877 static tree
878 gfc_create_string_length (gfc_symbol * sym)
880 tree length;
882 gcc_assert (sym->ts.cl);
883 gfc_conv_const_charlen (sym->ts.cl);
885 if (sym->ts.cl->backend_decl == NULL_TREE)
887 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
889 /* Also prefix the mangled name. */
890 strcpy (&name[1], sym->name);
891 name[0] = '.';
892 length = build_decl (VAR_DECL, get_identifier (name),
893 gfc_charlen_type_node);
894 DECL_ARTIFICIAL (length) = 1;
895 TREE_USED (length) = 1;
896 if (sym->ns->proc_name->tlink != NULL)
897 gfc_defer_symbol_init (sym);
898 sym->ts.cl->backend_decl = length;
901 return sym->ts.cl->backend_decl;
904 /* If a variable is assigned a label, we add another two auxiliary
905 variables. */
907 static void
908 gfc_add_assign_aux_vars (gfc_symbol * sym)
910 tree addr;
911 tree length;
912 tree decl;
914 gcc_assert (sym->backend_decl);
916 decl = sym->backend_decl;
917 gfc_allocate_lang_decl (decl);
918 GFC_DECL_ASSIGN (decl) = 1;
919 length = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
920 gfc_charlen_type_node);
921 addr = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
922 pvoid_type_node);
923 gfc_finish_var_decl (length, sym);
924 gfc_finish_var_decl (addr, sym);
925 /* STRING_LENGTH is also used as flag. Less than -1 means that
926 ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
927 target label's address. Otherwise, value is the length of a format string
928 and ASSIGN_ADDR is its address. */
929 if (TREE_STATIC (length))
930 DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
931 else
932 gfc_defer_symbol_init (sym);
934 GFC_DECL_STRING_LEN (decl) = length;
935 GFC_DECL_ASSIGN_ADDR (decl) = addr;
938 /* Return the decl for a gfc_symbol, create it if it doesn't already
939 exist. */
941 tree
942 gfc_get_symbol_decl (gfc_symbol * sym)
944 tree decl;
945 tree length = NULL_TREE;
946 int byref;
948 gcc_assert (sym->attr.referenced
949 || sym->attr.use_assoc
950 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY);
952 if (sym->ns && sym->ns->proc_name->attr.function)
953 byref = gfc_return_by_reference (sym->ns->proc_name);
954 else
955 byref = 0;
957 if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
959 /* Return via extra parameter. */
960 if (sym->attr.result && byref
961 && !sym->backend_decl)
963 sym->backend_decl =
964 DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
965 /* For entry master function skip over the __entry
966 argument. */
967 if (sym->ns->proc_name->attr.entry_master)
968 sym->backend_decl = TREE_CHAIN (sym->backend_decl);
971 /* Dummy variables should already have been created. */
972 gcc_assert (sym->backend_decl);
974 /* Create a character length variable. */
975 if (sym->ts.type == BT_CHARACTER)
977 if (sym->ts.cl->backend_decl == NULL_TREE)
978 length = gfc_create_string_length (sym);
979 else
980 length = sym->ts.cl->backend_decl;
981 if (TREE_CODE (length) == VAR_DECL
982 && DECL_CONTEXT (length) == NULL_TREE)
984 /* Add the string length to the same context as the symbol. */
985 if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
986 gfc_add_decl_to_function (length);
987 else
988 gfc_add_decl_to_parent_function (length);
990 gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
991 DECL_CONTEXT (length));
993 gfc_defer_symbol_init (sym);
997 /* Use a copy of the descriptor for dummy arrays. */
998 if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
1000 decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
1001 /* Prevent the dummy from being detected as unused if it is copied. */
1002 if (sym->backend_decl != NULL && decl != sym->backend_decl)
1003 DECL_ARTIFICIAL (sym->backend_decl) = 1;
1004 sym->backend_decl = decl;
1007 TREE_USED (sym->backend_decl) = 1;
1008 if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
1010 gfc_add_assign_aux_vars (sym);
1012 return sym->backend_decl;
1015 if (sym->backend_decl)
1016 return sym->backend_decl;
1018 /* Catch function declarations. Only used for actual parameters. */
1019 if (sym->attr.flavor == FL_PROCEDURE)
1021 decl = gfc_get_extern_function_decl (sym);
1022 return decl;
1025 if (sym->attr.intrinsic)
1026 internal_error ("intrinsic variable which isn't a procedure");
1028 /* Create string length decl first so that they can be used in the
1029 type declaration. */
1030 if (sym->ts.type == BT_CHARACTER)
1031 length = gfc_create_string_length (sym);
1033 /* Create the decl for the variable. */
1034 decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
1036 gfc_set_decl_location (decl, &sym->declared_at);
1038 /* Symbols from modules should have their assembler names mangled.
1039 This is done here rather than in gfc_finish_var_decl because it
1040 is different for string length variables. */
1041 if (sym->module)
1043 SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym));
1044 if (sym->attr.use_assoc)
1045 DECL_IGNORED_P (decl) = 1;
1048 if (sym->attr.dimension)
1050 /* Create variables to hold the non-constant bits of array info. */
1051 gfc_build_qualified_array (decl, sym);
1053 /* Remember this variable for allocation/cleanup. */
1054 gfc_defer_symbol_init (sym);
1056 if ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer)
1057 GFC_DECL_PACKED_ARRAY (decl) = 1;
1060 if (sym->ts.type == BT_DERIVED && sym->ts.derived->attr.alloc_comp)
1061 gfc_defer_symbol_init (sym);
1062 /* This applies a derived type default initializer. */
1063 else if (sym->ts.type == BT_DERIVED
1064 && sym->attr.save == SAVE_NONE
1065 && !sym->attr.data
1066 && !sym->attr.allocatable
1067 && (sym->value && !sym->ns->proc_name->attr.is_main_program)
1068 && !sym->attr.use_assoc)
1069 gfc_defer_symbol_init (sym);
1071 gfc_finish_var_decl (decl, sym);
1073 if (sym->ts.type == BT_CHARACTER)
1075 /* Character variables need special handling. */
1076 gfc_allocate_lang_decl (decl);
1078 if (TREE_CODE (length) != INTEGER_CST)
1080 char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1082 if (sym->module)
1084 /* Also prefix the mangled name for symbols from modules. */
1085 strcpy (&name[1], sym->name);
1086 name[0] = '.';
1087 strcpy (&name[1],
1088 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
1089 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (name));
1091 gfc_finish_var_decl (length, sym);
1092 gcc_assert (!sym->value);
1095 else if (sym->attr.subref_array_pointer)
1097 /* We need the span for these beasts. */
1098 gfc_allocate_lang_decl (decl);
1101 if (sym->attr.subref_array_pointer)
1103 tree span;
1104 GFC_DECL_SUBREF_ARRAY_P (decl) = 1;
1105 span = build_decl (VAR_DECL, create_tmp_var_name ("span"),
1106 gfc_array_index_type);
1107 gfc_finish_var_decl (span, sym);
1108 TREE_STATIC (span) = TREE_STATIC (decl);
1109 DECL_ARTIFICIAL (span) = 1;
1110 DECL_INITIAL (span) = build_int_cst (gfc_array_index_type, 0);
1112 GFC_DECL_SPAN (decl) = span;
1113 GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span;
1116 sym->backend_decl = decl;
1118 if (sym->attr.assign)
1119 gfc_add_assign_aux_vars (sym);
1121 if (TREE_STATIC (decl) && !sym->attr.use_assoc)
1123 /* Add static initializer. */
1124 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1125 TREE_TYPE (decl), sym->attr.dimension,
1126 sym->attr.pointer || sym->attr.allocatable);
1129 return decl;
1133 /* Substitute a temporary variable in place of the real one. */
1135 void
1136 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1138 save->attr = sym->attr;
1139 save->decl = sym->backend_decl;
1141 gfc_clear_attr (&sym->attr);
1142 sym->attr.referenced = 1;
1143 sym->attr.flavor = FL_VARIABLE;
1145 sym->backend_decl = decl;
1149 /* Restore the original variable. */
1151 void
1152 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1154 sym->attr = save->attr;
1155 sym->backend_decl = save->decl;
1159 /* Declare a procedure pointer. */
1161 static tree
1162 get_proc_pointer_decl (gfc_symbol *sym)
1164 tree decl;
1166 decl = sym->backend_decl;
1167 if (decl)
1168 return decl;
1170 decl = build_decl (VAR_DECL, get_identifier (sym->name),
1171 build_pointer_type (gfc_get_function_type (sym)));
1173 if ((sym->ns->proc_name
1174 && sym->ns->proc_name->backend_decl == current_function_decl)
1175 || sym->attr.contained)
1176 gfc_add_decl_to_function (decl);
1177 else
1178 gfc_add_decl_to_parent_function (decl);
1180 sym->backend_decl = decl;
1182 if (!sym->attr.use_assoc
1183 && (sym->attr.save != SAVE_NONE || sym->attr.data
1184 || (sym->value && sym->ns->proc_name->attr.is_main_program)))
1185 TREE_STATIC (decl) = 1;
1187 if (TREE_STATIC (decl) && sym->value)
1189 /* Add static initializer. */
1190 DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1191 TREE_TYPE (decl), sym->attr.dimension, sym->attr.proc_pointer);
1194 return decl;
1198 /* Get a basic decl for an external function. */
1200 tree
1201 gfc_get_extern_function_decl (gfc_symbol * sym)
1203 tree type;
1204 tree fndecl;
1205 gfc_expr e;
1206 gfc_intrinsic_sym *isym;
1207 gfc_expr argexpr;
1208 char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'. */
1209 tree name;
1210 tree mangled_name;
1212 if (sym->backend_decl)
1213 return sym->backend_decl;
1215 /* We should never be creating external decls for alternate entry points.
1216 The procedure may be an alternate entry point, but we don't want/need
1217 to know that. */
1218 gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1220 if (sym->attr.proc_pointer)
1221 return get_proc_pointer_decl (sym);
1223 if (sym->attr.intrinsic)
1225 /* Call the resolution function to get the actual name. This is
1226 a nasty hack which relies on the resolution functions only looking
1227 at the first argument. We pass NULL for the second argument
1228 otherwise things like AINT get confused. */
1229 isym = gfc_find_function (sym->name);
1230 gcc_assert (isym->resolve.f0 != NULL);
1232 memset (&e, 0, sizeof (e));
1233 e.expr_type = EXPR_FUNCTION;
1235 memset (&argexpr, 0, sizeof (argexpr));
1236 gcc_assert (isym->formal);
1237 argexpr.ts = isym->formal->ts;
1239 if (isym->formal->next == NULL)
1240 isym->resolve.f1 (&e, &argexpr);
1241 else
1243 if (isym->formal->next->next == NULL)
1244 isym->resolve.f2 (&e, &argexpr, NULL);
1245 else
1247 if (isym->formal->next->next->next == NULL)
1248 isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1249 else
1251 /* All specific intrinsics take less than 5 arguments. */
1252 gcc_assert (isym->formal->next->next->next->next == NULL);
1253 isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
1258 if (gfc_option.flag_f2c
1259 && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1260 || e.ts.type == BT_COMPLEX))
1262 /* Specific which needs a different implementation if f2c
1263 calling conventions are used. */
1264 sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1266 else
1267 sprintf (s, "_gfortran_specific%s", e.value.function.name);
1269 name = get_identifier (s);
1270 mangled_name = name;
1272 else
1274 name = gfc_sym_identifier (sym);
1275 mangled_name = gfc_sym_mangled_function_id (sym);
1278 type = gfc_get_function_type (sym);
1279 fndecl = build_decl (FUNCTION_DECL, name, type);
1281 SET_DECL_ASSEMBLER_NAME (fndecl, mangled_name);
1282 /* If the return type is a pointer, avoid alias issues by setting
1283 DECL_IS_MALLOC to nonzero. This means that the function should be
1284 treated as if it were a malloc, meaning it returns a pointer that
1285 is not an alias. */
1286 if (POINTER_TYPE_P (type))
1287 DECL_IS_MALLOC (fndecl) = 1;
1289 /* Set the context of this decl. */
1290 if (0 && sym->ns && sym->ns->proc_name)
1292 /* TODO: Add external decls to the appropriate scope. */
1293 DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1295 else
1297 /* Global declaration, e.g. intrinsic subroutine. */
1298 DECL_CONTEXT (fndecl) = NULL_TREE;
1301 DECL_EXTERNAL (fndecl) = 1;
1303 /* This specifies if a function is globally addressable, i.e. it is
1304 the opposite of declaring static in C. */
1305 TREE_PUBLIC (fndecl) = 1;
1307 /* Set attributes for PURE functions. A call to PURE function in the
1308 Fortran 95 sense is both pure and without side effects in the C
1309 sense. */
1310 if (sym->attr.pure || sym->attr.elemental)
1312 if (sym->attr.function && !gfc_return_by_reference (sym))
1313 DECL_PURE_P (fndecl) = 1;
1314 /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1315 parameters and don't use alternate returns (is this
1316 allowed?). In that case, calls to them are meaningless, and
1317 can be optimized away. See also in build_function_decl(). */
1318 TREE_SIDE_EFFECTS (fndecl) = 0;
1321 /* Mark non-returning functions. */
1322 if (sym->attr.noreturn)
1323 TREE_THIS_VOLATILE(fndecl) = 1;
1325 sym->backend_decl = fndecl;
1327 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1328 pushdecl_top_level (fndecl);
1330 return fndecl;
1334 /* Create a declaration for a procedure. For external functions (in the C
1335 sense) use gfc_get_extern_function_decl. HAS_ENTRIES is true if this is
1336 a master function with alternate entry points. */
1338 static void
1339 build_function_decl (gfc_symbol * sym)
1341 tree fndecl, type;
1342 symbol_attribute attr;
1343 tree result_decl;
1344 gfc_formal_arglist *f;
1346 gcc_assert (!sym->backend_decl);
1347 gcc_assert (!sym->attr.external);
1349 /* Set the line and filename. sym->declared_at seems to point to the
1350 last statement for subroutines, but it'll do for now. */
1351 gfc_set_backend_locus (&sym->declared_at);
1353 /* Allow only one nesting level. Allow public declarations. */
1354 gcc_assert (current_function_decl == NULL_TREE
1355 || DECL_CONTEXT (current_function_decl) == NULL_TREE
1356 || TREE_CODE (DECL_CONTEXT (current_function_decl))
1357 == NAMESPACE_DECL);
1359 type = gfc_get_function_type (sym);
1360 fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type);
1362 /* Perform name mangling if this is a top level or module procedure. */
1363 if (current_function_decl == NULL_TREE)
1364 SET_DECL_ASSEMBLER_NAME (fndecl, gfc_sym_mangled_function_id (sym));
1366 /* Figure out the return type of the declared function, and build a
1367 RESULT_DECL for it. If this is a subroutine with alternate
1368 returns, build a RESULT_DECL for it. */
1369 attr = sym->attr;
1371 result_decl = NULL_TREE;
1372 /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)). */
1373 if (attr.function)
1375 if (gfc_return_by_reference (sym))
1376 type = void_type_node;
1377 else
1379 if (sym->result != sym)
1380 result_decl = gfc_sym_identifier (sym->result);
1382 type = TREE_TYPE (TREE_TYPE (fndecl));
1385 else
1387 /* Look for alternate return placeholders. */
1388 int has_alternate_returns = 0;
1389 for (f = sym->formal; f; f = f->next)
1391 if (f->sym == NULL)
1393 has_alternate_returns = 1;
1394 break;
1398 if (has_alternate_returns)
1399 type = integer_type_node;
1400 else
1401 type = void_type_node;
1404 result_decl = build_decl (RESULT_DECL, result_decl, type);
1405 DECL_ARTIFICIAL (result_decl) = 1;
1406 DECL_IGNORED_P (result_decl) = 1;
1407 DECL_CONTEXT (result_decl) = fndecl;
1408 DECL_RESULT (fndecl) = result_decl;
1410 /* Don't call layout_decl for a RESULT_DECL.
1411 layout_decl (result_decl, 0); */
1413 /* If the return type is a pointer, avoid alias issues by setting
1414 DECL_IS_MALLOC to nonzero. This means that the function should be
1415 treated as if it were a malloc, meaning it returns a pointer that
1416 is not an alias. */
1417 if (POINTER_TYPE_P (type))
1418 DECL_IS_MALLOC (fndecl) = 1;
1420 /* Set up all attributes for the function. */
1421 DECL_CONTEXT (fndecl) = current_function_decl;
1422 DECL_EXTERNAL (fndecl) = 0;
1424 /* This specifies if a function is globally visible, i.e. it is
1425 the opposite of declaring static in C. */
1426 if (DECL_CONTEXT (fndecl) == NULL_TREE
1427 && !sym->attr.entry_master)
1428 TREE_PUBLIC (fndecl) = 1;
1430 /* TREE_STATIC means the function body is defined here. */
1431 TREE_STATIC (fndecl) = 1;
1433 /* Set attributes for PURE functions. A call to a PURE function in the
1434 Fortran 95 sense is both pure and without side effects in the C
1435 sense. */
1436 if (attr.pure || attr.elemental)
1438 /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1439 including an alternate return. In that case it can also be
1440 marked as PURE. See also in gfc_get_extern_function_decl(). */
1441 if (attr.function && !gfc_return_by_reference (sym))
1442 DECL_PURE_P (fndecl) = 1;
1443 TREE_SIDE_EFFECTS (fndecl) = 0;
1446 /* For -fwhole-program to work well, the main program needs to have the
1447 "externally_visible" attribute. */
1448 if (attr.is_main_program)
1449 DECL_ATTRIBUTES (fndecl)
1450 = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
1452 /* Layout the function declaration and put it in the binding level
1453 of the current function. */
1454 pushdecl (fndecl);
1456 sym->backend_decl = fndecl;
1460 /* Create the DECL_ARGUMENTS for a procedure. */
1462 static void
1463 create_function_arglist (gfc_symbol * sym)
1465 tree fndecl;
1466 gfc_formal_arglist *f;
1467 tree typelist, hidden_typelist;
1468 tree arglist, hidden_arglist;
1469 tree type;
1470 tree parm;
1472 fndecl = sym->backend_decl;
1474 /* Build formal argument list. Make sure that their TREE_CONTEXT is
1475 the new FUNCTION_DECL node. */
1476 arglist = NULL_TREE;
1477 hidden_arglist = NULL_TREE;
1478 typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1480 if (sym->attr.entry_master)
1482 type = TREE_VALUE (typelist);
1483 parm = build_decl (PARM_DECL, get_identifier ("__entry"), type);
1485 DECL_CONTEXT (parm) = fndecl;
1486 DECL_ARG_TYPE (parm) = type;
1487 TREE_READONLY (parm) = 1;
1488 gfc_finish_decl (parm);
1489 DECL_ARTIFICIAL (parm) = 1;
1491 arglist = chainon (arglist, parm);
1492 typelist = TREE_CHAIN (typelist);
1495 if (gfc_return_by_reference (sym))
1497 tree type = TREE_VALUE (typelist), length = NULL;
1499 if (sym->ts.type == BT_CHARACTER)
1501 /* Length of character result. */
1502 tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1503 gcc_assert (len_type == gfc_charlen_type_node);
1505 length = build_decl (PARM_DECL,
1506 get_identifier (".__result"),
1507 len_type);
1508 if (!sym->ts.cl->length)
1510 sym->ts.cl->backend_decl = length;
1511 TREE_USED (length) = 1;
1513 gcc_assert (TREE_CODE (length) == PARM_DECL);
1514 DECL_CONTEXT (length) = fndecl;
1515 DECL_ARG_TYPE (length) = len_type;
1516 TREE_READONLY (length) = 1;
1517 DECL_ARTIFICIAL (length) = 1;
1518 gfc_finish_decl (length);
1519 if (sym->ts.cl->backend_decl == NULL
1520 || sym->ts.cl->backend_decl == length)
1522 gfc_symbol *arg;
1523 tree backend_decl;
1525 if (sym->ts.cl->backend_decl == NULL)
1527 tree len = build_decl (VAR_DECL,
1528 get_identifier ("..__result"),
1529 gfc_charlen_type_node);
1530 DECL_ARTIFICIAL (len) = 1;
1531 TREE_USED (len) = 1;
1532 sym->ts.cl->backend_decl = len;
1535 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1536 arg = sym->result ? sym->result : sym;
1537 backend_decl = arg->backend_decl;
1538 /* Temporary clear it, so that gfc_sym_type creates complete
1539 type. */
1540 arg->backend_decl = NULL;
1541 type = gfc_sym_type (arg);
1542 arg->backend_decl = backend_decl;
1543 type = build_reference_type (type);
1547 parm = build_decl (PARM_DECL, get_identifier ("__result"), type);
1549 DECL_CONTEXT (parm) = fndecl;
1550 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1551 TREE_READONLY (parm) = 1;
1552 DECL_ARTIFICIAL (parm) = 1;
1553 gfc_finish_decl (parm);
1555 arglist = chainon (arglist, parm);
1556 typelist = TREE_CHAIN (typelist);
1558 if (sym->ts.type == BT_CHARACTER)
1560 gfc_allocate_lang_decl (parm);
1561 arglist = chainon (arglist, length);
1562 typelist = TREE_CHAIN (typelist);
1566 hidden_typelist = typelist;
1567 for (f = sym->formal; f; f = f->next)
1568 if (f->sym != NULL) /* Ignore alternate returns. */
1569 hidden_typelist = TREE_CHAIN (hidden_typelist);
1571 for (f = sym->formal; f; f = f->next)
1573 char name[GFC_MAX_SYMBOL_LEN + 2];
1575 /* Ignore alternate returns. */
1576 if (f->sym == NULL)
1577 continue;
1579 type = TREE_VALUE (typelist);
1581 if (f->sym->ts.type == BT_CHARACTER)
1583 tree len_type = TREE_VALUE (hidden_typelist);
1584 tree length = NULL_TREE;
1585 gcc_assert (len_type == gfc_charlen_type_node);
1587 strcpy (&name[1], f->sym->name);
1588 name[0] = '_';
1589 length = build_decl (PARM_DECL, get_identifier (name), len_type);
1591 hidden_arglist = chainon (hidden_arglist, length);
1592 DECL_CONTEXT (length) = fndecl;
1593 DECL_ARTIFICIAL (length) = 1;
1594 DECL_ARG_TYPE (length) = len_type;
1595 TREE_READONLY (length) = 1;
1596 gfc_finish_decl (length);
1598 /* TODO: Check string lengths when -fbounds-check. */
1600 /* Use the passed value for assumed length variables. */
1601 if (!f->sym->ts.cl->length)
1603 TREE_USED (length) = 1;
1604 gcc_assert (!f->sym->ts.cl->backend_decl);
1605 f->sym->ts.cl->backend_decl = length;
1608 hidden_typelist = TREE_CHAIN (hidden_typelist);
1610 if (f->sym->ts.cl->backend_decl == NULL
1611 || f->sym->ts.cl->backend_decl == length)
1613 if (f->sym->ts.cl->backend_decl == NULL)
1614 gfc_create_string_length (f->sym);
1616 /* Make sure PARM_DECL type doesn't point to incomplete type. */
1617 if (f->sym->attr.flavor == FL_PROCEDURE)
1618 type = build_pointer_type (gfc_get_function_type (f->sym));
1619 else
1620 type = gfc_sym_type (f->sym);
1624 /* For non-constant length array arguments, make sure they use
1625 a different type node from TYPE_ARG_TYPES type. */
1626 if (f->sym->attr.dimension
1627 && type == TREE_VALUE (typelist)
1628 && TREE_CODE (type) == POINTER_TYPE
1629 && GFC_ARRAY_TYPE_P (type)
1630 && f->sym->as->type != AS_ASSUMED_SIZE
1631 && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
1633 if (f->sym->attr.flavor == FL_PROCEDURE)
1634 type = build_pointer_type (gfc_get_function_type (f->sym));
1635 else
1636 type = gfc_sym_type (f->sym);
1639 if (f->sym->attr.proc_pointer)
1640 type = build_pointer_type (type);
1642 /* Build the argument declaration. */
1643 parm = build_decl (PARM_DECL, gfc_sym_identifier (f->sym), type);
1645 /* Fill in arg stuff. */
1646 DECL_CONTEXT (parm) = fndecl;
1647 DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1648 /* All implementation args are read-only. */
1649 TREE_READONLY (parm) = 1;
1650 if (POINTER_TYPE_P (type)
1651 && (!f->sym->attr.proc_pointer
1652 && f->sym->attr.flavor != FL_PROCEDURE))
1653 DECL_BY_REFERENCE (parm) = 1;
1655 gfc_finish_decl (parm);
1657 f->sym->backend_decl = parm;
1659 arglist = chainon (arglist, parm);
1660 typelist = TREE_CHAIN (typelist);
1663 /* Add the hidden string length parameters, unless the procedure
1664 is bind(C). */
1665 if (!sym->attr.is_bind_c)
1666 arglist = chainon (arglist, hidden_arglist);
1668 gcc_assert (hidden_typelist == NULL_TREE
1669 || TREE_VALUE (hidden_typelist) == void_type_node);
1670 DECL_ARGUMENTS (fndecl) = arglist;
1673 /* Convert FNDECL's code to GIMPLE and handle any nested functions. */
1675 static void
1676 gfc_gimplify_function (tree fndecl)
1678 struct cgraph_node *cgn;
1680 gimplify_function_tree (fndecl);
1681 dump_function (TDI_generic, fndecl);
1683 /* Generate errors for structured block violations. */
1684 /* ??? Could be done as part of resolve_labels. */
1685 if (flag_openmp)
1686 diagnose_omp_structured_block_errors (fndecl);
1688 /* Convert all nested functions to GIMPLE now. We do things in this order
1689 so that items like VLA sizes are expanded properly in the context of the
1690 correct function. */
1691 cgn = cgraph_node (fndecl);
1692 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1693 gfc_gimplify_function (cgn->decl);
1697 /* Do the setup necessary before generating the body of a function. */
1699 static void
1700 trans_function_start (gfc_symbol * sym)
1702 tree fndecl;
1704 fndecl = sym->backend_decl;
1706 /* Let GCC know the current scope is this function. */
1707 current_function_decl = fndecl;
1709 /* Let the world know what we're about to do. */
1710 announce_function (fndecl);
1712 if (DECL_CONTEXT (fndecl) == NULL_TREE)
1714 /* Create RTL for function declaration. */
1715 rest_of_decl_compilation (fndecl, 1, 0);
1718 /* Create RTL for function definition. */
1719 make_decl_rtl (fndecl);
1721 init_function_start (fndecl);
1723 /* Even though we're inside a function body, we still don't want to
1724 call expand_expr to calculate the size of a variable-sized array.
1725 We haven't necessarily assigned RTL to all variables yet, so it's
1726 not safe to try to expand expressions involving them. */
1727 cfun->dont_save_pending_sizes_p = 1;
1729 /* function.c requires a push at the start of the function. */
1730 pushlevel (0);
1733 /* Create thunks for alternate entry points. */
1735 static void
1736 build_entry_thunks (gfc_namespace * ns)
1738 gfc_formal_arglist *formal;
1739 gfc_formal_arglist *thunk_formal;
1740 gfc_entry_list *el;
1741 gfc_symbol *thunk_sym;
1742 stmtblock_t body;
1743 tree thunk_fndecl;
1744 tree args;
1745 tree string_args;
1746 tree tmp;
1747 locus old_loc;
1749 /* This should always be a toplevel function. */
1750 gcc_assert (current_function_decl == NULL_TREE);
1752 gfc_get_backend_locus (&old_loc);
1753 for (el = ns->entries; el; el = el->next)
1755 thunk_sym = el->sym;
1757 build_function_decl (thunk_sym);
1758 create_function_arglist (thunk_sym);
1760 trans_function_start (thunk_sym);
1762 thunk_fndecl = thunk_sym->backend_decl;
1764 gfc_start_block (&body);
1766 /* Pass extra parameter identifying this entry point. */
1767 tmp = build_int_cst (gfc_array_index_type, el->id);
1768 args = tree_cons (NULL_TREE, tmp, NULL_TREE);
1769 string_args = NULL_TREE;
1771 if (thunk_sym->attr.function)
1773 if (gfc_return_by_reference (ns->proc_name))
1775 tree ref = DECL_ARGUMENTS (current_function_decl);
1776 args = tree_cons (NULL_TREE, ref, args);
1777 if (ns->proc_name->ts.type == BT_CHARACTER)
1778 args = tree_cons (NULL_TREE, TREE_CHAIN (ref),
1779 args);
1783 for (formal = ns->proc_name->formal; formal; formal = formal->next)
1785 /* Ignore alternate returns. */
1786 if (formal->sym == NULL)
1787 continue;
1789 /* We don't have a clever way of identifying arguments, so resort to
1790 a brute-force search. */
1791 for (thunk_formal = thunk_sym->formal;
1792 thunk_formal;
1793 thunk_formal = thunk_formal->next)
1795 if (thunk_formal->sym == formal->sym)
1796 break;
1799 if (thunk_formal)
1801 /* Pass the argument. */
1802 DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
1803 args = tree_cons (NULL_TREE, thunk_formal->sym->backend_decl,
1804 args);
1805 if (formal->sym->ts.type == BT_CHARACTER)
1807 tmp = thunk_formal->sym->ts.cl->backend_decl;
1808 string_args = tree_cons (NULL_TREE, tmp, string_args);
1811 else
1813 /* Pass NULL for a missing argument. */
1814 args = tree_cons (NULL_TREE, null_pointer_node, args);
1815 if (formal->sym->ts.type == BT_CHARACTER)
1817 tmp = build_int_cst (gfc_charlen_type_node, 0);
1818 string_args = tree_cons (NULL_TREE, tmp, string_args);
1823 /* Call the master function. */
1824 args = nreverse (args);
1825 args = chainon (args, nreverse (string_args));
1826 tmp = ns->proc_name->backend_decl;
1827 tmp = build_function_call_expr (tmp, args);
1828 if (ns->proc_name->attr.mixed_entry_master)
1830 tree union_decl, field;
1831 tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
1833 union_decl = build_decl (VAR_DECL, get_identifier ("__result"),
1834 TREE_TYPE (master_type));
1835 DECL_ARTIFICIAL (union_decl) = 1;
1836 DECL_EXTERNAL (union_decl) = 0;
1837 TREE_PUBLIC (union_decl) = 0;
1838 TREE_USED (union_decl) = 1;
1839 layout_decl (union_decl, 0);
1840 pushdecl (union_decl);
1842 DECL_CONTEXT (union_decl) = current_function_decl;
1843 tmp = fold_build2 (MODIFY_EXPR, TREE_TYPE (union_decl),
1844 union_decl, tmp);
1845 gfc_add_expr_to_block (&body, tmp);
1847 for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
1848 field; field = TREE_CHAIN (field))
1849 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1850 thunk_sym->result->name) == 0)
1851 break;
1852 gcc_assert (field != NULL_TREE);
1853 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
1854 union_decl, field, NULL_TREE);
1855 tmp = fold_build2 (MODIFY_EXPR,
1856 TREE_TYPE (DECL_RESULT (current_function_decl)),
1857 DECL_RESULT (current_function_decl), tmp);
1858 tmp = build1_v (RETURN_EXPR, tmp);
1860 else if (TREE_TYPE (DECL_RESULT (current_function_decl))
1861 != void_type_node)
1863 tmp = fold_build2 (MODIFY_EXPR,
1864 TREE_TYPE (DECL_RESULT (current_function_decl)),
1865 DECL_RESULT (current_function_decl), tmp);
1866 tmp = build1_v (RETURN_EXPR, tmp);
1868 gfc_add_expr_to_block (&body, tmp);
1870 /* Finish off this function and send it for code generation. */
1871 DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
1872 poplevel (1, 0, 1);
1873 BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
1875 /* Output the GENERIC tree. */
1876 dump_function (TDI_original, thunk_fndecl);
1878 /* Store the end of the function, so that we get good line number
1879 info for the epilogue. */
1880 cfun->function_end_locus = input_location;
1882 /* We're leaving the context of this function, so zap cfun.
1883 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1884 tree_rest_of_compilation. */
1885 set_cfun (NULL);
1887 current_function_decl = NULL_TREE;
1889 gfc_gimplify_function (thunk_fndecl);
1890 cgraph_finalize_function (thunk_fndecl, false);
1892 /* We share the symbols in the formal argument list with other entry
1893 points and the master function. Clear them so that they are
1894 recreated for each function. */
1895 for (formal = thunk_sym->formal; formal; formal = formal->next)
1896 if (formal->sym != NULL) /* Ignore alternate returns. */
1898 formal->sym->backend_decl = NULL_TREE;
1899 if (formal->sym->ts.type == BT_CHARACTER)
1900 formal->sym->ts.cl->backend_decl = NULL_TREE;
1903 if (thunk_sym->attr.function)
1905 if (thunk_sym->ts.type == BT_CHARACTER)
1906 thunk_sym->ts.cl->backend_decl = NULL_TREE;
1907 if (thunk_sym->result->ts.type == BT_CHARACTER)
1908 thunk_sym->result->ts.cl->backend_decl = NULL_TREE;
1912 gfc_set_backend_locus (&old_loc);
1916 /* Create a decl for a function, and create any thunks for alternate entry
1917 points. */
1919 void
1920 gfc_create_function_decl (gfc_namespace * ns)
1922 /* Create a declaration for the master function. */
1923 build_function_decl (ns->proc_name);
1925 /* Compile the entry thunks. */
1926 if (ns->entries)
1927 build_entry_thunks (ns);
1929 /* Now create the read argument list. */
1930 create_function_arglist (ns->proc_name);
1933 /* Return the decl used to hold the function return value. If
1934 parent_flag is set, the context is the parent_scope. */
1936 tree
1937 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
1939 tree decl;
1940 tree length;
1941 tree this_fake_result_decl;
1942 tree this_function_decl;
1944 char name[GFC_MAX_SYMBOL_LEN + 10];
1946 if (parent_flag)
1948 this_fake_result_decl = parent_fake_result_decl;
1949 this_function_decl = DECL_CONTEXT (current_function_decl);
1951 else
1953 this_fake_result_decl = current_fake_result_decl;
1954 this_function_decl = current_function_decl;
1957 if (sym
1958 && sym->ns->proc_name->backend_decl == this_function_decl
1959 && sym->ns->proc_name->attr.entry_master
1960 && sym != sym->ns->proc_name)
1962 tree t = NULL, var;
1963 if (this_fake_result_decl != NULL)
1964 for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
1965 if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
1966 break;
1967 if (t)
1968 return TREE_VALUE (t);
1969 decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
1971 if (parent_flag)
1972 this_fake_result_decl = parent_fake_result_decl;
1973 else
1974 this_fake_result_decl = current_fake_result_decl;
1976 if (decl && sym->ns->proc_name->attr.mixed_entry_master)
1978 tree field;
1980 for (field = TYPE_FIELDS (TREE_TYPE (decl));
1981 field; field = TREE_CHAIN (field))
1982 if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1983 sym->name) == 0)
1984 break;
1986 gcc_assert (field != NULL_TREE);
1987 decl = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
1988 decl, field, NULL_TREE);
1991 var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
1992 if (parent_flag)
1993 gfc_add_decl_to_parent_function (var);
1994 else
1995 gfc_add_decl_to_function (var);
1997 SET_DECL_VALUE_EXPR (var, decl);
1998 DECL_HAS_VALUE_EXPR_P (var) = 1;
1999 GFC_DECL_RESULT (var) = 1;
2001 TREE_CHAIN (this_fake_result_decl)
2002 = tree_cons (get_identifier (sym->name), var,
2003 TREE_CHAIN (this_fake_result_decl));
2004 return var;
2007 if (this_fake_result_decl != NULL_TREE)
2008 return TREE_VALUE (this_fake_result_decl);
2010 /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
2011 sym is NULL. */
2012 if (!sym)
2013 return NULL_TREE;
2015 if (sym->ts.type == BT_CHARACTER)
2017 if (sym->ts.cl->backend_decl == NULL_TREE)
2018 length = gfc_create_string_length (sym);
2019 else
2020 length = sym->ts.cl->backend_decl;
2021 if (TREE_CODE (length) == VAR_DECL
2022 && DECL_CONTEXT (length) == NULL_TREE)
2023 gfc_add_decl_to_function (length);
2026 if (gfc_return_by_reference (sym))
2028 decl = DECL_ARGUMENTS (this_function_decl);
2030 if (sym->ns->proc_name->backend_decl == this_function_decl
2031 && sym->ns->proc_name->attr.entry_master)
2032 decl = TREE_CHAIN (decl);
2034 TREE_USED (decl) = 1;
2035 if (sym->as)
2036 decl = gfc_build_dummy_array_decl (sym, decl);
2038 else
2040 sprintf (name, "__result_%.20s",
2041 IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
2043 if (!sym->attr.mixed_entry_master && sym->attr.function)
2044 decl = build_decl (VAR_DECL, get_identifier (name),
2045 gfc_sym_type (sym));
2046 else
2047 decl = build_decl (VAR_DECL, get_identifier (name),
2048 TREE_TYPE (TREE_TYPE (this_function_decl)));
2049 DECL_ARTIFICIAL (decl) = 1;
2050 DECL_EXTERNAL (decl) = 0;
2051 TREE_PUBLIC (decl) = 0;
2052 TREE_USED (decl) = 1;
2053 GFC_DECL_RESULT (decl) = 1;
2054 TREE_ADDRESSABLE (decl) = 1;
2056 layout_decl (decl, 0);
2058 if (parent_flag)
2059 gfc_add_decl_to_parent_function (decl);
2060 else
2061 gfc_add_decl_to_function (decl);
2064 if (parent_flag)
2065 parent_fake_result_decl = build_tree_list (NULL, decl);
2066 else
2067 current_fake_result_decl = build_tree_list (NULL, decl);
2069 return decl;
2073 /* Builds a function decl. The remaining parameters are the types of the
2074 function arguments. Negative nargs indicates a varargs function. */
2076 tree
2077 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
2079 tree arglist;
2080 tree argtype;
2081 tree fntype;
2082 tree fndecl;
2083 va_list p;
2084 int n;
2086 /* Library functions must be declared with global scope. */
2087 gcc_assert (current_function_decl == NULL_TREE);
2089 va_start (p, nargs);
2092 /* Create a list of the argument types. */
2093 for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
2095 argtype = va_arg (p, tree);
2096 arglist = gfc_chainon_list (arglist, argtype);
2099 if (nargs >= 0)
2101 /* Terminate the list. */
2102 arglist = gfc_chainon_list (arglist, void_type_node);
2105 /* Build the function type and decl. */
2106 fntype = build_function_type (rettype, arglist);
2107 fndecl = build_decl (FUNCTION_DECL, name, fntype);
2109 /* Mark this decl as external. */
2110 DECL_EXTERNAL (fndecl) = 1;
2111 TREE_PUBLIC (fndecl) = 1;
2113 va_end (p);
2115 pushdecl (fndecl);
2117 rest_of_decl_compilation (fndecl, 1, 0);
2119 return fndecl;
2122 static void
2123 gfc_build_intrinsic_function_decls (void)
2125 tree gfc_int4_type_node = gfc_get_int_type (4);
2126 tree gfc_int8_type_node = gfc_get_int_type (8);
2127 tree gfc_int16_type_node = gfc_get_int_type (16);
2128 tree gfc_logical4_type_node = gfc_get_logical_type (4);
2129 tree pchar1_type_node = gfc_get_pchar_type (1);
2130 tree pchar4_type_node = gfc_get_pchar_type (4);
2132 /* String functions. */
2133 gfor_fndecl_compare_string =
2134 gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
2135 integer_type_node, 4,
2136 gfc_charlen_type_node, pchar1_type_node,
2137 gfc_charlen_type_node, pchar1_type_node);
2139 gfor_fndecl_concat_string =
2140 gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
2141 void_type_node, 6,
2142 gfc_charlen_type_node, pchar1_type_node,
2143 gfc_charlen_type_node, pchar1_type_node,
2144 gfc_charlen_type_node, pchar1_type_node);
2146 gfor_fndecl_string_len_trim =
2147 gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
2148 gfc_int4_type_node, 2,
2149 gfc_charlen_type_node, pchar1_type_node);
2151 gfor_fndecl_string_index =
2152 gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
2153 gfc_int4_type_node, 5,
2154 gfc_charlen_type_node, pchar1_type_node,
2155 gfc_charlen_type_node, pchar1_type_node,
2156 gfc_logical4_type_node);
2158 gfor_fndecl_string_scan =
2159 gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
2160 gfc_int4_type_node, 5,
2161 gfc_charlen_type_node, pchar1_type_node,
2162 gfc_charlen_type_node, pchar1_type_node,
2163 gfc_logical4_type_node);
2165 gfor_fndecl_string_verify =
2166 gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
2167 gfc_int4_type_node, 5,
2168 gfc_charlen_type_node, pchar1_type_node,
2169 gfc_charlen_type_node, pchar1_type_node,
2170 gfc_logical4_type_node);
2172 gfor_fndecl_string_trim =
2173 gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
2174 void_type_node, 4,
2175 build_pointer_type (gfc_charlen_type_node),
2176 build_pointer_type (pchar1_type_node),
2177 gfc_charlen_type_node, pchar1_type_node);
2179 gfor_fndecl_string_minmax =
2180 gfc_build_library_function_decl (get_identifier (PREFIX("string_minmax")),
2181 void_type_node, -4,
2182 build_pointer_type (gfc_charlen_type_node),
2183 build_pointer_type (pchar1_type_node),
2184 integer_type_node, integer_type_node);
2186 gfor_fndecl_adjustl =
2187 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
2188 void_type_node, 3, pchar1_type_node,
2189 gfc_charlen_type_node, pchar1_type_node);
2191 gfor_fndecl_adjustr =
2192 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
2193 void_type_node, 3, pchar1_type_node,
2194 gfc_charlen_type_node, pchar1_type_node);
2196 gfor_fndecl_select_string =
2197 gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
2198 integer_type_node, 4, pvoid_type_node,
2199 integer_type_node, pchar1_type_node,
2200 gfc_charlen_type_node);
2202 gfor_fndecl_compare_string_char4 =
2203 gfc_build_library_function_decl (get_identifier
2204 (PREFIX("compare_string_char4")),
2205 integer_type_node, 4,
2206 gfc_charlen_type_node, pchar4_type_node,
2207 gfc_charlen_type_node, pchar4_type_node);
2209 gfor_fndecl_concat_string_char4 =
2210 gfc_build_library_function_decl (get_identifier
2211 (PREFIX("concat_string_char4")),
2212 void_type_node, 6,
2213 gfc_charlen_type_node, pchar4_type_node,
2214 gfc_charlen_type_node, pchar4_type_node,
2215 gfc_charlen_type_node, pchar4_type_node);
2217 gfor_fndecl_string_len_trim_char4 =
2218 gfc_build_library_function_decl (get_identifier
2219 (PREFIX("string_len_trim_char4")),
2220 gfc_charlen_type_node, 2,
2221 gfc_charlen_type_node, pchar4_type_node);
2223 gfor_fndecl_string_index_char4 =
2224 gfc_build_library_function_decl (get_identifier
2225 (PREFIX("string_index_char4")),
2226 gfc_charlen_type_node, 5,
2227 gfc_charlen_type_node, pchar4_type_node,
2228 gfc_charlen_type_node, pchar4_type_node,
2229 gfc_logical4_type_node);
2231 gfor_fndecl_string_scan_char4 =
2232 gfc_build_library_function_decl (get_identifier
2233 (PREFIX("string_scan_char4")),
2234 gfc_charlen_type_node, 5,
2235 gfc_charlen_type_node, pchar4_type_node,
2236 gfc_charlen_type_node, pchar4_type_node,
2237 gfc_logical4_type_node);
2239 gfor_fndecl_string_verify_char4 =
2240 gfc_build_library_function_decl (get_identifier
2241 (PREFIX("string_verify_char4")),
2242 gfc_charlen_type_node, 5,
2243 gfc_charlen_type_node, pchar4_type_node,
2244 gfc_charlen_type_node, pchar4_type_node,
2245 gfc_logical4_type_node);
2247 gfor_fndecl_string_trim_char4 =
2248 gfc_build_library_function_decl (get_identifier
2249 (PREFIX("string_trim_char4")),
2250 void_type_node, 4,
2251 build_pointer_type (gfc_charlen_type_node),
2252 build_pointer_type (pchar4_type_node),
2253 gfc_charlen_type_node, pchar4_type_node);
2255 gfor_fndecl_string_minmax_char4 =
2256 gfc_build_library_function_decl (get_identifier
2257 (PREFIX("string_minmax_char4")),
2258 void_type_node, -4,
2259 build_pointer_type (gfc_charlen_type_node),
2260 build_pointer_type (pchar4_type_node),
2261 integer_type_node, integer_type_node);
2263 gfor_fndecl_adjustl_char4 =
2264 gfc_build_library_function_decl (get_identifier (PREFIX("adjustl_char4")),
2265 void_type_node, 3, pchar4_type_node,
2266 gfc_charlen_type_node, pchar4_type_node);
2268 gfor_fndecl_adjustr_char4 =
2269 gfc_build_library_function_decl (get_identifier (PREFIX("adjustr_char4")),
2270 void_type_node, 3, pchar4_type_node,
2271 gfc_charlen_type_node, pchar4_type_node);
2273 gfor_fndecl_select_string_char4 =
2274 gfc_build_library_function_decl (get_identifier
2275 (PREFIX("select_string_char4")),
2276 integer_type_node, 4, pvoid_type_node,
2277 integer_type_node, pvoid_type_node,
2278 gfc_charlen_type_node);
2281 /* Conversion between character kinds. */
2283 gfor_fndecl_convert_char1_to_char4 =
2284 gfc_build_library_function_decl (get_identifier
2285 (PREFIX("convert_char1_to_char4")),
2286 void_type_node, 3,
2287 build_pointer_type (pchar4_type_node),
2288 gfc_charlen_type_node, pchar1_type_node);
2290 gfor_fndecl_convert_char4_to_char1 =
2291 gfc_build_library_function_decl (get_identifier
2292 (PREFIX("convert_char4_to_char1")),
2293 void_type_node, 3,
2294 build_pointer_type (pchar1_type_node),
2295 gfc_charlen_type_node, pchar4_type_node);
2297 /* Misc. functions. */
2299 gfor_fndecl_ttynam =
2300 gfc_build_library_function_decl (get_identifier (PREFIX("ttynam")),
2301 void_type_node,
2303 pchar_type_node,
2304 gfc_charlen_type_node,
2305 integer_type_node);
2307 gfor_fndecl_fdate =
2308 gfc_build_library_function_decl (get_identifier (PREFIX("fdate")),
2309 void_type_node,
2311 pchar_type_node,
2312 gfc_charlen_type_node);
2314 gfor_fndecl_ctime =
2315 gfc_build_library_function_decl (get_identifier (PREFIX("ctime")),
2316 void_type_node,
2318 pchar_type_node,
2319 gfc_charlen_type_node,
2320 gfc_int8_type_node);
2322 gfor_fndecl_sc_kind =
2323 gfc_build_library_function_decl (get_identifier
2324 (PREFIX("selected_char_kind")),
2325 gfc_int4_type_node, 2,
2326 gfc_charlen_type_node, pchar_type_node);
2328 gfor_fndecl_si_kind =
2329 gfc_build_library_function_decl (get_identifier
2330 (PREFIX("selected_int_kind")),
2331 gfc_int4_type_node, 1, pvoid_type_node);
2333 gfor_fndecl_sr_kind =
2334 gfc_build_library_function_decl (get_identifier
2335 (PREFIX("selected_real_kind")),
2336 gfc_int4_type_node, 2,
2337 pvoid_type_node, pvoid_type_node);
2339 /* Power functions. */
2341 tree ctype, rtype, itype, jtype;
2342 int rkind, ikind, jkind;
2343 #define NIKINDS 3
2344 #define NRKINDS 4
2345 static int ikinds[NIKINDS] = {4, 8, 16};
2346 static int rkinds[NRKINDS] = {4, 8, 10, 16};
2347 char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2349 for (ikind=0; ikind < NIKINDS; ikind++)
2351 itype = gfc_get_int_type (ikinds[ikind]);
2353 for (jkind=0; jkind < NIKINDS; jkind++)
2355 jtype = gfc_get_int_type (ikinds[jkind]);
2356 if (itype && jtype)
2358 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2359 ikinds[jkind]);
2360 gfor_fndecl_math_powi[jkind][ikind].integer =
2361 gfc_build_library_function_decl (get_identifier (name),
2362 jtype, 2, jtype, itype);
2363 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2367 for (rkind = 0; rkind < NRKINDS; rkind ++)
2369 rtype = gfc_get_real_type (rkinds[rkind]);
2370 if (rtype && itype)
2372 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2373 ikinds[ikind]);
2374 gfor_fndecl_math_powi[rkind][ikind].real =
2375 gfc_build_library_function_decl (get_identifier (name),
2376 rtype, 2, rtype, itype);
2377 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2380 ctype = gfc_get_complex_type (rkinds[rkind]);
2381 if (ctype && itype)
2383 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2384 ikinds[ikind]);
2385 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2386 gfc_build_library_function_decl (get_identifier (name),
2387 ctype, 2,ctype, itype);
2388 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2392 #undef NIKINDS
2393 #undef NRKINDS
2396 gfor_fndecl_math_ishftc4 =
2397 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
2398 gfc_int4_type_node,
2399 3, gfc_int4_type_node,
2400 gfc_int4_type_node, gfc_int4_type_node);
2401 gfor_fndecl_math_ishftc8 =
2402 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
2403 gfc_int8_type_node,
2404 3, gfc_int8_type_node,
2405 gfc_int4_type_node, gfc_int4_type_node);
2406 if (gfc_int16_type_node)
2407 gfor_fndecl_math_ishftc16 =
2408 gfc_build_library_function_decl (get_identifier (PREFIX("ishftc16")),
2409 gfc_int16_type_node, 3,
2410 gfc_int16_type_node,
2411 gfc_int4_type_node,
2412 gfc_int4_type_node);
2414 /* BLAS functions. */
2416 tree pint = build_pointer_type (integer_type_node);
2417 tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
2418 tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
2419 tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
2420 tree pz = build_pointer_type
2421 (gfc_get_complex_type (gfc_default_double_kind));
2423 gfor_fndecl_sgemm = gfc_build_library_function_decl
2424 (get_identifier
2425 (gfc_option.flag_underscoring ? "sgemm_"
2426 : "sgemm"),
2427 void_type_node, 15, pchar_type_node,
2428 pchar_type_node, pint, pint, pint, ps, ps, pint,
2429 ps, pint, ps, ps, pint, integer_type_node,
2430 integer_type_node);
2431 gfor_fndecl_dgemm = gfc_build_library_function_decl
2432 (get_identifier
2433 (gfc_option.flag_underscoring ? "dgemm_"
2434 : "dgemm"),
2435 void_type_node, 15, pchar_type_node,
2436 pchar_type_node, pint, pint, pint, pd, pd, pint,
2437 pd, pint, pd, pd, pint, integer_type_node,
2438 integer_type_node);
2439 gfor_fndecl_cgemm = gfc_build_library_function_decl
2440 (get_identifier
2441 (gfc_option.flag_underscoring ? "cgemm_"
2442 : "cgemm"),
2443 void_type_node, 15, pchar_type_node,
2444 pchar_type_node, pint, pint, pint, pc, pc, pint,
2445 pc, pint, pc, pc, pint, integer_type_node,
2446 integer_type_node);
2447 gfor_fndecl_zgemm = gfc_build_library_function_decl
2448 (get_identifier
2449 (gfc_option.flag_underscoring ? "zgemm_"
2450 : "zgemm"),
2451 void_type_node, 15, pchar_type_node,
2452 pchar_type_node, pint, pint, pint, pz, pz, pint,
2453 pz, pint, pz, pz, pint, integer_type_node,
2454 integer_type_node);
2457 /* Other functions. */
2458 gfor_fndecl_size0 =
2459 gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
2460 gfc_array_index_type,
2461 1, pvoid_type_node);
2462 gfor_fndecl_size1 =
2463 gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
2464 gfc_array_index_type,
2465 2, pvoid_type_node,
2466 gfc_array_index_type);
2468 gfor_fndecl_iargc =
2469 gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
2470 gfc_int4_type_node,
2475 /* Make prototypes for runtime library functions. */
2477 void
2478 gfc_build_builtin_function_decls (void)
2480 tree gfc_int4_type_node = gfc_get_int_type (4);
2482 gfor_fndecl_stop_numeric =
2483 gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
2484 void_type_node, 1, gfc_int4_type_node);
2485 /* Stop doesn't return. */
2486 TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
2488 gfor_fndecl_stop_string =
2489 gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
2490 void_type_node, 2, pchar_type_node,
2491 gfc_int4_type_node);
2492 /* Stop doesn't return. */
2493 TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
2495 gfor_fndecl_pause_numeric =
2496 gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
2497 void_type_node, 1, gfc_int4_type_node);
2499 gfor_fndecl_pause_string =
2500 gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
2501 void_type_node, 2, pchar_type_node,
2502 gfc_int4_type_node);
2504 gfor_fndecl_runtime_error =
2505 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
2506 void_type_node, -1, pchar_type_node);
2507 /* The runtime_error function does not return. */
2508 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
2510 gfor_fndecl_runtime_error_at =
2511 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error_at")),
2512 void_type_node, -2, pchar_type_node,
2513 pchar_type_node);
2514 /* The runtime_error_at function does not return. */
2515 TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
2517 gfor_fndecl_runtime_warning_at =
2518 gfc_build_library_function_decl (get_identifier (PREFIX("runtime_warning_at")),
2519 void_type_node, -2, pchar_type_node,
2520 pchar_type_node);
2521 gfor_fndecl_generate_error =
2522 gfc_build_library_function_decl (get_identifier (PREFIX("generate_error")),
2523 void_type_node, 3, pvoid_type_node,
2524 integer_type_node, pchar_type_node);
2526 gfor_fndecl_os_error =
2527 gfc_build_library_function_decl (get_identifier (PREFIX("os_error")),
2528 void_type_node, 1, pchar_type_node);
2529 /* The runtime_error function does not return. */
2530 TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
2532 gfor_fndecl_set_fpe =
2533 gfc_build_library_function_decl (get_identifier (PREFIX("set_fpe")),
2534 void_type_node, 1, integer_type_node);
2536 /* Keep the array dimension in sync with the call, later in this file. */
2537 gfor_fndecl_set_options =
2538 gfc_build_library_function_decl (get_identifier (PREFIX("set_options")),
2539 void_type_node, 2, integer_type_node,
2540 pvoid_type_node);
2542 gfor_fndecl_set_convert =
2543 gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")),
2544 void_type_node, 1, integer_type_node);
2546 gfor_fndecl_set_record_marker =
2547 gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")),
2548 void_type_node, 1, integer_type_node);
2550 gfor_fndecl_set_max_subrecord_length =
2551 gfc_build_library_function_decl (get_identifier (PREFIX("set_max_subrecord_length")),
2552 void_type_node, 1, integer_type_node);
2554 gfor_fndecl_in_pack = gfc_build_library_function_decl (
2555 get_identifier (PREFIX("internal_pack")),
2556 pvoid_type_node, 1, pvoid_type_node);
2558 gfor_fndecl_in_unpack = gfc_build_library_function_decl (
2559 get_identifier (PREFIX("internal_unpack")),
2560 void_type_node, 2, pvoid_type_node, pvoid_type_node);
2562 gfor_fndecl_associated =
2563 gfc_build_library_function_decl (
2564 get_identifier (PREFIX("associated")),
2565 integer_type_node, 2, ppvoid_type_node,
2566 ppvoid_type_node);
2568 gfc_build_intrinsic_function_decls ();
2569 gfc_build_intrinsic_lib_fndecls ();
2570 gfc_build_io_library_fndecls ();
2574 /* Evaluate the length of dummy character variables. */
2576 static tree
2577 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl, tree fnbody)
2579 stmtblock_t body;
2581 gfc_finish_decl (cl->backend_decl);
2583 gfc_start_block (&body);
2585 /* Evaluate the string length expression. */
2586 gfc_conv_string_length (cl, NULL, &body);
2588 gfc_trans_vla_type_sizes (sym, &body);
2590 gfc_add_expr_to_block (&body, fnbody);
2591 return gfc_finish_block (&body);
2595 /* Allocate and cleanup an automatic character variable. */
2597 static tree
2598 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
2600 stmtblock_t body;
2601 tree decl;
2602 tree tmp;
2604 gcc_assert (sym->backend_decl);
2605 gcc_assert (sym->ts.cl && sym->ts.cl->length);
2607 gfc_start_block (&body);
2609 /* Evaluate the string length expression. */
2610 gfc_conv_string_length (sym->ts.cl, NULL, &body);
2612 gfc_trans_vla_type_sizes (sym, &body);
2614 decl = sym->backend_decl;
2616 /* Emit a DECL_EXPR for this variable, which will cause the
2617 gimplifier to allocate storage, and all that good stuff. */
2618 tmp = fold_build1 (DECL_EXPR, TREE_TYPE (decl), decl);
2619 gfc_add_expr_to_block (&body, tmp);
2621 gfc_add_expr_to_block (&body, fnbody);
2622 return gfc_finish_block (&body);
2625 /* Set the initial value of ASSIGN statement auxiliary variable explicitly. */
2627 static tree
2628 gfc_trans_assign_aux_var (gfc_symbol * sym, tree fnbody)
2630 stmtblock_t body;
2632 gcc_assert (sym->backend_decl);
2633 gfc_start_block (&body);
2635 /* Set the initial value to length. See the comments in
2636 function gfc_add_assign_aux_vars in this file. */
2637 gfc_add_modify (&body, GFC_DECL_STRING_LEN (sym->backend_decl),
2638 build_int_cst (NULL_TREE, -2));
2640 gfc_add_expr_to_block (&body, fnbody);
2641 return gfc_finish_block (&body);
2644 static void
2645 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
2647 tree t = *tp, var, val;
2649 if (t == NULL || t == error_mark_node)
2650 return;
2651 if (TREE_CONSTANT (t) || DECL_P (t))
2652 return;
2654 if (TREE_CODE (t) == SAVE_EXPR)
2656 if (SAVE_EXPR_RESOLVED_P (t))
2658 *tp = TREE_OPERAND (t, 0);
2659 return;
2661 val = TREE_OPERAND (t, 0);
2663 else
2664 val = t;
2666 var = gfc_create_var_np (TREE_TYPE (t), NULL);
2667 gfc_add_decl_to_function (var);
2668 gfc_add_modify (body, var, val);
2669 if (TREE_CODE (t) == SAVE_EXPR)
2670 TREE_OPERAND (t, 0) = var;
2671 *tp = var;
2674 static void
2675 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
2677 tree t;
2679 if (type == NULL || type == error_mark_node)
2680 return;
2682 type = TYPE_MAIN_VARIANT (type);
2684 if (TREE_CODE (type) == INTEGER_TYPE)
2686 gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
2687 gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
2689 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2691 TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
2692 TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
2695 else if (TREE_CODE (type) == ARRAY_TYPE)
2697 gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
2698 gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
2699 gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
2700 gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
2702 for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2704 TYPE_SIZE (t) = TYPE_SIZE (type);
2705 TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
2710 /* Make sure all type sizes and array domains are either constant,
2711 or variable or parameter decls. This is a simplified variant
2712 of gimplify_type_sizes, but we can't use it here, as none of the
2713 variables in the expressions have been gimplified yet.
2714 As type sizes and domains for various variable length arrays
2715 contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
2716 time, without this routine gimplify_type_sizes in the middle-end
2717 could result in the type sizes being gimplified earlier than where
2718 those variables are initialized. */
2720 void
2721 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
2723 tree type = TREE_TYPE (sym->backend_decl);
2725 if (TREE_CODE (type) == FUNCTION_TYPE
2726 && (sym->attr.function || sym->attr.result || sym->attr.entry))
2728 if (! current_fake_result_decl)
2729 return;
2731 type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
2734 while (POINTER_TYPE_P (type))
2735 type = TREE_TYPE (type);
2737 if (GFC_DESCRIPTOR_TYPE_P (type))
2739 tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2741 while (POINTER_TYPE_P (etype))
2742 etype = TREE_TYPE (etype);
2744 gfc_trans_vla_type_sizes_1 (etype, body);
2747 gfc_trans_vla_type_sizes_1 (type, body);
2751 /* Initialize a derived type by building an lvalue from the symbol
2752 and using trans_assignment to do the work. */
2753 tree
2754 gfc_init_default_dt (gfc_symbol * sym, tree body)
2756 stmtblock_t fnblock;
2757 gfc_expr *e;
2758 tree tmp;
2759 tree present;
2761 gfc_init_block (&fnblock);
2762 gcc_assert (!sym->attr.allocatable);
2763 gfc_set_sym_referenced (sym);
2764 e = gfc_lval_expr_from_sym (sym);
2765 tmp = gfc_trans_assignment (e, sym->value, false);
2766 if (sym->attr.dummy)
2768 present = gfc_conv_expr_present (sym);
2769 tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present,
2770 tmp, build_empty_stmt ());
2772 gfc_add_expr_to_block (&fnblock, tmp);
2773 gfc_free_expr (e);
2774 if (body)
2775 gfc_add_expr_to_block (&fnblock, body);
2776 return gfc_finish_block (&fnblock);
2780 /* Initialize INTENT(OUT) derived type dummies. */
2781 static tree
2782 init_intent_out_dt (gfc_symbol * proc_sym, tree body)
2784 stmtblock_t fnblock;
2785 gfc_formal_arglist *f;
2787 gfc_init_block (&fnblock);
2788 for (f = proc_sym->formal; f; f = f->next)
2789 if (f->sym && f->sym->attr.intent == INTENT_OUT
2790 && f->sym->ts.type == BT_DERIVED
2791 && !f->sym->ts.derived->attr.alloc_comp
2792 && f->sym->value)
2793 body = gfc_init_default_dt (f->sym, body);
2795 gfc_add_expr_to_block (&fnblock, body);
2796 return gfc_finish_block (&fnblock);
2800 /* Generate function entry and exit code, and add it to the function body.
2801 This includes:
2802 Allocation and initialization of array variables.
2803 Allocation of character string variables.
2804 Initialization and possibly repacking of dummy arrays.
2805 Initialization of ASSIGN statement auxiliary variable. */
2807 static tree
2808 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2810 locus loc;
2811 gfc_symbol *sym;
2812 gfc_formal_arglist *f;
2813 stmtblock_t body;
2814 bool seen_trans_deferred_array = false;
2816 /* Deal with implicit return variables. Explicit return variables will
2817 already have been added. */
2818 if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2820 if (!current_fake_result_decl)
2822 gfc_entry_list *el = NULL;
2823 if (proc_sym->attr.entry_master)
2825 for (el = proc_sym->ns->entries; el; el = el->next)
2826 if (el->sym != el->sym->result)
2827 break;
2829 /* TODO: move to the appropriate place in resolve.c. */
2830 if (warn_return_type && el == NULL)
2831 gfc_warning ("Return value of function '%s' at %L not set",
2832 proc_sym->name, &proc_sym->declared_at);
2834 else if (proc_sym->as)
2836 tree result = TREE_VALUE (current_fake_result_decl);
2837 fnbody = gfc_trans_dummy_array_bias (proc_sym, result, fnbody);
2839 /* An automatic character length, pointer array result. */
2840 if (proc_sym->ts.type == BT_CHARACTER
2841 && TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2842 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2843 fnbody);
2845 else if (proc_sym->ts.type == BT_CHARACTER)
2847 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2848 fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2849 fnbody);
2851 else
2852 gcc_assert (gfc_option.flag_f2c
2853 && proc_sym->ts.type == BT_COMPLEX);
2856 /* Initialize the INTENT(OUT) derived type dummy arguments. This
2857 should be done here so that the offsets and lbounds of arrays
2858 are available. */
2859 fnbody = init_intent_out_dt (proc_sym, fnbody);
2861 for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2863 bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
2864 && sym->ts.derived->attr.alloc_comp;
2865 if (sym->attr.dimension)
2867 switch (sym->as->type)
2869 case AS_EXPLICIT:
2870 if (sym->attr.dummy || sym->attr.result)
2871 fnbody =
2872 gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2873 else if (sym->attr.pointer || sym->attr.allocatable)
2875 if (TREE_STATIC (sym->backend_decl))
2876 gfc_trans_static_array_pointer (sym);
2877 else
2879 seen_trans_deferred_array = true;
2880 fnbody = gfc_trans_deferred_array (sym, fnbody);
2883 else
2885 if (sym_has_alloc_comp)
2887 seen_trans_deferred_array = true;
2888 fnbody = gfc_trans_deferred_array (sym, fnbody);
2890 else if (sym->ts.type == BT_DERIVED
2891 && sym->value
2892 && !sym->attr.data
2893 && sym->attr.save == SAVE_NONE)
2894 fnbody = gfc_init_default_dt (sym, fnbody);
2896 gfc_get_backend_locus (&loc);
2897 gfc_set_backend_locus (&sym->declared_at);
2898 fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2899 sym, fnbody);
2900 gfc_set_backend_locus (&loc);
2902 break;
2904 case AS_ASSUMED_SIZE:
2905 /* Must be a dummy parameter. */
2906 gcc_assert (sym->attr.dummy);
2908 /* We should always pass assumed size arrays the g77 way. */
2909 fnbody = gfc_trans_g77_array (sym, fnbody);
2910 break;
2912 case AS_ASSUMED_SHAPE:
2913 /* Must be a dummy parameter. */
2914 gcc_assert (sym->attr.dummy);
2916 fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2917 fnbody);
2918 break;
2920 case AS_DEFERRED:
2921 seen_trans_deferred_array = true;
2922 fnbody = gfc_trans_deferred_array (sym, fnbody);
2923 break;
2925 default:
2926 gcc_unreachable ();
2928 if (sym_has_alloc_comp && !seen_trans_deferred_array)
2929 fnbody = gfc_trans_deferred_array (sym, fnbody);
2931 else if (sym_has_alloc_comp)
2932 fnbody = gfc_trans_deferred_array (sym, fnbody);
2933 else if (sym->ts.type == BT_CHARACTER)
2935 gfc_get_backend_locus (&loc);
2936 gfc_set_backend_locus (&sym->declared_at);
2937 if (sym->attr.dummy || sym->attr.result)
2938 fnbody = gfc_trans_dummy_character (sym, sym->ts.cl, fnbody);
2939 else
2940 fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2941 gfc_set_backend_locus (&loc);
2943 else if (sym->attr.assign)
2945 gfc_get_backend_locus (&loc);
2946 gfc_set_backend_locus (&sym->declared_at);
2947 fnbody = gfc_trans_assign_aux_var (sym, fnbody);
2948 gfc_set_backend_locus (&loc);
2950 else if (sym->ts.type == BT_DERIVED
2951 && sym->value
2952 && !sym->attr.data
2953 && sym->attr.save == SAVE_NONE)
2954 fnbody = gfc_init_default_dt (sym, fnbody);
2955 else
2956 gcc_unreachable ();
2959 gfc_init_block (&body);
2961 for (f = proc_sym->formal; f; f = f->next)
2963 if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
2965 gcc_assert (f->sym->ts.cl->backend_decl != NULL);
2966 if (TREE_CODE (f->sym->ts.cl->backend_decl) == PARM_DECL)
2967 gfc_trans_vla_type_sizes (f->sym, &body);
2971 if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
2972 && current_fake_result_decl != NULL)
2974 gcc_assert (proc_sym->ts.cl->backend_decl != NULL);
2975 if (TREE_CODE (proc_sym->ts.cl->backend_decl) == PARM_DECL)
2976 gfc_trans_vla_type_sizes (proc_sym, &body);
2979 gfc_add_expr_to_block (&body, fnbody);
2980 return gfc_finish_block (&body);
2983 static GTY ((param_is (struct module_htab_entry))) htab_t module_htab;
2985 /* Hash and equality functions for module_htab. */
2987 static hashval_t
2988 module_htab_do_hash (const void *x)
2990 return htab_hash_string (((const struct module_htab_entry *)x)->name);
2993 static int
2994 module_htab_eq (const void *x1, const void *x2)
2996 return strcmp ((((const struct module_htab_entry *)x1)->name),
2997 (const char *)x2) == 0;
3000 /* Hash and equality functions for module_htab's decls. */
3002 static hashval_t
3003 module_htab_decls_hash (const void *x)
3005 const_tree t = (const_tree) x;
3006 const_tree n = DECL_NAME (t);
3007 if (n == NULL_TREE)
3008 n = TYPE_NAME (TREE_TYPE (t));
3009 return htab_hash_string (IDENTIFIER_POINTER (n));
3012 static int
3013 module_htab_decls_eq (const void *x1, const void *x2)
3015 const_tree t1 = (const_tree) x1;
3016 const_tree n1 = DECL_NAME (t1);
3017 if (n1 == NULL_TREE)
3018 n1 = TYPE_NAME (TREE_TYPE (t1));
3019 return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0;
3022 struct module_htab_entry *
3023 gfc_find_module (const char *name)
3025 void **slot;
3027 if (! module_htab)
3028 module_htab = htab_create_ggc (10, module_htab_do_hash,
3029 module_htab_eq, NULL);
3031 slot = htab_find_slot_with_hash (module_htab, name,
3032 htab_hash_string (name), INSERT);
3033 if (*slot == NULL)
3035 struct module_htab_entry *entry = GGC_CNEW (struct module_htab_entry);
3037 entry->name = gfc_get_string (name);
3038 entry->decls = htab_create_ggc (10, module_htab_decls_hash,
3039 module_htab_decls_eq, NULL);
3040 *slot = (void *) entry;
3042 return (struct module_htab_entry *) *slot;
3045 void
3046 gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
3048 void **slot;
3049 const char *name;
3051 if (DECL_NAME (decl))
3052 name = IDENTIFIER_POINTER (DECL_NAME (decl));
3053 else
3055 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
3056 name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
3058 slot = htab_find_slot_with_hash (entry->decls, name,
3059 htab_hash_string (name), INSERT);
3060 if (*slot == NULL)
3061 *slot = (void *) decl;
3064 static struct module_htab_entry *cur_module;
3066 /* Output an initialized decl for a module variable. */
3068 static void
3069 gfc_create_module_variable (gfc_symbol * sym)
3071 tree decl;
3073 /* Module functions with alternate entries are dealt with later and
3074 would get caught by the next condition. */
3075 if (sym->attr.entry)
3076 return;
3078 /* Make sure we convert the types of the derived types from iso_c_binding
3079 into (void *). */
3080 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3081 && sym->ts.type == BT_DERIVED)
3082 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3084 if (sym->attr.flavor == FL_DERIVED
3085 && sym->backend_decl
3086 && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
3088 decl = sym->backend_decl;
3089 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3090 gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
3091 || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
3092 gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
3093 || DECL_CONTEXT (TYPE_STUB_DECL (decl))
3094 == sym->ns->proc_name->backend_decl);
3095 TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3096 DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
3097 gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
3100 /* Only output variables and array valued, or derived type,
3101 parameters. */
3102 if (sym->attr.flavor != FL_VARIABLE
3103 && !(sym->attr.flavor == FL_PARAMETER
3104 && (sym->attr.dimension || sym->ts.type == BT_DERIVED)))
3105 return;
3107 if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
3109 decl = sym->backend_decl;
3110 gcc_assert (DECL_CONTEXT (decl) == NULL_TREE);
3111 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3112 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3113 gfc_module_add_decl (cur_module, decl);
3116 /* Don't generate variables from other modules. Variables from
3117 COMMONs will already have been generated. */
3118 if (sym->attr.use_assoc || sym->attr.in_common)
3119 return;
3121 /* Equivalenced variables arrive here after creation. */
3122 if (sym->backend_decl
3123 && (sym->equiv_built || sym->attr.in_equivalence))
3124 return;
3126 if (sym->backend_decl)
3127 internal_error ("backend decl for module variable %s already exists",
3128 sym->name);
3130 /* We always want module variables to be created. */
3131 sym->attr.referenced = 1;
3132 /* Create the decl. */
3133 decl = gfc_get_symbol_decl (sym);
3135 /* Create the variable. */
3136 pushdecl (decl);
3137 gcc_assert (DECL_CONTEXT (decl) == NULL_TREE);
3138 gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
3139 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3140 rest_of_decl_compilation (decl, 1, 0);
3141 gfc_module_add_decl (cur_module, decl);
3143 /* Also add length of strings. */
3144 if (sym->ts.type == BT_CHARACTER)
3146 tree length;
3148 length = sym->ts.cl->backend_decl;
3149 if (!INTEGER_CST_P (length))
3151 pushdecl (length);
3152 rest_of_decl_compilation (length, 1, 0);
3157 /* Emit debug information for USE statements. */
3159 static void
3160 gfc_trans_use_stmts (gfc_namespace * ns)
3162 gfc_use_list *use_stmt;
3163 for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
3165 struct module_htab_entry *entry
3166 = gfc_find_module (use_stmt->module_name);
3167 gfc_use_rename *rent;
3169 if (entry->namespace_decl == NULL)
3171 entry->namespace_decl
3172 = build_decl (NAMESPACE_DECL,
3173 get_identifier (use_stmt->module_name),
3174 void_type_node);
3175 DECL_EXTERNAL (entry->namespace_decl) = 1;
3177 gfc_set_backend_locus (&use_stmt->where);
3178 if (!use_stmt->only_flag)
3179 (*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
3180 NULL_TREE,
3181 ns->proc_name->backend_decl,
3182 false);
3183 for (rent = use_stmt->rename; rent; rent = rent->next)
3185 tree decl, local_name;
3186 void **slot;
3188 if (rent->op != INTRINSIC_NONE)
3189 continue;
3191 slot = htab_find_slot_with_hash (entry->decls, rent->use_name,
3192 htab_hash_string (rent->use_name),
3193 INSERT);
3194 if (*slot == NULL)
3196 gfc_symtree *st;
3198 st = gfc_find_symtree (ns->sym_root,
3199 rent->local_name[0]
3200 ? rent->local_name : rent->use_name);
3201 gcc_assert (st && st->n.sym->attr.use_assoc);
3202 if (st->n.sym->backend_decl
3203 && DECL_P (st->n.sym->backend_decl)
3204 && st->n.sym->module
3205 && strcmp (st->n.sym->module, use_stmt->module_name) == 0)
3207 gcc_assert (DECL_EXTERNAL (entry->namespace_decl)
3208 || (TREE_CODE (st->n.sym->backend_decl)
3209 != VAR_DECL));
3210 decl = copy_node (st->n.sym->backend_decl);
3211 DECL_CONTEXT (decl) = entry->namespace_decl;
3212 DECL_EXTERNAL (decl) = 1;
3213 DECL_IGNORED_P (decl) = 0;
3214 DECL_INITIAL (decl) = NULL_TREE;
3216 else
3218 *slot = error_mark_node;
3219 htab_clear_slot (entry->decls, slot);
3220 continue;
3222 *slot = decl;
3224 decl = (tree) *slot;
3225 if (rent->local_name[0])
3226 local_name = get_identifier (rent->local_name);
3227 else
3228 local_name = NULL_TREE;
3229 gfc_set_backend_locus (&rent->where);
3230 (*debug_hooks->imported_module_or_decl) (decl, local_name,
3231 ns->proc_name->backend_decl,
3232 !use_stmt->only_flag);
3238 /* Return true if expr is a constant initializer that gfc_conv_initializer
3239 will handle. */
3241 static bool
3242 check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array,
3243 bool pointer)
3245 gfc_constructor *c;
3246 gfc_component *cm;
3248 if (pointer)
3249 return true;
3250 else if (array)
3252 if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL)
3253 return true;
3254 else if (expr->expr_type == EXPR_STRUCTURE)
3255 return check_constant_initializer (expr, ts, false, false);
3256 else if (expr->expr_type != EXPR_ARRAY)
3257 return false;
3258 for (c = expr->value.constructor; c; c = c->next)
3260 if (c->iterator)
3261 return false;
3262 if (c->expr->expr_type == EXPR_STRUCTURE)
3264 if (!check_constant_initializer (c->expr, ts, false, false))
3265 return false;
3267 else if (c->expr->expr_type != EXPR_CONSTANT)
3268 return false;
3270 return true;
3272 else switch (ts->type)
3274 case BT_DERIVED:
3275 if (expr->expr_type != EXPR_STRUCTURE)
3276 return false;
3277 cm = expr->ts.derived->components;
3278 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3280 if (!c->expr || cm->attr.allocatable)
3281 continue;
3282 if (!check_constant_initializer (c->expr, &cm->ts,
3283 cm->attr.dimension,
3284 cm->attr.pointer))
3285 return false;
3287 return true;
3288 default:
3289 return expr->expr_type == EXPR_CONSTANT;
3293 /* Emit debug info for parameters and unreferenced variables with
3294 initializers. */
3296 static void
3297 gfc_emit_parameter_debug_info (gfc_symbol *sym)
3299 tree decl;
3301 if (sym->attr.flavor != FL_PARAMETER
3302 && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced))
3303 return;
3305 if (sym->backend_decl != NULL
3306 || sym->value == NULL
3307 || sym->attr.use_assoc
3308 || sym->attr.dummy
3309 || sym->attr.result
3310 || sym->attr.function
3311 || sym->attr.intrinsic
3312 || sym->attr.pointer
3313 || sym->attr.allocatable
3314 || sym->attr.cray_pointee
3315 || sym->attr.threadprivate
3316 || sym->attr.is_bind_c
3317 || sym->attr.subref_array_pointer
3318 || sym->attr.assign)
3319 return;
3321 if (sym->ts.type == BT_CHARACTER)
3323 gfc_conv_const_charlen (sym->ts.cl);
3324 if (sym->ts.cl->backend_decl == NULL
3325 || TREE_CODE (sym->ts.cl->backend_decl) != INTEGER_CST)
3326 return;
3328 else if (sym->ts.type == BT_DERIVED && sym->ts.derived->attr.alloc_comp)
3329 return;
3331 if (sym->as)
3333 int n;
3335 if (sym->as->type != AS_EXPLICIT)
3336 return;
3337 for (n = 0; n < sym->as->rank; n++)
3338 if (sym->as->lower[n]->expr_type != EXPR_CONSTANT
3339 || sym->as->upper[n] == NULL
3340 || sym->as->upper[n]->expr_type != EXPR_CONSTANT)
3341 return;
3344 if (!check_constant_initializer (sym->value, &sym->ts,
3345 sym->attr.dimension, false))
3346 return;
3348 /* Create the decl for the variable or constant. */
3349 decl = build_decl (sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL,
3350 gfc_sym_identifier (sym), gfc_sym_type (sym));
3351 if (sym->attr.flavor == FL_PARAMETER)
3352 TREE_READONLY (decl) = 1;
3353 gfc_set_decl_location (decl, &sym->declared_at);
3354 if (sym->attr.dimension)
3355 GFC_DECL_PACKED_ARRAY (decl) = 1;
3356 DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
3357 TREE_STATIC (decl) = 1;
3358 TREE_USED (decl) = 1;
3359 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
3360 TREE_PUBLIC (decl) = 1;
3361 DECL_INITIAL (decl)
3362 = gfc_conv_initializer (sym->value, &sym->ts, TREE_TYPE (decl),
3363 sym->attr.dimension, 0);
3364 debug_hooks->global_decl (decl);
3367 /* Generate all the required code for module variables. */
3369 void
3370 gfc_generate_module_vars (gfc_namespace * ns)
3372 module_namespace = ns;
3373 cur_module = gfc_find_module (ns->proc_name->name);
3375 /* Check if the frontend left the namespace in a reasonable state. */
3376 gcc_assert (ns->proc_name && !ns->proc_name->tlink);
3378 /* Generate COMMON blocks. */
3379 gfc_trans_common (ns);
3381 /* Create decls for all the module variables. */
3382 gfc_traverse_ns (ns, gfc_create_module_variable);
3384 cur_module = NULL;
3386 gfc_trans_use_stmts (ns);
3387 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
3391 static void
3392 gfc_generate_contained_functions (gfc_namespace * parent)
3394 gfc_namespace *ns;
3396 /* We create all the prototypes before generating any code. */
3397 for (ns = parent->contained; ns; ns = ns->sibling)
3399 /* Skip namespaces from used modules. */
3400 if (ns->parent != parent)
3401 continue;
3403 gfc_create_function_decl (ns);
3406 for (ns = parent->contained; ns; ns = ns->sibling)
3408 /* Skip namespaces from used modules. */
3409 if (ns->parent != parent)
3410 continue;
3412 gfc_generate_function_code (ns);
3417 /* Drill down through expressions for the array specification bounds and
3418 character length calling generate_local_decl for all those variables
3419 that have not already been declared. */
3421 static void
3422 generate_local_decl (gfc_symbol *);
3424 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
3426 static bool
3427 expr_decls (gfc_expr *e, gfc_symbol *sym,
3428 int *f ATTRIBUTE_UNUSED)
3430 if (e->expr_type != EXPR_VARIABLE
3431 || sym == e->symtree->n.sym
3432 || e->symtree->n.sym->mark
3433 || e->symtree->n.sym->ns != sym->ns)
3434 return false;
3436 generate_local_decl (e->symtree->n.sym);
3437 return false;
3440 static void
3441 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
3443 gfc_traverse_expr (e, sym, expr_decls, 0);
3447 /* Check for dependencies in the character length and array spec. */
3449 static void
3450 generate_dependency_declarations (gfc_symbol *sym)
3452 int i;
3454 if (sym->ts.type == BT_CHARACTER
3455 && sym->ts.cl
3456 && sym->ts.cl->length
3457 && sym->ts.cl->length->expr_type != EXPR_CONSTANT)
3458 generate_expr_decls (sym, sym->ts.cl->length);
3460 if (sym->as && sym->as->rank)
3462 for (i = 0; i < sym->as->rank; i++)
3464 generate_expr_decls (sym, sym->as->lower[i]);
3465 generate_expr_decls (sym, sym->as->upper[i]);
3471 /* Generate decls for all local variables. We do this to ensure correct
3472 handling of expressions which only appear in the specification of
3473 other functions. */
3475 static void
3476 generate_local_decl (gfc_symbol * sym)
3478 if (sym->attr.flavor == FL_VARIABLE)
3480 if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
3481 generate_dependency_declarations (sym);
3483 if (sym->attr.referenced)
3484 gfc_get_symbol_decl (sym);
3485 /* INTENT(out) dummy arguments are likely meant to be set. */
3486 else if (warn_unused_variable
3487 && sym->attr.dummy
3488 && sym->attr.intent == INTENT_OUT)
3489 gfc_warning ("Dummy argument '%s' at %L was declared INTENT(OUT) but was not set",
3490 sym->name, &sym->declared_at);
3491 /* Specific warning for unused dummy arguments. */
3492 else if (warn_unused_variable && sym->attr.dummy)
3493 gfc_warning ("Unused dummy argument '%s' at %L", sym->name,
3494 &sym->declared_at);
3495 /* Warn for unused variables, but not if they're inside a common
3496 block or are use-associated. */
3497 else if (warn_unused_variable
3498 && !(sym->attr.in_common || sym->attr.use_assoc || sym->mark))
3499 gfc_warning ("Unused variable '%s' declared at %L", sym->name,
3500 &sym->declared_at);
3501 /* For variable length CHARACTER parameters, the PARM_DECL already
3502 references the length variable, so force gfc_get_symbol_decl
3503 even when not referenced. If optimize > 0, it will be optimized
3504 away anyway. But do this only after emitting -Wunused-parameter
3505 warning if requested. */
3506 if (sym->attr.dummy && ! sym->attr.referenced
3507 && sym->ts.type == BT_CHARACTER
3508 && sym->ts.cl->backend_decl != NULL
3509 && TREE_CODE (sym->ts.cl->backend_decl) == VAR_DECL)
3511 sym->attr.referenced = 1;
3512 gfc_get_symbol_decl (sym);
3515 /* Check for dependencies in the array specification and string
3516 length, adding the necessary declarations to the function. We
3517 mark the symbol now, as well as in traverse_ns, to prevent
3518 getting stuck in a circular dependency. */
3519 sym->mark = 1;
3521 /* We do not want the middle-end to warn about unused parameters
3522 as this was already done above. */
3523 if (sym->attr.dummy && sym->backend_decl != NULL_TREE)
3524 TREE_NO_WARNING(sym->backend_decl) = 1;
3526 else if (sym->attr.flavor == FL_PARAMETER)
3528 if (warn_unused_parameter
3529 && !sym->attr.referenced
3530 && !sym->attr.use_assoc)
3531 gfc_warning ("Unused parameter '%s' declared at %L", sym->name,
3532 &sym->declared_at);
3534 else if (sym->attr.flavor == FL_PROCEDURE)
3536 /* TODO: move to the appropriate place in resolve.c. */
3537 if (warn_return_type
3538 && sym->attr.function
3539 && sym->result
3540 && sym != sym->result
3541 && !sym->result->attr.referenced
3542 && !sym->attr.use_assoc
3543 && sym->attr.if_source != IFSRC_IFBODY)
3545 gfc_warning ("Return value '%s' of function '%s' declared at "
3546 "%L not set", sym->result->name, sym->name,
3547 &sym->result->declared_at);
3549 /* Prevents "Unused variable" warning for RESULT variables. */
3550 sym->result->mark = 1;
3554 if (sym->attr.dummy == 1)
3556 /* Modify the tree type for scalar character dummy arguments of bind(c)
3557 procedures if they are passed by value. The tree type for them will
3558 be promoted to INTEGER_TYPE for the middle end, which appears to be
3559 what C would do with characters passed by-value. The value attribute
3560 implies the dummy is a scalar. */
3561 if (sym->attr.value == 1 && sym->backend_decl != NULL
3562 && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
3563 && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
3564 gfc_conv_scalar_char_value (sym, NULL, NULL);
3567 /* Make sure we convert the types of the derived types from iso_c_binding
3568 into (void *). */
3569 if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3570 && sym->ts.type == BT_DERIVED)
3571 sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3574 static void
3575 generate_local_vars (gfc_namespace * ns)
3577 gfc_traverse_ns (ns, generate_local_decl);
3581 /* Generate a switch statement to jump to the correct entry point. Also
3582 creates the label decls for the entry points. */
3584 static tree
3585 gfc_trans_entry_master_switch (gfc_entry_list * el)
3587 stmtblock_t block;
3588 tree label;
3589 tree tmp;
3590 tree val;
3592 gfc_init_block (&block);
3593 for (; el; el = el->next)
3595 /* Add the case label. */
3596 label = gfc_build_label_decl (NULL_TREE);
3597 val = build_int_cst (gfc_array_index_type, el->id);
3598 tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
3599 gfc_add_expr_to_block (&block, tmp);
3601 /* And jump to the actual entry point. */
3602 label = gfc_build_label_decl (NULL_TREE);
3603 tmp = build1_v (GOTO_EXPR, label);
3604 gfc_add_expr_to_block (&block, tmp);
3606 /* Save the label decl. */
3607 el->label = label;
3609 tmp = gfc_finish_block (&block);
3610 /* The first argument selects the entry point. */
3611 val = DECL_ARGUMENTS (current_function_decl);
3612 tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
3613 return tmp;
3617 /* Generate code for a function. */
3619 void
3620 gfc_generate_function_code (gfc_namespace * ns)
3622 tree fndecl;
3623 tree old_context;
3624 tree decl;
3625 tree tmp;
3626 tree tmp2;
3627 stmtblock_t block;
3628 stmtblock_t body;
3629 tree result;
3630 gfc_symbol *sym;
3631 int rank;
3633 sym = ns->proc_name;
3635 /* Check that the frontend isn't still using this. */
3636 gcc_assert (sym->tlink == NULL);
3637 sym->tlink = sym;
3639 /* Create the declaration for functions with global scope. */
3640 if (!sym->backend_decl)
3641 gfc_create_function_decl (ns);
3643 fndecl = sym->backend_decl;
3644 old_context = current_function_decl;
3646 if (old_context)
3648 push_function_context ();
3649 saved_parent_function_decls = saved_function_decls;
3650 saved_function_decls = NULL_TREE;
3653 trans_function_start (sym);
3655 gfc_start_block (&block);
3657 if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
3659 /* Copy length backend_decls to all entry point result
3660 symbols. */
3661 gfc_entry_list *el;
3662 tree backend_decl;
3664 gfc_conv_const_charlen (ns->proc_name->ts.cl);
3665 backend_decl = ns->proc_name->result->ts.cl->backend_decl;
3666 for (el = ns->entries; el; el = el->next)
3667 el->sym->result->ts.cl->backend_decl = backend_decl;
3670 /* Translate COMMON blocks. */
3671 gfc_trans_common (ns);
3673 /* Null the parent fake result declaration if this namespace is
3674 a module function or an external procedures. */
3675 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3676 || ns->parent == NULL)
3677 parent_fake_result_decl = NULL_TREE;
3679 gfc_generate_contained_functions (ns);
3681 generate_local_vars (ns);
3683 /* Keep the parent fake result declaration in module functions
3684 or external procedures. */
3685 if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3686 || ns->parent == NULL)
3687 current_fake_result_decl = parent_fake_result_decl;
3688 else
3689 current_fake_result_decl = NULL_TREE;
3691 current_function_return_label = NULL;
3693 /* Now generate the code for the body of this function. */
3694 gfc_init_block (&body);
3696 /* If this is the main program, add a call to set_options to set up the
3697 runtime library Fortran language standard parameters. */
3698 if (sym->attr.is_main_program)
3700 tree array_type, array, var;
3702 /* Passing a new option to the library requires four modifications:
3703 + add it to the tree_cons list below
3704 + change the array size in the call to build_array_type
3705 + change the first argument to the library call
3706 gfor_fndecl_set_options
3707 + modify the library (runtime/compile_options.c)! */
3708 array = tree_cons (NULL_TREE,
3709 build_int_cst (integer_type_node,
3710 gfc_option.warn_std), NULL_TREE);
3711 array = tree_cons (NULL_TREE,
3712 build_int_cst (integer_type_node,
3713 gfc_option.allow_std), array);
3714 array = tree_cons (NULL_TREE,
3715 build_int_cst (integer_type_node, pedantic), array);
3716 array = tree_cons (NULL_TREE,
3717 build_int_cst (integer_type_node,
3718 gfc_option.flag_dump_core), array);
3719 array = tree_cons (NULL_TREE,
3720 build_int_cst (integer_type_node,
3721 gfc_option.flag_backtrace), array);
3722 array = tree_cons (NULL_TREE,
3723 build_int_cst (integer_type_node,
3724 gfc_option.flag_sign_zero), array);
3726 array = tree_cons (NULL_TREE,
3727 build_int_cst (integer_type_node,
3728 flag_bounds_check), array);
3730 array = tree_cons (NULL_TREE,
3731 build_int_cst (integer_type_node,
3732 gfc_option.flag_range_check), array);
3734 array_type = build_array_type (integer_type_node,
3735 build_index_type (build_int_cst (NULL_TREE,
3736 7)));
3737 array = build_constructor_from_list (array_type, nreverse (array));
3738 TREE_CONSTANT (array) = 1;
3739 TREE_STATIC (array) = 1;
3741 /* Create a static variable to hold the jump table. */
3742 var = gfc_create_var (array_type, "options");
3743 TREE_CONSTANT (var) = 1;
3744 TREE_STATIC (var) = 1;
3745 TREE_READONLY (var) = 1;
3746 DECL_INITIAL (var) = array;
3747 var = gfc_build_addr_expr (pvoid_type_node, var);
3749 tmp = build_call_expr (gfor_fndecl_set_options, 2,
3750 build_int_cst (integer_type_node, 8), var);
3751 gfc_add_expr_to_block (&body, tmp);
3754 /* If this is the main program and a -ffpe-trap option was provided,
3755 add a call to set_fpe so that the library will raise a FPE when
3756 needed. */
3757 if (sym->attr.is_main_program && gfc_option.fpe != 0)
3759 tmp = build_call_expr (gfor_fndecl_set_fpe, 1,
3760 build_int_cst (integer_type_node,
3761 gfc_option.fpe));
3762 gfc_add_expr_to_block (&body, tmp);
3765 /* If this is the main program and an -fconvert option was provided,
3766 add a call to set_convert. */
3768 if (sym->attr.is_main_program && gfc_option.convert != GFC_CONVERT_NATIVE)
3770 tmp = build_call_expr (gfor_fndecl_set_convert, 1,
3771 build_int_cst (integer_type_node,
3772 gfc_option.convert));
3773 gfc_add_expr_to_block (&body, tmp);
3776 /* If this is the main program and an -frecord-marker option was provided,
3777 add a call to set_record_marker. */
3779 if (sym->attr.is_main_program && gfc_option.record_marker != 0)
3781 tmp = build_call_expr (gfor_fndecl_set_record_marker, 1,
3782 build_int_cst (integer_type_node,
3783 gfc_option.record_marker));
3784 gfc_add_expr_to_block (&body, tmp);
3787 if (sym->attr.is_main_program && gfc_option.max_subrecord_length != 0)
3789 tmp = build_call_expr (gfor_fndecl_set_max_subrecord_length,
3791 build_int_cst (integer_type_node,
3792 gfc_option.max_subrecord_length));
3793 gfc_add_expr_to_block (&body, tmp);
3796 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
3797 && sym->attr.subroutine)
3799 tree alternate_return;
3800 alternate_return = gfc_get_fake_result_decl (sym, 0);
3801 gfc_add_modify (&body, alternate_return, integer_zero_node);
3804 if (ns->entries)
3806 /* Jump to the correct entry point. */
3807 tmp = gfc_trans_entry_master_switch (ns->entries);
3808 gfc_add_expr_to_block (&body, tmp);
3811 tmp = gfc_trans_code (ns->code);
3812 gfc_add_expr_to_block (&body, tmp);
3814 /* Add a return label if needed. */
3815 if (current_function_return_label)
3817 tmp = build1_v (LABEL_EXPR, current_function_return_label);
3818 gfc_add_expr_to_block (&body, tmp);
3821 tmp = gfc_finish_block (&body);
3822 /* Add code to create and cleanup arrays. */
3823 tmp = gfc_trans_deferred_vars (sym, tmp);
3825 if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
3827 if (sym->attr.subroutine || sym == sym->result)
3829 if (current_fake_result_decl != NULL)
3830 result = TREE_VALUE (current_fake_result_decl);
3831 else
3832 result = NULL_TREE;
3833 current_fake_result_decl = NULL_TREE;
3835 else
3836 result = sym->result->backend_decl;
3838 if (result != NULL_TREE && sym->attr.function
3839 && sym->ts.type == BT_DERIVED
3840 && sym->ts.derived->attr.alloc_comp
3841 && !sym->attr.pointer)
3843 rank = sym->as ? sym->as->rank : 0;
3844 tmp2 = gfc_nullify_alloc_comp (sym->ts.derived, result, rank);
3845 gfc_add_expr_to_block (&block, tmp2);
3848 gfc_add_expr_to_block (&block, tmp);
3850 if (result == NULL_TREE)
3852 /* TODO: move to the appropriate place in resolve.c. */
3853 if (warn_return_type && !sym->attr.referenced && sym == sym->result)
3854 gfc_warning ("Return value of function '%s' at %L not set",
3855 sym->name, &sym->declared_at);
3857 TREE_NO_WARNING(sym->backend_decl) = 1;
3859 else
3861 /* Set the return value to the dummy result variable. The
3862 types may be different for scalar default REAL functions
3863 with -ff2c, therefore we have to convert. */
3864 tmp = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
3865 tmp = fold_build2 (MODIFY_EXPR, TREE_TYPE (tmp),
3866 DECL_RESULT (fndecl), tmp);
3867 tmp = build1_v (RETURN_EXPR, tmp);
3868 gfc_add_expr_to_block (&block, tmp);
3871 else
3872 gfc_add_expr_to_block (&block, tmp);
3875 /* Add all the decls we created during processing. */
3876 decl = saved_function_decls;
3877 while (decl)
3879 tree next;
3881 next = TREE_CHAIN (decl);
3882 TREE_CHAIN (decl) = NULL_TREE;
3883 pushdecl (decl);
3884 decl = next;
3886 saved_function_decls = NULL_TREE;
3888 DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
3890 /* Finish off this function and send it for code generation. */
3891 poplevel (1, 0, 1);
3892 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3894 /* Output the GENERIC tree. */
3895 dump_function (TDI_original, fndecl);
3897 /* Store the end of the function, so that we get good line number
3898 info for the epilogue. */
3899 cfun->function_end_locus = input_location;
3901 /* We're leaving the context of this function, so zap cfun.
3902 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
3903 tree_rest_of_compilation. */
3904 set_cfun (NULL);
3906 if (old_context)
3908 pop_function_context ();
3909 saved_function_decls = saved_parent_function_decls;
3911 current_function_decl = old_context;
3913 if (decl_function_context (fndecl))
3914 /* Register this function with cgraph just far enough to get it
3915 added to our parent's nested function list. */
3916 (void) cgraph_node (fndecl);
3917 else
3919 gfc_gimplify_function (fndecl);
3920 cgraph_finalize_function (fndecl, false);
3923 gfc_trans_use_stmts (ns);
3924 gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
3927 void
3928 gfc_generate_constructors (void)
3930 gcc_assert (gfc_static_ctors == NULL_TREE);
3931 #if 0
3932 tree fnname;
3933 tree type;
3934 tree fndecl;
3935 tree decl;
3936 tree tmp;
3938 if (gfc_static_ctors == NULL_TREE)
3939 return;
3941 fnname = get_file_function_name ("I");
3942 type = build_function_type (void_type_node,
3943 gfc_chainon_list (NULL_TREE, void_type_node));
3945 fndecl = build_decl (FUNCTION_DECL, fnname, type);
3946 TREE_PUBLIC (fndecl) = 1;
3948 decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
3949 DECL_ARTIFICIAL (decl) = 1;
3950 DECL_IGNORED_P (decl) = 1;
3951 DECL_CONTEXT (decl) = fndecl;
3952 DECL_RESULT (fndecl) = decl;
3954 pushdecl (fndecl);
3956 current_function_decl = fndecl;
3958 rest_of_decl_compilation (fndecl, 1, 0);
3960 make_decl_rtl (fndecl);
3962 init_function_start (fndecl);
3964 pushlevel (0);
3966 for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
3968 tmp = build_call_expr (TREE_VALUE (gfc_static_ctors), 0);
3969 DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
3972 poplevel (1, 0, 1);
3974 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3976 free_after_parsing (cfun);
3977 free_after_compilation (cfun);
3979 tree_rest_of_compilation (fndecl);
3981 current_function_decl = NULL_TREE;
3982 #endif
3985 /* Translates a BLOCK DATA program unit. This means emitting the
3986 commons contained therein plus their initializations. We also emit
3987 a globally visible symbol to make sure that each BLOCK DATA program
3988 unit remains unique. */
3990 void
3991 gfc_generate_block_data (gfc_namespace * ns)
3993 tree decl;
3994 tree id;
3996 /* Tell the backend the source location of the block data. */
3997 if (ns->proc_name)
3998 gfc_set_backend_locus (&ns->proc_name->declared_at);
3999 else
4000 gfc_set_backend_locus (&gfc_current_locus);
4002 /* Process the DATA statements. */
4003 gfc_trans_common (ns);
4005 /* Create a global symbol with the mane of the block data. This is to
4006 generate linker errors if the same name is used twice. It is never
4007 really used. */
4008 if (ns->proc_name)
4009 id = gfc_sym_mangled_function_id (ns->proc_name);
4010 else
4011 id = get_identifier ("__BLOCK_DATA__");
4013 decl = build_decl (VAR_DECL, id, gfc_array_index_type);
4014 TREE_PUBLIC (decl) = 1;
4015 TREE_STATIC (decl) = 1;
4016 DECL_IGNORED_P (decl) = 1;
4018 pushdecl (decl);
4019 rest_of_decl_compilation (decl, 1, 0);
4023 #include "gt-fortran-trans-decl.h"