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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [fortran/] [module.c] - Blame information for rev 16

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

Line No. Rev Author Line
1 12 jlechner
/* Handle modules, which amounts to loading and saving symbols and
2
   their attendant structures.
3
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
4
   Inc.
5
   Contributed by Andy Vaught
6
 
7
This file is part of GCC.
8
 
9
GCC is free software; you can redistribute it and/or modify it under
10
the terms of the GNU General Public License as published by the Free
11
Software Foundation; either version 2, or (at your option) any later
12
version.
13
 
14
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15
WARRANTY; without even the implied warranty of MERCHANTABILITY or
16
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17
for more details.
18
 
19
You should have received a copy of the GNU General Public License
20
along with GCC; see the file COPYING.  If not, write to the Free
21
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22
02110-1301, USA.  */
23
 
24
/* The syntax of gfortran modules resembles that of lisp lists, ie 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
 
76
#define MODULE_EXTENSION ".mod"
77
 
78
 
79
/* Structure that describes a position within a module file.  */
80
 
81
typedef struct
82
{
83
  int column, line;
84
  fpos_t pos;
85
}
86
module_locus;
87
 
88
 
89
typedef enum
90
{
91
  P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
92
}
93
pointer_t;
94
 
95
/* The fixup structure lists pointers to pointers that have to
96
   be updated when a pointer value becomes known.  */
97
 
98
typedef struct fixup_t
99
{
100
  void **pointer;
101
  struct fixup_t *next;
102
}
103
fixup_t;
104
 
105
 
106
/* Structure for holding extra info needed for pointers being read.  */
107
 
