OSDN Git Service

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