OSDN Git Service

* trans-types.c (gfc_return_by_reference): Remove superfluous
[pf3gnuchains/gcc-fork.git] / gcc / fortran / trans-types.c
1 /* Backend support for Fortran 95 basic types and derived types.
2    Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
3    Contributed by Paul Brook <paul@nowt.org>
4    and Steven Bosscher <s.bosscher@student.tudelft.nl>
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, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 /* trans-types.c -- gfortran backend types */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tree.h"
29 #include "tm.h"
30 #include "target.h"
31 #include "ggc.h"
32 #include "toplev.h"
33 #include "gfortran.h"
34 #include "trans.h"
35 #include "trans-types.h"
36 #include "trans-const.h"
37 #include "real.h"
38 \f
39
40 #if (GFC_MAX_DIMENSIONS < 10)
41 #define GFC_RANK_DIGITS 1
42 #define GFC_RANK_PRINTF_FORMAT "%01d"
43 #elif (GFC_MAX_DIMENSIONS < 100)
44 #define GFC_RANK_DIGITS 2
45 #define GFC_RANK_PRINTF_FORMAT "%02d"
46 #else
47 #error If you really need >99 dimensions, continue the sequence above...
48 #endif
49
50 static tree gfc_get_derived_type (gfc_symbol * derived);
51
52 tree gfc_array_index_type;
53 tree pvoid_type_node;
54 tree ppvoid_type_node;
55 tree pchar_type_node;
56 tree gfc_character1_type_node;
57 tree gfc_charlen_type_node;
58
59 static GTY(()) tree gfc_desc_dim_type;
60 static GTY(()) tree gfc_max_array_element_size;
61
62 /* Arrays for all integral and real kinds.  We'll fill this in at runtime
63    after the target has a chance to process command-line options.  */
64
65 #define MAX_INT_KINDS 5
66 gfc_integer_info gfc_integer_kinds[MAX_INT_KINDS + 1];
67 gfc_logical_info gfc_logical_kinds[MAX_INT_KINDS + 1];
68 static GTY(()) tree gfc_integer_types[MAX_INT_KINDS + 1];
69 static GTY(()) tree gfc_logical_types[MAX_INT_KINDS + 1];
70
71 #define MAX_REAL_KINDS 4
72 gfc_real_info gfc_real_kinds[MAX_REAL_KINDS + 1];
73 static GTY(()) tree gfc_real_types[MAX_REAL_KINDS + 1];
74 static GTY(()) tree gfc_complex_types[MAX_REAL_KINDS + 1];
75
76 /* The integer kind to use for array indices.  This will be set to the
77    proper value based on target information from the backend.  */
78
79 int gfc_index_integer_kind;
80
81 /* The default kinds of the various types.  */
82
83 int gfc_default_integer_kind;
84 int gfc_default_real_kind;
85 int gfc_default_double_kind;
86 int gfc_default_character_kind;
87 int gfc_default_logical_kind;
88 int gfc_default_complex_kind;
89 int gfc_c_int_kind;
90
91 /* Query the target to determine which machine modes are available for
92    computation.  Choose KIND numbers for them.  */
93
94 void
95 gfc_init_kinds (void)
96 {
97   enum machine_mode mode;
98   int i_index, r_index;
99   bool saw_i4 = false, saw_i8 = false;
100   bool saw_r4 = false, saw_r8 = false, saw_r16 = false;
101
102   for (i_index = 0, mode = MIN_MODE_INT; mode <= MAX_MODE_INT; mode++)
103     {
104       int kind, bitsize;
105
106       if (!targetm.scalar_mode_supported_p (mode))
107         continue;
108
109       /* The middle end doesn't support constants larger than 2*HWI.
110          Perhaps the target hook shouldn't have accepted these either,
111          but just to be safe...  */
112       bitsize = GET_MODE_BITSIZE (mode);
113       if (bitsize > 2*HOST_BITS_PER_WIDE_INT)
114         continue;
115
116       gcc_assert (i_index != MAX_INT_KINDS);
117
118       /* Let the kind equal the bit size divided by 8.  This insulates the
119          programmer from the underlying byte size.  */
120       kind = bitsize / 8;
121
122       if (kind == 4)
123         saw_i4 = true;
124       if (kind == 8)
125         saw_i8 = true;
126
127       gfc_integer_kinds[i_index].kind = kind;
128       gfc_integer_kinds[i_index].radix = 2;
129       gfc_integer_kinds[i_index].digits = bitsize - 1;
130       gfc_integer_kinds[i_index].bit_size = bitsize;
131
132       gfc_logical_kinds[i_index].kind = kind;
133       gfc_logical_kinds[i_index].bit_size = bitsize;
134
135       i_index += 1;
136     }
137
138   for (r_index = 0, mode = MIN_MODE_FLOAT; mode <= MAX_MODE_FLOAT; mode++)
139     {
140       const struct real_format *fmt = REAL_MODE_FORMAT (mode);
141       int kind;
142
143       if (fmt == NULL)
144         continue;
145       if (!targetm.scalar_mode_supported_p (mode))
146         continue;
147
148       /* Let the kind equal the precision divided by 8, rounding up.  Again,
149          this insulates the programmer from the underlying byte size.
150
151          Also, it effectively deals with IEEE extended formats.  There, the
152          total size of the type may equal 16, but it's got 6 bytes of padding
153          and the increased size can get in the way of a real IEEE quad format
154          which may also be supported by the target.
155
156          We round up so as to handle IA-64 __floatreg (RFmode), which is an
157          82 bit type.  Not to be confused with __float80 (XFmode), which is
158          an 80 bit type also supported by IA-64.  So XFmode should come out
159          to be kind=10, and RFmode should come out to be kind=11.  Egads.  */
160
161       kind = (GET_MODE_PRECISION (mode) + 7) / 8;
162
163       if (kind == 4)
164         saw_r4 = true;
165       if (kind == 8)
166         saw_r8 = true;
167       if (kind == 16)
168         saw_r16 = true;
169
170       /* Careful we don't stumble a wierd internal mode.  */
171       gcc_assert (r_index <= 0 || gfc_real_kinds[r_index-1].kind != kind);
172       /* Or have too many modes for the allocated space.  */
173       gcc_assert (r_index != MAX_REAL_KINDS);
174
175       gfc_real_kinds[r_index].kind = kind;
176       gfc_real_kinds[r_index].radix = fmt->b;
177       gfc_real_kinds[r_index].digits = fmt->p;
178       gfc_real_kinds[r_index].min_exponent = fmt->emin;
179       gfc_real_kinds[r_index].max_exponent = fmt->emax;
180       gfc_real_kinds[r_index].mode_precision = GET_MODE_PRECISION (mode);
181       r_index += 1;
182     }
183
184   /* Choose the default integer kind.  We choose 4 unless the user
185      directs us otherwise.  */
186   if (gfc_option.i8)
187     {
188       if (!saw_i8)
189         fatal_error ("integer kind=8 not available for -i8 option");
190       gfc_default_integer_kind = 8;
191     }
192   else if (saw_i4)
193     gfc_default_integer_kind = 4;
194   else
195     gfc_default_integer_kind = gfc_integer_kinds[i_index - 1].kind;
196
197   /* Choose the default real kind.  Again, we choose 4 when possible.  */
198   if (gfc_option.r8)
199     {
200       if (!saw_r8)
201         fatal_error ("real kind=8 not available for -r8 option");
202       gfc_default_real_kind = 8;
203     }
204   else if (saw_r4)
205     gfc_default_real_kind = 4;
206   else
207     gfc_default_real_kind = gfc_real_kinds[0].kind;
208
209   /* Choose the default double kind.  If -r8 is specified, we use kind=16,
210      if it's available, otherwise we do not change anything.  */
211   if (gfc_option.r8 && saw_r16)
212     gfc_default_double_kind = 16;
213   else if (saw_r4 && saw_r8)
214     gfc_default_double_kind = 8;
215   else
216     {
217       /* F95 14.6.3.1: A nonpointer scalar object of type double precision
218          real ... occupies two contiguous numeric storage units.
219
220          Therefore we must be supplied a kind twice as large as we chose
221          for single precision.  There are loopholes, in that double
222          precision must *occupy* two storage units, though it doesn't have
223          to *use* two storage units.  Which means that you can make this
224          kind artificially wide by padding it.  But at present there are
225          no GCC targets for which a two-word type does not exist, so we
226          just let gfc_validate_kind abort and tell us if something breaks.  */
227
228       gfc_default_double_kind
229         = gfc_validate_kind (BT_REAL, gfc_default_real_kind * 2, false);
230     }
231
232   /* The default logical kind is constrained to be the same as the
233      default integer kind.  Similarly with complex and real.  */
234   gfc_default_logical_kind = gfc_default_integer_kind;
235   gfc_default_complex_kind = gfc_default_real_kind;
236
237   /* Choose the smallest integer kind for our default character.  */
238   gfc_default_character_kind = gfc_integer_kinds[0].kind;
239
240   /* Choose the integer kind the same size as "void*" for our index kind.  */
241   gfc_index_integer_kind = POINTER_SIZE / 8;
242   /* Pick a kind the same size as the C "int" type.  */
243   gfc_c_int_kind = INT_TYPE_SIZE / 8;
244 }
245
246 /* Make sure that a valid kind is present.  Returns an index into the
247    associated kinds array, -1 if the kind is not present.  */
248
249 static int
250 validate_integer (int kind)
251 {
252   int i;
253
254   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
255     if (gfc_integer_kinds[i].kind == kind)
256       return i;
257
258   return -1;
259 }
260
261 static int
262 validate_real (int kind)
263 {
264   int i;
265
266   for (i = 0; gfc_real_kinds[i].kind != 0; i++)
267     if (gfc_real_kinds[i].kind == kind)
268       return i;
269
270   return -1;
271 }
272
273 static int
274 validate_logical (int kind)
275 {
276   int i;
277
278   for (i = 0; gfc_logical_kinds[i].kind; i++)
279     if (gfc_logical_kinds[i].kind == kind)
280       return i;
281
282   return -1;
283 }
284
285 static int
286 validate_character (int kind)
287 {
288   return kind == gfc_default_character_kind ? 0 : -1;
289 }
290
291 /* Validate a kind given a basic type.  The return value is the same
292    for the child functions, with -1 indicating nonexistence of the
293    type.  If MAY_FAIL is false, then -1 is never returned, and we ICE.  */
294
295 int
296 gfc_validate_kind (bt type, int kind, bool may_fail)
297 {
298   int rc;
299
300   switch (type)
301     {
302     case BT_REAL:               /* Fall through */
303     case BT_COMPLEX:
304       rc = validate_real (kind);
305       break;
306     case BT_INTEGER:
307       rc = validate_integer (kind);
308       break;
309     case BT_LOGICAL:
310       rc = validate_logical (kind);
311       break;
312     case BT_CHARACTER:
313       rc = validate_character (kind);
314       break;
315
316     default:
317       gfc_internal_error ("gfc_validate_kind(): Got bad type");
318     }
319
320   if (rc < 0 && !may_fail)
321     gfc_internal_error ("gfc_validate_kind(): Got bad kind");
322
323   return rc;
324 }
325
326
327 /* Four subroutines of gfc_init_types.  Create type nodes for the given kind.
328    Reuse common type nodes where possible.  Recognize if the kind matches up
329    with a C type.  This will be used later in determining which routines may
330    be scarfed from libm.  */
331
332 static tree
333 gfc_build_int_type (gfc_integer_info *info)
334 {
335   int mode_precision = info->bit_size;
336
337   if (mode_precision == CHAR_TYPE_SIZE)
338     info->c_char = 1;
339   if (mode_precision == SHORT_TYPE_SIZE)
340     info->c_short = 1;
341   if (mode_precision == INT_TYPE_SIZE)
342     info->c_int = 1;
343   if (mode_precision == LONG_TYPE_SIZE)
344     info->c_long = 1;
345   if (mode_precision == LONG_LONG_TYPE_SIZE)
346     info->c_long_long = 1;
347
348   if (TYPE_PRECISION (intQI_type_node) == mode_precision)
349     return intQI_type_node;
350   if (TYPE_PRECISION (intHI_type_node) == mode_precision)
351     return intHI_type_node;
352   if (TYPE_PRECISION (intSI_type_node) == mode_precision)
353     return intSI_type_node;
354   if (TYPE_PRECISION (intDI_type_node) == mode_precision)
355     return intDI_type_node;
356   if (TYPE_PRECISION (intTI_type_node) == mode_precision)
357     return intTI_type_node;
358
359   return make_signed_type (mode_precision);
360 }
361
362 static tree
363 gfc_build_real_type (gfc_real_info *info)
364 {
365   int mode_precision = info->mode_precision;
366   tree new_type;
367
368   if (mode_precision == FLOAT_TYPE_SIZE)
369     info->c_float = 1;
370   if (mode_precision == DOUBLE_TYPE_SIZE)
371     info->c_double = 1;
372   if (mode_precision == LONG_DOUBLE_TYPE_SIZE)
373     info->c_long_double = 1;
374
375   if (TYPE_PRECISION (float_type_node) == mode_precision)
376     return float_type_node;
377   if (TYPE_PRECISION (double_type_node) == mode_precision)
378     return double_type_node;
379   if (TYPE_PRECISION (long_double_type_node) == mode_precision)
380     return long_double_type_node;
381
382   new_type = make_node (REAL_TYPE);
383   TYPE_PRECISION (new_type) = mode_precision;
384   layout_type (new_type);
385   return new_type;
386 }
387
388 static tree
389 gfc_build_complex_type (tree scalar_type)
390 {
391   tree new_type;
392
393   if (scalar_type == NULL)
394     return NULL;
395   if (scalar_type == float_type_node)
396     return complex_float_type_node;
397   if (scalar_type == double_type_node)
398     return complex_double_type_node;
399   if (scalar_type == long_double_type_node)
400     return complex_long_double_type_node;
401
402   new_type = make_node (COMPLEX_TYPE);
403   TREE_TYPE (new_type) = scalar_type;
404   layout_type (new_type);
405   return new_type;
406 }
407
408 static tree
409 gfc_build_logical_type (gfc_logical_info *info)
410 {
411   int bit_size = info->bit_size;
412   tree new_type;
413
414   if (bit_size == BOOL_TYPE_SIZE)
415     {
416       info->c_bool = 1;
417       return boolean_type_node;
418     }
419
420   new_type = make_unsigned_type (bit_size);
421   TREE_SET_CODE (new_type, BOOLEAN_TYPE);
422   TYPE_MAX_VALUE (new_type) = build_int_cst (new_type, 1);
423   TYPE_PRECISION (new_type) = 1;
424
425   return new_type;
426 }
427
428 #if 0
429 /* Return the bit size of the C "size_t".  */
430
431 static unsigned int
432 c_size_t_size (void)
433 {
434 #ifdef SIZE_TYPE  
435   if (strcmp (SIZE_TYPE, "unsigned int") == 0)
436     return INT_TYPE_SIZE;
437   if (strcmp (SIZE_TYPE, "long unsigned int") == 0)
438     return LONG_TYPE_SIZE;
439   if (strcmp (SIZE_TYPE, "short unsigned int") == 0)
440     return SHORT_TYPE_SIZE;
441   gcc_unreachable ();
442 #else
443   return LONG_TYPE_SIZE;
444 #endif
445 }
446 #endif
447
448 /* Create the backend type nodes. We map them to their
449    equivalent C type, at least for now.  We also give
450    names to the types here, and we push them in the
451    global binding level context.*/
452
453 void
454 gfc_init_types (void)
455 {
456   char name_buf[16];
457   int index;
458   tree type;
459   unsigned n;
460   unsigned HOST_WIDE_INT hi;
461   unsigned HOST_WIDE_INT lo;
462
463   /* Create and name the types.  */
464 #define PUSH_TYPE(name, node) \
465   pushdecl (build_decl (TYPE_DECL, get_identifier (name), node))
466
467   for (index = 0; gfc_integer_kinds[index].kind != 0; ++index)
468     {
469       type = gfc_build_int_type (&gfc_integer_kinds[index]);
470       gfc_integer_types[index] = type;
471       snprintf (name_buf, sizeof(name_buf), "int%d",
472                 gfc_integer_kinds[index].kind);
473       PUSH_TYPE (name_buf, type);
474     }
475
476   for (index = 0; gfc_logical_kinds[index].kind != 0; ++index)
477     {
478       type = gfc_build_logical_type (&gfc_logical_kinds[index]);
479       gfc_logical_types[index] = type;
480       snprintf (name_buf, sizeof(name_buf), "logical%d",
481                 gfc_logical_kinds[index].kind);
482       PUSH_TYPE (name_buf, type);
483     }
484
485   for (index = 0; gfc_real_kinds[index].kind != 0; index++)
486     {
487       type = gfc_build_real_type (&gfc_real_kinds[index]);
488       gfc_real_types[index] = type;
489       snprintf (name_buf, sizeof(name_buf), "real%d",
490                 gfc_real_kinds[index].kind);
491       PUSH_TYPE (name_buf, type);
492
493       type = gfc_build_complex_type (type);
494       gfc_complex_types[index] = type;
495       snprintf (name_buf, sizeof(name_buf), "complex%d",
496                 gfc_real_kinds[index].kind);
497       PUSH_TYPE (name_buf, type);
498     }
499
500   gfc_character1_type_node = build_type_variant (unsigned_char_type_node, 
501                                                  0, 0);
502   PUSH_TYPE ("char", gfc_character1_type_node);
503
504   PUSH_TYPE ("byte", unsigned_char_type_node);
505   PUSH_TYPE ("void", void_type_node);
506
507   /* DBX debugging output gets upset if these aren't set.  */
508   if (!TYPE_NAME (integer_type_node))
509     PUSH_TYPE ("c_integer", integer_type_node);
510   if (!TYPE_NAME (char_type_node))
511     PUSH_TYPE ("c_char", char_type_node);
512
513 #undef PUSH_TYPE
514
515   pvoid_type_node = build_pointer_type (void_type_node);
516   ppvoid_type_node = build_pointer_type (pvoid_type_node);
517   pchar_type_node = build_pointer_type (gfc_character1_type_node);
518
519   gfc_array_index_type = gfc_get_int_type (gfc_index_integer_kind);
520
521   /* The maximum array element size that can be handled is determined
522      by the number of bits available to store this field in the array
523      descriptor.  */
524
525   n = TYPE_PRECISION (gfc_array_index_type) - GFC_DTYPE_SIZE_SHIFT;
526   lo = ~ (unsigned HOST_WIDE_INT) 0;
527   if (n > HOST_BITS_PER_WIDE_INT)
528     hi = lo >> (2*HOST_BITS_PER_WIDE_INT - n);
529   else
530     hi = 0, lo >>= HOST_BITS_PER_WIDE_INT - n;
531   gfc_max_array_element_size
532     = build_int_cst_wide (long_unsigned_type_node, lo, hi);
533
534   size_type_node = gfc_array_index_type;
535
536   boolean_type_node = gfc_get_logical_type (gfc_default_logical_kind);
537   boolean_true_node = build_int_cst (boolean_type_node, 1);
538   boolean_false_node = build_int_cst (boolean_type_node, 0);
539
540   /* ??? Shouldn't this be based on gfc_index_integer_kind or so?  */
541   gfc_charlen_type_node = gfc_get_int_type (4);
542 }
543
544 /* Get the type node for the given type and kind.  */
545
546 tree
547 gfc_get_int_type (int kind)
548 {
549   int index = gfc_validate_kind (BT_INTEGER, kind, false);
550   return gfc_integer_types[index];
551 }
552
553 tree
554 gfc_get_real_type (int kind)
555 {
556   int index = gfc_validate_kind (BT_REAL, kind, false);
557   return gfc_real_types[index];
558 }
559
560 tree
561 gfc_get_complex_type (int kind)
562 {
563   int index = gfc_validate_kind (BT_COMPLEX, kind, false);
564   return gfc_complex_types[index];
565 }
566
567 tree
568 gfc_get_logical_type (int kind)
569 {
570   int index = gfc_validate_kind (BT_LOGICAL, kind, false);
571   return gfc_logical_types[index];
572 }
573 \f
574 /* Create a character type with the given kind and length.  */
575
576 tree
577 gfc_get_character_type_len (int kind, tree len)
578 {
579   tree bounds, type;
580
581   gfc_validate_kind (BT_CHARACTER, kind, false);
582
583   bounds = build_range_type (gfc_array_index_type, gfc_index_one_node, len);
584   type = build_array_type (gfc_character1_type_node, bounds);
585   TYPE_STRING_FLAG (type) = 1;
586
587   return type;
588 }
589
590
591 /* Get a type node for a character kind.  */
592
593 tree
594 gfc_get_character_type (int kind, gfc_charlen * cl)
595 {
596   tree len;
597
598   len = (cl == NULL) ? NULL_TREE : cl->backend_decl;
599
600   return gfc_get_character_type_len (kind, len);
601 }
602 \f
603 /* Covert a basic type.  This will be an array for character types.  */
604
605 tree
606 gfc_typenode_for_spec (gfc_typespec * spec)
607 {
608   tree basetype;
609
610   switch (spec->type)
611     {
612     case BT_UNKNOWN:
613       gcc_unreachable ();
614
615     case BT_INTEGER:
616       basetype = gfc_get_int_type (spec->kind);
617       break;
618
619     case BT_REAL:
620       basetype = gfc_get_real_type (spec->kind);
621       break;
622
623     case BT_COMPLEX:
624       basetype = gfc_get_complex_type (spec->kind);
625       break;
626
627     case BT_LOGICAL:
628       basetype = gfc_get_logical_type (spec->kind);
629       break;
630
631     case BT_CHARACTER:
632       basetype = gfc_get_character_type (spec->kind, spec->cl);
633       break;
634
635     case BT_DERIVED:
636       basetype = gfc_get_derived_type (spec->derived);
637       break;
638
639     default:
640       gcc_unreachable ();
641     }
642   return basetype;
643 }
644 \f
645 /* Build an INT_CST for constant expressions, otherwise return NULL_TREE.  */
646
647 static tree
648 gfc_conv_array_bound (gfc_expr * expr)
649 {
650   /* If expr is an integer constant, return that.  */
651   if (expr != NULL && expr->expr_type == EXPR_CONSTANT)
652     return gfc_conv_mpz_to_tree (expr->value.integer, gfc_index_integer_kind);
653
654   /* Otherwise return NULL.  */
655   return NULL_TREE;
656 }
657 \f
658 tree
659 gfc_get_element_type (tree type)
660 {
661   tree element;
662
663   if (GFC_ARRAY_TYPE_P (type))
664     {
665       if (TREE_CODE (type) == POINTER_TYPE)
666         type = TREE_TYPE (type);
667       gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
668       element = TREE_TYPE (type);
669     }
670   else
671     {
672       gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
673       element = TREE_TYPE (TYPE_FIELDS (type));
674
675       gcc_assert (TREE_CODE (element) == POINTER_TYPE);
676       element = TREE_TYPE (element);
677
678       gcc_assert (TREE_CODE (element) == ARRAY_TYPE);
679       element = TREE_TYPE (element);
680     }
681
682   return element;
683 }
684 \f
685 /* Build an array. This function is called from gfc_sym_type().
686    Actually returns array descriptor type.
687
688    Format of array descriptors is as follows:
689
690     struct gfc_array_descriptor
691     {
692       array *data
693       index offset;
694       index dtype;
695       struct descriptor_dimension dimension[N_DIM];
696     }
697
698     struct descriptor_dimension
699     {
700       index stride;
701       index lbound;
702       index ubound;
703     }
704
705    Translation code should use gfc_conv_descriptor_* rather than accessing
706    the descriptor directly. Any changes to the array descriptor type will
707    require changes in gfc_conv_descriptor_* and gfc_build_array_initializer.
708
709    This is represented internally as a RECORD_TYPE. The index nodes are
710    gfc_array_index_type and the data node is a pointer to the data. See below
711    for the handling of character types.
712
713    The dtype member is formatted as follows:
714     rank = dtype & GFC_DTYPE_RANK_MASK // 3 bits
715     type = (dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT // 3 bits
716     size = dtype >> GFC_DTYPE_SIZE_SHIFT
717
718    I originally used nested ARRAY_TYPE nodes to represent arrays, but this
719    generated poor code for assumed/deferred size arrays.  These require
720    use of PLACEHOLDER_EXPR/WITH_RECORD_EXPR, which isn't part of the GENERIC
721    grammar.  Also, there is no way to explicitly set the array stride, so
722    all data must be packed(1).  I've tried to mark all the functions which
723    would require modification with a GCC ARRAYS comment.
724
725    The data component points to the first element in the array.
726    The offset field is the position of the origin of the array
727    (ie element (0, 0 ...)).  This may be outsite the bounds of the array.
728
729    An element is accessed by
730    data[offset + index0*stride0 + index1*stride1 + index2*stride2]
731    This gives good performance as the computation does not involve the
732    bounds of the array.  For packed arrays, this is optimized further by
733    substituting the known strides.
734
735    This system has one problem: all array bounds must be withing 2^31 elements
736    of the origin (2^63 on 64-bit machines).  For example
737    integer, dimension (80000:90000, 80000:90000, 2) :: array
738    may not work properly on 32-bit machines because 80000*80000 > 2^31, so
739    the calculation for stride02 would overflow.  This may still work, but
740    I haven't checked, and it relies on the overflow doing the right thing.
741
742    The way to fix this problem is to access elements as follows:
743    data[(index0-lbound0)*stride0 + (index1-lbound1)*stride1]
744    Obviously this is much slower.  I will make this a compile time option,
745    something like -fsmall-array-offsets.  Mixing code compiled with and without
746    this switch will work.
747
748    (1) This can be worked around by modifying the upper bound of the previous
749    dimension.  This requires extra fields in the descriptor (both real_ubound
750    and fake_ubound).  In tree.def there is mention of TYPE_SEP, which
751    may allow us to do this.  However I can't find mention of this anywhere
752    else.  */
753
754
755 /* Returns true if the array sym does not require a descriptor.  */
756
757 int
758 gfc_is_nodesc_array (gfc_symbol * sym)
759 {
760   gcc_assert (sym->attr.dimension);
761
762   /* We only want local arrays.  */
763   if (sym->attr.pointer || sym->attr.allocatable)
764     return 0;
765
766   if (sym->attr.dummy)
767     {
768       if (sym->as->type != AS_ASSUMED_SHAPE)
769         return 1;
770       else
771         return 0;
772     }
773
774   if (sym->attr.result || sym->attr.function)
775     return 0;
776
777   if (sym->attr.pointer || sym->attr.allocatable)
778     return 0;
779
780   gcc_assert (sym->as->type == AS_EXPLICIT);
781
782   return 1;
783 }
784
785
786 /* Create an array descriptor type.  */
787
788 static tree
789 gfc_build_array_type (tree type, gfc_array_spec * as)
790 {
791   tree lbound[GFC_MAX_DIMENSIONS];
792   tree ubound[GFC_MAX_DIMENSIONS];
793   int n;
794
795   for (n = 0; n < as->rank; n++)
796     {
797       /* Create expressions for the known bounds of the array.  */
798       if (as->type == AS_ASSUMED_SHAPE && as->lower[n] == NULL)
799         lbound[n] = gfc_index_one_node;
800       else
801         lbound[n] = gfc_conv_array_bound (as->lower[n]);
802       ubound[n] = gfc_conv_array_bound (as->upper[n]);
803     }
804
805   return gfc_get_array_type_bounds (type, as->rank, lbound, ubound, 0);
806 }
807 \f
808 /* Returns the struct descriptor_dimension type.  */
809
810 static tree
811 gfc_get_desc_dim_type (void)
812 {
813   tree type;
814   tree decl;
815   tree fieldlist;
816
817   if (gfc_desc_dim_type)
818     return gfc_desc_dim_type;
819
820   /* Build the type node.  */
821   type = make_node (RECORD_TYPE);
822
823   TYPE_NAME (type) = get_identifier ("descriptor_dimension");
824   TYPE_PACKED (type) = 1;
825
826   /* Consists of the stride, lbound and ubound members.  */
827   decl = build_decl (FIELD_DECL,
828                      get_identifier ("stride"), gfc_array_index_type);
829   DECL_CONTEXT (decl) = type;
830   fieldlist = decl;
831
832   decl = build_decl (FIELD_DECL,
833                      get_identifier ("lbound"), gfc_array_index_type);
834   DECL_CONTEXT (decl) = type;
835   fieldlist = chainon (fieldlist, decl);
836
837   decl = build_decl (FIELD_DECL,
838                      get_identifier ("ubound"), gfc_array_index_type);
839   DECL_CONTEXT (decl) = type;
840   fieldlist = chainon (fieldlist, decl);
841
842   /* Finish off the type.  */
843   TYPE_FIELDS (type) = fieldlist;
844
845   gfc_finish_type (type);
846
847   gfc_desc_dim_type = type;
848   return type;
849 }
850
851 static tree
852 gfc_get_dtype (tree type, int rank)
853 {
854   tree size;
855   int n;
856   HOST_WIDE_INT i;
857   tree tmp;
858   tree dtype;
859
860   if (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type))
861     return (GFC_TYPE_ARRAY_DTYPE (type));
862
863   /* TODO: Correctly identify LOGICAL types.  */
864   switch (TREE_CODE (type))
865     {
866     case INTEGER_TYPE:
867       n = GFC_DTYPE_INTEGER;
868       break;
869
870     case BOOLEAN_TYPE:
871       n = GFC_DTYPE_LOGICAL;
872       break;
873
874     case REAL_TYPE:
875       n = GFC_DTYPE_REAL;
876       break;
877
878     case COMPLEX_TYPE:
879       n = GFC_DTYPE_COMPLEX;
880       break;
881
882     /* Arrays have already been dealt with.  */
883     case RECORD_TYPE:
884       n = GFC_DTYPE_DERIVED;
885       break;
886
887     case ARRAY_TYPE:
888       n = GFC_DTYPE_CHARACTER;
889       break;
890
891     default:
892       /* TODO: Don't do dtype for temporary descriptorless arrays.  */
893       /* We can strange array types for temporary arrays.  */
894       return gfc_index_zero_node;
895     }
896
897   gcc_assert (rank <= GFC_DTYPE_RANK_MASK);
898   size = TYPE_SIZE_UNIT (type);
899
900   i = rank | (n << GFC_DTYPE_TYPE_SHIFT);
901   if (size && INTEGER_CST_P (size))
902     {
903       if (tree_int_cst_lt (gfc_max_array_element_size, size))
904         internal_error ("Array element size too big");
905
906       i += TREE_INT_CST_LOW (size) << GFC_DTYPE_SIZE_SHIFT;
907     }
908   dtype = build_int_cst (gfc_array_index_type, i);
909
910   if (size && !INTEGER_CST_P (size))
911     {
912       tmp = build_int_cst (gfc_array_index_type, GFC_DTYPE_SIZE_SHIFT);
913       tmp  = fold (build2 (LSHIFT_EXPR, gfc_array_index_type, size, tmp));
914       dtype = fold (build2 (PLUS_EXPR, gfc_array_index_type, tmp, dtype));
915     }
916   /* If we don't know the size we leave it as zero.  This should never happen
917      for anything that is actually used.  */
918   /* TODO: Check this is actually true, particularly when repacking
919      assumed size parameters.  */
920
921   return dtype;
922 }
923
924
925 /* Build an array type for use without a descriptor.  Valid values of packed
926    are 0=no, 1=partial, 2=full, 3=static.  */
927
928 tree
929 gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, int packed)
930 {
931   tree range;
932   tree type;
933   tree tmp;
934   int n;
935   int known_stride;
936   int known_offset;
937   mpz_t offset;
938   mpz_t stride;
939   mpz_t delta;
940   gfc_expr *expr;
941
942   mpz_init_set_ui (offset, 0);
943   mpz_init_set_ui (stride, 1);
944   mpz_init (delta);
945
946   /* We don't use build_array_type because this does not include include
947      lang-specific information (i.e. the bounds of the array) when checking
948      for duplicates.  */
949   type = make_node (ARRAY_TYPE);
950
951   GFC_ARRAY_TYPE_P (type) = 1;
952   TYPE_LANG_SPECIFIC (type) = (struct lang_type *)
953     ggc_alloc_cleared (sizeof (struct lang_type));
954
955   known_stride = (packed != 0);
956   known_offset = 1;
957   for (n = 0; n < as->rank; n++)
958     {
959       /* Fill in the stride and bound components of the type.  */
960       if (known_stride)
961         tmp =  gfc_conv_mpz_to_tree (stride, gfc_index_integer_kind);
962       else
963         tmp = NULL_TREE;
964       GFC_TYPE_ARRAY_STRIDE (type, n) = tmp;
965
966       expr = as->lower[n];
967       if (expr->expr_type == EXPR_CONSTANT)
968         {
969           tmp = gfc_conv_mpz_to_tree (expr->value.integer,
970                                   gfc_index_integer_kind);
971         }
972       else
973         {
974           known_stride = 0;
975           tmp = NULL_TREE;
976         }
977       GFC_TYPE_ARRAY_LBOUND (type, n) = tmp;
978
979       if (known_stride)
980         {
981           /* Calculate the offset.  */
982           mpz_mul (delta, stride, as->lower[n]->value.integer);
983           mpz_sub (offset, offset, delta);
984         }
985       else
986         known_offset = 0;
987
988       expr = as->upper[n];
989       if (expr && expr->expr_type == EXPR_CONSTANT)
990         {
991           tmp = gfc_conv_mpz_to_tree (expr->value.integer,
992                                   gfc_index_integer_kind);
993         }
994       else
995         {
996           tmp = NULL_TREE;
997           known_stride = 0;
998         }
999       GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1000
1001       if (known_stride)
1002         {
1003           /* Calculate the stride.  */
1004           mpz_sub (delta, as->upper[n]->value.integer,
1005                    as->lower[n]->value.integer);
1006           mpz_add_ui (delta, delta, 1);
1007           mpz_mul (stride, stride, delta);
1008         }
1009
1010       /* Only the first stride is known for partial packed arrays.  */
1011       if (packed < 2)
1012         known_stride = 0;
1013     }
1014
1015   if (known_offset)
1016     {
1017       GFC_TYPE_ARRAY_OFFSET (type) =
1018         gfc_conv_mpz_to_tree (offset, gfc_index_integer_kind);
1019     }
1020   else
1021     GFC_TYPE_ARRAY_OFFSET (type) = NULL_TREE;
1022
1023   if (known_stride)
1024     {
1025       GFC_TYPE_ARRAY_SIZE (type) =
1026         gfc_conv_mpz_to_tree (stride, gfc_index_integer_kind);
1027     }
1028   else
1029     GFC_TYPE_ARRAY_SIZE (type) = NULL_TREE;
1030
1031   GFC_TYPE_ARRAY_DTYPE (type) = gfc_get_dtype (etype, as->rank);
1032   GFC_TYPE_ARRAY_RANK (type) = as->rank;
1033   range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
1034                             NULL_TREE);
1035   /* TODO: use main type if it is unbounded.  */
1036   GFC_TYPE_ARRAY_DATAPTR_TYPE (type) =
1037     build_pointer_type (build_array_type (etype, range));
1038
1039   if (known_stride)
1040     {
1041       mpz_sub_ui (stride, stride, 1);
1042       range = gfc_conv_mpz_to_tree (stride, gfc_index_integer_kind);
1043     }
1044   else
1045     range = NULL_TREE;
1046
1047   range = build_range_type (gfc_array_index_type, gfc_index_zero_node, range);
1048   TYPE_DOMAIN (type) = range;
1049
1050   build_pointer_type (etype);
1051   TREE_TYPE (type) = etype;
1052
1053   layout_type (type);
1054
1055   mpz_clear (offset);
1056   mpz_clear (stride);
1057   mpz_clear (delta);
1058
1059   if (packed < 3 || !known_stride)
1060     {
1061       /* For dummy arrays and automatic (heap allocated) arrays we
1062          want a pointer to the array.  */
1063       type = build_pointer_type (type);
1064       GFC_ARRAY_TYPE_P (type) = 1;
1065       TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type));
1066     }
1067   return type;
1068 }
1069
1070
1071 /* Build an array (descriptor) type with given bounds.  */
1072
1073 tree
1074 gfc_get_array_type_bounds (tree etype, int dimen, tree * lbound,
1075                            tree * ubound, int packed)
1076 {
1077   tree fat_type, fat_pointer_type;
1078   tree fieldlist;
1079   tree arraytype;
1080   tree decl;
1081   int n;
1082   char name[8 + GFC_RANK_DIGITS + GFC_MAX_SYMBOL_LEN];
1083   const char *typename;
1084   tree lower;
1085   tree upper;
1086   tree stride;
1087   tree tmp;
1088
1089   /* Build the type node.  */
1090   fat_type = make_node (RECORD_TYPE);
1091   GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
1092   TYPE_LANG_SPECIFIC (fat_type) = (struct lang_type *)
1093     ggc_alloc_cleared (sizeof (struct lang_type));
1094   GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
1095   GFC_TYPE_ARRAY_DTYPE (fat_type) = gfc_get_dtype (etype, dimen);
1096
1097   tmp = TYPE_NAME (etype);
1098   if (tmp && TREE_CODE (tmp) == TYPE_DECL)
1099     tmp = DECL_NAME (tmp);
1100   if (tmp)
1101     typename = IDENTIFIER_POINTER (tmp);
1102   else
1103     typename = "unknown";
1104
1105   sprintf (name, "array" GFC_RANK_PRINTF_FORMAT "_%.*s", dimen,
1106            GFC_MAX_SYMBOL_LEN, typename);
1107   TYPE_NAME (fat_type) = get_identifier (name);
1108   TYPE_PACKED (fat_type) = 0;
1109
1110   fat_pointer_type = build_pointer_type (fat_type);
1111
1112   /* Build an array descriptor record type.  */
1113   if (packed != 0)
1114     stride = gfc_index_one_node;
1115   else
1116     stride = NULL_TREE;
1117
1118   for (n = 0; n < dimen; n++)
1119     {
1120       GFC_TYPE_ARRAY_STRIDE (fat_type, n) = stride;
1121
1122       if (lbound)
1123         lower = lbound[n];
1124       else
1125         lower = NULL_TREE;
1126
1127       if (lower != NULL_TREE)
1128         {
1129           if (INTEGER_CST_P (lower))
1130             GFC_TYPE_ARRAY_LBOUND (fat_type, n) = lower;
1131           else
1132             lower = NULL_TREE;
1133         }
1134
1135       upper = ubound[n];
1136       if (upper != NULL_TREE)
1137         {
1138           if (INTEGER_CST_P (upper))
1139             GFC_TYPE_ARRAY_UBOUND (fat_type, n) = upper;
1140           else
1141             upper = NULL_TREE;
1142         }
1143
1144       if (upper != NULL_TREE && lower != NULL_TREE && stride != NULL_TREE)
1145         {
1146           tmp = fold (build2 (MINUS_EXPR, gfc_array_index_type, upper, lower));
1147           tmp = fold (build2 (PLUS_EXPR, gfc_array_index_type, tmp,
1148                               gfc_index_one_node));
1149           stride =
1150             fold (build2 (MULT_EXPR, gfc_array_index_type, tmp, stride));
1151           /* Check the folding worked.  */
1152           gcc_assert (INTEGER_CST_P (stride));
1153         }
1154       else
1155         stride = NULL_TREE;
1156     }
1157   GFC_TYPE_ARRAY_SIZE (fat_type) = stride;
1158   /* TODO: known offsets for descriptors.  */
1159   GFC_TYPE_ARRAY_OFFSET (fat_type) = NULL_TREE;
1160
1161   /* We define data as an unknown size array. Much better than doing
1162      pointer arithmetic.  */
1163   arraytype =
1164     build_array_type (etype,
1165                       build_range_type (gfc_array_index_type,
1166                                         gfc_index_zero_node, NULL_TREE));
1167   arraytype = build_pointer_type (arraytype);
1168   GFC_TYPE_ARRAY_DATAPTR_TYPE (fat_type) = arraytype;
1169
1170   /* The pointer to the array data.  */
1171   decl = build_decl (FIELD_DECL, get_identifier ("data"), arraytype);
1172
1173   DECL_CONTEXT (decl) = fat_type;
1174   /* Add the data member as the first element of the descriptor.  */
1175   fieldlist = decl;
1176
1177   /* Add the base component.  */
1178   decl = build_decl (FIELD_DECL, get_identifier ("offset"),
1179                      gfc_array_index_type);
1180   DECL_CONTEXT (decl) = fat_type;
1181   fieldlist = chainon (fieldlist, decl);
1182
1183   /* Add the dtype component.  */
1184   decl = build_decl (FIELD_DECL, get_identifier ("dtype"),
1185                      gfc_array_index_type);
1186   DECL_CONTEXT (decl) = fat_type;
1187   fieldlist = chainon (fieldlist, decl);
1188
1189   /* Build the array type for the stride and bound components.  */
1190   arraytype =
1191     build_array_type (gfc_get_desc_dim_type (),
1192                       build_range_type (gfc_array_index_type,
1193                                         gfc_index_zero_node,
1194                                         gfc_rank_cst[dimen - 1]));
1195
1196   decl = build_decl (FIELD_DECL, get_identifier ("dim"), arraytype);
1197   DECL_CONTEXT (decl) = fat_type;
1198   DECL_INITIAL (decl) = NULL_TREE;
1199   fieldlist = chainon (fieldlist, decl);
1200
1201   /* Finish off the type.  */
1202   TYPE_FIELDS (fat_type) = fieldlist;
1203
1204   gfc_finish_type (fat_type);
1205
1206   return fat_type;
1207 }
1208 \f
1209 /* Build a pointer type. This function is called from gfc_sym_type().  */
1210
1211 static tree
1212 gfc_build_pointer_type (gfc_symbol * sym, tree type)
1213 {
1214   /* Array pointer types aren't actually pointers.  */
1215   if (sym->attr.dimension)
1216     return type;
1217   else
1218     return build_pointer_type (type);
1219 }
1220 \f
1221 /* Return the type for a symbol.  Special handling is required for character
1222    types to get the correct level of indirection.
1223    For functions return the return type.
1224    For subroutines return void_type_node.
1225    Calling this multiple times for the same symbol should be avoided,
1226    especially for character and array types.  */
1227
1228 tree
1229 gfc_sym_type (gfc_symbol * sym)
1230 {
1231   tree type;
1232   int byref;
1233
1234   if (sym->attr.flavor == FL_PROCEDURE && !sym->attr.function)
1235     return void_type_node;
1236
1237   if (sym->backend_decl)
1238     {
1239       if (sym->attr.function)
1240         return TREE_TYPE (TREE_TYPE (sym->backend_decl));
1241       else
1242         return TREE_TYPE (sym->backend_decl);
1243     }
1244
1245   /* The frontend doesn't set all the attributes for a function with an
1246      explicit result value, so we use that instead when present.  */
1247   if (sym->attr.function && sym->result)
1248     sym = sym->result;
1249
1250   type = gfc_typenode_for_spec (&sym->ts);
1251
1252   if (sym->attr.dummy && !sym->attr.function)
1253     byref = 1;
1254   else
1255     byref = 0;
1256
1257   if (sym->attr.dimension)
1258     {
1259       if (gfc_is_nodesc_array (sym))
1260         {
1261           /* If this is a character argument of unknown length, just use the
1262              base type.  */
1263           if (sym->ts.type != BT_CHARACTER
1264               || !(sym->attr.dummy || sym->attr.function || sym->attr.result)
1265               || sym->ts.cl->backend_decl)
1266             {
1267               type = gfc_get_nodesc_array_type (type, sym->as,
1268                                                 byref ? 2 : 3);
1269               byref = 0;
1270             }
1271         }
1272       else
1273         type = gfc_build_array_type (type, sym->as);
1274     }
1275   else
1276     {
1277       if (sym->attr.allocatable || sym->attr.pointer)
1278         type = gfc_build_pointer_type (sym, type);
1279     }
1280
1281   /* We currently pass all parameters by reference.
1282      See f95_get_function_decl.  For dummy function parameters return the
1283      function type.  */
1284   if (byref)
1285     {
1286       /* We must use pointer types for potentially absent variables.  The
1287          optimizers assume a reference type argument is never NULL.  */
1288       if (sym->attr.optional || sym->ns->proc_name->attr.entry_master)
1289         type = build_pointer_type (type);
1290       else
1291         type = build_reference_type (type);
1292     }
1293
1294   return (type);
1295 }
1296 \f
1297 /* Layout and output debug info for a record type.  */
1298
1299 void
1300 gfc_finish_type (tree type)
1301 {
1302   tree decl;
1303
1304   decl = build_decl (TYPE_DECL, NULL_TREE, type);
1305   TYPE_STUB_DECL (type) = decl;
1306   layout_type (type);
1307   rest_of_type_compilation (type, 1);
1308   rest_of_decl_compilation (decl, 1, 0);
1309 }
1310 \f
1311 /* Add a field of given NAME and TYPE to the context of a UNION_TYPE
1312    or RECORD_TYPE pointed to by STYPE.  The new field is chained
1313    to the fieldlist pointed to by FIELDLIST.
1314
1315    Returns a pointer to the new field.  */
1316
1317 tree
1318 gfc_add_field_to_struct (tree *fieldlist, tree context,
1319                          tree name, tree type)
1320 {
1321   tree decl;
1322
1323   decl = build_decl (FIELD_DECL, name, type);
1324
1325   DECL_CONTEXT (decl) = context;
1326   DECL_INITIAL (decl) = 0;
1327   DECL_ALIGN (decl) = 0;
1328   DECL_USER_ALIGN (decl) = 0;
1329   TREE_CHAIN (decl) = NULL_TREE;
1330   *fieldlist = chainon (*fieldlist, decl);
1331
1332   return decl;
1333 }
1334
1335
1336 /* Build a tree node for a derived type.  */
1337
1338 static tree
1339 gfc_get_derived_type (gfc_symbol * derived)
1340 {
1341   tree typenode, field, field_type, fieldlist;
1342   gfc_component *c;
1343
1344   gcc_assert (derived && derived->attr.flavor == FL_DERIVED);
1345
1346   /* derived->backend_decl != 0 means we saw it before, but its
1347      components' backend_decl may have not been built.  */
1348   if (derived->backend_decl)
1349     {
1350       /* Its components' backend_decl have been built.  */
1351       if (TYPE_FIELDS (derived->backend_decl))
1352         return derived->backend_decl;
1353       else
1354         typenode = derived->backend_decl;
1355     }
1356   else
1357     {
1358       /* We see this derived type first time, so build the type node.  */
1359       typenode = make_node (RECORD_TYPE);
1360       TYPE_NAME (typenode) = get_identifier (derived->name);
1361       TYPE_PACKED (typenode) = gfc_option.flag_pack_derived;
1362       derived->backend_decl = typenode;
1363     }
1364
1365   /* Build the type member list. Install the newly created RECORD_TYPE
1366      node as DECL_CONTEXT of each FIELD_DECL.  */
1367   fieldlist = NULL_TREE;
1368   for (c = derived->components; c; c = c->next)
1369     {
1370       if (c->ts.type == BT_DERIVED && c->pointer)
1371         {
1372           if (c->ts.derived->backend_decl)
1373             field_type = c->ts.derived->backend_decl;
1374           else
1375             {
1376               /* Build the type node.  */
1377               field_type = make_node (RECORD_TYPE);
1378               TYPE_NAME (field_type) = get_identifier (c->ts.derived->name);
1379               TYPE_PACKED (field_type) = gfc_option.flag_pack_derived;
1380               c->ts.derived->backend_decl = field_type;
1381             }
1382         }
1383       else
1384         {
1385           if (c->ts.type == BT_CHARACTER)
1386             {
1387               /* Evaluate the string length.  */
1388               gfc_conv_const_charlen (c->ts.cl);
1389               gcc_assert (c->ts.cl->backend_decl);
1390             }
1391
1392           field_type = gfc_typenode_for_spec (&c->ts);
1393         }
1394
1395       /* This returns an array descriptor type.  Initialization may be
1396          required.  */
1397       if (c->dimension)
1398         {
1399           if (c->pointer)
1400             {
1401               /* Pointers to arrays aren't actually pointer types.  The
1402                  descriptors are seperate, but the data is common.  */
1403               field_type = gfc_build_array_type (field_type, c->as);
1404             }
1405           else
1406             field_type = gfc_get_nodesc_array_type (field_type, c->as, 3);
1407         }
1408       else if (c->pointer)
1409         field_type = build_pointer_type (field_type);
1410
1411       field = gfc_add_field_to_struct (&fieldlist, typenode,
1412                                        get_identifier (c->name),
1413                                        field_type);
1414
1415       DECL_PACKED (field) |= TYPE_PACKED (typenode);
1416
1417       gcc_assert (!c->backend_decl);
1418       c->backend_decl = field;
1419     }
1420
1421   /* Now we have the final fieldlist.  Record it, then lay out the
1422      derived type, including the fields.  */
1423   TYPE_FIELDS (typenode) = fieldlist;
1424
1425   gfc_finish_type (typenode);
1426
1427   derived->backend_decl = typenode;
1428
1429   return typenode;
1430 }
1431 \f
1432 int
1433 gfc_return_by_reference (gfc_symbol * sym)
1434 {
1435   if (!sym->attr.function)
1436     return 0;
1437
1438   if (sym->result)
1439     sym = sym->result;
1440
1441   if (sym->attr.dimension)
1442     return 1;
1443
1444   if (sym->ts.type == BT_CHARACTER)
1445     return 1;
1446
1447   /* Possibly return complex numbers by reference for g77 compatibility.  */
1448   return 0;
1449 }
1450 \f
1451 tree
1452 gfc_get_function_type (gfc_symbol * sym)
1453 {
1454   tree type;
1455   tree typelist;
1456   gfc_formal_arglist *f;
1457   gfc_symbol *arg;
1458   int nstr;
1459   int alternate_return;
1460
1461   /* Make sure this symbol is a function or a subroutine.  */
1462   gcc_assert (sym->attr.flavor == FL_PROCEDURE);
1463
1464   if (sym->backend_decl)
1465     return TREE_TYPE (sym->backend_decl);
1466
1467   nstr = 0;
1468   alternate_return = 0;
1469   typelist = NULL_TREE;
1470
1471   if (sym->attr.entry_master)
1472     {
1473       /* Additional parameter for selecting an entry point.  */
1474       typelist = gfc_chainon_list (typelist, gfc_array_index_type);
1475     }
1476
1477   /* Some functions we use an extra parameter for the return value.  */
1478   if (gfc_return_by_reference (sym))
1479     {
1480       if (sym->result)
1481         arg = sym->result;
1482       else
1483         arg = sym;
1484
1485       if (arg->ts.type == BT_CHARACTER)
1486         gfc_conv_const_charlen (arg->ts.cl);
1487
1488       type = gfc_sym_type (arg);
1489       if (arg->ts.type == BT_DERIVED
1490           || arg->attr.dimension
1491           || arg->ts.type == BT_CHARACTER)
1492         type = build_reference_type (type);
1493
1494       typelist = gfc_chainon_list (typelist, type);
1495       if (arg->ts.type == BT_CHARACTER)
1496         typelist = gfc_chainon_list (typelist, gfc_charlen_type_node);
1497     }
1498
1499   /* Build the argument types for the function.  */
1500   for (f = sym->formal; f; f = f->next)
1501     {
1502       arg = f->sym;
1503       if (arg)
1504         {
1505           /* Evaluate constant character lengths here so that they can be
1506              included in the type.  */
1507           if (arg->ts.type == BT_CHARACTER)
1508             gfc_conv_const_charlen (arg->ts.cl);
1509
1510           if (arg->attr.flavor == FL_PROCEDURE)
1511             {
1512               type = gfc_get_function_type (arg);
1513               type = build_pointer_type (type);
1514             }
1515           else
1516             type = gfc_sym_type (arg);
1517
1518           /* Parameter Passing Convention
1519
1520              We currently pass all parameters by reference.
1521              Parameters with INTENT(IN) could be passed by value.
1522              The problem arises if a function is called via an implicit
1523              prototype. In this situation the INTENT is not known.
1524              For this reason all parameters to global functions must be
1525              passed by reference.  Passing by value would potentialy
1526              generate bad code.  Worse there would be no way of telling that
1527              this code was bad, except that it would give incorrect results.
1528
1529              Contained procedures could pass by value as these are never
1530              used without an explicit interface, and connot be passed as
1531              actual parameters for a dummy procedure.  */
1532           if (arg->ts.type == BT_CHARACTER)
1533             nstr++;
1534           typelist = gfc_chainon_list (typelist, type);
1535         }
1536       else
1537         {
1538           if (sym->attr.subroutine)
1539             alternate_return = 1;
1540         }
1541     }
1542
1543   /* Add hidden string length parameters.  */
1544   while (nstr--)
1545     typelist = gfc_chainon_list (typelist, gfc_charlen_type_node);
1546
1547   typelist = gfc_chainon_list (typelist, void_type_node);
1548
1549   if (alternate_return)
1550     type = integer_type_node;
1551   else if (!sym->attr.function || gfc_return_by_reference (sym))
1552     type = void_type_node;
1553   else
1554     type = gfc_sym_type (sym);
1555
1556   type = build_function_type (type, typelist);
1557
1558   return type;
1559 }
1560 \f
1561 /* Language hooks for middle-end access to type nodes.  */
1562
1563 /* Return an integer type with BITS bits of precision,
1564    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
1565
1566 tree
1567 gfc_type_for_size (unsigned bits, int unsignedp)
1568 {
1569   if (!unsignedp)
1570     {
1571       int i;
1572       for (i = 0; i <= MAX_INT_KINDS; ++i)
1573         {
1574           tree type = gfc_integer_types[i];
1575           if (type && bits == TYPE_PRECISION (type))
1576             return type;
1577         }
1578     }
1579   else
1580     {
1581       if (bits == TYPE_PRECISION (unsigned_intQI_type_node))
1582         return unsigned_intQI_type_node;
1583       if (bits == TYPE_PRECISION (unsigned_intHI_type_node))
1584         return unsigned_intHI_type_node;
1585       if (bits == TYPE_PRECISION (unsigned_intSI_type_node))
1586         return unsigned_intSI_type_node;
1587       if (bits == TYPE_PRECISION (unsigned_intDI_type_node))
1588         return unsigned_intDI_type_node;
1589       if (bits == TYPE_PRECISION (unsigned_intTI_type_node))
1590         return unsigned_intTI_type_node;
1591     }
1592
1593   return NULL_TREE;
1594 }
1595
1596 /* Return a data type that has machine mode MODE.  If the mode is an
1597    integer, then UNSIGNEDP selects between signed and unsigned types.  */
1598
1599 tree
1600 gfc_type_for_mode (enum machine_mode mode, int unsignedp)
1601 {
1602   int i;
1603   tree *base;
1604
1605   if (GET_MODE_CLASS (mode) == MODE_FLOAT)
1606     base = gfc_real_types;
1607   else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
1608     base = gfc_complex_types;
1609   else if (SCALAR_INT_MODE_P (mode))
1610     return gfc_type_for_size (GET_MODE_PRECISION (mode), unsignedp);
1611   else if (VECTOR_MODE_P (mode))
1612     {
1613       enum machine_mode inner_mode = GET_MODE_INNER (mode);
1614       tree inner_type = gfc_type_for_mode (inner_mode, unsignedp);
1615       if (inner_type != NULL_TREE)
1616         return build_vector_type_for_mode (inner_type, mode);
1617       return NULL_TREE;
1618     }
1619   else
1620     return NULL_TREE;
1621
1622   for (i = 0; i <= MAX_REAL_KINDS; ++i)
1623     {
1624       tree type = base[i];
1625       if (type && mode == TYPE_MODE (type))
1626         return type;
1627     }
1628
1629   return NULL_TREE;
1630 }
1631
1632 /* Return a type the same as TYPE except unsigned or
1633    signed according to UNSIGNEDP.  */
1634
1635 tree
1636 gfc_signed_or_unsigned_type (int unsignedp, tree type)
1637 {
1638   if (TREE_CODE (type) != INTEGER_TYPE || TYPE_UNSIGNED (type) == unsignedp)
1639     return type;
1640   else
1641     return gfc_type_for_size (TYPE_PRECISION (type), unsignedp);
1642 }
1643
1644 /* Return an unsigned type the same as TYPE in other respects.  */
1645
1646 tree
1647 gfc_unsigned_type (tree type)
1648 {
1649   return gfc_signed_or_unsigned_type (1, type);
1650 }
1651
1652 /* Return a signed type the same as TYPE in other respects.  */
1653
1654 tree
1655 gfc_signed_type (tree type)
1656 {
1657   return gfc_signed_or_unsigned_type (0, type);
1658 }
1659
1660 #include "gt-fortran-trans-types.h"