108
typedef struct pointer_info
109
{
110
  BBT_HEADER (pointer_info);
111
  int integer;
112
  pointer_t type;
113
 
114
  /* The first component of each member of the union is the pointer
115
     being stored.  */
116
 
117
  fixup_t *fixup;
118
 
119
  union
120
  {
121
    void *pointer;      /* Member for doing pointer searches.  */
122
 
123
    struct
124
    {
125
      gfc_symbol *sym;
126
      char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
127
      enum
128
      { UNUSED, NEEDED, USED }
129
      state;
130
      int ns, referenced;
131
      module_locus where;
132
      fixup_t *stfixup;
133
      gfc_symtree *symtree;
134
    }
135
    rsym;
136
 
137
    struct
138
    {
139
      gfc_symbol *sym;
140
      enum
141
      { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
142
      state;
143
    }
144
    wsym;
145
  }
146
  u;
147
 
148
}
149
pointer_info;
150
 
151
#define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
152
 
153
 
154
/* Lists of rename info for the USE statement.  */
155
 
156
typedef struct gfc_use_rename
157
{
158
  char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
159
  struct gfc_use_rename *next;
160
  int found;
161
  gfc_intrinsic_op operator;
162
  locus where;
163
}
164
gfc_use_rename;
165
 
166
#define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
167
 
168
/* Local variables */
169
 
170
/* The FILE for the module we're reading or writing.  */
171
static FILE *module_fp;
172
 
173
/* The name of the module we're reading (USE'ing) or writing.  */
174
static char module_name[GFC_MAX_SYMBOL_LEN + 1];
175
 
176
static int module_line, module_column, only_flag;
177
static enum
178
{ IO_INPUT, IO_OUTPUT }
179
iomode;
180
 
181
static gfc_use_rename *gfc_rename_list;
182
static pointer_info *pi_root;
183
static int symbol_number;       /* Counter for assigning symbol numbers */
184
 
185
/* Tells mio_expr_ref not to load unused equivalence members.  */
186
static bool in_load_equiv;
187
 
188
 
189
 
190
/*****************************************************************/
191
 
192
/* Pointer/integer conversion.  Pointers between structures are stored
193
   as integers in the module file.  The next couple of subroutines
194
   handle this translation for reading and writing.  */
195
 
196
/* Recursively free the tree of pointer structures.  */
197
 
198
static void
199
free_pi_tree (pointer_info * p)
200
{
201
  if (p == NULL)
202
    return;
203
 
204
  if (p->fixup != NULL)
205
    gfc_internal_error ("free_pi_tree(): Unresolved fixup");
206
 
207
  free_pi_tree (p->left);
208
  free_pi_tree (p->right);
209
 
210
  gfc_free (p);
211
}
212
 
213
 
214
/* Compare pointers when searching by pointer.  Used when writing a
215
   module.  */
216
 
217
static int
218
compare_pointers (void * _sn1, void * _sn2)
219
{
220
  pointer_info *sn1, *sn2;
221
 
222
  sn1 = (pointer_info *) _sn1;
223
  sn2 = (pointer_info *) _sn2;
224
 
225
  if (sn1->u.pointer < sn2->u.pointer)
226
    return -1;
227
  if (sn1->u.pointer > sn2->u.pointer)
228
    return 1;
229
 
230
  return 0;
231
}
232
 
233
 
234
/* Compare integers when searching by integer.  Used when reading a
235
   module.  */
236
 
237
static int
238
compare_integers (void * _sn1, void * _sn2)
239
{
240
  pointer_info *sn1, *sn2;
241
 
242
  sn1 = (pointer_info *) _sn1;
243
  sn2 = (pointer_info *) _sn2;
244
 
245
  if (sn1->integer < sn2->integer)
246
    return -1;
247
  if (sn1->integer > sn2->integer)
248
    return 1;
249
 
250
  return 0;
251
}
252
 
253
 
254
/* Initialize the pointer_info tree.  */
255
 
256
static void
257
init_pi_tree (void)
258
{
259
  compare_fn compare;
260
  pointer_info *p;
261
 
262
  pi_root = NULL;
263
  compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
264
 
265
  /* Pointer 0 is the NULL pointer.  */
266
  p = gfc_get_pointer_info ();
267
  p->u.pointer = NULL;
268
  p->integer = 0;
269
  p->type = P_OTHER;
270
 
271
  gfc_insert_bbt (&pi_root, p, compare);
272
 
273
  /* Pointer 1 is the current namespace.  */
274
  p = gfc_get_pointer_info ();
275
  p->u.pointer = gfc_current_ns;
276
  p->integer = 1;
277
  p->type = P_NAMESPACE;
278
 
279
  gfc_insert_bbt (&pi_root, p, compare);
280
 
281
  symbol_number = 2;
282
}
283
 
284
 
285
/* During module writing, call here with a pointer to something,
286
   returning the pointer_info node.  */
287
 
288
static pointer_info *
289
find_pointer (void *gp)
290
{
291
  pointer_info *p;
292
 
293
  p = pi_root;
294
  while (p != NULL)
295
    {
296
      if (p->u.pointer == gp)
297
        break;
298
      p = (gp < p->u.pointer) ? p->left : p->right;
299
    }
300
 
301
  return p;
302
}
303
 
304
 
305
/* Given a pointer while writing, returns the pointer_info tree node,
306
   creating it if it doesn't exist.  */
307
 
308
static pointer_info *
309
get_pointer (void *gp)
310
{
311
  pointer_info *p;
312
 
313
  p = find_pointer (gp);
314
  if (p != NULL)
315
    return p;
316
 
317
  /* Pointer doesn't have an integer.  Give it one.  */
318
  p = gfc_get_pointer_info ();
319
 
320
  p->u.pointer = gp;
321
  p->integer = symbol_number++;
322
 
323
  gfc_insert_bbt (&pi_root, p, compare_pointers);
324
 
325
  return p;
326
}
327
 
328
 
329
/* Given an integer during reading, find it in the pointer_info tree,
330
   creating the node if not found.  */
331
 
332
static pointer_info *
333
get_integer (int integer)
334
{
335
  pointer_info *p, t;
336
  int c;
337
 
338
  t.integer = integer;
339
 
340
  p = pi_root;
341
  while (p != NULL)
342
    {
343
      c = compare_integers (&t, p);
344
      if (c == 0)
345
        break;
346
 
347
      p = (c < 0) ? p->left : p->right;
348
    }
349
 
350
  if (p != NULL)
351
    return p;
352
 
353
  p = gfc_get_pointer_info ();
354
  p->integer = integer;
355
  p->u.pointer = NULL;
356
 
357
  gfc_insert_bbt (&pi_root, p, compare_integers);
358
 
359
  return p;
360
}
361
 
362
 
363
/* Recursive function to find a pointer within a tree by brute force.  */
364
 
365
static pointer_info *
366
fp2 (pointer_info * p, const void *target)
367
{
368
  pointer_info *q;
369
 
370
  if (p == NULL)
371
    return NULL;
372
 
373
  if (p->u.pointer == target)
374
    return p;
375
 
376
  q = fp2 (p->left, target);
377
  if (q != NULL)
378
    return q;
379
 
380
  return fp2 (p->right, target);
381
}
382
 
383
 
384
/* During reading, find a pointer_info node from the pointer value.
385
   This amounts to a brute-force search.  */
386
 
387
static pointer_info *
388
find_pointer2 (void *p)
389
{
390
 
391
  return fp2 (pi_root, p);
392
}
393
 
394
 
395
/* Resolve any fixups using a known pointer.  */
396
static void
397
resolve_fixups (fixup_t *f, void * gp)
398
{
399
  fixup_t *next;
400
 
401
  for (; f; f = next)
402
    {
403
      next = f->next;
404
      *(f->pointer) = gp;
405
      gfc_free (f);
406
    }
407
}
408
 
409
/* Call here during module reading when we know what pointer to
410
   associate with an integer.  Any fixups that exist are resolved at
411
   this time.  */
412
 
413
static void
414
associate_integer_pointer (pointer_info * p, void *gp)
415
{
416
  if (p->u.pointer != NULL)
417
    gfc_internal_error ("associate_integer_pointer(): Already associated");
418
 
419
  p->u.pointer = gp;
420
 
421
  resolve_fixups (p->fixup, gp);
422
 
423
  p->fixup = NULL;
424
}
425
 
426
 
427
/* During module reading, given an integer and a pointer to a pointer,
428
   either store the pointer from an already-known value or create a
429
   fixup structure in order to store things later.  Returns zero if
430
   the reference has been actually stored, or nonzero if the reference
431
   must be fixed later (ie associate_integer_pointer must be called
432
   sometime later.  Returns the pointer_info structure.  */
433
 
434
static pointer_info *
435
add_fixup (int integer, void *gp)
436
{
437
  pointer_info *p;
438
  fixup_t *f;
439
  char **cp;
440
 
441
  p = get_integer (integer);
442
 
443
  if (p->integer == 0 || p->u.pointer != NULL)
444
    {
445
      cp = gp;
446
      *cp = p->u.pointer;
447
    }
448
  else
449
    {
450
      f = gfc_getmem (sizeof (fixup_t));
451
 
452
      f->next = p->fixup;
453
      p->fixup = f;
454
 
455
      f->pointer = gp;
456
    }
457
 
458
  return p;
459
}
460
 
461
 
462
/*****************************************************************/
463
 
464
/* Parser related subroutines */
465
 
466
/* Free the rename list left behind by a USE statement.  */
467
 
468
static void
469
free_rename (void)
470
{
471
  gfc_use_rename *next;
472
 
473
  for (; gfc_rename_list; gfc_rename_list = next)
474
    {
475
      next = gfc_rename_list->next;
476
      gfc_free (gfc_rename_list);
477
    }
478
}
479
 
480
 
481
/* Match a USE statement.  */
482
 
483
match
484
gfc_match_use (void)
485
{
486
  char name[GFC_MAX_SYMBOL_LEN + 1];
487
  gfc_use_rename *tail = NULL, *new;
488
  interface_type type;
489
  gfc_intrinsic_op operator;
490
  match m;
491
 
492
  m = gfc_match_name (module_name);
493
  if (m != MATCH_YES)
494
    return m;
495
 
496
  free_rename ();
497
  only_flag = 0;
498
 
499
  if (gfc_match_eos () == MATCH_YES)
500
    return MATCH_YES;
501
  if (gfc_match_char (',') != MATCH_YES)
502
    goto syntax;
503
 
504
  if (gfc_match (" only :") == MATCH_YES)
505
    only_flag = 1;
506
 
507
  if (gfc_match_eos () == MATCH_YES)
508
    return MATCH_YES;
509
 
510
  for (;;)
511
    {
512
      /* Get a new rename struct and add it to the rename list.  */
513
      new = gfc_get_use_rename ();
514
      new->where = gfc_current_locus;
515
      new->found = 0;
516
 
517
      if (gfc_rename_list == NULL)
518
        gfc_rename_list = new;
519
      else
520
        tail->next = new;
521
      tail = new;
522
 
523
      /* See what kind of interface we're dealing with.  Assume it is
524
         not an operator.  */
525
      new->operator = INTRINSIC_NONE;
526
      if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
527
        goto cleanup;
528
 
529
      switch (type)
530
        {
531
        case INTERFACE_NAMELESS:
532
          gfc_error ("Missing generic specification in USE statement at %C");
533
          goto cleanup;
534
 
535
        case INTERFACE_GENERIC:
536
          m = gfc_match (" =>");
537
 
538
          if (only_flag)
539
            {
540
              if (m != MATCH_YES)
541
                strcpy (new->use_name, name);
542
              else
543
                {
544
                  strcpy (new->local_name, name);
545
 
546
                  m = gfc_match_name (new->use_name);
547
                  if (m == MATCH_NO)
548
                    goto syntax;
549
                  if (m == MATCH_ERROR)
550
                    goto cleanup;
551
                }
552
            }
553
          else
554
            {
555
              if (m != MATCH_YES)
556
                goto syntax;
557
              strcpy (new->local_name, name);
558
 
559
              m = gfc_match_name (new->use_name);
560
              if (m == MATCH_NO)
561
                goto syntax;
562
              if (m == MATCH_ERROR)
563
                goto cleanup;
564
            }
565
 
566
          break;
567
 
568
        case INTERFACE_USER_OP:
569
          strcpy (new->use_name, name);
570
          /* Fall through */
571
 
572
        case INTERFACE_INTRINSIC_OP:
573
          new->operator = operator;
574
          break;
575
        }
576
 
577
      if (gfc_match_eos () == MATCH_YES)
578
        break;
579
      if (gfc_match_char (',') != MATCH_YES)
580
        goto syntax;
581
    }
582
 
583
  return MATCH_YES;
584
 
585
syntax:
586
  gfc_syntax_error (ST_USE);
587
 
588
cleanup:
589
  free_rename ();
590
  return MATCH_ERROR;
591
 }
592
 
593
 
594
/* Given a name and a number, inst, return the inst name
595
   under which to load this symbol. Returns NULL if this
596
   symbol shouldn't be loaded. If inst is zero, returns
597
   the number of instances of this name.  */
598
 
599
static const char *
600
find_use_name_n (const char *name, int *inst)
601
{
602
  gfc_use_rename *u;
603
  int i;
604
 
605
  i = 0;
606
  for (u = gfc_rename_list; u; u = u->next)
607
    {
608
      if (strcmp (u->use_name, name) != 0)
609
        continue;
610
      if (++i == *inst)
611
        break;
612
    }
613
 
614
  if (!*inst)
615
    {
616
      *inst = i;
617
      return NULL;
618
    }
619
 
620
  if (u == NULL)
621
    return only_flag ? NULL : name;
622
 
623
  u->found = 1;
624
 
625
  return (u->local_name[0] != '\0') ? u->local_name : name;
626
}
627
 
628
/* Given a name, return the name under which to load this symbol.
629
   Returns NULL if this symbol shouldn't be loaded.  */
630
 
631
static const char *
632
find_use_name (const char *name)
633
{
634
  int i = 1;
635
  return find_use_name_n (name, &i);
636
}
637
 
638
/* Given a real name, return the number of use names associated
639
   with it.  */
640
 
641
static int
642
number_use_names (const char *name)
643
{
644
  int i = 0;
645
  const char *c;
646
  c = find_use_name_n (name, &i);
647
  return i;
648
}
649
 
650
 
651
/* Try to find the operator in the current list.  */
652
 
653
static gfc_use_rename *
654
find_use_operator (gfc_intrinsic_op operator)
655
{
656
  gfc_use_rename *u;
657
 
658
  for (u = gfc_rename_list; u; u = u->next)
659
    if (u->operator == operator)
660
      return u;
661
 
662
  return NULL;
663
}
664
 
665
 
666
/*****************************************************************/
667
 
668
/* The next couple of subroutines maintain a tree used to avoid a
669
   brute-force search for a combination of true name and module name.
670
   While symtree names, the name that a particular symbol is known by
671
   can changed with USE statements, we still have to keep track of the
672
   true names to generate the correct reference, and also avoid
673
   loading the same real symbol twice in a program unit.
674
 
675
   When we start reading, the true name tree is built and maintained
676
   as symbols are read.  The tree is searched as we load new symbols
677
   to see if it already exists someplace in the namespace.  */
678
 
679
typedef struct true_name
680
{
681
  BBT_HEADER (true_name);
682
  gfc_symbol *sym;
683
}
684
true_name;
685
 
686
static true_name *true_name_root;
687
 
688
 
689
/* Compare two true_name structures.  */
690
 
691
static int
692
compare_true_names (void * _t1, void * _t2)
693
{
694
  true_name *t1, *t2;
695
  int c;
696
 
697
  t1 = (true_name *) _t1;
698
  t2 = (true_name *) _t2;
699
 
700
  c = ((t1->sym->module > t2->sym->module)
701
       - (t1->sym->module < t2->sym->module));
702
  if (c != 0)
703
    return c;
704
 
705
  return strcmp (t1->sym->name, t2->sym->name);
706
}
707
 
708
 
709
/* Given a true name, search the true name tree to see if it exists
710
   within the main namespace.  */
711
 
712
static gfc_symbol *
713
find_true_name (const char *name, const char *module)
714
{
715
  true_name t, *p;
716
  gfc_symbol sym;
717
  int c;
718
 
719
  sym.name = gfc_get_string (name);
720
  if (module != NULL)
721
    sym.module = gfc_get_string (module);
722
  else
723
    sym.module = NULL;
724
  t.sym = &sym;
725
 
726
  p = true_name_root;
727
  while (p != NULL)
728
    {
729
      c = compare_true_names ((void *)(&t), (void *) p);
730
      if (c == 0)
731
        return p->sym;
732
 
733
      p = (c < 0) ? p->left : p->right;
734
    }
735
 
736
  return NULL;
737
}
738
 
739
 
740
/* Given a gfc_symbol pointer that is not in the true name tree, add
741
   it.  */
742
 
743
static void
744
add_true_name (gfc_symbol * sym)
745
{
746
  true_name *t;
747
 
748
  t = gfc_getmem (sizeof (true_name));
749
  t->sym = sym;
750
 
751
  gfc_insert_bbt (&true_name_root, t, compare_true_names);
752
}
753
 
754
 
755
/* Recursive function to build the initial true name tree by
756
   recursively traversing the current namespace.  */
757
 
758
static void
759
build_tnt (gfc_symtree * st)
760
{
761
 
762
  if (st == NULL)
763
    return;
764
 
765
  build_tnt (st->left);
766
  build_tnt (st->right);
767
 
768
  if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
769
    return;
770
 
771
  add_true_name (st->n.sym);
772
}
773
 
774
 
775
/* Initialize the true name tree with the current namespace.  */
776
 
777
static void
778
init_true_name_tree (void)
779
{
780
  true_name_root = NULL;
781
 
782
  build_tnt (gfc_current_ns->sym_root);
783
}
784
 
785
 
786
/* Recursively free a true name tree node.  */
787
 
788
static void
789
free_true_name (true_name * t)
790
{
791
 
792
  if (t == NULL)
793
    return;
794
  free_true_name (t->left);
795
  free_true_name (t->right);
796
 
797
  gfc_free (t);
798
}
799
 
800
 
801
/*****************************************************************/
802
 
803
/* Module reading and writing.  */
804
 
805
typedef enum
806
{
807
  ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
808
}
809
atom_type;
810
 
811
static atom_type last_atom;
812
 
813
 
814
/* The name buffer must be at least as long as a symbol name.  Right
815
   now it's not clear how we're going to store numeric constants--
816
   probably as a hexadecimal string, since this will allow the exact
817
   number to be preserved (this can't be done by a decimal
818
   representation).  Worry about that later.  TODO!  */
819
 
820
#define MAX_ATOM_SIZE 100
821
 
822
static int atom_int;
823
static char *atom_string, atom_name[MAX_ATOM_SIZE];
824
 
825
 
826
/* Report problems with a module.  Error reporting is not very
827
   elaborate, since this sorts of errors shouldn't really happen.
828
   This subroutine never returns.  */
829
 
830
static void bad_module (const char *) ATTRIBUTE_NORETURN;
831
 
832
static void
833
bad_module (const char *msgid)
834
{
835
  fclose (module_fp);
836
 
837
  switch (iomode)
838
    {
839
    case IO_INPUT:
840
      gfc_fatal_error ("Reading module %s at line %d column %d: %s",
841
                       module_name, module_line, module_column, msgid);
842
      break;
843
    case IO_OUTPUT:
844
      gfc_fatal_error ("Writing module %s at line %d column %d: %s",
845
                       module_name, module_line, module_column, msgid);
846
      break;
847
    default:
848
      gfc_fatal_error ("Module %s at line %d column %d: %s",
849
                       module_name, module_line, module_column, msgid);
850
      break;
851
    }
852
}
853
 
854
 
855
/* Set the module's input pointer.  */
856
 
857
static void
858
set_module_locus (module_locus * m)
859
{
860
 
861
  module_column = m->column;
862
  module_line = m->line;
863
  fsetpos (module_fp, &m->pos);
864
}
865
 
866
 
867
/* Get the module's input pointer so that we can restore it later.  */
868
 
869
static void
870
get_module_locus (module_locus * m)
871
{
872
 
873
  m->column = module_column;
874
  m->line = module_line;
875
  fgetpos (module_fp, &m->pos);
876
}
877
 
878
 
879
/* Get the next character in the module, updating our reckoning of
880
   where we are.  */
881
 
882
static int
883
module_char (void)
884
{
885
  int c;
886
 
887
  c = fgetc (module_fp);
888
 
889
  if (c == EOF)
890
    bad_module ("Unexpected EOF");
891
 
892
  if (c == '\n')
893
    {
894
      module_line++;
895
      module_column = 0;
896
    }
897
 
898
  module_column++;
899
  return c;
900
}
901
 
902
 
903
/* Parse a string constant.  The delimiter is guaranteed to be a
904
   single quote.  */
905
 
906
static void
907
parse_string (void)
908
{
909
  module_locus start;
910
  int len, c;
911
  char *p;
912
 
913
  get_module_locus (&start);
914
 
915
  len = 0;
916
 
917
  /* See how long the string is */
918
  for ( ; ; )
919
    {
920
      c = module_char ();
921
      if (c == EOF)
922
        bad_module ("Unexpected end of module in string constant");
923
 
924
      if (c != '\'')
925
        {
926
          len++;
927
          continue;
928
        }
929
 
930
      c = module_char ();
931
      if (c == '\'')
932
        {
933
          len++;
934
          continue;
935
        }
936
 
937
      break;
938
    }
939
 
940
  set_module_locus (&start);
941
 
942
  atom_string = p = gfc_getmem (len + 1);
943
 
944
  for (; len > 0; len--)
945
    {
946
      c = module_char ();
947
      if (c == '\'')
948
        module_char ();         /* Guaranteed to be another \' */
949
      *p++ = c;
950
    }
951
 
952
  module_char ();               /* Terminating \' */
953
  *p = '\0';                    /* C-style string for debug purposes */
954
}
955
 
956
 
957
/* Parse a small integer.  */
958
 
959
static void
960
parse_integer (int c)
961
{
962
  module_locus m;
963
 
964
  atom_int = c - '0';
965
 
966
  for (;;)
967
    {
968
      get_module_locus (&m);
969
 
970
      c = module_char ();
971
      if (!ISDIGIT (c))
972
        break;
973
 
974
      atom_int = 10 * atom_int + c - '0';
975
      if (atom_int > 99999999)
976
        bad_module ("Integer overflow");
977
    }
978
 
979
  set_module_locus (&m);
980
}
981
 
982
 
983
/* Parse a name.  */
984
 
985
static void
986
parse_name (int c)
987
{
988
  module_locus m;
989
  char *p;
990
  int len;
991
 
992
  p = atom_name;
993
 
994
  *p++ = c;
995
  len = 1;
996
 
997
  get_module_locus (&m);
998
 
999
  for (;;)
1000
    {
1001
      c = module_char ();
1002
      if (!ISALNUM (c) && c != '_' && c != '-')
1003
        break;
1004
 
1005
      *p++ = c;
1006
      if (++len > GFC_MAX_SYMBOL_LEN)
1007
        bad_module ("Name too long");
1008
    }
1009
 
1010
  *p = '\0';
1011
 
1012
  fseek (module_fp, -1, SEEK_CUR);
1013
  module_column = m.column + len - 1;
1014
 
1015
  if (c == '\n')
1016
    module_line--;
1017
}
1018
 
1019
 
1020
/* Read the next atom in the module's input stream.  */
1021
 
1022
static atom_type
1023
parse_atom (void)
1024
{
1025
  int c;
1026
 
1027
  do
1028
    {
1029
      c = module_char ();
1030
    }
1031
  while (c == ' ' || c == '\n');
1032
 
1033
  switch (c)
1034
    {
1035
    case '(':
1036
      return ATOM_LPAREN;
1037
 
1038
    case ')':
1039
      return ATOM_RPAREN;
1040
 
1041
    case '\'':
1042
      parse_string ();
1043
      return ATOM_STRING;
1044
 
1045
    case '0':
1046
    case '1':
1047
    case '2':
1048
    case '3':
1049
    case '4':
1050
    case '5':
1051
    case '6':
1052
    case '7':
1053
    case '8':
1054
    case '9':
1055
      parse_integer (c);
1056
      return ATOM_INTEGER;
1057
 
1058
    case 'a':
1059
    case 'b':
1060
    case 'c':
1061
    case 'd':
1062
    case 'e':
1063
    case 'f':
1064
    case 'g':
1065
    case 'h':
1066
    case 'i':
1067
    case 'j':
1068
    case 'k':
1069
    case 'l':
1070
    case 'm':
1071
    case 'n':
1072
    case 'o':
1073
    case 'p':
1074
    case 'q':
1075
    case 'r':
1076
    case 's':
1077
    case 't':
1078
    case 'u':
1079
    case 'v':
1080
    case 'w':
1081
    case 'x':
1082
    case 'y':
1083
    case 'z':
1084
    case 'A':
1085
    case 'B':
1086
    case 'C':
1087
    case 'D':
1088
    case 'E':
1089
    case 'F':
1090
    case 'G':
1091
    case 'H':
1092
    case 'I':
1093
    case 'J':
1094
    case 'K':
1095
    case 'L':
1096
    case 'M':
1097
    case 'N':
1098
    case 'O':
1099
    case 'P':
1100
    case 'Q':
1101
    case 'R':
1102
    case 'S':
1103
    case 'T':
1104
    case 'U':
1105
    case 'V':
1106
    case 'W':
1107
    case 'X':
1108
    case 'Y':
1109
    case 'Z':
1110
      parse_name (c);
1111
      return ATOM_NAME;
1112
 
1113
    default:
1114
      bad_module ("Bad name");
1115
    }
1116
 
1117
  /* Not reached */
1118
}
1119
 
1120
 
1121
/* Peek at the next atom on the input.  */
1122
 
1123
static atom_type
1124
peek_atom (void)
1125
{
1126
  module_locus m;
1127
  atom_type a;
1128
 
1129
  get_module_locus (&m);
1130
 
1131
  a = parse_atom ();
1132
  if (a == ATOM_STRING)
1133
    gfc_free (atom_string);
1134
 
1135
  set_module_locus (&m);
1136
  return a;
1137
}
1138
 
1139
 
1140
/* Read the next atom from the input, requiring that it be a
1141
   particular kind.  */
1142
 
1143
static void
1144
require_atom (atom_type type)
1145
{
1146
  module_locus m;
1147
  atom_type t;
1148
  const char *p;
1149
 
1150
  get_module_locus (&m);
1151
 
1152
  t = parse_atom ();
1153
  if (t != type)
1154
    {
1155
      switch (type)
1156
        {
1157
        case ATOM_NAME:
1158
          p = _("Expected name");
1159
          break;
1160
        case ATOM_LPAREN:
1161
          p = _("Expected left parenthesis");
1162
          break;
1163
        case ATOM_RPAREN:
1164
          p = _("Expected right parenthesis");
1165
          break;
1166
        case ATOM_INTEGER:
1167
          p = _("Expected integer");
1168
          break;
1169
        case ATOM_STRING:
1170
          p = _("Expected string");
1171
          break;
1172
        default:
1173
          gfc_internal_error ("require_atom(): bad atom type required");
1174
        }
1175
 
1176
      set_module_locus (&m);
1177
      bad_module (p);
1178
    }
1179
}
1180
 
1181
 
1182
/* Given a pointer to an mstring array, require that the current input
1183
   be one of the strings in the array.  We return the enum value.  */
1184
 
1185
static int
1186
find_enum (const mstring * m)
1187
{
1188
  int i;
1189
 
1190
  i = gfc_string2code (m, atom_name);
1191
  if (i >= 0)
1192
    return i;
1193
 
1194
  bad_module ("find_enum(): Enum not found");
1195
 
1196
  /* Not reached */
1197
}
1198
 
1199
 
1200
/**************** Module output subroutines ***************************/
1201
 
1202
/* Output a character to a module file.  */
1203
 
1204
static void
1205
write_char (char out)
1206
{
1207
 
1208
  if (fputc (out, module_fp) == EOF)
1209
    gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1210
 
1211
  if (out != '\n')
1212
    module_column++;
1213
  else
1214
    {
1215
      module_column = 1;
1216
      module_line++;
1217
    }
1218
}
1219
 
1220
 
1221
/* Write an atom to a module.  The line wrapping isn't perfect, but it
1222
   should work most of the time.  This isn't that big of a deal, since
1223
   the file really isn't meant to be read by people anyway.  */
1224
 
1225
static void
1226
write_atom (atom_type atom, const void *v)
1227
{
1228
  char buffer[20];
1229
  int i, len;
1230
  const char *p;
1231
 
1232
  switch (atom)
1233
    {
1234
    case ATOM_STRING:
1235
    case ATOM_NAME:
1236
      p = v;
1237
      break;
1238
 
1239
    case ATOM_LPAREN:
1240
      p = "(";
1241
      break;
1242
 
1243
    case ATOM_RPAREN:
1244
      p = ")";
1245
      break;
1246
 
1247
    case ATOM_INTEGER:
1248
      i = *((const int *) v);
1249
      if (i < 0)
1250
        gfc_internal_error ("write_atom(): Writing negative integer");
1251
 
1252
      sprintf (buffer, "%d", i);
1253
      p = buffer;
1254
      break;
1255
 
1256
    default:
1257
      gfc_internal_error ("write_atom(): Trying to write dab atom");
1258
 
1259
    }
1260
 
1261
  len = strlen (p);
1262
 
1263
  if (atom != ATOM_RPAREN)
1264
    {
1265
      if (module_column + len > 72)
1266
        write_char ('\n');
1267
      else
1268
        {
1269
 
1270
          if (last_atom != ATOM_LPAREN && module_column != 1)
1271
            write_char (' ');
1272
        }
1273
    }
1274
 
1275
  if (atom == ATOM_STRING)
1276
    write_char ('\'');
1277
 
1278
  while (*p)
1279
    {
1280
      if (atom == ATOM_STRING && *p == '\'')
1281
        write_char ('\'');
1282
      write_char (*p++);
1283
    }
1284
 
1285
  if (atom == ATOM_STRING)
1286
    write_char ('\'');
1287
 
1288
  last_atom = atom;
1289
}
1290
 
1291
 
1292
 
1293
/***************** Mid-level I/O subroutines *****************/
1294
 
1295
/* These subroutines let their caller read or write atoms without
1296
   caring about which of the two is actually happening.  This lets a
1297
   subroutine concentrate on the actual format of the data being
1298
   written.  */
1299
 
1300
static void mio_expr (gfc_expr **);
1301
static void mio_symbol_ref (gfc_symbol **);
1302
static void mio_symtree_ref (gfc_symtree **);
1303
 
1304
/* Read or write an enumerated value.  On writing, we return the input
1305
   value for the convenience of callers.  We avoid using an integer
1306
   pointer because enums are sometimes inside bitfields.  */
1307
 
1308
static int
1309
mio_name (int t, const mstring * m)
1310
{
1311
 
1312
  if (iomode == IO_OUTPUT)
1313
    write_atom (ATOM_NAME, gfc_code2string (m, t));
1314
  else
1315
    {
1316
      require_atom (ATOM_NAME);
1317
      t = find_enum (m);
1318
    }
1319
 
1320
  return t;
1321
}
1322
 
1323
/* Specialization of mio_name.  */
1324
 
1325
#define DECL_MIO_NAME(TYPE) \
1326
 static inline TYPE \
1327
 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1328
 { \
1329
   return (TYPE)mio_name ((int)t, m); \
1330
 }
1331
#define MIO_NAME(TYPE) mio_name_##TYPE
1332
 
1333
static void
1334
mio_lparen (void)
1335
{
1336
 
1337
  if (iomode == IO_OUTPUT)
1338
    write_atom (ATOM_LPAREN, NULL);
1339
  else
1340
    require_atom (ATOM_LPAREN);
1341
}
1342
 
1343
 
1344
static void
1345
mio_rparen (void)
1346
{
1347
 
1348
  if (iomode == IO_OUTPUT)
1349
    write_atom (ATOM_RPAREN, NULL);
1350
  else
1351
    require_atom (ATOM_RPAREN);
1352
}
1353
 
1354
 
1355
static void
1356
mio_integer (int *ip)
1357
{
1358
 
1359
  if (iomode == IO_OUTPUT)
1360
    write_atom (ATOM_INTEGER, ip);
1361
  else
1362
    {
1363
      require_atom (ATOM_INTEGER);
1364
      *ip = atom_int;
1365
    }
1366
}
1367
 
1368
 
1369
/* Read or write a character pointer that points to a string on the
1370
   heap.  */
1371
 
1372
static const char *
1373
mio_allocated_string (const char *s)
1374
{
1375
  if (iomode == IO_OUTPUT)
1376
    {
1377
      write_atom (ATOM_STRING, s);
1378
      return s;
1379
    }
1380
  else
1381
    {
1382
      require_atom (ATOM_STRING);
1383
      return atom_string;
1384
    }
1385
}
1386
 
1387
 
1388
/* Read or write a string that is in static memory.  */
1389
 
1390
static void
1391
mio_pool_string (const char **stringp)
1392
{
1393
  /* TODO: one could write the string only once, and refer to it via a
1394
     fixup pointer.  */
1395
 
1396
  /* As a special case we have to deal with a NULL string.  This
1397
     happens for the 'module' member of 'gfc_symbol's that are not in a
1398
     module.  We read / write these as the empty string.  */
1399
  if (iomode == IO_OUTPUT)
1400
    {
1401
      const char *p = *stringp == NULL ? "" : *stringp;
1402
      write_atom (ATOM_STRING, p);
1403
    }
1404
  else
1405
    {
1406
      require_atom (ATOM_STRING);
1407
      *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1408
      gfc_free (atom_string);
1409
    }
1410
}
1411
 
1412
 
1413
/* Read or write a string that is inside of some already-allocated
1414
   structure.  */
1415
 
1416
static void
1417
mio_internal_string (char *string)
1418
{
1419
 
1420
  if (iomode == IO_OUTPUT)
1421
    write_atom (ATOM_STRING, string);
1422
  else
1423
    {
1424
      require_atom (ATOM_STRING);
1425
      strcpy (string, atom_string);
1426
      gfc_free (atom_string);
1427
    }
1428
}
1429
 
1430
 
1431
 
1432
typedef enum
1433
{ AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1434
  AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
1435
  AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON,
1436
  AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1437
  AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT, AB_CRAY_POINTER,
1438
  AB_CRAY_POINTEE
1439
}
1440
ab_attribute;
1441
 
1442
static const mstring attr_bits[] =
1443
{
1444
    minit ("ALLOCATABLE", AB_ALLOCATABLE),
1445
    minit ("DIMENSION", AB_DIMENSION),
1446
    minit ("EXTERNAL", AB_EXTERNAL),
1447
    minit ("INTRINSIC", AB_INTRINSIC),
1448
    minit ("OPTIONAL", AB_OPTIONAL),
1449
    minit ("POINTER", AB_POINTER),
1450
    minit ("SAVE", AB_SAVE),
1451
    minit ("TARGET", AB_TARGET),
1452
    minit ("DUMMY", AB_DUMMY),
1453
    minit ("RESULT", AB_RESULT),
1454
    minit ("DATA", AB_DATA),
1455
    minit ("IN_NAMELIST", AB_IN_NAMELIST),
1456
    minit ("IN_COMMON", AB_IN_COMMON),
1457
    minit ("FUNCTION", AB_FUNCTION),
1458
    minit ("SUBROUTINE", AB_SUBROUTINE),
1459
    minit ("SEQUENCE", AB_SEQUENCE),
1460
    minit ("ELEMENTAL", AB_ELEMENTAL),
1461
    minit ("PURE", AB_PURE),
1462
    minit ("RECURSIVE", AB_RECURSIVE),
1463
    minit ("GENERIC", AB_GENERIC),
1464
    minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1465
    minit ("CRAY_POINTER", AB_CRAY_POINTER),
1466
    minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1467
    minit (NULL, -1)
1468
};
1469
 
1470
/* Specialization of mio_name.  */
1471
DECL_MIO_NAME(ab_attribute)
1472
DECL_MIO_NAME(ar_type)
1473
DECL_MIO_NAME(array_type)
1474
DECL_MIO_NAME(bt)
1475
DECL_MIO_NAME(expr_t)
1476
DECL_MIO_NAME(gfc_access)
1477
DECL_MIO_NAME(gfc_intrinsic_op)
1478
DECL_MIO_NAME(ifsrc)
1479
DECL_MIO_NAME(procedure_type)
1480
DECL_MIO_NAME(ref_type)
1481
DECL_MIO_NAME(sym_flavor)
1482
DECL_MIO_NAME(sym_intent)
1483
#undef DECL_MIO_NAME
1484
 
1485
/* Symbol attributes are stored in list with the first three elements
1486
   being the enumerated fields, while the remaining elements (if any)
1487
   indicate the individual attribute bits.  The access field is not
1488
   saved-- it controls what symbols are exported when a module is
1489
   written.  */
1490
 
1491
static void
1492
mio_symbol_attribute (symbol_attribute * attr)
1493
{
1494
  atom_type t;
1495
 
1496
  mio_lparen ();
1497
 
1498
  attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1499
  attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1500
  attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1501
  attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1502
 
1503
  if (iomode == IO_OUTPUT)
1504
    {
1505
      if (attr->allocatable)
1506
        MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1507
      if (attr->dimension)
1508
        MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1509
      if (attr->external)
1510
        MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1511
      if (attr->intrinsic)
1512
        MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1513
      if (attr->optional)
1514
        MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1515
      if (attr->pointer)
1516
        MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1517
      if (attr->save)
1518
        MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1519
      if (attr->target)
1520
        MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1521
      if (attr->dummy)
1522
        MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1523
      if (attr->result)
1524
        MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1525
      /* We deliberately don't preserve the "entry" flag.  */
1526
 
1527
      if (attr->data)
1528
        MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1529
      if (attr->in_namelist)
1530
        MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1531
      if (attr->in_common)
1532
        MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1533
 
1534
      if (attr->function)
1535
        MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1536
      if (attr->subroutine)
1537
        MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1538
      if (attr->generic)
1539
        MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1540
 
1541
      if (attr->sequence)
1542
        MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1543
      if (attr->elemental)
1544
        MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1545
      if (attr->pure)
1546
        MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1547
      if (attr->recursive)
1548
        MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1549
      if (attr->always_explicit)
1550
        MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1551
      if (attr->cray_pointer)
1552
        MIO_NAME(ab_attribute) (AB_CRAY_POINTER, attr_bits);
1553
      if (attr->cray_pointee)
1554
        MIO_NAME(ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1555
 
1556
      mio_rparen ();
1557
 
1558
    }
1559
  else
1560
    {
1561
 
1562
      for (;;)
1563
        {
1564
          t = parse_atom ();
1565
          if (t == ATOM_RPAREN)
1566
            break;
1567
          if (t != ATOM_NAME)
1568
            bad_module ("Expected attribute bit name");
1569
 
1570
          switch ((ab_attribute) find_enum (attr_bits))
1571
            {
1572
            case AB_ALLOCATABLE:
1573
              attr->allocatable = 1;
1574
              break;
1575
            case AB_DIMENSION:
1576
              attr->dimension = 1;
1577
              break;
1578
            case AB_EXTERNAL:
1579
              attr->external = 1;
1580
              break;
1581
            case AB_INTRINSIC:
1582
              attr->intrinsic = 1;
1583
              break;
1584
            case AB_OPTIONAL:
1585
              attr->optional = 1;
1586
              break;
1587
            case AB_POINTER:
1588
              attr->pointer = 1;
1589
              break;
1590
            case AB_SAVE:
1591
              attr->save = 1;
1592
              break;
1593
            case AB_TARGET:
1594
              attr->target = 1;
1595
              break;
1596
            case AB_DUMMY:
1597
              attr->dummy = 1;
1598
              break;
1599
            case AB_RESULT:
1600
              attr->result = 1;
1601
              break;
1602
            case AB_DATA:
1603
              attr->data = 1;
1604
              break;
1605
            case AB_IN_NAMELIST:
1606
              attr->in_namelist = 1;
1607
              break;
1608
            case AB_IN_COMMON:
1609
              attr->in_common = 1;
1610
              break;
1611
            case AB_FUNCTION:
1612
              attr->function = 1;
1613
              break;
1614
            case AB_SUBROUTINE:
1615
              attr->subroutine = 1;
1616
              break;
1617
            case AB_GENERIC:
1618
              attr->generic = 1;
1619
              break;
1620
            case AB_SEQUENCE:
1621
              attr->sequence = 1;
1622
              break;
1623
            case AB_ELEMENTAL:
1624
              attr->elemental = 1;
1625
              break;
1626
            case AB_PURE:
1627
              attr->pure = 1;
1628
              break;
1629
            case AB_RECURSIVE:
1630
              attr->recursive = 1;
1631
              break;
1632
            case AB_ALWAYS_EXPLICIT:
1633
              attr->always_explicit = 1;
1634
              break;
1635
            case AB_CRAY_POINTER:
1636
              attr->cray_pointer = 1;
1637
              break;
1638
            case AB_CRAY_POINTEE:
1639
              attr->cray_pointee = 1;
1640
              break;
1641
            }
1642
        }
1643
    }
1644
}
1645
 
1646
 
1647
static const mstring bt_types[] = {
1648
    minit ("INTEGER", BT_INTEGER),
1649
    minit ("REAL", BT_REAL),
1650
    minit ("COMPLEX", BT_COMPLEX),
1651
    minit ("LOGICAL", BT_LOGICAL),
1652
    minit ("CHARACTER", BT_CHARACTER),
1653
    minit ("DERIVED", BT_DERIVED),
1654
    minit ("PROCEDURE", BT_PROCEDURE),
1655
    minit ("UNKNOWN", BT_UNKNOWN),
1656
    minit (NULL, -1)
1657
};
1658
 
1659
 
1660
static void
1661
mio_charlen (gfc_charlen ** clp)
1662
{
1663
  gfc_charlen *cl;
1664
 
1665
  mio_lparen ();
1666
 
1667
  if (iomode == IO_OUTPUT)
1668
    {
1669
      cl = *clp;
1670
      if (cl != NULL)
1671
        mio_expr (&cl->length);
1672
    }
1673
  else
1674
    {
1675
 
1676
      if (peek_atom () != ATOM_RPAREN)
1677
        {
1678
          cl = gfc_get_charlen ();
1679
          mio_expr (&cl->length);
1680
 
1681
          *clp = cl;
1682
 
1683
          cl->next = gfc_current_ns->cl_list;
1684
          gfc_current_ns->cl_list = cl;
1685
        }
1686
    }
1687
 
1688
  mio_rparen ();
1689
}
1690
 
1691
 
1692
/* Return a symtree node with a name that is guaranteed to be unique
1693
   within the namespace and corresponds to an illegal fortran name.  */
1694
 
1695
static gfc_symtree *
1696
get_unique_symtree (gfc_namespace * ns)
1697
{
1698
  char name[GFC_MAX_SYMBOL_LEN + 1];
1699
  static int serial = 0;
1700
 
1701
  sprintf (name, "@%d", serial++);
1702
  return gfc_new_symtree (&ns->sym_root, name);
1703
}
1704
 
1705
 
1706
/* See if a name is a generated name.  */
1707
 
1708
static int
1709
check_unique_name (const char *name)
1710
{
1711
 
1712
  return *name == '@';
1713
}
1714
 
1715
 
1716
static void
1717
mio_typespec (gfc_typespec * ts)
1718
{
1719
 
1720
  mio_lparen ();
1721
 
1722
  ts->type = MIO_NAME(bt) (ts->type, bt_types);
1723
 
1724
  if (ts->type != BT_DERIVED)
1725
    mio_integer (&ts->kind);
1726
  else
1727
    mio_symbol_ref (&ts->derived);
1728
 
1729
  mio_charlen (&ts->cl);
1730
 
1731
  mio_rparen ();
1732
}
1733
 
1734
 
1735
static const mstring array_spec_types[] = {
1736
    minit ("EXPLICIT", AS_EXPLICIT),
1737
    minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1738
    minit ("DEFERRED", AS_DEFERRED),
1739
    minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1740
    minit (NULL, -1)
1741
};
1742
 
1743
 
1744
static void
1745
mio_array_spec (gfc_array_spec ** asp)
1746
{
1747
  gfc_array_spec *as;
1748
  int i;
1749
 
1750
  mio_lparen ();
1751
 
1752
  if (iomode == IO_OUTPUT)
1753
    {
1754
      if (*asp == NULL)
1755
        goto done;
1756
      as = *asp;
1757
    }
1758
  else
1759
    {
1760
      if (peek_atom () == ATOM_RPAREN)
1761
        {
1762
          *asp = NULL;
1763
          goto done;
1764
        }
1765
 
1766
      *asp = as = gfc_get_array_spec ();
1767
    }
1768
 
1769
  mio_integer (&as->rank);
1770
  as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1771
 
1772
  for (i = 0; i < as->rank; i++)
1773
    {
1774
      mio_expr (&as->lower[i]);
1775
      mio_expr (&as->upper[i]);
1776
    }
1777
 
1778
done:
1779
  mio_rparen ();
1780
}
1781
 
1782
 
1783
/* Given a pointer to an array reference structure (which lives in a
1784
   gfc_ref structure), find the corresponding array specification
1785
   structure.  Storing the pointer in the ref structure doesn't quite
1786
   work when loading from a module. Generating code for an array
1787
   reference also needs more information than just the array spec.  */
1788
 
1789
static const mstring array_ref_types[] = {
1790
    minit ("FULL", AR_FULL),
1791
    minit ("ELEMENT", AR_ELEMENT),
1792
    minit ("SECTION", AR_SECTION),
1793
    minit (NULL, -1)
1794
};
1795
 
1796
static void
1797
mio_array_ref (gfc_array_ref * ar)
1798
{
1799
  int i;
1800
 
1801
  mio_lparen ();
1802
  ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1803
  mio_integer (&ar->dimen);
1804
 
1805
  switch (ar->type)
1806
    {
1807
    case AR_FULL:
1808
      break;
1809
 
1810
    case AR_ELEMENT:
1811
      for (i = 0; i < ar->dimen; i++)
1812
        mio_expr (&ar->start[i]);
1813
 
1814
      break;
1815
 
1816
    case AR_SECTION:
1817
      for (i = 0; i < ar->dimen; i++)
1818
        {
1819
          mio_expr (&ar->start[i]);
1820
          mio_expr (&ar->end[i]);
1821
          mio_expr (&ar->stride[i]);
1822
        }
1823
 
1824
      break;
1825
 
1826
    case AR_UNKNOWN:
1827
      gfc_internal_error ("mio_array_ref(): Unknown array ref");
1828
    }
1829
 
1830
  for (i = 0; i < ar->dimen; i++)
1831
    mio_integer ((int *) &ar->dimen_type[i]);
1832
 
1833
  if (iomode == IO_INPUT)
1834
    {
1835
      ar->where = gfc_current_locus;
1836
 
1837
      for (i = 0; i < ar->dimen; i++)
1838
        ar->c_where[i] = gfc_current_locus;
1839
    }
1840
 
1841
  mio_rparen ();
1842
}
1843
 
1844
 
1845
/* Saves or restores a pointer.  The pointer is converted back and
1846
   forth from an integer.  We return the pointer_info pointer so that
1847
   the caller can take additional action based on the pointer type.  */
1848
 
1849
static pointer_info *
1850
mio_pointer_ref (void *gp)
1851
{
1852
  pointer_info *p;
1853
 
1854
  if (iomode == IO_OUTPUT)
1855
    {
1856
      p = get_pointer (*((char **) gp));
1857
      write_atom (ATOM_INTEGER, &p->integer);
1858
    }
1859
  else
1860
    {
1861
      require_atom (ATOM_INTEGER);
1862
      p = add_fixup (atom_int, gp);
1863
    }
1864
 
1865
  return p;
1866
}
1867
 
1868
 
1869
/* Save and load references to components that occur within
1870
   expressions.  We have to describe these references by a number and
1871
   by name.  The number is necessary for forward references during
1872
   reading, and the name is necessary if the symbol already exists in
1873
   the namespace and is not loaded again.  */
1874
 
1875
static void
1876
mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1877
{
1878
  char name[GFC_MAX_SYMBOL_LEN + 1];
1879
  gfc_component *q;
1880
  pointer_info *p;
1881
 
1882
  p = mio_pointer_ref (cp);
1883
  if (p->type == P_UNKNOWN)
1884
    p->type = P_COMPONENT;
1885
 
1886
  if (iomode == IO_OUTPUT)
1887
    mio_pool_string (&(*cp)->name);
1888
  else
1889
    {
1890
      mio_internal_string (name);
1891
 
1892
      /* It can happen that a component reference can be read before the
1893
         associated derived type symbol has been loaded. Return now and
1894
         wait for a later iteration of load_needed.  */
1895
      if (sym == NULL)
1896
        return;
1897
 
1898
      if (sym->components != NULL && p->u.pointer == NULL)
1899
        {
1900
          /* Symbol already loaded, so search by name.  */
1901
          for (q = sym->components; q; q = q->next)
1902
            if (strcmp (q->name, name) == 0)
1903
              break;
1904
 
1905
          if (q == NULL)
1906
            gfc_internal_error ("mio_component_ref(): Component not found");
1907
 
1908
          associate_integer_pointer (p, q);
1909
        }
1910
 
1911
      /* Make sure this symbol will eventually be loaded.  */
1912
      p = find_pointer2 (sym);
1913
      if (p->u.rsym.state == UNUSED)
1914
        p->u.rsym.state = NEEDED;
1915
    }
1916
}
1917
 
1918
 
1919
static void
1920
mio_component (gfc_component * c)
1921
{
1922
  pointer_info *p;
1923
  int n;
1924
 
1925
  mio_lparen ();
1926
 
1927
  if (iomode == IO_OUTPUT)
1928
    {
1929
      p = get_pointer (c);
1930
      mio_integer (&p->integer);
1931
    }
1932
  else
1933
    {
1934
      mio_integer (&n);
1935
      p = get_integer (n);
1936
      associate_integer_pointer (p, c);
1937
    }
1938
 
1939
  if (p->type == P_UNKNOWN)
1940
    p->type = P_COMPONENT;
1941
 
1942
  mio_pool_string (&c->name);
1943
  mio_typespec (&c->ts);
1944
  mio_array_spec (&c->as);
1945
 
1946
  mio_integer (&c->dimension);
1947
  mio_integer (&c->pointer);
1948
 
1949
  mio_expr (&c->initializer);
1950
  mio_rparen ();
1951
}
1952
 
1953
 
1954
static void
1955
mio_component_list (gfc_component ** cp)
1956
{
1957
  gfc_component *c, *tail;
1958
 
1959
  mio_lparen ();
1960
 
1961
  if (iomode == IO_OUTPUT)
1962
    {
1963
      for (c = *cp; c; c = c->next)
1964
        mio_component (c);
1965
    }
1966
  else
1967
    {
1968
 
1969
      *cp = NULL;
1970
      tail = NULL;
1971
 
1972
      for (;;)
1973
        {
1974
          if (peek_atom () == ATOM_RPAREN)
1975
            break;
1976
 
1977
          c = gfc_get_component ();
1978
          mio_component (c);
1979
 
1980
          if (tail == NULL)
1981
            *cp = c;
1982
          else
1983
            tail->next = c;
1984
 
1985
          tail = c;
1986
        }
1987
    }
1988
 
1989
  mio_rparen ();
1990
}
1991
 
1992
 
1993
static void
1994
mio_actual_arg (gfc_actual_arglist * a)
1995
{
1996
 
1997
  mio_lparen ();
1998
  mio_pool_string (&a->name);
1999
  mio_expr (&a->expr);
2000
  mio_rparen ();
2001
}
2002
 
2003
 
2004
static void
2005
mio_actual_arglist (gfc_actual_arglist ** ap)
2006
{
2007
  gfc_actual_arglist *a, *tail;
2008
 
2009
  mio_lparen ();
2010
 
2011
  if (iomode == IO_OUTPUT)
2012
    {
2013
      for (a = *ap; a; a = a->next)
2014
        mio_actual_arg (a);
2015
 
2016
    }
2017
  else
2018
    {
2019
      tail = NULL;
2020
 
2021
      for (;;)
2022
        {
2023
          if (peek_atom () != ATOM_LPAREN)
2024
            break;
2025
 
2026
          a = gfc_get_actual_arglist ();
2027
 
2028
          if (tail == NULL)
2029
            *ap = a;
2030
          else
2031
            tail->next = a;
2032
 
2033
          tail = a;
2034
          mio_actual_arg (a);
2035
        }
2036
    }
2037
 
2038
  mio_rparen ();
2039
}
2040
 
2041
 
2042
/* Read and write formal argument lists.  */
2043
 
2044
static void
2045
mio_formal_arglist (gfc_symbol * sym)
2046
{
2047
  gfc_formal_arglist *f, *tail;
2048
 
2049
  mio_lparen ();
2050
 
2051
  if (iomode == IO_OUTPUT)
2052
    {
2053
      for (f = sym->formal; f; f = f->next)
2054
        mio_symbol_ref (&f->sym);
2055
 
2056
    }
2057
  else
2058
    {
2059
      sym->formal = tail = NULL;
2060
 
2061
      while (peek_atom () != ATOM_RPAREN)
2062
        {
2063
          f = gfc_get_formal_arglist ();
2064
          mio_symbol_ref (&f->sym);
2065
 
2066
          if (sym->formal == NULL)
2067
            sym->formal = f;
2068
          else
2069
            tail->next = f;
2070
 
2071
          tail = f;
2072
        }
2073
    }
2074
 
2075
  mio_rparen ();
2076
}
2077
 
2078
 
2079
/* Save or restore a reference to a symbol node.  */
2080
 
2081
void
2082
mio_symbol_ref (gfc_symbol ** symp)
2083
{
2084
  pointer_info *p;
2085
 
2086
  p = mio_pointer_ref (symp);
2087
  if (p->type == P_UNKNOWN)
2088
    p->type = P_SYMBOL;
2089
 
2090
  if (iomode == IO_OUTPUT)
2091
    {
2092
      if (p->u.wsym.state == UNREFERENCED)
2093
        p->u.wsym.state = NEEDS_WRITE;
2094
    }
2095
  else
2096
    {
2097
      if (p->u.rsym.state == UNUSED)
2098
        p->u.rsym.state = NEEDED;
2099
    }
2100
}
2101
 
2102
 
2103
/* Save or restore a reference to a symtree node.  */
2104
 
2105
static void
2106
mio_symtree_ref (gfc_symtree ** stp)
2107
{
2108
  pointer_info *p;
2109
  fixup_t *f;
2110
  gfc_symtree * ns_st = NULL;
2111
 
2112
  if (iomode == IO_OUTPUT)
2113
    {
2114
      /* If this is a symtree for a symbol that came from a contained module
2115
         namespace, it has a unique name and we should look in the current
2116
         namespace to see if the required, non-contained symbol is available
2117
         yet. If so, the latter should be written.  */
2118
      if ((*stp)->n.sym && check_unique_name((*stp)->name))
2119
        ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2120
                                    (*stp)->n.sym->name);
2121
 
2122
      /* On the other hand, if the existing symbol is the module name or the
2123
         new symbol is a dummy argument, do not do the promotion.  */
2124
      if (ns_st && ns_st->n.sym
2125
            && ns_st->n.sym->attr.flavor != FL_MODULE
2126
            && !(*stp)->n.sym->attr.dummy)
2127
        mio_symbol_ref (&ns_st->n.sym);
2128
      else
2129
        mio_symbol_ref (&(*stp)->n.sym);
2130
    }
2131
  else
2132
    {
2133
      require_atom (ATOM_INTEGER);
2134
      p = get_integer (atom_int);
2135
 
2136
      /* An unused equivalence member; bail out.  */
2137
      if (in_load_equiv && p->u.rsym.symtree == NULL)
2138
        return;
2139
 
2140
      if (p->type == P_UNKNOWN)
2141
        p->type = P_SYMBOL;
2142
 
2143
      if (p->u.rsym.state == UNUSED)
2144
        p->u.rsym.state = NEEDED;
2145
 
2146
      if (p->u.rsym.symtree != NULL)
2147
        {
2148
          *stp = p->u.rsym.symtree;
2149
        }
2150
      else
2151
        {
2152
          f = gfc_getmem (sizeof (fixup_t));
2153
 
2154
          f->next = p->u.rsym.stfixup;
2155
          p->u.rsym.stfixup = f;
2156
 
2157
          f->pointer = (void **)stp;
2158
        }
2159
    }
2160
}
2161
 
2162
static void
2163
mio_iterator (gfc_iterator ** ip)
2164
{
2165
  gfc_iterator *iter;
2166
 
2167
  mio_lparen ();
2168
 
2169
  if (iomode == IO_OUTPUT)
2170
    {
2171
      if (*ip == NULL)
2172
        goto done;
2173
    }
2174
  else
2175
    {
2176
      if (peek_atom () == ATOM_RPAREN)
2177
        {
2178
          *ip = NULL;
2179
          goto done;
2180
        }
2181
 
2182
      *ip = gfc_get_iterator ();
2183
    }
2184
 
2185
  iter = *ip;
2186
 
2187
  mio_expr (&iter->var);
2188
  mio_expr (&iter->start);
2189
  mio_expr (&iter->end);
2190
  mio_expr (&iter->step);
2191
 
2192
done:
2193
  mio_rparen ();
2194
}
2195
 
2196
 
2197
 
2198
static void
2199
mio_constructor (gfc_constructor ** cp)
2200
{
2201
  gfc_constructor *c, *tail;
2202
 
2203
  mio_lparen ();
2204
 
2205
  if (iomode == IO_OUTPUT)
2206
    {
2207
      for (c = *cp; c; c = c->next)
2208
        {
2209
          mio_lparen ();
2210
          mio_expr (&c->expr);
2211
          mio_iterator (&c->iterator);
2212
          mio_rparen ();
2213
        }
2214
    }
2215
  else
2216
    {
2217
 
2218
      *cp = NULL;
2219
      tail = NULL;
2220
 
2221
      while (peek_atom () != ATOM_RPAREN)
2222
        {
2223
          c = gfc_get_constructor ();
2224
 
2225
          if (tail == NULL)
2226
            *cp = c;
2227
          else
2228
            tail->next = c;
2229
 
2230
          tail = c;
2231
 
2232
          mio_lparen ();
2233
          mio_expr (&c->expr);
2234
          mio_iterator (&c->iterator);
2235
          mio_rparen ();
2236
        }
2237
    }
2238
 
2239
  mio_rparen ();
2240
}
2241
 
2242
 
2243
 
2244
static const mstring ref_types[] = {
2245
    minit ("ARRAY", REF_ARRAY),
2246
    minit ("COMPONENT", REF_COMPONENT),
2247
    minit ("SUBSTRING", REF_SUBSTRING),
2248
    minit (NULL, -1)
2249
};
2250
 
2251
 
2252
static void
2253
mio_ref (gfc_ref ** rp)
2254
{
2255
  gfc_ref *r;
2256
 
2257
  mio_lparen ();
2258
 
2259
  r = *rp;
2260
  r->type = MIO_NAME(ref_type) (r->type, ref_types);
2261
 
2262
  switch (r->type)
2263
    {
2264
    case REF_ARRAY:
2265
      mio_array_ref (&r->u.ar);
2266
      break;
2267
 
2268
    case REF_COMPONENT:
2269
      mio_symbol_ref (&r->u.c.sym);
2270
      mio_component_ref (&r->u.c.component, r->u.c.sym);
2271
      break;
2272
 
2273
    case REF_SUBSTRING:
2274
      mio_expr (&r->u.ss.start);
2275
      mio_expr (&r->u.ss.end);
2276
      mio_charlen (&r->u.ss.length);
2277
      break;
2278
    }
2279
 
2280
  mio_rparen ();
2281
}
2282
 
2283
 
2284
static void
2285
mio_ref_list (gfc_ref ** rp)
2286
{
2287
  gfc_ref *ref, *head, *tail;
2288
 
2289
  mio_lparen ();
2290
 
2291
  if (iomode == IO_OUTPUT)
2292
    {
2293
      for (ref = *rp; ref; ref = ref->next)
2294
        mio_ref (&ref);
2295
    }
2296
  else
2297
    {
2298
      head = tail = NULL;
2299
 
2300
      while (peek_atom () != ATOM_RPAREN)
2301
        {
2302
          if (head == NULL)
2303
            head = tail = gfc_get_ref ();
2304
          else
2305
            {
2306
              tail->next = gfc_get_ref ();
2307
              tail = tail->next;
2308
            }
2309
 
2310
          mio_ref (&tail);
2311
        }
2312
 
2313
      *rp = head;
2314
    }
2315
 
2316
  mio_rparen ();
2317
}
2318
 
2319
 
2320
/* Read and write an integer value.  */
2321
 
2322
static void
2323
mio_gmp_integer (mpz_t * integer)
2324
{
2325
  char *p;
2326
 
2327
  if (iomode == IO_INPUT)
2328
    {
2329
      if (parse_atom () != ATOM_STRING)
2330
        bad_module ("Expected integer string");
2331
 
2332
      mpz_init (*integer);
2333
      if (mpz_set_str (*integer, atom_string, 10))
2334
        bad_module ("Error converting integer");
2335
 
2336
      gfc_free (atom_string);
2337
 
2338
    }
2339
  else
2340
    {
2341
      p = mpz_get_str (NULL, 10, *integer);
2342
      write_atom (ATOM_STRING, p);
2343
      gfc_free (p);
2344
    }
2345
}
2346
 
2347
 
2348
static void
2349
mio_gmp_real (mpfr_t * real)
2350
{
2351
  mp_exp_t exponent;
2352
  char *p;
2353
 
2354
  if (iomode == IO_INPUT)
2355
    {
2356
      if (parse_atom () != ATOM_STRING)
2357
        bad_module ("Expected real string");
2358
 
2359
      mpfr_init (*real);
2360
      mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2361
      gfc_free (atom_string);
2362
 
2363
    }
2364
  else
2365
    {
2366
      p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2367
      atom_string = gfc_getmem (strlen (p) + 20);
2368
 
2369
      sprintf (atom_string, "0.%s@%ld", p, exponent);
2370
 
2371
      /* Fix negative numbers.  */
2372
      if (atom_string[2] == '-')
2373
        {
2374
          atom_string[0] = '-';
2375
          atom_string[1] = '0';
2376
          atom_string[2] = '.';
2377
        }
2378
 
2379
      write_atom (ATOM_STRING, atom_string);
2380
 
2381
      gfc_free (atom_string);
2382
      gfc_free (p);
2383
    }
2384
}
2385
 
2386
 
2387
/* Save and restore the shape of an array constructor.  */
2388
 
2389
static void
2390
mio_shape (mpz_t ** pshape, int rank)
2391
{
2392
  mpz_t *shape;
2393
  atom_type t;
2394
  int n;
2395
 
2396
  /* A NULL shape is represented by ().  */
2397
  mio_lparen ();
2398
 
2399
  if (iomode == IO_OUTPUT)
2400
    {
2401
      shape = *pshape;
2402
      if (!shape)
2403
        {
2404
          mio_rparen ();
2405
          return;
2406
        }
2407
    }
2408
  else
2409
    {
2410
      t = peek_atom ();
2411
      if (t == ATOM_RPAREN)
2412
        {
2413
          *pshape = NULL;
2414
          mio_rparen ();
2415
          return;
2416
        }
2417
 
2418
      shape = gfc_get_shape (rank);
2419
      *pshape = shape;
2420
    }
2421
 
2422
  for (n = 0; n < rank; n++)
2423
    mio_gmp_integer (&shape[n]);
2424
 
2425
  mio_rparen ();
2426
}
2427
 
2428
 
2429
static const mstring expr_types[] = {
2430
    minit ("OP", EXPR_OP),
2431
    minit ("FUNCTION", EXPR_FUNCTION),
2432
    minit ("CONSTANT", EXPR_CONSTANT),
2433
    minit ("VARIABLE", EXPR_VARIABLE),
2434
    minit ("SUBSTRING", EXPR_SUBSTRING),
2435
    minit ("STRUCTURE", EXPR_STRUCTURE),
2436
    minit ("ARRAY", EXPR_ARRAY),
2437
    minit ("NULL", EXPR_NULL),
2438
    minit (NULL, -1)
2439
};
2440
 
2441
/* INTRINSIC_ASSIGN is missing because it is used as an index for
2442
   generic operators, not in expressions.  INTRINSIC_USER is also
2443
   replaced by the correct function name by the time we see it.  */
2444
 
2445
static const mstring intrinsics[] =
2446
{
2447
    minit ("UPLUS", INTRINSIC_UPLUS),
2448
    minit ("UMINUS", INTRINSIC_UMINUS),
2449
    minit ("PLUS", INTRINSIC_PLUS),
2450
    minit ("MINUS", INTRINSIC_MINUS),
2451
    minit ("TIMES", INTRINSIC_TIMES),
2452
    minit ("DIVIDE", INTRINSIC_DIVIDE),
2453
    minit ("POWER", INTRINSIC_POWER),
2454
    minit ("CONCAT", INTRINSIC_CONCAT),
2455
    minit ("AND", INTRINSIC_AND),
2456
    minit ("OR", INTRINSIC_OR),
2457
    minit ("EQV", INTRINSIC_EQV),
2458
    minit ("NEQV", INTRINSIC_NEQV),
2459
    minit ("EQ", INTRINSIC_EQ),
2460
    minit ("NE", INTRINSIC_NE),
2461
    minit ("GT", INTRINSIC_GT),
2462
    minit ("GE", INTRINSIC_GE),
2463
    minit ("LT", INTRINSIC_LT),
2464
    minit ("LE", INTRINSIC_LE),
2465
    minit ("NOT", INTRINSIC_NOT),
2466
    minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2467
    minit (NULL, -1)
2468
};
2469
 
2470
/* Read and write expressions.  The form "()" is allowed to indicate a
2471
   NULL expression.  */
2472
 
2473
static void
2474
mio_expr (gfc_expr ** ep)
2475
{
2476
  gfc_expr *e;
2477
  atom_type t;
2478
  int flag;
2479
 
2480
  mio_lparen ();
2481
 
2482
  if (iomode == IO_OUTPUT)
2483
    {
2484
      if (*ep == NULL)
2485
        {
2486
          mio_rparen ();
2487
          return;
2488
        }
2489
 
2490
      e = *ep;
2491
      MIO_NAME(expr_t) (e->expr_type, expr_types);
2492
 
2493
    }
2494
  else
2495
    {
2496
      t = parse_atom ();
2497
      if (t == ATOM_RPAREN)
2498
        {
2499
          *ep = NULL;
2500
          return;
2501
        }
2502
 
2503
      if (t != ATOM_NAME)
2504
        bad_module ("Expected expression type");
2505
 
2506
      e = *ep = gfc_get_expr ();
2507
      e->where = gfc_current_locus;
2508
      e->expr_type = (expr_t) find_enum (expr_types);
2509
    }
2510
 
2511
  mio_typespec (&e->ts);
2512
  mio_integer (&e->rank);
2513
 
2514
  switch (e->expr_type)
2515
    {
2516
    case EXPR_OP:
2517
      e->value.op.operator
2518
        = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2519
 
2520
      switch (e->value.op.operator)
2521
        {
2522
        case INTRINSIC_UPLUS:
2523
        case INTRINSIC_UMINUS:
2524
        case INTRINSIC_NOT:
2525
        case INTRINSIC_PARENTHESES:
2526
          mio_expr (&e->value.op.op1);
2527
          break;
2528
 
2529
        case INTRINSIC_PLUS:
2530
        case INTRINSIC_MINUS:
2531
        case INTRINSIC_TIMES:
2532
        case INTRINSIC_DIVIDE:
2533
        case INTRINSIC_POWER:
2534
        case INTRINSIC_CONCAT:
2535
        case INTRINSIC_AND:
2536
        case INTRINSIC_OR:
2537
        case INTRINSIC_EQV:
2538
        case INTRINSIC_NEQV:
2539
        case INTRINSIC_EQ:
2540
        case INTRINSIC_NE:
2541
        case INTRINSIC_GT:
2542
        case INTRINSIC_GE:
2543
        case INTRINSIC_LT:
2544
        case INTRINSIC_LE:
2545
          mio_expr (&e->value.op.op1);
2546
          mio_expr (&e->value.op.op2);
2547
          break;
2548
 
2549
        default:
2550
          bad_module ("Bad operator");
2551
        }
2552
 
2553
      break;
2554
 
2555
    case EXPR_FUNCTION:
2556
      mio_symtree_ref (&e->symtree);
2557
      mio_actual_arglist (&e->value.function.actual);
2558
 
2559
      if (iomode == IO_OUTPUT)
2560
        {
2561
          e->value.function.name
2562
            = mio_allocated_string (e->value.function.name);
2563
          flag = e->value.function.esym != NULL;
2564
          mio_integer (&flag);
2565
          if (flag)
2566
            mio_symbol_ref (&e->value.function.esym);
2567
          else
2568
            write_atom (ATOM_STRING, e->value.function.isym->name);
2569
 
2570
        }
2571
      else
2572
        {
2573
          require_atom (ATOM_STRING);
2574
          e->value.function.name = gfc_get_string (atom_string);
2575
          gfc_free (atom_string);
2576
 
2577
          mio_integer (&flag);
2578
          if (flag)
2579
            mio_symbol_ref (&e->value.function.esym);
2580
          else
2581
            {
2582
              require_atom (ATOM_STRING);
2583
              e->value.function.isym = gfc_find_function (atom_string);
2584
              gfc_free (atom_string);
2585
            }
2586
        }
2587
 
2588
      break;
2589
 
2590
    case EXPR_VARIABLE:
2591
      mio_symtree_ref (&e->symtree);
2592
      mio_ref_list (&e->ref);
2593
      break;
2594
 
2595
    case EXPR_SUBSTRING:
2596
      e->value.character.string = (char *)
2597
        mio_allocated_string (e->value.character.string);
2598
      mio_ref_list (&e->ref);
2599
      break;
2600
 
2601
    case EXPR_STRUCTURE:
2602
    case EXPR_ARRAY:
2603
      mio_constructor (&e->value.constructor);
2604
      mio_shape (&e->shape, e->rank);
2605
      break;
2606
 
2607
    case EXPR_CONSTANT:
2608
      switch (e->ts.type)
2609
        {
2610
        case BT_INTEGER:
2611
          mio_gmp_integer (&e->value.integer);
2612
          break;
2613
 
2614
        case BT_REAL:
2615
          gfc_set_model_kind (e->ts.kind);
2616
          mio_gmp_real (&e->value.real);
2617
          break;
2618
 
2619
        case BT_COMPLEX:
2620
          gfc_set_model_kind (e->ts.kind);
2621
          mio_gmp_real (&e->value.complex.r);
2622
          mio_gmp_real (&e->value.complex.i);
2623
          break;
2624
 
2625
        case BT_LOGICAL:
2626
          mio_integer (&e->value.logical);
2627
          break;
2628
 
2629
        case BT_CHARACTER:
2630
          mio_integer (&e->value.character.length);
2631
          e->value.character.string = (char *)
2632
            mio_allocated_string (e->value.character.string);
2633
          break;
2634
 
2635
        default:
2636
          bad_module ("Bad type in constant expression");
2637
        }
2638
 
2639
      break;
2640
 
2641
    case EXPR_NULL:
2642
      break;
2643
    }
2644
 
2645
  mio_rparen ();
2646
}
2647
 
2648
 
2649
/* Read and write namelists */
2650
 
2651
static void
2652
mio_namelist (gfc_symbol * sym)
2653
{
2654
  gfc_namelist *n, *m;
2655
  const char *check_name;
2656
 
2657
  mio_lparen ();
2658
 
2659
  if (iomode == IO_OUTPUT)
2660
    {
2661
      for (n = sym->namelist; n; n = n->next)
2662
        mio_symbol_ref (&n->sym);
2663
    }
2664
  else
2665
    {
2666
      /* This departure from the standard is flagged as an error.
2667
         It does, in fact, work correctly. TODO: Allow it
2668
         conditionally?  */
2669
      if (sym->attr.flavor == FL_NAMELIST)
2670
        {
2671
          check_name = find_use_name (sym->name);
2672
          if (check_name && strcmp (check_name, sym->name) != 0)
2673
            gfc_error("Namelist %s cannot be renamed by USE"
2674
                      " association to %s.",
2675
                      sym->name, check_name);
2676
        }
2677
 
2678
      m = NULL;
2679
      while (peek_atom () != ATOM_RPAREN)
2680
        {
2681
          n = gfc_get_namelist ();
2682
          mio_symbol_ref (&n->sym);
2683
 
2684
          if (sym->namelist == NULL)
2685
            sym->namelist = n;
2686
          else
2687
            m->next = n;
2688
 
2689
          m = n;
2690
        }
2691
      sym->namelist_tail = m;
2692
    }
2693
 
2694
  mio_rparen ();
2695
}
2696
 
2697
 
2698
/* Save/restore lists of gfc_interface stuctures.  When loading an
2699
   interface, we are really appending to the existing list of
2700
   interfaces.  Checking for duplicate and ambiguous interfaces has to
2701
   be done later when all symbols have been loaded.  */
2702
 
2703
static void
2704
mio_interface_rest (gfc_interface ** ip)
2705
{
2706
  gfc_interface *tail, *p;
2707
 
2708
  if (iomode == IO_OUTPUT)
2709
    {
2710
      if (ip != NULL)
2711
        for (p = *ip; p; p = p->next)
2712
          mio_symbol_ref (&p->sym);
2713
    }
2714
  else
2715
    {
2716
 
2717
      if (*ip == NULL)
2718
        tail = NULL;
2719
      else
2720
        {
2721
          tail = *ip;
2722
          while (tail->next)
2723
            tail = tail->next;
2724
        }
2725
 
2726
      for (;;)
2727
        {
2728
          if (peek_atom () == ATOM_RPAREN)
2729
            break;
2730
 
2731
          p = gfc_get_interface ();
2732
          p->where = gfc_current_locus;
2733
          mio_symbol_ref (&p->sym);
2734
 
2735
          if (tail == NULL)
2736
            *ip = p;
2737
          else
2738
            tail->next = p;
2739
 
2740
          tail = p;
2741
        }
2742
    }
2743
 
2744
  mio_rparen ();
2745
}
2746
 
2747
 
2748
/* Save/restore a nameless operator interface.  */
2749
 
2750
static void
2751
mio_interface (gfc_interface ** ip)
2752
{
2753
 
2754
  mio_lparen ();
2755
  mio_interface_rest (ip);
2756
}
2757
 
2758
 
2759
/* Save/restore a named operator interface.  */
2760
 
2761
static void
2762
mio_symbol_interface (const char **name, const char **module,
2763
                      gfc_interface ** ip)
2764
{
2765
 
2766
  mio_lparen ();
2767
 
2768
  mio_pool_string (name);
2769
  mio_pool_string (module);
2770
 
2771
  mio_interface_rest (ip);
2772
}
2773
 
2774
 
2775
static void
2776
mio_namespace_ref (gfc_namespace ** nsp)
2777
{
2778
  gfc_namespace *ns;
2779
  pointer_info *p;
2780
 
2781
  p = mio_pointer_ref (nsp);
2782
 
2783
  if (p->type == P_UNKNOWN)
2784
    p->type = P_NAMESPACE;
2785
 
2786
  if (iomode == IO_INPUT && p->integer != 0)
2787
    {
2788
      ns = (gfc_namespace *)p->u.pointer;
2789
      if (ns == NULL)
2790
        {
2791
          ns = gfc_get_namespace (NULL, 0);
2792
          associate_integer_pointer (p, ns);
2793
        }
2794
      else
2795
        ns->refs++;
2796
    }
2797
}
2798
 
2799
 
2800
/* Unlike most other routines, the address of the symbol node is
2801
   already fixed on input and the name/module has already been filled
2802
   in.  */
2803
 
2804
static void
2805
mio_symbol (gfc_symbol * sym)
2806
{
2807
  gfc_formal_arglist *formal;
2808
 
2809
  mio_lparen ();
2810
 
2811
  mio_symbol_attribute (&sym->attr);
2812
  mio_typespec (&sym->ts);
2813
 
2814
  /* Contained procedures don't have formal namespaces.  Instead we output the
2815
     procedure namespace.  The will contain the formal arguments.  */
2816
  if (iomode == IO_OUTPUT)
2817
    {
2818
      formal = sym->formal;
2819
      while (formal && !formal->sym)
2820
        formal = formal->next;
2821
 
2822
      if (formal)
2823
        mio_namespace_ref (&formal->sym->ns);
2824
      else
2825
        mio_namespace_ref (&sym->formal_ns);
2826
    }
2827
  else
2828
    {
2829
      mio_namespace_ref (&sym->formal_ns);
2830
      if (sym->formal_ns)
2831
        {
2832
          sym->formal_ns->proc_name = sym;
2833
          sym->refs++;
2834
        }
2835
    }
2836
 
2837
  /* Save/restore common block links */
2838
  mio_symbol_ref (&sym->common_next);
2839
 
2840
  mio_formal_arglist (sym);
2841
 
2842
  if (sym->attr.flavor == FL_PARAMETER)
2843
    mio_expr (&sym->value);
2844
 
2845
  mio_array_spec (&sym->as);
2846
 
2847
  mio_symbol_ref (&sym->result);
2848
 
2849
  if (sym->attr.cray_pointee)
2850
    mio_symbol_ref (&sym->cp_pointer);
2851
 
2852
  /* Note that components are always saved, even if they are supposed
2853
     to be private.  Component access is checked during searching.  */
2854
 
2855
  mio_component_list (&sym->components);
2856
 
2857
  if (sym->components != NULL)
2858
    sym->component_access =
2859
      MIO_NAME(gfc_access) (sym->component_access, access_types);
2860
 
2861
  mio_namelist (sym);
2862
  mio_rparen ();
2863
}
2864
 
2865
 
2866
/************************* Top level subroutines *************************/
2867
 
2868
/* Skip a list between balanced left and right parens.  */
2869
 
2870
static void
2871
skip_list (void)
2872
{
2873
  int level;
2874
 
2875
  level = 0;
2876
  do
2877
    {
2878
      switch (parse_atom ())
2879
        {
2880
        case ATOM_LPAREN:
2881
          level++;
2882
          break;
2883
 
2884
        case ATOM_RPAREN:
2885
          level--;
2886
          break;
2887
 
2888
        case ATOM_STRING:
2889
          gfc_free (atom_string);
2890
          break;
2891
 
2892
        case ATOM_NAME:
2893
        case ATOM_INTEGER:
2894
          break;
2895
        }
2896
    }
2897
  while (level > 0);
2898
}
2899
 
2900
 
2901
/* Load operator interfaces from the module.  Interfaces are unusual
2902
   in that they attach themselves to existing symbols.  */
2903
 
2904
static void
2905
load_operator_interfaces (void)
2906
{
2907
  const char *p;
2908
  char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2909
  gfc_user_op *uop;
2910
 
2911
  mio_lparen ();
2912
 
2913
  while (peek_atom () != ATOM_RPAREN)
2914
    {
2915
      mio_lparen ();
2916
 
2917
      mio_internal_string (name);
2918
      mio_internal_string (module);
2919
 
2920
      /* Decide if we need to load this one or not.  */
2921
      p = find_use_name (name);
2922
      if (p == NULL)
2923
        {
2924
          while (parse_atom () != ATOM_RPAREN);
2925
        }
2926
      else
2927
        {
2928
          uop = gfc_get_uop (p);
2929
          mio_interface_rest (&uop->operator);
2930
        }
2931
    }
2932
 
2933
  mio_rparen ();
2934
}
2935
 
2936
 
2937
/* Load interfaces from the module.  Interfaces are unusual in that
2938
   they attach themselves to existing symbols.  */
2939
 
2940
static void
2941
load_generic_interfaces (void)
2942
{
2943
  const char *p;
2944
  char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2945
  gfc_symbol *sym;
2946
 
2947
  mio_lparen ();
2948
 
2949
  while (peek_atom () != ATOM_RPAREN)
2950
    {
2951
      mio_lparen ();
2952
 
2953
      mio_internal_string (name);
2954
      mio_internal_string (module);
2955
 
2956
      /* Decide if we need to load this one or not.  */
2957
      p = find_use_name (name);
2958
 
2959
      if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2960
        {
2961
          while (parse_atom () != ATOM_RPAREN);
2962
          continue;
2963
        }
2964
 
2965
      if (sym == NULL)
2966
        {
2967
          gfc_get_symbol (p, NULL, &sym);
2968
 
2969
          sym->attr.flavor = FL_PROCEDURE;
2970
          sym->attr.generic = 1;
2971
          sym->attr.use_assoc = 1;
2972
        }
2973
 
2974
      mio_interface_rest (&sym->generic);
2975
    }
2976
 
2977
  mio_rparen ();
2978
}
2979
 
2980
 
2981
/* Load common blocks.  */
2982
 
2983
static void
2984
load_commons(void)
2985
{
2986
  char name[GFC_MAX_SYMBOL_LEN+1];
2987
  gfc_common_head *p;
2988
 
2989
  mio_lparen ();
2990
 
2991
  while (peek_atom () != ATOM_RPAREN)
2992
    {
2993
      mio_lparen ();
2994
      mio_internal_string (name);
2995
 
2996
      p = gfc_get_common (name, 1);
2997
 
2998
      mio_symbol_ref (&p->head);
2999
      mio_integer (&p->saved);
3000
      p->use_assoc = 1;
3001
 
3002
      mio_rparen();
3003
    }
3004
 
3005
  mio_rparen();
3006
}
3007
 
3008
/* load_equiv()-- Load equivalences. The flag in_load_equiv informs
3009
   mio_expr_ref of this so that unused variables are not loaded and
3010
   so that the expression can be safely freed.*/
3011
 
3012
static void
3013
load_equiv(void)
3014
{
3015
  gfc_equiv *head, *tail, *end, *eq;
3016
  bool unused;
3017
 
3018
  mio_lparen();
3019
  in_load_equiv = true;
3020
 
3021
  end = gfc_current_ns->equiv;
3022
  while(end != NULL && end->next != NULL)
3023
    end = end->next;
3024
 
3025
  while(peek_atom() != ATOM_RPAREN) {
3026
    mio_lparen();
3027
    head = tail = NULL;
3028
 
3029
    while(peek_atom() != ATOM_RPAREN)
3030
      {
3031
        if (head == NULL)
3032
          head = tail = gfc_get_equiv();
3033
        else
3034
          {
3035
            tail->eq = gfc_get_equiv();
3036
            tail = tail->eq;
3037
          }
3038
 
3039
        mio_pool_string(&tail->module);
3040
        mio_expr(&tail->expr);
3041
      }
3042
 
3043
    /* Unused variables have no symtree.  */
3044
    unused = false;
3045
    for (eq = head; eq; eq = eq->eq)
3046
      {
3047
        if (!eq->expr->symtree)
3048
          {
3049
            unused = true;
3050
            break;
3051
          }
3052
      }
3053
 
3054
    if (unused)
3055
      {
3056
        for (eq = head; eq; eq = head)
3057
          {
3058
            head = eq->eq;
3059
            gfc_free_expr (eq->expr);
3060
            gfc_free (eq);
3061
          }
3062
      }
3063
 
3064
    if (end == NULL)
3065
      gfc_current_ns->equiv = head;
3066
    else
3067
      end->next = head;
3068
 
3069
    if (head != NULL)
3070
      end = head;
3071
 
3072
    mio_rparen();
3073
  }
3074
 
3075
  mio_rparen();
3076
  in_load_equiv = false;
3077
}
3078
 
3079
/* Recursive function to traverse the pointer_info tree and load a
3080
   needed symbol.  We return nonzero if we load a symbol and stop the
3081
   traversal, because the act of loading can alter the tree.  */
3082
 
3083
static int
3084
load_needed (pointer_info * p)
3085
{
3086
  gfc_namespace *ns;
3087
  pointer_info *q;
3088
  gfc_symbol *sym;
3089
 
3090
  if (p == NULL)
3091
    return 0;
3092
  if (load_needed (p->left))
3093
    return 1;
3094
  if (load_needed (p->right))
3095
    return 1;
3096
 
3097
  if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3098
    return 0;
3099
 
3100
  p->u.rsym.state = USED;
3101
 
3102
  set_module_locus (&p->u.rsym.where);
3103
 
3104
  sym = p->u.rsym.sym;
3105
  if (sym == NULL)
3106
    {
3107
      q = get_integer (p->u.rsym.ns);
3108
 
3109
      ns = (gfc_namespace *) q->u.pointer;
3110
      if (ns == NULL)
3111
        {
3112
          /* Create an interface namespace if necessary.  These are
3113
             the namespaces that hold the formal parameters of module
3114
             procedures.  */
3115
 
3116
          ns = gfc_get_namespace (NULL, 0);
3117
          associate_integer_pointer (q, ns);
3118
        }
3119
 
3120
      sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3121
      sym->module = gfc_get_string (p->u.rsym.module);
3122
 
3123
      associate_integer_pointer (p, sym);
3124
    }
3125
 
3126
  mio_symbol (sym);
3127
  sym->attr.use_assoc = 1;
3128
 
3129
  return 1;
3130
}
3131
 
3132
 
3133
/* Recursive function for cleaning up things after a module has been
3134
   read.  */
3135
 
3136
static void
3137
read_cleanup (pointer_info * p)
3138
{
3139
  gfc_symtree *st;
3140
  pointer_info *q;
3141
 
3142
  if (p == NULL)
3143
    return;
3144
 
3145
  read_cleanup (p->left);
3146
  read_cleanup (p->right);
3147
 
3148
  if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3149
    {
3150
      /* Add hidden symbols to the symtree.  */
3151
      q = get_integer (p->u.rsym.ns);
3152
      st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3153
 
3154
      st->n.sym = p->u.rsym.sym;
3155
      st->n.sym->refs++;
3156
 
3157
      /* Fixup any symtree references.  */
3158
      p->u.rsym.symtree = st;
3159
      resolve_fixups (p->u.rsym.stfixup, st);
3160
      p->u.rsym.stfixup = NULL;
3161
    }
3162
 
3163
  /* Free unused symbols.  */
3164
  if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3165
    gfc_free_symbol (p->u.rsym.sym);
3166
}
3167
 
3168
 
3169
/* Read a module file.  */
3170
 
3171
static void
3172
read_module (void)
3173
{
3174
  module_locus operator_interfaces, user_operators;
3175
  const char *p;
3176
  char name[GFC_MAX_SYMBOL_LEN + 1];
3177
  gfc_intrinsic_op i;
3178
  int ambiguous, j, nuse, symbol;
3179
  pointer_info *info;
3180
  gfc_use_rename *u;
3181
  gfc_symtree *st;
3182
  gfc_symbol *sym;
3183
 
3184
  get_module_locus (&operator_interfaces);      /* Skip these for now */
3185
  skip_list ();
3186
 
3187
  get_module_locus (&user_operators);
3188
  skip_list ();
3189
  skip_list ();
3190
 
3191
  /* Skip commons and equivalences for now.  */
3192
  skip_list ();
3193
  skip_list ();
3194
 
3195
  mio_lparen ();
3196
 
3197
  /* Create the fixup nodes for all the symbols.  */
3198
 
3199
  while (peek_atom () != ATOM_RPAREN)
3200
    {
3201
      require_atom (ATOM_INTEGER);
3202
      info = get_integer (atom_int);
3203
 
3204
      info->type = P_SYMBOL;
3205
      info->u.rsym.state = UNUSED;
3206
 
3207
      mio_internal_string (info->u.rsym.true_name);
3208
      mio_internal_string (info->u.rsym.module);
3209
 
3210
      require_atom (ATOM_INTEGER);
3211
      info->u.rsym.ns = atom_int;
3212
 
3213
      get_module_locus (&info->u.rsym.where);
3214
      skip_list ();
3215
 
3216
      /* See if the symbol has already been loaded by a previous module.
3217
         If so, we reference the existing symbol and prevent it from
3218
         being loaded again.  */
3219
 
3220
      sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3221
 
3222
        /* See if the symbol has already been loaded by a previous module.
3223
         If so, we reference the existing symbol and prevent it from
3224
         being loaded again.  This should not happen if the symbol being
3225
         read is an index for an assumed shape dummy array (ns != 1).  */
3226
 
3227
      sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3228
 
3229
      if (sym == NULL
3230
           || (sym->attr.flavor == FL_VARIABLE
3231
               && info->u.rsym.ns !=1))
3232
        continue;
3233
 
3234
      info->u.rsym.state = USED;
3235
      info->u.rsym.referenced = 1;
3236
      info->u.rsym.sym = sym;
3237
    }
3238
 
3239
  mio_rparen ();
3240
 
3241
  /* Parse the symtree lists.  This lets us mark which symbols need to
3242
     be loaded.  Renaming is also done at this point by replacing the
3243
     symtree name.  */
3244
 
3245
  mio_lparen ();
3246
 
3247
  while (peek_atom () != ATOM_RPAREN)
3248
    {
3249
      mio_internal_string (name);
3250
      mio_integer (&ambiguous);
3251
      mio_integer (&symbol);
3252
 
3253
      info = get_integer (symbol);
3254
 
3255
      /* See how many use names there are.  If none, go through the start
3256
         of the loop at least once.  */
3257
      nuse = number_use_names (name);
3258
      if (nuse == 0)
3259
        nuse = 1;
3260
 
3261
      for (j = 1; j <= nuse; j++)
3262
        {
3263
          /* Get the jth local name for this symbol.  */
3264
          p = find_use_name_n (name, &j);
3265
 
3266
          /* Skip symtree nodes not in an ONLY clause.  */
3267
          if (p == NULL)
3268
            continue;
3269
 
3270
          /* Check for ambiguous symbols.  */
3271
          st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3272
 
3273
          if (st != NULL)
3274
            {
3275
              if (st->n.sym != info->u.rsym.sym)
3276
                st->ambiguous = 1;
3277
              info->u.rsym.symtree = st;
3278
            }
3279
          else
3280
            {
3281
              /* Create a symtree node in the current namespace for this symbol.  */
3282
              st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3283
              gfc_new_symtree (&gfc_current_ns->sym_root, p);
3284
 
3285
              st->ambiguous = ambiguous;
3286
 
3287
              sym = info->u.rsym.sym;
3288
 
3289
              /* Create a symbol node if it doesn't already exist.  */
3290
              if (sym == NULL)
3291
                {
3292
                  sym = info->u.rsym.sym =
3293
                      gfc_new_symbol (info->u.rsym.true_name,
3294
                                      gfc_current_ns);
3295
 
3296
                  sym->module = gfc_get_string (info->u.rsym.module);
3297
                }
3298
 
3299
              st->n.sym = sym;
3300
              st->n.sym->refs++;
3301
 
3302
              /* Store the symtree pointing to this symbol.  */
3303
              info->u.rsym.symtree = st;
3304
 
3305
              if (info->u.rsym.state == UNUSED)
3306
                info->u.rsym.state = NEEDED;
3307
              info->u.rsym.referenced = 1;
3308
            }
3309
        }
3310
    }
3311
 
3312
  mio_rparen ();
3313
 
3314
  /* Load intrinsic operator interfaces.  */
3315
  set_module_locus (&operator_interfaces);
3316
  mio_lparen ();
3317
 
3318
  for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3319
    {
3320
      if (i == INTRINSIC_USER)
3321
        continue;
3322
 
3323
      if (only_flag)
3324
        {
3325
          u = find_use_operator (i);
3326
 
3327
          if (u == NULL)
3328
            {
3329
              skip_list ();
3330
              continue;
3331
            }
3332
 
3333
          u->found = 1;
3334
        }
3335
 
3336
      mio_interface (&gfc_current_ns->operator[i]);
3337
    }
3338
 
3339
  mio_rparen ();
3340
 
3341
  /* Load generic and user operator interfaces.  These must follow the
3342
     loading of symtree because otherwise symbols can be marked as
3343
     ambiguous.  */
3344
 
3345
  set_module_locus (&user_operators);
3346
 
3347
  load_operator_interfaces ();
3348
  load_generic_interfaces ();
3349
 
3350
  load_commons ();
3351
  load_equiv();
3352
 
3353
  /* At this point, we read those symbols that are needed but haven't
3354
     been loaded yet.  If one symbol requires another, the other gets
3355
     marked as NEEDED if its previous state was UNUSED.  */
3356
 
3357
  while (load_needed (pi_root));
3358
 
3359
  /* Make sure all elements of the rename-list were found in the
3360
     module.  */
3361
 
3362
  for (u = gfc_rename_list; u; u = u->next)
3363
    {
3364
      if (u->found)
3365
        continue;
3366
 
3367
      if (u->operator == INTRINSIC_NONE)
3368
        {
3369
          gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3370
                     u->use_name, &u->where, module_name);
3371
          continue;
3372
        }
3373
 
3374
      if (u->operator == INTRINSIC_USER)
3375
        {
3376
          gfc_error
3377
            ("User operator '%s' referenced at %L not found in module '%s'",
3378
             u->use_name, &u->where, module_name);
3379
          continue;
3380
        }
3381
 
3382
      gfc_error
3383
        ("Intrinsic operator '%s' referenced at %L not found in module "
3384
         "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3385
    }
3386
 
3387
  gfc_check_interfaces (gfc_current_ns);
3388
 
3389
  /* Clean up symbol nodes that were never loaded, create references
3390
     to hidden symbols.  */
3391
 
3392
  read_cleanup (pi_root);
3393
}
3394
 
3395
 
3396
/* Given an access type that is specific to an entity and the default
3397
   access, return nonzero if the entity is publicly accessible.  */
3398
 
3399
bool
3400
gfc_check_access (gfc_access specific_access, gfc_access default_access)
3401
{
3402
 
3403
  if (specific_access == ACCESS_PUBLIC)
3404
    return TRUE;
3405
  if (specific_access == ACCESS_PRIVATE)
3406
    return FALSE;
3407
 
3408
  if (gfc_option.flag_module_access_private)
3409
    return default_access == ACCESS_PUBLIC;
3410
  else
3411
    return default_access != ACCESS_PRIVATE;
3412
 
3413
  return FALSE;
3414
}
3415
 
3416
 
3417
/* Write a common block to the module */
3418
 
3419
static void
3420
write_common (gfc_symtree *st)
3421
{
3422
  gfc_common_head *p;
3423
  const char * name;
3424
 
3425
  if (st == NULL)
3426
    return;
3427
 
3428
  write_common(st->left);
3429
  write_common(st->right);
3430
 
3431
  mio_lparen();
3432
 
3433
  /* Write the unmangled name.  */
3434
  name = st->n.common->name;
3435
 
3436
  mio_pool_string(&name);
3437
 
3438
  p = st->n.common;
3439
  mio_symbol_ref(&p->head);
3440
  mio_integer(&p->saved);
3441
 
3442
  mio_rparen();
3443
}
3444
 
3445
/* Write the blank common block to the module */
3446
 
3447
static void
3448
write_blank_common (void)
3449
{
3450
  const char * name = BLANK_COMMON_NAME;
3451
 
3452
  if (gfc_current_ns->blank_common.head == NULL)
3453
    return;
3454
 
3455
  mio_lparen();
3456
 
3457
  mio_pool_string(&name);
3458
 
3459
  mio_symbol_ref(&gfc_current_ns->blank_common.head);
3460
  mio_integer(&gfc_current_ns->blank_common.saved);
3461
 
3462
  mio_rparen();
3463
}
3464
 
3465
/* Write equivalences to the module.  */
3466
 
3467
static void
3468
write_equiv(void)
3469
{
3470
  gfc_equiv *eq, *e;
3471
  int num;
3472
 
3473
  num = 0;
3474
  for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3475
    {
3476
      mio_lparen();
3477
 
3478
      for(e=eq; e; e=e->eq)
3479
        {
3480
          if (e->module == NULL)
3481
            e->module = gfc_get_string("%s.eq.%d", module_name, num);
3482
          mio_allocated_string(e->module);
3483
          mio_expr(&e->expr);
3484
        }
3485
 
3486
      num++;
3487
      mio_rparen();
3488
    }
3489
}
3490
 
3491
/* Write a symbol to the module.  */
3492
 
3493
static void
3494
write_symbol (int n, gfc_symbol * sym)
3495
{
3496
 
3497
  if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3498
    gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3499
 
3500
  mio_integer (&n);
3501
  mio_pool_string (&sym->name);
3502
 
3503
  mio_pool_string (&sym->module);
3504
  mio_pointer_ref (&sym->ns);
3505
 
3506
  mio_symbol (sym);
3507
  write_char ('\n');
3508
}
3509
 
3510
 
3511
/* Recursive traversal function to write the initial set of symbols to
3512
   the module.  We check to see if the symbol should be written
3513
   according to the access specification.  */
3514
 
3515
static void
3516
write_symbol0 (gfc_symtree * st)
3517
{
3518
  gfc_symbol *sym;
3519
  pointer_info *p;
3520
 
3521
  if (st == NULL)
3522
    return;
3523
 
3524
  write_symbol0 (st->left);
3525
  write_symbol0 (st->right);
3526
 
3527
  sym = st->n.sym;
3528
  if (sym->module == NULL)
3529
    sym->module = gfc_get_string (module_name);
3530
 
3531
  if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3532
      && !sym->attr.subroutine && !sym->attr.function)
3533
    return;
3534
 
3535
  if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3536
    return;
3537
 
3538
  p = get_pointer (sym);
3539
  if (p->type == P_UNKNOWN)
3540
    p->type = P_SYMBOL;
3541
 
3542
  if (p->u.wsym.state == WRITTEN)
3543
    return;
3544
 
3545
  write_symbol (p->integer, sym);
3546
  p->u.wsym.state = WRITTEN;
3547
 
3548
  return;
3549
}
3550
 
