OSDN Git Service

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