OSDN Git Service

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