3551
 
3552
/* Recursive traversal function to write the secondary set of symbols
3553
   to the module file.  These are symbols that were not public yet are
3554
   needed by the public symbols or another dependent symbol.  The act
3555
   of writing a symbol can modify the pointer_info tree, so we cease
3556
   traversal if we find a symbol to write.  We return nonzero if a
3557
   symbol was written and pass that information upwards.  */
3558
 
3559
static int
3560
write_symbol1 (pointer_info * p)
3561
{
3562
 
3563
  if (p == NULL)
3564
    return 0;
3565
 
3566
  if (write_symbol1 (p->left))
3567
    return 1;
3568
  if (write_symbol1 (p->right))
3569
    return 1;
3570
 
3571
  if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3572
    return 0;
3573
 
3574
  p->u.wsym.state = WRITTEN;
3575
  write_symbol (p->integer, p->u.wsym.sym);
3576
 
3577
  return 1;
3578
}
3579
 
3580
 
3581
/* Write operator interfaces associated with a symbol.  */
3582
 
3583
static void
3584
write_operator (gfc_user_op * uop)
3585
{
3586
  static char nullstring[] = "";
3587
  const char *p = nullstring;
3588
 
3589
  if (uop->operator == NULL
3590
      || !gfc_check_access (uop->access, uop->ns->default_access))
3591
    return;
3592
 
3593
  mio_symbol_interface (&uop->name, &p, &uop->operator);
3594
}
3595
 
