OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [fortran/] [trans-types.c] - Blame information for rev 712

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 712 jeremybenn
/* Backend support for Fortran 95 basic types and derived types.
2
   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3
   2010, 2011, 2012
4
   Free Software Foundation, Inc.
5
   Contributed by Paul Brook <paul@nowt.org>
6
   and Steven Bosscher <s.bosscher@student.tudelft.nl>
7
 
8
This file is part of GCC.
9
 
10
GCC is free software; you can redistribute it and/or modify it under
11
the terms of the GNU General Public License as published by the Free
12
Software Foundation; either version 3, or (at your option) any later
13
version.
14
 
15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16
WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18
for more details.
19
 
20
You should have received a copy of the GNU General Public License
21
along with GCC; see the file COPYING3.  If not see
22
<http://www.gnu.org/licenses/>.  */
23
 
24
/* trans-types.c -- gfortran backend types */
25
 
26
#include "config.h"
27
#include "system.h"
28
#include "coretypes.h"
29
#include "tm.h"         /* For INTMAX_TYPE, INT8_TYPE, INT16_TYPE, INT32_TYPE,
30
                           INT64_TYPE, INT_LEAST8_TYPE, INT_LEAST16_TYPE,
31
                           INT_LEAST32_TYPE, INT_LEAST64_TYPE, INT_FAST8_TYPE,
32
                           INT_FAST16_TYPE, INT_FAST32_TYPE, INT_FAST64_TYPE,
33
                           BOOL_TYPE_SIZE, BITS_PER_UNIT, POINTER_SIZE,
34
                           INT_TYPE_SIZE, CHAR_TYPE_SIZE, SHORT_TYPE_SIZE,
35
                           LONG_TYPE_SIZE, LONG_LONG_TYPE_SIZE,
36
                           FLOAT_TYPE_SIZE, DOUBLE_TYPE_SIZE,
37
                           LONG_DOUBLE_TYPE_SIZE and LIBGCC2_HAS_TF_MODE.  */
38
#include "tree.h"
39
#include "langhooks.h"  /* For iso-c-bindings.def.  */
40
#include "target.h"
41
#include "ggc.h"
42
#include "diagnostic-core.h"  /* For fatal_error.  */
43
#include "toplev.h"     /* For rest_of_decl_compilation.  */
44
#include "gfortran.h"
45
#include "trans.h"
46
#include "trans-types.h"
47
#include "trans-const.h"
48
#include "flags.h"
49
#include "dwarf2out.h"  /* For struct array_descr_info.  */
50
 
51
 
52
#if (GFC_MAX_DIMENSIONS < 10)
53
#define GFC_RANK_DIGITS 1
54
#define GFC_RANK_PRINTF_FORMAT "%01d"
55
#elif (GFC_MAX_DIMENSIONS < 100)
56
#define GFC_RANK_DIGITS 2
57
#define GFC_RANK_PRINTF_FORMAT "%02d"
58
#else
59
#error If you really need >99 dimensions, continue the sequence above...
60
#endif
61
 
62
/* array of structs so we don't have to worry about xmalloc or free */
63
CInteropKind_t c_interop_kinds_table[ISOCBINDING_NUMBER];
64
 
65
tree gfc_array_index_type;
66
tree gfc_array_range_type;
67
tree gfc_character1_type_node;
68
tree pvoid_type_node;
69
tree prvoid_type_node;
70
tree ppvoid_type_node;
71
tree pchar_type_node;
72
tree pfunc_type_node;
73
 
74
tree gfc_charlen_type_node;
75
 
76
tree float128_type_node = NULL_TREE;
77
tree complex_float128_type_node = NULL_TREE;
78
 
79
bool gfc_real16_is_float128 = false;
80
 
81
static GTY(()) tree gfc_desc_dim_type;
82
static GTY(()) tree gfc_max_array_element_size;
83
static GTY(()) tree gfc_array_descriptor_base[2 * GFC_MAX_DIMENSIONS];
84
static GTY(()) tree gfc_array_descriptor_base_caf[2 * GFC_MAX_DIMENSIONS];
85
 
86
/* Arrays for all integral and real kinds.  We'll fill this in at runtime
87
   after the target has a chance to process command-line options.  */
88
 
89
#define MAX_INT_KINDS 5
90
gfc_integer_info gfc_integer_kinds[MAX_INT_KINDS + 1];
91
gfc_logical_info gfc_logical_kinds[MAX_INT_KINDS + 1];
92
static GTY(()) tree gfc_integer_types[MAX_INT_KINDS + 1];
93
static GTY(()) tree gfc_logical_types[MAX_INT_KINDS + 1];
94
 
95
#define MAX_REAL_KINDS 5
96
gfc_real_info gfc_real_kinds[MAX_REAL_KINDS + 1];
97
static GTY(()) tree gfc_real_types[MAX_REAL_KINDS + 1];
98
static GTY(()) tree gfc_complex_types[MAX_REAL_KINDS + 1];
99
 
100
#define MAX_CHARACTER_KINDS 2
101
gfc_character_info gfc_character_kinds[MAX_CHARACTER_KINDS + 1];
102
static GTY(()) tree gfc_character_types[MAX_CHARACTER_KINDS + 1];
103
static GTY(()) tree gfc_pcharacter_types[MAX_CHARACTER_KINDS + 1];
104
 
105
static tree gfc_add_field_to_struct_1 (tree, tree, tree, tree **);
106
 
107
/* The integer kind to use for array indices.  This will be set to the
108
   proper value based on target information from the backend.  */
109
 
110
int gfc_index_integer_kind;
111
 
112
/* The default kinds of the various types.  */
113
 
114
int gfc_default_integer_kind;
115
int gfc_max_integer_kind;
116
int gfc_default_real_kind;
117
int gfc_default_double_kind;
118
int gfc_default_character_kind;
119
int gfc_default_logical_kind;
120
int gfc_default_complex_kind;
121
int gfc_c_int_kind;
122
int gfc_atomic_int_kind;
123
int gfc_atomic_logical_kind;
124
 
125
/* The kind size used for record offsets. If the target system supports
126
   kind=8, this will be set to 8, otherwise it is set to 4.  */
127
int gfc_intio_kind;
128
 
129
/* The integer kind used to store character lengths.  */
130
int gfc_charlen_int_kind;
131
 
132
/* The size of the numeric storage unit and character storage unit.  */
133
int gfc_numeric_storage_size;
134
int gfc_character_storage_size;
135
 
136
 
137
gfc_try
138
gfc_check_any_c_kind (gfc_typespec *ts)
139
{
140
  int i;
141
 
142
  for (i = 0; i < ISOCBINDING_NUMBER; i++)
143
    {
144
      /* Check for any C interoperable kind for the given type/kind in ts.
145
         This can be used after verify_c_interop to make sure that the
146
         Fortran kind being used exists in at least some form for C.  */
147
      if (c_interop_kinds_table[i].f90_type == ts->type &&
148
          c_interop_kinds_table[i].value == ts->kind)
149
        return SUCCESS;
150
    }
151
 
152
  return FAILURE;
153
}
154
 
155
 
156
static int
157
get_real_kind_from_node (tree type)
158
{
159
  int i;
160
 
161
  for (i = 0; gfc_real_kinds[i].kind != 0; i++)
162
    if (gfc_real_kinds[i].mode_precision == TYPE_PRECISION (type))
163
      return gfc_real_kinds[i].kind;
164
 
165
  return -4;
166
}
167
 
168
static int
169
get_int_kind_from_node (tree type)
170
{
171
  int i;
172
 
173
  if (!type)
174
    return -2;
175
 
176
  for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
177
    if (gfc_integer_kinds[i].bit_size == TYPE_PRECISION (type))
178
      return gfc_integer_kinds[i].kind;
179
 
180
  return -1;
181
}
182
 
183
/* Return a typenode for the "standard" C type with a given name.  */
184
static tree
185
get_typenode_from_name (const char *name)
186
{
187
  if (name == NULL || *name == '\0')
188
    return NULL_TREE;
189
 
190
  if (strcmp (name, "char") == 0)
191
    return char_type_node;
192
  if (strcmp (name, "unsigned char") == 0)
193
    return unsigned_char_type_node;
194
  if (strcmp (name, "signed char") == 0)
195
    return signed_char_type_node;
196
 
197
  if (strcmp (name, "short int") == 0)
198
    return short_integer_type_node;
199
  if (strcmp (name, "short unsigned int") == 0)
200
    return short_unsigned_type_node;
201
 
202
  if (strcmp (name, "int") == 0)
203
    return integer_type_node;
204
  if (strcmp (name, "unsigned int") == 0)
205
    return unsigned_type_node;
206
 
207
  if (strcmp (name, "long int") == 0)
208
    return long_integer_type_node;
209
  if (strcmp (name, "long unsigned int") == 0)
210
    return long_unsigned_type_node;
211
 
212
  if (strcmp (name, "long long int") == 0)
213
    return long_long_integer_type_node;
214
  if (strcmp (name, "long long unsigned int") == 0)
215
    return long_long_unsigned_type_node;
216
 
217
  gcc_unreachable ();
218
}
219
 
220
static int
221
get_int_kind_from_name (const char *name)
222
{
223
  return get_int_kind_from_node (get_typenode_from_name (name));
224
}
225
 
226
 
227
/* Get the kind number corresponding to an integer of given size,
228
   following the required return values for ISO_FORTRAN_ENV INT* constants:
229
   -2 is returned if we support a kind of larger size, -1 otherwise.  */
230
int
231
gfc_get_int_kind_from_width_isofortranenv (int size)
232
{
233
  int i;
234
 
235
  /* Look for a kind with matching storage size.  */
236
  for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
237
    if (gfc_integer_kinds[i].bit_size == size)
238
      return gfc_integer_kinds[i].kind;
239
 
240
  /* Look for a kind with larger storage size.  */
241
  for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
242
    if (gfc_integer_kinds[i].bit_size > size)
243
      return -2;
244
 
245
  return -1;
246
}
247
 
248
/* Get the kind number corresponding to a real of given storage size,
249
   following the required return values for ISO_FORTRAN_ENV REAL* constants:
250
   -2 is returned if we support a kind of larger size, -1 otherwise.  */
251
int
252
gfc_get_real_kind_from_width_isofortranenv (int size)
253
{
254
  int i;
255
 
256
  size /= 8;
257
 
258
  /* Look for a kind with matching storage size.  */
259
  for (i = 0; gfc_real_kinds[i].kind != 0; i++)
260
    if (int_size_in_bytes (gfc_get_real_type (gfc_real_kinds[i].kind)) == size)
261
      return gfc_real_kinds[i].kind;
262
 
263
  /* Look for a kind with larger storage size.  */
264
  for (i = 0; gfc_real_kinds[i].kind != 0; i++)
265
    if (int_size_in_bytes (gfc_get_real_type (gfc_real_kinds[i].kind)) > size)
266
      return -2;
267
 
268
  return -1;
269
}
270
 
271
 
272
 
273
static int
274
get_int_kind_from_width (int size)
275
{
276
  int i;
277
 
278
  for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
279
    if (gfc_integer_kinds[i].bit_size == size)
280
      return gfc_integer_kinds[i].kind;
281
 
282
  return -2;
283
}
284
 
285
static int
286
get_int_kind_from_minimal_width (int size)
287
{
288
  int i;
289
 
290
  for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
291
    if (gfc_integer_kinds[i].bit_size >= size)
292
      return gfc_integer_kinds[i].kind;
293
 
294
  return -2;
295
}
296
 
297
 
298
/* Generate the CInteropKind_t objects for the C interoperable
299
   kinds.  */
300
 
301
void
302
gfc_init_c_interop_kinds (void)
303
{
304
  int i;
305
 
306
  /* init all pointers in the list to NULL */
307
  for (i = 0; i < ISOCBINDING_NUMBER; i++)
308
    {
309
      /* Initialize the name and value fields.  */
310
      c_interop_kinds_table[i].name[0] = '\0';
311
      c_interop_kinds_table[i].value = -100;
312
      c_interop_kinds_table[i].f90_type = BT_UNKNOWN;
313
    }
314
 
315
#define NAMED_INTCST(a,b,c,d) \
316
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
317
  c_interop_kinds_table[a].f90_type = BT_INTEGER; \
318
  c_interop_kinds_table[a].value = c;
319
#define NAMED_REALCST(a,b,c,d) \
320
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
321
  c_interop_kinds_table[a].f90_type = BT_REAL; \
322
  c_interop_kinds_table[a].value = c;
323
#define NAMED_CMPXCST(a,b,c,d) \
324
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
325
  c_interop_kinds_table[a].f90_type = BT_COMPLEX; \
326
  c_interop_kinds_table[a].value = c;
327
#define NAMED_LOGCST(a,b,c) \
328
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
329
  c_interop_kinds_table[a].f90_type = BT_LOGICAL; \
330
  c_interop_kinds_table[a].value = c;
331
#define NAMED_CHARKNDCST(a,b,c) \
332
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
333
  c_interop_kinds_table[a].f90_type = BT_CHARACTER; \
334
  c_interop_kinds_table[a].value = c;
335
#define NAMED_CHARCST(a,b,c) \
336
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
337
  c_interop_kinds_table[a].f90_type = BT_CHARACTER; \
338
  c_interop_kinds_table[a].value = c;
339
#define DERIVED_TYPE(a,b,c) \
340
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
341
  c_interop_kinds_table[a].f90_type = BT_DERIVED; \
342
  c_interop_kinds_table[a].value = c;
343
#define PROCEDURE(a,b) \
344
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
345
  c_interop_kinds_table[a].f90_type = BT_PROCEDURE; \
346
  c_interop_kinds_table[a].value = 0;
347
#include "iso-c-binding.def"
348
#define NAMED_FUNCTION(a,b,c,d) \
349
  strncpy (c_interop_kinds_table[a].name, b, strlen(b) + 1); \
350
  c_interop_kinds_table[a].f90_type = BT_PROCEDURE; \
351
  c_interop_kinds_table[a].value = c;
352
#include "iso-c-binding.def"
353
}
354
 
355
 
356
/* Query the target to determine which machine modes are available for
357
   computation.  Choose KIND numbers for them.  */
358
 
