OSDN Git Service

2007-07-15 Jerry DeLisle <jvdelisle@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_options;
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   /* Keep the array dimension in sync with the call, later in this file.  */
2368   gfor_fndecl_set_options =
2369     gfc_build_library_function_decl (get_identifier (PREFIX("set_options")),
2370                                     void_type_node, 2, gfc_c_int_type_node,
2371                                     pvoid_type_node);
2372
2373   gfor_fndecl_set_convert =
2374     gfc_build_library_function_decl (get_identifier (PREFIX("set_convert")),
2375                                      void_type_node, 1, gfc_c_int_type_node);
2376
2377   gfor_fndecl_set_record_marker =
2378     gfc_build_library_function_decl (get_identifier (PREFIX("set_record_marker")),
2379                                      void_type_node, 1, gfc_c_int_type_node);
2380
2381   gfor_fndecl_set_max_subrecord_length =
2382     gfc_build_library_function_decl (get_identifier (PREFIX("set_max_subrecord_length")),
2383                                      void_type_node, 1, gfc_c_int_type_node);
2384
2385   gfor_fndecl_in_pack = gfc_build_library_function_decl (
2386         get_identifier (PREFIX("internal_pack")),
2387         pvoid_type_node, 1, pvoid_type_node);
2388
2389   gfor_fndecl_in_unpack = gfc_build_library_function_decl (
2390         get_identifier (PREFIX("internal_unpack")),
2391         pvoid_type_node, 1, pvoid_type_node);
2392
2393   gfor_fndecl_associated =
2394     gfc_build_library_function_decl (
2395                                      get_identifier (PREFIX("associated")),
2396                                      gfc_logical4_type_node,
2397                                      2,
2398                                      ppvoid_type_node,
2399                                      ppvoid_type_node);
2400
2401   gfc_build_intrinsic_function_decls ();
2402   gfc_build_intrinsic_lib_fndecls ();
2403   gfc_build_io_library_fndecls ();
2404 }
2405
2406
2407 /* Evaluate the length of dummy character variables.  */
2408
2409 static tree
2410 gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl, tree fnbody)
2411 {
2412   stmtblock_t body;
2413
2414   gfc_finish_decl (cl->backend_decl);
2415
2416   gfc_start_block (&body);
2417
2418   /* Evaluate the string length expression.  */
2419   gfc_trans_init_string_length (cl, &body);
2420
2421   gfc_trans_vla_type_sizes (sym, &body);
2422
2423   gfc_add_expr_to_block (&body, fnbody);
2424   return gfc_finish_block (&body);
2425 }
2426
2427
2428 /* Allocate and cleanup an automatic character variable.  */
2429
2430 static tree
2431 gfc_trans_auto_character_variable (gfc_symbol * sym, tree fnbody)
2432 {
2433   stmtblock_t body;
2434   tree decl;
2435   tree tmp;
2436
2437   gcc_assert (sym->backend_decl);
2438   gcc_assert (sym->ts.cl && sym->ts.cl->length);
2439
2440   gfc_start_block (&body);
2441
2442   /* Evaluate the string length expression.  */
2443   gfc_trans_init_string_length (sym->ts.cl, &body);
2444
2445   gfc_trans_vla_type_sizes (sym, &body);
2446
2447   decl = sym->backend_decl;
2448
2449   /* Emit a DECL_EXPR for this variable, which will cause the
2450      gimplifier to allocate storage, and all that good stuff.  */
2451   tmp = build1 (DECL_EXPR, TREE_TYPE (decl), decl);
2452   gfc_add_expr_to_block (&body, tmp);
2453
2454   gfc_add_expr_to_block (&body, fnbody);
2455   return gfc_finish_block (&body);
2456 }
2457
2458 /* Set the initial value of ASSIGN statement auxiliary variable explicitly.  */
2459
2460 static tree
2461 gfc_trans_assign_aux_var (gfc_symbol * sym, tree fnbody)
2462 {
2463   stmtblock_t body;
2464
2465   gcc_assert (sym->backend_decl);
2466   gfc_start_block (&body);
2467
2468   /* Set the initial value to length. See the comments in
2469      function gfc_add_assign_aux_vars in this file.  */
2470   gfc_add_modify_expr (&body, GFC_DECL_STRING_LEN (sym->backend_decl),
2471                        build_int_cst (NULL_TREE, -2));
2472
2473   gfc_add_expr_to_block (&body, fnbody);
2474   return gfc_finish_block (&body);
2475 }
2476
2477 static void
2478 gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
2479 {
2480   tree t = *tp, var, val;
2481
2482   if (t == NULL || t == error_mark_node)
2483     return;
2484   if (TREE_CONSTANT (t) || DECL_P (t))
2485     return;
2486
2487   if (TREE_CODE (t) == SAVE_EXPR)
2488     {
2489       if (SAVE_EXPR_RESOLVED_P (t))
2490         {
2491           *tp = TREE_OPERAND (t, 0);
2492           return;
2493         }
2494       val = TREE_OPERAND (t, 0);
2495     }
2496   else
2497     val = t;
2498
2499   var = gfc_create_var_np (TREE_TYPE (t), NULL);
2500   gfc_add_decl_to_function (var);
2501   gfc_add_modify_expr (body, var, val);
2502   if (TREE_CODE (t) == SAVE_EXPR)
2503     TREE_OPERAND (t, 0) = var;
2504   *tp = var;
2505 }
2506
2507 static void
2508 gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
2509 {
2510   tree t;
2511
2512   if (type == NULL || type == error_mark_node)
2513     return;
2514
2515   type = TYPE_MAIN_VARIANT (type);
2516
2517   if (TREE_CODE (type) == INTEGER_TYPE)
2518     {
2519       gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
2520       gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
2521
2522       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2523         {
2524           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
2525           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
2526         }
2527     }
2528   else if (TREE_CODE (type) == ARRAY_TYPE)
2529     {
2530       gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
2531       gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
2532       gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
2533       gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
2534
2535       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2536         {
2537           TYPE_SIZE (t) = TYPE_SIZE (type);
2538           TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
2539         }
2540     }
2541 }
2542
2543 /* Make sure all type sizes and array domains are either constant,
2544    or variable or parameter decls.  This is a simplified variant
2545    of gimplify_type_sizes, but we can't use it here, as none of the
2546    variables in the expressions have been gimplified yet.
2547    As type sizes and domains for various variable length arrays
2548    contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
2549    time, without this routine gimplify_type_sizes in the middle-end
2550    could result in the type sizes being gimplified earlier than where
2551    those variables are initialized.  */
2552
2553 void
2554 gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
2555 {
2556   tree type = TREE_TYPE (sym->backend_decl);
2557
2558   if (TREE_CODE (type) == FUNCTION_TYPE
2559       && (sym->attr.function || sym->attr.result || sym->attr.entry))
2560     {
2561       if (! current_fake_result_decl)
2562         return;
2563
2564       type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
2565     }
2566
2567   while (POINTER_TYPE_P (type))
2568     type = TREE_TYPE (type);
2569
2570   if (GFC_DESCRIPTOR_TYPE_P (type))
2571     {
2572       tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2573
2574       while (POINTER_TYPE_P (etype))
2575         etype = TREE_TYPE (etype);
2576
2577       gfc_trans_vla_type_sizes_1 (etype, body);
2578     }
2579
2580   gfc_trans_vla_type_sizes_1 (type, body);
2581 }
2582
2583
2584 /* Generate function entry and exit code, and add it to the function body.
2585    This includes:
2586     Allocation and initialization of array variables.
2587     Allocation of character string variables.
2588     Initialization and possibly repacking of dummy arrays.
2589     Initialization of ASSIGN statement auxiliary variable.  */
2590
2591 static tree
2592 gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
2593 {
2594   locus loc;
2595   gfc_symbol *sym;
2596   gfc_formal_arglist *f;
2597   stmtblock_t body;
2598   bool seen_trans_deferred_array = false;
2599
2600   /* Deal with implicit return variables.  Explicit return variables will
2601      already have been added.  */
2602   if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
2603     {
2604       if (!current_fake_result_decl)
2605         {
2606           gfc_entry_list *el = NULL;
2607           if (proc_sym->attr.entry_master)
2608             {
2609               for (el = proc_sym->ns->entries; el; el = el->next)
2610                 if (el->sym != el->sym->result)
2611                   break;
2612             }
2613           if (el == NULL)
2614             warning (0, "Function does not return a value");
2615         }
2616       else if (proc_sym->as)
2617         {
2618           tree result = TREE_VALUE (current_fake_result_decl);
2619           fnbody = gfc_trans_dummy_array_bias (proc_sym, result, fnbody);
2620
2621           /* An automatic character length, pointer array result.  */
2622           if (proc_sym->ts.type == BT_CHARACTER
2623                 && TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2624             fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2625                                                 fnbody);
2626         }
2627       else if (proc_sym->ts.type == BT_CHARACTER)
2628         {
2629           if (TREE_CODE (proc_sym->ts.cl->backend_decl) == VAR_DECL)
2630             fnbody = gfc_trans_dummy_character (proc_sym, proc_sym->ts.cl,
2631                                                 fnbody);
2632         }
2633       else
2634         gcc_assert (gfc_option.flag_f2c
2635                     && proc_sym->ts.type == BT_COMPLEX);
2636     }
2637
2638   for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
2639     {
2640       bool sym_has_alloc_comp = (sym->ts.type == BT_DERIVED)
2641                                    && sym->ts.derived->attr.alloc_comp;
2642       if (sym->attr.dimension)
2643         {
2644           switch (sym->as->type)
2645             {
2646             case AS_EXPLICIT:
2647               if (sym->attr.dummy || sym->attr.result)
2648                 fnbody =
2649                   gfc_trans_dummy_array_bias (sym, sym->backend_decl, fnbody);
2650               else if (sym->attr.pointer || sym->attr.allocatable)
2651                 {
2652                   if (TREE_STATIC (sym->backend_decl))
2653                     gfc_trans_static_array_pointer (sym);
2654                   else
2655                     {
2656                       seen_trans_deferred_array = true;
2657                       fnbody = gfc_trans_deferred_array (sym, fnbody);
2658                     }
2659                 }
2660               else
2661                 {
2662                   if (sym_has_alloc_comp)
2663                     {
2664                       seen_trans_deferred_array = true;
2665                       fnbody = gfc_trans_deferred_array (sym, fnbody);
2666                     }
2667
2668                   gfc_get_backend_locus (&loc);
2669                   gfc_set_backend_locus (&sym->declared_at);
2670                   fnbody = gfc_trans_auto_array_allocation (sym->backend_decl,
2671                       sym, fnbody);
2672                   gfc_set_backend_locus (&loc);
2673                 }
2674               break;
2675
2676             case AS_ASSUMED_SIZE:
2677               /* Must be a dummy parameter.  */
2678               gcc_assert (sym->attr.dummy);
2679
2680               /* We should always pass assumed size arrays the g77 way.  */
2681               fnbody = gfc_trans_g77_array (sym, fnbody);
2682               break;
2683
2684             case AS_ASSUMED_SHAPE:
2685               /* Must be a dummy parameter.  */
2686               gcc_assert (sym->attr.dummy);
2687
2688               fnbody = gfc_trans_dummy_array_bias (sym, sym->backend_decl,
2689                                                    fnbody);
2690               break;
2691
2692             case AS_DEFERRED:
2693               seen_trans_deferred_array = true;
2694               fnbody = gfc_trans_deferred_array (sym, fnbody);
2695               break;
2696
2697             default:
2698               gcc_unreachable ();
2699             }
2700           if (sym_has_alloc_comp && !seen_trans_deferred_array)
2701             fnbody = gfc_trans_deferred_array (sym, fnbody);
2702         }
2703       else if (sym_has_alloc_comp)
2704         fnbody = gfc_trans_deferred_array (sym, fnbody);
2705       else if (sym->ts.type == BT_CHARACTER)
2706         {
2707           gfc_get_backend_locus (&loc);
2708           gfc_set_backend_locus (&sym->declared_at);
2709           if (sym->attr.dummy || sym->attr.result)
2710             fnbody = gfc_trans_dummy_character (sym, sym->ts.cl, fnbody);
2711           else
2712             fnbody = gfc_trans_auto_character_variable (sym, fnbody);
2713           gfc_set_backend_locus (&loc);
2714         }
2715       else if (sym->attr.assign)
2716         {
2717           gfc_get_backend_locus (&loc);
2718           gfc_set_backend_locus (&sym->declared_at);
2719           fnbody = gfc_trans_assign_aux_var (sym, fnbody);
2720           gfc_set_backend_locus (&loc);
2721         }
2722       else
2723         gcc_unreachable ();
2724     }
2725
2726   gfc_init_block (&body);
2727
2728   for (f = proc_sym->formal; f; f = f->next)
2729     if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER)
2730       {
2731         gcc_assert (f->sym->ts.cl->backend_decl != NULL);
2732         if (TREE_CODE (f->sym->ts.cl->backend_decl) == PARM_DECL)
2733           gfc_trans_vla_type_sizes (f->sym, &body);
2734       }
2735
2736   if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
2737       && current_fake_result_decl != NULL)
2738     {
2739       gcc_assert (proc_sym->ts.cl->backend_decl != NULL);
2740       if (TREE_CODE (proc_sym->ts.cl->backend_decl) == PARM_DECL)
2741         gfc_trans_vla_type_sizes (proc_sym, &body);
2742     }
2743
2744   gfc_add_expr_to_block (&body, fnbody);
2745   return gfc_finish_block (&body);
2746 }
2747
2748
2749 /* Output an initialized decl for a module variable.  */
2750
2751 static void
2752 gfc_create_module_variable (gfc_symbol * sym)
2753 {
2754   tree decl;
2755
2756   /* Module functions with alternate entries are dealt with later and
2757      would get caught by the next condition.  */
2758   if (sym->attr.entry)
2759     return;
2760
2761   /* Make sure we convert the types of the derived types from iso_c_binding
2762      into (void *).  */
2763   if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
2764       && sym->ts.type == BT_DERIVED)
2765     sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
2766
2767   /* Only output variables and array valued parameters.  */
2768   if (sym->attr.flavor != FL_VARIABLE
2769       && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0))
2770     return;
2771
2772   /* Don't generate variables from other modules. Variables from
2773      COMMONs will already have been generated.  */
2774   if (sym->attr.use_assoc || sym->attr.in_common)
2775     return;
2776
2777   /* Equivalenced variables arrive here after creation.  */
2778   if (sym->backend_decl
2779         && (sym->equiv_built || sym->attr.in_equivalence))
2780       return;
2781
2782   if (sym->backend_decl)
2783     internal_error ("backend decl for module variable %s already exists",
2784                     sym->name);
2785
2786   /* We always want module variables to be created.  */
2787   sym->attr.referenced = 1;
2788   /* Create the decl.  */
2789   decl = gfc_get_symbol_decl (sym);
2790
2791   /* Create the variable.  */
2792   pushdecl (decl);
2793   rest_of_decl_compilation (decl, 1, 0);
2794
2795   /* Also add length of strings.  */
2796   if (sym->ts.type == BT_CHARACTER)
2797     {
2798       tree length;
2799
2800       length = sym->ts.cl->backend_decl;
2801       if (!INTEGER_CST_P (length))
2802         {
2803           pushdecl (length);
2804           rest_of_decl_compilation (length, 1, 0);
2805         }
2806     }
2807 }
2808
2809
2810 /* Generate all the required code for module variables.  */
2811
2812 void
2813 gfc_generate_module_vars (gfc_namespace * ns)
2814 {
2815   module_namespace = ns;
2816
2817   /* Check if the frontend left the namespace in a reasonable state.  */
2818   gcc_assert (ns->proc_name && !ns->proc_name->tlink);
2819
2820   /* Generate COMMON blocks.  */
2821   gfc_trans_common (ns);
2822
2823   /* Create decls for all the module variables.  */
2824   gfc_traverse_ns (ns, gfc_create_module_variable);
2825 }
2826
2827 static void
2828 gfc_generate_contained_functions (gfc_namespace * parent)
2829 {
2830   gfc_namespace *ns;
2831
2832   /* We create all the prototypes before generating any code.  */
2833   for (ns = parent->contained; ns; ns = ns->sibling)
2834     {
2835       /* Skip namespaces from used modules.  */
2836       if (ns->parent != parent)
2837         continue;
2838
2839       gfc_create_function_decl (ns);
2840     }
2841
2842   for (ns = parent->contained; ns; ns = ns->sibling)
2843     {
2844       /* Skip namespaces from used modules.  */
2845       if (ns->parent != parent)
2846         continue;
2847
2848       gfc_generate_function_code (ns);
2849     }
2850 }
2851
2852
2853 /* Drill down through expressions for the array specification bounds and
2854    character length calling generate_local_decl for all those variables
2855    that have not already been declared.  */
2856
2857 static void
2858 generate_local_decl (gfc_symbol *);
2859
2860 static void
2861 generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
2862 {
2863   gfc_actual_arglist *arg;
2864   gfc_ref *ref;
2865   int i;
2866
2867   if (e == NULL)
2868     return;
2869
2870   switch (e->expr_type)
2871     {
2872     case EXPR_FUNCTION:
2873       for (arg = e->value.function.actual; arg; arg = arg->next)
2874         generate_expr_decls (sym, arg->expr);
2875       break;
2876
2877     /* If the variable is not the same as the dependent, 'sym', and
2878        it is not marked as being declared and it is in the same
2879        namespace as 'sym', add it to the local declarations.  */
2880     case EXPR_VARIABLE:
2881       if (sym == e->symtree->n.sym
2882             || e->symtree->n.sym->mark
2883             || e->symtree->n.sym->ns != sym->ns)
2884         return;
2885
2886       generate_local_decl (e->symtree->n.sym);
2887       break;
2888
2889     case EXPR_OP:
2890       generate_expr_decls (sym, e->value.op.op1);
2891       generate_expr_decls (sym, e->value.op.op2);
2892       break;
2893
2894     default:
2895       break;
2896     }
2897
2898   if (e->ref)
2899     {
2900       for (ref = e->ref; ref; ref = ref->next)
2901         {
2902           switch (ref->type)
2903             {
2904             case REF_ARRAY:
2905               for (i = 0; i < ref->u.ar.dimen; i++)
2906                 {
2907                   generate_expr_decls (sym, ref->u.ar.start[i]);
2908                   generate_expr_decls (sym, ref->u.ar.end[i]);
2909                   generate_expr_decls (sym, ref->u.ar.stride[i]);
2910                 }
2911               break;
2912
2913             case REF_SUBSTRING:
2914               generate_expr_decls (sym, ref->u.ss.start);
2915               generate_expr_decls (sym, ref->u.ss.end);
2916               break;
2917
2918             case REF_COMPONENT:
2919               if (ref->u.c.component->ts.type == BT_CHARACTER
2920                     && ref->u.c.component->ts.cl->length->expr_type
2921                                                 != EXPR_CONSTANT)
2922                 generate_expr_decls (sym, ref->u.c.component->ts.cl->length);
2923
2924               if (ref->u.c.component->as)
2925                 for (i = 0; i < ref->u.c.component->as->rank; i++)
2926                   {
2927                     generate_expr_decls (sym, ref->u.c.component->as->lower[i]);
2928                     generate_expr_decls (sym, ref->u.c.component->as->upper[i]);
2929                   }
2930               break;
2931             }
2932         }
2933     }
2934 }
2935
2936
2937 /* Check for dependencies in the character length and array spec.  */
2938
2939 static void
2940 generate_dependency_declarations (gfc_symbol *sym)
2941 {
2942   int i;
2943
2944   if (sym->ts.type == BT_CHARACTER
2945         && sym->ts.cl->length->expr_type != EXPR_CONSTANT)
2946     generate_expr_decls (sym, sym->ts.cl->length);
2947
2948   if (sym->as && sym->as->rank)
2949     {
2950       for (i = 0; i < sym->as->rank; i++)
2951         {
2952           generate_expr_decls (sym, sym->as->lower[i]);
2953           generate_expr_decls (sym, sym->as->upper[i]);
2954         }
2955     }
2956 }
2957
2958
2959 /* Generate decls for all local variables.  We do this to ensure correct
2960    handling of expressions which only appear in the specification of
2961    other functions.  */
2962
2963 static void
2964 generate_local_decl (gfc_symbol * sym)
2965 {
2966   if (sym->attr.flavor == FL_VARIABLE)
2967     {
2968       /* Check for dependencies in the array specification and string
2969         length, adding the necessary declarations to the function.  We
2970         mark the symbol now, as well as in traverse_ns, to prevent
2971         getting stuck in a circular dependency.  */
2972       sym->mark = 1;
2973       if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
2974         generate_dependency_declarations (sym);
2975
2976       if (sym->attr.referenced)
2977         gfc_get_symbol_decl (sym);
2978       /* INTENT(out) dummy arguments are likely meant to be set.  */
2979       else if (warn_unused_variable
2980                && sym->attr.dummy
2981                && sym->attr.intent == INTENT_OUT)
2982         gfc_warning ("dummy argument '%s' at %L was declared INTENT(OUT) but was not set",
2983                      sym->name, &sym->declared_at);
2984       /* Specific warning for unused dummy arguments. */
2985       else if (warn_unused_variable && sym->attr.dummy)
2986         gfc_warning ("unused dummy argument '%s' at %L", sym->name,
2987                      &sym->declared_at);
2988       /* Warn for unused variables, but not if they're inside a common
2989          block or are use-associated.  */
2990       else if (warn_unused_variable
2991                && !(sym->attr.in_common || sym->attr.use_assoc))
2992         gfc_warning ("unused variable '%s' declared at %L", sym->name,
2993                      &sym->declared_at);
2994       /* For variable length CHARACTER parameters, the PARM_DECL already
2995          references the length variable, so force gfc_get_symbol_decl
2996          even when not referenced.  If optimize > 0, it will be optimized
2997          away anyway.  But do this only after emitting -Wunused-parameter
2998          warning if requested.  */
2999       if (sym->attr.dummy && ! sym->attr.referenced
3000           && sym->ts.type == BT_CHARACTER
3001           && sym->ts.cl->backend_decl != NULL
3002           && TREE_CODE (sym->ts.cl->backend_decl) == VAR_DECL)
3003         {
3004           sym->attr.referenced = 1;
3005           gfc_get_symbol_decl (sym);
3006         }
3007
3008       /* We do not want the middle-end to warn about unused parameters
3009          as this was already done above.  */
3010       if (sym->attr.dummy && sym->backend_decl != NULL_TREE)
3011           TREE_NO_WARNING(sym->backend_decl) = 1;
3012     }
3013   else if (sym->attr.flavor == FL_PARAMETER)
3014     {
3015       if (warn_unused_variable 
3016            && !sym->attr.referenced
3017            && !sym->attr.use_assoc)
3018         gfc_warning ("unused parameter '%s' declared at %L", sym->name,
3019                      &sym->declared_at);
3020     }
3021
3022   /* Make sure we convert the types of the derived types from iso_c_binding
3023      into (void *).  */
3024   if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
3025       && sym->ts.type == BT_DERIVED)
3026     sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
3027 }
3028
3029 static void
3030 generate_local_vars (gfc_namespace * ns)
3031 {
3032   gfc_traverse_ns (ns, generate_local_decl);
3033 }
3034
3035
3036 /* Generate a switch statement to jump to the correct entry point.  Also
3037    creates the label decls for the entry points.  */
3038
3039 static tree
3040 gfc_trans_entry_master_switch (gfc_entry_list * el)
3041 {
3042   stmtblock_t block;
3043   tree label;
3044   tree tmp;
3045   tree val;
3046
3047   gfc_init_block (&block);
3048   for (; el; el = el->next)
3049     {
3050       /* Add the case label.  */
3051       label = gfc_build_label_decl (NULL_TREE);
3052       val = build_int_cst (gfc_array_index_type, el->id);
3053       tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label);
3054       gfc_add_expr_to_block (&block, tmp);
3055       
3056       /* And jump to the actual entry point.  */
3057       label = gfc_build_label_decl (NULL_TREE);
3058       tmp = build1_v (GOTO_EXPR, label);
3059       gfc_add_expr_to_block (&block, tmp);
3060
3061       /* Save the label decl.  */
3062       el->label = label;
3063     }
3064   tmp = gfc_finish_block (&block);
3065   /* The first argument selects the entry point.  */
3066   val = DECL_ARGUMENTS (current_function_decl);
3067   tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE);
3068   return tmp;
3069 }
3070
3071
3072 /* Generate code for a function.  */
3073
3074 void
3075 gfc_generate_function_code (gfc_namespace * ns)
3076 {
3077   tree fndecl;
3078   tree old_context;
3079   tree decl;
3080   tree tmp;
3081   tree tmp2;
3082   stmtblock_t block;
3083   stmtblock_t body;
3084   tree result;
3085   gfc_symbol *sym;
3086   int rank;
3087
3088   sym = ns->proc_name;
3089
3090   /* Check that the frontend isn't still using this.  */
3091   gcc_assert (sym->tlink == NULL);
3092   sym->tlink = sym;
3093
3094   /* Create the declaration for functions with global scope.  */
3095   if (!sym->backend_decl)
3096     gfc_create_function_decl (ns);
3097
3098   fndecl = sym->backend_decl;
3099   old_context = current_function_decl;
3100
3101   if (old_context)
3102     {
3103       push_function_context ();
3104       saved_parent_function_decls = saved_function_decls;
3105       saved_function_decls = NULL_TREE;
3106     }
3107
3108   trans_function_start (sym);
3109
3110   gfc_start_block (&block);
3111
3112   if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
3113     {
3114       /* Copy length backend_decls to all entry point result
3115          symbols.  */
3116       gfc_entry_list *el;
3117       tree backend_decl;
3118
3119       gfc_conv_const_charlen (ns->proc_name->ts.cl);
3120       backend_decl = ns->proc_name->result->ts.cl->backend_decl;
3121       for (el = ns->entries; el; el = el->next)
3122         el->sym->result->ts.cl->backend_decl = backend_decl;
3123     }
3124
3125   /* Translate COMMON blocks.  */
3126   gfc_trans_common (ns);
3127
3128   /* Null the parent fake result declaration if this namespace is
3129      a module function or an external procedures.  */
3130   if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3131         || ns->parent == NULL)
3132     parent_fake_result_decl = NULL_TREE;
3133
3134   gfc_generate_contained_functions (ns);
3135
3136   generate_local_vars (ns);
3137   
3138   /* Keep the parent fake result declaration in module functions
3139      or external procedures.  */
3140   if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
3141         || ns->parent == NULL)
3142     current_fake_result_decl = parent_fake_result_decl;
3143   else
3144     current_fake_result_decl = NULL_TREE;
3145
3146   current_function_return_label = NULL;
3147
3148   /* Now generate the code for the body of this function.  */
3149   gfc_init_block (&body);
3150
3151   /* If this is the main program, add a call to set_options to set up the
3152      runtime library Fortran language standard parameters.  */
3153   if (sym->attr.is_main_program)
3154     {
3155       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3156       tree array_type, array, var;
3157
3158       /* Passing a new option to the library requires four modifications:
3159            + add it to the tree_cons list below
3160            + change the array size in the call to build_array_type
3161            + change the first argument to the library call
3162              gfor_fndecl_set_options
3163            + modify the library (runtime/compile_options.c)!  */
3164       array = tree_cons (NULL_TREE,
3165                          build_int_cst (gfc_c_int_type_node,
3166                                         gfc_option.warn_std), NULL_TREE);
3167       array = tree_cons (NULL_TREE,
3168                          build_int_cst (gfc_c_int_type_node,
3169                                         gfc_option.allow_std), array);
3170       array = tree_cons (NULL_TREE,
3171                          build_int_cst (gfc_c_int_type_node, pedantic), array);
3172       array = tree_cons (NULL_TREE,
3173                          build_int_cst (gfc_c_int_type_node,
3174                                         gfc_option.flag_dump_core), array);
3175       array = tree_cons (NULL_TREE,
3176                          build_int_cst (gfc_c_int_type_node,
3177                                         gfc_option.flag_backtrace), array);
3178       array = tree_cons (NULL_TREE,
3179                          build_int_cst (gfc_c_int_type_node,
3180                                         gfc_option.flag_sign_zero), array);
3181
3182       array_type = build_array_type (gfc_c_int_type_node,
3183                                      build_index_type (build_int_cst (NULL_TREE,
3184                                                                       5)));
3185       array = build_constructor_from_list (array_type, nreverse (array));
3186       TREE_CONSTANT (array) = 1;
3187       TREE_INVARIANT (array) = 1;
3188       TREE_STATIC (array) = 1;
3189
3190       /* Create a static variable to hold the jump table.  */
3191       var = gfc_create_var (array_type, "options");
3192       TREE_CONSTANT (var) = 1;
3193       TREE_INVARIANT (var) = 1;
3194       TREE_STATIC (var) = 1;
3195       TREE_READONLY (var) = 1;
3196       DECL_INITIAL (var) = array;
3197       var = gfc_build_addr_expr (pvoid_type_node, var);
3198
3199       tmp = build_call_expr (gfor_fndecl_set_options, 2,
3200                              build_int_cst (gfc_c_int_type_node, 6), var);
3201       gfc_add_expr_to_block (&body, tmp);
3202     }
3203
3204   /* If this is the main program and a -ffpe-trap option was provided,
3205      add a call to set_fpe so that the library will raise a FPE when
3206      needed.  */
3207   if (sym->attr.is_main_program && gfc_option.fpe != 0)
3208     {
3209       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3210       tmp = build_call_expr (gfor_fndecl_set_fpe, 1,
3211                              build_int_cst (gfc_c_int_type_node,
3212                                             gfc_option.fpe));
3213       gfc_add_expr_to_block (&body, tmp);
3214     }
3215
3216   /* If this is the main program and an -fconvert option was provided,
3217      add a call to set_convert.  */
3218
3219   if (sym->attr.is_main_program && gfc_option.convert != CONVERT_NATIVE)
3220     {
3221       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3222       tmp = build_call_expr (gfor_fndecl_set_convert, 1,
3223                              build_int_cst (gfc_c_int_type_node,
3224                                             gfc_option.convert));
3225       gfc_add_expr_to_block (&body, tmp);
3226     }
3227
3228   /* If this is the main program and an -frecord-marker option was provided,
3229      add a call to set_record_marker.  */
3230
3231   if (sym->attr.is_main_program && gfc_option.record_marker != 0)
3232     {
3233       tree gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3234       tmp = build_call_expr (gfor_fndecl_set_record_marker, 1,
3235                              build_int_cst (gfc_c_int_type_node,
3236                                             gfc_option.record_marker));
3237       gfc_add_expr_to_block (&body, tmp);
3238     }
3239
3240   if (sym->attr.is_main_program && gfc_option.max_subrecord_length != 0)
3241     {
3242       tree gfc_c_int_type_node;
3243
3244       gfc_c_int_type_node = gfc_get_int_type (gfc_c_int_kind);
3245       tmp = build_call_expr (gfor_fndecl_set_max_subrecord_length,
3246                              1,
3247                              build_int_cst (gfc_c_int_type_node,
3248                                             gfc_option.max_subrecord_length));
3249       gfc_add_expr_to_block (&body, tmp);
3250     }
3251
3252   if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
3253       && sym->attr.subroutine)
3254     {
3255       tree alternate_return;
3256       alternate_return = gfc_get_fake_result_decl (sym, 0);
3257       gfc_add_modify_expr (&body, alternate_return, integer_zero_node);
3258     }
3259
3260   if (ns->entries)
3261     {
3262       /* Jump to the correct entry point.  */
3263       tmp = gfc_trans_entry_master_switch (ns->entries);
3264       gfc_add_expr_to_block (&body, tmp);
3265     }
3266
3267   tmp = gfc_trans_code (ns->code);
3268   gfc_add_expr_to_block (&body, tmp);
3269
3270   /* Add a return label if needed.  */
3271   if (current_function_return_label)
3272     {
3273       tmp = build1_v (LABEL_EXPR, current_function_return_label);
3274       gfc_add_expr_to_block (&body, tmp);
3275     }
3276
3277   tmp = gfc_finish_block (&body);
3278   /* Add code to create and cleanup arrays.  */
3279   tmp = gfc_trans_deferred_vars (sym, tmp);
3280
3281   if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node)
3282     {
3283       if (sym->attr.subroutine || sym == sym->result)
3284         {
3285           if (current_fake_result_decl != NULL)
3286             result = TREE_VALUE (current_fake_result_decl);
3287           else
3288             result = NULL_TREE;
3289           current_fake_result_decl = NULL_TREE;
3290         }
3291       else
3292         result = sym->result->backend_decl;
3293
3294       if (result != NULL_TREE && sym->attr.function
3295             && sym->ts.type == BT_DERIVED
3296             && sym->ts.derived->attr.alloc_comp
3297             && !sym->attr.pointer)
3298         {
3299           rank = sym->as ? sym->as->rank : 0;
3300           tmp2 = gfc_nullify_alloc_comp (sym->ts.derived, result, rank);
3301           gfc_add_expr_to_block (&block, tmp2);
3302         }
3303
3304      gfc_add_expr_to_block (&block, tmp);
3305
3306      if (result == NULL_TREE)
3307         warning (0, "Function return value not set");
3308       else
3309         {
3310           /* Set the return value to the dummy result variable.  The
3311              types may be different for scalar default REAL functions
3312              with -ff2c, therefore we have to convert.  */
3313           tmp = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
3314           tmp = build2 (MODIFY_EXPR, TREE_TYPE (tmp),
3315                         DECL_RESULT (fndecl), tmp);
3316           tmp = build1_v (RETURN_EXPR, tmp);
3317           gfc_add_expr_to_block (&block, tmp);
3318         }
3319     }
3320   else
3321     gfc_add_expr_to_block (&block, tmp);
3322
3323
3324   /* Add all the decls we created during processing.  */
3325   decl = saved_function_decls;
3326   while (decl)
3327     {
3328       tree next;
3329
3330       next = TREE_CHAIN (decl);
3331       TREE_CHAIN (decl) = NULL_TREE;
3332       pushdecl (decl);
3333       decl = next;
3334     }
3335   saved_function_decls = NULL_TREE;
3336
3337   DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
3338
3339   /* Finish off this function and send it for code generation.  */
3340   poplevel (1, 0, 1);
3341   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3342
3343   /* Output the GENERIC tree.  */
3344   dump_function (TDI_original, fndecl);
3345
3346   /* Store the end of the function, so that we get good line number
3347      info for the epilogue.  */
3348   cfun->function_end_locus = input_location;
3349
3350   /* We're leaving the context of this function, so zap cfun.
3351      It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
3352      tree_rest_of_compilation.  */
3353   cfun = NULL;
3354
3355   if (old_context)
3356     {
3357       pop_function_context ();
3358       saved_function_decls = saved_parent_function_decls;
3359     }
3360   current_function_decl = old_context;
3361
3362   if (decl_function_context (fndecl))
3363     /* Register this function with cgraph just far enough to get it
3364        added to our parent's nested function list.  */
3365     (void) cgraph_node (fndecl);
3366   else
3367     {
3368       gfc_gimplify_function (fndecl);
3369       cgraph_finalize_function (fndecl, false);
3370     }
3371 }
3372
3373 void
3374 gfc_generate_constructors (void)
3375 {
3376   gcc_assert (gfc_static_ctors == NULL_TREE);
3377 #if 0
3378   tree fnname;
3379   tree type;
3380   tree fndecl;
3381   tree decl;
3382   tree tmp;
3383
3384   if (gfc_static_ctors == NULL_TREE)
3385     return;
3386
3387   fnname = get_file_function_name ("I");
3388   type = build_function_type (void_type_node,
3389                               gfc_chainon_list (NULL_TREE, void_type_node));
3390
3391   fndecl = build_decl (FUNCTION_DECL, fnname, type);
3392   TREE_PUBLIC (fndecl) = 1;
3393
3394   decl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
3395   DECL_ARTIFICIAL (decl) = 1;
3396   DECL_IGNORED_P (decl) = 1;
3397   DECL_CONTEXT (decl) = fndecl;
3398   DECL_RESULT (fndecl) = decl;
3399
3400   pushdecl (fndecl);
3401
3402   current_function_decl = fndecl;
3403
3404   rest_of_decl_compilation (fndecl, 1, 0);
3405
3406   make_decl_rtl (fndecl);
3407
3408   init_function_start (fndecl);
3409
3410   pushlevel (0);
3411
3412   for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
3413     {
3414       tmp = build_call_expr (TREE_VALUE (gfc_static_ctors), 0);
3415       DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
3416     }
3417
3418   poplevel (1, 0, 1);
3419
3420   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
3421
3422   free_after_parsing (cfun);
3423   free_after_compilation (cfun);
3424
3425   tree_rest_of_compilation (fndecl);
3426
3427   current_function_decl = NULL_TREE;
3428 #endif
3429 }
3430
3431 /* Translates a BLOCK DATA program unit. This means emitting the
3432    commons contained therein plus their initializations. We also emit
3433    a globally visible symbol to make sure that each BLOCK DATA program
3434    unit remains unique.  */
3435
3436 void
3437 gfc_generate_block_data (gfc_namespace * ns)
3438 {
3439   tree decl;
3440   tree id;
3441
3442   /* Tell the backend the source location of the block data.  */
3443   if (ns->proc_name)
3444     gfc_set_backend_locus (&ns->proc_name->declared_at);
3445   else
3446     gfc_set_backend_locus (&gfc_current_locus);
3447
3448   /* Process the DATA statements.  */
3449   gfc_trans_common (ns);
3450
3451   /* Create a global symbol with the mane of the block data.  This is to
3452      generate linker errors if the same name is used twice.  It is never
3453      really used.  */
3454   if (ns->proc_name)
3455     id = gfc_sym_mangled_function_id (ns->proc_name);
3456   else
3457     id = get_identifier ("__BLOCK_DATA__");
3458
3459   decl = build_decl (VAR_DECL, id, gfc_array_index_type);
3460   TREE_PUBLIC (decl) = 1;
3461   TREE_STATIC (decl) = 1;
3462
3463   pushdecl (decl);
3464   rest_of_decl_compilation (decl, 1, 0);
3465 }
3466
3467
3468 #include "gt-fortran-trans-decl.h"