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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [fortran/] [module.c] - Blame information for rev 859

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 285 jeremybenn
/* Handle modules, which amounts to loading and saving symbols and
2
   their attendant structures.
3
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4
   2009, 2010
5
   Free Software Foundation, Inc.
6
   Contributed by Andy Vaught
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
/* The syntax of gfortran modules resembles that of lisp lists, i.e. a
25
   sequence of atoms, which can be left or right parenthesis, names,
26
   integers or strings.  Parenthesis are always matched which allows
27
   us to skip over sections at high speed without having to know
28
   anything about the internal structure of the lists.  A "name" is
29
   usually a fortran 95 identifier, but can also start with '@' in
30
   order to reference a hidden symbol.
31
 
32
   The first line of a module is an informational message about what
33
   created the module, the file it came from and when it was created.
34
   The second line is a warning for people not to edit the module.
35
   The rest of the module looks like:
36
 
37
   ( ( <Interface info for UPLUS> )
38
     ( <Interface info for UMINUS> )
39
     ...
40
   )
41
   ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42
     ...
43
   )
44
   ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45
     ...
46
   )
47
   ( ( <common name> <symbol> <saved flag>)
48
     ...
49
   )
50
 
51
   ( equivalence list )
52
 
53
   ( <Symbol Number (in no particular order)>
54
     <True name of symbol>
55
     <Module name of symbol>
56
     ( <symbol information> )
57
     ...
58
   )
59
   ( <Symtree name>
60
     <Ambiguous flag>
61
     <Symbol number>
62
     ...
63
   )
64
 
65
   In general, symbols refer to other symbols by their symbol number,
66
   which are zero based.  Symbols are written to the module in no
67
   particular order.  */
68
 
69
#include "config.h"
70
#include "system.h"
71
#include "gfortran.h"
72
#include "arith.h"
73
#include "match.h"
74
#include "parse.h" /* FIXME */
75
#include "md5.h"
76 378 julius
#include "cpp.h"
77 285 jeremybenn
 
78
#define MODULE_EXTENSION ".mod"
79
 
80
/* Don't put any single quote (') in MOD_VERSION,
81
   if yout want it to be recognized.  */
82
#define MOD_VERSION "4"
83
 
84
 
85
/* Structure that describes a position within a module file.  */
86
 
87
typedef struct
88
{
89
  int column, line;
90
  fpos_t pos;
91
}
92
module_locus;
93
 
94
/* Structure for list of symbols of intrinsic modules.  */
95
typedef struct
96
{
97
  int id;
98
  const char *name;
99
  int value;
100
  int standard;
101
}
102
intmod_sym;
103
 
104
 
105
typedef enum
106
{
107
  P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
108
}
109
pointer_t;
110
 
111
/* The fixup structure lists pointers to pointers that have to
112
   be updated when a pointer value becomes known.  */
113
 
114
typedef struct fixup_t
115
{
116
  void **pointer;
117
  struct fixup_t *next;
118
}
119
fixup_t;
120
 
121
 
122
/* Structure for holding extra info needed for pointers being read.  */
123
 
124
enum gfc_rsym_state
125
{
126
  UNUSED,
127
  NEEDED,
128
  USED
129
};
130
 
131
enum gfc_wsym_state
132
{
133
  UNREFERENCED = 0,
134
  NEEDS_WRITE,
135
  WRITTEN
136
};
137
 
138
typedef struct pointer_info
139
{
140
  BBT_HEADER (pointer_info);
141
  int integer;
142
  pointer_t type;
143
 
144
  /* The first component of each member of the union is the pointer
145
     being stored.  */
146
 
147
  fixup_t *fixup;
148
 
149
  union
150
  {
151
    void *pointer;      /* Member for doing pointer searches.  */
152
 
153
    struct
154
    {
155
      gfc_symbol *sym;
156
      char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
157
      enum gfc_rsym_state state;
158
      int ns, referenced, renamed;
159
      module_locus where;
160
      fixup_t *stfixup;
161
      gfc_symtree *symtree;
162
      char binding_label[GFC_MAX_SYMBOL_LEN + 1];
163
    }
164
    rsym;
165
 
166
    struct
167
    {
168
      gfc_symbol *sym;
169
      enum gfc_wsym_state state;
170
    }
171
    wsym;
172
  }
173
  u;
174
 
175
}
176
pointer_info;
177
 
178
#define gfc_get_pointer_info() XCNEW (pointer_info)
179
 
180
 
181
/* Local variables */
182
 
183
/* The FILE for the module we're reading or writing.  */
184
static FILE *module_fp;
185
 
186
/* MD5 context structure.  */
187
static struct md5_ctx ctx;
188
 
189
/* The name of the module we're reading (USE'ing) or writing.  */
190
static char module_name[GFC_MAX_SYMBOL_LEN + 1];
191
 
192
/* The way the module we're reading was specified.  */
193
static bool specified_nonint, specified_int;
194
 
195
static int module_line, module_column, only_flag;
196
static enum
197
{ IO_INPUT, IO_OUTPUT }
198
iomode;
199
 
200
static gfc_use_rename *gfc_rename_list;
201
static pointer_info *pi_root;
202
static int symbol_number;       /* Counter for assigning symbol numbers */
203
 
204
/* Tells mio_expr_ref to make symbols for unused equivalence members.  */
205
static bool in_load_equiv;
206
 
207
static locus use_locus;
208
 
209
 
210
 
211
/*****************************************************************/
212
 
213
/* Pointer/integer conversion.  Pointers between structures are stored
214
   as integers in the module file.  The next couple of subroutines
215
   handle this translation for reading and writing.  */
216
 
217
/* Recursively free the tree of pointer structures.  */
218
 
219
static void
220
free_pi_tree (pointer_info *p)
221
{
222
  if (p == NULL)
223
    return;
224
 
225
  if (p->fixup != NULL)
226
    gfc_internal_error ("free_pi_tree(): Unresolved fixup");
227
 
228
  free_pi_tree (p->left);
229
  free_pi_tree (p->right);
230
 
231
  gfc_free (p);
232
}
233
 
234
 
235
/* Compare pointers when searching by pointer.  Used when writing a
236
   module.  */
237
 
238
static int
239
compare_pointers (void *_sn1, void *_sn2)
240
{
241
  pointer_info *sn1, *sn2;
242
 
243
  sn1 = (pointer_info *) _sn1;
244
  sn2 = (pointer_info *) _sn2;
245
 
246
  if (sn1->u.pointer < sn2->u.pointer)
247
    return -1;
248
  if (sn1->u.pointer > sn2->u.pointer)
249
    return 1;
250
 
251
  return 0;
252
}
253
 
254
 
255
/* Compare integers when searching by integer.  Used when reading a
256
   module.  */
257
 
258
static int
259
compare_integers (void *_sn1, void *_sn2)
260
{
261
  pointer_info *sn1, *sn2;
262
 
263
  sn1 = (pointer_info *) _sn1;
264
  sn2 = (pointer_info *) _sn2;
265
 
266
  if (sn1->integer < sn2->integer)
267
    return -1;
268
  if (sn1->integer > sn2->integer)
269
    return 1;
270
 
271
  return 0;
272
}
273
 
274
 
275
/* Initialize the pointer_info tree.  */
276
 
277
static void
278
init_pi_tree (void)
279
{
280
  compare_fn compare;
281
  pointer_info *p;
282
 
283
  pi_root = NULL;
284
  compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
285
 
286
  /* Pointer 0 is the NULL pointer.  */
287
  p = gfc_get_pointer_info ();
288
  p->u.pointer = NULL;
289
  p->integer = 0;
290
  p->type = P_OTHER;
291
 
292
  gfc_insert_bbt (&pi_root, p, compare);
293
 
294
  /* Pointer 1 is the current namespace.  */
295
  p = gfc_get_pointer_info ();
296
  p->u.pointer = gfc_current_ns;
297
  p->integer = 1;
298
  p->type = P_NAMESPACE;
299
 
300
  gfc_insert_bbt (&pi_root, p, compare);
301
 
302
  symbol_number = 2;
303
}
304
 
305
 
306
/* During module writing, call here with a pointer to something,
307
   returning the pointer_info node.  */
308
 
309
static pointer_info *
310
find_pointer (void *gp)
311
{
312
  pointer_info *p;
313
 
314
  p = pi_root;
315
  while (p != NULL)
316
    {
317
      if (p->u.pointer == gp)
318
        break;
319
      p = (gp < p->u.pointer) ? p->left : p->right;
320
    }
321
 
322
  return p;
323
}
324
 
325
 
326
/* Given a pointer while writing, returns the pointer_info tree node,
327
   creating it if it doesn't exist.  */
328
 
329
static pointer_info *
330
get_pointer (void *gp)
331
{
332
  pointer_info *p;
333
 
334
  p = find_pointer (gp);
335
  if (p != NULL)
336
    return p;
337
 
338
  /* Pointer doesn't have an integer.  Give it one.  */
339
  p = gfc_get_pointer_info ();
340
 
341
  p->u.pointer = gp;
342
  p->integer = symbol_number++;
343
 
344
  gfc_insert_bbt (&pi_root, p, compare_pointers);
345
 
346
  return p;
347
}
348
 
349
 
350
/* Given an integer during reading, find it in the pointer_info tree,
351
   creating the node if not found.  */
352
 
353
static pointer_info *
354
get_integer (int integer)
355
{
356
  pointer_info *p, t;
357
  int c;
358
 
359
  t.integer = integer;
360
 
361
  p = pi_root;
362
  while (p != NULL)
363
    {
364
      c = compare_integers (&t, p);
365
      if (c == 0)
366
        break;
367
 
368
      p = (c < 0) ? p->left : p->right;
369
    }
370
 
371
  if (p != NULL)
372
    return p;
373
 
374
  p = gfc_get_pointer_info ();
375
  p->integer = integer;
376
  p->u.pointer = NULL;
377
 
378
  gfc_insert_bbt (&pi_root, p, compare_integers);
379
 
380
  return p;
381
}
382
 
383
 
384
/* Recursive function to find a pointer within a tree by brute force.  */
385
 
386
static pointer_info *
387
fp2 (pointer_info *p, const void *target)
388
{
389
  pointer_info *q;
390
 
391
  if (p == NULL)
392
    return NULL;
393
 
394
  if (p->u.pointer == target)
395
    return p;
396
 
397
  q = fp2 (p->left, target);
398
  if (q != NULL)
399
    return q;
400
 
401
  return fp2 (p->right, target);
402
}
403
 
404
 
405
/* During reading, find a pointer_info node from the pointer value.
406
   This amounts to a brute-force search.  */
407
 
408
static pointer_info *
409
find_pointer2 (void *p)
410
{
411
  return fp2 (pi_root, p);
412
}
413
 
414
 
415
/* Resolve any fixups using a known pointer.  */
416
 
417
static void
418
resolve_fixups (fixup_t *f, void *gp)
419
{
420
  fixup_t *next;
421
 
422
  for (; f; f = next)
423
    {
424
      next = f->next;
425
      *(f->pointer) = gp;
426
      gfc_free (f);
427
    }
428
}
429
 
430
 
431
/* Call here during module reading when we know what pointer to
432
   associate with an integer.  Any fixups that exist are resolved at
433
   this time.  */
434
 
435
static void
436
associate_integer_pointer (pointer_info *p, void *gp)
437
{
438
  if (p->u.pointer != NULL)
439
    gfc_internal_error ("associate_integer_pointer(): Already associated");
440
 
441
  p->u.pointer = gp;
442
 
443
  resolve_fixups (p->fixup, gp);
444
 
445
  p->fixup = NULL;
446
}
447
 
448
 
449
/* During module reading, given an integer and a pointer to a pointer,
450
   either store the pointer from an already-known value or create a
451
   fixup structure in order to store things later.  Returns zero if
452
   the reference has been actually stored, or nonzero if the reference
453
   must be fixed later (i.e., associate_integer_pointer must be called
454
   sometime later.  Returns the pointer_info structure.  */
455
 
456
static pointer_info *
457
add_fixup (int integer, void *gp)
458
{
459
  pointer_info *p;
460
  fixup_t *f;
461
  char **cp;
462
 
463
  p = get_integer (integer);
464
 
465
  if (p->integer == 0 || p->u.pointer != NULL)
466
    {
467
      cp = (char **) gp;
468
      *cp = (char *) p->u.pointer;
469
    }
470
  else
471
    {
472
      f = XCNEW (fixup_t);
473
 
474
      f->next = p->fixup;
475
      p->fixup = f;
476
 
477
      f->pointer = (void **) gp;
478
    }
479
 
480
  return p;
481
}
482
 
483
 
484
/*****************************************************************/
485
 
486
/* Parser related subroutines */
487
 
488
/* Free the rename list left behind by a USE statement.  */
489
 
490
static void
491
free_rename (void)
492
{
493
  gfc_use_rename *next;
494
 
495
  for (; gfc_rename_list; gfc_rename_list = next)
496
    {
497
      next = gfc_rename_list->next;
498
      gfc_free (gfc_rename_list);
499
    }
500
}
501
 
502
 
503
/* Match a USE statement.  */
504
 
505
match
506
gfc_match_use (void)
507
{
508
  char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
509
  gfc_use_rename *tail = NULL, *new_use;
510
  interface_type type, type2;
511
  gfc_intrinsic_op op;
512
  match m;
513
 
514
  specified_int = false;
515
  specified_nonint = false;
516
 
517
  if (gfc_match (" , ") == MATCH_YES)
518
    {
519
      if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
520
        {
521
          if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
522
                              "nature in USE statement at %C") == FAILURE)
523
            return MATCH_ERROR;
524
 
525
          if (strcmp (module_nature, "intrinsic") == 0)
526
            specified_int = true;
527
          else
528
            {
529
              if (strcmp (module_nature, "non_intrinsic") == 0)
530
                specified_nonint = true;
531
              else
532
                {
533
                  gfc_error ("Module nature in USE statement at %C shall "
534
                             "be either INTRINSIC or NON_INTRINSIC");
535
                  return MATCH_ERROR;
536
                }
537
            }
538
        }
539
      else
540
        {
541
          /* Help output a better error message than "Unclassifiable
542
             statement".  */
543
          gfc_match (" %n", module_nature);
544
          if (strcmp (module_nature, "intrinsic") == 0
545
              || strcmp (module_nature, "non_intrinsic") == 0)
546
            gfc_error ("\"::\" was expected after module nature at %C "
547
                       "but was not found");
548
          return m;
549
        }
550
    }
551
  else
552
    {
553
      m = gfc_match (" ::");
554
      if (m == MATCH_YES &&
555
          gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
556
                          "\"USE :: module\" at %C") == FAILURE)
557
        return MATCH_ERROR;
558
 
559
      if (m != MATCH_YES)
560
        {
561
          m = gfc_match ("% ");
562
          if (m != MATCH_YES)
563
            return m;
564
        }
565
    }
566
 
567
  use_locus = gfc_current_locus;
568
 
569
  m = gfc_match_name (module_name);
570
  if (m != MATCH_YES)
571
    return m;
572
 
573
  free_rename ();
574
  only_flag = 0;
575
 
576
  if (gfc_match_eos () == MATCH_YES)
577
    return MATCH_YES;
578
  if (gfc_match_char (',') != MATCH_YES)
579
    goto syntax;
580
 
581
  if (gfc_match (" only :") == MATCH_YES)
582
    only_flag = 1;
583
 
584
  if (gfc_match_eos () == MATCH_YES)
585
    return MATCH_YES;
586
 
587
  for (;;)
588
    {
589
      /* Get a new rename struct and add it to the rename list.  */
590
      new_use = gfc_get_use_rename ();
591
      new_use->where = gfc_current_locus;
592
      new_use->found = 0;
593
 
594
      if (gfc_rename_list == NULL)
595
        gfc_rename_list = new_use;
596
      else
597
        tail->next = new_use;
598
      tail = new_use;
599
 
600
      /* See what kind of interface we're dealing with.  Assume it is
601
         not an operator.  */
602
      new_use->op = INTRINSIC_NONE;
603
      if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
604
        goto cleanup;
605
 
606
      switch (type)
607
        {
608
        case INTERFACE_NAMELESS:
609
          gfc_error ("Missing generic specification in USE statement at %C");
610
          goto cleanup;
611
 
612
        case INTERFACE_USER_OP:
613
        case INTERFACE_GENERIC:
614
          m = gfc_match (" =>");
615
 
616
          if (type == INTERFACE_USER_OP && m == MATCH_YES
617
              && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
618
                                  "operators in USE statements at %C")
619
                 == FAILURE))
620
            goto cleanup;
621
 
622
          if (type == INTERFACE_USER_OP)
623
            new_use->op = INTRINSIC_USER;
624
 
625
          if (only_flag)
626
            {
627
              if (m != MATCH_YES)
628
                strcpy (new_use->use_name, name);
629
              else
630
                {
631
                  strcpy (new_use->local_name, name);
632
                  m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
633
                  if (type != type2)
634
                    goto syntax;
635
                  if (m == MATCH_NO)
636
                    goto syntax;
637
                  if (m == MATCH_ERROR)
638
                    goto cleanup;
639
                }
640
            }
641
          else
642
            {
643
              if (m != MATCH_YES)
644
                goto syntax;
645
              strcpy (new_use->local_name, name);
646
 
647
              m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
648
              if (type != type2)
649
                goto syntax;
650
              if (m == MATCH_NO)
651
                goto syntax;
652
              if (m == MATCH_ERROR)
653
                goto cleanup;
654
            }
655
 
656
          if (strcmp (new_use->use_name, module_name) == 0
657
              || strcmp (new_use->local_name, module_name) == 0)
658
            {
659
              gfc_error ("The name '%s' at %C has already been used as "
660
                         "an external module name.", module_name);
661
              goto cleanup;
662
            }
663
          break;
664
 
665
        case INTERFACE_INTRINSIC_OP:
666
          new_use->op = op;
667
          break;
668
 
669
        default:
670
          gcc_unreachable ();
671
        }
672
 
673
      if (gfc_match_eos () == MATCH_YES)
674
        break;
675
      if (gfc_match_char (',') != MATCH_YES)
676
        goto syntax;
677
    }
678
 
679
  return MATCH_YES;
680
 
681
syntax:
682
  gfc_syntax_error (ST_USE);
683
 
684
cleanup:
685
  free_rename ();
686
  return MATCH_ERROR;
687
 }
688
 
689
 
690
/* Given a name and a number, inst, return the inst name
691
   under which to load this symbol. Returns NULL if this
692
   symbol shouldn't be loaded. If inst is zero, returns
693
   the number of instances of this name. If interface is
694
   true, a user-defined operator is sought, otherwise only
695
   non-operators are sought.  */
696
 
697
static const char *
698
find_use_name_n (const char *name, int *inst, bool interface)
699
{
700
  gfc_use_rename *u;
701
  int i;
702
 
703
  i = 0;
704
  for (u = gfc_rename_list; u; u = u->next)
705
    {
706
      if (strcmp (u->use_name, name) != 0
707
          || (u->op == INTRINSIC_USER && !interface)
708
          || (u->op != INTRINSIC_USER &&  interface))
709
        continue;
710
      if (++i == *inst)
711
        break;
712
    }
713
 
714
  if (!*inst)
715
    {
716
      *inst = i;
717
      return NULL;
718
    }
719
 
720
  if (u == NULL)
721
    return only_flag ? NULL : name;
722
 
723
  u->found = 1;
724
 
725
  return (u->local_name[0] != '\0') ? u->local_name : name;
726
}
727
 
728
 
729
/* Given a name, return the name under which to load this symbol.
730
   Returns NULL if this symbol shouldn't be loaded.  */
731
 
732
static const char *
733
find_use_name (const char *name, bool interface)
734
{
735
  int i = 1;
736
  return find_use_name_n (name, &i, interface);
737
}
738
 
739
 
740
/* Given a real name, return the number of use names associated with it.  */
741
 
742
static int
743
number_use_names (const char *name, bool interface)
744
{
745
  int i = 0;
746
  find_use_name_n (name, &i, interface);
747
  return i;
748
}
749
 
750
 
751
/* Try to find the operator in the current list.  */
752
 
753
static gfc_use_rename *
754
find_use_operator (gfc_intrinsic_op op)
755
{
756
  gfc_use_rename *u;
757
 
758
  for (u = gfc_rename_list; u; u = u->next)
759
    if (u->op == op)
760
      return u;
761
 
762
  return NULL;
763
}
764
 
765
 
766
/*****************************************************************/
767
 
768
/* The next couple of subroutines maintain a tree used to avoid a
769
   brute-force search for a combination of true name and module name.
770
   While symtree names, the name that a particular symbol is known by
771
   can changed with USE statements, we still have to keep track of the
772
   true names to generate the correct reference, and also avoid
773
   loading the same real symbol twice in a program unit.
774
 
775
   When we start reading, the true name tree is built and maintained
776
   as symbols are read.  The tree is searched as we load new symbols
777
   to see if it already exists someplace in the namespace.  */
778
 
779
typedef struct true_name
780
{
781
  BBT_HEADER (true_name);
782
  gfc_symbol *sym;
783
}
784
true_name;
785
 
786
static true_name *true_name_root;
787
 
788
 
789
/* Compare two true_name structures.  */
790
 
791
static int
792
compare_true_names (void *_t1, void *_t2)
793
{
794
  true_name *t1, *t2;
795
  int c;
796
 
797
  t1 = (true_name *) _t1;
798
  t2 = (true_name *) _t2;
799
 
800
  c = ((t1->sym->module > t2->sym->module)
801
       - (t1->sym->module < t2->sym->module));
802
  if (c != 0)
803
    return c;
804
 
805
  return strcmp (t1->sym->name, t2->sym->name);
806
}
807
 