359
void
360
gfc_init_kinds (void)
361
{
362
  unsigned int mode;
363
  int i_index, r_index, kind;
364
  bool saw_i4 = false, saw_i8 = false;
365
  bool saw_r4 = false, saw_r8 = false, saw_r10 = false, saw_r16 = false;
366
 
367
  for (i_index = 0, mode = MIN_MODE_INT; mode <= MAX_MODE_INT; mode++)
368
    {
369
      int kind, bitsize;
370
 
371
      if (!targetm.scalar_mode_supported_p ((enum machine_mode) mode))
372
        continue;
373
 
374
      /* The middle end doesn't support constants larger than 2*HWI.
375
         Perhaps the target hook shouldn't have accepted these either,
376
         but just to be safe...  */
377
      bitsize = GET_MODE_BITSIZE (mode);
378
      if (bitsize > 2*HOST_BITS_PER_WIDE_INT)
379
        continue;
380
 
381
      gcc_assert (i_index != MAX_INT_KINDS);
382
 
383
      /* Let the kind equal the bit size divided by 8.  This insulates the
384
         programmer from the underlying byte size.  */
385
      kind = bitsize / 8;
386
 
387
      if (kind == 4)
388
        saw_i4 = true;
389
      if (kind == 8)
390
        saw_i8 = true;
391
 
392
      gfc_integer_kinds[i_index].kind = kind;
393
      gfc_integer_kinds[i_index].radix = 2;
394
      gfc_integer_kinds[i_index].digits = bitsize - 1;
395
      gfc_integer_kinds[i_index].bit_size = bitsize;
396
 
397
      gfc_logical_kinds[i_index].kind = kind;
398
      gfc_logical_kinds[i_index].bit_size = bitsize;
399
 
400
      i_index += 1;
401
    }
402
 
403
  /* Set the kind used to match GFC_INT_IO in libgfortran.  This is
404
     used for large file access.  */
405
 
406
  if (saw_i8)
407
    gfc_intio_kind = 8;
408
  else
409
    gfc_intio_kind = 4;
410
 
411
  /* If we do not at least have kind = 4, everything is pointless.  */
412
  gcc_assert(saw_i4);
413
 
414
  /* Set the maximum integer kind.  Used with at least BOZ constants.  */
415
  gfc_max_integer_kind = gfc_integer_kinds[i_index - 1].kind;
416
 
417
  for (r_index = 0, mode = MIN_MODE_FLOAT; mode <= MAX_MODE_FLOAT; mode++)
418
    {
419
      const struct real_format *fmt =
420
        REAL_MODE_FORMAT ((enum machine_mode) mode);
421
      int kind;
422
 
423
      if (fmt == NULL)
424
        continue;
425
      if (!targetm.scalar_mode_supported_p ((enum machine_mode) mode))
426
        continue;
427
 
428
      /* Only let float, double, long double and __float128 go through.
429
         Runtime support for others is not provided, so they would be
430
         useless.  */
431
        if (mode != TYPE_MODE (float_type_node)
432
            && (mode != TYPE_MODE (double_type_node))
433
            && (mode != TYPE_MODE (long_double_type_node))
434
#if defined(LIBGCC2_HAS_TF_MODE) && defined(ENABLE_LIBQUADMATH_SUPPORT)
435
            && (mode != TFmode)
436
#endif
437
           )
438
        continue;
439
 
440
      /* Let the kind equal the precision divided by 8, rounding up.  Again,
441
         this insulates the programmer from the underlying byte size.
442
 
443
         Also, it effectively deals with IEEE extended formats.  There, the
444
         total size of the type may equal 16, but it's got 6 bytes of padding
445
         and the increased size can get in the way of a real IEEE quad format
446
         which may also be supported by the target.
447
 
448
         We round up so as to handle IA-64 __floatreg (RFmode), which is an
449
         82 bit type.  Not to be confused with __float80 (XFmode), which is
450
         an 80 bit type also supported by IA-64.  So XFmode should come out
451
         to be kind=10, and RFmode should come out to be kind=11.  Egads.  */
452
 
453
      kind = (GET_MODE_PRECISION (mode) + 7) / 8;
454
 
455
      if (kind == 4)
456
        saw_r4 = true;
457
      if (kind == 8)
458
        saw_r8 = true;
459
      if (kind == 10)
460
        saw_r10 = true;
461
      if (kind == 16)
462
        saw_r16 = true;
463
 
464
      /* Careful we don't stumble a weird internal mode.  */
465
      gcc_assert (r_index <= 0 || gfc_real_kinds[r_index-1].kind != kind);
466
      /* Or have too many modes for the allocated space.  */
467
      gcc_assert (r_index != MAX_REAL_KINDS);
468
 
469
      gfc_real_kinds[r_index].kind = kind;
470
      gfc_real_kinds[r_index].radix = fmt->b;
471
      gfc_real_kinds[r_index].digits = fmt->p;
472
      gfc_real_kinds[r_index].min_exponent = fmt->emin;
473
      gfc_real_kinds[r_index].max_exponent = fmt->emax;
474
      if (fmt->pnan < fmt->p)
475
        /* This is an IBM extended double format (or the MIPS variant)
476
           made up of two IEEE doubles.  The value of the long double is
477
           the sum of the values of the two parts.  The most significant
478
           part is required to be the value of the long double rounded
479
           to the nearest double.  If we use emax of 1024 then we can't
480
           represent huge(x) = (1 - b**(-p)) * b**(emax-1) * b, because
481
           rounding will make the most significant part overflow.  */
482
        gfc_real_kinds[r_index].max_exponent = fmt->emax - 1;
483
      gfc_real_kinds[r_index].mode_precision = GET_MODE_PRECISION (mode);
484
      r_index += 1;
485
    }
486
 
487
  /* Choose the default integer kind.  We choose 4 unless the user directs us
488
     otherwise.  Even if the user specified that the default integer kind is 8,
489
     the numeric storage size is not 64 bits.  In this case, a warning will be
490
     issued when NUMERIC_STORAGE_SIZE is used.  Set NUMERIC_STORAGE_SIZE to 32.  */
491
 
492
  gfc_numeric_storage_size = 4 * 8;
493
 
494
  if (gfc_option.flag_default_integer)
495
    {
496
      if (!saw_i8)
497
        fatal_error ("INTEGER(KIND=8) is not available for -fdefault-integer-8 option");
498
 
499
      gfc_default_integer_kind = 8;
500
 
501
    }
502
  else if (gfc_option.flag_integer4_kind == 8)
503
    {
504
      if (!saw_i8)
505
        fatal_error ("INTEGER(KIND=8) is not available for -finteger-4-integer-8 option");
506
 
507
      gfc_default_integer_kind = 8;
508
    }
509
  else if (saw_i4)
510
    {
511
      gfc_default_integer_kind = 4;
512
    }
513
  else
514
    {
515
      gfc_default_integer_kind = gfc_integer_kinds[i_index - 1].kind;
516
      gfc_numeric_storage_size = gfc_integer_kinds[i_index - 1].bit_size;
517
    }
518
 
519
  /* Choose the default real kind.  Again, we choose 4 when possible.  */
520
  if (gfc_option.flag_default_real)
521
    {
522
      if (!saw_r8)
523
        fatal_error ("REAL(KIND=8) is not available for -fdefault-real-8 option");
524
 
525
      gfc_default_real_kind = 8;
526
    }
527
  else if (gfc_option.flag_real4_kind == 8)
528
  {
529
    if (!saw_r8)
530
      fatal_error ("REAL(KIND=8) is not available for -freal-4-real-8 option");
531
 
532
    gfc_default_real_kind = 8;
533
  }
534
  else if (gfc_option.flag_real4_kind == 10)
535
  {
536
    if (!saw_r10)
537
      fatal_error ("REAL(KIND=10) is not available for -freal-4-real-10 option");
538
 
539
    gfc_default_real_kind = 10;
540
  }
541
  else if (gfc_option.flag_real4_kind == 16)
542
  {
543
    if (!saw_r16)
544
      fatal_error ("REAL(KIND=16) is not available for -freal-4-real-16 option");
545
 
546
    gfc_default_real_kind = 16;
547
  }
548
  else if (saw_r4)
549
    gfc_default_real_kind = 4;
550
  else
551
    gfc_default_real_kind = gfc_real_kinds[0].kind;
552
 
553
  /* Choose the default double kind.  If -fdefault-real and -fdefault-double
554
     are specified, we use kind=8, if it's available.  If -fdefault-real is
555
     specified without -fdefault-double, we use kind=16, if it's available.
556
     Otherwise we do not change anything.  */
557
  if (gfc_option.flag_default_double && !gfc_option.flag_default_real)
558
    fatal_error ("Use of -fdefault-double-8 requires -fdefault-real-8");
559
 
560
  if (gfc_option.flag_default_real && gfc_option.flag_default_double && saw_r8)
561
    gfc_default_double_kind = 8;
562
  else if (gfc_option.flag_default_real && saw_r16)
563
    gfc_default_double_kind = 16;
564
  else if (gfc_option.flag_real8_kind == 4)
565
    {
566
      if (!saw_r4)
567
        fatal_error ("REAL(KIND=4) is not available for -freal-8-real-4 option");
568
 
569
        gfc_default_double_kind = 4;
570
    }
571
  else if (gfc_option.flag_real8_kind == 10 )
572
    {
573
      if (!saw_r10)
574
        fatal_error ("REAL(KIND=10) is not available for -freal-8-real-10 option");
575
 
576
        gfc_default_double_kind = 10;
577
    }
578
  else if (gfc_option.flag_real8_kind == 16 )
579
    {
580
      if (!saw_r16)
581
        fatal_error ("REAL(KIND=10) is not available for -freal-8-real-16 option");
582
 
583
        gfc_default_double_kind = 16;
584
    }
585
  else if (saw_r4 && saw_r8)
586
    gfc_default_double_kind = 8;
587
  else
588
    {
589
      /* F95 14.6.3.1: A nonpointer scalar object of type double precision
590
         real ... occupies two contiguous numeric storage units.
591
 
592
         Therefore we must be supplied a kind twice as large as we chose
593
         for single precision.  There are loopholes, in that double
594
         precision must *occupy* two storage units, though it doesn't have
595
         to *use* two storage units.  Which means that you can make this
596
         kind artificially wide by padding it.  But at present there are
597
         no GCC targets for which a two-word type does not exist, so we
598
         just let gfc_validate_kind abort and tell us if something breaks.  */
599
 
600
      gfc_default_double_kind
601
        = gfc_validate_kind (BT_REAL, gfc_default_real_kind * 2, false);
602
    }
603
 
604
  /* The default logical kind is constrained to be the same as the
605
     default integer kind.  Similarly with complex and real.  */
606
  gfc_default_logical_kind = gfc_default_integer_kind;
607
  gfc_default_complex_kind = gfc_default_real_kind;
608
 
609
  /* We only have two character kinds: ASCII and UCS-4.
610
     ASCII corresponds to a 8-bit integer type, if one is available.
611
     UCS-4 corresponds to a 32-bit integer type, if one is available. */
612
  i_index = 0;
613
  if ((kind = get_int_kind_from_width (8)) > 0)
614
    {
615
      gfc_character_kinds[i_index].kind = kind;
616
      gfc_character_kinds[i_index].bit_size = 8;
617
      gfc_character_kinds[i_index].name = "ascii";
618
      i_index++;
619
    }
620
  if ((kind = get_int_kind_from_width (32)) > 0)
621
    {
622
      gfc_character_kinds[i_index].kind = kind;
623
      gfc_character_kinds[i_index].bit_size = 32;
624
      gfc_character_kinds[i_index].name = "iso_10646";
625
      i_index++;
626
    }
627
 
628
  /* Choose the smallest integer kind for our default character.  */
629
  gfc_default_character_kind = gfc_character_kinds[0].kind;
630
  gfc_character_storage_size = gfc_default_character_kind * 8;
631
 
632
  gfc_index_integer_kind = get_int_kind_from_name (PTRDIFF_TYPE);
633
 
634
  /* Pick a kind the same size as the C "int" type.  */
635
  gfc_c_int_kind = INT_TYPE_SIZE / 8;
636
 
637
  /* Choose atomic kinds to match C's int.  */
638
  gfc_atomic_int_kind = gfc_c_int_kind;
639
  gfc_atomic_logical_kind = gfc_c_int_kind;
640
}
641
 
642
 
643
/* Make sure that a valid kind is present.  Returns an index into the
644
   associated kinds array, -1 if the kind is not present.  */
645
 
646
static int
647
validate_integer (int kind)
648
{
649
  int i;
650
 
651
  for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
652
    if (gfc_integer_kinds[i].kind == kind)
653
      return i;
654
 
655
  return -1;
656
}
657
 
658
static int
659
validate_real (int kind)
660
{
661
  int i;
662
 
663
  for (i = 0; gfc_real_kinds[i].kind != 0; i++)
664
    if (gfc_real_kinds[i].kind == kind)
665
      return i;
666
 
667
  return -1;
668
}
669
 
670
static int
671
validate_logical (int kind)
672
{
673
  int i;
674
 
675
  for (i = 0; gfc_logical_kinds[i].kind; i++)
676
    if (gfc_logical_kinds[i].kind == kind)
677
      return i;
678
 
679
  return -1;
680
}
681
 
682
static int
683
validate_character (int kind)
684
{
685
  int i;
686
 
687
  for (i = 0; gfc_character_kinds[i].kind; i++)
688
    if (gfc_character_kinds[i].kind == kind)
689
      return i;
690
 
691
  return -1;
692
}
693
 
694
/* Validate a kind given a basic type.  The return value is the same
695
   for the child functions, with -1 indicating nonexistence of the
696
   type.  If MAY_FAIL is false, then -1 is never returned, and we ICE.  */
697
 
698
int
699
gfc_validate_kind (bt type, int kind, bool may_fail)
700
{
701
  int rc;
702
 
703
  switch (type)
704
    {
705
    case BT_REAL:               /* Fall through */
706
    case BT_COMPLEX:
707
      rc = validate_real (kind);
708
      break;
709
    case BT_INTEGER:
710
      rc = validate_integer (kind);
711
      break;
712
    case BT_LOGICAL:
713
      rc = validate_logical (kind);
714
      break;
715
    case BT_CHARACTER:
716
      rc = validate_character (kind);
717
      break;
718
 
719
    default:
720
      gfc_internal_error ("gfc_validate_kind(): Got bad type");
721
    }
722
 
723
  if (rc < 0 && !may_fail)
724
    gfc_internal_error ("gfc_validate_kind(): Got bad kind");
725
 
726
  return rc;
727
}
728
 
729
 
730
/* Four subroutines of gfc_init_types.  Create type nodes for the given kind.
731
   Reuse common type nodes where possible.  Recognize if the kind matches up
732
   with a C type.  This will be used later in determining which routines may
733
   be scarfed from libm.  */
734
 
735
static tree
736
gfc_build_int_type (gfc_integer_info *info)
737
{
738
  int mode_precision = info->bit_size;
739
 
740
  if (mode_precision == CHAR_TYPE_SIZE)
741
    info->c_char = 1;
742
  if (mode_precision == SHORT_TYPE_SIZE)
743
    info->c_short = 1;
744
  if (mode_precision == INT_TYPE_SIZE)
745
    info->c_int = 1;
746
  if (mode_precision == LONG_TYPE_SIZE)
747
    info->c_long = 1;
748
  if (mode_precision == LONG_LONG_TYPE_SIZE)
749
    info->c_long_long = 1;
750
 
751
  if (TYPE_PRECISION (intQI_type_node) == mode_precision)
752
    return intQI_type_node;
753
  if (TYPE_PRECISION (intHI_type_node) == mode_precision)
754
    return intHI_type_node;
755
  if (TYPE_PRECISION (intSI_type_node) == mode_precision)
756
    return intSI_type_node;
757
  if (TYPE_PRECISION (intDI_type_node) == mode_precision)
758
    return intDI_type_node;
759
  if (TYPE_PRECISION (intTI_type_node) == mode_precision)
760
    return intTI_type_node;
761
 
762
  return make_signed_type (mode_precision);
763
}
764
 
765
tree
766
gfc_build_uint_type (int size)
767
{
768
  if (size == CHAR_TYPE_SIZE)
769
    return unsigned_char_type_node;
770
  if (size == SHORT_TYPE_SIZE)
771
    return short_unsigned_type_node;
772
  if (size == INT_TYPE_SIZE)
773
    return unsigned_type_node;
774
  if (size == LONG_TYPE_SIZE)
775
    return long_unsigned_type_node;
776
  if (size == LONG_LONG_TYPE_SIZE)
777
    return long_long_unsigned_type_node;
778
 
779
  return make_unsigned_type (size);
780
}
781
 
782
 
