OSDN Git Service

PR fortran/20811
[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 Free Software Foundation, 
4    Inc.
5    Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING.  If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA.  */
23
24 /* The syntax of gfortran modules resembles that of lisp lists, ie a
25    sequence of atoms, which can be left or right parenthesis, names,
26    integers or strings.  Parenthesis are always matched which allows
27    us to skip over sections at high speed without having to know
28    anything about the internal structure of the lists.  A "name" is
29    usually a fortran 95 identifier, but can also start with '@' in
30    order to reference a hidden symbol.
31
32    The first line of a module is an informational message about what
33    created the module, the file it came from and when it was created.
34    The second line is a warning for people not to edit the module.
35    The rest of the module looks like:
36
37    ( ( <Interface info for UPLUS> )
38      ( <Interface info for UMINUS> )
39      ...
40    )
41    ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42      ...
43    )
44    ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45      ...
46    )
47    ( ( <common name> <symbol> <saved flag>)
48      ...
49    )
50
51    ( equivalence list )
52
53    ( <Symbol Number (in no particular order)>
54      <True name of symbol>
55      <Module name of symbol>
56      ( <symbol information> )
57      ...
58    )
59    ( <Symtree name>
60      <Ambiguous flag>
61      <Symbol number>
62      ...
63    )
64
65    In general, symbols refer to other symbols by their symbol number,
66    which are zero based.  Symbols are written to the module in no
67    particular order.  */
68
69 #include "config.h"
70 #include "system.h"
71 #include "gfortran.h"
72 #include "arith.h"
73 #include "match.h"
74 #include "parse.h" /* FIXME */
75
76 #define MODULE_EXTENSION ".mod"
77
78
79 /* Structure that describes a position within a module file.  */
80
81 typedef struct
82 {
83   int column, line;
84   fpos_t pos;
85 }
86 module_locus;
87
88
89 typedef enum
90 {
91   P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
92 }
93 pointer_t;
94
95 /* The fixup structure lists pointers to pointers that have to
96    be updated when a pointer value becomes known.  */
97
98 typedef struct fixup_t
99 {
100   void **pointer;
101   struct fixup_t *next;
102 }
103 fixup_t;
104
105
106 /* Structure for holding extra info needed for pointers being read.  */
107
108 typedef struct pointer_info
109 {
110   BBT_HEADER (pointer_info);
111   int integer;
112   pointer_t type;
113
114   /* The first component of each member of the union is the pointer
115      being stored.  */
116
117   fixup_t *fixup;
118
119   union
120   {
121     void *pointer;      /* Member for doing pointer searches.  */
122
123     struct
124     {
125       gfc_symbol *sym;
126       char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
127       enum
128       { UNUSED, NEEDED, USED }
129       state;
130       int ns, referenced;
131       module_locus where;
132       fixup_t *stfixup;
133       gfc_symtree *symtree;
134     }
135     rsym;
136
137     struct
138     {
139       gfc_symbol *sym;
140       enum
141       { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
142       state;
143     }
144     wsym;
145   }
146   u;
147
148 }
149 pointer_info;
150
151 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
152
153
154 /* Lists of rename info for the USE statement.  */
155
156 typedef struct gfc_use_rename
157 {
158   char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
159   struct gfc_use_rename *next;
160   int found;
161   gfc_intrinsic_op operator;
162   locus where;
163 }
164 gfc_use_rename;
165
166 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
167
168 /* Local variables */
169
170 /* The FILE for the module we're reading or writing.  */
171 static FILE *module_fp;
172
173 /* The name of the module we're reading (USE'ing) or writing.  */
174 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
175
176 static int module_line, module_column, only_flag;
177 static enum
178 { IO_INPUT, IO_OUTPUT }
179 iomode;
180
181 static gfc_use_rename *gfc_rename_list;
182 static pointer_info *pi_root;
183 static int symbol_number;       /* Counter for assigning symbol numbers */
184
185
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
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 ("DUMMY", AB_DUMMY),
1450     minit ("RESULT", AB_RESULT),
1451     minit ("DATA", AB_DATA),
1452     minit ("IN_NAMELIST", AB_IN_NAMELIST),
1453     minit ("IN_COMMON", AB_IN_COMMON),
1454     minit ("FUNCTION", AB_FUNCTION),
1455     minit ("SUBROUTINE", AB_SUBROUTINE),
1456     minit ("SEQUENCE", AB_SEQUENCE),
1457     minit ("ELEMENTAL", AB_ELEMENTAL),
1458     minit ("PURE", AB_PURE),
1459     minit ("RECURSIVE", AB_RECURSIVE),
1460     minit ("GENERIC", AB_GENERIC),
1461     minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1462     minit ("CRAY_POINTER", AB_CRAY_POINTER),
1463     minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1464     minit (NULL, -1)
1465 };
1466
1467 /* Specialization of mio_name.  */
1468 DECL_MIO_NAME(ab_attribute)
1469 DECL_MIO_NAME(ar_type)
1470 DECL_MIO_NAME(array_type)
1471 DECL_MIO_NAME(bt)
1472 DECL_MIO_NAME(expr_t)
1473 DECL_MIO_NAME(gfc_access)
1474 DECL_MIO_NAME(gfc_intrinsic_op)
1475 DECL_MIO_NAME(ifsrc)
1476 DECL_MIO_NAME(procedure_type)
1477 DECL_MIO_NAME(ref_type)
1478 DECL_MIO_NAME(sym_flavor)
1479 DECL_MIO_NAME(sym_intent)
1480 #undef DECL_MIO_NAME
1481
1482 /* Symbol attributes are stored in list with the first three elements
1483    being the enumerated fields, while the remaining elements (if any)
1484    indicate the individual attribute bits.  The access field is not
1485    saved-- it controls what symbols are exported when a module is
1486    written.  */
1487
1488 static void
1489 mio_symbol_attribute (symbol_attribute * attr)
1490 {
1491   atom_type t;
1492
1493   mio_lparen ();
1494
1495   attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1496   attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1497   attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1498   attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1499
1500   if (iomode == IO_OUTPUT)
1501     {
1502       if (attr->allocatable)
1503         MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1504       if (attr->dimension)
1505         MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1506       if (attr->external)
1507         MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1508       if (attr->intrinsic)
1509         MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1510       if (attr->optional)
1511         MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1512       if (attr->pointer)
1513         MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1514       if (attr->save)
1515         MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1516       if (attr->target)
1517         MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1518       if (attr->dummy)
1519         MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1520       if (attr->result)
1521         MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1522       /* We deliberately don't preserve the "entry" flag.  */
1523
1524       if (attr->data)
1525         MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1526       if (attr->in_namelist)
1527         MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1528       if (attr->in_common)
1529         MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1530
1531       if (attr->function)
1532         MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1533       if (attr->subroutine)
1534         MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1535       if (attr->generic)
1536         MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1537
1538       if (attr->sequence)
1539         MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1540       if (attr->elemental)
1541         MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1542       if (attr->pure)
1543         MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1544       if (attr->recursive)
1545         MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1546       if (attr->always_explicit)
1547         MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1548       if (attr->cray_pointer)
1549         MIO_NAME(ab_attribute) (AB_CRAY_POINTER, attr_bits);
1550       if (attr->cray_pointee)
1551         MIO_NAME(ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1552
1553       mio_rparen ();
1554
1555     }
1556   else
1557     {
1558
1559       for (;;)
1560         {
1561           t = parse_atom ();
1562           if (t == ATOM_RPAREN)
1563             break;
1564           if (t != ATOM_NAME)
1565             bad_module ("Expected attribute bit name");
1566
1567           switch ((ab_attribute) find_enum (attr_bits))
1568             {
1569             case AB_ALLOCATABLE:
1570               attr->allocatable = 1;
1571               break;
1572             case AB_DIMENSION:
1573               attr->dimension = 1;
1574               break;
1575             case AB_EXTERNAL:
1576               attr->external = 1;
1577               break;
1578             case AB_INTRINSIC:
1579               attr->intrinsic = 1;
1580               break;
1581             case AB_OPTIONAL:
1582               attr->optional = 1;
1583               break;
1584             case AB_POINTER:
1585               attr->pointer = 1;
1586               break;
1587             case AB_SAVE:
1588               attr->save = 1;
1589               break;
1590             case AB_TARGET:
1591               attr->target = 1;
1592               break;
1593             case AB_DUMMY:
1594               attr->dummy = 1;
1595               break;
1596             case AB_RESULT:
1597               attr->result = 1;
1598               break;
1599             case AB_DATA:
1600               attr->data = 1;
1601               break;
1602             case AB_IN_NAMELIST:
1603               attr->in_namelist = 1;
1604               break;
1605             case AB_IN_COMMON:
1606               attr->in_common = 1;
1607               break;
1608             case AB_FUNCTION:
1609               attr->function = 1;
1610               break;
1611             case AB_SUBROUTINE:
1612               attr->subroutine = 1;
1613               break;
1614             case AB_GENERIC:
1615               attr->generic = 1;
1616               break;
1617             case AB_SEQUENCE:
1618               attr->sequence = 1;
1619               break;
1620             case AB_ELEMENTAL:
1621               attr->elemental = 1;
1622               break;
1623             case AB_PURE:
1624               attr->pure = 1;
1625               break;
1626             case AB_RECURSIVE:
1627               attr->recursive = 1;
1628               break;
1629             case AB_ALWAYS_EXPLICIT:
1630               attr->always_explicit = 1;
1631               break;
1632             case AB_CRAY_POINTER:
1633               attr->cray_pointer = 1;
1634               break;
1635             case AB_CRAY_POINTEE:
1636               attr->cray_pointee = 1;
1637               break;
1638             }
1639         }
1640     }
1641 }
1642
1643
1644 static const mstring bt_types[] = {
1645     minit ("INTEGER", BT_INTEGER),
1646     minit ("REAL", BT_REAL),
1647     minit ("COMPLEX", BT_COMPLEX),
1648     minit ("LOGICAL", BT_LOGICAL),
1649     minit ("CHARACTER", BT_CHARACTER),
1650     minit ("DERIVED", BT_DERIVED),
1651     minit ("PROCEDURE", BT_PROCEDURE),
1652     minit ("UNKNOWN", BT_UNKNOWN),
1653     minit (NULL, -1)
1654 };
1655
1656
1657 static void
1658 mio_charlen (gfc_charlen ** clp)
1659 {
1660   gfc_charlen *cl;
1661
1662   mio_lparen ();
1663
1664   if (iomode == IO_OUTPUT)
1665     {
1666       cl = *clp;
1667       if (cl != NULL)
1668         mio_expr (&cl->length);
1669     }
1670   else
1671     {
1672
1673       if (peek_atom () != ATOM_RPAREN)
1674         {
1675           cl = gfc_get_charlen ();
1676           mio_expr (&cl->length);
1677
1678           *clp = cl;
1679
1680           cl->next = gfc_current_ns->cl_list;
1681           gfc_current_ns->cl_list = cl;
1682         }
1683     }
1684
1685   mio_rparen ();
1686 }
1687
1688
1689 /* Return a symtree node with a name that is guaranteed to be unique
1690    within the namespace and corresponds to an illegal fortran name.  */
1691
1692 static gfc_symtree *
1693 get_unique_symtree (gfc_namespace * ns)
1694 {
1695   char name[GFC_MAX_SYMBOL_LEN + 1];
1696   static int serial = 0;
1697
1698   sprintf (name, "@%d", serial++);
1699   return gfc_new_symtree (&ns->sym_root, name);
1700 }
1701
1702
1703 /* See if a name is a generated name.  */
1704
1705 static int
1706 check_unique_name (const char *name)
1707 {
1708
1709   return *name == '@';
1710 }
1711
1712
1713 static void
1714 mio_typespec (gfc_typespec * ts)
1715 {
1716
1717   mio_lparen ();
1718
1719   ts->type = MIO_NAME(bt) (ts->type, bt_types);
1720
1721   if (ts->type != BT_DERIVED)
1722     mio_integer (&ts->kind);
1723   else
1724     mio_symbol_ref (&ts->derived);
1725
1726   mio_charlen (&ts->cl);
1727
1728   mio_rparen ();
1729 }
1730
1731
1732 static const mstring array_spec_types[] = {
1733     minit ("EXPLICIT", AS_EXPLICIT),
1734     minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1735     minit ("DEFERRED", AS_DEFERRED),
1736     minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1737     minit (NULL, -1)
1738 };
1739
1740
1741 static void
1742 mio_array_spec (gfc_array_spec ** asp)
1743 {
1744   gfc_array_spec *as;
1745   int i;
1746
1747   mio_lparen ();
1748
1749   if (iomode == IO_OUTPUT)
1750     {
1751       if (*asp == NULL)
1752         goto done;
1753       as = *asp;
1754     }
1755   else
1756     {
1757       if (peek_atom () == ATOM_RPAREN)
1758         {
1759           *asp = NULL;
1760           goto done;
1761         }
1762
1763       *asp = as = gfc_get_array_spec ();
1764     }
1765
1766   mio_integer (&as->rank);
1767   as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1768
1769   for (i = 0; i < as->rank; i++)
1770     {
1771       mio_expr (&as->lower[i]);
1772       mio_expr (&as->upper[i]);
1773     }
1774
1775 done:
1776   mio_rparen ();
1777 }
1778
1779
1780 /* Given a pointer to an array reference structure (which lives in a
1781    gfc_ref structure), find the corresponding array specification
1782    structure.  Storing the pointer in the ref structure doesn't quite
1783    work when loading from a module. Generating code for an array
1784    reference also needs more information than just the array spec.  */
1785
1786 static const mstring array_ref_types[] = {
1787     minit ("FULL", AR_FULL),
1788     minit ("ELEMENT", AR_ELEMENT),
1789     minit ("SECTION", AR_SECTION),
1790     minit (NULL, -1)
1791 };
1792
1793 static void
1794 mio_array_ref (gfc_array_ref * ar)
1795 {
1796   int i;
1797
1798   mio_lparen ();
1799   ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1800   mio_integer (&ar->dimen);
1801
1802   switch (ar->type)
1803     {
1804     case AR_FULL:
1805       break;
1806
1807     case AR_ELEMENT:
1808       for (i = 0; i < ar->dimen; i++)
1809         mio_expr (&ar->start[i]);
1810
1811       break;
1812
1813     case AR_SECTION:
1814       for (i = 0; i < ar->dimen; i++)
1815         {
1816           mio_expr (&ar->start[i]);
1817           mio_expr (&ar->end[i]);
1818           mio_expr (&ar->stride[i]);
1819         }
1820
1821       break;
1822
1823     case AR_UNKNOWN:
1824       gfc_internal_error ("mio_array_ref(): Unknown array ref");
1825     }
1826
1827   for (i = 0; i < ar->dimen; i++)
1828     mio_integer ((int *) &ar->dimen_type[i]);
1829
1830   if (iomode == IO_INPUT)
1831     {
1832       ar->where = gfc_current_locus;
1833
1834       for (i = 0; i < ar->dimen; i++)
1835         ar->c_where[i] = gfc_current_locus;
1836     }
1837
1838   mio_rparen ();
1839 }
1840
1841
1842 /* Saves or restores a pointer.  The pointer is converted back and
1843    forth from an integer.  We return the pointer_info pointer so that
1844    the caller can take additional action based on the pointer type.  */
1845
1846 static pointer_info *
1847 mio_pointer_ref (void *gp)
1848 {
1849   pointer_info *p;
1850
1851   if (iomode == IO_OUTPUT)
1852     {
1853       p = get_pointer (*((char **) gp));
1854       write_atom (ATOM_INTEGER, &p->integer);
1855     }
1856   else
1857     {
1858       require_atom (ATOM_INTEGER);
1859       p = add_fixup (atom_int, gp);
1860     }
1861
1862   return p;
1863 }
1864
1865
1866 /* Save and load references to components that occur within
1867    expressions.  We have to describe these references by a number and
1868    by name.  The number is necessary for forward references during
1869    reading, and the name is necessary if the symbol already exists in
1870    the namespace and is not loaded again.  */
1871
1872 static void
1873 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1874 {
1875   char name[GFC_MAX_SYMBOL_LEN + 1];
1876   gfc_component *q;
1877   pointer_info *p;
1878
1879   p = mio_pointer_ref (cp);
1880   if (p->type == P_UNKNOWN)
1881     p->type = P_COMPONENT;
1882
1883   if (iomode == IO_OUTPUT)
1884     mio_pool_string (&(*cp)->name);
1885   else
1886     {
1887       mio_internal_string (name);
1888
1889       /* It can happen that a component reference can be read before the
1890          associated derived type symbol has been loaded. Return now and
1891          wait for a later iteration of load_needed.  */
1892       if (sym == NULL)
1893         return;
1894
1895       if (sym->components != NULL && p->u.pointer == NULL)
1896         {
1897           /* Symbol already loaded, so search by name.  */
1898           for (q = sym->components; q; q = q->next)
1899             if (strcmp (q->name, name) == 0)
1900               break;
1901
1902           if (q == NULL)
1903             gfc_internal_error ("mio_component_ref(): Component not found");
1904
1905           associate_integer_pointer (p, q);
1906         }
1907
1908       /* Make sure this symbol will eventually be loaded.  */
1909       p = find_pointer2 (sym);
1910       if (p->u.rsym.state == UNUSED)
1911         p->u.rsym.state = NEEDED;
1912     }
1913 }
1914
1915
1916 static void
1917 mio_component (gfc_component * c)
1918 {
1919   pointer_info *p;
1920   int n;
1921
1922   mio_lparen ();
1923
1924   if (iomode == IO_OUTPUT)
1925     {
1926       p = get_pointer (c);
1927       mio_integer (&p->integer);
1928     }
1929   else
1930     {
1931       mio_integer (&n);
1932       p = get_integer (n);
1933       associate_integer_pointer (p, c);
1934     }
1935
1936   if (p->type == P_UNKNOWN)
1937     p->type = P_COMPONENT;
1938
1939   mio_pool_string (&c->name);
1940   mio_typespec (&c->ts);
1941   mio_array_spec (&c->as);
1942
1943   mio_integer (&c->dimension);
1944   mio_integer (&c->pointer);
1945
1946   mio_expr (&c->initializer);
1947   mio_rparen ();
1948 }
1949
1950
1951 static void
1952 mio_component_list (gfc_component ** cp)
1953 {
1954   gfc_component *c, *tail;
1955
1956   mio_lparen ();
1957
1958   if (iomode == IO_OUTPUT)
1959     {
1960       for (c = *cp; c; c = c->next)
1961         mio_component (c);
1962     }
1963   else
1964     {
1965
1966       *cp = NULL;
1967       tail = NULL;
1968
1969       for (;;)
1970         {
1971           if (peek_atom () == ATOM_RPAREN)
1972             break;
1973
1974           c = gfc_get_component ();
1975           mio_component (c);
1976
1977           if (tail == NULL)
1978             *cp = c;
1979           else
1980             tail->next = c;
1981
1982           tail = c;
1983         }
1984     }
1985
1986   mio_rparen ();
1987 }
1988
1989
1990 static void
1991 mio_actual_arg (gfc_actual_arglist * a)
1992 {
1993
1994   mio_lparen ();
1995   mio_pool_string (&a->name);
1996   mio_expr (&a->expr);
1997   mio_rparen ();
1998 }
1999
2000
2001 static void
2002 mio_actual_arglist (gfc_actual_arglist ** ap)
2003 {
2004   gfc_actual_arglist *a, *tail;
2005
2006   mio_lparen ();
2007
2008   if (iomode == IO_OUTPUT)
2009     {
2010       for (a = *ap; a; a = a->next)
2011         mio_actual_arg (a);
2012
2013     }
2014   else
2015     {
2016       tail = NULL;
2017
2018       for (;;)
2019         {
2020           if (peek_atom () != ATOM_LPAREN)
2021             break;
2022
2023           a = gfc_get_actual_arglist ();
2024
2025           if (tail == NULL)
2026             *ap = a;
2027           else
2028             tail->next = a;
2029
2030           tail = a;
2031           mio_actual_arg (a);
2032         }
2033     }
2034
2035   mio_rparen ();
2036 }
2037
2038
2039 /* Read and write formal argument lists.  */
2040
2041 static void
2042 mio_formal_arglist (gfc_symbol * sym)
2043 {
2044   gfc_formal_arglist *f, *tail;
2045
2046   mio_lparen ();
2047
2048   if (iomode == IO_OUTPUT)
2049     {
2050       for (f = sym->formal; f; f = f->next)
2051         mio_symbol_ref (&f->sym);
2052
2053     }
2054   else
2055     {
2056       sym->formal = tail = NULL;
2057
2058       while (peek_atom () != ATOM_RPAREN)
2059         {
2060           f = gfc_get_formal_arglist ();
2061           mio_symbol_ref (&f->sym);
2062
2063           if (sym->formal == NULL)
2064             sym->formal = f;
2065           else
2066             tail->next = f;
2067
2068           tail = f;
2069         }
2070     }
2071
2072   mio_rparen ();
2073 }
2074
2075
2076 /* Save or restore a reference to a symbol node.  */
2077
2078 void
2079 mio_symbol_ref (gfc_symbol ** symp)
2080 {
2081   pointer_info *p;
2082
2083   p = mio_pointer_ref (symp);
2084   if (p->type == P_UNKNOWN)
2085     p->type = P_SYMBOL;
2086
2087   if (iomode == IO_OUTPUT)
2088     {
2089       if (p->u.wsym.state == UNREFERENCED)
2090         p->u.wsym.state = NEEDS_WRITE;
2091     }
2092   else
2093     {
2094       if (p->u.rsym.state == UNUSED)
2095         p->u.rsym.state = NEEDED;
2096     }
2097 }
2098
2099
2100 /* Save or restore a reference to a symtree node.  */
2101
2102 static void
2103 mio_symtree_ref (gfc_symtree ** stp)
2104 {
2105   pointer_info *p;
2106   fixup_t *f;
2107   gfc_symtree * ns_st = NULL;
2108
2109   if (iomode == IO_OUTPUT)
2110     {
2111       /* If this is a symtree for a symbol that came from a contained module
2112          namespace, it has a unique name and we should look in the current
2113          namespace to see if the required, non-contained symbol is available
2114          yet. If so, the latter should be written.  */
2115       if ((*stp)->n.sym && check_unique_name((*stp)->name))
2116         ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2117                                     (*stp)->n.sym->name);
2118
2119       /* On the other hand, if the existing symbol is the module name or the
2120          new symbol is a dummy argument, do not do the promotion.  */
2121       if (ns_st && ns_st->n.sym
2122             && ns_st->n.sym->attr.flavor != FL_MODULE
2123             && !(*stp)->n.sym->attr.dummy)
2124         mio_symbol_ref (&ns_st->n.sym);
2125       else
2126         mio_symbol_ref (&(*stp)->n.sym);
2127     }
2128   else
2129     {
2130       require_atom (ATOM_INTEGER);
2131       p = get_integer (atom_int);
2132       if (p->type == P_UNKNOWN)
2133         p->type = P_SYMBOL;
2134
2135       if (p->u.rsym.state == UNUSED)
2136         p->u.rsym.state = NEEDED;
2137
2138       if (p->u.rsym.symtree != NULL)
2139         {
2140           *stp = p->u.rsym.symtree;
2141         }
2142       else
2143         {
2144           f = gfc_getmem (sizeof (fixup_t));
2145
2146           f->next = p->u.rsym.stfixup;
2147           p->u.rsym.stfixup = f;
2148
2149           f->pointer = (void **)stp;
2150         }
2151     }
2152 }
2153
2154 static void
2155 mio_iterator (gfc_iterator ** ip)
2156 {
2157   gfc_iterator *iter;
2158
2159   mio_lparen ();
2160
2161   if (iomode == IO_OUTPUT)
2162     {
2163       if (*ip == NULL)
2164         goto done;
2165     }
2166   else
2167     {
2168       if (peek_atom () == ATOM_RPAREN)
2169         {
2170           *ip = NULL;
2171           goto done;
2172         }
2173
2174       *ip = gfc_get_iterator ();
2175     }
2176
2177   iter = *ip;
2178
2179   mio_expr (&iter->var);
2180   mio_expr (&iter->start);
2181   mio_expr (&iter->end);
2182   mio_expr (&iter->step);
2183
2184 done:
2185   mio_rparen ();
2186 }
2187
2188
2189
2190 static void
2191 mio_constructor (gfc_constructor ** cp)
2192 {
2193   gfc_constructor *c, *tail;
2194
2195   mio_lparen ();
2196
2197   if (iomode == IO_OUTPUT)
2198     {
2199       for (c = *cp; c; c = c->next)
2200         {
2201           mio_lparen ();
2202           mio_expr (&c->expr);
2203           mio_iterator (&c->iterator);
2204           mio_rparen ();
2205         }
2206     }
2207   else
2208     {
2209
2210       *cp = NULL;
2211       tail = NULL;
2212
2213       while (peek_atom () != ATOM_RPAREN)
2214         {
2215           c = gfc_get_constructor ();
2216
2217           if (tail == NULL)
2218             *cp = c;
2219           else
2220             tail->next = c;
2221
2222           tail = c;
2223
2224           mio_lparen ();
2225           mio_expr (&c->expr);
2226           mio_iterator (&c->iterator);
2227           mio_rparen ();
2228         }
2229     }
2230
2231   mio_rparen ();
2232 }
2233
2234
2235
2236 static const mstring ref_types[] = {
2237     minit ("ARRAY", REF_ARRAY),
2238     minit ("COMPONENT", REF_COMPONENT),
2239     minit ("SUBSTRING", REF_SUBSTRING),
2240     minit (NULL, -1)
2241 };
2242
2243
2244 static void
2245 mio_ref (gfc_ref ** rp)
2246 {
2247   gfc_ref *r;
2248
2249   mio_lparen ();
2250
2251   r = *rp;
2252   r->type = MIO_NAME(ref_type) (r->type, ref_types);
2253
2254   switch (r->type)
2255     {
2256     case REF_ARRAY:
2257       mio_array_ref (&r->u.ar);
2258       break;
2259
2260     case REF_COMPONENT:
2261       mio_symbol_ref (&r->u.c.sym);
2262       mio_component_ref (&r->u.c.component, r->u.c.sym);
2263       break;
2264
2265     case REF_SUBSTRING:
2266       mio_expr (&r->u.ss.start);
2267       mio_expr (&r->u.ss.end);
2268       mio_charlen (&r->u.ss.length);
2269       break;
2270     }
2271
2272   mio_rparen ();
2273 }
2274
2275
2276 static void
2277 mio_ref_list (gfc_ref ** rp)
2278 {
2279   gfc_ref *ref, *head, *tail;
2280
2281   mio_lparen ();
2282
2283   if (iomode == IO_OUTPUT)
2284     {
2285       for (ref = *rp; ref; ref = ref->next)
2286         mio_ref (&ref);
2287     }
2288   else
2289     {
2290       head = tail = NULL;
2291
2292       while (peek_atom () != ATOM_RPAREN)
2293         {
2294           if (head == NULL)
2295             head = tail = gfc_get_ref ();
2296           else
2297             {
2298               tail->next = gfc_get_ref ();
2299               tail = tail->next;
2300             }
2301
2302           mio_ref (&tail);
2303         }
2304
2305       *rp = head;
2306     }
2307
2308   mio_rparen ();
2309 }
2310
2311
2312 /* Read and write an integer value.  */
2313
2314 static void
2315 mio_gmp_integer (mpz_t * integer)
2316 {
2317   char *p;
2318
2319   if (iomode == IO_INPUT)
2320     {
2321       if (parse_atom () != ATOM_STRING)
2322         bad_module ("Expected integer string");
2323
2324       mpz_init (*integer);
2325       if (mpz_set_str (*integer, atom_string, 10))
2326         bad_module ("Error converting integer");
2327
2328       gfc_free (atom_string);
2329
2330     }
2331   else
2332     {
2333       p = mpz_get_str (NULL, 10, *integer);
2334       write_atom (ATOM_STRING, p);
2335       gfc_free (p);
2336     }
2337 }
2338
2339
2340 static void
2341 mio_gmp_real (mpfr_t * real)
2342 {
2343   mp_exp_t exponent;
2344   char *p;
2345
2346   if (iomode == IO_INPUT)
2347     {
2348       if (parse_atom () != ATOM_STRING)
2349         bad_module ("Expected real string");
2350
2351       mpfr_init (*real);
2352       mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2353       gfc_free (atom_string);
2354
2355     }
2356   else
2357     {
2358       p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2359       atom_string = gfc_getmem (strlen (p) + 20);
2360
2361       sprintf (atom_string, "0.%s@%ld", p, exponent);
2362
2363       /* Fix negative numbers.  */
2364       if (atom_string[2] == '-')
2365         {
2366           atom_string[0] = '-';
2367           atom_string[1] = '0';
2368           atom_string[2] = '.';
2369         }
2370
2371       write_atom (ATOM_STRING, atom_string);
2372
2373       gfc_free (atom_string);
2374       gfc_free (p);
2375     }
2376 }
2377
2378
2379 /* Save and restore the shape of an array constructor.  */
2380
2381 static void
2382 mio_shape (mpz_t ** pshape, int rank)
2383 {
2384   mpz_t *shape;
2385   atom_type t;
2386   int n;
2387
2388   /* A NULL shape is represented by ().  */
2389   mio_lparen ();
2390
2391   if (iomode == IO_OUTPUT)
2392     {
2393       shape = *pshape;
2394       if (!shape)
2395         {
2396           mio_rparen ();
2397           return;
2398         }
2399     }
2400   else
2401     {
2402       t = peek_atom ();
2403       if (t == ATOM_RPAREN)
2404         {
2405           *pshape = NULL;
2406           mio_rparen ();
2407           return;
2408         }
2409
2410       shape = gfc_get_shape (rank);
2411       *pshape = shape;
2412     }
2413
2414   for (n = 0; n < rank; n++)
2415     mio_gmp_integer (&shape[n]);
2416
2417   mio_rparen ();
2418 }
2419
2420
2421 static const mstring expr_types[] = {
2422     minit ("OP", EXPR_OP),
2423     minit ("FUNCTION", EXPR_FUNCTION),
2424     minit ("CONSTANT", EXPR_CONSTANT),
2425     minit ("VARIABLE", EXPR_VARIABLE),
2426     minit ("SUBSTRING", EXPR_SUBSTRING),
2427     minit ("STRUCTURE", EXPR_STRUCTURE),
2428     minit ("ARRAY", EXPR_ARRAY),
2429     minit ("NULL", EXPR_NULL),
2430     minit (NULL, -1)
2431 };
2432
2433 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2434    generic operators, not in expressions.  INTRINSIC_USER is also
2435    replaced by the correct function name by the time we see it.  */
2436
2437 static const mstring intrinsics[] =
2438 {
2439     minit ("UPLUS", INTRINSIC_UPLUS),
2440     minit ("UMINUS", INTRINSIC_UMINUS),
2441     minit ("PLUS", INTRINSIC_PLUS),
2442     minit ("MINUS", INTRINSIC_MINUS),
2443     minit ("TIMES", INTRINSIC_TIMES),
2444     minit ("DIVIDE", INTRINSIC_DIVIDE),
2445     minit ("POWER", INTRINSIC_POWER),
2446     minit ("CONCAT", INTRINSIC_CONCAT),
2447     minit ("AND", INTRINSIC_AND),
2448     minit ("OR", INTRINSIC_OR),
2449     minit ("EQV", INTRINSIC_EQV),
2450     minit ("NEQV", INTRINSIC_NEQV),
2451     minit ("EQ", INTRINSIC_EQ),
2452     minit ("NE", INTRINSIC_NE),
2453     minit ("GT", INTRINSIC_GT),
2454     minit ("GE", INTRINSIC_GE),
2455     minit ("LT", INTRINSIC_LT),
2456     minit ("LE", INTRINSIC_LE),
2457     minit ("NOT", INTRINSIC_NOT),
2458     minit (NULL, -1)
2459 };
2460
2461 /* Read and write expressions.  The form "()" is allowed to indicate a
2462    NULL expression.  */
2463
2464 static void
2465 mio_expr (gfc_expr ** ep)
2466 {
2467   gfc_expr *e;
2468   atom_type t;
2469   int flag;
2470
2471   mio_lparen ();
2472
2473   if (iomode == IO_OUTPUT)
2474     {
2475       if (*ep == NULL)
2476         {
2477           mio_rparen ();
2478           return;
2479         }
2480
2481       e = *ep;
2482       MIO_NAME(expr_t) (e->expr_type, expr_types);
2483
2484     }
2485   else
2486     {
2487       t = parse_atom ();
2488       if (t == ATOM_RPAREN)
2489         {
2490           *ep = NULL;
2491           return;
2492         }
2493
2494       if (t != ATOM_NAME)
2495         bad_module ("Expected expression type");
2496
2497       e = *ep = gfc_get_expr ();
2498       e->where = gfc_current_locus;
2499       e->expr_type = (expr_t) find_enum (expr_types);
2500     }
2501
2502   mio_typespec (&e->ts);
2503   mio_integer (&e->rank);
2504
2505   switch (e->expr_type)
2506     {
2507     case EXPR_OP:
2508       e->value.op.operator
2509         = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2510
2511       switch (e->value.op.operator)
2512         {
2513         case INTRINSIC_UPLUS:
2514         case INTRINSIC_UMINUS:
2515         case INTRINSIC_NOT:
2516           mio_expr (&e->value.op.op1);
2517           break;
2518
2519         case INTRINSIC_PLUS:
2520         case INTRINSIC_MINUS:
2521         case INTRINSIC_TIMES:
2522         case INTRINSIC_DIVIDE:
2523         case INTRINSIC_POWER:
2524         case INTRINSIC_CONCAT:
2525         case INTRINSIC_AND:
2526         case INTRINSIC_OR:
2527         case INTRINSIC_EQV:
2528         case INTRINSIC_NEQV:
2529         case INTRINSIC_EQ:
2530         case INTRINSIC_NE:
2531         case INTRINSIC_GT:
2532         case INTRINSIC_GE:
2533         case INTRINSIC_LT:
2534         case INTRINSIC_LE:
2535           mio_expr (&e->value.op.op1);
2536           mio_expr (&e->value.op.op2);
2537           break;
2538
2539         default:
2540           bad_module ("Bad operator");
2541         }
2542
2543       break;
2544
2545     case EXPR_FUNCTION:
2546       mio_symtree_ref (&e->symtree);
2547       mio_actual_arglist (&e->value.function.actual);
2548
2549       if (iomode == IO_OUTPUT)
2550         {
2551           e->value.function.name
2552             = mio_allocated_string (e->value.function.name);
2553           flag = e->value.function.esym != NULL;
2554           mio_integer (&flag);
2555           if (flag)
2556             mio_symbol_ref (&e->value.function.esym);
2557           else
2558             write_atom (ATOM_STRING, e->value.function.isym->name);
2559
2560         }
2561       else
2562         {
2563           require_atom (ATOM_STRING);
2564           e->value.function.name = gfc_get_string (atom_string);
2565           gfc_free (atom_string);
2566
2567           mio_integer (&flag);
2568           if (flag)
2569             mio_symbol_ref (&e->value.function.esym);
2570           else
2571             {
2572               require_atom (ATOM_STRING);
2573               e->value.function.isym = gfc_find_function (atom_string);
2574               gfc_free (atom_string);
2575             }
2576         }
2577
2578       break;
2579
2580     case EXPR_VARIABLE:
2581       mio_symtree_ref (&e->symtree);
2582       mio_ref_list (&e->ref);
2583       break;
2584
2585     case EXPR_SUBSTRING:
2586       e->value.character.string = (char *)
2587         mio_allocated_string (e->value.character.string);
2588       mio_ref_list (&e->ref);
2589       break;
2590
2591     case EXPR_STRUCTURE:
2592     case EXPR_ARRAY:
2593       mio_constructor (&e->value.constructor);
2594       mio_shape (&e->shape, e->rank);
2595       break;
2596
2597     case EXPR_CONSTANT:
2598       switch (e->ts.type)
2599         {
2600         case BT_INTEGER:
2601           mio_gmp_integer (&e->value.integer);
2602           break;
2603
2604         case BT_REAL:
2605           gfc_set_model_kind (e->ts.kind);
2606           mio_gmp_real (&e->value.real);
2607           break;
2608
2609         case BT_COMPLEX:
2610           gfc_set_model_kind (e->ts.kind);
2611           mio_gmp_real (&e->value.complex.r);
2612           mio_gmp_real (&e->value.complex.i);
2613           break;
2614
2615         case BT_LOGICAL:
2616           mio_integer (&e->value.logical);
2617           break;
2618
2619         case BT_CHARACTER:
2620           mio_integer (&e->value.character.length);
2621           e->value.character.string = (char *)
2622             mio_allocated_string (e->value.character.string);
2623           break;
2624
2625         default:
2626           bad_module ("Bad type in constant expression");
2627         }
2628
2629       break;
2630
2631     case EXPR_NULL:
2632       break;
2633     }
2634
2635   mio_rparen ();
2636 }
2637
2638
2639 /* Read and write namelists */
2640
2641 static void
2642 mio_namelist (gfc_symbol * sym)
2643 {
2644   gfc_namelist *n, *m;
2645   const char *check_name;
2646
2647   mio_lparen ();
2648
2649   if (iomode == IO_OUTPUT)
2650     {
2651       for (n = sym->namelist; n; n = n->next)
2652         mio_symbol_ref (&n->sym);
2653     }
2654   else
2655     {
2656       /* This departure from the standard is flagged as an error.
2657          It does, in fact, work correctly. TODO: Allow it
2658          conditionally?  */
2659       if (sym->attr.flavor == FL_NAMELIST)
2660         {
2661           check_name = find_use_name (sym->name);
2662           if (check_name && strcmp (check_name, sym->name) != 0)
2663             gfc_error("Namelist %s cannot be renamed by USE"
2664                       " association to %s.",
2665                       sym->name, check_name);
2666         }
2667
2668       m = NULL;
2669       while (peek_atom () != ATOM_RPAREN)
2670         {
2671           n = gfc_get_namelist ();
2672           mio_symbol_ref (&n->sym);
2673
2674           if (sym->namelist == NULL)
2675             sym->namelist = n;
2676           else
2677             m->next = n;
2678
2679           m = n;
2680         }
2681       sym->namelist_tail = m;
2682     }
2683
2684   mio_rparen ();
2685 }
2686
2687
2688 /* Save/restore lists of gfc_interface stuctures.  When loading an
2689    interface, we are really appending to the existing list of
2690    interfaces.  Checking for duplicate and ambiguous interfaces has to
2691    be done later when all symbols have been loaded.  */
2692
2693 static void
2694 mio_interface_rest (gfc_interface ** ip)
2695 {
2696   gfc_interface *tail, *p;
2697
2698   if (iomode == IO_OUTPUT)
2699     {
2700       if (ip != NULL)
2701         for (p = *ip; p; p = p->next)
2702           mio_symbol_ref (&p->sym);
2703     }
2704   else
2705     {
2706
2707       if (*ip == NULL)
2708         tail = NULL;
2709       else
2710         {
2711           tail = *ip;
2712           while (tail->next)
2713             tail = tail->next;
2714         }
2715
2716       for (;;)
2717         {
2718           if (peek_atom () == ATOM_RPAREN)
2719             break;
2720
2721           p = gfc_get_interface ();
2722           p->where = gfc_current_locus;
2723           mio_symbol_ref (&p->sym);
2724
2725           if (tail == NULL)
2726             *ip = p;
2727           else
2728             tail->next = p;
2729
2730           tail = p;
2731         }
2732     }
2733
2734   mio_rparen ();
2735 }
2736
2737
2738 /* Save/restore a nameless operator interface.  */
2739
2740 static void
2741 mio_interface (gfc_interface ** ip)
2742 {
2743
2744   mio_lparen ();
2745   mio_interface_rest (ip);
2746 }
2747
2748
2749 /* Save/restore a named operator interface.  */
2750
2751 static void
2752 mio_symbol_interface (const char **name, const char **module,
2753                       gfc_interface ** ip)
2754 {
2755
2756   mio_lparen ();
2757
2758   mio_pool_string (name);
2759   mio_pool_string (module);
2760
2761   mio_interface_rest (ip);
2762 }
2763
2764
2765 static void
2766 mio_namespace_ref (gfc_namespace ** nsp)
2767 {
2768   gfc_namespace *ns;
2769   pointer_info *p;
2770
2771   p = mio_pointer_ref (nsp);
2772
2773   if (p->type == P_UNKNOWN)
2774     p->type = P_NAMESPACE;
2775
2776   if (iomode == IO_INPUT && p->integer != 0)
2777     {
2778       ns = (gfc_namespace *)p->u.pointer;
2779       if (ns == NULL)
2780         {
2781           ns = gfc_get_namespace (NULL, 0);
2782           associate_integer_pointer (p, ns);
2783         }
2784       else
2785         ns->refs++;
2786     }
2787 }
2788
2789
2790 /* Unlike most other routines, the address of the symbol node is
2791    already fixed on input and the name/module has already been filled
2792    in.  */
2793
2794 static void
2795 mio_symbol (gfc_symbol * sym)
2796 {
2797   gfc_formal_arglist *formal;
2798
2799   mio_lparen ();
2800
2801   mio_symbol_attribute (&sym->attr);
2802   mio_typespec (&sym->ts);
2803
2804   /* Contained procedures don't have formal namespaces.  Instead we output the
2805      procedure namespace.  The will contain the formal arguments.  */
2806   if (iomode == IO_OUTPUT)
2807     {
2808       formal = sym->formal;
2809       while (formal && !formal->sym)
2810         formal = formal->next;
2811
2812       if (formal)
2813         mio_namespace_ref (&formal->sym->ns);
2814       else
2815         mio_namespace_ref (&sym->formal_ns);
2816     }
2817   else
2818     {
2819       mio_namespace_ref (&sym->formal_ns);
2820       if (sym->formal_ns)
2821         {
2822           sym->formal_ns->proc_name = sym;
2823           sym->refs++;
2824         }
2825     }
2826
2827   /* Save/restore common block links */
2828   mio_symbol_ref (&sym->common_next);
2829
2830   mio_formal_arglist (sym);
2831
2832   if (sym->attr.flavor == FL_PARAMETER)
2833     mio_expr (&sym->value);
2834
2835   mio_array_spec (&sym->as);
2836
2837   mio_symbol_ref (&sym->result);
2838
2839   if (sym->attr.cray_pointee)
2840     mio_symbol_ref (&sym->cp_pointer);
2841
2842   /* Note that components are always saved, even if they are supposed
2843      to be private.  Component access is checked during searching.  */
2844
2845   mio_component_list (&sym->components);
2846
2847   if (sym->components != NULL)
2848     sym->component_access =
2849       MIO_NAME(gfc_access) (sym->component_access, access_types);
2850
2851   mio_namelist (sym);
2852   mio_rparen ();
2853 }
2854
2855
2856 /************************* Top level subroutines *************************/
2857
2858 /* Skip a list between balanced left and right parens.  */
2859
2860 static void
2861 skip_list (void)
2862 {
2863   int level;
2864
2865   level = 0;
2866   do
2867     {
2868       switch (parse_atom ())
2869         {
2870         case ATOM_LPAREN:
2871           level++;
2872           break;
2873
2874         case ATOM_RPAREN:
2875           level--;
2876           break;
2877
2878         case ATOM_STRING:
2879           gfc_free (atom_string);
2880           break;
2881
2882         case ATOM_NAME:
2883         case ATOM_INTEGER:
2884           break;
2885         }
2886     }
2887   while (level > 0);
2888 }
2889
2890
2891 /* Load operator interfaces from the module.  Interfaces are unusual
2892    in that they attach themselves to existing symbols.  */
2893
2894 static void
2895 load_operator_interfaces (void)
2896 {
2897   const char *p;
2898   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2899   gfc_user_op *uop;
2900
2901   mio_lparen ();
2902
2903   while (peek_atom () != ATOM_RPAREN)
2904     {
2905       mio_lparen ();
2906
2907       mio_internal_string (name);
2908       mio_internal_string (module);
2909
2910       /* Decide if we need to load this one or not.  */
2911       p = find_use_name (name);
2912       if (p == NULL)
2913         {
2914           while (parse_atom () != ATOM_RPAREN);
2915         }
2916       else
2917         {
2918           uop = gfc_get_uop (p);
2919           mio_interface_rest (&uop->operator);
2920         }
2921     }
2922
2923   mio_rparen ();
2924 }
2925
2926
2927 /* Load interfaces from the module.  Interfaces are unusual in that
2928    they attach themselves to existing symbols.  */
2929
2930 static void
2931 load_generic_interfaces (void)
2932 {
2933   const char *p;
2934   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2935   gfc_symbol *sym;
2936
2937   mio_lparen ();
2938
2939   while (peek_atom () != ATOM_RPAREN)
2940     {
2941       mio_lparen ();
2942
2943       mio_internal_string (name);
2944       mio_internal_string (module);
2945
2946       /* Decide if we need to load this one or not.  */
2947       p = find_use_name (name);
2948
2949       if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2950         {
2951           while (parse_atom () != ATOM_RPAREN);
2952           continue;
2953         }
2954
2955       if (sym == NULL)
2956         {
2957           gfc_get_symbol (p, NULL, &sym);
2958
2959           sym->attr.flavor = FL_PROCEDURE;
2960           sym->attr.generic = 1;
2961           sym->attr.use_assoc = 1;
2962         }
2963
2964       mio_interface_rest (&sym->generic);
2965     }
2966
2967   mio_rparen ();
2968 }
2969
2970
2971 /* Load common blocks.  */
2972
2973 static void
2974 load_commons(void)
2975 {
2976   char name[GFC_MAX_SYMBOL_LEN+1];
2977   gfc_common_head *p;
2978
2979   mio_lparen ();
2980
2981   while (peek_atom () != ATOM_RPAREN)
2982     {
2983       mio_lparen ();
2984       mio_internal_string (name);
2985
2986       p = gfc_get_common (name, 1);
2987
2988       mio_symbol_ref (&p->head);
2989       mio_integer (&p->saved);
2990       p->use_assoc = 1;
2991
2992       mio_rparen();
2993     }
2994
2995   mio_rparen();
2996 }
2997
2998 /* load_equiv()-- Load equivalences. */
2999
3000 static void
3001 load_equiv(void)
3002 {
3003   gfc_equiv *head, *tail, *end;
3004
3005   mio_lparen();
3006
3007   end = gfc_current_ns->equiv;
3008   while(end != NULL && end->next != NULL)
3009     end = end->next;
3010
3011   while(peek_atom() != ATOM_RPAREN) {
3012     mio_lparen();
3013     head = tail = NULL;
3014
3015     while(peek_atom() != ATOM_RPAREN)
3016       {
3017         if (head == NULL)
3018           head = tail = gfc_get_equiv();
3019         else
3020           {
3021             tail->eq = gfc_get_equiv();
3022             tail = tail->eq;
3023           }
3024
3025         mio_pool_string(&tail->module);
3026         mio_expr(&tail->expr);
3027       }
3028
3029     if (end == NULL)
3030       gfc_current_ns->equiv = head;
3031     else
3032       end->next = head;
3033
3034     end = head;
3035     mio_rparen();
3036   }
3037
3038   mio_rparen();
3039 }
3040
3041 /* Recursive function to traverse the pointer_info tree and load a
3042    needed symbol.  We return nonzero if we load a symbol and stop the
3043    traversal, because the act of loading can alter the tree.  */
3044
3045 static int
3046 load_needed (pointer_info * p)
3047 {
3048   gfc_namespace *ns;
3049   pointer_info *q;
3050   gfc_symbol *sym;
3051
3052   if (p == NULL)
3053     return 0;
3054   if (load_needed (p->left))
3055     return 1;
3056   if (load_needed (p->right))
3057     return 1;
3058
3059   if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3060     return 0;
3061
3062   p->u.rsym.state = USED;
3063
3064   set_module_locus (&p->u.rsym.where);
3065
3066   sym = p->u.rsym.sym;
3067   if (sym == NULL)
3068     {
3069       q = get_integer (p->u.rsym.ns);
3070
3071       ns = (gfc_namespace *) q->u.pointer;
3072       if (ns == NULL)
3073         {
3074           /* Create an interface namespace if necessary.  These are
3075              the namespaces that hold the formal parameters of module
3076              procedures.  */
3077
3078           ns = gfc_get_namespace (NULL, 0);
3079           associate_integer_pointer (q, ns);
3080         }
3081
3082       sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3083       sym->module = gfc_get_string (p->u.rsym.module);
3084
3085       associate_integer_pointer (p, sym);
3086     }
3087
3088   mio_symbol (sym);
3089   sym->attr.use_assoc = 1;
3090
3091   return 1;
3092 }
3093
3094
3095 /* Recursive function for cleaning up things after a module has been
3096    read.  */
3097
3098 static void
3099 read_cleanup (pointer_info * p)
3100 {
3101   gfc_symtree *st;
3102   pointer_info *q;
3103
3104   if (p == NULL)
3105     return;
3106
3107   read_cleanup (p->left);
3108   read_cleanup (p->right);
3109
3110   if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3111     {
3112       /* Add hidden symbols to the symtree.  */
3113       q = get_integer (p->u.rsym.ns);
3114       st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3115
3116       st->n.sym = p->u.rsym.sym;
3117       st->n.sym->refs++;
3118
3119       /* Fixup any symtree references.  */
3120       p->u.rsym.symtree = st;
3121       resolve_fixups (p->u.rsym.stfixup, st);
3122       p->u.rsym.stfixup = NULL;
3123     }
3124
3125   /* Free unused symbols.  */
3126   if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3127     gfc_free_symbol (p->u.rsym.sym);
3128 }
3129
3130
3131 /* Read a module file.  */
3132
3133 static void
3134 read_module (void)
3135 {
3136   module_locus operator_interfaces, user_operators;
3137   const char *p;
3138   char name[GFC_MAX_SYMBOL_LEN + 1];
3139   gfc_intrinsic_op i;
3140   int ambiguous, j, nuse, symbol;
3141   pointer_info *info;
3142   gfc_use_rename *u;
3143   gfc_symtree *st;
3144   gfc_symbol *sym;
3145
3146   get_module_locus (&operator_interfaces);      /* Skip these for now */
3147   skip_list ();
3148
3149   get_module_locus (&user_operators);
3150   skip_list ();
3151   skip_list ();
3152
3153   /* Skip commons and equivalences for now.  */
3154   skip_list ();
3155   skip_list ();
3156
3157   mio_lparen ();
3158
3159   /* Create the fixup nodes for all the symbols.  */
3160
3161   while (peek_atom () != ATOM_RPAREN)
3162     {
3163       require_atom (ATOM_INTEGER);
3164       info = get_integer (atom_int);
3165
3166       info->type = P_SYMBOL;
3167       info->u.rsym.state = UNUSED;
3168
3169       mio_internal_string (info->u.rsym.true_name);
3170       mio_internal_string (info->u.rsym.module);
3171
3172       require_atom (ATOM_INTEGER);
3173       info->u.rsym.ns = atom_int;
3174
3175       get_module_locus (&info->u.rsym.where);
3176       skip_list ();
3177
3178       /* See if the symbol has already been loaded by a previous module.
3179          If so, we reference the existing symbol and prevent it from
3180          being loaded again.  */
3181
3182       sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3183
3184         /* See if the symbol has already been loaded by a previous module.
3185          If so, we reference the existing symbol and prevent it from
3186          being loaded again.  This should not happen if the symbol being
3187          read is an index for an assumed shape dummy array (ns != 1).  */
3188
3189       sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3190
3191       if (sym == NULL
3192            || (sym->attr.flavor == FL_VARIABLE
3193                && info->u.rsym.ns !=1))
3194         continue;
3195
3196       info->u.rsym.state = USED;
3197       info->u.rsym.referenced = 1;
3198       info->u.rsym.sym = sym;
3199     }
3200
3201   mio_rparen ();
3202
3203   /* Parse the symtree lists.  This lets us mark which symbols need to
3204      be loaded.  Renaming is also done at this point by replacing the
3205      symtree name.  */
3206
3207   mio_lparen ();
3208
3209   while (peek_atom () != ATOM_RPAREN)
3210     {
3211       mio_internal_string (name);
3212       mio_integer (&ambiguous);
3213       mio_integer (&symbol);
3214
3215       info = get_integer (symbol);
3216
3217       /* See how many use names there are.  If none, go through the start
3218          of the loop at least once.  */
3219       nuse = number_use_names (name);
3220       if (nuse == 0)
3221         nuse = 1;
3222
3223       for (j = 1; j <= nuse; j++)
3224         {
3225           /* Get the jth local name for this symbol.  */
3226           p = find_use_name_n (name, &j);
3227
3228           /* Skip symtree nodes not in an ONLY clause.  */
3229           if (p == NULL)
3230             continue;
3231
3232           /* Check for ambiguous symbols.  */
3233           st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3234
3235           if (st != NULL)
3236             {
3237               if (st->n.sym != info->u.rsym.sym)
3238                 st->ambiguous = 1;
3239               info->u.rsym.symtree = st;
3240             }
3241           else
3242             {
3243               /* Create a symtree node in the current namespace for this symbol.  */
3244               st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3245               gfc_new_symtree (&gfc_current_ns->sym_root, p);
3246
3247               st->ambiguous = ambiguous;
3248
3249               sym = info->u.rsym.sym;
3250
3251               /* Create a symbol node if it doesn't already exist.  */
3252               if (sym == NULL)
3253                 {
3254                   sym = info->u.rsym.sym =
3255                       gfc_new_symbol (info->u.rsym.true_name,
3256                                       gfc_current_ns);
3257
3258                   sym->module = gfc_get_string (info->u.rsym.module);
3259                 }
3260
3261               st->n.sym = sym;
3262               st->n.sym->refs++;
3263
3264               /* Store the symtree pointing to this symbol.  */
3265               info->u.rsym.symtree = st;
3266
3267               if (info->u.rsym.state == UNUSED)
3268                 info->u.rsym.state = NEEDED;
3269               info->u.rsym.referenced = 1;
3270             }
3271         }
3272     }
3273
3274   mio_rparen ();
3275
3276   /* Load intrinsic operator interfaces.  */
3277   set_module_locus (&operator_interfaces);
3278   mio_lparen ();
3279
3280   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3281     {
3282       if (i == INTRINSIC_USER)
3283         continue;
3284
3285       if (only_flag)
3286         {
3287           u = find_use_operator (i);
3288
3289           if (u == NULL)
3290             {
3291               skip_list ();
3292               continue;
3293             }
3294
3295           u->found = 1;
3296         }
3297
3298       mio_interface (&gfc_current_ns->operator[i]);
3299     }
3300
3301   mio_rparen ();
3302
3303   /* Load generic and user operator interfaces.  These must follow the
3304      loading of symtree because otherwise symbols can be marked as
3305      ambiguous.  */
3306
3307   set_module_locus (&user_operators);
3308
3309   load_operator_interfaces ();
3310   load_generic_interfaces ();
3311
3312   load_commons ();
3313   load_equiv();
3314
3315   /* At this point, we read those symbols that are needed but haven't
3316      been loaded yet.  If one symbol requires another, the other gets
3317      marked as NEEDED if its previous state was UNUSED.  */
3318
3319   while (load_needed (pi_root));
3320
3321   /* Make sure all elements of the rename-list were found in the
3322      module.  */
3323
3324   for (u = gfc_rename_list; u; u = u->next)
3325     {
3326       if (u->found)
3327         continue;
3328
3329       if (u->operator == INTRINSIC_NONE)
3330         {
3331           gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3332                      u->use_name, &u->where, module_name);
3333           continue;
3334         }
3335
3336       if (u->operator == INTRINSIC_USER)
3337         {
3338           gfc_error
3339             ("User operator '%s' referenced at %L not found in module '%s'",
3340              u->use_name, &u->where, module_name);
3341           continue;
3342         }
3343
3344       gfc_error
3345         ("Intrinsic operator '%s' referenced at %L not found in module "
3346          "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3347     }
3348
3349   gfc_check_interfaces (gfc_current_ns);
3350
3351   /* Clean up symbol nodes that were never loaded, create references
3352      to hidden symbols.  */
3353
3354   read_cleanup (pi_root);
3355 }
3356
3357
3358 /* Given an access type that is specific to an entity and the default
3359    access, return nonzero if the entity is publicly accessible.  */
3360
3361 bool
3362 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3363 {
3364
3365   if (specific_access == ACCESS_PUBLIC)
3366     return TRUE;
3367   if (specific_access == ACCESS_PRIVATE)
3368     return FALSE;
3369
3370   if (gfc_option.flag_module_access_private)
3371     return default_access == ACCESS_PUBLIC;
3372   else
3373     return default_access != ACCESS_PRIVATE;
3374
3375   return FALSE;
3376 }
3377
3378
3379 /* Write a common block to the module */
3380
3381 static void
3382 write_common (gfc_symtree *st)
3383 {
3384   gfc_common_head *p;
3385   const char * name;
3386
3387   if (st == NULL)
3388     return;
3389
3390   write_common(st->left);
3391   write_common(st->right);
3392
3393   mio_lparen();
3394
3395   /* Write the unmangled name.  */
3396   name = st->n.common->name;
3397
3398   mio_pool_string(&name);
3399
3400   p = st->n.common;
3401   mio_symbol_ref(&p->head);
3402   mio_integer(&p->saved);
3403
3404   mio_rparen();
3405 }
3406
3407 /* Write the blank common block to the module */
3408
3409 static void
3410 write_blank_common (void)
3411 {
3412   const char * name = BLANK_COMMON_NAME;
3413
3414   if (gfc_current_ns->blank_common.head == NULL)
3415     return;
3416
3417   mio_lparen();
3418
3419   mio_pool_string(&name);
3420
3421   mio_symbol_ref(&gfc_current_ns->blank_common.head);
3422   mio_integer(&gfc_current_ns->blank_common.saved);
3423
3424   mio_rparen();
3425 }
3426
3427 /* Write equivalences to the module.  */
3428
3429 static void
3430 write_equiv(void)
3431 {
3432   gfc_equiv *eq, *e;
3433   int num;
3434
3435   num = 0;
3436   for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3437     {
3438       mio_lparen();
3439
3440       for(e=eq; e; e=e->eq)
3441         {
3442           if (e->module == NULL)
3443             e->module = gfc_get_string("%s.eq.%d", module_name, num);
3444           mio_allocated_string(e->module);
3445           mio_expr(&e->expr);
3446         }
3447
3448       num++;
3449       mio_rparen();
3450     }
3451 }
3452
3453 /* Write a symbol to the module.  */
3454
3455 static void
3456 write_symbol (int n, gfc_symbol * sym)
3457 {
3458
3459   if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3460     gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3461
3462   mio_integer (&n);
3463   mio_pool_string (&sym->name);
3464
3465   mio_pool_string (&sym->module);
3466   mio_pointer_ref (&sym->ns);
3467
3468   mio_symbol (sym);
3469   write_char ('\n');
3470 }
3471
3472
3473 /* Recursive traversal function to write the initial set of symbols to
3474    the module.  We check to see if the symbol should be written
3475    according to the access specification.  */
3476
3477 static void
3478 write_symbol0 (gfc_symtree * st)
3479 {
3480   gfc_symbol *sym;
3481   pointer_info *p;
3482
3483   if (st == NULL)
3484     return;
3485
3486   write_symbol0 (st->left);
3487   write_symbol0 (st->right);
3488
3489   sym = st->n.sym;
3490   if (sym->module == NULL)
3491     sym->module = gfc_get_string (module_name);
3492
3493   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3494       && !sym->attr.subroutine && !sym->attr.function)
3495     return;
3496
3497   if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3498     return;
3499
3500   p = get_pointer (sym);
3501   if (p->type == P_UNKNOWN)
3502     p->type = P_SYMBOL;
3503
3504   if (p->u.wsym.state == WRITTEN)
3505     return;
3506
3507   write_symbol (p->integer, sym);
3508   p->u.wsym.state = WRITTEN;
3509
3510   return;
3511 }
3512
3513
3514 /* Recursive traversal function to write the secondary set of symbols
3515    to the module file.  These are symbols that were not public yet are
3516    needed by the public symbols or another dependent symbol.  The act
3517    of writing a symbol can modify the pointer_info tree, so we cease
3518    traversal if we find a symbol to write.  We return nonzero if a
3519    symbol was written and pass that information upwards.  */
3520
3521 static int
3522 write_symbol1 (pointer_info * p)
3523 {
3524
3525   if (p == NULL)
3526     return 0;
3527
3528   if (write_symbol1 (p->left))
3529     return 1;
3530   if (write_symbol1 (p->right))
3531     return 1;
3532
3533   if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3534     return 0;
3535
3536   p->u.wsym.state = WRITTEN;
3537   write_symbol (p->integer, p->u.wsym.sym);
3538
3539   return 1;
3540 }
3541
3542
3543 /* Write operator interfaces associated with a symbol.  */
3544
3545 static void
3546 write_operator (gfc_user_op * uop)
3547 {
3548   static char nullstring[] = "";
3549   const char *p = nullstring;
3550
3551   if (uop->operator == NULL
3552       || !gfc_check_access (uop->access, uop->ns->default_access))
3553     return;
3554
3555   mio_symbol_interface (&uop->name, &p, &uop->operator);
3556 }
3557
3558
3559 /* Write generic interfaces associated with a symbol.  */
3560
3561 static void
3562 write_generic (gfc_symbol * sym)
3563 {
3564
3565   if (sym->generic == NULL
3566       || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3567     return;
3568
3569   mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3570 }
3571
3572
3573 static void
3574 write_symtree (gfc_symtree * st)
3575 {
3576   gfc_symbol *sym;
3577   pointer_info *p;
3578
3579   sym = st->n.sym;
3580   if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3581       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3582           && !sym->attr.subroutine && !sym->attr.function))
3583     return;
3584
3585   if (check_unique_name (st->name))
3586     return;
3587
3588   p = find_pointer (sym);
3589   if (p == NULL)
3590     gfc_internal_error ("write_symtree(): Symbol not written");
3591
3592   mio_pool_string (&st->name);
3593   mio_integer (&st->ambiguous);
3594   mio_integer (&p->integer);
3595 }
3596
3597
3598 static void
3599 write_module (void)
3600 {
3601   gfc_intrinsic_op i;
3602
3603   /* Write the operator interfaces.  */
3604   mio_lparen ();
3605
3606   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3607     {
3608       if (i == INTRINSIC_USER)
3609         continue;
3610
3611       mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3612                                        gfc_current_ns->default_access)
3613                      ? &gfc_current_ns->operator[i] : NULL);
3614     }
3615
3616   mio_rparen ();
3617   write_char ('\n');
3618   write_char ('\n');
3619
3620   mio_lparen ();
3621   gfc_traverse_user_op (gfc_current_ns, write_operator);
3622   mio_rparen ();
3623   write_char ('\n');
3624   write_char ('\n');
3625
3626   mio_lparen ();
3627   gfc_traverse_ns (gfc_current_ns, write_generic);
3628   mio_rparen ();
3629   write_char ('\n');
3630   write_char ('\n');
3631
3632   mio_lparen ();
3633   write_blank_common ();
3634   write_common (gfc_current_ns->common_root);
3635   mio_rparen ();
3636   write_char ('\n');
3637   write_char ('\n');
3638
3639   mio_lparen();
3640   write_equiv();
3641   mio_rparen();
3642   write_char('\n');  write_char('\n');
3643
3644   /* Write symbol information.  First we traverse all symbols in the
3645      primary namespace, writing those that need to be written.
3646      Sometimes writing one symbol will cause another to need to be
3647      written.  A list of these symbols ends up on the write stack, and
3648      we end by popping the bottom of the stack and writing the symbol
3649      until the stack is empty.  */
3650
3651   mio_lparen ();
3652
3653   write_symbol0 (gfc_current_ns->sym_root);
3654   while (write_symbol1 (pi_root));
3655
3656   mio_rparen ();
3657
3658   write_char ('\n');
3659   write_char ('\n');
3660
3661   mio_lparen ();
3662   gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3663   mio_rparen ();
3664 }
3665
3666
3667 /* Given module, dump it to disk.  If there was an error while
3668    processing the module, dump_flag will be set to zero and we delete
3669    the module file, even if it was already there.  */
3670
3671 void
3672 gfc_dump_module (const char *name, int dump_flag)
3673 {
3674   int n;
3675   char *filename, *p;
3676   time_t now;
3677
3678   n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3679   if (gfc_option.module_dir != NULL)
3680     {
3681       filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3682       strcpy (filename, gfc_option.module_dir);
3683       strcat (filename, name);
3684     }
3685   else
3686     {
3687       filename = (char *) alloca (n);
3688       strcpy (filename, name);
3689     }
3690   strcat (filename, MODULE_EXTENSION);
3691
3692   if (!dump_flag)
3693     {
3694       unlink (filename);
3695       return;
3696     }
3697
3698   module_fp = fopen (filename, "w");
3699   if (module_fp == NULL)
3700     gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3701                      filename, strerror (errno));
3702
3703   now = time (NULL);
3704   p = ctime (&now);
3705
3706   *strchr (p, '\n') = '\0';
3707
3708   fprintf (module_fp, "GFORTRAN module created from %s on %s\n", 
3709            gfc_source_file, p);
3710   fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3711
3712   iomode = IO_OUTPUT;
3713   strcpy (module_name, name);
3714
3715   init_pi_tree ();
3716
3717   write_module ();
3718
3719   free_pi_tree (pi_root);
3720   pi_root = NULL;
3721
3722   write_char ('\n');
3723
3724   if (fclose (module_fp))
3725     gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3726                      filename, strerror (errno));
3727 }
3728
3729
3730 /* Process a USE directive.  */
3731
3732 void
3733 gfc_use_module (void)
3734 {
3735   char *filename;
3736   gfc_state_data *p;
3737   int c, line;
3738
3739   filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
3740                              + 1);
3741   strcpy (filename, module_name);
3742   strcat (filename, MODULE_EXTENSION);
3743
3744   module_fp = gfc_open_included_file (filename, true);
3745   if (module_fp == NULL)
3746     gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3747                      filename, strerror (errno));
3748
3749   iomode = IO_INPUT;
3750   module_line = 1;
3751   module_column = 1;
3752
3753   /* Skip the first two lines of the module.  */
3754   /* FIXME: Could also check for valid two lines here, instead.  */
3755   line = 0;
3756   while (line < 2)
3757     {
3758       c = module_char ();
3759       if (c == EOF)
3760         bad_module ("Unexpected end of module");
3761       if (c == '\n')
3762         line++;
3763     }
3764
3765   /* Make sure we're not reading the same module that we may be building.  */
3766   for (p = gfc_state_stack; p; p = p->previous)
3767     if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3768       gfc_fatal_error ("Can't USE the same module we're building!");
3769
3770   init_pi_tree ();
3771   init_true_name_tree ();
3772
3773   read_module ();
3774
3775   free_true_name (true_name_root);
3776   true_name_root = NULL;
3777
3778   free_pi_tree (pi_root);
3779   pi_root = NULL;
3780
3781   fclose (module_fp);
3782 }
3783
3784
3785 void
3786 gfc_module_init_2 (void)
3787 {
3788
3789   last_atom = ATOM_LPAREN;
3790 }
3791
3792
3793 void
3794 gfc_module_done_2 (void)
3795 {
3796
3797   free_rename ();
3798 }