PR middle-end/30262
[official-gcc.git] / gcc / fortran / module.c
blobf54ef8e67cd0a460e12126f10a4f641808f0b295
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
4 Software Foundation, Inc.
5 Contributed by Andy Vaught
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
24 /* The syntax of gfortran modules resembles that of lisp lists, ie a
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
39 ...
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42 ...
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45 ...
47 ( ( <common name> <symbol> <saved flag>)
48 ...
51 ( equivalence list )
53 ( <Symbol Number (in no particular order)>
54 <True name of symbol>
55 <Module name of symbol>
56 ( <symbol information> )
57 ...
59 ( <Symtree name>
60 <Ambiguous flag>
61 <Symbol number>
62 ...
65 In general, symbols refer to other symbols by their symbol number,
66 which are zero based. Symbols are written to the module in no
67 particular order. */
69 #include "config.h"
70 #include "system.h"
71 #include "gfortran.h"
72 #include "arith.h"
73 #include "match.h"
74 #include "parse.h" /* FIXME */
76 #define MODULE_EXTENSION ".mod"
79 /* Structure that describes a position within a module file. */
81 typedef struct
83 int column, line;
84 fpos_t pos;
86 module_locus;
89 typedef enum
91 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
93 pointer_t;
95 /* The fixup structure lists pointers to pointers that have to
96 be updated when a pointer value becomes known. */
98 typedef struct fixup_t
100 void **pointer;
101 struct fixup_t *next;
103 fixup_t;
106 /* Structure for holding extra info needed for pointers being read. */
108 typedef struct pointer_info
110 BBT_HEADER (pointer_info);
111 int integer;
112 pointer_t type;
114 /* The first component of each member of the union is the pointer
115 being stored. */
117 fixup_t *fixup;
119 union
121 void *pointer; /* Member for doing pointer searches. */
123 struct
125 gfc_symbol *sym;
126 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
127 enum
128 { UNUSED, NEEDED, USED }
129 state;
130 int ns, referenced;
131 module_locus where;
132 fixup_t *stfixup;
133 gfc_symtree *symtree;
135 rsym;
137 struct
139 gfc_symbol *sym;
140 enum
141 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
142 state;
144 wsym;
149 pointer_info;
151 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
154 /* Lists of rename info for the USE statement. */
156 typedef struct gfc_use_rename
158 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
159 struct gfc_use_rename *next;
160 int found;
161 gfc_intrinsic_op operator;
162 locus where;
164 gfc_use_rename;
166 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
168 /* Local variables */
170 /* The FILE for the module we're reading or writing. */
171 static FILE *module_fp;
173 /* The name of the module we're reading (USE'ing) or writing. */
174 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
176 /* The way the module we're reading was specified. */
177 static bool specified_nonint, specified_int;
179 static int module_line, module_column, only_flag;
180 static enum
181 { IO_INPUT, IO_OUTPUT }
182 iomode;
184 static gfc_use_rename *gfc_rename_list;
185 static pointer_info *pi_root;
186 static int symbol_number; /* Counter for assigning symbol numbers */
188 /* Tells mio_expr_ref not to load unused equivalence members. */
189 static bool in_load_equiv;
193 /*****************************************************************/
195 /* Pointer/integer conversion. Pointers between structures are stored
196 as integers in the module file. The next couple of subroutines
197 handle this translation for reading and writing. */
199 /* Recursively free the tree of pointer structures. */
201 static void
202 free_pi_tree (pointer_info * p)
204 if (p == NULL)
205 return;
207 if (p->fixup != NULL)
208 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
210 free_pi_tree (p->left);
211 free_pi_tree (p->right);
213 gfc_free (p);
217 /* Compare pointers when searching by pointer. Used when writing a
218 module. */
220 static int
221 compare_pointers (void * _sn1, void * _sn2)
223 pointer_info *sn1, *sn2;
225 sn1 = (pointer_info *) _sn1;
226 sn2 = (pointer_info *) _sn2;
228 if (sn1->u.pointer < sn2->u.pointer)
229 return -1;
230 if (sn1->u.pointer > sn2->u.pointer)
231 return 1;
233 return 0;
237 /* Compare integers when searching by integer. Used when reading a
238 module. */
240 static int
241 compare_integers (void * _sn1, void * _sn2)
243 pointer_info *sn1, *sn2;
245 sn1 = (pointer_info *) _sn1;
246 sn2 = (pointer_info *) _sn2;
248 if (sn1->integer < sn2->integer)
249 return -1;
250 if (sn1->integer > sn2->integer)
251 return 1;
253 return 0;
257 /* Initialize the pointer_info tree. */
259 static void
260 init_pi_tree (void)
262 compare_fn compare;
263 pointer_info *p;
265 pi_root = NULL;
266 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
268 /* Pointer 0 is the NULL pointer. */
269 p = gfc_get_pointer_info ();
270 p->u.pointer = NULL;
271 p->integer = 0;
272 p->type = P_OTHER;
274 gfc_insert_bbt (&pi_root, p, compare);
276 /* Pointer 1 is the current namespace. */
277 p = gfc_get_pointer_info ();
278 p->u.pointer = gfc_current_ns;
279 p->integer = 1;
280 p->type = P_NAMESPACE;
282 gfc_insert_bbt (&pi_root, p, compare);
284 symbol_number = 2;
288 /* During module writing, call here with a pointer to something,
289 returning the pointer_info node. */
291 static pointer_info *
292 find_pointer (void *gp)
294 pointer_info *p;
296 p = pi_root;
297 while (p != NULL)
299 if (p->u.pointer == gp)
300 break;
301 p = (gp < p->u.pointer) ? p->left : p->right;
304 return p;
308 /* Given a pointer while writing, returns the pointer_info tree node,
309 creating it if it doesn't exist. */
311 static pointer_info *
312 get_pointer (void *gp)
314 pointer_info *p;
316 p = find_pointer (gp);
317 if (p != NULL)
318 return p;
320 /* Pointer doesn't have an integer. Give it one. */
321 p = gfc_get_pointer_info ();
323 p->u.pointer = gp;
324 p->integer = symbol_number++;
326 gfc_insert_bbt (&pi_root, p, compare_pointers);
328 return p;
332 /* Given an integer during reading, find it in the pointer_info tree,
333 creating the node if not found. */
335 static pointer_info *
336 get_integer (int integer)
338 pointer_info *p, t;
339 int c;
341 t.integer = integer;
343 p = pi_root;
344 while (p != NULL)
346 c = compare_integers (&t, p);
347 if (c == 0)
348 break;
350 p = (c < 0) ? p->left : p->right;
353 if (p != NULL)
354 return p;
356 p = gfc_get_pointer_info ();
357 p->integer = integer;
358 p->u.pointer = NULL;
360 gfc_insert_bbt (&pi_root, p, compare_integers);
362 return p;
366 /* Recursive function to find a pointer within a tree by brute force. */
368 static pointer_info *
369 fp2 (pointer_info * p, const void *target)
371 pointer_info *q;
373 if (p == NULL)
374 return NULL;
376 if (p->u.pointer == target)
377 return p;
379 q = fp2 (p->left, target);
380 if (q != NULL)
381 return q;
383 return fp2 (p->right, target);
387 /* During reading, find a pointer_info node from the pointer value.
388 This amounts to a brute-force search. */
390 static pointer_info *
391 find_pointer2 (void *p)
394 return fp2 (pi_root, p);
398 /* Resolve any fixups using a known pointer. */
399 static void
400 resolve_fixups (fixup_t *f, void * gp)
402 fixup_t *next;
404 for (; f; f = next)
406 next = f->next;
407 *(f->pointer) = gp;
408 gfc_free (f);
412 /* Call here during module reading when we know what pointer to
413 associate with an integer. Any fixups that exist are resolved at
414 this time. */
416 static void
417 associate_integer_pointer (pointer_info * p, void *gp)
419 if (p->u.pointer != NULL)
420 gfc_internal_error ("associate_integer_pointer(): Already associated");
422 p->u.pointer = gp;
424 resolve_fixups (p->fixup, gp);
426 p->fixup = NULL;
430 /* During module reading, given an integer and a pointer to a pointer,
431 either store the pointer from an already-known value or create a
432 fixup structure in order to store things later. Returns zero if
433 the reference has been actually stored, or nonzero if the reference
434 must be fixed later (ie associate_integer_pointer must be called
435 sometime later. Returns the pointer_info structure. */
437 static pointer_info *
438 add_fixup (int integer, void *gp)
440 pointer_info *p;
441 fixup_t *f;
442 char **cp;
444 p = get_integer (integer);
446 if (p->integer == 0 || p->u.pointer != NULL)
448 cp = gp;
449 *cp = p->u.pointer;
451 else
453 f = gfc_getmem (sizeof (fixup_t));
455 f->next = p->fixup;
456 p->fixup = f;
458 f->pointer = gp;
461 return p;
465 /*****************************************************************/
467 /* Parser related subroutines */
469 /* Free the rename list left behind by a USE statement. */
471 static void
472 free_rename (void)
474 gfc_use_rename *next;
476 for (; gfc_rename_list; gfc_rename_list = next)
478 next = gfc_rename_list->next;
479 gfc_free (gfc_rename_list);
484 /* Match a USE statement. */
486 match
487 gfc_match_use (void)
489 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
490 gfc_use_rename *tail = NULL, *new;
491 interface_type type;
492 gfc_intrinsic_op operator;
493 match m;
495 specified_int = false;
496 specified_nonint = false;
498 if (gfc_match (" , ") == MATCH_YES)
500 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
502 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
503 "nature in USE statement at %C") == FAILURE)
504 return MATCH_ERROR;
506 if (strcmp (module_nature, "intrinsic") == 0)
507 specified_int = true;
508 else
510 if (strcmp (module_nature, "non_intrinsic") == 0)
511 specified_nonint = true;
512 else
514 gfc_error ("Module nature in USE statement at %C shall "
515 "be either INTRINSIC or NON_INTRINSIC");
516 return MATCH_ERROR;
520 else
522 /* Help output a better error message than "Unclassifiable
523 statement". */
524 gfc_match (" %n", module_nature);
525 if (strcmp (module_nature, "intrinsic") == 0
526 || strcmp (module_nature, "non_intrinsic") == 0)
527 gfc_error ("\"::\" was expected after module nature at %C "
528 "but was not found");
529 return m;
532 else
534 m = gfc_match (" ::");
535 if (m == MATCH_YES &&
536 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
537 "\"USE :: module\" at %C") == FAILURE)
538 return MATCH_ERROR;
540 if (m != MATCH_YES)
542 m = gfc_match ("% ");
543 if (m != MATCH_YES)
544 return m;
548 m = gfc_match_name (module_name);
549 if (m != MATCH_YES)
550 return m;
552 free_rename ();
553 only_flag = 0;
555 if (gfc_match_eos () == MATCH_YES)
556 return MATCH_YES;
557 if (gfc_match_char (',') != MATCH_YES)
558 goto syntax;
560 if (gfc_match (" only :") == MATCH_YES)
561 only_flag = 1;
563 if (gfc_match_eos () == MATCH_YES)
564 return MATCH_YES;
566 for (;;)
568 /* Get a new rename struct and add it to the rename list. */
569 new = gfc_get_use_rename ();
570 new->where = gfc_current_locus;
571 new->found = 0;
573 if (gfc_rename_list == NULL)
574 gfc_rename_list = new;
575 else
576 tail->next = new;
577 tail = new;
579 /* See what kind of interface we're dealing with. Assume it is
580 not an operator. */
581 new->operator = INTRINSIC_NONE;
582 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
583 goto cleanup;
585 switch (type)
587 case INTERFACE_NAMELESS:
588 gfc_error ("Missing generic specification in USE statement at %C");
589 goto cleanup;
591 case INTERFACE_GENERIC:
592 m = gfc_match (" =>");
594 if (only_flag)
596 if (m != MATCH_YES)
597 strcpy (new->use_name, name);
598 else
600 strcpy (new->local_name, name);
602 m = gfc_match_name (new->use_name);
603 if (m == MATCH_NO)
604 goto syntax;
605 if (m == MATCH_ERROR)
606 goto cleanup;
609 else
611 if (m != MATCH_YES)
612 goto syntax;
613 strcpy (new->local_name, name);
615 m = gfc_match_name (new->use_name);
616 if (m == MATCH_NO)
617 goto syntax;
618 if (m == MATCH_ERROR)
619 goto cleanup;
622 break;
624 case INTERFACE_USER_OP:
625 strcpy (new->use_name, name);
626 /* Fall through */
628 case INTERFACE_INTRINSIC_OP:
629 new->operator = operator;
630 break;
633 if (gfc_match_eos () == MATCH_YES)
634 break;
635 if (gfc_match_char (',') != MATCH_YES)
636 goto syntax;
639 return MATCH_YES;
641 syntax:
642 gfc_syntax_error (ST_USE);
644 cleanup:
645 free_rename ();
646 return MATCH_ERROR;
650 /* Given a name and a number, inst, return the inst name
651 under which to load this symbol. Returns NULL if this
652 symbol shouldn't be loaded. If inst is zero, returns
653 the number of instances of this name. */
655 static const char *
656 find_use_name_n (const char *name, int *inst)
658 gfc_use_rename *u;
659 int i;
661 i = 0;
662 for (u = gfc_rename_list; u; u = u->next)
664 if (strcmp (u->use_name, name) != 0)
665 continue;
666 if (++i == *inst)
667 break;
670 if (!*inst)
672 *inst = i;
673 return NULL;
676 if (u == NULL)
677 return only_flag ? NULL : name;
679 u->found = 1;
681 return (u->local_name[0] != '\0') ? u->local_name : name;
684 /* Given a name, return the name under which to load this symbol.
685 Returns NULL if this symbol shouldn't be loaded. */
687 static const char *
688 find_use_name (const char *name)
690 int i = 1;
691 return find_use_name_n (name, &i);
694 /* Given a real name, return the number of use names associated
695 with it. */
697 static int
698 number_use_names (const char *name)
700 int i = 0;
701 const char *c;
702 c = find_use_name_n (name, &i);
703 return i;
707 /* Try to find the operator in the current list. */
709 static gfc_use_rename *
710 find_use_operator (gfc_intrinsic_op operator)
712 gfc_use_rename *u;
714 for (u = gfc_rename_list; u; u = u->next)
715 if (u->operator == operator)
716 return u;
718 return NULL;
722 /*****************************************************************/
724 /* The next couple of subroutines maintain a tree used to avoid a
725 brute-force search for a combination of true name and module name.
726 While symtree names, the name that a particular symbol is known by
727 can changed with USE statements, we still have to keep track of the
728 true names to generate the correct reference, and also avoid
729 loading the same real symbol twice in a program unit.
731 When we start reading, the true name tree is built and maintained
732 as symbols are read. The tree is searched as we load new symbols
733 to see if it already exists someplace in the namespace. */
735 typedef struct true_name
737 BBT_HEADER (true_name);
738 gfc_symbol *sym;
740 true_name;
742 static true_name *true_name_root;
745 /* Compare two true_name structures. */
747 static int
748 compare_true_names (void * _t1, void * _t2)
750 true_name *t1, *t2;
751 int c;
753 t1 = (true_name *) _t1;
754 t2 = (true_name *) _t2;
756 c = ((t1->sym->module > t2->sym->module)
757 - (t1->sym->module < t2->sym->module));
758 if (c != 0)
759 return c;
761 return strcmp (t1->sym->name, t2->sym->name);
765 /* Given a true name, search the true name tree to see if it exists
766 within the main namespace. */
768 static gfc_symbol *
769 find_true_name (const char *name, const char *module)
771 true_name t, *p;
772 gfc_symbol sym;
773 int c;
775 sym.name = gfc_get_string (name);
776 if (module != NULL)
777 sym.module = gfc_get_string (module);
778 else
779 sym.module = NULL;
780 t.sym = &sym;
782 p = true_name_root;
783 while (p != NULL)
785 c = compare_true_names ((void *)(&t), (void *) p);
786 if (c == 0)
787 return p->sym;
789 p = (c < 0) ? p->left : p->right;
792 return NULL;
796 /* Given a gfc_symbol pointer that is not in the true name tree, add
797 it. */
799 static void
800 add_true_name (gfc_symbol * sym)
802 true_name *t;
804 t = gfc_getmem (sizeof (true_name));
805 t->sym = sym;
807 gfc_insert_bbt (&true_name_root, t, compare_true_names);
811 /* Recursive function to build the initial true name tree by
812 recursively traversing the current namespace. */
814 static void
815 build_tnt (gfc_symtree * st)
818 if (st == NULL)
819 return;
821 build_tnt (st->left);
822 build_tnt (st->right);
824 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
825 return;
827 add_true_name (st->n.sym);
831 /* Initialize the true name tree with the current namespace. */
833 static void
834 init_true_name_tree (void)
836 true_name_root = NULL;
838 build_tnt (gfc_current_ns->sym_root);
842 /* Recursively free a true name tree node. */
844 static void
845 free_true_name (true_name * t)
848 if (t == NULL)
849 return;
850 free_true_name (t->left);
851 free_true_name (t->right);
853 gfc_free (t);
857 /*****************************************************************/
859 /* Module reading and writing. */
861 typedef enum
863 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
865 atom_type;
867 static atom_type last_atom;
870 /* The name buffer must be at least as long as a symbol name. Right
871 now it's not clear how we're going to store numeric constants--
872 probably as a hexadecimal string, since this will allow the exact
873 number to be preserved (this can't be done by a decimal
874 representation). Worry about that later. TODO! */
876 #define MAX_ATOM_SIZE 100
878 static int atom_int;
879 static char *atom_string, atom_name[MAX_ATOM_SIZE];
882 /* Report problems with a module. Error reporting is not very
883 elaborate, since this sorts of errors shouldn't really happen.
884 This subroutine never returns. */
886 static void bad_module (const char *) ATTRIBUTE_NORETURN;
888 static void
889 bad_module (const char *msgid)
891 fclose (module_fp);
893 switch (iomode)
895 case IO_INPUT:
896 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
897 module_name, module_line, module_column, msgid);
898 break;
899 case IO_OUTPUT:
900 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
901 module_name, module_line, module_column, msgid);
902 break;
903 default:
904 gfc_fatal_error ("Module %s at line %d column %d: %s",
905 module_name, module_line, module_column, msgid);
906 break;
911 /* Set the module's input pointer. */
913 static void
914 set_module_locus (module_locus * m)
917 module_column = m->column;
918 module_line = m->line;
919 fsetpos (module_fp, &m->pos);
923 /* Get the module's input pointer so that we can restore it later. */
925 static void
926 get_module_locus (module_locus * m)
929 m->column = module_column;
930 m->line = module_line;
931 fgetpos (module_fp, &m->pos);
935 /* Get the next character in the module, updating our reckoning of
936 where we are. */
938 static int
939 module_char (void)
941 int c;
943 c = fgetc (module_fp);
945 if (c == EOF)
946 bad_module ("Unexpected EOF");
948 if (c == '\n')
950 module_line++;
951 module_column = 0;
954 module_column++;
955 return c;
959 /* Parse a string constant. The delimiter is guaranteed to be a
960 single quote. */
962 static void
963 parse_string (void)
965 module_locus start;
966 int len, c;
967 char *p;
969 get_module_locus (&start);
971 len = 0;
973 /* See how long the string is */
974 for ( ; ; )
976 c = module_char ();
977 if (c == EOF)
978 bad_module ("Unexpected end of module in string constant");
980 if (c != '\'')
982 len++;
983 continue;
986 c = module_char ();
987 if (c == '\'')
989 len++;
990 continue;
993 break;
996 set_module_locus (&start);
998 atom_string = p = gfc_getmem (len + 1);
1000 for (; len > 0; len--)
1002 c = module_char ();
1003 if (c == '\'')
1004 module_char (); /* Guaranteed to be another \' */
1005 *p++ = c;
1008 module_char (); /* Terminating \' */
1009 *p = '\0'; /* C-style string for debug purposes */
1013 /* Parse a small integer. */
1015 static void
1016 parse_integer (int c)
1018 module_locus m;
1020 atom_int = c - '0';
1022 for (;;)
1024 get_module_locus (&m);
1026 c = module_char ();
1027 if (!ISDIGIT (c))
1028 break;
1030 atom_int = 10 * atom_int + c - '0';
1031 if (atom_int > 99999999)
1032 bad_module ("Integer overflow");
1035 set_module_locus (&m);
1039 /* Parse a name. */
1041 static void
1042 parse_name (int c)
1044 module_locus m;
1045 char *p;
1046 int len;
1048 p = atom_name;
1050 *p++ = c;
1051 len = 1;
1053 get_module_locus (&m);
1055 for (;;)
1057 c = module_char ();
1058 if (!ISALNUM (c) && c != '_' && c != '-')
1059 break;
1061 *p++ = c;
1062 if (++len > GFC_MAX_SYMBOL_LEN)
1063 bad_module ("Name too long");
1066 *p = '\0';
1068 fseek (module_fp, -1, SEEK_CUR);
1069 module_column = m.column + len - 1;
1071 if (c == '\n')
1072 module_line--;
1076 /* Read the next atom in the module's input stream. */
1078 static atom_type
1079 parse_atom (void)
1081 int c;
1085 c = module_char ();
1087 while (c == ' ' || c == '\n');
1089 switch (c)
1091 case '(':
1092 return ATOM_LPAREN;
1094 case ')':
1095 return ATOM_RPAREN;
1097 case '\'':
1098 parse_string ();
1099 return ATOM_STRING;
1101 case '0':
1102 case '1':
1103 case '2':
1104 case '3':
1105 case '4':
1106 case '5':
1107 case '6':
1108 case '7':
1109 case '8':
1110 case '9':
1111 parse_integer (c);
1112 return ATOM_INTEGER;
1114 case 'a':
1115 case 'b':
1116 case 'c':
1117 case 'd':
1118 case 'e':
1119 case 'f':
1120 case 'g':
1121 case 'h':
1122 case 'i':
1123 case 'j':
1124 case 'k':
1125 case 'l':
1126 case 'm':
1127 case 'n':
1128 case 'o':
1129 case 'p':
1130 case 'q':
1131 case 'r':
1132 case 's':
1133 case 't':
1134 case 'u':
1135 case 'v':
1136 case 'w':
1137 case 'x':
1138 case 'y':
1139 case 'z':
1140 case 'A':
1141 case 'B':
1142 case 'C':
1143 case 'D':
1144 case 'E':
1145 case 'F':
1146 case 'G':
1147 case 'H':
1148 case 'I':
1149 case 'J':
1150 case 'K':
1151 case 'L':
1152 case 'M':
1153 case 'N':
1154 case 'O':
1155 case 'P':
1156 case 'Q':
1157 case 'R':
1158 case 'S':
1159 case 'T':
1160 case 'U':
1161 case 'V':
1162 case 'W':
1163 case 'X':
1164 case 'Y':
1165 case 'Z':
1166 parse_name (c);
1167 return ATOM_NAME;
1169 default:
1170 bad_module ("Bad name");
1173 /* Not reached */
1177 /* Peek at the next atom on the input. */
1179 static atom_type
1180 peek_atom (void)
1182 module_locus m;
1183 atom_type a;
1185 get_module_locus (&m);
1187 a = parse_atom ();
1188 if (a == ATOM_STRING)
1189 gfc_free (atom_string);
1191 set_module_locus (&m);
1192 return a;
1196 /* Read the next atom from the input, requiring that it be a
1197 particular kind. */
1199 static void
1200 require_atom (atom_type type)
1202 module_locus m;
1203 atom_type t;
1204 const char *p;
1206 get_module_locus (&m);
1208 t = parse_atom ();
1209 if (t != type)
1211 switch (type)
1213 case ATOM_NAME:
1214 p = _("Expected name");
1215 break;
1216 case ATOM_LPAREN:
1217 p = _("Expected left parenthesis");
1218 break;
1219 case ATOM_RPAREN:
1220 p = _("Expected right parenthesis");
1221 break;
1222 case ATOM_INTEGER:
1223 p = _("Expected integer");
1224 break;
1225 case ATOM_STRING:
1226 p = _("Expected string");
1227 break;
1228 default:
1229 gfc_internal_error ("require_atom(): bad atom type required");
1232 set_module_locus (&m);
1233 bad_module (p);
1238 /* Given a pointer to an mstring array, require that the current input
1239 be one of the strings in the array. We return the enum value. */
1241 static int
1242 find_enum (const mstring * m)
1244 int i;
1246 i = gfc_string2code (m, atom_name);
1247 if (i >= 0)
1248 return i;
1250 bad_module ("find_enum(): Enum not found");
1252 /* Not reached */
1256 /**************** Module output subroutines ***************************/
1258 /* Output a character to a module file. */
1260 static void
1261 write_char (char out)
1264 if (fputc (out, module_fp) == EOF)
1265 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1267 if (out != '\n')
1268 module_column++;
1269 else
1271 module_column = 1;
1272 module_line++;
1277 /* Write an atom to a module. The line wrapping isn't perfect, but it
1278 should work most of the time. This isn't that big of a deal, since
1279 the file really isn't meant to be read by people anyway. */
1281 static void
1282 write_atom (atom_type atom, const void *v)
1284 char buffer[20];
1285 int i, len;
1286 const char *p;
1288 switch (atom)
1290 case ATOM_STRING:
1291 case ATOM_NAME:
1292 p = v;
1293 break;
1295 case ATOM_LPAREN:
1296 p = "(";
1297 break;
1299 case ATOM_RPAREN:
1300 p = ")";
1301 break;
1303 case ATOM_INTEGER:
1304 i = *((const int *) v);
1305 if (i < 0)
1306 gfc_internal_error ("write_atom(): Writing negative integer");
1308 sprintf (buffer, "%d", i);
1309 p = buffer;
1310 break;
1312 default:
1313 gfc_internal_error ("write_atom(): Trying to write dab atom");
1317 len = strlen (p);
1319 if (atom != ATOM_RPAREN)
1321 if (module_column + len > 72)
1322 write_char ('\n');
1323 else
1326 if (last_atom != ATOM_LPAREN && module_column != 1)
1327 write_char (' ');
1331 if (atom == ATOM_STRING)
1332 write_char ('\'');
1334 while (*p)
1336 if (atom == ATOM_STRING && *p == '\'')
1337 write_char ('\'');
1338 write_char (*p++);
1341 if (atom == ATOM_STRING)
1342 write_char ('\'');
1344 last_atom = atom;
1349 /***************** Mid-level I/O subroutines *****************/
1351 /* These subroutines let their caller read or write atoms without
1352 caring about which of the two is actually happening. This lets a
1353 subroutine concentrate on the actual format of the data being
1354 written. */
1356 static void mio_expr (gfc_expr **);
1357 static void mio_symbol_ref (gfc_symbol **);
1358 static void mio_symtree_ref (gfc_symtree **);
1360 /* Read or write an enumerated value. On writing, we return the input
1361 value for the convenience of callers. We avoid using an integer
1362 pointer because enums are sometimes inside bitfields. */
1364 static int
1365 mio_name (int t, const mstring * m)
1368 if (iomode == IO_OUTPUT)
1369 write_atom (ATOM_NAME, gfc_code2string (m, t));
1370 else
1372 require_atom (ATOM_NAME);
1373 t = find_enum (m);
1376 return t;
1379 /* Specialization of mio_name. */
1381 #define DECL_MIO_NAME(TYPE) \
1382 static inline TYPE \
1383 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1385 return (TYPE)mio_name ((int)t, m); \
1387 #define MIO_NAME(TYPE) mio_name_##TYPE
1389 static void
1390 mio_lparen (void)
1393 if (iomode == IO_OUTPUT)
1394 write_atom (ATOM_LPAREN, NULL);
1395 else
1396 require_atom (ATOM_LPAREN);
1400 static void
1401 mio_rparen (void)
1404 if (iomode == IO_OUTPUT)
1405 write_atom (ATOM_RPAREN, NULL);
1406 else
1407 require_atom (ATOM_RPAREN);
1411 static void
1412 mio_integer (int *ip)
1415 if (iomode == IO_OUTPUT)
1416 write_atom (ATOM_INTEGER, ip);
1417 else
1419 require_atom (ATOM_INTEGER);
1420 *ip = atom_int;
1425 /* Read or write a character pointer that points to a string on the
1426 heap. */
1428 static const char *
1429 mio_allocated_string (const char *s)
1431 if (iomode == IO_OUTPUT)
1433 write_atom (ATOM_STRING, s);
1434 return s;
1436 else
1438 require_atom (ATOM_STRING);
1439 return atom_string;
1444 /* Read or write a string that is in static memory. */
1446 static void
1447 mio_pool_string (const char **stringp)
1449 /* TODO: one could write the string only once, and refer to it via a
1450 fixup pointer. */
1452 /* As a special case we have to deal with a NULL string. This
1453 happens for the 'module' member of 'gfc_symbol's that are not in a
1454 module. We read / write these as the empty string. */
1455 if (iomode == IO_OUTPUT)
1457 const char *p = *stringp == NULL ? "" : *stringp;
1458 write_atom (ATOM_STRING, p);
1460 else
1462 require_atom (ATOM_STRING);
1463 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1464 gfc_free (atom_string);
1469 /* Read or write a string that is inside of some already-allocated
1470 structure. */
1472 static void
1473 mio_internal_string (char *string)
1476 if (iomode == IO_OUTPUT)
1477 write_atom (ATOM_STRING, string);
1478 else
1480 require_atom (ATOM_STRING);
1481 strcpy (string, atom_string);
1482 gfc_free (atom_string);
1488 typedef enum
1489 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1490 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1491 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1492 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1493 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1494 AB_VALUE, AB_VOLATILE, AB_PROTECTED
1496 ab_attribute;
1498 static const mstring attr_bits[] =
1500 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1501 minit ("DIMENSION", AB_DIMENSION),
1502 minit ("EXTERNAL", AB_EXTERNAL),
1503 minit ("INTRINSIC", AB_INTRINSIC),
1504 minit ("OPTIONAL", AB_OPTIONAL),
1505 minit ("POINTER", AB_POINTER),
1506 minit ("SAVE", AB_SAVE),
1507 minit ("VALUE", AB_VALUE),
1508 minit ("VOLATILE", AB_VOLATILE),
1509 minit ("TARGET", AB_TARGET),
1510 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1511 minit ("DUMMY", AB_DUMMY),
1512 minit ("RESULT", AB_RESULT),
1513 minit ("DATA", AB_DATA),
1514 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1515 minit ("IN_COMMON", AB_IN_COMMON),
1516 minit ("FUNCTION", AB_FUNCTION),
1517 minit ("SUBROUTINE", AB_SUBROUTINE),
1518 minit ("SEQUENCE", AB_SEQUENCE),
1519 minit ("ELEMENTAL", AB_ELEMENTAL),
1520 minit ("PURE", AB_PURE),
1521 minit ("RECURSIVE", AB_RECURSIVE),
1522 minit ("GENERIC", AB_GENERIC),
1523 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1524 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1525 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1526 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1527 minit ("PROTECTED", AB_PROTECTED),
1528 minit (NULL, -1)
1531 /* Specialization of mio_name. */
1532 DECL_MIO_NAME(ab_attribute)
1533 DECL_MIO_NAME(ar_type)
1534 DECL_MIO_NAME(array_type)
1535 DECL_MIO_NAME(bt)
1536 DECL_MIO_NAME(expr_t)
1537 DECL_MIO_NAME(gfc_access)
1538 DECL_MIO_NAME(gfc_intrinsic_op)
1539 DECL_MIO_NAME(ifsrc)
1540 DECL_MIO_NAME(procedure_type)
1541 DECL_MIO_NAME(ref_type)
1542 DECL_MIO_NAME(sym_flavor)
1543 DECL_MIO_NAME(sym_intent)
1544 #undef DECL_MIO_NAME
1546 /* Symbol attributes are stored in list with the first three elements
1547 being the enumerated fields, while the remaining elements (if any)
1548 indicate the individual attribute bits. The access field is not
1549 saved-- it controls what symbols are exported when a module is
1550 written. */
1552 static void
1553 mio_symbol_attribute (symbol_attribute * attr)
1555 atom_type t;
1557 mio_lparen ();
1559 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1560 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1561 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1562 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1564 if (iomode == IO_OUTPUT)
1566 if (attr->allocatable)
1567 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1568 if (attr->dimension)
1569 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1570 if (attr->external)
1571 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1572 if (attr->intrinsic)
1573 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1574 if (attr->optional)
1575 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1576 if (attr->pointer)
1577 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1578 if (attr->protected)
1579 MIO_NAME(ab_attribute) (AB_PROTECTED, attr_bits);
1580 if (attr->save)
1581 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1582 if (attr->value)
1583 MIO_NAME(ab_attribute) (AB_VALUE, attr_bits);
1584 if (attr->volatile_)
1585 MIO_NAME(ab_attribute) (AB_VOLATILE, attr_bits);
1586 if (attr->target)
1587 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1588 if (attr->threadprivate)
1589 MIO_NAME(ab_attribute) (AB_THREADPRIVATE, attr_bits);
1590 if (attr->dummy)
1591 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1592 if (attr->result)
1593 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1594 /* We deliberately don't preserve the "entry" flag. */
1596 if (attr->data)
1597 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1598 if (attr->in_namelist)
1599 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1600 if (attr->in_common)
1601 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1603 if (attr->function)
1604 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1605 if (attr->subroutine)
1606 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1607 if (attr->generic)
1608 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1610 if (attr->sequence)
1611 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1612 if (attr->elemental)
1613 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1614 if (attr->pure)
1615 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1616 if (attr->recursive)
1617 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1618 if (attr->always_explicit)
1619 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1620 if (attr->cray_pointer)
1621 MIO_NAME(ab_attribute) (AB_CRAY_POINTER, attr_bits);
1622 if (attr->cray_pointee)
1623 MIO_NAME(ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1624 if (attr->alloc_comp)
1625 MIO_NAME(ab_attribute) (AB_ALLOC_COMP, attr_bits);
1627 mio_rparen ();
1630 else
1633 for (;;)
1635 t = parse_atom ();
1636 if (t == ATOM_RPAREN)
1637 break;
1638 if (t != ATOM_NAME)
1639 bad_module ("Expected attribute bit name");
1641 switch ((ab_attribute) find_enum (attr_bits))
1643 case AB_ALLOCATABLE:
1644 attr->allocatable = 1;
1645 break;
1646 case AB_DIMENSION:
1647 attr->dimension = 1;
1648 break;
1649 case AB_EXTERNAL:
1650 attr->external = 1;
1651 break;
1652 case AB_INTRINSIC:
1653 attr->intrinsic = 1;
1654 break;
1655 case AB_OPTIONAL:
1656 attr->optional = 1;
1657 break;
1658 case AB_POINTER:
1659 attr->pointer = 1;
1660 break;
1661 case AB_PROTECTED:
1662 attr->protected = 1;
1663 break;
1664 case AB_SAVE:
1665 attr->save = 1;
1666 break;
1667 case AB_VALUE:
1668 attr->value = 1;
1669 break;
1670 case AB_VOLATILE:
1671 attr->volatile_ = 1;
1672 break;
1673 case AB_TARGET:
1674 attr->target = 1;
1675 break;
1676 case AB_THREADPRIVATE:
1677 attr->threadprivate = 1;
1678 break;
1679 case AB_DUMMY:
1680 attr->dummy = 1;
1681 break;
1682 case AB_RESULT:
1683 attr->result = 1;
1684 break;
1685 case AB_DATA:
1686 attr->data = 1;
1687 break;
1688 case AB_IN_NAMELIST:
1689 attr->in_namelist = 1;
1690 break;
1691 case AB_IN_COMMON:
1692 attr->in_common = 1;
1693 break;
1694 case AB_FUNCTION:
1695 attr->function = 1;
1696 break;
1697 case AB_SUBROUTINE:
1698 attr->subroutine = 1;
1699 break;
1700 case AB_GENERIC:
1701 attr->generic = 1;
1702 break;
1703 case AB_SEQUENCE:
1704 attr->sequence = 1;
1705 break;
1706 case AB_ELEMENTAL:
1707 attr->elemental = 1;
1708 break;
1709 case AB_PURE:
1710 attr->pure = 1;
1711 break;
1712 case AB_RECURSIVE:
1713 attr->recursive = 1;
1714 break;
1715 case AB_ALWAYS_EXPLICIT:
1716 attr->always_explicit = 1;
1717 break;
1718 case AB_CRAY_POINTER:
1719 attr->cray_pointer = 1;
1720 break;
1721 case AB_CRAY_POINTEE:
1722 attr->cray_pointee = 1;
1723 break;
1724 case AB_ALLOC_COMP:
1725 attr->alloc_comp = 1;
1726 break;
1733 static const mstring bt_types[] = {
1734 minit ("INTEGER", BT_INTEGER),
1735 minit ("REAL", BT_REAL),
1736 minit ("COMPLEX", BT_COMPLEX),
1737 minit ("LOGICAL", BT_LOGICAL),
1738 minit ("CHARACTER", BT_CHARACTER),
1739 minit ("DERIVED", BT_DERIVED),
1740 minit ("PROCEDURE", BT_PROCEDURE),
1741 minit ("UNKNOWN", BT_UNKNOWN),
1742 minit (NULL, -1)
1746 static void
1747 mio_charlen (gfc_charlen ** clp)
1749 gfc_charlen *cl;
1751 mio_lparen ();
1753 if (iomode == IO_OUTPUT)
1755 cl = *clp;
1756 if (cl != NULL)
1757 mio_expr (&cl->length);
1759 else
1762 if (peek_atom () != ATOM_RPAREN)
1764 cl = gfc_get_charlen ();
1765 mio_expr (&cl->length);
1767 *clp = cl;
1769 cl->next = gfc_current_ns->cl_list;
1770 gfc_current_ns->cl_list = cl;
1774 mio_rparen ();
1778 /* Return a symtree node with a name that is guaranteed to be unique
1779 within the namespace and corresponds to an illegal fortran name. */
1781 static gfc_symtree *
1782 get_unique_symtree (gfc_namespace * ns)
1784 char name[GFC_MAX_SYMBOL_LEN + 1];
1785 static int serial = 0;
1787 sprintf (name, "@%d", serial++);
1788 return gfc_new_symtree (&ns->sym_root, name);
1792 /* See if a name is a generated name. */
1794 static int
1795 check_unique_name (const char *name)
1798 return *name == '@';
1802 static void
1803 mio_typespec (gfc_typespec * ts)
1806 mio_lparen ();
1808 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1810 if (ts->type != BT_DERIVED)
1811 mio_integer (&ts->kind);
1812 else
1813 mio_symbol_ref (&ts->derived);
1815 mio_charlen (&ts->cl);
1817 mio_rparen ();
1821 static const mstring array_spec_types[] = {
1822 minit ("EXPLICIT", AS_EXPLICIT),
1823 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1824 minit ("DEFERRED", AS_DEFERRED),
1825 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1826 minit (NULL, -1)
1830 static void
1831 mio_array_spec (gfc_array_spec ** asp)
1833 gfc_array_spec *as;
1834 int i;
1836 mio_lparen ();
1838 if (iomode == IO_OUTPUT)
1840 if (*asp == NULL)
1841 goto done;
1842 as = *asp;
1844 else
1846 if (peek_atom () == ATOM_RPAREN)
1848 *asp = NULL;
1849 goto done;
1852 *asp = as = gfc_get_array_spec ();
1855 mio_integer (&as->rank);
1856 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1858 for (i = 0; i < as->rank; i++)
1860 mio_expr (&as->lower[i]);
1861 mio_expr (&as->upper[i]);
1864 done:
1865 mio_rparen ();
1869 /* Given a pointer to an array reference structure (which lives in a
1870 gfc_ref structure), find the corresponding array specification
1871 structure. Storing the pointer in the ref structure doesn't quite
1872 work when loading from a module. Generating code for an array
1873 reference also needs more information than just the array spec. */
1875 static const mstring array_ref_types[] = {
1876 minit ("FULL", AR_FULL),
1877 minit ("ELEMENT", AR_ELEMENT),
1878 minit ("SECTION", AR_SECTION),
1879 minit (NULL, -1)
1882 static void
1883 mio_array_ref (gfc_array_ref * ar)
1885 int i;
1887 mio_lparen ();
1888 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1889 mio_integer (&ar->dimen);
1891 switch (ar->type)
1893 case AR_FULL:
1894 break;
1896 case AR_ELEMENT:
1897 for (i = 0; i < ar->dimen; i++)
1898 mio_expr (&ar->start[i]);
1900 break;
1902 case AR_SECTION:
1903 for (i = 0; i < ar->dimen; i++)
1905 mio_expr (&ar->start[i]);
1906 mio_expr (&ar->end[i]);
1907 mio_expr (&ar->stride[i]);
1910 break;
1912 case AR_UNKNOWN:
1913 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1916 for (i = 0; i < ar->dimen; i++)
1917 mio_integer ((int *) &ar->dimen_type[i]);
1919 if (iomode == IO_INPUT)
1921 ar->where = gfc_current_locus;
1923 for (i = 0; i < ar->dimen; i++)
1924 ar->c_where[i] = gfc_current_locus;
1927 mio_rparen ();
1931 /* Saves or restores a pointer. The pointer is converted back and
1932 forth from an integer. We return the pointer_info pointer so that
1933 the caller can take additional action based on the pointer type. */
1935 static pointer_info *
1936 mio_pointer_ref (void *gp)
1938 pointer_info *p;
1940 if (iomode == IO_OUTPUT)
1942 p = get_pointer (*((char **) gp));
1943 write_atom (ATOM_INTEGER, &p->integer);
1945 else
1947 require_atom (ATOM_INTEGER);
1948 p = add_fixup (atom_int, gp);
1951 return p;
1955 /* Save and load references to components that occur within
1956 expressions. We have to describe these references by a number and
1957 by name. The number is necessary for forward references during
1958 reading, and the name is necessary if the symbol already exists in
1959 the namespace and is not loaded again. */
1961 static void
1962 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1964 char name[GFC_MAX_SYMBOL_LEN + 1];
1965 gfc_component *q;
1966 pointer_info *p;
1968 p = mio_pointer_ref (cp);
1969 if (p->type == P_UNKNOWN)
1970 p->type = P_COMPONENT;
1972 if (iomode == IO_OUTPUT)
1973 mio_pool_string (&(*cp)->name);
1974 else
1976 mio_internal_string (name);
1978 /* It can happen that a component reference can be read before the
1979 associated derived type symbol has been loaded. Return now and
1980 wait for a later iteration of load_needed. */
1981 if (sym == NULL)
1982 return;
1984 if (sym->components != NULL && p->u.pointer == NULL)
1986 /* Symbol already loaded, so search by name. */
1987 for (q = sym->components; q; q = q->next)
1988 if (strcmp (q->name, name) == 0)
1989 break;
1991 if (q == NULL)
1992 gfc_internal_error ("mio_component_ref(): Component not found");
1994 associate_integer_pointer (p, q);
1997 /* Make sure this symbol will eventually be loaded. */
1998 p = find_pointer2 (sym);
1999 if (p->u.rsym.state == UNUSED)
2000 p->u.rsym.state = NEEDED;
2005 static void
2006 mio_component (gfc_component * c)
2008 pointer_info *p;
2009 int n;
2011 mio_lparen ();
2013 if (iomode == IO_OUTPUT)
2015 p = get_pointer (c);
2016 mio_integer (&p->integer);
2018 else
2020 mio_integer (&n);
2021 p = get_integer (n);
2022 associate_integer_pointer (p, c);
2025 if (p->type == P_UNKNOWN)
2026 p->type = P_COMPONENT;
2028 mio_pool_string (&c->name);
2029 mio_typespec (&c->ts);
2030 mio_array_spec (&c->as);
2032 mio_integer (&c->dimension);
2033 mio_integer (&c->pointer);
2034 mio_integer (&c->allocatable);
2036 mio_expr (&c->initializer);
2037 mio_rparen ();
2041 static void
2042 mio_component_list (gfc_component ** cp)
2044 gfc_component *c, *tail;
2046 mio_lparen ();
2048 if (iomode == IO_OUTPUT)
2050 for (c = *cp; c; c = c->next)
2051 mio_component (c);
2053 else
2056 *cp = NULL;
2057 tail = NULL;
2059 for (;;)
2061 if (peek_atom () == ATOM_RPAREN)
2062 break;
2064 c = gfc_get_component ();
2065 mio_component (c);
2067 if (tail == NULL)
2068 *cp = c;
2069 else
2070 tail->next = c;
2072 tail = c;
2076 mio_rparen ();
2080 static void
2081 mio_actual_arg (gfc_actual_arglist * a)
2084 mio_lparen ();
2085 mio_pool_string (&a->name);
2086 mio_expr (&a->expr);
2087 mio_rparen ();
2091 static void
2092 mio_actual_arglist (gfc_actual_arglist ** ap)
2094 gfc_actual_arglist *a, *tail;
2096 mio_lparen ();
2098 if (iomode == IO_OUTPUT)
2100 for (a = *ap; a; a = a->next)
2101 mio_actual_arg (a);
2104 else
2106 tail = NULL;
2108 for (;;)
2110 if (peek_atom () != ATOM_LPAREN)
2111 break;
2113 a = gfc_get_actual_arglist ();
2115 if (tail == NULL)
2116 *ap = a;
2117 else
2118 tail->next = a;
2120 tail = a;
2121 mio_actual_arg (a);
2125 mio_rparen ();
2129 /* Read and write formal argument lists. */
2131 static void
2132 mio_formal_arglist (gfc_symbol * sym)
2134 gfc_formal_arglist *f, *tail;
2136 mio_lparen ();
2138 if (iomode == IO_OUTPUT)
2140 for (f = sym->formal; f; f = f->next)
2141 mio_symbol_ref (&f->sym);
2144 else
2146 sym->formal = tail = NULL;
2148 while (peek_atom () != ATOM_RPAREN)
2150 f = gfc_get_formal_arglist ();
2151 mio_symbol_ref (&f->sym);
2153 if (sym->formal == NULL)
2154 sym->formal = f;
2155 else
2156 tail->next = f;
2158 tail = f;
2162 mio_rparen ();
2166 /* Save or restore a reference to a symbol node. */
2168 void
2169 mio_symbol_ref (gfc_symbol ** symp)
2171 pointer_info *p;
2173 p = mio_pointer_ref (symp);
2174 if (p->type == P_UNKNOWN)
2175 p->type = P_SYMBOL;
2177 if (iomode == IO_OUTPUT)
2179 if (p->u.wsym.state == UNREFERENCED)
2180 p->u.wsym.state = NEEDS_WRITE;
2182 else
2184 if (p->u.rsym.state == UNUSED)
2185 p->u.rsym.state = NEEDED;
2190 /* Save or restore a reference to a symtree node. */
2192 static void
2193 mio_symtree_ref (gfc_symtree ** stp)
2195 pointer_info *p;
2196 fixup_t *f;
2197 gfc_symtree * ns_st = NULL;
2199 if (iomode == IO_OUTPUT)
2201 /* If this is a symtree for a symbol that came from a contained module
2202 namespace, it has a unique name and we should look in the current
2203 namespace to see if the required, non-contained symbol is available
2204 yet. If so, the latter should be written. */
2205 if ((*stp)->n.sym && check_unique_name((*stp)->name))
2206 ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2207 (*stp)->n.sym->name);
2209 /* On the other hand, if the existing symbol is the module name or the
2210 new symbol is a dummy argument, do not do the promotion. */
2211 if (ns_st && ns_st->n.sym
2212 && ns_st->n.sym->attr.flavor != FL_MODULE
2213 && !(*stp)->n.sym->attr.dummy)
2214 mio_symbol_ref (&ns_st->n.sym);
2215 else
2216 mio_symbol_ref (&(*stp)->n.sym);
2218 else
2220 require_atom (ATOM_INTEGER);
2221 p = get_integer (atom_int);
2223 /* An unused equivalence member; bail out. */
2224 if (in_load_equiv && p->u.rsym.symtree == NULL)
2225 return;
2227 if (p->type == P_UNKNOWN)
2228 p->type = P_SYMBOL;
2230 if (p->u.rsym.state == UNUSED)
2231 p->u.rsym.state = NEEDED;
2233 if (p->u.rsym.symtree != NULL)
2235 *stp = p->u.rsym.symtree;
2237 else
2239 f = gfc_getmem (sizeof (fixup_t));
2241 f->next = p->u.rsym.stfixup;
2242 p->u.rsym.stfixup = f;
2244 f->pointer = (void **)stp;
2249 static void
2250 mio_iterator (gfc_iterator ** ip)
2252 gfc_iterator *iter;
2254 mio_lparen ();
2256 if (iomode == IO_OUTPUT)
2258 if (*ip == NULL)
2259 goto done;
2261 else
2263 if (peek_atom () == ATOM_RPAREN)
2265 *ip = NULL;
2266 goto done;
2269 *ip = gfc_get_iterator ();
2272 iter = *ip;
2274 mio_expr (&iter->var);
2275 mio_expr (&iter->start);
2276 mio_expr (&iter->end);
2277 mio_expr (&iter->step);
2279 done:
2280 mio_rparen ();
2285 static void
2286 mio_constructor (gfc_constructor ** cp)
2288 gfc_constructor *c, *tail;
2290 mio_lparen ();
2292 if (iomode == IO_OUTPUT)
2294 for (c = *cp; c; c = c->next)
2296 mio_lparen ();
2297 mio_expr (&c->expr);
2298 mio_iterator (&c->iterator);
2299 mio_rparen ();
2302 else
2305 *cp = NULL;
2306 tail = NULL;
2308 while (peek_atom () != ATOM_RPAREN)
2310 c = gfc_get_constructor ();
2312 if (tail == NULL)
2313 *cp = c;
2314 else
2315 tail->next = c;
2317 tail = c;
2319 mio_lparen ();
2320 mio_expr (&c->expr);
2321 mio_iterator (&c->iterator);
2322 mio_rparen ();
2326 mio_rparen ();
2331 static const mstring ref_types[] = {
2332 minit ("ARRAY", REF_ARRAY),
2333 minit ("COMPONENT", REF_COMPONENT),
2334 minit ("SUBSTRING", REF_SUBSTRING),
2335 minit (NULL, -1)
2339 static void
2340 mio_ref (gfc_ref ** rp)
2342 gfc_ref *r;
2344 mio_lparen ();
2346 r = *rp;
2347 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2349 switch (r->type)
2351 case REF_ARRAY:
2352 mio_array_ref (&r->u.ar);
2353 break;
2355 case REF_COMPONENT:
2356 mio_symbol_ref (&r->u.c.sym);
2357 mio_component_ref (&r->u.c.component, r->u.c.sym);
2358 break;
2360 case REF_SUBSTRING:
2361 mio_expr (&r->u.ss.start);
2362 mio_expr (&r->u.ss.end);
2363 mio_charlen (&r->u.ss.length);
2364 break;
2367 mio_rparen ();
2371 static void
2372 mio_ref_list (gfc_ref ** rp)
2374 gfc_ref *ref, *head, *tail;
2376 mio_lparen ();
2378 if (iomode == IO_OUTPUT)
2380 for (ref = *rp; ref; ref = ref->next)
2381 mio_ref (&ref);
2383 else
2385 head = tail = NULL;
2387 while (peek_atom () != ATOM_RPAREN)
2389 if (head == NULL)
2390 head = tail = gfc_get_ref ();
2391 else
2393 tail->next = gfc_get_ref ();
2394 tail = tail->next;
2397 mio_ref (&tail);
2400 *rp = head;
2403 mio_rparen ();
2407 /* Read and write an integer value. */
2409 static void
2410 mio_gmp_integer (mpz_t * integer)
2412 char *p;
2414 if (iomode == IO_INPUT)
2416 if (parse_atom () != ATOM_STRING)
2417 bad_module ("Expected integer string");
2419 mpz_init (*integer);
2420 if (mpz_set_str (*integer, atom_string, 10))
2421 bad_module ("Error converting integer");
2423 gfc_free (atom_string);
2426 else
2428 p = mpz_get_str (NULL, 10, *integer);
2429 write_atom (ATOM_STRING, p);
2430 gfc_free (p);
2435 static void
2436 mio_gmp_real (mpfr_t * real)
2438 mp_exp_t exponent;
2439 char *p;
2441 if (iomode == IO_INPUT)
2443 if (parse_atom () != ATOM_STRING)
2444 bad_module ("Expected real string");
2446 mpfr_init (*real);
2447 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2448 gfc_free (atom_string);
2451 else
2453 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2454 atom_string = gfc_getmem (strlen (p) + 20);
2456 sprintf (atom_string, "0.%s@%ld", p, exponent);
2458 /* Fix negative numbers. */
2459 if (atom_string[2] == '-')
2461 atom_string[0] = '-';
2462 atom_string[1] = '0';
2463 atom_string[2] = '.';
2466 write_atom (ATOM_STRING, atom_string);
2468 gfc_free (atom_string);
2469 gfc_free (p);
2474 /* Save and restore the shape of an array constructor. */
2476 static void
2477 mio_shape (mpz_t ** pshape, int rank)
2479 mpz_t *shape;
2480 atom_type t;
2481 int n;
2483 /* A NULL shape is represented by (). */
2484 mio_lparen ();
2486 if (iomode == IO_OUTPUT)
2488 shape = *pshape;
2489 if (!shape)
2491 mio_rparen ();
2492 return;
2495 else
2497 t = peek_atom ();
2498 if (t == ATOM_RPAREN)
2500 *pshape = NULL;
2501 mio_rparen ();
2502 return;
2505 shape = gfc_get_shape (rank);
2506 *pshape = shape;
2509 for (n = 0; n < rank; n++)
2510 mio_gmp_integer (&shape[n]);
2512 mio_rparen ();
2516 static const mstring expr_types[] = {
2517 minit ("OP", EXPR_OP),
2518 minit ("FUNCTION", EXPR_FUNCTION),
2519 minit ("CONSTANT", EXPR_CONSTANT),
2520 minit ("VARIABLE", EXPR_VARIABLE),
2521 minit ("SUBSTRING", EXPR_SUBSTRING),
2522 minit ("STRUCTURE", EXPR_STRUCTURE),
2523 minit ("ARRAY", EXPR_ARRAY),
2524 minit ("NULL", EXPR_NULL),
2525 minit (NULL, -1)
2528 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2529 generic operators, not in expressions. INTRINSIC_USER is also
2530 replaced by the correct function name by the time we see it. */
2532 static const mstring intrinsics[] =
2534 minit ("UPLUS", INTRINSIC_UPLUS),
2535 minit ("UMINUS", INTRINSIC_UMINUS),
2536 minit ("PLUS", INTRINSIC_PLUS),
2537 minit ("MINUS", INTRINSIC_MINUS),
2538 minit ("TIMES", INTRINSIC_TIMES),
2539 minit ("DIVIDE", INTRINSIC_DIVIDE),
2540 minit ("POWER", INTRINSIC_POWER),
2541 minit ("CONCAT", INTRINSIC_CONCAT),
2542 minit ("AND", INTRINSIC_AND),
2543 minit ("OR", INTRINSIC_OR),
2544 minit ("EQV", INTRINSIC_EQV),
2545 minit ("NEQV", INTRINSIC_NEQV),
2546 minit ("EQ", INTRINSIC_EQ),
2547 minit ("NE", INTRINSIC_NE),
2548 minit ("GT", INTRINSIC_GT),
2549 minit ("GE", INTRINSIC_GE),
2550 minit ("LT", INTRINSIC_LT),
2551 minit ("LE", INTRINSIC_LE),
2552 minit ("NOT", INTRINSIC_NOT),
2553 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2554 minit (NULL, -1)
2557 /* Read and write expressions. The form "()" is allowed to indicate a
2558 NULL expression. */
2560 static void
2561 mio_expr (gfc_expr ** ep)
2563 gfc_expr *e;
2564 atom_type t;
2565 int flag;
2567 mio_lparen ();
2569 if (iomode == IO_OUTPUT)
2571 if (*ep == NULL)
2573 mio_rparen ();
2574 return;
2577 e = *ep;
2578 MIO_NAME(expr_t) (e->expr_type, expr_types);
2581 else
2583 t = parse_atom ();
2584 if (t == ATOM_RPAREN)
2586 *ep = NULL;
2587 return;
2590 if (t != ATOM_NAME)
2591 bad_module ("Expected expression type");
2593 e = *ep = gfc_get_expr ();
2594 e->where = gfc_current_locus;
2595 e->expr_type = (expr_t) find_enum (expr_types);
2598 mio_typespec (&e->ts);
2599 mio_integer (&e->rank);
2601 switch (e->expr_type)
2603 case EXPR_OP:
2604 e->value.op.operator
2605 = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2607 switch (e->value.op.operator)
2609 case INTRINSIC_UPLUS:
2610 case INTRINSIC_UMINUS:
2611 case INTRINSIC_NOT:
2612 case INTRINSIC_PARENTHESES:
2613 mio_expr (&e->value.op.op1);
2614 break;
2616 case INTRINSIC_PLUS:
2617 case INTRINSIC_MINUS:
2618 case INTRINSIC_TIMES:
2619 case INTRINSIC_DIVIDE:
2620 case INTRINSIC_POWER:
2621 case INTRINSIC_CONCAT:
2622 case INTRINSIC_AND:
2623 case INTRINSIC_OR:
2624 case INTRINSIC_EQV:
2625 case INTRINSIC_NEQV:
2626 case INTRINSIC_EQ:
2627 case INTRINSIC_NE:
2628 case INTRINSIC_GT:
2629 case INTRINSIC_GE:
2630 case INTRINSIC_LT:
2631 case INTRINSIC_LE:
2632 mio_expr (&e->value.op.op1);
2633 mio_expr (&e->value.op.op2);
2634 break;
2636 default:
2637 bad_module ("Bad operator");
2640 break;
2642 case EXPR_FUNCTION:
2643 mio_symtree_ref (&e->symtree);
2644 mio_actual_arglist (&e->value.function.actual);
2646 if (iomode == IO_OUTPUT)
2648 e->value.function.name
2649 = mio_allocated_string (e->value.function.name);
2650 flag = e->value.function.esym != NULL;
2651 mio_integer (&flag);
2652 if (flag)
2653 mio_symbol_ref (&e->value.function.esym);
2654 else
2655 write_atom (ATOM_STRING, e->value.function.isym->name);
2658 else
2660 require_atom (ATOM_STRING);
2661 e->value.function.name = gfc_get_string (atom_string);
2662 gfc_free (atom_string);
2664 mio_integer (&flag);
2665 if (flag)
2666 mio_symbol_ref (&e->value.function.esym);
2667 else
2669 require_atom (ATOM_STRING);
2670 e->value.function.isym = gfc_find_function (atom_string);
2671 gfc_free (atom_string);
2675 break;
2677 case EXPR_VARIABLE:
2678 mio_symtree_ref (&e->symtree);
2679 mio_ref_list (&e->ref);
2680 break;
2682 case EXPR_SUBSTRING:
2683 e->value.character.string = (char *)
2684 mio_allocated_string (e->value.character.string);
2685 mio_ref_list (&e->ref);
2686 break;
2688 case EXPR_STRUCTURE:
2689 case EXPR_ARRAY:
2690 mio_constructor (&e->value.constructor);
2691 mio_shape (&e->shape, e->rank);
2692 break;
2694 case EXPR_CONSTANT:
2695 switch (e->ts.type)
2697 case BT_INTEGER:
2698 mio_gmp_integer (&e->value.integer);
2699 break;
2701 case BT_REAL:
2702 gfc_set_model_kind (e->ts.kind);
2703 mio_gmp_real (&e->value.real);
2704 break;
2706 case BT_COMPLEX:
2707 gfc_set_model_kind (e->ts.kind);
2708 mio_gmp_real (&e->value.complex.r);
2709 mio_gmp_real (&e->value.complex.i);
2710 break;
2712 case BT_LOGICAL:
2713 mio_integer (&e->value.logical);
2714 break;
2716 case BT_CHARACTER:
2717 mio_integer (&e->value.character.length);
2718 e->value.character.string = (char *)
2719 mio_allocated_string (e->value.character.string);
2720 break;
2722 default:
2723 bad_module ("Bad type in constant expression");
2726 break;
2728 case EXPR_NULL:
2729 break;
2732 mio_rparen ();
2736 /* Read and write namelists */
2738 static void
2739 mio_namelist (gfc_symbol * sym)
2741 gfc_namelist *n, *m;
2742 const char *check_name;
2744 mio_lparen ();
2746 if (iomode == IO_OUTPUT)
2748 for (n = sym->namelist; n; n = n->next)
2749 mio_symbol_ref (&n->sym);
2751 else
2753 /* This departure from the standard is flagged as an error.
2754 It does, in fact, work correctly. TODO: Allow it
2755 conditionally? */
2756 if (sym->attr.flavor == FL_NAMELIST)
2758 check_name = find_use_name (sym->name);
2759 if (check_name && strcmp (check_name, sym->name) != 0)
2760 gfc_error("Namelist %s cannot be renamed by USE"
2761 " association to %s",
2762 sym->name, check_name);
2765 m = NULL;
2766 while (peek_atom () != ATOM_RPAREN)
2768 n = gfc_get_namelist ();
2769 mio_symbol_ref (&n->sym);
2771 if (sym->namelist == NULL)
2772 sym->namelist = n;
2773 else
2774 m->next = n;
2776 m = n;
2778 sym->namelist_tail = m;
2781 mio_rparen ();
2785 /* Save/restore lists of gfc_interface stuctures. When loading an
2786 interface, we are really appending to the existing list of
2787 interfaces. Checking for duplicate and ambiguous interfaces has to
2788 be done later when all symbols have been loaded. */
2790 static void
2791 mio_interface_rest (gfc_interface ** ip)
2793 gfc_interface *tail, *p;
2795 if (iomode == IO_OUTPUT)
2797 if (ip != NULL)
2798 for (p = *ip; p; p = p->next)
2799 mio_symbol_ref (&p->sym);
2801 else
2804 if (*ip == NULL)
2805 tail = NULL;
2806 else
2808 tail = *ip;
2809 while (tail->next)
2810 tail = tail->next;
2813 for (;;)
2815 if (peek_atom () == ATOM_RPAREN)
2816 break;
2818 p = gfc_get_interface ();
2819 p->where = gfc_current_locus;
2820 mio_symbol_ref (&p->sym);
2822 if (tail == NULL)
2823 *ip = p;
2824 else
2825 tail->next = p;
2827 tail = p;
2831 mio_rparen ();
2835 /* Save/restore a nameless operator interface. */
2837 static void
2838 mio_interface (gfc_interface ** ip)
2841 mio_lparen ();
2842 mio_interface_rest (ip);
2846 /* Save/restore a named operator interface. */
2848 static void
2849 mio_symbol_interface (const char **name, const char **module,
2850 gfc_interface ** ip)
2853 mio_lparen ();
2855 mio_pool_string (name);
2856 mio_pool_string (module);
2858 mio_interface_rest (ip);
2862 static void
2863 mio_namespace_ref (gfc_namespace ** nsp)
2865 gfc_namespace *ns;
2866 pointer_info *p;
2868 p = mio_pointer_ref (nsp);
2870 if (p->type == P_UNKNOWN)
2871 p->type = P_NAMESPACE;
2873 if (iomode == IO_INPUT && p->integer != 0)
2875 ns = (gfc_namespace *)p->u.pointer;
2876 if (ns == NULL)
2878 ns = gfc_get_namespace (NULL, 0);
2879 associate_integer_pointer (p, ns);
2881 else
2882 ns->refs++;
2887 /* Unlike most other routines, the address of the symbol node is
2888 already fixed on input and the name/module has already been filled
2889 in. */
2891 static void
2892 mio_symbol (gfc_symbol * sym)
2894 gfc_formal_arglist *formal;
2896 mio_lparen ();
2898 mio_symbol_attribute (&sym->attr);
2899 mio_typespec (&sym->ts);
2901 /* Contained procedures don't have formal namespaces. Instead we output the
2902 procedure namespace. The will contain the formal arguments. */
2903 if (iomode == IO_OUTPUT)
2905 formal = sym->formal;
2906 while (formal && !formal->sym)
2907 formal = formal->next;
2909 if (formal)
2910 mio_namespace_ref (&formal->sym->ns);
2911 else
2912 mio_namespace_ref (&sym->formal_ns);
2914 else
2916 mio_namespace_ref (&sym->formal_ns);
2917 if (sym->formal_ns)
2919 sym->formal_ns->proc_name = sym;
2920 sym->refs++;
2924 /* Save/restore common block links */
2925 mio_symbol_ref (&sym->common_next);
2927 mio_formal_arglist (sym);
2929 if (sym->attr.flavor == FL_PARAMETER)
2930 mio_expr (&sym->value);
2932 mio_array_spec (&sym->as);
2934 mio_symbol_ref (&sym->result);
2936 if (sym->attr.cray_pointee)
2937 mio_symbol_ref (&sym->cp_pointer);
2939 /* Note that components are always saved, even if they are supposed
2940 to be private. Component access is checked during searching. */
2942 mio_component_list (&sym->components);
2944 if (sym->components != NULL)
2945 sym->component_access =
2946 MIO_NAME(gfc_access) (sym->component_access, access_types);
2948 mio_namelist (sym);
2949 mio_rparen ();
2953 /************************* Top level subroutines *************************/
2955 /* Skip a list between balanced left and right parens. */
2957 static void
2958 skip_list (void)
2960 int level;
2962 level = 0;
2965 switch (parse_atom ())
2967 case ATOM_LPAREN:
2968 level++;
2969 break;
2971 case ATOM_RPAREN:
2972 level--;
2973 break;
2975 case ATOM_STRING:
2976 gfc_free (atom_string);
2977 break;
2979 case ATOM_NAME:
2980 case ATOM_INTEGER:
2981 break;
2984 while (level > 0);
2988 /* Load operator interfaces from the module. Interfaces are unusual
2989 in that they attach themselves to existing symbols. */
2991 static void
2992 load_operator_interfaces (void)
2994 const char *p;
2995 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2996 gfc_user_op *uop;
2998 mio_lparen ();
3000 while (peek_atom () != ATOM_RPAREN)
3002 mio_lparen ();
3004 mio_internal_string (name);
3005 mio_internal_string (module);
3007 /* Decide if we need to load this one or not. */
3008 p = find_use_name (name);
3009 if (p == NULL)
3011 while (parse_atom () != ATOM_RPAREN);
3013 else
3015 uop = gfc_get_uop (p);
3016 mio_interface_rest (&uop->operator);
3020 mio_rparen ();
3024 /* Load interfaces from the module. Interfaces are unusual in that
3025 they attach themselves to existing symbols. */
3027 static void
3028 load_generic_interfaces (void)
3030 const char *p;
3031 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3032 gfc_symbol *sym;
3033 gfc_interface *generic = NULL;
3034 int n, i;
3036 mio_lparen ();
3038 while (peek_atom () != ATOM_RPAREN)
3040 mio_lparen ();
3042 mio_internal_string (name);
3043 mio_internal_string (module);
3045 n = number_use_names (name);
3046 n = n ? n : 1;
3048 for (i = 1; i <= n; i++)
3050 /* Decide if we need to load this one or not. */
3051 p = find_use_name_n (name, &i);
3053 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
3055 while (parse_atom () != ATOM_RPAREN);
3056 continue;
3059 if (sym == NULL)
3061 gfc_get_symbol (p, NULL, &sym);
3063 sym->attr.flavor = FL_PROCEDURE;
3064 sym->attr.generic = 1;
3065 sym->attr.use_assoc = 1;
3067 if (i == 1)
3069 mio_interface_rest (&sym->generic);
3070 generic = sym->generic;
3072 else
3074 sym->generic = generic;
3075 sym->attr.generic_copy = 1;
3080 mio_rparen ();
3084 /* Load common blocks. */
3086 static void
3087 load_commons(void)
3089 char name[GFC_MAX_SYMBOL_LEN+1];
3090 gfc_common_head *p;
3092 mio_lparen ();
3094 while (peek_atom () != ATOM_RPAREN)
3096 int flags;
3097 mio_lparen ();
3098 mio_internal_string (name);
3100 p = gfc_get_common (name, 1);
3102 mio_symbol_ref (&p->head);
3103 mio_integer (&flags);
3104 if (flags & 1)
3105 p->saved = 1;
3106 if (flags & 2)
3107 p->threadprivate = 1;
3108 p->use_assoc = 1;
3110 mio_rparen();
3113 mio_rparen();
3116 /* load_equiv()-- Load equivalences. The flag in_load_equiv informs
3117 mio_expr_ref of this so that unused variables are not loaded and
3118 so that the expression can be safely freed.*/
3120 static void
3121 load_equiv(void)
3123 gfc_equiv *head, *tail, *end, *eq;
3124 bool unused;
3126 mio_lparen();
3127 in_load_equiv = true;
3129 end = gfc_current_ns->equiv;
3130 while(end != NULL && end->next != NULL)
3131 end = end->next;
3133 while(peek_atom() != ATOM_RPAREN) {
3134 mio_lparen();
3135 head = tail = NULL;
3137 while(peek_atom() != ATOM_RPAREN)
3139 if (head == NULL)
3140 head = tail = gfc_get_equiv();
3141 else
3143 tail->eq = gfc_get_equiv();
3144 tail = tail->eq;
3147 mio_pool_string(&tail->module);
3148 mio_expr(&tail->expr);
3151 /* Unused variables have no symtree. */
3152 unused = false;
3153 for (eq = head; eq; eq = eq->eq)
3155 if (!eq->expr->symtree)
3157 unused = true;
3158 break;
3162 if (unused)
3164 for (eq = head; eq; eq = head)
3166 head = eq->eq;
3167 gfc_free_expr (eq->expr);
3168 gfc_free (eq);
3172 if (end == NULL)
3173 gfc_current_ns->equiv = head;
3174 else
3175 end->next = head;
3177 if (head != NULL)
3178 end = head;
3180 mio_rparen();
3183 mio_rparen();
3184 in_load_equiv = false;
3187 /* Recursive function to traverse the pointer_info tree and load a
3188 needed symbol. We return nonzero if we load a symbol and stop the
3189 traversal, because the act of loading can alter the tree. */
3191 static int
3192 load_needed (pointer_info * p)
3194 gfc_namespace *ns;
3195 pointer_info *q;
3196 gfc_symbol *sym;
3197 int rv;
3199 rv = 0;
3200 if (p == NULL)
3201 return rv;
3203 rv |= load_needed (p->left);
3204 rv |= load_needed (p->right);
3206 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3207 return rv;
3209 p->u.rsym.state = USED;
3211 set_module_locus (&p->u.rsym.where);
3213 sym = p->u.rsym.sym;
3214 if (sym == NULL)
3216 q = get_integer (p->u.rsym.ns);
3218 ns = (gfc_namespace *) q->u.pointer;
3219 if (ns == NULL)
3221 /* Create an interface namespace if necessary. These are
3222 the namespaces that hold the formal parameters of module
3223 procedures. */
3225 ns = gfc_get_namespace (NULL, 0);
3226 associate_integer_pointer (q, ns);
3229 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3230 sym->module = gfc_get_string (p->u.rsym.module);
3232 associate_integer_pointer (p, sym);
3235 mio_symbol (sym);
3236 sym->attr.use_assoc = 1;
3237 if (only_flag)
3238 sym->attr.use_only = 1;
3240 return 1;
3244 /* Recursive function for cleaning up things after a module has been
3245 read. */
3247 static void
3248 read_cleanup (pointer_info * p)
3250 gfc_symtree *st;
3251 pointer_info *q;
3253 if (p == NULL)
3254 return;
3256 read_cleanup (p->left);
3257 read_cleanup (p->right);
3259 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3261 /* Add hidden symbols to the symtree. */
3262 q = get_integer (p->u.rsym.ns);
3263 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3265 st->n.sym = p->u.rsym.sym;
3266 st->n.sym->refs++;
3268 /* Fixup any symtree references. */
3269 p->u.rsym.symtree = st;
3270 resolve_fixups (p->u.rsym.stfixup, st);
3271 p->u.rsym.stfixup = NULL;
3274 /* Free unused symbols. */
3275 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3276 gfc_free_symbol (p->u.rsym.sym);
3280 /* Read a module file. */
3282 static void
3283 read_module (void)
3285 module_locus operator_interfaces, user_operators;
3286 const char *p;
3287 char name[GFC_MAX_SYMBOL_LEN + 1];
3288 gfc_intrinsic_op i;
3289 int ambiguous, j, nuse, symbol;
3290 pointer_info *info;
3291 gfc_use_rename *u;
3292 gfc_symtree *st;
3293 gfc_symbol *sym;
3295 get_module_locus (&operator_interfaces); /* Skip these for now */
3296 skip_list ();
3298 get_module_locus (&user_operators);
3299 skip_list ();
3300 skip_list ();
3302 /* Skip commons and equivalences for now. */
3303 skip_list ();
3304 skip_list ();
3306 mio_lparen ();
3308 /* Create the fixup nodes for all the symbols. */
3310 while (peek_atom () != ATOM_RPAREN)
3312 require_atom (ATOM_INTEGER);
3313 info = get_integer (atom_int);
3315 info->type = P_SYMBOL;
3316 info->u.rsym.state = UNUSED;
3318 mio_internal_string (info->u.rsym.true_name);
3319 mio_internal_string (info->u.rsym.module);
3321 require_atom (ATOM_INTEGER);
3322 info->u.rsym.ns = atom_int;
3324 get_module_locus (&info->u.rsym.where);
3325 skip_list ();
3327 /* See if the symbol has already been loaded by a previous module.
3328 If so, we reference the existing symbol and prevent it from
3329 being loaded again. This should not happen if the symbol being
3330 read is an index for an assumed shape dummy array (ns != 1). */
3332 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3334 if (sym == NULL
3335 || (sym->attr.flavor == FL_VARIABLE
3336 && info->u.rsym.ns !=1))
3337 continue;
3339 info->u.rsym.state = USED;
3340 info->u.rsym.referenced = 1;
3341 info->u.rsym.sym = sym;
3344 mio_rparen ();
3346 /* Parse the symtree lists. This lets us mark which symbols need to
3347 be loaded. Renaming is also done at this point by replacing the
3348 symtree name. */
3350 mio_lparen ();
3352 while (peek_atom () != ATOM_RPAREN)
3354 mio_internal_string (name);
3355 mio_integer (&ambiguous);
3356 mio_integer (&symbol);
3358 info = get_integer (symbol);
3360 /* See how many use names there are. If none, go through the start
3361 of the loop at least once. */
3362 nuse = number_use_names (name);
3363 if (nuse == 0)
3364 nuse = 1;
3366 for (j = 1; j <= nuse; j++)
3368 /* Get the jth local name for this symbol. */
3369 p = find_use_name_n (name, &j);
3371 /* Skip symtree nodes not in an ONLY clause. */
3372 if (p == NULL)
3373 continue;
3375 /* Check for ambiguous symbols. */
3376 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3378 if (st != NULL)
3380 if (st->n.sym != info->u.rsym.sym)
3381 st->ambiguous = 1;
3382 info->u.rsym.symtree = st;
3384 else
3386 /* Create a symtree node in the current namespace for this symbol. */
3387 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3388 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3390 st->ambiguous = ambiguous;
3392 sym = info->u.rsym.sym;
3394 /* Create a symbol node if it doesn't already exist. */
3395 if (sym == NULL)
3397 sym = info->u.rsym.sym =
3398 gfc_new_symbol (info->u.rsym.true_name,
3399 gfc_current_ns);
3401 sym->module = gfc_get_string (info->u.rsym.module);
3404 st->n.sym = sym;
3405 st->n.sym->refs++;
3407 /* Store the symtree pointing to this symbol. */
3408 info->u.rsym.symtree = st;
3410 if (info->u.rsym.state == UNUSED)
3411 info->u.rsym.state = NEEDED;
3412 info->u.rsym.referenced = 1;
3417 mio_rparen ();
3419 /* Load intrinsic operator interfaces. */
3420 set_module_locus (&operator_interfaces);
3421 mio_lparen ();
3423 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3425 if (i == INTRINSIC_USER)
3426 continue;
3428 if (only_flag)
3430 u = find_use_operator (i);
3432 if (u == NULL)
3434 skip_list ();
3435 continue;
3438 u->found = 1;
3441 mio_interface (&gfc_current_ns->operator[i]);
3444 mio_rparen ();
3446 /* Load generic and user operator interfaces. These must follow the
3447 loading of symtree because otherwise symbols can be marked as
3448 ambiguous. */
3450 set_module_locus (&user_operators);
3452 load_operator_interfaces ();
3453 load_generic_interfaces ();
3455 load_commons ();
3456 load_equiv();
3458 /* At this point, we read those symbols that are needed but haven't
3459 been loaded yet. If one symbol requires another, the other gets
3460 marked as NEEDED if its previous state was UNUSED. */
3462 while (load_needed (pi_root));
3464 /* Make sure all elements of the rename-list were found in the
3465 module. */
3467 for (u = gfc_rename_list; u; u = u->next)
3469 if (u->found)
3470 continue;
3472 if (u->operator == INTRINSIC_NONE)
3474 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3475 u->use_name, &u->where, module_name);
3476 continue;
3479 if (u->operator == INTRINSIC_USER)
3481 gfc_error
3482 ("User operator '%s' referenced at %L not found in module '%s'",
3483 u->use_name, &u->where, module_name);
3484 continue;
3487 gfc_error
3488 ("Intrinsic operator '%s' referenced at %L not found in module "
3489 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3492 gfc_check_interfaces (gfc_current_ns);
3494 /* Clean up symbol nodes that were never loaded, create references
3495 to hidden symbols. */
3497 read_cleanup (pi_root);
3501 /* Given an access type that is specific to an entity and the default
3502 access, return nonzero if the entity is publicly accessible. If the
3503 element is declared as PUBLIC, then it is public; if declared
3504 PRIVATE, then private, and otherwise it is public unless the default
3505 access in this context has been declared PRIVATE. */
3507 bool
3508 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3511 if (specific_access == ACCESS_PUBLIC)
3512 return TRUE;
3513 if (specific_access == ACCESS_PRIVATE)
3514 return FALSE;
3516 return default_access != ACCESS_PRIVATE;
3520 /* Write a common block to the module */
3522 static void
3523 write_common (gfc_symtree *st)
3525 gfc_common_head *p;
3526 const char * name;
3527 int flags;
3529 if (st == NULL)
3530 return;
3532 write_common(st->left);
3533 write_common(st->right);
3535 mio_lparen();
3537 /* Write the unmangled name. */
3538 name = st->n.common->name;
3540 mio_pool_string(&name);
3542 p = st->n.common;
3543 mio_symbol_ref(&p->head);
3544 flags = p->saved ? 1 : 0;
3545 if (p->threadprivate) flags |= 2;
3546 mio_integer(&flags);
3548 mio_rparen();
3551 /* Write the blank common block to the module */
3553 static void
3554 write_blank_common (void)
3556 const char * name = BLANK_COMMON_NAME;
3557 int saved;
3559 if (gfc_current_ns->blank_common.head == NULL)
3560 return;
3562 mio_lparen();
3564 mio_pool_string(&name);
3566 mio_symbol_ref(&gfc_current_ns->blank_common.head);
3567 saved = gfc_current_ns->blank_common.saved;
3568 mio_integer(&saved);
3570 mio_rparen();
3573 /* Write equivalences to the module. */
3575 static void
3576 write_equiv(void)
3578 gfc_equiv *eq, *e;
3579 int num;
3581 num = 0;
3582 for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3584 mio_lparen();
3586 for(e=eq; e; e=e->eq)
3588 if (e->module == NULL)
3589 e->module = gfc_get_string("%s.eq.%d", module_name, num);
3590 mio_allocated_string(e->module);
3591 mio_expr(&e->expr);
3594 num++;
3595 mio_rparen();
3599 /* Write a symbol to the module. */
3601 static void
3602 write_symbol (int n, gfc_symbol * sym)
3605 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3606 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3608 mio_integer (&n);
3609 mio_pool_string (&sym->name);
3611 mio_pool_string (&sym->module);
3612 mio_pointer_ref (&sym->ns);
3614 mio_symbol (sym);
3615 write_char ('\n');
3619 /* Recursive traversal function to write the initial set of symbols to
3620 the module. We check to see if the symbol should be written
3621 according to the access specification. */
3623 static void
3624 write_symbol0 (gfc_symtree * st)
3626 gfc_symbol *sym;
3627 pointer_info *p;
3629 if (st == NULL)
3630 return;
3632 write_symbol0 (st->left);
3633 write_symbol0 (st->right);
3635 sym = st->n.sym;
3636 if (sym->module == NULL)
3637 sym->module = gfc_get_string (module_name);
3639 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3640 && !sym->attr.subroutine && !sym->attr.function)
3641 return;
3643 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3644 return;
3646 p = get_pointer (sym);
3647 if (p->type == P_UNKNOWN)
3648 p->type = P_SYMBOL;
3650 if (p->u.wsym.state == WRITTEN)
3651 return;
3653 write_symbol (p->integer, sym);
3654 p->u.wsym.state = WRITTEN;
3656 return;
3660 /* Recursive traversal function to write the secondary set of symbols
3661 to the module file. These are symbols that were not public yet are
3662 needed by the public symbols or another dependent symbol. The act
3663 of writing a symbol can modify the pointer_info tree, so we cease
3664 traversal if we find a symbol to write. We return nonzero if a
3665 symbol was written and pass that information upwards. */
3667 static int
3668 write_symbol1 (pointer_info * p)
3671 if (p == NULL)
3672 return 0;
3674 if (write_symbol1 (p->left))
3675 return 1;
3676 if (write_symbol1 (p->right))
3677 return 1;
3679 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3680 return 0;
3682 p->u.wsym.state = WRITTEN;
3683 write_symbol (p->integer, p->u.wsym.sym);
3685 return 1;
3689 /* Write operator interfaces associated with a symbol. */
3691 static void
3692 write_operator (gfc_user_op * uop)
3694 static char nullstring[] = "";
3695 const char *p = nullstring;
3697 if (uop->operator == NULL
3698 || !gfc_check_access (uop->access, uop->ns->default_access))
3699 return;
3701 mio_symbol_interface (&uop->name, &p, &uop->operator);
3705 /* Write generic interfaces associated with a symbol. */
3707 static void
3708 write_generic (gfc_symbol * sym)
3711 if (sym->generic == NULL
3712 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3713 return;
3715 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3719 static void
3720 write_symtree (gfc_symtree * st)
3722 gfc_symbol *sym;
3723 pointer_info *p;
3725 sym = st->n.sym;
3726 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3727 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3728 && !sym->attr.subroutine && !sym->attr.function))
3729 return;
3731 if (check_unique_name (st->name))
3732 return;
3734 p = find_pointer (sym);
3735 if (p == NULL)
3736 gfc_internal_error ("write_symtree(): Symbol not written");
3738 mio_pool_string (&st->name);
3739 mio_integer (&st->ambiguous);
3740 mio_integer (&p->integer);
3744 static void
3745 write_module (void)
3747 gfc_intrinsic_op i;
3749 /* Write the operator interfaces. */
3750 mio_lparen ();
3752 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3754 if (i == INTRINSIC_USER)
3755 continue;
3757 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3758 gfc_current_ns->default_access)
3759 ? &gfc_current_ns->operator[i] : NULL);
3762 mio_rparen ();
3763 write_char ('\n');
3764 write_char ('\n');
3766 mio_lparen ();
3767 gfc_traverse_user_op (gfc_current_ns, write_operator);
3768 mio_rparen ();
3769 write_char ('\n');
3770 write_char ('\n');
3772 mio_lparen ();
3773 gfc_traverse_ns (gfc_current_ns, write_generic);
3774 mio_rparen ();
3775 write_char ('\n');
3776 write_char ('\n');
3778 mio_lparen ();
3779 write_blank_common ();
3780 write_common (gfc_current_ns->common_root);
3781 mio_rparen ();
3782 write_char ('\n');
3783 write_char ('\n');
3785 mio_lparen();
3786 write_equiv();
3787 mio_rparen();
3788 write_char('\n'); write_char('\n');
3790 /* Write symbol information. First we traverse all symbols in the
3791 primary namespace, writing those that need to be written.
3792 Sometimes writing one symbol will cause another to need to be
3793 written. A list of these symbols ends up on the write stack, and
3794 we end by popping the bottom of the stack and writing the symbol
3795 until the stack is empty. */
3797 mio_lparen ();
3799 write_symbol0 (gfc_current_ns->sym_root);
3800 while (write_symbol1 (pi_root));
3802 mio_rparen ();
3804 write_char ('\n');
3805 write_char ('\n');
3807 mio_lparen ();
3808 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3809 mio_rparen ();
3813 /* Given module, dump it to disk. If there was an error while
3814 processing the module, dump_flag will be set to zero and we delete
3815 the module file, even if it was already there. */
3817 void
3818 gfc_dump_module (const char *name, int dump_flag)
3820 int n;
3821 char *filename, *p;
3822 time_t now;
3824 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3825 if (gfc_option.module_dir != NULL)
3827 filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3828 strcpy (filename, gfc_option.module_dir);
3829 strcat (filename, name);
3831 else
3833 filename = (char *) alloca (n);
3834 strcpy (filename, name);
3836 strcat (filename, MODULE_EXTENSION);
3838 if (!dump_flag)
3840 unlink (filename);
3841 return;
3844 module_fp = fopen (filename, "w");
3845 if (module_fp == NULL)
3846 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3847 filename, strerror (errno));
3849 now = time (NULL);
3850 p = ctime (&now);
3852 *strchr (p, '\n') = '\0';
3854 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3855 gfc_source_file, p);
3856 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3858 iomode = IO_OUTPUT;
3859 strcpy (module_name, name);
3861 init_pi_tree ();
3863 write_module ();
3865 free_pi_tree (pi_root);
3866 pi_root = NULL;
3868 write_char ('\n');
3870 if (fclose (module_fp))
3871 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3872 filename, strerror (errno));
3876 /* Add an integer named constant from a given module. */
3877 static void
3878 create_int_parameter (const char *name, int value, const char *modname)
3880 gfc_symtree * tmp_symtree;
3881 gfc_symbol * sym;
3883 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
3884 if (tmp_symtree != NULL)
3886 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
3887 return;
3888 else
3889 gfc_error ("Symbol '%s' already declared", name);
3892 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree);
3893 sym = tmp_symtree->n.sym;
3895 sym->module = gfc_get_string (modname);
3896 sym->attr.flavor = FL_PARAMETER;
3897 sym->ts.type = BT_INTEGER;
3898 sym->ts.kind = gfc_default_integer_kind;
3899 sym->value = gfc_int_expr (value);
3900 sym->attr.use_assoc = 1;
3903 /* USE the ISO_FORTRAN_ENV intrinsic module. */
3904 static void
3905 use_iso_fortran_env_module (void)
3907 static char mod[] = "iso_fortran_env";
3908 const char *local_name;
3909 gfc_use_rename *u;
3910 gfc_symbol *mod_sym;
3911 gfc_symtree *mod_symtree;
3912 int i;
3914 mstring symbol[] = {
3915 #define NAMED_INTCST(a,b,c) minit(b,0),
3916 #include "iso-fortran-env.def"
3917 #undef NAMED_INTCST
3918 minit (NULL, -1234) };
3920 i = 0;
3921 #define NAMED_INTCST(a,b,c) symbol[i++].tag = c;
3922 #include "iso-fortran-env.def"
3923 #undef NAMED_INTCST
3925 /* Generate the symbol for the module itself. */
3926 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
3927 if (mod_symtree == NULL)
3929 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree);
3930 gcc_assert (mod_symtree);
3931 mod_sym = mod_symtree->n.sym;
3933 mod_sym->attr.flavor = FL_MODULE;
3934 mod_sym->attr.intrinsic = 1;
3935 mod_sym->module = gfc_get_string (mod);
3937 else
3938 if (!mod_symtree->n.sym->attr.intrinsic)
3939 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
3940 "non-intrinsic module name used previously", mod);
3942 /* Generate the symbols for the module integer named constants. */
3943 if (only_flag)
3944 for (u = gfc_rename_list; u; u = u->next)
3946 for (i = 0; symbol[i].string; i++)
3947 if (strcmp (symbol[i].string, u->use_name) == 0)
3948 break;
3950 if (symbol[i].string == NULL)
3952 gfc_error ("Symbol '%s' referenced at %L does not exist in "
3953 "intrinsic module ISO_FORTRAN_ENV", u->use_name,
3954 &u->where);
3955 continue;
3958 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
3959 && strcmp (symbol[i].string, "numeric_storage_size") == 0)
3960 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
3961 "from intrinsic module ISO_FORTRAN_ENV at %L is "
3962 "incompatible with option %s", &u->where,
3963 gfc_option.flag_default_integer
3964 ? "-fdefault-integer-8" : "-fdefault-real-8");
3966 create_int_parameter (u->local_name[0] ? u->local_name
3967 : symbol[i].string,
3968 symbol[i].tag, mod);
3970 else
3972 for (i = 0; symbol[i].string; i++)
3974 local_name = NULL;
3975 for (u = gfc_rename_list; u; u = u->next)
3977 if (strcmp (symbol[i].string, u->use_name) == 0)
3979 local_name = u->local_name;
3980 u->found = 1;
3981 break;
3985 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
3986 && strcmp (symbol[i].string, "numeric_storage_size") == 0)
3987 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
3988 "from intrinsic module ISO_FORTRAN_ENV at %C is "
3989 "incompatible with option %s",
3990 gfc_option.flag_default_integer
3991 ? "-fdefault-integer-8" : "-fdefault-real-8");
3993 create_int_parameter (local_name ? local_name : symbol[i].string,
3994 symbol[i].tag, mod);
3997 for (u = gfc_rename_list; u; u = u->next)
3999 if (u->found)
4000 continue;
4002 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4003 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
4008 /* Process a USE directive. */
4010 void
4011 gfc_use_module (void)
4013 char *filename;
4014 gfc_state_data *p;
4015 int c, line, start;
4016 gfc_symtree *mod_symtree;
4018 filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
4019 + 1);
4020 strcpy (filename, module_name);
4021 strcat (filename, MODULE_EXTENSION);
4023 /* First, try to find an non-intrinsic module, unless the USE statement
4024 specified that the module is intrinsic. */
4025 module_fp = NULL;
4026 if (!specified_int)
4027 module_fp = gfc_open_included_file (filename, true, true);
4029 /* Then, see if it's an intrinsic one, unless the USE statement
4030 specified that the module is non-intrinsic. */
4031 if (module_fp == NULL && !specified_nonint)
4033 if (strcmp (module_name, "iso_fortran_env") == 0
4034 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
4035 "ISO_FORTRAN_ENV intrinsic module at %C") != FAILURE)
4037 use_iso_fortran_env_module ();
4038 return;
4041 module_fp = gfc_open_intrinsic_module (filename);
4043 if (module_fp == NULL && specified_int)
4044 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
4045 module_name);
4048 if (module_fp == NULL)
4049 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
4050 filename, strerror (errno));
4052 /* Check that we haven't already USEd an intrinsic module with the
4053 same name. */
4055 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
4056 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
4057 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
4058 "intrinsic module name used previously", module_name);
4060 iomode = IO_INPUT;
4061 module_line = 1;
4062 module_column = 1;
4063 start = 0;
4065 /* Skip the first two lines of the module, after checking that this is
4066 a gfortran module file. */
4067 line = 0;
4068 while (line < 2)
4070 c = module_char ();
4071 if (c == EOF)
4072 bad_module ("Unexpected end of module");
4073 if (start++ < 2)
4074 parse_name (c);
4075 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
4076 || (start == 2 && strcmp (atom_name, " module") != 0))
4077 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
4078 "file", filename);
4080 if (c == '\n')
4081 line++;
4084 /* Make sure we're not reading the same module that we may be building. */
4085 for (p = gfc_state_stack; p; p = p->previous)
4086 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
4087 gfc_fatal_error ("Can't USE the same module we're building!");
4089 init_pi_tree ();
4090 init_true_name_tree ();
4092 read_module ();
4094 free_true_name (true_name_root);
4095 true_name_root = NULL;
4097 free_pi_tree (pi_root);
4098 pi_root = NULL;
4100 fclose (module_fp);
4104 void
4105 gfc_module_init_2 (void)
4108 last_atom = ATOM_LPAREN;
4112 void
4113 gfc_module_done_2 (void)
4116 free_rename ();