783
static tree
784
gfc_build_real_type (gfc_real_info *info)
785
{
786
  int mode_precision = info->mode_precision;
787
  tree new_type;
788
 
789
  if (mode_precision == FLOAT_TYPE_SIZE)
790
    info->c_float = 1;
791
  if (mode_precision == DOUBLE_TYPE_SIZE)
792
    info->c_double = 1;
793
  if (mode_precision == LONG_DOUBLE_TYPE_SIZE)
794
    info->c_long_double = 1;
795
  if (mode_precision != LONG_DOUBLE_TYPE_SIZE && mode_precision == 128)
796
    {
797
      info->c_float128 = 1;
798
      gfc_real16_is_float128 = true;
799
    }
800
 
801
  if (TYPE_PRECISION (float_type_node) == mode_precision)
802
    return float_type_node;
803
  if (TYPE_PRECISION (double_type_node) == mode_precision)
804
    return double_type_node;
805
  if (TYPE_PRECISION (long_double_type_node) == mode_precision)
806
    return long_double_type_node;
807
 
808
  new_type = make_node (REAL_TYPE);
809
  TYPE_PRECISION (new_type) = mode_precision;
810
  layout_type (new_type);
811
  return new_type;
812
}
813
 
814
static tree
815
gfc_build_complex_type (tree scalar_type)
816
{
817
  tree new_type;
818
 
819
  if (scalar_type == NULL)
820
    return NULL;
821
  if (scalar_type == float_type_node)
822
    return complex_float_type_node;
823
  if (scalar_type == double_type_node)
824
    return complex_double_type_node;
825
  if (scalar_type == long_double_type_node)
826
    return complex_long_double_type_node;
827
 
828
  new_type = make_node (COMPLEX_TYPE);
829
  TREE_TYPE (new_type) = scalar_type;
830
  layout_type (new_type);
831
  return new_type;
832
}
833
 
834
static tree
835
gfc_build_logical_type (gfc_logical_info *info)
836
{
837
  int bit_size = info->bit_size;
838
  tree new_type;
839
 
840
  if (bit_size == BOOL_TYPE_SIZE)
841
    {
842
      info->c_bool = 1;
843
      return boolean_type_node;
844
    }
845
 
846
  new_type = make_unsigned_type (bit_size);
847
  TREE_SET_CODE (new_type, BOOLEAN_TYPE);
848
  TYPE_MAX_VALUE (new_type) = build_int_cst (new_type, 1);
849
  TYPE_PRECISION (new_type) = 1;
850
 
851
  return new_type;
852
}
853
 
854
 
855
/* Create the backend type nodes. We map them to their
856
   equivalent C type, at least for now.  We also give
857
   names to the types here, and we push them in the
858
   global binding level context.*/
859
 
860
void
861
gfc_init_types (void)
862
{
863
  char name_buf[18];
864
  int index;
865
  tree type;
866
  unsigned n;
867
  unsigned HOST_WIDE_INT hi;
868
  unsigned HOST_WIDE_INT lo;
869
 
870
  /* Create and name the types.  */
871
#define PUSH_TYPE(name, node) \
872
  pushdecl (build_decl (input_location, \
873
                        TYPE_DECL, get_identifier (name), node))
874
 
875
  for (index = 0; gfc_integer_kinds[index].kind != 0; ++index)
876
    {
877
      type = gfc_build_int_type (&gfc_integer_kinds[index]);
878
      /* Ensure integer(kind=1) doesn't have TYPE_STRING_FLAG set.  */
879
      if (TYPE_STRING_FLAG (type))
880
        type = make_signed_type (gfc_integer_kinds[index].bit_size);
881
      gfc_integer_types[index] = type;
882
      snprintf (name_buf, sizeof(name_buf), "integer(kind=%d)",
883
                gfc_integer_kinds[index].kind);
884
      PUSH_TYPE (name_buf, type);
885
    }
886
 
887
  for (index = 0; gfc_logical_kinds[index].kind != 0; ++index)
888
    {
889
      type = gfc_build_logical_type (&gfc_logical_kinds[index]);
890
      gfc_logical_types[index] = type;
891
      snprintf (name_buf, sizeof(name_buf), "logical(kind=%d)",
892
                gfc_logical_kinds[index].kind);
893
      PUSH_TYPE (name_buf, type);
894
    }
895
 
896
  for (index = 0; gfc_real_kinds[index].kind != 0; index++)
897
    {
898
      type = gfc_build_real_type (&gfc_real_kinds[index]);
899
      gfc_real_types[index] = type;
900
      snprintf (name_buf, sizeof(name_buf), "real(kind=%d)",
901
                gfc_real_kinds[index].kind);
902
      PUSH_TYPE (name_buf, type);
903
 
904
      if (gfc_real_kinds[index].c_float128)
905
        float128_type_node = type;
906
 
907
      type = gfc_build_complex_type (type);
908
      gfc_complex_types[index] = type;
909
      snprintf (name_buf, sizeof(name_buf), "complex(kind=%d)",
910
                gfc_real_kinds[index].kind);
911
      PUSH_TYPE (name_buf, type);
912
 
913
      if (gfc_real_kinds[index].c_float128)
914
        complex_float128_type_node = type;
915
    }
916
 
917
  for (index = 0; gfc_character_kinds[index].kind != 0; ++index)
918
    {
919
      type = gfc_build_uint_type (gfc_character_kinds[index].bit_size);
920
      type = build_qualified_type (type, TYPE_UNQUALIFIED);
921
      snprintf (name_buf, sizeof(name_buf), "character(kind=%d)",
922
                gfc_character_kinds[index].kind);
923
      PUSH_TYPE (name_buf, type);
924
      gfc_character_types[index] = type;
925
      gfc_pcharacter_types[index] = build_pointer_type (type);
926
    }
927
  gfc_character1_type_node = gfc_character_types[0];
928
 
929
  PUSH_TYPE ("byte", unsigned_char_type_node);
930
  PUSH_TYPE ("void", void_type_node);
931
 
932
  /* DBX debugging output gets upset if these aren't set.  */
933
  if (!TYPE_NAME (integer_type_node))
934
    PUSH_TYPE ("c_integer", integer_type_node);
935
  if (!TYPE_NAME (char_type_node))
936
    PUSH_TYPE ("c_char", char_type_node);
937
 
938
#undef PUSH_TYPE
939
 
940
  pvoid_type_node = build_pointer_type (void_type_node);
941
  prvoid_type_node = build_qualified_type (pvoid_type_node, TYPE_QUAL_RESTRICT);
942
  ppvoid_type_node = build_pointer_type (pvoid_type_node);
943
  pchar_type_node = build_pointer_type (gfc_character1_type_node);
944
  pfunc_type_node
945
    = build_pointer_type (build_function_type_list (void_type_node, NULL_TREE));
946
 
947
  gfc_array_index_type = gfc_get_int_type (gfc_index_integer_kind);
948
  /* We cannot use gfc_index_zero_node in definition of gfc_array_range_type,
949
     since this function is called before gfc_init_constants.  */
950
  gfc_array_range_type
951
          = build_range_type (gfc_array_index_type,
952
                              build_int_cst (gfc_array_index_type, 0),
953
                              NULL_TREE);
954
 
955
  /* The maximum array element size that can be handled is determined
956
     by the number of bits available to store this field in the array
957
     descriptor.  */
958
 
959
  n = TYPE_PRECISION (gfc_array_index_type) - GFC_DTYPE_SIZE_SHIFT;
960
  lo = ~ (unsigned HOST_WIDE_INT) 0;
961
  if (n > HOST_BITS_PER_WIDE_INT)
962
    hi = lo >> (2*HOST_BITS_PER_WIDE_INT - n);
963
  else
964
    hi = 0, lo >>= HOST_BITS_PER_WIDE_INT - n;
965
  gfc_max_array_element_size
966
    = build_int_cst_wide (long_unsigned_type_node, lo, hi);
967
 
968
  boolean_type_node = gfc_get_logical_type (gfc_default_logical_kind);
969
  boolean_true_node = build_int_cst (boolean_type_node, 1);
970
  boolean_false_node = build_int_cst (boolean_type_node, 0);
971
 
972
  /* ??? Shouldn't this be based on gfc_index_integer_kind or so?  */
973
  gfc_charlen_int_kind = 4;
974
  gfc_charlen_type_node = gfc_get_int_type (gfc_charlen_int_kind);
975
}
976
 
977
/* Get the type node for the given type and kind.  */
978
 
979
tree
980
gfc_get_int_type (int kind)
981
{
982
  int index = gfc_validate_kind (BT_INTEGER, kind, true);
983
  return index < 0 ? 0 : gfc_integer_types[index];
984
}
985
 
986
tree
987
gfc_get_real_type (int kind)
988
{
989
  int index = gfc_validate_kind (BT_REAL, kind, true);
990
  return index < 0 ? 0 : gfc_real_types[index];
991
}
992
 
993
tree
994
gfc_get_complex_type (int kind)
995
{
996
  int index = gfc_validate_kind (BT_COMPLEX, kind, true);
997
  return index < 0 ? 0 : gfc_complex_types[index];
998
}
999
 
1000
tree
1001
gfc_get_logical_type (int kind)
1002
{
1003
  int index = gfc_validate_kind (BT_LOGICAL, kind, true);
1004
  return index < 0 ? 0 : gfc_logical_types[index];
1005
}
1006
 
1007
tree
1008
gfc_get_char_type (int kind)
1009
{
1010
  int index = gfc_validate_kind (BT_CHARACTER, kind, true);
1011
  return index < 0 ? 0 : gfc_character_types[index];
1012
}
1013
 
1014
tree
1015
gfc_get_pchar_type (int kind)
1016
{
1017
  int index = gfc_validate_kind (BT_CHARACTER, kind, true);
1018
  return index < 0 ? 0 : gfc_pcharacter_types[index];
1019
}
1020
 
1021
 
1022
/* Create a character type with the given kind and length.  */
1023
 
1024
tree
1025
gfc_get_character_type_len_for_eltype (tree eltype, tree len)
1026
{
1027
  tree bounds, type;
1028
 
1029
  bounds = build_range_type (gfc_charlen_type_node, gfc_index_one_node, len);
1030
  type = build_array_type (eltype, bounds);
1031
  TYPE_STRING_FLAG (type) = 1;
1032
 
1033
  return type;
1034
}
1035
 
1036
tree
1037
gfc_get_character_type_len (int kind, tree len)
1038
{
1039
  gfc_validate_kind (BT_CHARACTER, kind, false);
1040
  return gfc_get_character_type_len_for_eltype (gfc_get_char_type (kind), len);
1041
}
1042
 
1043
 
1044
/* Get a type node for a character kind.  */
1045
 
1046
tree
1047
gfc_get_character_type (int kind, gfc_charlen * cl)
1048
{
1049
  tree len;
1050
 
1051
  len = (cl == NULL) ? NULL_TREE : cl->backend_decl;
1052
 
1053
  return gfc_get_character_type_len (kind, len);
1054
}
1055
 
1056
/* Covert a basic type.  This will be an array for character types.  */
1057
 
1058
tree
1059
gfc_typenode_for_spec (gfc_typespec * spec)
1060
{
1061
  tree basetype;
1062
 
1063
  switch (spec->type)
1064
    {
1065
    case BT_UNKNOWN:
1066
      gcc_unreachable ();
1067
 
1068
    case BT_INTEGER:
1069
      /* We use INTEGER(c_intptr_t) for C_PTR and C_FUNPTR once the symbol
1070
         has been resolved.  This is done so we can convert C_PTR and
1071
         C_FUNPTR to simple variables that get translated to (void *).  */
1072
      if (spec->f90_type == BT_VOID)
1073
        {
1074
          if (spec->u.derived
1075
              && spec->u.derived->intmod_sym_id == ISOCBINDING_PTR)
1076
            basetype = ptr_type_node;
1077
          else
1078
            basetype = pfunc_type_node;
1079
        }
1080
      else
1081
        basetype = gfc_get_int_type (spec->kind);
1082
      break;
1083
 
1084
    case BT_REAL:
1085
      basetype = gfc_get_real_type (spec->kind);
1086
      break;
1087
 
1088
    case BT_COMPLEX:
1089
      basetype = gfc_get_complex_type (spec->kind);
1090
      break;
1091
 
1092
    case BT_LOGICAL:
1093
      basetype = gfc_get_logical_type (spec->kind);
1094
      break;
1095
 
1096
    case BT_CHARACTER:
1097
#if 0
1098
      if (spec->deferred)
1099
        basetype = gfc_get_character_type (spec->kind, NULL);
1100
      else
1101
#endif
1102
        basetype = gfc_get_character_type (spec->kind, spec->u.cl);
1103
      break;
1104
 
1105
    case BT_DERIVED:
1106
    case BT_CLASS:
1107
      basetype = gfc_get_derived_type (spec->u.derived);
1108
 
1109
      /* If we're dealing with either C_PTR or C_FUNPTR, we modified the
1110
         type and kind to fit a (void *) and the basetype returned was a
1111
         ptr_type_node.  We need to pass up this new information to the
1112
         symbol that was declared of type C_PTR or C_FUNPTR.  */
1113
      if (spec->u.derived->attr.is_iso_c)
1114
        {
1115
          spec->type = spec->u.derived->ts.type;
1116
          spec->kind = spec->u.derived->ts.kind;
1117
          spec->f90_type = spec->u.derived->ts.f90_type;
1118
        }
1119
      break;
1120
    case BT_VOID:
1121
      /* This is for the second arg to c_f_pointer and c_f_procpointer
1122
         of the iso_c_binding module, to accept any ptr type.  */
1123
      basetype = ptr_type_node;
1124
      if (spec->f90_type == BT_VOID)
1125
        {
1126
          if (spec->u.derived
1127
              && spec->u.derived->intmod_sym_id == ISOCBINDING_PTR)
1128
            basetype = ptr_type_node;
1129
          else
1130
            basetype = pfunc_type_node;
1131
        }
1132
       break;
1133
    default:
1134
      gcc_unreachable ();
1135
    }
1136
  return basetype;
1137
}
1138
 
1139
/* Build an INT_CST for constant expressions, otherwise return NULL_TREE.  */
1140
 
1141
static tree
1142
gfc_conv_array_bound (gfc_expr * expr)
1143
{
1144
  /* If expr is an integer constant, return that.  */
1145
  if (expr != NULL && expr->expr_type == EXPR_CONSTANT)
1146
    return gfc_conv_mpz_to_tree (expr->value.integer, gfc_index_integer_kind);
1147
 
1148
  /* Otherwise return NULL.  */
1149
  return NULL_TREE;
1150
}
1151
 
1152
tree
1153
gfc_get_element_type (tree type)
1154
{
1155
  tree element;
1156
 
1157
  if (GFC_ARRAY_TYPE_P (type))
1158
    {
1159
      if (TREE_CODE (type) == POINTER_TYPE)
1160
        type = TREE_TYPE (type);
1161
      if (GFC_TYPE_ARRAY_RANK (type) == 0)
1162
        {
1163
          gcc_assert (GFC_TYPE_ARRAY_CORANK (type) > 0);
1164
          element = type;
1165
        }
1166
      else
1167
        {
1168
          gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
1169
          element = TREE_TYPE (type);
1170
        }
1171
    }
1172
  else
1173
    {
1174
      gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
1175
      element = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
1176
 
1177
      gcc_assert (TREE_CODE (element) == POINTER_TYPE);
1178
      element = TREE_TYPE (element);
1179
 
1180
      /* For arrays, which are not scalar coarrays.  */
1181
      if (TREE_CODE (element) == ARRAY_TYPE)
1182
        element = TREE_TYPE (element);
1183
    }
1184
 
1185
  return element;
1186
}
1187
 
