OSDN Git Service

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