808
 
809
/* Given a true name, search the true name tree to see if it exists
810
   within the main namespace.  */
811
 
812
static gfc_symbol *
813
find_true_name (const char *name, const char *module)
814
{
815
  true_name t, *p;
816
  gfc_symbol sym;
817
  int c;
818
 
819
  sym.name = gfc_get_string (name);
820
  if (module != NULL)
821
    sym.module = gfc_get_string (module);
822
  else
823
    sym.module = NULL;
824
  t.sym = &sym;
825
 
826
  p = true_name_root;
827
  while (p != NULL)
828
    {
829
      c = compare_true_names ((void *) (&t), (void *) p);
830
      if (c == 0)
831
        return p->sym;
832
 
833
      p = (c < 0) ? p->left : p->right;
834
    }
835
 
836
  return NULL;
837
}
838
 
839
 
840
/* Given a gfc_symbol pointer that is not in the true name tree, add it.  */
841
 
842
static void
843
add_true_name (gfc_symbol *sym)
844
{
845
  true_name *t;
846
 
847
  t = XCNEW (true_name);
848
  t->sym = sym;
849
 
850
  gfc_insert_bbt (&true_name_root, t, compare_true_names);
851
}
852
 
853
 
854
/* Recursive function to build the initial true name tree by
855
   recursively traversing the current namespace.  */
856
 
857
static void
858
build_tnt (gfc_symtree *st)
859
{
860
  if (st == NULL)
861
    return;
862
 
863
  build_tnt (st->left);
864
  build_tnt (st->right);
865
 
866
  if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
867
    return;
868
 
869
  add_true_name (st->n.sym);
870
}
871
 
872
 
873
/* Initialize the true name tree with the current namespace.  */
874
 
875
static void
876
init_true_name_tree (void)
877
{
878
  true_name_root = NULL;
879
  build_tnt (gfc_current_ns->sym_root);
880
}
881
 
882
 
883
/* Recursively free a true name tree node.  */
884
 
885
static void
886
free_true_name (true_name *t)
887
{
888
  if (t == NULL)
889
    return;
890
  free_true_name (t->left);
891
  free_true_name (t->right);
892
 
893
  gfc_free (t);
894
}
895
 
896
 
897
/*****************************************************************/
898
 
899
/* Module reading and writing.  */
900
 
901
typedef enum
902
{
903
  ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
904
}
905
atom_type;
906
 
907
static atom_type last_atom;
908
 
909
 
910
/* The name buffer must be at least as long as a symbol name.  Right
911
   now it's not clear how we're going to store numeric constants--
912
   probably as a hexadecimal string, since this will allow the exact
913
   number to be preserved (this can't be done by a decimal
914
   representation).  Worry about that later.  TODO!  */
915
 
916
#define MAX_ATOM_SIZE 100
917
 
918
static int atom_int;
919
static char *atom_string, atom_name[MAX_ATOM_SIZE];
920
 
921
 
922
/* Report problems with a module.  Error reporting is not very
923
   elaborate, since this sorts of errors shouldn't really happen.
924
   This subroutine never returns.  */
925
 
926
static void bad_module (const char *) ATTRIBUTE_NORETURN;
927
 
928
static void
929
bad_module (const char *msgid)
930
{
931
  fclose (module_fp);
932
 
933
  switch (iomode)
934
    {
935
    case IO_INPUT:
936
      gfc_fatal_error ("Reading module %s at line %d column %d: %s",
937
                       module_name, module_line, module_column, msgid);
938
      break;
939
    case IO_OUTPUT:
940
      gfc_fatal_error ("Writing module %s at line %d column %d: %s",
941
                       module_name, module_line, module_column, msgid);
942
      break;
943
    default:
944
      gfc_fatal_error ("Module %s at line %d column %d: %s",
945
                       module_name, module_line, module_column, msgid);
946
      break;
947
    }
948
}
949
 
950
 
951
/* Set the module's input pointer.  */
952
 
953
static void
954
set_module_locus (module_locus *m)
955
{
956
  module_column = m->column;
957
  module_line = m->line;
958
  fsetpos (module_fp, &m->pos);
959
}
960
 
961
 
962
/* Get the module's input pointer so that we can restore it later.  */
963
 
964
static void
965
get_module_locus (module_locus *m)
966
{
967
  m->column = module_column;
968
  m->line = module_line;
969
  fgetpos (module_fp, &m->pos);
970
}
971
 
972
 
973
/* Get the next character in the module, updating our reckoning of
974
   where we are.  */
975
 
976
static int
977
module_char (void)
978
{
979
  int c;
980
 
981
  c = getc (module_fp);
982
 
983
  if (c == EOF)
984
    bad_module ("Unexpected EOF");
985
 
986
  if (c == '\n')
987
    {
988
      module_line++;
989
      module_column = 0;
990
    }
991
 
992
  module_column++;
993
  return c;
994
}
995
 
996
 
997
/* Parse a string constant.  The delimiter is guaranteed to be a
998
   single quote.  */
999
 
1000
static void
1001
parse_string (void)
1002
{
1003
  module_locus start;
1004
  int len, c;
1005
  char *p;
1006
 
1007
  get_module_locus (&start);
1008
 
1009
  len = 0;
1010
 
1011
  /* See how long the string is.  */
1012
  for ( ; ; )
1013
    {
1014
      c = module_char ();
1015
      if (c == EOF)
1016
        bad_module ("Unexpected end of module in string constant");
1017
 
1018
      if (c != '\'')
1019
        {
1020
          len++;
1021
          continue;
1022
        }
1023
 
1024
      c = module_char ();
1025
      if (c == '\'')
1026
        {
1027
          len++;
1028
          continue;
1029
        }
1030
 
1031
      break;
1032
    }
1033
 
1034
  set_module_locus (&start);
1035
 
1036
  atom_string = p = XCNEWVEC (char, len + 1);
1037
 
1038
  for (; len > 0; len--)
1039
    {
1040
      c = module_char ();
1041
      if (c == '\'')
1042
        module_char ();         /* Guaranteed to be another \'.  */
1043
      *p++ = c;
1044
    }
1045
 
1046
  module_char ();               /* Terminating \'.  */
1047
  *p = '\0';                    /* C-style string for debug purposes.  */
1048
}
1049
 
1050
 
1051
/* Parse a small integer.  */
1052
 
1053
static void
1054
parse_integer (int c)
1055
{
1056
  module_locus m;
1057
 
1058
  atom_int = c - '0';
1059
 
1060
  for (;;)
1061
    {
1062
      get_module_locus (&m);
1063
 
1064
      c = module_char ();
1065
      if (!ISDIGIT (c))
1066
        break;
1067
 
1068
      atom_int = 10 * atom_int + c - '0';
1069
      if (atom_int > 99999999)
1070
        bad_module ("Integer overflow");
1071
    }
1072
 
1073
  set_module_locus (&m);
1074
}
1075
 
1076
 
1077
/* Parse a name.  */
1078
 
1079
static void
1080
parse_name (int c)
1081
{
1082
  module_locus m;
1083
  char *p;
1084
  int len;
1085
 
1086
  p = atom_name;
1087
 
1088
  *p++ = c;
1089
  len = 1;
1090
 
1091
  get_module_locus (&m);
1092
 
1093
  for (;;)
1094
    {
1095
      c = module_char ();
1096
      if (!ISALNUM (c) && c != '_' && c != '-')
1097
        break;
1098
 
1099
      *p++ = c;
1100
      if (++len > GFC_MAX_SYMBOL_LEN)
1101
        bad_module ("Name too long");
1102
    }
1103
 
1104
  *p = '\0';
1105
 
1106
  fseek (module_fp, -1, SEEK_CUR);
1107
  module_column = m.column + len - 1;
1108
 
1109
  if (c == '\n')
1110
    module_line--;
1111
}
1112
 
1113
 
1114
/* Read the next atom in the module's input stream.  */
1115
 
1116
static atom_type
1117
parse_atom (void)
1118
{
1119
  int c;
1120
 
1121
  do
1122
    {
1123
      c = module_char ();
1124
    }
1125
  while (c == ' ' || c == '\r' || c == '\n');
1126
 
1127
  switch (c)
1128
    {
1129
    case '(':
1130
      return ATOM_LPAREN;
1131
 
1132
    case ')':
1133
      return ATOM_RPAREN;
1134
 
1135
    case '\'':
1136
      parse_string ();
1137
      return ATOM_STRING;
1138
 
1139
    case '0':
1140
    case '1':
1141
    case '2':
1142
    case '3':
1143
    case '4':
1144
    case '5':
1145
    case '6':
1146
    case '7':
1147
    case '8':
1148
    case '9':
1149
      parse_integer (c);
1150
      return ATOM_INTEGER;
1151
 
1152
    case 'a':
1153
    case 'b':
1154
    case 'c':
1155
    case 'd':
1156
    case 'e':
1157
    case 'f':
1158
    case 'g':
1159
    case 'h':
1160
    case 'i':
1161
    case 'j':
1162
    case 'k':
1163
    case 'l':
1164
    case 'm':
1165
    case 'n':
1166
    case 'o':
1167
    case 'p':
1168
    case 'q':
1169
    case 'r':
1170
    case 's':
1171
    case 't':
1172
    case 'u':
1173
    case 'v':
1174
    case 'w':
1175
    case 'x':
1176
    case 'y':
1177
    case 'z':
1178
    case 'A':
1179
    case 'B':
1180
    case 'C':
1181
    case 'D':
1182
    case 'E':
1183
    case 'F':
1184
    case 'G':
1185
    case 'H':
1186
    case 'I':
1187
    case 'J':
1188
    case 'K':
1189
    case 'L':
1190
    case 'M':
1191
    case 'N':
1192
    case 'O':
1193
    case 'P':
1194
    case 'Q':
1195
    case 'R':
1196
    case 'S':
1197
    case 'T':
1198
    case 'U':
1199
    case 'V':
1200
    case 'W':
1201
    case 'X':
1202
    case 'Y':
1203
    case 'Z':
1204
      parse_name (c);
1205
      return ATOM_NAME;
1206
 
1207
    default:
1208
      bad_module ("Bad name");
1209
    }
1210
 
1211
  /* Not reached.  */
1212
}
1213
 
1214
 
1215
/* Peek at the next atom on the input.  */
1216
 
1217
static atom_type
1218
peek_atom (void)
1219
{
1220
  module_locus m;
1221
  atom_type a;
1222
 
1223
  get_module_locus (&m);
1224
 
1225
  a = parse_atom ();
1226
  if (a == ATOM_STRING)
1227
    gfc_free (atom_string);
1228
 
1229
  set_module_locus (&m);
1230
  return a;
1231
}
1232
 
1233
 
1234
/* Read the next atom from the input, requiring that it be a
1235
   particular kind.  */
1236
 
1237
static void
1238
require_atom (atom_type type)
1239
{
1240
  module_locus m;
1241
  atom_type t;
1242
  const char *p;
1243
 
1244
  get_module_locus (&m);
1245
 
1246
  t = parse_atom ();
1247
  if (t != type)
1248
    {
1249
      switch (type)
1250
        {
1251
        case ATOM_NAME:
1252
          p = _("Expected name");
1253
          break;
1254
        case ATOM_LPAREN:
1255
          p = _("Expected left parenthesis");
1256
          break;
1257
        case ATOM_RPAREN:
1258
          p = _("Expected right parenthesis");
1259
          break;
1260
        case ATOM_INTEGER:
1261
          p = _("Expected integer");
1262
          break;
1263
        case ATOM_STRING:
1264
          p = _("Expected string");
1265
          break;
1266
        default:
1267
          gfc_internal_error ("require_atom(): bad atom type required");
1268
        }
1269
 
1270
      set_module_locus (&m);
1271
      bad_module (p);
1272
    }
1273
}
1274
 
1275
 
1276
/* Given a pointer to an mstring array, require that the current input
1277
   be one of the strings in the array.  We return the enum value.  */
1278
 
1279
static int
1280
find_enum (const mstring *m)
1281
{
1282
  int i;
1283
 
1284
  i = gfc_string2code (m, atom_name);
1285
  if (i >= 0)
1286
    return i;
1287
 
1288
  bad_module ("find_enum(): Enum not found");
1289
 
1290
  /* Not reached.  */
1291
}
1292
 
1293
 
1294
/**************** Module output subroutines ***************************/
1295
 
1296
/* Output a character to a module file.  */
1297
 
1298
static void
1299
write_char (char out)
1300
{
1301
  if (putc (out, module_fp) == EOF)
1302
    gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1303
 
1304
  /* Add this to our MD5.  */
1305
  md5_process_bytes (&out, sizeof (out), &ctx);
1306
 
1307
  if (out != '\n')
1308
    module_column++;
1309
  else
1310
    {
1311
      module_column = 1;
1312
      module_line++;
1313
    }
1314
}
1315
 
1316
 
1317
/* Write an atom to a module.  The line wrapping isn't perfect, but it
1318
   should work most of the time.  This isn't that big of a deal, since
1319
   the file really isn't meant to be read by people anyway.  */
1320
 
1321
static void
1322
write_atom (atom_type atom, const void *v)
1323
{
1324
  char buffer[20];
1325
  int i, len;
1326
  const char *p;
1327
 
1328
  switch (atom)
1329
    {
1330
    case ATOM_STRING:
1331
    case ATOM_NAME:
1332
      p = (const char *) v;
1333
      break;
1334
 
1335
    case ATOM_LPAREN:
1336
      p = "(";
1337
      break;
1338
 
1339
    case ATOM_RPAREN:
1340
      p = ")";
1341
      break;
1342
 
1343
    case ATOM_INTEGER:
1344
      i = *((const int *) v);
1345
      if (i < 0)
1346
        gfc_internal_error ("write_atom(): Writing negative integer");
1347
 
1348
      sprintf (buffer, "%d", i);
1349
      p = buffer;
1350
      break;
1351
 
1352
    default:
1353
      gfc_internal_error ("write_atom(): Trying to write dab atom");
1354
 
1355
    }
1356
 
1357
  if(p == NULL || *p == '\0')
1358
     len = 0;
1359
  else
1360
  len = strlen (p);
1361
 
1362
  if (atom != ATOM_RPAREN)
1363
    {
1364
      if (module_column + len > 72)
1365
        write_char ('\n');
1366
      else
1367
        {
1368
 
1369
          if (last_atom != ATOM_LPAREN && module_column != 1)
1370
            write_char (' ');
1371
        }
1372
    }
1373
 
1374
  if (atom == ATOM_STRING)
1375
    write_char ('\'');
1376
 
1377
  while (p != NULL && *p)
1378
    {
1379
      if (atom == ATOM_STRING && *p == '\'')
1380
        write_char ('\'');
1381
      write_char (*p++);
1382
    }
1383
 
1384
  if (atom == ATOM_STRING)
1385
    write_char ('\'');
1386
 
1387
  last_atom = atom;
1388
}
1389
 
1390
 
1391
 
1392
/***************** Mid-level I/O subroutines *****************/
1393
 
1394
/* These subroutines let their caller read or write atoms without
1395
   caring about which of the two is actually happening.  This lets a
1396
   subroutine concentrate on the actual format of the data being
1397
   written.  */
1398
 
1399
static void mio_expr (gfc_expr **);
1400
pointer_info *mio_symbol_ref (gfc_symbol **);
1401
pointer_info *mio_interface_rest (gfc_interface **);
1402
static void mio_symtree_ref (gfc_symtree **);
1403
 
1404
/* Read or write an enumerated value.  On writing, we return the input
1405
   value for the convenience of callers.  We avoid using an integer
1406
   pointer because enums are sometimes inside bitfields.  */
1407
 
1408
static int
1409
mio_name (int t, const mstring *m)
1410
{
1411
  if (iomode == IO_OUTPUT)
1412
    write_atom (ATOM_NAME, gfc_code2string (m, t));
1413
  else
1414
    {
1415
      require_atom (ATOM_NAME);
1416
      t = find_enum (m);
1417
    }
1418
 
1419
  return t;
1420
}
1421
 
1422
/* Specialization of mio_name.  */
1423
 
1424
#define DECL_MIO_NAME(TYPE) \
1425
 static inline TYPE \
1426
 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1427
 { \
1428
   return (TYPE) mio_name ((int) t, m); \
1429
 }
1430
#define MIO_NAME(TYPE) mio_name_##TYPE
1431
 
1432
static void
1433
mio_lparen (void)
1434
{
1435
  if (iomode == IO_OUTPUT)
1436
    write_atom (ATOM_LPAREN, NULL);
1437
  else
1438
    require_atom (ATOM_LPAREN);
1439
}
1440
 
1441
 
1442
static void
1443
mio_rparen (void)
1444
{
1445
  if (iomode == IO_OUTPUT)
1446
    write_atom (ATOM_RPAREN, NULL);
1447
  else
1448
    require_atom (ATOM_RPAREN);
1449
}
1450
 
1451
 
1452
static void
1453
mio_integer (int *ip)
1454
{
1455
  if (iomode == IO_OUTPUT)
1456
    write_atom (ATOM_INTEGER, ip);
1457
  else
1458
    {
1459
      require_atom (ATOM_INTEGER);
1460
      *ip = atom_int;
1461
    }
1462
}
1463
 
1464
 
1465
/* Read or write a gfc_intrinsic_op value.  */
1466
 
1467
static void
1468
mio_intrinsic_op (gfc_intrinsic_op* op)
1469
{
1470
  /* FIXME: Would be nicer to do this via the operators symbolic name.  */
1471
  if (iomode == IO_OUTPUT)
1472
    {
1473
      int converted = (int) *op;
1474
      write_atom (ATOM_INTEGER, &converted);
1475
    }
1476
  else
1477
    {
1478
      require_atom (ATOM_INTEGER);
1479
      *op = (gfc_intrinsic_op) atom_int;
1480
    }
1481
}
1482
 
1483
 
1484
/* Read or write a character pointer that points to a string on the heap.  */
1485
 
1486
static const char *
1487
mio_allocated_string (const char *s)
1488
{
1489
  if (iomode == IO_OUTPUT)
1490
    {
1491
      write_atom (ATOM_STRING, s);
1492
      return s;
1493
    }
1494
  else
1495
    {
1496
      require_atom (ATOM_STRING);
1497
      return atom_string;
1498
    }
1499
}
1500
 
1501
 
1502
/* Functions for quoting and unquoting strings.  */
1503
 
1504
static char *
1505
quote_string (const gfc_char_t *s, const size_t slength)
1506
{
1507
  const gfc_char_t *p;
1508
  char *res, *q;
1509
  size_t len = 0, i;
1510
 
1511
  /* Calculate the length we'll need: a backslash takes two ("\\"),
1512
     non-printable characters take 10 ("\Uxxxxxxxx") and others take 1.  */
1513
  for (p = s, i = 0; i < slength; p++, i++)
1514
    {
1515
      if (*p == '\\')
1516
        len += 2;
1517
      else if (!gfc_wide_is_printable (*p))
1518
        len += 10;
1519
      else
1520
        len++;
1521
    }
1522
 
1523
  q = res = XCNEWVEC (char, len + 1);
1524
  for (p = s, i = 0; i < slength; p++, i++)
1525
    {
1526
      if (*p == '\\')
1527
        *q++ = '\\', *q++ = '\\';
1528
      else if (!gfc_wide_is_printable (*p))
1529
        {
1530
          sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1531
                   (unsigned HOST_WIDE_INT) *p);
1532
          q += 10;
1533
        }
1534
      else
1535
        *q++ = (unsigned char) *p;
1536
    }
1537
 
1538
  res[len] = '\0';
1539
  return res;
1540
}
1541
 
1542
static gfc_char_t *
1543
unquote_string (const char *s)
1544
{
1545
  size_t len, i;
1546
  const char *p;
1547
  gfc_char_t *res;
1548
 
1549
  for (p = s, len = 0; *p; p++, len++)
1550
    {
1551
      if (*p != '\\')
1552
        continue;
1553
 
1554
      if (p[1] == '\\')
1555
        p++;
1556
      else if (p[1] == 'U')
1557
        p += 9; /* That is a "\U????????". */
1558
      else
1559
        gfc_internal_error ("unquote_string(): got bad string");
1560
    }
1561
 
1562
  res = gfc_get_wide_string (len + 1);
1563
  for (i = 0, p = s; i < len; i++, p++)
1564
    {
1565
      gcc_assert (*p);
1566
 
1567
      if (*p != '\\')
1568
        res[i] = (unsigned char) *p;
1569
      else if (p[1] == '\\')
1570
        {
1571
          res[i] = (unsigned char) '\\';
1572
          p++;
1573
        }
1574
      else
1575
        {
1576
          /* We read the 8-digits hexadecimal constant that follows.  */
1577
          int j;
1578
          unsigned n;
1579
          gfc_char_t c = 0;
1580
 
1581
          gcc_assert (p[1] == 'U');
1582
          for (j = 0; j < 8; j++)
1583
            {
1584
              c = c << 4;
1585
              gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1586
              c += n;
1587
            }
1588
 
1589
          res[i] = c;
1590
          p += 9;
1591
        }
1592
    }
1593
 
1594
  res[len] = '\0';
1595
  return res;
1596
}
1597
 
1598
 
1599
/* Read or write a character pointer that points to a wide string on the
1600
   heap, performing quoting/unquoting of nonprintable characters using the
1601
   form \U???????? (where each ? is a hexadecimal digit).
1602
   Length is the length of the string, only known and used in output mode.  */