3596
 
3597
/* Write generic interfaces associated with a symbol.  */
3598
 
3599
static void
3600
write_generic (gfc_symbol * sym)
3601
{
3602
 
3603
  if (sym->generic == NULL
3604
      || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3605
    return;
3606
 
3607
  mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3608
}
3609
 
3610
 
3611
static void
3612
write_symtree (gfc_symtree * st)
3613
{
3614
  gfc_symbol *sym;
3615
  pointer_info *p;
3616
 
3617
  sym = st->n.sym;
3618
  if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3619
      || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3620
          && !sym->attr.subroutine && !sym->attr.function))
3621
    return;
3622
 
3623
  if (check_unique_name (st->name))
3624
    return;
3625
 
3626
  p = find_pointer (sym);
3627
  if (p == NULL)
3628
    gfc_internal_error ("write_symtree(): Symbol not written");
3629
 
3630
  mio_pool_string (&st->name);
3631
  mio_integer (&st->ambiguous);
3632
  mio_integer (&p->integer);
3633
}
3634
 
3635
 
3636
static void
3637
write_module (void)
3638
{
3639
  gfc_intrinsic_op i;
3640
 
3641
  /* Write the operator interfaces.  */
3642
  mio_lparen ();
3643
 
3644
  for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3645
    {
3646
      if (i == INTRINSIC_USER)
3647
        continue;
3648
 
3649
      mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3650
                                       gfc_current_ns->default_access)
3651
                     ? &gfc_current_ns->operator[i] : NULL);
