OSDN Git Service

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