1603
 
1604
static const gfc_char_t *
1605
mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1606
{
1607
  if (iomode == IO_OUTPUT)
1608
    {
1609
      char *quoted = quote_string (s, length);
1610
      write_atom (ATOM_STRING, quoted);
1611
      gfc_free (quoted);
1612
      return s;
1613
    }
1614
  else
1615
    {
1616
      gfc_char_t *unquoted;
1617
 
1618
      require_atom (ATOM_STRING);
1619
      unquoted = unquote_string (atom_string);
1620
      gfc_free (atom_string);
1621
      return unquoted;
1622
    }
1623
}
1624
 
1625
 
1626
/* Read or write a string that is in static memory.  */
1627
 
1628
static void
1629
mio_pool_string (const char **stringp)
1630
{
1631
  /* TODO: one could write the string only once, and refer to it via a
1632
     fixup pointer.  */
1633
 
1634
  /* As a special case we have to deal with a NULL string.  This
1635
     happens for the 'module' member of 'gfc_symbol's that are not in a
1636
     module.  We read / write these as the empty string.  */
1637
  if (iomode == IO_OUTPUT)
1638
    {
1639
      const char *p = *stringp == NULL ? "" : *stringp;
1640
      write_atom (ATOM_STRING, p);
1641
    }
1642
  else
1643
    {
1644
      require_atom (ATOM_STRING);
1645
      *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1646
      gfc_free (atom_string);
1647
    }
1648
}
1649
 
1650
 
1651
/* Read or write a string that is inside of some already-allocated
1652
   structure.  */
1653
 
1654
static void
1655
mio_internal_string (char *string)
1656
{
1657
  if (iomode == IO_OUTPUT)
1658
    write_atom (ATOM_STRING, string);
1659
  else
1660
    {
1661
      require_atom (ATOM_STRING);
1662
      strcpy (string, atom_string);
1663
      gfc_free (atom_string);
1664
    }
1665
}
1666
 
1667
 
1668
typedef enum
1669
{ AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1670
  AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1671
  AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1672
  AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1673
  AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1674
  AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED,
1675
  AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1676
  AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS
1677
}
1678
ab_attribute;
1679
 
1680
static const mstring attr_bits[] =
1681
{
1682
    minit ("ALLOCATABLE", AB_ALLOCATABLE),
1683
    minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1684
    minit ("DIMENSION", AB_DIMENSION),
1685
    minit ("EXTERNAL", AB_EXTERNAL),
1686
    minit ("INTRINSIC", AB_INTRINSIC),
1687
    minit ("OPTIONAL", AB_OPTIONAL),
1688
    minit ("POINTER", AB_POINTER),
1689
    minit ("VOLATILE", AB_VOLATILE),
1690
    minit ("TARGET", AB_TARGET),
1691
    minit ("THREADPRIVATE", AB_THREADPRIVATE),
1692
    minit ("DUMMY", AB_DUMMY),
1693
    minit ("RESULT", AB_RESULT),
1694
    minit ("DATA", AB_DATA),
1695
    minit ("IN_NAMELIST", AB_IN_NAMELIST),
1696
    minit ("IN_COMMON", AB_IN_COMMON),
1697
    minit ("FUNCTION", AB_FUNCTION),
1698
    minit ("SUBROUTINE", AB_SUBROUTINE),
1699
    minit ("SEQUENCE", AB_SEQUENCE),
1700
    minit ("ELEMENTAL", AB_ELEMENTAL),
1701
    minit ("PURE", AB_PURE),
1702
    minit ("RECURSIVE", AB_RECURSIVE),
1703
    minit ("GENERIC", AB_GENERIC),
1704
    minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1705
    minit ("CRAY_POINTER", AB_CRAY_POINTER),
1706
    minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1707
    minit ("IS_BIND_C", AB_IS_BIND_C),
1708
    minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1709
    minit ("IS_ISO_C", AB_IS_ISO_C),
1710
    minit ("VALUE", AB_VALUE),
1711
    minit ("ALLOC_COMP", AB_ALLOC_COMP),
1712
    minit ("POINTER_COMP", AB_POINTER_COMP),
1713
    minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1714
    minit ("ZERO_COMP", AB_ZERO_COMP),
1715
    minit ("PROTECTED", AB_PROTECTED),
1716
    minit ("ABSTRACT", AB_ABSTRACT),
1717
    minit ("IS_CLASS", AB_IS_CLASS),
1718
    minit ("PROCEDURE", AB_PROCEDURE),
1719
    minit ("PROC_POINTER", AB_PROC_POINTER),
1720
    minit (NULL, -1)
1721
};
1722
 
1723
/* For binding attributes.  */
1724
static const mstring binding_passing[] =
1725
{
1726
    minit ("PASS", 0),
1727
    minit ("NOPASS", 1),
1728
    minit (NULL, -1)
1729
};
1730
static const mstring binding_overriding[] =
1731
{
1732
    minit ("OVERRIDABLE", 0),
1733
    minit ("NON_OVERRIDABLE", 1),
1734
    minit ("DEFERRED", 2),
1735
    minit (NULL, -1)
1736
};
1737
static const mstring binding_generic[] =
1738
{
1739
    minit ("SPECIFIC", 0),
1740
    minit ("GENERIC", 1),
1741
    minit (NULL, -1)
1742
};
1743
static const mstring binding_ppc[] =
1744
{
1745
    minit ("NO_PPC", 0),
1746
    minit ("PPC", 1),
1747
    minit (NULL, -1)
1748
};
1749
 
1750
/* Specialization of mio_name.  */
1751
DECL_MIO_NAME (ab_attribute)
1752
DECL_MIO_NAME (ar_type)
1753
DECL_MIO_NAME (array_type)
1754
DECL_MIO_NAME (bt)
1755
DECL_MIO_NAME (expr_t)
1756
DECL_MIO_NAME (gfc_access)
1757
DECL_MIO_NAME (gfc_intrinsic_op)
1758
DECL_MIO_NAME (ifsrc)
1759
DECL_MIO_NAME (save_state)
1760
DECL_MIO_NAME (procedure_type)
1761
DECL_MIO_NAME (ref_type)
1762
DECL_MIO_NAME (sym_flavor)
1763
DECL_MIO_NAME (sym_intent)
1764
#undef DECL_MIO_NAME
1765
 
1766
/* Symbol attributes are stored in list with the first three elements
1767
   being the enumerated fields, while the remaining elements (if any)
1768
   indicate the individual attribute bits.  The access field is not
1769
   saved-- it controls what symbols are exported when a module is
1770
   written.  */
1771
 
1772
static void
1773
mio_symbol_attribute (symbol_attribute *attr)
1774
{
1775
  atom_type t;
1776
  unsigned ext_attr,extension_level;
1777
 
1778
  mio_lparen ();
1779
 
1780
  attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1781
  attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1782
  attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1783
  attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1784
  attr->save = MIO_NAME (save_state) (attr->save, save_status);
1785
 
1786
  ext_attr = attr->ext_attr;
1787
  mio_integer ((int *) &ext_attr);
1788
  attr->ext_attr = ext_attr;
1789
 
1790
  extension_level = attr->extension;
1791
  mio_integer ((int *) &extension_level);
1792
  attr->extension = extension_level;
1793
 
1794
  if (iomode == IO_OUTPUT)
1795
    {
1796
      if (attr->allocatable)
1797
        MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1798
      if (attr->asynchronous)
1799
        MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
1800
      if (attr->dimension)
1801
        MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1802
      if (attr->external)
1803
        MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1804
      if (attr->intrinsic)
1805
        MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1806
      if (attr->optional)
1807
        MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1808
      if (attr->pointer)
1809
        MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1810
      if (attr->is_protected)
1811
        MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1812
      if (attr->value)
1813
        MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1814
      if (attr->volatile_)
1815
        MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1816
      if (attr->target)
1817
        MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1818
      if (attr->threadprivate)
1819
        MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1820
      if (attr->dummy)
1821
        MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1822
      if (attr->result)
1823
        MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1824
      /* We deliberately don't preserve the "entry" flag.  */
1825
 
1826
      if (attr->data)
1827
        MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1828
      if (attr->in_namelist)
1829
        MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1830
      if (attr->in_common)
1831
        MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1832
 
1833
      if (attr->function)
1834
        MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
1835
      if (attr->subroutine)
1836
        MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
1837
      if (attr->generic)
1838
        MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
1839
      if (attr->abstract)
1840
        MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
1841
 
1842
      if (attr->sequence)
1843
        MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
1844
      if (attr->elemental)
1845
        MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
1846
      if (attr->pure)
1847
        MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
1848
      if (attr->recursive)
1849
        MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
1850
      if (attr->always_explicit)
1851
        MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1852
      if (attr->cray_pointer)
1853
        MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
1854
      if (attr->cray_pointee)
1855
        MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1856
      if (attr->is_bind_c)
1857
        MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
1858
      if (attr->is_c_interop)
1859
        MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
1860
      if (attr->is_iso_c)
1861
        MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
1862
      if (attr->alloc_comp)
1863
        MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
1864
      if (attr->pointer_comp)
1865
        MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
1866
      if (attr->private_comp)
1867
        MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
1868
      if (attr->zero_comp)
1869
        MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
1870
      if (attr->is_class)
1871
        MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
1872
      if (attr->procedure)
1873
        MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
1874
      if (attr->proc_pointer)
1875
        MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
1876
 
1877
      mio_rparen ();
1878
 
1879
    }
1880
  else
1881
    {
1882
      for (;;)
1883
        {
1884
          t = parse_atom ();
1885
          if (t == ATOM_RPAREN)
1886
            break;
1887
          if (t != ATOM_NAME)
1888
            bad_module ("Expected attribute bit name");
1889
 
1890
          switch ((ab_attribute) find_enum (attr_bits))
1891
            {
1892
            case AB_ALLOCATABLE:
1893
              attr->allocatable = 1;
1894
              break;
1895
            case AB_ASYNCHRONOUS:
1896
              attr->asynchronous = 1;
1897
              break;
1898
            case AB_DIMENSION:
1899
              attr->dimension = 1;
1900
              break;
1901
            case AB_EXTERNAL:
1902
              attr->external = 1;
1903
              break;
1904
            case AB_INTRINSIC:
1905
              attr->intrinsic = 1;
1906
              break;
1907
            case AB_OPTIONAL:
1908
              attr->optional = 1;
1909
              break;
1910
            case AB_POINTER:
1911
              attr->pointer = 1;
1912
              break;
1913
            case AB_PROTECTED:
1914
              attr->is_protected = 1;
1915
              break;
1916
            case AB_VALUE:
1917
              attr->value = 1;
1918
              break;
1919
            case AB_VOLATILE:
1920
              attr->volatile_ = 1;
1921
              break;
1922
            case AB_TARGET:
1923
              attr->target = 1;
1924
              break;
1925
            case AB_THREADPRIVATE:
1926
              attr->threadprivate = 1;
1927
              break;
1928
            case AB_DUMMY:
1929
              attr->dummy = 1;
1930
              break;
1931
            case AB_RESULT:
1932
              attr->result = 1;
1933
              break;
1934
            case AB_DATA:
1935
              attr->data = 1;
1936
              break;
1937
            case AB_IN_NAMELIST:
1938
              attr->in_namelist = 1;
1939
              break;
1940
            case AB_IN_COMMON:
1941
              attr->in_common = 1;
1942
              break;
1943
            case AB_FUNCTION:
1944
              attr->function = 1;
1945
              break;
1946
            case AB_SUBROUTINE:
1947
              attr->subroutine = 1;
1948
              break;
1949
            case AB_GENERIC:
1950
              attr->generic = 1;
1951
              break;
1952
            case AB_ABSTRACT:
1953
              attr->abstract = 1;
1954
              break;
1955
            case AB_SEQUENCE:
1956
              attr->sequence = 1;
1957
              break;
1958
            case AB_ELEMENTAL:
1959
              attr->elemental = 1;
1960
              break;
1961
            case AB_PURE:
1962
              attr->pure = 1;
1963
              break;
1964
            case AB_RECURSIVE:
1965
              attr->recursive = 1;
1966
              break;
1967
            case AB_ALWAYS_EXPLICIT:
1968
              attr->always_explicit = 1;
1969
              break;
1970
            case AB_CRAY_POINTER:
1971
              attr->cray_pointer = 1;
1972
              break;
1973
            case AB_CRAY_POINTEE:
1974
              attr->cray_pointee = 1;
1975
              break;
1976
            case AB_IS_BIND_C:
1977
              attr->is_bind_c = 1;
1978
              break;
1979
            case AB_IS_C_INTEROP:
1980
              attr->is_c_interop = 1;
1981
              break;
1982
            case AB_IS_ISO_C:
1983
              attr->is_iso_c = 1;
1984
              break;
1985
            case AB_ALLOC_COMP:
1986
              attr->alloc_comp = 1;
1987
              break;
1988
            case AB_POINTER_COMP:
1989
              attr->pointer_comp = 1;
1990
              break;
1991
            case AB_PRIVATE_COMP:
1992
              attr->private_comp = 1;
1993
              break;
1994
            case AB_ZERO_COMP:
1995
              attr->zero_comp = 1;
1996
              break;
1997
            case AB_IS_CLASS:
1998
              attr->is_class = 1;
1999
              break;
2000
            case AB_PROCEDURE:
2001
              attr->procedure = 1;
2002
              break;
2003
            case AB_PROC_POINTER:
2004
              attr->proc_pointer = 1;
2005
              break;
2006
            }
2007
        }
2008
    }
2009
}
2010
 
2011
 
2012
static const mstring bt_types[] = {
2013
    minit ("INTEGER", BT_INTEGER),
2014
    minit ("REAL", BT_REAL),
2015
    minit ("COMPLEX", BT_COMPLEX),
2016
    minit ("LOGICAL", BT_LOGICAL),
2017
    minit ("CHARACTER", BT_CHARACTER),
2018
    minit ("DERIVED", BT_DERIVED),
2019
    minit ("CLASS", BT_CLASS),
2020
    minit ("PROCEDURE", BT_PROCEDURE),
2021
    minit ("UNKNOWN", BT_UNKNOWN),
2022
    minit ("VOID", BT_VOID),
2023
    minit (NULL, -1)
2024
};
2025
 
2026
 
2027
static void
2028
mio_charlen (gfc_charlen **clp)
2029
{
2030
  gfc_charlen *cl;
2031
 
2032
  mio_lparen ();
2033
 
2034
  if (iomode == IO_OUTPUT)
2035
    {
2036
      cl = *clp;
2037
      if (cl != NULL)
2038
        mio_expr (&cl->length);
2039
    }
2040
  else
2041
    {
2042
      if (peek_atom () != ATOM_RPAREN)
2043
        {
2044
          cl = gfc_new_charlen (gfc_current_ns, NULL);
2045
          mio_expr (&cl->length);
2046
          *clp = cl;
2047
        }
2048
    }
2049
 
2050
  mio_rparen ();
2051
}
2052
 
2053
 
2054
/* See if a name is a generated name.  */
2055
 
2056
static int
2057
check_unique_name (const char *name)
2058
{
2059
  return *name == '@';
2060
}
2061
 
2062
 
2063
static void
2064
mio_typespec (gfc_typespec *ts)
2065
{
2066
  mio_lparen ();
2067
 
2068
  ts->type = MIO_NAME (bt) (ts->type, bt_types);
2069
 
2070
  if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2071
    mio_integer (&ts->kind);
2072
  else
2073
    mio_symbol_ref (&ts->u.derived);
2074
 
2075
  /* Add info for C interop and is_iso_c.  */
2076
  mio_integer (&ts->is_c_interop);
2077
  mio_integer (&ts->is_iso_c);
2078
 
2079
  /* If the typespec is for an identifier either from iso_c_binding, or
2080
     a constant that was initialized to an identifier from it, use the
2081
     f90_type.  Otherwise, use the ts->type, since it shouldn't matter.  */
2082
  if (ts->is_iso_c)
2083
    ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2084
  else
2085
    ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2086
 
2087
  if (ts->type != BT_CHARACTER)
2088
    {
2089
      /* ts->u.cl is only valid for BT_CHARACTER.  */
2090
      mio_lparen ();
2091
      mio_rparen ();
2092
    }
2093
  else
2094
    mio_charlen (&ts->u.cl);
2095
 
2096
  mio_rparen ();
2097
}
2098
 
2099
 
2100
static const mstring array_spec_types[] = {
2101
    minit ("EXPLICIT", AS_EXPLICIT),
2102
    minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2103
    minit ("DEFERRED", AS_DEFERRED),
2104
    minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2105
    minit (NULL, -1)
2106
};
2107
 
2108
 
2109
static void
2110
mio_array_spec (gfc_array_spec **asp)
2111
{
2112
  gfc_array_spec *as;
2113
  int i;
2114
 
2115
  mio_lparen ();
2116
 
2117
  if (iomode == IO_OUTPUT)
2118
    {
2119
      if (*asp == NULL)
2120
        goto done;
2121
      as = *asp;
2122
    }
2123
  else
2124
    {
2125
      if (peek_atom () == ATOM_RPAREN)
2126
        {
2127
          *asp = NULL;
2128
          goto done;
2129
        }
2130
 
2131
      *asp = as = gfc_get_array_spec ();
2132
    }
2133
 
2134
  mio_integer (&as->rank);
2135
  as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2136
 
2137
  for (i = 0; i < as->rank; i++)
2138
    {
2139
      mio_expr (&as->lower[i]);
2140
      mio_expr (&as->upper[i]);
2141
    }
2142
 
2143
done:
2144
  mio_rparen ();
2145
}
2146
 
2147
 
2148
/* Given a pointer to an array reference structure (which lives in a
2149
   gfc_ref structure), find the corresponding array specification
2150
   structure.  Storing the pointer in the ref structure doesn't quite
2151
   work when loading from a module. Generating code for an array
2152
   reference also needs more information than just the array spec.  */
2153
 
2154
static const mstring array_ref_types[] = {
2155
    minit ("FULL", AR_FULL),
2156
    minit ("ELEMENT", AR_ELEMENT),
2157
    minit ("SECTION", AR_SECTION),
2158
    minit (NULL, -1)
2159
};
2160
 
2161
 
2162
static void
2163
mio_array_ref (gfc_array_ref *ar)
2164
{
2165
  int i;
2166
 
2167
  mio_lparen ();
2168
  ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2169
  mio_integer (&ar->dimen);
2170
 
2171
  switch (ar->type)
2172
    {
2173
    case AR_FULL:
2174
      break;
2175
 
2176
    case AR_ELEMENT:
2177
      for (i = 0; i < ar->dimen; i++)
2178
        mio_expr (&ar->start[i]);
2179
 
2180
      break;
2181
 
2182
    case AR_SECTION:
2183
      for (i = 0; i < ar->dimen; i++)
2184
        {
2185
          mio_expr (&ar->start[i]);
2186
          mio_expr (&ar->end[i]);
2187
          mio_expr (&ar->stride[i]);
2188
        }
2189
 
2190
      break;
2191
 
2192
    case AR_UNKNOWN:
2193
      gfc_internal_error ("mio_array_ref(): Unknown array ref");
2194
    }
2195
 
2196
  /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2197
     we can't call mio_integer directly.  Instead loop over each element
2198
     and cast it to/from an integer.  */
2199
  if (iomode == IO_OUTPUT)
2200
    {
2201
      for (i = 0; i < ar->dimen; i++)
2202
        {
2203
          int tmp = (int)ar->dimen_type[i];
2204
          write_atom (ATOM_INTEGER, &tmp);
2205
        }
2206
    }
2207
  else
2208
    {
2209
      for (i = 0; i < ar->dimen; i++)
2210
        {
2211
          require_atom (ATOM_INTEGER);
2212
          ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2213
        }
2214
    }
2215
 
2216
  if (iomode == IO_INPUT)
2217
    {
2218
      ar->where = gfc_current_locus;
2219
 
2220
      for (i = 0; i < ar->dimen; i++)
2221
        ar->c_where[i] = gfc_current_locus;
2222
    }
2223
 
2224
  mio_rparen ();
2225
}
2226
 
2227
 
2228
/* Saves or restores a pointer.  The pointer is converted back and
2229
   forth from an integer.  We return the pointer_info pointer so that
2230
   the caller can take additional action based on the pointer type.  */
2231
 
2232
static pointer_info *
2233
mio_pointer_ref (void *gp)
2234
{
2235
  pointer_info *p;
2236
 
2237
  if (iomode == IO_OUTPUT)
2238
    {
2239
      p = get_pointer (*((char **) gp));
2240
      write_atom (ATOM_INTEGER, &p->integer);
2241
    }
2242
  else
2243
    {
2244
      require_atom (ATOM_INTEGER);
2245
      p = add_fixup (atom_int, gp);
2246
    }
2247
 
2248
  return p;
2249
}
2250
 
2251
 
2252
/* Save and load references to components that occur within
2253
   expressions.  We have to describe these references by a number and
2254
   by name.  The number is necessary for forward references during
2255
   reading, and the name is necessary if the symbol already exists in
2256
   the namespace and is not loaded again.  */
2257
 
