Merge from the pain train
[official-gcc.git] / gcc / fortran / module.c
blob4b69b738db1866561e4e3524acca45e65129fdfd
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, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, 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 ...
50 ( <Symbol Number (in no particular order)>
51 <True name of symbol>
52 <Module name of symbol>
53 ( <symbol information> )
54 ...
56 ( <Symtree name>
57 <Ambiguous flag>
58 <Symbol number>
59 ...
62 In general, symbols refer to other symbols by their symbol number,
63 which are zero based. Symbols are written to the module in no
64 particular order. */
66 #include "config.h"
67 #include "system.h"
68 #include "gfortran.h"
69 #include "arith.h"
70 #include "match.h"
71 #include "parse.h" /* FIXME */
73 #define MODULE_EXTENSION ".mod"
76 /* Structure that describes a position within a module file. */
78 typedef struct
80 int column, line;
81 fpos_t pos;
83 module_locus;
86 typedef enum
88 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
90 pointer_t;
92 /* The fixup structure lists pointers to pointers that have to
93 be updated when a pointer value becomes known. */
95 typedef struct fixup_t
97 void **pointer;
98 struct fixup_t *next;
100 fixup_t;
103 /* Structure for holding extra info needed for pointers being read. */
105 typedef struct pointer_info
107 BBT_HEADER (pointer_info);
108 int integer;
109 pointer_t type;
111 /* The first component of each member of the union is the pointer
112 being stored. */
114 fixup_t *fixup;
116 union
118 void *pointer; /* Member for doing pointer searches. */
120 struct
122 gfc_symbol *sym;
123 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
124 enum
125 { UNUSED, NEEDED, USED }
126 state;
127 int ns, referenced;
128 module_locus where;
129 fixup_t *stfixup;
130 gfc_symtree *symtree;
132 rsym;
134 struct
136 gfc_symbol *sym;
137 enum
138 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
139 state;
141 wsym;
146 pointer_info;
148 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
151 /* Lists of rename info for the USE statement. */
153 typedef struct gfc_use_rename
155 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
156 struct gfc_use_rename *next;
157 int found;
158 gfc_intrinsic_op operator;
159 locus where;
161 gfc_use_rename;
163 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
165 /* Local variables */
167 /* The FILE for the module we're reading or writing. */
168 static FILE *module_fp;
170 /* The name of the module we're reading (USE'ing) or writing. */
171 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
173 static int module_line, module_column, only_flag;
174 static enum
175 { IO_INPUT, IO_OUTPUT }
176 iomode;
178 static gfc_use_rename *gfc_rename_list;
179 static pointer_info *pi_root;
180 static int symbol_number; /* Counter for assigning symbol numbers */
184 /*****************************************************************/
186 /* Pointer/integer conversion. Pointers between structures are stored
187 as integers in the module file. The next couple of subroutines
188 handle this translation for reading and writing. */
190 /* Recursively free the tree of pointer structures. */
192 static void
193 free_pi_tree (pointer_info * p)
195 if (p == NULL)
196 return;
198 if (p->fixup != NULL)
199 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
201 free_pi_tree (p->left);
202 free_pi_tree (p->right);
204 gfc_free (p);
208 /* Compare pointers when searching by pointer. Used when writing a
209 module. */
211 static int
212 compare_pointers (void * _sn1, void * _sn2)
214 pointer_info *sn1, *sn2;
216 sn1 = (pointer_info *) _sn1;
217 sn2 = (pointer_info *) _sn2;
219 if (sn1->u.pointer < sn2->u.pointer)
220 return -1;
221 if (sn1->u.pointer > sn2->u.pointer)
222 return 1;
224 return 0;
228 /* Compare integers when searching by integer. Used when reading a
229 module. */
231 static int
232 compare_integers (void * _sn1, void * _sn2)
234 pointer_info *sn1, *sn2;
236 sn1 = (pointer_info *) _sn1;
237 sn2 = (pointer_info *) _sn2;
239 if (sn1->integer < sn2->integer)
240 return -1;
241 if (sn1->integer > sn2->integer)
242 return 1;
244 return 0;
248 /* Initialize the pointer_info tree. */
250 static void
251 init_pi_tree (void)
253 compare_fn compare;
254 pointer_info *p;
256 pi_root = NULL;
257 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
259 /* Pointer 0 is the NULL pointer. */
260 p = gfc_get_pointer_info ();
261 p->u.pointer = NULL;
262 p->integer = 0;
263 p->type = P_OTHER;
265 gfc_insert_bbt (&pi_root, p, compare);
267 /* Pointer 1 is the current namespace. */
268 p = gfc_get_pointer_info ();
269 p->u.pointer = gfc_current_ns;
270 p->integer = 1;
271 p->type = P_NAMESPACE;
273 gfc_insert_bbt (&pi_root, p, compare);
275 symbol_number = 2;
279 /* During module writing, call here with a pointer to something,
280 returning the pointer_info node. */
282 static pointer_info *
283 find_pointer (void *gp)
285 pointer_info *p;
287 p = pi_root;
288 while (p != NULL)
290 if (p->u.pointer == gp)
291 break;
292 p = (gp < p->u.pointer) ? p->left : p->right;
295 return p;
299 /* Given a pointer while writing, returns the pointer_info tree node,
300 creating it if it doesn't exist. */
302 static pointer_info *
303 get_pointer (void *gp)
305 pointer_info *p;
307 p = find_pointer (gp);
308 if (p != NULL)
309 return p;
311 /* Pointer doesn't have an integer. Give it one. */
312 p = gfc_get_pointer_info ();
314 p->u.pointer = gp;
315 p->integer = symbol_number++;
317 gfc_insert_bbt (&pi_root, p, compare_pointers);
319 return p;
323 /* Given an integer during reading, find it in the pointer_info tree,
324 creating the node if not found. */
326 static pointer_info *
327 get_integer (int integer)
329 pointer_info *p, t;
330 int c;
332 t.integer = integer;
334 p = pi_root;
335 while (p != NULL)
337 c = compare_integers (&t, p);
338 if (c == 0)
339 break;
341 p = (c < 0) ? p->left : p->right;
344 if (p != NULL)
345 return p;
347 p = gfc_get_pointer_info ();
348 p->integer = integer;
349 p->u.pointer = NULL;
351 gfc_insert_bbt (&pi_root, p, compare_integers);
353 return p;
357 /* Recursive function to find a pointer within a tree by brute force. */
359 static pointer_info *
360 fp2 (pointer_info * p, const void *target)
362 pointer_info *q;
364 if (p == NULL)
365 return NULL;
367 if (p->u.pointer == target)
368 return p;
370 q = fp2 (p->left, target);
371 if (q != NULL)
372 return q;
374 return fp2 (p->right, target);
378 /* During reading, find a pointer_info node from the pointer value.
379 This amounts to a brute-force search. */
381 static pointer_info *
382 find_pointer2 (void *p)
385 return fp2 (pi_root, p);
389 /* Resolve any fixups using a known pointer. */
390 static void
391 resolve_fixups (fixup_t *f, void * gp)
393 fixup_t *next;
395 for (; f; f = next)
397 next = f->next;
398 *(f->pointer) = gp;
399 gfc_free (f);
403 /* Call here during module reading when we know what pointer to
404 associate with an integer. Any fixups that exist are resolved at
405 this time. */
407 static void
408 associate_integer_pointer (pointer_info * p, void *gp)
410 if (p->u.pointer != NULL)
411 gfc_internal_error ("associate_integer_pointer(): Already associated");
413 p->u.pointer = gp;
415 resolve_fixups (p->fixup, gp);
417 p->fixup = NULL;
421 /* During module reading, given an integer and a pointer to a pointer,
422 either store the pointer from an already-known value or create a
423 fixup structure in order to store things later. Returns zero if
424 the reference has been actually stored, or nonzero if the reference
425 must be fixed later (ie associate_integer_pointer must be called
426 sometime later. Returns the pointer_info structure. */
428 static pointer_info *
429 add_fixup (int integer, void *gp)
431 pointer_info *p;
432 fixup_t *f;
433 char **cp;
435 p = get_integer (integer);
437 if (p->integer == 0 || p->u.pointer != NULL)
439 cp = gp;
440 *cp = p->u.pointer;
442 else
444 f = gfc_getmem (sizeof (fixup_t));
446 f->next = p->fixup;
447 p->fixup = f;
449 f->pointer = gp;
452 return p;
456 /*****************************************************************/
458 /* Parser related subroutines */
460 /* Free the rename list left behind by a USE statement. */
462 static void
463 free_rename (void)
465 gfc_use_rename *next;
467 for (; gfc_rename_list; gfc_rename_list = next)
469 next = gfc_rename_list->next;
470 gfc_free (gfc_rename_list);
475 /* Match a USE statement. */
477 match
478 gfc_match_use (void)
480 char name[GFC_MAX_SYMBOL_LEN + 1];
481 gfc_use_rename *tail = NULL, *new;
482 interface_type type;
483 gfc_intrinsic_op operator;
484 match m;
486 m = gfc_match_name (module_name);
487 if (m != MATCH_YES)
488 return m;
490 free_rename ();
491 only_flag = 0;
493 if (gfc_match_eos () == MATCH_YES)
494 return MATCH_YES;
495 if (gfc_match_char (',') != MATCH_YES)
496 goto syntax;
498 if (gfc_match (" only :") == MATCH_YES)
499 only_flag = 1;
501 if (gfc_match_eos () == MATCH_YES)
502 return MATCH_YES;
504 for (;;)
506 /* Get a new rename struct and add it to the rename list. */
507 new = gfc_get_use_rename ();
508 new->where = gfc_current_locus;
509 new->found = 0;
511 if (gfc_rename_list == NULL)
512 gfc_rename_list = new;
513 else
514 tail->next = new;
515 tail = new;
517 /* See what kind of interface we're dealing with. Assume it is
518 not an operator. */
519 new->operator = INTRINSIC_NONE;
520 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
521 goto cleanup;
523 switch (type)
525 case INTERFACE_NAMELESS:
526 gfc_error ("Missing generic specification in USE statement at %C");
527 goto cleanup;
529 case INTERFACE_GENERIC:
530 m = gfc_match (" =>");
532 if (only_flag)
534 if (m != MATCH_YES)
535 strcpy (new->use_name, name);
536 else
538 strcpy (new->local_name, name);
540 m = gfc_match_name (new->use_name);
541 if (m == MATCH_NO)
542 goto syntax;
543 if (m == MATCH_ERROR)
544 goto cleanup;
547 else
549 if (m != MATCH_YES)
550 goto syntax;
551 strcpy (new->local_name, name);
553 m = gfc_match_name (new->use_name);
554 if (m == MATCH_NO)
555 goto syntax;
556 if (m == MATCH_ERROR)
557 goto cleanup;
560 break;
562 case INTERFACE_USER_OP:
563 strcpy (new->use_name, name);
564 /* Fall through */
566 case INTERFACE_INTRINSIC_OP:
567 new->operator = operator;
568 break;
571 if (gfc_match_eos () == MATCH_YES)
572 break;
573 if (gfc_match_char (',') != MATCH_YES)
574 goto syntax;
577 return MATCH_YES;
579 syntax:
580 gfc_syntax_error (ST_USE);
582 cleanup:
583 free_rename ();
584 return MATCH_ERROR;
588 /* Given a name, return the name under which to load this symbol.
589 Returns NULL if this symbol shouldn't be loaded. */
591 static const char *
592 find_use_name (const char *name)
594 gfc_use_rename *u;
596 for (u = gfc_rename_list; u; u = u->next)
597 if (strcmp (u->use_name, name) == 0)
598 break;
600 if (u == NULL)
601 return only_flag ? NULL : name;
603 u->found = 1;
605 return (u->local_name[0] != '\0') ? u->local_name : name;
609 /* Try to find the operator in the current list. */
611 static gfc_use_rename *
612 find_use_operator (gfc_intrinsic_op operator)
614 gfc_use_rename *u;
616 for (u = gfc_rename_list; u; u = u->next)
617 if (u->operator == operator)
618 return u;
620 return NULL;
624 /*****************************************************************/
626 /* The next couple of subroutines maintain a tree used to avoid a
627 brute-force search for a combination of true name and module name.
628 While symtree names, the name that a particular symbol is known by
629 can changed with USE statements, we still have to keep track of the
630 true names to generate the correct reference, and also avoid
631 loading the same real symbol twice in a program unit.
633 When we start reading, the true name tree is built and maintained
634 as symbols are read. The tree is searched as we load new symbols
635 to see if it already exists someplace in the namespace. */
637 typedef struct true_name
639 BBT_HEADER (true_name);
640 gfc_symbol *sym;
642 true_name;
644 static true_name *true_name_root;
647 /* Compare two true_name structures. */
649 static int
650 compare_true_names (void * _t1, void * _t2)
652 true_name *t1, *t2;
653 int c;
655 t1 = (true_name *) _t1;
656 t2 = (true_name *) _t2;
658 c = ((t1->sym->module > t2->sym->module)
659 - (t1->sym->module < t2->sym->module));
660 if (c != 0)
661 return c;
663 return strcmp (t1->sym->name, t2->sym->name);
667 /* Given a true name, search the true name tree to see if it exists
668 within the main namespace. */
670 static gfc_symbol *
671 find_true_name (const char *name, const char *module)
673 true_name t, *p;
674 gfc_symbol sym;
675 int c;
677 sym.name = gfc_get_string (name);
678 if (module != NULL)
679 sym.module = gfc_get_string (module);
680 else
681 sym.module = NULL;
682 t.sym = &sym;
684 p = true_name_root;
685 while (p != NULL)
687 c = compare_true_names ((void *)(&t), (void *) p);
688 if (c == 0)
689 return p->sym;
691 p = (c < 0) ? p->left : p->right;
694 return NULL;
698 /* Given a gfc_symbol pointer that is not in the true name tree, add
699 it. */
701 static void
702 add_true_name (gfc_symbol * sym)
704 true_name *t;
706 t = gfc_getmem (sizeof (true_name));
707 t->sym = sym;
709 gfc_insert_bbt (&true_name_root, t, compare_true_names);
713 /* Recursive function to build the initial true name tree by
714 recursively traversing the current namespace. */
716 static void
717 build_tnt (gfc_symtree * st)
720 if (st == NULL)
721 return;
723 build_tnt (st->left);
724 build_tnt (st->right);
726 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
727 return;
729 add_true_name (st->n.sym);
733 /* Initialize the true name tree with the current namespace. */
735 static void
736 init_true_name_tree (void)
738 true_name_root = NULL;
740 build_tnt (gfc_current_ns->sym_root);
744 /* Recursively free a true name tree node. */
746 static void
747 free_true_name (true_name * t)
750 if (t == NULL)
751 return;
752 free_true_name (t->left);
753 free_true_name (t->right);
755 gfc_free (t);
759 /*****************************************************************/
761 /* Module reading and writing. */
763 typedef enum
765 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
767 atom_type;
769 static atom_type last_atom;
772 /* The name buffer must be at least as long as a symbol name. Right
773 now it's not clear how we're going to store numeric constants--
774 probably as a hexadecimal string, since this will allow the exact
775 number to be preserved (this can't be done by a decimal
776 representation). Worry about that later. TODO! */
778 #define MAX_ATOM_SIZE 100
780 static int atom_int;
781 static char *atom_string, atom_name[MAX_ATOM_SIZE];
784 /* Report problems with a module. Error reporting is not very
785 elaborate, since this sorts of errors shouldn't really happen.
786 This subroutine never returns. */
788 static void bad_module (const char *) ATTRIBUTE_NORETURN;
790 static void
791 bad_module (const char *message)
793 const char *p;
795 switch (iomode)
797 case IO_INPUT:
798 p = "Reading";
799 break;
800 case IO_OUTPUT:
801 p = "Writing";
802 break;
803 default:
804 p = "???";
805 break;
808 fclose (module_fp);
810 gfc_fatal_error ("%s module %s at line %d column %d: %s", p,
811 module_name, module_line, module_column, message);
815 /* Set the module's input pointer. */
817 static void
818 set_module_locus (module_locus * m)
821 module_column = m->column;
822 module_line = m->line;
823 fsetpos (module_fp, &m->pos);
827 /* Get the module's input pointer so that we can restore it later. */
829 static void
830 get_module_locus (module_locus * m)
833 m->column = module_column;
834 m->line = module_line;
835 fgetpos (module_fp, &m->pos);
839 /* Get the next character in the module, updating our reckoning of
840 where we are. */
842 static int
843 module_char (void)
845 int c;
847 c = fgetc (module_fp);
849 if (c == EOF)
850 bad_module ("Unexpected EOF");
852 if (c == '\n')
854 module_line++;
855 module_column = 0;
858 module_column++;
859 return c;
863 /* Parse a string constant. The delimiter is guaranteed to be a
864 single quote. */
866 static void
867 parse_string (void)
869 module_locus start;
870 int len, c;
871 char *p;
873 get_module_locus (&start);
875 len = 0;
877 /* See how long the string is */
878 for ( ; ; )
880 c = module_char ();
881 if (c == EOF)
882 bad_module ("Unexpected end of module in string constant");
884 if (c != '\'')
886 len++;
887 continue;
890 c = module_char ();
891 if (c == '\'')
893 len++;
894 continue;
897 break;
900 set_module_locus (&start);
902 atom_string = p = gfc_getmem (len + 1);
904 for (; len > 0; len--)
906 c = module_char ();
907 if (c == '\'')
908 module_char (); /* Guaranteed to be another \' */
909 *p++ = c;
912 module_char (); /* Terminating \' */
913 *p = '\0'; /* C-style string for debug purposes */
917 /* Parse a small integer. */
919 static void
920 parse_integer (int c)
922 module_locus m;
924 atom_int = c - '0';
926 for (;;)
928 get_module_locus (&m);
930 c = module_char ();
931 if (!ISDIGIT (c))
932 break;
934 atom_int = 10 * atom_int + c - '0';
935 if (atom_int > 99999999)
936 bad_module ("Integer overflow");
939 set_module_locus (&m);
943 /* Parse a name. */
945 static void
946 parse_name (int c)
948 module_locus m;
949 char *p;
950 int len;
952 p = atom_name;
954 *p++ = c;
955 len = 1;
957 get_module_locus (&m);
959 for (;;)
961 c = module_char ();
962 if (!ISALNUM (c) && c != '_' && c != '-')
963 break;
965 *p++ = c;
966 if (++len > GFC_MAX_SYMBOL_LEN)
967 bad_module ("Name too long");
970 *p = '\0';
972 fseek (module_fp, -1, SEEK_CUR);
973 module_column = m.column + len - 1;
975 if (c == '\n')
976 module_line--;
980 /* Read the next atom in the module's input stream. */
982 static atom_type
983 parse_atom (void)
985 int c;
989 c = module_char ();
991 while (c == ' ' || c == '\n');
993 switch (c)
995 case '(':
996 return ATOM_LPAREN;
998 case ')':
999 return ATOM_RPAREN;
1001 case '\'':
1002 parse_string ();
1003 return ATOM_STRING;
1005 case '0':
1006 case '1':
1007 case '2':
1008 case '3':
1009 case '4':
1010 case '5':
1011 case '6':
1012 case '7':
1013 case '8':
1014 case '9':
1015 parse_integer (c);
1016 return ATOM_INTEGER;
1018 case 'a':
1019 case 'b':
1020 case 'c':
1021 case 'd':
1022 case 'e':
1023 case 'f':
1024 case 'g':
1025 case 'h':
1026 case 'i':
1027 case 'j':
1028 case 'k':
1029 case 'l':
1030 case 'm':
1031 case 'n':
1032 case 'o':
1033 case 'p':
1034 case 'q':
1035 case 'r':
1036 case 's':
1037 case 't':
1038 case 'u':
1039 case 'v':
1040 case 'w':
1041 case 'x':
1042 case 'y':
1043 case 'z':
1044 case 'A':
1045 case 'B':
1046 case 'C':
1047 case 'D':
1048 case 'E':
1049 case 'F':
1050 case 'G':
1051 case 'H':
1052 case 'I':
1053 case 'J':
1054 case 'K':
1055 case 'L':
1056 case 'M':
1057 case 'N':
1058 case 'O':
1059 case 'P':
1060 case 'Q':
1061 case 'R':
1062 case 'S':
1063 case 'T':
1064 case 'U':
1065 case 'V':
1066 case 'W':
1067 case 'X':
1068 case 'Y':
1069 case 'Z':
1070 parse_name (c);
1071 return ATOM_NAME;
1073 default:
1074 bad_module ("Bad name");
1077 /* Not reached */
1081 /* Peek at the next atom on the input. */
1083 static atom_type
1084 peek_atom (void)
1086 module_locus m;
1087 atom_type a;
1089 get_module_locus (&m);
1091 a = parse_atom ();
1092 if (a == ATOM_STRING)
1093 gfc_free (atom_string);
1095 set_module_locus (&m);
1096 return a;
1100 /* Read the next atom from the input, requiring that it be a
1101 particular kind. */
1103 static void
1104 require_atom (atom_type type)
1106 module_locus m;
1107 atom_type t;
1108 const char *p;
1110 get_module_locus (&m);
1112 t = parse_atom ();
1113 if (t != type)
1115 switch (type)
1117 case ATOM_NAME:
1118 p = "Expected name";
1119 break;
1120 case ATOM_LPAREN:
1121 p = "Expected left parenthesis";
1122 break;
1123 case ATOM_RPAREN:
1124 p = "Expected right parenthesis";
1125 break;
1126 case ATOM_INTEGER:
1127 p = "Expected integer";
1128 break;
1129 case ATOM_STRING:
1130 p = "Expected string";
1131 break;
1132 default:
1133 gfc_internal_error ("require_atom(): bad atom type required");
1136 set_module_locus (&m);
1137 bad_module (p);
1142 /* Given a pointer to an mstring array, require that the current input
1143 be one of the strings in the array. We return the enum value. */
1145 static int
1146 find_enum (const mstring * m)
1148 int i;
1150 i = gfc_string2code (m, atom_name);
1151 if (i >= 0)
1152 return i;
1154 bad_module ("find_enum(): Enum not found");
1156 /* Not reached */
1160 /**************** Module output subroutines ***************************/
1162 /* Output a character to a module file. */
1164 static void
1165 write_char (char out)
1168 if (fputc (out, module_fp) == EOF)
1169 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1171 if (out != '\n')
1172 module_column++;
1173 else
1175 module_column = 1;
1176 module_line++;
1181 /* Write an atom to a module. The line wrapping isn't perfect, but it
1182 should work most of the time. This isn't that big of a deal, since
1183 the file really isn't meant to be read by people anyway. */
1185 static void
1186 write_atom (atom_type atom, const void *v)
1188 char buffer[20];
1189 int i, len;
1190 const char *p;
1192 switch (atom)
1194 case ATOM_STRING:
1195 case ATOM_NAME:
1196 p = v;
1197 break;
1199 case ATOM_LPAREN:
1200 p = "(";
1201 break;
1203 case ATOM_RPAREN:
1204 p = ")";
1205 break;
1207 case ATOM_INTEGER:
1208 i = *((const int *) v);
1209 if (i < 0)
1210 gfc_internal_error ("write_atom(): Writing negative integer");
1212 sprintf (buffer, "%d", i);
1213 p = buffer;
1214 break;
1216 default:
1217 gfc_internal_error ("write_atom(): Trying to write dab atom");
1221 len = strlen (p);
1223 if (atom != ATOM_RPAREN)
1225 if (module_column + len > 72)
1226 write_char ('\n');
1227 else
1230 if (last_atom != ATOM_LPAREN && module_column != 1)
1231 write_char (' ');
1235 if (atom == ATOM_STRING)
1236 write_char ('\'');
1238 while (*p)
1240 if (atom == ATOM_STRING && *p == '\'')
1241 write_char ('\'');
1242 write_char (*p++);
1245 if (atom == ATOM_STRING)
1246 write_char ('\'');
1248 last_atom = atom;
1253 /***************** Mid-level I/O subroutines *****************/
1255 /* These subroutines let their caller read or write atoms without
1256 caring about which of the two is actually happening. This lets a
1257 subroutine concentrate on the actual format of the data being
1258 written. */
1260 static void mio_expr (gfc_expr **);
1261 static void mio_symbol_ref (gfc_symbol **);
1262 static void mio_symtree_ref (gfc_symtree **);
1264 /* Read or write an enumerated value. On writing, we return the input
1265 value for the convenience of callers. We avoid using an integer
1266 pointer because enums are sometimes inside bitfields. */
1268 static int
1269 mio_name (int t, const mstring * m)
1272 if (iomode == IO_OUTPUT)
1273 write_atom (ATOM_NAME, gfc_code2string (m, t));
1274 else
1276 require_atom (ATOM_NAME);
1277 t = find_enum (m);
1280 return t;
1283 /* Specialisation of mio_name. */
1285 #define DECL_MIO_NAME(TYPE) \
1286 static inline TYPE \
1287 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1289 return (TYPE)mio_name ((int)t, m); \
1291 #define MIO_NAME(TYPE) mio_name_##TYPE
1293 static void
1294 mio_lparen (void)
1297 if (iomode == IO_OUTPUT)
1298 write_atom (ATOM_LPAREN, NULL);
1299 else
1300 require_atom (ATOM_LPAREN);
1304 static void
1305 mio_rparen (void)
1308 if (iomode == IO_OUTPUT)
1309 write_atom (ATOM_RPAREN, NULL);
1310 else
1311 require_atom (ATOM_RPAREN);
1315 static void
1316 mio_integer (int *ip)
1319 if (iomode == IO_OUTPUT)
1320 write_atom (ATOM_INTEGER, ip);
1321 else
1323 require_atom (ATOM_INTEGER);
1324 *ip = atom_int;
1329 /* Read or write a character pointer that points to a string on the
1330 heap. */
1332 static const char *
1333 mio_allocated_string (const char *s)
1335 if (iomode == IO_OUTPUT)
1337 write_atom (ATOM_STRING, s);
1338 return s;
1340 else
1342 require_atom (ATOM_STRING);
1343 return atom_string;
1348 /* Read or write a string that is in static memory. */
1350 static void
1351 mio_pool_string (const char **stringp)
1353 /* TODO: one could write the string only once, and refer to it via a
1354 fixup pointer. */
1356 /* As a special case we have to deal with a NULL string. This
1357 happens for the 'module' member of 'gfc_symbol's that are not in a
1358 module. We read / write these as the empty string. */
1359 if (iomode == IO_OUTPUT)
1361 const char *p = *stringp == NULL ? "" : *stringp;
1362 write_atom (ATOM_STRING, p);
1364 else
1366 require_atom (ATOM_STRING);
1367 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1368 gfc_free (atom_string);
1373 /* Read or write a string that is inside of some already-allocated
1374 structure. */
1376 static void
1377 mio_internal_string (char *string)
1380 if (iomode == IO_OUTPUT)
1381 write_atom (ATOM_STRING, string);
1382 else
1384 require_atom (ATOM_STRING);
1385 strcpy (string, atom_string);
1386 gfc_free (atom_string);
1392 typedef enum
1393 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1394 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
1395 AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON,
1396 AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1397 AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT
1399 ab_attribute;
1401 static const mstring attr_bits[] =
1403 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1404 minit ("DIMENSION", AB_DIMENSION),
1405 minit ("EXTERNAL", AB_EXTERNAL),
1406 minit ("INTRINSIC", AB_INTRINSIC),
1407 minit ("OPTIONAL", AB_OPTIONAL),
1408 minit ("POINTER", AB_POINTER),
1409 minit ("SAVE", AB_SAVE),
1410 minit ("TARGET", AB_TARGET),
1411 minit ("DUMMY", AB_DUMMY),
1412 minit ("RESULT", AB_RESULT),
1413 minit ("DATA", AB_DATA),
1414 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1415 minit ("IN_COMMON", AB_IN_COMMON),
1416 minit ("FUNCTION", AB_FUNCTION),
1417 minit ("SUBROUTINE", AB_SUBROUTINE),
1418 minit ("SEQUENCE", AB_SEQUENCE),
1419 minit ("ELEMENTAL", AB_ELEMENTAL),
1420 minit ("PURE", AB_PURE),
1421 minit ("RECURSIVE", AB_RECURSIVE),
1422 minit ("GENERIC", AB_GENERIC),
1423 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1424 minit (NULL, -1)
1427 /* Specialisation of mio_name. */
1428 DECL_MIO_NAME(ab_attribute)
1429 DECL_MIO_NAME(ar_type)
1430 DECL_MIO_NAME(array_type)
1431 DECL_MIO_NAME(bt)
1432 DECL_MIO_NAME(expr_t)
1433 DECL_MIO_NAME(gfc_access)
1434 DECL_MIO_NAME(gfc_intrinsic_op)
1435 DECL_MIO_NAME(ifsrc)
1436 DECL_MIO_NAME(procedure_type)
1437 DECL_MIO_NAME(ref_type)
1438 DECL_MIO_NAME(sym_flavor)
1439 DECL_MIO_NAME(sym_intent)
1440 #undef DECL_MIO_NAME
1442 /* Symbol attributes are stored in list with the first three elements
1443 being the enumerated fields, while the remaining elements (if any)
1444 indicate the individual attribute bits. The access field is not
1445 saved-- it controls what symbols are exported when a module is
1446 written. */
1448 static void
1449 mio_symbol_attribute (symbol_attribute * attr)
1451 atom_type t;
1453 mio_lparen ();
1455 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1456 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1457 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1458 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1460 if (iomode == IO_OUTPUT)
1462 if (attr->allocatable)
1463 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1464 if (attr->dimension)
1465 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1466 if (attr->external)
1467 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1468 if (attr->intrinsic)
1469 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1470 if (attr->optional)
1471 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1472 if (attr->pointer)
1473 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1474 if (attr->save)
1475 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1476 if (attr->target)
1477 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1478 if (attr->dummy)
1479 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1480 if (attr->result)
1481 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1482 /* We deliberately don't preserve the "entry" flag. */
1484 if (attr->data)
1485 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1486 if (attr->in_namelist)
1487 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1488 if (attr->in_common)
1489 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1491 if (attr->function)
1492 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1493 if (attr->subroutine)
1494 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1495 if (attr->generic)
1496 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1498 if (attr->sequence)
1499 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1500 if (attr->elemental)
1501 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1502 if (attr->pure)
1503 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1504 if (attr->recursive)
1505 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1506 if (attr->always_explicit)
1507 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1509 mio_rparen ();
1512 else
1515 for (;;)
1517 t = parse_atom ();
1518 if (t == ATOM_RPAREN)
1519 break;
1520 if (t != ATOM_NAME)
1521 bad_module ("Expected attribute bit name");
1523 switch ((ab_attribute) find_enum (attr_bits))
1525 case AB_ALLOCATABLE:
1526 attr->allocatable = 1;
1527 break;
1528 case AB_DIMENSION:
1529 attr->dimension = 1;
1530 break;
1531 case AB_EXTERNAL:
1532 attr->external = 1;
1533 break;
1534 case AB_INTRINSIC:
1535 attr->intrinsic = 1;
1536 break;
1537 case AB_OPTIONAL:
1538 attr->optional = 1;
1539 break;
1540 case AB_POINTER:
1541 attr->pointer = 1;
1542 break;
1543 case AB_SAVE:
1544 attr->save = 1;
1545 break;
1546 case AB_TARGET:
1547 attr->target = 1;
1548 break;
1549 case AB_DUMMY:
1550 attr->dummy = 1;
1551 break;
1552 case AB_RESULT:
1553 attr->result = 1;
1554 break;
1555 case AB_DATA:
1556 attr->data = 1;
1557 break;
1558 case AB_IN_NAMELIST:
1559 attr->in_namelist = 1;
1560 break;
1561 case AB_IN_COMMON:
1562 attr->in_common = 1;
1563 break;
1564 case AB_FUNCTION:
1565 attr->function = 1;
1566 break;
1567 case AB_SUBROUTINE:
1568 attr->subroutine = 1;
1569 break;
1570 case AB_GENERIC:
1571 attr->generic = 1;
1572 break;
1573 case AB_SEQUENCE:
1574 attr->sequence = 1;
1575 break;
1576 case AB_ELEMENTAL:
1577 attr->elemental = 1;
1578 break;
1579 case AB_PURE:
1580 attr->pure = 1;
1581 break;
1582 case AB_RECURSIVE:
1583 attr->recursive = 1;
1584 break;
1585 case AB_ALWAYS_EXPLICIT:
1586 attr->always_explicit = 1;
1587 break;
1594 static const mstring bt_types[] = {
1595 minit ("INTEGER", BT_INTEGER),
1596 minit ("REAL", BT_REAL),
1597 minit ("COMPLEX", BT_COMPLEX),
1598 minit ("LOGICAL", BT_LOGICAL),
1599 minit ("CHARACTER", BT_CHARACTER),
1600 minit ("DERIVED", BT_DERIVED),
1601 minit ("PROCEDURE", BT_PROCEDURE),
1602 minit ("UNKNOWN", BT_UNKNOWN),
1603 minit (NULL, -1)
1607 static void
1608 mio_charlen (gfc_charlen ** clp)
1610 gfc_charlen *cl;
1612 mio_lparen ();
1614 if (iomode == IO_OUTPUT)
1616 cl = *clp;
1617 if (cl != NULL)
1618 mio_expr (&cl->length);
1620 else
1623 if (peek_atom () != ATOM_RPAREN)
1625 cl = gfc_get_charlen ();
1626 mio_expr (&cl->length);
1628 *clp = cl;
1630 cl->next = gfc_current_ns->cl_list;
1631 gfc_current_ns->cl_list = cl;
1635 mio_rparen ();
1639 /* Return a symtree node with a name that is guaranteed to be unique
1640 within the namespace and corresponds to an illegal fortran name. */
1642 static gfc_symtree *
1643 get_unique_symtree (gfc_namespace * ns)
1645 char name[GFC_MAX_SYMBOL_LEN + 1];
1646 static int serial = 0;
1648 sprintf (name, "@%d", serial++);
1649 return gfc_new_symtree (&ns->sym_root, name);
1653 /* See if a name is a generated name. */
1655 static int
1656 check_unique_name (const char *name)
1659 return *name == '@';
1663 static void
1664 mio_typespec (gfc_typespec * ts)
1667 mio_lparen ();
1669 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1671 if (ts->type != BT_DERIVED)
1672 mio_integer (&ts->kind);
1673 else
1674 mio_symbol_ref (&ts->derived);
1676 mio_charlen (&ts->cl);
1678 mio_rparen ();
1682 static const mstring array_spec_types[] = {
1683 minit ("EXPLICIT", AS_EXPLICIT),
1684 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1685 minit ("DEFERRED", AS_DEFERRED),
1686 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1687 minit (NULL, -1)
1691 static void
1692 mio_array_spec (gfc_array_spec ** asp)
1694 gfc_array_spec *as;
1695 int i;
1697 mio_lparen ();
1699 if (iomode == IO_OUTPUT)
1701 if (*asp == NULL)
1702 goto done;
1703 as = *asp;
1705 else
1707 if (peek_atom () == ATOM_RPAREN)
1709 *asp = NULL;
1710 goto done;
1713 *asp = as = gfc_get_array_spec ();
1716 mio_integer (&as->rank);
1717 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1719 for (i = 0; i < as->rank; i++)
1721 mio_expr (&as->lower[i]);
1722 mio_expr (&as->upper[i]);
1725 done:
1726 mio_rparen ();
1730 /* Given a pointer to an array reference structure (which lives in a
1731 gfc_ref structure), find the corresponding array specification
1732 structure. Storing the pointer in the ref structure doesn't quite
1733 work when loading from a module. Generating code for an array
1734 reference also needs more information than just the array spec. */
1736 static const mstring array_ref_types[] = {
1737 minit ("FULL", AR_FULL),
1738 minit ("ELEMENT", AR_ELEMENT),
1739 minit ("SECTION", AR_SECTION),
1740 minit (NULL, -1)
1743 static void
1744 mio_array_ref (gfc_array_ref * ar)
1746 int i;
1748 mio_lparen ();
1749 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1750 mio_integer (&ar->dimen);
1752 switch (ar->type)
1754 case AR_FULL:
1755 break;
1757 case AR_ELEMENT:
1758 for (i = 0; i < ar->dimen; i++)
1759 mio_expr (&ar->start[i]);
1761 break;
1763 case AR_SECTION:
1764 for (i = 0; i < ar->dimen; i++)
1766 mio_expr (&ar->start[i]);
1767 mio_expr (&ar->end[i]);
1768 mio_expr (&ar->stride[i]);
1771 break;
1773 case AR_UNKNOWN:
1774 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1777 for (i = 0; i < ar->dimen; i++)
1778 mio_integer ((int *) &ar->dimen_type[i]);
1780 if (iomode == IO_INPUT)
1782 ar->where = gfc_current_locus;
1784 for (i = 0; i < ar->dimen; i++)
1785 ar->c_where[i] = gfc_current_locus;
1788 mio_rparen ();
1792 /* Saves or restores a pointer. The pointer is converted back and
1793 forth from an integer. We return the pointer_info pointer so that
1794 the caller can take additional action based on the pointer type. */
1796 static pointer_info *
1797 mio_pointer_ref (void *gp)
1799 pointer_info *p;
1801 if (iomode == IO_OUTPUT)
1803 p = get_pointer (*((char **) gp));
1804 write_atom (ATOM_INTEGER, &p->integer);
1806 else
1808 require_atom (ATOM_INTEGER);
1809 p = add_fixup (atom_int, gp);
1812 return p;
1816 /* Save and load references to components that occur within
1817 expressions. We have to describe these references by a number and
1818 by name. The number is necessary for forward references during
1819 reading, and the name is necessary if the symbol already exists in
1820 the namespace and is not loaded again. */
1822 static void
1823 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1825 char name[GFC_MAX_SYMBOL_LEN + 1];
1826 gfc_component *q;
1827 pointer_info *p;
1829 p = mio_pointer_ref (cp);
1830 if (p->type == P_UNKNOWN)
1831 p->type = P_COMPONENT;
1833 if (iomode == IO_OUTPUT)
1834 mio_pool_string (&(*cp)->name);
1835 else
1837 mio_internal_string (name);
1839 if (sym->components != NULL && p->u.pointer == NULL)
1841 /* Symbol already loaded, so search by name. */
1842 for (q = sym->components; q; q = q->next)
1843 if (strcmp (q->name, name) == 0)
1844 break;
1846 if (q == NULL)
1847 gfc_internal_error ("mio_component_ref(): Component not found");
1849 associate_integer_pointer (p, q);
1852 /* Make sure this symbol will eventually be loaded. */
1853 p = find_pointer2 (sym);
1854 if (p->u.rsym.state == UNUSED)
1855 p->u.rsym.state = NEEDED;
1860 static void
1861 mio_component (gfc_component * c)
1863 pointer_info *p;
1864 int n;
1866 mio_lparen ();
1868 if (iomode == IO_OUTPUT)
1870 p = get_pointer (c);
1871 mio_integer (&p->integer);
1873 else
1875 mio_integer (&n);
1876 p = get_integer (n);
1877 associate_integer_pointer (p, c);
1880 if (p->type == P_UNKNOWN)
1881 p->type = P_COMPONENT;
1883 mio_pool_string (&c->name);
1884 mio_typespec (&c->ts);
1885 mio_array_spec (&c->as);
1887 mio_integer (&c->dimension);
1888 mio_integer (&c->pointer);
1890 mio_expr (&c->initializer);
1891 mio_rparen ();
1895 static void
1896 mio_component_list (gfc_component ** cp)
1898 gfc_component *c, *tail;
1900 mio_lparen ();
1902 if (iomode == IO_OUTPUT)
1904 for (c = *cp; c; c = c->next)
1905 mio_component (c);
1907 else
1910 *cp = NULL;
1911 tail = NULL;
1913 for (;;)
1915 if (peek_atom () == ATOM_RPAREN)
1916 break;
1918 c = gfc_get_component ();
1919 mio_component (c);
1921 if (tail == NULL)
1922 *cp = c;
1923 else
1924 tail->next = c;
1926 tail = c;
1930 mio_rparen ();
1934 static void
1935 mio_actual_arg (gfc_actual_arglist * a)
1938 mio_lparen ();
1939 mio_pool_string (&a->name);
1940 mio_expr (&a->expr);
1941 mio_rparen ();
1945 static void
1946 mio_actual_arglist (gfc_actual_arglist ** ap)
1948 gfc_actual_arglist *a, *tail;
1950 mio_lparen ();
1952 if (iomode == IO_OUTPUT)
1954 for (a = *ap; a; a = a->next)
1955 mio_actual_arg (a);
1958 else
1960 tail = NULL;
1962 for (;;)
1964 if (peek_atom () != ATOM_LPAREN)
1965 break;
1967 a = gfc_get_actual_arglist ();
1969 if (tail == NULL)
1970 *ap = a;
1971 else
1972 tail->next = a;
1974 tail = a;
1975 mio_actual_arg (a);
1979 mio_rparen ();
1983 /* Read and write formal argument lists. */
1985 static void
1986 mio_formal_arglist (gfc_symbol * sym)
1988 gfc_formal_arglist *f, *tail;
1990 mio_lparen ();
1992 if (iomode == IO_OUTPUT)
1994 for (f = sym->formal; f; f = f->next)
1995 mio_symbol_ref (&f->sym);
1998 else
2000 sym->formal = tail = NULL;
2002 while (peek_atom () != ATOM_RPAREN)
2004 f = gfc_get_formal_arglist ();
2005 mio_symbol_ref (&f->sym);
2007 if (sym->formal == NULL)
2008 sym->formal = f;
2009 else
2010 tail->next = f;
2012 tail = f;
2016 mio_rparen ();
2020 /* Save or restore a reference to a symbol node. */
2022 void
2023 mio_symbol_ref (gfc_symbol ** symp)
2025 pointer_info *p;
2027 p = mio_pointer_ref (symp);
2028 if (p->type == P_UNKNOWN)
2029 p->type = P_SYMBOL;
2031 if (iomode == IO_OUTPUT)
2033 if (p->u.wsym.state == UNREFERENCED)
2034 p->u.wsym.state = NEEDS_WRITE;
2036 else
2038 if (p->u.rsym.state == UNUSED)
2039 p->u.rsym.state = NEEDED;
2044 /* Save or restore a reference to a symtree node. */
2046 static void
2047 mio_symtree_ref (gfc_symtree ** stp)
2049 pointer_info *p;
2050 fixup_t *f;
2052 if (iomode == IO_OUTPUT)
2054 mio_symbol_ref (&(*stp)->n.sym);
2056 else
2058 require_atom (ATOM_INTEGER);
2059 p = get_integer (atom_int);
2060 if (p->type == P_UNKNOWN)
2061 p->type = P_SYMBOL;
2063 if (p->u.rsym.state == UNUSED)
2064 p->u.rsym.state = NEEDED;
2066 if (p->u.rsym.symtree != NULL)
2068 *stp = p->u.rsym.symtree;
2070 else
2072 f = gfc_getmem (sizeof (fixup_t));
2074 f->next = p->u.rsym.stfixup;
2075 p->u.rsym.stfixup = f;
2077 f->pointer = (void **)stp;
2082 static void
2083 mio_iterator (gfc_iterator ** ip)
2085 gfc_iterator *iter;
2087 mio_lparen ();
2089 if (iomode == IO_OUTPUT)
2091 if (*ip == NULL)
2092 goto done;
2094 else
2096 if (peek_atom () == ATOM_RPAREN)
2098 *ip = NULL;
2099 goto done;
2102 *ip = gfc_get_iterator ();
2105 iter = *ip;
2107 mio_expr (&iter->var);
2108 mio_expr (&iter->start);
2109 mio_expr (&iter->end);
2110 mio_expr (&iter->step);
2112 done:
2113 mio_rparen ();
2118 static void
2119 mio_constructor (gfc_constructor ** cp)
2121 gfc_constructor *c, *tail;
2123 mio_lparen ();
2125 if (iomode == IO_OUTPUT)
2127 for (c = *cp; c; c = c->next)
2129 mio_lparen ();
2130 mio_expr (&c->expr);
2131 mio_iterator (&c->iterator);
2132 mio_rparen ();
2135 else
2138 *cp = NULL;
2139 tail = NULL;
2141 while (peek_atom () != ATOM_RPAREN)
2143 c = gfc_get_constructor ();
2145 if (tail == NULL)
2146 *cp = c;
2147 else
2148 tail->next = c;
2150 tail = c;
2152 mio_lparen ();
2153 mio_expr (&c->expr);
2154 mio_iterator (&c->iterator);
2155 mio_rparen ();
2159 mio_rparen ();
2164 static const mstring ref_types[] = {
2165 minit ("ARRAY", REF_ARRAY),
2166 minit ("COMPONENT", REF_COMPONENT),
2167 minit ("SUBSTRING", REF_SUBSTRING),
2168 minit (NULL, -1)
2172 static void
2173 mio_ref (gfc_ref ** rp)
2175 gfc_ref *r;
2177 mio_lparen ();
2179 r = *rp;
2180 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2182 switch (r->type)
2184 case REF_ARRAY:
2185 mio_array_ref (&r->u.ar);
2186 break;
2188 case REF_COMPONENT:
2189 mio_symbol_ref (&r->u.c.sym);
2190 mio_component_ref (&r->u.c.component, r->u.c.sym);
2191 break;
2193 case REF_SUBSTRING:
2194 mio_expr (&r->u.ss.start);
2195 mio_expr (&r->u.ss.end);
2196 mio_charlen (&r->u.ss.length);
2197 break;
2200 mio_rparen ();
2204 static void
2205 mio_ref_list (gfc_ref ** rp)
2207 gfc_ref *ref, *head, *tail;
2209 mio_lparen ();
2211 if (iomode == IO_OUTPUT)
2213 for (ref = *rp; ref; ref = ref->next)
2214 mio_ref (&ref);
2216 else
2218 head = tail = NULL;
2220 while (peek_atom () != ATOM_RPAREN)
2222 if (head == NULL)
2223 head = tail = gfc_get_ref ();
2224 else
2226 tail->next = gfc_get_ref ();
2227 tail = tail->next;
2230 mio_ref (&tail);
2233 *rp = head;
2236 mio_rparen ();
2240 /* Read and write an integer value. */
2242 static void
2243 mio_gmp_integer (mpz_t * integer)
2245 char *p;
2247 if (iomode == IO_INPUT)
2249 if (parse_atom () != ATOM_STRING)
2250 bad_module ("Expected integer string");
2252 mpz_init (*integer);
2253 if (mpz_set_str (*integer, atom_string, 10))
2254 bad_module ("Error converting integer");
2256 gfc_free (atom_string);
2259 else
2261 p = mpz_get_str (NULL, 10, *integer);
2262 write_atom (ATOM_STRING, p);
2263 gfc_free (p);
2268 static void
2269 mio_gmp_real (mpfr_t * real)
2271 mp_exp_t exponent;
2272 char *p;
2274 if (iomode == IO_INPUT)
2276 if (parse_atom () != ATOM_STRING)
2277 bad_module ("Expected real string");
2279 mpfr_init (*real);
2280 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2281 gfc_free (atom_string);
2284 else
2286 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2287 atom_string = gfc_getmem (strlen (p) + 20);
2289 sprintf (atom_string, "0.%s@%ld", p, exponent);
2291 /* Fix negative numbers. */
2292 if (atom_string[2] == '-')
2294 atom_string[0] = '-';
2295 atom_string[1] = '0';
2296 atom_string[2] = '.';
2299 write_atom (ATOM_STRING, atom_string);
2301 gfc_free (atom_string);
2302 gfc_free (p);
2307 /* Save and restore the shape of an array constructor. */
2309 static void
2310 mio_shape (mpz_t ** pshape, int rank)
2312 mpz_t *shape;
2313 atom_type t;
2314 int n;
2316 /* A NULL shape is represented by (). */
2317 mio_lparen ();
2319 if (iomode == IO_OUTPUT)
2321 shape = *pshape;
2322 if (!shape)
2324 mio_rparen ();
2325 return;
2328 else
2330 t = peek_atom ();
2331 if (t == ATOM_RPAREN)
2333 *pshape = NULL;
2334 mio_rparen ();
2335 return;
2338 shape = gfc_get_shape (rank);
2339 *pshape = shape;
2342 for (n = 0; n < rank; n++)
2343 mio_gmp_integer (&shape[n]);
2345 mio_rparen ();
2349 static const mstring expr_types[] = {
2350 minit ("OP", EXPR_OP),
2351 minit ("FUNCTION", EXPR_FUNCTION),
2352 minit ("CONSTANT", EXPR_CONSTANT),
2353 minit ("VARIABLE", EXPR_VARIABLE),
2354 minit ("SUBSTRING", EXPR_SUBSTRING),
2355 minit ("STRUCTURE", EXPR_STRUCTURE),
2356 minit ("ARRAY", EXPR_ARRAY),
2357 minit ("NULL", EXPR_NULL),
2358 minit (NULL, -1)
2361 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2362 generic operators, not in expressions. INTRINSIC_USER is also
2363 replaced by the correct function name by the time we see it. */
2365 static const mstring intrinsics[] =
2367 minit ("UPLUS", INTRINSIC_UPLUS),
2368 minit ("UMINUS", INTRINSIC_UMINUS),
2369 minit ("PLUS", INTRINSIC_PLUS),
2370 minit ("MINUS", INTRINSIC_MINUS),
2371 minit ("TIMES", INTRINSIC_TIMES),
2372 minit ("DIVIDE", INTRINSIC_DIVIDE),
2373 minit ("POWER", INTRINSIC_POWER),
2374 minit ("CONCAT", INTRINSIC_CONCAT),
2375 minit ("AND", INTRINSIC_AND),
2376 minit ("OR", INTRINSIC_OR),
2377 minit ("EQV", INTRINSIC_EQV),
2378 minit ("NEQV", INTRINSIC_NEQV),
2379 minit ("EQ", INTRINSIC_EQ),
2380 minit ("NE", INTRINSIC_NE),
2381 minit ("GT", INTRINSIC_GT),
2382 minit ("GE", INTRINSIC_GE),
2383 minit ("LT", INTRINSIC_LT),
2384 minit ("LE", INTRINSIC_LE),
2385 minit ("NOT", INTRINSIC_NOT),
2386 minit (NULL, -1)
2389 /* Read and write expressions. The form "()" is allowed to indicate a
2390 NULL expression. */
2392 static void
2393 mio_expr (gfc_expr ** ep)
2395 gfc_expr *e;
2396 atom_type t;
2397 int flag;
2399 mio_lparen ();
2401 if (iomode == IO_OUTPUT)
2403 if (*ep == NULL)
2405 mio_rparen ();
2406 return;
2409 e = *ep;
2410 MIO_NAME(expr_t) (e->expr_type, expr_types);
2413 else
2415 t = parse_atom ();
2416 if (t == ATOM_RPAREN)
2418 *ep = NULL;
2419 return;
2422 if (t != ATOM_NAME)
2423 bad_module ("Expected expression type");
2425 e = *ep = gfc_get_expr ();
2426 e->where = gfc_current_locus;
2427 e->expr_type = (expr_t) find_enum (expr_types);
2430 mio_typespec (&e->ts);
2431 mio_integer (&e->rank);
2433 switch (e->expr_type)
2435 case EXPR_OP:
2436 e->value.op.operator
2437 = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2439 switch (e->value.op.operator)
2441 case INTRINSIC_UPLUS:
2442 case INTRINSIC_UMINUS:
2443 case INTRINSIC_NOT:
2444 mio_expr (&e->value.op.op1);
2445 break;
2447 case INTRINSIC_PLUS:
2448 case INTRINSIC_MINUS:
2449 case INTRINSIC_TIMES:
2450 case INTRINSIC_DIVIDE:
2451 case INTRINSIC_POWER:
2452 case INTRINSIC_CONCAT:
2453 case INTRINSIC_AND:
2454 case INTRINSIC_OR:
2455 case INTRINSIC_EQV:
2456 case INTRINSIC_NEQV:
2457 case INTRINSIC_EQ:
2458 case INTRINSIC_NE:
2459 case INTRINSIC_GT:
2460 case INTRINSIC_GE:
2461 case INTRINSIC_LT:
2462 case INTRINSIC_LE:
2463 mio_expr (&e->value.op.op1);
2464 mio_expr (&e->value.op.op2);
2465 break;
2467 default:
2468 bad_module ("Bad operator");
2471 break;
2473 case EXPR_FUNCTION:
2474 mio_symtree_ref (&e->symtree);
2475 mio_actual_arglist (&e->value.function.actual);
2477 if (iomode == IO_OUTPUT)
2479 e->value.function.name
2480 = mio_allocated_string (e->value.function.name);
2481 flag = e->value.function.esym != NULL;
2482 mio_integer (&flag);
2483 if (flag)
2484 mio_symbol_ref (&e->value.function.esym);
2485 else
2486 write_atom (ATOM_STRING, e->value.function.isym->name);
2489 else
2491 require_atom (ATOM_STRING);
2492 e->value.function.name = gfc_get_string (atom_string);
2493 gfc_free (atom_string);
2495 mio_integer (&flag);
2496 if (flag)
2497 mio_symbol_ref (&e->value.function.esym);
2498 else
2500 require_atom (ATOM_STRING);
2501 e->value.function.isym = gfc_find_function (atom_string);
2502 gfc_free (atom_string);
2506 break;
2508 case EXPR_VARIABLE:
2509 mio_symtree_ref (&e->symtree);
2510 mio_ref_list (&e->ref);
2511 break;
2513 case EXPR_SUBSTRING:
2514 e->value.character.string = (char *)
2515 mio_allocated_string (e->value.character.string);
2516 mio_ref_list (&e->ref);
2517 break;
2519 case EXPR_STRUCTURE:
2520 case EXPR_ARRAY:
2521 mio_constructor (&e->value.constructor);
2522 mio_shape (&e->shape, e->rank);
2523 break;
2525 case EXPR_CONSTANT:
2526 switch (e->ts.type)
2528 case BT_INTEGER:
2529 mio_gmp_integer (&e->value.integer);
2530 break;
2532 case BT_REAL:
2533 gfc_set_model_kind (e->ts.kind);
2534 mio_gmp_real (&e->value.real);
2535 break;
2537 case BT_COMPLEX:
2538 gfc_set_model_kind (e->ts.kind);
2539 mio_gmp_real (&e->value.complex.r);
2540 mio_gmp_real (&e->value.complex.i);
2541 break;
2543 case BT_LOGICAL:
2544 mio_integer (&e->value.logical);
2545 break;
2547 case BT_CHARACTER:
2548 mio_integer (&e->value.character.length);
2549 e->value.character.string = (char *)
2550 mio_allocated_string (e->value.character.string);
2551 break;
2553 default:
2554 bad_module ("Bad type in constant expression");
2557 break;
2559 case EXPR_NULL:
2560 break;
2563 mio_rparen ();
2567 /* Save/restore lists of gfc_interface stuctures. When loading an
2568 interface, we are really appending to the existing list of
2569 interfaces. Checking for duplicate and ambiguous interfaces has to
2570 be done later when all symbols have been loaded. */
2572 static void
2573 mio_interface_rest (gfc_interface ** ip)
2575 gfc_interface *tail, *p;
2577 if (iomode == IO_OUTPUT)
2579 if (ip != NULL)
2580 for (p = *ip; p; p = p->next)
2581 mio_symbol_ref (&p->sym);
2583 else
2586 if (*ip == NULL)
2587 tail = NULL;
2588 else
2590 tail = *ip;
2591 while (tail->next)
2592 tail = tail->next;
2595 for (;;)
2597 if (peek_atom () == ATOM_RPAREN)
2598 break;
2600 p = gfc_get_interface ();
2601 p->where = gfc_current_locus;
2602 mio_symbol_ref (&p->sym);
2604 if (tail == NULL)
2605 *ip = p;
2606 else
2607 tail->next = p;
2609 tail = p;
2613 mio_rparen ();
2617 /* Save/restore a nameless operator interface. */
2619 static void
2620 mio_interface (gfc_interface ** ip)
2623 mio_lparen ();
2624 mio_interface_rest (ip);
2628 /* Save/restore a named operator interface. */
2630 static void
2631 mio_symbol_interface (const char **name, const char **module,
2632 gfc_interface ** ip)
2635 mio_lparen ();
2637 mio_pool_string (name);
2638 mio_pool_string (module);
2640 mio_interface_rest (ip);
2644 static void
2645 mio_namespace_ref (gfc_namespace ** nsp)
2647 gfc_namespace *ns;
2648 pointer_info *p;
2650 p = mio_pointer_ref (nsp);
2652 if (p->type == P_UNKNOWN)
2653 p->type = P_NAMESPACE;
2655 if (iomode == IO_INPUT && p->integer != 0)
2657 ns = (gfc_namespace *)p->u.pointer;
2658 if (ns == NULL)
2660 ns = gfc_get_namespace (NULL, 0);
2661 associate_integer_pointer (p, ns);
2663 else
2664 ns->refs++;
2669 /* Unlike most other routines, the address of the symbol node is
2670 already fixed on input and the name/module has already been filled
2671 in. */
2673 static void
2674 mio_symbol (gfc_symbol * sym)
2676 gfc_formal_arglist *formal;
2678 mio_lparen ();
2680 mio_symbol_attribute (&sym->attr);
2681 mio_typespec (&sym->ts);
2683 /* Contained procedures don't have formal namespaces. Instead we output the
2684 procedure namespace. The will contain the formal arguments. */
2685 if (iomode == IO_OUTPUT)
2687 formal = sym->formal;
2688 while (formal && !formal->sym)
2689 formal = formal->next;
2691 if (formal)
2692 mio_namespace_ref (&formal->sym->ns);
2693 else
2694 mio_namespace_ref (&sym->formal_ns);
2696 else
2698 mio_namespace_ref (&sym->formal_ns);
2699 if (sym->formal_ns)
2701 sym->formal_ns->proc_name = sym;
2702 sym->refs++;
2706 /* Save/restore common block links */
2707 mio_symbol_ref (&sym->common_next);
2709 mio_formal_arglist (sym);
2711 if (sym->attr.flavor == FL_PARAMETER)
2712 mio_expr (&sym->value);
2714 mio_array_spec (&sym->as);
2716 mio_symbol_ref (&sym->result);
2718 /* Note that components are always saved, even if they are supposed
2719 to be private. Component access is checked during searching. */
2721 mio_component_list (&sym->components);
2723 if (sym->components != NULL)
2724 sym->component_access =
2725 MIO_NAME(gfc_access) (sym->component_access, access_types);
2727 mio_rparen ();
2731 /************************* Top level subroutines *************************/
2733 /* Skip a list between balanced left and right parens. */
2735 static void
2736 skip_list (void)
2738 int level;
2740 level = 0;
2743 switch (parse_atom ())
2745 case ATOM_LPAREN:
2746 level++;
2747 break;
2749 case ATOM_RPAREN:
2750 level--;
2751 break;
2753 case ATOM_STRING:
2754 gfc_free (atom_string);
2755 break;
2757 case ATOM_NAME:
2758 case ATOM_INTEGER:
2759 break;
2762 while (level > 0);
2766 /* Load operator interfaces from the module. Interfaces are unusual
2767 in that they attach themselves to existing symbols. */
2769 static void
2770 load_operator_interfaces (void)
2772 const char *p;
2773 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2774 gfc_user_op *uop;
2776 mio_lparen ();
2778 while (peek_atom () != ATOM_RPAREN)
2780 mio_lparen ();
2782 mio_internal_string (name);
2783 mio_internal_string (module);
2785 /* Decide if we need to load this one or not. */
2786 p = find_use_name (name);
2787 if (p == NULL)
2789 while (parse_atom () != ATOM_RPAREN);
2791 else
2793 uop = gfc_get_uop (p);
2794 mio_interface_rest (&uop->operator);
2798 mio_rparen ();
2802 /* Load interfaces from the module. Interfaces are unusual in that
2803 they attach themselves to existing symbols. */
2805 static void
2806 load_generic_interfaces (void)
2808 const char *p;
2809 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2810 gfc_symbol *sym;
2812 mio_lparen ();
2814 while (peek_atom () != ATOM_RPAREN)
2816 mio_lparen ();
2818 mio_internal_string (name);
2819 mio_internal_string (module);
2821 /* Decide if we need to load this one or not. */
2822 p = find_use_name (name);
2824 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2826 while (parse_atom () != ATOM_RPAREN);
2827 continue;
2830 if (sym == NULL)
2832 gfc_get_symbol (p, NULL, &sym);
2834 sym->attr.flavor = FL_PROCEDURE;
2835 sym->attr.generic = 1;
2836 sym->attr.use_assoc = 1;
2839 mio_interface_rest (&sym->generic);
2842 mio_rparen ();
2846 /* Load common blocks. */
2848 static void
2849 load_commons(void)
2851 char name[GFC_MAX_SYMBOL_LEN+1];
2852 gfc_common_head *p;
2854 mio_lparen ();
2856 while (peek_atom () != ATOM_RPAREN)
2858 mio_lparen ();
2859 mio_internal_string (name);
2861 p = gfc_get_common (name, 1);
2863 mio_symbol_ref (&p->head);
2864 mio_integer (&p->saved);
2865 p->use_assoc = 1;
2867 mio_rparen();
2870 mio_rparen();
2874 /* Recursive function to traverse the pointer_info tree and load a
2875 needed symbol. We return nonzero if we load a symbol and stop the
2876 traversal, because the act of loading can alter the tree. */
2878 static int
2879 load_needed (pointer_info * p)
2881 gfc_namespace *ns;
2882 pointer_info *q;
2883 gfc_symbol *sym;
2885 if (p == NULL)
2886 return 0;
2887 if (load_needed (p->left))
2888 return 1;
2889 if (load_needed (p->right))
2890 return 1;
2892 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
2893 return 0;
2895 p->u.rsym.state = USED;
2897 set_module_locus (&p->u.rsym.where);
2899 sym = p->u.rsym.sym;
2900 if (sym == NULL)
2902 q = get_integer (p->u.rsym.ns);
2904 ns = (gfc_namespace *) q->u.pointer;
2905 if (ns == NULL)
2907 /* Create an interface namespace if necessary. These are
2908 the namespaces that hold the formal parameters of module
2909 procedures. */
2911 ns = gfc_get_namespace (NULL, 0);
2912 associate_integer_pointer (q, ns);
2915 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
2916 sym->module = gfc_get_string (p->u.rsym.module);
2918 associate_integer_pointer (p, sym);
2921 mio_symbol (sym);
2922 sym->attr.use_assoc = 1;
2924 return 1;
2928 /* Recursive function for cleaning up things after a module has been
2929 read. */
2931 static void
2932 read_cleanup (pointer_info * p)
2934 gfc_symtree *st;
2935 pointer_info *q;
2937 if (p == NULL)
2938 return;
2940 read_cleanup (p->left);
2941 read_cleanup (p->right);
2943 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
2945 /* Add hidden symbols to the symtree. */
2946 q = get_integer (p->u.rsym.ns);
2947 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
2949 st->n.sym = p->u.rsym.sym;
2950 st->n.sym->refs++;
2952 /* Fixup any symtree references. */
2953 p->u.rsym.symtree = st;
2954 resolve_fixups (p->u.rsym.stfixup, st);
2955 p->u.rsym.stfixup = NULL;
2958 /* Free unused symbols. */
2959 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
2960 gfc_free_symbol (p->u.rsym.sym);
2964 /* Read a module file. */
2966 static void
2967 read_module (void)
2969 module_locus operator_interfaces, user_operators;
2970 const char *p;
2971 char name[GFC_MAX_SYMBOL_LEN + 1];
2972 gfc_intrinsic_op i;
2973 int ambiguous, symbol;
2974 pointer_info *info;
2975 gfc_use_rename *u;
2976 gfc_symtree *st;
2977 gfc_symbol *sym;
2979 get_module_locus (&operator_interfaces); /* Skip these for now */
2980 skip_list ();
2982 get_module_locus (&user_operators);
2983 skip_list ();
2984 skip_list ();
2985 skip_list ();
2987 mio_lparen ();
2989 /* Create the fixup nodes for all the symbols. */
2991 while (peek_atom () != ATOM_RPAREN)
2993 require_atom (ATOM_INTEGER);
2994 info = get_integer (atom_int);
2996 info->type = P_SYMBOL;
2997 info->u.rsym.state = UNUSED;
2999 mio_internal_string (info->u.rsym.true_name);
3000 mio_internal_string (info->u.rsym.module);
3002 require_atom (ATOM_INTEGER);
3003 info->u.rsym.ns = atom_int;
3005 get_module_locus (&info->u.rsym.where);
3006 skip_list ();
3008 /* See if the symbol has already been loaded by a previous module.
3009 If so, we reference the existing symbol and prevent it from
3010 being loaded again. */
3012 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3013 if (sym == NULL)
3014 continue;
3016 info->u.rsym.state = USED;
3017 info->u.rsym.referenced = 1;
3018 info->u.rsym.sym = sym;
3021 mio_rparen ();
3023 /* Parse the symtree lists. This lets us mark which symbols need to
3024 be loaded. Renaming is also done at this point by replacing the
3025 symtree name. */
3027 mio_lparen ();
3029 while (peek_atom () != ATOM_RPAREN)
3031 mio_internal_string (name);
3032 mio_integer (&ambiguous);
3033 mio_integer (&symbol);
3035 info = get_integer (symbol);
3037 /* Get the local name for this symbol. */
3038 p = find_use_name (name);
3040 /* Skip symtree nodes not in an ONLY caluse. */
3041 if (p == NULL)
3042 continue;
3044 /* Check for ambiguous symbols. */
3045 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3047 if (st != NULL)
3049 if (st->n.sym != info->u.rsym.sym)
3050 st->ambiguous = 1;
3051 info->u.rsym.symtree = st;
3053 else
3055 /* Create a symtree node in the current namespace for this symbol. */
3056 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3057 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3059 st->ambiguous = ambiguous;
3061 sym = info->u.rsym.sym;
3063 /* Create a symbol node if it doesn't already exist. */
3064 if (sym == NULL)
3066 sym = info->u.rsym.sym =
3067 gfc_new_symbol (info->u.rsym.true_name, gfc_current_ns);
3069 sym->module = gfc_get_string (info->u.rsym.module);
3072 st->n.sym = sym;
3073 st->n.sym->refs++;
3075 /* Store the symtree pointing to this symbol. */
3076 info->u.rsym.symtree = st;
3078 if (info->u.rsym.state == UNUSED)
3079 info->u.rsym.state = NEEDED;
3080 info->u.rsym.referenced = 1;
3084 mio_rparen ();
3086 /* Load intrinsic operator interfaces. */
3087 set_module_locus (&operator_interfaces);
3088 mio_lparen ();
3090 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3092 if (i == INTRINSIC_USER)
3093 continue;
3095 if (only_flag)
3097 u = find_use_operator (i);
3099 if (u == NULL)
3101 skip_list ();
3102 continue;
3105 u->found = 1;
3108 mio_interface (&gfc_current_ns->operator[i]);
3111 mio_rparen ();
3113 /* Load generic and user operator interfaces. These must follow the
3114 loading of symtree because otherwise symbols can be marked as
3115 ambiguous. */
3117 set_module_locus (&user_operators);
3119 load_operator_interfaces ();
3120 load_generic_interfaces ();
3122 load_commons ();
3124 /* At this point, we read those symbols that are needed but haven't
3125 been loaded yet. If one symbol requires another, the other gets
3126 marked as NEEDED if its previous state was UNUSED. */
3128 while (load_needed (pi_root));
3130 /* Make sure all elements of the rename-list were found in the
3131 module. */
3133 for (u = gfc_rename_list; u; u = u->next)
3135 if (u->found)
3136 continue;
3138 if (u->operator == INTRINSIC_NONE)
3140 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3141 u->use_name, &u->where, module_name);
3142 continue;
3145 if (u->operator == INTRINSIC_USER)
3147 gfc_error
3148 ("User operator '%s' referenced at %L not found in module '%s'",
3149 u->use_name, &u->where, module_name);
3150 continue;
3153 gfc_error
3154 ("Intrinsic operator '%s' referenced at %L not found in module "
3155 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3158 gfc_check_interfaces (gfc_current_ns);
3160 /* Clean up symbol nodes that were never loaded, create references
3161 to hidden symbols. */
3163 read_cleanup (pi_root);
3167 /* Given an access type that is specific to an entity and the default
3168 access, return nonzero if the entity is publicly accessible. */
3170 bool
3171 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3174 if (specific_access == ACCESS_PUBLIC)
3175 return TRUE;
3176 if (specific_access == ACCESS_PRIVATE)
3177 return FALSE;
3179 if (gfc_option.flag_module_access_private)
3180 return default_access == ACCESS_PUBLIC;
3181 else
3182 return default_access != ACCESS_PRIVATE;
3184 return FALSE;
3188 /* Write a common block to the module */
3190 static void
3191 write_common (gfc_symtree *st)
3193 gfc_common_head *p;
3195 if (st == NULL)
3196 return;
3198 write_common(st->left);
3199 write_common(st->right);
3201 mio_lparen();
3202 mio_pool_string(&st->name);
3204 p = st->n.common;
3205 mio_symbol_ref(&p->head);
3206 mio_integer(&p->saved);
3208 mio_rparen();
3212 /* Write a symbol to the module. */
3214 static void
3215 write_symbol (int n, gfc_symbol * sym)
3218 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3219 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3221 mio_integer (&n);
3222 mio_pool_string (&sym->name);
3224 mio_pool_string (&sym->module);
3225 mio_pointer_ref (&sym->ns);
3227 mio_symbol (sym);
3228 write_char ('\n');
3232 /* Recursive traversal function to write the initial set of symbols to
3233 the module. We check to see if the symbol should be written
3234 according to the access specification. */
3236 static void
3237 write_symbol0 (gfc_symtree * st)
3239 gfc_symbol *sym;
3240 pointer_info *p;
3242 if (st == NULL)
3243 return;
3245 write_symbol0 (st->left);
3246 write_symbol0 (st->right);
3248 sym = st->n.sym;
3249 if (sym->module == NULL)
3250 sym->module = gfc_get_string (module_name);
3252 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3253 && !sym->attr.subroutine && !sym->attr.function)
3254 return;
3256 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3257 return;
3259 p = get_pointer (sym);
3260 if (p->type == P_UNKNOWN)
3261 p->type = P_SYMBOL;
3263 if (p->u.wsym.state == WRITTEN)
3264 return;
3266 write_symbol (p->integer, sym);
3267 p->u.wsym.state = WRITTEN;
3269 return;
3273 /* Recursive traversal function to write the secondary set of symbols
3274 to the module file. These are symbols that were not public yet are
3275 needed by the public symbols or another dependent symbol. The act
3276 of writing a symbol can modify the pointer_info tree, so we cease
3277 traversal if we find a symbol to write. We return nonzero if a
3278 symbol was written and pass that information upwards. */
3280 static int
3281 write_symbol1 (pointer_info * p)
3284 if (p == NULL)
3285 return 0;
3287 if (write_symbol1 (p->left))
3288 return 1;
3289 if (write_symbol1 (p->right))
3290 return 1;
3292 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3293 return 0;
3295 /* FIXME: This shouldn't be necessary, but it works around
3296 deficiencies in the module loader or/and symbol handling. */
3297 if (p->u.wsym.sym->module == NULL && p->u.wsym.sym->attr.dummy)
3298 p->u.wsym.sym->module = gfc_get_string (module_name);
3300 p->u.wsym.state = WRITTEN;
3301 write_symbol (p->integer, p->u.wsym.sym);
3303 return 1;
3307 /* Write operator interfaces associated with a symbol. */
3309 static void
3310 write_operator (gfc_user_op * uop)
3312 static char nullstring[] = "";
3313 const char *p = nullstring;
3315 if (uop->operator == NULL
3316 || !gfc_check_access (uop->access, uop->ns->default_access))
3317 return;
3319 mio_symbol_interface (&uop->name, &p, &uop->operator);
3323 /* Write generic interfaces associated with a symbol. */
3325 static void
3326 write_generic (gfc_symbol * sym)
3329 if (sym->generic == NULL
3330 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3331 return;
3333 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3337 static void
3338 write_symtree (gfc_symtree * st)
3340 gfc_symbol *sym;
3341 pointer_info *p;
3343 sym = st->n.sym;
3344 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3345 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3346 && !sym->attr.subroutine && !sym->attr.function))
3347 return;
3349 if (check_unique_name (st->name))
3350 return;
3352 p = find_pointer (sym);
3353 if (p == NULL)
3354 gfc_internal_error ("write_symtree(): Symbol not written");
3356 mio_pool_string (&st->name);
3357 mio_integer (&st->ambiguous);
3358 mio_integer (&p->integer);
3362 static void
3363 write_module (void)
3365 gfc_intrinsic_op i;
3367 /* Write the operator interfaces. */
3368 mio_lparen ();
3370 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3372 if (i == INTRINSIC_USER)
3373 continue;
3375 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3376 gfc_current_ns->default_access)
3377 ? &gfc_current_ns->operator[i] : NULL);
3380 mio_rparen ();
3381 write_char ('\n');
3382 write_char ('\n');
3384 mio_lparen ();
3385 gfc_traverse_user_op (gfc_current_ns, write_operator);
3386 mio_rparen ();
3387 write_char ('\n');
3388 write_char ('\n');
3390 mio_lparen ();
3391 gfc_traverse_ns (gfc_current_ns, write_generic);
3392 mio_rparen ();
3393 write_char ('\n');
3394 write_char ('\n');
3396 mio_lparen ();
3397 write_common (gfc_current_ns->common_root);
3398 mio_rparen ();
3399 write_char ('\n');
3400 write_char ('\n');
3402 /* Write symbol information. First we traverse all symbols in the
3403 primary namespace, writing those that need to be written.
3404 Sometimes writing one symbol will cause another to need to be
3405 written. A list of these symbols ends up on the write stack, and
3406 we end by popping the bottom of the stack and writing the symbol
3407 until the stack is empty. */
3409 mio_lparen ();
3411 write_symbol0 (gfc_current_ns->sym_root);
3412 while (write_symbol1 (pi_root));
3414 mio_rparen ();
3416 write_char ('\n');
3417 write_char ('\n');
3419 mio_lparen ();
3420 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3421 mio_rparen ();
3425 /* Given module, dump it to disk. If there was an error while
3426 processing the module, dump_flag will be set to zero and we delete
3427 the module file, even if it was already there. */
3429 void
3430 gfc_dump_module (const char *name, int dump_flag)
3432 char filename[PATH_MAX], *p;
3433 time_t now;
3435 filename[0] = '\0';
3436 if (gfc_option.module_dir != NULL)
3437 strcpy (filename, gfc_option.module_dir);
3439 strcat (filename, name);
3440 strcat (filename, MODULE_EXTENSION);
3442 if (!dump_flag)
3444 unlink (filename);
3445 return;
3448 module_fp = fopen (filename, "w");
3449 if (module_fp == NULL)
3450 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3451 filename, strerror (errno));
3453 now = time (NULL);
3454 p = ctime (&now);
3456 *strchr (p, '\n') = '\0';
3458 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3459 gfc_source_file, p);
3460 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3462 iomode = IO_OUTPUT;
3463 strcpy (module_name, name);
3465 init_pi_tree ();
3467 write_module ();
3469 free_pi_tree (pi_root);
3470 pi_root = NULL;
3472 write_char ('\n');
3474 if (fclose (module_fp))
3475 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3476 filename, strerror (errno));
3480 /* Process a USE directive. */
3482 void
3483 gfc_use_module (void)
3485 char filename[GFC_MAX_SYMBOL_LEN + 5];
3486 gfc_state_data *p;
3487 int c, line;
3489 strcpy (filename, module_name);
3490 strcat (filename, MODULE_EXTENSION);
3492 module_fp = gfc_open_included_file (filename);
3493 if (module_fp == NULL)
3494 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3495 filename, strerror (errno));
3497 iomode = IO_INPUT;
3498 module_line = 1;
3499 module_column = 1;
3501 /* Skip the first two lines of the module. */
3502 /* FIXME: Could also check for valid two lines here, instead. */
3503 line = 0;
3504 while (line < 2)
3506 c = module_char ();
3507 if (c == EOF)
3508 bad_module ("Unexpected end of module");
3509 if (c == '\n')
3510 line++;
3513 /* Make sure we're not reading the same module that we may be building. */
3514 for (p = gfc_state_stack; p; p = p->previous)
3515 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3516 gfc_fatal_error ("Can't USE the same module we're building!");
3518 init_pi_tree ();
3519 init_true_name_tree ();
3521 read_module ();
3523 free_true_name (true_name_root);
3524 true_name_root = NULL;
3526 free_pi_tree (pi_root);
3527 pi_root = NULL;
3529 fclose (module_fp);
3533 void
3534 gfc_module_init_2 (void)
3537 last_atom = ATOM_LPAREN;
3541 void
3542 gfc_module_done_2 (void)
3545 free_rename ();