3652
    }
3653
 
3654
  mio_rparen ();
3655
  write_char ('\n');
3656
  write_char ('\n');
3657
 
3658
  mio_lparen ();
3659
  gfc_traverse_user_op (gfc_current_ns, write_operator);
3660
  mio_rparen ();
3661
  write_char ('\n');
3662
  write_char ('\n');
3663
 
3664
  mio_lparen ();
3665
  gfc_traverse_ns (gfc_current_ns, write_generic);
3666
  mio_rparen ();
3667
  write_char ('\n');
3668
  write_char ('\n');
3669
 
3670
  mio_lparen ();
3671
  write_blank_common ();
3672
  write_common (gfc_current_ns->common_root);
3673
  mio_rparen ();
3674
  write_char ('\n');
3675
  write_char ('\n');
3676
 
3677
  mio_lparen();
3678
  write_equiv();
3679
  mio_rparen();
3680
  write_char('\n');  write_char('\n');
3681
 
3682
  /* Write symbol information.  First we traverse all symbols in the
3683
     primary namespace, writing those that need to be written.
3684
     Sometimes writing one symbol will cause another to need to be
3685
     written.  A list of these symbols ends up on the write stack, and
3686
     we end by popping the bottom of the stack and writing the symbol
3687
     until the stack is empty.  */