1188
/* Build an array.  This function is called from gfc_sym_type().
1189
   Actually returns array descriptor type.
1190
 
1191
   Format of array descriptors is as follows:
1192
 
1193
    struct gfc_array_descriptor
1194
    {
1195
      array *data
1196
      index offset;
1197
      index dtype;
1198
      struct descriptor_dimension dimension[N_DIM];
1199
    }
1200
 
1201
    struct descriptor_dimension
1202
    {
1203
      index stride;
1204
      index lbound;
1205
      index ubound;
1206
    }
1207
 
1208
   Translation code should use gfc_conv_descriptor_* rather than
1209
   accessing the descriptor directly.  Any changes to the array
1210
   descriptor type will require changes in gfc_conv_descriptor_* and
1211
   gfc_build_array_initializer.
1212
 
1213
   This is represented internally as a RECORD_TYPE. The index nodes
1214
   are gfc_array_index_type and the data node is a pointer to the
1215
   data.  See below for the handling of character types.
1216
 
1217
   The dtype member is formatted as follows:
1218
    rank = dtype & GFC_DTYPE_RANK_MASK // 3 bits
1219
    type = (dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT // 3 bits
1220
    size = dtype >> GFC_DTYPE_SIZE_SHIFT
1221
 
1222
   I originally used nested ARRAY_TYPE nodes to represent arrays, but
1223
   this generated poor code for assumed/deferred size arrays.  These
1224
   require use of PLACEHOLDER_EXPR/WITH_RECORD_EXPR, which isn't part
1225
   of the GENERIC grammar.  Also, there is no way to explicitly set
1226
   the array stride, so all data must be packed(1).  I've tried to
1227
   mark all the functions which would require modification with a GCC
1228
   ARRAYS comment.
1229
 
1230
   The data component points to the first element in the array.  The
1231
   offset field is the position of the origin of the array (i.e. element
1232
   (0, 0 ...)).  This may be outside the bounds of the array.
1233
 
1234
   An element is accessed by
1235
    data[offset + index0*stride0 + index1*stride1 + index2*stride2]
1236
   This gives good performance as the computation does not involve the
1237
   bounds of the array.  For packed arrays, this is optimized further
1238
   by substituting the known strides.
1239
 
1240
   This system has one problem: all array bounds must be within 2^31
1241
   elements of the origin (2^63 on 64-bit machines).  For example
1242
    integer, dimension (80000:90000, 80000:90000, 2) :: array
1243
   may not work properly on 32-bit machines because 80000*80000 >
1244
   2^31, so the calculation for stride2 would overflow.  This may
1245
   still work, but I haven't checked, and it relies on the overflow
1246
   doing the right thing.
1247
 
1248
   The way to fix this problem is to access elements as follows:
1249
    data[(index0-lbound0)*stride0 + (index1-lbound1)*stride1]
1250
   Obviously this is much slower.  I will make this a compile time
1251
   option, something like -fsmall-array-offsets.  Mixing code compiled
1252
   with and without this switch will work.
1253
 
1254
   (1) This can be worked around by modifying the upper bound of the
1255
   previous dimension.  This requires extra fields in the descriptor
1256
   (both real_ubound and fake_ubound).  */
1257
 
1258
 
1259
/* Returns true if the array sym does not require a descriptor.  */
1260
 
1261
int
1262
gfc_is_nodesc_array (gfc_symbol * sym)
1263
{
1264
  gcc_assert (sym->attr.dimension || sym->attr.codimension);
1265
 
1266
  /* We only want local arrays.  */
1267
  if (sym->attr.pointer || sym->attr.allocatable)
1268
    return 0;
1269
 
1270
  /* We want a descriptor for associate-name arrays that do not have an
1271
     explicitely known shape already.  */
1272
  if (sym->assoc && sym->as->type != AS_EXPLICIT)
1273
    return 0;
1274
 
1275
  if (sym->attr.dummy)
1276
    return sym->as->type != AS_ASSUMED_SHAPE;
1277
 
1278
  if (sym->attr.result || sym->attr.function)
1279
    return 0;
1280
 
1281
  gcc_assert (sym->as->type == AS_EXPLICIT || sym->as->cp_was_assumed);
1282
 
1283
  return 1;
1284
}
1285
 
1286
 
1287
/* Create an array descriptor type.  */
1288
 
1289
static tree
1290
gfc_build_array_type (tree type, gfc_array_spec * as,
1291
                      enum gfc_array_kind akind, bool restricted,
1292
                      bool contiguous)
1293
{
1294
  tree lbound[GFC_MAX_DIMENSIONS];
1295
  tree ubound[GFC_MAX_DIMENSIONS];
1296
  int n;
1297
 
1298
  for (n = 0; n < as->rank; n++)
1299
    {
1300
      /* Create expressions for the known bounds of the array.  */
1301
      if (as->type == AS_ASSUMED_SHAPE && as->lower[n] == NULL)
1302
        lbound[n] = gfc_index_one_node;
1303
      else
1304
        lbound[n] = gfc_conv_array_bound (as->lower[n]);
1305
      ubound[n] = gfc_conv_array_bound (as->upper[n]);
1306
    }
1307
 
1308
  for (n = as->rank; n < as->rank + as->corank; n++)
1309
    {
1310
      if (as->type != AS_DEFERRED && as->lower[n] == NULL)
1311
        lbound[n] = gfc_index_one_node;
1312
      else
1313
        lbound[n] = gfc_conv_array_bound (as->lower[n]);
1314
 
1315
      if (n < as->rank + as->corank - 1)
1316
        ubound[n] = gfc_conv_array_bound (as->upper[n]);
1317
    }
1318
 
1319
  if (as->type == AS_ASSUMED_SHAPE)
1320
    akind = contiguous ? GFC_ARRAY_ASSUMED_SHAPE_CONT
1321
                       : GFC_ARRAY_ASSUMED_SHAPE;
1322
  return gfc_get_array_type_bounds (type, as->rank, as->corank, lbound,
1323
                                    ubound, 0, akind, restricted);
1324
}
1325
 
1326
/* Returns the struct descriptor_dimension type.  */
1327
 
1328
static tree
1329
gfc_get_desc_dim_type (void)
1330
{
1331
  tree type;
1332
  tree decl, *chain = NULL;
1333
 
1334
  if (gfc_desc_dim_type)
1335
    return gfc_desc_dim_type;
1336
 
1337
  /* Build the type node.  */
1338
  type = make_node (RECORD_TYPE);
1339
 
1340
  TYPE_NAME (type) = get_identifier ("descriptor_dimension");
1341
  TYPE_PACKED (type) = 1;
1342
 
1343
  /* Consists of the stride, lbound and ubound members.  */
1344
  decl = gfc_add_field_to_struct_1 (type,
1345
                                    get_identifier ("stride"),
1346
                                    gfc_array_index_type, &chain);
1347
  TREE_NO_WARNING (decl) = 1;
1348
 
1349
  decl = gfc_add_field_to_struct_1 (type,
1350
                                    get_identifier ("lbound"),
1351
                                    gfc_array_index_type, &chain);
1352
  TREE_NO_WARNING (decl) = 1;
1353
 
1354
  decl = gfc_add_field_to_struct_1 (type,
1355
                                    get_identifier ("ubound"),
1356
                                    gfc_array_index_type, &chain);
1357
  TREE_NO_WARNING (decl) = 1;
1358
 
1359
  /* Finish off the type.  */
1360
  gfc_finish_type (type);
1361
  TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1;
1362
 
1363
  gfc_desc_dim_type = type;
1364
  return type;
1365
}
1366
 
1367
 
1368
/* Return the DTYPE for an array.  This describes the type and type parameters
1369
   of the array.  */
1370
/* TODO: Only call this when the value is actually used, and make all the
1371
   unknown cases abort.  */
1372
 
1373
tree
1374
gfc_get_dtype (tree type)
1375
{
1376
  tree size;
1377
  int n;
1378
  HOST_WIDE_INT i;
1379
  tree tmp;
1380
  tree dtype;
1381
  tree etype;
1382
  int rank;
1383
 
1384
  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type));
1385
 
1386
  if (GFC_TYPE_ARRAY_DTYPE (type))
1387
    return GFC_TYPE_ARRAY_DTYPE (type);
1388
 
1389
  rank = GFC_TYPE_ARRAY_RANK (type);
1390
  etype = gfc_get_element_type (type);
1391
 
1392
  switch (TREE_CODE (etype))
1393
    {
1394
    case INTEGER_TYPE:
1395
      n = BT_INTEGER;
1396
      break;
1397
 
1398
    case BOOLEAN_TYPE:
1399
      n = BT_LOGICAL;
1400
      break;
1401
 
1402
    case REAL_TYPE:
1403
      n = BT_REAL;
1404
      break;
1405
 
1406
    case COMPLEX_TYPE:
1407
      n = BT_COMPLEX;
1408
      break;
1409
 
1410
    /* We will never have arrays of arrays.  */
1411
    case RECORD_TYPE:
1412
      n = BT_DERIVED;
1413
      break;
1414
 
1415
    case ARRAY_TYPE:
1416
      n = BT_CHARACTER;
1417
      break;
1418
 
1419
    default:
1420
      /* TODO: Don't do dtype for temporary descriptorless arrays.  */
1421
      /* We can strange array types for temporary arrays.  */
1422
      return gfc_index_zero_node;
1423
    }
1424
 
1425
  gcc_assert (rank <= GFC_DTYPE_RANK_MASK);
1426
  size = TYPE_SIZE_UNIT (etype);
1427
 
1428
  i = rank | (n << GFC_DTYPE_TYPE_SHIFT);
1429
  if (size && INTEGER_CST_P (size))
1430
    {
1431
      if (tree_int_cst_lt (gfc_max_array_element_size, size))
1432
        gfc_fatal_error ("Array element size too big at %C");
1433
 
1434
      i += TREE_INT_CST_LOW (size) << GFC_DTYPE_SIZE_SHIFT;
1435
    }
1436
  dtype = build_int_cst (gfc_array_index_type, i);
1437
 
1438
  if (size && !INTEGER_CST_P (size))
1439
    {
1440
      tmp = build_int_cst (gfc_array_index_type, GFC_DTYPE_SIZE_SHIFT);
1441
      tmp  = fold_build2_loc (input_location, LSHIFT_EXPR,
1442
                              gfc_array_index_type,
1443
                              fold_convert (gfc_array_index_type, size), tmp);
1444
      dtype = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
1445
                               tmp, dtype);
1446
    }
1447
  /* If we don't know the size we leave it as zero.  This should never happen
1448
     for anything that is actually used.  */
1449
  /* TODO: Check this is actually true, particularly when repacking
1450
     assumed size parameters.  */
1451
 
1452
  GFC_TYPE_ARRAY_DTYPE (type) = dtype;
1453
  return dtype;
1454
}
1455
 
1456
 
1457
/* Build an array type for use without a descriptor, packed according
1458
   to the value of PACKED.  */
1459
 
1460
tree
1461
gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
1462
                           bool restricted)
1463
{
1464
  tree range;
1465
  tree type;
1466
  tree tmp;
1467
  int n;
1468
  int known_stride;
1469
  int known_offset;
1470
  mpz_t offset;
1471
  mpz_t stride;
1472
  mpz_t delta;
1473
  gfc_expr *expr;
1474
 
1475
  mpz_init_set_ui (offset, 0);
1476
  mpz_init_set_ui (stride, 1);
1477
  mpz_init (delta);
1478
 
1479
  /* We don't use build_array_type because this does not include include
1480
     lang-specific information (i.e. the bounds of the array) when checking
1481
     for duplicates.  */
1482
  if (as->rank)
1483
    type = make_node (ARRAY_TYPE);
1484
  else
1485
    type = build_variant_type_copy (etype);
1486
 
1487
  GFC_ARRAY_TYPE_P (type) = 1;
1488
  TYPE_LANG_SPECIFIC (type)
1489
      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
1490
 
1491
  known_stride = (packed != PACKED_NO);
1492
  known_offset = 1;
1493
  for (n = 0; n < as->rank; n++)
1494
    {
1495
      /* Fill in the stride and bound components of the type.  */
1496
      if (known_stride)
1497
        tmp = gfc_conv_mpz_to_tree (stride, gfc_index_integer_kind);
1498
      else
1499
        tmp = NULL_TREE;
1500
      GFC_TYPE_ARRAY_STRIDE (type, n) = tmp;
1501
 
1502
      expr = as->lower[n];
1503
      if (expr->expr_type == EXPR_CONSTANT)
1504
        {
1505
          tmp = gfc_conv_mpz_to_tree (expr->value.integer,
1506
                                      gfc_index_integer_kind);
1507
        }
1508
      else
1509
        {
1510
          known_stride = 0;
1511
          tmp = NULL_TREE;
1512
        }
1513
      GFC_TYPE_ARRAY_LBOUND (type, n) = tmp;
1514
 
1515
      if (known_stride)
1516
        {
1517
          /* Calculate the offset.  */
1518
          mpz_mul (delta, stride, as->lower[n]->value.integer);
1519
          mpz_sub (offset, offset, delta);
1520
        }
1521
      else
1522
        known_offset = 0;
1523
 
1524
      expr = as->upper[n];
1525
      if (expr && expr->expr_type == EXPR_CONSTANT)
1526
        {
1527
          tmp = gfc_conv_mpz_to_tree (expr->value.integer,
1528
                                  gfc_index_integer_kind);
1529
        }
1530
      else
1531
        {
1532
          tmp = NULL_TREE;
1533
          known_stride = 0;
1534
        }
1535
      GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1536
 
1537
      if (known_stride)
1538
        {
1539
          /* Calculate the stride.  */
1540
          mpz_sub (delta, as->upper[n]->value.integer,
1541
                   as->lower[n]->value.integer);
1542
          mpz_add_ui (delta, delta, 1);
1543
          mpz_mul (stride, stride, delta);
1544
        }
1545
 
1546
      /* Only the first stride is known for partial packed arrays.  */
1547
      if (packed == PACKED_NO || packed == PACKED_PARTIAL)
1548
        known_stride = 0;
1549
    }
1550
  for (n = as->rank; n < as->rank + as->corank; n++)
1551
    {
1552
      expr = as->lower[n];
1553
      if (expr->expr_type == EXPR_CONSTANT)
1554
        tmp = gfc_conv_mpz_to_tree (expr->value.integer,
1555
                                    gfc_index_integer_kind);
1556
      else
1557
        tmp = NULL_TREE;
1558
      GFC_TYPE_ARRAY_LBOUND (type, n) = tmp;
1559
 
1560
      expr = as->upper[n];
1561
      if (expr && expr->expr_type == EXPR_CONSTANT)
1562
        tmp = gfc_conv_mpz_to_tree (expr->value.integer,
1563
                                    gfc_index_integer_kind);
1564
      else
1565
        tmp = NULL_TREE;
1566
      if (n < as->rank + as->corank - 1)
1567
      GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1568
    }
1569
 
1570
  if (known_offset)
1571
    {
1572
      GFC_TYPE_ARRAY_OFFSET (type) =
1573
        gfc_conv_mpz_to_tree (offset, gfc_index_integer_kind);
1574
    }
1575
  else
1576
    GFC_TYPE_ARRAY_OFFSET (type) = NULL_TREE;
1577
 
1578
  if (known_stride)
1579
    {
1580
      GFC_TYPE_ARRAY_SIZE (type) =
1581
        gfc_conv_mpz_to_tree (stride, gfc_index_integer_kind);
1582
    }
1583
  else
1584
    GFC_TYPE_ARRAY_SIZE (type) = NULL_TREE;
1585
 
1586
  GFC_TYPE_ARRAY_RANK (type) = as->rank;
1587
  GFC_TYPE_ARRAY_CORANK (type) = as->corank;
1588
  GFC_TYPE_ARRAY_DTYPE (type) = NULL_TREE;
1589
  range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
1590
                            NULL_TREE);
