OSDN Git Service

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