Dead
[official-gcc.git] / gomp-20050608-branch / gcc / fortran / module.c
blob3c45e57cff16deabc35899a5ed2a7787ec56e0b3
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
4 Software Foundation, Inc.
5 Contributed by Andy Vaught
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, AB_CRAY_POINTER,
1435 AB_CRAY_POINTEE, AB_THREADPRIVATE
1437 ab_attribute;
1439 static const mstring attr_bits[] =
1441 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1442 minit ("DIMENSION", AB_DIMENSION),
1443 minit ("EXTERNAL", AB_EXTERNAL),
1444 minit ("INTRINSIC", AB_INTRINSIC),
1445 minit ("OPTIONAL", AB_OPTIONAL),
1446 minit ("POINTER", AB_POINTER),
1447 minit ("SAVE", AB_SAVE),
1448 minit ("TARGET", AB_TARGET),
1449 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1450 minit ("DUMMY", AB_DUMMY),
1451 minit ("RESULT", AB_RESULT),
1452 minit ("DATA", AB_DATA),
1453 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1454 minit ("IN_COMMON", AB_IN_COMMON),
1455 minit ("FUNCTION", AB_FUNCTION),
1456 minit ("SUBROUTINE", AB_SUBROUTINE),
1457 minit ("SEQUENCE", AB_SEQUENCE),
1458 minit ("ELEMENTAL", AB_ELEMENTAL),
1459 minit ("PURE", AB_PURE),
1460 minit ("RECURSIVE", AB_RECURSIVE),
1461 minit ("GENERIC", AB_GENERIC),
1462 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1463 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1464 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1465 minit (NULL, -1)
1468 /* Specialization of mio_name. */
1469 DECL_MIO_NAME(ab_attribute)
1470 DECL_MIO_NAME(ar_type)
1471 DECL_MIO_NAME(array_type)
1472 DECL_MIO_NAME(bt)
1473 DECL_MIO_NAME(expr_t)
1474 DECL_MIO_NAME(gfc_access)
1475 DECL_MIO_NAME(gfc_intrinsic_op)
1476 DECL_MIO_NAME(ifsrc)
1477 DECL_MIO_NAME(procedure_type)
1478 DECL_MIO_NAME(ref_type)
1479 DECL_MIO_NAME(sym_flavor)
1480 DECL_MIO_NAME(sym_intent)
1481 #undef DECL_MIO_NAME
1483 /* Symbol attributes are stored in list with the first three elements
1484 being the enumerated fields, while the remaining elements (if any)
1485 indicate the individual attribute bits. The access field is not
1486 saved-- it controls what symbols are exported when a module is
1487 written. */
1489 static void
1490 mio_symbol_attribute (symbol_attribute * attr)
1492 atom_type t;
1494 mio_lparen ();
1496 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1497 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1498 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1499 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1501 if (iomode == IO_OUTPUT)
1503 if (attr->allocatable)
1504 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1505 if (attr->dimension)
1506 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1507 if (attr->external)
1508 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1509 if (attr->intrinsic)
1510 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1511 if (attr->optional)
1512 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1513 if (attr->pointer)
1514 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1515 if (attr->save)
1516 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1517 if (attr->target)
1518 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1519 if (attr->threadprivate)
1520 MIO_NAME(ab_attribute) (AB_THREADPRIVATE, attr_bits);
1521 if (attr->dummy)
1522 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1523 if (attr->result)
1524 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1525 /* We deliberately don't preserve the "entry" flag. */
1527 if (attr->data)
1528 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1529 if (attr->in_namelist)
1530 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1531 if (attr->in_common)
1532 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1534 if (attr->function)
1535 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1536 if (attr->subroutine)
1537 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1538 if (attr->generic)
1539 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1541 if (attr->sequence)
1542 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1543 if (attr->elemental)
1544 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1545 if (attr->pure)
1546 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1547 if (attr->recursive)
1548 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1549 if (attr->always_explicit)
1550 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1551 if (attr->cray_pointer)
1552 MIO_NAME(ab_attribute) (AB_CRAY_POINTER, attr_bits);
1553 if (attr->cray_pointee)
1554 MIO_NAME(ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1556 mio_rparen ();
1559 else
1562 for (;;)
1564 t = parse_atom ();
1565 if (t == ATOM_RPAREN)
1566 break;
1567 if (t != ATOM_NAME)
1568 bad_module ("Expected attribute bit name");
1570 switch ((ab_attribute) find_enum (attr_bits))
1572 case AB_ALLOCATABLE:
1573 attr->allocatable = 1;
1574 break;
1575 case AB_DIMENSION:
1576 attr->dimension = 1;
1577 break;
1578 case AB_EXTERNAL:
1579 attr->external = 1;
1580 break;
1581 case AB_INTRINSIC:
1582 attr->intrinsic = 1;
1583 break;
1584 case AB_OPTIONAL:
1585 attr->optional = 1;
1586 break;
1587 case AB_POINTER:
1588 attr->pointer = 1;
1589 break;
1590 case AB_SAVE:
1591 attr->save = 1;
1592 break;
1593 case AB_TARGET:
1594 attr->target = 1;
1595 break;
1596 case AB_THREADPRIVATE:
1597 attr->threadprivate = 1;
1598 break;
1599 case AB_DUMMY:
1600 attr->dummy = 1;
1601 break;
1602 case AB_RESULT:
1603 attr->result = 1;
1604 break;
1605 case AB_DATA:
1606 attr->data = 1;
1607 break;
1608 case AB_IN_NAMELIST:
1609 attr->in_namelist = 1;
1610 break;
1611 case AB_IN_COMMON:
1612 attr->in_common = 1;
1613 break;
1614 case AB_FUNCTION:
1615 attr->function = 1;
1616 break;
1617 case AB_SUBROUTINE:
1618 attr->subroutine = 1;
1619 break;
1620 case AB_GENERIC:
1621 attr->generic = 1;
1622 break;
1623 case AB_SEQUENCE:
1624 attr->sequence = 1;
1625 break;
1626 case AB_ELEMENTAL:
1627 attr->elemental = 1;
1628 break;
1629 case AB_PURE:
1630 attr->pure = 1;
1631 break;
1632 case AB_RECURSIVE:
1633 attr->recursive = 1;
1634 break;
1635 case AB_ALWAYS_EXPLICIT:
1636 attr->always_explicit = 1;
1637 break;
1638 case AB_CRAY_POINTER:
1639 attr->cray_pointer = 1;
1640 break;
1641 case AB_CRAY_POINTEE:
1642 attr->cray_pointee = 1;
1643 break;
1650 static const mstring bt_types[] = {
1651 minit ("INTEGER", BT_INTEGER),
1652 minit ("REAL", BT_REAL),
1653 minit ("COMPLEX", BT_COMPLEX),
1654 minit ("LOGICAL", BT_LOGICAL),
1655 minit ("CHARACTER", BT_CHARACTER),
1656 minit ("DERIVED", BT_DERIVED),
1657 minit ("PROCEDURE", BT_PROCEDURE),
1658 minit ("UNKNOWN", BT_UNKNOWN),
1659 minit (NULL, -1)
1663 static void
1664 mio_charlen (gfc_charlen ** clp)
1666 gfc_charlen *cl;
1668 mio_lparen ();
1670 if (iomode == IO_OUTPUT)
1672 cl = *clp;
1673 if (cl != NULL)
1674 mio_expr (&cl->length);
1676 else
1679 if (peek_atom () != ATOM_RPAREN)
1681 cl = gfc_get_charlen ();
1682 mio_expr (&cl->length);
1684 *clp = cl;
1686 cl->next = gfc_current_ns->cl_list;
1687 gfc_current_ns->cl_list = cl;
1691 mio_rparen ();
1695 /* Return a symtree node with a name that is guaranteed to be unique
1696 within the namespace and corresponds to an illegal fortran name. */
1698 static gfc_symtree *
1699 get_unique_symtree (gfc_namespace * ns)
1701 char name[GFC_MAX_SYMBOL_LEN + 1];
1702 static int serial = 0;
1704 sprintf (name, "@%d", serial++);
1705 return gfc_new_symtree (&ns->sym_root, name);
1709 /* See if a name is a generated name. */
1711 static int
1712 check_unique_name (const char *name)
1715 return *name == '@';
1719 static void
1720 mio_typespec (gfc_typespec * ts)
1723 mio_lparen ();
1725 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1727 if (ts->type != BT_DERIVED)
1728 mio_integer (&ts->kind);
1729 else
1730 mio_symbol_ref (&ts->derived);
1732 mio_charlen (&ts->cl);
1734 mio_rparen ();
1738 static const mstring array_spec_types[] = {
1739 minit ("EXPLICIT", AS_EXPLICIT),
1740 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1741 minit ("DEFERRED", AS_DEFERRED),
1742 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1743 minit (NULL, -1)
1747 static void
1748 mio_array_spec (gfc_array_spec ** asp)
1750 gfc_array_spec *as;
1751 int i;
1753 mio_lparen ();
1755 if (iomode == IO_OUTPUT)
1757 if (*asp == NULL)
1758 goto done;
1759 as = *asp;
1761 else
1763 if (peek_atom () == ATOM_RPAREN)
1765 *asp = NULL;
1766 goto done;
1769 *asp = as = gfc_get_array_spec ();
1772 mio_integer (&as->rank);
1773 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1775 for (i = 0; i < as->rank; i++)
1777 mio_expr (&as->lower[i]);
1778 mio_expr (&as->upper[i]);
1781 done:
1782 mio_rparen ();
1786 /* Given a pointer to an array reference structure (which lives in a
1787 gfc_ref structure), find the corresponding array specification
1788 structure. Storing the pointer in the ref structure doesn't quite
1789 work when loading from a module. Generating code for an array
1790 reference also needs more information than just the array spec. */
1792 static const mstring array_ref_types[] = {
1793 minit ("FULL", AR_FULL),
1794 minit ("ELEMENT", AR_ELEMENT),
1795 minit ("SECTION", AR_SECTION),
1796 minit (NULL, -1)
1799 static void
1800 mio_array_ref (gfc_array_ref * ar)
1802 int i;
1804 mio_lparen ();
1805 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1806 mio_integer (&ar->dimen);
1808 switch (ar->type)
1810 case AR_FULL:
1811 break;
1813 case AR_ELEMENT:
1814 for (i = 0; i < ar->dimen; i++)
1815 mio_expr (&ar->start[i]);
1817 break;
1819 case AR_SECTION:
1820 for (i = 0; i < ar->dimen; i++)
1822 mio_expr (&ar->start[i]);
1823 mio_expr (&ar->end[i]);
1824 mio_expr (&ar->stride[i]);
1827 break;
1829 case AR_UNKNOWN:
1830 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1833 for (i = 0; i < ar->dimen; i++)
1834 mio_integer ((int *) &ar->dimen_type[i]);
1836 if (iomode == IO_INPUT)
1838 ar->where = gfc_current_locus;
1840 for (i = 0; i < ar->dimen; i++)
1841 ar->c_where[i] = gfc_current_locus;
1844 mio_rparen ();
1848 /* Saves or restores a pointer. The pointer is converted back and
1849 forth from an integer. We return the pointer_info pointer so that
1850 the caller can take additional action based on the pointer type. */
1852 static pointer_info *
1853 mio_pointer_ref (void *gp)
1855 pointer_info *p;
1857 if (iomode == IO_OUTPUT)
1859 p = get_pointer (*((char **) gp));
1860 write_atom (ATOM_INTEGER, &p->integer);
1862 else
1864 require_atom (ATOM_INTEGER);
1865 p = add_fixup (atom_int, gp);
1868 return p;
1872 /* Save and load references to components that occur within
1873 expressions. We have to describe these references by a number and
1874 by name. The number is necessary for forward references during
1875 reading, and the name is necessary if the symbol already exists in
1876 the namespace and is not loaded again. */
1878 static void
1879 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1881 char name[GFC_MAX_SYMBOL_LEN + 1];
1882 gfc_component *q;
1883 pointer_info *p;
1885 p = mio_pointer_ref (cp);
1886 if (p->type == P_UNKNOWN)
1887 p->type = P_COMPONENT;
1889 if (iomode == IO_OUTPUT)
1890 mio_pool_string (&(*cp)->name);
1891 else
1893 mio_internal_string (name);
1895 /* It can happen that a component reference can be read before the
1896 associated derived type symbol has been loaded. Return now and
1897 wait for a later iteration of load_needed. */
1898 if (sym == NULL)
1899 return;
1901 if (sym->components != NULL && p->u.pointer == NULL)
1903 /* Symbol already loaded, so search by name. */
1904 for (q = sym->components; q; q = q->next)
1905 if (strcmp (q->name, name) == 0)
1906 break;
1908 if (q == NULL)
1909 gfc_internal_error ("mio_component_ref(): Component not found");
1911 associate_integer_pointer (p, q);
1914 /* Make sure this symbol will eventually be loaded. */
1915 p = find_pointer2 (sym);
1916 if (p->u.rsym.state == UNUSED)
1917 p->u.rsym.state = NEEDED;
1922 static void
1923 mio_component (gfc_component * c)
1925 pointer_info *p;
1926 int n;
1928 mio_lparen ();
1930 if (iomode == IO_OUTPUT)
1932 p = get_pointer (c);
1933 mio_integer (&p->integer);
1935 else
1937 mio_integer (&n);
1938 p = get_integer (n);
1939 associate_integer_pointer (p, c);
1942 if (p->type == P_UNKNOWN)
1943 p->type = P_COMPONENT;
1945 mio_pool_string (&c->name);
1946 mio_typespec (&c->ts);
1947 mio_array_spec (&c->as);
1949 mio_integer (&c->dimension);
1950 mio_integer (&c->pointer);
1952 mio_expr (&c->initializer);
1953 mio_rparen ();
1957 static void
1958 mio_component_list (gfc_component ** cp)
1960 gfc_component *c, *tail;
1962 mio_lparen ();
1964 if (iomode == IO_OUTPUT)
1966 for (c = *cp; c; c = c->next)
1967 mio_component (c);
1969 else
1972 *cp = NULL;
1973 tail = NULL;
1975 for (;;)
1977 if (peek_atom () == ATOM_RPAREN)
1978 break;
1980 c = gfc_get_component ();
1981 mio_component (c);
1983 if (tail == NULL)
1984 *cp = c;
1985 else
1986 tail->next = c;
1988 tail = c;
1992 mio_rparen ();
1996 static void
1997 mio_actual_arg (gfc_actual_arglist * a)
2000 mio_lparen ();
2001 mio_pool_string (&a->name);
2002 mio_expr (&a->expr);
2003 mio_rparen ();
2007 static void
2008 mio_actual_arglist (gfc_actual_arglist ** ap)
2010 gfc_actual_arglist *a, *tail;
2012 mio_lparen ();
2014 if (iomode == IO_OUTPUT)
2016 for (a = *ap; a; a = a->next)
2017 mio_actual_arg (a);
2020 else
2022 tail = NULL;
2024 for (;;)
2026 if (peek_atom () != ATOM_LPAREN)
2027 break;
2029 a = gfc_get_actual_arglist ();
2031 if (tail == NULL)
2032 *ap = a;
2033 else
2034 tail->next = a;
2036 tail = a;
2037 mio_actual_arg (a);
2041 mio_rparen ();
2045 /* Read and write formal argument lists. */
2047 static void
2048 mio_formal_arglist (gfc_symbol * sym)
2050 gfc_formal_arglist *f, *tail;
2052 mio_lparen ();
2054 if (iomode == IO_OUTPUT)
2056 for (f = sym->formal; f; f = f->next)
2057 mio_symbol_ref (&f->sym);
2060 else
2062 sym->formal = tail = NULL;
2064 while (peek_atom () != ATOM_RPAREN)
2066 f = gfc_get_formal_arglist ();
2067 mio_symbol_ref (&f->sym);
2069 if (sym->formal == NULL)
2070 sym->formal = f;
2071 else
2072 tail->next = f;
2074 tail = f;
2078 mio_rparen ();
2082 /* Save or restore a reference to a symbol node. */
2084 void
2085 mio_symbol_ref (gfc_symbol ** symp)
2087 pointer_info *p;
2089 p = mio_pointer_ref (symp);
2090 if (p->type == P_UNKNOWN)
2091 p->type = P_SYMBOL;
2093 if (iomode == IO_OUTPUT)
2095 if (p->u.wsym.state == UNREFERENCED)
2096 p->u.wsym.state = NEEDS_WRITE;
2098 else
2100 if (p->u.rsym.state == UNUSED)
2101 p->u.rsym.state = NEEDED;
2106 /* Save or restore a reference to a symtree node. */
2108 static void
2109 mio_symtree_ref (gfc_symtree ** stp)
2111 pointer_info *p;
2112 fixup_t *f;
2113 gfc_symtree * ns_st = NULL;
2115 if (iomode == IO_OUTPUT)
2117 /* If this is a symtree for a symbol that came from a contained module
2118 namespace, it has a unique name and we should look in the current
2119 namespace to see if the required, non-contained symbol is available
2120 yet. If so, the latter should be written. */
2121 if ((*stp)->n.sym && check_unique_name((*stp)->name))
2122 ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2123 (*stp)->n.sym->name);
2125 /* On the other hand, if the existing symbol is the module name or the
2126 new symbol is a dummy argument, do not do the promotion. */
2127 if (ns_st && ns_st->n.sym
2128 && ns_st->n.sym->attr.flavor != FL_MODULE
2129 && !(*stp)->n.sym->attr.dummy)
2130 mio_symbol_ref (&ns_st->n.sym);
2131 else
2132 mio_symbol_ref (&(*stp)->n.sym);
2134 else
2136 require_atom (ATOM_INTEGER);
2137 p = get_integer (atom_int);
2138 if (p->type == P_UNKNOWN)
2139 p->type = P_SYMBOL;
2141 if (p->u.rsym.state == UNUSED)
2142 p->u.rsym.state = NEEDED;
2144 if (p->u.rsym.symtree != NULL)
2146 *stp = p->u.rsym.symtree;
2148 else
2150 f = gfc_getmem (sizeof (fixup_t));
2152 f->next = p->u.rsym.stfixup;
2153 p->u.rsym.stfixup = f;
2155 f->pointer = (void **)stp;
2160 static void
2161 mio_iterator (gfc_iterator ** ip)
2163 gfc_iterator *iter;
2165 mio_lparen ();
2167 if (iomode == IO_OUTPUT)
2169 if (*ip == NULL)
2170 goto done;
2172 else
2174 if (peek_atom () == ATOM_RPAREN)
2176 *ip = NULL;
2177 goto done;
2180 *ip = gfc_get_iterator ();
2183 iter = *ip;
2185 mio_expr (&iter->var);
2186 mio_expr (&iter->start);
2187 mio_expr (&iter->end);
2188 mio_expr (&iter->step);
2190 done:
2191 mio_rparen ();
2196 static void
2197 mio_constructor (gfc_constructor ** cp)
2199 gfc_constructor *c, *tail;
2201 mio_lparen ();
2203 if (iomode == IO_OUTPUT)
2205 for (c = *cp; c; c = c->next)
2207 mio_lparen ();
2208 mio_expr (&c->expr);
2209 mio_iterator (&c->iterator);
2210 mio_rparen ();
2213 else
2216 *cp = NULL;
2217 tail = NULL;
2219 while (peek_atom () != ATOM_RPAREN)
2221 c = gfc_get_constructor ();
2223 if (tail == NULL)
2224 *cp = c;
2225 else
2226 tail->next = c;
2228 tail = c;
2230 mio_lparen ();
2231 mio_expr (&c->expr);
2232 mio_iterator (&c->iterator);
2233 mio_rparen ();
2237 mio_rparen ();
2242 static const mstring ref_types[] = {
2243 minit ("ARRAY", REF_ARRAY),
2244 minit ("COMPONENT", REF_COMPONENT),
2245 minit ("SUBSTRING", REF_SUBSTRING),
2246 minit (NULL, -1)
2250 static void
2251 mio_ref (gfc_ref ** rp)
2253 gfc_ref *r;
2255 mio_lparen ();
2257 r = *rp;
2258 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2260 switch (r->type)
2262 case REF_ARRAY:
2263 mio_array_ref (&r->u.ar);
2264 break;
2266 case REF_COMPONENT:
2267 mio_symbol_ref (&r->u.c.sym);
2268 mio_component_ref (&r->u.c.component, r->u.c.sym);
2269 break;
2271 case REF_SUBSTRING:
2272 mio_expr (&r->u.ss.start);
2273 mio_expr (&r->u.ss.end);
2274 mio_charlen (&r->u.ss.length);
2275 break;
2278 mio_rparen ();
2282 static void
2283 mio_ref_list (gfc_ref ** rp)
2285 gfc_ref *ref, *head, *tail;
2287 mio_lparen ();
2289 if (iomode == IO_OUTPUT)
2291 for (ref = *rp; ref; ref = ref->next)
2292 mio_ref (&ref);
2294 else
2296 head = tail = NULL;
2298 while (peek_atom () != ATOM_RPAREN)
2300 if (head == NULL)
2301 head = tail = gfc_get_ref ();
2302 else
2304 tail->next = gfc_get_ref ();
2305 tail = tail->next;
2308 mio_ref (&tail);
2311 *rp = head;
2314 mio_rparen ();
2318 /* Read and write an integer value. */
2320 static void
2321 mio_gmp_integer (mpz_t * integer)
2323 char *p;
2325 if (iomode == IO_INPUT)
2327 if (parse_atom () != ATOM_STRING)
2328 bad_module ("Expected integer string");
2330 mpz_init (*integer);
2331 if (mpz_set_str (*integer, atom_string, 10))
2332 bad_module ("Error converting integer");
2334 gfc_free (atom_string);
2337 else
2339 p = mpz_get_str (NULL, 10, *integer);
2340 write_atom (ATOM_STRING, p);
2341 gfc_free (p);
2346 static void
2347 mio_gmp_real (mpfr_t * real)
2349 mp_exp_t exponent;
2350 char *p;
2352 if (iomode == IO_INPUT)
2354 if (parse_atom () != ATOM_STRING)
2355 bad_module ("Expected real string");
2357 mpfr_init (*real);
2358 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2359 gfc_free (atom_string);
2362 else
2364 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2365 atom_string = gfc_getmem (strlen (p) + 20);
2367 sprintf (atom_string, "0.%s@%ld", p, exponent);
2369 /* Fix negative numbers. */
2370 if (atom_string[2] == '-')
2372 atom_string[0] = '-';
2373 atom_string[1] = '0';
2374 atom_string[2] = '.';
2377 write_atom (ATOM_STRING, atom_string);
2379 gfc_free (atom_string);
2380 gfc_free (p);
2385 /* Save and restore the shape of an array constructor. */
2387 static void
2388 mio_shape (mpz_t ** pshape, int rank)
2390 mpz_t *shape;
2391 atom_type t;
2392 int n;
2394 /* A NULL shape is represented by (). */
2395 mio_lparen ();
2397 if (iomode == IO_OUTPUT)
2399 shape = *pshape;
2400 if (!shape)
2402 mio_rparen ();
2403 return;
2406 else
2408 t = peek_atom ();
2409 if (t == ATOM_RPAREN)
2411 *pshape = NULL;
2412 mio_rparen ();
2413 return;
2416 shape = gfc_get_shape (rank);
2417 *pshape = shape;
2420 for (n = 0; n < rank; n++)
2421 mio_gmp_integer (&shape[n]);
2423 mio_rparen ();
2427 static const mstring expr_types[] = {
2428 minit ("OP", EXPR_OP),
2429 minit ("FUNCTION", EXPR_FUNCTION),
2430 minit ("CONSTANT", EXPR_CONSTANT),
2431 minit ("VARIABLE", EXPR_VARIABLE),
2432 minit ("SUBSTRING", EXPR_SUBSTRING),
2433 minit ("STRUCTURE", EXPR_STRUCTURE),
2434 minit ("ARRAY", EXPR_ARRAY),
2435 minit ("NULL", EXPR_NULL),
2436 minit (NULL, -1)
2439 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2440 generic operators, not in expressions. INTRINSIC_USER is also
2441 replaced by the correct function name by the time we see it. */
2443 static const mstring intrinsics[] =
2445 minit ("UPLUS", INTRINSIC_UPLUS),
2446 minit ("UMINUS", INTRINSIC_UMINUS),
2447 minit ("PLUS", INTRINSIC_PLUS),
2448 minit ("MINUS", INTRINSIC_MINUS),
2449 minit ("TIMES", INTRINSIC_TIMES),
2450 minit ("DIVIDE", INTRINSIC_DIVIDE),
2451 minit ("POWER", INTRINSIC_POWER),
2452 minit ("CONCAT", INTRINSIC_CONCAT),
2453 minit ("AND", INTRINSIC_AND),
2454 minit ("OR", INTRINSIC_OR),
2455 minit ("EQV", INTRINSIC_EQV),
2456 minit ("NEQV", INTRINSIC_NEQV),
2457 minit ("EQ", INTRINSIC_EQ),
2458 minit ("NE", INTRINSIC_NE),
2459 minit ("GT", INTRINSIC_GT),
2460 minit ("GE", INTRINSIC_GE),
2461 minit ("LT", INTRINSIC_LT),
2462 minit ("LE", INTRINSIC_LE),
2463 minit ("NOT", INTRINSIC_NOT),
2464 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2465 minit (NULL, -1)
2468 /* Read and write expressions. The form "()" is allowed to indicate a
2469 NULL expression. */
2471 static void
2472 mio_expr (gfc_expr ** ep)
2474 gfc_expr *e;
2475 atom_type t;
2476 int flag;
2478 mio_lparen ();
2480 if (iomode == IO_OUTPUT)
2482 if (*ep == NULL)
2484 mio_rparen ();
2485 return;
2488 e = *ep;
2489 MIO_NAME(expr_t) (e->expr_type, expr_types);
2492 else
2494 t = parse_atom ();
2495 if (t == ATOM_RPAREN)
2497 *ep = NULL;
2498 return;
2501 if (t != ATOM_NAME)
2502 bad_module ("Expected expression type");
2504 e = *ep = gfc_get_expr ();
2505 e->where = gfc_current_locus;
2506 e->expr_type = (expr_t) find_enum (expr_types);
2509 mio_typespec (&e->ts);
2510 mio_integer (&e->rank);
2512 switch (e->expr_type)
2514 case EXPR_OP:
2515 e->value.op.operator
2516 = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2518 switch (e->value.op.operator)
2520 case INTRINSIC_UPLUS:
2521 case INTRINSIC_UMINUS:
2522 case INTRINSIC_NOT:
2523 case INTRINSIC_PARENTHESES:
2524 mio_expr (&e->value.op.op1);
2525 break;
2527 case INTRINSIC_PLUS:
2528 case INTRINSIC_MINUS:
2529 case INTRINSIC_TIMES:
2530 case INTRINSIC_DIVIDE:
2531 case INTRINSIC_POWER:
2532 case INTRINSIC_CONCAT:
2533 case INTRINSIC_AND:
2534 case INTRINSIC_OR:
2535 case INTRINSIC_EQV:
2536 case INTRINSIC_NEQV:
2537 case INTRINSIC_EQ:
2538 case INTRINSIC_NE:
2539 case INTRINSIC_GT:
2540 case INTRINSIC_GE:
2541 case INTRINSIC_LT:
2542 case INTRINSIC_LE:
2543 mio_expr (&e->value.op.op1);
2544 mio_expr (&e->value.op.op2);
2545 break;
2547 default:
2548 bad_module ("Bad operator");
2551 break;
2553 case EXPR_FUNCTION:
2554 mio_symtree_ref (&e->symtree);
2555 mio_actual_arglist (&e->value.function.actual);
2557 if (iomode == IO_OUTPUT)
2559 e->value.function.name
2560 = mio_allocated_string (e->value.function.name);
2561 flag = e->value.function.esym != NULL;
2562 mio_integer (&flag);
2563 if (flag)
2564 mio_symbol_ref (&e->value.function.esym);
2565 else
2566 write_atom (ATOM_STRING, e->value.function.isym->name);
2569 else
2571 require_atom (ATOM_STRING);
2572 e->value.function.name = gfc_get_string (atom_string);
2573 gfc_free (atom_string);
2575 mio_integer (&flag);
2576 if (flag)
2577 mio_symbol_ref (&e->value.function.esym);
2578 else
2580 require_atom (ATOM_STRING);
2581 e->value.function.isym = gfc_find_function (atom_string);
2582 gfc_free (atom_string);
2586 break;
2588 case EXPR_VARIABLE:
2589 mio_symtree_ref (&e->symtree);
2590 mio_ref_list (&e->ref);
2591 break;
2593 case EXPR_SUBSTRING:
2594 e->value.character.string = (char *)
2595 mio_allocated_string (e->value.character.string);
2596 mio_ref_list (&e->ref);
2597 break;
2599 case EXPR_STRUCTURE:
2600 case EXPR_ARRAY:
2601 mio_constructor (&e->value.constructor);
2602 mio_shape (&e->shape, e->rank);
2603 break;
2605 case EXPR_CONSTANT:
2606 switch (e->ts.type)
2608 case BT_INTEGER:
2609 mio_gmp_integer (&e->value.integer);
2610 break;
2612 case BT_REAL:
2613 gfc_set_model_kind (e->ts.kind);
2614 mio_gmp_real (&e->value.real);
2615 break;
2617 case BT_COMPLEX:
2618 gfc_set_model_kind (e->ts.kind);
2619 mio_gmp_real (&e->value.complex.r);
2620 mio_gmp_real (&e->value.complex.i);
2621 break;
2623 case BT_LOGICAL:
2624 mio_integer (&e->value.logical);
2625 break;
2627 case BT_CHARACTER:
2628 mio_integer (&e->value.character.length);
2629 e->value.character.string = (char *)
2630 mio_allocated_string (e->value.character.string);
2631 break;
2633 default:
2634 bad_module ("Bad type in constant expression");
2637 break;
2639 case EXPR_NULL:
2640 break;
2643 mio_rparen ();
2647 /* Read and write namelists */
2649 static void
2650 mio_namelist (gfc_symbol * sym)
2652 gfc_namelist *n, *m;
2653 const char *check_name;
2655 mio_lparen ();
2657 if (iomode == IO_OUTPUT)
2659 for (n = sym->namelist; n; n = n->next)
2660 mio_symbol_ref (&n->sym);
2662 else
2664 /* This departure from the standard is flagged as an error.
2665 It does, in fact, work correctly. TODO: Allow it
2666 conditionally? */
2667 if (sym->attr.flavor == FL_NAMELIST)
2669 check_name = find_use_name (sym->name);
2670 if (check_name && strcmp (check_name, sym->name) != 0)
2671 gfc_error("Namelist %s cannot be renamed by USE"
2672 " association to %s.",
2673 sym->name, check_name);
2676 m = NULL;
2677 while (peek_atom () != ATOM_RPAREN)
2679 n = gfc_get_namelist ();
2680 mio_symbol_ref (&n->sym);
2682 if (sym->namelist == NULL)
2683 sym->namelist = n;
2684 else
2685 m->next = n;
2687 m = n;
2689 sym->namelist_tail = m;
2692 mio_rparen ();
2696 /* Save/restore lists of gfc_interface stuctures. When loading an
2697 interface, we are really appending to the existing list of
2698 interfaces. Checking for duplicate and ambiguous interfaces has to
2699 be done later when all symbols have been loaded. */
2701 static void
2702 mio_interface_rest (gfc_interface ** ip)
2704 gfc_interface *tail, *p;
2706 if (iomode == IO_OUTPUT)
2708 if (ip != NULL)
2709 for (p = *ip; p; p = p->next)
2710 mio_symbol_ref (&p->sym);
2712 else
2715 if (*ip == NULL)
2716 tail = NULL;
2717 else
2719 tail = *ip;
2720 while (tail->next)
2721 tail = tail->next;
2724 for (;;)
2726 if (peek_atom () == ATOM_RPAREN)
2727 break;
2729 p = gfc_get_interface ();
2730 p->where = gfc_current_locus;
2731 mio_symbol_ref (&p->sym);
2733 if (tail == NULL)
2734 *ip = p;
2735 else
2736 tail->next = p;
2738 tail = p;
2742 mio_rparen ();
2746 /* Save/restore a nameless operator interface. */
2748 static void
2749 mio_interface (gfc_interface ** ip)
2752 mio_lparen ();
2753 mio_interface_rest (ip);
2757 /* Save/restore a named operator interface. */
2759 static void
2760 mio_symbol_interface (const char **name, const char **module,
2761 gfc_interface ** ip)
2764 mio_lparen ();
2766 mio_pool_string (name);
2767 mio_pool_string (module);
2769 mio_interface_rest (ip);
2773 static void
2774 mio_namespace_ref (gfc_namespace ** nsp)
2776 gfc_namespace *ns;
2777 pointer_info *p;
2779 p = mio_pointer_ref (nsp);
2781 if (p->type == P_UNKNOWN)
2782 p->type = P_NAMESPACE;
2784 if (iomode == IO_INPUT && p->integer != 0)
2786 ns = (gfc_namespace *)p->u.pointer;
2787 if (ns == NULL)
2789 ns = gfc_get_namespace (NULL, 0);
2790 associate_integer_pointer (p, ns);
2792 else
2793 ns->refs++;
2798 /* Unlike most other routines, the address of the symbol node is
2799 already fixed on input and the name/module has already been filled
2800 in. */
2802 static void
2803 mio_symbol (gfc_symbol * sym)
2805 gfc_formal_arglist *formal;
2807 mio_lparen ();
2809 mio_symbol_attribute (&sym->attr);
2810 mio_typespec (&sym->ts);
2812 /* Contained procedures don't have formal namespaces. Instead we output the
2813 procedure namespace. The will contain the formal arguments. */
2814 if (iomode == IO_OUTPUT)
2816 formal = sym->formal;
2817 while (formal && !formal->sym)
2818 formal = formal->next;
2820 if (formal)
2821 mio_namespace_ref (&formal->sym->ns);
2822 else
2823 mio_namespace_ref (&sym->formal_ns);
2825 else
2827 mio_namespace_ref (&sym->formal_ns);
2828 if (sym->formal_ns)
2830 sym->formal_ns->proc_name = sym;
2831 sym->refs++;
2835 /* Save/restore common block links */
2836 mio_symbol_ref (&sym->common_next);
2838 mio_formal_arglist (sym);
2840 if (sym->attr.flavor == FL_PARAMETER)
2841 mio_expr (&sym->value);
2843 mio_array_spec (&sym->as);
2845 mio_symbol_ref (&sym->result);
2847 if (sym->attr.cray_pointee)
2848 mio_symbol_ref (&sym->cp_pointer);
2850 /* Note that components are always saved, even if they are supposed
2851 to be private. Component access is checked during searching. */
2853 mio_component_list (&sym->components);
2855 if (sym->components != NULL)
2856 sym->component_access =
2857 MIO_NAME(gfc_access) (sym->component_access, access_types);
2859 mio_namelist (sym);
2860 mio_rparen ();
2864 /************************* Top level subroutines *************************/
2866 /* Skip a list between balanced left and right parens. */
2868 static void
2869 skip_list (void)
2871 int level;
2873 level = 0;
2876 switch (parse_atom ())
2878 case ATOM_LPAREN:
2879 level++;
2880 break;
2882 case ATOM_RPAREN:
2883 level--;
2884 break;
2886 case ATOM_STRING:
2887 gfc_free (atom_string);
2888 break;
2890 case ATOM_NAME:
2891 case ATOM_INTEGER:
2892 break;
2895 while (level > 0);
2899 /* Load operator interfaces from the module. Interfaces are unusual
2900 in that they attach themselves to existing symbols. */
2902 static void
2903 load_operator_interfaces (void)
2905 const char *p;
2906 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2907 gfc_user_op *uop;
2909 mio_lparen ();
2911 while (peek_atom () != ATOM_RPAREN)
2913 mio_lparen ();
2915 mio_internal_string (name);
2916 mio_internal_string (module);
2918 /* Decide if we need to load this one or not. */
2919 p = find_use_name (name);
2920 if (p == NULL)
2922 while (parse_atom () != ATOM_RPAREN);
2924 else
2926 uop = gfc_get_uop (p);
2927 mio_interface_rest (&uop->operator);
2931 mio_rparen ();
2935 /* Load interfaces from the module. Interfaces are unusual in that
2936 they attach themselves to existing symbols. */
2938 static void
2939 load_generic_interfaces (void)
2941 const char *p;
2942 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2943 gfc_symbol *sym;
2945 mio_lparen ();
2947 while (peek_atom () != ATOM_RPAREN)
2949 mio_lparen ();
2951 mio_internal_string (name);
2952 mio_internal_string (module);
2954 /* Decide if we need to load this one or not. */
2955 p = find_use_name (name);
2957 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2959 while (parse_atom () != ATOM_RPAREN);
2960 continue;
2963 if (sym == NULL)
2965 gfc_get_symbol (p, NULL, &sym);
2967 sym->attr.flavor = FL_PROCEDURE;
2968 sym->attr.generic = 1;
2969 sym->attr.use_assoc = 1;
2972 mio_interface_rest (&sym->generic);
2975 mio_rparen ();
2979 /* Load common blocks. */
2981 static void
2982 load_commons(void)
2984 char name[GFC_MAX_SYMBOL_LEN+1];
2985 gfc_common_head *p;
2987 mio_lparen ();
2989 while (peek_atom () != ATOM_RPAREN)
2991 int flags;
2992 mio_lparen ();
2993 mio_internal_string (name);
2995 p = gfc_get_common (name, 1);
2997 mio_symbol_ref (&p->head);
2998 mio_integer (&flags);
2999 if (flags & 1)
3000 p->saved = 1;
3001 if (flags & 2)
3002 p->threadprivate = 1;
3003 p->use_assoc = 1;
3005 mio_rparen();
3008 mio_rparen();
3011 /* load_equiv()-- Load equivalences. */
3013 static void
3014 load_equiv(void)
3016 gfc_equiv *head, *tail, *end;
3018 mio_lparen();
3020 end = gfc_current_ns->equiv;
3021 while(end != NULL && end->next != NULL)
3022 end = end->next;
3024 while(peek_atom() != ATOM_RPAREN) {
3025 mio_lparen();
3026 head = tail = NULL;
3028 while(peek_atom() != ATOM_RPAREN)
3030 if (head == NULL)
3031 head = tail = gfc_get_equiv();
3032 else
3034 tail->eq = gfc_get_equiv();
3035 tail = tail->eq;
3038 mio_pool_string(&tail->module);
3039 mio_expr(&tail->expr);
3042 if (end == NULL)
3043 gfc_current_ns->equiv = head;
3044 else
3045 end->next = head;
3047 end = head;
3048 mio_rparen();
3051 mio_rparen();
3054 /* Recursive function to traverse the pointer_info tree and load a
3055 needed symbol. We return nonzero if we load a symbol and stop the
3056 traversal, because the act of loading can alter the tree. */
3058 static int
3059 load_needed (pointer_info * p)
3061 gfc_namespace *ns;
3062 pointer_info *q;
3063 gfc_symbol *sym;
3065 if (p == NULL)
3066 return 0;
3067 if (load_needed (p->left))
3068 return 1;
3069 if (load_needed (p->right))
3070 return 1;
3072 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3073 return 0;
3075 p->u.rsym.state = USED;
3077 set_module_locus (&p->u.rsym.where);
3079 sym = p->u.rsym.sym;
3080 if (sym == NULL)
3082 q = get_integer (p->u.rsym.ns);
3084 ns = (gfc_namespace *) q->u.pointer;
3085 if (ns == NULL)
3087 /* Create an interface namespace if necessary. These are
3088 the namespaces that hold the formal parameters of module
3089 procedures. */
3091 ns = gfc_get_namespace (NULL, 0);
3092 associate_integer_pointer (q, ns);
3095 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3096 sym->module = gfc_get_string (p->u.rsym.module);
3098 associate_integer_pointer (p, sym);
3101 mio_symbol (sym);
3102 sym->attr.use_assoc = 1;
3104 return 1;
3108 /* Recursive function for cleaning up things after a module has been
3109 read. */
3111 static void
3112 read_cleanup (pointer_info * p)
3114 gfc_symtree *st;
3115 pointer_info *q;
3117 if (p == NULL)
3118 return;
3120 read_cleanup (p->left);
3121 read_cleanup (p->right);
3123 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3125 /* Add hidden symbols to the symtree. */
3126 q = get_integer (p->u.rsym.ns);
3127 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3129 st->n.sym = p->u.rsym.sym;
3130 st->n.sym->refs++;
3132 /* Fixup any symtree references. */
3133 p->u.rsym.symtree = st;
3134 resolve_fixups (p->u.rsym.stfixup, st);
3135 p->u.rsym.stfixup = NULL;
3138 /* Free unused symbols. */
3139 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3140 gfc_free_symbol (p->u.rsym.sym);
3144 /* Read a module file. */
3146 static void
3147 read_module (void)
3149 module_locus operator_interfaces, user_operators;
3150 const char *p;
3151 char name[GFC_MAX_SYMBOL_LEN + 1];
3152 gfc_intrinsic_op i;
3153 int ambiguous, j, nuse, symbol;
3154 pointer_info *info;
3155 gfc_use_rename *u;
3156 gfc_symtree *st;
3157 gfc_symbol *sym;
3159 get_module_locus (&operator_interfaces); /* Skip these for now */
3160 skip_list ();
3162 get_module_locus (&user_operators);
3163 skip_list ();
3164 skip_list ();
3166 /* Skip commons and equivalences for now. */
3167 skip_list ();
3168 skip_list ();
3170 mio_lparen ();
3172 /* Create the fixup nodes for all the symbols. */
3174 while (peek_atom () != ATOM_RPAREN)
3176 require_atom (ATOM_INTEGER);
3177 info = get_integer (atom_int);
3179 info->type = P_SYMBOL;
3180 info->u.rsym.state = UNUSED;
3182 mio_internal_string (info->u.rsym.true_name);
3183 mio_internal_string (info->u.rsym.module);
3185 require_atom (ATOM_INTEGER);
3186 info->u.rsym.ns = atom_int;
3188 get_module_locus (&info->u.rsym.where);
3189 skip_list ();
3191 /* See if the symbol has already been loaded by a previous module.
3192 If so, we reference the existing symbol and prevent it from
3193 being loaded again. */
3195 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3197 /* See if the symbol has already been loaded by a previous module.
3198 If so, we reference the existing symbol and prevent it from
3199 being loaded again. This should not happen if the symbol being
3200 read is an index for an assumed shape dummy array (ns != 1). */
3202 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3204 if (sym == NULL
3205 || (sym->attr.flavor == FL_VARIABLE
3206 && info->u.rsym.ns !=1))
3207 continue;
3209 info->u.rsym.state = USED;
3210 info->u.rsym.referenced = 1;
3211 info->u.rsym.sym = sym;
3214 mio_rparen ();
3216 /* Parse the symtree lists. This lets us mark which symbols need to
3217 be loaded. Renaming is also done at this point by replacing the
3218 symtree name. */
3220 mio_lparen ();
3222 while (peek_atom () != ATOM_RPAREN)
3224 mio_internal_string (name);
3225 mio_integer (&ambiguous);
3226 mio_integer (&symbol);
3228 info = get_integer (symbol);
3230 /* See how many use names there are. If none, go through the start
3231 of the loop at least once. */
3232 nuse = number_use_names (name);
3233 if (nuse == 0)
3234 nuse = 1;
3236 for (j = 1; j <= nuse; j++)
3238 /* Get the jth local name for this symbol. */
3239 p = find_use_name_n (name, &j);
3241 /* Skip symtree nodes not in an ONLY clause. */
3242 if (p == NULL)
3243 continue;
3245 /* Check for ambiguous symbols. */
3246 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3248 if (st != NULL)
3250 if (st->n.sym != info->u.rsym.sym)
3251 st->ambiguous = 1;
3252 info->u.rsym.symtree = st;
3254 else
3256 /* Create a symtree node in the current namespace for this symbol. */
3257 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3258 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3260 st->ambiguous = ambiguous;
3262 sym = info->u.rsym.sym;
3264 /* Create a symbol node if it doesn't already exist. */
3265 if (sym == NULL)
3267 sym = info->u.rsym.sym =
3268 gfc_new_symbol (info->u.rsym.true_name,
3269 gfc_current_ns);
3271 sym->module = gfc_get_string (info->u.rsym.module);
3274 st->n.sym = sym;
3275 st->n.sym->refs++;
3277 /* Store the symtree pointing to this symbol. */
3278 info->u.rsym.symtree = st;
3280 if (info->u.rsym.state == UNUSED)
3281 info->u.rsym.state = NEEDED;
3282 info->u.rsym.referenced = 1;
3287 mio_rparen ();
3289 /* Load intrinsic operator interfaces. */
3290 set_module_locus (&operator_interfaces);
3291 mio_lparen ();
3293 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3295 if (i == INTRINSIC_USER)
3296 continue;
3298 if (only_flag)
3300 u = find_use_operator (i);
3302 if (u == NULL)
3304 skip_list ();
3305 continue;
3308 u->found = 1;
3311 mio_interface (&gfc_current_ns->operator[i]);
3314 mio_rparen ();
3316 /* Load generic and user operator interfaces. These must follow the
3317 loading of symtree because otherwise symbols can be marked as
3318 ambiguous. */
3320 set_module_locus (&user_operators);
3322 load_operator_interfaces ();
3323 load_generic_interfaces ();
3325 load_commons ();
3326 load_equiv();
3328 /* At this point, we read those symbols that are needed but haven't
3329 been loaded yet. If one symbol requires another, the other gets
3330 marked as NEEDED if its previous state was UNUSED. */
3332 while (load_needed (pi_root));
3334 /* Make sure all elements of the rename-list were found in the
3335 module. */
3337 for (u = gfc_rename_list; u; u = u->next)
3339 if (u->found)
3340 continue;
3342 if (u->operator == INTRINSIC_NONE)
3344 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3345 u->use_name, &u->where, module_name);
3346 continue;
3349 if (u->operator == INTRINSIC_USER)
3351 gfc_error
3352 ("User operator '%s' referenced at %L not found in module '%s'",
3353 u->use_name, &u->where, module_name);
3354 continue;
3357 gfc_error
3358 ("Intrinsic operator '%s' referenced at %L not found in module "
3359 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3362 gfc_check_interfaces (gfc_current_ns);
3364 /* Clean up symbol nodes that were never loaded, create references
3365 to hidden symbols. */
3367 read_cleanup (pi_root);
3371 /* Given an access type that is specific to an entity and the default
3372 access, return nonzero if the entity is publicly accessible. */
3374 bool
3375 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3378 if (specific_access == ACCESS_PUBLIC)
3379 return TRUE;
3380 if (specific_access == ACCESS_PRIVATE)
3381 return FALSE;
3383 if (gfc_option.flag_module_access_private)
3384 return default_access == ACCESS_PUBLIC;
3385 else
3386 return default_access != ACCESS_PRIVATE;
3388 return FALSE;
3392 /* Write a common block to the module */
3394 static void
3395 write_common (gfc_symtree *st)
3397 gfc_common_head *p;
3398 const char * name;
3399 int flags;
3401 if (st == NULL)
3402 return;
3404 write_common(st->left);
3405 write_common(st->right);
3407 mio_lparen();
3409 /* Write the unmangled name. */
3410 name = st->n.common->name;
3412 mio_pool_string(&name);
3414 p = st->n.common;
3415 mio_symbol_ref(&p->head);
3416 flags = p->saved ? 1 : 0;
3417 if (p->threadprivate) flags |= 2;
3418 mio_integer(&flags);
3420 mio_rparen();
3423 /* Write the blank common block to the module */
3425 static void
3426 write_blank_common (void)
3428 const char * name = BLANK_COMMON_NAME;
3429 int saved;
3431 if (gfc_current_ns->blank_common.head == NULL)
3432 return;
3434 mio_lparen();
3436 mio_pool_string(&name);
3438 mio_symbol_ref(&gfc_current_ns->blank_common.head);
3439 saved = gfc_current_ns->blank_common.saved;
3440 mio_integer(&saved);
3442 mio_rparen();
3445 /* Write equivalences to the module. */
3447 static void
3448 write_equiv(void)
3450 gfc_equiv *eq, *e;
3451 int num;
3453 num = 0;
3454 for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3456 mio_lparen();
3458 for(e=eq; e; e=e->eq)
3460 if (e->module == NULL)
3461 e->module = gfc_get_string("%s.eq.%d", module_name, num);
3462 mio_allocated_string(e->module);
3463 mio_expr(&e->expr);
3466 num++;
3467 mio_rparen();
3471 /* Write a symbol to the module. */
3473 static void
3474 write_symbol (int n, gfc_symbol * sym)
3477 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3478 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3480 mio_integer (&n);
3481 mio_pool_string (&sym->name);
3483 mio_pool_string (&sym->module);
3484 mio_pointer_ref (&sym->ns);
3486 mio_symbol (sym);
3487 write_char ('\n');
3491 /* Recursive traversal function to write the initial set of symbols to
3492 the module. We check to see if the symbol should be written
3493 according to the access specification. */
3495 static void
3496 write_symbol0 (gfc_symtree * st)
3498 gfc_symbol *sym;
3499 pointer_info *p;
3501 if (st == NULL)
3502 return;
3504 write_symbol0 (st->left);
3505 write_symbol0 (st->right);
3507 sym = st->n.sym;
3508 if (sym->module == NULL)
3509 sym->module = gfc_get_string (module_name);
3511 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3512 && !sym->attr.subroutine && !sym->attr.function)
3513 return;
3515 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3516 return;
3518 p = get_pointer (sym);
3519 if (p->type == P_UNKNOWN)
3520 p->type = P_SYMBOL;
3522 if (p->u.wsym.state == WRITTEN)
3523 return;
3525 write_symbol (p->integer, sym);
3526 p->u.wsym.state = WRITTEN;
3528 return;
3532 /* Recursive traversal function to write the secondary set of symbols
3533 to the module file. These are symbols that were not public yet are
3534 needed by the public symbols or another dependent symbol. The act
3535 of writing a symbol can modify the pointer_info tree, so we cease
3536 traversal if we find a symbol to write. We return nonzero if a
3537 symbol was written and pass that information upwards. */
3539 static int
3540 write_symbol1 (pointer_info * p)
3543 if (p == NULL)
3544 return 0;
3546 if (write_symbol1 (p->left))
3547 return 1;
3548 if (write_symbol1 (p->right))
3549 return 1;
3551 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3552 return 0;
3554 p->u.wsym.state = WRITTEN;
3555 write_symbol (p->integer, p->u.wsym.sym);
3557 return 1;
3561 /* Write operator interfaces associated with a symbol. */
3563 static void
3564 write_operator (gfc_user_op * uop)
3566 static char nullstring[] = "";
3567 const char *p = nullstring;
3569 if (uop->operator == NULL
3570 || !gfc_check_access (uop->access, uop->ns->default_access))
3571 return;
3573 mio_symbol_interface (&uop->name, &p, &uop->operator);
3577 /* Write generic interfaces associated with a symbol. */
3579 static void
3580 write_generic (gfc_symbol * sym)
3583 if (sym->generic == NULL
3584 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3585 return;
3587 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3591 static void
3592 write_symtree (gfc_symtree * st)
3594 gfc_symbol *sym;
3595 pointer_info *p;
3597 sym = st->n.sym;
3598 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3599 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3600 && !sym->attr.subroutine && !sym->attr.function))
3601 return;
3603 if (check_unique_name (st->name))
3604 return;
3606 p = find_pointer (sym);
3607 if (p == NULL)
3608 gfc_internal_error ("write_symtree(): Symbol not written");
3610 mio_pool_string (&st->name);
3611 mio_integer (&st->ambiguous);
3612 mio_integer (&p->integer);
3616 static void
3617 write_module (void)
3619 gfc_intrinsic_op i;
3621 /* Write the operator interfaces. */
3622 mio_lparen ();
3624 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3626 if (i == INTRINSIC_USER)
3627 continue;
3629 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3630 gfc_current_ns->default_access)
3631 ? &gfc_current_ns->operator[i] : NULL);
3634 mio_rparen ();
3635 write_char ('\n');
3636 write_char ('\n');
3638 mio_lparen ();
3639 gfc_traverse_user_op (gfc_current_ns, write_operator);
3640 mio_rparen ();
3641 write_char ('\n');
3642 write_char ('\n');
3644 mio_lparen ();
3645 gfc_traverse_ns (gfc_current_ns, write_generic);
3646 mio_rparen ();
3647 write_char ('\n');
3648 write_char ('\n');
3650 mio_lparen ();
3651 write_blank_common ();
3652 write_common (gfc_current_ns->common_root);
3653 mio_rparen ();
3654 write_char ('\n');
3655 write_char ('\n');
3657 mio_lparen();
3658 write_equiv();
3659 mio_rparen();
3660 write_char('\n'); write_char('\n');
3662 /* Write symbol information. First we traverse all symbols in the
3663 primary namespace, writing those that need to be written.
3664 Sometimes writing one symbol will cause another to need to be
3665 written. A list of these symbols ends up on the write stack, and
3666 we end by popping the bottom of the stack and writing the symbol
3667 until the stack is empty. */
3669 mio_lparen ();
3671 write_symbol0 (gfc_current_ns->sym_root);
3672 while (write_symbol1 (pi_root));
3674 mio_rparen ();
3676 write_char ('\n');
3677 write_char ('\n');
3679 mio_lparen ();
3680 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3681 mio_rparen ();
3685 /* Given module, dump it to disk. If there was an error while
3686 processing the module, dump_flag will be set to zero and we delete
3687 the module file, even if it was already there. */
3689 void
3690 gfc_dump_module (const char *name, int dump_flag)
3692 int n;
3693 char *filename, *p;
3694 time_t now;
3696 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3697 if (gfc_option.module_dir != NULL)
3699 filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3700 strcpy (filename, gfc_option.module_dir);
3701 strcat (filename, name);
3703 else
3705 filename = (char *) alloca (n);
3706 strcpy (filename, name);
3708 strcat (filename, MODULE_EXTENSION);
3710 if (!dump_flag)
3712 unlink (filename);
3713 return;
3716 module_fp = fopen (filename, "w");
3717 if (module_fp == NULL)
3718 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3719 filename, strerror (errno));
3721 now = time (NULL);
3722 p = ctime (&now);
3724 *strchr (p, '\n') = '\0';
3726 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3727 gfc_source_file, p);
3728 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3730 iomode = IO_OUTPUT;
3731 strcpy (module_name, name);
3733 init_pi_tree ();
3735 write_module ();
3737 free_pi_tree (pi_root);
3738 pi_root = NULL;
3740 write_char ('\n');
3742 if (fclose (module_fp))
3743 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3744 filename, strerror (errno));
3748 /* Process a USE directive. */
3750 void
3751 gfc_use_module (void)
3753 char *filename;
3754 gfc_state_data *p;
3755 int c, line;
3757 filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
3758 + 1);
3759 strcpy (filename, module_name);
3760 strcat (filename, MODULE_EXTENSION);
3762 module_fp = gfc_open_included_file (filename, true);
3763 if (module_fp == NULL)
3764 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3765 filename, strerror (errno));
3767 iomode = IO_INPUT;
3768 module_line = 1;
3769 module_column = 1;
3771 /* Skip the first two lines of the module. */
3772 /* FIXME: Could also check for valid two lines here, instead. */
3773 line = 0;
3774 while (line < 2)
3776 c = module_char ();
3777 if (c == EOF)
3778 bad_module ("Unexpected end of module");
3779 if (c == '\n')
3780 line++;
3783 /* Make sure we're not reading the same module that we may be building. */
3784 for (p = gfc_state_stack; p; p = p->previous)
3785 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3786 gfc_fatal_error ("Can't USE the same module we're building!");
3788 init_pi_tree ();
3789 init_true_name_tree ();
3791 read_module ();
3793 free_true_name (true_name_root);
3794 true_name_root = NULL;
3796 free_pi_tree (pi_root);
3797 pi_root = NULL;
3799 fclose (module_fp);
3803 void
3804 gfc_module_init_2 (void)
3807 last_atom = ATOM_LPAREN;
3811 void
3812 gfc_module_done_2 (void)
3815 free_rename ();