1591
  /* TODO: use main type if it is unbounded.  */
1592
  GFC_TYPE_ARRAY_DATAPTR_TYPE (type) =
1593
    build_pointer_type (build_array_type (etype, range));
1594
  if (restricted)
1595
    GFC_TYPE_ARRAY_DATAPTR_TYPE (type) =
1596
      build_qualified_type (GFC_TYPE_ARRAY_DATAPTR_TYPE (type),
1597
                            TYPE_QUAL_RESTRICT);
1598
 
1599
  if (as->rank == 0)
1600
    {
1601
      if (packed != PACKED_STATIC  || gfc_option.coarray == GFC_FCOARRAY_LIB)
1602
        {
1603
          type = build_pointer_type (type);
1604
 
1605
          if (restricted)
1606
            type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
1607
 
1608
          GFC_ARRAY_TYPE_P (type) = 1;
1609
          TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type));
1610
        }
1611
 
1612
      return type;
1613
    }
1614
 
1615
  if (known_stride)
1616
    {
1617
      mpz_sub_ui (stride, stride, 1);
1618
      range = gfc_conv_mpz_to_tree (stride, gfc_index_integer_kind);
1619
    }
1620
  else
1621
    range = NULL_TREE;
1622
 
1623
  range = build_range_type (gfc_array_index_type, gfc_index_zero_node, range);
1624
  TYPE_DOMAIN (type) = range;
1625
 
1626
  build_pointer_type (etype);
1627
  TREE_TYPE (type) = etype;
1628
 
1629
  layout_type (type);
1630
 
1631
  mpz_clear (offset);
1632
  mpz_clear (stride);
1633
  mpz_clear (delta);
1634
 
1635
  /* Represent packed arrays as multi-dimensional if they have rank >
1636
     1 and with proper bounds, instead of flat arrays.  This makes for
1637
     better debug info.  */
1638
  if (known_offset)
1639
    {
1640
      tree gtype = etype, rtype, type_decl;
1641
 
1642
      for (n = as->rank - 1; n >= 0; n--)
1643
        {
1644
          rtype = build_range_type (gfc_array_index_type,
1645
                                    GFC_TYPE_ARRAY_LBOUND (type, n),
1646
                                    GFC_TYPE_ARRAY_UBOUND (type, n));
1647
          gtype = build_array_type (gtype, rtype);
1648
        }
1649
      TYPE_NAME (type) = type_decl = build_decl (input_location,
1650
                                                 TYPE_DECL, NULL, gtype);
1651
      DECL_ORIGINAL_TYPE (type_decl) = gtype;
1652
    }
1653
 
1654
  if (packed != PACKED_STATIC || !known_stride
1655
      || (as->corank && gfc_option.coarray == GFC_FCOARRAY_LIB))
1656
    {
1657
      /* For dummy arrays and automatic (heap allocated) arrays we
1658
         want a pointer to the array.  */
1659
      type = build_pointer_type (type);
1660
      if (restricted)
1661
        type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
1662
      GFC_ARRAY_TYPE_P (type) = 1;
1663
      TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type));
1664
    }
1665
  return type;
1666
}
1667
 
1668
 
1669
/* Return or create the base type for an array descriptor.  */
1670
 
1671
static tree
1672
gfc_get_array_descriptor_base (int dimen, int codimen, bool restricted,
1673
                               enum gfc_array_kind akind)
1674
{
1675
  tree fat_type, decl, arraytype, *chain = NULL;
1676
  char name[16 + 2*GFC_RANK_DIGITS + 1 + 1];
1677
  int idx = 2 * (codimen + dimen - 1) + restricted;
1678
 
1679
  gcc_assert (codimen + dimen >= 1 && codimen + dimen <= GFC_MAX_DIMENSIONS);
1680
 
1681
  if (gfc_option.coarray == GFC_FCOARRAY_LIB && codimen)
1682
    {
1683
      if (gfc_array_descriptor_base_caf[idx])
1684
        return gfc_array_descriptor_base_caf[idx];
1685
    }
1686
  else if (gfc_array_descriptor_base[idx])
1687
    return gfc_array_descriptor_base[idx];
1688
 
1689
  /* Build the type node.  */
1690
  fat_type = make_node (RECORD_TYPE);
1691
 
1692
  sprintf (name, "array_descriptor" GFC_RANK_PRINTF_FORMAT, dimen + codimen);
1693
  TYPE_NAME (fat_type) = get_identifier (name);
1694
  TYPE_NAMELESS (fat_type) = 1;
1695
 
1696
  /* Add the data member as the first element of the descriptor.  */
1697
  decl = gfc_add_field_to_struct_1 (fat_type,
1698
                                    get_identifier ("data"),
1699
                                    (restricted
1700
                                     ? prvoid_type_node
1701
                                     : ptr_type_node), &chain);
1702
 
1703
  /* Add the base component.  */
1704
  decl = gfc_add_field_to_struct_1 (fat_type,
1705
                                    get_identifier ("offset"),
1706
                                    gfc_array_index_type, &chain);
1707
  TREE_NO_WARNING (decl) = 1;
1708
 
1709
  /* Add the dtype component.  */
1710
  decl = gfc_add_field_to_struct_1 (fat_type,
1711
                                    get_identifier ("dtype"),
1712
                                    gfc_array_index_type, &chain);
1713
  TREE_NO_WARNING (decl) = 1;
1714
 
1715
  /* Build the array type for the stride and bound components.  */
1716
  arraytype =
1717
    build_array_type (gfc_get_desc_dim_type (),
1718
                      build_range_type (gfc_array_index_type,
1719
                                        gfc_index_zero_node,
1720
                                        gfc_rank_cst[codimen + dimen - 1]));
1721
 
1722
  decl = gfc_add_field_to_struct_1 (fat_type,
1723
                                    get_identifier ("dim"),
1724
                                    arraytype, &chain);
1725
  TREE_NO_WARNING (decl) = 1;
1726
 
1727
  if (gfc_option.coarray == GFC_FCOARRAY_LIB && codimen
1728
      && akind == GFC_ARRAY_ALLOCATABLE)
1729
    {
1730
      decl = gfc_add_field_to_struct_1 (fat_type,
1731
                                        get_identifier ("token"),
1732
                                        prvoid_type_node, &chain);
1733
      TREE_NO_WARNING (decl) = 1;
1734
    }
1735
 
1736
  /* Finish off the type.  */
1737
  gfc_finish_type (fat_type);
1738
  TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (fat_type)) = 1;
1739
 
1740
  if (gfc_option.coarray == GFC_FCOARRAY_LIB && codimen
1741
      && akind == GFC_ARRAY_ALLOCATABLE)
1742
    gfc_array_descriptor_base_caf[idx] = fat_type;
1743
  else
1744
    gfc_array_descriptor_base[idx] = fat_type;
1745
 
1746
  return fat_type;
1747
}
1748
 
1749
 
1750
/* Build an array (descriptor) type with given bounds.  */
1751
 
1752
tree
1753
gfc_get_array_type_bounds (tree etype, int dimen, int codimen, tree * lbound,
1754
                           tree * ubound, int packed,
1755
                           enum gfc_array_kind akind, bool restricted)
1756
{
1757
  char name[8 + 2*GFC_RANK_DIGITS + 1 + GFC_MAX_SYMBOL_LEN];
1758
  tree fat_type, base_type, arraytype, lower, upper, stride, tmp, rtype;
1759
  const char *type_name;
1760
  int n;
1761
 
1762
  base_type = gfc_get_array_descriptor_base (dimen, codimen, restricted, akind);
1763
  fat_type = build_distinct_type_copy (base_type);
1764
  /* Make sure that nontarget and target array type have the same canonical
1765
     type (and same stub decl for debug info).  */
1766
  base_type = gfc_get_array_descriptor_base (dimen, codimen, false, akind);
1767
  TYPE_CANONICAL (fat_type) = base_type;
1768
  TYPE_STUB_DECL (fat_type) = TYPE_STUB_DECL (base_type);
1769
 
1770
  tmp = TYPE_NAME (etype);
1771
  if (tmp && TREE_CODE (tmp) == TYPE_DECL)
1772
    tmp = DECL_NAME (tmp);
1773
  if (tmp)
1774
    type_name = IDENTIFIER_POINTER (tmp);
1775
  else
1776
    type_name = "unknown";
1777
  sprintf (name, "array" GFC_RANK_PRINTF_FORMAT "_%.*s", dimen + codimen,
1778
           GFC_MAX_SYMBOL_LEN, type_name);
1779
  TYPE_NAME (fat_type) = get_identifier (name);
1780
  TYPE_NAMELESS (fat_type) = 1;
1781
 
1782
  GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
1783
  TYPE_LANG_SPECIFIC (fat_type)
1784
    = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
1785
 
1786
  GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
1787
  GFC_TYPE_ARRAY_CORANK (fat_type) = codimen;
1788
  GFC_TYPE_ARRAY_DTYPE (fat_type) = NULL_TREE;
1789
  GFC_TYPE_ARRAY_AKIND (fat_type) = akind;
1790
 
1791
  /* Build an array descriptor record type.  */
1792
  if (packed != 0)
1793
    stride = gfc_index_one_node;
1794
  else
1795
    stride = NULL_TREE;
1796
  for (n = 0; n < dimen + codimen; n++)
1797
    {
1798
      if (n < dimen)
1799
        GFC_TYPE_ARRAY_STRIDE (fat_type, n) = stride;
1800
 
1801
      if (lbound)
1802
        lower = lbound[n];
1803
      else
1804
        lower = NULL_TREE;
1805
 
1806
      if (lower != NULL_TREE)
1807
        {
1808
          if (INTEGER_CST_P (lower))
1809
            GFC_TYPE_ARRAY_LBOUND (fat_type, n) = lower;
1810
          else
1811
            lower = NULL_TREE;
1812
        }
1813
 
1814
      if (codimen && n == dimen + codimen - 1)
1815
        break;
1816
 
1817
      upper = ubound[n];
1818
      if (upper != NULL_TREE)
1819
        {
1820
          if (INTEGER_CST_P (upper))
1821
            GFC_TYPE_ARRAY_UBOUND (fat_type, n) = upper;
1822
          else
1823
            upper = NULL_TREE;
1824
        }
1825
 
1826
      if (n >= dimen)
1827
        continue;
1828
 
1829
      if (upper != NULL_TREE && lower != NULL_TREE && stride != NULL_TREE)
1830
        {
1831
          tmp = fold_build2_loc (input_location, MINUS_EXPR,
1832
                                 gfc_array_index_type, upper, lower);
1833
          tmp = fold_build2_loc (input_location, PLUS_EXPR,
1834
                                 gfc_array_index_type, tmp,
1835
                                 gfc_index_one_node);
1836
          stride = fold_build2_loc (input_location, MULT_EXPR,
1837
                                    gfc_array_index_type, tmp, stride);
1838
          /* Check the folding worked.  */
1839
          gcc_assert (INTEGER_CST_P (stride));
1840
        }
1841
      else
1842
        stride = NULL_TREE;
1843
    }
1844
  GFC_TYPE_ARRAY_SIZE (fat_type) = stride;
1845
 
1846
  /* TODO: known offsets for descriptors.  */
1847
  GFC_TYPE_ARRAY_OFFSET (fat_type) = NULL_TREE;
1848
 
1849
  if (dimen == 0)
1850
    {
1851
      arraytype =  build_pointer_type (etype);
1852
      if (restricted)
1853
        arraytype = build_qualified_type (arraytype, TYPE_QUAL_RESTRICT);
1854
 
1855
      GFC_TYPE_ARRAY_DATAPTR_TYPE (fat_type) = arraytype;
1856
      return fat_type;
1857
    }
1858
 
1859
  /* We define data as an array with the correct size if possible.
1860
     Much better than doing pointer arithmetic.  */
1861
  if (stride)
1862
    rtype = build_range_type (gfc_array_index_type, gfc_index_zero_node,
1863
                              int_const_binop (MINUS_EXPR, stride,
1864
                                               integer_one_node));
1865
  else
1866
    rtype = gfc_array_range_type;
1867
  arraytype = build_array_type (etype, rtype);
1868
  arraytype = build_pointer_type (arraytype);
1869
  if (restricted)
1870
    arraytype = build_qualified_type (arraytype, TYPE_QUAL_RESTRICT);
1871
  GFC_TYPE_ARRAY_DATAPTR_TYPE (fat_type) = arraytype;
1872
 
1873
  /* This will generate the base declarations we need to emit debug
1874
     information for this type.  FIXME: there must be a better way to
1875
     avoid divergence between compilations with and without debug
1876
     information.  */
1877
  {
1878
    struct array_descr_info info;
1879
    gfc_get_array_descr_info (fat_type, &info);
1880
    gfc_get_array_descr_info (build_pointer_type (fat_type), &info);
1881
  }
1882
 
1883
  return fat_type;
1884
}
1885
 
1886
/* Build a pointer type. This function is called from gfc_sym_type().  */
1887
 
1888
static tree
1889
gfc_build_pointer_type (gfc_symbol * sym, tree type)
1890
{
1891
  /* Array pointer types aren't actually pointers.  */
1892
  if (sym->attr.dimension)
1893
    return type;
1894
  else
1895
    return build_pointer_type (type);
1896
}
1897
 
1898
static tree gfc_nonrestricted_type (tree t);
1899
/* Given two record or union type nodes TO and FROM, ensure
1900
   that all fields in FROM have a corresponding field in TO,
1901
   their type being nonrestrict variants.  This accepts a TO
1902
   node that already has a prefix of the fields in FROM.  */
1903
static void
1904
mirror_fields (tree to, tree from)
1905
{
1906
  tree fto, ffrom;
1907
  tree *chain;
1908
 
1909
  /* Forward to the end of TOs fields.  */
1910
  fto = TYPE_FIELDS (to);
1911
  ffrom = TYPE_FIELDS (from);
1912
  chain = &TYPE_FIELDS (to);
1913
  while (fto)
1914
    {
1915
      gcc_assert (ffrom && DECL_NAME (fto) == DECL_NAME (ffrom));
1916
      chain = &DECL_CHAIN (fto);
1917
      fto = DECL_CHAIN (fto);
1918
      ffrom = DECL_CHAIN (ffrom);
1919
    }
1920
 
1921
  /* Now add all fields remaining in FROM (starting with ffrom).  */
1922
  for (; ffrom; ffrom = DECL_CHAIN (ffrom))
1923
    {
1924
      tree newfield = copy_node (ffrom);
1925
      DECL_CONTEXT (newfield) = to;
1926
      /* The store to DECL_CHAIN might seem redundant with the
1927
         stores to *chain, but not clearing it here would mean
1928
         leaving a chain into the old fields.  If ever
1929
         our called functions would look at them confusion
1930
         will arise.  */
1931
      DECL_CHAIN (newfield) = NULL_TREE;
1932
      *chain = newfield;
1933
      chain = &DECL_CHAIN (newfield);
1934
 
1935
      if (TREE_CODE (ffrom) == FIELD_DECL)
1936
        {
1937
          tree elemtype = gfc_nonrestricted_type (TREE_TYPE (ffrom));
1938
          TREE_TYPE (newfield) = elemtype;
1939
        }
1940
    }
1941
  *chain = NULL_TREE;
1942
}
1943
 
