OSDN Git Service

2007-07-09 Thomas Koenig <tkoenig@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / trans-decl.c
1 /* Backend function setup
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software
3    Foundation, Inc.
4    Contributed by Paul Brook
5
6 This file is part of GCC.
7
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 2, or (at your option) any later
11 version.
12
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.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23 /* trans-decl.c -- Handling of backend function and variable decls, etc */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tree.h"
29 #include "tree-dump.h"
30 #include "tree-gimple.h"
31 #include "ggc.h"
32 #include "toplev.h"
33 #include "tm.h"
34 #include "rtl.h"
35 #include "target.h"
36 #include "function.h"
37 #include "flags.h"
38 #include "cgraph.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"
46
47 #define MAX_LABEL_VALUE 99999
48
49
50 /* Holds the result of the function if no result variable specified.  */
51
52 static GTY(()) tree current_fake_result_decl;
53 static GTY(()) tree parent_fake_result_decl;
54
55 static GTY(()) tree current_function_return_label;
56
57
58 /* Holds the variable DECLs for the current function.  */
59
60 static GTY(()) tree saved_function_decls;
61 static GTY(()) tree saved_parent_function_decls;
62
63
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.  */
66
67 static gfc_namespace *module_namespace;
68
69
70 /* List of static constructor functions.  */
71
72 tree gfc_static_ctors;
73
74
75 /* Function declarations for builtin library functions.  */
76
77 tree gfor_fndecl_internal_realloc;
78 tree gfor_fndecl_allocate;
79 tree gfor_fndecl_allocate_array;
80 tree gfor_fndecl_deallocate;
81 tree gfor_fndecl_pause_numeric;
82 tree gfor_fndecl_pause_string;
83 tree gfor_fndecl_stop_numeric;
84 tree gfor_fndecl_stop_string;
85 tree gfor_fndecl_select_string;
86 tree gfor_fndecl_runtime_error;
87 tree gfor_fndecl_runtime_error_at;
88 tree gfor_fndecl_os_error;
89 tree gfor_fndecl_generate_error;
90 tree gfor_fndecl_set_fpe;
91 tree gfor_fndecl_set_std;
92 tree gfor_fndecl_set_convert;
93 tree gfor_fndecl_set_record_marker;
94 tree gfor_fndecl_set_max_subrecord_length;
95 tree gfor_fndecl_ctime;
96 tree gfor_fndecl_fdate;
97 tree gfor_fndecl_ttynam;
98 tree gfor_fndecl_in_pack;
99 tree gfor_fndecl_in_unpack;
100 tree gfor_fndecl_associated;
101
102
103 /* Math functions.  Many other math functions are handled in
104    trans-intrinsic.c.  */
105
106 gfc_powdecl_list gfor_fndecl_math_powi[4][3];
107 tree gfor_fndecl_math_cpowf;
108 tree gfor_fndecl_math_cpow;
109 tree gfor_fndecl_math_cpowl10;
110 tree gfor_fndecl_math_cpowl16;
111 tree gfor_fndecl_math_ishftc4;
112 tree gfor_fndecl_math_ishftc8;
113 tree gfor_fndecl_math_ishftc16;
114 tree gfor_fndecl_math_exponent4;
115 tree gfor_fndecl_math_exponent8;
116 tree gfor_fndecl_math_exponent10;
117 tree gfor_fndecl_math_exponent16;
118
119
120 /* String functions.  */
121
122 tree gfor_fndecl_compare_string;
123 tree gfor_fndecl_concat_string;
124 tree gfor_fndecl_string_len_trim;
125 tree gfor_fndecl_string_index;
126 tree gfor_fndecl_string_scan;
127 tree gfor_fndecl_string_verify;
128 tree gfor_fndecl_string_trim;
129 tree gfor_fndecl_adjustl;
130 tree gfor_fndecl_adjustr;
131
132
133 /* Other misc. runtime library functions.  */
134
135 tree gfor_fndecl_size0;
136 tree gfor_fndecl_size1;
137 tree gfor_fndecl_iargc;
138
139 /* Intrinsic functions implemented in FORTRAN.  */
140 tree gfor_fndecl_si_kind;
141 tree gfor_fndecl_sr_kind;
142
143 /* BLAS gemm functions.  */
144 tree gfor_fndecl_sgemm;
145 tree gfor_fndecl_dgemm;
146 tree gfor_fndecl_cgemm;
147 tree gfor_fndecl_zgemm;
148
149
150 static void
151 gfc_add_decl_to_parent_function (tree decl)
152 {
153   gcc_assert (decl);
154   DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
155   DECL_NONLOCAL (decl) = 1;
156   TREE_CHAIN (decl) = saved_parent_function_decls;
157   saved_parent_function_decls = decl;
158 }
159
160 void
161 gfc_add_decl_to_function (tree decl)
162 {
163   gcc_assert (decl);
164   TREE_USED (decl) = 1;
165   DECL_CONTEXT (decl) = current_function_decl;
166   TREE_CHAIN (decl) = saved_function_decls;
167   saved_function_decls = decl;
168 }
169
170
171 /* Build a  backend label declaration.  Set TREE_USED for named labels.
172    The context of the label is always the current_function_decl.  All
173    labels are marked artificial.  */
174
175 tree
176 gfc_build_label_decl (tree label_id)
177 {
178   /* 2^32 temporaries should be enough.  */
179   static unsigned int tmp_num = 1;
180   tree label_decl;
181   char *label_name;
182
183   if (label_id == NULL_TREE)
184     {
185       /* Build an internal label name.  */
186       ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
187       label_id = get_identifier (label_name);
188     }
189   else
190     label_name = NULL;
191
192   /* Build the LABEL_DECL node. Labels have no type.  */
193   label_decl = build_decl (LABEL_DECL, label_id, void_type_node);
194   DECL_CONTEXT (label_decl) = current_function_decl;
195   DECL_MODE (label_decl) = VOIDmode;
196
197   /* We always define the label as used, even if the original source
198      file never references the label.  We don't want all kinds of
199      spurious warnings for old-style Fortran code with too many
200      labels.  */
201   TREE_USED (label_decl) = 1;
202
203   DECL_ARTIFICIAL (label_decl) = 1;
204   return label_decl;
205 }
206
207
208 /* Returns the return label for the current function.  */
209
210 tree
211 gfc_get_return_label (void)
212 {
213   char name[GFC_MAX_SYMBOL_LEN + 10];
214
215   if (current_function_return_label)
216     return current_function_return_label;
217
218   sprintf (name, "__return_%s",
219            IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
220
221   current_function_return_label =
222     gfc_build_label_decl (get_identifier (name));
223
224   DECL_ARTIFICIAL (current_function_return_label) = 1;
225
226   return current_function_return_label;
227 }
228
229
230 /* Set the backend source location of a decl.  */
231
232 void
233 gfc_set_decl_location (tree decl, locus * loc)
234 {
235 #ifdef USE_MAPPED_LOCATION
236   DECL_SOURCE_LOCATION (decl) = loc->lb->location;
237 #else
238   DECL_SOURCE_LINE (decl) = loc->lb->linenum;
239   DECL_SOURCE_FILE (decl) = loc->lb->file->filename;
240 #endif
241 }
242
243
244 /* Return the backend label declaration for a given label structure,
245    or create it if it doesn't exist yet.  */
246
247 tree
248 gfc_get_label_decl (gfc_st_label * lp)
249 {
250   if (lp->backend_decl)
251     return lp->backend_decl;
252   else
253     {
254       char label_name[GFC_MAX_SYMBOL_LEN + 1];
255       tree label_decl;
256
257       /* Validate the label declaration from the front end.  */
258       gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
259
260       /* Build a mangled name for the label.  */
261       sprintf (label_name, "__label_%.6d", lp->value);
262
263       /* Build the LABEL_DECL node.  */
264       label_decl = gfc_build_label_decl (get_identifier (label_name));
265
266       /* Tell the debugger where the label came from.  */
267       if (lp->value <= MAX_LABEL_VALUE) /* An internal label.  */
268         gfc_set_decl_location (label_decl, &lp->where);
269       else
270         DECL_ARTIFICIAL (label_decl) = 1;
271
272       /* Store the label in the label list and return the LABEL_DECL.  */
273       lp->backend_decl = label_decl;
274       return label_decl;
275     }
276 }
277
278
279 /* Convert a gfc_symbol to an identifier of the same name.  */
280
281 static tree
282 gfc_sym_identifier (gfc_symbol * sym)
283 {
284   return (get_identifier (sym->name));
285 }
286
287
288 /* Construct mangled name from symbol name.  */
289
290 static tree
291 gfc_sym_mangled_identifier (gfc_symbol * sym)
292 {
293   char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
294
295   /* Prevent the mangling of identifiers that have an assigned
296      binding label (mainly those that are bind(c)).  */
297   if (sym->attr.is_bind_c == 1
298       && sym->binding_label[0] != '\0')
299     return get_identifier(sym->binding_label);
300   
301   if (sym->module == NULL)
302     return gfc_sym_identifier (sym);
303   else
304     {
305       snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
306       return get_identifier (name);
307     }
308 }
309
310
311 /* Construct mangled function name from symbol name.  */
312
313 static tree
314 gfc_sym_mangled_function_id (gfc_symbol * sym)
315 {
316   int has_underscore;
317   char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
318
319   /* It may be possible to simply use the binding label if it's
320      provided, and remove the other checks.  Then we could use it
321      for other things if we wished.  */
322   if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
323       sym->binding_label[0] != '\0')
324     /* use the binding label rather than the mangled name */
325     return get_identifier (sym->binding_label);
326
327   if (sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
328       || (sym->module != NULL && (sym->attr.external
329             || sym->attr.if_source == IFSRC_IFBODY)))
330     {
331       if (strcmp (sym->name, "MAIN__") == 0
332           || sym->attr.proc == PROC_INTRINSIC)
333         return get_identifier (sym->name);
334
335       if (gfc_option.flag_underscoring)
336         {
337           has_underscore = strchr (sym->name, '_') != 0;
338           if (gfc_option.flag_second_underscore && has_underscore)
339             snprintf (name, sizeof name, "%s__", sym->name);
340           else
341             snprintf (name, sizeof name, "%s_", sym->name);
342           return get_identifier (name);
343         }
344       else
345         return get_identifier (sym->name);
346     }
347   else
348     {
349       snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
350       return get_identifier (name);
351     }
352 }
353
354
355 /* Returns true if a variable of specified size should go on the stack.  */
356
357 int
358 gfc_can_put_var_on_stack (tree size)
359 {
360   unsigned HOST_WIDE_INT low;
361
362   if (!INTEGER_CST_P (size))
363     return 0;
364
365   if (gfc_option.flag_max_stack_var_size < 0)
366     return 1;
367
368   if (TREE_INT_CST_HIGH (size) != 0)
369     return 0;
370
371   low = TREE_INT_CST_LOW (size);
372   if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
373     return 0;
374
375 /* TODO: Set a per-function stack size limit.  */
376
377   return 1;
378 }
379
380
381 /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
382    an expression involving its corresponding pointer.  There are
383    2 cases; one for variable size arrays, and one for everything else,
384    because variable-sized arrays require one fewer level of
385    indirection.  */
386
387 static void
388 gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
389 {
390   tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
391   tree value;
392
393   /* Parameters need to be dereferenced.  */
394   if (sym->cp_pointer->attr.dummy) 
395     ptr_decl = build_fold_indirect_ref (ptr_decl);
396
397   /* Check to see if we're dealing with a variable-sized array.  */
398   if (sym->attr.dimension
399       && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE) 
400     {  
401       /* These decls will be dereferenced later, so we don't dereference
402          them here.  */
403       value = convert (TREE_TYPE (decl), ptr_decl);
404     }
405   else
406     {
407       ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
408                           ptr_decl);
409       value = build_fold_indirect_ref (ptr_decl);
410     }
411
412   SET_DECL_VALUE_EXPR (decl, value);
413   DECL_HAS_VALUE_EXPR_P (decl) = 1;
414   GFC_DECL_CRAY_POINTEE (decl) = 1;
415   /* This is a fake variable just for debugging purposes.  */
416   TREE_ASM_WRITTEN (decl) = 1;
417 }
418
419
420 /* Finish processing of a declaration without an initial value.  */
421
422 static void
423 gfc_finish_decl (tree decl)
424 {
425   gcc_assert (TREE_CODE (decl) == PARM_DECL
426               || DECL_INITIAL (decl) == NULL_TREE);
427
428   if (TREE_CODE (decl) != VAR_DECL)
429     return;
430
431   if (DECL_SIZE (decl) == NULL_TREE
432       && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
433     layout_decl (decl, 0);
434
435   /* A few consistency checks.  */
436   /* A static variable with an incomplete type is an error if it is
437      initialized. Also if it is not file scope. Otherwise, let it
438      through, but if it is not `extern' then it may cause an error
439      message later.  */
440   /* An automatic variable with an incomplete type is an error.  */
441
442   /* We should know the storage size.  */
443   gcc_assert (DECL_SIZE (decl) != NULL_TREE
444               || (TREE_STATIC (decl) 
445                   ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
446                   : DECL_EXTERNAL (decl)));
447
448   /* The storage size should be constant.  */
449   gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
450               || !DECL_SIZE (decl)
451               || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
452 }
453
454
455 /* Apply symbol attributes to a variable, and add it to the function scope.  */
456
457 static void
458 gfc_finish_var_decl (tree decl, gfc_symbol * sym)
459 {
460   tree new;
461   /* TREE_ADDRESSABLE means the address of this variable is actually needed.
462      This is the equivalent of the TARGET variables.
463      We also need to set this if the variable is passed by reference in a
464      CALL statement.  */
465
466   /* Set DECL_VALUE_EXPR for Cray Pointees.  */
467   if (sym->attr.cray_pointee)
468     gfc_finish_cray_pointee (decl, sym);
469
470   if (sym->attr.target)
471     TREE_ADDRESSABLE (decl) = 1;
472   /* If it wasn't used we wouldn't be getting it.  */
473   TREE_USED (decl) = 1;
474
475   /* Chain this decl to the pending declarations.  Don't do pushdecl()
476      because this would add them to the current scope rather than the
477      function scope.  */
478   if (current_function_decl != NULL_TREE)
479     {
480       if (sym->ns->proc_name->backend_decl == current_function_decl
481           || sym->result == sym)
482         gfc_add_decl_to_function (decl);
483       else
484         gfc_add_decl_to_parent_function (decl);
485     }
486
487   if (sym->attr.cray_pointee)
488     return;
489
490   if(sym->attr.is_bind_c == 1)
491     {
492       /* We need to put variables that are bind(c) into the common
493          segment of the object file, because this is what C would do.
494          gfortran would typically put them in either the BSS or
495          initialized data segments, and only mark them as common if
496          they were part of common blocks.  However, if they are not put
497          into common space, then C cannot initialize global fortran
498          variables that it interoperates with and the draft says that
499          either Fortran or C should be able to initialize it (but not
500          both, of course.) (J3/04-007, section 15.3).  */
501       TREE_PUBLIC(decl) = 1;
502       DECL_COMMON(decl) = 1;
503     }
504   
505   /* If a variable is USE associated, it's always external.  */
506   if (sym->attr.use_assoc)
507     {
508       DECL_EXTERNAL (decl) = 1;
509       TREE_PUBLIC (decl) = 1;
510     }
511   else if (sym->module && !sym->attr.result && !sym->attr.dummy)
512     {
513       /* TODO: Don't set sym->module for result or dummy variables.  */
514       gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
515       /* This is the declaration of a module variable.  */
516       TREE_PUBLIC (decl) = 1;
517       TREE_STATIC (decl) = 1;
518     }
519
520   if ((sym->attr.save || sym->attr.data || sym->value)
521       && !sym->attr.use_assoc)
522     TREE_STATIC (decl) = 1;
523
524   if (sym->attr.volatile_)
525     {
526       TREE_THIS_VOLATILE (decl) = 1;
527       new = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
528       TREE_TYPE (decl) = new;
529     } 
530
531   /* Keep variables larger than max-stack-var-size off stack.  */
532   if (!sym->ns->proc_name->attr.recursive
533       && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
534       && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
535          /* Put variable length auto array pointers always into stack.  */
536       && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
537           || sym->attr.dimension == 0
538           || sym->as->type != AS_EXPLICIT
539           || sym->attr.pointer
540           || sym->attr.allocatable)
541       && !DECL_ARTIFICIAL (decl))
542     TREE_STATIC (decl) = 1;
543
544   /* Handle threadprivate variables.  */
545   if (sym->attr.threadprivate
546       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
547     DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
548 }
549
550
551 /* Allocate the lang-specific part of a decl.  */
552
553 void
554 gfc_allocate_lang_decl (tree decl)
555 {
556   DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
557     ggc_alloc_cleared (sizeof (struct lang_decl));
558 }
559
560 /* Remember a symbol to generate initialization/cleanup code at function
561    entry/exit.  */
562
563 static void
564 gfc_defer_symbol_init (gfc_symbol * sym)
565 {
566   gfc_symbol *p;
567   gfc_symbol *last;
568   gfc_symbol *head;
569
570   /* Don't add a symbol twice.  */
571   if (sym->tlink)
572     return;
573
574   last = head = sym->ns->proc_name;
575   p = last->tlink;
576
577   /* Make sure that setup code for dummy variables which are used in the
578      setup of other variables is generated first.  */
579   if (sym->attr.dummy)
580     {
581       /* Find the first dummy arg seen after us, or the first non-dummy arg.
582          This is a circular list, so don't go past the head.  */
583       while (p != head
584              && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
585         {
586           last = p;
587           p = p->tlink;
588         }
589     }
590   /* Insert in between last and p.  */
591   last->tlink = sym;
592   sym->tlink = p;
593 }
594
595
596 /* Create an array index type variable with function scope.  */
597
598 static tree
599 create_index_var (const char * pfx, int nest)
600 {
601   tree decl;
602
603   decl = gfc_create_var_np (gfc_array_index_type, pfx);
604   if (nest)
605     gfc_add_decl_to_parent_function (decl);
606   else
607     gfc_add_decl_to_function (decl);
608   return decl;
609 }
610
611
612 /* Create variables to hold all the non-constant bits of info for a
613    descriptorless array.  Remember these in the lang-specific part of the
614    type.  */
615
616 static void
617 gfc_build_qualified_array (tree decl, gfc_symbol * sym)
618 {
619   tree type;
620   int dim;
621   int nest;
622
623   type = TREE_TYPE (decl);
624
625   /* We just use the descriptor, if there is one.  */
626   if (GFC_DESCRIPTOR_TYPE_P (type))
627     return;
628
629   gcc_assert (GFC_ARRAY_TYPE_P (type));
630   nest = (sym->ns->proc_name->backend_decl != current_function_decl)
631          && !sym->attr.contained;
632
633   for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
634     {
635       if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
636         {
637           GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
638           TREE_NO_WARNING (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 1;
639         }
640       /* Don't try to use the unknown bound for assumed shape arrays.  */
641       if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
642           && (sym->as->type != AS_ASSUMED_SIZE
643               || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
644         {
645           GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
646           TREE_NO_WARNING (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 1;
647         }
648
649       if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
650         {
651           GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
652           TREE_NO_WARNING (GFC_TYPE_ARRAY_STRIDE (type, dim)) = 1;
653         }
654     }
655   if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
656     {
657       GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
658                                                         "offset");
659       TREE_NO_WARNING (GFC_TYPE_ARRAY_OFFSET (type)) = 1;
660
661       if (nest)
662         gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
663       else
664         gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
665     }
666
667   if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
668       && sym->as->type != AS_ASSUMED_SIZE)
669     {
670       GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
671       TREE_NO_WARNING (GFC_TYPE_ARRAY_SIZE (type)) = 1;
672     }
673
674   if (POINTER_TYPE_P (type))
675     {
676       gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
677       gcc_assert (TYPE_LANG_SPECIFIC (type)
678                   == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
679       type = TREE_TYPE (type);
680     }
681
682   if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
683     {
684       tree size, range;
685
686       size = build2 (MINUS_EXPR, gfc_array_index_type,
687                      GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
688       range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
689                                 size);
690       TYPE_DOMAIN (type) = range;
691       layout_type (type);
692     }
693 }
694
695
696 /* For some dummy arguments we don't use the actual argument directly.
697    Instead we create a local decl and use that.  This allows us to perform
698    initialization, and construct full type information.  */
699
700 static tree
701 gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
702 {
703   tree decl;
704   tree type;
705   gfc_array_spec *as;
706   char *name;
707   gfc_packed packed;
708   int n;
709   bool known_size;
710
711   if (sym->attr.pointer || sym->attr.allocatable)
712     return dummy;
713
714   /* Add to list of variables if not a fake result variable.  */
715   if (sym->attr.result || sym->attr.dummy)
716     gfc_defer_symbol_init (sym);
717
718   type = TREE_TYPE (dummy);
719   gcc_assert (TREE_CODE (dummy) == PARM_DECL
720           && POINTER_TYPE_P (type));
721
722   /* Do we know the element size?  */
723   known_size = sym->ts.type != BT_CHARACTER
724           || INTEGER_CST_P (sym->ts.cl->backend_decl);
725   
726   if (known_size && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (type)))
727     {
728       /* For descriptorless arrays with known element size the actual
729          argument is sufficient.  */
730       gcc_assert (GFC_ARRAY_TYPE_P (type));
731       gfc_build_qualified_array (dummy, sym);
732       return dummy;
733     }
734
735   type = TREE_TYPE (type);
736   if (GFC_DESCRIPTOR_TYPE_P (type))
737     {
738       /* Create a descriptorless array pointer.  */
739       as = sym->as;
740       packed = PACKED_NO;
741       if (!gfc_option.flag_repack_arrays)
742         {
743           if (as->type == AS_ASSUMED_SIZE)
744             packed = PACKED_FULL;
745         }
746       else
747         {
748           if (as->type == AS_EXPLICIT)
749             {
750               packed = PACKED_FULL;
751               for (n = 0; n < as->rank; n++)
752                 {
753                   if (!(as->upper[n]
754                         && as->lower[n]
755                         && as->upper[n]->expr_type == EXPR_CONSTANT
756                         && as->lower[n]->expr_type == EXPR_CONSTANT))
757                     packed = PACKED_PARTIAL;
758                 }
759             }
760           else
761             packed = PACKED_PARTIAL;
762         }
763
764       type = gfc_typenode_for_spec (&sym->ts);
765       type = gfc_get_nodesc_array_type (type, sym->as, packed);
766     }
767   else
768     {
769       /* We now have an expression for the element size, so create a fully
770          qualified type.  Reset sym->backend decl or this will just return the
771          old type.  */
772       DECL_ARTIFICIAL (sym->backend_decl) = 1;
773       sym->backend_decl = NULL_TREE;
774       type = gfc_sym_type (sym);
775       packed = PACKED_FULL;
776     }
777
778   ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
779   decl = build_decl (VAR_DECL, get_identifier (name), type);
780
781   DECL_ARTIFICIAL (decl) = 1;
782   TREE_PUBLIC (decl) = 0;
783   TREE_STATIC (decl) = 0;
784   DECL_EXTERNAL (decl) = 0;
785
786   /* We should never get deferred shape arrays here.  We used to because of
787      frontend bugs.  */
788   gcc_assert (sym->as->type != AS_DEFERRED);
789
790   if (packed == PACKED_PARTIAL)
791     GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
792   else if (packed == PACKED_FULL)
793     GFC_DECL_PACKED_ARRAY (decl) = 1;
794
795   gfc_build_qualified_array (decl, sym);
796
797   if (DECL_LANG_SPECIFIC (dummy))
798     DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
799   else
800     gfc_allocate_lang_decl (decl);
801
802   GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
803
804   if (sym->ns->proc_name->backend_decl == current_function_decl
805       || sym->attr.contained)
806     gfc_add_decl_to_function (decl);
807   else
808     gfc_add_decl_to_parent_function (decl);
809
810   return decl;
811 }
812
813
814 /* Return a constant or a variable to use as a string length.  Does not
815    add the decl to the current scope.  */
816
817 static tree
818 gfc_create_string_length (gfc_symbol * sym)
819 {
820   tree length;
821
822   gcc_assert (sym->ts.cl);
823   gfc_conv_const_charlen (sym->ts.cl);
824   
825   if (sym->ts.cl->backend_decl == NULL_TREE)
826     {
827       char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
828
829       /* Also prefix the mangled name.  */
830       strcpy (&name[1], sym->name);
831       name[0] = '.';
832       length = build_decl (VAR_DECL, get_identifier (name),
833                            gfc_charlen_type_node);
834       DECL_ARTIFICIAL (length) = 1;
835       TREE_USED (length) = 1;
836       if (sym->ns->proc_name->tlink != NULL)
837         gfc_defer_symbol_init (sym);
838       sym->ts.cl->backend_decl = length;
839     }
840
841   return sym->ts.cl->backend_decl;
842 }
843
844 /* If a variable is assigned a label, we add another two auxiliary
845    variables.  */
846
847 static void
848 gfc_add_assign_aux_vars (gfc_symbol * sym)
849 {
850   tree addr;
851   tree length;
852   tree decl;
853
854   gcc_assert (sym->backend_decl);
855
856   decl = sym->backend_decl;
857   gfc_allocate_lang_decl (decl);
858   GFC_DECL_ASSIGN (decl) = 1;
859   length = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
860                        gfc_charlen_type_node);
861   addr = build_decl (VAR_DECL, create_tmp_var_name (sym->name),
862                      pvoid_type_node);
863   gfc_finish_var_decl (length, sym);
864   gfc_finish_var_decl (addr, sym);
865   /*  STRING_LENGTH is also used as flag. Less than -1 means that
866       ASSIGN_ADDR can not be used. Equal -1 means that ASSIGN_ADDR is the
867       target label's address. Otherwise, value is the length of a format string
868       and ASSIGN_ADDR is its address.  */
869   if (TREE_STATIC (length))
870     DECL_INITIAL (length) = build_int_cst (NULL_TREE, -2);
871   else
872     gfc_defer_symbol_init (sym);
873
874   GFC_DECL_STRING_LEN (decl) = length;
875   GFC_DECL_ASSIGN_ADDR (decl) = addr;
876 }
877
878 /* Return the decl for a gfc_symbol, create it if it doesn't already
879    exist.  */
880
881 tree
882 gfc_get_symbol_decl (gfc_symbol * sym)
883 {
884   tree decl;
885   tree length = NULL_TREE;
886   int byref;
887
888   gcc_assert (sym->attr.referenced
889                 || sym->attr.use_assoc
890                 || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY);
891
892   if (sym->ns && sym->ns->proc_name->attr.function)
893     byref = gfc_return_by_reference (sym->ns->proc_name);
894   else
895     byref = 0;
896
897   if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref))
898     {
899       /* Return via extra parameter.  */
900       if (sym->attr.result && byref
901           && !sym->backend_decl)
902         {
903           sym->backend_decl =
904             DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
905           /* For entry master function skip over the __entry
906              argument.  */
907           if (sym->ns->proc_name->attr.entry_master)
908             sym->backend_decl = TREE_CHAIN (sym->backend_decl);
909         }
910
911       /* Dummy variables should already have been created.  */
912       gcc_assert (sym->backend_decl);
913
914       /* Create a character length variable.  */
915       if (sym->ts.type == BT_CHARACTER)
916         {
917           if (sym->ts.cl->backend_decl == NULL_TREE)
918             length = gfc_create_string_length (sym);
919           else
920             length = sym->ts.cl->backend_decl;
921           if (TREE_CODE (length) == VAR_DECL
922               && DECL_CONTEXT (length) == NULL_TREE)
923             {
924               /* Add the string length to the same context as the symbol.  */
925               if (DECL_CONTEXT (sym->backend_decl) == current_function_decl)
926                 gfc_add_decl_to_function (length);
927               else
928                 gfc_add_decl_to_parent_function (length);
929
930               gcc_assert (DECL_CONTEXT (sym->backend_decl) ==
931                             DECL_CONTEXT (length));
932
933               gfc_defer_symbol_init (sym);
934             }
935         }
936
937       /* Use a copy of the descriptor for dummy arrays.  */
938       if (sym->attr.dimension && !TREE_USED (sym->backend_decl))
939         {
940           decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
941           /* Prevent the dummy from being detected as unused if it is copied.  */
942           if (sym->backend_decl != NULL && decl != sym->backend_decl)
943             DECL_ARTIFICIAL (sym->backend_decl) = 1;
944           sym->backend_decl = decl;
945         }
946
947       TREE_USED (sym->backend_decl) = 1;
948       if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
949         {
950           gfc_add_assign_aux_vars (sym);
951         }
952       return sym->backend_decl;
953     }
954
955   if (sym->backend_decl)
956     return sym->backend_decl;
957
958   /* Catch function declarations.  Only used for actual parameters.  */
959   if (sym->attr.flavor == FL_PROCEDURE)
960     {
961       decl = gfc_get_extern_function_decl (sym);
962       return decl;
963     }
964
965   if (sym->attr.intrinsic)
966     internal_error ("intrinsic variable which isn't a procedure");
967
968   /* Create string length decl first so that they can be used in the
969      type declaration.  */
970   if (sym->ts.type == BT_CHARACTER)
971     length = gfc_create_string_length (sym);
972
973   /* Create the decl for the variable.  */
974   decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
975
976   gfc_set_decl_location (decl, &sym->declared_at);
977
978   /* Symbols from modules should have their assembler names mangled.
979      This is done here rather than in gfc_finish_var_decl because it
980      is different for string length variables.  */
981   if (sym->module)
982     SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym));
983
984   if (sym->attr.dimension)
985     {
986       /* Create variables to hold the non-constant bits of array info.  */
987       gfc_build_qualified_array (decl, sym);
988
989       /* Remember this variable for allocation/cleanup.  */
990       gfc_defer_symbol_init (sym);
991
992       if ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer)
993         GFC_DECL_PACKED_ARRAY (decl) = 1;
994     }
995
996   if (sym->ts.type == BT_DERIVED && sym->ts.derived->attr.alloc_comp)
997     gfc_defer_symbol_init (sym);
998
999   gfc_finish_var_decl (decl, sym);
1000
1001   if (sym->ts.type == BT_CHARACTER)
1002     {
1003       /* Character variables need special handling.  */
1004       gfc_allocate_lang_decl (decl);
1005
1006       if (TREE_CODE (length) != INTEGER_CST)
1007         {
1008           char name[GFC_MAX_MANGLED_SYMBOL_LEN + 2];
1009
1010           if (sym->module)
1011             {
1012               /* Also prefix the mangled name for symbols from modules.  */
1013               strcpy (&name[1], sym->name);
1014               name[0] = '.';
1015               strcpy (&name[1],
1016                       IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (length)));
1017               SET_DECL_ASSEMBLER_NAME (decl, get_identifier (name));
1018             }
1019           gfc_finish_var_decl (length, sym);
1020           gcc_assert (!sym->value);
1021         }
1022     }
1023   sym->backend_decl = decl;
1024
1025   if (sym->attr.assign)
1026     gfc_add_assign_aux_vars (sym);
1027
1028   if (TREE_STATIC (decl) && !sym->attr.use_assoc)
1029     {
1030       /* Add static initializer.  */
1031       DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
1032           TREE_TYPE (decl), sym->attr.dimension,
1033           sym->attr.pointer || sym->attr.allocatable);
1034     }
1035
1036   return decl;
1037 }
1038
1039
1040 /* Substitute a temporary variable in place of the real one.  */
1041
1042 void
1043 gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
1044 {
1045   save->attr = sym->attr;
1046   save->decl = sym->backend_decl;
1047
1048   gfc_clear_attr (&sym->attr);
1049   sym->attr.referenced = 1;
1050   sym->attr.flavor = FL_VARIABLE;
1051
1052   sym->backend_decl = decl;
1053 }
1054
1055
1056 /* Restore the original variable.  */
1057
1058 void
1059 gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
1060 {
1061   sym->attr = save->attr;
1062   sym->backend_decl = save->decl;
1063 }
1064
1065
1066 /* Get a basic decl for an external function.  */
1067
1068 tree
1069 gfc_get_extern_function_decl (gfc_symbol * sym)
1070 {
1071   tree type;
1072   tree fndecl;
1073   gfc_expr e;
1074   gfc_intrinsic_sym *isym;
1075   gfc_expr argexpr;
1076   char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'.  */
1077   tree name;
1078   tree mangled_name;
1079
1080   if (sym->backend_decl)
1081     return sym->backend_decl;
1082
1083   /* We should never be creating external decls for alternate entry points.
1084      The procedure may be an alternate entry point, but we don't want/need
1085      to know that.  */
1086   gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
1087
1088   if (sym->attr.intrinsic)
1089     {
1090       /* Call the resolution function to get the actual name.  This is
1091          a nasty hack which relies on the resolution functions only looking
1092          at the first argument.  We pass NULL for the second argument
1093          otherwise things like AINT get confused.  */
1094       isym = gfc_find_function (sym->name);
1095       gcc_assert (isym->resolve.f0 != NULL);
1096
1097       memset (&e, 0, sizeof (e));
1098       e.expr_type = EXPR_FUNCTION;
1099
1100       memset (&argexpr, 0, sizeof (argexpr));
1101       gcc_assert (isym->formal);
1102       argexpr.ts = isym->formal->ts;
1103
1104       if (isym->formal->next == NULL)
1105         isym->resolve.f1 (&e, &argexpr);
1106       else
1107         {
1108           if (isym->formal->next->next == NULL)
1109             isym->resolve.f2 (&e, &argexpr, NULL);
1110           else
1111             {
1112               /* All specific intrinsics take less than 4 arguments.  */
1113               gcc_assert (isym->formal->next->next->next == NULL);
1114               isym->resolve.f3 (&e, &argexpr, NULL, NULL);
1115             }
1116         }
1117
1118       if (gfc_option.flag_f2c
1119           && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
1120               || e.ts.type == BT_COMPLEX))
1121         {
1122           /* Specific which needs a different implementation if f2c
1123              calling conventions are used.  */
1124           sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
1125         }
1126       else
1127         sprintf (s, "_gfortran_specific%s", e.value.function.name);
1128
1129       name = get_identifier (s);
1130       mangled_name = name;
1131     }
1132   else
1133     {
1134       name = gfc_sym_identifier (sym);
1135       mangled_name = gfc_sym_mangled_function_id (sym);
1136     }
1137
1138   type = gfc_get_function_type (sym);
1139   fndecl = build_decl (FUNCTION_DECL, name, type);
1140
1141   SET_DECL_ASSEMBLER_NAME (fndecl, mangled_name);
1142   /* If the return type is a pointer, avoid alias issues by setting
1143      DECL_IS_MALLOC to nonzero. This means that the function should be
1144      treated as if it were a malloc, meaning it returns a pointer that
1145      is not an alias.  */
1146   if (POINTER_TYPE_P (type))
1147     DECL_IS_MALLOC (fndecl) = 1;
1148
1149   /* Set the context of this decl.  */
1150   if (0 && sym->ns && sym->ns->proc_name)
1151     {
1152       /* TODO: Add external decls to the appropriate scope.  */
1153       DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
1154     }
1155   else
1156     {
1157       /* Global declaration, e.g. intrinsic subroutine.  */
1158       DECL_CONTEXT (fndecl) = NULL_TREE;
1159     }
1160
1161   DECL_EXTERNAL (fndecl) = 1;
1162
1163   /* This specifies if a function is globally addressable, i.e. it is
1164      the opposite of declaring static in C.  */
1165   TREE_PUBLIC (fndecl) = 1;
1166
1167   /* Set attributes for PURE functions. A call to PURE function in the
1168      Fortran 95 sense is both pure and without side effects in the C
1169      sense.  */
1170   if (sym->attr.pure || sym->attr.elemental)
1171     {
1172       if (sym->attr.function && !gfc_return_by_reference (sym))
1173         DECL_IS_PURE (fndecl) = 1;
1174       /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
1175          parameters and don't use alternate returns (is this
1176          allowed?). In that case, calls to them are meaningless, and
1177          can be optimized away. See also in build_function_decl().  */
1178       TREE_SIDE_EFFECTS (fndecl) = 0;
1179     }
1180
1181   /* Mark non-returning functions.  */
1182   if (sym->attr.noreturn)
1183       TREE_THIS_VOLATILE(fndecl) = 1;
1184
1185   sym->backend_decl = fndecl;
1186
1187   if (DECL_CONTEXT (fndecl) == NULL_TREE)
1188     pushdecl_top_level (fndecl);
1189
1190   return fndecl;
1191 }
1192
1193
1194 /* Create a declaration for a procedure.  For external functions (in the C
1195    sense) use gfc_get_extern_function_decl.  HAS_ENTRIES is true if this is
1196    a master function with alternate entry points.  */
1197
1198 static void
1199 build_function_decl (gfc_symbol * sym)
1200 {
1201   tree fndecl, type;
1202   symbol_attribute attr;
1203   tree result_decl;
1204   gfc_formal_arglist *f;
1205
1206   gcc_assert (!sym->backend_decl);
1207   gcc_assert (!sym->attr.external);
1208
1209   /* Set the line and filename.  sym->declared_at seems to point to the
1210      last statement for subroutines, but it'll do for now.  */
1211   gfc_set_backend_locus (&sym->declared_at);
1212
1213   /* Allow only one nesting level.  Allow public declarations.  */
1214   gcc_assert (current_function_decl == NULL_TREE
1215           || DECL_CONTEXT (current_function_decl) == NULL_TREE);
1216
1217   type = gfc_get_function_type (sym);
1218   fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type);
1219
1220   /* Perform name mangling if this is a top level or module procedure.  */
1221   if (current_function_decl == NULL_TREE)
1222     SET_DECL_ASSEMBLER_NAME (fndecl, gfc_sym_mangled_function_id (sym));
1223
1224   /* Figure out the return type of the declared function, and build a
1225      RESULT_DECL for it.  If this is a subroutine with alternate
1226      returns, build a RESULT_DECL for it.  */
1227   attr = sym->attr;
1228
1229   result_decl = NULL_TREE;
1230   /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)).  */
1231   if (attr.function)
1232     {
1233       if (gfc_return_by_reference (sym))
1234         type = void_type_node;
1235       else
1236         {
1237           if (sym->result != sym)
1238             result_decl = gfc_sym_identifier (sym->result);
1239
1240           type = TREE_TYPE (TREE_TYPE (fndecl));
1241         }
1242     }
1243   else
1244     {
1245       /* Look for alternate return placeholders.  */
1246       int has_alternate_returns = 0;
1247       for (f = sym->formal; f; f = f->next)
1248         {
1249           if (f->sym == NULL)
1250             {
1251               has_alternate_returns = 1;
1252               break;
1253             }
1254         }
1255
1256       if (has_alternate_returns)
1257         type = integer_type_node;
1258       else
1259         type = void_type_node;
1260     }
1261
1262   result_decl = build_decl (RESULT_DECL, result_decl, type);
1263   DECL_ARTIFICIAL (result_decl) = 1;
1264   DECL_IGNORED_P (result_decl) = 1;
1265   DECL_CONTEXT (result_decl) = fndecl;
1266   DECL_RESULT (fndecl) = result_decl;
1267
1268   /* Don't call layout_decl for a RESULT_DECL.
1269      layout_decl (result_decl, 0);  */
1270
1271   /* If the return type is a pointer, avoid alias issues by setting
1272      DECL_IS_MALLOC to nonzero. This means that the function should be
1273      treated as if it were a malloc, meaning it returns a pointer that
1274      is not an alias.  */
1275   if (POINTER_TYPE_P (type))
1276     DECL_IS_MALLOC (fndecl) = 1;
1277
1278   /* Set up all attributes for the function.  */
1279   DECL_CONTEXT (fndecl) = current_function_decl;
1280   DECL_EXTERNAL (fndecl) = 0;
1281
1282   /* This specifies if a function is globally visible, i.e. it is
1283      the opposite of declaring static in C.  */
1284   if (DECL_CONTEXT (fndecl) == NULL_TREE
1285       && !sym->attr.entry_master)
1286     TREE_PUBLIC (fndecl) = 1;
1287
1288   /* TREE_STATIC means the function body is defined here.  */
1289   TREE_STATIC (fndecl) = 1;
1290
1291   /* Set attributes for PURE functions. A call to a PURE function in the
1292      Fortran 95 sense is both pure and without side effects in the C
1293      sense.  */
1294   if (attr.pure || attr.elemental)
1295     {
1296       /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
1297          including an alternate return. In that case it can also be
1298          marked as PURE. See also in gfc_get_extern_function_decl().  */
1299       if (attr.function && !gfc_return_by_reference (sym))
1300         DECL_IS_PURE (fndecl) = 1;
1301       TREE_SIDE_EFFECTS (fndecl) = 0;
1302     }
1303
1304   /* Layout the function declaration and put it in the binding level
1305      of the current function.  */
1306   pushdecl (fndecl);
1307
1308   sym->backend_decl = fndecl;
1309 }
1310
1311
1312 /* Create the DECL_ARGUMENTS for a procedure.  */
1313
1314 static void
1315 create_function_arglist (gfc_symbol * sym)
1316 {
1317   tree fndecl;
1318   gfc_formal_arglist *f;
1319   tree typelist, hidden_typelist;
1320   tree arglist, hidden_arglist;
1321   tree type;
1322   tree parm;
1323
1324   fndecl = sym->backend_decl;
1325
1326   /* Build formal argument list. Make sure that their TREE_CONTEXT is
1327      the new FUNCTION_DECL node.  */
1328   arglist = NULL_TREE;
1329   hidden_arglist = NULL_TREE;
1330   typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1331
1332   if (sym->attr.entry_master)
1333     {
1334       type = TREE_VALUE (typelist);
1335       parm = build_decl (PARM_DECL, get_identifier ("__entry"), type);
1336       
1337       DECL_CONTEXT (parm) = fndecl;
1338       DECL_ARG_TYPE (parm) = type;
1339       TREE_READONLY (parm) = 1;
1340       gfc_finish_decl (parm);
1341       DECL_ARTIFICIAL (parm) = 1;
1342
1343       arglist = chainon (arglist, parm);
1344       typelist = TREE_CHAIN (typelist);
1345     }
1346
1347   if (gfc_return_by_reference (sym))
1348     {
1349       tree type = TREE_VALUE (typelist), length = NULL;
1350
1351       if (sym->ts.type == BT_CHARACTER)
1352         {
1353           /* Length of character result.  */
1354           tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
1355           gcc_assert (len_type == gfc_charlen_type_node);
1356
1357           length = build_decl (PARM_DECL,
1358                                get_identifier (".__result"),
1359                                len_type);
1360           if (!sym->ts.cl->length)
1361             {
1362               sym->ts.cl->backend_decl = length;
1363               TREE_USED (length) = 1;
1364             }
1365           gcc_assert (TREE_CODE (length) == PARM_DECL);
1366           DECL_CONTEXT (length) = fndecl;
1367           DECL_ARG_TYPE (length) = len_type;
1368           TREE_READONLY (length) = 1;
1369           DECL_ARTIFICIAL (length) = 1;
1370           gfc_finish_decl (length);
1371           if (sym->ts.cl->backend_decl == NULL
1372               || sym->ts.cl->backend_decl == length)
1373             {
1374               gfc_symbol *arg;
1375               tree backend_decl;
1376
1377               if (sym->ts.cl->backend_decl == NULL)
1378                 {
1379                   tree len = build_decl (VAR_DECL,
1380                                          get_identifier ("..__result"),
1381                                          gfc_charlen_type_node);
1382                   DECL_ARTIFICIAL (len) = 1;
1383                   TREE_USED (len) = 1;
1384                   sym->ts.cl->backend_decl = len;
1385                 }
1386
1387               /* Make sure PARM_DECL type doesn't point to incomplete type.  */
1388               arg = sym->result ? sym->result : sym;
1389               backend_decl = arg->backend_decl;
1390               /* Temporary clear it, so that gfc_sym_type creates complete
1391                  type.  */
1392               arg->backend_decl = NULL;
1393               type = gfc_sym_type (arg);
1394               arg->backend_decl = backend_decl;
1395               type = build_reference_type (type);
1396             }
1397         }
1398
1399       parm = build_decl (PARM_DECL, get_identifier ("__result"), type);
1400
1401       DECL_CONTEXT (parm) = fndecl;
1402       DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1403       TREE_READONLY (parm) = 1;
1404       DECL_ARTIFICIAL (parm) = 1;
1405       gfc_finish_decl (parm);
1406
1407       arglist = chainon (arglist, parm);
1408       typelist = TREE_CHAIN (typelist);
1409
1410       if (sym->ts.type == BT_CHARACTER)
1411         {
1412           gfc_allocate_lang_decl (parm);
1413           arglist = chainon (arglist, length);
1414           typelist = TREE_CHAIN (typelist);
1415         }
1416     }
1417
1418   hidden_typelist = typelist;
1419   for (f = sym->formal; f; f = f->next)
1420     if (f->sym != NULL) /* Ignore alternate returns.  */
1421       hidden_typelist = TREE_CHAIN (hidden_typelist);
1422
1423   for (f = sym->formal; f; f = f->next)
1424     {
1425       char name[GFC_MAX_SYMBOL_LEN + 2];
1426
1427       /* Ignore alternate returns.  */
1428       if (f->sym == NULL)
1429         continue;
1430
1431       type = TREE_VALUE (typelist);
1432
1433       if (f->sym->ts.type == BT_CHARACTER)
1434         {
1435           tree len_type = TREE_VALUE (hidden_typelist);
1436           tree length = NULL_TREE;
1437           gcc_assert (len_type == gfc_charlen_type_node);
1438
1439           strcpy (&name[1], f->sym->name);
1440           name[0] = '_';
1441           length = build_decl (PARM_DECL, get_identifier (name), len_type);
1442
1443           hidden_arglist = chainon (hidden_arglist, length);
1444           DECL_CONTEXT (length) = fndecl;
1445           DECL_ARTIFICIAL (length) = 1;
1446           DECL_ARG_TYPE (length) = len_type;
1447           TREE_READONLY (length) = 1;
1448           gfc_finish_decl (length);
1449
1450           /* TODO: Check string lengths when -fbounds-check.  */
1451
1452           /* Use the passed value for assumed length variables.  */
1453           if (!f->sym->ts.cl->length)
1454             {
1455               TREE_USED (length) = 1;
1456               if (!f->sym->ts.cl->backend_decl)
1457                 f->sym->ts.cl->backend_decl = length;
1458               else
1459                 {
1460                   /* there is already another variable using this
1461                      gfc_charlen node, build a new one for this variable
1462                      and chain it into the list of gfc_charlens.
1463                      This happens for e.g. in the case
1464                      CHARACTER(*)::c1,c2
1465                      since CHARACTER declarations on the same line share
1466                      the same gfc_charlen node.  */
1467                   gfc_charlen *cl;
1468               
1469                   cl = gfc_get_charlen ();
1470                   cl->backend_decl = length;
1471                   cl->next = f->sym->ts.cl->next;
1472                   f->sym->ts.cl->next = cl;
1473                   f->sym->ts.cl = cl;
1474                 }
1475             }
1476
1477           hidden_typelist = TREE_CHAIN (hidden_typelist);
1478
1479           if (f->sym->ts.cl->backend_decl == NULL
1480               || f->sym->ts.cl->backend_decl == length)
1481             {
1482               if (f->sym->ts.cl->backend_decl == NULL)
1483                 gfc_create_string_length (f->sym);
1484
1485               /* Make sure PARM_DECL type doesn't point to incomplete type.  */
1486               if (f->sym->attr.flavor == FL_PROCEDURE)
1487                 type = build_pointer_type (gfc_get_function_type (f->sym));
1488               else
1489                 type = gfc_sym_type (f->sym);
1490             }
1491         }
1492
1493       /* For non-constant length array arguments, make sure they use
1494          a different type node from TYPE_ARG_TYPES type.  */
1495       if (f->sym->attr.dimension
1496           && type == TREE_VALUE (typelist)
1497           && TREE_CODE (type) == POINTER_TYPE
1498           && GFC_ARRAY_TYPE_P (type)
1499           && f->sym->as->type != AS_ASSUMED_SIZE
1500           && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
1501         {
1502           if (f->sym->attr.flavor == FL_PROCEDURE)
1503             type = build_pointer_type (gfc_get_function_type (f->sym));
1504           else
1505             type = gfc_sym_type (f->sym);
1506         }
1507
1508       /* Build a the argument declaration.  */
1509       parm = build_decl (PARM_DECL, gfc_sym_identifier (f->sym), type);
1510
1511       /* Fill in arg stuff.  */
1512       DECL_CONTEXT (parm) = fndecl;
1513       DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
1514       /* All implementation args are read-only.  */
1515       TREE_READONLY (parm) = 1;
1516
1517       gfc_finish_decl (parm);
1518
1519       f->sym->backend_decl = parm;
1520
1521       arglist = chainon (arglist, parm);
1522       typelist = TREE_CHAIN (typelist);
1523     }
1524
1525   /* Add the hidden string length parameters.  */
1526   arglist = chainon (arglist, hidden_arglist);
1527
1528   gcc_assert (hidden_typelist == NULL_TREE
1529               || TREE_VALUE (hidden_typelist) == void_type_node);
1530   DECL_ARGUMENTS (fndecl) = arglist;
1531 }
1532
1533 /* Convert FNDECL's code to GIMPLE and handle any nested functions.  */
1534
1535 static void
1536 gfc_gimplify_function (tree fndecl)
1537 {
1538   struct cgraph_node *cgn;
1539
1540   gimplify_function_tree (fndecl);
1541   dump_function (TDI_generic, fndecl);
1542
1543   /* Generate errors for structured block violations.  */
1544   /* ??? Could be done as part of resolve_labels.  */
1545   if (flag_openmp)
1546     diagnose_omp_structured_block_errors (fndecl);
1547
1548   /* Convert all nested functions to GIMPLE now.  We do things in this order
1549      so that items like VLA sizes are expanded properly in the context of the
1550      correct function.  */
1551   cgn = cgraph_node (fndecl);
1552   for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1553     gfc_gimplify_function (cgn->decl);
1554 }
1555
1556
1557 /* Do the setup necessary before generating the body of a function.  */
1558
1559 static void
1560 trans_function_start (gfc_symbol * sym)
1561 {
1562   tree fndecl;
1563
1564   fndecl = sym->backend_decl;
1565
1566   /* Let GCC know the current scope is this function.  */
1567   current_function_decl = fndecl;
1568
1569   /* Let the world know what we're about to do.  */
1570   announce_function (fndecl);
1571
1572   if (DECL_CONTEXT (fndecl) == NULL_TREE)
1573     {
1574       /* Create RTL for function declaration.  */
1575       rest_of_decl_compilation (fndecl, 1, 0);
1576     }
1577
1578   /* Create RTL for function definition.  */
1579   make_decl_rtl (fndecl);
1580
1581   init_function_start (fndecl);
1582
1583   /* Even though we're inside a function body, we still don't want to
1584      call expand_expr to calculate the size of a variable-sized array.
1585      We haven't necessarily assigned RTL to all variables yet, so it's
1586      not safe to try to expand expressions involving them.  */
1587   cfun->x_dont_save_pending_sizes_p = 1;
1588
1589   /* function.c requires a push at the start of the function.  */
1590   pushlevel (0);
1591 }
1592
1593 /* Create thunks for alternate entry points.  */
1594
1595 static void
1596 build_entry_thunks (gfc_namespace * ns)
1597 {
1598   gfc_formal_arglist *formal;
1599   gfc_formal_arglist *thunk_formal;
1600   gfc_entry_list *el;
1601   gfc_symbol *thunk_sym;
1602   stmtblock_t body;
1603   tree thunk_fndecl;
1604   tree args;
1605   tree string_args;
1606   tree tmp;
1607   locus old_loc;
1608
1609   /* This should always be a toplevel function.  */
1610   gcc_assert (current_function_decl == NULL_TREE);
1611
1612   gfc_get_backend_locus (&old_loc);
1613   for (el = ns->entries; el; el = el->next)
1614     {
1615       thunk_sym = el->sym;
1616       
1617       build_function_decl (thunk_sym);
1618       create_function_arglist (thunk_sym);
1619
1620       trans_function_start (thunk_sym);
1621
1622       thunk_fndecl = thunk_sym->backend_decl;
1623
1624       gfc_start_block (&body);
1625
1626       /* Pass extra parameter identifying this entry point.  */
1627       tmp = build_int_cst (gfc_array_index_type, el->id);
1628       args = tree_cons (NULL_TREE, tmp, NULL_TREE);
1629       string_args = NULL_TREE;
1630
1631       if (thunk_sym->attr.function)
1632         {
1633           if (gfc_return_by_reference (ns->proc_name))
1634             {
1635               tree ref = DECL_ARGUMENTS (current_function_decl);
1636               args = tree_cons (NULL_TREE, ref, args);
1637               if (ns->proc_name->ts.type == BT_CHARACTER)
1638                 args = tree_cons (NULL_TREE, TREE_CHAIN (ref),
1639                                   args);
1640             }
1641         }
1642
1643       for (formal = ns->proc_name->formal; formal; formal = formal->next)
1644         {
1645           /* Ignore alternate returns.  */
1646           if (formal->sym == NULL)
1647             continue;
1648
1649           /* We don't have a clever way of identifying arguments, so resort to
1650              a brute-force search.  */
1651           for (thunk_formal = thunk_sym->formal;
1652                thunk_formal;
1653                thunk_formal = thunk_formal->next)
1654             {
1655               if (thunk_formal->sym == formal->sym)
1656                 break;
1657             }
1658
1659           if (thunk_formal)
1660             {
1661               /* Pass the argument.  */
1662               DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
1663               args = tree_cons (NULL_TREE, thunk_formal->sym->backend_decl,
1664                                 args);
1665               if (formal->sym->ts.type == BT_CHARACTER)
1666                 {
1667                   tmp = thunk_formal->sym->ts.cl->backend_decl;
1668                   string_args = tree_cons (NULL_TREE, tmp, string_args);
1669                 }
1670             }
1671           else
1672             {
1673               /* Pass NULL for a missing argument.  */
1674               args = tree_cons (NULL_TREE, null_pointer_node, args);
1675               if (formal->sym->ts.type == BT_CHARACTER)
1676                 {
1677                   tmp = build_int_cst (gfc_charlen_type_node, 0);
1678                   string_args = tree_cons (NULL_TREE, tmp, string_args);
1679                 }
1680             }
1681         }
1682
1683       /* Call the master function.  */
1684       args = nreverse (args);
1685       args = chainon (args, nreverse (string_args));
1686       tmp = ns->proc_name->backend_decl;
1687       tmp = build_function_call_expr (tmp, args);
1688       if (ns->proc_name->attr.mixed_entry_master)
1689         {
1690           tree union_decl, field;
1691           tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
1692
1693           union_decl = build_decl (VAR_DECL, get_identifier ("__result"),
1694                                    TREE_TYPE (master_type));
1695           DECL_ARTIFICIAL (union_decl) = 1;
1696           DECL_EXTERNAL (union_decl) = 0;
1697           TREE_PUBLIC (union_decl) = 0;
1698           TREE_USED (union_decl) = 1;
1699           layout_decl (union_decl, 0);
1700           pushdecl (union_decl);
1701
1702           DECL_CONTEXT (union_decl) = current_function_decl;
1703           tmp = build2 (MODIFY_EXPR,
1704                         TREE_TYPE (union_decl),
1705                         union_decl, tmp);
1706           gfc_add_expr_to_block (&body, tmp);
1707
1708           for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
1709                field; field = TREE_CHAIN (field))
1710             if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1711                 thunk_sym->result->name) == 0)
1712               break;
1713           gcc_assert (field != NULL_TREE);
1714           tmp = build3 (COMPONENT_REF, TREE_TYPE (field), union_decl, field,
1715                         NULL_TREE);
1716           tmp = build2 (MODIFY_EXPR,
1717                         TREE_TYPE (DECL_RESULT (current_function_decl)),
1718                         DECL_RESULT (current_function_decl), tmp);
1719           tmp = build1_v (RETURN_EXPR, tmp);
1720         }
1721       else if (TREE_TYPE (DECL_RESULT (current_function_decl))
1722                != void_type_node)
1723         {
1724           tmp = build2 (MODIFY_EXPR,
1725                         TREE_TYPE (DECL_RESULT (current_function_decl)),
1726                         DECL_RESULT (current_function_decl), tmp);
1727           tmp = build1_v (RETURN_EXPR, tmp);
1728         }
1729       gfc_add_expr_to_block (&body, tmp);
1730
1731       /* Finish off this function and send it for code generation.  */
1732       DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
1733       poplevel (1, 0, 1);
1734       BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
1735
1736       /* Output the GENERIC tree.  */
1737       dump_function (TDI_original, thunk_fndecl);
1738
1739       /* Store the end of the function, so that we get good line number
1740          info for the epilogue.  */
1741       cfun->function_end_locus = input_location;
1742
1743       /* We're leaving the context of this function, so zap cfun.
1744          It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
1745          tree_rest_of_compilation.  */
1746       cfun = NULL;
1747
1748       current_function_decl = NULL_TREE;
1749
1750       gfc_gimplify_function (thunk_fndecl);
1751       cgraph_finalize_function (thunk_fndecl, false);
1752
1753       /* We share the symbols in the formal argument list with other entry
1754          points and the master function.  Clear them so that they are
1755          recreated for each function.  */
1756       for (formal = thunk_sym->formal; formal; formal = formal->next)
1757         if (formal->sym != NULL)  /* Ignore alternate returns.  */
1758           {
1759             formal->sym->backend_decl = NULL_TREE;
1760             if (formal->sym->ts.type == BT_CHARACTER)
1761               formal->sym->ts.cl->backend_decl = NULL_TREE;
1762           }
1763
1764       if (thunk_sym->attr.function)
1765         {
1766           if (thunk_sym->ts.type == BT_CHARACTER)
1767             thunk_sym->ts.cl->backend_decl = NULL_TREE;
1768           if (thunk_sym->result->ts.type == BT_CHARACTER)
1769             thunk_sym->result->ts.cl->backend_decl = NULL_TREE;
1770         }
1771     }
1772
1773   gfc_set_backend_locus (&old_loc);
1774 }
1775
1776
1777 /* Create a decl for a function, and create any thunks for alternate entry
1778    points.  */
1779
1780 void
1781 gfc_create_function_decl (gfc_namespace * ns)
1782 {
1783   /* Create a declaration for the master function.  */
1784   build_function_decl (ns->proc_name);
1785
1786   /* Compile the entry thunks.  */
1787   if (ns->entries)
1788     build_entry_thunks (ns);
1789
1790   /* Now create the read argument list.  */
1791   create_function_arglist (ns->proc_name);
1792 }
1793
1794 /* Return the decl used to hold the function return value.  If
1795    parent_flag is set, the context is the parent_scope.  */
1796
1797 tree
1798 gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
1799 {
1800   tree decl;
1801   tree length;
1802   tree this_fake_result_decl;
1803   tree this_function_decl;
1804
1805   char name[GFC_MAX_SYMBOL_LEN + 10];
1806
1807   if (parent_flag)
1808     {
1809       this_fake_result_decl = parent_fake_result_decl;
1810       this_function_decl = DECL_CONTEXT (current_function_decl);
1811     }
1812   else
1813     {
1814       this_fake_result_decl = current_fake_result_decl;
1815       this_function_decl = current_function_decl;
1816     }
1817
1818   if (sym
1819       && sym->ns->proc_name->backend_decl == this_function_decl
1820       && sym->ns->proc_name->attr.entry_master
1821       && sym != sym->ns->proc_name)
1822     {
1823       tree t = NULL, var;
1824       if (this_fake_result_decl != NULL)
1825         for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
1826           if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
1827             break;
1828       if (t)
1829         return TREE_VALUE (t);
1830       decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
1831
1832       if (parent_flag)
1833         this_fake_result_decl = parent_fake_result_decl;
1834       else
1835         this_fake_result_decl = current_fake_result_decl;
1836
1837       if (decl && sym->ns->proc_name->attr.mixed_entry_master)
1838         {
1839           tree field;
1840
1841           for (field = TYPE_FIELDS (TREE_TYPE (decl));
1842                field; field = TREE_CHAIN (field))
1843             if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
1844                 sym->name) == 0)
1845               break;
1846
1847           gcc_assert (field != NULL_TREE);
1848           decl = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field,
1849                          NULL_TREE);
1850         }
1851
1852       var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
1853       if (parent_flag)
1854         gfc_add_decl_to_parent_function (var);
1855       else
1856         gfc_add_decl_to_function (var);
1857
1858       SET_DECL_VALUE_EXPR (var, decl);
1859       DECL_HAS_VALUE_EXPR_P (var) = 1;
1860       GFC_DECL_RESULT (var) = 1;
1861
1862       TREE_CHAIN (this_fake_result_decl)
1863           = tree_cons (get_identifier (sym->name), var,
1864                        TREE_CHAIN (this_fake_result_decl));
1865       return var;
1866     }
1867
1868   if (this_fake_result_decl != NULL_TREE)
1869     return TREE_VALUE (this_fake_result_decl);
1870
1871   /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
1872      sym is NULL.  */
1873   if (!sym)
1874     return NULL_TREE;
1875
1876   if (sym->ts.type == BT_CHARACTER)
1877     {
1878       if (sym->ts.cl->backend_decl == NULL_TREE)
1879         length = gfc_create_string_length (sym);
1880       else
1881         length = sym->ts.cl->backend_decl;
1882       if (TREE_CODE (length) == VAR_DECL
1883           && DECL_CONTEXT (length) == NULL_TREE)
1884         gfc_add_decl_to_function (length);
1885     }
1886
1887   if (gfc_return_by_reference (sym))
1888     {
1889       decl = DECL_ARGUMENTS (this_function_decl);
1890
1891       if (sym->ns->proc_name->backend_decl == this_function_decl
1892           && sym->ns->proc_name->attr.entry_master)
1893         decl = TREE_CHAIN (decl);
1894
1895       TREE_USED (decl) = 1;
1896       if (sym->as)
1897         decl = gfc_build_dummy_array_decl (sym, decl);
1898     }
1899   else
1900     {
1901       sprintf (name, "__result_%.20s",
1902                IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
1903
1904       if (!sym->attr.mixed_entry_master && sym->attr.function)
1905         decl = build_decl (VAR_DECL, get_identifier (name),
1906                            gfc_sym_type (sym));
1907       else
1908         decl = build_decl (VAR_DECL, get_identifier (name),
1909                            TREE_TYPE (TREE_TYPE (this_function_decl)));
1910       DECL_ARTIFICIAL (decl) = 1;
1911       DECL_EXTERNAL (decl) = 0;
1912       TREE_PUBLIC (decl) = 0;
1913       TREE_USED (decl) = 1;
1914       GFC_DECL_RESULT (decl) = 1;
1915       TREE_ADDRESSABLE (decl) = 1;
1916
1917       layout_decl (decl, 0);
1918
1919       if (parent_flag)
1920         gfc_add_decl_to_parent_function (decl);
1921       else
1922         gfc_add_decl_to_function (decl);
1923     }
1924
1925   if (parent_flag)
1926     parent_fake_result_decl = build_tree_list (NULL, decl);
1927   else
1928     current_fake_result_decl = build_tree_list (NULL, decl);
1929
1930   return decl;
1931 }
1932
1933
1934 /* Builds a function decl.  The remaining parameters are the types of the
1935    function arguments.  Negative nargs indicates a varargs function.  */
1936
1937 tree
1938 gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
1939 {
1940   tree arglist;
1941   tree argtype;
1942   tree fntype;
1943   tree fndecl;
1944   va_list p;
1945   int n;
1946
1947   /* Library functions must be declared with global scope.  */
1948   gcc_assert (current_function_decl == NULL_TREE);
1949
1950   va_start (p, nargs);
1951
1952
1953   /* Create a list of the argument types.  */
1954   for (arglist = NULL_TREE, n = abs (nargs); n > 0; n--)
1955     {
1956       argtype = va_arg (p, tree);
1957       arglist = gfc_chainon_list (arglist, argtype);
1958     }
1959
1960   if (nargs >= 0)
1961     {
1962       /* Terminate the list.  */
1963       arglist = gfc_chainon_list (arglist, void_type_node);
1964     }
1965
1966   /* Build the function type and decl.  */
1967   fntype = build_function_type (rettype, arglist);
1968   fndecl = build_decl (FUNCTION_DECL, name, fntype);
1969
1970   /* Mark this decl as external.  */
1971   DECL_EXTERNAL (fndecl) = 1;
1972   TREE_PUBLIC (fndecl) = 1;
1973
1974   va_end (p);
1975
1976   pushdecl (fndecl);
1977
1978   rest_of_decl_compilation (fndecl, 1, 0);
1979
1980   return fndecl;
1981 }
1982
1983 static void
1984 gfc_build_intrinsic_function_decls (void)
1985 {
1986   tree gfc_int4_type_node = gfc_get_int_type (4);
1987   tree gfc_int8_type_node = gfc_get_int_type (8);
1988   tree gfc_int16_type_node = gfc_get_int_type (16);
1989   tree gfc_logical4_type_node = gfc_get_logical_type (4);
1990   tree gfc_real4_type_node = gfc_get_real_type (4);
1991   tree gfc_real8_type_node = gfc_get_real_type (8);
1992   tree gfc_real10_type_node = gfc_get_real_type (10);
1993   tree gfc_real16_type_node = gfc_get_real_type (16);
1994   tree gfc_complex4_type_node = gfc_get_complex_type (4);
1995   tree gfc_complex8_type_node = gfc_get_complex_type (8);
1996   tree gfc_complex10_type_node = gfc_get_complex_type (10);
1997   tree gfc_complex16_type_node = gfc_get_complex_type (16);
1998   tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
1999
2000   /* String functions.  */
2001   gfor_fndecl_compare_string =
2002     gfc_build_library_function_decl (get_identifier (PREFIX("compare_string")),
2003                                      gfc_int4_type_node,
2004                                      4,
2005                                      gfc_charlen_type_node, pchar_type_node,
2006                                      gfc_charlen_type_node, pchar_type_node);
2007
2008   gfor_fndecl_concat_string =
2009     gfc_build_library_function_decl (get_identifier (PREFIX("concat_string")),
2010                                      void_type_node,
2011                                      6,
2012                                      gfc_charlen_type_node, pchar_type_node,
2013                                      gfc_charlen_type_node, pchar_type_node,
2014                                      gfc_charlen_type_node, pchar_type_node);
2015
2016   gfor_fndecl_string_len_trim =
2017     gfc_build_library_function_decl (get_identifier (PREFIX("string_len_trim")),
2018                                      gfc_int4_type_node,
2019                                      2, gfc_charlen_type_node,
2020                                      pchar_type_node);
2021
2022   gfor_fndecl_string_index =
2023     gfc_build_library_function_decl (get_identifier (PREFIX("string_index")),
2024                                      gfc_int4_type_node,
2025                                      5, gfc_charlen_type_node, pchar_type_node,
2026                                      gfc_charlen_type_node, pchar_type_node,
2027                                      gfc_logical4_type_node);
2028
2029   gfor_fndecl_string_scan =
2030     gfc_build_library_function_decl (get_identifier (PREFIX("string_scan")),
2031                                      gfc_int4_type_node,
2032                                      5, gfc_charlen_type_node, pchar_type_node,
2033                                      gfc_charlen_type_node, pchar_type_node,
2034                                      gfc_logical4_type_node);
2035
2036   gfor_fndecl_string_verify =
2037     gfc_build_library_function_decl (get_identifier (PREFIX("string_verify")),
2038                                      gfc_int4_type_node,
2039                                      5, gfc_charlen_type_node, pchar_type_node,
2040                                      gfc_charlen_type_node, pchar_type_node,
2041                                      gfc_logical4_type_node);
2042
2043   gfor_fndecl_string_trim = 
2044     gfc_build_library_function_decl (get_identifier (PREFIX("string_trim")),
2045                                      void_type_node,
2046                                      4,
2047                                      build_pointer_type (gfc_charlen_type_node),
2048                                      ppvoid_type_node,
2049                                      gfc_charlen_type_node,
2050                                      pchar_type_node);
2051
2052   gfor_fndecl_ttynam =
2053     gfc_build_library_function_decl (get_identifier (PREFIX("ttynam")),
2054                                      void_type_node,
2055                                      3,
2056                                      pchar_type_node,
2057                                      gfc_charlen_type_node,
2058                                      gfc_c_int_type_node);
2059
2060   gfor_fndecl_fdate =
2061     gfc_build_library_function_decl (get_identifier (PREFIX("fdate")),
2062                                      void_type_node,
2063                                      2,
2064                                      pchar_type_node,
2065                                      gfc_charlen_type_node);
2066
2067   gfor_fndecl_ctime =
2068     gfc_build_library_function_decl (get_identifier (PREFIX("ctime")),
2069                                      void_type_node,
2070                                      3,
2071                                      pchar_type_node,
2072                                      gfc_charlen_type_node,
2073                                      gfc_int8_type_node);
2074
2075   gfor_fndecl_adjustl =
2076     gfc_build_library_function_decl (get_identifier (PREFIX("adjustl")),
2077                                      void_type_node,
2078                                      3,
2079                                      pchar_type_node,
2080                                      gfc_charlen_type_node, pchar_type_node);
2081
2082   gfor_fndecl_adjustr =
2083     gfc_build_library_function_decl (get_identifier (PREFIX("adjustr")),
2084                                      void_type_node,
2085                                      3,
2086                                      pchar_type_node,
2087                                      gfc_charlen_type_node, pchar_type_node);
2088
2089   gfor_fndecl_si_kind =
2090     gfc_build_library_function_decl (get_identifier
2091                                         (PREFIX("selected_int_kind")),
2092                                      gfc_int4_type_node,
2093                                      1,
2094                                      pvoid_type_node);
2095
2096   gfor_fndecl_sr_kind =
2097     gfc_build_library_function_decl (get_identifier 
2098                                         (PREFIX("selected_real_kind")),
2099                                      gfc_int4_type_node,
2100                                      2, pvoid_type_node,
2101                                      pvoid_type_node);
2102
2103   /* Power functions.  */
2104   {
2105     tree ctype, rtype, itype, jtype;
2106     int rkind, ikind, jkind;
2107 #define NIKINDS 3
2108 #define NRKINDS 4
2109     static int ikinds[NIKINDS] = {4, 8, 16};
2110     static int rkinds[NRKINDS] = {4, 8, 10, 16};
2111     char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
2112
2113     for (ikind=0; ikind < NIKINDS; ikind++)
2114       {
2115         itype = gfc_get_int_type (ikinds[ikind]);
2116
2117         for (jkind=0; jkind < NIKINDS; jkind++)
2118           {
2119             jtype = gfc_get_int_type (ikinds[jkind]);
2120             if (itype && jtype)
2121               {
2122                 sprintf(name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
2123                         ikinds[jkind]);
2124                 gfor_fndecl_math_powi[jkind][ikind].integer =
2125                   gfc_build_library_function_decl (get_identifier (name),
2126                     jtype, 2, jtype, itype);
2127                 TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
2128               }
2129           }
2130
2131         for (rkind = 0; rkind < NRKINDS; rkind ++)
2132           {
2133             rtype = gfc_get_real_type (rkinds[rkind]);
2134             if (rtype && itype)
2135               {
2136                 sprintf(name, PREFIX("pow_r%d_i%d"), rkinds[rkind],
2137                         ikinds[ikind]);
2138                 gfor_fndecl_math_powi[rkind][ikind].real =
2139                   gfc_build_library_function_decl (get_identifier (name),
2140                     rtype, 2, rtype, itype);
2141                 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
2142               }
2143
2144             ctype = gfc_get_complex_type (rkinds[rkind]);
2145             if (ctype && itype)
2146               {
2147                 sprintf(name, PREFIX("pow_c%d_i%d"), rkinds[rkind],
2148                         ikinds[ikind]);
2149                 gfor_fndecl_math_powi[rkind][ikind].cmplx =
2150                   gfc_build_library_function_decl (get_identifier (name),
2151                     ctype, 2,ctype, itype);
2152                 TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
2153               }
2154           }
2155       }
2156 #undef NIKINDS
2157 #undef NRKINDS
2158   }
2159
2160   gfor_fndecl_math_cpowf =
2161     gfc_build_library_function_decl (get_identifier ("cpowf"),
2162                                      gfc_complex4_type_node,
2163                                      1, gfc_complex4_type_node);
2164   gfor_fndecl_math_cpow =
2165     gfc_build_library_function_decl (get_identifier ("cpow"),
2166                                      gfc_complex8_type_node,
2167                                      1, gfc_complex8_type_node);
2168   if (gfc_complex10_type_node)
2169     gfor_fndecl_math_cpowl10 =
2170       gfc_build_library_function_decl (get_identifier ("cpowl"),
2171                                        gfc_complex10_type_node, 1,
2172                                        gfc_complex10_type_node);
2173   if (gfc_complex16_type_node)
2174     gfor_fndecl_math_cpowl16 =
2175       gfc_build_library_function_decl (get_identifier ("cpowl"),
2176                                        gfc_complex16_type_node, 1,
2177                                        gfc_complex16_type_node);
2178
2179   gfor_fndecl_math_ishftc4 =
2180     gfc_build_library_function_decl (get_identifier (PREFIX("ishftc4")),
2181                                      gfc_int4_type_node,
2182                                      3, gfc_int4_type_node,
2183                                      gfc_int4_type_node, gfc_int4_type_node);
2184   gfor_fndecl_math_ishftc8 =
2185     gfc_build_library_function_decl (get_identifier (PREFIX("ishftc8")),
2186                                      gfc_int8_type_node,
2187                                      3, gfc_int8_type_node,
2188                                      gfc_int4_type_node, gfc_int4_type_node);
2189   if (gfc_int16_type_node)
2190     gfor_fndecl_math_ishftc16 =
2191       gfc_build_library_function_decl (get_identifier (PREFIX("ishftc16")),
2192                                        gfc_int16_type_node, 3,
2193                                        gfc_int16_type_node,
2194                                        gfc_int4_type_node,
2195                                        gfc_int4_type_node);
2196
2197   gfor_fndecl_math_exponent4 =
2198     gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r4")),
2199                                      gfc_int4_type_node,
2200                                      1, gfc_real4_type_node);
2201   gfor_fndecl_math_exponent8 =
2202     gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r8")),
2203                                      gfc_int4_type_node,
2204                                      1, gfc_real8_type_node);
2205   if (gfc_real10_type_node)
2206     gfor_fndecl_math_exponent10 =
2207       gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r10")),
2208                                        gfc_int4_type_node, 1,
2209                                        gfc_real10_type_node);
2210   if (gfc_real16_type_node)
2211     gfor_fndecl_math_exponent16 =
2212       gfc_build_library_function_decl (get_identifier (PREFIX("exponent_r16")),
2213                                        gfc_int4_type_node, 1,
2214                                        gfc_real16_type_node);
2215
2216   /* BLAS functions.  */
2217   {
2218     tree pint = build_pointer_type (gfc_c_int_type_node);
2219     tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
2220     tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
2221     tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
2222     tree pz = build_pointer_type
2223                 (gfc_get_complex_type (gfc_default_double_kind));
2224
2225     gfor_fndecl_sgemm = gfc_build_library_function_decl
2226                           (get_identifier
2227                              (gfc_option.flag_underscoring ? "sgemm_"
2228                                                            : "sgemm"),
2229                            void_type_node, 15, pchar_type_node,
2230                            pchar_type_node, pint, pint, pint, ps, ps, pint,
2231                            ps, pint, ps, ps, pint, gfc_c_int_type_node,
2232                            gfc_c_int_type_node);
2233     gfor_fndecl_dgemm = gfc_build_library_function_decl
2234                           (get_identifier
2235                              (gfc_option.flag_underscoring ? "dgemm_"
2236                                                            : "dgemm"),
2237                            void_type_node, 15, pchar_type_node,
2238                            pchar_type_node, pint, pint, pint, pd, pd, pint,
2239                            pd, pint, pd, pd, pint, gfc_c_int_type_node,
2240                            gfc_c_int_type_node);
2241     gfor_fndecl_cgemm = gfc_build_library_function_decl
2242                           (get_identifier
2243                              (gfc_option.flag_underscoring ? "cgemm_"
2244                                                            : "cgemm"),
2245                            void_type_node, 15, pchar_type_node,
2246                            pchar_type_node, pint, pint, pint, pc, pc, pint,
2247                            pc, pint, pc, pc, pint, gfc_c_int_type_node,
2248                            gfc_c_int_type_node);
2249     gfor_fndecl_zgemm = gfc_build_library_function_decl
2250                           (get_identifier
2251                              (gfc_option.flag_underscoring ? "zgemm_"
2252                                                            : "zgemm"),
2253                            void_type_node, 15, pchar_type_node,
2254                            pchar_type_node, pint, pint, pint, pz, pz, pint,
2255                            pz, pint, pz, pz, pint, gfc_c_int_type_node,
2256                            gfc_c_int_type_node);
2257   }
2258
2259   /* Other functions.  */
2260   gfor_fndecl_size0 =
2261     gfc_build_library_function_decl (get_identifier (PREFIX("size0")),
2262                                      gfc_array_index_type,
2263                                      1, pvoid_type_node);
2264   gfor_fndecl_size1 =
2265     gfc_build_library_function_decl (get_identifier (PREFIX("size1")),
2266                                      gfc_array_index_type,
2267                                      2, pvoid_type_node,
2268                                      gfc_array_index_type);
2269
2270   gfor_fndecl_iargc =
2271     gfc_build_library_function_decl (get_identifier (PREFIX ("iargc")),
2272                                      gfc_int4_type_node,
2273                                      0);
2274 }
2275
2276
2277 /* Make prototypes for runtime library functions.  */
2278
2279 void
2280 gfc_build_builtin_function_decls (void)
2281 {
2282   tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
2283   tree gfc_int4_type_node = gfc_get_int_type (4);
2284   tree gfc_logical4_type_node = gfc_get_logical_type (4);
2285   tree gfc_pint4_type_node = build_pointer_type (gfc_int4_type_node);
2286   tree gfc_index_int_type_node = gfc_get_int_type (gfc_index_integer_kind);
2287
2288   gfor_fndecl_internal_realloc =
2289     gfc_build_library_function_decl (get_identifier
2290                                      (PREFIX("internal_realloc")),
2291                                      pvoid_type_node, 2, pvoid_type_node,
2292                                      gfc_index_int_type_node);
2293   DECL_IS_MALLOC (gfor_fndecl_internal_realloc) = 1;
2294
2295   gfor_fndecl_allocate =
2296     gfc_build_library_function_decl (get_identifier (PREFIX("allocate")),
2297                                      pvoid_type_node, 2,
2298                                      gfc_index_int_type_node, gfc_pint4_type_node);
2299   DECL_IS_MALLOC (gfor_fndecl_allocate) = 1;
2300
2301   gfor_fndecl_allocate_array =
2302     gfc_build_library_function_decl (get_identifier (PREFIX("allocate_array")),
2303                                      pvoid_type_node, 3, pvoid_type_node,
2304                                      gfc_index_int_type_node, gfc_pint4_type_node);
2305   DECL_IS_MALLOC (gfor_fndecl_allocate_array) = 1;
2306
2307   gfor_fndecl_deallocate =
2308     gfc_build_library_function_decl (get_identifier (PREFIX("deallocate")),
2309                                      void_type_node, 2, pvoid_type_node,
2310                                      gfc_pint4_type_node);
2311
2312   gfor_fndecl_stop_numeric =
2313     gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
2314                                      void_type_node, 1, gfc_int4_type_node);
2315
2316   /* Stop doesn't return.  */
2317   TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
2318
2319   gfor_fndecl_stop_string =
2320     gfc_build_library_function_decl (get_identifier (PREFIX("stop_string")),
2321                                      void_type_node, 2, pchar_type_node,
2322                                      gfc_int4_type_node);
2323   /* Stop doesn't return.  */
2324   TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
2325
2326   gfor_fndecl_pause_numeric =
2327     gfc_build_library_function_decl (get_identifier (PREFIX("pause_numeric")),
2328                                      void_type_node, 1, gfc_int4_type_node);
2329
2330   gfor_fndecl_pause_string =
2331     gfc_build_library_function_decl (get_identifier (PREFIX("pause_string")),
2332                                      void_type_node, 2, pchar_type_node,
2333                                      gfc_int4_type_node);
2334
2335   gfor_fndecl_select_string =
2336     gfc_build_library_function_decl (get_identifier (PREFIX("select_string")),
2337                                      pvoid_type_node, 0);
2338
2339   gfor_fndecl_runtime_error =
2340     gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error")),
2341                                      void_type_node, 1, pchar_type_node);
2342   /* The runtime_error function does not return.  */
2343   TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
2344
2345   gfor_fndecl_runtime_error_at =
2346     gfc_build_library_function_decl (get_identifier (PREFIX("runtime_error_at")),
2347                                      void_type_node, 2, pchar_type_node,
2348                                      pchar_type_node);
2349   /* The runtime_error_at function does not return.  */
2350   TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
2351   
2352   gfor_fndecl_generate_error =
2353     gfc_build_library_function_decl (get_identifier (PREFIX("generate_error")),
2354                                      void_type_node, 3, pvoid_type_node,
2355                                      gfc_c_int_type_node, pchar_type_node);
2356
2357   gfor_fndecl_os_error =
2358     gfc_build_library_function_decl (get_identifier (PREFIX("os_error")),
2359                                      void_type_node, 1, pchar_type_node);
2360   /* The runtime_error function does not return.  */
2361   TREE_THIS_VOLATILE (gfor_fndecl_os_error) = 1;
2362
2363   gfor_fndecl_set_fpe =
2364     gfc_build_library_function_decl (get_identifier (PREFIX("set_fpe")),
2365                                     void_type_node, 1, gfc_c_int_type_node);
2366
2367   gfor_fndecl_set_std =
2368     gfc_build_library_function_decl (get_identifier (PREFIX("set_std")),
2369                                     void_type_node,
2370                                     5,
2371                                     gfc_int4_type_node,
2372                                     gfc_int4_type_node,
2373                                     gfc_int4_type_node,
2374                                     gfc_int4_type_node,
2375                                     gfc_int4_type_node);
2376
2377   gfor_fndecl_set_convert =
2378     gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")),
2379                                      void_type_node, 1, gfc_c_int_type_node);
2380
2381   gfor_fndecl_set_record_marker =
2382     gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")),
2383                                      void_type_node, 1, gfc_c_int_type_node);
2384
2385   gfor_fndecl_set_max_subrecord_length =
2386     gfc_build_library_function_decl (get_identifier (PREFIX("set_max_subrecord_length")),
2387                                      void_type_node, 1, gfc_c_int_type_node);
2388
2389   gfor_fndecl_in_pack = gfc_build_library_function_decl (
2390         get_identifier (PREFIX("internal_pack")),
2391         pvoid_type_node, 1, pvoid_type_node);
2392
2393   gfor_fndecl_in_unpack = gfc_build_library_function_decl (
2394         get_identifier (PREFIX("internal_unpack")),
2395         pvoid_type_node, 1, pvoid_type_node);
2396
2397   gfor_fndecl_associated =
2398     gfc_build_library_function_decl (
2399                                      get_identifier (PREFIX("associated")),
2400                                      gfc_logical4_type_node,
2401                                      2,
2402                                      ppvoid_type_node,
2403                                      ppvoid_type_node);
2404
2405   gfc_build_intrinsic_function_decls ();
2406   gfc_build_intrinsic_lib_fndecls ();
2407   gfc_build_io_library_fndecls ();
2408 }
2409
2410
2411 /* Evaluate the length of dummy character variables.  */
2412
2413 static tree
2414 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl, tree fnbody)
2415 {
2416   stmtblock_t body;
2417
2418   gfc_finish_decl (cl->backend_decl);
2419
2420   gfc_start_block (&body);
2421
2422   /* Evaluate the string length expression.  */
2423   gfc_trans_init_string_length (cl, &body);
2424
2425   gfc_trans_vla_type_sizes (sym, &body);
2426
2427   gfc_add_expr_to_block (&body, fnbody);
2428   return gfc_finish_block (&body);
2429 }
2430
2431
2432 /* Allocate and cleanup an automatic character variable.  */
2433
2434 static tree
2435 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
2436 {
2437   stmtblock_t body;
2438   tree decl;
2439   tree tmp;
2440
2441   gcc_assert (sym->backend_decl);
2442   gcc_assert (sym->ts.cl && sym->ts.cl->length);
2443
2444   gfc_start_block (&body);
2445
2446   /* Evaluate the string length expression.  */
2447   gfc_trans_init_string_length (sym->ts.cl, &body);
2448
2449   gfc_trans_vla_type_sizes (sym, &body);
2450
2451   decl = sym->backend_decl;
2452
2453   /* Emit a DECL_EXPR for this variable, which will cause the
2454      gimplifier to allocate storage, and all that good stuff.  */
2455   tmp = build1 (DECL_EXPR, TREE_TYPE (decl), decl);
2456   gfc_add_expr_to_block (&body, tmp);
2457
2458   gfc_add_expr_to_block (&body, fnbody);
2459   return gfc_finish_block (&body);
2460 }
2461
2462 /* Set the initial value of ASSIGN statement auxiliary variable explicitly.  */
2463
2464 static tree
2465 gfc_trans_assign_aux_var (gfc_symbol * sym, tree fnbody)
2466 {
2467   stmtblock_t body;
2468
2469   gcc_assert (sym->backend_decl);
2470   gfc_start_block (&body);
2471
2472   /* Set the initial value to length. See the comments in
2473      function gfc_add_assign_aux_vars in this file.  */
2474   gfc_add_modify_expr (&body, GFC_DECL_STRING_LEN (sym->backend_decl),
2475                        build_int_cst (NULL_TREE, -2));
2476
2477   gfc_add_expr_to_block (&body, fnbody);
2478   return gfc_finish_block (&body);
2479 }
2480
2481 static void
2482 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
2483 {
2484   tree t = *tp, var, val;
2485
2486   if (t == NULL || t == error_mark_node)
2487     return;
2488   if (TREE_CONSTANT (t) || DECL_P (t))
2489     return;
2490
2491   if (TREE_CODE (t) == SAVE_EXPR)
2492     {
2493       if (SAVE_EXPR_RESOLVED_P (t))
2494         {
2495           *tp = TREE_OPERAND (t, 0);
2496           return;
2497         }
2498       val = TREE_OPERAND (t, 0);
2499     }
2500   else
2501     val = t;
2502
2503   var = gfc_create_var_np (TREE_TYPE (t), NULL);
2504   gfc_add_decl_to_function (var);
2505   gfc_add_modify_expr (body, var, val);
2506   if (TREE_CODE (t) == SAVE_EXPR)
2507     TREE_OPERAND (t, 0) = var;
2508   *tp = var;
2509 }
2510
2511 static void
2512 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
2513 {
2514   tree t;
2515
2516   if (type == NULL || type == error_mark_node)
2517     return;
2518
2519   type = TYPE_MAIN_VARIANT (type);
2520
2521   if (TREE_CODE (type) == INTEGER_TYPE)
2522     {
2523       gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
2524       gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
2525
2526       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2527         {
2528           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
2529           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
2530         }
2531     }
2532   else if (TREE_CODE (type) == ARRAY_TYPE)
2533     {
2534       gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
2535       gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
2536       gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
2537       gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
2538
2539       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2540         {
2541           TYPE_SIZE (t) = TYPE_SIZE (type);
2542           TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
2543         }
2544     }
2545 }
2546
2547 /* Make sure all type sizes and array domains are either constant,
2548    or variable or parameter decls.  This is a simplified variant
2549    of gimplify_type_sizes, but we can't use it here, as none of the
2550    variables in the expressions have been gimplified yet.
2551    As type sizes and domains for various variable length arrays
2552    contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
2553    time, without this routine gimplify_type_sizes in the middle-end
2554    could result in the type sizes being gimplified earlier than where
2555    those variables are initialized.  */
2556
2557 void
2558 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
2559 {
2560   tree type = TREE_TYPE (sym->backend_decl);
2561
2562   if (TREE_CODE (type) == FUNCTION_TYPE
2563       && (sym->attr.function || sym->attr.result || sym->attr.entry))
2564     {
2565       if (! current_fake_result_decl)
2566         return;
2567
2568       type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
2569     }
2570
2571   while (POINTER_TYPE_P (type))
2572     type = TREE_TYPE (type);
2573
2574   if (GFC_DESCRIPTOR_TYPE_P (type))
2575     {
2576       tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2577
2578       while (POINTER_TYPE_P (etype))
2579         etype = TREE_TYPE (etype);
2580
2581       gfc_trans_vla_type_sizes_1 (etype, body);
2582     }
2583
2584   gfc_trans_vla_type_sizes_1 (type, body);
2585 }
2586
2587
2588 /* Generate function entry and exit code, and add it to the function body.
2589    This includes:
2590     Allocation and initialization of array variables.
2591     Allocation of character string variables.
2592     Initialization and possibly repacking of dummy arrays.
2593     Initialization of ASSIGN statement auxiliary variable.  */
2594
2595 static tree
2596 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2597 {
2598   locus loc;
2599   gfc_symbol *sym;
2600   gfc_formal_arglist *f;
2601   stmtblock_t body;
2602   bool seen_trans_deferred_array = false;
2603
2604   /* Deal with implicit return variables.  Explicit return variables will
2605      already have been added.  */
2606   if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2607     {
2608       if (!current_fake_result_decl)
2609         {
2610           gfc_entry_list *el = NULL;
2611           if (proc_sym->attr.entry_master)
2612             {
2613               for (el = proc_sym->ns->entries; el; el = el->next)
2614                 if (el->sym != el->sym->result)
2615                   break;
2616             }
2617           if (el == NULL)
2618             warning (0, "Function does not return a value");
2619         }
2620       else if (proc_sym->as)
2621         {
2622           tree result = TREE_VALUE (current_fake_result_decl);
2623           fnbody = gfc_trans_dummy_array_bias (proc_sym, result, fnbody);
2624
2625           /* An automatic character length, pointer array result.  */
2626           if (proc_sym->ts.type == BT_CHARACTER
2627                 && TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2628             fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2629                                                 fnbody);
2630         }
2631       else if (proc_sym->ts.type == BT_CHARACTER)
2632         {
2633           if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2634             fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2635                                                 fnbody);
2636         }
2637       else
2638         gcc_assert (gfc_option.flag_f2c
2639                     && proc_sym->ts.type == BT_COMPLEX);
2640     }
2641
2642   for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2643     {
2644       bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
2645                                    && sym->ts.derived->attr.alloc_comp;
2646       if (sym->attr.dimension)
2647         {
2648           switch (sym->as->type)
2649             {
2650             case AS_EXPLICIT:
2651               if (sym->attr.dummy || sym->attr.result)
2652                 fnbody =
2653                   gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2654               else if (sym->attr.pointer || sym->attr.allocatable)
2655                 {
2656                   if (TREE_STATIC (sym->backend_decl))
2657                     gfc_trans_static_array_pointer (sym);
2658                   else
2659                     {
2660                       seen_trans_deferred_array = true;
2661                       fnbody = gfc_trans_deferred_array (sym, fnbody);
2662                     }
2663                 }
2664               else
2665                 {
2666                   if (sym_has_alloc_comp)
2667                     {
2668                       seen_trans_deferred_array = true;
2669                       fnbody = gfc_trans_deferred_array (sym, fnbody);
2670                     }
2671
2672                   gfc_get_backend_locus (&loc);
2673                   gfc_set_backend_locus (&sym->declared_at);
2674                   fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2675                       sym, fnbody);
2676                   gfc_set_backend_locus (&loc);
2677                 }
2678               break;
2679
2680             case AS_ASSUMED_SIZE:
2681               /* Must be a dummy parameter.  */
2682               gcc_assert (sym->attr.dummy);
2683
2684               /* We should always pass assumed size arrays the g77 way.  */
2685               fnbody = gfc_trans_g77_array (sym, fnbody);
2686               break;
2687
2688             case AS_ASSUMED_SHAPE:
2689               /* Must be a dummy parameter.  */
2690               gcc_assert (sym->attr.dummy);
2691
2692               fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2693                                                    fnbody);
2694               break;
2695
2696             case AS_DEFERRED:
2697               seen_trans_deferred_array = true;
2698               fnbody = gfc_trans_deferred_array (sym, fnbody);
2699               break;
2700
2701             default:
2702               gcc_unreachable ();
2703             }
2704           if (sym_has_alloc_comp && !seen_trans_deferred_array)
2705             fnbody = gfc_trans_deferred_array (sym, fnbody);
2706         }
2707       else if (sym_has_alloc_comp)
2708         fnbody = gfc_trans_deferred_array (sym, fnbody);
2709       else if (sym->ts.type == BT_CHARACTER)
2710         {
2711           gfc_get_backend_locus (&loc);
2712           gfc_set_backend_locus (&sym->declared_at);
2713           if (sym->attr.dummy || sym->attr.result)
2714             fnbody = gfc_trans_dummy_character (sym, sym->ts.cl, fnbody);
2715           else
2716             fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2717           gfc_set_backend_locus (&loc);
2718         }
2719       else if (sym->attr.assign)
2720         {
2721           gfc_get_backend_locus (&loc);
2722           gfc_set_backend_locus (&sym->declared_at);
2723           fnbody = gfc_trans_assign_aux_var (sym, fnbody);
2724           gfc_set_backend_locus (&loc);
2725         }
2726       else
2727         gcc_unreachable ();
2728     }
2729
2730   gfc_init_block (&body);
2731
2732   for (f = proc_sym->formal; f; f = f->next)
2733     if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
2734       {
2735         gcc_assert (f->sym->ts.cl->backend_decl != NULL);
2736         if (TREE_CODE (f->sym->ts.cl->backend_decl) == PARM_DECL)
2737           gfc_trans_vla_type_sizes (f->sym, &body);
2738       }
2739
2740   if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
2741       && current_fake_result_decl != NULL)
2742     {
2743       gcc_assert (proc_sym->ts.cl->backend_decl != NULL);
2744       if (TREE_CODE (proc_sym->ts.cl->backend_decl) == PARM_DECL)
2745         gfc_trans_vla_type_sizes (proc_sym, &body);
2746     }
2747
2748   gfc_add_expr_to_block (&body, fnbody);
2749   return gfc_finish_block (&body);
2750 }
2751
2752
2753 /* Output an initialized decl for a module variable.  */
2754
2755 static void
2756 gfc_create_module_variable (gfc_symbol * sym)
2757 {
2758   tree decl;
2759
2760   /* Module functions with alternate entries are dealt with later and
2761      would get caught by the next condition.  */
2762   if (sym->attr.entry)
2763     return;
2764
2765   /* Make sure we convert the types of the derived types from iso_c_binding
2766      into (void *).  */
2767   if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
2768       && sym->ts.type == BT_DERIVED)
2769     sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
2770
2771   /* Only output variables and array valued parameters.  */
2772   if (sym->attr.flavor != FL_VARIABLE
2773       && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0))
2774     return;
2775
2776   /* Don't generate variables from other modules. Variables from
2777      COMMONs will already have been generated.  */
2778   if (sym->attr.use_assoc || sym->attr.in_common)
2779     return;
2780
2781   /* Equivalenced variables arrive here after creation.  */
2782   if (sym->backend_decl
2783         && (sym->equiv_built || sym->attr.in_equivalence))
2784       return;
2785
2786   if (sym->backend_decl)
2787     internal_error ("backend decl for module variable %s already exists",
2788                     sym->name);
2789
2790   /* We always want module variables to be created.  */
2791   sym->attr.referenced = 1;
2792   /* Create the decl.  */
2793   decl = gfc_get_symbol_decl (sym);
2794
2795   /* Create the variable.  */
2796   pushdecl (decl);
2797   rest_of_decl_compilation (decl, 1, 0);
2798
2799   /* Also add length of strings.  */
2800   if (sym->ts.type == BT_CHARACTER)
2801     {
2802       tree length;
2803
2804       length = sym->ts.cl->backend_decl;
2805       if (!INTEGER_CST_P (length))
2806         {
2807           pushdecl (length);
2808           rest_of_decl_compilation (length, 1, 0);
2809         }
2810     }
2811 }
2812
2813
2814 /* Generate all the required code for module variables.  */
2815
2816 void
2817 gfc_generate_module_vars (gfc_namespace * ns)
2818 {
2819   module_namespace = ns;
2820
2821   /* Check if the frontend left the namespace in a reasonable state.  */
2822   gcc_assert (ns->proc_name && !ns->proc_name->tlink);
2823
2824   /* Generate COMMON blocks.  */
2825   gfc_trans_common (ns);
2826
2827   /* Create decls for all the module variables.  */
2828   gfc_traverse_ns (ns, gfc_create_module_variable);
2829 }
2830
2831 static void
2832 gfc_generate_contained_functions (gfc_namespace * parent)
2833 {
2834   gfc_namespace *ns;
2835
2836   /* We create all the prototypes before generating any code.  */
2837   for (ns = parent->contained; ns; ns = ns->sibling)
2838     {
2839       /* Skip namespaces from used modules.  */
2840       if (ns->parent != parent)
2841         continue;
2842
2843       gfc_create_function_decl (ns);
2844     }
2845
2846   for (ns = parent->contained; ns; ns = ns->sibling)
2847     {
2848       /* Skip namespaces from used modules.  */
2849       if (ns->parent != parent)
2850         continue;
2851
2852       gfc_generate_function_code (ns);
2853     }
2854 }
2855
2856
2857 /* Drill down through expressions for the array specification bounds and
2858    character length calling generate_local_decl for all those variables
2859    that have not already been declared.  */
2860
2861 static void
2862 generate_local_decl (gfc_symbol *);
2863
2864 static void
2865 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
2866 {
2867   gfc_actual_arglist *arg;
2868   gfc_ref *ref;
2869   int i;
2870
2871   if (e == NULL)
2872     return;
2873
2874   switch (e->expr_type)
2875     {
2876     case EXPR_FUNCTION:
2877       for (arg = e->value.function.actual; arg; arg = arg->next)
2878         generate_expr_decls (sym, arg->expr);
2879       break;
2880
2881     /* If the variable is not the same as the dependent, 'sym', and
2882        it is not marked as being declared and it is in the same
2883        namespace as 'sym', add it to the local declarations.  */
2884     case EXPR_VARIABLE:
2885       if (sym == e->symtree->n.sym
2886             || e->symtree->n.sym->mark
2887             || e->symtree->n.sym->ns != sym->ns)
2888         return;
2889
2890       generate_local_decl (e->symtree->n.sym);
2891       break;
2892
2893     case EXPR_OP:
2894       generate_expr_decls (sym, e->value.op.op1);
2895       generate_expr_decls (sym, e->value.op.op2);
2896       break;
2897
2898     default:
2899       break;
2900     }
2901
2902   if (e->ref)
2903     {
2904       for (ref = e->ref; ref; ref = ref->next)
2905         {
2906           switch (ref->type)
2907             {
2908             case REF_ARRAY:
2909               for (i = 0; i < ref->u.ar.dimen; i++)
2910                 {
2911                   generate_expr_decls (sym, ref->u.ar.start[i]);
2912                   generate_expr_decls (sym, ref->u.ar.end[i]);
2913                   generate_expr_decls (sym, ref->u.ar.stride[i]);
2914                 }
2915               break;
2916
2917             case REF_SUBSTRING:
2918               generate_expr_decls (sym, ref->u.ss.start);
2919               generate_expr_decls (sym, ref->u.ss.end);
2920               break;
2921
2922             case REF_COMPONENT:
2923               if (ref->u.c.component->ts.type == BT_CHARACTER
2924                     && ref->u.c.component->ts.cl->length->expr_type
2925                                                 != EXPR_CONSTANT)
2926                 generate_expr_decls (sym, ref->u.c.component->ts.cl->length);
2927
2928               if (ref->u.c.component->as)
2929                 for (i = 0; i < ref->u.c.component->as->rank; i++)
2930                   {
2931                     generate_expr_decls (sym, ref->u.c.component->as->lower[i]);
2932                     generate_expr_decls (sym, ref->u.c.component->as->upper[i]);
2933                   }
2934               break;
2935             }
2936         }
2937     }
2938 }
2939
2940
2941 /* Check for dependencies in the character length and array spec.  */
2942
2943 static void
2944 generate_dependency_declarations (gfc_symbol *sym)
2945 {
2946   int i;
2947
2948   if (sym->ts.type == BT_CHARACTER
2949         && sym->ts.cl->length->expr_type != EXPR_CONSTANT)
2950     generate_expr_decls (sym, sym->ts.cl->length);
2951
2952   if (sym->as && sym->as->rank)
2953     {
2954       for (i = 0; i < sym->as->rank; i++)
2955         {
2956           generate_expr_decls (sym, sym->as->lower[i]);
2957           generate_expr_decls (sym, sym->as->upper[i]);
2958         }
2959     }
2960 }
2961
2962
2963 /* Generate decls for all local variables.  We do this to ensure correct
2964    handling of expressions which only appear in the specification of
2965    other functions.  */
2966
2967 static void
2968 generate_local_decl (gfc_symbol * sym)
2969 {
2970   if (sym->attr.flavor == FL_VARIABLE)
2971     {
2972       /* Check for dependencies in the array specification and string
2973         length, adding the necessary declarations to the function.  We
2974         mark the symbol now, as well as in traverse_ns, to prevent
2975         getting stuck in a circular dependency.  */
2976       sym->mark = 1;
2977       if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
2978         generate_dependency_declarations (sym);
2979
2980       if (sym->attr.referenced)
2981         gfc_get_symbol_decl (sym);
2982       /* INTENT(out) dummy arguments are likely meant to be set.  */
2983       else if (warn_unused_variable
2984                && sym->attr.dummy
2985                && sym->attr.intent == INTENT_OUT)
2986         gfc_warning ("dummy argument '%s' at %L was declared INTENT(OUT) but was not set",
2987                      sym->name, &sym->declared_at);
2988       /* Specific warning for unused dummy arguments. */
2989       else if (warn_unused_variable && sym->attr.dummy)
2990         gfc_warning ("unused dummy argument '%s' at %L", sym->name,
2991                      &sym->declared_at);
2992       /* Warn for unused variables, but not if they're inside a common
2993          block or are use-associated.  */
2994       else if (warn_unused_variable
2995                && !(sym->attr.in_common || sym->attr.use_assoc))
2996         gfc_warning ("unused variable '%s' declared at %L", sym->name,
2997                      &sym->declared_at);
2998       /* For variable length CHARACTER parameters, the PARM_DECL already
2999          references the length variable, so force gfc_get_symbol_decl
3000          even when not referenced.  If optimize > 0, it will be optimized
3001          away anyway.  But do this only after emitting -Wunused-parameter
3002          warning if requested.  */
3003       if (sym->attr.dummy && ! sym->attr.referenced
3004           && sym->ts.type == BT_CHARACTER
3005           && sym->ts.cl->backend_decl != NULL
3006           && TREE_CODE (sym->ts.cl->backend_decl) == VAR_DECL)
3007         {
3008           sym->attr.referenced = 1;
3009           gfc_get_symbol_decl (sym);
3010         }
3011
3012       /* We do not want the middle-end to warn about unused parameters
3013          as this was already done above.  */
3014       if (sym->attr.dummy && sym->backend_decl != NULL_TREE)
3015           TREE_NO_WARNING(sym->backend_decl) = 1;
3016     }
3017   else if (sym->attr.flavor == FL_PARAMETER)
3018     {
3019       if (warn_unused_variable 
3020            && !sym->attr.referenced
3021            && !sym->attr.use_assoc)
3022         gfc_warning ("unused parameter '%s' declared at %L", sym->name,
3023                      &sym->declared_at);
3024     }
3025
3026   /* Make sure we convert the types of the derived types from iso_c_binding
3027      into (void *).  */
3028   if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3029       && sym->ts.type == BT_DERIVED)
3030     sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3031 }
3032
3033 static void
3034 generate_local_vars (gfc_namespace * ns)
3035 {
3036   gfc_traverse_ns (ns, generate_local_decl);
3037 }
3038
3039
3040 /* Generate a switch statement to jump to the correct entry point.  Also
3041    creates the label decls for the entry points.  */
3042
3043 static tree
3044 gfc_trans_entry_master_switch (gfc_entry_list * el)
3045 {
3046   stmtblock_t block;
3047   tree label;
3048   tree tmp;
3049   tree val;
3050
3051   gfc_init_block (&block);
3052   for (; el; el = el->next)
3053     {
3054       /* Add the case label.  */
3055       label = gfc_build_label_decl (NULL_TREE);
3056       val = build_int_cst (gfc_array_index_type, el->id);
3057       tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
3058       gfc_add_expr_to_block (&block, tmp);
3059       
3060       /* And jump to the actual entry point.  */
3061       label = gfc_build_label_decl (NULL_TREE);
3062       tmp = build1_v (GOTO_EXPR, label);
3063       gfc_add_expr_to_block (&block, tmp);
3064
3065       /* Save the label decl.  */
3066       el->label = label;
3067     }
3068   tmp = gfc_finish_block (&block);
3069   /* The first argument selects the entry point.  */
3070   val = DECL_ARGUMENTS (current_function_decl);
3071   tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
3072   return tmp;
3073 }
3074
3075
3076 /* Generate code for a function.  */
3077
3078 void
3079 gfc_generate_function_code (gfc_namespace * ns)
3080 {
3081   tree fndecl;
3082   tree old_context;
3083   tree decl;
3084   tree tmp;
3085   tree tmp2;
3086   stmtblock_t block;
3087   stmtblock_t body;
3088   tree result;
3089   gfc_symbol *sym;
3090   int rank;
3091
3092   sym = ns->proc_name;
3093
3094   /* Check that the frontend isn't still using this.  */
3095   gcc_assert (sym->tlink == NULL);
3096   sym->tlink = sym;
3097
3098   /* Create the declaration for functions with global scope.  */
3099   if (!sym->backend_decl)
3100     gfc_create_function_decl (ns);
3101
3102   fndecl = sym->backend_decl;
3103   old_context = current_function_decl;
3104
3105   if (old_context)
3106     {
3107       push_function_context ();
3108       saved_parent_function_decls = saved_function_decls;
3109       saved_function_decls = NULL_TREE;
3110     }
3111
3112   trans_function_start (sym);
3113
3114   gfc_start_block (&block);
3115
3116   if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
3117     {
3118       /* Copy length backend_decls to all entry point result
3119          symbols.  */
3120       gfc_entry_list *el;
3121       tree backend_decl;
3122
3123       gfc_conv_const_charlen (ns->proc_name->ts.cl);
3124       backend_decl = ns->proc_name->result->ts.cl->backend_decl;
3125       for (el = ns->entries; el; el = el->next)
3126         el->sym->result->ts.cl->backend_decl = backend_decl;
3127     }
3128
3129   /* Translate COMMON blocks.  */
3130   gfc_trans_common (ns);
3131
3132   /* Null the parent fake result declaration if this namespace is
3133      a module function or an external procedures.  */
3134   if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3135         || ns->parent == NULL)
3136     parent_fake_result_decl = NULL_TREE;
3137
3138   gfc_generate_contained_functions (ns);
3139
3140   generate_local_vars (ns);
3141   
3142   /* Keep the parent fake result declaration in module functions
3143      or external procedures.  */
3144   if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3145         || ns->parent == NULL)
3146     current_fake_result_decl = parent_fake_result_decl;
3147   else
3148     current_fake_result_decl = NULL_TREE;
3149
3150   current_function_return_label = NULL;
3151
3152   /* Now generate the code for the body of this function.  */
3153   gfc_init_block (&body);
3154
3155   /* If this is the main program, add a call to set_std to set up the
3156      runtime library Fortran language standard parameters.  */
3157
3158   if (sym->attr.is_main_program)
3159     {
3160       tree gfc_int4_type_node = gfc_get_int_type (4);
3161       tmp = build_call_expr (gfor_fndecl_set_std, 5,
3162                              build_int_cst (gfc_int4_type_node,
3163                                             gfc_option.warn_std),
3164                              build_int_cst (gfc_int4_type_node,
3165                                             gfc_option.allow_std),
3166                              build_int_cst (gfc_int4_type_node,
3167                                             pedantic),
3168                              build_int_cst (gfc_int4_type_node,
3169                                             gfc_option.flag_dump_core),
3170                              build_int_cst (gfc_int4_type_node,
3171                                             gfc_option.flag_backtrace));
3172       gfc_add_expr_to_block (&body, tmp);
3173     }
3174
3175   /* If this is the main program and a -ffpe-trap option was provided,
3176      add a call to set_fpe so that the library will raise a FPE when
3177      needed.  */
3178   if (sym->attr.is_main_program && gfc_option.fpe != 0)
3179     {
3180       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3181       tmp = build_call_expr (gfor_fndecl_set_fpe, 1,
3182                              build_int_cst (gfc_c_int_type_node,
3183                                             gfc_option.fpe));
3184       gfc_add_expr_to_block (&body, tmp);
3185     }
3186
3187   /* If this is the main program and an -fconvert option was provided,
3188      add a call to set_convert.  */
3189
3190   if (sym->attr.is_main_program && gfc_option.convert != CONVERT_NATIVE)
3191     {
3192       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3193       tmp = build_call_expr (gfor_fndecl_set_convert, 1,
3194                              build_int_cst (gfc_c_int_type_node,
3195                                             gfc_option.convert));
3196       gfc_add_expr_to_block (&body, tmp);
3197     }
3198
3199   /* If this is the main program and an -frecord-marker option was provided,
3200      add a call to set_record_marker.  */
3201
3202   if (sym->attr.is_main_program && gfc_option.record_marker != 0)
3203     {
3204       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3205       tmp = build_call_expr (gfor_fndecl_set_record_marker, 1,
3206                              build_int_cst (gfc_c_int_type_node,
3207                                             gfc_option.record_marker));
3208       gfc_add_expr_to_block (&body, tmp);
3209     }
3210
3211   if (sym->attr.is_main_program && gfc_option.max_subrecord_length != 0)
3212     {
3213       tree gfc_c_int_type_node;
3214
3215       gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3216       tmp = build_call_expr (gfor_fndecl_set_max_subrecord_length,
3217                              1,
3218                              build_int_cst (gfc_c_int_type_node,
3219                                             gfc_option.max_subrecord_length));
3220       gfc_add_expr_to_block (&body, tmp);
3221     }
3222
3223   if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
3224       && sym->attr.subroutine)
3225     {
3226       tree alternate_return;
3227       alternate_return = gfc_get_fake_result_decl (sym, 0);
3228       gfc_add_modify_expr (&body, alternate_return, integer_zero_node);
3229     }
3230
3231   if (ns->entries)
3232     {
3233       /* Jump to the correct entry point.  */
3234       tmp = gfc_trans_entry_master_switch (ns->entries);
3235       gfc_add_expr_to_block (&body, tmp);
3236     }
3237
3238   tmp = gfc_trans_code (ns->code);
3239   gfc_add_expr_to_block (&body, tmp);
3240
3241   /* Add a return label if needed.  */
3242   if (current_function_return_label)
3243     {
3244       tmp = build1_v (LABEL_EXPR, current_function_return_label);
3245       gfc_add_expr_to_block (&body, tmp);
3246     }
3247
3248   tmp = gfc_finish_block (&body);
3249   /* Add code to create and cleanup arrays.  */
3250   tmp = gfc_trans_deferred_vars (sym, tmp);
3251
3252   if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
3253     {
3254       if (sym->attr.subroutine || sym == sym->result)
3255         {
3256           if (current_fake_result_decl != NULL)
3257             result = TREE_VALUE (current_fake_result_decl);
3258           else
3259             result = NULL_TREE;
3260           current_fake_result_decl = NULL_TREE;
3261         }
3262       else
3263         result = sym->result->backend_decl;
3264
3265       if (result != NULL_TREE && sym->attr.function
3266             && sym->ts.type == BT_DERIVED
3267             && sym->ts.derived->attr.alloc_comp
3268             && !sym->attr.pointer)
3269         {
3270           rank = sym->as ? sym->as->rank : 0;
3271           tmp2 = gfc_nullify_alloc_comp (sym->ts.derived, result, rank);
3272           gfc_add_expr_to_block (&block, tmp2);
3273         }
3274
3275      gfc_add_expr_to_block (&block, tmp);
3276
3277      if (result == NULL_TREE)
3278         warning (0, "Function return value not set");
3279       else
3280         {
3281           /* Set the return value to the dummy result variable.  The
3282              types may be different for scalar default REAL functions
3283              with -ff2c, therefore we have to convert.  */
3284           tmp = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
3285           tmp = build2 (MODIFY_EXPR, TREE_TYPE (tmp),
3286                         DECL_RESULT (fndecl), tmp);
3287           tmp = build1_v (RETURN_EXPR, tmp);
3288           gfc_add_expr_to_block (&block, tmp);
3289         }
3290     }
3291   else
3292     gfc_add_expr_to_block (&block, tmp);
3293
3294
3295   /* Add all the decls we created during processing.  */
3296   decl = saved_function_decls;
3297   while (decl)
3298     {
3299       tree next;
3300
3301       next = TREE_CHAIN (decl);
3302       TREE_CHAIN (decl) = NULL_TREE;
3303       pushdecl (decl);
3304       decl = next;
3305     }
3306   saved_function_decls = NULL_TREE;
3307
3308   DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
3309
3310   /* Finish off this function and send it for code generation.  */
3311   poplevel (1, 0, 1);
3312   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3313
3314   /* Output the GENERIC tree.  */
3315   dump_function (TDI_original, fndecl);
3316
3317   /* Store the end of the function, so that we get good line number
3318      info for the epilogue.  */
3319   cfun->function_end_locus = input_location;
3320
3321   /* We're leaving the context of this function, so zap cfun.
3322      It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
3323      tree_rest_of_compilation.  */
3324   cfun = NULL;
3325
3326   if (old_context)
3327     {
3328       pop_function_context ();
3329       saved_function_decls = saved_parent_function_decls;
3330     }
3331   current_function_decl = old_context;
3332
3333   if (decl_function_context (fndecl))
3334     /* Register this function with cgraph just far enough to get it
3335        added to our parent's nested function list.  */
3336     (void) cgraph_node (fndecl);
3337   else
3338     {
3339       gfc_gimplify_function (fndecl);
3340       cgraph_finalize_function (fndecl, false);
3341     }
3342 }
3343
3344 void
3345 gfc_generate_constructors (void)
3346 {
3347   gcc_assert (gfc_static_ctors == NULL_TREE);
3348 #if 0
3349   tree fnname;
3350   tree type;
3351   tree fndecl;
3352   tree decl;
3353   tree tmp;
3354
3355   if (gfc_static_ctors == NULL_TREE)
3356     return;
3357
3358   fnname = get_file_function_name ("I");
3359   type = build_function_type (void_type_node,
3360                               gfc_chainon_list (NULL_TREE, void_type_node));
3361
3362   fndecl = build_decl (FUNCTION_DECL, fnname, type);
3363   TREE_PUBLIC (fndecl) = 1;
3364
3365   decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
3366   DECL_ARTIFICIAL (decl) = 1;
3367   DECL_IGNORED_P (decl) = 1;
3368   DECL_CONTEXT (decl) = fndecl;
3369   DECL_RESULT (fndecl) = decl;
3370
3371   pushdecl (fndecl);
3372
3373   current_function_decl = fndecl;
3374
3375   rest_of_decl_compilation (fndecl, 1, 0);
3376
3377   make_decl_rtl (fndecl);
3378
3379   init_function_start (fndecl);
3380
3381   pushlevel (0);
3382
3383   for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
3384     {
3385       tmp = build_call_expr (TREE_VALUE (gfc_static_ctors), 0);
3386       DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
3387     }
3388
3389   poplevel (1, 0, 1);
3390
3391   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3392
3393   free_after_parsing (cfun);
3394   free_after_compilation (cfun);
3395
3396   tree_rest_of_compilation (fndecl);
3397
3398   current_function_decl = NULL_TREE;
3399 #endif
3400 }
3401
3402 /* Translates a BLOCK DATA program unit. This means emitting the
3403    commons contained therein plus their initializations. We also emit
3404    a globally visible symbol to make sure that each BLOCK DATA program
3405    unit remains unique.  */
3406
3407 void
3408 gfc_generate_block_data (gfc_namespace * ns)
3409 {
3410   tree decl;
3411   tree id;
3412
3413   /* Tell the backend the source location of the block data.  */
3414   if (ns->proc_name)
3415     gfc_set_backend_locus (&ns->proc_name->declared_at);
3416   else
3417     gfc_set_backend_locus (&gfc_current_locus);
3418
3419   /* Process the DATA statements.  */
3420   gfc_trans_common (ns);
3421
3422   /* Create a global symbol with the mane of the block data.  This is to
3423      generate linker errors if the same name is used twice.  It is never
3424      really used.  */
3425   if (ns->proc_name)
3426     id = gfc_sym_mangled_function_id (ns->proc_name);
3427   else
3428     id = get_identifier ("__BLOCK_DATA__");
3429
3430   decl = build_decl (VAR_DECL, id, gfc_array_index_type);
3431   TREE_PUBLIC (decl) = 1;
3432   TREE_STATIC (decl) = 1;
3433
3434   pushdecl (decl);
3435   rest_of_decl_compilation (decl, 1, 0);
3436 }
3437
3438
3439 #include "gt-fortran-trans-decl.h"