* function.c (walk_fixup_memory_subreg): New parameter 'var'.
[official-gcc.git] / gcc / fortran / module.c
blob09f945292aa9d5a7a43e10d9974e86f3f3e1289e
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
23 /* The syntax of g95 modules resembles that of lisp lists, ie a
24 sequence of atoms, which can be left or right parenthesis, names,
25 integers or strings. Parenthesis are always matched which allows
26 us to skip over sections at high speed without having to know
27 anything about the internal structure of the lists. A "name" is
28 usually a fortran 95 identifier, but can also start with '@' in
29 order to reference a hidden symbol.
31 The first line of a module is an informational message about what
32 created the module, the file it came from and when it was created.
33 The second line is a warning for people not to edit the module.
34 The rest of the module looks like:
36 ( ( <Interface info for UPLUS> )
37 ( <Interface info for UMINUS> )
38 ...
40 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
41 ...
43 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
44 ...
46 ( <Symbol Number (in no particular order)>
47 <True name of symbol>
48 <Module name of symbol>
49 ( <symbol information> )
50 ...
52 ( <Symtree name>
53 <Ambiguous flag>
54 <Symbol number>
55 ...
58 In general, symbols refer to other symbols by their symbol number,
59 which are zero based. Symbols are written to the module in no
60 particular order. */
62 #include "config.h"
63 #include <string.h>
64 #include <stdio.h>
65 #include <errno.h>
66 #include <unistd.h>
67 #include <time.h>
69 #include "gfortran.h"
70 #include "match.h"
71 #include "parse.h" /* FIXME */
73 #define MODULE_EXTENSION ".mod"
76 /* Structure that descibes 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)
196 if (p == NULL)
197 return;
199 if (p->fixup != NULL)
200 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
202 free_pi_tree (p->left);
203 free_pi_tree (p->right);
205 gfc_free (p);
209 /* Compare pointers when searching by pointer. Used when writing a
210 module. */
212 static int
213 compare_pointers (void * _sn1, void * _sn2)
215 pointer_info *sn1, *sn2;
217 sn1 = (pointer_info *) _sn1;
218 sn2 = (pointer_info *) _sn2;
220 if (sn1->u.pointer < sn2->u.pointer)
221 return -1;
222 if (sn1->u.pointer > sn2->u.pointer)
223 return 1;
225 return 0;
229 /* Compare integers when searching by integer. Used when reading a
230 module. */
232 static int
233 compare_integers (void * _sn1, void * _sn2)
235 pointer_info *sn1, *sn2;
237 sn1 = (pointer_info *) _sn1;
238 sn2 = (pointer_info *) _sn2;
240 if (sn1->integer < sn2->integer)
241 return -1;
242 if (sn1->integer > sn2->integer)
243 return 1;
245 return 0;
249 /* Initialize the pointer_info tree. */
251 static void
252 init_pi_tree (void)
254 compare_fn compare;
255 pointer_info *p;
257 pi_root = NULL;
258 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
260 /* Pointer 0 is the NULL pointer. */
261 p = gfc_get_pointer_info ();
262 p->u.pointer = NULL;
263 p->integer = 0;
264 p->type = P_OTHER;
266 gfc_insert_bbt (&pi_root, p, compare);
268 /* Pointer 1 is the current namespace. */
269 p = gfc_get_pointer_info ();
270 p->u.pointer = gfc_current_ns;
271 p->integer = 1;
272 p->type = P_NAMESPACE;
274 gfc_insert_bbt (&pi_root, p, compare);
276 symbol_number = 2;
280 /* During module writing, call here with a pointer to something,
281 returning the pointer_info node. */
283 static pointer_info *
284 find_pointer (void *gp)
286 pointer_info *p;
288 p = pi_root;
289 while (p != NULL)
291 if (p->u.pointer == gp)
292 break;
293 p = (gp < p->u.pointer) ? p->left : p->right;
296 return p;
300 /* Given a pointer while writing, returns the pointer_info tree node,
301 creating it if it doesn't exist. */
303 static pointer_info *
304 get_pointer (void *gp)
306 pointer_info *p;
308 p = find_pointer (gp);
309 if (p != NULL)
310 return p;
312 /* Pointer doesn't have an integer. Give it one. */
313 p = gfc_get_pointer_info ();
315 p->u.pointer = gp;
316 p->integer = symbol_number++;
318 gfc_insert_bbt (&pi_root, p, compare_pointers);
320 return p;
324 /* Given an integer during reading, find it in the pointer_info tree,
325 creating the node if not found. */
327 static pointer_info *
328 get_integer (int integer)
330 pointer_info *p, t;
331 int c;
333 t.integer = integer;
335 p = pi_root;
336 while (p != NULL)
338 c = compare_integers (&t, p);
339 if (c == 0)
340 break;
342 p = (c < 0) ? p->left : p->right;
345 if (p != NULL)
346 return p;
348 p = gfc_get_pointer_info ();
349 p->integer = integer;
350 p->u.pointer = NULL;
352 gfc_insert_bbt (&pi_root, p, compare_integers);
354 return p;
358 /* Recursive function to find a pointer within a tree by brute force. */
360 static pointer_info *
361 fp2 (pointer_info * p, const void *target)
363 pointer_info *q;
365 if (p == NULL)
366 return NULL;
368 if (p->u.pointer == target)
369 return p;
371 q = fp2 (p->left, target);
372 if (q != NULL)
373 return q;
375 return fp2 (p->right, target);
379 /* During reading, find a pointer_info node from the pointer value.
380 This amounts to a brute-force search. */
382 static pointer_info *
383 find_pointer2 (void *p)
386 return fp2 (pi_root, p);
390 /* Resolve any fixups using a known pointer. */
391 static void
392 resolve_fixups (fixup_t *f, void * gp)
394 fixup_t *next;
396 for (; f; f = next)
398 next = f->next;
399 *(f->pointer) = gp;
400 gfc_free (f);
404 /* Call here during module reading when we know what pointer to
405 associate with an integer. Any fixups that exist are resolved at
406 this time. */
408 static void
409 associate_integer_pointer (pointer_info * p, void *gp)
411 if (p->u.pointer != NULL)
412 gfc_internal_error ("associate_integer_pointer(): Already associated");
414 p->u.pointer = gp;
416 resolve_fixups (p->fixup, gp);
418 p->fixup = NULL;
422 /* During module reading, given an integer and a pointer to a pointer,
423 either store the pointer from an already-known value or create a
424 fixup structure in order to store things later. Returns zero if
425 the reference has been actually stored, or nonzero if the reference
426 must be fixed later (ie associate_integer_pointer must be called
427 sometime later. Returns the pointer_info structure. */
429 static pointer_info *
430 add_fixup (int integer, void *gp)
432 pointer_info *p;
433 fixup_t *f;
434 char **cp;
436 p = get_integer (integer);
438 if (p->integer == 0 || p->u.pointer != NULL)
440 cp = gp;
441 *cp = p->u.pointer;
443 else
445 f = gfc_getmem (sizeof (fixup_t));
447 f->next = p->fixup;
448 p->fixup = f;
450 f->pointer = gp;
453 return p;
457 /*****************************************************************/
459 /* Parser related subroutines */
461 /* Free the rename list left behind by a USE statement. */
463 static void
464 free_rename (void)
466 gfc_use_rename *next;
468 for (; gfc_rename_list; gfc_rename_list = next)
470 next = gfc_rename_list->next;
471 gfc_free (gfc_rename_list);
476 /* Match a USE statement. */
478 match
479 gfc_match_use (void)
481 char name[GFC_MAX_SYMBOL_LEN + 1];
482 gfc_use_rename *tail = NULL, *new;
483 interface_type type;
484 gfc_intrinsic_op operator;
485 match m;
487 m = gfc_match_name (module_name);
488 if (m != MATCH_YES)
489 return m;
491 free_rename ();
492 only_flag = 0;
494 if (gfc_match_eos () == MATCH_YES)
495 return MATCH_YES;
496 if (gfc_match_char (',') != MATCH_YES)
497 goto syntax;
499 if (gfc_match (" only :") == MATCH_YES)
500 only_flag = 1;
502 if (gfc_match_eos () == MATCH_YES)
503 return MATCH_YES;
505 for (;;)
507 /* Get a new rename struct and add it to the rename list. */
508 new = gfc_get_use_rename ();
509 new->where = gfc_current_locus;
510 new->found = 0;
512 if (gfc_rename_list == NULL)
513 gfc_rename_list = new;
514 else
515 tail->next = new;
516 tail = new;
518 /* See what kind of interface we're dealing with. Asusume it is
519 not an operator. */
520 new->operator = INTRINSIC_NONE;
521 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
522 goto cleanup;
524 switch (type)
526 case INTERFACE_NAMELESS:
527 gfc_error ("Missing generic specification in USE statement at %C");
528 goto cleanup;
530 case INTERFACE_GENERIC:
531 m = gfc_match (" =>");
533 if (only_flag)
535 if (m != MATCH_YES)
536 strcpy (new->use_name, name);
537 else
539 strcpy (new->local_name, name);
541 m = gfc_match_name (new->use_name);
542 if (m == MATCH_NO)
543 goto syntax;
544 if (m == MATCH_ERROR)
545 goto cleanup;
548 else
550 if (m != MATCH_YES)
551 goto syntax;
552 strcpy (new->local_name, name);
554 m = gfc_match_name (new->use_name);
555 if (m == MATCH_NO)
556 goto syntax;
557 if (m == MATCH_ERROR)
558 goto cleanup;
561 break;
563 case INTERFACE_USER_OP:
564 strcpy (new->use_name, name);
565 /* Fall through */
567 case INTERFACE_INTRINSIC_OP:
568 new->operator = operator;
569 break;
572 if (gfc_match_eos () == MATCH_YES)
573 break;
574 if (gfc_match_char (',') != MATCH_YES)
575 goto syntax;
578 return MATCH_YES;
580 syntax:
581 gfc_syntax_error (ST_USE);
583 cleanup:
584 free_rename ();
585 return MATCH_ERROR;
589 /* Given a name, return the name under which to load this symbol.
590 Returns NULL if this symbol shouldn't be loaded. */
592 static const char *
593 find_use_name (const char *name)
595 gfc_use_rename *u;
597 for (u = gfc_rename_list; u; u = u->next)
598 if (strcmp (u->use_name, name) == 0)
599 break;
601 if (u == NULL)
602 return only_flag ? NULL : name;
604 u->found = 1;
606 return (u->local_name[0] != '\0') ? u->local_name : name;
610 /* Try to find the operator in the current list. */
612 static gfc_use_rename *
613 find_use_operator (gfc_intrinsic_op operator)
615 gfc_use_rename *u;
617 for (u = gfc_rename_list; u; u = u->next)
618 if (u->operator == operator)
619 return u;
621 return NULL;
625 /*****************************************************************/
627 /* The next couple of subroutines maintain a tree used to avoid a
628 brute-force search for a combination of true name and module name.
629 While symtree names, the name that a particular symbol is known by
630 can changed with USE statements, we still have to keep track of the
631 true names to generate the correct reference, and also avoid
632 loading the same real symbol twice in a program unit.
634 When we start reading, the true name tree is built and maintained
635 as symbols are read. The tree is searched as we load new symbols
636 to see if it already exists someplace in the namespace. */
638 typedef struct true_name
640 BBT_HEADER (true_name);
641 gfc_symbol *sym;
643 true_name;
645 static true_name *true_name_root;
648 /* Compare two true_name structures. */
650 static int
651 compare_true_names (void * _t1, void * _t2)
653 true_name *t1, *t2;
654 int c;
656 t1 = (true_name *) _t1;
657 t2 = (true_name *) _t2;
659 c = strcmp (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 strcpy (sym.name, name);
678 strcpy (sym.module, module);
679 t.sym = &sym;
681 p = true_name_root;
682 while (p != NULL)
684 c = compare_true_names ((void *)(&t), (void *) p);
685 if (c == 0)
686 return p->sym;
688 p = (c < 0) ? p->left : p->right;
691 return NULL;
695 /* Given a gfc_symbol pointer that is not in the true name tree, add
696 it. */
698 static void
699 add_true_name (gfc_symbol * sym)
701 true_name *t;
703 t = gfc_getmem (sizeof (true_name));
704 t->sym = sym;
706 gfc_insert_bbt (&true_name_root, t, compare_true_names);
710 /* Recursive function to build the initial true name tree by
711 recursively traversing the current namespace. */
713 static void
714 build_tnt (gfc_symtree * st)
717 if (st == NULL)
718 return;
720 build_tnt (st->left);
721 build_tnt (st->right);
723 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
724 return;
726 add_true_name (st->n.sym);
730 /* Initialize the true name tree with the current namespace. */
732 static void
733 init_true_name_tree (void)
735 true_name_root = NULL;
737 build_tnt (gfc_current_ns->sym_root);
741 /* Recursively free a true name tree node. */
743 static void
744 free_true_name (true_name * t)
747 if (t == NULL)
748 return;
749 free_true_name (t->left);
750 free_true_name (t->right);
752 gfc_free (t);
756 /*****************************************************************/
758 /* Module reading and writing. */
760 typedef enum
762 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
764 atom_type;
766 static atom_type last_atom;
769 /* The name buffer must be at least as long as a symbol name. Right
770 now it's not clear how we're going to store numeric constants--
771 probably as a hexadecimal string, since this will allow the exact
772 number to be preserved (this can't be done by a decimal
773 representation). Worry about that later. TODO! */
775 #define MAX_ATOM_SIZE 100
777 static int atom_int;
778 static char *atom_string, atom_name[MAX_ATOM_SIZE];
781 /* Report problems with a module. Error reporting is not very
782 elaborate, since this sorts of errors shouldn't really happen.
783 This subroutine never returns. */
785 static void bad_module (const char *) ATTRIBUTE_NORETURN;
787 static void
788 bad_module (const char *message)
790 const char *p;
792 switch (iomode)
794 case IO_INPUT:
795 p = "Reading";
796 break;
797 case IO_OUTPUT:
798 p = "Writing";
799 break;
800 default:
801 p = "???";
802 break;
805 fclose (module_fp);
807 gfc_fatal_error ("%s module %s at line %d column %d: %s", p,
808 module_name, module_line, module_column, message);
812 /* Set the module's input pointer. */
814 static void
815 set_module_locus (module_locus * m)
818 module_column = m->column;
819 module_line = m->line;
820 fsetpos (module_fp, &m->pos);
824 /* Get the module's input pointer so that we can restore it later. */
826 static void
827 get_module_locus (module_locus * m)
830 m->column = module_column;
831 m->line = module_line;
832 fgetpos (module_fp, &m->pos);
836 /* Get the next character in the module, updating our reckoning of
837 where we are. */
839 static int
840 module_char (void)
842 int c;
844 c = fgetc (module_fp);
846 if (c == EOF)
847 bad_module ("Unexpected EOF");
849 if (c == '\n')
851 module_line++;
852 module_column = 0;
855 module_column++;
856 return c;
860 /* Parse a string constant. The delimiter is guaranteed to be a
861 single quote. */
863 static void
864 parse_string (void)
866 module_locus start;
867 int len, c;
868 char *p;
870 get_module_locus (&start);
872 len = 0;
874 /* See how long the string is */
875 for ( ; ; )
877 c = module_char ();
878 if (c == EOF)
879 bad_module ("Unexpected end of module in string constant");
881 if (c != '\'')
883 len++;
884 continue;
887 c = module_char ();
888 if (c == '\'')
890 len++;
891 continue;
894 break;
897 set_module_locus (&start);
899 atom_string = p = gfc_getmem (len + 1);
901 for (; len > 0; len--)
903 c = module_char ();
904 if (c == '\'')
905 module_char (); /* Guaranteed to be another \' */
906 *p++ = c;
909 module_char (); /* Terminating \' */
910 *p = '\0'; /* C-style string for debug purposes */
914 /* Parse a small integer. */
916 static void
917 parse_integer (int c)
919 module_locus m;
921 atom_int = c - '0';
923 for (;;)
925 get_module_locus (&m);
927 c = module_char ();
928 if (!ISDIGIT (c))
929 break;
931 atom_int = 10 * atom_int + c - '0';
932 if (atom_int > 99999999)
933 bad_module ("Integer overflow");
936 set_module_locus (&m);
940 /* Parse a name. */
942 static void
943 parse_name (int c)
945 module_locus m;
946 char *p;
947 int len;
949 p = atom_name;
951 *p++ = c;
952 len = 1;
954 get_module_locus (&m);
956 for (;;)
958 c = module_char ();
959 if (!ISALNUM (c) && c != '_' && c != '-')
960 break;
962 *p++ = c;
963 if (++len > GFC_MAX_SYMBOL_LEN)
964 bad_module ("Name too long");
967 *p = '\0';
969 fseek (module_fp, -1, SEEK_CUR);
970 module_column = m.column + len - 1;
972 if (c == '\n')
973 module_line--;
977 /* Read the next atom in the module's input stream. */
979 static atom_type
980 parse_atom (void)
982 int c;
986 c = module_char ();
988 while (c == ' ' || c == '\n');
990 switch (c)
992 case '(':
993 return ATOM_LPAREN;
995 case ')':
996 return ATOM_RPAREN;
998 case '\'':
999 parse_string ();
1000 return ATOM_STRING;
1002 case '0':
1003 case '1':
1004 case '2':
1005 case '3':
1006 case '4':
1007 case '5':
1008 case '6':
1009 case '7':
1010 case '8':
1011 case '9':
1012 parse_integer (c);
1013 return ATOM_INTEGER;
1015 case 'a':
1016 case 'b':
1017 case 'c':
1018 case 'd':
1019 case 'e':
1020 case 'f':
1021 case 'g':
1022 case 'h':
1023 case 'i':
1024 case 'j':
1025 case 'k':
1026 case 'l':
1027 case 'm':
1028 case 'n':
1029 case 'o':
1030 case 'p':
1031 case 'q':
1032 case 'r':
1033 case 's':
1034 case 't':
1035 case 'u':
1036 case 'v':
1037 case 'w':
1038 case 'x':
1039 case 'y':
1040 case 'z':
1041 case 'A':
1042 case 'B':
1043 case 'C':
1044 case 'D':
1045 case 'E':
1046 case 'F':
1047 case 'G':
1048 case 'H':
1049 case 'I':
1050 case 'J':
1051 case 'K':
1052 case 'L':
1053 case 'M':
1054 case 'N':
1055 case 'O':
1056 case 'P':
1057 case 'Q':
1058 case 'R':
1059 case 'S':
1060 case 'T':
1061 case 'U':
1062 case 'V':
1063 case 'W':
1064 case 'X':
1065 case 'Y':
1066 case 'Z':
1067 parse_name (c);
1068 return ATOM_NAME;
1070 default:
1071 bad_module ("Bad name");
1074 /* Not reached */
1078 /* Peek at the next atom on the input. */
1080 static atom_type
1081 peek_atom (void)
1083 module_locus m;
1084 atom_type a;
1086 get_module_locus (&m);
1088 a = parse_atom ();
1089 if (a == ATOM_STRING)
1090 gfc_free (atom_string);
1092 set_module_locus (&m);
1093 return a;
1097 /* Read the next atom from the input, requiring that it be a
1098 particular kind. */
1100 static void
1101 require_atom (atom_type type)
1103 module_locus m;
1104 atom_type t;
1105 const char *p;
1107 get_module_locus (&m);
1109 t = parse_atom ();
1110 if (t != type)
1112 switch (type)
1114 case ATOM_NAME:
1115 p = "Expected name";
1116 break;
1117 case ATOM_LPAREN:
1118 p = "Expected left parenthesis";
1119 break;
1120 case ATOM_RPAREN:
1121 p = "Expected right parenthesis";
1122 break;
1123 case ATOM_INTEGER:
1124 p = "Expected integer";
1125 break;
1126 case ATOM_STRING:
1127 p = "Expected string";
1128 break;
1129 default:
1130 gfc_internal_error ("require_atom(): bad atom type required");
1133 set_module_locus (&m);
1134 bad_module (p);
1139 /* Given a pointer to an mstring array, require that the current input
1140 be one of the strings in the array. We return the enum value. */
1142 static int
1143 find_enum (const mstring * m)
1145 int i;
1147 i = gfc_string2code (m, atom_name);
1148 if (i >= 0)
1149 return i;
1151 bad_module ("find_enum(): Enum not found");
1153 /* Not reached */
1157 /**************** Module output subroutines ***************************/
1159 /* Output a character to a module file. */
1161 static void
1162 write_char (char out)
1165 if (fputc (out, module_fp) == EOF)
1166 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1168 if (out != '\n')
1169 module_column++;
1170 else
1172 module_column = 1;
1173 module_line++;
1178 /* Write an atom to a module. The line wrapping isn't perfect, but it
1179 should work most of the time. This isn't that big of a deal, since
1180 the file really isn't meant to be read by people anyway. */
1182 static void
1183 write_atom (atom_type atom, const void *v)
1185 char buffer[20];
1186 int i, len;
1187 const char *p;
1189 switch (atom)
1191 case ATOM_STRING:
1192 case ATOM_NAME:
1193 p = v;
1194 break;
1196 case ATOM_LPAREN:
1197 p = "(";
1198 break;
1200 case ATOM_RPAREN:
1201 p = ")";
1202 break;
1204 case ATOM_INTEGER:
1205 i = *((const int *) v);
1206 if (i < 0)
1207 gfc_internal_error ("write_atom(): Writing negative integer");
1209 sprintf (buffer, "%d", i);
1210 p = buffer;
1211 break;
1213 default:
1214 gfc_internal_error ("write_atom(): Trying to write dab atom");
1218 len = strlen (p);
1220 if (atom != ATOM_RPAREN)
1222 if (module_column + len > 72)
1223 write_char ('\n');
1224 else
1227 if (last_atom != ATOM_LPAREN && module_column != 1)
1228 write_char (' ');
1232 if (atom == ATOM_STRING)
1233 write_char ('\'');
1235 while (*p)
1237 if (atom == ATOM_STRING && *p == '\'')
1238 write_char ('\'');
1239 write_char (*p++);
1242 if (atom == ATOM_STRING)
1243 write_char ('\'');
1245 last_atom = atom;
1250 /***************** Mid-level I/O subroutines *****************/
1252 /* These subroutines let their caller read or write atoms without
1253 caring about which of the two is actually happening. This lets a
1254 subroutine concentrate on the actual format of the data being
1255 written. */
1257 static void mio_expr (gfc_expr **);
1258 static void mio_symbol_ref (gfc_symbol **);
1259 static void mio_symtree_ref (gfc_symtree **);
1261 /* Read or write an enumerated value. On writing, we return the input
1262 value for the convenience of callers. We avoid using an integer
1263 pointer because enums are sometimes inside bitfields. */
1265 static int
1266 mio_name (int t, const mstring * m)
1269 if (iomode == IO_OUTPUT)
1270 write_atom (ATOM_NAME, gfc_code2string (m, t));
1271 else
1273 require_atom (ATOM_NAME);
1274 t = find_enum (m);
1277 return t;
1280 /* Specialisation of mio_name. */
1282 #define DECL_MIO_NAME(TYPE) \
1283 static inline TYPE \
1284 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1286 return (TYPE)mio_name ((int)t, m); \
1288 #define MIO_NAME(TYPE) mio_name_##TYPE
1290 static void
1291 mio_lparen (void)
1294 if (iomode == IO_OUTPUT)
1295 write_atom (ATOM_LPAREN, NULL);
1296 else
1297 require_atom (ATOM_LPAREN);
1301 static void
1302 mio_rparen (void)
1305 if (iomode == IO_OUTPUT)
1306 write_atom (ATOM_RPAREN, NULL);
1307 else
1308 require_atom (ATOM_RPAREN);
1312 static void
1313 mio_integer (int *ip)
1316 if (iomode == IO_OUTPUT)
1317 write_atom (ATOM_INTEGER, ip);
1318 else
1320 require_atom (ATOM_INTEGER);
1321 *ip = atom_int;
1326 /* Read or write a character pointer that points to a string on the
1327 heap. */
1329 static void
1330 mio_allocated_string (char **sp)
1333 if (iomode == IO_OUTPUT)
1334 write_atom (ATOM_STRING, *sp);
1335 else
1337 require_atom (ATOM_STRING);
1338 *sp = atom_string;
1343 /* Read or write a string that is in static memory or inside of some
1344 already-allocated structure. */
1346 static void
1347 mio_internal_string (char *string)
1350 if (iomode == IO_OUTPUT)
1351 write_atom (ATOM_STRING, string);
1352 else
1354 require_atom (ATOM_STRING);
1355 strcpy (string, atom_string);
1356 gfc_free (atom_string);
1362 typedef enum
1363 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1364 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_COMMON, AB_RESULT,
1365 AB_ENTRY, AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON, AB_SAVED_COMMON,
1366 AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1367 AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT
1369 ab_attribute;
1371 static const mstring attr_bits[] =
1373 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1374 minit ("DIMENSION", AB_DIMENSION),
1375 minit ("EXTERNAL", AB_EXTERNAL),
1376 minit ("INTRINSIC", AB_INTRINSIC),
1377 minit ("OPTIONAL", AB_OPTIONAL),
1378 minit ("POINTER", AB_POINTER),
1379 minit ("SAVE", AB_SAVE),
1380 minit ("TARGET", AB_TARGET),
1381 minit ("DUMMY", AB_DUMMY),
1382 minit ("COMMON", AB_COMMON),
1383 minit ("RESULT", AB_RESULT),
1384 minit ("ENTRY", AB_ENTRY),
1385 minit ("DATA", AB_DATA),
1386 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1387 minit ("IN_COMMON", AB_IN_COMMON),
1388 minit ("SAVED_COMMON", AB_SAVED_COMMON),
1389 minit ("FUNCTION", AB_FUNCTION),
1390 minit ("SUBROUTINE", AB_SUBROUTINE),
1391 minit ("SEQUENCE", AB_SEQUENCE),
1392 minit ("ELEMENTAL", AB_ELEMENTAL),
1393 minit ("PURE", AB_PURE),
1394 minit ("RECURSIVE", AB_RECURSIVE),
1395 minit ("GENERIC", AB_GENERIC),
1396 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1397 minit (NULL, -1)
1400 /* Specialisation of mio_name. */
1401 DECL_MIO_NAME(ab_attribute)
1402 DECL_MIO_NAME(ar_type)
1403 DECL_MIO_NAME(array_type)
1404 DECL_MIO_NAME(bt)
1405 DECL_MIO_NAME(expr_t)
1406 DECL_MIO_NAME(gfc_access)
1407 DECL_MIO_NAME(gfc_intrinsic_op)
1408 DECL_MIO_NAME(ifsrc)
1409 DECL_MIO_NAME(procedure_type)
1410 DECL_MIO_NAME(ref_type)
1411 DECL_MIO_NAME(sym_flavor)
1412 DECL_MIO_NAME(sym_intent)
1413 #undef DECL_MIO_NAME
1415 /* Symbol attributes are stored in list with the first three elements
1416 being the enumerated fields, while the remaining elements (if any)
1417 indicate the individual attribute bits. The access field is not
1418 saved-- it controls what symbols are exported when a module is
1419 written. */
1421 static void
1422 mio_symbol_attribute (symbol_attribute * attr)
1424 atom_type t;
1426 mio_lparen ();
1428 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1429 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1430 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1431 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1433 if (iomode == IO_OUTPUT)
1435 if (attr->allocatable)
1436 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1437 if (attr->dimension)
1438 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1439 if (attr->external)
1440 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1441 if (attr->intrinsic)
1442 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1443 if (attr->optional)
1444 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1445 if (attr->pointer)
1446 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1447 if (attr->save)
1448 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1449 if (attr->target)
1450 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1451 if (attr->dummy)
1452 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1453 if (attr->common)
1454 MIO_NAME(ab_attribute) (AB_COMMON, attr_bits);
1455 if (attr->result)
1456 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1457 if (attr->entry)
1458 MIO_NAME(ab_attribute) (AB_ENTRY, attr_bits);
1460 if (attr->data)
1461 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1462 if (attr->in_namelist)
1463 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1464 if (attr->in_common)
1465 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1466 if (attr->saved_common)
1467 MIO_NAME(ab_attribute) (AB_SAVED_COMMON, attr_bits);
1469 if (attr->function)
1470 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1471 if (attr->subroutine)
1472 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1473 if (attr->generic)
1474 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1476 if (attr->sequence)
1477 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1478 if (attr->elemental)
1479 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1480 if (attr->pure)
1481 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1482 if (attr->recursive)
1483 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1484 if (attr->always_explicit)
1485 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1487 mio_rparen ();
1490 else
1493 for (;;)
1495 t = parse_atom ();
1496 if (t == ATOM_RPAREN)
1497 break;
1498 if (t != ATOM_NAME)
1499 bad_module ("Expected attribute bit name");
1501 switch ((ab_attribute) find_enum (attr_bits))
1503 case AB_ALLOCATABLE:
1504 attr->allocatable = 1;
1505 break;
1506 case AB_DIMENSION:
1507 attr->dimension = 1;
1508 break;
1509 case AB_EXTERNAL:
1510 attr->external = 1;
1511 break;
1512 case AB_INTRINSIC:
1513 attr->intrinsic = 1;
1514 break;
1515 case AB_OPTIONAL:
1516 attr->optional = 1;
1517 break;
1518 case AB_POINTER:
1519 attr->pointer = 1;
1520 break;
1521 case AB_SAVE:
1522 attr->save = 1;
1523 break;
1524 case AB_TARGET:
1525 attr->target = 1;
1526 break;
1527 case AB_DUMMY:
1528 attr->dummy = 1;
1529 break;
1530 case AB_COMMON:
1531 attr->common = 1;
1532 break;
1533 case AB_RESULT:
1534 attr->result = 1;
1535 break;
1536 case AB_ENTRY:
1537 attr->entry = 1;
1538 break;
1539 case AB_DATA:
1540 attr->data = 1;
1541 break;
1542 case AB_IN_NAMELIST:
1543 attr->in_namelist = 1;
1544 break;
1545 case AB_IN_COMMON:
1546 attr->in_common = 1;
1547 break;
1548 case AB_SAVED_COMMON:
1549 attr->saved_common = 1;
1550 break;
1551 case AB_FUNCTION:
1552 attr->function = 1;
1553 break;
1554 case AB_SUBROUTINE:
1555 attr->subroutine = 1;
1556 break;
1557 case AB_GENERIC:
1558 attr->generic = 1;
1559 break;
1560 case AB_SEQUENCE:
1561 attr->sequence = 1;
1562 break;
1563 case AB_ELEMENTAL:
1564 attr->elemental = 1;
1565 break;
1566 case AB_PURE:
1567 attr->pure = 1;
1568 break;
1569 case AB_RECURSIVE:
1570 attr->recursive = 1;
1571 break;
1572 case AB_ALWAYS_EXPLICIT:
1573 attr->always_explicit = 1;
1574 break;
1581 static const mstring bt_types[] = {
1582 minit ("INTEGER", BT_INTEGER),
1583 minit ("REAL", BT_REAL),
1584 minit ("COMPLEX", BT_COMPLEX),
1585 minit ("LOGICAL", BT_LOGICAL),
1586 minit ("CHARACTER", BT_CHARACTER),
1587 minit ("DERIVED", BT_DERIVED),
1588 minit ("PROCEDURE", BT_PROCEDURE),
1589 minit ("UNKNOWN", BT_UNKNOWN),
1590 minit (NULL, -1)
1594 static void
1595 mio_charlen (gfc_charlen ** clp)
1597 gfc_charlen *cl;
1599 mio_lparen ();
1601 if (iomode == IO_OUTPUT)
1603 cl = *clp;
1604 if (cl != NULL)
1605 mio_expr (&cl->length);
1607 else
1610 if (peek_atom () != ATOM_RPAREN)
1612 cl = gfc_get_charlen ();
1613 mio_expr (&cl->length);
1615 *clp = cl;
1617 cl->next = gfc_current_ns->cl_list;
1618 gfc_current_ns->cl_list = cl;
1622 mio_rparen ();
1626 /* Return a symtree node with a name that is guaranteed to be unique
1627 within the namespace and corresponds to an illegal fortran name. */
1629 static gfc_symtree *
1630 get_unique_symtree (gfc_namespace * ns)
1632 char name[GFC_MAX_SYMBOL_LEN + 1];
1633 static int serial = 0;
1635 sprintf (name, "@%d", serial++);
1636 return gfc_new_symtree (&ns->sym_root, name);
1640 /* See if a name is a generated name. */
1642 static int
1643 check_unique_name (const char *name)
1646 return *name == '@';
1650 static void
1651 mio_typespec (gfc_typespec * ts)
1654 mio_lparen ();
1656 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1658 if (ts->type != BT_DERIVED)
1659 mio_integer (&ts->kind);
1660 else
1661 mio_symbol_ref (&ts->derived);
1663 mio_charlen (&ts->cl);
1665 mio_rparen ();
1669 static const mstring array_spec_types[] = {
1670 minit ("EXPLICIT", AS_EXPLICIT),
1671 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1672 minit ("DEFERRED", AS_DEFERRED),
1673 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1674 minit (NULL, -1)
1678 static void
1679 mio_array_spec (gfc_array_spec ** asp)
1681 gfc_array_spec *as;
1682 int i;
1684 mio_lparen ();
1686 if (iomode == IO_OUTPUT)
1688 if (*asp == NULL)
1689 goto done;
1690 as = *asp;
1692 else
1694 if (peek_atom () == ATOM_RPAREN)
1696 *asp = NULL;
1697 goto done;
1700 *asp = as = gfc_get_array_spec ();
1703 mio_integer (&as->rank);
1704 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1706 for (i = 0; i < as->rank; i++)
1708 mio_expr (&as->lower[i]);
1709 mio_expr (&as->upper[i]);
1712 done:
1713 mio_rparen ();
1717 /* Given a pointer to an array reference structure (which lives in a
1718 gfc_ref structure), find the corresponding array specification
1719 structure. Storing the pointer in the ref structure doesn't quite
1720 work when loading from a module. Generating code for an array
1721 reference also needs more infomation than just the array spec. */
1723 static const mstring array_ref_types[] = {
1724 minit ("FULL", AR_FULL),
1725 minit ("ELEMENT", AR_ELEMENT),
1726 minit ("SECTION", AR_SECTION),
1727 minit (NULL, -1)
1730 static void
1731 mio_array_ref (gfc_array_ref * ar)
1733 int i;
1735 mio_lparen ();
1736 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1737 mio_integer (&ar->dimen);
1739 switch (ar->type)
1741 case AR_FULL:
1742 break;
1744 case AR_ELEMENT:
1745 for (i = 0; i < ar->dimen; i++)
1746 mio_expr (&ar->start[i]);
1748 break;
1750 case AR_SECTION:
1751 for (i = 0; i < ar->dimen; i++)
1753 mio_expr (&ar->start[i]);
1754 mio_expr (&ar->end[i]);
1755 mio_expr (&ar->stride[i]);
1758 break;
1760 case AR_UNKNOWN:
1761 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1764 for (i = 0; i < ar->dimen; i++)
1765 mio_integer ((int *) &ar->dimen_type[i]);
1767 if (iomode == IO_INPUT)
1769 ar->where = gfc_current_locus;
1771 for (i = 0; i < ar->dimen; i++)
1772 ar->c_where[i] = gfc_current_locus;
1775 mio_rparen ();
1779 /* Saves or restores a pointer. The pointer is converted back and
1780 forth from an integer. We return the pointer_info pointer so that
1781 the caller can take additional action based on the pointer type. */
1783 static pointer_info *
1784 mio_pointer_ref (void *gp)
1786 pointer_info *p;
1788 if (iomode == IO_OUTPUT)
1790 p = get_pointer (*((char **) gp));
1791 write_atom (ATOM_INTEGER, &p->integer);
1793 else
1795 require_atom (ATOM_INTEGER);
1796 p = add_fixup (atom_int, gp);
1799 return p;
1803 /* Save and load references to components that occur within
1804 expressions. We have to describe these references by a number and
1805 by name. The number is necessary for forward references during
1806 reading, and the name is necessary if the symbol already exists in
1807 the namespace and is not loaded again. */
1809 static void
1810 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1812 char name[GFC_MAX_SYMBOL_LEN + 1];
1813 gfc_component *q;
1814 pointer_info *p;
1816 p = mio_pointer_ref (cp);
1817 if (p->type == P_UNKNOWN)
1818 p->type = P_COMPONENT;
1820 if (iomode == IO_OUTPUT)
1821 mio_internal_string ((*cp)->name);
1822 else
1824 mio_internal_string (name);
1826 if (sym->components != NULL && p->u.pointer == NULL)
1828 /* Symbol already loaded, so search by name. */
1829 for (q = sym->components; q; q = q->next)
1830 if (strcmp (q->name, name) == 0)
1831 break;
1833 if (q == NULL)
1834 gfc_internal_error ("mio_component_ref(): Component not found");
1836 associate_integer_pointer (p, q);
1839 /* Make sure this symbol will eventually be loaded. */
1840 p = find_pointer2 (sym);
1841 if (p->u.rsym.state == UNUSED)
1842 p->u.rsym.state = NEEDED;
1847 static void
1848 mio_component (gfc_component * c)
1850 pointer_info *p;
1851 int n;
1853 mio_lparen ();
1855 if (iomode == IO_OUTPUT)
1857 p = get_pointer (c);
1858 mio_integer (&p->integer);
1860 else
1862 mio_integer (&n);
1863 p = get_integer (n);
1864 associate_integer_pointer (p, c);
1867 if (p->type == P_UNKNOWN)
1868 p->type = P_COMPONENT;
1870 mio_internal_string (c->name);
1871 mio_typespec (&c->ts);
1872 mio_array_spec (&c->as);
1874 mio_integer (&c->dimension);
1875 mio_integer (&c->pointer);
1877 mio_expr (&c->initializer);
1878 mio_rparen ();
1882 static void
1883 mio_component_list (gfc_component ** cp)
1885 gfc_component *c, *tail;
1887 mio_lparen ();
1889 if (iomode == IO_OUTPUT)
1891 for (c = *cp; c; c = c->next)
1892 mio_component (c);
1894 else
1897 *cp = NULL;
1898 tail = NULL;
1900 for (;;)
1902 if (peek_atom () == ATOM_RPAREN)
1903 break;
1905 c = gfc_get_component ();
1906 mio_component (c);
1908 if (tail == NULL)
1909 *cp = c;
1910 else
1911 tail->next = c;
1913 tail = c;
1917 mio_rparen ();
1921 static void
1922 mio_actual_arg (gfc_actual_arglist * a)
1925 mio_lparen ();
1926 mio_internal_string (a->name);
1927 mio_expr (&a->expr);
1928 mio_rparen ();
1932 static void
1933 mio_actual_arglist (gfc_actual_arglist ** ap)
1935 gfc_actual_arglist *a, *tail;
1937 mio_lparen ();
1939 if (iomode == IO_OUTPUT)
1941 for (a = *ap; a; a = a->next)
1942 mio_actual_arg (a);
1945 else
1947 tail = NULL;
1949 for (;;)
1951 if (peek_atom () != ATOM_LPAREN)
1952 break;
1954 a = gfc_get_actual_arglist ();
1956 if (tail == NULL)
1957 *ap = a;
1958 else
1959 tail->next = a;
1961 tail = a;
1962 mio_actual_arg (a);
1966 mio_rparen ();
1970 /* Read and write formal argument lists. */
1972 static void
1973 mio_formal_arglist (gfc_symbol * sym)
1975 gfc_formal_arglist *f, *tail;
1977 mio_lparen ();
1979 if (iomode == IO_OUTPUT)
1981 for (f = sym->formal; f; f = f->next)
1982 mio_symbol_ref (&f->sym);
1985 else
1987 sym->formal = tail = NULL;
1989 while (peek_atom () != ATOM_RPAREN)
1991 f = gfc_get_formal_arglist ();
1992 mio_symbol_ref (&f->sym);
1994 if (sym->formal == NULL)
1995 sym->formal = f;
1996 else
1997 tail->next = f;
1999 tail = f;
2003 mio_rparen ();
2007 /* Save or restore a reference to a symbol node. */
2009 void
2010 mio_symbol_ref (gfc_symbol ** symp)
2012 pointer_info *p;
2014 p = mio_pointer_ref (symp);
2015 if (p->type == P_UNKNOWN)
2016 p->type = P_SYMBOL;
2018 if (iomode == IO_OUTPUT)
2020 if (p->u.wsym.state == UNREFERENCED)
2021 p->u.wsym.state = NEEDS_WRITE;
2023 else
2025 if (p->u.rsym.state == UNUSED)
2026 p->u.rsym.state = NEEDED;
2031 /* Save or restore a reference to a symtree node. */
2033 static void
2034 mio_symtree_ref (gfc_symtree ** stp)
2036 pointer_info *p;
2037 fixup_t *f;
2039 if (iomode == IO_OUTPUT)
2041 mio_symbol_ref (&(*stp)->n.sym);
2043 else
2045 require_atom (ATOM_INTEGER);
2046 p = get_integer (atom_int);
2047 if (p->type == P_UNKNOWN)
2048 p->type = P_SYMBOL;
2050 if (p->u.rsym.state == UNUSED)
2051 p->u.rsym.state = NEEDED;
2053 if (p->u.rsym.symtree != NULL)
2055 *stp = p->u.rsym.symtree;
2057 else
2059 f = gfc_getmem (sizeof (fixup_t));
2061 f->next = p->u.rsym.stfixup;
2062 p->u.rsym.stfixup = f;
2064 f->pointer = (void **)stp;
2069 static void
2070 mio_iterator (gfc_iterator ** ip)
2072 gfc_iterator *iter;
2074 mio_lparen ();
2076 if (iomode == IO_OUTPUT)
2078 if (*ip == NULL)
2079 goto done;
2081 else
2083 if (peek_atom () == ATOM_RPAREN)
2085 *ip = NULL;
2086 goto done;
2089 *ip = gfc_get_iterator ();
2092 iter = *ip;
2094 mio_expr (&iter->var);
2095 mio_expr (&iter->start);
2096 mio_expr (&iter->end);
2097 mio_expr (&iter->step);
2099 done:
2100 mio_rparen ();
2105 static void
2106 mio_constructor (gfc_constructor ** cp)
2108 gfc_constructor *c, *tail;
2110 mio_lparen ();
2112 if (iomode == IO_OUTPUT)
2114 for (c = *cp; c; c = c->next)
2116 mio_lparen ();
2117 mio_expr (&c->expr);
2118 mio_iterator (&c->iterator);
2119 mio_rparen ();
2122 else
2125 *cp = NULL;
2126 tail = NULL;
2128 while (peek_atom () != ATOM_RPAREN)
2130 c = gfc_get_constructor ();
2132 if (tail == NULL)
2133 *cp = c;
2134 else
2135 tail->next = c;
2137 tail = c;
2139 mio_lparen ();
2140 mio_expr (&c->expr);
2141 mio_iterator (&c->iterator);
2142 mio_rparen ();
2146 mio_rparen ();
2151 static const mstring ref_types[] = {
2152 minit ("ARRAY", REF_ARRAY),
2153 minit ("COMPONENT", REF_COMPONENT),
2154 minit ("SUBSTRING", REF_SUBSTRING),
2155 minit (NULL, -1)
2159 static void
2160 mio_ref (gfc_ref ** rp)
2162 gfc_ref *r;
2164 mio_lparen ();
2166 r = *rp;
2167 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2169 switch (r->type)
2171 case REF_ARRAY:
2172 mio_array_ref (&r->u.ar);
2173 break;
2175 case REF_COMPONENT:
2176 mio_symbol_ref (&r->u.c.sym);
2177 mio_component_ref (&r->u.c.component, r->u.c.sym);
2178 break;
2180 case REF_SUBSTRING:
2181 mio_expr (&r->u.ss.start);
2182 mio_expr (&r->u.ss.end);
2183 mio_charlen (&r->u.ss.length);
2184 break;
2187 mio_rparen ();
2191 static void
2192 mio_ref_list (gfc_ref ** rp)
2194 gfc_ref *ref, *head, *tail;
2196 mio_lparen ();
2198 if (iomode == IO_OUTPUT)
2200 for (ref = *rp; ref; ref = ref->next)
2201 mio_ref (&ref);
2203 else
2205 head = tail = NULL;
2207 while (peek_atom () != ATOM_RPAREN)
2209 if (head == NULL)
2210 head = tail = gfc_get_ref ();
2211 else
2213 tail->next = gfc_get_ref ();
2214 tail = tail->next;
2217 mio_ref (&tail);
2220 *rp = head;
2223 mio_rparen ();
2227 /* Read and write an integer value. */
2229 static void
2230 mio_gmp_integer (mpz_t * integer)
2232 char *p;
2234 if (iomode == IO_INPUT)
2236 if (parse_atom () != ATOM_STRING)
2237 bad_module ("Expected integer string");
2239 mpz_init (*integer);
2240 if (mpz_set_str (*integer, atom_string, 10))
2241 bad_module ("Error converting integer");
2243 gfc_free (atom_string);
2246 else
2248 p = mpz_get_str (NULL, 10, *integer);
2249 write_atom (ATOM_STRING, p);
2250 gfc_free (p);
2255 static void
2256 mio_gmp_real (mpf_t * real)
2258 mp_exp_t exponent;
2259 char *p;
2261 if (iomode == IO_INPUT)
2263 if (parse_atom () != ATOM_STRING)
2264 bad_module ("Expected real string");
2266 mpf_init (*real);
2267 mpf_set_str (*real, atom_string, -16);
2268 gfc_free (atom_string);
2271 else
2273 p = mpf_get_str (NULL, &exponent, 16, 0, *real);
2274 atom_string = gfc_getmem (strlen (p) + 20);
2276 sprintf (atom_string, "0.%s@%ld", p, exponent);
2277 write_atom (ATOM_STRING, atom_string);
2279 gfc_free (atom_string);
2280 gfc_free (p);
2285 /* Save and restore the shape of an array constructor. */
2287 static void
2288 mio_shape (mpz_t ** pshape, int rank)
2290 mpz_t *shape;
2291 atom_type t;
2292 int n;
2294 /* A NULL shape is represented by (). */
2295 mio_lparen ();
2297 if (iomode == IO_OUTPUT)
2299 shape = *pshape;
2300 if (!shape)
2302 mio_rparen ();
2303 return;
2306 else
2308 t = peek_atom ();
2309 if (t == ATOM_RPAREN)
2311 *pshape = NULL;
2312 mio_rparen ();
2313 return;
2316 shape = gfc_get_shape (rank);
2317 *pshape = shape;
2320 for (n = 0; n < rank; n++)
2321 mio_gmp_integer (&shape[n]);
2323 mio_rparen ();
2327 static const mstring expr_types[] = {
2328 minit ("OP", EXPR_OP),
2329 minit ("FUNCTION", EXPR_FUNCTION),
2330 minit ("CONSTANT", EXPR_CONSTANT),
2331 minit ("VARIABLE", EXPR_VARIABLE),
2332 minit ("SUBSTRING", EXPR_SUBSTRING),
2333 minit ("STRUCTURE", EXPR_STRUCTURE),
2334 minit ("ARRAY", EXPR_ARRAY),
2335 minit ("NULL", EXPR_NULL),
2336 minit (NULL, -1)
2339 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2340 generic operators, not in expressions. INTRINSIC_USER is also
2341 replaced by the correct function name by the time we see it. */
2343 static const mstring intrinsics[] =
2345 minit ("UPLUS", INTRINSIC_UPLUS),
2346 minit ("UMINUS", INTRINSIC_UMINUS),
2347 minit ("PLUS", INTRINSIC_PLUS),
2348 minit ("MINUS", INTRINSIC_MINUS),
2349 minit ("TIMES", INTRINSIC_TIMES),
2350 minit ("DIVIDE", INTRINSIC_DIVIDE),
2351 minit ("POWER", INTRINSIC_POWER),
2352 minit ("CONCAT", INTRINSIC_CONCAT),
2353 minit ("AND", INTRINSIC_AND),
2354 minit ("OR", INTRINSIC_OR),
2355 minit ("EQV", INTRINSIC_EQV),
2356 minit ("NEQV", INTRINSIC_NEQV),
2357 minit ("EQ", INTRINSIC_EQ),
2358 minit ("NE", INTRINSIC_NE),
2359 minit ("GT", INTRINSIC_GT),
2360 minit ("GE", INTRINSIC_GE),
2361 minit ("LT", INTRINSIC_LT),
2362 minit ("LE", INTRINSIC_LE),
2363 minit ("NOT", INTRINSIC_NOT),
2364 minit (NULL, -1)
2367 /* Read and write expressions. The form "()" is allowed to indicate a
2368 NULL expression. */
2370 static void
2371 mio_expr (gfc_expr ** ep)
2373 gfc_expr *e;
2374 atom_type t;
2375 int flag;
2377 mio_lparen ();
2379 if (iomode == IO_OUTPUT)
2381 if (*ep == NULL)
2383 mio_rparen ();
2384 return;
2387 e = *ep;
2388 MIO_NAME(expr_t) (e->expr_type, expr_types);
2391 else
2393 t = parse_atom ();
2394 if (t == ATOM_RPAREN)
2396 *ep = NULL;
2397 return;
2400 if (t != ATOM_NAME)
2401 bad_module ("Expected expression type");
2403 e = *ep = gfc_get_expr ();
2404 e->where = gfc_current_locus;
2405 e->expr_type = (expr_t) find_enum (expr_types);
2408 mio_typespec (&e->ts);
2409 mio_integer (&e->rank);
2411 switch (e->expr_type)
2413 case EXPR_OP:
2414 e->operator = MIO_NAME(gfc_intrinsic_op) (e->operator, intrinsics);
2416 switch (e->operator)
2418 case INTRINSIC_UPLUS:
2419 case INTRINSIC_UMINUS:
2420 case INTRINSIC_NOT:
2421 mio_expr (&e->op1);
2422 break;
2424 case INTRINSIC_PLUS:
2425 case INTRINSIC_MINUS:
2426 case INTRINSIC_TIMES:
2427 case INTRINSIC_DIVIDE:
2428 case INTRINSIC_POWER:
2429 case INTRINSIC_CONCAT:
2430 case INTRINSIC_AND:
2431 case INTRINSIC_OR:
2432 case INTRINSIC_EQV:
2433 case INTRINSIC_NEQV:
2434 case INTRINSIC_EQ:
2435 case INTRINSIC_NE:
2436 case INTRINSIC_GT:
2437 case INTRINSIC_GE:
2438 case INTRINSIC_LT:
2439 case INTRINSIC_LE:
2440 mio_expr (&e->op1);
2441 mio_expr (&e->op2);
2442 break;
2444 default:
2445 bad_module ("Bad operator");
2448 break;
2450 case EXPR_FUNCTION:
2451 mio_symtree_ref (&e->symtree);
2452 mio_actual_arglist (&e->value.function.actual);
2454 if (iomode == IO_OUTPUT)
2456 mio_allocated_string (&e->value.function.name);
2457 flag = e->value.function.esym != NULL;
2458 mio_integer (&flag);
2459 if (flag)
2460 mio_symbol_ref (&e->value.function.esym);
2461 else
2462 write_atom (ATOM_STRING, e->value.function.isym->name);
2465 else
2467 require_atom (ATOM_STRING);
2468 e->value.function.name = gfc_get_string (atom_string);
2469 gfc_free (atom_string);
2471 mio_integer (&flag);
2472 if (flag)
2473 mio_symbol_ref (&e->value.function.esym);
2474 else
2476 require_atom (ATOM_STRING);
2477 e->value.function.isym = gfc_find_function (atom_string);
2478 gfc_free (atom_string);
2482 break;
2484 case EXPR_VARIABLE:
2485 mio_symtree_ref (&e->symtree);
2486 mio_ref_list (&e->ref);
2487 break;
2489 case EXPR_SUBSTRING:
2490 mio_allocated_string (&e->value.character.string);
2491 mio_expr (&e->op1);
2492 mio_expr (&e->op2);
2493 break;
2495 case EXPR_STRUCTURE:
2496 case EXPR_ARRAY:
2497 mio_constructor (&e->value.constructor);
2498 mio_shape (&e->shape, e->rank);
2499 break;
2501 case EXPR_CONSTANT:
2502 switch (e->ts.type)
2504 case BT_INTEGER:
2505 mio_gmp_integer (&e->value.integer);
2506 break;
2508 case BT_REAL:
2509 mio_gmp_real (&e->value.real);
2510 break;
2512 case BT_COMPLEX:
2513 mio_gmp_real (&e->value.complex.r);
2514 mio_gmp_real (&e->value.complex.i);
2515 break;
2517 case BT_LOGICAL:
2518 mio_integer (&e->value.logical);
2519 break;
2521 case BT_CHARACTER:
2522 mio_integer (&e->value.character.length);
2523 mio_allocated_string (&e->value.character.string);
2524 break;
2526 default:
2527 bad_module ("Bad type in constant expression");
2530 break;
2532 case EXPR_NULL:
2533 break;
2536 mio_rparen ();
2540 /* Save/restore lists of gfc_interface stuctures. When loading an
2541 interface, we are really appending to the existing list of
2542 interfaces. Checking for duplicate and ambiguous interfaces has to
2543 be done later when all symbols have been loaded. */
2545 static void
2546 mio_interface_rest (gfc_interface ** ip)
2548 gfc_interface *tail, *p;
2550 if (iomode == IO_OUTPUT)
2552 if (ip != NULL)
2553 for (p = *ip; p; p = p->next)
2554 mio_symbol_ref (&p->sym);
2556 else
2559 if (*ip == NULL)
2560 tail = NULL;
2561 else
2563 tail = *ip;
2564 while (tail->next)
2565 tail = tail->next;
2568 for (;;)
2570 if (peek_atom () == ATOM_RPAREN)
2571 break;
2573 p = gfc_get_interface ();
2574 mio_symbol_ref (&p->sym);
2576 if (tail == NULL)
2577 *ip = p;
2578 else
2579 tail->next = p;
2581 tail = p;
2585 mio_rparen ();
2589 /* Save/restore a nameless operator interface. */
2591 static void
2592 mio_interface (gfc_interface ** ip)
2595 mio_lparen ();
2596 mio_interface_rest (ip);
2600 /* Save/restore a named operator interface. */
2602 static void
2603 mio_symbol_interface (char *name, char *module,
2604 gfc_interface ** ip)
2607 mio_lparen ();
2609 mio_internal_string (name);
2610 mio_internal_string (module);
2612 mio_interface_rest (ip);
2616 static void
2617 mio_namespace_ref (gfc_namespace ** nsp)
2619 gfc_namespace *ns;
2620 pointer_info *p;
2622 p = mio_pointer_ref (nsp);
2624 if (p->type == P_UNKNOWN)
2625 p->type = P_NAMESPACE;
2627 if (iomode == IO_INPUT && p->integer != 0 && p->u.pointer == NULL)
2629 ns = gfc_get_namespace (NULL);
2630 associate_integer_pointer (p, ns);
2635 /* Unlike most other routines, the address of the symbol node is
2636 already fixed on input and the name/module has already been filled
2637 in. */
2639 static void
2640 mio_symbol (gfc_symbol * sym)
2642 gfc_formal_arglist *formal;
2644 mio_lparen ();
2646 mio_symbol_attribute (&sym->attr);
2647 mio_typespec (&sym->ts);
2649 /* Contained procedures don't have formal namespaces. Instead we output the
2650 procedure namespace. The will contain the formal arguments. */
2651 if (iomode == IO_OUTPUT)
2653 formal = sym->formal;
2654 while (formal && !formal->sym)
2655 formal = formal->next;
2657 if (formal)
2658 mio_namespace_ref (&formal->sym->ns);
2659 else
2660 mio_namespace_ref (&sym->formal_ns);
2662 else
2664 mio_namespace_ref (&sym->formal_ns);
2665 if (sym->formal_ns)
2667 sym->formal_ns->proc_name = sym;
2668 sym->refs++;
2672 /* Save/restore common block links */
2673 mio_symbol_ref (&sym->common_head);
2674 mio_symbol_ref (&sym->common_next);
2676 mio_formal_arglist (sym);
2678 mio_expr (&sym->value);
2679 mio_array_spec (&sym->as);
2681 mio_symbol_ref (&sym->result);
2683 /* Note that components are always saved, even if they are supposed
2684 to be private. Component access is checked during searching. */
2686 mio_component_list (&sym->components);
2688 if (sym->components != NULL)
2689 sym->component_access =
2690 MIO_NAME(gfc_access) (sym->component_access, access_types);
2692 mio_symbol_ref (&sym->common_head);
2693 mio_symbol_ref (&sym->common_next);
2695 mio_rparen ();
2699 /************************* Top level subroutines *************************/
2701 /* Skip a list between balanced left and right parens. */
2703 static void
2704 skip_list (void)
2706 int level;
2708 level = 0;
2711 switch (parse_atom ())
2713 case ATOM_LPAREN:
2714 level++;
2715 break;
2717 case ATOM_RPAREN:
2718 level--;
2719 break;
2721 case ATOM_STRING:
2722 gfc_free (atom_string);
2723 break;
2725 case ATOM_NAME:
2726 case ATOM_INTEGER:
2727 break;
2730 while (level > 0);
2734 /* Load operator interfaces from the module. Interfaces are unusual
2735 in that they attach themselves to existing symbols. */
2737 static void
2738 load_operator_interfaces (void)
2740 const char *p;
2741 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2742 gfc_user_op *uop;
2744 mio_lparen ();
2746 while (peek_atom () != ATOM_RPAREN)
2748 mio_lparen ();
2750 mio_internal_string (name);
2751 mio_internal_string (module);
2753 /* Decide if we need to load this one or not. */
2754 p = find_use_name (name);
2755 if (p == NULL)
2757 while (parse_atom () != ATOM_RPAREN);
2759 else
2761 uop = gfc_get_uop (p);
2762 mio_interface_rest (&uop->operator);
2766 mio_rparen ();
2770 /* Load interfaces from the module. Interfaces are unusual in that
2771 they attach themselves to existing symbols. */
2773 static void
2774 load_generic_interfaces (void)
2776 const char *p;
2777 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2778 gfc_symbol *sym;
2780 mio_lparen ();
2782 while (peek_atom () != ATOM_RPAREN)
2784 mio_lparen ();
2786 mio_internal_string (name);
2787 mio_internal_string (module);
2789 /* Decide if we need to load this one or not. */
2790 p = find_use_name (name);
2792 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2794 while (parse_atom () != ATOM_RPAREN);
2795 continue;
2798 if (sym == NULL)
2800 gfc_get_symbol (p, NULL, &sym);
2802 sym->attr.flavor = FL_PROCEDURE;
2803 sym->attr.generic = 1;
2804 sym->attr.use_assoc = 1;
2807 mio_interface_rest (&sym->generic);
2810 mio_rparen ();
2814 /* Recursive function to traverse the pointer_info tree and load a
2815 needed symbol. We return nonzero if we load a symbol and stop the
2816 traversal, because the act of loading can alter the tree. */
2818 static int
2819 load_needed (pointer_info * p)
2821 gfc_namespace *ns;
2822 pointer_info *q;
2823 gfc_symbol *sym;
2825 if (p == NULL)
2826 return 0;
2827 if (load_needed (p->left))
2828 return 1;
2829 if (load_needed (p->right))
2830 return 1;
2832 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
2833 return 0;
2835 p->u.rsym.state = USED;
2837 set_module_locus (&p->u.rsym.where);
2839 sym = p->u.rsym.sym;
2840 if (sym == NULL)
2842 q = get_integer (p->u.rsym.ns);
2844 ns = (gfc_namespace *) q->u.pointer;
2845 if (ns == NULL)
2847 /* Create an interface namespace if necessary. These are
2848 the namespaces that hold the formal parameters of module
2849 procedures. */
2851 ns = gfc_get_namespace (NULL);
2852 associate_integer_pointer (q, ns);
2855 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
2856 strcpy (sym->module, p->u.rsym.module);
2858 associate_integer_pointer (p, sym);
2861 mio_symbol (sym);
2862 sym->attr.use_assoc = 1;
2864 return 1;
2868 /* Recursive function for cleaning up things after a module has been
2869 read. */
2871 static void
2872 read_cleanup (pointer_info * p)
2874 gfc_symtree *st;
2875 pointer_info *q;
2877 if (p == NULL)
2878 return;
2880 read_cleanup (p->left);
2881 read_cleanup (p->right);
2883 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
2885 /* Add hidden symbols to the symtree. */
2886 q = get_integer (p->u.rsym.ns);
2887 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
2889 st->n.sym = p->u.rsym.sym;
2890 st->n.sym->refs++;
2892 /* Fixup any symtree references. */
2893 p->u.rsym.symtree = st;
2894 resolve_fixups (p->u.rsym.stfixup, st);
2895 p->u.rsym.stfixup = NULL;
2898 /* Free unused symbols. */
2899 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
2900 gfc_free_symbol (p->u.rsym.sym);
2904 /* Read a module file. */
2906 static void
2907 read_module (void)
2909 module_locus operator_interfaces, user_operators;
2910 const char *p;
2911 char name[GFC_MAX_SYMBOL_LEN + 1];
2912 gfc_intrinsic_op i;
2913 int ambiguous, symbol;
2914 pointer_info *info;
2915 gfc_use_rename *u;
2916 gfc_symtree *st;
2917 gfc_symbol *sym;
2919 get_module_locus (&operator_interfaces); /* Skip these for now */
2920 skip_list ();
2922 get_module_locus (&user_operators);
2923 skip_list ();
2924 skip_list ();
2926 mio_lparen ();
2928 /* Create the fixup nodes for all the symbols. */
2930 while (peek_atom () != ATOM_RPAREN)
2932 require_atom (ATOM_INTEGER);
2933 info = get_integer (atom_int);
2935 info->type = P_SYMBOL;
2936 info->u.rsym.state = UNUSED;
2938 mio_internal_string (info->u.rsym.true_name);
2939 mio_internal_string (info->u.rsym.module);
2941 require_atom (ATOM_INTEGER);
2942 info->u.rsym.ns = atom_int;
2944 get_module_locus (&info->u.rsym.where);
2945 skip_list ();
2947 /* See if the symbol has already been loaded by a previous module.
2948 If so, we reference the existing symbol and prevent it from
2949 being loaded again. */
2951 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
2952 if (sym == NULL)
2953 continue;
2955 info->u.rsym.state = USED;
2956 info->u.rsym.referenced = 1;
2957 info->u.rsym.sym = sym;
2960 mio_rparen ();
2962 /* Parse the symtree lists. This lets us mark which symbols need to
2963 be loaded. Renaming is also done at this point by replacing the
2964 symtree name. */
2966 mio_lparen ();
2968 while (peek_atom () != ATOM_RPAREN)
2970 mio_internal_string (name);
2971 mio_integer (&ambiguous);
2972 mio_integer (&symbol);
2974 info = get_integer (symbol);
2976 /* Get the local name for this symbol. */
2977 p = find_use_name (name);
2979 /* Skip symtree nodes not in an ONLY caluse. */
2980 if (p == NULL)
2981 continue;
2983 /* Check for ambiguous symbols. */
2984 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
2986 if (st != NULL)
2988 if (st->n.sym != info->u.rsym.sym)
2989 st->ambiguous = 1;
2990 info->u.rsym.symtree = st;
2992 else
2994 /* Create a symtree node in the current namespace for this symbol. */
2995 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
2996 gfc_new_symtree (&gfc_current_ns->sym_root, p);
2998 st->ambiguous = ambiguous;
3000 sym = info->u.rsym.sym;
3002 /* Create a symbol node if it doesn't already exist. */
3003 if (sym == NULL)
3005 sym = info->u.rsym.sym =
3006 gfc_new_symbol (info->u.rsym.true_name, gfc_current_ns);
3008 strcpy (sym->module, info->u.rsym.module);
3011 st->n.sym = sym;
3012 st->n.sym->refs++;
3014 /* Store the symtree pointing to this symbol. */
3015 info->u.rsym.symtree = st;
3017 if (info->u.rsym.state == UNUSED)
3018 info->u.rsym.state = NEEDED;
3019 info->u.rsym.referenced = 1;
3023 mio_rparen ();
3025 /* Load intrinsic operator interfaces. */
3026 set_module_locus (&operator_interfaces);
3027 mio_lparen ();
3029 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3031 if (i == INTRINSIC_USER)
3032 continue;
3034 if (only_flag)
3036 u = find_use_operator (i);
3038 if (u == NULL)
3040 skip_list ();
3041 continue;
3044 u->found = 1;
3047 mio_interface (&gfc_current_ns->operator[i]);
3050 mio_rparen ();
3052 /* Load generic and user operator interfaces. These must follow the
3053 loading of symtree because otherwise symbols can be marked as
3054 ambiguous. */
3056 set_module_locus (&user_operators);
3058 load_operator_interfaces ();
3059 load_generic_interfaces ();
3061 /* At this point, we read those symbols that are needed but haven't
3062 been loaded yet. If one symbol requires another, the other gets
3063 marked as NEEDED if its previous state was UNUSED. */
3065 while (load_needed (pi_root));
3067 /* Make sure all elements of the rename-list were found in the
3068 module. */
3070 for (u = gfc_rename_list; u; u = u->next)
3072 if (u->found)
3073 continue;
3075 if (u->operator == INTRINSIC_NONE)
3077 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3078 u->use_name, &u->where, module_name);
3079 continue;
3082 if (u->operator == INTRINSIC_USER)
3084 gfc_error
3085 ("User operator '%s' referenced at %L not found in module '%s'",
3086 u->use_name, &u->where, module_name);
3087 continue;
3090 gfc_error
3091 ("Intrinsic operator '%s' referenced at %L not found in module "
3092 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3095 gfc_check_interfaces (gfc_current_ns);
3097 /* Clean up symbol nodes that were never loaded, create references
3098 to hidden symbols. */
3100 read_cleanup (pi_root);
3104 /* Given an access type that is specific to an entity and the default
3105 access, return nonzero if we should write the entity. */
3107 static int
3108 check_access (gfc_access specific_access, gfc_access default_access)
3111 if (specific_access == ACCESS_PUBLIC)
3112 return 1;
3113 if (specific_access == ACCESS_PRIVATE)
3114 return 0;
3116 if (gfc_option.flag_module_access_private)
3118 if (default_access == ACCESS_PUBLIC)
3119 return 1;
3121 else
3123 if (default_access != ACCESS_PRIVATE)
3124 return 1;
3127 return 0;
3131 /* Write a symbol to the module. */
3133 static void
3134 write_symbol (int n, gfc_symbol * sym)
3137 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3138 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3140 mio_integer (&n);
3141 mio_internal_string (sym->name);
3143 if (sym->module[0] == '\0')
3144 strcpy (sym->module, module_name);
3146 mio_internal_string (sym->module);
3147 mio_pointer_ref (&sym->ns);
3149 mio_symbol (sym);
3150 write_char ('\n');
3154 /* Recursive traversal function to write the initial set of symbols to
3155 the module. We check to see if the symbol should be written
3156 according to the access specification. */
3158 static void
3159 write_symbol0 (gfc_symtree * st)
3161 gfc_symbol *sym;
3162 pointer_info *p;
3164 if (st == NULL)
3165 return;
3167 write_symbol0 (st->left);
3168 write_symbol0 (st->right);
3170 sym = st->n.sym;
3172 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3173 && !sym->attr.subroutine && !sym->attr.function)
3174 return;
3176 if (!check_access (sym->attr.access, sym->ns->default_access))
3177 return;
3179 p = get_pointer (sym);
3180 if (p->type == P_UNKNOWN)
3181 p->type = P_SYMBOL;
3183 if (p->u.wsym.state == WRITTEN)
3184 return;
3186 write_symbol (p->integer, sym);
3187 p->u.wsym.state = WRITTEN;
3189 return;
3193 /* Recursive traversal function to write the secondary set of symbols
3194 to the module file. These are symbols that were not public yet are
3195 needed by the public symbols or another dependent symbol. The act
3196 of writing a symbol can modify the pointer_info tree, so we cease
3197 traversal if we find a symbol to write. We return nonzero if a
3198 symbol was written and pass that information upwards. */
3200 static int
3201 write_symbol1 (pointer_info * p)
3204 if (p == NULL)
3205 return 0;
3207 if (write_symbol1 (p->left))
3208 return 1;
3209 if (write_symbol1 (p->right))
3210 return 1;
3212 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3213 return 0;
3215 p->u.wsym.state = WRITTEN;
3216 write_symbol (p->integer, p->u.wsym.sym);
3218 return 1;
3222 /* Write operator interfaces associated with a symbol. */
3224 static void
3225 write_operator (gfc_user_op * uop)
3227 static char nullstring[] = "";
3229 if (uop->operator == NULL
3230 || !check_access (uop->access, uop->ns->default_access))
3231 return;
3233 mio_symbol_interface (uop->name, nullstring, &uop->operator);
3237 /* Write generic interfaces associated with a symbol. */
3239 static void
3240 write_generic (gfc_symbol * sym)
3243 if (sym->generic == NULL
3244 || !check_access (sym->attr.access, sym->ns->default_access))
3245 return;
3247 mio_symbol_interface (sym->name, sym->module, &sym->generic);
3251 static void
3252 write_symtree (gfc_symtree * st)
3254 gfc_symbol *sym;
3255 pointer_info *p;
3257 sym = st->n.sym;
3258 if (!check_access (sym->attr.access, sym->ns->default_access)
3259 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3260 && !sym->attr.subroutine && !sym->attr.function))
3261 return;
3263 if (check_unique_name (st->name))
3264 return;
3266 p = find_pointer (sym);
3267 if (p == NULL)
3268 gfc_internal_error ("write_symtree(): Symbol not written");
3270 mio_internal_string (st->name);
3271 mio_integer (&st->ambiguous);
3272 mio_integer (&p->integer);
3276 static void
3277 write_module (void)
3279 gfc_intrinsic_op i;
3281 /* Write the operator interfaces. */
3282 mio_lparen ();
3284 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3286 if (i == INTRINSIC_USER)
3287 continue;
3289 mio_interface (check_access (gfc_current_ns->operator_access[i],
3290 gfc_current_ns->default_access)
3291 ? &gfc_current_ns->operator[i] : NULL);
3294 mio_rparen ();
3295 write_char ('\n');
3296 write_char ('\n');
3298 mio_lparen ();
3299 gfc_traverse_user_op (gfc_current_ns, write_operator);
3300 mio_rparen ();
3301 write_char ('\n');
3302 write_char ('\n');
3304 mio_lparen ();
3305 gfc_traverse_ns (gfc_current_ns, write_generic);
3306 mio_rparen ();
3307 write_char ('\n');
3308 write_char ('\n');
3310 /* Write symbol information. First we traverse all symbols in the
3311 primary namespace, writing those that need to be written.
3312 Sometimes writing one symbol will cause another to need to be
3313 written. A list of these symbols ends up on the write stack, and
3314 we end by popping the bottom of the stack and writing the symbol
3315 until the stack is empty. */
3317 mio_lparen ();
3319 write_symbol0 (gfc_current_ns->sym_root);
3320 while (write_symbol1 (pi_root));
3322 mio_rparen ();
3324 write_char ('\n');
3325 write_char ('\n');
3327 mio_lparen ();
3328 gfc_traverse_symtree (gfc_current_ns, write_symtree);
3329 mio_rparen ();
3333 /* Given module, dump it to disk. If there was an error while
3334 processing the module, dump_flag will be set to zero and we delete
3335 the module file, even if it was already there. */
3337 void
3338 gfc_dump_module (const char *name, int dump_flag)
3340 char filename[PATH_MAX], *p;
3341 time_t now;
3343 filename[0] = '\0';
3344 if (gfc_option.module_dir != NULL)
3345 strcpy (filename, gfc_option.module_dir);
3347 strcat (filename, name);
3348 strcat (filename, MODULE_EXTENSION);
3350 if (!dump_flag)
3352 unlink (filename);
3353 return;
3356 module_fp = fopen (filename, "w");
3357 if (module_fp == NULL)
3358 gfc_fatal_error ("Can't open module file '%s' for writing: %s",
3359 filename, strerror (errno));
3361 now = time (NULL);
3362 p = ctime (&now);
3364 *strchr (p, '\n') = '\0';
3366 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3367 gfc_source_file, p);
3368 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3370 iomode = IO_OUTPUT;
3371 strcpy (module_name, name);
3373 init_pi_tree ();
3375 write_module ();
3377 free_pi_tree (pi_root);
3378 pi_root = NULL;
3380 write_char ('\n');
3382 if (fclose (module_fp))
3383 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3384 filename, strerror (errno));
3388 /* Process a USE directive. */
3390 void
3391 gfc_use_module (void)
3393 char filename[GFC_MAX_SYMBOL_LEN + 5];
3394 gfc_state_data *p;
3395 int c, line;
3397 strcpy (filename, module_name);
3398 strcat (filename, MODULE_EXTENSION);
3400 module_fp = gfc_open_included_file (filename);
3401 if (module_fp == NULL)
3402 gfc_fatal_error ("Can't open module file '%s' for reading: %s",
3403 filename, strerror (errno));
3405 iomode = IO_INPUT;
3406 module_line = 1;
3407 module_column = 1;
3409 /* Skip the first two lines of the module. */
3410 /* FIXME: Could also check for valid two lines here, instead. */
3411 line = 0;
3412 while (line < 2)
3414 c = module_char ();
3415 if (c == EOF)
3416 bad_module ("Unexpected end of module");
3417 if (c == '\n')
3418 line++;
3421 /* Make sure we're not reading the same module that we may be building. */
3422 for (p = gfc_state_stack; p; p = p->previous)
3423 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3424 gfc_fatal_error ("Can't USE the same module we're building!");
3426 init_pi_tree ();
3427 init_true_name_tree ();
3429 read_module ();
3431 free_true_name (true_name_root);
3432 true_name_root = NULL;
3434 free_pi_tree (pi_root);
3435 pi_root = NULL;
3437 fclose (module_fp);
3441 void
3442 gfc_module_init_2 (void)
3445 last_atom = ATOM_LPAREN;
3449 void
3450 gfc_module_done_2 (void)
3453 free_rename ();