2258
static void
2259
mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2260
{
2261
  char name[GFC_MAX_SYMBOL_LEN + 1];
2262
  gfc_component *q;
2263
  pointer_info *p;
2264
 
2265
  p = mio_pointer_ref (cp);
2266
  if (p->type == P_UNKNOWN)
2267
    p->type = P_COMPONENT;
2268
 
2269
  if (iomode == IO_OUTPUT)
2270
    mio_pool_string (&(*cp)->name);
2271
  else
2272
    {
2273
      mio_internal_string (name);
2274
 
2275
      /* It can happen that a component reference can be read before the
2276
         associated derived type symbol has been loaded. Return now and
2277
         wait for a later iteration of load_needed.  */
2278
      if (sym == NULL)
2279
        return;
2280
 
2281
      if (sym->components != NULL && p->u.pointer == NULL)
2282
        {
2283
          /* Symbol already loaded, so search by name.  */
2284
          for (q = sym->components; q; q = q->next)
2285
            if (strcmp (q->name, name) == 0)
2286
              break;
2287
 
2288
          if (q == NULL)
2289
            gfc_internal_error ("mio_component_ref(): Component not found");
2290
 
2291
          associate_integer_pointer (p, q);
2292
        }
2293
 
2294
      /* Make sure this symbol will eventually be loaded.  */
2295
      p = find_pointer2 (sym);
2296
      if (p->u.rsym.state == UNUSED)
2297
        p->u.rsym.state = NEEDED;
2298
    }
2299
}
2300
 
2301
 
2302
static void mio_namespace_ref (gfc_namespace **nsp);
2303
static void mio_formal_arglist (gfc_formal_arglist **formal);
2304
static void mio_typebound_proc (gfc_typebound_proc** proc);
2305
 
2306
static void
2307
mio_component (gfc_component *c)
2308
{
2309
  pointer_info *p;
2310
  int n;
2311
  gfc_formal_arglist *formal;
2312
 
2313
  mio_lparen ();
2314
 
2315
  if (iomode == IO_OUTPUT)
2316
    {
2317
      p = get_pointer (c);
2318
      mio_integer (&p->integer);
2319
    }
2320
  else
2321
    {
2322
      mio_integer (&n);
2323
      p = get_integer (n);
2324
      associate_integer_pointer (p, c);
2325
    }
2326
 
2327
  if (p->type == P_UNKNOWN)
2328
    p->type = P_COMPONENT;
2329
 
2330
  mio_pool_string (&c->name);
2331
  mio_typespec (&c->ts);
2332
  mio_array_spec (&c->as);
2333
 
2334
  mio_symbol_attribute (&c->attr);
2335
  c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types);
2336
 
2337
  mio_expr (&c->initializer);
2338
 
2339
  if (c->attr.proc_pointer)
2340
    {
2341
      if (iomode == IO_OUTPUT)
2342
        {
2343
          formal = c->formal;
2344
          while (formal && !formal->sym)
2345
            formal = formal->next;
2346
 
2347
          if (formal)
2348
            mio_namespace_ref (&formal->sym->ns);
2349
          else
2350
            mio_namespace_ref (&c->formal_ns);
2351
        }
2352
      else
2353
        {
2354
          mio_namespace_ref (&c->formal_ns);
2355
          /* TODO: if (c->formal_ns)
2356
            {
2357
              c->formal_ns->proc_name = c;
2358
              c->refs++;
2359
            }*/
2360
        }
2361
 
2362
      mio_formal_arglist (&c->formal);
2363
 
2364
      mio_typebound_proc (&c->tb);
2365
    }
2366
 
2367
  mio_rparen ();
2368
}
2369
 
2370
 
2371
static void
2372
mio_component_list (gfc_component **cp)
2373
{
2374
  gfc_component *c, *tail;
2375
 
2376
  mio_lparen ();
2377
 
2378
  if (iomode == IO_OUTPUT)
2379
    {
2380
      for (c = *cp; c; c = c->next)
2381
        mio_component (c);
2382
    }
2383
  else
2384
    {
2385
      *cp = NULL;
2386
      tail = NULL;
2387
 
2388
      for (;;)
2389
        {
2390
          if (peek_atom () == ATOM_RPAREN)
2391
            break;
2392
 
2393
          c = gfc_get_component ();
2394
          mio_component (c);
2395
 
2396
          if (tail == NULL)
2397
            *cp = c;
2398
          else
2399
            tail->next = c;
2400
 
2401
          tail = c;
2402
        }
2403
    }
2404
 
2405
  mio_rparen ();
2406
}
2407
 
2408
 
2409
static void
2410
mio_actual_arg (gfc_actual_arglist *a)
2411
{
2412
  mio_lparen ();
2413
  mio_pool_string (&a->name);
2414
  mio_expr (&a->expr);
2415
  mio_rparen ();
2416
}
2417
 
2418
 
2419
static void
2420
mio_actual_arglist (gfc_actual_arglist **ap)
2421
{
2422
  gfc_actual_arglist *a, *tail;
2423
 
2424
  mio_lparen ();
2425
 
2426
  if (iomode == IO_OUTPUT)
2427
    {
2428
      for (a = *ap; a; a = a->next)
2429
        mio_actual_arg (a);
2430
 
2431
    }
2432
  else
2433
    {
2434
      tail = NULL;
2435
 
2436
      for (;;)
2437
        {
2438
          if (peek_atom () != ATOM_LPAREN)
2439
            break;
2440
 
2441
          a = gfc_get_actual_arglist ();
2442
 
2443
          if (tail == NULL)
2444
            *ap = a;
2445
          else
2446
            tail->next = a;
2447
 
2448
          tail = a;
2449
          mio_actual_arg (a);
2450
        }
2451
    }
2452
 
2453
  mio_rparen ();
2454
}
2455
 
2456
 
2457
/* Read and write formal argument lists.  */
2458
 
2459
static void
2460
mio_formal_arglist (gfc_formal_arglist **formal)
2461
{
2462
  gfc_formal_arglist *f, *tail;
2463
 
2464
  mio_lparen ();
2465
 
2466
  if (iomode == IO_OUTPUT)
2467
    {
2468
      for (f = *formal; f; f = f->next)
2469
        mio_symbol_ref (&f->sym);
2470
    }
2471
  else
2472
    {
2473
      *formal = tail = NULL;
2474
 
2475
      while (peek_atom () != ATOM_RPAREN)
2476
        {
2477
          f = gfc_get_formal_arglist ();
2478
          mio_symbol_ref (&f->sym);
2479
 
2480
          if (*formal == NULL)
2481
            *formal = f;
2482
          else
2483
            tail->next = f;
2484
 
2485
          tail = f;
2486
        }
2487
    }
2488
 
2489
  mio_rparen ();
2490
}
2491
 
2492
 
2493
/* Save or restore a reference to a symbol node.  */
2494
 
2495
pointer_info *
2496
mio_symbol_ref (gfc_symbol **symp)
2497
{
2498
  pointer_info *p;
2499
 
2500
  p = mio_pointer_ref (symp);
2501
  if (p->type == P_UNKNOWN)
2502
    p->type = P_SYMBOL;
2503
 
2504
  if (iomode == IO_OUTPUT)
2505
    {
2506
      if (p->u.wsym.state == UNREFERENCED)
2507
        p->u.wsym.state = NEEDS_WRITE;
2508
    }
2509
  else
2510
    {
2511
      if (p->u.rsym.state == UNUSED)
2512
        p->u.rsym.state = NEEDED;
2513
    }
2514
  return p;
2515
}
2516
 
2517
 
2518
/* Save or restore a reference to a symtree node.  */
2519
 
2520
static void
2521
mio_symtree_ref (gfc_symtree **stp)
2522
{
2523
  pointer_info *p;
2524
  fixup_t *f;
2525
 
2526
  if (iomode == IO_OUTPUT)
2527
    mio_symbol_ref (&(*stp)->n.sym);
2528
  else
2529
    {
2530
      require_atom (ATOM_INTEGER);
2531
      p = get_integer (atom_int);
2532
 
2533
      /* An unused equivalence member; make a symbol and a symtree
2534
         for it.  */
2535
      if (in_load_equiv && p->u.rsym.symtree == NULL)
2536
        {
2537
          /* Since this is not used, it must have a unique name.  */
2538
          p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2539
 
2540
          /* Make the symbol.  */
2541
          if (p->u.rsym.sym == NULL)
2542
            {
2543
              p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2544
                                              gfc_current_ns);
2545
              p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2546
            }
2547
 
2548
          p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2549
          p->u.rsym.symtree->n.sym->refs++;
2550
          p->u.rsym.referenced = 1;
2551
 
2552
          /* If the symbol is PRIVATE and in COMMON, load_commons will
2553
             generate a fixup symbol, which must be associated.  */
2554
          if (p->fixup)
2555
            resolve_fixups (p->fixup, p->u.rsym.sym);
2556
          p->fixup = NULL;
2557
        }
2558
 
2559
      if (p->type == P_UNKNOWN)
2560
        p->type = P_SYMBOL;
2561
 
2562
      if (p->u.rsym.state == UNUSED)
2563
        p->u.rsym.state = NEEDED;
2564
 
2565
      if (p->u.rsym.symtree != NULL)
2566
        {
2567
          *stp = p->u.rsym.symtree;
2568
        }
2569
      else
2570
        {
2571
          f = XCNEW (fixup_t);
2572
 
2573
          f->next = p->u.rsym.stfixup;
2574
          p->u.rsym.stfixup = f;
2575
 
2576
          f->pointer = (void **) stp;
2577
        }
2578
    }
2579
}
2580
 
2581
 
2582
static void
2583
mio_iterator (gfc_iterator **ip)
2584
{
2585
  gfc_iterator *iter;
2586
 
2587
  mio_lparen ();
2588
 
2589
  if (iomode == IO_OUTPUT)
2590
    {
2591
      if (*ip == NULL)
2592
        goto done;
2593
    }
2594
  else
2595
    {
2596
      if (peek_atom () == ATOM_RPAREN)
2597
        {
2598
          *ip = NULL;
2599
          goto done;
2600
        }
2601
 
2602
      *ip = gfc_get_iterator ();
2603
    }
2604
 
2605
  iter = *ip;
2606
 
2607
  mio_expr (&iter->var);
2608
  mio_expr (&iter->start);
2609
  mio_expr (&iter->end);
2610
  mio_expr (&iter->step);
2611
 
2612
done:
2613
  mio_rparen ();
2614
}
2615
 
2616
 
2617
static void
2618
mio_constructor (gfc_constructor **cp)
2619
{
2620
  gfc_constructor *c, *tail;
2621
 
2622
  mio_lparen ();
2623
 
2624
  if (iomode == IO_OUTPUT)
2625
    {
2626
      for (c = *cp; c; c = c->next)
2627
        {
2628
          mio_lparen ();
2629
          mio_expr (&c->expr);
2630
          mio_iterator (&c->iterator);
2631
          mio_rparen ();
2632
        }
2633
    }
2634
  else
2635
    {
2636
      *cp = NULL;
2637
      tail = NULL;
2638
 
2639
      while (peek_atom () != ATOM_RPAREN)
2640
        {
2641
          c = gfc_get_constructor ();
2642
 
2643
          if (tail == NULL)
2644
            *cp = c;
2645
          else
2646
            tail->next = c;
2647
 
2648
          tail = c;
2649
 
2650
          mio_lparen ();
2651
          mio_expr (&c->expr);
2652
          mio_iterator (&c->iterator);
2653
          mio_rparen ();
2654
        }
2655
    }
2656
 
2657
  mio_rparen ();
2658
}
2659
 
2660
 
2661
static const mstring ref_types[] = {
2662
    minit ("ARRAY", REF_ARRAY),
2663
    minit ("COMPONENT", REF_COMPONENT),
2664
    minit ("SUBSTRING", REF_SUBSTRING),
2665
    minit (NULL, -1)
2666
};
2667
 
2668
 
2669
static void
2670
mio_ref (gfc_ref **rp)
2671
{
2672
  gfc_ref *r;
2673
 
2674
  mio_lparen ();
2675
 
2676
  r = *rp;
2677
  r->type = MIO_NAME (ref_type) (r->type, ref_types);
2678
 
2679
  switch (r->type)
2680
    {
2681
    case REF_ARRAY:
2682
      mio_array_ref (&r->u.ar);
2683
      break;
2684
 
2685
    case REF_COMPONENT:
2686
      mio_symbol_ref (&r->u.c.sym);
2687
      mio_component_ref (&r->u.c.component, r->u.c.sym);
2688
      break;
2689
 
2690
    case REF_SUBSTRING:
2691
      mio_expr (&r->u.ss.start);
2692
      mio_expr (&r->u.ss.end);
2693
      mio_charlen (&r->u.ss.length);
2694
      break;
2695
    }
2696
 
2697
  mio_rparen ();
2698
}
2699
 
2700
 
2701
static void
2702
mio_ref_list (gfc_ref **rp)
2703
{
2704
  gfc_ref *ref, *head, *tail;
2705
 
2706
  mio_lparen ();
2707
 
2708
  if (iomode == IO_OUTPUT)
2709
    {
2710
      for (ref = *rp; ref; ref = ref->next)
2711
        mio_ref (&ref);
2712
    }
2713
  else
2714
    {
2715
      head = tail = NULL;
2716
 
2717
      while (peek_atom () != ATOM_RPAREN)
2718
        {
2719
          if (head == NULL)
2720
            head = tail = gfc_get_ref ();
2721
          else
2722
            {
2723
              tail->next = gfc_get_ref ();
2724
              tail = tail->next;
2725
            }
2726
 
2727
          mio_ref (&tail);
2728
        }
2729
 
2730
      *rp = head;
2731
    }
2732
 
2733
  mio_rparen ();
2734
}
2735
 
2736
 
2737
/* Read and write an integer value.  */
2738
 
2739
static void
2740
mio_gmp_integer (mpz_t *integer)
2741
{
2742
  char *p;
2743
 
2744
  if (iomode == IO_INPUT)
2745
    {
2746
      if (parse_atom () != ATOM_STRING)
2747
        bad_module ("Expected integer string");
2748
 
2749
      mpz_init (*integer);
2750
      if (mpz_set_str (*integer, atom_string, 10))
2751
        bad_module ("Error converting integer");
2752
 
2753
      gfc_free (atom_string);
2754
    }
2755
  else
2756
    {
2757
      p = mpz_get_str (NULL, 10, *integer);
2758
      write_atom (ATOM_STRING, p);
2759
      gfc_free (p);
2760
    }
2761
}
2762
 
2763
 
2764
static void
2765
mio_gmp_real (mpfr_t *real)
2766
{
2767
  mp_exp_t exponent;
2768
  char *p;
2769
 
2770
  if (iomode == IO_INPUT)
2771
    {
2772
      if (parse_atom () != ATOM_STRING)
2773
        bad_module ("Expected real string");
2774
 
2775
      mpfr_init (*real);
2776
      mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2777
      gfc_free (atom_string);
2778
    }
2779
  else
2780
    {
2781
      p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2782
 
2783
      if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
2784
        {
2785
          write_atom (ATOM_STRING, p);
2786
          gfc_free (p);
2787
          return;
2788
        }
2789
 
2790
      atom_string = XCNEWVEC (char, strlen (p) + 20);
2791
 
2792
      sprintf (atom_string, "0.%s@%ld", p, exponent);
2793
 
2794
      /* Fix negative numbers.  */
2795
      if (atom_string[2] == '-')
2796
        {
2797
          atom_string[0] = '-';
2798
          atom_string[1] = '0';
2799
          atom_string[2] = '.';
2800
        }
2801
 
2802
      write_atom (ATOM_STRING, atom_string);
2803
 
2804
      gfc_free (atom_string);
2805
      gfc_free (p);
2806
    }
2807
}
2808
 
2809
 
2810
/* Save and restore the shape of an array constructor.  */
2811
 
2812
static void
2813
mio_shape (mpz_t **pshape, int rank)
2814
{
2815
  mpz_t *shape;
2816
  atom_type t;
2817
  int n;
2818
 
2819
  /* A NULL shape is represented by ().  */
2820
  mio_lparen ();
2821
 
2822
  if (iomode == IO_OUTPUT)
2823
    {
2824
      shape = *pshape;
2825
      if (!shape)
2826
        {
2827
          mio_rparen ();
2828
          return;
2829
        }
2830
    }
2831
  else
2832
    {
2833
      t = peek_atom ();
2834
      if (t == ATOM_RPAREN)
2835
        {
2836
          *pshape = NULL;
2837
          mio_rparen ();
2838
          return;
2839
        }
2840
 
2841
      shape = gfc_get_shape (rank);
2842
      *pshape = shape;
2843
    }
2844
 
2845
  for (n = 0; n < rank; n++)
2846
    mio_gmp_integer (&shape[n]);
2847
 
2848
  mio_rparen ();
2849
}
2850
 
2851
 
2852
static const mstring expr_types[] = {
2853
    minit ("OP", EXPR_OP),
2854
    minit ("FUNCTION", EXPR_FUNCTION),
2855
    minit ("CONSTANT", EXPR_CONSTANT),
2856
    minit ("VARIABLE", EXPR_VARIABLE),
2857
    minit ("SUBSTRING", EXPR_SUBSTRING),
2858
    minit ("STRUCTURE", EXPR_STRUCTURE),
2859
    minit ("ARRAY", EXPR_ARRAY),
2860
    minit ("NULL", EXPR_NULL),
2861
    minit ("COMPCALL", EXPR_COMPCALL),
2862
    minit (NULL, -1)
2863
};
2864
 
2865
/* INTRINSIC_ASSIGN is missing because it is used as an index for
2866
   generic operators, not in expressions.  INTRINSIC_USER is also
2867
   replaced by the correct function name by the time we see it.  */
2868
 
2869
static const mstring intrinsics[] =
2870
{
2871
    minit ("UPLUS", INTRINSIC_UPLUS),
2872
    minit ("UMINUS", INTRINSIC_UMINUS),
2873
    minit ("PLUS", INTRINSIC_PLUS),
2874
    minit ("MINUS", INTRINSIC_MINUS),
2875
    minit ("TIMES", INTRINSIC_TIMES),
2876
    minit ("DIVIDE", INTRINSIC_DIVIDE),
2877
    minit ("POWER", INTRINSIC_POWER),
2878
    minit ("CONCAT", INTRINSIC_CONCAT),
2879
    minit ("AND", INTRINSIC_AND),
2880
    minit ("OR", INTRINSIC_OR),
2881
    minit ("EQV", INTRINSIC_EQV),
2882
    minit ("NEQV", INTRINSIC_NEQV),
2883
    minit ("EQ_SIGN", INTRINSIC_EQ),
2884
    minit ("EQ", INTRINSIC_EQ_OS),
2885
    minit ("NE_SIGN", INTRINSIC_NE),
2886
    minit ("NE", INTRINSIC_NE_OS),
2887
    minit ("GT_SIGN", INTRINSIC_GT),
2888
    minit ("GT", INTRINSIC_GT_OS),
2889
    minit ("GE_SIGN", INTRINSIC_GE),
2890
    minit ("GE", INTRINSIC_GE_OS),
2891
    minit ("LT_SIGN", INTRINSIC_LT),
2892
    minit ("LT", INTRINSIC_LT_OS),
2893
    minit ("LE_SIGN", INTRINSIC_LE),
2894
    minit ("LE", INTRINSIC_LE_OS),
2895
    minit ("NOT", INTRINSIC_NOT),
2896
    minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2897
    minit (NULL, -1)
2898
};
2899
 
2900
 
2901
/* Remedy a couple of situations where the gfc_expr's can be defective.  */
2902
 
2903
static void
2904
fix_mio_expr (gfc_expr *e)
2905
{
2906
  gfc_symtree *ns_st = NULL;
2907
  const char *fname;
2908
 
2909
  if (iomode != IO_OUTPUT)
2910
    return;
2911
 
2912
  if (e->symtree)
2913
    {
2914
      /* If this is a symtree for a symbol that came from a contained module
2915
         namespace, it has a unique name and we should look in the current
2916
         namespace to see if the required, non-contained symbol is available
2917
         yet. If so, the latter should be written.  */
2918
      if (e->symtree->n.sym && check_unique_name (e->symtree->name))
2919
        ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2920
                                  e->symtree->n.sym->name);
2921
 
2922
      /* On the other hand, if the existing symbol is the module name or the
2923
         new symbol is a dummy argument, do not do the promotion.  */
2924
      if (ns_st && ns_st->n.sym
2925
          && ns_st->n.sym->attr.flavor != FL_MODULE
2926
          && !e->symtree->n.sym->attr.dummy)
2927
        e->symtree = ns_st;
2928
    }
2929
  else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2930
    {
2931
      gfc_symbol *sym;
2932
 
2933
      /* In some circumstances, a function used in an initialization
2934
         expression, in one use associated module, can fail to be
2935
         coupled to its symtree when used in a specification
2936
         expression in another module.  */
2937
      fname = e->value.function.esym ? e->value.function.esym->name
2938
                                     : e->value.function.isym->name;
2939
      e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2940
 
2941
      if (e->symtree)
2942
        return;
2943
 
2944
      /* This is probably a reference to a private procedure from another
2945
         module.  To prevent a segfault, make a generic with no specific
2946
         instances.  If this module is used, without the required
2947
         specific coming from somewhere, the appropriate error message
2948
         is issued.  */
2949
      gfc_get_symbol (fname, gfc_current_ns, &sym);
2950
      sym->attr.flavor = FL_PROCEDURE;
2951
      sym->attr.generic = 1;
2952
      e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2953
    }
2954
}
2955
 
2956
 
2957
/* Read and write expressions.  The form "()" is allowed to indicate a
2958
   NULL expression.  */
2959
 