3688
 
3689
  mio_lparen ();
3690
 
3691
  write_symbol0 (gfc_current_ns->sym_root);
3692
  while (write_symbol1 (pi_root));
3693
 
3694
  mio_rparen ();
3695
 
3696
  write_char ('\n');
3697
  write_char ('\n');
3698
 
3699
  mio_lparen ();
3700
  gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3701
  mio_rparen ();
3702
}
3703
 
3704
 
3705
/* Given module, dump it to disk.  If there was an error while
3706
   processing the module, dump_flag will be set to zero and we delete
3707
   the module file, even if it was already there.  */
3708
 
3709
void
3710
gfc_dump_module (const char *name, int dump_flag)
3711
{
3712
  int n;
3713
  char *filename, *p;
3714
  time_t now;
3715
 
3716
  n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3717
  if (gfc_option.module_dir != NULL)
3718
    {
3719
      filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3720
      strcpy (filename, gfc_option.module_dir);
3721
      strcat (filename, name);
3722
    }
3723
  else
3724
    {
3725
      filename = (char *) alloca (n);
3726
      strcpy (filename, name);
3727
    }
3728
  strcat (filename, MODULE_EXTENSION);
3729
 
3730
  if (!dump_flag)
3731
    {
3732
      unlink (filename);
3733
      return;
3734
    }
3735
 
3736
  module_fp = fopen (filename, "w");
3737
  if (module_fp == NULL)
3738
    gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3739
                     filename, strerror (errno));