1944
/* Given a type T, returns a different type of the same structure,
1945
   except that all types it refers to (recursively) are always
1946
   non-restrict qualified types.  */
1947
static tree
1948
gfc_nonrestricted_type (tree t)
1949
{
1950
  tree ret = t;
1951
 
1952
  /* If the type isn't layed out yet, don't copy it.  If something
1953
     needs it for real it should wait until the type got finished.  */
1954
  if (!TYPE_SIZE (t))
1955
    return t;
1956
 
1957
  if (!TYPE_LANG_SPECIFIC (t))
1958
    TYPE_LANG_SPECIFIC (t)
1959
      = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
1960
  /* If we're dealing with this very node already further up
1961
     the call chain (recursion via pointers and struct members)
1962
     we haven't yet determined if we really need a new type node.
1963
     Assume we don't, return T itself.  */
1964
  if (TYPE_LANG_SPECIFIC (t)->nonrestricted_type == error_mark_node)
1965
    return t;
1966
 
1967
  /* If we have calculated this all already, just return it.  */
1968
  if (TYPE_LANG_SPECIFIC (t)->nonrestricted_type)
1969
    return TYPE_LANG_SPECIFIC (t)->nonrestricted_type;
1970
 
1971
  /* Mark this type.  */
1972
  TYPE_LANG_SPECIFIC (t)->nonrestricted_type = error_mark_node;
1973
 
1974
  switch (TREE_CODE (t))
1975
    {
1976
      default:
1977
        break;
1978
 
1979
      case POINTER_TYPE:
1980
      case REFERENCE_TYPE:
1981
        {
1982
          tree totype = gfc_nonrestricted_type (TREE_TYPE (t));
1983
          if (totype == TREE_TYPE (t))
1984
            ret = t;
1985
          else if (TREE_CODE (t) == POINTER_TYPE)
1986
            ret = build_pointer_type (totype);
1987
          else
1988
            ret = build_reference_type (totype);
1989
          ret = build_qualified_type (ret,
1990
                                      TYPE_QUALS (t) & ~TYPE_QUAL_RESTRICT);
1991
        }
1992
        break;
1993
 
1994
      case ARRAY_TYPE:
1995
        {
1996
          tree elemtype = gfc_nonrestricted_type (TREE_TYPE (t));
1997
          if (elemtype == TREE_TYPE (t))
1998
            ret = t;
1999
          else
2000
            {
2001
              ret = build_variant_type_copy (t);
2002
              TREE_TYPE (ret) = elemtype;
2003
              if (TYPE_LANG_SPECIFIC (t)
2004
                  && GFC_TYPE_ARRAY_DATAPTR_TYPE (t))
2005
                {
2006
                  tree dataptr_type = GFC_TYPE_ARRAY_DATAPTR_TYPE (t);
2007
                  dataptr_type = gfc_nonrestricted_type (dataptr_type);
2008
                  if (dataptr_type != GFC_TYPE_ARRAY_DATAPTR_TYPE (t))
2009
                    {
2010
                      TYPE_LANG_SPECIFIC (ret)
2011
                        = ggc_alloc_cleared_lang_type (sizeof (struct
2012
                                                               lang_type));
2013
                      *TYPE_LANG_SPECIFIC (ret) = *TYPE_LANG_SPECIFIC (t);
2014
                      GFC_TYPE_ARRAY_DATAPTR_TYPE (ret) = dataptr_type;
2015
                    }
2016
                }
2017
            }
2018
        }
2019
        break;
2020
 
2021
      case RECORD_TYPE:
2022
      case UNION_TYPE:
2023
      case QUAL_UNION_TYPE:
2024
        {
2025
          tree field;
2026
          /* First determine if we need a new type at all.
2027
             Careful, the two calls to gfc_nonrestricted_type per field
2028
             might return different values.  That happens exactly when
2029
             one of the fields reaches back to this very record type
2030
             (via pointers).  The first calls will assume that we don't
2031
             need to copy T (see the error_mark_node marking).  If there
2032
             are any reasons for copying T apart from having to copy T,
2033
             we'll indeed copy it, and the second calls to
2034
             gfc_nonrestricted_type will use that new node if they
2035
             reach back to T.  */
2036
          for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
2037
            if (TREE_CODE (field) == FIELD_DECL)
2038
              {
2039
                tree elemtype = gfc_nonrestricted_type (TREE_TYPE (field));
2040
                if (elemtype != TREE_TYPE (field))
2041
                  break;
2042
              }
2043
          if (!field)
2044
            break;
2045
          ret = build_variant_type_copy (t);
2046
          TYPE_FIELDS (ret) = NULL_TREE;
2047
 
2048
          /* Here we make sure that as soon as we know we have to copy
2049
             T, that also fields reaching back to us will use the new
2050
             copy.  It's okay if that copy still contains the old fields,
2051
             we won't look at them.  */
2052
          TYPE_LANG_SPECIFIC (t)->nonrestricted_type = ret;
2053
          mirror_fields (ret, t);
2054
        }
2055
        break;
2056
    }
2057
 
2058
  TYPE_LANG_SPECIFIC (t)->nonrestricted_type = ret;
2059
  return ret;
2060
}
2061
 
2062
 
2063
/* Return the type for a symbol.  Special handling is required for character
2064
   types to get the correct level of indirection.
2065
   For functions return the return type.
2066
   For subroutines return void_type_node.
2067
   Calling this multiple times for the same symbol should be avoided,
2068
   especially for character and array types.  */
2069
 
2070
tree
2071
gfc_sym_type (gfc_symbol * sym)
2072
{
2073
  tree type;
2074
  int byref;
2075
  bool restricted;
2076
 
2077
  /* Procedure Pointers inside COMMON blocks.  */
2078
  if (sym->attr.proc_pointer && sym->attr.in_common)
2079
    {
2080
      /* Unset proc_pointer as gfc_get_function_type calls gfc_sym_type.  */
2081
      sym->attr.proc_pointer = 0;
2082
      type = build_pointer_type (gfc_get_function_type (sym));
2083
      sym->attr.proc_pointer = 1;
2084
      return type;
2085
    }
2086
 
2087
  if (sym->attr.flavor == FL_PROCEDURE && !sym->attr.function)
2088
    return void_type_node;
2089
 
2090
  /* In the case of a function the fake result variable may have a
2091
     type different from the function type, so don't return early in
2092
     that case.  */
2093
  if (sym->backend_decl && !sym->attr.function)
2094
    return TREE_TYPE (sym->backend_decl);
2095
 
2096
  if (sym->ts.type == BT_CHARACTER
2097
      && ((sym->attr.function && sym->attr.is_bind_c)
2098
          || (sym->attr.result
2099
              && sym->ns->proc_name
2100
              && sym->ns->proc_name->attr.is_bind_c)))
2101
    type = gfc_character1_type_node;
2102
  else
2103
    type = gfc_typenode_for_spec (&sym->ts);
2104
 
2105
  if (sym->attr.dummy && !sym->attr.function && !sym->attr.value)
2106
    byref = 1;
2107
  else
2108
    byref = 0;
2109
 
2110
  restricted = !sym->attr.target && !sym->attr.pointer
2111
               && !sym->attr.proc_pointer && !sym->attr.cray_pointee;
2112
  if (!restricted)
2113
    type = gfc_nonrestricted_type (type);
2114
 
2115
  if (sym->attr.dimension || sym->attr.codimension)
2116
    {
2117
      if (gfc_is_nodesc_array (sym))
2118
        {
2119
          /* If this is a character argument of unknown length, just use the
2120
             base type.  */
2121
          if (sym->ts.type != BT_CHARACTER
2122
              || !(sym->attr.dummy || sym->attr.function)
2123
              || sym->ts.u.cl->backend_decl)
2124
            {
2125
              type = gfc_get_nodesc_array_type (type, sym->as,
2126
                                                byref ? PACKED_FULL
2127
                                                      : PACKED_STATIC,
2128
                                                restricted);
2129
              byref = 0;
2130
            }
2131
 
2132
          if (sym->attr.cray_pointee)
2133
            GFC_POINTER_TYPE_P (type) = 1;
2134
        }
2135
      else
2136
        {
2137
          enum gfc_array_kind akind = GFC_ARRAY_UNKNOWN;
2138
          if (sym->attr.pointer)
2139
            akind = sym->attr.contiguous ? GFC_ARRAY_POINTER_CONT
2140
                                         : GFC_ARRAY_POINTER;
2141
          else if (sym->attr.allocatable)
2142
            akind = GFC_ARRAY_ALLOCATABLE;
2143
          type = gfc_build_array_type (type, sym->as, akind, restricted,
2144
                                       sym->attr.contiguous);
2145
        }
2146
    }
2147
  else
2148
    {
2149
      if (sym->attr.allocatable || sym->attr.pointer
2150
          || gfc_is_associate_pointer (sym))
2151
        type = gfc_build_pointer_type (sym, type);
2152
      if (sym->attr.pointer || sym->attr.cray_pointee)
2153
        GFC_POINTER_TYPE_P (type) = 1;
2154
    }
2155
 
2156
  /* We currently pass all parameters by reference.
2157
     See f95_get_function_decl.  For dummy function parameters return the
2158
     function type.  */
2159
  if (byref)
2160
    {
2161
      /* We must use pointer types for potentially absent variables.  The
2162
         optimizers assume a reference type argument is never NULL.  */
2163
      if (sym->attr.optional
2164
          || (sym->ns->proc_name && sym->ns->proc_name->attr.entry_master))
2165
        type = build_pointer_type (type);
2166
      else
2167
        {
2168
          type = build_reference_type (type);
2169
          if (restricted)
2170
            type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
2171
        }
2172
    }
2173
 
2174
  return (type);
2175
}
2176
 
2177
/* Layout and output debug info for a record type.  */
2178
 
2179
void
2180
gfc_finish_type (tree type)
2181
{
2182
  tree decl;
2183
 
2184
  decl = build_decl (input_location,
2185
                     TYPE_DECL, NULL_TREE, type);
2186
  TYPE_STUB_DECL (type) = decl;
2187
  layout_type (type);
2188
  rest_of_type_compilation (type, 1);
2189
  rest_of_decl_compilation (decl, 1, 0);
2190
}
2191
 
2192
/* Add a field of given NAME and TYPE to the context of a UNION_TYPE
2193
   or RECORD_TYPE pointed to by CONTEXT.  The new field is chained
2194
   to the end of the field list pointed to by *CHAIN.
2195
 
2196
   Returns a pointer to the new field.  */
2197
 
2198
static tree
2199
gfc_add_field_to_struct_1 (tree context, tree name, tree type, tree **chain)
2200
{
2201
  tree decl = build_decl (input_location, FIELD_DECL, name, type);
2202
 
2203
  DECL_CONTEXT (decl) = context;
2204
  DECL_CHAIN (decl) = NULL_TREE;
2205
  if (TYPE_FIELDS (context) == NULL_TREE)
2206
    TYPE_FIELDS (context) = decl;
2207
  if (chain != NULL)
2208
    {
2209
      if (*chain != NULL)
2210
        **chain = decl;
2211
      *chain = &DECL_CHAIN (decl);
2212
    }
2213
 
2214
  return decl;
2215
}
2216
 
2217
/* Like `gfc_add_field_to_struct_1', but adds alignment
2218
   information.  */
2219
 
2220
tree
2221
gfc_add_field_to_struct (tree context, tree name, tree type, tree **chain)
2222
{
2223
  tree decl = gfc_add_field_to_struct_1 (context, name, type, chain);
2224
 
2225
  DECL_INITIAL (decl) = 0;
2226
  DECL_ALIGN (decl) = 0;
2227
  DECL_USER_ALIGN (decl) = 0;
2228
 
2229
  return decl;
2230
}
2231
 
2232
 
2233
/* Copy the backend_decl and component backend_decls if
2234
   the two derived type symbols are "equal", as described
2235
   in 4.4.2 and resolved by gfc_compare_derived_types.  */
2236
 
2237
int
2238
gfc_copy_dt_decls_ifequal (gfc_symbol *from, gfc_symbol *to,
2239
                           bool from_gsym)
2240
{
2241
  gfc_component *to_cm;
2242
  gfc_component *from_cm;
2243
 
2244
  if (from == to)
2245
    return 1;
2246
 
2247
  if (from->backend_decl == NULL
2248
        || !gfc_compare_derived_types (from, to))
2249
    return 0;
2250
 
2251
  to->backend_decl = from->backend_decl;
2252
 
2253
  to_cm = to->components;
2254
  from_cm = from->components;
2255
 
2256
  /* Copy the component declarations.  If a component is itself
2257
     a derived type, we need a copy of its component declarations.
2258
     This is done by recursing into gfc_get_derived_type and
2259
     ensures that the component's component declarations have
2260
     been built.  If it is a character, we need the character
2261
     length, as well.  */
2262
  for (; to_cm; to_cm = to_cm->next, from_cm = from_cm->next)
2263
    {
2264
      to_cm->backend_decl = from_cm->backend_decl;
2265
      if (from_cm->ts.type == BT_DERIVED
2266
          && (!from_cm->attr.pointer || from_gsym))
2267
        gfc_get_derived_type (to_cm->ts.u.derived);
2268
      else if (from_cm->ts.type == BT_CLASS
2269
               && (!CLASS_DATA (from_cm)->attr.class_pointer || from_gsym))
2270
        gfc_get_derived_type (to_cm->ts.u.derived);
2271
      else if (from_cm->ts.type == BT_CHARACTER)
2272
        to_cm->ts.u.cl->backend_decl = from_cm->ts.u.cl->backend_decl;
2273
    }
2274
 
2275
  return 1;
2276
}
2277
 
2278
 
2279
/* Build a tree node for a procedure pointer component.  */
2280
 
2281
tree
2282
gfc_get_ppc_type (gfc_component* c)
2283
{
2284
  tree t;
2285
 
2286
  /* Explicit interface.  */
2287
  if (c->attr.if_source != IFSRC_UNKNOWN && c->ts.interface)
2288
    return build_pointer_type (gfc_get_function_type (c->ts.interface));
2289
 
2290
  /* Implicit interface (only return value may be known).  */
2291
  if (c->attr.function && !c->attr.dimension && c->ts.type != BT_CHARACTER)
2292
    t = gfc_typenode_for_spec (&c->ts);
2293
  else
2294
    t = void_type_node;
2295
 
2296
  return build_pointer_type (build_function_type_list (t, NULL_TREE));
2297
}
2298
 
2299
 
2300
/* Build a tree node for a derived type.  If there are equal
2301
   derived types, with different local names, these are built
2302
   at the same time.  If an equal derived type has been built
2303
   in a parent namespace, this is used.  */
2304
 