2960
static void
2961
mio_expr (gfc_expr **ep)
2962
{
2963
  gfc_expr *e;
2964
  atom_type t;
2965
  int flag;
2966
 
2967
  mio_lparen ();
2968
 
2969
  if (iomode == IO_OUTPUT)
2970
    {
2971
      if (*ep == NULL)
2972
        {
2973
          mio_rparen ();
2974
          return;
2975
        }
2976
 
2977
      e = *ep;
2978
      MIO_NAME (expr_t) (e->expr_type, expr_types);
2979
    }
2980
  else
2981
    {
2982
      t = parse_atom ();
2983
      if (t == ATOM_RPAREN)
2984
        {
2985
          *ep = NULL;
2986
          return;
2987
        }
2988
 
2989
      if (t != ATOM_NAME)
2990
        bad_module ("Expected expression type");
2991
 
2992
      e = *ep = gfc_get_expr ();
2993
      e->where = gfc_current_locus;
2994
      e->expr_type = (expr_t) find_enum (expr_types);
2995
    }
2996
 
2997
  mio_typespec (&e->ts);
2998
  mio_integer (&e->rank);
2999
 
3000
  fix_mio_expr (e);
3001
 
3002
  switch (e->expr_type)
3003
    {
3004
    case EXPR_OP:
3005
      e->value.op.op
3006
        = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3007
 
3008
      switch (e->value.op.op)
3009
        {
3010
        case INTRINSIC_UPLUS:
3011
        case INTRINSIC_UMINUS:
3012
        case INTRINSIC_NOT:
3013
        case INTRINSIC_PARENTHESES:
3014
          mio_expr (&e->value.op.op1);
3015
          break;
3016
 
3017
        case INTRINSIC_PLUS:
3018
        case INTRINSIC_MINUS:
3019
        case INTRINSIC_TIMES:
3020
        case INTRINSIC_DIVIDE:
3021
        case INTRINSIC_POWER:
3022
        case INTRINSIC_CONCAT:
3023
        case INTRINSIC_AND:
3024
        case INTRINSIC_OR:
3025
        case INTRINSIC_EQV:
3026
        case INTRINSIC_NEQV:
3027
        case INTRINSIC_EQ:
3028
        case INTRINSIC_EQ_OS:
3029
        case INTRINSIC_NE:
3030
        case INTRINSIC_NE_OS:
3031
        case INTRINSIC_GT:
3032
        case INTRINSIC_GT_OS:
3033
        case INTRINSIC_GE:
3034
        case INTRINSIC_GE_OS:
3035
        case INTRINSIC_LT:
3036
        case INTRINSIC_LT_OS:
3037
        case INTRINSIC_LE:
3038
        case INTRINSIC_LE_OS:
3039
          mio_expr (&e->value.op.op1);
3040
          mio_expr (&e->value.op.op2);
3041
          break;
3042
 
3043
        default:
3044
          bad_module ("Bad operator");
3045
        }
3046
 
3047
      break;
3048
 
3049
    case EXPR_FUNCTION:
3050
      mio_symtree_ref (&e->symtree);
3051
      mio_actual_arglist (&e->value.function.actual);
3052
 
3053
      if (iomode == IO_OUTPUT)
3054
        {
3055
          e->value.function.name
3056
            = mio_allocated_string (e->value.function.name);
3057
          flag = e->value.function.esym != NULL;
3058
          mio_integer (&flag);
3059
          if (flag)
3060
            mio_symbol_ref (&e->value.function.esym);
3061
          else
3062
            write_atom (ATOM_STRING, e->value.function.isym->name);
3063
        }
3064
      else
3065
        {
3066
          require_atom (ATOM_STRING);
3067
          e->value.function.name = gfc_get_string (atom_string);
3068
          gfc_free (atom_string);
3069
 
3070
          mio_integer (&flag);
3071
          if (flag)
3072
            mio_symbol_ref (&e->value.function.esym);
3073
          else
3074
            {
3075
              require_atom (ATOM_STRING);
3076
              e->value.function.isym = gfc_find_function (atom_string);
3077
              gfc_free (atom_string);
3078
            }
3079
        }
3080
 
3081
      break;
3082
 
3083
    case EXPR_VARIABLE:
3084
      mio_symtree_ref (&e->symtree);
3085
      mio_ref_list (&e->ref);
3086
      break;
3087
 
3088
    case EXPR_SUBSTRING:
3089
      e->value.character.string
3090
        = CONST_CAST (gfc_char_t *,
3091
                      mio_allocated_wide_string (e->value.character.string,
3092
                                                 e->value.character.length));
3093
      mio_ref_list (&e->ref);
3094
      break;
3095
 
3096
    case EXPR_STRUCTURE:
3097
    case EXPR_ARRAY:
3098
      mio_constructor (&e->value.constructor);
3099
      mio_shape (&e->shape, e->rank);
3100
      break;
3101
 
3102
    case EXPR_CONSTANT:
3103
      switch (e->ts.type)
3104
        {
3105
        case BT_INTEGER:
3106
          mio_gmp_integer (&e->value.integer);
3107
          break;
3108
 
3109
        case BT_REAL:
3110
          gfc_set_model_kind (e->ts.kind);
3111
          mio_gmp_real (&e->value.real);
3112
          break;
3113
 
3114
        case BT_COMPLEX:
3115
          gfc_set_model_kind (e->ts.kind);
3116
          mio_gmp_real (&mpc_realref (e->value.complex));
3117
          mio_gmp_real (&mpc_imagref (e->value.complex));
3118
          break;
3119
 
3120
        case BT_LOGICAL:
3121
          mio_integer (&e->value.logical);
3122
          break;
3123
 
3124
        case BT_CHARACTER:
3125
          mio_integer (&e->value.character.length);
3126
          e->value.character.string
3127
            = CONST_CAST (gfc_char_t *,
3128
                          mio_allocated_wide_string (e->value.character.string,
3129
                                                     e->value.character.length));
3130
          break;
3131
 
3132
        default:
3133
          bad_module ("Bad type in constant expression");
3134
        }
3135
 
3136
      break;
3137
 
3138
    case EXPR_NULL:
3139
      break;
3140
 
3141
    case EXPR_COMPCALL:
3142
    case EXPR_PPC:
3143
      gcc_unreachable ();
3144
      break;
3145
    }
3146
 
3147
  mio_rparen ();
3148
}
3149
 
3150
 
3151
/* Read and write namelists.  */
3152
 
3153
static void
3154
mio_namelist (gfc_symbol *sym)
3155
{
3156
  gfc_namelist *n, *m;
3157
  const char *check_name;
3158
 
3159
  mio_lparen ();
3160
 
3161
  if (iomode == IO_OUTPUT)
3162
    {
3163
      for (n = sym->namelist; n; n = n->next)
3164
        mio_symbol_ref (&n->sym);
3165
    }
3166
  else
3167
    {
3168
      /* This departure from the standard is flagged as an error.
3169
         It does, in fact, work correctly. TODO: Allow it
3170
         conditionally?  */
3171
      if (sym->attr.flavor == FL_NAMELIST)
3172
        {
3173
          check_name = find_use_name (sym->name, false);
3174
          if (check_name && strcmp (check_name, sym->name) != 0)
3175
            gfc_error ("Namelist %s cannot be renamed by USE "
3176
                       "association to %s", sym->name, check_name);
3177
        }
3178
 
3179
      m = NULL;
3180
      while (peek_atom () != ATOM_RPAREN)
3181
        {
3182
          n = gfc_get_namelist ();
3183
          mio_symbol_ref (&n->sym);
3184
 
3185
          if (sym->namelist == NULL)
3186
            sym->namelist = n;
3187
          else
3188
            m->next = n;
3189
 
3190
          m = n;
3191
        }
3192
      sym->namelist_tail = m;
3193
    }
3194
 
3195
  mio_rparen ();
3196
}
3197
 
3198
 
3199
/* Save/restore lists of gfc_interface structures.  When loading an
3200
   interface, we are really appending to the existing list of
3201
   interfaces.  Checking for duplicate and ambiguous interfaces has to
3202
   be done later when all symbols have been loaded.  */
3203
 
3204
pointer_info *
3205
mio_interface_rest (gfc_interface **ip)
3206
{
3207
  gfc_interface *tail, *p;
3208
  pointer_info *pi = NULL;
3209
 
3210
  if (iomode == IO_OUTPUT)
3211
    {
3212
      if (ip != NULL)
3213
        for (p = *ip; p; p = p->next)
3214
          mio_symbol_ref (&p->sym);
3215
    }
3216
  else
3217
    {
3218
      if (*ip == NULL)
3219
        tail = NULL;
3220
      else
3221
        {
3222
          tail = *ip;
3223
          while (tail->next)
3224
            tail = tail->next;
3225
        }
3226
 
3227
      for (;;)
3228
        {
3229
          if (peek_atom () == ATOM_RPAREN)
3230
            break;
3231
 
3232
          p = gfc_get_interface ();
3233
          p->where = gfc_current_locus;
3234
          pi = mio_symbol_ref (&p->sym);
3235
 
3236
          if (tail == NULL)
3237
            *ip = p;
3238
          else
3239
            tail->next = p;
3240
 
3241
          tail = p;
3242
        }
3243
    }
3244
 
3245
  mio_rparen ();
3246
  return pi;
3247
}
3248
 
3249
 
3250
/* Save/restore a nameless operator interface.  */
3251
 
3252
static void
3253
mio_interface (gfc_interface **ip)
3254
{
3255
  mio_lparen ();
3256
  mio_interface_rest (ip);
3257
}
3258
 
3259
 
3260
/* Save/restore a named operator interface.  */
3261
 
3262
static void
3263
mio_symbol_interface (const char **name, const char **module,
3264
                      gfc_interface **ip)
3265
{
3266
  mio_lparen ();
3267
  mio_pool_string (name);
3268
  mio_pool_string (module);
3269
  mio_interface_rest (ip);
3270
}
3271
 
3272
 
3273
static void
3274
mio_namespace_ref (gfc_namespace **nsp)
3275
{
3276
  gfc_namespace *ns;
3277
  pointer_info *p;
3278
 
3279
  p = mio_pointer_ref (nsp);
3280
 
3281
  if (p->type == P_UNKNOWN)
3282
    p->type = P_NAMESPACE;
3283
 
3284
  if (iomode == IO_INPUT && p->integer != 0)
3285
    {
3286
      ns = (gfc_namespace *) p->u.pointer;
3287
      if (ns == NULL)
3288
        {
3289
          ns = gfc_get_namespace (NULL, 0);
3290
          associate_integer_pointer (p, ns);
3291
        }
3292
      else
3293
        ns->refs++;
3294
    }
3295
}
3296
 
3297
 
3298
/* Save/restore the f2k_derived namespace of a derived-type symbol.  */
3299
 
3300
static gfc_namespace* current_f2k_derived;
3301
 
