* gcc.c-torture/execute/20041113-1.c: New test.
[official-gcc.git] / gcc / fortran / module.c
blob10beca31c915a1124e8e80ad2614cf285cdb887b
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004 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 <string.h>
68 #include <stdio.h>
69 #include <errno.h>
70 #include <unistd.h>
71 #include <time.h>
73 #include "gfortran.h"
74 #include "arith.h"
75 #include "match.h"
76 #include "parse.h" /* FIXME */
78 #define MODULE_EXTENSION ".mod"
81 /* Structure that describes a position within a module file. */
83 typedef struct
85 int column, line;
86 fpos_t pos;
88 module_locus;
91 typedef enum
93 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
95 pointer_t;
97 /* The fixup structure lists pointers to pointers that have to
98 be updated when a pointer value becomes known. */
100 typedef struct fixup_t
102 void **pointer;
103 struct fixup_t *next;
105 fixup_t;
108 /* Structure for holding extra info needed for pointers being read. */
110 typedef struct pointer_info
112 BBT_HEADER (pointer_info);
113 int integer;
114 pointer_t type;
116 /* The first component of each member of the union is the pointer
117 being stored. */
119 fixup_t *fixup;
121 union
123 void *pointer; /* Member for doing pointer searches. */
125 struct
127 gfc_symbol *sym;
128 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
129 enum
130 { UNUSED, NEEDED, USED }
131 state;
132 int ns, referenced;
133 module_locus where;
134 fixup_t *stfixup;
135 gfc_symtree *symtree;
137 rsym;
139 struct
141 gfc_symbol *sym;
142 enum
143 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
144 state;
146 wsym;
151 pointer_info;
153 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
156 /* Lists of rename info for the USE statement. */
158 typedef struct gfc_use_rename
160 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
161 struct gfc_use_rename *next;
162 int found;
163 gfc_intrinsic_op operator;
164 locus where;
166 gfc_use_rename;
168 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
170 /* Local variables */
172 /* The FILE for the module we're reading or writing. */
173 static FILE *module_fp;
175 /* The name of the module we're reading (USE'ing) or writing. */
176 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
178 static int module_line, module_column, only_flag;
179 static enum
180 { IO_INPUT, IO_OUTPUT }
181 iomode;
183 static gfc_use_rename *gfc_rename_list;
184 static pointer_info *pi_root;
185 static int symbol_number; /* Counter for assigning symbol numbers */
189 /*****************************************************************/
191 /* Pointer/integer conversion. Pointers between structures are stored
192 as integers in the module file. The next couple of subroutines
193 handle this translation for reading and writing. */
195 /* Recursively free the tree of pointer structures. */
197 static void
198 free_pi_tree (pointer_info * p)
200 if (p == NULL)
201 return;
203 if (p->fixup != NULL)
204 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
206 free_pi_tree (p->left);
207 free_pi_tree (p->right);
209 gfc_free (p);
213 /* Compare pointers when searching by pointer. Used when writing a
214 module. */
216 static int
217 compare_pointers (void * _sn1, void * _sn2)
219 pointer_info *sn1, *sn2;
221 sn1 = (pointer_info *) _sn1;
222 sn2 = (pointer_info *) _sn2;
224 if (sn1->u.pointer < sn2->u.pointer)
225 return -1;
226 if (sn1->u.pointer > sn2->u.pointer)
227 return 1;
229 return 0;
233 /* Compare integers when searching by integer. Used when reading a
234 module. */
236 static int
237 compare_integers (void * _sn1, void * _sn2)
239 pointer_info *sn1, *sn2;
241 sn1 = (pointer_info *) _sn1;
242 sn2 = (pointer_info *) _sn2;
244 if (sn1->integer < sn2->integer)
245 return -1;
246 if (sn1->integer > sn2->integer)
247 return 1;
249 return 0;
253 /* Initialize the pointer_info tree. */
255 static void
256 init_pi_tree (void)
258 compare_fn compare;
259 pointer_info *p;
261 pi_root = NULL;
262 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
264 /* Pointer 0 is the NULL pointer. */
265 p = gfc_get_pointer_info ();
266 p->u.pointer = NULL;
267 p->integer = 0;
268 p->type = P_OTHER;
270 gfc_insert_bbt (&pi_root, p, compare);
272 /* Pointer 1 is the current namespace. */
273 p = gfc_get_pointer_info ();
274 p->u.pointer = gfc_current_ns;
275 p->integer = 1;
276 p->type = P_NAMESPACE;
278 gfc_insert_bbt (&pi_root, p, compare);
280 symbol_number = 2;
284 /* During module writing, call here with a pointer to something,
285 returning the pointer_info node. */
287 static pointer_info *
288 find_pointer (void *gp)
290 pointer_info *p;
292 p = pi_root;
293 while (p != NULL)
295 if (p->u.pointer == gp)
296 break;
297 p = (gp < p->u.pointer) ? p->left : p->right;
300 return p;
304 /* Given a pointer while writing, returns the pointer_info tree node,
305 creating it if it doesn't exist. */
307 static pointer_info *
308 get_pointer (void *gp)
310 pointer_info *p;
312 p = find_pointer (gp);
313 if (p != NULL)
314 return p;
316 /* Pointer doesn't have an integer. Give it one. */
317 p = gfc_get_pointer_info ();
319 p->u.pointer = gp;
320 p->integer = symbol_number++;
322 gfc_insert_bbt (&pi_root, p, compare_pointers);
324 return p;
328 /* Given an integer during reading, find it in the pointer_info tree,
329 creating the node if not found. */
331 static pointer_info *
332 get_integer (int integer)
334 pointer_info *p, t;
335 int c;
337 t.integer = integer;
339 p = pi_root;
340 while (p != NULL)
342 c = compare_integers (&t, p);
343 if (c == 0)
344 break;
346 p = (c < 0) ? p->left : p->right;
349 if (p != NULL)
350 return p;
352 p = gfc_get_pointer_info ();
353 p->integer = integer;
354 p->u.pointer = NULL;
356 gfc_insert_bbt (&pi_root, p, compare_integers);
358 return p;
362 /* Recursive function to find a pointer within a tree by brute force. */
364 static pointer_info *
365 fp2 (pointer_info * p, const void *target)
367 pointer_info *q;
369 if (p == NULL)
370 return NULL;
372 if (p->u.pointer == target)
373 return p;
375 q = fp2 (p->left, target);
376 if (q != NULL)
377 return q;
379 return fp2 (p->right, target);
383 /* During reading, find a pointer_info node from the pointer value.
384 This amounts to a brute-force search. */
386 static pointer_info *
387 find_pointer2 (void *p)
390 return fp2 (pi_root, p);
394 /* Resolve any fixups using a known pointer. */
395 static void
396 resolve_fixups (fixup_t *f, void * gp)
398 fixup_t *next;
400 for (; f; f = next)
402 next = f->next;
403 *(f->pointer) = gp;
404 gfc_free (f);
408 /* Call here during module reading when we know what pointer to
409 associate with an integer. Any fixups that exist are resolved at
410 this time. */
412 static void
413 associate_integer_pointer (pointer_info * p, void *gp)
415 if (p->u.pointer != NULL)
416 gfc_internal_error ("associate_integer_pointer(): Already associated");
418 p->u.pointer = gp;
420 resolve_fixups (p->fixup, gp);
422 p->fixup = NULL;
426 /* During module reading, given an integer and a pointer to a pointer,
427 either store the pointer from an already-known value or create a
428 fixup structure in order to store things later. Returns zero if
429 the reference has been actually stored, or nonzero if the reference
430 must be fixed later (ie associate_integer_pointer must be called
431 sometime later. Returns the pointer_info structure. */
433 static pointer_info *
434 add_fixup (int integer, void *gp)
436 pointer_info *p;
437 fixup_t *f;
438 char **cp;
440 p = get_integer (integer);
442 if (p->integer == 0 || p->u.pointer != NULL)
444 cp = gp;
445 *cp = p->u.pointer;
447 else
449 f = gfc_getmem (sizeof (fixup_t));
451 f->next = p->fixup;
452 p->fixup = f;
454 f->pointer = gp;
457 return p;
461 /*****************************************************************/
463 /* Parser related subroutines */
465 /* Free the rename list left behind by a USE statement. */
467 static void
468 free_rename (void)
470 gfc_use_rename *next;
472 for (; gfc_rename_list; gfc_rename_list = next)
474 next = gfc_rename_list->next;
475 gfc_free (gfc_rename_list);
480 /* Match a USE statement. */
482 match
483 gfc_match_use (void)
485 char name[GFC_MAX_SYMBOL_LEN + 1];
486 gfc_use_rename *tail = NULL, *new;
487 interface_type type;
488 gfc_intrinsic_op operator;
489 match m;
491 m = gfc_match_name (module_name);
492 if (m != MATCH_YES)
493 return m;
495 free_rename ();
496 only_flag = 0;
498 if (gfc_match_eos () == MATCH_YES)
499 return MATCH_YES;
500 if (gfc_match_char (',') != MATCH_YES)
501 goto syntax;
503 if (gfc_match (" only :") == MATCH_YES)
504 only_flag = 1;
506 if (gfc_match_eos () == MATCH_YES)
507 return MATCH_YES;
509 for (;;)
511 /* Get a new rename struct and add it to the rename list. */
512 new = gfc_get_use_rename ();
513 new->where = gfc_current_locus;
514 new->found = 0;
516 if (gfc_rename_list == NULL)
517 gfc_rename_list = new;
518 else
519 tail->next = new;
520 tail = new;
522 /* See what kind of interface we're dealing with. Assume it is
523 not an operator. */
524 new->operator = INTRINSIC_NONE;
525 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
526 goto cleanup;
528 switch (type)
530 case INTERFACE_NAMELESS:
531 gfc_error ("Missing generic specification in USE statement at %C");
532 goto cleanup;
534 case INTERFACE_GENERIC:
535 m = gfc_match (" =>");
537 if (only_flag)
539 if (m != MATCH_YES)
540 strcpy (new->use_name, name);
541 else
543 strcpy (new->local_name, name);
545 m = gfc_match_name (new->use_name);
546 if (m == MATCH_NO)
547 goto syntax;
548 if (m == MATCH_ERROR)
549 goto cleanup;
552 else
554 if (m != MATCH_YES)
555 goto syntax;
556 strcpy (new->local_name, name);
558 m = gfc_match_name (new->use_name);
559 if (m == MATCH_NO)
560 goto syntax;
561 if (m == MATCH_ERROR)
562 goto cleanup;
565 break;
567 case INTERFACE_USER_OP:
568 strcpy (new->use_name, name);
569 /* Fall through */
571 case INTERFACE_INTRINSIC_OP:
572 new->operator = operator;
573 break;
576 if (gfc_match_eos () == MATCH_YES)
577 break;
578 if (gfc_match_char (',') != MATCH_YES)
579 goto syntax;
582 return MATCH_YES;
584 syntax:
585 gfc_syntax_error (ST_USE);
587 cleanup:
588 free_rename ();
589 return MATCH_ERROR;
593 /* Given a name, return the name under which to load this symbol.
594 Returns NULL if this symbol shouldn't be loaded. */
596 static const char *
597 find_use_name (const char *name)
599 gfc_use_rename *u;
601 for (u = gfc_rename_list; u; u = u->next)
602 if (strcmp (u->use_name, name) == 0)
603 break;
605 if (u == NULL)
606 return only_flag ? NULL : name;
608 u->found = 1;
610 return (u->local_name[0] != '\0') ? u->local_name : name;
614 /* Try to find the operator in the current list. */
616 static gfc_use_rename *
617 find_use_operator (gfc_intrinsic_op operator)
619 gfc_use_rename *u;
621 for (u = gfc_rename_list; u; u = u->next)
622 if (u->operator == operator)
623 return u;
625 return NULL;
629 /*****************************************************************/
631 /* The next couple of subroutines maintain a tree used to avoid a
632 brute-force search for a combination of true name and module name.
633 While symtree names, the name that a particular symbol is known by
634 can changed with USE statements, we still have to keep track of the
635 true names to generate the correct reference, and also avoid
636 loading the same real symbol twice in a program unit.
638 When we start reading, the true name tree is built and maintained
639 as symbols are read. The tree is searched as we load new symbols
640 to see if it already exists someplace in the namespace. */
642 typedef struct true_name
644 BBT_HEADER (true_name);
645 gfc_symbol *sym;
647 true_name;
649 static true_name *true_name_root;
652 /* Compare two true_name structures. */
654 static int
655 compare_true_names (void * _t1, void * _t2)
657 true_name *t1, *t2;
658 int c;
660 t1 = (true_name *) _t1;
661 t2 = (true_name *) _t2;
663 c = strcmp (t1->sym->module, t2->sym->module);
664 if (c != 0)
665 return c;
667 return strcmp (t1->sym->name, t2->sym->name);
671 /* Given a true name, search the true name tree to see if it exists
672 within the main namespace. */
674 static gfc_symbol *
675 find_true_name (const char *name, const char *module)
677 true_name t, *p;
678 gfc_symbol sym;
679 int c;
681 strcpy (sym.name, name);
682 strcpy (sym.module, module);
683 t.sym = &sym;
685 p = true_name_root;
686 while (p != NULL)
688 c = compare_true_names ((void *)(&t), (void *) p);
689 if (c == 0)
690 return p->sym;
692 p = (c < 0) ? p->left : p->right;
695 return NULL;
699 /* Given a gfc_symbol pointer that is not in the true name tree, add
700 it. */
702 static void
703 add_true_name (gfc_symbol * sym)
705 true_name *t;
707 t = gfc_getmem (sizeof (true_name));
708 t->sym = sym;
710 gfc_insert_bbt (&true_name_root, t, compare_true_names);
714 /* Recursive function to build the initial true name tree by
715 recursively traversing the current namespace. */
717 static void
718 build_tnt (gfc_symtree * st)
721 if (st == NULL)
722 return;
724 build_tnt (st->left);
725 build_tnt (st->right);
727 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
728 return;
730 add_true_name (st->n.sym);
734 /* Initialize the true name tree with the current namespace. */
736 static void
737 init_true_name_tree (void)
739 true_name_root = NULL;
741 build_tnt (gfc_current_ns->sym_root);
745 /* Recursively free a true name tree node. */
747 static void
748 free_true_name (true_name * t)
751 if (t == NULL)
752 return;
753 free_true_name (t->left);
754 free_true_name (t->right);
756 gfc_free (t);
760 /*****************************************************************/
762 /* Module reading and writing. */
764 typedef enum
766 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
768 atom_type;
770 static atom_type last_atom;
773 /* The name buffer must be at least as long as a symbol name. Right
774 now it's not clear how we're going to store numeric constants--
775 probably as a hexadecimal string, since this will allow the exact
776 number to be preserved (this can't be done by a decimal
777 representation). Worry about that later. TODO! */
779 #define MAX_ATOM_SIZE 100
781 static int atom_int;
782 static char *atom_string, atom_name[MAX_ATOM_SIZE];
785 /* Report problems with a module. Error reporting is not very
786 elaborate, since this sorts of errors shouldn't really happen.
787 This subroutine never returns. */
789 static void bad_module (const char *) ATTRIBUTE_NORETURN;
791 static void
792 bad_module (const char *message)
794 const char *p;
796 switch (iomode)
798 case IO_INPUT:
799 p = "Reading";
800 break;
801 case IO_OUTPUT:
802 p = "Writing";
803 break;
804 default:
805 p = "???";
806 break;
809 fclose (module_fp);
811 gfc_fatal_error ("%s module %s at line %d column %d: %s", p,
812 module_name, module_line, module_column, message);
816 /* Set the module's input pointer. */
818 static void
819 set_module_locus (module_locus * m)
822 module_column = m->column;
823 module_line = m->line;
824 fsetpos (module_fp, &m->pos);
828 /* Get the module's input pointer so that we can restore it later. */
830 static void
831 get_module_locus (module_locus * m)
834 m->column = module_column;
835 m->line = module_line;
836 fgetpos (module_fp, &m->pos);
840 /* Get the next character in the module, updating our reckoning of
841 where we are. */
843 static int
844 module_char (void)
846 int c;
848 c = fgetc (module_fp);
850 if (c == EOF)
851 bad_module ("Unexpected EOF");
853 if (c == '\n')
855 module_line++;
856 module_column = 0;
859 module_column++;
860 return c;
864 /* Parse a string constant. The delimiter is guaranteed to be a
865 single quote. */
867 static void
868 parse_string (void)
870 module_locus start;
871 int len, c;
872 char *p;
874 get_module_locus (&start);
876 len = 0;
878 /* See how long the string is */
879 for ( ; ; )
881 c = module_char ();
882 if (c == EOF)
883 bad_module ("Unexpected end of module in string constant");
885 if (c != '\'')
887 len++;
888 continue;
891 c = module_char ();
892 if (c == '\'')
894 len++;
895 continue;
898 break;
901 set_module_locus (&start);
903 atom_string = p = gfc_getmem (len + 1);
905 for (; len > 0; len--)
907 c = module_char ();
908 if (c == '\'')
909 module_char (); /* Guaranteed to be another \' */
910 *p++ = c;
913 module_char (); /* Terminating \' */
914 *p = '\0'; /* C-style string for debug purposes */
918 /* Parse a small integer. */
920 static void
921 parse_integer (int c)
923 module_locus m;
925 atom_int = c - '0';
927 for (;;)
929 get_module_locus (&m);
931 c = module_char ();
932 if (!ISDIGIT (c))
933 break;
935 atom_int = 10 * atom_int + c - '0';
936 if (atom_int > 99999999)
937 bad_module ("Integer overflow");
940 set_module_locus (&m);
944 /* Parse a name. */
946 static void
947 parse_name (int c)
949 module_locus m;
950 char *p;
951 int len;
953 p = atom_name;
955 *p++ = c;
956 len = 1;
958 get_module_locus (&m);
960 for (;;)
962 c = module_char ();
963 if (!ISALNUM (c) && c != '_' && c != '-')
964 break;
966 *p++ = c;
967 if (++len > GFC_MAX_SYMBOL_LEN)
968 bad_module ("Name too long");
971 *p = '\0';
973 fseek (module_fp, -1, SEEK_CUR);
974 module_column = m.column + len - 1;
976 if (c == '\n')
977 module_line--;
981 /* Read the next atom in the module's input stream. */
983 static atom_type
984 parse_atom (void)
986 int c;
990 c = module_char ();
992 while (c == ' ' || c == '\n');
994 switch (c)
996 case '(':
997 return ATOM_LPAREN;
999 case ')':
1000 return ATOM_RPAREN;
1002 case '\'':
1003 parse_string ();
1004 return ATOM_STRING;
1006 case '0':
1007 case '1':
1008 case '2':
1009 case '3':
1010 case '4':
1011 case '5':
1012 case '6':
1013 case '7':
1014 case '8':
1015 case '9':
1016 parse_integer (c);
1017 return ATOM_INTEGER;
1019 case 'a':
1020 case 'b':
1021 case 'c':
1022 case 'd':
1023 case 'e':
1024 case 'f':
1025 case 'g':
1026 case 'h':
1027 case 'i':
1028 case 'j':
1029 case 'k':
1030 case 'l':
1031 case 'm':
1032 case 'n':
1033 case 'o':
1034 case 'p':
1035 case 'q':
1036 case 'r':
1037 case 's':
1038 case 't':
1039 case 'u':
1040 case 'v':
1041 case 'w':
1042 case 'x':
1043 case 'y':
1044 case 'z':
1045 case 'A':
1046 case 'B':
1047 case 'C':
1048 case 'D':
1049 case 'E':
1050 case 'F':
1051 case 'G':
1052 case 'H':
1053 case 'I':
1054 case 'J':
1055 case 'K':
1056 case 'L':
1057 case 'M':
1058 case 'N':
1059 case 'O':
1060 case 'P':
1061 case 'Q':
1062 case 'R':
1063 case 'S':
1064 case 'T':
1065 case 'U':
1066 case 'V':
1067 case 'W':
1068 case 'X':
1069 case 'Y':
1070 case 'Z':
1071 parse_name (c);
1072 return ATOM_NAME;
1074 default:
1075 bad_module ("Bad name");
1078 /* Not reached */
1082 /* Peek at the next atom on the input. */
1084 static atom_type
1085 peek_atom (void)
1087 module_locus m;
1088 atom_type a;
1090 get_module_locus (&m);
1092 a = parse_atom ();
1093 if (a == ATOM_STRING)
1094 gfc_free (atom_string);
1096 set_module_locus (&m);
1097 return a;
1101 /* Read the next atom from the input, requiring that it be a
1102 particular kind. */
1104 static void
1105 require_atom (atom_type type)
1107 module_locus m;
1108 atom_type t;
1109 const char *p;
1111 get_module_locus (&m);
1113 t = parse_atom ();
1114 if (t != type)
1116 switch (type)
1118 case ATOM_NAME:
1119 p = "Expected name";
1120 break;
1121 case ATOM_LPAREN:
1122 p = "Expected left parenthesis";
1123 break;
1124 case ATOM_RPAREN:
1125 p = "Expected right parenthesis";
1126 break;
1127 case ATOM_INTEGER:
1128 p = "Expected integer";
1129 break;
1130 case ATOM_STRING:
1131 p = "Expected string";
1132 break;
1133 default:
1134 gfc_internal_error ("require_atom(): bad atom type required");
1137 set_module_locus (&m);
1138 bad_module (p);
1143 /* Given a pointer to an mstring array, require that the current input
1144 be one of the strings in the array. We return the enum value. */
1146 static int
1147 find_enum (const mstring * m)
1149 int i;
1151 i = gfc_string2code (m, atom_name);
1152 if (i >= 0)
1153 return i;
1155 bad_module ("find_enum(): Enum not found");
1157 /* Not reached */
1161 /**************** Module output subroutines ***************************/
1163 /* Output a character to a module file. */
1165 static void
1166 write_char (char out)
1169 if (fputc (out, module_fp) == EOF)
1170 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1172 if (out != '\n')
1173 module_column++;
1174 else
1176 module_column = 1;
1177 module_line++;
1182 /* Write an atom to a module. The line wrapping isn't perfect, but it
1183 should work most of the time. This isn't that big of a deal, since
1184 the file really isn't meant to be read by people anyway. */
1186 static void
1187 write_atom (atom_type atom, const void *v)
1189 char buffer[20];
1190 int i, len;
1191 const char *p;
1193 switch (atom)
1195 case ATOM_STRING:
1196 case ATOM_NAME:
1197 p = v;
1198 break;
1200 case ATOM_LPAREN:
1201 p = "(";
1202 break;
1204 case ATOM_RPAREN:
1205 p = ")";
1206 break;
1208 case ATOM_INTEGER:
1209 i = *((const int *) v);
1210 if (i < 0)
1211 gfc_internal_error ("write_atom(): Writing negative integer");
1213 sprintf (buffer, "%d", i);
1214 p = buffer;
1215 break;
1217 default:
1218 gfc_internal_error ("write_atom(): Trying to write dab atom");
1222 len = strlen (p);
1224 if (atom != ATOM_RPAREN)
1226 if (module_column + len > 72)
1227 write_char ('\n');
1228 else
1231 if (last_atom != ATOM_LPAREN && module_column != 1)
1232 write_char (' ');
1236 if (atom == ATOM_STRING)
1237 write_char ('\'');
1239 while (*p)
1241 if (atom == ATOM_STRING && *p == '\'')
1242 write_char ('\'');
1243 write_char (*p++);
1246 if (atom == ATOM_STRING)
1247 write_char ('\'');
1249 last_atom = atom;
1254 /***************** Mid-level I/O subroutines *****************/
1256 /* These subroutines let their caller read or write atoms without
1257 caring about which of the two is actually happening. This lets a
1258 subroutine concentrate on the actual format of the data being
1259 written. */
1261 static void mio_expr (gfc_expr **);
1262 static void mio_symbol_ref (gfc_symbol **);
1263 static void mio_symtree_ref (gfc_symtree **);
1265 /* Read or write an enumerated value. On writing, we return the input
1266 value for the convenience of callers. We avoid using an integer
1267 pointer because enums are sometimes inside bitfields. */
1269 static int
1270 mio_name (int t, const mstring * m)
1273 if (iomode == IO_OUTPUT)
1274 write_atom (ATOM_NAME, gfc_code2string (m, t));
1275 else
1277 require_atom (ATOM_NAME);
1278 t = find_enum (m);
1281 return t;
1284 /* Specialisation of mio_name. */
1286 #define DECL_MIO_NAME(TYPE) \
1287 static inline TYPE \
1288 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1290 return (TYPE)mio_name ((int)t, m); \
1292 #define MIO_NAME(TYPE) mio_name_##TYPE
1294 static void
1295 mio_lparen (void)
1298 if (iomode == IO_OUTPUT)
1299 write_atom (ATOM_LPAREN, NULL);
1300 else
1301 require_atom (ATOM_LPAREN);
1305 static void
1306 mio_rparen (void)
1309 if (iomode == IO_OUTPUT)
1310 write_atom (ATOM_RPAREN, NULL);
1311 else
1312 require_atom (ATOM_RPAREN);
1316 static void
1317 mio_integer (int *ip)
1320 if (iomode == IO_OUTPUT)
1321 write_atom (ATOM_INTEGER, ip);
1322 else
1324 require_atom (ATOM_INTEGER);
1325 *ip = atom_int;
1330 /* Read or write a character pointer that points to a string on the
1331 heap. */
1333 static void
1334 mio_allocated_string (char **sp)
1337 if (iomode == IO_OUTPUT)
1338 write_atom (ATOM_STRING, *sp);
1339 else
1341 require_atom (ATOM_STRING);
1342 *sp = atom_string;
1347 /* Read or write a string that is in static memory or inside of some
1348 already-allocated structure. */
1350 static void
1351 mio_internal_string (char *string)
1354 if (iomode == IO_OUTPUT)
1355 write_atom (ATOM_STRING, string);
1356 else
1358 require_atom (ATOM_STRING);
1359 strcpy (string, atom_string);
1360 gfc_free (atom_string);
1366 typedef enum
1367 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1368 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
1369 AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON,
1370 AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1371 AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT
1373 ab_attribute;
1375 static const mstring attr_bits[] =
1377 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1378 minit ("DIMENSION", AB_DIMENSION),
1379 minit ("EXTERNAL", AB_EXTERNAL),
1380 minit ("INTRINSIC", AB_INTRINSIC),
1381 minit ("OPTIONAL", AB_OPTIONAL),
1382 minit ("POINTER", AB_POINTER),
1383 minit ("SAVE", AB_SAVE),
1384 minit ("TARGET", AB_TARGET),
1385 minit ("DUMMY", AB_DUMMY),
1386 minit ("RESULT", AB_RESULT),
1387 minit ("DATA", AB_DATA),
1388 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1389 minit ("IN_COMMON", AB_IN_COMMON),
1390 minit ("FUNCTION", AB_FUNCTION),
1391 minit ("SUBROUTINE", AB_SUBROUTINE),
1392 minit ("SEQUENCE", AB_SEQUENCE),
1393 minit ("ELEMENTAL", AB_ELEMENTAL),
1394 minit ("PURE", AB_PURE),
1395 minit ("RECURSIVE", AB_RECURSIVE),
1396 minit ("GENERIC", AB_GENERIC),
1397 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1398 minit (NULL, -1)
1401 /* Specialisation of mio_name. */
1402 DECL_MIO_NAME(ab_attribute)
1403 DECL_MIO_NAME(ar_type)
1404 DECL_MIO_NAME(array_type)
1405 DECL_MIO_NAME(bt)
1406 DECL_MIO_NAME(expr_t)
1407 DECL_MIO_NAME(gfc_access)
1408 DECL_MIO_NAME(gfc_intrinsic_op)
1409 DECL_MIO_NAME(ifsrc)
1410 DECL_MIO_NAME(procedure_type)
1411 DECL_MIO_NAME(ref_type)
1412 DECL_MIO_NAME(sym_flavor)
1413 DECL_MIO_NAME(sym_intent)
1414 #undef DECL_MIO_NAME
1416 /* Symbol attributes are stored in list with the first three elements
1417 being the enumerated fields, while the remaining elements (if any)
1418 indicate the individual attribute bits. The access field is not
1419 saved-- it controls what symbols are exported when a module is
1420 written. */
1422 static void
1423 mio_symbol_attribute (symbol_attribute * attr)
1425 atom_type t;
1427 mio_lparen ();
1429 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1430 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1431 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1432 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1434 if (iomode == IO_OUTPUT)
1436 if (attr->allocatable)
1437 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1438 if (attr->dimension)
1439 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1440 if (attr->external)
1441 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1442 if (attr->intrinsic)
1443 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1444 if (attr->optional)
1445 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1446 if (attr->pointer)
1447 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1448 if (attr->save)
1449 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1450 if (attr->target)
1451 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1452 if (attr->dummy)
1453 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1454 if (attr->result)
1455 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1456 /* We deliberately don't preserve the "entry" flag. */
1458 if (attr->data)
1459 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1460 if (attr->in_namelist)
1461 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1462 if (attr->in_common)
1463 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1465 if (attr->function)
1466 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1467 if (attr->subroutine)
1468 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1469 if (attr->generic)
1470 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1472 if (attr->sequence)
1473 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1474 if (attr->elemental)
1475 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1476 if (attr->pure)
1477 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1478 if (attr->recursive)
1479 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1480 if (attr->always_explicit)
1481 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1483 mio_rparen ();
1486 else
1489 for (;;)
1491 t = parse_atom ();
1492 if (t == ATOM_RPAREN)
1493 break;
1494 if (t != ATOM_NAME)
1495 bad_module ("Expected attribute bit name");
1497 switch ((ab_attribute) find_enum (attr_bits))
1499 case AB_ALLOCATABLE:
1500 attr->allocatable = 1;
1501 break;
1502 case AB_DIMENSION:
1503 attr->dimension = 1;
1504 break;
1505 case AB_EXTERNAL:
1506 attr->external = 1;
1507 break;
1508 case AB_INTRINSIC:
1509 attr->intrinsic = 1;
1510 break;
1511 case AB_OPTIONAL:
1512 attr->optional = 1;
1513 break;
1514 case AB_POINTER:
1515 attr->pointer = 1;
1516 break;
1517 case AB_SAVE:
1518 attr->save = 1;
1519 break;
1520 case AB_TARGET:
1521 attr->target = 1;
1522 break;
1523 case AB_DUMMY:
1524 attr->dummy = 1;
1525 break;
1526 case AB_RESULT:
1527 attr->result = 1;
1528 break;
1529 case AB_DATA:
1530 attr->data = 1;
1531 break;
1532 case AB_IN_NAMELIST:
1533 attr->in_namelist = 1;
1534 break;
1535 case AB_IN_COMMON:
1536 attr->in_common = 1;
1537 break;
1538 case AB_FUNCTION:
1539 attr->function = 1;
1540 break;
1541 case AB_SUBROUTINE:
1542 attr->subroutine = 1;
1543 break;
1544 case AB_GENERIC:
1545 attr->generic = 1;
1546 break;
1547 case AB_SEQUENCE:
1548 attr->sequence = 1;
1549 break;
1550 case AB_ELEMENTAL:
1551 attr->elemental = 1;
1552 break;
1553 case AB_PURE:
1554 attr->pure = 1;
1555 break;
1556 case AB_RECURSIVE:
1557 attr->recursive = 1;
1558 break;
1559 case AB_ALWAYS_EXPLICIT:
1560 attr->always_explicit = 1;
1561 break;
1568 static const mstring bt_types[] = {
1569 minit ("INTEGER", BT_INTEGER),
1570 minit ("REAL", BT_REAL),
1571 minit ("COMPLEX", BT_COMPLEX),
1572 minit ("LOGICAL", BT_LOGICAL),
1573 minit ("CHARACTER", BT_CHARACTER),
1574 minit ("DERIVED", BT_DERIVED),
1575 minit ("PROCEDURE", BT_PROCEDURE),
1576 minit ("UNKNOWN", BT_UNKNOWN),
1577 minit (NULL, -1)
1581 static void
1582 mio_charlen (gfc_charlen ** clp)
1584 gfc_charlen *cl;
1586 mio_lparen ();
1588 if (iomode == IO_OUTPUT)
1590 cl = *clp;
1591 if (cl != NULL)
1592 mio_expr (&cl->length);
1594 else
1597 if (peek_atom () != ATOM_RPAREN)
1599 cl = gfc_get_charlen ();
1600 mio_expr (&cl->length);
1602 *clp = cl;
1604 cl->next = gfc_current_ns->cl_list;
1605 gfc_current_ns->cl_list = cl;
1609 mio_rparen ();
1613 /* Return a symtree node with a name that is guaranteed to be unique
1614 within the namespace and corresponds to an illegal fortran name. */
1616 static gfc_symtree *
1617 get_unique_symtree (gfc_namespace * ns)
1619 char name[GFC_MAX_SYMBOL_LEN + 1];
1620 static int serial = 0;
1622 sprintf (name, "@%d", serial++);
1623 return gfc_new_symtree (&ns->sym_root, name);
1627 /* See if a name is a generated name. */
1629 static int
1630 check_unique_name (const char *name)
1633 return *name == '@';
1637 static void
1638 mio_typespec (gfc_typespec * ts)
1641 mio_lparen ();
1643 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1645 if (ts->type != BT_DERIVED)
1646 mio_integer (&ts->kind);
1647 else
1648 mio_symbol_ref (&ts->derived);
1650 mio_charlen (&ts->cl);
1652 mio_rparen ();
1656 static const mstring array_spec_types[] = {
1657 minit ("EXPLICIT", AS_EXPLICIT),
1658 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1659 minit ("DEFERRED", AS_DEFERRED),
1660 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1661 minit (NULL, -1)
1665 static void
1666 mio_array_spec (gfc_array_spec ** asp)
1668 gfc_array_spec *as;
1669 int i;
1671 mio_lparen ();
1673 if (iomode == IO_OUTPUT)
1675 if (*asp == NULL)
1676 goto done;
1677 as = *asp;
1679 else
1681 if (peek_atom () == ATOM_RPAREN)
1683 *asp = NULL;
1684 goto done;
1687 *asp = as = gfc_get_array_spec ();
1690 mio_integer (&as->rank);
1691 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1693 for (i = 0; i < as->rank; i++)
1695 mio_expr (&as->lower[i]);
1696 mio_expr (&as->upper[i]);
1699 done:
1700 mio_rparen ();
1704 /* Given a pointer to an array reference structure (which lives in a
1705 gfc_ref structure), find the corresponding array specification
1706 structure. Storing the pointer in the ref structure doesn't quite
1707 work when loading from a module. Generating code for an array
1708 reference also needs more information than just the array spec. */
1710 static const mstring array_ref_types[] = {
1711 minit ("FULL", AR_FULL),
1712 minit ("ELEMENT", AR_ELEMENT),
1713 minit ("SECTION", AR_SECTION),
1714 minit (NULL, -1)
1717 static void
1718 mio_array_ref (gfc_array_ref * ar)
1720 int i;
1722 mio_lparen ();
1723 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1724 mio_integer (&ar->dimen);
1726 switch (ar->type)
1728 case AR_FULL:
1729 break;
1731 case AR_ELEMENT:
1732 for (i = 0; i < ar->dimen; i++)
1733 mio_expr (&ar->start[i]);
1735 break;
1737 case AR_SECTION:
1738 for (i = 0; i < ar->dimen; i++)
1740 mio_expr (&ar->start[i]);
1741 mio_expr (&ar->end[i]);
1742 mio_expr (&ar->stride[i]);
1745 break;
1747 case AR_UNKNOWN:
1748 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1751 for (i = 0; i < ar->dimen; i++)
1752 mio_integer ((int *) &ar->dimen_type[i]);
1754 if (iomode == IO_INPUT)
1756 ar->where = gfc_current_locus;
1758 for (i = 0; i < ar->dimen; i++)
1759 ar->c_where[i] = gfc_current_locus;
1762 mio_rparen ();
1766 /* Saves or restores a pointer. The pointer is converted back and
1767 forth from an integer. We return the pointer_info pointer so that
1768 the caller can take additional action based on the pointer type. */
1770 static pointer_info *
1771 mio_pointer_ref (void *gp)
1773 pointer_info *p;
1775 if (iomode == IO_OUTPUT)
1777 p = get_pointer (*((char **) gp));
1778 write_atom (ATOM_INTEGER, &p->integer);
1780 else
1782 require_atom (ATOM_INTEGER);
1783 p = add_fixup (atom_int, gp);
1786 return p;
1790 /* Save and load references to components that occur within
1791 expressions. We have to describe these references by a number and
1792 by name. The number is necessary for forward references during
1793 reading, and the name is necessary if the symbol already exists in
1794 the namespace and is not loaded again. */
1796 static void
1797 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1799 char name[GFC_MAX_SYMBOL_LEN + 1];
1800 gfc_component *q;
1801 pointer_info *p;
1803 p = mio_pointer_ref (cp);
1804 if (p->type == P_UNKNOWN)
1805 p->type = P_COMPONENT;
1807 if (iomode == IO_OUTPUT)
1808 mio_internal_string ((*cp)->name);
1809 else
1811 mio_internal_string (name);
1813 if (sym->components != NULL && p->u.pointer == NULL)
1815 /* Symbol already loaded, so search by name. */
1816 for (q = sym->components; q; q = q->next)
1817 if (strcmp (q->name, name) == 0)
1818 break;
1820 if (q == NULL)
1821 gfc_internal_error ("mio_component_ref(): Component not found");
1823 associate_integer_pointer (p, q);
1826 /* Make sure this symbol will eventually be loaded. */
1827 p = find_pointer2 (sym);
1828 if (p->u.rsym.state == UNUSED)
1829 p->u.rsym.state = NEEDED;
1834 static void
1835 mio_component (gfc_component * c)
1837 pointer_info *p;
1838 int n;
1840 mio_lparen ();
1842 if (iomode == IO_OUTPUT)
1844 p = get_pointer (c);
1845 mio_integer (&p->integer);
1847 else
1849 mio_integer (&n);
1850 p = get_integer (n);
1851 associate_integer_pointer (p, c);
1854 if (p->type == P_UNKNOWN)
1855 p->type = P_COMPONENT;
1857 mio_internal_string (c->name);
1858 mio_typespec (&c->ts);
1859 mio_array_spec (&c->as);
1861 mio_integer (&c->dimension);
1862 mio_integer (&c->pointer);
1864 mio_expr (&c->initializer);
1865 mio_rparen ();
1869 static void
1870 mio_component_list (gfc_component ** cp)
1872 gfc_component *c, *tail;
1874 mio_lparen ();
1876 if (iomode == IO_OUTPUT)
1878 for (c = *cp; c; c = c->next)
1879 mio_component (c);
1881 else
1884 *cp = NULL;
1885 tail = NULL;
1887 for (;;)
1889 if (peek_atom () == ATOM_RPAREN)
1890 break;
1892 c = gfc_get_component ();
1893 mio_component (c);
1895 if (tail == NULL)
1896 *cp = c;
1897 else
1898 tail->next = c;
1900 tail = c;
1904 mio_rparen ();
1908 static void
1909 mio_actual_arg (gfc_actual_arglist * a)
1912 mio_lparen ();
1913 mio_internal_string (a->name);
1914 mio_expr (&a->expr);
1915 mio_rparen ();
1919 static void
1920 mio_actual_arglist (gfc_actual_arglist ** ap)
1922 gfc_actual_arglist *a, *tail;
1924 mio_lparen ();
1926 if (iomode == IO_OUTPUT)
1928 for (a = *ap; a; a = a->next)
1929 mio_actual_arg (a);
1932 else
1934 tail = NULL;
1936 for (;;)
1938 if (peek_atom () != ATOM_LPAREN)
1939 break;
1941 a = gfc_get_actual_arglist ();
1943 if (tail == NULL)
1944 *ap = a;
1945 else
1946 tail->next = a;
1948 tail = a;
1949 mio_actual_arg (a);
1953 mio_rparen ();
1957 /* Read and write formal argument lists. */
1959 static void
1960 mio_formal_arglist (gfc_symbol * sym)
1962 gfc_formal_arglist *f, *tail;
1964 mio_lparen ();
1966 if (iomode == IO_OUTPUT)
1968 for (f = sym->formal; f; f = f->next)
1969 mio_symbol_ref (&f->sym);
1972 else
1974 sym->formal = tail = NULL;
1976 while (peek_atom () != ATOM_RPAREN)
1978 f = gfc_get_formal_arglist ();
1979 mio_symbol_ref (&f->sym);
1981 if (sym->formal == NULL)
1982 sym->formal = f;
1983 else
1984 tail->next = f;
1986 tail = f;
1990 mio_rparen ();
1994 /* Save or restore a reference to a symbol node. */
1996 void
1997 mio_symbol_ref (gfc_symbol ** symp)
1999 pointer_info *p;
2001 p = mio_pointer_ref (symp);
2002 if (p->type == P_UNKNOWN)
2003 p->type = P_SYMBOL;
2005 if (iomode == IO_OUTPUT)
2007 if (p->u.wsym.state == UNREFERENCED)
2008 p->u.wsym.state = NEEDS_WRITE;
2010 else
2012 if (p->u.rsym.state == UNUSED)
2013 p->u.rsym.state = NEEDED;
2018 /* Save or restore a reference to a symtree node. */
2020 static void
2021 mio_symtree_ref (gfc_symtree ** stp)
2023 pointer_info *p;
2024 fixup_t *f;
2026 if (iomode == IO_OUTPUT)
2028 mio_symbol_ref (&(*stp)->n.sym);
2030 else
2032 require_atom (ATOM_INTEGER);
2033 p = get_integer (atom_int);
2034 if (p->type == P_UNKNOWN)
2035 p->type = P_SYMBOL;
2037 if (p->u.rsym.state == UNUSED)
2038 p->u.rsym.state = NEEDED;
2040 if (p->u.rsym.symtree != NULL)
2042 *stp = p->u.rsym.symtree;
2044 else
2046 f = gfc_getmem (sizeof (fixup_t));
2048 f->next = p->u.rsym.stfixup;
2049 p->u.rsym.stfixup = f;
2051 f->pointer = (void **)stp;
2056 static void
2057 mio_iterator (gfc_iterator ** ip)
2059 gfc_iterator *iter;
2061 mio_lparen ();
2063 if (iomode == IO_OUTPUT)
2065 if (*ip == NULL)
2066 goto done;
2068 else
2070 if (peek_atom () == ATOM_RPAREN)
2072 *ip = NULL;
2073 goto done;
2076 *ip = gfc_get_iterator ();
2079 iter = *ip;
2081 mio_expr (&iter->var);
2082 mio_expr (&iter->start);
2083 mio_expr (&iter->end);
2084 mio_expr (&iter->step);
2086 done:
2087 mio_rparen ();
2092 static void
2093 mio_constructor (gfc_constructor ** cp)
2095 gfc_constructor *c, *tail;
2097 mio_lparen ();
2099 if (iomode == IO_OUTPUT)
2101 for (c = *cp; c; c = c->next)
2103 mio_lparen ();
2104 mio_expr (&c->expr);
2105 mio_iterator (&c->iterator);
2106 mio_rparen ();
2109 else
2112 *cp = NULL;
2113 tail = NULL;
2115 while (peek_atom () != ATOM_RPAREN)
2117 c = gfc_get_constructor ();
2119 if (tail == NULL)
2120 *cp = c;
2121 else
2122 tail->next = c;
2124 tail = c;
2126 mio_lparen ();
2127 mio_expr (&c->expr);
2128 mio_iterator (&c->iterator);
2129 mio_rparen ();
2133 mio_rparen ();
2138 static const mstring ref_types[] = {
2139 minit ("ARRAY", REF_ARRAY),
2140 minit ("COMPONENT", REF_COMPONENT),
2141 minit ("SUBSTRING", REF_SUBSTRING),
2142 minit (NULL, -1)
2146 static void
2147 mio_ref (gfc_ref ** rp)
2149 gfc_ref *r;
2151 mio_lparen ();
2153 r = *rp;
2154 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2156 switch (r->type)
2158 case REF_ARRAY:
2159 mio_array_ref (&r->u.ar);
2160 break;
2162 case REF_COMPONENT:
2163 mio_symbol_ref (&r->u.c.sym);
2164 mio_component_ref (&r->u.c.component, r->u.c.sym);
2165 break;
2167 case REF_SUBSTRING:
2168 mio_expr (&r->u.ss.start);
2169 mio_expr (&r->u.ss.end);
2170 mio_charlen (&r->u.ss.length);
2171 break;
2174 mio_rparen ();
2178 static void
2179 mio_ref_list (gfc_ref ** rp)
2181 gfc_ref *ref, *head, *tail;
2183 mio_lparen ();
2185 if (iomode == IO_OUTPUT)
2187 for (ref = *rp; ref; ref = ref->next)
2188 mio_ref (&ref);
2190 else
2192 head = tail = NULL;
2194 while (peek_atom () != ATOM_RPAREN)
2196 if (head == NULL)
2197 head = tail = gfc_get_ref ();
2198 else
2200 tail->next = gfc_get_ref ();
2201 tail = tail->next;
2204 mio_ref (&tail);
2207 *rp = head;
2210 mio_rparen ();
2214 /* Read and write an integer value. */
2216 static void
2217 mio_gmp_integer (mpz_t * integer)
2219 char *p;
2221 if (iomode == IO_INPUT)
2223 if (parse_atom () != ATOM_STRING)
2224 bad_module ("Expected integer string");
2226 mpz_init (*integer);
2227 if (mpz_set_str (*integer, atom_string, 10))
2228 bad_module ("Error converting integer");
2230 gfc_free (atom_string);
2233 else
2235 p = mpz_get_str (NULL, 10, *integer);
2236 write_atom (ATOM_STRING, p);
2237 gfc_free (p);
2242 static void
2243 mio_gmp_real (mpfr_t * real)
2245 mp_exp_t exponent;
2246 char *p;
2248 if (iomode == IO_INPUT)
2250 if (parse_atom () != ATOM_STRING)
2251 bad_module ("Expected real string");
2253 mpfr_init (*real);
2254 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2255 gfc_free (atom_string);
2258 else
2260 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2261 atom_string = gfc_getmem (strlen (p) + 20);
2263 sprintf (atom_string, "0.%s@%ld", p, exponent);
2265 /* Fix negative numbers. */
2266 if (atom_string[2] == '-')
2268 atom_string[0] = '-';
2269 atom_string[1] = '0';
2270 atom_string[2] = '.';
2273 write_atom (ATOM_STRING, atom_string);
2275 gfc_free (atom_string);
2276 gfc_free (p);
2281 /* Save and restore the shape of an array constructor. */
2283 static void
2284 mio_shape (mpz_t ** pshape, int rank)
2286 mpz_t *shape;
2287 atom_type t;
2288 int n;
2290 /* A NULL shape is represented by (). */
2291 mio_lparen ();
2293 if (iomode == IO_OUTPUT)
2295 shape = *pshape;
2296 if (!shape)
2298 mio_rparen ();
2299 return;
2302 else
2304 t = peek_atom ();
2305 if (t == ATOM_RPAREN)
2307 *pshape = NULL;
2308 mio_rparen ();
2309 return;
2312 shape = gfc_get_shape (rank);
2313 *pshape = shape;
2316 for (n = 0; n < rank; n++)
2317 mio_gmp_integer (&shape[n]);
2319 mio_rparen ();
2323 static const mstring expr_types[] = {
2324 minit ("OP", EXPR_OP),
2325 minit ("FUNCTION", EXPR_FUNCTION),
2326 minit ("CONSTANT", EXPR_CONSTANT),
2327 minit ("VARIABLE", EXPR_VARIABLE),
2328 minit ("SUBSTRING", EXPR_SUBSTRING),
2329 minit ("STRUCTURE", EXPR_STRUCTURE),
2330 minit ("ARRAY", EXPR_ARRAY),
2331 minit ("NULL", EXPR_NULL),
2332 minit (NULL, -1)
2335 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2336 generic operators, not in expressions. INTRINSIC_USER is also
2337 replaced by the correct function name by the time we see it. */
2339 static const mstring intrinsics[] =
2341 minit ("UPLUS", INTRINSIC_UPLUS),
2342 minit ("UMINUS", INTRINSIC_UMINUS),
2343 minit ("PLUS", INTRINSIC_PLUS),
2344 minit ("MINUS", INTRINSIC_MINUS),
2345 minit ("TIMES", INTRINSIC_TIMES),
2346 minit ("DIVIDE", INTRINSIC_DIVIDE),
2347 minit ("POWER", INTRINSIC_POWER),
2348 minit ("CONCAT", INTRINSIC_CONCAT),
2349 minit ("AND", INTRINSIC_AND),
2350 minit ("OR", INTRINSIC_OR),
2351 minit ("EQV", INTRINSIC_EQV),
2352 minit ("NEQV", INTRINSIC_NEQV),
2353 minit ("EQ", INTRINSIC_EQ),
2354 minit ("NE", INTRINSIC_NE),
2355 minit ("GT", INTRINSIC_GT),
2356 minit ("GE", INTRINSIC_GE),
2357 minit ("LT", INTRINSIC_LT),
2358 minit ("LE", INTRINSIC_LE),
2359 minit ("NOT", INTRINSIC_NOT),
2360 minit (NULL, -1)
2363 /* Read and write expressions. The form "()" is allowed to indicate a
2364 NULL expression. */
2366 static void
2367 mio_expr (gfc_expr ** ep)
2369 gfc_expr *e;
2370 atom_type t;
2371 int flag;
2373 mio_lparen ();
2375 if (iomode == IO_OUTPUT)
2377 if (*ep == NULL)
2379 mio_rparen ();
2380 return;
2383 e = *ep;
2384 MIO_NAME(expr_t) (e->expr_type, expr_types);
2387 else
2389 t = parse_atom ();
2390 if (t == ATOM_RPAREN)
2392 *ep = NULL;
2393 return;
2396 if (t != ATOM_NAME)
2397 bad_module ("Expected expression type");
2399 e = *ep = gfc_get_expr ();
2400 e->where = gfc_current_locus;
2401 e->expr_type = (expr_t) find_enum (expr_types);
2404 mio_typespec (&e->ts);
2405 mio_integer (&e->rank);
2407 switch (e->expr_type)
2409 case EXPR_OP:
2410 e->operator = MIO_NAME(gfc_intrinsic_op) (e->operator, intrinsics);
2412 switch (e->operator)
2414 case INTRINSIC_UPLUS:
2415 case INTRINSIC_UMINUS:
2416 case INTRINSIC_NOT:
2417 mio_expr (&e->op1);
2418 break;
2420 case INTRINSIC_PLUS:
2421 case INTRINSIC_MINUS:
2422 case INTRINSIC_TIMES:
2423 case INTRINSIC_DIVIDE:
2424 case INTRINSIC_POWER:
2425 case INTRINSIC_CONCAT:
2426 case INTRINSIC_AND:
2427 case INTRINSIC_OR:
2428 case INTRINSIC_EQV:
2429 case INTRINSIC_NEQV:
2430 case INTRINSIC_EQ:
2431 case INTRINSIC_NE:
2432 case INTRINSIC_GT:
2433 case INTRINSIC_GE:
2434 case INTRINSIC_LT:
2435 case INTRINSIC_LE:
2436 mio_expr (&e->op1);
2437 mio_expr (&e->op2);
2438 break;
2440 default:
2441 bad_module ("Bad operator");
2444 break;
2446 case EXPR_FUNCTION:
2447 mio_symtree_ref (&e->symtree);
2448 mio_actual_arglist (&e->value.function.actual);
2450 if (iomode == IO_OUTPUT)
2452 mio_allocated_string (&e->value.function.name);
2453 flag = e->value.function.esym != NULL;
2454 mio_integer (&flag);
2455 if (flag)
2456 mio_symbol_ref (&e->value.function.esym);
2457 else
2458 write_atom (ATOM_STRING, e->value.function.isym->name);
2461 else
2463 require_atom (ATOM_STRING);
2464 e->value.function.name = gfc_get_string (atom_string);
2465 gfc_free (atom_string);
2467 mio_integer (&flag);
2468 if (flag)
2469 mio_symbol_ref (&e->value.function.esym);
2470 else
2472 require_atom (ATOM_STRING);
2473 e->value.function.isym = gfc_find_function (atom_string);
2474 gfc_free (atom_string);
2478 break;
2480 case EXPR_VARIABLE:
2481 mio_symtree_ref (&e->symtree);
2482 mio_ref_list (&e->ref);
2483 break;
2485 case EXPR_SUBSTRING:
2486 mio_allocated_string (&e->value.character.string);
2487 mio_expr (&e->op1);
2488 mio_expr (&e->op2);
2489 break;
2491 case EXPR_STRUCTURE:
2492 case EXPR_ARRAY:
2493 mio_constructor (&e->value.constructor);
2494 mio_shape (&e->shape, e->rank);
2495 break;
2497 case EXPR_CONSTANT:
2498 switch (e->ts.type)
2500 case BT_INTEGER:
2501 mio_gmp_integer (&e->value.integer);
2502 break;
2504 case BT_REAL:
2505 gfc_set_model_kind (e->ts.kind);
2506 mio_gmp_real (&e->value.real);
2507 break;
2509 case BT_COMPLEX:
2510 gfc_set_model_kind (e->ts.kind);
2511 mio_gmp_real (&e->value.complex.r);
2512 mio_gmp_real (&e->value.complex.i);
2513 break;
2515 case BT_LOGICAL:
2516 mio_integer (&e->value.logical);
2517 break;
2519 case BT_CHARACTER:
2520 mio_integer (&e->value.character.length);
2521 mio_allocated_string (&e->value.character.string);
2522 break;
2524 default:
2525 bad_module ("Bad type in constant expression");
2528 break;
2530 case EXPR_NULL:
2531 break;
2534 mio_rparen ();
2538 /* Save/restore lists of gfc_interface stuctures. When loading an
2539 interface, we are really appending to the existing list of
2540 interfaces. Checking for duplicate and ambiguous interfaces has to
2541 be done later when all symbols have been loaded. */
2543 static void
2544 mio_interface_rest (gfc_interface ** ip)
2546 gfc_interface *tail, *p;
2548 if (iomode == IO_OUTPUT)
2550 if (ip != NULL)
2551 for (p = *ip; p; p = p->next)
2552 mio_symbol_ref (&p->sym);
2554 else
2557 if (*ip == NULL)
2558 tail = NULL;
2559 else
2561 tail = *ip;
2562 while (tail->next)
2563 tail = tail->next;
2566 for (;;)
2568 if (peek_atom () == ATOM_RPAREN)
2569 break;
2571 p = gfc_get_interface ();
2572 p->where = gfc_current_locus;
2573 mio_symbol_ref (&p->sym);
2575 if (tail == NULL)
2576 *ip = p;
2577 else
2578 tail->next = p;
2580 tail = p;
2584 mio_rparen ();
2588 /* Save/restore a nameless operator interface. */
2590 static void
2591 mio_interface (gfc_interface ** ip)
2594 mio_lparen ();
2595 mio_interface_rest (ip);
2599 /* Save/restore a named operator interface. */
2601 static void
2602 mio_symbol_interface (char *name, char *module,
2603 gfc_interface ** ip)
2606 mio_lparen ();
2608 mio_internal_string (name);
2609 mio_internal_string (module);
2611 mio_interface_rest (ip);
2615 static void
2616 mio_namespace_ref (gfc_namespace ** nsp)
2618 gfc_namespace *ns;
2619 pointer_info *p;
2621 p = mio_pointer_ref (nsp);
2623 if (p->type == P_UNKNOWN)
2624 p->type = P_NAMESPACE;
2626 if (iomode == IO_INPUT && p->integer != 0)
2628 ns = (gfc_namespace *)p->u.pointer;
2629 if (ns == NULL)
2631 ns = gfc_get_namespace (NULL);
2632 associate_integer_pointer (p, ns);
2634 else
2635 ns->refs++;
2640 /* Unlike most other routines, the address of the symbol node is
2641 already fixed on input and the name/module has already been filled
2642 in. */
2644 static void
2645 mio_symbol (gfc_symbol * sym)
2647 gfc_formal_arglist *formal;
2649 mio_lparen ();
2651 mio_symbol_attribute (&sym->attr);
2652 mio_typespec (&sym->ts);
2654 /* Contained procedures don't have formal namespaces. Instead we output the
2655 procedure namespace. The will contain the formal arguments. */
2656 if (iomode == IO_OUTPUT)
2658 formal = sym->formal;
2659 while (formal && !formal->sym)
2660 formal = formal->next;
2662 if (formal)
2663 mio_namespace_ref (&formal->sym->ns);
2664 else
2665 mio_namespace_ref (&sym->formal_ns);
2667 else
2669 mio_namespace_ref (&sym->formal_ns);
2670 if (sym->formal_ns)
2672 sym->formal_ns->proc_name = sym;
2673 sym->refs++;
2677 /* Save/restore common block links */
2678 mio_symbol_ref (&sym->common_next);
2680 mio_formal_arglist (sym);
2682 if (sym->attr.flavor == FL_PARAMETER)
2683 mio_expr (&sym->value);
2685 mio_array_spec (&sym->as);
2687 mio_symbol_ref (&sym->result);
2689 /* Note that components are always saved, even if they are supposed
2690 to be private. Component access is checked during searching. */
2692 mio_component_list (&sym->components);
2694 if (sym->components != NULL)
2695 sym->component_access =
2696 MIO_NAME(gfc_access) (sym->component_access, access_types);
2698 mio_rparen ();
2702 /************************* Top level subroutines *************************/
2704 /* Skip a list between balanced left and right parens. */
2706 static void
2707 skip_list (void)
2709 int level;
2711 level = 0;
2714 switch (parse_atom ())
2716 case ATOM_LPAREN:
2717 level++;
2718 break;
2720 case ATOM_RPAREN:
2721 level--;
2722 break;
2724 case ATOM_STRING:
2725 gfc_free (atom_string);
2726 break;
2728 case ATOM_NAME:
2729 case ATOM_INTEGER:
2730 break;
2733 while (level > 0);
2737 /* Load operator interfaces from the module. Interfaces are unusual
2738 in that they attach themselves to existing symbols. */
2740 static void
2741 load_operator_interfaces (void)
2743 const char *p;
2744 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2745 gfc_user_op *uop;
2747 mio_lparen ();
2749 while (peek_atom () != ATOM_RPAREN)
2751 mio_lparen ();
2753 mio_internal_string (name);
2754 mio_internal_string (module);
2756 /* Decide if we need to load this one or not. */
2757 p = find_use_name (name);
2758 if (p == NULL)
2760 while (parse_atom () != ATOM_RPAREN);
2762 else
2764 uop = gfc_get_uop (p);
2765 mio_interface_rest (&uop->operator);
2769 mio_rparen ();
2773 /* Load interfaces from the module. Interfaces are unusual in that
2774 they attach themselves to existing symbols. */
2776 static void
2777 load_generic_interfaces (void)
2779 const char *p;
2780 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2781 gfc_symbol *sym;
2783 mio_lparen ();
2785 while (peek_atom () != ATOM_RPAREN)
2787 mio_lparen ();
2789 mio_internal_string (name);
2790 mio_internal_string (module);
2792 /* Decide if we need to load this one or not. */
2793 p = find_use_name (name);
2795 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2797 while (parse_atom () != ATOM_RPAREN);
2798 continue;
2801 if (sym == NULL)
2803 gfc_get_symbol (p, NULL, &sym);
2805 sym->attr.flavor = FL_PROCEDURE;
2806 sym->attr.generic = 1;
2807 sym->attr.use_assoc = 1;
2810 mio_interface_rest (&sym->generic);
2813 mio_rparen ();
2817 /* Load common blocks. */
2819 static void
2820 load_commons(void)
2822 char name[GFC_MAX_SYMBOL_LEN+1];
2823 gfc_common_head *p;
2825 mio_lparen ();
2827 while (peek_atom () != ATOM_RPAREN)
2829 mio_lparen ();
2830 mio_internal_string (name);
2832 p = gfc_get_common (name, 1);
2834 mio_symbol_ref (&p->head);
2835 mio_integer (&p->saved);
2836 p->use_assoc = 1;
2838 mio_rparen();
2841 mio_rparen();
2845 /* Recursive function to traverse the pointer_info tree and load a
2846 needed symbol. We return nonzero if we load a symbol and stop the
2847 traversal, because the act of loading can alter the tree. */
2849 static int
2850 load_needed (pointer_info * p)
2852 gfc_namespace *ns;
2853 pointer_info *q;
2854 gfc_symbol *sym;
2856 if (p == NULL)
2857 return 0;
2858 if (load_needed (p->left))
2859 return 1;
2860 if (load_needed (p->right))
2861 return 1;
2863 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
2864 return 0;
2866 p->u.rsym.state = USED;
2868 set_module_locus (&p->u.rsym.where);
2870 sym = p->u.rsym.sym;
2871 if (sym == NULL)
2873 q = get_integer (p->u.rsym.ns);
2875 ns = (gfc_namespace *) q->u.pointer;
2876 if (ns == NULL)
2878 /* Create an interface namespace if necessary. These are
2879 the namespaces that hold the formal parameters of module
2880 procedures. */
2882 ns = gfc_get_namespace (NULL);
2883 associate_integer_pointer (q, ns);
2886 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
2887 strcpy (sym->module, p->u.rsym.module);
2889 associate_integer_pointer (p, sym);
2892 mio_symbol (sym);
2893 sym->attr.use_assoc = 1;
2895 return 1;
2899 /* Recursive function for cleaning up things after a module has been
2900 read. */
2902 static void
2903 read_cleanup (pointer_info * p)
2905 gfc_symtree *st;
2906 pointer_info *q;
2908 if (p == NULL)
2909 return;
2911 read_cleanup (p->left);
2912 read_cleanup (p->right);
2914 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
2916 /* Add hidden symbols to the symtree. */
2917 q = get_integer (p->u.rsym.ns);
2918 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
2920 st->n.sym = p->u.rsym.sym;
2921 st->n.sym->refs++;
2923 /* Fixup any symtree references. */
2924 p->u.rsym.symtree = st;
2925 resolve_fixups (p->u.rsym.stfixup, st);
2926 p->u.rsym.stfixup = NULL;
2929 /* Free unused symbols. */
2930 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
2931 gfc_free_symbol (p->u.rsym.sym);
2935 /* Read a module file. */
2937 static void
2938 read_module (void)
2940 module_locus operator_interfaces, user_operators;
2941 const char *p;
2942 char name[GFC_MAX_SYMBOL_LEN + 1];
2943 gfc_intrinsic_op i;
2944 int ambiguous, symbol;
2945 pointer_info *info;
2946 gfc_use_rename *u;
2947 gfc_symtree *st;
2948 gfc_symbol *sym;
2950 get_module_locus (&operator_interfaces); /* Skip these for now */
2951 skip_list ();
2953 get_module_locus (&user_operators);
2954 skip_list ();
2955 skip_list ();
2956 skip_list ();
2958 mio_lparen ();
2960 /* Create the fixup nodes for all the symbols. */
2962 while (peek_atom () != ATOM_RPAREN)
2964 require_atom (ATOM_INTEGER);
2965 info = get_integer (atom_int);
2967 info->type = P_SYMBOL;
2968 info->u.rsym.state = UNUSED;
2970 mio_internal_string (info->u.rsym.true_name);
2971 mio_internal_string (info->u.rsym.module);
2973 require_atom (ATOM_INTEGER);
2974 info->u.rsym.ns = atom_int;
2976 get_module_locus (&info->u.rsym.where);
2977 skip_list ();
2979 /* See if the symbol has already been loaded by a previous module.
2980 If so, we reference the existing symbol and prevent it from
2981 being loaded again. */
2983 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
2984 if (sym == NULL)
2985 continue;
2987 info->u.rsym.state = USED;
2988 info->u.rsym.referenced = 1;
2989 info->u.rsym.sym = sym;
2992 mio_rparen ();
2994 /* Parse the symtree lists. This lets us mark which symbols need to
2995 be loaded. Renaming is also done at this point by replacing the
2996 symtree name. */
2998 mio_lparen ();
3000 while (peek_atom () != ATOM_RPAREN)
3002 mio_internal_string (name);
3003 mio_integer (&ambiguous);
3004 mio_integer (&symbol);
3006 info = get_integer (symbol);
3008 /* Get the local name for this symbol. */
3009 p = find_use_name (name);
3011 /* Skip symtree nodes not in an ONLY caluse. */
3012 if (p == NULL)
3013 continue;
3015 /* Check for ambiguous symbols. */
3016 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3018 if (st != NULL)
3020 if (st->n.sym != info->u.rsym.sym)
3021 st->ambiguous = 1;
3022 info->u.rsym.symtree = st;
3024 else
3026 /* Create a symtree node in the current namespace for this symbol. */
3027 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3028 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3030 st->ambiguous = ambiguous;
3032 sym = info->u.rsym.sym;
3034 /* Create a symbol node if it doesn't already exist. */
3035 if (sym == NULL)
3037 sym = info->u.rsym.sym =
3038 gfc_new_symbol (info->u.rsym.true_name, gfc_current_ns);
3040 strcpy (sym->module, info->u.rsym.module);
3043 st->n.sym = sym;
3044 st->n.sym->refs++;
3046 /* Store the symtree pointing to this symbol. */
3047 info->u.rsym.symtree = st;
3049 if (info->u.rsym.state == UNUSED)
3050 info->u.rsym.state = NEEDED;
3051 info->u.rsym.referenced = 1;
3055 mio_rparen ();
3057 /* Load intrinsic operator interfaces. */
3058 set_module_locus (&operator_interfaces);
3059 mio_lparen ();
3061 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3063 if (i == INTRINSIC_USER)
3064 continue;
3066 if (only_flag)
3068 u = find_use_operator (i);
3070 if (u == NULL)
3072 skip_list ();
3073 continue;
3076 u->found = 1;
3079 mio_interface (&gfc_current_ns->operator[i]);
3082 mio_rparen ();
3084 /* Load generic and user operator interfaces. These must follow the
3085 loading of symtree because otherwise symbols can be marked as
3086 ambiguous. */
3088 set_module_locus (&user_operators);
3090 load_operator_interfaces ();
3091 load_generic_interfaces ();
3093 load_commons ();
3095 /* At this point, we read those symbols that are needed but haven't
3096 been loaded yet. If one symbol requires another, the other gets
3097 marked as NEEDED if its previous state was UNUSED. */
3099 while (load_needed (pi_root));
3101 /* Make sure all elements of the rename-list were found in the
3102 module. */
3104 for (u = gfc_rename_list; u; u = u->next)
3106 if (u->found)
3107 continue;
3109 if (u->operator == INTRINSIC_NONE)
3111 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3112 u->use_name, &u->where, module_name);
3113 continue;
3116 if (u->operator == INTRINSIC_USER)
3118 gfc_error
3119 ("User operator '%s' referenced at %L not found in module '%s'",
3120 u->use_name, &u->where, module_name);
3121 continue;
3124 gfc_error
3125 ("Intrinsic operator '%s' referenced at %L not found in module "
3126 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3129 gfc_check_interfaces (gfc_current_ns);
3131 /* Clean up symbol nodes that were never loaded, create references
3132 to hidden symbols. */
3134 read_cleanup (pi_root);
3138 /* Given an access type that is specific to an entity and the default
3139 access, return nonzero if we should write the entity. */
3141 static int
3142 check_access (gfc_access specific_access, gfc_access default_access)
3145 if (specific_access == ACCESS_PUBLIC)
3146 return 1;
3147 if (specific_access == ACCESS_PRIVATE)
3148 return 0;
3150 if (gfc_option.flag_module_access_private)
3152 if (default_access == ACCESS_PUBLIC)
3153 return 1;
3155 else
3157 if (default_access != ACCESS_PRIVATE)
3158 return 1;
3161 return 0;
3165 /* Write a common block to the module */
3167 static void
3168 write_common (gfc_symtree *st)
3170 gfc_common_head *p;
3172 if (st == NULL)
3173 return;
3175 write_common(st->left);
3176 write_common(st->right);
3178 mio_lparen();
3179 mio_internal_string(st->name);
3181 p = st->n.common;
3182 mio_symbol_ref(&p->head);
3183 mio_integer(&p->saved);
3185 mio_rparen();
3189 /* Write a symbol to the module. */
3191 static void
3192 write_symbol (int n, gfc_symbol * sym)
3195 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3196 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3198 mio_integer (&n);
3199 mio_internal_string (sym->name);
3201 mio_internal_string (sym->module);
3202 mio_pointer_ref (&sym->ns);
3204 mio_symbol (sym);
3205 write_char ('\n');
3209 /* Recursive traversal function to write the initial set of symbols to
3210 the module. We check to see if the symbol should be written
3211 according to the access specification. */
3213 static void
3214 write_symbol0 (gfc_symtree * st)
3216 gfc_symbol *sym;
3217 pointer_info *p;
3219 if (st == NULL)
3220 return;
3222 write_symbol0 (st->left);
3223 write_symbol0 (st->right);
3225 sym = st->n.sym;
3226 if (sym->module[0] == '\0')
3227 strcpy (sym->module, module_name);
3229 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3230 && !sym->attr.subroutine && !sym->attr.function)
3231 return;
3233 if (!check_access (sym->attr.access, sym->ns->default_access))
3234 return;
3236 p = get_pointer (sym);
3237 if (p->type == P_UNKNOWN)
3238 p->type = P_SYMBOL;
3240 if (p->u.wsym.state == WRITTEN)
3241 return;
3243 write_symbol (p->integer, sym);
3244 p->u.wsym.state = WRITTEN;
3246 return;
3250 /* Recursive traversal function to write the secondary set of symbols
3251 to the module file. These are symbols that were not public yet are
3252 needed by the public symbols or another dependent symbol. The act
3253 of writing a symbol can modify the pointer_info tree, so we cease
3254 traversal if we find a symbol to write. We return nonzero if a
3255 symbol was written and pass that information upwards. */
3257 static int
3258 write_symbol1 (pointer_info * p)
3261 if (p == NULL)
3262 return 0;
3264 if (write_symbol1 (p->left))
3265 return 1;
3266 if (write_symbol1 (p->right))
3267 return 1;
3269 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3270 return 0;
3272 /* FIXME: This shouldn't be necessary, but it works around
3273 deficiencies in the module loader or/and symbol handling. */
3274 if (p->u.wsym.sym->module[0] == '\0' && p->u.wsym.sym->attr.dummy)
3275 strcpy (p->u.wsym.sym->module, module_name);
3277 p->u.wsym.state = WRITTEN;
3278 write_symbol (p->integer, p->u.wsym.sym);
3280 return 1;
3284 /* Write operator interfaces associated with a symbol. */
3286 static void
3287 write_operator (gfc_user_op * uop)
3289 static char nullstring[] = "";
3291 if (uop->operator == NULL
3292 || !check_access (uop->access, uop->ns->default_access))
3293 return;
3295 mio_symbol_interface (uop->name, nullstring, &uop->operator);
3299 /* Write generic interfaces associated with a symbol. */
3301 static void
3302 write_generic (gfc_symbol * sym)
3305 if (sym->generic == NULL
3306 || !check_access (sym->attr.access, sym->ns->default_access))
3307 return;
3309 mio_symbol_interface (sym->name, sym->module, &sym->generic);
3313 static void
3314 write_symtree (gfc_symtree * st)
3316 gfc_symbol *sym;
3317 pointer_info *p;
3319 sym = st->n.sym;
3320 if (!check_access (sym->attr.access, sym->ns->default_access)
3321 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3322 && !sym->attr.subroutine && !sym->attr.function))
3323 return;
3325 if (check_unique_name (st->name))
3326 return;
3328 p = find_pointer (sym);
3329 if (p == NULL)
3330 gfc_internal_error ("write_symtree(): Symbol not written");
3332 mio_internal_string (st->name);
3333 mio_integer (&st->ambiguous);
3334 mio_integer (&p->integer);
3338 static void
3339 write_module (void)
3341 gfc_intrinsic_op i;
3343 /* Write the operator interfaces. */
3344 mio_lparen ();
3346 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3348 if (i == INTRINSIC_USER)
3349 continue;
3351 mio_interface (check_access (gfc_current_ns->operator_access[i],
3352 gfc_current_ns->default_access)
3353 ? &gfc_current_ns->operator[i] : NULL);
3356 mio_rparen ();
3357 write_char ('\n');
3358 write_char ('\n');
3360 mio_lparen ();
3361 gfc_traverse_user_op (gfc_current_ns, write_operator);
3362 mio_rparen ();
3363 write_char ('\n');
3364 write_char ('\n');
3366 mio_lparen ();
3367 gfc_traverse_ns (gfc_current_ns, write_generic);
3368 mio_rparen ();
3369 write_char ('\n');
3370 write_char ('\n');
3372 mio_lparen ();
3373 write_common (gfc_current_ns->common_root);
3374 mio_rparen ();
3375 write_char ('\n');
3376 write_char ('\n');
3378 /* Write symbol information. First we traverse all symbols in the
3379 primary namespace, writing those that need to be written.
3380 Sometimes writing one symbol will cause another to need to be
3381 written. A list of these symbols ends up on the write stack, and
3382 we end by popping the bottom of the stack and writing the symbol
3383 until the stack is empty. */
3385 mio_lparen ();
3387 write_symbol0 (gfc_current_ns->sym_root);
3388 while (write_symbol1 (pi_root));
3390 mio_rparen ();
3392 write_char ('\n');
3393 write_char ('\n');
3395 mio_lparen ();
3396 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3397 mio_rparen ();
3401 /* Given module, dump it to disk. If there was an error while
3402 processing the module, dump_flag will be set to zero and we delete
3403 the module file, even if it was already there. */
3405 void
3406 gfc_dump_module (const char *name, int dump_flag)
3408 char filename[PATH_MAX], *p;
3409 time_t now;
3411 filename[0] = '\0';
3412 if (gfc_option.module_dir != NULL)
3413 strcpy (filename, gfc_option.module_dir);
3415 strcat (filename, name);
3416 strcat (filename, MODULE_EXTENSION);
3418 if (!dump_flag)
3420 unlink (filename);
3421 return;
3424 module_fp = fopen (filename, "w");
3425 if (module_fp == NULL)
3426 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3427 filename, strerror (errno));
3429 now = time (NULL);
3430 p = ctime (&now);
3432 *strchr (p, '\n') = '\0';
3434 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3435 gfc_source_file, p);
3436 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3438 iomode = IO_OUTPUT;
3439 strcpy (module_name, name);
3441 init_pi_tree ();
3443 write_module ();
3445 free_pi_tree (pi_root);
3446 pi_root = NULL;
3448 write_char ('\n');
3450 if (fclose (module_fp))
3451 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3452 filename, strerror (errno));
3456 /* Process a USE directive. */
3458 void
3459 gfc_use_module (void)
3461 char filename[GFC_MAX_SYMBOL_LEN + 5];
3462 gfc_state_data *p;
3463 int c, line;
3465 strcpy (filename, module_name);
3466 strcat (filename, MODULE_EXTENSION);
3468 module_fp = gfc_open_included_file (filename);
3469 if (module_fp == NULL)
3470 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3471 filename, strerror (errno));
3473 iomode = IO_INPUT;
3474 module_line = 1;
3475 module_column = 1;
3477 /* Skip the first two lines of the module. */
3478 /* FIXME: Could also check for valid two lines here, instead. */
3479 line = 0;
3480 while (line < 2)
3482 c = module_char ();
3483 if (c == EOF)
3484 bad_module ("Unexpected end of module");
3485 if (c == '\n')
3486 line++;
3489 /* Make sure we're not reading the same module that we may be building. */
3490 for (p = gfc_state_stack; p; p = p->previous)
3491 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3492 gfc_fatal_error ("Can't USE the same module we're building!");
3494 init_pi_tree ();
3495 init_true_name_tree ();
3497 read_module ();
3499 free_true_name (true_name_root);
3500 true_name_root = NULL;
3502 free_pi_tree (pi_root);
3503 pi_root = NULL;
3505 fclose (module_fp);
3509 void
3510 gfc_module_init_2 (void)
3513 last_atom = ATOM_LPAREN;
3517 void
3518 gfc_module_done_2 (void)
3521 free_rename ();