2305
tree
2306
gfc_get_derived_type (gfc_symbol * derived)
2307
{
2308
  tree typenode = NULL, field = NULL, field_type = NULL;
2309
  tree canonical = NULL_TREE;
2310
  tree *chain = NULL;
2311
  bool got_canonical = false;
2312
  gfc_component *c;
2313
  gfc_dt_list *dt;
2314
  gfc_namespace *ns;
2315
 
2316
  if (derived && derived->attr.flavor == FL_PROCEDURE
2317
      && derived->attr.generic)
2318
    derived = gfc_find_dt_in_generic (derived);
2319
 
2320
  gcc_assert (derived && derived->attr.flavor == FL_DERIVED);
2321
 
2322
  /* See if it's one of the iso_c_binding derived types.  */
2323
  if (derived->attr.is_iso_c == 1)
2324
    {
2325
      if (derived->backend_decl)
2326
        return derived->backend_decl;
2327
 
2328
      if (derived->intmod_sym_id == ISOCBINDING_PTR)
2329
        derived->backend_decl = ptr_type_node;
2330
      else
2331
        derived->backend_decl = pfunc_type_node;
2332
 
2333
      derived->ts.kind = gfc_index_integer_kind;
2334
      derived->ts.type = BT_INTEGER;
2335
      /* Set the f90_type to BT_VOID as a way to recognize something of type
2336
         BT_INTEGER that needs to fit a void * for the purpose of the
2337
         iso_c_binding derived types.  */
2338
      derived->ts.f90_type = BT_VOID;
2339
 
2340
      return derived->backend_decl;
2341
    }
2342
 
2343
  /* If use associated, use the module type for this one.  */
2344
  if (gfc_option.flag_whole_file
2345
        && derived->backend_decl == NULL
2346
        && derived->attr.use_assoc
2347
        && derived->module
2348
        && gfc_get_module_backend_decl (derived))
2349
    goto copy_derived_types;
2350
 
2351
  /* If a whole file compilation, the derived types from an earlier
2352
     namespace can be used as the canonical type.  */
2353
  if (gfc_option.flag_whole_file
2354
        && derived->backend_decl == NULL
2355
        && !derived->attr.use_assoc
2356
        && gfc_global_ns_list)
2357
    {
2358
      for (ns = gfc_global_ns_list;
2359
           ns->translated && !got_canonical;
2360
           ns = ns->sibling)
2361
        {
2362
          dt = ns->derived_types;
2363
          for (; dt && !canonical; dt = dt->next)
2364
            {
2365
              gfc_copy_dt_decls_ifequal (dt->derived, derived, true);
2366
              if (derived->backend_decl)
2367
                got_canonical = true;
2368
            }
2369
        }
2370
    }
2371
 
2372
  /* Store up the canonical type to be added to this one.  */
2373
  if (got_canonical)
2374
    {
2375
      if (TYPE_CANONICAL (derived->backend_decl))
2376
        canonical = TYPE_CANONICAL (derived->backend_decl);
2377
      else
2378
        canonical = derived->backend_decl;
2379
 
2380
      derived->backend_decl = NULL_TREE;
2381
    }
2382
 
2383
  /* derived->backend_decl != 0 means we saw it before, but its
2384
     components' backend_decl may have not been built.  */
2385
  if (derived->backend_decl)
2386
    {
2387
      /* Its components' backend_decl have been built or we are
2388
         seeing recursion through the formal arglist of a procedure
2389
         pointer component.  */
2390
      if (TYPE_FIELDS (derived->backend_decl)
2391
            || derived->attr.proc_pointer_comp)
2392
        return derived->backend_decl;
2393
      else
2394
        typenode = derived->backend_decl;
2395
    }
2396
  else
2397
    {
2398
      /* We see this derived type first time, so build the type node.  */
2399
      typenode = make_node (RECORD_TYPE);
2400
      TYPE_NAME (typenode) = get_identifier (derived->name);
2401
      TYPE_PACKED (typenode) = gfc_option.flag_pack_derived;
2402
      derived->backend_decl = typenode;
2403
    }
2404
 
2405
  /* Go through the derived type components, building them as
2406
     necessary. The reason for doing this now is that it is
2407
     possible to recurse back to this derived type through a
2408
     pointer component (PR24092). If this happens, the fields
2409
     will be built and so we can return the type.  */
2410
  for (c = derived->components; c; c = c->next)
2411
    {
2412
      if (c->ts.type != BT_DERIVED && c->ts.type != BT_CLASS)
2413
        continue;
2414
 
2415
      if ((!c->attr.pointer && !c->attr.proc_pointer)
2416
          || c->ts.u.derived->backend_decl == NULL)
2417
        c->ts.u.derived->backend_decl = gfc_get_derived_type (c->ts.u.derived);
2418
 
2419
      if (c->ts.u.derived && c->ts.u.derived->attr.is_iso_c)
2420
        {
2421
          /* Need to copy the modified ts from the derived type.  The
2422
             typespec was modified because C_PTR/C_FUNPTR are translated
2423
             into (void *) from derived types.  */
2424
          c->ts.type = c->ts.u.derived->ts.type;
2425
          c->ts.kind = c->ts.u.derived->ts.kind;
2426
          c->ts.f90_type = c->ts.u.derived->ts.f90_type;
2427
          if (c->initializer)
2428
            {
2429
              c->initializer->ts.type = c->ts.type;
2430
              c->initializer->ts.kind = c->ts.kind;
2431
              c->initializer->ts.f90_type = c->ts.f90_type;
2432
              c->initializer->expr_type = EXPR_NULL;
2433
            }
2434
        }
2435
    }
2436
 
2437
  if (TYPE_FIELDS (derived->backend_decl))
2438
    return derived->backend_decl;
2439
 
2440
  /* Build the type member list. Install the newly created RECORD_TYPE
2441
     node as DECL_CONTEXT of each FIELD_DECL.  */
2442
  for (c = derived->components; c; c = c->next)
2443
    {
2444
      if (c->attr.proc_pointer)
2445
        field_type = gfc_get_ppc_type (c);
2446
      else if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
2447
        field_type = c->ts.u.derived->backend_decl;
2448
      else
2449
        {
2450
          if (c->ts.type == BT_CHARACTER)
2451
            {
2452
              /* Evaluate the string length.  */
2453
              gfc_conv_const_charlen (c->ts.u.cl);
2454
              gcc_assert (c->ts.u.cl->backend_decl);
2455
            }
2456
 
2457
          field_type = gfc_typenode_for_spec (&c->ts);
2458
        }
2459
 
2460
      /* This returns an array descriptor type.  Initialization may be
2461
         required.  */
2462
      if ((c->attr.dimension || c->attr.codimension) && !c->attr.proc_pointer )
2463
        {
2464
          if (c->attr.pointer || c->attr.allocatable)
2465
            {
2466
              enum gfc_array_kind akind;
2467
              if (c->attr.pointer)
2468
                akind = c->attr.contiguous ? GFC_ARRAY_POINTER_CONT
2469
                                           : GFC_ARRAY_POINTER;
2470
              else
2471
                akind = GFC_ARRAY_ALLOCATABLE;
2472
              /* Pointers to arrays aren't actually pointer types.  The
2473
                 descriptors are separate, but the data is common.  */
2474
              field_type = gfc_build_array_type (field_type, c->as, akind,
2475
                                                 !c->attr.target
2476
                                                 && !c->attr.pointer,
2477
                                                 c->attr.contiguous);
2478
            }
2479
          else
2480
            field_type = gfc_get_nodesc_array_type (field_type, c->as,
2481
                                                    PACKED_STATIC,
2482
                                                    !c->attr.target);
2483
        }
2484
      else if ((c->attr.pointer || c->attr.allocatable)
2485
               && !c->attr.proc_pointer)
2486
        field_type = build_pointer_type (field_type);
2487
 
2488
      if (c->attr.pointer)
2489
        field_type = gfc_nonrestricted_type (field_type);
2490
 
2491
      /* vtype fields can point to different types to the base type.  */
2492
      if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.vtype)
2493
          field_type = build_pointer_type_for_mode (TREE_TYPE (field_type),
2494
                                                    ptr_mode, true);
2495
 
2496
      field = gfc_add_field_to_struct (typenode,
2497
                                       get_identifier (c->name),
2498
                                       field_type, &chain);
2499
      if (c->loc.lb)
2500
        gfc_set_decl_location (field, &c->loc);
2501
      else if (derived->declared_at.lb)
2502
        gfc_set_decl_location (field, &derived->declared_at);
2503
 
2504
      DECL_PACKED (field) |= TYPE_PACKED (typenode);
2505
 
2506
      gcc_assert (field);
2507
      if (!c->backend_decl)
2508
        c->backend_decl = field;
2509
    }
2510
 
2511
  /* Now lay out the derived type, including the fields.  */
2512
  if (canonical)
2513
    TYPE_CANONICAL (typenode) = canonical;
2514
 
2515
  gfc_finish_type (typenode);
2516
  gfc_set_decl_location (TYPE_STUB_DECL (typenode), &derived->declared_at);
2517
  if (derived->module && derived->ns->proc_name
2518
      && derived->ns->proc_name->attr.flavor == FL_MODULE)
2519
    {
2520
      if (derived->ns->proc_name->backend_decl
2521
          && TREE_CODE (derived->ns->proc_name->backend_decl)
2522
             == NAMESPACE_DECL)
2523
        {
2524
          TYPE_CONTEXT (typenode) = derived->ns->proc_name->backend_decl;
2525
          DECL_CONTEXT (TYPE_STUB_DECL (typenode))
2526
            = derived->ns->proc_name->backend_decl;
2527
        }
2528
    }
2529
 
2530
  derived->backend_decl = typenode;
2531
 
2532
copy_derived_types:
2533
 
2534
  for (dt = gfc_derived_types; dt; dt = dt->next)
2535
    gfc_copy_dt_decls_ifequal (derived, dt->derived, false);
2536
 
2537
  return derived->backend_decl;
2538
}
2539
 
2540
 
2541
int
2542
gfc_return_by_reference (gfc_symbol * sym)
2543
{
2544
  if (!sym->attr.function)
2545
    return 0;
2546
 
2547
  if (sym->attr.dimension)
2548
    return 1;
2549
 
2550
  if (sym->ts.type == BT_CHARACTER
2551
      && !sym->attr.is_bind_c
2552
      && (!sym->attr.result
2553
          || !sym->ns->proc_name
2554
          || !sym->ns->proc_name->attr.is_bind_c))
2555
    return 1;
2556
 
2557
  /* Possibly return complex numbers by reference for g77 compatibility.
2558
     We don't do this for calls to intrinsics (as the library uses the
2559
     -fno-f2c calling convention), nor for calls to functions which always
2560
     require an explicit interface, as no compatibility problems can
2561
     arise there.  */
2562
  if (gfc_option.flag_f2c
2563
      && sym->ts.type == BT_COMPLEX
2564
      && !sym->attr.intrinsic && !sym->attr.always_explicit)
2565
    return 1;
2566
 
2567
  return 0;
2568
}
2569
 
2570
static tree
2571
gfc_get_mixed_entry_union (gfc_namespace *ns)
2572
{
2573
  tree type;
2574
  tree *chain = NULL;
2575
  char name[GFC_MAX_SYMBOL_LEN + 1];
2576
  gfc_entry_list *el, *el2;
2577
 
2578
  gcc_assert (ns->proc_name->attr.mixed_entry_master);
2579
  gcc_assert (memcmp (ns->proc_name->name, "master.", 7) == 0);
2580
 
2581
  snprintf (name, GFC_MAX_SYMBOL_LEN, "munion.%s", ns->proc_name->name + 7);
2582
 
2583
  /* Build the type node.  */
2584
  type = make_node (UNION_TYPE);
2585
 
2586
  TYPE_NAME (type) = get_identifier (name);
2587
 
2588
  for (el = ns->entries; el; el = el->next)
2589
    {
2590
      /* Search for duplicates.  */
2591
      for (el2 = ns->entries; el2 != el; el2 = el2->next)
2592
        if (el2->sym->result == el->sym->result)
2593
          break;
2594
 
2595
      if (el == el2)
2596
        gfc_add_field_to_struct_1 (type,
2597
                                   get_identifier (el->sym->result->name),
2598
                                   gfc_sym_type (el->sym->result), &chain);
2599
    }
2600
 
2601
  /* Finish off the type.  */
2602
  gfc_finish_type (type);
2603
  TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) = 1;
2604
  return type;
2605
}
2606
 
2607
/* Create a "fn spec" based on the formal arguments;
2608
   cf. create_function_arglist.  */
2609
 
2610
static tree
2611
create_fn_spec (gfc_symbol *sym, tree fntype)
2612
{
2613
  char spec[150];
2614
  size_t spec_len;
2615
  gfc_formal_arglist *f;
2616
  tree tmp;
2617
 
2618
  memset (&spec, 0, sizeof (spec));
2619
  spec[0] = '.';
2620
  spec_len = 1;
2621
 
2622
  if (sym->attr.entry_master)
2623
    spec[spec_len++] = 'R';
2624
  if (gfc_return_by_reference (sym))
2625
    {
2626
      gfc_symbol *result = sym->result ? sym->result : sym;
2627
 
2628
      if (result->attr.pointer || sym->attr.proc_pointer)
2629
        spec[spec_len++] = '.';
2630
      else
2631
        spec[spec_len++] = 'w';
2632
      if (sym->ts.type == BT_CHARACTER)
2633
        spec[spec_len++] = 'R';
2634
    }
2635
 
2636
  for (f = sym->formal; f; f = f->next)
2637
    if (spec_len < sizeof (spec))
2638
      {
2639
        if (!f->sym || f->sym->attr.pointer || f->sym->attr.target
2640
            || f->sym->attr.external || f->sym->attr.cray_pointer
2641
            || (f->sym->ts.type == BT_DERIVED
2642
                && (f->sym->ts.u.derived->attr.proc_pointer_comp
2643
                    || f->sym->ts.u.derived->attr.pointer_comp))
2644
            || (f->sym->ts.type == BT_CLASS
2645
                && (CLASS_DATA (f->sym)->ts.u.derived->attr.proc_pointer_comp
2646
                    || CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp)))
2647
          spec[spec_len++] = '.';
2648
        else if (f->sym->attr.intent == INTENT_IN)
2649
          spec[spec_len++] = 'r';
2650
        else if (f->sym)
2651
          spec[spec_len++] = 'w';
2652
      }
2653
 
2654
  tmp = build_tree_list (NULL_TREE, build_string (spec_len, spec));
2655
  tmp = tree_cons (get_identifier ("fn spec"), tmp, TYPE_ATTRIBUTES (fntype));
2656
  return build_type_attribute_variant (fntype, tmp);
2657
}
2658
 
2659
 