3302
static void
3303
mio_typebound_proc (gfc_typebound_proc** proc)
3304
{
3305
  int flag;
3306
  int overriding_flag;
3307
 
3308
  if (iomode == IO_INPUT)
3309
    {
3310
      *proc = gfc_get_typebound_proc ();
3311
      (*proc)->where = gfc_current_locus;
3312
    }
3313
  gcc_assert (*proc);
3314
 
3315
  mio_lparen ();
3316
 
3317
  (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3318
 
3319
  /* IO the NON_OVERRIDABLE/DEFERRED combination.  */
3320
  gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3321
  overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3322
  overriding_flag = mio_name (overriding_flag, binding_overriding);
3323
  (*proc)->deferred = ((overriding_flag & 2) != 0);
3324
  (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3325
  gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3326
 
3327
  (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3328
  (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3329
  (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3330
 
3331
  mio_pool_string (&((*proc)->pass_arg));
3332
 
3333
  flag = (int) (*proc)->pass_arg_num;
3334
  mio_integer (&flag);
3335
  (*proc)->pass_arg_num = (unsigned) flag;
3336
 
3337
  if ((*proc)->is_generic)
3338
    {
3339
      gfc_tbp_generic* g;
3340
 
3341
      mio_lparen ();
3342
 
3343
      if (iomode == IO_OUTPUT)
3344
        for (g = (*proc)->u.generic; g; g = g->next)
3345
          mio_allocated_string (g->specific_st->name);
3346
      else
3347
        {
3348
          (*proc)->u.generic = NULL;
3349
          while (peek_atom () != ATOM_RPAREN)
3350
            {
3351
              gfc_symtree** sym_root;
3352
 
3353
              g = gfc_get_tbp_generic ();
3354
              g->specific = NULL;
3355
 
3356
              require_atom (ATOM_STRING);
3357
              sym_root = &current_f2k_derived->tb_sym_root;
3358
              g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3359
              gfc_free (atom_string);
3360
 
3361
              g->next = (*proc)->u.generic;
3362
              (*proc)->u.generic = g;
3363
            }
3364
        }
3365
 
3366
      mio_rparen ();
3367
    }
3368
  else if (!(*proc)->ppc)
3369
    mio_symtree_ref (&(*proc)->u.specific);
3370
 
3371
  mio_rparen ();
3372
}
3373
 
3374
/* Walker-callback function for this purpose.  */
3375
static void
3376
mio_typebound_symtree (gfc_symtree* st)
3377
{
3378
  if (iomode == IO_OUTPUT && !st->n.tb)
3379
    return;
3380
 
3381
  if (iomode == IO_OUTPUT)
3382
    {
3383
      mio_lparen ();
3384
      mio_allocated_string (st->name);
3385
    }
3386
  /* For IO_INPUT, the above is done in mio_f2k_derived.  */
3387
 
3388
  mio_typebound_proc (&st->n.tb);
3389
  mio_rparen ();
3390
}
3391
 
3392
/* IO a full symtree (in all depth).  */
3393
static void
3394
mio_full_typebound_tree (gfc_symtree** root)
3395
{
3396
  mio_lparen ();
3397
 
3398
  if (iomode == IO_OUTPUT)
3399
    gfc_traverse_symtree (*root, &mio_typebound_symtree);
3400
  else
3401
    {
3402
      while (peek_atom () == ATOM_LPAREN)
3403
        {
3404
          gfc_symtree* st;
3405
 
3406
          mio_lparen ();
3407
 
3408
          require_atom (ATOM_STRING);
3409
          st = gfc_get_tbp_symtree (root, atom_string);
3410
          gfc_free (atom_string);
3411
 
3412
          mio_typebound_symtree (st);
3413
        }
3414
    }
3415
 
3416
  mio_rparen ();
3417
}
3418
 
3419
static void
3420
mio_finalizer (gfc_finalizer **f)
3421
{
3422
  if (iomode == IO_OUTPUT)
3423
    {
3424
      gcc_assert (*f);
3425
      gcc_assert ((*f)->proc_tree); /* Should already be resolved.  */
3426
      mio_symtree_ref (&(*f)->proc_tree);
3427
    }
3428
  else
3429
    {
3430
      *f = gfc_get_finalizer ();
3431
      (*f)->where = gfc_current_locus; /* Value should not matter.  */
3432
      (*f)->next = NULL;
3433
 
3434
      mio_symtree_ref (&(*f)->proc_tree);
3435
      (*f)->proc_sym = NULL;
3436
    }
3437
}
3438
 
3439
static void
3440
mio_f2k_derived (gfc_namespace *f2k)
3441
{
3442
  current_f2k_derived = f2k;
3443
 
3444
  /* Handle the list of finalizer procedures.  */
3445
  mio_lparen ();
3446
  if (iomode == IO_OUTPUT)
3447
    {
3448
      gfc_finalizer *f;
3449
      for (f = f2k->finalizers; f; f = f->next)
3450
        mio_finalizer (&f);
3451
    }
3452
  else
3453
    {
3454
      f2k->finalizers = NULL;
3455
      while (peek_atom () != ATOM_RPAREN)
3456
        {
3457
          gfc_finalizer *cur = NULL;
3458
          mio_finalizer (&cur);
3459
          cur->next = f2k->finalizers;
3460
          f2k->finalizers = cur;
3461
        }
3462
    }
3463
  mio_rparen ();
3464
 
3465
  /* Handle type-bound procedures.  */
3466
  mio_full_typebound_tree (&f2k->tb_sym_root);
3467
 
3468
  /* Type-bound user operators.  */
3469
  mio_full_typebound_tree (&f2k->tb_uop_root);
3470
 
3471
  /* Type-bound intrinsic operators.  */
3472
  mio_lparen ();
3473
  if (iomode == IO_OUTPUT)
3474
    {
3475
      int op;
3476
      for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3477
        {
3478
          gfc_intrinsic_op realop;
3479
 
3480
          if (op == INTRINSIC_USER || !f2k->tb_op[op])
3481
            continue;
3482
 
3483
          mio_lparen ();
3484
          realop = (gfc_intrinsic_op) op;
3485
          mio_intrinsic_op (&realop);
3486
          mio_typebound_proc (&f2k->tb_op[op]);
3487
          mio_rparen ();
3488
        }
3489
    }
3490
  else
3491
    while (peek_atom () != ATOM_RPAREN)
3492
      {
3493
        gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC.  */
3494
 
3495
        mio_lparen ();
3496
        mio_intrinsic_op (&op);
3497
        mio_typebound_proc (&f2k->tb_op[op]);
3498
        mio_rparen ();
3499
      }
3500
  mio_rparen ();
3501
}
3502
 
3503
static void
3504
mio_full_f2k_derived (gfc_symbol *sym)
3505
{
3506
  mio_lparen ();
3507
 
3508
  if (iomode == IO_OUTPUT)
3509
    {
3510
      if (sym->f2k_derived)
3511
        mio_f2k_derived (sym->f2k_derived);
3512
    }
3513
  else
3514
    {
3515
      if (peek_atom () != ATOM_RPAREN)
3516
        {
3517
          sym->f2k_derived = gfc_get_namespace (NULL, 0);
3518
          mio_f2k_derived (sym->f2k_derived);
3519
        }
3520
      else
3521
        gcc_assert (!sym->f2k_derived);
3522
    }
3523
 
3524
  mio_rparen ();
3525
}
3526
 
3527
 
3528
/* Unlike most other routines, the address of the symbol node is already
3529
   fixed on input and the name/module has already been filled in.  */
3530
 
3531
static void
3532
mio_symbol (gfc_symbol *sym)
3533
{
3534
  int intmod = INTMOD_NONE;
3535
 
3536
  mio_lparen ();
3537
 
3538
  mio_symbol_attribute (&sym->attr);
3539
  mio_typespec (&sym->ts);
3540
 
3541
  if (iomode == IO_OUTPUT)
3542
    mio_namespace_ref (&sym->formal_ns);
3543
  else
3544
    {
3545
      mio_namespace_ref (&sym->formal_ns);
3546
      if (sym->formal_ns)
3547
        {
3548
          sym->formal_ns->proc_name = sym;
3549
          sym->refs++;
3550
        }
3551
    }
3552
 
3553
  /* Save/restore common block links.  */
3554
  mio_symbol_ref (&sym->common_next);
3555
 
3556
  mio_formal_arglist (&sym->formal);
3557
 
3558
  if (sym->attr.flavor == FL_PARAMETER)
3559
    mio_expr (&sym->value);
3560
 
3561
  mio_array_spec (&sym->as);
3562
 
3563
  mio_symbol_ref (&sym->result);
3564
 
3565
  if (sym->attr.cray_pointee)
3566
    mio_symbol_ref (&sym->cp_pointer);
3567
 
3568
  /* Note that components are always saved, even if they are supposed
3569
     to be private.  Component access is checked during searching.  */
3570
 
3571
  mio_component_list (&sym->components);
3572
 
3573
  if (sym->components != NULL)
3574
    sym->component_access
3575
      = MIO_NAME (gfc_access) (sym->component_access, access_types);
3576
 
3577
  /* Load/save the f2k_derived namespace of a derived-type symbol.  */
3578
  mio_full_f2k_derived (sym);
3579
 
3580
  mio_namelist (sym);
3581
 
3582
  /* Add the fields that say whether this is from an intrinsic module,
3583
     and if so, what symbol it is within the module.  */
3584
/*   mio_integer (&(sym->from_intmod)); */
3585
  if (iomode == IO_OUTPUT)
3586
    {
3587
      intmod = sym->from_intmod;
3588
      mio_integer (&intmod);
3589
    }
3590
  else
3591
    {
3592
      mio_integer (&intmod);
3593
      sym->from_intmod = (intmod_id) intmod;
3594
    }
3595
 
3596
  mio_integer (&(sym->intmod_sym_id));
3597
 
3598
  if (sym->attr.flavor == FL_DERIVED)
3599
    mio_integer (&(sym->hash_value));
3600
 
3601
  mio_rparen ();
3602
}
3603
 
3604
 
3605
/************************* Top level subroutines *************************/
3606
 
3607
/* Given a root symtree node and a symbol, try to find a symtree that
3608
   references the symbol that is not a unique name.  */
3609
 
3610
static gfc_symtree *
3611
find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3612
{
3613
  gfc_symtree *s = NULL;
3614
 
3615
  if (st == NULL)
3616
    return s;
3617
 
3618
  s = find_symtree_for_symbol (st->right, sym);
3619
  if (s != NULL)
3620
    return s;
3621
  s = find_symtree_for_symbol (st->left, sym);
3622
  if (s != NULL)
3623
    return s;
3624
 
3625
  if (st->n.sym == sym && !check_unique_name (st->name))
3626
    return st;
3627
 
3628
  return s;
3629
}
3630
 
3631
 
3632
/* A recursive function to look for a specific symbol by name and by
3633
   module.  Whilst several symtrees might point to one symbol, its
3634
   is sufficient for the purposes here than one exist.  Note that
3635
   generic interfaces are distinguished as are symbols that have been
3636
   renamed in another module.  */
3637
static gfc_symtree *
3638
find_symbol (gfc_symtree *st, const char *name,
3639
             const char *module, int generic)
3640
{
3641
  int c;
3642
  gfc_symtree *retval, *s;
3643
 
3644
  if (st == NULL || st->n.sym == NULL)
3645
    return NULL;
3646
 
3647
  c = strcmp (name, st->n.sym->name);
3648
  if (c == 0 && st->n.sym->module
3649
             && strcmp (module, st->n.sym->module) == 0
3650
             && !check_unique_name (st->name))
3651
    {
3652
      s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3653
 
3654
      /* Detect symbols that are renamed by use association in another
3655
         module by the absence of a symtree and null attr.use_rename,
3656
         since the latter is not transmitted in the module file.  */
3657
      if (((!generic && !st->n.sym->attr.generic)
3658
                || (generic && st->n.sym->attr.generic))
3659
            && !(s == NULL && !st->n.sym->attr.use_rename))
3660
        return st;
3661
    }
3662
 
3663
  retval = find_symbol (st->left, name, module, generic);
3664
 
3665
  if (retval == NULL)
3666
    retval = find_symbol (st->right, name, module, generic);
3667
 
3668
  return retval;
3669
}
3670
 
3671
 
3672
/* Skip a list between balanced left and right parens.  */
3673
 
3674
static void
3675
skip_list (void)
3676
{
3677
  int level;
3678
 
3679
  level = 0;
3680
  do
3681
    {
3682
      switch (parse_atom ())
3683
        {
3684
        case ATOM_LPAREN:
3685
          level++;
3686
          break;
3687
 
3688
        case ATOM_RPAREN:
3689
          level--;
3690
          break;
3691
 
3692
        case ATOM_STRING:
3693
          gfc_free (atom_string);
3694
          break;
3695
 
3696
        case ATOM_NAME:
3697
        case ATOM_INTEGER:
3698
          break;
3699
        }
3700
    }
3701
  while (level > 0);
3702
}
3703
 
3704
 
3705
/* Load operator interfaces from the module.  Interfaces are unusual
3706
   in that they attach themselves to existing symbols.  */
3707
 
3708
static void
3709
load_operator_interfaces (void)
3710
{
3711
  const char *p;
3712
  char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3713
  gfc_user_op *uop;
3714
  pointer_info *pi = NULL;
3715
  int n, i;
3716
 
3717
  mio_lparen ();
3718
 
3719
  while (peek_atom () != ATOM_RPAREN)
3720
    {
3721
      mio_lparen ();
3722
 
3723
      mio_internal_string (name);
3724
      mio_internal_string (module);
3725
 
3726
      n = number_use_names (name, true);
3727
      n = n ? n : 1;
3728
 
3729
      for (i = 1; i <= n; i++)
3730
        {
3731
          /* Decide if we need to load this one or not.  */
3732
          p = find_use_name_n (name, &i, true);
3733
 
3734
          if (p == NULL)
3735
            {
3736
              while (parse_atom () != ATOM_RPAREN);
3737
              continue;
3738
            }
3739
 
3740
          if (i == 1)
3741
            {
3742
              uop = gfc_get_uop (p);
3743
              pi = mio_interface_rest (&uop->op);
3744
            }
3745
          else
3746
            {
3747
              if (gfc_find_uop (p, NULL))
3748
                continue;
3749
              uop = gfc_get_uop (p);
3750
              uop->op = gfc_get_interface ();
3751
              uop->op->where = gfc_current_locus;
3752
              add_fixup (pi->integer, &uop->op->sym);
3753
            }
3754
        }
3755
    }
3756
 
3757
  mio_rparen ();
3758
}
3759
 
3760
 
3761
/* Load interfaces from the module.  Interfaces are unusual in that
3762
   they attach themselves to existing symbols.  */
3763
 
3764
static void
3765
load_generic_interfaces (void)
3766
{
3767
  const char *p;
3768
  char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3769
  gfc_symbol *sym;
3770
  gfc_interface *generic = NULL, *gen = NULL;
3771
  int n, i, renamed;
3772
  bool ambiguous_set = false;
3773
 
3774
  mio_lparen ();
3775
 
3776
  while (peek_atom () != ATOM_RPAREN)
3777
    {
3778
      mio_lparen ();
3779
 
3780
      mio_internal_string (name);
3781
      mio_internal_string (module);
3782
 
3783
      n = number_use_names (name, false);
3784
      renamed = n ? 1 : 0;
3785
      n = n ? n : 1;
3786
 
3787
      for (i = 1; i <= n; i++)
3788
        {
3789
          gfc_symtree *st;
3790
          /* Decide if we need to load this one or not.  */
3791
          p = find_use_name_n (name, &i, false);
3792
 
3793
          st = find_symbol (gfc_current_ns->sym_root,
3794
                            name, module_name, 1);
3795
 
3796
          if (!p || gfc_find_symbol (p, NULL, 0, &sym))
3797
            {
3798
              /* Skip the specific names for these cases.  */
3799
              while (i == 1 && parse_atom () != ATOM_RPAREN);
3800
 
3801
              continue;
3802
            }
3803
 
3804
          /* If the symbol exists already and is being USEd without being
3805
             in an ONLY clause, do not load a new symtree(11.3.2).  */
3806
          if (!only_flag && st)
3807
            sym = st->n.sym;
3808
 
3809
          if (!sym)
3810
            {
3811
              /* Make the symbol inaccessible if it has been added by a USE
3812
                 statement without an ONLY(11.3.2).  */
3813
              if (st && only_flag
3814
                     && !st->n.sym->attr.use_only
3815
                     && !st->n.sym->attr.use_rename
3816
                     && strcmp (st->n.sym->module, module_name) == 0)
3817
                {
3818
                  sym = st->n.sym;
3819
                  gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3820
                  st = gfc_get_unique_symtree (gfc_current_ns);
3821
                  st->n.sym = sym;
3822
                  sym = NULL;
3823
                }
3824
              else if (st)
3825
                {
3826
                  sym = st->n.sym;
3827
                  if (strcmp (st->name, p) != 0)
3828
                    {
3829
                      st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
3830
                      st->n.sym = sym;
3831
                      sym->refs++;
3832
                    }
3833
                }
3834
 
3835
              /* Since we haven't found a valid generic interface, we had
3836
                 better make one.  */
3837
              if (!sym)
3838
                {
3839
                  gfc_get_symbol (p, NULL, &sym);
3840
                  sym->name = gfc_get_string (name);
3841
                  sym->module = gfc_get_string (module_name);
3842
                  sym->attr.flavor = FL_PROCEDURE;
3843
                  sym->attr.generic = 1;
3844
                  sym->attr.use_assoc = 1;
3845
                }
3846
            }
3847
          else
3848
            {
3849
              /* Unless sym is a generic interface, this reference
3850
                 is ambiguous.  */
3851
              if (st == NULL)
3852
                st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3853
 
3854
              sym = st->n.sym;
3855
 
3856
              if (st && !sym->attr.generic
3857
                     && !st->ambiguous
3858
                     && sym->module
3859
                     && strcmp(module, sym->module))
3860
                {
3861
                  ambiguous_set = true;
3862
                  st->ambiguous = 1;
3863
                }
3864
            }
3865
 
3866
          sym->attr.use_only = only_flag;
3867
          sym->attr.use_rename = renamed;
3868
 
3869
          if (i == 1)
3870
            {
3871
              mio_interface_rest (&sym->generic);
3872
              generic = sym->generic;
3873
            }
3874
          else if (!sym->generic)
3875
            {
3876
              sym->generic = generic;
3877
              sym->attr.generic_copy = 1;
3878
            }
3879
 
3880
          /* If a procedure that is not generic has generic interfaces
3881
             that include itself, it is generic! We need to take care
3882
             to retain symbols ambiguous that were already so.  */
3883
          if (sym->attr.use_assoc
3884
                && !sym->attr.generic
3885
                && sym->attr.flavor == FL_PROCEDURE)
3886
            {
3887
              for (gen = generic; gen; gen = gen->next)
3888
                {
3889
                  if (gen->sym == sym)
3890
                    {
3891
                      sym->attr.generic = 1;
3892
                      if (ambiguous_set)
3893
                        st->ambiguous = 0;
3894
                      break;
3895
                    }
3896
                }
3897
            }
3898
 
3899
        }
3900
    }
3901
 
3902
  mio_rparen ();
3903
}
3904
 
3905
 
3906
/* Load common blocks.  */
3907
 
3908
static void
3909
load_commons (void)
3910
{
3911
  char name[GFC_MAX_SYMBOL_LEN + 1];
3912
  gfc_common_head *p;
3913
 
3914
  mio_lparen ();
3915
 
3916
  while (peek_atom () != ATOM_RPAREN)
3917
    {
3918
      int flags;
3919
      mio_lparen ();
3920
      mio_internal_string (name);
3921
 
3922
      p = gfc_get_common (name, 1);
3923
 
3924
      mio_symbol_ref (&p->head);
3925
      mio_integer (&flags);
3926
      if (flags & 1)
3927
        p->saved = 1;
3928
      if (flags & 2)
3929
        p->threadprivate = 1;
3930
      p->use_assoc = 1;
3931
 
3932
      /* Get whether this was a bind(c) common or not.  */
3933
      mio_integer (&p->is_bind_c);
3934
      /* Get the binding label.  */
3935
      mio_internal_string (p->binding_label);
3936
 
3937
      mio_rparen ();
3938
    }
3939
 
3940
  mio_rparen ();
3941
}
3942
 
3943
 
3944
/* Load equivalences.  The flag in_load_equiv informs mio_expr_ref of this
3945
   so that unused variables are not loaded and so that the expression can
3946
   be safely freed.  */
3947
 
3948
static void
3949
load_equiv (void)
3950
{
3951
  gfc_equiv *head, *tail, *end, *eq;
3952
  bool unused;
3953
 
3954
  mio_lparen ();
3955
  in_load_equiv = true;
3956
 
3957
  end = gfc_current_ns->equiv;
3958
  while (end != NULL && end->next != NULL)
3959
    end = end->next;
3960
 
3961
  while (peek_atom () != ATOM_RPAREN) {
3962
    mio_lparen ();
3963
    head = tail = NULL;
3964
 
3965
    while(peek_atom () != ATOM_RPAREN)
3966
      {
3967
        if (head == NULL)
3968
          head = tail = gfc_get_equiv ();
3969
        else
3970
          {
3971
            tail->eq = gfc_get_equiv ();
3972
            tail = tail->eq;
3973
          }
3974
 
3975
        mio_pool_string (&tail->module);
3976
        mio_expr (&tail->expr);
3977
      }
3978
 
3979
    /* Unused equivalence members have a unique name.  In addition, it
3980
       must be checked that the symbols are from the same module.  */
3981
    unused = true;
3982
    for (eq = head; eq; eq = eq->eq)
3983
      {
3984
        if (eq->expr->symtree->n.sym->module
3985
              && head->expr->symtree->n.sym->module
3986
              && strcmp (head->expr->symtree->n.sym->module,
3987
                         eq->expr->symtree->n.sym->module) == 0
3988
              && !check_unique_name (eq->expr->symtree->name))
3989
          {
3990
            unused = false;
3991
            break;
3992
          }
3993
      }
3994
 
3995
    if (unused)
3996
      {
3997
        for (eq = head; eq; eq = head)
3998
          {
3999
            head = eq->eq;
4000
            gfc_free_expr (eq->expr);
4001
            gfc_free (eq);
4002
          }
4003
      }
4004
 
4005
    if (end == NULL)
4006
      gfc_current_ns->equiv = head;
4007
    else
4008
      end->next = head;
4009
 
4010
    if (head != NULL)
4011
      end = head;
4012
 
4013
    mio_rparen ();
4014
  }
4015
 
4016
  mio_rparen ();
4017
  in_load_equiv = false;
4018
}
4019
 
4020
 
4021
/* This function loads the sym_root of f2k_derived with the extensions to
4022
   the derived type.  */
4023
static void
4024
load_derived_extensions (void)
4025
{
4026
  int symbol, j;
4027
  gfc_symbol *derived;
4028
  gfc_symbol *dt;
4029
  gfc_symtree *st;
4030
  pointer_info *info;
4031
  char name[GFC_MAX_SYMBOL_LEN + 1];
4032
  char module[GFC_MAX_SYMBOL_LEN + 1];
4033
  const char *p;
4034
 
4035
  mio_lparen ();
4036
  while (peek_atom () != ATOM_RPAREN)
4037
    {
4038
      mio_lparen ();
4039
      mio_integer (&symbol);
4040
      info = get_integer (symbol);
4041
      derived = info->u.rsym.sym;
4042
 
4043
      /* This one is not being loaded.  */
4044
      if (!info || !derived)
4045
        {
4046
          while (peek_atom () != ATOM_RPAREN)
4047
            skip_list ();
4048
          continue;
4049
        }
4050
 
4051
      gcc_assert (derived->attr.flavor == FL_DERIVED);
4052
      if (derived->f2k_derived == NULL)
4053
        derived->f2k_derived = gfc_get_namespace (NULL, 0);
4054
 
4055
      while (peek_atom () != ATOM_RPAREN)
4056
        {
4057
          mio_lparen ();
4058
          mio_internal_string (name);
4059
          mio_internal_string (module);
4060
 
4061
          /* Only use one use name to find the symbol.  */
4062
          j = 1;
4063
          p = find_use_name_n (name, &j, false);
4064
          if (p)
4065
            {
4066
              st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4067
              dt = st->n.sym;
4068
              st = gfc_find_symtree (derived->f2k_derived->sym_root, name);
4069
              if (st == NULL)
4070
                {
4071
                  /* Only use the real name in f2k_derived to ensure a single
4072
                    symtree.  */
4073
                  st = gfc_new_symtree (&derived->f2k_derived->sym_root, name);
4074
                  st->n.sym = dt;
4075
                  st->n.sym->refs++;
4076
                }
4077
            }
4078
          mio_rparen ();
4079
        }
4080
      mio_rparen ();
4081
    }
4082
  mio_rparen ();
4083
}
4084
 
4085
 
4086
/* Recursive function to traverse the pointer_info tree and load a
4087
   needed symbol.  We return nonzero if we load a symbol and stop the
4088
   traversal, because the act of loading can alter the tree.  */
4089
 
4090
static int
4091
load_needed (pointer_info *p)
4092
{
4093
  gfc_namespace *ns;
4094
  pointer_info *q;
4095
  gfc_symbol *sym;
4096
  int rv;
4097
 
4098
  rv = 0;
4099
  if (p == NULL)
4100
    return rv;
4101
 
4102
  rv |= load_needed (p->left);
4103
  rv |= load_needed (p->right);
4104
 
4105
  if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
4106
    return rv;
4107
 
4108
  p->u.rsym.state = USED;
4109
 
4110
  set_module_locus (&p->u.rsym.where);
4111
 
4112
  sym = p->u.rsym.sym;
4113
  if (sym == NULL)
4114
    {
4115
      q = get_integer (p->u.rsym.ns);
4116
 
4117
      ns = (gfc_namespace *) q->u.pointer;
4118
      if (ns == NULL)
4119
        {
4120
          /* Create an interface namespace if necessary.  These are
4121
             the namespaces that hold the formal parameters of module
4122
             procedures.  */
4123
 
4124
          ns = gfc_get_namespace (NULL, 0);
4125
          associate_integer_pointer (q, ns);
4126
        }
4127
 
4128
      /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
4129
         doesn't go pear-shaped if the symbol is used.  */
4130
      if (!ns->proc_name)
4131
        gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
4132
                                 1, &ns->proc_name);
4133
 
4134
      sym = gfc_new_symbol (p->u.rsym.true_name, ns);
4135
      sym->module = gfc_get_string (p->u.rsym.module);
4136
      strcpy (sym->binding_label, p->u.rsym.binding_label);
4137
 
4138
      associate_integer_pointer (p, sym);
4139
    }
4140
 
4141
  mio_symbol (sym);
4142
  sym->attr.use_assoc = 1;
4143
  if (only_flag)
4144
    sym->attr.use_only = 1;
4145
  if (p->u.rsym.renamed)
4146
    sym->attr.use_rename = 1;
4147
 
4148
  return 1;
4149
}
4150
 
4151
 
4152
/* Recursive function for cleaning up things after a module has been read.  */
4153
 
4154
static void
4155
read_cleanup (pointer_info *p)
4156
{
4157
  gfc_symtree *st;
4158
  pointer_info *q;
4159
 
4160
  if (p == NULL)
4161
    return;
4162
 
4163
  read_cleanup (p->left);
4164
  read_cleanup (p->right);
4165
 
4166
  if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
4167
    {
4168
      /* Add hidden symbols to the symtree.  */
4169
      q = get_integer (p->u.rsym.ns);
4170
      st = gfc_get_unique_symtree ((gfc_namespace *) q->u.pointer);
4171
 
4172
      st->n.sym = p->u.rsym.sym;
4173
      st->n.sym->refs++;
4174
 
4175
      /* Fixup any symtree references.  */
4176
      p->u.rsym.symtree = st;
4177
      resolve_fixups (p->u.rsym.stfixup, st);
4178
      p->u.rsym.stfixup = NULL;
4179
    }
4180
 
4181
  /* Free unused symbols.  */
4182
  if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
4183
    gfc_free_symbol (p->u.rsym.sym);
4184
}
4185
 
4186
 
4187
/* It is not quite enough to check for ambiguity in the symbols by
4188
   the loaded symbol and the new symbol not being identical.  */
4189
static bool
4190
check_for_ambiguous (gfc_symbol *st_sym, pointer_info *info)
4191
{
4192
  gfc_symbol *rsym;
4193
  module_locus locus;
4194
  symbol_attribute attr;
4195
 
4196
  rsym = info->u.rsym.sym;
4197
  if (st_sym == rsym)
4198
    return false;
4199
 
4200
  /* If the existing symbol is generic from a different module and
4201
     the new symbol is generic there can be no ambiguity.  */
4202
  if (st_sym->attr.generic
4203
        && st_sym->module
4204
        && strcmp (st_sym->module, module_name))
4205
    {
4206
      /* The new symbol's attributes have not yet been read.  Since
4207
         we need attr.generic, read it directly.  */
4208
      get_module_locus (&locus);
4209
      set_module_locus (&info->u.rsym.where);
4210
      mio_lparen ();
4211
      attr.generic = 0;
4212
      mio_symbol_attribute (&attr);
4213
      set_module_locus (&locus);
4214
      if (attr.generic)
4215
        return false;
4216
    }
4217
 
4218
  return true;
4219
}
4220
 
4221
 
4222
/* Read a module file.  */
4223
 
4224
static void
4225
read_module (void)
4226
{
4227
  module_locus operator_interfaces, user_operators, extensions;
4228
  const char *p;
4229
  char name[GFC_MAX_SYMBOL_LEN + 1];
4230
  int i;
4231
  int ambiguous, j, nuse, symbol;
4232
  pointer_info *info, *q;
4233
  gfc_use_rename *u;
4234
  gfc_symtree *st;
4235
  gfc_symbol *sym;
4236
 
4237
  get_module_locus (&operator_interfaces);      /* Skip these for now.  */
4238
  skip_list ();
4239
 
4240
  get_module_locus (&user_operators);
4241
  skip_list ();
4242
  skip_list ();
4243
 
4244
  /* Skip commons, equivalences and derived type extensions for now.  */
4245
  skip_list ();
4246
  skip_list ();
4247
 
4248
  get_module_locus (&extensions);
4249
  skip_list ();
4250
 
4251
  mio_lparen ();
4252
 
4253
  /* Create the fixup nodes for all the symbols.  */
4254
 
4255
  while (peek_atom () != ATOM_RPAREN)
4256
    {
4257
      require_atom (ATOM_INTEGER);
4258
      info = get_integer (atom_int);
4259
 
4260
      info->type = P_SYMBOL;
4261
      info->u.rsym.state = UNUSED;
4262
 
4263
      mio_internal_string (info->u.rsym.true_name);
4264
      mio_internal_string (info->u.rsym.module);
4265
      mio_internal_string (info->u.rsym.binding_label);
4266
 
4267
 
4268
      require_atom (ATOM_INTEGER);
4269
      info->u.rsym.ns = atom_int;
4270
 
4271
      get_module_locus (&info->u.rsym.where);
4272
      skip_list ();
4273
 
4274
      /* See if the symbol has already been loaded by a previous module.
4275
         If so, we reference the existing symbol and prevent it from
4276
         being loaded again.  This should not happen if the symbol being
4277
         read is an index for an assumed shape dummy array (ns != 1).  */
4278
 
4279
      sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
4280
 
4281
      if (sym == NULL
4282
          || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
4283
        continue;
4284
 
4285
      info->u.rsym.state = USED;
4286
      info->u.rsym.sym = sym;
4287
 
4288
      /* Some symbols do not have a namespace (eg. formal arguments),
4289
         so the automatic "unique symtree" mechanism must be suppressed
4290
         by marking them as referenced.  */
4291
      q = get_integer (info->u.rsym.ns);
4292
      if (q->u.pointer == NULL)
4293
        {
4294
          info->u.rsym.referenced = 1;
4295
          continue;
4296
        }
4297
 
4298
      /* If possible recycle the symtree that references the symbol.
4299
         If a symtree is not found and the module does not import one,
4300
         a unique-name symtree is found by read_cleanup.  */
4301
      st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
4302
      if (st != NULL)
4303
        {
4304
          info->u.rsym.symtree = st;
4305
          info->u.rsym.referenced = 1;
4306
        }
4307
    }
4308
 
4309
  mio_rparen ();
4310
 
4311
  /* Parse the symtree lists.  This lets us mark which symbols need to
4312
     be loaded.  Renaming is also done at this point by replacing the
4313
     symtree name.  */
4314
 
4315
  mio_lparen ();
4316
 
4317
  while (peek_atom () != ATOM_RPAREN)
4318
    {
4319
      mio_internal_string (name);
4320
      mio_integer (&ambiguous);
4321
      mio_integer (&symbol);
4322
 
4323
      info = get_integer (symbol);
4324
 
4325
      /* See how many use names there are.  If none, go through the start
4326
         of the loop at least once.  */
4327
      nuse = number_use_names (name, false);
4328
      info->u.rsym.renamed = nuse ? 1 : 0;
4329
 
4330
      if (nuse == 0)
4331
        nuse = 1;
4332
 
4333
      for (j = 1; j <= nuse; j++)
4334
        {
4335
          /* Get the jth local name for this symbol.  */
4336
          p = find_use_name_n (name, &j, false);
4337
 
4338
          if (p == NULL && strcmp (name, module_name) == 0)
4339
            p = name;
4340
 
4341
          /* Skip symtree nodes not in an ONLY clause, unless there
4342
             is an existing symtree loaded from another USE statement.  */
4343
          if (p == NULL)
4344
            {
4345
              st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4346
              if (st != NULL)
4347
                info->u.rsym.symtree = st;
4348
              continue;
4349
            }
4350
 
4351
          /* If a symbol of the same name and module exists already,
4352
             this symbol, which is not in an ONLY clause, must not be
4353
             added to the namespace(11.3.2).  Note that find_symbol
4354
             only returns the first occurrence that it finds.  */
4355
          if (!only_flag && !info->u.rsym.renamed
4356
                && strcmp (name, module_name) != 0
4357
                && find_symbol (gfc_current_ns->sym_root, name,
4358
                                module_name, 0))
4359
            continue;
4360
 
4361
          st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4362
 
4363
          if (st != NULL)
4364
            {
4365
              /* Check for ambiguous symbols.  */
4366
              if (check_for_ambiguous (st->n.sym, info))
4367
                st->ambiguous = 1;
4368
              info->u.rsym.symtree = st;
4369
            }
4370
          else
4371
            {
4372
              st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4373
 
4374
              /* Delete the symtree if the symbol has been added by a USE
4375
                 statement without an ONLY(11.3.2).  Remember that the rsym
4376
                 will be the same as the symbol found in the symtree, for
4377
                 this case.  */
4378
              if (st && (only_flag || info->u.rsym.renamed)
4379
                     && !st->n.sym->attr.use_only
4380
                     && !st->n.sym->attr.use_rename
4381
                     && info->u.rsym.sym == st->n.sym)
4382
                gfc_delete_symtree (&gfc_current_ns->sym_root, name);
4383
 
4384
              /* Create a symtree node in the current namespace for this
4385
                 symbol.  */
4386
              st = check_unique_name (p)
4387
                   ? gfc_get_unique_symtree (gfc_current_ns)
4388
                   : gfc_new_symtree (&gfc_current_ns->sym_root, p);
4389
              st->ambiguous = ambiguous;
4390
 
4391
              sym = info->u.rsym.sym;
4392
 
4393
              /* Create a symbol node if it doesn't already exist.  */
4394
              if (sym == NULL)
4395
                {
4396
                  info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
4397
                                                     gfc_current_ns);
4398
                  sym = info->u.rsym.sym;
4399
                  sym->module = gfc_get_string (info->u.rsym.module);
4400
 
4401
                  /* TODO: hmm, can we test this?  Do we know it will be
4402
                     initialized to zeros?  */
4403
                  if (info->u.rsym.binding_label[0] != '\0')
4404
                    strcpy (sym->binding_label, info->u.rsym.binding_label);
4405
                }
4406
 
4407
              st->n.sym = sym;
4408
              st->n.sym->refs++;
4409
 
4410
              if (strcmp (name, p) != 0)
4411
                sym->attr.use_rename = 1;
4412
 
4413
              /* We need to set the only_flag here so that symbols from the
4414
                 same USE...ONLY but earlier are not deleted from the tree in
4415
                 the gfc_delete_symtree above.  */
4416
              sym->attr.use_only = only_flag;
4417
 
4418
              /* Store the symtree pointing to this symbol.  */
4419
              info->u.rsym.symtree = st;
4420
 
4421
              if (info->u.rsym.state == UNUSED)
4422
                info->u.rsym.state = NEEDED;
4423
              info->u.rsym.referenced = 1;
4424
            }
4425
        }
4426
    }
4427
 
4428
  mio_rparen ();
4429
 
4430
  /* Load intrinsic operator interfaces.  */
4431
  set_module_locus (&operator_interfaces);
4432
  mio_lparen ();
4433
 
4434
  for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4435
    {
4436
      if (i == INTRINSIC_USER)
4437
        continue;
4438
 
4439
      if (only_flag)
4440
        {
4441
          u = find_use_operator ((gfc_intrinsic_op) i);
4442
 
4443
          if (u == NULL)
4444
            {
4445
              skip_list ();
4446
              continue;
4447
            }
4448
 
4449
          u->found = 1;
4450
        }
4451
 
4452
      mio_interface (&gfc_current_ns->op[i]);
4453
    }
4454
 
4455
  mio_rparen ();
4456
 
4457
  /* Load generic and user operator interfaces.  These must follow the
4458
     loading of symtree because otherwise symbols can be marked as
4459
     ambiguous.  */
4460
 
4461
  set_module_locus (&user_operators);
4462
 
4463
  load_operator_interfaces ();
4464
  load_generic_interfaces ();
4465
 
4466
  load_commons ();
4467
  load_equiv ();
4468
 
4469
  /* At this point, we read those symbols that are needed but haven't
4470
     been loaded yet.  If one symbol requires another, the other gets
4471
     marked as NEEDED if its previous state was UNUSED.  */
4472
 
4473
  while (load_needed (pi_root));
4474
 
4475
  /* Make sure all elements of the rename-list were found in the module.  */
4476
 
4477
  for (u = gfc_rename_list; u; u = u->next)
4478
    {
4479
      if (u->found)
4480
        continue;
4481
 
4482
      if (u->op == INTRINSIC_NONE)
4483
        {
4484
          gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
4485
                     u->use_name, &u->where, module_name);
4486
          continue;
4487
        }
4488
 
4489
      if (u->op == INTRINSIC_USER)
4490
        {
4491
          gfc_error ("User operator '%s' referenced at %L not found "
4492
                     "in module '%s'", u->use_name, &u->where, module_name);
4493
          continue;
4494
        }
4495
 
4496
      gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4497
                 "in module '%s'", gfc_op2string (u->op), &u->where,
4498
                 module_name);
4499
    }
4500
 
4501
  /* Now we should be in a position to fill f2k_derived with derived type
4502
     extensions, since everything has been loaded.  */
4503
  set_module_locus (&extensions);
4504
  load_derived_extensions ();
4505
 
4506
  /* Clean up symbol nodes that were never loaded, create references
4507
     to hidden symbols.  */
4508
 
4509
  read_cleanup (pi_root);
4510
}
4511
 
4512
 
4513
/* Given an access type that is specific to an entity and the default
4514
   access, return nonzero if the entity is publicly accessible.  If the
4515
   element is declared as PUBLIC, then it is public; if declared
4516
   PRIVATE, then private, and otherwise it is public unless the default
4517
   access in this context has been declared PRIVATE.  */
4518
 
4519
bool
4520
gfc_check_access (gfc_access specific_access, gfc_access default_access)
4521
{
4522
  if (specific_access == ACCESS_PUBLIC)
4523
    return TRUE;
4524
  if (specific_access == ACCESS_PRIVATE)
4525
    return FALSE;
4526
 
4527
  if (gfc_option.flag_module_private)
4528
    return default_access == ACCESS_PUBLIC;
4529
  else
4530
    return default_access != ACCESS_PRIVATE;
4531
}
4532
 
4533
 
4534
/* A structure to remember which commons we've already written.  */
4535
 
4536
struct written_common
4537
{
4538
  BBT_HEADER(written_common);
4539
  const char *name, *label;
4540
};
4541
 
4542
static struct written_common *written_commons = NULL;
4543
 
4544
/* Comparison function used for balancing the binary tree.  */
4545
 
4546
static int
4547
compare_written_commons (void *a1, void *b1)
4548
{
4549
  const char *aname = ((struct written_common *) a1)->name;
4550
  const char *alabel = ((struct written_common *) a1)->label;
4551
  const char *bname = ((struct written_common *) b1)->name;
4552
  const char *blabel = ((struct written_common *) b1)->label;
4553
  int c = strcmp (aname, bname);
4554
 
4555
  return (c != 0 ? c : strcmp (alabel, blabel));
4556
}
4557
 
4558
/* Free a list of written commons.  */
4559
 
4560
static void
4561
free_written_common (struct written_common *w)
4562
{
4563
  if (!w)
4564
    return;
4565
 
4566
  if (w->left)
4567
    free_written_common (w->left);
4568
  if (w->right)
4569
    free_written_common (w->right);
4570
 
4571
  gfc_free (w);
4572
}
4573
 
4574
/* Write a common block to the module -- recursive helper function.  */
4575
 
4576
static void
4577
write_common_0 (gfc_symtree *st, bool this_module)
4578
{
4579
  gfc_common_head *p;
4580
  const char * name;
4581
  int flags;
4582
  const char *label;
4583
  struct written_common *w;
4584
  bool write_me = true;
4585
 
4586
  if (st == NULL)
4587
    return;
4588
 
4589
  write_common_0 (st->left, this_module);
4590
 
4591
  /* We will write out the binding label, or the name if no label given.  */
4592
  name = st->n.common->name;
4593
  p = st->n.common;
4594
  label = p->is_bind_c ? p->binding_label : p->name;
4595
 
4596
  /* Check if we've already output this common.  */
4597
  w = written_commons;
4598
  while (w)
4599
    {
4600
      int c = strcmp (name, w->name);
4601
      c = (c != 0 ? c : strcmp (label, w->label));
4602
      if (c == 0)
4603
        write_me = false;
4604
 
4605
      w = (c < 0) ? w->left : w->right;
4606
    }
4607
 
4608
  if (this_module && p->use_assoc)
4609
    write_me = false;
4610
 
4611
  if (write_me)
4612
    {
4613
      /* Write the common to the module.  */
4614
      mio_lparen ();
4615
      mio_pool_string (&name);
4616
 
4617
      mio_symbol_ref (&p->head);
4618
      flags = p->saved ? 1 : 0;
4619
      if (p->threadprivate)
4620
        flags |= 2;
4621
      mio_integer (&flags);
4622
 
4623
      /* Write out whether the common block is bind(c) or not.  */
4624
      mio_integer (&(p->is_bind_c));
4625
 
4626
      mio_pool_string (&label);
4627
      mio_rparen ();
4628
 
4629
      /* Record that we have written this common.  */
4630
      w = XCNEW (struct written_common);
4631
      w->name = p->name;
4632
      w->label = label;
4633
      gfc_insert_bbt (&written_commons, w, compare_written_commons);
4634
    }
4635
 
4636
  write_common_0 (st->right, this_module);
4637
}
4638
 
4639
 
4640
/* Write a common, by initializing the list of written commons, calling
4641
   the recursive function write_common_0() and cleaning up afterwards.  */
4642
 
4643
static void
4644
write_common (gfc_symtree *st)
4645
{
4646
  written_commons = NULL;
4647
  write_common_0 (st, true);
4648
  write_common_0 (st, false);
4649
  free_written_common (written_commons);
4650
  written_commons = NULL;
4651
}
4652
 
4653
 
4654
/* Write the blank common block to the module.  */
4655
 
4656
static void
4657
write_blank_common (void)
4658
{
4659
  const char * name = BLANK_COMMON_NAME;
4660
  int saved;
4661
  /* TODO: Blank commons are not bind(c).  The F2003 standard probably says
4662
     this, but it hasn't been checked.  Just making it so for now.  */
4663
  int is_bind_c = 0;
4664
 
4665
  if (gfc_current_ns->blank_common.head == NULL)
4666
    return;
4667
 
4668
  mio_lparen ();
4669
 
4670
  mio_pool_string (&name);
4671
 
4672
  mio_symbol_ref (&gfc_current_ns->blank_common.head);
4673
  saved = gfc_current_ns->blank_common.saved;
4674
  mio_integer (&saved);
4675
 
4676
  /* Write out whether the common block is bind(c) or not.  */
4677
  mio_integer (&is_bind_c);
4678
 
4679
  /* Write out the binding label, which is BLANK_COMMON_NAME, though
4680
     it doesn't matter because the label isn't used.  */
4681
  mio_pool_string (&name);
4682
 
4683
  mio_rparen ();
4684
}
4685
 
4686
 
4687
/* Write equivalences to the module.  */
4688
 
4689
static void
4690
write_equiv (void)
4691
{
4692
  gfc_equiv *eq, *e;
4693
  int num;
4694
 
4695
  num = 0;
4696
  for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
4697
    {
4698
      mio_lparen ();
4699
 
4700
      for (e = eq; e; e = e->eq)
4701
        {
4702
          if (e->module == NULL)
4703
            e->module = gfc_get_string ("%s.eq.%d", module_name, num);
4704
          mio_allocated_string (e->module);
4705
          mio_expr (&e->expr);
4706
        }
4707
 
4708
      num++;
4709
      mio_rparen ();
4710
    }
4711
}
4712
 
4713
 
4714
/* Write derived type extensions to the module.  */
4715
 
4716
static void
4717
write_dt_extensions (gfc_symtree *st)
4718
{
4719
  if (!gfc_check_access (st->n.sym->attr.access,
4720
                         st->n.sym->ns->default_access))
4721
    return;
4722
 
4723
  mio_lparen ();
4724
  mio_pool_string (&st->n.sym->name);
4725
  if (st->n.sym->module != NULL)
4726
    mio_pool_string (&st->n.sym->module);
4727
  else
4728
    mio_internal_string (module_name);
4729
  mio_rparen ();
4730
}
4731
 
4732
static void
4733
write_derived_extensions (gfc_symtree *st)
4734
{
4735
  if (!((st->n.sym->attr.flavor == FL_DERIVED)
4736
          && (st->n.sym->f2k_derived != NULL)
4737
          && (st->n.sym->f2k_derived->sym_root != NULL)))
4738
    return;
4739
 
4740
  mio_lparen ();
4741
  mio_symbol_ref (&(st->n.sym));
4742
  gfc_traverse_symtree (st->n.sym->f2k_derived->sym_root,
4743
                        write_dt_extensions);
4744
  mio_rparen ();
4745
}
4746
 
4747
 
4748
/* Write a symbol to the module.  */
4749
 
4750
static void
4751
write_symbol (int n, gfc_symbol *sym)
4752
{
4753
  const char *label;
4754
 
4755
  if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
4756
    gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
4757
 
4758
  mio_integer (&n);
4759
  mio_pool_string (&sym->name);
4760
 
4761
  mio_pool_string (&sym->module);
4762
  if (sym->attr.is_bind_c || sym->attr.is_iso_c)
4763
    {
4764
      label = sym->binding_label;
4765
      mio_pool_string (&label);
4766
    }
4767
  else
4768
    mio_pool_string (&sym->name);
4769
 
4770
  mio_pointer_ref (&sym->ns);
4771
 
4772
  mio_symbol (sym);
4773
  write_char ('\n');
4774
}
4775
 
4776
 
4777
/* Recursive traversal function to write the initial set of symbols to
4778
   the module.  We check to see if the symbol should be written
4779
   according to the access specification.  */
4780
 
4781
static void
4782
write_symbol0 (gfc_symtree *st)
4783
{
4784
  gfc_symbol *sym;
4785
  pointer_info *p;
4786
  bool dont_write = false;
4787
 
4788
  if (st == NULL)
4789
    return;
4790
 
4791
  write_symbol0 (st->left);
4792
 
4793
  sym = st->n.sym;
4794
  if (sym->module == NULL)
4795
    sym->module = gfc_get_string (module_name);
4796
 
4797
  if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4798
      && !sym->attr.subroutine && !sym->attr.function)
4799
    dont_write = true;
4800
 
4801
  if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
4802
    dont_write = true;
4803
 
4804
  if (!dont_write)
4805
    {
4806
      p = get_pointer (sym);
4807
      if (p->type == P_UNKNOWN)
4808
        p->type = P_SYMBOL;
4809
 
4810
      if (p->u.wsym.state != WRITTEN)
4811
        {
4812
          write_symbol (p->integer, sym);
4813
          p->u.wsym.state = WRITTEN;
4814
        }
4815
    }
4816
 
4817
  write_symbol0 (st->right);
4818
}
4819
 
4820
 
4821
/* Recursive traversal function to write the secondary set of symbols
4822
   to the module file.  These are symbols that were not public yet are
4823
   needed by the public symbols or another dependent symbol.  The act
4824
   of writing a symbol can modify the pointer_info tree, so we cease
4825
   traversal if we find a symbol to write.  We return nonzero if a
4826
   symbol was written and pass that information upwards.  */
4827
 
4828
static int
4829
write_symbol1 (pointer_info *p)
4830
{
4831
  int result;
4832
 
4833
  if (!p)
4834
    return 0;
4835
 
4836
  result = write_symbol1 (p->left);
4837
 
4838
  if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
4839
    {
4840
      p->u.wsym.state = WRITTEN;
4841
      write_symbol (p->integer, p->u.wsym.sym);
4842
      result = 1;
4843
    }
4844
 
4845
  result |= write_symbol1 (p->right);
4846
  return result;
4847
}
4848
 
4849
 
4850
/* Write operator interfaces associated with a symbol.  */
4851
 
4852
static void
4853
write_operator (gfc_user_op *uop)
4854
{
4855
  static char nullstring[] = "";
4856
  const char *p = nullstring;
4857
 
4858
  if (uop->op == NULL
4859
      || !gfc_check_access (uop->access, uop->ns->default_access))
4860
    return;
4861
 
4862
  mio_symbol_interface (&uop->name, &p, &uop->op);
4863
}
4864
 
4865
 
4866
/* Write generic interfaces from the namespace sym_root.  */
4867
 
4868
static void
4869
write_generic (gfc_symtree *st)
4870
{
4871
  gfc_symbol *sym;
4872
 
4873
  if (st == NULL)
4874
    return;
4875
 
4876
  write_generic (st->left);
4877
  write_generic (st->right);
4878
 
4879
  sym = st->n.sym;
4880
  if (!sym || check_unique_name (st->name))
4881
    return;
4882
 
4883
  if (sym->generic == NULL
4884
      || !gfc_check_access (sym->attr.access, sym->ns->default_access))
4885
    return;
4886
 
4887
  if (sym->module == NULL)
4888
    sym->module = gfc_get_string (module_name);
4889
 
4890
  mio_symbol_interface (&st->name, &sym->module, &sym->generic);
4891
}
4892
 
4893
 
4894
static void
4895
write_symtree (gfc_symtree *st)
4896
{
4897
  gfc_symbol *sym;
4898
  pointer_info *p;
4899
 
4900
  sym = st->n.sym;
4901
 
4902
  /* A symbol in an interface body must not be visible in the
4903
     module file.  */
4904
  if (sym->ns != gfc_current_ns
4905
        && sym->ns->proc_name
4906
        && sym->ns->proc_name->attr.if_source == IFSRC_IFBODY)
4907
    return;
4908
 
4909
  if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
4910
      || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4911
          && !sym->attr.subroutine && !sym->attr.function))