3740
 
3741
  now = time (NULL);
3742
  p = ctime (&now);
3743
 
3744
  *strchr (p, '\n') = '\0';
3745
 
3746
  fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3747
           gfc_source_file, p);
3748
  fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3749
 
3750
  iomode = IO_OUTPUT;
3751
  strcpy (module_name, name);
3752
 
3753
  init_pi_tree ();
3754
 
3755
  write_module ();
3756
 
3757
  free_pi_tree (pi_root);
3758
  pi_root = NULL;
3759
 
3760
  write_char ('\n');
3761
 
3762
  if (fclose (module_fp))
3763
    gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3764
                     filename, strerror (errno));
3765
}
3766
 
3767
 
3768
/* Process a USE directive.  */
3769
 
3770
void
3771
gfc_use_module (void)
3772
{
3773
  char *filename;
3774
  gfc_state_data *p;
3775
  int c, line;
3776
 
3777
  filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
3778
                             + 1);
3779
  strcpy (filename, module_name);
3780
  strcat (filename, MODULE_EXTENSION);
3781
 
3782
  module_fp = gfc_open_included_file (filename, true);
3783
  if (module_fp == NULL)
3784
    gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3785
                     filename, strerror (errno));
3786
 
3787
  iomode = IO_INPUT;
3788
  module_line = 1;
