OSDN Git Service

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