4912
    return;
4913
 
4914
  if (check_unique_name (st->name))
4915
    return;
4916
 
4917
  p = find_pointer (sym);
4918
  if (p == NULL)
4919
    gfc_internal_error ("write_symtree(): Symbol not written");
4920
 
4921
  mio_pool_string (&st->name);
4922
  mio_integer (&st->ambiguous);
4923
  mio_integer (&p->integer);
4924
}
4925
 
4926
 
4927
static void
4928
write_module (void)
4929
{
4930
  int i;
4931
 
4932
  /* Write the operator interfaces.  */
4933
  mio_lparen ();
4934
 
4935
  for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4936
    {
4937
      if (i == INTRINSIC_USER)
4938
        continue;
4939
 
4940
      mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
4941
                                       gfc_current_ns->default_access)
4942
                     ? &gfc_current_ns->op[i] : NULL);
4943
    }
4944
 
4945
  mio_rparen ();
4946
  write_char ('\n');
4947
  write_char ('\n');
4948
 
4949
  mio_lparen ();
4950
  gfc_traverse_user_op (gfc_current_ns, write_operator);
4951
  mio_rparen ();
4952
  write_char ('\n');
4953
  write_char ('\n');
4954
 
4955
  mio_lparen ();
4956
  write_generic (gfc_current_ns->sym_root);
4957
  mio_rparen ();
4958
  write_char ('\n');
4959
  write_char ('\n');
4960
 
4961
  mio_lparen ();
4962
  write_blank_common ();
4963
  write_common (gfc_current_ns->common_root);
4964
  mio_rparen ();
4965
  write_char ('\n');
4966
  write_char ('\n');
4967
 
4968
  mio_lparen ();
4969
  write_equiv ();
4970
  mio_rparen ();
4971
  write_char ('\n');
4972
  write_char ('\n');
4973
 
4974
  mio_lparen ();
4975
  gfc_traverse_symtree (gfc_current_ns->sym_root,
4976
                        write_derived_extensions);
4977
  mio_rparen ();