2660
tree
2661
gfc_get_function_type (gfc_symbol * sym)
2662
{
2663
  tree type;
2664
  VEC(tree,gc) *typelist;
2665
  gfc_formal_arglist *f;
2666
  gfc_symbol *arg;
2667
  int alternate_return;
2668
  bool is_varargs = true;
2669
 
2670
  /* Make sure this symbol is a function, a subroutine or the main
2671
     program.  */
2672
  gcc_assert (sym->attr.flavor == FL_PROCEDURE
2673
              || sym->attr.flavor == FL_PROGRAM);
2674
 
2675
  if (sym->backend_decl)
2676
    return TREE_TYPE (sym->backend_decl);
2677
 
2678
  alternate_return = 0;
2679
  typelist = NULL;
2680
 
2681
  if (sym->attr.entry_master)
2682
    /* Additional parameter for selecting an entry point.  */
2683
    VEC_safe_push (tree, gc, typelist, gfc_array_index_type);
2684
 
2685
  if (sym->result)
2686
    arg = sym->result;
2687
  else
2688
    arg = sym;
2689
 
2690
  if (arg->ts.type == BT_CHARACTER)
2691
    gfc_conv_const_charlen (arg->ts.u.cl);
2692
 
2693
  /* Some functions we use an extra parameter for the return value.  */
2694
  if (gfc_return_by_reference (sym))
2695
    {
2696
      type = gfc_sym_type (arg);
2697
      if (arg->ts.type == BT_COMPLEX
2698
          || arg->attr.dimension
2699
          || arg->ts.type == BT_CHARACTER)
2700
        type = build_reference_type (type);
2701
 
2702
      VEC_safe_push (tree, gc, typelist, type);
2703
      if (arg->ts.type == BT_CHARACTER)
2704
        {
2705
          if (!arg->ts.deferred)
2706
            /* Transfer by value.  */
2707
            VEC_safe_push (tree, gc, typelist, gfc_charlen_type_node);
2708
          else
2709
            /* Deferred character lengths are transferred by reference
2710
               so that the value can be returned.  */
2711
            VEC_safe_push (tree, gc, typelist,
2712
                           build_pointer_type (gfc_charlen_type_node));
2713
        }
2714
    }
2715
 
2716
  /* Build the argument types for the function.  */
2717
  for (f = sym->formal; f; f = f->next)
2718
    {
2719
      arg = f->sym;
2720
      if (arg)
2721
        {
2722
          /* Evaluate constant character lengths here so that they can be
2723
             included in the type.  */
2724
          if (arg->ts.type == BT_CHARACTER)
2725
            gfc_conv_const_charlen (arg->ts.u.cl);
2726
 
2727
          if (arg->attr.flavor == FL_PROCEDURE)
2728
            {
2729
              type = gfc_get_function_type (arg);
2730
              type = build_pointer_type (type);
2731
            }
2732
          else
2733
            type = gfc_sym_type (arg);
2734
 
2735
          /* Parameter Passing Convention
2736
 
2737
             We currently pass all parameters by reference.
2738
             Parameters with INTENT(IN) could be passed by value.
2739
             The problem arises if a function is called via an implicit
2740
             prototype. In this situation the INTENT is not known.
2741
             For this reason all parameters to global functions must be
2742
             passed by reference.  Passing by value would potentially
2743
             generate bad code.  Worse there would be no way of telling that
2744
             this code was bad, except that it would give incorrect results.
2745
 
2746
             Contained procedures could pass by value as these are never
2747
             used without an explicit interface, and cannot be passed as
2748
             actual parameters for a dummy procedure.  */
2749
 
2750
          VEC_safe_push (tree, gc, typelist, type);
2751
        }
2752
      else
2753
        {
2754
          if (sym->attr.subroutine)
2755
            alternate_return = 1;
2756
        }
2757
    }
2758
 
2759
  /* Add hidden string length parameters.  */
2760
  for (f = sym->formal; f; f = f->next)
2761
    {
2762
      arg = f->sym;
2763
      if (arg && arg->ts.type == BT_CHARACTER && !sym->attr.is_bind_c)
2764
        {
2765
          if (!arg->ts.deferred)
2766
            /* Transfer by value.  */
2767
            type = gfc_charlen_type_node;
2768
          else
2769
            /* Deferred character lengths are transferred by reference
2770
               so that the value can be returned.  */
2771
            type = build_pointer_type (gfc_charlen_type_node);
2772
 
2773
          VEC_safe_push (tree, gc, typelist, type);
2774
        }
2775
    }
2776
 
2777
  if (!VEC_empty (tree, typelist)
2778
      || sym->attr.is_main_program
2779
      || sym->attr.if_source != IFSRC_UNKNOWN)
2780
    is_varargs = false;
2781
 
2782
  if (alternate_return)
2783
    type = integer_type_node;
2784
  else if (!sym->attr.function || gfc_return_by_reference (sym))
2785
    type = void_type_node;
2786
  else if (sym->attr.mixed_entry_master)
2787
    type = gfc_get_mixed_entry_union (sym->ns);
2788
  else if (gfc_option.flag_f2c
2789
           && sym->ts.type == BT_REAL
2790
           && sym->ts.kind == gfc_default_real_kind
2791
           && !sym->attr.always_explicit)
2792
    {
2793
      /* Special case: f2c calling conventions require that (scalar)
2794
         default REAL functions return the C type double instead.  f2c
2795
         compatibility is only an issue with functions that don't
2796
         require an explicit interface, as only these could be
2797
         implemented in Fortran 77.  */
2798
      sym->ts.kind = gfc_default_double_kind;
2799
      type = gfc_typenode_for_spec (&sym->ts);
2800
      sym->ts.kind = gfc_default_real_kind;
2801
    }
2802
  else if (sym->result && sym->result->attr.proc_pointer)
2803
    /* Procedure pointer return values.  */
2804
    {
2805
      if (sym->result->attr.result && strcmp (sym->name,"ppr@") != 0)
2806
        {
2807
          /* Unset proc_pointer as gfc_get_function_type
2808
             is called recursively.  */
2809
          sym->result->attr.proc_pointer = 0;
2810
          type = build_pointer_type (gfc_get_function_type (sym->result));
2811
          sym->result->attr.proc_pointer = 1;
2812
        }
2813
      else
2814
       type = gfc_sym_type (sym->result);
2815
    }
2816
  else
2817
    type = gfc_sym_type (sym);
2818
 
2819
  if (is_varargs)
2820
    type = build_varargs_function_type_vec (type, typelist);
2821
  else
2822
    type = build_function_type_vec (type, typelist);
2823
  type = create_fn_spec (sym, type);
2824
 
2825
  return type;
2826
}
2827
 
2828
/* Language hooks for middle-end access to type nodes.  */
2829
 
2830
/* Return an integer type with BITS bits of precision,
2831
   that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
2832
 
2833
tree
2834
gfc_type_for_size (unsigned bits, int unsignedp)
2835
{
2836
  if (!unsignedp)
2837
    {
2838
      int i;
2839
      for (i = 0; i <= MAX_INT_KINDS; ++i)
2840
        {
2841
          tree type = gfc_integer_types[i];
2842
          if (type && bits == TYPE_PRECISION (type))
2843
            return type;
2844
        }
2845
 
2846
      /* Handle TImode as a special case because it is used by some backends
2847
         (e.g. ARM) even though it is not available for normal use.  */
2848
#if HOST_BITS_PER_WIDE_INT >= 64
2849
      if (bits == TYPE_PRECISION (intTI_type_node))
2850
        return intTI_type_node;
2851
#endif
2852
 
2853
      if (bits <= TYPE_PRECISION (intQI_type_node))
2854
        return intQI_type_node;
2855
      if (bits <= TYPE_PRECISION (intHI_type_node))
2856
        return intHI_type_node;
2857
      if (bits <= TYPE_PRECISION (intSI_type_node))
2858
        return intSI_type_node;
2859
      if (bits <= TYPE_PRECISION (intDI_type_node))
2860
        return intDI_type_node;
2861
      if (bits <= TYPE_PRECISION (intTI_type_node))
2862
        return intTI_type_node;
2863
    }
2864
  else
2865
    {
2866
      if (bits <= TYPE_PRECISION (unsigned_intQI_type_node))
2867
        return unsigned_intQI_type_node;
2868
      if (bits <= TYPE_PRECISION (unsigned_intHI_type_node))
2869
        return unsigned_intHI_type_node;
2870
      if (bits <= TYPE_PRECISION (unsigned_intSI_type_node))
2871
        return unsigned_intSI_type_node;
2872
      if (bits <= TYPE_PRECISION (unsigned_intDI_type_node))
2873
        return unsigned_intDI_type_node;
2874
      if (bits <= TYPE_PRECISION (unsigned_intTI_type_node))
2875
        return unsigned_intTI_type_node;
2876
    }
2877
 
2878
  return NULL_TREE;
2879
}
2880
 
2881
/* Return a data type that has machine mode MODE.  If the mode is an
2882
   integer, then UNSIGNEDP selects between signed and unsigned types.  */
2883
 
2884
tree
2885
gfc_type_for_mode (enum machine_mode mode, int unsignedp)
2886
{
2887
  int i;
2888
  tree *base;
2889
 
2890
  if (GET_MODE_CLASS (mode) == MODE_FLOAT)
2891
    base = gfc_real_types;
2892
  else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
2893
    base = gfc_complex_types;
2894
  else if (SCALAR_INT_MODE_P (mode))
2895
    {
2896
      tree type = gfc_type_for_size (GET_MODE_PRECISION (mode), unsignedp);
2897
      return type != NULL_TREE && mode == TYPE_MODE (type) ? type : NULL_TREE;
2898
    }
2899
  else if (VECTOR_MODE_P (mode))
2900
    {
2901
      enum machine_mode inner_mode = GET_MODE_INNER (mode);
2902
      tree inner_type = gfc_type_for_mode (inner_mode, unsignedp);
2903
      if (inner_type != NULL_TREE)
2904
        return build_vector_type_for_mode (inner_type, mode);
2905
      return NULL_TREE;
2906
    }
2907
  else
2908
    return NULL_TREE;
2909
 
2910
  for (i = 0; i <= MAX_REAL_KINDS; ++i)
2911
    {
2912
      tree type = base[i];
2913
      if (type && mode == TYPE_MODE (type))
2914
        return type;
2915
    }
2916
 
2917
  return NULL_TREE;
2918
}
2919
 
2920
/* Return TRUE if TYPE is a type with a hidden descriptor, fill in INFO
2921
   in that case.  */
2922
 
2923
bool
2924
gfc_get_array_descr_info (const_tree type, struct array_descr_info *info)
2925
{
2926
  int rank, dim;
2927
  bool indirect = false;
2928
  tree etype, ptype, field, t, base_decl;
2929
  tree data_off, dim_off, dim_size, elem_size;
2930
  tree lower_suboff, upper_suboff, stride_suboff;
2931
 
2932
  if (! GFC_DESCRIPTOR_TYPE_P (type))
2933
    {
2934
      if (! POINTER_TYPE_P (type))
2935
        return false;
2936
      type = TREE_TYPE (type);
2937
      if (! GFC_DESCRIPTOR_TYPE_P (type))
2938
        return false;
2939
      indirect = true;
2940
    }
2941
 
2942
  rank = GFC_TYPE_ARRAY_RANK (type);
2943
  if (rank >= (int) (sizeof (info->dimen) / sizeof (info->dimen[0])))
2944
    return false;
2945
 
2946
  etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
2947
  gcc_assert (POINTER_TYPE_P (etype));
2948
  etype = TREE_TYPE (etype);
2949
 
2950
  /* If the type is not a scalar coarray.  */
2951
  if (TREE_CODE (etype) == ARRAY_TYPE)
2952
    etype = TREE_TYPE (etype);
2953
 
2954
  /* Can't handle variable sized elements yet.  */
2955
  if (int_size_in_bytes (etype) <= 0)
2956
    return false;
2957
  /* Nor non-constant lower bounds in assumed shape arrays.  */
2958
  if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE
2959
      || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE_CONT)
2960
    {
2961
      for (dim = 0; dim < rank; dim++)
2962
        if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE
2963
            || TREE_CODE (GFC_TYPE_ARRAY_LBOUND (type, dim)) != INTEGER_CST)
2964
          return false;
2965
    }
2966
 
2967
  memset (info, '\0', sizeof (*info));
2968
  info->ndimensions = rank;
2969
  info->element_type = etype;
2970
  ptype = build_pointer_type (gfc_array_index_type);
2971
  base_decl = GFC_TYPE_ARRAY_BASE_DECL (type, indirect);
2972
  if (!base_decl)
2973
    {
2974
      base_decl = build_decl (input_location, VAR_DECL, NULL_TREE,
2975
                              indirect ? build_pointer_type (ptype) : ptype);
2976
      GFC_TYPE_ARRAY_BASE_DECL (type, indirect) = base_decl;
2977
    }
2978
  info->base_decl = base_decl;
2979
  if (indirect)
2980
    base_decl = build1 (INDIRECT_REF, ptype, base_decl);
2981
 
2982
  if (GFC_TYPE_ARRAY_SPAN (type))
2983
    elem_size = GFC_TYPE_ARRAY_SPAN (type);
2984
  else
2985
    elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype));
2986
  field = TYPE_FIELDS (TYPE_MAIN_VARIANT (type));
2987
  data_off = byte_position (field);
2988
  field = DECL_CHAIN (field);
2989
  field = DECL_CHAIN (field);
2990
  field = DECL_CHAIN (field);
2991
  dim_off = byte_position (field);
2992
  dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (field)));
2993
  field = TYPE_FIELDS (TREE_TYPE (TREE_TYPE (field)));
2994
  stride_suboff = byte_position (field);
2995
  field = DECL_CHAIN (field);
2996
  lower_suboff = byte_position (field);
2997
  field = DECL_CHAIN (field);
2998
  upper_suboff = byte_position (field);
2999
 
3000
  t = base_decl;
3001
  if (!integer_zerop (data_off))
3002
    t = fold_build_pointer_plus (t, data_off);
3003
  t = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), t);
3004
  info->data_location = build1 (INDIRECT_REF, ptr_type_node, t);
3005
  if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
3006
    info->allocated = build2 (NE_EXPR, boolean_type_node,
3007
                              info->data_location, null_pointer_node);
3008
  else if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER
3009
           || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT)
3010
    info->associated = build2 (NE_EXPR, boolean_type_node,
3011
                               info->data_location, null_pointer_node);
3012
 
3013
  for (dim = 0; dim < rank; dim++)
3014
    {
3015
      t = fold_build_pointer_plus (base_decl,
3016
                                   size_binop (PLUS_EXPR,
3017
                                               dim_off, lower_suboff));
3018
      t = build1 (INDIRECT_REF, gfc_array_index_type, t);
3019
      info->dimen[dim].lower_bound = t;
3020
      t = fold_build_pointer_plus (base_decl,
3021
                                   size_binop (PLUS_EXPR,
3022
                                               dim_off, upper_suboff));
3023
      t = build1 (INDIRECT_REF, gfc_array_index_type, t);
3024
      info->dimen[dim].upper_bound = t;
3025
      if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE
3026
          || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE_CONT)
3027
        {
3028
          /* Assumed shape arrays have known lower bounds.  */
3029
          info->dimen[dim].upper_bound
3030
            = build2 (MINUS_EXPR, gfc_array_index_type,
3031
                      info->dimen[dim].upper_bound,
3032
                      info->dimen[dim].lower_bound);
3033
          info->dimen[dim].lower_bound
3034
            = fold_convert (gfc_array_index_type,
3035
                            GFC_TYPE_ARRAY_LBOUND (type, dim));
3036
          info->dimen[dim].upper_bound
3037
            = build2 (PLUS_EXPR, gfc_array_index_type,
3038
                      info->dimen[dim].lower_bound,
3039
                      info->dimen[dim].upper_bound);
3040
        }
3041
      t = fold_build_pointer_plus (base_decl,
3042
                                   size_binop (PLUS_EXPR,
3043
                                               dim_off, stride_suboff));
3044
      t = build1 (INDIRECT_REF, gfc_array_index_type, t);
3045
      t = build2 (MULT_EXPR, gfc_array_index_type, t, elem_size);
3046
      info->dimen[dim].stride = t;
3047
      dim_off = size_binop (PLUS_EXPR, dim_off, dim_size);
3048
    }
3049
 
3050
  return true;
3051
}
3052
 
3053
#include "gt-fortran-trans-types.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.