* tree-cfg.c (tree_find_edge_insert_loc): Handle naked RETURN_EXPR.
[official-gcc.git] / gcc / fortran / module.c
blob1066e2ef52f5f1d3cc53c97d7f0d64843d93dd94
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
4 Inc.
5 Contributed by Andy Vaught
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
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.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
24 /* The syntax of gfortran modules resembles that of lisp lists, ie a
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
39 ...
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42 ...
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45 ...
47 ( ( <common name> <symbol> <saved flag>)
48 ...
51 ( equivalence list )
53 ( <Symbol Number (in no particular order)>
54 <True name of symbol>
55 <Module name of symbol>
56 ( <symbol information> )
57 ...
59 ( <Symtree name>
60 <Ambiguous flag>
61 <Symbol number>
62 ...
65 In general, symbols refer to other symbols by their symbol number,
66 which are zero based. Symbols are written to the module in no
67 particular order. */
69 #include "config.h"
70 #include "system.h"
71 #include "gfortran.h"
72 #include "arith.h"
73 #include "match.h"
74 #include "parse.h" /* FIXME */
76 #define MODULE_EXTENSION ".mod"
79 /* Structure that describes a position within a module file. */
81 typedef struct
83 int column, line;
84 fpos_t pos;
86 module_locus;
89 typedef enum
91 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
93 pointer_t;
95 /* The fixup structure lists pointers to pointers that have to
96 be updated when a pointer value becomes known. */
98 typedef struct fixup_t
100 void **pointer;
101 struct fixup_t *next;
103 fixup_t;
106 /* Structure for holding extra info needed for pointers being read. */
108 typedef struct pointer_info
110 BBT_HEADER (pointer_info);
111 int integer;
112 pointer_t type;
114 /* The first component of each member of the union is the pointer
115 being stored. */
117 fixup_t *fixup;
119 union
121 void *pointer; /* Member for doing pointer searches. */
123 struct
125 gfc_symbol *sym;
126 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
127 enum
128 { UNUSED, NEEDED, USED }
129 state;
130 int ns, referenced;
131 module_locus where;
132 fixup_t *stfixup;
133 gfc_symtree *symtree;
135 rsym;
137 struct
139 gfc_symbol *sym;
140 enum
141 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
142 state;
144 wsym;
149 pointer_info;
151 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
154 /* Lists of rename info for the USE statement. */
156 typedef struct gfc_use_rename
158 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
159 struct gfc_use_rename *next;
160 int found;
161 gfc_intrinsic_op operator;
162 locus where;
164 gfc_use_rename;
166 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
168 /* Local variables */
170 /* The FILE for the module we're reading or writing. */
171 static FILE *module_fp;
173 /* The name of the module we're reading (USE'ing) or writing. */
174 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
176 static int module_line, module_column, only_flag;
177 static enum
178 { IO_INPUT, IO_OUTPUT }
179 iomode;
181 static gfc_use_rename *gfc_rename_list;
182 static pointer_info *pi_root;
183 static int symbol_number; /* Counter for assigning symbol numbers */
187 /*****************************************************************/
189 /* Pointer/integer conversion. Pointers between structures are stored
190 as integers in the module file. The next couple of subroutines
191 handle this translation for reading and writing. */
193 /* Recursively free the tree of pointer structures. */
195 static void
196 free_pi_tree (pointer_info * p)
198 if (p == NULL)
199 return;
201 if (p->fixup != NULL)
202 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
204 free_pi_tree (p->left);
205 free_pi_tree (p->right);
207 gfc_free (p);
211 /* Compare pointers when searching by pointer. Used when writing a
212 module. */
214 static int
215 compare_pointers (void * _sn1, void * _sn2)
217 pointer_info *sn1, *sn2;
219 sn1 = (pointer_info *) _sn1;
220 sn2 = (pointer_info *) _sn2;
222 if (sn1->u.pointer < sn2->u.pointer)
223 return -1;
224 if (sn1->u.pointer > sn2->u.pointer)
225 return 1;
227 return 0;
231 /* Compare integers when searching by integer. Used when reading a
232 module. */
234 static int
235 compare_integers (void * _sn1, void * _sn2)
237 pointer_info *sn1, *sn2;
239 sn1 = (pointer_info *) _sn1;
240 sn2 = (pointer_info *) _sn2;
242 if (sn1->integer < sn2->integer)
243 return -1;
244 if (sn1->integer > sn2->integer)
245 return 1;
247 return 0;
251 /* Initialize the pointer_info tree. */
253 static void
254 init_pi_tree (void)
256 compare_fn compare;
257 pointer_info *p;
259 pi_root = NULL;
260 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
262 /* Pointer 0 is the NULL pointer. */
263 p = gfc_get_pointer_info ();
264 p->u.pointer = NULL;
265 p->integer = 0;
266 p->type = P_OTHER;
268 gfc_insert_bbt (&pi_root, p, compare);
270 /* Pointer 1 is the current namespace. */
271 p = gfc_get_pointer_info ();
272 p->u.pointer = gfc_current_ns;
273 p->integer = 1;
274 p->type = P_NAMESPACE;
276 gfc_insert_bbt (&pi_root, p, compare);
278 symbol_number = 2;
282 /* During module writing, call here with a pointer to something,
283 returning the pointer_info node. */
285 static pointer_info *
286 find_pointer (void *gp)
288 pointer_info *p;
290 p = pi_root;
291 while (p != NULL)
293 if (p->u.pointer == gp)
294 break;
295 p = (gp < p->u.pointer) ? p->left : p->right;
298 return p;
302 /* Given a pointer while writing, returns the pointer_info tree node,
303 creating it if it doesn't exist. */
305 static pointer_info *
306 get_pointer (void *gp)
308 pointer_info *p;
310 p = find_pointer (gp);
311 if (p != NULL)
312 return p;
314 /* Pointer doesn't have an integer. Give it one. */
315 p = gfc_get_pointer_info ();
317 p->u.pointer = gp;
318 p->integer = symbol_number++;
320 gfc_insert_bbt (&pi_root, p, compare_pointers);
322 return p;
326 /* Given an integer during reading, find it in the pointer_info tree,
327 creating the node if not found. */
329 static pointer_info *
330 get_integer (int integer)
332 pointer_info *p, t;
333 int c;
335 t.integer = integer;
337 p = pi_root;
338 while (p != NULL)
340 c = compare_integers (&t, p);
341 if (c == 0)
342 break;
344 p = (c < 0) ? p->left : p->right;
347 if (p != NULL)
348 return p;
350 p = gfc_get_pointer_info ();
351 p->integer = integer;
352 p->u.pointer = NULL;
354 gfc_insert_bbt (&pi_root, p, compare_integers);
356 return p;
360 /* Recursive function to find a pointer within a tree by brute force. */
362 static pointer_info *
363 fp2 (pointer_info * p, const void *target)
365 pointer_info *q;
367 if (p == NULL)
368 return NULL;
370 if (p->u.pointer == target)
371 return p;
373 q = fp2 (p->left, target);
374 if (q != NULL)
375 return q;
377 return fp2 (p->right, target);
381 /* During reading, find a pointer_info node from the pointer value.
382 This amounts to a brute-force search. */
384 static pointer_info *
385 find_pointer2 (void *p)
388 return fp2 (pi_root, p);
392 /* Resolve any fixups using a known pointer. */
393 static void
394 resolve_fixups (fixup_t *f, void * gp)
396 fixup_t *next;
398 for (; f; f = next)
400 next = f->next;
401 *(f->pointer) = gp;
402 gfc_free (f);
406 /* Call here during module reading when we know what pointer to
407 associate with an integer. Any fixups that exist are resolved at
408 this time. */
410 static void
411 associate_integer_pointer (pointer_info * p, void *gp)
413 if (p->u.pointer != NULL)
414 gfc_internal_error ("associate_integer_pointer(): Already associated");
416 p->u.pointer = gp;
418 resolve_fixups (p->fixup, gp);
420 p->fixup = NULL;
424 /* During module reading, given an integer and a pointer to a pointer,
425 either store the pointer from an already-known value or create a
426 fixup structure in order to store things later. Returns zero if
427 the reference has been actually stored, or nonzero if the reference
428 must be fixed later (ie associate_integer_pointer must be called
429 sometime later. Returns the pointer_info structure. */
431 static pointer_info *
432 add_fixup (int integer, void *gp)
434 pointer_info *p;
435 fixup_t *f;
436 char **cp;
438 p = get_integer (integer);
440 if (p->integer == 0 || p->u.pointer != NULL)
442 cp = gp;
443 *cp = p->u.pointer;
445 else
447 f = gfc_getmem (sizeof (fixup_t));
449 f->next = p->fixup;
450 p->fixup = f;
452 f->pointer = gp;
455 return p;
459 /*****************************************************************/
461 /* Parser related subroutines */
463 /* Free the rename list left behind by a USE statement. */
465 static void
466 free_rename (void)
468 gfc_use_rename *next;
470 for (; gfc_rename_list; gfc_rename_list = next)
472 next = gfc_rename_list->next;
473 gfc_free (gfc_rename_list);
478 /* Match a USE statement. */
480 match
481 gfc_match_use (void)
483 char name[GFC_MAX_SYMBOL_LEN + 1];
484 gfc_use_rename *tail = NULL, *new;
485 interface_type type;
486 gfc_intrinsic_op operator;
487 match m;
489 m = gfc_match_name (module_name);
490 if (m != MATCH_YES)
491 return m;
493 free_rename ();
494 only_flag = 0;
496 if (gfc_match_eos () == MATCH_YES)
497 return MATCH_YES;
498 if (gfc_match_char (',') != MATCH_YES)
499 goto syntax;
501 if (gfc_match (" only :") == MATCH_YES)
502 only_flag = 1;
504 if (gfc_match_eos () == MATCH_YES)
505 return MATCH_YES;
507 for (;;)
509 /* Get a new rename struct and add it to the rename list. */
510 new = gfc_get_use_rename ();
511 new->where = gfc_current_locus;
512 new->found = 0;
514 if (gfc_rename_list == NULL)
515 gfc_rename_list = new;
516 else
517 tail->next = new;
518 tail = new;
520 /* See what kind of interface we're dealing with. Assume it is
521 not an operator. */
522 new->operator = INTRINSIC_NONE;
523 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
524 goto cleanup;
526 switch (type)
528 case INTERFACE_NAMELESS:
529 gfc_error ("Missing generic specification in USE statement at %C");
530 goto cleanup;
532 case INTERFACE_GENERIC:
533 m = gfc_match (" =>");
535 if (only_flag)
537 if (m != MATCH_YES)
538 strcpy (new->use_name, name);
539 else
541 strcpy (new->local_name, name);
543 m = gfc_match_name (new->use_name);
544 if (m == MATCH_NO)
545 goto syntax;
546 if (m == MATCH_ERROR)
547 goto cleanup;
550 else
552 if (m != MATCH_YES)
553 goto syntax;
554 strcpy (new->local_name, name);
556 m = gfc_match_name (new->use_name);
557 if (m == MATCH_NO)
558 goto syntax;
559 if (m == MATCH_ERROR)
560 goto cleanup;
563 break;
565 case INTERFACE_USER_OP:
566 strcpy (new->use_name, name);
567 /* Fall through */
569 case INTERFACE_INTRINSIC_OP:
570 new->operator = operator;
571 break;
574 if (gfc_match_eos () == MATCH_YES)
575 break;
576 if (gfc_match_char (',') != MATCH_YES)
577 goto syntax;
580 return MATCH_YES;
582 syntax:
583 gfc_syntax_error (ST_USE);
585 cleanup:
586 free_rename ();
587 return MATCH_ERROR;
591 /* Given a name and a number, inst, return the inst name
592 under which to load this symbol. Returns NULL if this
593 symbol shouldn't be loaded. If inst is zero, returns
594 the number of instances of this name. */
596 static const char *
597 find_use_name_n (const char *name, int *inst)
599 gfc_use_rename *u;
600 int i;
602 i = 0;
603 for (u = gfc_rename_list; u; u = u->next)
605 if (strcmp (u->use_name, name) != 0)
606 continue;
607 if (++i == *inst)
608 break;
611 if (!*inst)
613 *inst = i;
614 return NULL;
617 if (u == NULL)
618 return only_flag ? NULL : name;
620 u->found = 1;
622 return (u->local_name[0] != '\0') ? u->local_name : name;
625 /* Given a name, return the name under which to load this symbol.
626 Returns NULL if this symbol shouldn't be loaded. */
628 static const char *
629 find_use_name (const char *name)
631 int i = 1;
632 return find_use_name_n (name, &i);
635 /* Given a real name, return the number of use names associated
636 with it. */
638 static int
639 number_use_names (const char *name)
641 int i = 0;
642 const char *c;
643 c = find_use_name_n (name, &i);
644 return i;
648 /* Try to find the operator in the current list. */
650 static gfc_use_rename *
651 find_use_operator (gfc_intrinsic_op operator)
653 gfc_use_rename *u;
655 for (u = gfc_rename_list; u; u = u->next)
656 if (u->operator == operator)
657 return u;
659 return NULL;
663 /*****************************************************************/
665 /* The next couple of subroutines maintain a tree used to avoid a
666 brute-force search for a combination of true name and module name.
667 While symtree names, the name that a particular symbol is known by
668 can changed with USE statements, we still have to keep track of the
669 true names to generate the correct reference, and also avoid
670 loading the same real symbol twice in a program unit.
672 When we start reading, the true name tree is built and maintained
673 as symbols are read. The tree is searched as we load new symbols
674 to see if it already exists someplace in the namespace. */
676 typedef struct true_name
678 BBT_HEADER (true_name);
679 gfc_symbol *sym;
681 true_name;
683 static true_name *true_name_root;
686 /* Compare two true_name structures. */
688 static int
689 compare_true_names (void * _t1, void * _t2)
691 true_name *t1, *t2;
692 int c;
694 t1 = (true_name *) _t1;
695 t2 = (true_name *) _t2;
697 c = ((t1->sym->module > t2->sym->module)
698 - (t1->sym->module < t2->sym->module));
699 if (c != 0)
700 return c;
702 return strcmp (t1->sym->name, t2->sym->name);
706 /* Given a true name, search the true name tree to see if it exists
707 within the main namespace. */
709 static gfc_symbol *
710 find_true_name (const char *name, const char *module)
712 true_name t, *p;
713 gfc_symbol sym;
714 int c;
716 sym.name = gfc_get_string (name);
717 if (module != NULL)
718 sym.module = gfc_get_string (module);
719 else
720 sym.module = NULL;
721 t.sym = &sym;
723 p = true_name_root;
724 while (p != NULL)
726 c = compare_true_names ((void *)(&t), (void *) p);
727 if (c == 0)
728 return p->sym;
730 p = (c < 0) ? p->left : p->right;
733 return NULL;
737 /* Given a gfc_symbol pointer that is not in the true name tree, add
738 it. */
740 static void
741 add_true_name (gfc_symbol * sym)
743 true_name *t;
745 t = gfc_getmem (sizeof (true_name));
746 t->sym = sym;
748 gfc_insert_bbt (&true_name_root, t, compare_true_names);
752 /* Recursive function to build the initial true name tree by
753 recursively traversing the current namespace. */
755 static void
756 build_tnt (gfc_symtree * st)
759 if (st == NULL)
760 return;
762 build_tnt (st->left);
763 build_tnt (st->right);
765 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
766 return;
768 add_true_name (st->n.sym);
772 /* Initialize the true name tree with the current namespace. */
774 static void
775 init_true_name_tree (void)
777 true_name_root = NULL;
779 build_tnt (gfc_current_ns->sym_root);
783 /* Recursively free a true name tree node. */
785 static void
786 free_true_name (true_name * t)
789 if (t == NULL)
790 return;
791 free_true_name (t->left);
792 free_true_name (t->right);
794 gfc_free (t);
798 /*****************************************************************/
800 /* Module reading and writing. */
802 typedef enum
804 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
806 atom_type;
808 static atom_type last_atom;
811 /* The name buffer must be at least as long as a symbol name. Right
812 now it's not clear how we're going to store numeric constants--
813 probably as a hexadecimal string, since this will allow the exact
814 number to be preserved (this can't be done by a decimal
815 representation). Worry about that later. TODO! */
817 #define MAX_ATOM_SIZE 100
819 static int atom_int;
820 static char *atom_string, atom_name[MAX_ATOM_SIZE];
823 /* Report problems with a module. Error reporting is not very
824 elaborate, since this sorts of errors shouldn't really happen.
825 This subroutine never returns. */
827 static void bad_module (const char *) ATTRIBUTE_NORETURN;
829 static void
830 bad_module (const char *msgid)
832 fclose (module_fp);
834 switch (iomode)
836 case IO_INPUT:
837 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
838 module_name, module_line, module_column, msgid);
839 break;
840 case IO_OUTPUT:
841 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
842 module_name, module_line, module_column, msgid);
843 break;
844 default:
845 gfc_fatal_error ("Module %s at line %d column %d: %s",
846 module_name, module_line, module_column, msgid);
847 break;
852 /* Set the module's input pointer. */
854 static void
855 set_module_locus (module_locus * m)
858 module_column = m->column;
859 module_line = m->line;
860 fsetpos (module_fp, &m->pos);
864 /* Get the module's input pointer so that we can restore it later. */
866 static void
867 get_module_locus (module_locus * m)
870 m->column = module_column;
871 m->line = module_line;
872 fgetpos (module_fp, &m->pos);
876 /* Get the next character in the module, updating our reckoning of
877 where we are. */
879 static int
880 module_char (void)
882 int c;
884 c = fgetc (module_fp);
886 if (c == EOF)
887 bad_module ("Unexpected EOF");
889 if (c == '\n')
891 module_line++;
892 module_column = 0;
895 module_column++;
896 return c;
900 /* Parse a string constant. The delimiter is guaranteed to be a
901 single quote. */
903 static void
904 parse_string (void)
906 module_locus start;
907 int len, c;
908 char *p;
910 get_module_locus (&start);
912 len = 0;
914 /* See how long the string is */
915 for ( ; ; )
917 c = module_char ();
918 if (c == EOF)
919 bad_module ("Unexpected end of module in string constant");
921 if (c != '\'')
923 len++;
924 continue;
927 c = module_char ();
928 if (c == '\'')
930 len++;
931 continue;
934 break;
937 set_module_locus (&start);
939 atom_string = p = gfc_getmem (len + 1);
941 for (; len > 0; len--)
943 c = module_char ();
944 if (c == '\'')
945 module_char (); /* Guaranteed to be another \' */
946 *p++ = c;
949 module_char (); /* Terminating \' */
950 *p = '\0'; /* C-style string for debug purposes */
954 /* Parse a small integer. */
956 static void
957 parse_integer (int c)
959 module_locus m;
961 atom_int = c - '0';
963 for (;;)
965 get_module_locus (&m);
967 c = module_char ();
968 if (!ISDIGIT (c))
969 break;
971 atom_int = 10 * atom_int + c - '0';
972 if (atom_int > 99999999)
973 bad_module ("Integer overflow");
976 set_module_locus (&m);
980 /* Parse a name. */
982 static void
983 parse_name (int c)
985 module_locus m;
986 char *p;
987 int len;
989 p = atom_name;
991 *p++ = c;
992 len = 1;
994 get_module_locus (&m);
996 for (;;)
998 c = module_char ();
999 if (!ISALNUM (c) && c != '_' && c != '-')
1000 break;
1002 *p++ = c;
1003 if (++len > GFC_MAX_SYMBOL_LEN)
1004 bad_module ("Name too long");
1007 *p = '\0';
1009 fseek (module_fp, -1, SEEK_CUR);
1010 module_column = m.column + len - 1;
1012 if (c == '\n')
1013 module_line--;
1017 /* Read the next atom in the module's input stream. */
1019 static atom_type
1020 parse_atom (void)
1022 int c;
1026 c = module_char ();
1028 while (c == ' ' || c == '\n');
1030 switch (c)
1032 case '(':
1033 return ATOM_LPAREN;
1035 case ')':
1036 return ATOM_RPAREN;
1038 case '\'':
1039 parse_string ();
1040 return ATOM_STRING;
1042 case '0':
1043 case '1':
1044 case '2':
1045 case '3':
1046 case '4':
1047 case '5':
1048 case '6':
1049 case '7':
1050 case '8':
1051 case '9':
1052 parse_integer (c);
1053 return ATOM_INTEGER;
1055 case 'a':
1056 case 'b':
1057 case 'c':
1058 case 'd':
1059 case 'e':
1060 case 'f':
1061 case 'g':
1062 case 'h':
1063 case 'i':
1064 case 'j':
1065 case 'k':
1066 case 'l':
1067 case 'm':
1068 case 'n':
1069 case 'o':
1070 case 'p':
1071 case 'q':
1072 case 'r':
1073 case 's':
1074 case 't':
1075 case 'u':
1076 case 'v':
1077 case 'w':
1078 case 'x':
1079 case 'y':
1080 case 'z':
1081 case 'A':
1082 case 'B':
1083 case 'C':
1084 case 'D':
1085 case 'E':
1086 case 'F':
1087 case 'G':
1088 case 'H':
1089 case 'I':
1090 case 'J':
1091 case 'K':
1092 case 'L':
1093 case 'M':
1094 case 'N':
1095 case 'O':
1096 case 'P':
1097 case 'Q':
1098 case 'R':
1099 case 'S':
1100 case 'T':
1101 case 'U':
1102 case 'V':
1103 case 'W':
1104 case 'X':
1105 case 'Y':
1106 case 'Z':
1107 parse_name (c);
1108 return ATOM_NAME;
1110 default:
1111 bad_module ("Bad name");
1114 /* Not reached */
1118 /* Peek at the next atom on the input. */
1120 static atom_type
1121 peek_atom (void)
1123 module_locus m;
1124 atom_type a;
1126 get_module_locus (&m);
1128 a = parse_atom ();
1129 if (a == ATOM_STRING)
1130 gfc_free (atom_string);
1132 set_module_locus (&m);
1133 return a;
1137 /* Read the next atom from the input, requiring that it be a
1138 particular kind. */
1140 static void
1141 require_atom (atom_type type)
1143 module_locus m;
1144 atom_type t;
1145 const char *p;
1147 get_module_locus (&m);
1149 t = parse_atom ();
1150 if (t != type)
1152 switch (type)
1154 case ATOM_NAME:
1155 p = _("Expected name");
1156 break;
1157 case ATOM_LPAREN:
1158 p = _("Expected left parenthesis");
1159 break;
1160 case ATOM_RPAREN:
1161 p = _("Expected right parenthesis");
1162 break;
1163 case ATOM_INTEGER:
1164 p = _("Expected integer");
1165 break;
1166 case ATOM_STRING:
1167 p = _("Expected string");
1168 break;
1169 default:
1170 gfc_internal_error ("require_atom(): bad atom type required");
1173 set_module_locus (&m);
1174 bad_module (p);
1179 /* Given a pointer to an mstring array, require that the current input
1180 be one of the strings in the array. We return the enum value. */
1182 static int
1183 find_enum (const mstring * m)
1185 int i;
1187 i = gfc_string2code (m, atom_name);
1188 if (i >= 0)
1189 return i;
1191 bad_module ("find_enum(): Enum not found");
1193 /* Not reached */
1197 /**************** Module output subroutines ***************************/
1199 /* Output a character to a module file. */
1201 static void
1202 write_char (char out)
1205 if (fputc (out, module_fp) == EOF)
1206 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1208 if (out != '\n')
1209 module_column++;
1210 else
1212 module_column = 1;
1213 module_line++;
1218 /* Write an atom to a module. The line wrapping isn't perfect, but it
1219 should work most of the time. This isn't that big of a deal, since
1220 the file really isn't meant to be read by people anyway. */
1222 static void
1223 write_atom (atom_type atom, const void *v)
1225 char buffer[20];
1226 int i, len;
1227 const char *p;
1229 switch (atom)
1231 case ATOM_STRING:
1232 case ATOM_NAME:
1233 p = v;
1234 break;
1236 case ATOM_LPAREN:
1237 p = "(";
1238 break;
1240 case ATOM_RPAREN:
1241 p = ")";
1242 break;
1244 case ATOM_INTEGER:
1245 i = *((const int *) v);
1246 if (i < 0)
1247 gfc_internal_error ("write_atom(): Writing negative integer");
1249 sprintf (buffer, "%d", i);
1250 p = buffer;
1251 break;
1253 default:
1254 gfc_internal_error ("write_atom(): Trying to write dab atom");
1258 len = strlen (p);
1260 if (atom != ATOM_RPAREN)
1262 if (module_column + len > 72)
1263 write_char ('\n');
1264 else
1267 if (last_atom != ATOM_LPAREN && module_column != 1)
1268 write_char (' ');
1272 if (atom == ATOM_STRING)
1273 write_char ('\'');
1275 while (*p)
1277 if (atom == ATOM_STRING && *p == '\'')
1278 write_char ('\'');
1279 write_char (*p++);
1282 if (atom == ATOM_STRING)
1283 write_char ('\'');
1285 last_atom = atom;
1290 /***************** Mid-level I/O subroutines *****************/
1292 /* These subroutines let their caller read or write atoms without
1293 caring about which of the two is actually happening. This lets a
1294 subroutine concentrate on the actual format of the data being
1295 written. */
1297 static void mio_expr (gfc_expr **);
1298 static void mio_symbol_ref (gfc_symbol **);
1299 static void mio_symtree_ref (gfc_symtree **);
1301 /* Read or write an enumerated value. On writing, we return the input
1302 value for the convenience of callers. We avoid using an integer
1303 pointer because enums are sometimes inside bitfields. */
1305 static int
1306 mio_name (int t, const mstring * m)
1309 if (iomode == IO_OUTPUT)
1310 write_atom (ATOM_NAME, gfc_code2string (m, t));
1311 else
1313 require_atom (ATOM_NAME);
1314 t = find_enum (m);
1317 return t;
1320 /* Specialization of mio_name. */
1322 #define DECL_MIO_NAME(TYPE) \
1323 static inline TYPE \
1324 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1326 return (TYPE)mio_name ((int)t, m); \
1328 #define MIO_NAME(TYPE) mio_name_##TYPE
1330 static void
1331 mio_lparen (void)
1334 if (iomode == IO_OUTPUT)
1335 write_atom (ATOM_LPAREN, NULL);
1336 else
1337 require_atom (ATOM_LPAREN);
1341 static void
1342 mio_rparen (void)
1345 if (iomode == IO_OUTPUT)
1346 write_atom (ATOM_RPAREN, NULL);
1347 else
1348 require_atom (ATOM_RPAREN);
1352 static void
1353 mio_integer (int *ip)
1356 if (iomode == IO_OUTPUT)
1357 write_atom (ATOM_INTEGER, ip);
1358 else
1360 require_atom (ATOM_INTEGER);
1361 *ip = atom_int;
1366 /* Read or write a character pointer that points to a string on the
1367 heap. */
1369 static const char *
1370 mio_allocated_string (const char *s)
1372 if (iomode == IO_OUTPUT)
1374 write_atom (ATOM_STRING, s);
1375 return s;
1377 else
1379 require_atom (ATOM_STRING);
1380 return atom_string;
1385 /* Read or write a string that is in static memory. */
1387 static void
1388 mio_pool_string (const char **stringp)
1390 /* TODO: one could write the string only once, and refer to it via a
1391 fixup pointer. */
1393 /* As a special case we have to deal with a NULL string. This
1394 happens for the 'module' member of 'gfc_symbol's that are not in a
1395 module. We read / write these as the empty string. */
1396 if (iomode == IO_OUTPUT)
1398 const char *p = *stringp == NULL ? "" : *stringp;
1399 write_atom (ATOM_STRING, p);
1401 else
1403 require_atom (ATOM_STRING);
1404 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1405 gfc_free (atom_string);
1410 /* Read or write a string that is inside of some already-allocated
1411 structure. */
1413 static void
1414 mio_internal_string (char *string)
1417 if (iomode == IO_OUTPUT)
1418 write_atom (ATOM_STRING, string);
1419 else
1421 require_atom (ATOM_STRING);
1422 strcpy (string, atom_string);
1423 gfc_free (atom_string);
1429 typedef enum
1430 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1431 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
1432 AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON,
1433 AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1434 AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT
1436 ab_attribute;
1438 static const mstring attr_bits[] =
1440 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1441 minit ("DIMENSION", AB_DIMENSION),
1442 minit ("EXTERNAL", AB_EXTERNAL),
1443 minit ("INTRINSIC", AB_INTRINSIC),
1444 minit ("OPTIONAL", AB_OPTIONAL),
1445 minit ("POINTER", AB_POINTER),
1446 minit ("SAVE", AB_SAVE),
1447 minit ("TARGET", AB_TARGET),
1448 minit ("DUMMY", AB_DUMMY),
1449 minit ("RESULT", AB_RESULT),
1450 minit ("DATA", AB_DATA),
1451 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1452 minit ("IN_COMMON", AB_IN_COMMON),
1453 minit ("FUNCTION", AB_FUNCTION),
1454 minit ("SUBROUTINE", AB_SUBROUTINE),
1455 minit ("SEQUENCE", AB_SEQUENCE),
1456 minit ("ELEMENTAL", AB_ELEMENTAL),
1457 minit ("PURE", AB_PURE),
1458 minit ("RECURSIVE", AB_RECURSIVE),
1459 minit ("GENERIC", AB_GENERIC),
1460 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1461 minit (NULL, -1)
1464 /* Specialization of mio_name. */
1465 DECL_MIO_NAME(ab_attribute)
1466 DECL_MIO_NAME(ar_type)
1467 DECL_MIO_NAME(array_type)
1468 DECL_MIO_NAME(bt)
1469 DECL_MIO_NAME(expr_t)
1470 DECL_MIO_NAME(gfc_access)
1471 DECL_MIO_NAME(gfc_intrinsic_op)
1472 DECL_MIO_NAME(ifsrc)
1473 DECL_MIO_NAME(procedure_type)
1474 DECL_MIO_NAME(ref_type)
1475 DECL_MIO_NAME(sym_flavor)
1476 DECL_MIO_NAME(sym_intent)
1477 #undef DECL_MIO_NAME
1479 /* Symbol attributes are stored in list with the first three elements
1480 being the enumerated fields, while the remaining elements (if any)
1481 indicate the individual attribute bits. The access field is not
1482 saved-- it controls what symbols are exported when a module is
1483 written. */
1485 static void
1486 mio_symbol_attribute (symbol_attribute * attr)
1488 atom_type t;
1490 mio_lparen ();
1492 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1493 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1494 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1495 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1497 if (iomode == IO_OUTPUT)
1499 if (attr->allocatable)
1500 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1501 if (attr->dimension)
1502 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1503 if (attr->external)
1504 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1505 if (attr->intrinsic)
1506 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1507 if (attr->optional)
1508 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1509 if (attr->pointer)
1510 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1511 if (attr->save)
1512 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1513 if (attr->target)
1514 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1515 if (attr->dummy)
1516 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1517 if (attr->result)
1518 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1519 /* We deliberately don't preserve the "entry" flag. */
1521 if (attr->data)
1522 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1523 if (attr->in_namelist)
1524 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1525 if (attr->in_common)
1526 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1528 if (attr->function)
1529 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1530 if (attr->subroutine)
1531 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1532 if (attr->generic)
1533 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1535 if (attr->sequence)
1536 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1537 if (attr->elemental)
1538 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1539 if (attr->pure)
1540 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1541 if (attr->recursive)
1542 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1543 if (attr->always_explicit)
1544 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1546 mio_rparen ();
1549 else
1552 for (;;)
1554 t = parse_atom ();
1555 if (t == ATOM_RPAREN)
1556 break;
1557 if (t != ATOM_NAME)
1558 bad_module ("Expected attribute bit name");
1560 switch ((ab_attribute) find_enum (attr_bits))
1562 case AB_ALLOCATABLE:
1563 attr->allocatable = 1;
1564 break;
1565 case AB_DIMENSION:
1566 attr->dimension = 1;
1567 break;
1568 case AB_EXTERNAL:
1569 attr->external = 1;
1570 break;
1571 case AB_INTRINSIC:
1572 attr->intrinsic = 1;
1573 break;
1574 case AB_OPTIONAL:
1575 attr->optional = 1;
1576 break;
1577 case AB_POINTER:
1578 attr->pointer = 1;
1579 break;
1580 case AB_SAVE:
1581 attr->save = 1;
1582 break;
1583 case AB_TARGET:
1584 attr->target = 1;
1585 break;
1586 case AB_DUMMY:
1587 attr->dummy = 1;
1588 break;
1589 case AB_RESULT:
1590 attr->result = 1;
1591 break;
1592 case AB_DATA:
1593 attr->data = 1;
1594 break;
1595 case AB_IN_NAMELIST:
1596 attr->in_namelist = 1;
1597 break;
1598 case AB_IN_COMMON:
1599 attr->in_common = 1;
1600 break;
1601 case AB_FUNCTION:
1602 attr->function = 1;
1603 break;
1604 case AB_SUBROUTINE:
1605 attr->subroutine = 1;
1606 break;
1607 case AB_GENERIC:
1608 attr->generic = 1;
1609 break;
1610 case AB_SEQUENCE:
1611 attr->sequence = 1;
1612 break;
1613 case AB_ELEMENTAL:
1614 attr->elemental = 1;
1615 break;
1616 case AB_PURE:
1617 attr->pure = 1;
1618 break;
1619 case AB_RECURSIVE:
1620 attr->recursive = 1;
1621 break;
1622 case AB_ALWAYS_EXPLICIT:
1623 attr->always_explicit = 1;
1624 break;
1631 static const mstring bt_types[] = {
1632 minit ("INTEGER", BT_INTEGER),
1633 minit ("REAL", BT_REAL),
1634 minit ("COMPLEX", BT_COMPLEX),
1635 minit ("LOGICAL", BT_LOGICAL),
1636 minit ("CHARACTER", BT_CHARACTER),
1637 minit ("DERIVED", BT_DERIVED),
1638 minit ("PROCEDURE", BT_PROCEDURE),
1639 minit ("UNKNOWN", BT_UNKNOWN),
1640 minit (NULL, -1)
1644 static void
1645 mio_charlen (gfc_charlen ** clp)
1647 gfc_charlen *cl;
1649 mio_lparen ();
1651 if (iomode == IO_OUTPUT)
1653 cl = *clp;
1654 if (cl != NULL)
1655 mio_expr (&cl->length);
1657 else
1660 if (peek_atom () != ATOM_RPAREN)
1662 cl = gfc_get_charlen ();
1663 mio_expr (&cl->length);
1665 *clp = cl;
1667 cl->next = gfc_current_ns->cl_list;
1668 gfc_current_ns->cl_list = cl;
1672 mio_rparen ();
1676 /* Return a symtree node with a name that is guaranteed to be unique
1677 within the namespace and corresponds to an illegal fortran name. */
1679 static gfc_symtree *
1680 get_unique_symtree (gfc_namespace * ns)
1682 char name[GFC_MAX_SYMBOL_LEN + 1];
1683 static int serial = 0;
1685 sprintf (name, "@%d", serial++);
1686 return gfc_new_symtree (&ns->sym_root, name);
1690 /* See if a name is a generated name. */
1692 static int
1693 check_unique_name (const char *name)
1696 return *name == '@';
1700 static void
1701 mio_typespec (gfc_typespec * ts)
1704 mio_lparen ();
1706 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1708 if (ts->type != BT_DERIVED)
1709 mio_integer (&ts->kind);
1710 else
1711 mio_symbol_ref (&ts->derived);
1713 mio_charlen (&ts->cl);
1715 mio_rparen ();
1719 static const mstring array_spec_types[] = {
1720 minit ("EXPLICIT", AS_EXPLICIT),
1721 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1722 minit ("DEFERRED", AS_DEFERRED),
1723 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1724 minit (NULL, -1)
1728 static void
1729 mio_array_spec (gfc_array_spec ** asp)
1731 gfc_array_spec *as;
1732 int i;
1734 mio_lparen ();
1736 if (iomode == IO_OUTPUT)
1738 if (*asp == NULL)
1739 goto done;
1740 as = *asp;
1742 else
1744 if (peek_atom () == ATOM_RPAREN)
1746 *asp = NULL;
1747 goto done;
1750 *asp = as = gfc_get_array_spec ();
1753 mio_integer (&as->rank);
1754 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1756 for (i = 0; i < as->rank; i++)
1758 mio_expr (&as->lower[i]);
1759 mio_expr (&as->upper[i]);
1762 done:
1763 mio_rparen ();
1767 /* Given a pointer to an array reference structure (which lives in a
1768 gfc_ref structure), find the corresponding array specification
1769 structure. Storing the pointer in the ref structure doesn't quite
1770 work when loading from a module. Generating code for an array
1771 reference also needs more information than just the array spec. */
1773 static const mstring array_ref_types[] = {
1774 minit ("FULL", AR_FULL),
1775 minit ("ELEMENT", AR_ELEMENT),
1776 minit ("SECTION", AR_SECTION),
1777 minit (NULL, -1)
1780 static void
1781 mio_array_ref (gfc_array_ref * ar)
1783 int i;
1785 mio_lparen ();
1786 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1787 mio_integer (&ar->dimen);
1789 switch (ar->type)
1791 case AR_FULL:
1792 break;
1794 case AR_ELEMENT:
1795 for (i = 0; i < ar->dimen; i++)
1796 mio_expr (&ar->start[i]);
1798 break;
1800 case AR_SECTION:
1801 for (i = 0; i < ar->dimen; i++)
1803 mio_expr (&ar->start[i]);
1804 mio_expr (&ar->end[i]);
1805 mio_expr (&ar->stride[i]);
1808 break;
1810 case AR_UNKNOWN:
1811 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1814 for (i = 0; i < ar->dimen; i++)
1815 mio_integer ((int *) &ar->dimen_type[i]);
1817 if (iomode == IO_INPUT)
1819 ar->where = gfc_current_locus;
1821 for (i = 0; i < ar->dimen; i++)
1822 ar->c_where[i] = gfc_current_locus;
1825 mio_rparen ();
1829 /* Saves or restores a pointer. The pointer is converted back and
1830 forth from an integer. We return the pointer_info pointer so that
1831 the caller can take additional action based on the pointer type. */
1833 static pointer_info *
1834 mio_pointer_ref (void *gp)
1836 pointer_info *p;
1838 if (iomode == IO_OUTPUT)
1840 p = get_pointer (*((char **) gp));
1841 write_atom (ATOM_INTEGER, &p->integer);
1843 else
1845 require_atom (ATOM_INTEGER);
1846 p = add_fixup (atom_int, gp);
1849 return p;
1853 /* Save and load references to components that occur within
1854 expressions. We have to describe these references by a number and
1855 by name. The number is necessary for forward references during
1856 reading, and the name is necessary if the symbol already exists in
1857 the namespace and is not loaded again. */
1859 static void
1860 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1862 char name[GFC_MAX_SYMBOL_LEN + 1];
1863 gfc_component *q;
1864 pointer_info *p;
1866 p = mio_pointer_ref (cp);
1867 if (p->type == P_UNKNOWN)
1868 p->type = P_COMPONENT;
1870 if (iomode == IO_OUTPUT)
1871 mio_pool_string (&(*cp)->name);
1872 else
1874 mio_internal_string (name);
1876 /* It can happen that a component reference can be read before the
1877 associated derived type symbol has been loaded. Return now and
1878 wait for a later iteration of load_needed. */
1879 if (sym == NULL)
1880 return;
1882 if (sym->components != NULL && p->u.pointer == NULL)
1884 /* Symbol already loaded, so search by name. */
1885 for (q = sym->components; q; q = q->next)
1886 if (strcmp (q->name, name) == 0)
1887 break;
1889 if (q == NULL)
1890 gfc_internal_error ("mio_component_ref(): Component not found");
1892 associate_integer_pointer (p, q);
1895 /* Make sure this symbol will eventually be loaded. */
1896 p = find_pointer2 (sym);
1897 if (p->u.rsym.state == UNUSED)
1898 p->u.rsym.state = NEEDED;
1903 static void
1904 mio_component (gfc_component * c)
1906 pointer_info *p;
1907 int n;
1909 mio_lparen ();
1911 if (iomode == IO_OUTPUT)
1913 p = get_pointer (c);
1914 mio_integer (&p->integer);
1916 else
1918 mio_integer (&n);
1919 p = get_integer (n);
1920 associate_integer_pointer (p, c);
1923 if (p->type == P_UNKNOWN)
1924 p->type = P_COMPONENT;
1926 mio_pool_string (&c->name);
1927 mio_typespec (&c->ts);
1928 mio_array_spec (&c->as);
1930 mio_integer (&c->dimension);
1931 mio_integer (&c->pointer);
1933 mio_expr (&c->initializer);
1934 mio_rparen ();
1938 static void
1939 mio_component_list (gfc_component ** cp)
1941 gfc_component *c, *tail;
1943 mio_lparen ();
1945 if (iomode == IO_OUTPUT)
1947 for (c = *cp; c; c = c->next)
1948 mio_component (c);
1950 else
1953 *cp = NULL;
1954 tail = NULL;
1956 for (;;)
1958 if (peek_atom () == ATOM_RPAREN)
1959 break;
1961 c = gfc_get_component ();
1962 mio_component (c);
1964 if (tail == NULL)
1965 *cp = c;
1966 else
1967 tail->next = c;
1969 tail = c;
1973 mio_rparen ();
1977 static void
1978 mio_actual_arg (gfc_actual_arglist * a)
1981 mio_lparen ();
1982 mio_pool_string (&a->name);
1983 mio_expr (&a->expr);
1984 mio_rparen ();
1988 static void
1989 mio_actual_arglist (gfc_actual_arglist ** ap)
1991 gfc_actual_arglist *a, *tail;
1993 mio_lparen ();
1995 if (iomode == IO_OUTPUT)
1997 for (a = *ap; a; a = a->next)
1998 mio_actual_arg (a);
2001 else
2003 tail = NULL;
2005 for (;;)
2007 if (peek_atom () != ATOM_LPAREN)
2008 break;
2010 a = gfc_get_actual_arglist ();
2012 if (tail == NULL)
2013 *ap = a;
2014 else
2015 tail->next = a;
2017 tail = a;
2018 mio_actual_arg (a);
2022 mio_rparen ();
2026 /* Read and write formal argument lists. */
2028 static void
2029 mio_formal_arglist (gfc_symbol * sym)
2031 gfc_formal_arglist *f, *tail;
2033 mio_lparen ();
2035 if (iomode == IO_OUTPUT)
2037 for (f = sym->formal; f; f = f->next)
2038 mio_symbol_ref (&f->sym);
2041 else
2043 sym->formal = tail = NULL;
2045 while (peek_atom () != ATOM_RPAREN)
2047 f = gfc_get_formal_arglist ();
2048 mio_symbol_ref (&f->sym);
2050 if (sym->formal == NULL)
2051 sym->formal = f;
2052 else
2053 tail->next = f;
2055 tail = f;
2059 mio_rparen ();
2063 /* Save or restore a reference to a symbol node. */
2065 void
2066 mio_symbol_ref (gfc_symbol ** symp)
2068 pointer_info *p;
2070 p = mio_pointer_ref (symp);
2071 if (p->type == P_UNKNOWN)
2072 p->type = P_SYMBOL;
2074 if (iomode == IO_OUTPUT)
2076 if (p->u.wsym.state == UNREFERENCED)
2077 p->u.wsym.state = NEEDS_WRITE;
2079 else
2081 if (p->u.rsym.state == UNUSED)
2082 p->u.rsym.state = NEEDED;
2087 /* Save or restore a reference to a symtree node. */
2089 static void
2090 mio_symtree_ref (gfc_symtree ** stp)
2092 pointer_info *p;
2093 fixup_t *f;
2094 gfc_symtree * ns_st = NULL;
2096 if (iomode == IO_OUTPUT)
2098 /* If this is a symtree for a symbol that came from a contained module
2099 namespace, it has a unique name and we should look in the current
2100 namespace to see if the required, non-contained symbol is available
2101 yet. If so, the latter should be written. */
2102 if ((*stp)->n.sym && check_unique_name((*stp)->name))
2103 ns_st = gfc_find_symtree (gfc_current_ns->sym_root, (*stp)->n.sym->name);
2105 mio_symbol_ref (ns_st ? &ns_st->n.sym : &(*stp)->n.sym);
2107 else
2109 require_atom (ATOM_INTEGER);
2110 p = get_integer (atom_int);
2111 if (p->type == P_UNKNOWN)
2112 p->type = P_SYMBOL;
2114 if (p->u.rsym.state == UNUSED)
2115 p->u.rsym.state = NEEDED;
2117 if (p->u.rsym.symtree != NULL)
2119 *stp = p->u.rsym.symtree;
2121 else
2123 f = gfc_getmem (sizeof (fixup_t));
2125 f->next = p->u.rsym.stfixup;
2126 p->u.rsym.stfixup = f;
2128 f->pointer = (void **)stp;
2133 static void
2134 mio_iterator (gfc_iterator ** ip)
2136 gfc_iterator *iter;
2138 mio_lparen ();
2140 if (iomode == IO_OUTPUT)
2142 if (*ip == NULL)
2143 goto done;
2145 else
2147 if (peek_atom () == ATOM_RPAREN)
2149 *ip = NULL;
2150 goto done;
2153 *ip = gfc_get_iterator ();
2156 iter = *ip;
2158 mio_expr (&iter->var);
2159 mio_expr (&iter->start);
2160 mio_expr (&iter->end);
2161 mio_expr (&iter->step);
2163 done:
2164 mio_rparen ();
2169 static void
2170 mio_constructor (gfc_constructor ** cp)
2172 gfc_constructor *c, *tail;
2174 mio_lparen ();
2176 if (iomode == IO_OUTPUT)
2178 for (c = *cp; c; c = c->next)
2180 mio_lparen ();
2181 mio_expr (&c->expr);
2182 mio_iterator (&c->iterator);
2183 mio_rparen ();
2186 else
2189 *cp = NULL;
2190 tail = NULL;
2192 while (peek_atom () != ATOM_RPAREN)
2194 c = gfc_get_constructor ();
2196 if (tail == NULL)
2197 *cp = c;
2198 else
2199 tail->next = c;
2201 tail = c;
2203 mio_lparen ();
2204 mio_expr (&c->expr);
2205 mio_iterator (&c->iterator);
2206 mio_rparen ();
2210 mio_rparen ();
2215 static const mstring ref_types[] = {
2216 minit ("ARRAY", REF_ARRAY),
2217 minit ("COMPONENT", REF_COMPONENT),
2218 minit ("SUBSTRING", REF_SUBSTRING),
2219 minit (NULL, -1)
2223 static void
2224 mio_ref (gfc_ref ** rp)
2226 gfc_ref *r;
2228 mio_lparen ();
2230 r = *rp;
2231 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2233 switch (r->type)
2235 case REF_ARRAY:
2236 mio_array_ref (&r->u.ar);
2237 break;
2239 case REF_COMPONENT:
2240 mio_symbol_ref (&r->u.c.sym);
2241 mio_component_ref (&r->u.c.component, r->u.c.sym);
2242 break;
2244 case REF_SUBSTRING:
2245 mio_expr (&r->u.ss.start);
2246 mio_expr (&r->u.ss.end);
2247 mio_charlen (&r->u.ss.length);
2248 break;
2251 mio_rparen ();
2255 static void
2256 mio_ref_list (gfc_ref ** rp)
2258 gfc_ref *ref, *head, *tail;
2260 mio_lparen ();
2262 if (iomode == IO_OUTPUT)
2264 for (ref = *rp; ref; ref = ref->next)
2265 mio_ref (&ref);
2267 else
2269 head = tail = NULL;
2271 while (peek_atom () != ATOM_RPAREN)
2273 if (head == NULL)
2274 head = tail = gfc_get_ref ();
2275 else
2277 tail->next = gfc_get_ref ();
2278 tail = tail->next;
2281 mio_ref (&tail);
2284 *rp = head;
2287 mio_rparen ();
2291 /* Read and write an integer value. */
2293 static void
2294 mio_gmp_integer (mpz_t * integer)
2296 char *p;
2298 if (iomode == IO_INPUT)
2300 if (parse_atom () != ATOM_STRING)
2301 bad_module ("Expected integer string");
2303 mpz_init (*integer);
2304 if (mpz_set_str (*integer, atom_string, 10))
2305 bad_module ("Error converting integer");
2307 gfc_free (atom_string);
2310 else
2312 p = mpz_get_str (NULL, 10, *integer);
2313 write_atom (ATOM_STRING, p);
2314 gfc_free (p);
2319 static void
2320 mio_gmp_real (mpfr_t * real)
2322 mp_exp_t exponent;
2323 char *p;
2325 if (iomode == IO_INPUT)
2327 if (parse_atom () != ATOM_STRING)
2328 bad_module ("Expected real string");
2330 mpfr_init (*real);
2331 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2332 gfc_free (atom_string);
2335 else
2337 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2338 atom_string = gfc_getmem (strlen (p) + 20);
2340 sprintf (atom_string, "0.%s@%ld", p, exponent);
2342 /* Fix negative numbers. */
2343 if (atom_string[2] == '-')
2345 atom_string[0] = '-';
2346 atom_string[1] = '0';
2347 atom_string[2] = '.';
2350 write_atom (ATOM_STRING, atom_string);
2352 gfc_free (atom_string);
2353 gfc_free (p);
2358 /* Save and restore the shape of an array constructor. */
2360 static void
2361 mio_shape (mpz_t ** pshape, int rank)
2363 mpz_t *shape;
2364 atom_type t;
2365 int n;
2367 /* A NULL shape is represented by (). */
2368 mio_lparen ();
2370 if (iomode == IO_OUTPUT)
2372 shape = *pshape;
2373 if (!shape)
2375 mio_rparen ();
2376 return;
2379 else
2381 t = peek_atom ();
2382 if (t == ATOM_RPAREN)
2384 *pshape = NULL;
2385 mio_rparen ();
2386 return;
2389 shape = gfc_get_shape (rank);
2390 *pshape = shape;
2393 for (n = 0; n < rank; n++)
2394 mio_gmp_integer (&shape[n]);
2396 mio_rparen ();
2400 static const mstring expr_types[] = {
2401 minit ("OP", EXPR_OP),
2402 minit ("FUNCTION", EXPR_FUNCTION),
2403 minit ("CONSTANT", EXPR_CONSTANT),
2404 minit ("VARIABLE", EXPR_VARIABLE),
2405 minit ("SUBSTRING", EXPR_SUBSTRING),
2406 minit ("STRUCTURE", EXPR_STRUCTURE),
2407 minit ("ARRAY", EXPR_ARRAY),
2408 minit ("NULL", EXPR_NULL),
2409 minit (NULL, -1)
2412 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2413 generic operators, not in expressions. INTRINSIC_USER is also
2414 replaced by the correct function name by the time we see it. */
2416 static const mstring intrinsics[] =
2418 minit ("UPLUS", INTRINSIC_UPLUS),
2419 minit ("UMINUS", INTRINSIC_UMINUS),
2420 minit ("PLUS", INTRINSIC_PLUS),
2421 minit ("MINUS", INTRINSIC_MINUS),
2422 minit ("TIMES", INTRINSIC_TIMES),
2423 minit ("DIVIDE", INTRINSIC_DIVIDE),
2424 minit ("POWER", INTRINSIC_POWER),
2425 minit ("CONCAT", INTRINSIC_CONCAT),
2426 minit ("AND", INTRINSIC_AND),
2427 minit ("OR", INTRINSIC_OR),
2428 minit ("EQV", INTRINSIC_EQV),
2429 minit ("NEQV", INTRINSIC_NEQV),
2430 minit ("EQ", INTRINSIC_EQ),
2431 minit ("NE", INTRINSIC_NE),
2432 minit ("GT", INTRINSIC_GT),
2433 minit ("GE", INTRINSIC_GE),
2434 minit ("LT", INTRINSIC_LT),
2435 minit ("LE", INTRINSIC_LE),
2436 minit ("NOT", INTRINSIC_NOT),
2437 minit (NULL, -1)
2440 /* Read and write expressions. The form "()" is allowed to indicate a
2441 NULL expression. */
2443 static void
2444 mio_expr (gfc_expr ** ep)
2446 gfc_expr *e;
2447 atom_type t;
2448 int flag;
2450 mio_lparen ();
2452 if (iomode == IO_OUTPUT)
2454 if (*ep == NULL)
2456 mio_rparen ();
2457 return;
2460 e = *ep;
2461 MIO_NAME(expr_t) (e->expr_type, expr_types);
2464 else
2466 t = parse_atom ();
2467 if (t == ATOM_RPAREN)
2469 *ep = NULL;
2470 return;
2473 if (t != ATOM_NAME)
2474 bad_module ("Expected expression type");
2476 e = *ep = gfc_get_expr ();
2477 e->where = gfc_current_locus;
2478 e->expr_type = (expr_t) find_enum (expr_types);
2481 mio_typespec (&e->ts);
2482 mio_integer (&e->rank);
2484 switch (e->expr_type)
2486 case EXPR_OP:
2487 e->value.op.operator
2488 = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2490 switch (e->value.op.operator)
2492 case INTRINSIC_UPLUS:
2493 case INTRINSIC_UMINUS:
2494 case INTRINSIC_NOT:
2495 mio_expr (&e->value.op.op1);
2496 break;
2498 case INTRINSIC_PLUS:
2499 case INTRINSIC_MINUS:
2500 case INTRINSIC_TIMES:
2501 case INTRINSIC_DIVIDE:
2502 case INTRINSIC_POWER:
2503 case INTRINSIC_CONCAT:
2504 case INTRINSIC_AND:
2505 case INTRINSIC_OR:
2506 case INTRINSIC_EQV:
2507 case INTRINSIC_NEQV:
2508 case INTRINSIC_EQ:
2509 case INTRINSIC_NE:
2510 case INTRINSIC_GT:
2511 case INTRINSIC_GE:
2512 case INTRINSIC_LT:
2513 case INTRINSIC_LE:
2514 mio_expr (&e->value.op.op1);
2515 mio_expr (&e->value.op.op2);
2516 break;
2518 default:
2519 bad_module ("Bad operator");
2522 break;
2524 case EXPR_FUNCTION:
2525 mio_symtree_ref (&e->symtree);
2526 mio_actual_arglist (&e->value.function.actual);
2528 if (iomode == IO_OUTPUT)
2530 e->value.function.name
2531 = mio_allocated_string (e->value.function.name);
2532 flag = e->value.function.esym != NULL;
2533 mio_integer (&flag);
2534 if (flag)
2535 mio_symbol_ref (&e->value.function.esym);
2536 else
2537 write_atom (ATOM_STRING, e->value.function.isym->name);
2540 else
2542 require_atom (ATOM_STRING);
2543 e->value.function.name = gfc_get_string (atom_string);
2544 gfc_free (atom_string);
2546 mio_integer (&flag);
2547 if (flag)
2548 mio_symbol_ref (&e->value.function.esym);
2549 else
2551 require_atom (ATOM_STRING);
2552 e->value.function.isym = gfc_find_function (atom_string);
2553 gfc_free (atom_string);
2557 break;
2559 case EXPR_VARIABLE:
2560 mio_symtree_ref (&e->symtree);
2561 mio_ref_list (&e->ref);
2562 break;
2564 case EXPR_SUBSTRING:
2565 e->value.character.string = (char *)
2566 mio_allocated_string (e->value.character.string);
2567 mio_ref_list (&e->ref);
2568 break;
2570 case EXPR_STRUCTURE:
2571 case EXPR_ARRAY:
2572 mio_constructor (&e->value.constructor);
2573 mio_shape (&e->shape, e->rank);
2574 break;
2576 case EXPR_CONSTANT:
2577 switch (e->ts.type)
2579 case BT_INTEGER:
2580 mio_gmp_integer (&e->value.integer);
2581 break;
2583 case BT_REAL:
2584 gfc_set_model_kind (e->ts.kind);
2585 mio_gmp_real (&e->value.real);
2586 break;
2588 case BT_COMPLEX:
2589 gfc_set_model_kind (e->ts.kind);
2590 mio_gmp_real (&e->value.complex.r);
2591 mio_gmp_real (&e->value.complex.i);
2592 break;
2594 case BT_LOGICAL:
2595 mio_integer (&e->value.logical);
2596 break;
2598 case BT_CHARACTER:
2599 mio_integer (&e->value.character.length);
2600 e->value.character.string = (char *)
2601 mio_allocated_string (e->value.character.string);
2602 break;
2604 default:
2605 bad_module ("Bad type in constant expression");
2608 break;
2610 case EXPR_NULL:
2611 break;
2614 mio_rparen ();
2618 /* Read and write namelists */
2620 static void
2621 mio_namelist (gfc_symbol * sym)
2623 gfc_namelist *n, *m;
2624 const char *check_name;
2626 mio_lparen ();
2628 if (iomode == IO_OUTPUT)
2630 for (n = sym->namelist; n; n = n->next)
2631 mio_symbol_ref (&n->sym);
2633 else
2635 /* This departure from the standard is flagged as an error.
2636 It does, in fact, work correctly. TODO: Allow it
2637 conditionally? */
2638 if (sym->attr.flavor == FL_NAMELIST)
2640 check_name = find_use_name (sym->name);
2641 if (check_name && strcmp (check_name, sym->name) != 0)
2642 gfc_error("Namelist %s cannot be renamed by USE"
2643 " association to %s.",
2644 sym->name, check_name);
2647 m = NULL;
2648 while (peek_atom () != ATOM_RPAREN)
2650 n = gfc_get_namelist ();
2651 mio_symbol_ref (&n->sym);
2653 if (sym->namelist == NULL)
2654 sym->namelist = n;
2655 else
2656 m->next = n;
2658 m = n;
2660 sym->namelist_tail = m;
2663 mio_rparen ();
2667 /* Save/restore lists of gfc_interface stuctures. When loading an
2668 interface, we are really appending to the existing list of
2669 interfaces. Checking for duplicate and ambiguous interfaces has to
2670 be done later when all symbols have been loaded. */
2672 static void
2673 mio_interface_rest (gfc_interface ** ip)
2675 gfc_interface *tail, *p;
2677 if (iomode == IO_OUTPUT)
2679 if (ip != NULL)
2680 for (p = *ip; p; p = p->next)
2681 mio_symbol_ref (&p->sym);
2683 else
2686 if (*ip == NULL)
2687 tail = NULL;
2688 else
2690 tail = *ip;
2691 while (tail->next)
2692 tail = tail->next;
2695 for (;;)
2697 if (peek_atom () == ATOM_RPAREN)
2698 break;
2700 p = gfc_get_interface ();
2701 p->where = gfc_current_locus;
2702 mio_symbol_ref (&p->sym);
2704 if (tail == NULL)
2705 *ip = p;
2706 else
2707 tail->next = p;
2709 tail = p;
2713 mio_rparen ();
2717 /* Save/restore a nameless operator interface. */
2719 static void
2720 mio_interface (gfc_interface ** ip)
2723 mio_lparen ();
2724 mio_interface_rest (ip);
2728 /* Save/restore a named operator interface. */
2730 static void
2731 mio_symbol_interface (const char **name, const char **module,
2732 gfc_interface ** ip)
2735 mio_lparen ();
2737 mio_pool_string (name);
2738 mio_pool_string (module);
2740 mio_interface_rest (ip);
2744 static void
2745 mio_namespace_ref (gfc_namespace ** nsp)
2747 gfc_namespace *ns;
2748 pointer_info *p;
2750 p = mio_pointer_ref (nsp);
2752 if (p->type == P_UNKNOWN)
2753 p->type = P_NAMESPACE;
2755 if (iomode == IO_INPUT && p->integer != 0)
2757 ns = (gfc_namespace *)p->u.pointer;
2758 if (ns == NULL)
2760 ns = gfc_get_namespace (NULL, 0);
2761 associate_integer_pointer (p, ns);
2763 else
2764 ns->refs++;
2769 /* Unlike most other routines, the address of the symbol node is
2770 already fixed on input and the name/module has already been filled
2771 in. */
2773 static void
2774 mio_symbol (gfc_symbol * sym)
2776 gfc_formal_arglist *formal;
2778 mio_lparen ();
2780 mio_symbol_attribute (&sym->attr);
2781 mio_typespec (&sym->ts);
2783 /* Contained procedures don't have formal namespaces. Instead we output the
2784 procedure namespace. The will contain the formal arguments. */
2785 if (iomode == IO_OUTPUT)
2787 formal = sym->formal;
2788 while (formal && !formal->sym)
2789 formal = formal->next;
2791 if (formal)
2792 mio_namespace_ref (&formal->sym->ns);
2793 else
2794 mio_namespace_ref (&sym->formal_ns);
2796 else
2798 mio_namespace_ref (&sym->formal_ns);
2799 if (sym->formal_ns)
2801 sym->formal_ns->proc_name = sym;
2802 sym->refs++;
2806 /* Save/restore common block links */
2807 mio_symbol_ref (&sym->common_next);
2809 mio_formal_arglist (sym);
2811 if (sym->attr.flavor == FL_PARAMETER)
2812 mio_expr (&sym->value);
2814 mio_array_spec (&sym->as);
2816 mio_symbol_ref (&sym->result);
2818 /* Note that components are always saved, even if they are supposed
2819 to be private. Component access is checked during searching. */
2821 mio_component_list (&sym->components);
2823 if (sym->components != NULL)
2824 sym->component_access =
2825 MIO_NAME(gfc_access) (sym->component_access, access_types);
2827 mio_namelist (sym);
2828 mio_rparen ();
2832 /************************* Top level subroutines *************************/
2834 /* Skip a list between balanced left and right parens. */
2836 static void
2837 skip_list (void)
2839 int level;
2841 level = 0;
2844 switch (parse_atom ())
2846 case ATOM_LPAREN:
2847 level++;
2848 break;
2850 case ATOM_RPAREN:
2851 level--;
2852 break;
2854 case ATOM_STRING:
2855 gfc_free (atom_string);
2856 break;
2858 case ATOM_NAME:
2859 case ATOM_INTEGER:
2860 break;
2863 while (level > 0);
2867 /* Load operator interfaces from the module. Interfaces are unusual
2868 in that they attach themselves to existing symbols. */
2870 static void
2871 load_operator_interfaces (void)
2873 const char *p;
2874 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2875 gfc_user_op *uop;
2877 mio_lparen ();
2879 while (peek_atom () != ATOM_RPAREN)
2881 mio_lparen ();
2883 mio_internal_string (name);
2884 mio_internal_string (module);
2886 /* Decide if we need to load this one or not. */
2887 p = find_use_name (name);
2888 if (p == NULL)
2890 while (parse_atom () != ATOM_RPAREN);
2892 else
2894 uop = gfc_get_uop (p);
2895 mio_interface_rest (&uop->operator);
2899 mio_rparen ();
2903 /* Load interfaces from the module. Interfaces are unusual in that
2904 they attach themselves to existing symbols. */
2906 static void
2907 load_generic_interfaces (void)
2909 const char *p;
2910 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2911 gfc_symbol *sym;
2913 mio_lparen ();
2915 while (peek_atom () != ATOM_RPAREN)
2917 mio_lparen ();
2919 mio_internal_string (name);
2920 mio_internal_string (module);
2922 /* Decide if we need to load this one or not. */
2923 p = find_use_name (name);
2925 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2927 while (parse_atom () != ATOM_RPAREN);
2928 continue;
2931 if (sym == NULL)
2933 gfc_get_symbol (p, NULL, &sym);
2935 sym->attr.flavor = FL_PROCEDURE;
2936 sym->attr.generic = 1;
2937 sym->attr.use_assoc = 1;
2940 mio_interface_rest (&sym->generic);
2943 mio_rparen ();
2947 /* Load common blocks. */
2949 static void
2950 load_commons(void)
2952 char name[GFC_MAX_SYMBOL_LEN+1];
2953 gfc_common_head *p;
2955 mio_lparen ();
2957 while (peek_atom () != ATOM_RPAREN)
2959 mio_lparen ();
2960 mio_internal_string (name);
2962 p = gfc_get_common (name, 1);
2964 mio_symbol_ref (&p->head);
2965 mio_integer (&p->saved);
2966 p->use_assoc = 1;
2968 mio_rparen();
2971 mio_rparen();
2974 /* load_equiv()-- Load equivalences. */
2976 static void
2977 load_equiv(void)
2979 gfc_equiv *head, *tail, *end;
2981 mio_lparen();
2983 end = gfc_current_ns->equiv;
2984 while(end != NULL && end->next != NULL)
2985 end = end->next;
2987 while(peek_atom() != ATOM_RPAREN) {
2988 mio_lparen();
2989 head = tail = NULL;
2991 while(peek_atom() != ATOM_RPAREN)
2993 if (head == NULL)
2994 head = tail = gfc_get_equiv();
2995 else
2997 tail->eq = gfc_get_equiv();
2998 tail = tail->eq;
3001 mio_pool_string(&tail->module);
3002 mio_expr(&tail->expr);
3005 if (end == NULL)
3006 gfc_current_ns->equiv = head;
3007 else
3008 end->next = head;
3010 end = head;
3011 mio_rparen();
3014 mio_rparen();
3017 /* Recursive function to traverse the pointer_info tree and load a
3018 needed symbol. We return nonzero if we load a symbol and stop the
3019 traversal, because the act of loading can alter the tree. */
3021 static int
3022 load_needed (pointer_info * p)
3024 gfc_namespace *ns;
3025 pointer_info *q;
3026 gfc_symbol *sym;
3028 if (p == NULL)
3029 return 0;
3030 if (load_needed (p->left))
3031 return 1;
3032 if (load_needed (p->right))
3033 return 1;
3035 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3036 return 0;
3038 p->u.rsym.state = USED;
3040 set_module_locus (&p->u.rsym.where);
3042 sym = p->u.rsym.sym;
3043 if (sym == NULL)
3045 q = get_integer (p->u.rsym.ns);
3047 ns = (gfc_namespace *) q->u.pointer;
3048 if (ns == NULL)
3050 /* Create an interface namespace if necessary. These are
3051 the namespaces that hold the formal parameters of module
3052 procedures. */
3054 ns = gfc_get_namespace (NULL, 0);
3055 associate_integer_pointer (q, ns);
3058 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3059 sym->module = gfc_get_string (p->u.rsym.module);
3061 associate_integer_pointer (p, sym);
3064 mio_symbol (sym);
3065 sym->attr.use_assoc = 1;
3067 return 1;
3071 /* Recursive function for cleaning up things after a module has been
3072 read. */
3074 static void
3075 read_cleanup (pointer_info * p)
3077 gfc_symtree *st;
3078 pointer_info *q;
3080 if (p == NULL)
3081 return;
3083 read_cleanup (p->left);
3084 read_cleanup (p->right);
3086 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3088 /* Add hidden symbols to the symtree. */
3089 q = get_integer (p->u.rsym.ns);
3090 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3092 st->n.sym = p->u.rsym.sym;
3093 st->n.sym->refs++;
3095 /* Fixup any symtree references. */
3096 p->u.rsym.symtree = st;
3097 resolve_fixups (p->u.rsym.stfixup, st);
3098 p->u.rsym.stfixup = NULL;
3101 /* Free unused symbols. */
3102 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3103 gfc_free_symbol (p->u.rsym.sym);
3107 /* Read a module file. */
3109 static void
3110 read_module (void)
3112 module_locus operator_interfaces, user_operators;
3113 const char *p;
3114 char name[GFC_MAX_SYMBOL_LEN + 1];
3115 gfc_intrinsic_op i;
3116 int ambiguous, j, nuse, symbol;
3117 pointer_info *info;
3118 gfc_use_rename *u;
3119 gfc_symtree *st;
3120 gfc_symbol *sym;
3122 get_module_locus (&operator_interfaces); /* Skip these for now */
3123 skip_list ();
3125 get_module_locus (&user_operators);
3126 skip_list ();
3127 skip_list ();
3129 /* Skip commons and equivalences for now. */
3130 skip_list ();
3131 skip_list ();
3133 mio_lparen ();
3135 /* Create the fixup nodes for all the symbols. */
3137 while (peek_atom () != ATOM_RPAREN)
3139 require_atom (ATOM_INTEGER);
3140 info = get_integer (atom_int);
3142 info->type = P_SYMBOL;
3143 info->u.rsym.state = UNUSED;
3145 mio_internal_string (info->u.rsym.true_name);
3146 mio_internal_string (info->u.rsym.module);
3148 require_atom (ATOM_INTEGER);
3149 info->u.rsym.ns = atom_int;
3151 get_module_locus (&info->u.rsym.where);
3152 skip_list ();
3154 /* See if the symbol has already been loaded by a previous module.
3155 If so, we reference the existing symbol and prevent it from
3156 being loaded again. */
3158 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3160 /* See if the symbol has already been loaded by a previous module.
3161 If so, we reference the existing symbol and prevent it from
3162 being loaded again. This should not happen if the symbol being
3163 read is an index for an assumed shape dummy array (ns != 1). */
3165 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3167 if (sym == NULL
3168 || (sym->attr.flavor == FL_VARIABLE
3169 && info->u.rsym.ns !=1))
3170 continue;
3172 info->u.rsym.state = USED;
3173 info->u.rsym.referenced = 1;
3174 info->u.rsym.sym = sym;
3177 mio_rparen ();
3179 /* Parse the symtree lists. This lets us mark which symbols need to
3180 be loaded. Renaming is also done at this point by replacing the
3181 symtree name. */
3183 mio_lparen ();
3185 while (peek_atom () != ATOM_RPAREN)
3187 mio_internal_string (name);
3188 mio_integer (&ambiguous);
3189 mio_integer (&symbol);
3191 info = get_integer (symbol);
3193 /* See how many use names there are. If none, go through the start
3194 of the loop at least once. */
3195 nuse = number_use_names (name);
3196 if (nuse == 0)
3197 nuse = 1;
3199 for (j = 1; j <= nuse; j++)
3201 /* Get the jth local name for this symbol. */
3202 p = find_use_name_n (name, &j);
3204 /* Skip symtree nodes not in an ONLY clause. */
3205 if (p == NULL)
3206 continue;
3208 /* Check for ambiguous symbols. */
3209 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3211 if (st != NULL)
3213 if (st->n.sym != info->u.rsym.sym)
3214 st->ambiguous = 1;
3215 info->u.rsym.symtree = st;
3217 else
3219 /* Create a symtree node in the current namespace for this symbol. */
3220 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3221 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3223 st->ambiguous = ambiguous;
3225 sym = info->u.rsym.sym;
3227 /* Create a symbol node if it doesn't already exist. */
3228 if (sym == NULL)
3230 sym = info->u.rsym.sym =
3231 gfc_new_symbol (info->u.rsym.true_name,
3232 gfc_current_ns);
3234 sym->module = gfc_get_string (info->u.rsym.module);
3237 st->n.sym = sym;
3238 st->n.sym->refs++;
3240 /* Store the symtree pointing to this symbol. */
3241 info->u.rsym.symtree = st;
3243 if (info->u.rsym.state == UNUSED)
3244 info->u.rsym.state = NEEDED;
3245 info->u.rsym.referenced = 1;
3250 mio_rparen ();
3252 /* Load intrinsic operator interfaces. */
3253 set_module_locus (&operator_interfaces);
3254 mio_lparen ();
3256 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3258 if (i == INTRINSIC_USER)
3259 continue;
3261 if (only_flag)
3263 u = find_use_operator (i);
3265 if (u == NULL)
3267 skip_list ();
3268 continue;
3271 u->found = 1;
3274 mio_interface (&gfc_current_ns->operator[i]);
3277 mio_rparen ();
3279 /* Load generic and user operator interfaces. These must follow the
3280 loading of symtree because otherwise symbols can be marked as
3281 ambiguous. */
3283 set_module_locus (&user_operators);
3285 load_operator_interfaces ();
3286 load_generic_interfaces ();
3288 load_commons ();
3289 load_equiv();
3291 /* At this point, we read those symbols that are needed but haven't
3292 been loaded yet. If one symbol requires another, the other gets
3293 marked as NEEDED if its previous state was UNUSED. */
3295 while (load_needed (pi_root));
3297 /* Make sure all elements of the rename-list were found in the
3298 module. */
3300 for (u = gfc_rename_list; u; u = u->next)
3302 if (u->found)
3303 continue;
3305 if (u->operator == INTRINSIC_NONE)
3307 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3308 u->use_name, &u->where, module_name);
3309 continue;
3312 if (u->operator == INTRINSIC_USER)
3314 gfc_error
3315 ("User operator '%s' referenced at %L not found in module '%s'",
3316 u->use_name, &u->where, module_name);
3317 continue;
3320 gfc_error
3321 ("Intrinsic operator '%s' referenced at %L not found in module "
3322 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3325 gfc_check_interfaces (gfc_current_ns);
3327 /* Clean up symbol nodes that were never loaded, create references
3328 to hidden symbols. */
3330 read_cleanup (pi_root);
3334 /* Given an access type that is specific to an entity and the default
3335 access, return nonzero if the entity is publicly accessible. */
3337 bool
3338 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3341 if (specific_access == ACCESS_PUBLIC)
3342 return TRUE;
3343 if (specific_access == ACCESS_PRIVATE)
3344 return FALSE;
3346 if (gfc_option.flag_module_access_private)
3347 return default_access == ACCESS_PUBLIC;
3348 else
3349 return default_access != ACCESS_PRIVATE;
3351 return FALSE;
3355 /* Write a common block to the module */
3357 static void
3358 write_common (gfc_symtree *st)
3360 gfc_common_head *p;
3361 const char * name;
3363 if (st == NULL)
3364 return;
3366 write_common(st->left);
3367 write_common(st->right);
3369 mio_lparen();
3371 /* Write the unmangled name. */
3372 name = st->n.common->name;
3374 mio_pool_string(&name);
3376 p = st->n.common;
3377 mio_symbol_ref(&p->head);
3378 mio_integer(&p->saved);
3380 mio_rparen();
3383 /* Write the blank common block to the module */
3385 static void
3386 write_blank_common (void)
3388 const char * name = BLANK_COMMON_NAME;
3390 if (gfc_current_ns->blank_common.head == NULL)
3391 return;
3393 mio_lparen();
3395 mio_pool_string(&name);
3397 mio_symbol_ref(&gfc_current_ns->blank_common.head);
3398 mio_integer(&gfc_current_ns->blank_common.saved);
3400 mio_rparen();
3403 /* Write equivalences to the module. */
3405 static void
3406 write_equiv(void)
3408 gfc_equiv *eq, *e;
3409 int num;
3411 num = 0;
3412 for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3414 mio_lparen();
3416 for(e=eq; e; e=e->eq)
3418 if (e->module == NULL)
3419 e->module = gfc_get_string("%s.eq.%d", module_name, num);
3420 mio_allocated_string(e->module);
3421 mio_expr(&e->expr);
3424 num++;
3425 mio_rparen();
3429 /* Write a symbol to the module. */
3431 static void
3432 write_symbol (int n, gfc_symbol * sym)
3435 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3436 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3438 mio_integer (&n);
3439 mio_pool_string (&sym->name);
3441 mio_pool_string (&sym->module);
3442 mio_pointer_ref (&sym->ns);
3444 mio_symbol (sym);
3445 write_char ('\n');
3449 /* Recursive traversal function to write the initial set of symbols to
3450 the module. We check to see if the symbol should be written
3451 according to the access specification. */
3453 static void
3454 write_symbol0 (gfc_symtree * st)
3456 gfc_symbol *sym;
3457 pointer_info *p;
3459 if (st == NULL)
3460 return;
3462 write_symbol0 (st->left);
3463 write_symbol0 (st->right);
3465 sym = st->n.sym;
3466 if (sym->module == NULL)
3467 sym->module = gfc_get_string (module_name);
3469 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3470 && !sym->attr.subroutine && !sym->attr.function)
3471 return;
3473 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3474 return;
3476 p = get_pointer (sym);
3477 if (p->type == P_UNKNOWN)
3478 p->type = P_SYMBOL;
3480 if (p->u.wsym.state == WRITTEN)
3481 return;
3483 write_symbol (p->integer, sym);
3484 p->u.wsym.state = WRITTEN;
3486 return;
3490 /* Recursive traversal function to write the secondary set of symbols
3491 to the module file. These are symbols that were not public yet are
3492 needed by the public symbols or another dependent symbol. The act
3493 of writing a symbol can modify the pointer_info tree, so we cease
3494 traversal if we find a symbol to write. We return nonzero if a
3495 symbol was written and pass that information upwards. */
3497 static int
3498 write_symbol1 (pointer_info * p)
3501 if (p == NULL)
3502 return 0;
3504 if (write_symbol1 (p->left))
3505 return 1;
3506 if (write_symbol1 (p->right))
3507 return 1;
3509 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3510 return 0;
3512 p->u.wsym.state = WRITTEN;
3513 write_symbol (p->integer, p->u.wsym.sym);
3515 return 1;
3519 /* Write operator interfaces associated with a symbol. */
3521 static void
3522 write_operator (gfc_user_op * uop)
3524 static char nullstring[] = "";
3525 const char *p = nullstring;
3527 if (uop->operator == NULL
3528 || !gfc_check_access (uop->access, uop->ns->default_access))
3529 return;
3531 mio_symbol_interface (&uop->name, &p, &uop->operator);
3535 /* Write generic interfaces associated with a symbol. */
3537 static void
3538 write_generic (gfc_symbol * sym)
3541 if (sym->generic == NULL
3542 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3543 return;
3545 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3549 static void
3550 write_symtree (gfc_symtree * st)
3552 gfc_symbol *sym;
3553 pointer_info *p;
3555 sym = st->n.sym;
3556 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3557 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3558 && !sym->attr.subroutine && !sym->attr.function))
3559 return;
3561 if (check_unique_name (st->name))
3562 return;
3564 p = find_pointer (sym);
3565 if (p == NULL)
3566 gfc_internal_error ("write_symtree(): Symbol not written");
3568 mio_pool_string (&st->name);
3569 mio_integer (&st->ambiguous);
3570 mio_integer (&p->integer);
3574 static void
3575 write_module (void)
3577 gfc_intrinsic_op i;
3579 /* Write the operator interfaces. */
3580 mio_lparen ();
3582 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3584 if (i == INTRINSIC_USER)
3585 continue;
3587 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3588 gfc_current_ns->default_access)
3589 ? &gfc_current_ns->operator[i] : NULL);
3592 mio_rparen ();
3593 write_char ('\n');
3594 write_char ('\n');
3596 mio_lparen ();
3597 gfc_traverse_user_op (gfc_current_ns, write_operator);
3598 mio_rparen ();
3599 write_char ('\n');
3600 write_char ('\n');
3602 mio_lparen ();
3603 gfc_traverse_ns (gfc_current_ns, write_generic);
3604 mio_rparen ();
3605 write_char ('\n');
3606 write_char ('\n');
3608 mio_lparen ();
3609 write_blank_common ();
3610 write_common (gfc_current_ns->common_root);
3611 mio_rparen ();
3612 write_char ('\n');
3613 write_char ('\n');
3615 mio_lparen();
3616 write_equiv();
3617 mio_rparen();
3618 write_char('\n'); write_char('\n');
3620 /* Write symbol information. First we traverse all symbols in the
3621 primary namespace, writing those that need to be written.
3622 Sometimes writing one symbol will cause another to need to be
3623 written. A list of these symbols ends up on the write stack, and
3624 we end by popping the bottom of the stack and writing the symbol
3625 until the stack is empty. */
3627 mio_lparen ();
3629 write_symbol0 (gfc_current_ns->sym_root);
3630 while (write_symbol1 (pi_root));
3632 mio_rparen ();
3634 write_char ('\n');
3635 write_char ('\n');
3637 mio_lparen ();
3638 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3639 mio_rparen ();
3643 /* Given module, dump it to disk. If there was an error while
3644 processing the module, dump_flag will be set to zero and we delete
3645 the module file, even if it was already there. */
3647 void
3648 gfc_dump_module (const char *name, int dump_flag)
3650 int n;
3651 char *filename, *p;
3652 time_t now;
3654 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3655 if (gfc_option.module_dir != NULL)
3657 filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3658 strcpy (filename, gfc_option.module_dir);
3659 strcat (filename, name);
3661 else
3663 filename = (char *) alloca (n);
3664 strcpy (filename, name);
3666 strcat (filename, MODULE_EXTENSION);
3668 if (!dump_flag)
3670 unlink (filename);
3671 return;
3674 module_fp = fopen (filename, "w");
3675 if (module_fp == NULL)
3676 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3677 filename, strerror (errno));
3679 now = time (NULL);
3680 p = ctime (&now);
3682 *strchr (p, '\n') = '\0';
3684 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3685 gfc_source_file, p);
3686 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3688 iomode = IO_OUTPUT;
3689 strcpy (module_name, name);
3691 init_pi_tree ();
3693 write_module ();
3695 free_pi_tree (pi_root);
3696 pi_root = NULL;
3698 write_char ('\n');
3700 if (fclose (module_fp))
3701 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3702 filename, strerror (errno));
3706 /* Process a USE directive. */
3708 void
3709 gfc_use_module (void)
3711 char *filename;
3712 gfc_state_data *p;
3713 int c, line;
3715 filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
3716 + 1);
3717 strcpy (filename, module_name);
3718 strcat (filename, MODULE_EXTENSION);
3720 module_fp = gfc_open_included_file (filename);
3721 if (module_fp == NULL)
3722 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3723 filename, strerror (errno));
3725 iomode = IO_INPUT;
3726 module_line = 1;
3727 module_column = 1;
3729 /* Skip the first two lines of the module. */
3730 /* FIXME: Could also check for valid two lines here, instead. */
3731 line = 0;
3732 while (line < 2)
3734 c = module_char ();
3735 if (c == EOF)
3736 bad_module ("Unexpected end of module");
3737 if (c == '\n')
3738 line++;
3741 /* Make sure we're not reading the same module that we may be building. */
3742 for (p = gfc_state_stack; p; p = p->previous)
3743 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3744 gfc_fatal_error ("Can't USE the same module we're building!");
3746 init_pi_tree ();
3747 init_true_name_tree ();
3749 read_module ();
3751 free_true_name (true_name_root);
3752 true_name_root = NULL;
3754 free_pi_tree (pi_root);
3755 pi_root = NULL;
3757 fclose (module_fp);
3761 void
3762 gfc_module_init_2 (void)
3765 last_atom = ATOM_LPAREN;
3769 void
3770 gfc_module_done_2 (void)
3773 free_rename ();