4978
  write_char ('\n');
4979
  write_char ('\n');
4980
 
4981
  /* Write symbol information.  First we traverse all symbols in the
4982
     primary namespace, writing those that need to be written.
4983
     Sometimes writing one symbol will cause another to need to be
4984
     written.  A list of these symbols ends up on the write stack, and
4985
     we end by popping the bottom of the stack and writing the symbol
4986
     until the stack is empty.  */
4987
 
4988
  mio_lparen ();
4989
 
4990
  write_symbol0 (gfc_current_ns->sym_root);
4991
  while (write_symbol1 (pi_root))
4992
    /* Nothing.  */;
4993
 
4994
  mio_rparen ();
4995
 
4996
  write_char ('\n');
4997
  write_char ('\n');
4998
 
4999
  mio_lparen ();
5000
  gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
5001
  mio_rparen ();
5002
}
5003
 
5004
 
5005
/* Read a MD5 sum from the header of a module file.  If the file cannot
5006
   be opened, or we have any other error, we return -1.  */
5007
 
5008
static int
5009
read_md5_from_module_file (const char * filename, unsigned char md5[16])
5010
{
5011
  FILE *file;
5012
  char buf[1024];
5013
  int n;
5014
 
5015
  /* Open the file.  */
5016
  if ((file = fopen (filename, "r")) == NULL)
5017
    return -1;
5018
 
5019
  /* Read the first line.  */
5020
  if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5021
    {
5022
      fclose (file);
5023
      return -1;
5024
    }
5025
 
5026
  /* The file also needs to be overwritten if the version number changed.  */
5027
  n = strlen ("GFORTRAN module version '" MOD_VERSION "' created");
5028
  if (strncmp (buf, "GFORTRAN module version '" MOD_VERSION "' created", n) != 0)
5029
    {
5030
      fclose (file);
5031
      return -1;
5032
    }
5033
 
5034
  /* Read a second line.  */
5035
  if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5036
    {
5037
      fclose (file);
5038
      return -1;
5039
    }
5040
 
5041
  /* Close the file.  */
5042
  fclose (file);
5043
 
5044
  /* If the header is not what we expect, or is too short, bail out.  */
5045
  if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
5046
    return -1;
5047
 
5048
  /* Now, we have a real MD5, read it into the array.  */
5049
  for (n = 0; n < 16; n++)
5050
    {
5051
      unsigned int x;
5052
 
5053
      if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
5054
       return -1;
5055
 
5056
      md5[n] = x;
5057
    }
5058
 
5059
  return 0;
5060
}
5061
 
5062
 
5063
/* Given module, dump it to disk.  If there was an error while
5064
   processing the module, dump_flag will be set to zero and we delete
5065
   the module file, even if it was already there.  */
5066
 
5067
void
5068
gfc_dump_module (const char *name, int dump_flag)
5069
{
5070
  int n;
5071
  char *filename, *filename_tmp, *p;
5072
  time_t now;
5073
  fpos_t md5_pos;
5074
  unsigned char md5_new[16], md5_old[16];
5075
 
5076
  n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
5077
  if (gfc_option.module_dir != NULL)
5078
    {
5079
      n += strlen (gfc_option.module_dir);
5080
      filename = (char *) alloca (n);
5081
      strcpy (filename, gfc_option.module_dir);
5082
      strcat (filename, name);
5083
    }
5084
  else
5085
    {
5086
      filename = (char *) alloca (n);
5087
      strcpy (filename, name);
5088
    }
5089
  strcat (filename, MODULE_EXTENSION);
5090
 
5091
  /* Name of the temporary file used to write the module.  */
5092
  filename_tmp = (char *) alloca (n + 1);
5093
  strcpy (filename_tmp, filename);
5094
  strcat (filename_tmp, "0");
5095
 
5096
  /* There was an error while processing the module.  We delete the
5097
     module file, even if it was already there.  */
5098
  if (!dump_flag)
5099
    {
5100
      unlink (filename);
5101
      return;
5102
    }
5103
 
5104 378 julius
  if (gfc_cpp_makedep ())
5105
    gfc_cpp_add_target (filename);
5106
 
5107 285 jeremybenn
  /* Write the module to the temporary file.  */
5108
  module_fp = fopen (filename_tmp, "w");
5109
  if (module_fp == NULL)
5110
    gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
5111
                     filename_tmp, strerror (errno));
5112
 
5113
  /* Write the header, including space reserved for the MD5 sum.  */
5114
  now = time (NULL);
5115
  p = ctime (&now);
5116
 
5117
  *strchr (p, '\n') = '\0';
5118
 
5119
  fprintf (module_fp, "GFORTRAN module version '%s' created from %s on %s\n"
5120
           "MD5:", MOD_VERSION, gfc_source_file, p);
5121
  fgetpos (module_fp, &md5_pos);
5122
  fputs ("00000000000000000000000000000000 -- "
5123
        "If you edit this, you'll get what you deserve.\n\n", module_fp);
5124
 
5125
  /* Initialize the MD5 context that will be used for output.  */
5126
  md5_init_ctx (&ctx);
5127
 
5128
  /* Write the module itself.  */
5129
  iomode = IO_OUTPUT;
5130
  strcpy (module_name, name);
5131
 
5132
  init_pi_tree ();
5133
 
5134
  write_module ();
5135
 
5136
  free_pi_tree (pi_root);
5137
  pi_root = NULL;
5138
 
5139
  write_char ('\n');
5140
 
5141
  /* Write the MD5 sum to the header of the module file.  */
5142
  md5_finish_ctx (&ctx, md5_new);
5143
  fsetpos (module_fp, &md5_pos);
5144
  for (n = 0; n < 16; n++)
5145
    fprintf (module_fp, "%02x", md5_new[n]);
5146
 
5147
  if (fclose (module_fp))
5148
    gfc_fatal_error ("Error writing module file '%s' for writing: %s",
5149
                     filename_tmp, strerror (errno));
5150
 
5151
  /* Read the MD5 from the header of the old module file and compare.  */
5152
  if (read_md5_from_module_file (filename, md5_old) != 0
5153
      || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
5154
    {
5155
      /* Module file have changed, replace the old one.  */
5156
      if (unlink (filename) && errno != ENOENT)
5157
        gfc_fatal_error ("Can't delete module file '%s': %s", filename,
5158
                         strerror (errno));
5159
      if (rename (filename_tmp, filename))
5160
        gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
5161
                         filename_tmp, filename, strerror (errno));
5162
    }
5163
  else
5164
    {
5165
      if (unlink (filename_tmp))
5166
        gfc_fatal_error ("Can't delete temporary module file '%s': %s",
5167
                         filename_tmp, strerror (errno));
5168
    }
5169
}
5170
 
5171
 
5172
static void
5173
sort_iso_c_rename_list (void)
5174
{
5175
  gfc_use_rename *tmp_list = NULL;
5176
  gfc_use_rename *curr;
5177
  gfc_use_rename *kinds_used[ISOCBINDING_NUMBER] = {NULL};
5178
  int c_kind;
5179
  int i;
5180
 
5181
  for (curr = gfc_rename_list; curr; curr = curr->next)
5182
    {
5183
      c_kind = get_c_kind (curr->use_name, c_interop_kinds_table);
5184
      if (c_kind == ISOCBINDING_INVALID || c_kind == ISOCBINDING_LAST)
5185
        {
5186
          gfc_error ("Symbol '%s' referenced at %L does not exist in "
5187
                     "intrinsic module ISO_C_BINDING.", curr->use_name,
5188
                     &curr->where);
5189
        }
5190
      else
5191
        /* Put it in the list.  */
5192
        kinds_used[c_kind] = curr;
5193
    }
5194
 
5195
  /* Make a new (sorted) rename list.  */
5196
  i = 0;
5197
  while (i < ISOCBINDING_NUMBER && kinds_used[i] == NULL)
5198
    i++;
5199
 
5200
  if (i < ISOCBINDING_NUMBER)
5201
    {
5202
      tmp_list = kinds_used[i];
5203
 
5204
      i++;
5205
      curr = tmp_list;
5206
      for (; i < ISOCBINDING_NUMBER; i++)
5207
        if (kinds_used[i] != NULL)
5208
          {
5209
            curr->next = kinds_used[i];
5210
            curr = curr->next;
5211
            curr->next = NULL;
5212
          }
5213
    }
5214
 
5215
  gfc_rename_list = tmp_list;
5216
}
5217
 
5218
 
5219
/* Import the intrinsic ISO_C_BINDING module, generating symbols in
5220
   the current namespace for all named constants, pointer types, and
5221
   procedures in the module unless the only clause was used or a rename
5222
   list was provided.  */
5223
 
5224
static void
5225
import_iso_c_binding_module (void)
5226
{
5227
  gfc_symbol *mod_sym = NULL;
5228
  gfc_symtree *mod_symtree = NULL;
5229
  const char *iso_c_module_name = "__iso_c_binding";
5230
  gfc_use_rename *u;
5231
  int i;
5232
  char *local_name;
5233
 
5234
  /* Look only in the current namespace.  */
5235
  mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
5236
 
5237
  if (mod_symtree == NULL)
5238
    {
5239
      /* symtree doesn't already exist in current namespace.  */
5240
      gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree,
5241
                        false);
5242
 
5243
      if (mod_symtree != NULL)
5244
        mod_sym = mod_symtree->n.sym;
5245
      else
5246
        gfc_internal_error ("import_iso_c_binding_module(): Unable to "
5247
                            "create symbol for %s", iso_c_module_name);
5248
 
5249
      mod_sym->attr.flavor = FL_MODULE;
5250
      mod_sym->attr.intrinsic = 1;
5251
      mod_sym->module = gfc_get_string (iso_c_module_name);
5252
      mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
5253
    }
5254
 
5255
  /* Generate the symbols for the named constants representing
5256
     the kinds for intrinsic data types.  */
5257
  if (only_flag)
5258
    {
5259
      /* Sort the rename list because there are dependencies between types
5260
         and procedures (e.g., c_loc needs c_ptr).  */
5261
      sort_iso_c_rename_list ();
5262
 
5263
      for (u = gfc_rename_list; u; u = u->next)
5264
        {
5265
          i = get_c_kind (u->use_name, c_interop_kinds_table);
5266
 
5267
          if (i == ISOCBINDING_INVALID || i == ISOCBINDING_LAST)
5268
            {
5269
              gfc_error ("Symbol '%s' referenced at %L does not exist in "
5270
                         "intrinsic module ISO_C_BINDING.", u->use_name,
5271
                         &u->where);
5272
              continue;
5273
            }
5274
 
5275
          generate_isocbinding_symbol (iso_c_module_name,
5276
                                       (iso_c_binding_symbol) i,
5277
                                       u->local_name);
5278
        }
5279
    }
5280
  else
5281
    {
5282
      for (i = 0; i < ISOCBINDING_NUMBER; i++)
5283
        {
5284
          local_name = NULL;
5285
          for (u = gfc_rename_list; u; u = u->next)
5286
            {
5287
              if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
5288
                {
5289
                  local_name = u->local_name;
5290
                  u->found = 1;
5291
                  break;
5292
                }
5293
            }
5294
          generate_isocbinding_symbol (iso_c_module_name,
5295
                                       (iso_c_binding_symbol) i,
5296
                                       local_name);
5297
        }
5298
 
5299
      for (u = gfc_rename_list; u; u = u->next)
5300
        {
5301
          if (u->found)
5302
            continue;
5303
 
5304
          gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5305
                     "module ISO_C_BINDING", u->use_name, &u->where);
5306
        }
5307
    }
5308
}
5309
 
5310
 
5311
/* Add an integer named constant from a given module.  */
5312
 
5313
static void
5314
create_int_parameter (const char *name, int value, const char *modname,
5315
                      intmod_id module, int id)
5316
{
5317
  gfc_symtree *tmp_symtree;
5318
  gfc_symbol *sym;
5319
 
5320
  tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5321
  if (tmp_symtree != NULL)
5322
    {
5323
      if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5324
        return;
5325
      else
5326
        gfc_error ("Symbol '%s' already declared", name);
5327
    }
5328
 
5329
  gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5330
  sym = tmp_symtree->n.sym;
5331
 
5332
  sym->module = gfc_get_string (modname);
5333
  sym->attr.flavor = FL_PARAMETER;
5334
  sym->ts.type = BT_INTEGER;
5335
  sym->ts.kind = gfc_default_integer_kind;
5336
  sym->value = gfc_int_expr (value);
5337
  sym->attr.use_assoc = 1;
5338
  sym->from_intmod = module;
5339
  sym->intmod_sym_id = id;
5340
}
5341
 
5342
 
5343
/* USE the ISO_FORTRAN_ENV intrinsic module.  */
5344
 
5345
static void
5346
use_iso_fortran_env_module (void)
5347
{
5348
  static char mod[] = "iso_fortran_env";
5349
  const char *local_name;
5350
  gfc_use_rename *u;
5351
  gfc_symbol *mod_sym;
5352
  gfc_symtree *mod_symtree;
5353
  int i;
5354
 
5355
  intmod_sym symbol[] = {
5356
#define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
5357
#include "iso-fortran-env.def"
5358
#undef NAMED_INTCST
5359
    { ISOFORTRANENV_INVALID, NULL, -1234, 0 } };
5360
 
5361
  i = 0;
5362
#define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
5363
#include "iso-fortran-env.def"
5364
#undef NAMED_INTCST
5365
 
5366
  /* Generate the symbol for the module itself.  */
5367
  mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
5368
  if (mod_symtree == NULL)
5369
    {
5370
      gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree, false);
5371
      gcc_assert (mod_symtree);
5372
      mod_sym = mod_symtree->n.sym;
5373
 
5374
      mod_sym->attr.flavor = FL_MODULE;
5375
      mod_sym->attr.intrinsic = 1;
5376
      mod_sym->module = gfc_get_string (mod);
5377
      mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
5378
    }
5379
  else
5380
    if (!mod_symtree->n.sym->attr.intrinsic)
5381
      gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
5382
                 "non-intrinsic module name used previously", mod);
5383
 
5384
  /* Generate the symbols for the module integer named constants.  */
5385
  if (only_flag)
5386
    for (u = gfc_rename_list; u; u = u->next)
5387
      {
5388
        for (i = 0; symbol[i].name; i++)
5389
          if (strcmp (symbol[i].name, u->use_name) == 0)
5390
            break;
5391
 
5392
        if (symbol[i].name == NULL)
5393
          {
5394
            gfc_error ("Symbol '%s' referenced at %L does not exist in "
5395
                       "intrinsic module ISO_FORTRAN_ENV", u->use_name,
5396
                       &u->where);
5397
            continue;
5398
          }
5399
 
5400
        if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5401
            && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5402
          gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
5403
                           "from intrinsic module ISO_FORTRAN_ENV at %L is "
5404
                           "incompatible with option %s", &u->where,
5405
                           gfc_option.flag_default_integer
5406
                             ? "-fdefault-integer-8" : "-fdefault-real-8");
5407
 
5408
        create_int_parameter (u->local_name[0] ? u->local_name
5409
                                               : symbol[i].name,
5410
                              symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
5411
                              symbol[i].id);
5412
      }
5413
  else
5414
    {
5415
      for (i = 0; symbol[i].name; i++)
5416
        {
5417
          local_name = NULL;
5418
          for (u = gfc_rename_list; u; u = u->next)
5419
            {
5420
              if (strcmp (symbol[i].name, u->use_name) == 0)
5421
                {
5422
                  local_name = u->local_name;
5423
                  u->found = 1;
5424
                  break;
5425
                }
5426
            }
5427
 
5428
          if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5429
              && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5430
            gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
5431
                             "from intrinsic module ISO_FORTRAN_ENV at %C is "
5432
                             "incompatible with option %s",
5433
                             gfc_option.flag_default_integer
5434
                                ? "-fdefault-integer-8" : "-fdefault-real-8");
5435
 
5436
          create_int_parameter (local_name ? local_name : symbol[i].name,
5437
                                symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
5438
                                symbol[i].id);
5439
        }
5440
 
5441
      for (u = gfc_rename_list; u; u = u->next)
5442
        {
5443
          if (u->found)
5444
            continue;
5445
 
5446
          gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5447
                     "module ISO_FORTRAN_ENV", u->use_name, &u->where);
5448
        }
5449
    }
5450
}
5451
 
5452
 
5453
/* Process a USE directive.  */
5454
 
5455
void
5456
gfc_use_module (void)
5457
{
5458
  char *filename;
5459
  gfc_state_data *p;
5460
  int c, line, start;
5461
  gfc_symtree *mod_symtree;
5462
  gfc_use_list *use_stmt;
5463
 
5464
  filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION)
5465
                              + 1);
5466
  strcpy (filename, module_name);
5467
  strcat (filename, MODULE_EXTENSION);
5468
 
5469
  /* First, try to find an non-intrinsic module, unless the USE statement
5470
     specified that the module is intrinsic.  */
5471
  module_fp = NULL;
5472
  if (!specified_int)
5473
    module_fp = gfc_open_included_file (filename, true, true);
5474
 
5475
  /* Then, see if it's an intrinsic one, unless the USE statement
5476
     specified that the module is non-intrinsic.  */
5477
  if (module_fp == NULL && !specified_nonint)
5478
    {
5479
      if (strcmp (module_name, "iso_fortran_env") == 0
5480
          && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
5481
                             "intrinsic module at %C") != FAILURE)
5482
       {
5483
         use_iso_fortran_env_module ();
5484
         return;
5485
       }
5486
 
5487
      if (strcmp (module_name, "iso_c_binding") == 0
5488
          && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
5489
                             "ISO_C_BINDING module at %C") != FAILURE)
5490
        {
5491
          import_iso_c_binding_module();
5492
          return;
5493
        }
5494
 
5495
      module_fp = gfc_open_intrinsic_module (filename);
5496
 
5497
      if (module_fp == NULL && specified_int)
5498
        gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
5499
                         module_name);
5500
    }
5501
 
5502
  if (module_fp == NULL)
5503
    gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
5504
                     filename, strerror (errno));
5505
 
5506
  /* Check that we haven't already USEd an intrinsic module with the
5507
     same name.  */
5508
 
5509
  mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
5510
  if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
5511
    gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
5512
               "intrinsic module name used previously", module_name);
5513
 
5514
  iomode = IO_INPUT;
5515
  module_line = 1;
5516
  module_column = 1;
5517
  start = 0;
5518
 
5519
  /* Skip the first two lines of the module, after checking that this is
5520
     a gfortran module file.  */
5521
  line = 0;
5522
  while (line < 2)
5523
    {
5524
      c = module_char ();
5525
      if (c == EOF)
5526
        bad_module ("Unexpected end of module");
5527
      if (start++ < 3)
5528
        parse_name (c);
5529
      if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
5530
          || (start == 2 && strcmp (atom_name, " module") != 0))
5531
        gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
5532
                         "file", filename);
5533
      if (start == 3)
5534
        {
5535
          if (strcmp (atom_name, " version") != 0
5536
              || module_char () != ' '
5537
              || parse_atom () != ATOM_STRING)
5538
            gfc_fatal_error ("Parse error when checking module version"
5539
                             " for file '%s' opened at %C", filename);
5540
 
5541
          if (strcmp (atom_string, MOD_VERSION))
5542
            {
5543
              gfc_fatal_error ("Wrong module version '%s' (expected '%s') "
5544
                               "for file '%s' opened at %C", atom_string,
5545
                               MOD_VERSION, filename);
5546
            }
5547
        }
5548
 
5549
      if (c == '\n')
5550
        line++;
5551
    }
5552
 
5553
  /* Make sure we're not reading the same module that we may be building.  */
5554
  for (p = gfc_state_stack; p; p = p->previous)
5555
    if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
5556
      gfc_fatal_error ("Can't USE the same module we're building!");
5557
 
5558
  init_pi_tree ();
5559
  init_true_name_tree ();
5560
 
5561
  read_module ();
5562
 
5563
  free_true_name (true_name_root);
5564
  true_name_root = NULL;
5565
 
5566
  free_pi_tree (pi_root);
5567
  pi_root = NULL;
5568
 
5569
  fclose (module_fp);
5570
 
5571
  use_stmt = gfc_get_use_list ();
5572
  use_stmt->module_name = gfc_get_string (module_name);
5573
  use_stmt->only_flag = only_flag;
5574
  use_stmt->rename = gfc_rename_list;
5575
  use_stmt->where = use_locus;
5576
  gfc_rename_list = NULL;
5577
  use_stmt->next = gfc_current_ns->use_stmts;
5578
  gfc_current_ns->use_stmts = use_stmt;
5579
}
5580
 
5581
 
5582
void
5583
gfc_free_use_stmts (gfc_use_list *use_stmts)
5584
{
5585
  gfc_use_list *next;
5586
  for (; use_stmts; use_stmts = next)
5587
    {
5588
      gfc_use_rename *next_rename;
5589
 
5590
      for (; use_stmts->rename; use_stmts->rename = next_rename)
5591
        {
5592
          next_rename = use_stmts->rename->next;
5593
          gfc_free (use_stmts->rename);
5594
        }
5595
      next = use_stmts->next;
5596
      gfc_free (use_stmts);
5597
    }
5598
}
5599
 
5600
 
5601
void
5602
gfc_module_init_2 (void)
5603
{
5604
  last_atom = ATOM_LPAREN;
5605
}
5606
 
5607
 
5608
void
5609
gfc_module_done_2 (void)
5610
{
5611
  free_rename ();
5612
}

powered by: WebSVN 2.1.0

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