OSDN Git Service

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