3789
  module_column = 1;
3790
 
3791
  /* Skip the first two lines of the module.  */
3792
  /* FIXME: Could also check for valid two lines here, instead.  */
3793
  line = 0;
3794
  while (line < 2)
3795
    {
3796
      c = module_char ();
3797
      if (c == EOF)
3798
        bad_module ("Unexpected end of module");
3799
      if (c == '\n')
3800
        line++;
3801
    }
3802
 
3803
  /* Make sure we're not reading the same module that we may be building.  */
3804
  for (p = gfc_state_stack; p; p = p->previous)
3805
    if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3806
      gfc_fatal_error ("Can't USE the same module we're building!");
3807
 
3808
  init_pi_tree ();
3809
  init_true_name_tree ();
3810
 
3811
  read_module ();
3812
 
3813
  free_true_name (true_name_root);
3814
  true_name_root = NULL;
3815
 
3816
  free_pi_tree (pi_root);
3817
  pi_root = NULL;
3818
 
3819
  fclose (module_fp);
3820
}
3821
 
3822
 
3823
void
3824
gfc_module_init_2 (void)
3825
{
3826
 
3827
  last_atom = ATOM_LPAREN;
3828
}
3829
 
3830
 
3831
void
3832
gfc_module_done_2 (void)
3833
{
3834
 
3835
  free_rename ();
3836
}

powered by: WebSVN 2.1.0

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