PR fortran/29383
[official-gcc.git] / gcc / fortran / module.c
blobbd7da1c37df5c961ab1a00d2f1d9fa7b7ef4b6c5
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000-2014 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* The syntax of gfortran modules resembles that of lisp lists, i.e. a
23 sequence of atoms, which can be left or right parenthesis, names,
24 integers or strings. Parenthesis are always matched which allows
25 us to skip over sections at high speed without having to know
26 anything about the internal structure of the lists. A "name" is
27 usually a fortran 95 identifier, but can also start with '@' in
28 order to reference a hidden symbol.
30 The first line of a module is an informational message about what
31 created the module, the file it came from and when it was created.
32 The second line is a warning for people not to edit the module.
33 The rest of the module looks like:
35 ( ( <Interface info for UPLUS> )
36 ( <Interface info for UMINUS> )
37 ...
39 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
40 ...
42 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
43 ...
45 ( ( <common name> <symbol> <saved flag>)
46 ...
49 ( equivalence list )
51 ( <Symbol Number (in no particular order)>
52 <True name of symbol>
53 <Module name of symbol>
54 ( <symbol information> )
55 ...
57 ( <Symtree name>
58 <Ambiguous flag>
59 <Symbol number>
60 ...
63 In general, symbols refer to other symbols by their symbol number,
64 which are zero based. Symbols are written to the module in no
65 particular order. */
67 #include "config.h"
68 #include "system.h"
69 #include "coretypes.h"
70 #include "gfortran.h"
71 #include "arith.h"
72 #include "match.h"
73 #include "parse.h" /* FIXME */
74 #include "constructor.h"
75 #include "cpp.h"
76 #include "tree.h"
77 #include "stringpool.h"
78 #include "scanner.h"
79 #include <zlib.h>
81 #define MODULE_EXTENSION ".mod"
83 /* Don't put any single quote (') in MOD_VERSION, if you want it to be
84 recognized. */
85 #define MOD_VERSION "13"
88 /* Structure that describes a position within a module file. */
90 typedef struct
92 int column, line;
93 long pos;
95 module_locus;
97 /* Structure for list of symbols of intrinsic modules. */
98 typedef struct
100 int id;
101 const char *name;
102 int value;
103 int standard;
105 intmod_sym;
108 typedef enum
110 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
112 pointer_t;
114 /* The fixup structure lists pointers to pointers that have to
115 be updated when a pointer value becomes known. */
117 typedef struct fixup_t
119 void **pointer;
120 struct fixup_t *next;
122 fixup_t;
125 /* Structure for holding extra info needed for pointers being read. */
127 enum gfc_rsym_state
129 UNUSED,
130 NEEDED,
131 USED
134 enum gfc_wsym_state
136 UNREFERENCED = 0,
137 NEEDS_WRITE,
138 WRITTEN
141 typedef struct pointer_info
143 BBT_HEADER (pointer_info);
144 int integer;
145 pointer_t type;
147 /* The first component of each member of the union is the pointer
148 being stored. */
150 fixup_t *fixup;
152 union
154 void *pointer; /* Member for doing pointer searches. */
156 struct
158 gfc_symbol *sym;
159 char *true_name, *module, *binding_label;
160 fixup_t *stfixup;
161 gfc_symtree *symtree;
162 enum gfc_rsym_state state;
163 int ns, referenced, renamed;
164 module_locus where;
166 rsym;
168 struct
170 gfc_symbol *sym;
171 enum gfc_wsym_state state;
173 wsym;
178 pointer_info;
180 #define gfc_get_pointer_info() XCNEW (pointer_info)
183 /* Local variables */
185 /* The gzFile for the module we're reading or writing. */
186 static gzFile module_fp;
189 /* The name of the module we're reading (USE'ing) or writing. */
190 static const char *module_name;
191 static gfc_use_list *module_list;
193 /* If we're reading an intrinsic module, this is its ID. */
194 static intmod_id current_intmod;
196 /* Content of module. */
197 static char* module_content;
199 static long module_pos;
200 static int module_line, module_column, only_flag;
201 static int prev_module_line, prev_module_column;
203 static enum
204 { IO_INPUT, IO_OUTPUT }
205 iomode;
207 static gfc_use_rename *gfc_rename_list;
208 static pointer_info *pi_root;
209 static int symbol_number; /* Counter for assigning symbol numbers */
211 /* Tells mio_expr_ref to make symbols for unused equivalence members. */
212 static bool in_load_equiv;
216 /*****************************************************************/
218 /* Pointer/integer conversion. Pointers between structures are stored
219 as integers in the module file. The next couple of subroutines
220 handle this translation for reading and writing. */
222 /* Recursively free the tree of pointer structures. */
224 static void
225 free_pi_tree (pointer_info *p)
227 if (p == NULL)
228 return;
230 if (p->fixup != NULL)
231 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
233 free_pi_tree (p->left);
234 free_pi_tree (p->right);
236 if (iomode == IO_INPUT)
238 XDELETEVEC (p->u.rsym.true_name);
239 XDELETEVEC (p->u.rsym.module);
240 XDELETEVEC (p->u.rsym.binding_label);
243 free (p);
247 /* Compare pointers when searching by pointer. Used when writing a
248 module. */
250 static int
251 compare_pointers (void *_sn1, void *_sn2)
253 pointer_info *sn1, *sn2;
255 sn1 = (pointer_info *) _sn1;
256 sn2 = (pointer_info *) _sn2;
258 if (sn1->u.pointer < sn2->u.pointer)
259 return -1;
260 if (sn1->u.pointer > sn2->u.pointer)
261 return 1;
263 return 0;
267 /* Compare integers when searching by integer. Used when reading a
268 module. */
270 static int
271 compare_integers (void *_sn1, void *_sn2)
273 pointer_info *sn1, *sn2;
275 sn1 = (pointer_info *) _sn1;
276 sn2 = (pointer_info *) _sn2;
278 if (sn1->integer < sn2->integer)
279 return -1;
280 if (sn1->integer > sn2->integer)
281 return 1;
283 return 0;
287 /* Initialize the pointer_info tree. */
289 static void
290 init_pi_tree (void)
292 compare_fn compare;
293 pointer_info *p;
295 pi_root = NULL;
296 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
298 /* Pointer 0 is the NULL pointer. */
299 p = gfc_get_pointer_info ();
300 p->u.pointer = NULL;
301 p->integer = 0;
302 p->type = P_OTHER;
304 gfc_insert_bbt (&pi_root, p, compare);
306 /* Pointer 1 is the current namespace. */
307 p = gfc_get_pointer_info ();
308 p->u.pointer = gfc_current_ns;
309 p->integer = 1;
310 p->type = P_NAMESPACE;
312 gfc_insert_bbt (&pi_root, p, compare);
314 symbol_number = 2;
318 /* During module writing, call here with a pointer to something,
319 returning the pointer_info node. */
321 static pointer_info *
322 find_pointer (void *gp)
324 pointer_info *p;
326 p = pi_root;
327 while (p != NULL)
329 if (p->u.pointer == gp)
330 break;
331 p = (gp < p->u.pointer) ? p->left : p->right;
334 return p;
338 /* Given a pointer while writing, returns the pointer_info tree node,
339 creating it if it doesn't exist. */
341 static pointer_info *
342 get_pointer (void *gp)
344 pointer_info *p;
346 p = find_pointer (gp);
347 if (p != NULL)
348 return p;
350 /* Pointer doesn't have an integer. Give it one. */
351 p = gfc_get_pointer_info ();
353 p->u.pointer = gp;
354 p->integer = symbol_number++;
356 gfc_insert_bbt (&pi_root, p, compare_pointers);
358 return p;
362 /* Given an integer during reading, find it in the pointer_info tree,
363 creating the node if not found. */
365 static pointer_info *
366 get_integer (int integer)
368 pointer_info *p, t;
369 int c;
371 t.integer = integer;
373 p = pi_root;
374 while (p != NULL)
376 c = compare_integers (&t, p);
377 if (c == 0)
378 break;
380 p = (c < 0) ? p->left : p->right;
383 if (p != NULL)
384 return p;
386 p = gfc_get_pointer_info ();
387 p->integer = integer;
388 p->u.pointer = NULL;
390 gfc_insert_bbt (&pi_root, p, compare_integers);
392 return p;
396 /* Resolve any fixups using a known pointer. */
398 static void
399 resolve_fixups (fixup_t *f, void *gp)
401 fixup_t *next;
403 for (; f; f = next)
405 next = f->next;
406 *(f->pointer) = gp;
407 free (f);
412 /* Convert a string such that it starts with a lower-case character. Used
413 to convert the symtree name of a derived-type to the symbol name or to
414 the name of the associated generic function. */
416 static const char *
417 dt_lower_string (const char *name)
419 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
420 return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name[0]),
421 &name[1]);
422 return gfc_get_string (name);
426 /* Convert a string such that it starts with an upper-case character. Used to
427 return the symtree-name for a derived type; the symbol name itself and the
428 symtree/symbol name of the associated generic function start with a lower-
429 case character. */
431 static const char *
432 dt_upper_string (const char *name)
434 if (name[0] != (char) TOUPPER ((unsigned char) name[0]))
435 return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name[0]),
436 &name[1]);
437 return gfc_get_string (name);
440 /* Call here during module reading when we know what pointer to
441 associate with an integer. Any fixups that exist are resolved at
442 this time. */
444 static void
445 associate_integer_pointer (pointer_info *p, void *gp)
447 if (p->u.pointer != NULL)
448 gfc_internal_error ("associate_integer_pointer(): Already associated");
450 p->u.pointer = gp;
452 resolve_fixups (p->fixup, gp);
454 p->fixup = NULL;
458 /* During module reading, given an integer and a pointer to a pointer,
459 either store the pointer from an already-known value or create a
460 fixup structure in order to store things later. Returns zero if
461 the reference has been actually stored, or nonzero if the reference
462 must be fixed later (i.e., associate_integer_pointer must be called
463 sometime later. Returns the pointer_info structure. */
465 static pointer_info *
466 add_fixup (int integer, void *gp)
468 pointer_info *p;
469 fixup_t *f;
470 char **cp;
472 p = get_integer (integer);
474 if (p->integer == 0 || p->u.pointer != NULL)
476 cp = (char **) gp;
477 *cp = (char *) p->u.pointer;
479 else
481 f = XCNEW (fixup_t);
483 f->next = p->fixup;
484 p->fixup = f;
486 f->pointer = (void **) gp;
489 return p;
493 /*****************************************************************/
495 /* Parser related subroutines */
497 /* Free the rename list left behind by a USE statement. */
499 static void
500 free_rename (gfc_use_rename *list)
502 gfc_use_rename *next;
504 for (; list; list = next)
506 next = list->next;
507 free (list);
512 /* Match a USE statement. */
514 match
515 gfc_match_use (void)
517 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
518 gfc_use_rename *tail = NULL, *new_use;
519 interface_type type, type2;
520 gfc_intrinsic_op op;
521 match m;
522 gfc_use_list *use_list;
524 use_list = gfc_get_use_list ();
526 if (gfc_match (" , ") == MATCH_YES)
528 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
530 if (!gfc_notify_std (GFC_STD_F2003, "module "
531 "nature in USE statement at %C"))
532 goto cleanup;
534 if (strcmp (module_nature, "intrinsic") == 0)
535 use_list->intrinsic = true;
536 else
538 if (strcmp (module_nature, "non_intrinsic") == 0)
539 use_list->non_intrinsic = true;
540 else
542 gfc_error ("Module nature in USE statement at %C shall "
543 "be either INTRINSIC or NON_INTRINSIC");
544 goto cleanup;
548 else
550 /* Help output a better error message than "Unclassifiable
551 statement". */
552 gfc_match (" %n", module_nature);
553 if (strcmp (module_nature, "intrinsic") == 0
554 || strcmp (module_nature, "non_intrinsic") == 0)
555 gfc_error ("\"::\" was expected after module nature at %C "
556 "but was not found");
557 free (use_list);
558 return m;
561 else
563 m = gfc_match (" ::");
564 if (m == MATCH_YES &&
565 !gfc_notify_std(GFC_STD_F2003, "\"USE :: module\" at %C"))
566 goto cleanup;
568 if (m != MATCH_YES)
570 m = gfc_match ("% ");
571 if (m != MATCH_YES)
573 free (use_list);
574 return m;
579 use_list->where = gfc_current_locus;
581 m = gfc_match_name (name);
582 if (m != MATCH_YES)
584 free (use_list);
585 return m;
588 use_list->module_name = gfc_get_string (name);
590 if (gfc_match_eos () == MATCH_YES)
591 goto done;
593 if (gfc_match_char (',') != MATCH_YES)
594 goto syntax;
596 if (gfc_match (" only :") == MATCH_YES)
597 use_list->only_flag = true;
599 if (gfc_match_eos () == MATCH_YES)
600 goto done;
602 for (;;)
604 /* Get a new rename struct and add it to the rename list. */
605 new_use = gfc_get_use_rename ();
606 new_use->where = gfc_current_locus;
607 new_use->found = 0;
609 if (use_list->rename == NULL)
610 use_list->rename = new_use;
611 else
612 tail->next = new_use;
613 tail = new_use;
615 /* See what kind of interface we're dealing with. Assume it is
616 not an operator. */
617 new_use->op = INTRINSIC_NONE;
618 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
619 goto cleanup;
621 switch (type)
623 case INTERFACE_NAMELESS:
624 gfc_error ("Missing generic specification in USE statement at %C");
625 goto cleanup;
627 case INTERFACE_USER_OP:
628 case INTERFACE_GENERIC:
629 m = gfc_match (" =>");
631 if (type == INTERFACE_USER_OP && m == MATCH_YES
632 && (!gfc_notify_std(GFC_STD_F2003, "Renaming "
633 "operators in USE statements at %C")))
634 goto cleanup;
636 if (type == INTERFACE_USER_OP)
637 new_use->op = INTRINSIC_USER;
639 if (use_list->only_flag)
641 if (m != MATCH_YES)
642 strcpy (new_use->use_name, name);
643 else
645 strcpy (new_use->local_name, name);
646 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
647 if (type != type2)
648 goto syntax;
649 if (m == MATCH_NO)
650 goto syntax;
651 if (m == MATCH_ERROR)
652 goto cleanup;
655 else
657 if (m != MATCH_YES)
658 goto syntax;
659 strcpy (new_use->local_name, name);
661 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
662 if (type != type2)
663 goto syntax;
664 if (m == MATCH_NO)
665 goto syntax;
666 if (m == MATCH_ERROR)
667 goto cleanup;
670 if (strcmp (new_use->use_name, use_list->module_name) == 0
671 || strcmp (new_use->local_name, use_list->module_name) == 0)
673 gfc_error ("The name '%s' at %C has already been used as "
674 "an external module name.", use_list->module_name);
675 goto cleanup;
677 break;
679 case INTERFACE_INTRINSIC_OP:
680 new_use->op = op;
681 break;
683 default:
684 gcc_unreachable ();
687 if (gfc_match_eos () == MATCH_YES)
688 break;
689 if (gfc_match_char (',') != MATCH_YES)
690 goto syntax;
693 done:
694 if (module_list)
696 gfc_use_list *last = module_list;
697 while (last->next)
698 last = last->next;
699 last->next = use_list;
701 else
702 module_list = use_list;
704 return MATCH_YES;
706 syntax:
707 gfc_syntax_error (ST_USE);
709 cleanup:
710 free_rename (use_list->rename);
711 free (use_list);
712 return MATCH_ERROR;
716 /* Given a name and a number, inst, return the inst name
717 under which to load this symbol. Returns NULL if this
718 symbol shouldn't be loaded. If inst is zero, returns
719 the number of instances of this name. If interface is
720 true, a user-defined operator is sought, otherwise only
721 non-operators are sought. */
723 static const char *
724 find_use_name_n (const char *name, int *inst, bool interface)
726 gfc_use_rename *u;
727 const char *low_name = NULL;
728 int i;
730 /* For derived types. */
731 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
732 low_name = dt_lower_string (name);
734 i = 0;
735 for (u = gfc_rename_list; u; u = u->next)
737 if ((!low_name && strcmp (u->use_name, name) != 0)
738 || (low_name && strcmp (u->use_name, low_name) != 0)
739 || (u->op == INTRINSIC_USER && !interface)
740 || (u->op != INTRINSIC_USER && interface))
741 continue;
742 if (++i == *inst)
743 break;
746 if (!*inst)
748 *inst = i;
749 return NULL;
752 if (u == NULL)
753 return only_flag ? NULL : name;
755 u->found = 1;
757 if (low_name)
759 if (u->local_name[0] == '\0')
760 return name;
761 return dt_upper_string (u->local_name);
764 return (u->local_name[0] != '\0') ? u->local_name : name;
768 /* Given a name, return the name under which to load this symbol.
769 Returns NULL if this symbol shouldn't be loaded. */
771 static const char *
772 find_use_name (const char *name, bool interface)
774 int i = 1;
775 return find_use_name_n (name, &i, interface);
779 /* Given a real name, return the number of use names associated with it. */
781 static int
782 number_use_names (const char *name, bool interface)
784 int i = 0;
785 find_use_name_n (name, &i, interface);
786 return i;
790 /* Try to find the operator in the current list. */
792 static gfc_use_rename *
793 find_use_operator (gfc_intrinsic_op op)
795 gfc_use_rename *u;
797 for (u = gfc_rename_list; u; u = u->next)
798 if (u->op == op)
799 return u;
801 return NULL;
805 /*****************************************************************/
807 /* The next couple of subroutines maintain a tree used to avoid a
808 brute-force search for a combination of true name and module name.
809 While symtree names, the name that a particular symbol is known by
810 can changed with USE statements, we still have to keep track of the
811 true names to generate the correct reference, and also avoid
812 loading the same real symbol twice in a program unit.
814 When we start reading, the true name tree is built and maintained
815 as symbols are read. The tree is searched as we load new symbols
816 to see if it already exists someplace in the namespace. */
818 typedef struct true_name
820 BBT_HEADER (true_name);
821 const char *name;
822 gfc_symbol *sym;
824 true_name;
826 static true_name *true_name_root;
829 /* Compare two true_name structures. */
831 static int
832 compare_true_names (void *_t1, void *_t2)
834 true_name *t1, *t2;
835 int c;
837 t1 = (true_name *) _t1;
838 t2 = (true_name *) _t2;
840 c = ((t1->sym->module > t2->sym->module)
841 - (t1->sym->module < t2->sym->module));
842 if (c != 0)
843 return c;
845 return strcmp (t1->name, t2->name);
849 /* Given a true name, search the true name tree to see if it exists
850 within the main namespace. */
852 static gfc_symbol *
853 find_true_name (const char *name, const char *module)
855 true_name t, *p;
856 gfc_symbol sym;
857 int c;
859 t.name = gfc_get_string (name);
860 if (module != NULL)
861 sym.module = gfc_get_string (module);
862 else
863 sym.module = NULL;
864 t.sym = &sym;
866 p = true_name_root;
867 while (p != NULL)
869 c = compare_true_names ((void *) (&t), (void *) p);
870 if (c == 0)
871 return p->sym;
873 p = (c < 0) ? p->left : p->right;
876 return NULL;
880 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
882 static void
883 add_true_name (gfc_symbol *sym)
885 true_name *t;
887 t = XCNEW (true_name);
888 t->sym = sym;
889 if (sym->attr.flavor == FL_DERIVED)
890 t->name = dt_upper_string (sym->name);
891 else
892 t->name = sym->name;
894 gfc_insert_bbt (&true_name_root, t, compare_true_names);
898 /* Recursive function to build the initial true name tree by
899 recursively traversing the current namespace. */
901 static void
902 build_tnt (gfc_symtree *st)
904 const char *name;
905 if (st == NULL)
906 return;
908 build_tnt (st->left);
909 build_tnt (st->right);
911 if (st->n.sym->attr.flavor == FL_DERIVED)
912 name = dt_upper_string (st->n.sym->name);
913 else
914 name = st->n.sym->name;
916 if (find_true_name (name, st->n.sym->module) != NULL)
917 return;
919 add_true_name (st->n.sym);
923 /* Initialize the true name tree with the current namespace. */
925 static void
926 init_true_name_tree (void)
928 true_name_root = NULL;
929 build_tnt (gfc_current_ns->sym_root);
933 /* Recursively free a true name tree node. */
935 static void
936 free_true_name (true_name *t)
938 if (t == NULL)
939 return;
940 free_true_name (t->left);
941 free_true_name (t->right);
943 free (t);
947 /*****************************************************************/
949 /* Module reading and writing. */
951 /* The following are versions similar to the ones in scanner.c, but
952 for dealing with compressed module files. */
954 static gzFile
955 gzopen_included_file_1 (const char *name, gfc_directorylist *list,
956 bool module, bool system)
958 char *fullname;
959 gfc_directorylist *p;
960 gzFile f;
962 for (p = list; p; p = p->next)
964 if (module && !p->use_for_modules)
965 continue;
967 fullname = (char *) alloca(strlen (p->path) + strlen (name) + 1);
968 strcpy (fullname, p->path);
969 strcat (fullname, name);
971 f = gzopen (fullname, "r");
972 if (f != NULL)
974 if (gfc_cpp_makedep ())
975 gfc_cpp_add_dep (fullname, system);
977 return f;
981 return NULL;
984 static gzFile
985 gzopen_included_file (const char *name, bool include_cwd, bool module)
987 gzFile f = NULL;
989 if (IS_ABSOLUTE_PATH (name) || include_cwd)
991 f = gzopen (name, "r");
992 if (f && gfc_cpp_makedep ())
993 gfc_cpp_add_dep (name, false);
996 if (!f)
997 f = gzopen_included_file_1 (name, include_dirs, module, false);
999 return f;
1002 static gzFile
1003 gzopen_intrinsic_module (const char* name)
1005 gzFile f = NULL;
1007 if (IS_ABSOLUTE_PATH (name))
1009 f = gzopen (name, "r");
1010 if (f && gfc_cpp_makedep ())
1011 gfc_cpp_add_dep (name, true);
1014 if (!f)
1015 f = gzopen_included_file_1 (name, intrinsic_modules_dirs, true, true);
1017 return f;
1021 typedef enum
1023 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
1025 atom_type;
1027 static atom_type last_atom;
1030 /* The name buffer must be at least as long as a symbol name. Right
1031 now it's not clear how we're going to store numeric constants--
1032 probably as a hexadecimal string, since this will allow the exact
1033 number to be preserved (this can't be done by a decimal
1034 representation). Worry about that later. TODO! */
1036 #define MAX_ATOM_SIZE 100
1038 static int atom_int;
1039 static char *atom_string, atom_name[MAX_ATOM_SIZE];
1042 /* Report problems with a module. Error reporting is not very
1043 elaborate, since this sorts of errors shouldn't really happen.
1044 This subroutine never returns. */
1046 static void bad_module (const char *) ATTRIBUTE_NORETURN;
1048 static void
1049 bad_module (const char *msgid)
1051 XDELETEVEC (module_content);
1052 module_content = NULL;
1054 switch (iomode)
1056 case IO_INPUT:
1057 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
1058 module_name, module_line, module_column, msgid);
1059 break;
1060 case IO_OUTPUT:
1061 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
1062 module_name, module_line, module_column, msgid);
1063 break;
1064 default:
1065 gfc_fatal_error ("Module %s at line %d column %d: %s",
1066 module_name, module_line, module_column, msgid);
1067 break;
1072 /* Set the module's input pointer. */
1074 static void
1075 set_module_locus (module_locus *m)
1077 module_column = m->column;
1078 module_line = m->line;
1079 module_pos = m->pos;
1083 /* Get the module's input pointer so that we can restore it later. */
1085 static void
1086 get_module_locus (module_locus *m)
1088 m->column = module_column;
1089 m->line = module_line;
1090 m->pos = module_pos;
1094 /* Get the next character in the module, updating our reckoning of
1095 where we are. */
1097 static int
1098 module_char (void)
1100 const char c = module_content[module_pos++];
1101 if (c == '\0')
1102 bad_module ("Unexpected EOF");
1104 prev_module_line = module_line;
1105 prev_module_column = module_column;
1107 if (c == '\n')
1109 module_line++;
1110 module_column = 0;
1113 module_column++;
1114 return c;
1117 /* Unget a character while remembering the line and column. Works for
1118 a single character only. */
1120 static void
1121 module_unget_char (void)
1123 module_line = prev_module_line;
1124 module_column = prev_module_column;
1125 module_pos--;
1128 /* Parse a string constant. The delimiter is guaranteed to be a
1129 single quote. */
1131 static void
1132 parse_string (void)
1134 int c;
1135 size_t cursz = 30;
1136 size_t len = 0;
1138 atom_string = XNEWVEC (char, cursz);
1140 for ( ; ; )
1142 c = module_char ();
1144 if (c == '\'')
1146 int c2 = module_char ();
1147 if (c2 != '\'')
1149 module_unget_char ();
1150 break;
1154 if (len >= cursz)
1156 cursz *= 2;
1157 atom_string = XRESIZEVEC (char, atom_string, cursz);
1159 atom_string[len] = c;
1160 len++;
1163 atom_string = XRESIZEVEC (char, atom_string, len + 1);
1164 atom_string[len] = '\0'; /* C-style string for debug purposes. */
1168 /* Parse a small integer. */
1170 static void
1171 parse_integer (int c)
1173 atom_int = c - '0';
1175 for (;;)
1177 c = module_char ();
1178 if (!ISDIGIT (c))
1180 module_unget_char ();
1181 break;
1184 atom_int = 10 * atom_int + c - '0';
1185 if (atom_int > 99999999)
1186 bad_module ("Integer overflow");
1192 /* Parse a name. */
1194 static void
1195 parse_name (int c)
1197 char *p;
1198 int len;
1200 p = atom_name;
1202 *p++ = c;
1203 len = 1;
1205 for (;;)
1207 c = module_char ();
1208 if (!ISALNUM (c) && c != '_' && c != '-')
1210 module_unget_char ();
1211 break;
1214 *p++ = c;
1215 if (++len > GFC_MAX_SYMBOL_LEN)
1216 bad_module ("Name too long");
1219 *p = '\0';
1224 /* Read the next atom in the module's input stream. */
1226 static atom_type
1227 parse_atom (void)
1229 int c;
1233 c = module_char ();
1235 while (c == ' ' || c == '\r' || c == '\n');
1237 switch (c)
1239 case '(':
1240 return ATOM_LPAREN;
1242 case ')':
1243 return ATOM_RPAREN;
1245 case '\'':
1246 parse_string ();
1247 return ATOM_STRING;
1249 case '0':
1250 case '1':
1251 case '2':
1252 case '3':
1253 case '4':
1254 case '5':
1255 case '6':
1256 case '7':
1257 case '8':
1258 case '9':
1259 parse_integer (c);
1260 return ATOM_INTEGER;
1262 case 'a':
1263 case 'b':
1264 case 'c':
1265 case 'd':
1266 case 'e':
1267 case 'f':
1268 case 'g':
1269 case 'h':
1270 case 'i':
1271 case 'j':
1272 case 'k':
1273 case 'l':
1274 case 'm':
1275 case 'n':
1276 case 'o':
1277 case 'p':
1278 case 'q':
1279 case 'r':
1280 case 's':
1281 case 't':
1282 case 'u':
1283 case 'v':
1284 case 'w':
1285 case 'x':
1286 case 'y':
1287 case 'z':
1288 case 'A':
1289 case 'B':
1290 case 'C':
1291 case 'D':
1292 case 'E':
1293 case 'F':
1294 case 'G':
1295 case 'H':
1296 case 'I':
1297 case 'J':
1298 case 'K':
1299 case 'L':
1300 case 'M':
1301 case 'N':
1302 case 'O':
1303 case 'P':
1304 case 'Q':
1305 case 'R':
1306 case 'S':
1307 case 'T':
1308 case 'U':
1309 case 'V':
1310 case 'W':
1311 case 'X':
1312 case 'Y':
1313 case 'Z':
1314 parse_name (c);
1315 return ATOM_NAME;
1317 default:
1318 bad_module ("Bad name");
1321 /* Not reached. */
1325 /* Peek at the next atom on the input. */
1327 static atom_type
1328 peek_atom (void)
1330 int c;
1334 c = module_char ();
1336 while (c == ' ' || c == '\r' || c == '\n');
1338 switch (c)
1340 case '(':
1341 module_unget_char ();
1342 return ATOM_LPAREN;
1344 case ')':
1345 module_unget_char ();
1346 return ATOM_RPAREN;
1348 case '\'':
1349 module_unget_char ();
1350 return ATOM_STRING;
1352 case '0':
1353 case '1':
1354 case '2':
1355 case '3':
1356 case '4':
1357 case '5':
1358 case '6':
1359 case '7':
1360 case '8':
1361 case '9':
1362 module_unget_char ();
1363 return ATOM_INTEGER;
1365 case 'a':
1366 case 'b':
1367 case 'c':
1368 case 'd':
1369 case 'e':
1370 case 'f':
1371 case 'g':
1372 case 'h':
1373 case 'i':
1374 case 'j':
1375 case 'k':
1376 case 'l':
1377 case 'm':
1378 case 'n':
1379 case 'o':
1380 case 'p':
1381 case 'q':
1382 case 'r':
1383 case 's':
1384 case 't':
1385 case 'u':
1386 case 'v':
1387 case 'w':
1388 case 'x':
1389 case 'y':
1390 case 'z':
1391 case 'A':
1392 case 'B':
1393 case 'C':
1394 case 'D':
1395 case 'E':
1396 case 'F':
1397 case 'G':
1398 case 'H':
1399 case 'I':
1400 case 'J':
1401 case 'K':
1402 case 'L':
1403 case 'M':
1404 case 'N':
1405 case 'O':
1406 case 'P':
1407 case 'Q':
1408 case 'R':
1409 case 'S':
1410 case 'T':
1411 case 'U':
1412 case 'V':
1413 case 'W':
1414 case 'X':
1415 case 'Y':
1416 case 'Z':
1417 module_unget_char ();
1418 return ATOM_NAME;
1420 default:
1421 bad_module ("Bad name");
1426 /* Read the next atom from the input, requiring that it be a
1427 particular kind. */
1429 static void
1430 require_atom (atom_type type)
1432 atom_type t;
1433 const char *p;
1434 int column, line;
1436 column = module_column;
1437 line = module_line;
1439 t = parse_atom ();
1440 if (t != type)
1442 switch (type)
1444 case ATOM_NAME:
1445 p = _("Expected name");
1446 break;
1447 case ATOM_LPAREN:
1448 p = _("Expected left parenthesis");
1449 break;
1450 case ATOM_RPAREN:
1451 p = _("Expected right parenthesis");
1452 break;
1453 case ATOM_INTEGER:
1454 p = _("Expected integer");
1455 break;
1456 case ATOM_STRING:
1457 p = _("Expected string");
1458 break;
1459 default:
1460 gfc_internal_error ("require_atom(): bad atom type required");
1463 module_column = column;
1464 module_line = line;
1465 bad_module (p);
1470 /* Given a pointer to an mstring array, require that the current input
1471 be one of the strings in the array. We return the enum value. */
1473 static int
1474 find_enum (const mstring *m)
1476 int i;
1478 i = gfc_string2code (m, atom_name);
1479 if (i >= 0)
1480 return i;
1482 bad_module ("find_enum(): Enum not found");
1484 /* Not reached. */
1488 /* Read a string. The caller is responsible for freeing. */
1490 static char*
1491 read_string (void)
1493 char* p;
1494 require_atom (ATOM_STRING);
1495 p = atom_string;
1496 atom_string = NULL;
1497 return p;
1501 /**************** Module output subroutines ***************************/
1503 /* Output a character to a module file. */
1505 static void
1506 write_char (char out)
1508 if (gzputc (module_fp, out) == EOF)
1509 gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno));
1511 if (out != '\n')
1512 module_column++;
1513 else
1515 module_column = 1;
1516 module_line++;
1521 /* Write an atom to a module. The line wrapping isn't perfect, but it
1522 should work most of the time. This isn't that big of a deal, since
1523 the file really isn't meant to be read by people anyway. */
1525 static void
1526 write_atom (atom_type atom, const void *v)
1528 char buffer[20];
1529 int i, len;
1530 const char *p;
1532 switch (atom)
1534 case ATOM_STRING:
1535 case ATOM_NAME:
1536 p = (const char *) v;
1537 break;
1539 case ATOM_LPAREN:
1540 p = "(";
1541 break;
1543 case ATOM_RPAREN:
1544 p = ")";
1545 break;
1547 case ATOM_INTEGER:
1548 i = *((const int *) v);
1549 if (i < 0)
1550 gfc_internal_error ("write_atom(): Writing negative integer");
1552 sprintf (buffer, "%d", i);
1553 p = buffer;
1554 break;
1556 default:
1557 gfc_internal_error ("write_atom(): Trying to write dab atom");
1561 if(p == NULL || *p == '\0')
1562 len = 0;
1563 else
1564 len = strlen (p);
1566 if (atom != ATOM_RPAREN)
1568 if (module_column + len > 72)
1569 write_char ('\n');
1570 else
1573 if (last_atom != ATOM_LPAREN && module_column != 1)
1574 write_char (' ');
1578 if (atom == ATOM_STRING)
1579 write_char ('\'');
1581 while (p != NULL && *p)
1583 if (atom == ATOM_STRING && *p == '\'')
1584 write_char ('\'');
1585 write_char (*p++);
1588 if (atom == ATOM_STRING)
1589 write_char ('\'');
1591 last_atom = atom;
1596 /***************** Mid-level I/O subroutines *****************/
1598 /* These subroutines let their caller read or write atoms without
1599 caring about which of the two is actually happening. This lets a
1600 subroutine concentrate on the actual format of the data being
1601 written. */
1603 static void mio_expr (gfc_expr **);
1604 pointer_info *mio_symbol_ref (gfc_symbol **);
1605 pointer_info *mio_interface_rest (gfc_interface **);
1606 static void mio_symtree_ref (gfc_symtree **);
1608 /* Read or write an enumerated value. On writing, we return the input
1609 value for the convenience of callers. We avoid using an integer
1610 pointer because enums are sometimes inside bitfields. */
1612 static int
1613 mio_name (int t, const mstring *m)
1615 if (iomode == IO_OUTPUT)
1616 write_atom (ATOM_NAME, gfc_code2string (m, t));
1617 else
1619 require_atom (ATOM_NAME);
1620 t = find_enum (m);
1623 return t;
1626 /* Specialization of mio_name. */
1628 #define DECL_MIO_NAME(TYPE) \
1629 static inline TYPE \
1630 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1632 return (TYPE) mio_name ((int) t, m); \
1634 #define MIO_NAME(TYPE) mio_name_##TYPE
1636 static void
1637 mio_lparen (void)
1639 if (iomode == IO_OUTPUT)
1640 write_atom (ATOM_LPAREN, NULL);
1641 else
1642 require_atom (ATOM_LPAREN);
1646 static void
1647 mio_rparen (void)
1649 if (iomode == IO_OUTPUT)
1650 write_atom (ATOM_RPAREN, NULL);
1651 else
1652 require_atom (ATOM_RPAREN);
1656 static void
1657 mio_integer (int *ip)
1659 if (iomode == IO_OUTPUT)
1660 write_atom (ATOM_INTEGER, ip);
1661 else
1663 require_atom (ATOM_INTEGER);
1664 *ip = atom_int;
1669 /* Read or write a gfc_intrinsic_op value. */
1671 static void
1672 mio_intrinsic_op (gfc_intrinsic_op* op)
1674 /* FIXME: Would be nicer to do this via the operators symbolic name. */
1675 if (iomode == IO_OUTPUT)
1677 int converted = (int) *op;
1678 write_atom (ATOM_INTEGER, &converted);
1680 else
1682 require_atom (ATOM_INTEGER);
1683 *op = (gfc_intrinsic_op) atom_int;
1688 /* Read or write a character pointer that points to a string on the heap. */
1690 static const char *
1691 mio_allocated_string (const char *s)
1693 if (iomode == IO_OUTPUT)
1695 write_atom (ATOM_STRING, s);
1696 return s;
1698 else
1700 require_atom (ATOM_STRING);
1701 return atom_string;
1706 /* Functions for quoting and unquoting strings. */
1708 static char *
1709 quote_string (const gfc_char_t *s, const size_t slength)
1711 const gfc_char_t *p;
1712 char *res, *q;
1713 size_t len = 0, i;
1715 /* Calculate the length we'll need: a backslash takes two ("\\"),
1716 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1717 for (p = s, i = 0; i < slength; p++, i++)
1719 if (*p == '\\')
1720 len += 2;
1721 else if (!gfc_wide_is_printable (*p))
1722 len += 10;
1723 else
1724 len++;
1727 q = res = XCNEWVEC (char, len + 1);
1728 for (p = s, i = 0; i < slength; p++, i++)
1730 if (*p == '\\')
1731 *q++ = '\\', *q++ = '\\';
1732 else if (!gfc_wide_is_printable (*p))
1734 sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1735 (unsigned HOST_WIDE_INT) *p);
1736 q += 10;
1738 else
1739 *q++ = (unsigned char) *p;
1742 res[len] = '\0';
1743 return res;
1746 static gfc_char_t *
1747 unquote_string (const char *s)
1749 size_t len, i;
1750 const char *p;
1751 gfc_char_t *res;
1753 for (p = s, len = 0; *p; p++, len++)
1755 if (*p != '\\')
1756 continue;
1758 if (p[1] == '\\')
1759 p++;
1760 else if (p[1] == 'U')
1761 p += 9; /* That is a "\U????????". */
1762 else
1763 gfc_internal_error ("unquote_string(): got bad string");
1766 res = gfc_get_wide_string (len + 1);
1767 for (i = 0, p = s; i < len; i++, p++)
1769 gcc_assert (*p);
1771 if (*p != '\\')
1772 res[i] = (unsigned char) *p;
1773 else if (p[1] == '\\')
1775 res[i] = (unsigned char) '\\';
1776 p++;
1778 else
1780 /* We read the 8-digits hexadecimal constant that follows. */
1781 int j;
1782 unsigned n;
1783 gfc_char_t c = 0;
1785 gcc_assert (p[1] == 'U');
1786 for (j = 0; j < 8; j++)
1788 c = c << 4;
1789 gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1790 c += n;
1793 res[i] = c;
1794 p += 9;
1798 res[len] = '\0';
1799 return res;
1803 /* Read or write a character pointer that points to a wide string on the
1804 heap, performing quoting/unquoting of nonprintable characters using the
1805 form \U???????? (where each ? is a hexadecimal digit).
1806 Length is the length of the string, only known and used in output mode. */
1808 static const gfc_char_t *
1809 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1811 if (iomode == IO_OUTPUT)
1813 char *quoted = quote_string (s, length);
1814 write_atom (ATOM_STRING, quoted);
1815 free (quoted);
1816 return s;
1818 else
1820 gfc_char_t *unquoted;
1822 require_atom (ATOM_STRING);
1823 unquoted = unquote_string (atom_string);
1824 free (atom_string);
1825 return unquoted;
1830 /* Read or write a string that is in static memory. */
1832 static void
1833 mio_pool_string (const char **stringp)
1835 /* TODO: one could write the string only once, and refer to it via a
1836 fixup pointer. */
1838 /* As a special case we have to deal with a NULL string. This
1839 happens for the 'module' member of 'gfc_symbol's that are not in a
1840 module. We read / write these as the empty string. */
1841 if (iomode == IO_OUTPUT)
1843 const char *p = *stringp == NULL ? "" : *stringp;
1844 write_atom (ATOM_STRING, p);
1846 else
1848 require_atom (ATOM_STRING);
1849 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1850 free (atom_string);
1855 /* Read or write a string that is inside of some already-allocated
1856 structure. */
1858 static void
1859 mio_internal_string (char *string)
1861 if (iomode == IO_OUTPUT)
1862 write_atom (ATOM_STRING, string);
1863 else
1865 require_atom (ATOM_STRING);
1866 strcpy (string, atom_string);
1867 free (atom_string);
1872 typedef enum
1873 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1874 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1875 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1876 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1877 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE,
1878 AB_ALLOC_COMP, AB_POINTER_COMP, AB_PROC_POINTER_COMP, AB_PRIVATE_COMP,
1879 AB_VALUE, AB_VOLATILE, AB_PROTECTED, AB_LOCK_COMP,
1880 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1881 AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
1882 AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER,
1883 AB_IMPLICIT_PURE, AB_ARTIFICIAL, AB_UNLIMITED_POLY, AB_OMP_DECLARE_TARGET
1885 ab_attribute;
1887 static const mstring attr_bits[] =
1889 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1890 minit ("ARTIFICIAL", AB_ARTIFICIAL),
1891 minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1892 minit ("DIMENSION", AB_DIMENSION),
1893 minit ("CODIMENSION", AB_CODIMENSION),
1894 minit ("CONTIGUOUS", AB_CONTIGUOUS),
1895 minit ("EXTERNAL", AB_EXTERNAL),
1896 minit ("INTRINSIC", AB_INTRINSIC),
1897 minit ("OPTIONAL", AB_OPTIONAL),
1898 minit ("POINTER", AB_POINTER),
1899 minit ("VOLATILE", AB_VOLATILE),
1900 minit ("TARGET", AB_TARGET),
1901 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1902 minit ("DUMMY", AB_DUMMY),
1903 minit ("RESULT", AB_RESULT),
1904 minit ("DATA", AB_DATA),
1905 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1906 minit ("IN_COMMON", AB_IN_COMMON),
1907 minit ("FUNCTION", AB_FUNCTION),
1908 minit ("SUBROUTINE", AB_SUBROUTINE),
1909 minit ("SEQUENCE", AB_SEQUENCE),
1910 minit ("ELEMENTAL", AB_ELEMENTAL),
1911 minit ("PURE", AB_PURE),
1912 minit ("RECURSIVE", AB_RECURSIVE),
1913 minit ("GENERIC", AB_GENERIC),
1914 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1915 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1916 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1917 minit ("IS_BIND_C", AB_IS_BIND_C),
1918 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1919 minit ("IS_ISO_C", AB_IS_ISO_C),
1920 minit ("VALUE", AB_VALUE),
1921 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1922 minit ("COARRAY_COMP", AB_COARRAY_COMP),
1923 minit ("LOCK_COMP", AB_LOCK_COMP),
1924 minit ("POINTER_COMP", AB_POINTER_COMP),
1925 minit ("PROC_POINTER_COMP", AB_PROC_POINTER_COMP),
1926 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1927 minit ("ZERO_COMP", AB_ZERO_COMP),
1928 minit ("PROTECTED", AB_PROTECTED),
1929 minit ("ABSTRACT", AB_ABSTRACT),
1930 minit ("IS_CLASS", AB_IS_CLASS),
1931 minit ("PROCEDURE", AB_PROCEDURE),
1932 minit ("PROC_POINTER", AB_PROC_POINTER),
1933 minit ("VTYPE", AB_VTYPE),
1934 minit ("VTAB", AB_VTAB),
1935 minit ("CLASS_POINTER", AB_CLASS_POINTER),
1936 minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE),
1937 minit ("UNLIMITED_POLY", AB_UNLIMITED_POLY),
1938 minit ("OMP_DECLARE_TARGET", AB_OMP_DECLARE_TARGET),
1939 minit (NULL, -1)
1942 /* For binding attributes. */
1943 static const mstring binding_passing[] =
1945 minit ("PASS", 0),
1946 minit ("NOPASS", 1),
1947 minit (NULL, -1)
1949 static const mstring binding_overriding[] =
1951 minit ("OVERRIDABLE", 0),
1952 minit ("NON_OVERRIDABLE", 1),
1953 minit ("DEFERRED", 2),
1954 minit (NULL, -1)
1956 static const mstring binding_generic[] =
1958 minit ("SPECIFIC", 0),
1959 minit ("GENERIC", 1),
1960 minit (NULL, -1)
1962 static const mstring binding_ppc[] =
1964 minit ("NO_PPC", 0),
1965 minit ("PPC", 1),
1966 minit (NULL, -1)
1969 /* Specialization of mio_name. */
1970 DECL_MIO_NAME (ab_attribute)
1971 DECL_MIO_NAME (ar_type)
1972 DECL_MIO_NAME (array_type)
1973 DECL_MIO_NAME (bt)
1974 DECL_MIO_NAME (expr_t)
1975 DECL_MIO_NAME (gfc_access)
1976 DECL_MIO_NAME (gfc_intrinsic_op)
1977 DECL_MIO_NAME (ifsrc)
1978 DECL_MIO_NAME (save_state)
1979 DECL_MIO_NAME (procedure_type)
1980 DECL_MIO_NAME (ref_type)
1981 DECL_MIO_NAME (sym_flavor)
1982 DECL_MIO_NAME (sym_intent)
1983 #undef DECL_MIO_NAME
1985 /* Symbol attributes are stored in list with the first three elements
1986 being the enumerated fields, while the remaining elements (if any)
1987 indicate the individual attribute bits. The access field is not
1988 saved-- it controls what symbols are exported when a module is
1989 written. */
1991 static void
1992 mio_symbol_attribute (symbol_attribute *attr)
1994 atom_type t;
1995 unsigned ext_attr,extension_level;
1997 mio_lparen ();
1999 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
2000 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
2001 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
2002 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
2003 attr->save = MIO_NAME (save_state) (attr->save, save_status);
2005 ext_attr = attr->ext_attr;
2006 mio_integer ((int *) &ext_attr);
2007 attr->ext_attr = ext_attr;
2009 extension_level = attr->extension;
2010 mio_integer ((int *) &extension_level);
2011 attr->extension = extension_level;
2013 if (iomode == IO_OUTPUT)
2015 if (attr->allocatable)
2016 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
2017 if (attr->artificial)
2018 MIO_NAME (ab_attribute) (AB_ARTIFICIAL, attr_bits);
2019 if (attr->asynchronous)
2020 MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
2021 if (attr->dimension)
2022 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
2023 if (attr->codimension)
2024 MIO_NAME (ab_attribute) (AB_CODIMENSION, attr_bits);
2025 if (attr->contiguous)
2026 MIO_NAME (ab_attribute) (AB_CONTIGUOUS, attr_bits);
2027 if (attr->external)
2028 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
2029 if (attr->intrinsic)
2030 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
2031 if (attr->optional)
2032 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
2033 if (attr->pointer)
2034 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
2035 if (attr->class_pointer)
2036 MIO_NAME (ab_attribute) (AB_CLASS_POINTER, attr_bits);
2037 if (attr->is_protected)
2038 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
2039 if (attr->value)
2040 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
2041 if (attr->volatile_)
2042 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
2043 if (attr->target)
2044 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
2045 if (attr->threadprivate)
2046 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
2047 if (attr->dummy)
2048 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
2049 if (attr->result)
2050 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
2051 /* We deliberately don't preserve the "entry" flag. */
2053 if (attr->data)
2054 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
2055 if (attr->in_namelist)
2056 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
2057 if (attr->in_common)
2058 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
2060 if (attr->function)
2061 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
2062 if (attr->subroutine)
2063 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
2064 if (attr->generic)
2065 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
2066 if (attr->abstract)
2067 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
2069 if (attr->sequence)
2070 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
2071 if (attr->elemental)
2072 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
2073 if (attr->pure)
2074 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
2075 if (attr->implicit_pure)
2076 MIO_NAME (ab_attribute) (AB_IMPLICIT_PURE, attr_bits);
2077 if (attr->unlimited_polymorphic)
2078 MIO_NAME (ab_attribute) (AB_UNLIMITED_POLY, attr_bits);
2079 if (attr->recursive)
2080 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
2081 if (attr->always_explicit)
2082 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
2083 if (attr->cray_pointer)
2084 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
2085 if (attr->cray_pointee)
2086 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
2087 if (attr->is_bind_c)
2088 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
2089 if (attr->is_c_interop)
2090 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
2091 if (attr->is_iso_c)
2092 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
2093 if (attr->alloc_comp)
2094 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
2095 if (attr->pointer_comp)
2096 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
2097 if (attr->proc_pointer_comp)
2098 MIO_NAME (ab_attribute) (AB_PROC_POINTER_COMP, attr_bits);
2099 if (attr->private_comp)
2100 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
2101 if (attr->coarray_comp)
2102 MIO_NAME (ab_attribute) (AB_COARRAY_COMP, attr_bits);
2103 if (attr->lock_comp)
2104 MIO_NAME (ab_attribute) (AB_LOCK_COMP, attr_bits);
2105 if (attr->zero_comp)
2106 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
2107 if (attr->is_class)
2108 MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
2109 if (attr->procedure)
2110 MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
2111 if (attr->proc_pointer)
2112 MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
2113 if (attr->vtype)
2114 MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
2115 if (attr->vtab)
2116 MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
2117 if (attr->omp_declare_target)
2118 MIO_NAME (ab_attribute) (AB_OMP_DECLARE_TARGET, attr_bits);
2120 mio_rparen ();
2123 else
2125 for (;;)
2127 t = parse_atom ();
2128 if (t == ATOM_RPAREN)
2129 break;
2130 if (t != ATOM_NAME)
2131 bad_module ("Expected attribute bit name");
2133 switch ((ab_attribute) find_enum (attr_bits))
2135 case AB_ALLOCATABLE:
2136 attr->allocatable = 1;
2137 break;
2138 case AB_ARTIFICIAL:
2139 attr->artificial = 1;
2140 break;
2141 case AB_ASYNCHRONOUS:
2142 attr->asynchronous = 1;
2143 break;
2144 case AB_DIMENSION:
2145 attr->dimension = 1;
2146 break;
2147 case AB_CODIMENSION:
2148 attr->codimension = 1;
2149 break;
2150 case AB_CONTIGUOUS:
2151 attr->contiguous = 1;
2152 break;
2153 case AB_EXTERNAL:
2154 attr->external = 1;
2155 break;
2156 case AB_INTRINSIC:
2157 attr->intrinsic = 1;
2158 break;
2159 case AB_OPTIONAL:
2160 attr->optional = 1;
2161 break;
2162 case AB_POINTER:
2163 attr->pointer = 1;
2164 break;
2165 case AB_CLASS_POINTER:
2166 attr->class_pointer = 1;
2167 break;
2168 case AB_PROTECTED:
2169 attr->is_protected = 1;
2170 break;
2171 case AB_VALUE:
2172 attr->value = 1;
2173 break;
2174 case AB_VOLATILE:
2175 attr->volatile_ = 1;
2176 break;
2177 case AB_TARGET:
2178 attr->target = 1;
2179 break;
2180 case AB_THREADPRIVATE:
2181 attr->threadprivate = 1;
2182 break;
2183 case AB_DUMMY:
2184 attr->dummy = 1;
2185 break;
2186 case AB_RESULT:
2187 attr->result = 1;
2188 break;
2189 case AB_DATA:
2190 attr->data = 1;
2191 break;
2192 case AB_IN_NAMELIST:
2193 attr->in_namelist = 1;
2194 break;
2195 case AB_IN_COMMON:
2196 attr->in_common = 1;
2197 break;
2198 case AB_FUNCTION:
2199 attr->function = 1;
2200 break;
2201 case AB_SUBROUTINE:
2202 attr->subroutine = 1;
2203 break;
2204 case AB_GENERIC:
2205 attr->generic = 1;
2206 break;
2207 case AB_ABSTRACT:
2208 attr->abstract = 1;
2209 break;
2210 case AB_SEQUENCE:
2211 attr->sequence = 1;
2212 break;
2213 case AB_ELEMENTAL:
2214 attr->elemental = 1;
2215 break;
2216 case AB_PURE:
2217 attr->pure = 1;
2218 break;
2219 case AB_IMPLICIT_PURE:
2220 attr->implicit_pure = 1;
2221 break;
2222 case AB_UNLIMITED_POLY:
2223 attr->unlimited_polymorphic = 1;
2224 break;
2225 case AB_RECURSIVE:
2226 attr->recursive = 1;
2227 break;
2228 case AB_ALWAYS_EXPLICIT:
2229 attr->always_explicit = 1;
2230 break;
2231 case AB_CRAY_POINTER:
2232 attr->cray_pointer = 1;
2233 break;
2234 case AB_CRAY_POINTEE:
2235 attr->cray_pointee = 1;
2236 break;
2237 case AB_IS_BIND_C:
2238 attr->is_bind_c = 1;
2239 break;
2240 case AB_IS_C_INTEROP:
2241 attr->is_c_interop = 1;
2242 break;
2243 case AB_IS_ISO_C:
2244 attr->is_iso_c = 1;
2245 break;
2246 case AB_ALLOC_COMP:
2247 attr->alloc_comp = 1;
2248 break;
2249 case AB_COARRAY_COMP:
2250 attr->coarray_comp = 1;
2251 break;
2252 case AB_LOCK_COMP:
2253 attr->lock_comp = 1;
2254 break;
2255 case AB_POINTER_COMP:
2256 attr->pointer_comp = 1;
2257 break;
2258 case AB_PROC_POINTER_COMP:
2259 attr->proc_pointer_comp = 1;
2260 break;
2261 case AB_PRIVATE_COMP:
2262 attr->private_comp = 1;
2263 break;
2264 case AB_ZERO_COMP:
2265 attr->zero_comp = 1;
2266 break;
2267 case AB_IS_CLASS:
2268 attr->is_class = 1;
2269 break;
2270 case AB_PROCEDURE:
2271 attr->procedure = 1;
2272 break;
2273 case AB_PROC_POINTER:
2274 attr->proc_pointer = 1;
2275 break;
2276 case AB_VTYPE:
2277 attr->vtype = 1;
2278 break;
2279 case AB_VTAB:
2280 attr->vtab = 1;
2281 break;
2282 case AB_OMP_DECLARE_TARGET:
2283 attr->omp_declare_target = 1;
2284 break;
2291 static const mstring bt_types[] = {
2292 minit ("INTEGER", BT_INTEGER),
2293 minit ("REAL", BT_REAL),
2294 minit ("COMPLEX", BT_COMPLEX),
2295 minit ("LOGICAL", BT_LOGICAL),
2296 minit ("CHARACTER", BT_CHARACTER),
2297 minit ("DERIVED", BT_DERIVED),
2298 minit ("CLASS", BT_CLASS),
2299 minit ("PROCEDURE", BT_PROCEDURE),
2300 minit ("UNKNOWN", BT_UNKNOWN),
2301 minit ("VOID", BT_VOID),
2302 minit ("ASSUMED", BT_ASSUMED),
2303 minit (NULL, -1)
2307 static void
2308 mio_charlen (gfc_charlen **clp)
2310 gfc_charlen *cl;
2312 mio_lparen ();
2314 if (iomode == IO_OUTPUT)
2316 cl = *clp;
2317 if (cl != NULL)
2318 mio_expr (&cl->length);
2320 else
2322 if (peek_atom () != ATOM_RPAREN)
2324 cl = gfc_new_charlen (gfc_current_ns, NULL);
2325 mio_expr (&cl->length);
2326 *clp = cl;
2330 mio_rparen ();
2334 /* See if a name is a generated name. */
2336 static int
2337 check_unique_name (const char *name)
2339 return *name == '@';
2343 static void
2344 mio_typespec (gfc_typespec *ts)
2346 mio_lparen ();
2348 ts->type = MIO_NAME (bt) (ts->type, bt_types);
2350 if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2351 mio_integer (&ts->kind);
2352 else
2353 mio_symbol_ref (&ts->u.derived);
2355 mio_symbol_ref (&ts->interface);
2357 /* Add info for C interop and is_iso_c. */
2358 mio_integer (&ts->is_c_interop);
2359 mio_integer (&ts->is_iso_c);
2361 /* If the typespec is for an identifier either from iso_c_binding, or
2362 a constant that was initialized to an identifier from it, use the
2363 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2364 if (ts->is_iso_c)
2365 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2366 else
2367 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2369 if (ts->type != BT_CHARACTER)
2371 /* ts->u.cl is only valid for BT_CHARACTER. */
2372 mio_lparen ();
2373 mio_rparen ();
2375 else
2376 mio_charlen (&ts->u.cl);
2378 /* So as not to disturb the existing API, use an ATOM_NAME to
2379 transmit deferred characteristic for characters (F2003). */
2380 if (iomode == IO_OUTPUT)
2382 if (ts->type == BT_CHARACTER && ts->deferred)
2383 write_atom (ATOM_NAME, "DEFERRED_CL");
2385 else if (peek_atom () != ATOM_RPAREN)
2387 if (parse_atom () != ATOM_NAME)
2388 bad_module ("Expected string");
2389 ts->deferred = 1;
2392 mio_rparen ();
2396 static const mstring array_spec_types[] = {
2397 minit ("EXPLICIT", AS_EXPLICIT),
2398 minit ("ASSUMED_RANK", AS_ASSUMED_RANK),
2399 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2400 minit ("DEFERRED", AS_DEFERRED),
2401 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2402 minit (NULL, -1)
2406 static void
2407 mio_array_spec (gfc_array_spec **asp)
2409 gfc_array_spec *as;
2410 int i;
2412 mio_lparen ();
2414 if (iomode == IO_OUTPUT)
2416 int rank;
2418 if (*asp == NULL)
2419 goto done;
2420 as = *asp;
2422 /* mio_integer expects nonnegative values. */
2423 rank = as->rank > 0 ? as->rank : 0;
2424 mio_integer (&rank);
2426 else
2428 if (peek_atom () == ATOM_RPAREN)
2430 *asp = NULL;
2431 goto done;
2434 *asp = as = gfc_get_array_spec ();
2435 mio_integer (&as->rank);
2438 mio_integer (&as->corank);
2439 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2441 if (iomode == IO_INPUT && as->type == AS_ASSUMED_RANK)
2442 as->rank = -1;
2443 if (iomode == IO_INPUT && as->corank)
2444 as->cotype = (as->type == AS_DEFERRED) ? AS_DEFERRED : AS_EXPLICIT;
2446 if (as->rank + as->corank > 0)
2447 for (i = 0; i < as->rank + as->corank; i++)
2449 mio_expr (&as->lower[i]);
2450 mio_expr (&as->upper[i]);
2453 done:
2454 mio_rparen ();
2458 /* Given a pointer to an array reference structure (which lives in a
2459 gfc_ref structure), find the corresponding array specification
2460 structure. Storing the pointer in the ref structure doesn't quite
2461 work when loading from a module. Generating code for an array
2462 reference also needs more information than just the array spec. */
2464 static const mstring array_ref_types[] = {
2465 minit ("FULL", AR_FULL),
2466 minit ("ELEMENT", AR_ELEMENT),
2467 minit ("SECTION", AR_SECTION),
2468 minit (NULL, -1)
2472 static void
2473 mio_array_ref (gfc_array_ref *ar)
2475 int i;
2477 mio_lparen ();
2478 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2479 mio_integer (&ar->dimen);
2481 switch (ar->type)
2483 case AR_FULL:
2484 break;
2486 case AR_ELEMENT:
2487 for (i = 0; i < ar->dimen; i++)
2488 mio_expr (&ar->start[i]);
2490 break;
2492 case AR_SECTION:
2493 for (i = 0; i < ar->dimen; i++)
2495 mio_expr (&ar->start[i]);
2496 mio_expr (&ar->end[i]);
2497 mio_expr (&ar->stride[i]);
2500 break;
2502 case AR_UNKNOWN:
2503 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2506 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2507 we can't call mio_integer directly. Instead loop over each element
2508 and cast it to/from an integer. */
2509 if (iomode == IO_OUTPUT)
2511 for (i = 0; i < ar->dimen; i++)
2513 int tmp = (int)ar->dimen_type[i];
2514 write_atom (ATOM_INTEGER, &tmp);
2517 else
2519 for (i = 0; i < ar->dimen; i++)
2521 require_atom (ATOM_INTEGER);
2522 ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2526 if (iomode == IO_INPUT)
2528 ar->where = gfc_current_locus;
2530 for (i = 0; i < ar->dimen; i++)
2531 ar->c_where[i] = gfc_current_locus;
2534 mio_rparen ();
2538 /* Saves or restores a pointer. The pointer is converted back and
2539 forth from an integer. We return the pointer_info pointer so that
2540 the caller can take additional action based on the pointer type. */
2542 static pointer_info *
2543 mio_pointer_ref (void *gp)
2545 pointer_info *p;
2547 if (iomode == IO_OUTPUT)
2549 p = get_pointer (*((char **) gp));
2550 write_atom (ATOM_INTEGER, &p->integer);
2552 else
2554 require_atom (ATOM_INTEGER);
2555 p = add_fixup (atom_int, gp);
2558 return p;
2562 /* Save and load references to components that occur within
2563 expressions. We have to describe these references by a number and
2564 by name. The number is necessary for forward references during
2565 reading, and the name is necessary if the symbol already exists in
2566 the namespace and is not loaded again. */
2568 static void
2569 mio_component_ref (gfc_component **cp)
2571 pointer_info *p;
2573 p = mio_pointer_ref (cp);
2574 if (p->type == P_UNKNOWN)
2575 p->type = P_COMPONENT;
2579 static void mio_namespace_ref (gfc_namespace **nsp);
2580 static void mio_formal_arglist (gfc_formal_arglist **formal);
2581 static void mio_typebound_proc (gfc_typebound_proc** proc);
2583 static void
2584 mio_component (gfc_component *c, int vtype)
2586 pointer_info *p;
2587 int n;
2589 mio_lparen ();
2591 if (iomode == IO_OUTPUT)
2593 p = get_pointer (c);
2594 mio_integer (&p->integer);
2596 else
2598 mio_integer (&n);
2599 p = get_integer (n);
2600 associate_integer_pointer (p, c);
2603 if (p->type == P_UNKNOWN)
2604 p->type = P_COMPONENT;
2606 mio_pool_string (&c->name);
2607 mio_typespec (&c->ts);
2608 mio_array_spec (&c->as);
2610 mio_symbol_attribute (&c->attr);
2611 if (c->ts.type == BT_CLASS)
2612 c->attr.class_ok = 1;
2613 c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types);
2615 if (!vtype || strcmp (c->name, "_final") == 0
2616 || strcmp (c->name, "_hash") == 0)
2617 mio_expr (&c->initializer);
2619 if (c->attr.proc_pointer)
2620 mio_typebound_proc (&c->tb);
2622 mio_rparen ();
2626 static void
2627 mio_component_list (gfc_component **cp, int vtype)
2629 gfc_component *c, *tail;
2631 mio_lparen ();
2633 if (iomode == IO_OUTPUT)
2635 for (c = *cp; c; c = c->next)
2636 mio_component (c, vtype);
2638 else
2640 *cp = NULL;
2641 tail = NULL;
2643 for (;;)
2645 if (peek_atom () == ATOM_RPAREN)
2646 break;
2648 c = gfc_get_component ();
2649 mio_component (c, vtype);
2651 if (tail == NULL)
2652 *cp = c;
2653 else
2654 tail->next = c;
2656 tail = c;
2660 mio_rparen ();
2664 static void
2665 mio_actual_arg (gfc_actual_arglist *a)
2667 mio_lparen ();
2668 mio_pool_string (&a->name);
2669 mio_expr (&a->expr);
2670 mio_rparen ();
2674 static void
2675 mio_actual_arglist (gfc_actual_arglist **ap)
2677 gfc_actual_arglist *a, *tail;
2679 mio_lparen ();
2681 if (iomode == IO_OUTPUT)
2683 for (a = *ap; a; a = a->next)
2684 mio_actual_arg (a);
2687 else
2689 tail = NULL;
2691 for (;;)
2693 if (peek_atom () != ATOM_LPAREN)
2694 break;
2696 a = gfc_get_actual_arglist ();
2698 if (tail == NULL)
2699 *ap = a;
2700 else
2701 tail->next = a;
2703 tail = a;
2704 mio_actual_arg (a);
2708 mio_rparen ();
2712 /* Read and write formal argument lists. */
2714 static void
2715 mio_formal_arglist (gfc_formal_arglist **formal)
2717 gfc_formal_arglist *f, *tail;
2719 mio_lparen ();
2721 if (iomode == IO_OUTPUT)
2723 for (f = *formal; f; f = f->next)
2724 mio_symbol_ref (&f->sym);
2726 else
2728 *formal = tail = NULL;
2730 while (peek_atom () != ATOM_RPAREN)
2732 f = gfc_get_formal_arglist ();
2733 mio_symbol_ref (&f->sym);
2735 if (*formal == NULL)
2736 *formal = f;
2737 else
2738 tail->next = f;
2740 tail = f;
2744 mio_rparen ();
2748 /* Save or restore a reference to a symbol node. */
2750 pointer_info *
2751 mio_symbol_ref (gfc_symbol **symp)
2753 pointer_info *p;
2755 p = mio_pointer_ref (symp);
2756 if (p->type == P_UNKNOWN)
2757 p->type = P_SYMBOL;
2759 if (iomode == IO_OUTPUT)
2761 if (p->u.wsym.state == UNREFERENCED)
2762 p->u.wsym.state = NEEDS_WRITE;
2764 else
2766 if (p->u.rsym.state == UNUSED)
2767 p->u.rsym.state = NEEDED;
2769 return p;
2773 /* Save or restore a reference to a symtree node. */
2775 static void
2776 mio_symtree_ref (gfc_symtree **stp)
2778 pointer_info *p;
2779 fixup_t *f;
2781 if (iomode == IO_OUTPUT)
2782 mio_symbol_ref (&(*stp)->n.sym);
2783 else
2785 require_atom (ATOM_INTEGER);
2786 p = get_integer (atom_int);
2788 /* An unused equivalence member; make a symbol and a symtree
2789 for it. */
2790 if (in_load_equiv && p->u.rsym.symtree == NULL)
2792 /* Since this is not used, it must have a unique name. */
2793 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2795 /* Make the symbol. */
2796 if (p->u.rsym.sym == NULL)
2798 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2799 gfc_current_ns);
2800 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2803 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2804 p->u.rsym.symtree->n.sym->refs++;
2805 p->u.rsym.referenced = 1;
2807 /* If the symbol is PRIVATE and in COMMON, load_commons will
2808 generate a fixup symbol, which must be associated. */
2809 if (p->fixup)
2810 resolve_fixups (p->fixup, p->u.rsym.sym);
2811 p->fixup = NULL;
2814 if (p->type == P_UNKNOWN)
2815 p->type = P_SYMBOL;
2817 if (p->u.rsym.state == UNUSED)
2818 p->u.rsym.state = NEEDED;
2820 if (p->u.rsym.symtree != NULL)
2822 *stp = p->u.rsym.symtree;
2824 else
2826 f = XCNEW (fixup_t);
2828 f->next = p->u.rsym.stfixup;
2829 p->u.rsym.stfixup = f;
2831 f->pointer = (void **) stp;
2837 static void
2838 mio_iterator (gfc_iterator **ip)
2840 gfc_iterator *iter;
2842 mio_lparen ();
2844 if (iomode == IO_OUTPUT)
2846 if (*ip == NULL)
2847 goto done;
2849 else
2851 if (peek_atom () == ATOM_RPAREN)
2853 *ip = NULL;
2854 goto done;
2857 *ip = gfc_get_iterator ();
2860 iter = *ip;
2862 mio_expr (&iter->var);
2863 mio_expr (&iter->start);
2864 mio_expr (&iter->end);
2865 mio_expr (&iter->step);
2867 done:
2868 mio_rparen ();
2872 static void
2873 mio_constructor (gfc_constructor_base *cp)
2875 gfc_constructor *c;
2877 mio_lparen ();
2879 if (iomode == IO_OUTPUT)
2881 for (c = gfc_constructor_first (*cp); c; c = gfc_constructor_next (c))
2883 mio_lparen ();
2884 mio_expr (&c->expr);
2885 mio_iterator (&c->iterator);
2886 mio_rparen ();
2889 else
2891 while (peek_atom () != ATOM_RPAREN)
2893 c = gfc_constructor_append_expr (cp, NULL, NULL);
2895 mio_lparen ();
2896 mio_expr (&c->expr);
2897 mio_iterator (&c->iterator);
2898 mio_rparen ();
2902 mio_rparen ();
2906 static const mstring ref_types[] = {
2907 minit ("ARRAY", REF_ARRAY),
2908 minit ("COMPONENT", REF_COMPONENT),
2909 minit ("SUBSTRING", REF_SUBSTRING),
2910 minit (NULL, -1)
2914 static void
2915 mio_ref (gfc_ref **rp)
2917 gfc_ref *r;
2919 mio_lparen ();
2921 r = *rp;
2922 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2924 switch (r->type)
2926 case REF_ARRAY:
2927 mio_array_ref (&r->u.ar);
2928 break;
2930 case REF_COMPONENT:
2931 mio_symbol_ref (&r->u.c.sym);
2932 mio_component_ref (&r->u.c.component);
2933 break;
2935 case REF_SUBSTRING:
2936 mio_expr (&r->u.ss.start);
2937 mio_expr (&r->u.ss.end);
2938 mio_charlen (&r->u.ss.length);
2939 break;
2942 mio_rparen ();
2946 static void
2947 mio_ref_list (gfc_ref **rp)
2949 gfc_ref *ref, *head, *tail;
2951 mio_lparen ();
2953 if (iomode == IO_OUTPUT)
2955 for (ref = *rp; ref; ref = ref->next)
2956 mio_ref (&ref);
2958 else
2960 head = tail = NULL;
2962 while (peek_atom () != ATOM_RPAREN)
2964 if (head == NULL)
2965 head = tail = gfc_get_ref ();
2966 else
2968 tail->next = gfc_get_ref ();
2969 tail = tail->next;
2972 mio_ref (&tail);
2975 *rp = head;
2978 mio_rparen ();
2982 /* Read and write an integer value. */
2984 static void
2985 mio_gmp_integer (mpz_t *integer)
2987 char *p;
2989 if (iomode == IO_INPUT)
2991 if (parse_atom () != ATOM_STRING)
2992 bad_module ("Expected integer string");
2994 mpz_init (*integer);
2995 if (mpz_set_str (*integer, atom_string, 10))
2996 bad_module ("Error converting integer");
2998 free (atom_string);
3000 else
3002 p = mpz_get_str (NULL, 10, *integer);
3003 write_atom (ATOM_STRING, p);
3004 free (p);
3009 static void
3010 mio_gmp_real (mpfr_t *real)
3012 mp_exp_t exponent;
3013 char *p;
3015 if (iomode == IO_INPUT)
3017 if (parse_atom () != ATOM_STRING)
3018 bad_module ("Expected real string");
3020 mpfr_init (*real);
3021 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
3022 free (atom_string);
3024 else
3026 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
3028 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
3030 write_atom (ATOM_STRING, p);
3031 free (p);
3032 return;
3035 atom_string = XCNEWVEC (char, strlen (p) + 20);
3037 sprintf (atom_string, "0.%s@%ld", p, exponent);
3039 /* Fix negative numbers. */
3040 if (atom_string[2] == '-')
3042 atom_string[0] = '-';
3043 atom_string[1] = '0';
3044 atom_string[2] = '.';
3047 write_atom (ATOM_STRING, atom_string);
3049 free (atom_string);
3050 free (p);
3055 /* Save and restore the shape of an array constructor. */
3057 static void
3058 mio_shape (mpz_t **pshape, int rank)
3060 mpz_t *shape;
3061 atom_type t;
3062 int n;
3064 /* A NULL shape is represented by (). */
3065 mio_lparen ();
3067 if (iomode == IO_OUTPUT)
3069 shape = *pshape;
3070 if (!shape)
3072 mio_rparen ();
3073 return;
3076 else
3078 t = peek_atom ();
3079 if (t == ATOM_RPAREN)
3081 *pshape = NULL;
3082 mio_rparen ();
3083 return;
3086 shape = gfc_get_shape (rank);
3087 *pshape = shape;
3090 for (n = 0; n < rank; n++)
3091 mio_gmp_integer (&shape[n]);
3093 mio_rparen ();
3097 static const mstring expr_types[] = {
3098 minit ("OP", EXPR_OP),
3099 minit ("FUNCTION", EXPR_FUNCTION),
3100 minit ("CONSTANT", EXPR_CONSTANT),
3101 minit ("VARIABLE", EXPR_VARIABLE),
3102 minit ("SUBSTRING", EXPR_SUBSTRING),
3103 minit ("STRUCTURE", EXPR_STRUCTURE),
3104 minit ("ARRAY", EXPR_ARRAY),
3105 minit ("NULL", EXPR_NULL),
3106 minit ("COMPCALL", EXPR_COMPCALL),
3107 minit (NULL, -1)
3110 /* INTRINSIC_ASSIGN is missing because it is used as an index for
3111 generic operators, not in expressions. INTRINSIC_USER is also
3112 replaced by the correct function name by the time we see it. */
3114 static const mstring intrinsics[] =
3116 minit ("UPLUS", INTRINSIC_UPLUS),
3117 minit ("UMINUS", INTRINSIC_UMINUS),
3118 minit ("PLUS", INTRINSIC_PLUS),
3119 minit ("MINUS", INTRINSIC_MINUS),
3120 minit ("TIMES", INTRINSIC_TIMES),
3121 minit ("DIVIDE", INTRINSIC_DIVIDE),
3122 minit ("POWER", INTRINSIC_POWER),
3123 minit ("CONCAT", INTRINSIC_CONCAT),
3124 minit ("AND", INTRINSIC_AND),
3125 minit ("OR", INTRINSIC_OR),
3126 minit ("EQV", INTRINSIC_EQV),
3127 minit ("NEQV", INTRINSIC_NEQV),
3128 minit ("EQ_SIGN", INTRINSIC_EQ),
3129 minit ("EQ", INTRINSIC_EQ_OS),
3130 minit ("NE_SIGN", INTRINSIC_NE),
3131 minit ("NE", INTRINSIC_NE_OS),
3132 minit ("GT_SIGN", INTRINSIC_GT),
3133 minit ("GT", INTRINSIC_GT_OS),
3134 minit ("GE_SIGN", INTRINSIC_GE),
3135 minit ("GE", INTRINSIC_GE_OS),
3136 minit ("LT_SIGN", INTRINSIC_LT),
3137 minit ("LT", INTRINSIC_LT_OS),
3138 minit ("LE_SIGN", INTRINSIC_LE),
3139 minit ("LE", INTRINSIC_LE_OS),
3140 minit ("NOT", INTRINSIC_NOT),
3141 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
3142 minit ("USER", INTRINSIC_USER),
3143 minit (NULL, -1)
3147 /* Remedy a couple of situations where the gfc_expr's can be defective. */
3149 static void
3150 fix_mio_expr (gfc_expr *e)
3152 gfc_symtree *ns_st = NULL;
3153 const char *fname;
3155 if (iomode != IO_OUTPUT)
3156 return;
3158 if (e->symtree)
3160 /* If this is a symtree for a symbol that came from a contained module
3161 namespace, it has a unique name and we should look in the current
3162 namespace to see if the required, non-contained symbol is available
3163 yet. If so, the latter should be written. */
3164 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
3166 const char *name = e->symtree->n.sym->name;
3167 if (e->symtree->n.sym->attr.flavor == FL_DERIVED)
3168 name = dt_upper_string (name);
3169 ns_st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3172 /* On the other hand, if the existing symbol is the module name or the
3173 new symbol is a dummy argument, do not do the promotion. */
3174 if (ns_st && ns_st->n.sym
3175 && ns_st->n.sym->attr.flavor != FL_MODULE
3176 && !e->symtree->n.sym->attr.dummy)
3177 e->symtree = ns_st;
3179 else if (e->expr_type == EXPR_FUNCTION
3180 && (e->value.function.name || e->value.function.isym))
3182 gfc_symbol *sym;
3184 /* In some circumstances, a function used in an initialization
3185 expression, in one use associated module, can fail to be
3186 coupled to its symtree when used in a specification
3187 expression in another module. */
3188 fname = e->value.function.esym ? e->value.function.esym->name
3189 : e->value.function.isym->name;
3190 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3192 if (e->symtree)
3193 return;
3195 /* This is probably a reference to a private procedure from another
3196 module. To prevent a segfault, make a generic with no specific
3197 instances. If this module is used, without the required
3198 specific coming from somewhere, the appropriate error message
3199 is issued. */
3200 gfc_get_symbol (fname, gfc_current_ns, &sym);
3201 sym->attr.flavor = FL_PROCEDURE;
3202 sym->attr.generic = 1;
3203 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3204 gfc_commit_symbol (sym);
3209 /* Read and write expressions. The form "()" is allowed to indicate a
3210 NULL expression. */
3212 static void
3213 mio_expr (gfc_expr **ep)
3215 gfc_expr *e;
3216 atom_type t;
3217 int flag;
3219 mio_lparen ();
3221 if (iomode == IO_OUTPUT)
3223 if (*ep == NULL)
3225 mio_rparen ();
3226 return;
3229 e = *ep;
3230 MIO_NAME (expr_t) (e->expr_type, expr_types);
3232 else
3234 t = parse_atom ();
3235 if (t == ATOM_RPAREN)
3237 *ep = NULL;
3238 return;
3241 if (t != ATOM_NAME)
3242 bad_module ("Expected expression type");
3244 e = *ep = gfc_get_expr ();
3245 e->where = gfc_current_locus;
3246 e->expr_type = (expr_t) find_enum (expr_types);
3249 mio_typespec (&e->ts);
3250 mio_integer (&e->rank);
3252 fix_mio_expr (e);
3254 switch (e->expr_type)
3256 case EXPR_OP:
3257 e->value.op.op
3258 = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3260 switch (e->value.op.op)
3262 case INTRINSIC_UPLUS:
3263 case INTRINSIC_UMINUS:
3264 case INTRINSIC_NOT:
3265 case INTRINSIC_PARENTHESES:
3266 mio_expr (&e->value.op.op1);
3267 break;
3269 case INTRINSIC_PLUS:
3270 case INTRINSIC_MINUS:
3271 case INTRINSIC_TIMES:
3272 case INTRINSIC_DIVIDE:
3273 case INTRINSIC_POWER:
3274 case INTRINSIC_CONCAT:
3275 case INTRINSIC_AND:
3276 case INTRINSIC_OR:
3277 case INTRINSIC_EQV:
3278 case INTRINSIC_NEQV:
3279 case INTRINSIC_EQ:
3280 case INTRINSIC_EQ_OS:
3281 case INTRINSIC_NE:
3282 case INTRINSIC_NE_OS:
3283 case INTRINSIC_GT:
3284 case INTRINSIC_GT_OS:
3285 case INTRINSIC_GE:
3286 case INTRINSIC_GE_OS:
3287 case INTRINSIC_LT:
3288 case INTRINSIC_LT_OS:
3289 case INTRINSIC_LE:
3290 case INTRINSIC_LE_OS:
3291 mio_expr (&e->value.op.op1);
3292 mio_expr (&e->value.op.op2);
3293 break;
3295 case INTRINSIC_USER:
3296 /* INTRINSIC_USER should not appear in resolved expressions,
3297 though for UDRs we need to stream unresolved ones. */
3298 if (iomode == IO_OUTPUT)
3299 write_atom (ATOM_STRING, e->value.op.uop->name);
3300 else
3302 char *name = read_string ();
3303 const char *uop_name = find_use_name (name, true);
3304 if (uop_name == NULL)
3306 size_t len = strlen (name);
3307 char *name2 = XCNEWVEC (char, len + 2);
3308 memcpy (name2, name, len);
3309 name2[len] = ' ';
3310 name2[len + 1] = '\0';
3311 free (name);
3312 uop_name = name = name2;
3314 e->value.op.uop = gfc_get_uop (uop_name);
3315 free (name);
3317 mio_expr (&e->value.op.op1);
3318 mio_expr (&e->value.op.op2);
3319 break;
3321 default:
3322 bad_module ("Bad operator");
3325 break;
3327 case EXPR_FUNCTION:
3328 mio_symtree_ref (&e->symtree);
3329 mio_actual_arglist (&e->value.function.actual);
3331 if (iomode == IO_OUTPUT)
3333 e->value.function.name
3334 = mio_allocated_string (e->value.function.name);
3335 if (e->value.function.esym)
3336 flag = 1;
3337 else if (e->ref)
3338 flag = 2;
3339 else if (e->value.function.isym == NULL)
3340 flag = 3;
3341 else
3342 flag = 0;
3343 mio_integer (&flag);
3344 switch (flag)
3346 case 1:
3347 mio_symbol_ref (&e->value.function.esym);
3348 break;
3349 case 2:
3350 mio_ref_list (&e->ref);
3351 break;
3352 case 3:
3353 break;
3354 default:
3355 write_atom (ATOM_STRING, e->value.function.isym->name);
3358 else
3360 require_atom (ATOM_STRING);
3361 if (atom_string[0] == '\0')
3362 e->value.function.name = NULL;
3363 else
3364 e->value.function.name = gfc_get_string (atom_string);
3365 free (atom_string);
3367 mio_integer (&flag);
3368 switch (flag)
3370 case 1:
3371 mio_symbol_ref (&e->value.function.esym);
3372 break;
3373 case 2:
3374 mio_ref_list (&e->ref);
3375 break;
3376 case 3:
3377 break;
3378 default:
3379 require_atom (ATOM_STRING);
3380 e->value.function.isym = gfc_find_function (atom_string);
3381 free (atom_string);
3385 break;
3387 case EXPR_VARIABLE:
3388 mio_symtree_ref (&e->symtree);
3389 mio_ref_list (&e->ref);
3390 break;
3392 case EXPR_SUBSTRING:
3393 e->value.character.string
3394 = CONST_CAST (gfc_char_t *,
3395 mio_allocated_wide_string (e->value.character.string,
3396 e->value.character.length));
3397 mio_ref_list (&e->ref);
3398 break;
3400 case EXPR_STRUCTURE:
3401 case EXPR_ARRAY:
3402 mio_constructor (&e->value.constructor);
3403 mio_shape (&e->shape, e->rank);
3404 break;
3406 case EXPR_CONSTANT:
3407 switch (e->ts.type)
3409 case BT_INTEGER:
3410 mio_gmp_integer (&e->value.integer);
3411 break;
3413 case BT_REAL:
3414 gfc_set_model_kind (e->ts.kind);
3415 mio_gmp_real (&e->value.real);
3416 break;
3418 case BT_COMPLEX:
3419 gfc_set_model_kind (e->ts.kind);
3420 mio_gmp_real (&mpc_realref (e->value.complex));
3421 mio_gmp_real (&mpc_imagref (e->value.complex));
3422 break;
3424 case BT_LOGICAL:
3425 mio_integer (&e->value.logical);
3426 break;
3428 case BT_CHARACTER:
3429 mio_integer (&e->value.character.length);
3430 e->value.character.string
3431 = CONST_CAST (gfc_char_t *,
3432 mio_allocated_wide_string (e->value.character.string,
3433 e->value.character.length));
3434 break;
3436 default:
3437 bad_module ("Bad type in constant expression");
3440 break;
3442 case EXPR_NULL:
3443 break;
3445 case EXPR_COMPCALL:
3446 case EXPR_PPC:
3447 gcc_unreachable ();
3448 break;
3451 mio_rparen ();
3455 /* Read and write namelists. */
3457 static void
3458 mio_namelist (gfc_symbol *sym)
3460 gfc_namelist *n, *m;
3461 const char *check_name;
3463 mio_lparen ();
3465 if (iomode == IO_OUTPUT)
3467 for (n = sym->namelist; n; n = n->next)
3468 mio_symbol_ref (&n->sym);
3470 else
3472 /* This departure from the standard is flagged as an error.
3473 It does, in fact, work correctly. TODO: Allow it
3474 conditionally? */
3475 if (sym->attr.flavor == FL_NAMELIST)
3477 check_name = find_use_name (sym->name, false);
3478 if (check_name && strcmp (check_name, sym->name) != 0)
3479 gfc_error ("Namelist %s cannot be renamed by USE "
3480 "association to %s", sym->name, check_name);
3483 m = NULL;
3484 while (peek_atom () != ATOM_RPAREN)
3486 n = gfc_get_namelist ();
3487 mio_symbol_ref (&n->sym);
3489 if (sym->namelist == NULL)
3490 sym->namelist = n;
3491 else
3492 m->next = n;
3494 m = n;
3496 sym->namelist_tail = m;
3499 mio_rparen ();
3503 /* Save/restore lists of gfc_interface structures. When loading an
3504 interface, we are really appending to the existing list of
3505 interfaces. Checking for duplicate and ambiguous interfaces has to
3506 be done later when all symbols have been loaded. */
3508 pointer_info *
3509 mio_interface_rest (gfc_interface **ip)
3511 gfc_interface *tail, *p;
3512 pointer_info *pi = NULL;
3514 if (iomode == IO_OUTPUT)
3516 if (ip != NULL)
3517 for (p = *ip; p; p = p->next)
3518 mio_symbol_ref (&p->sym);
3520 else
3522 if (*ip == NULL)
3523 tail = NULL;
3524 else
3526 tail = *ip;
3527 while (tail->next)
3528 tail = tail->next;
3531 for (;;)
3533 if (peek_atom () == ATOM_RPAREN)
3534 break;
3536 p = gfc_get_interface ();
3537 p->where = gfc_current_locus;
3538 pi = mio_symbol_ref (&p->sym);
3540 if (tail == NULL)
3541 *ip = p;
3542 else
3543 tail->next = p;
3545 tail = p;
3549 mio_rparen ();
3550 return pi;
3554 /* Save/restore a nameless operator interface. */
3556 static void
3557 mio_interface (gfc_interface **ip)
3559 mio_lparen ();
3560 mio_interface_rest (ip);
3564 /* Save/restore a named operator interface. */
3566 static void
3567 mio_symbol_interface (const char **name, const char **module,
3568 gfc_interface **ip)
3570 mio_lparen ();
3571 mio_pool_string (name);
3572 mio_pool_string (module);
3573 mio_interface_rest (ip);
3577 static void
3578 mio_namespace_ref (gfc_namespace **nsp)
3580 gfc_namespace *ns;
3581 pointer_info *p;
3583 p = mio_pointer_ref (nsp);
3585 if (p->type == P_UNKNOWN)
3586 p->type = P_NAMESPACE;
3588 if (iomode == IO_INPUT && p->integer != 0)
3590 ns = (gfc_namespace *) p->u.pointer;
3591 if (ns == NULL)
3593 ns = gfc_get_namespace (NULL, 0);
3594 associate_integer_pointer (p, ns);
3596 else
3597 ns->refs++;
3602 /* Save/restore the f2k_derived namespace of a derived-type symbol. */
3604 static gfc_namespace* current_f2k_derived;
3606 static void
3607 mio_typebound_proc (gfc_typebound_proc** proc)
3609 int flag;
3610 int overriding_flag;
3612 if (iomode == IO_INPUT)
3614 *proc = gfc_get_typebound_proc (NULL);
3615 (*proc)->where = gfc_current_locus;
3617 gcc_assert (*proc);
3619 mio_lparen ();
3621 (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3623 /* IO the NON_OVERRIDABLE/DEFERRED combination. */
3624 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3625 overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3626 overriding_flag = mio_name (overriding_flag, binding_overriding);
3627 (*proc)->deferred = ((overriding_flag & 2) != 0);
3628 (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3629 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3631 (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3632 (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3633 (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3635 mio_pool_string (&((*proc)->pass_arg));
3637 flag = (int) (*proc)->pass_arg_num;
3638 mio_integer (&flag);
3639 (*proc)->pass_arg_num = (unsigned) flag;
3641 if ((*proc)->is_generic)
3643 gfc_tbp_generic* g;
3644 int iop;
3646 mio_lparen ();
3648 if (iomode == IO_OUTPUT)
3649 for (g = (*proc)->u.generic; g; g = g->next)
3651 iop = (int) g->is_operator;
3652 mio_integer (&iop);
3653 mio_allocated_string (g->specific_st->name);
3655 else
3657 (*proc)->u.generic = NULL;
3658 while (peek_atom () != ATOM_RPAREN)
3660 gfc_symtree** sym_root;
3662 g = gfc_get_tbp_generic ();
3663 g->specific = NULL;
3665 mio_integer (&iop);
3666 g->is_operator = (bool) iop;
3668 require_atom (ATOM_STRING);
3669 sym_root = &current_f2k_derived->tb_sym_root;
3670 g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3671 free (atom_string);
3673 g->next = (*proc)->u.generic;
3674 (*proc)->u.generic = g;
3678 mio_rparen ();
3680 else if (!(*proc)->ppc)
3681 mio_symtree_ref (&(*proc)->u.specific);
3683 mio_rparen ();
3686 /* Walker-callback function for this purpose. */
3687 static void
3688 mio_typebound_symtree (gfc_symtree* st)
3690 if (iomode == IO_OUTPUT && !st->n.tb)
3691 return;
3693 if (iomode == IO_OUTPUT)
3695 mio_lparen ();
3696 mio_allocated_string (st->name);
3698 /* For IO_INPUT, the above is done in mio_f2k_derived. */
3700 mio_typebound_proc (&st->n.tb);
3701 mio_rparen ();
3704 /* IO a full symtree (in all depth). */
3705 static void
3706 mio_full_typebound_tree (gfc_symtree** root)
3708 mio_lparen ();
3710 if (iomode == IO_OUTPUT)
3711 gfc_traverse_symtree (*root, &mio_typebound_symtree);
3712 else
3714 while (peek_atom () == ATOM_LPAREN)
3716 gfc_symtree* st;
3718 mio_lparen ();
3720 require_atom (ATOM_STRING);
3721 st = gfc_get_tbp_symtree (root, atom_string);
3722 free (atom_string);
3724 mio_typebound_symtree (st);
3728 mio_rparen ();
3731 static void
3732 mio_finalizer (gfc_finalizer **f)
3734 if (iomode == IO_OUTPUT)
3736 gcc_assert (*f);
3737 gcc_assert ((*f)->proc_tree); /* Should already be resolved. */
3738 mio_symtree_ref (&(*f)->proc_tree);
3740 else
3742 *f = gfc_get_finalizer ();
3743 (*f)->where = gfc_current_locus; /* Value should not matter. */
3744 (*f)->next = NULL;
3746 mio_symtree_ref (&(*f)->proc_tree);
3747 (*f)->proc_sym = NULL;
3751 static void
3752 mio_f2k_derived (gfc_namespace *f2k)
3754 current_f2k_derived = f2k;
3756 /* Handle the list of finalizer procedures. */
3757 mio_lparen ();
3758 if (iomode == IO_OUTPUT)
3760 gfc_finalizer *f;
3761 for (f = f2k->finalizers; f; f = f->next)
3762 mio_finalizer (&f);
3764 else
3766 f2k->finalizers = NULL;
3767 while (peek_atom () != ATOM_RPAREN)
3769 gfc_finalizer *cur = NULL;
3770 mio_finalizer (&cur);
3771 cur->next = f2k->finalizers;
3772 f2k->finalizers = cur;
3775 mio_rparen ();
3777 /* Handle type-bound procedures. */
3778 mio_full_typebound_tree (&f2k->tb_sym_root);
3780 /* Type-bound user operators. */
3781 mio_full_typebound_tree (&f2k->tb_uop_root);
3783 /* Type-bound intrinsic operators. */
3784 mio_lparen ();
3785 if (iomode == IO_OUTPUT)
3787 int op;
3788 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3790 gfc_intrinsic_op realop;
3792 if (op == INTRINSIC_USER || !f2k->tb_op[op])
3793 continue;
3795 mio_lparen ();
3796 realop = (gfc_intrinsic_op) op;
3797 mio_intrinsic_op (&realop);
3798 mio_typebound_proc (&f2k->tb_op[op]);
3799 mio_rparen ();
3802 else
3803 while (peek_atom () != ATOM_RPAREN)
3805 gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC. */
3807 mio_lparen ();
3808 mio_intrinsic_op (&op);
3809 mio_typebound_proc (&f2k->tb_op[op]);
3810 mio_rparen ();
3812 mio_rparen ();
3815 static void
3816 mio_full_f2k_derived (gfc_symbol *sym)
3818 mio_lparen ();
3820 if (iomode == IO_OUTPUT)
3822 if (sym->f2k_derived)
3823 mio_f2k_derived (sym->f2k_derived);
3825 else
3827 if (peek_atom () != ATOM_RPAREN)
3829 sym->f2k_derived = gfc_get_namespace (NULL, 0);
3830 mio_f2k_derived (sym->f2k_derived);
3832 else
3833 gcc_assert (!sym->f2k_derived);
3836 mio_rparen ();
3839 static const mstring omp_declare_simd_clauses[] =
3841 minit ("INBRANCH", 0),
3842 minit ("NOTINBRANCH", 1),
3843 minit ("SIMDLEN", 2),
3844 minit ("UNIFORM", 3),
3845 minit ("LINEAR", 4),
3846 minit ("ALIGNED", 5),
3847 minit (NULL, -1)
3850 /* Handle !$omp declare simd. */
3852 static void
3853 mio_omp_declare_simd (gfc_namespace *ns, gfc_omp_declare_simd **odsp)
3855 if (iomode == IO_OUTPUT)
3857 if (*odsp == NULL)
3858 return;
3860 else if (peek_atom () != ATOM_LPAREN)
3861 return;
3863 gfc_omp_declare_simd *ods = *odsp;
3865 mio_lparen ();
3866 if (iomode == IO_OUTPUT)
3868 write_atom (ATOM_NAME, "OMP_DECLARE_SIMD");
3869 if (ods->clauses)
3871 gfc_omp_namelist *n;
3873 if (ods->clauses->inbranch)
3874 mio_name (0, omp_declare_simd_clauses);
3875 if (ods->clauses->notinbranch)
3876 mio_name (1, omp_declare_simd_clauses);
3877 if (ods->clauses->simdlen_expr)
3879 mio_name (2, omp_declare_simd_clauses);
3880 mio_expr (&ods->clauses->simdlen_expr);
3882 for (n = ods->clauses->lists[OMP_LIST_UNIFORM]; n; n = n->next)
3884 mio_name (3, omp_declare_simd_clauses);
3885 mio_symbol_ref (&n->sym);
3887 for (n = ods->clauses->lists[OMP_LIST_LINEAR]; n; n = n->next)
3889 mio_name (4, omp_declare_simd_clauses);
3890 mio_symbol_ref (&n->sym);
3891 mio_expr (&n->expr);
3893 for (n = ods->clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next)
3895 mio_name (5, omp_declare_simd_clauses);
3896 mio_symbol_ref (&n->sym);
3897 mio_expr (&n->expr);
3901 else
3903 gfc_omp_namelist **ptrs[3] = { NULL, NULL, NULL };
3905 require_atom (ATOM_NAME);
3906 *odsp = ods = gfc_get_omp_declare_simd ();
3907 ods->where = gfc_current_locus;
3908 ods->proc_name = ns->proc_name;
3909 if (peek_atom () == ATOM_NAME)
3911 ods->clauses = gfc_get_omp_clauses ();
3912 ptrs[0] = &ods->clauses->lists[OMP_LIST_UNIFORM];
3913 ptrs[1] = &ods->clauses->lists[OMP_LIST_LINEAR];
3914 ptrs[2] = &ods->clauses->lists[OMP_LIST_ALIGNED];
3916 while (peek_atom () == ATOM_NAME)
3918 gfc_omp_namelist *n;
3919 int t = mio_name (0, omp_declare_simd_clauses);
3921 switch (t)
3923 case 0: ods->clauses->inbranch = true; break;
3924 case 1: ods->clauses->notinbranch = true; break;
3925 case 2: mio_expr (&ods->clauses->simdlen_expr); break;
3926 case 3:
3927 case 4:
3928 case 5:
3929 *ptrs[t - 3] = n = gfc_get_omp_namelist ();
3930 ptrs[t - 3] = &n->next;
3931 mio_symbol_ref (&n->sym);
3932 if (t != 3)
3933 mio_expr (&n->expr);
3934 break;
3939 mio_omp_declare_simd (ns, &ods->next);
3941 mio_rparen ();
3945 static const mstring omp_declare_reduction_stmt[] =
3947 minit ("ASSIGN", 0),
3948 minit ("CALL", 1),
3949 minit (NULL, -1)
3953 static void
3954 mio_omp_udr_expr (gfc_omp_udr *udr, gfc_symbol **sym1, gfc_symbol **sym2,
3955 gfc_namespace *ns, bool is_initializer)
3957 if (iomode == IO_OUTPUT)
3959 if ((*sym1)->module == NULL)
3961 (*sym1)->module = module_name;
3962 (*sym2)->module = module_name;
3964 mio_symbol_ref (sym1);
3965 mio_symbol_ref (sym2);
3966 if (ns->code->op == EXEC_ASSIGN)
3968 mio_name (0, omp_declare_reduction_stmt);
3969 mio_expr (&ns->code->expr1);
3970 mio_expr (&ns->code->expr2);
3972 else
3974 int flag;
3975 mio_name (1, omp_declare_reduction_stmt);
3976 mio_symtree_ref (&ns->code->symtree);
3977 mio_actual_arglist (&ns->code->ext.actual);
3979 flag = ns->code->resolved_isym != NULL;
3980 mio_integer (&flag);
3981 if (flag)
3982 write_atom (ATOM_STRING, ns->code->resolved_isym->name);
3983 else
3984 mio_symbol_ref (&ns->code->resolved_sym);
3987 else
3989 pointer_info *p1 = mio_symbol_ref (sym1);
3990 pointer_info *p2 = mio_symbol_ref (sym2);
3991 gfc_symbol *sym;
3992 gcc_assert (p1->u.rsym.ns == p2->u.rsym.ns);
3993 gcc_assert (p1->u.rsym.sym == NULL);
3994 /* Add hidden symbols to the symtree. */
3995 pointer_info *q = get_integer (p1->u.rsym.ns);
3996 q->u.pointer = (void *) ns;
3997 sym = gfc_new_symbol (is_initializer ? "omp_priv" : "omp_out", ns);
3998 sym->ts = udr->ts;
3999 sym->module = gfc_get_string (p1->u.rsym.module);
4000 associate_integer_pointer (p1, sym);
4001 sym->attr.omp_udr_artificial_var = 1;
4002 gcc_assert (p2->u.rsym.sym == NULL);
4003 sym = gfc_new_symbol (is_initializer ? "omp_orig" : "omp_in", ns);
4004 sym->ts = udr->ts;
4005 sym->module = gfc_get_string (p2->u.rsym.module);
4006 associate_integer_pointer (p2, sym);
4007 sym->attr.omp_udr_artificial_var = 1;
4008 if (mio_name (0, omp_declare_reduction_stmt) == 0)
4010 ns->code = gfc_get_code (EXEC_ASSIGN);
4011 mio_expr (&ns->code->expr1);
4012 mio_expr (&ns->code->expr2);
4014 else
4016 int flag;
4017 ns->code = gfc_get_code (EXEC_CALL);
4018 mio_symtree_ref (&ns->code->symtree);
4019 mio_actual_arglist (&ns->code->ext.actual);
4021 mio_integer (&flag);
4022 if (flag)
4024 require_atom (ATOM_STRING);
4025 ns->code->resolved_isym = gfc_find_subroutine (atom_string);
4026 free (atom_string);
4028 else
4029 mio_symbol_ref (&ns->code->resolved_sym);
4031 ns->code->loc = gfc_current_locus;
4032 ns->omp_udr_ns = 1;
4037 /* Unlike most other routines, the address of the symbol node is already
4038 fixed on input and the name/module has already been filled in.
4039 If you update the symbol format here, don't forget to update read_module
4040 as well (look for "seek to the symbol's component list"). */
4042 static void
4043 mio_symbol (gfc_symbol *sym)
4045 int intmod = INTMOD_NONE;
4047 mio_lparen ();
4049 mio_symbol_attribute (&sym->attr);
4051 /* Note that components are always saved, even if they are supposed
4052 to be private. Component access is checked during searching. */
4053 mio_component_list (&sym->components, sym->attr.vtype);
4054 if (sym->components != NULL)
4055 sym->component_access
4056 = MIO_NAME (gfc_access) (sym->component_access, access_types);
4058 mio_typespec (&sym->ts);
4059 if (sym->ts.type == BT_CLASS)
4060 sym->attr.class_ok = 1;
4062 if (iomode == IO_OUTPUT)
4063 mio_namespace_ref (&sym->formal_ns);
4064 else
4066 mio_namespace_ref (&sym->formal_ns);
4067 if (sym->formal_ns)
4068 sym->formal_ns->proc_name = sym;
4071 /* Save/restore common block links. */
4072 mio_symbol_ref (&sym->common_next);
4074 mio_formal_arglist (&sym->formal);
4076 if (sym->attr.flavor == FL_PARAMETER)
4077 mio_expr (&sym->value);
4079 mio_array_spec (&sym->as);
4081 mio_symbol_ref (&sym->result);
4083 if (sym->attr.cray_pointee)
4084 mio_symbol_ref (&sym->cp_pointer);
4086 /* Load/save the f2k_derived namespace of a derived-type symbol. */
4087 mio_full_f2k_derived (sym);
4089 mio_namelist (sym);
4091 /* Add the fields that say whether this is from an intrinsic module,
4092 and if so, what symbol it is within the module. */
4093 /* mio_integer (&(sym->from_intmod)); */
4094 if (iomode == IO_OUTPUT)
4096 intmod = sym->from_intmod;
4097 mio_integer (&intmod);
4099 else
4101 mio_integer (&intmod);
4102 if (current_intmod)
4103 sym->from_intmod = current_intmod;
4104 else
4105 sym->from_intmod = (intmod_id) intmod;
4108 mio_integer (&(sym->intmod_sym_id));
4110 if (sym->attr.flavor == FL_DERIVED)
4111 mio_integer (&(sym->hash_value));
4113 if (sym->formal_ns
4114 && sym->formal_ns->proc_name == sym
4115 && sym->formal_ns->entries == NULL)
4116 mio_omp_declare_simd (sym->formal_ns, &sym->formal_ns->omp_declare_simd);
4118 mio_rparen ();
4122 /************************* Top level subroutines *************************/
4124 /* Given a root symtree node and a symbol, try to find a symtree that
4125 references the symbol that is not a unique name. */
4127 static gfc_symtree *
4128 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
4130 gfc_symtree *s = NULL;
4132 if (st == NULL)
4133 return s;
4135 s = find_symtree_for_symbol (st->right, sym);
4136 if (s != NULL)
4137 return s;
4138 s = find_symtree_for_symbol (st->left, sym);
4139 if (s != NULL)
4140 return s;
4142 if (st->n.sym == sym && !check_unique_name (st->name))
4143 return st;
4145 return s;
4149 /* A recursive function to look for a specific symbol by name and by
4150 module. Whilst several symtrees might point to one symbol, its
4151 is sufficient for the purposes here than one exist. Note that
4152 generic interfaces are distinguished as are symbols that have been
4153 renamed in another module. */
4154 static gfc_symtree *
4155 find_symbol (gfc_symtree *st, const char *name,
4156 const char *module, int generic)
4158 int c;
4159 gfc_symtree *retval, *s;
4161 if (st == NULL || st->n.sym == NULL)
4162 return NULL;
4164 c = strcmp (name, st->n.sym->name);
4165 if (c == 0 && st->n.sym->module
4166 && strcmp (module, st->n.sym->module) == 0
4167 && !check_unique_name (st->name))
4169 s = gfc_find_symtree (gfc_current_ns->sym_root, name);
4171 /* Detect symbols that are renamed by use association in another
4172 module by the absence of a symtree and null attr.use_rename,
4173 since the latter is not transmitted in the module file. */
4174 if (((!generic && !st->n.sym->attr.generic)
4175 || (generic && st->n.sym->attr.generic))
4176 && !(s == NULL && !st->n.sym->attr.use_rename))
4177 return st;
4180 retval = find_symbol (st->left, name, module, generic);
4182 if (retval == NULL)
4183 retval = find_symbol (st->right, name, module, generic);
4185 return retval;
4189 /* Skip a list between balanced left and right parens.
4190 By setting NEST_LEVEL one assumes that a number of NEST_LEVEL opening parens
4191 have been already parsed by hand, and the remaining of the content is to be
4192 skipped here. The default value is 0 (balanced parens). */
4194 static void
4195 skip_list (int nest_level = 0)
4197 int level;
4199 level = nest_level;
4202 switch (parse_atom ())
4204 case ATOM_LPAREN:
4205 level++;
4206 break;
4208 case ATOM_RPAREN:
4209 level--;
4210 break;
4212 case ATOM_STRING:
4213 free (atom_string);
4214 break;
4216 case ATOM_NAME:
4217 case ATOM_INTEGER:
4218 break;
4221 while (level > 0);
4225 /* Load operator interfaces from the module. Interfaces are unusual
4226 in that they attach themselves to existing symbols. */
4228 static void
4229 load_operator_interfaces (void)
4231 const char *p;
4232 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
4233 gfc_user_op *uop;
4234 pointer_info *pi = NULL;
4235 int n, i;
4237 mio_lparen ();
4239 while (peek_atom () != ATOM_RPAREN)
4241 mio_lparen ();
4243 mio_internal_string (name);
4244 mio_internal_string (module);
4246 n = number_use_names (name, true);
4247 n = n ? n : 1;
4249 for (i = 1; i <= n; i++)
4251 /* Decide if we need to load this one or not. */
4252 p = find_use_name_n (name, &i, true);
4254 if (p == NULL)
4256 while (parse_atom () != ATOM_RPAREN);
4257 continue;
4260 if (i == 1)
4262 uop = gfc_get_uop (p);
4263 pi = mio_interface_rest (&uop->op);
4265 else
4267 if (gfc_find_uop (p, NULL))
4268 continue;
4269 uop = gfc_get_uop (p);
4270 uop->op = gfc_get_interface ();
4271 uop->op->where = gfc_current_locus;
4272 add_fixup (pi->integer, &uop->op->sym);
4277 mio_rparen ();
4281 /* Load interfaces from the module. Interfaces are unusual in that
4282 they attach themselves to existing symbols. */
4284 static void
4285 load_generic_interfaces (void)
4287 const char *p;
4288 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
4289 gfc_symbol *sym;
4290 gfc_interface *generic = NULL, *gen = NULL;
4291 int n, i, renamed;
4292 bool ambiguous_set = false;
4294 mio_lparen ();
4296 while (peek_atom () != ATOM_RPAREN)
4298 mio_lparen ();
4300 mio_internal_string (name);
4301 mio_internal_string (module);
4303 n = number_use_names (name, false);
4304 renamed = n ? 1 : 0;
4305 n = n ? n : 1;
4307 for (i = 1; i <= n; i++)
4309 gfc_symtree *st;
4310 /* Decide if we need to load this one or not. */
4311 p = find_use_name_n (name, &i, false);
4313 st = find_symbol (gfc_current_ns->sym_root,
4314 name, module_name, 1);
4316 if (!p || gfc_find_symbol (p, NULL, 0, &sym))
4318 /* Skip the specific names for these cases. */
4319 while (i == 1 && parse_atom () != ATOM_RPAREN);
4321 continue;
4324 /* If the symbol exists already and is being USEd without being
4325 in an ONLY clause, do not load a new symtree(11.3.2). */
4326 if (!only_flag && st)
4327 sym = st->n.sym;
4329 if (!sym)
4331 if (st)
4333 sym = st->n.sym;
4334 if (strcmp (st->name, p) != 0)
4336 st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
4337 st->n.sym = sym;
4338 sym->refs++;
4342 /* Since we haven't found a valid generic interface, we had
4343 better make one. */
4344 if (!sym)
4346 gfc_get_symbol (p, NULL, &sym);
4347 sym->name = gfc_get_string (name);
4348 sym->module = module_name;
4349 sym->attr.flavor = FL_PROCEDURE;
4350 sym->attr.generic = 1;
4351 sym->attr.use_assoc = 1;
4354 else
4356 /* Unless sym is a generic interface, this reference
4357 is ambiguous. */
4358 if (st == NULL)
4359 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4361 sym = st->n.sym;
4363 if (st && !sym->attr.generic
4364 && !st->ambiguous
4365 && sym->module
4366 && strcmp (module, sym->module))
4368 ambiguous_set = true;
4369 st->ambiguous = 1;
4373 sym->attr.use_only = only_flag;
4374 sym->attr.use_rename = renamed;
4376 if (i == 1)
4378 mio_interface_rest (&sym->generic);
4379 generic = sym->generic;
4381 else if (!sym->generic)
4383 sym->generic = generic;
4384 sym->attr.generic_copy = 1;
4387 /* If a procedure that is not generic has generic interfaces
4388 that include itself, it is generic! We need to take care
4389 to retain symbols ambiguous that were already so. */
4390 if (sym->attr.use_assoc
4391 && !sym->attr.generic
4392 && sym->attr.flavor == FL_PROCEDURE)
4394 for (gen = generic; gen; gen = gen->next)
4396 if (gen->sym == sym)
4398 sym->attr.generic = 1;
4399 if (ambiguous_set)
4400 st->ambiguous = 0;
4401 break;
4409 mio_rparen ();
4413 /* Load common blocks. */
4415 static void
4416 load_commons (void)
4418 char name[GFC_MAX_SYMBOL_LEN + 1];
4419 gfc_common_head *p;
4421 mio_lparen ();
4423 while (peek_atom () != ATOM_RPAREN)
4425 int flags;
4426 char* label;
4427 mio_lparen ();
4428 mio_internal_string (name);
4430 p = gfc_get_common (name, 1);
4432 mio_symbol_ref (&p->head);
4433 mio_integer (&flags);
4434 if (flags & 1)
4435 p->saved = 1;
4436 if (flags & 2)
4437 p->threadprivate = 1;
4438 p->use_assoc = 1;
4440 /* Get whether this was a bind(c) common or not. */
4441 mio_integer (&p->is_bind_c);
4442 /* Get the binding label. */
4443 label = read_string ();
4444 if (strlen (label))
4445 p->binding_label = IDENTIFIER_POINTER (get_identifier (label));
4446 XDELETEVEC (label);
4448 mio_rparen ();
4451 mio_rparen ();
4455 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
4456 so that unused variables are not loaded and so that the expression can
4457 be safely freed. */
4459 static void
4460 load_equiv (void)
4462 gfc_equiv *head, *tail, *end, *eq;
4463 bool unused;
4465 mio_lparen ();
4466 in_load_equiv = true;
4468 end = gfc_current_ns->equiv;
4469 while (end != NULL && end->next != NULL)
4470 end = end->next;
4472 while (peek_atom () != ATOM_RPAREN) {
4473 mio_lparen ();
4474 head = tail = NULL;
4476 while(peek_atom () != ATOM_RPAREN)
4478 if (head == NULL)
4479 head = tail = gfc_get_equiv ();
4480 else
4482 tail->eq = gfc_get_equiv ();
4483 tail = tail->eq;
4486 mio_pool_string (&tail->module);
4487 mio_expr (&tail->expr);
4490 /* Unused equivalence members have a unique name. In addition, it
4491 must be checked that the symbols are from the same module. */
4492 unused = true;
4493 for (eq = head; eq; eq = eq->eq)
4495 if (eq->expr->symtree->n.sym->module
4496 && head->expr->symtree->n.sym->module
4497 && strcmp (head->expr->symtree->n.sym->module,
4498 eq->expr->symtree->n.sym->module) == 0
4499 && !check_unique_name (eq->expr->symtree->name))
4501 unused = false;
4502 break;
4506 if (unused)
4508 for (eq = head; eq; eq = head)
4510 head = eq->eq;
4511 gfc_free_expr (eq->expr);
4512 free (eq);
4516 if (end == NULL)
4517 gfc_current_ns->equiv = head;
4518 else
4519 end->next = head;
4521 if (head != NULL)
4522 end = head;
4524 mio_rparen ();
4527 mio_rparen ();
4528 in_load_equiv = false;
4532 /* This function loads the sym_root of f2k_derived with the extensions to
4533 the derived type. */
4534 static void
4535 load_derived_extensions (void)
4537 int symbol, j;
4538 gfc_symbol *derived;
4539 gfc_symbol *dt;
4540 gfc_symtree *st;
4541 pointer_info *info;
4542 char name[GFC_MAX_SYMBOL_LEN + 1];
4543 char module[GFC_MAX_SYMBOL_LEN + 1];
4544 const char *p;
4546 mio_lparen ();
4547 while (peek_atom () != ATOM_RPAREN)
4549 mio_lparen ();
4550 mio_integer (&symbol);
4551 info = get_integer (symbol);
4552 derived = info->u.rsym.sym;
4554 /* This one is not being loaded. */
4555 if (!info || !derived)
4557 while (peek_atom () != ATOM_RPAREN)
4558 skip_list ();
4559 continue;
4562 gcc_assert (derived->attr.flavor == FL_DERIVED);
4563 if (derived->f2k_derived == NULL)
4564 derived->f2k_derived = gfc_get_namespace (NULL, 0);
4566 while (peek_atom () != ATOM_RPAREN)
4568 mio_lparen ();
4569 mio_internal_string (name);
4570 mio_internal_string (module);
4572 /* Only use one use name to find the symbol. */
4573 j = 1;
4574 p = find_use_name_n (name, &j, false);
4575 if (p)
4577 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4578 dt = st->n.sym;
4579 st = gfc_find_symtree (derived->f2k_derived->sym_root, name);
4580 if (st == NULL)
4582 /* Only use the real name in f2k_derived to ensure a single
4583 symtree. */
4584 st = gfc_new_symtree (&derived->f2k_derived->sym_root, name);
4585 st->n.sym = dt;
4586 st->n.sym->refs++;
4589 mio_rparen ();
4591 mio_rparen ();
4593 mio_rparen ();
4597 /* This function loads OpenMP user defined reductions. */
4598 static void
4599 load_omp_udrs (void)
4601 mio_lparen ();
4602 while (peek_atom () != ATOM_RPAREN)
4604 const char *name, *newname;
4605 char *altname;
4606 gfc_typespec ts;
4607 gfc_symtree *st;
4608 gfc_omp_reduction_op rop = OMP_REDUCTION_USER;
4610 mio_lparen ();
4611 mio_pool_string (&name);
4612 mio_typespec (&ts);
4613 if (strncmp (name, "operator ", sizeof ("operator ") - 1) == 0)
4615 const char *p = name + sizeof ("operator ") - 1;
4616 if (strcmp (p, "+") == 0)
4617 rop = OMP_REDUCTION_PLUS;
4618 else if (strcmp (p, "*") == 0)
4619 rop = OMP_REDUCTION_TIMES;
4620 else if (strcmp (p, "-") == 0)
4621 rop = OMP_REDUCTION_MINUS;
4622 else if (strcmp (p, ".and.") == 0)
4623 rop = OMP_REDUCTION_AND;
4624 else if (strcmp (p, ".or.") == 0)
4625 rop = OMP_REDUCTION_OR;
4626 else if (strcmp (p, ".eqv.") == 0)
4627 rop = OMP_REDUCTION_EQV;
4628 else if (strcmp (p, ".neqv.") == 0)
4629 rop = OMP_REDUCTION_NEQV;
4631 altname = NULL;
4632 if (rop == OMP_REDUCTION_USER && name[0] == '.')
4634 size_t len = strlen (name + 1);
4635 altname = XALLOCAVEC (char, len);
4636 gcc_assert (name[len] == '.');
4637 memcpy (altname, name + 1, len - 1);
4638 altname[len - 1] = '\0';
4640 newname = name;
4641 if (rop == OMP_REDUCTION_USER)
4642 newname = find_use_name (altname ? altname : name, !!altname);
4643 else if (only_flag && find_use_operator ((gfc_intrinsic_op) rop) == NULL)
4644 newname = NULL;
4645 if (newname == NULL)
4647 skip_list (1);
4648 continue;
4650 if (altname && newname != altname)
4652 size_t len = strlen (newname);
4653 altname = XALLOCAVEC (char, len + 3);
4654 altname[0] = '.';
4655 memcpy (altname + 1, newname, len);
4656 altname[len + 1] = '.';
4657 altname[len + 2] = '\0';
4658 name = gfc_get_string (altname);
4660 st = gfc_find_symtree (gfc_current_ns->omp_udr_root, name);
4661 gfc_omp_udr *udr = gfc_omp_udr_find (st, &ts);
4662 if (udr)
4664 require_atom (ATOM_INTEGER);
4665 pointer_info *p = get_integer (atom_int);
4666 if (strcmp (p->u.rsym.module, udr->omp_out->module))
4668 gfc_error ("Ambiguous !$OMP DECLARE REDUCTION from "
4669 "module %s at %L",
4670 p->u.rsym.module, &gfc_current_locus);
4671 gfc_error ("Previous !$OMP DECLARE REDUCTION from module "
4672 "%s at %L",
4673 udr->omp_out->module, &udr->where);
4675 skip_list (1);
4676 continue;
4678 udr = gfc_get_omp_udr ();
4679 udr->name = name;
4680 udr->rop = rop;
4681 udr->ts = ts;
4682 udr->where = gfc_current_locus;
4683 udr->combiner_ns = gfc_get_namespace (gfc_current_ns, 1);
4684 udr->combiner_ns->proc_name = gfc_current_ns->proc_name;
4685 mio_omp_udr_expr (udr, &udr->omp_out, &udr->omp_in, udr->combiner_ns,
4686 false);
4687 if (peek_atom () != ATOM_RPAREN)
4689 udr->initializer_ns = gfc_get_namespace (gfc_current_ns, 1);
4690 udr->initializer_ns->proc_name = gfc_current_ns->proc_name;
4691 mio_omp_udr_expr (udr, &udr->omp_priv, &udr->omp_orig,
4692 udr->initializer_ns, true);
4694 if (st)
4696 udr->next = st->n.omp_udr;
4697 st->n.omp_udr = udr;
4699 else
4701 st = gfc_new_symtree (&gfc_current_ns->omp_udr_root, name);
4702 st->n.omp_udr = udr;
4704 mio_rparen ();
4706 mio_rparen ();
4710 /* Recursive function to traverse the pointer_info tree and load a
4711 needed symbol. We return nonzero if we load a symbol and stop the
4712 traversal, because the act of loading can alter the tree. */
4714 static int
4715 load_needed (pointer_info *p)
4717 gfc_namespace *ns;
4718 pointer_info *q;
4719 gfc_symbol *sym;
4720 int rv;
4722 rv = 0;
4723 if (p == NULL)
4724 return rv;
4726 rv |= load_needed (p->left);
4727 rv |= load_needed (p->right);
4729 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
4730 return rv;
4732 p->u.rsym.state = USED;
4734 set_module_locus (&p->u.rsym.where);
4736 sym = p->u.rsym.sym;
4737 if (sym == NULL)
4739 q = get_integer (p->u.rsym.ns);
4741 ns = (gfc_namespace *) q->u.pointer;
4742 if (ns == NULL)
4744 /* Create an interface namespace if necessary. These are
4745 the namespaces that hold the formal parameters of module
4746 procedures. */
4748 ns = gfc_get_namespace (NULL, 0);
4749 associate_integer_pointer (q, ns);
4752 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
4753 doesn't go pear-shaped if the symbol is used. */
4754 if (!ns->proc_name)
4755 gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
4756 1, &ns->proc_name);
4758 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
4759 sym->name = dt_lower_string (p->u.rsym.true_name);
4760 sym->module = gfc_get_string (p->u.rsym.module);
4761 if (p->u.rsym.binding_label)
4762 sym->binding_label = IDENTIFIER_POINTER (get_identifier
4763 (p->u.rsym.binding_label));
4765 associate_integer_pointer (p, sym);
4768 mio_symbol (sym);
4769 sym->attr.use_assoc = 1;
4771 /* Mark as only or rename for later diagnosis for explicitly imported
4772 but not used warnings; don't mark internal symbols such as __vtab,
4773 __def_init etc. Only mark them if they have been explicitly loaded. */
4775 if (only_flag && sym->name[0] != '_' && sym->name[1] != '_')
4777 gfc_use_rename *u;
4779 /* Search the use/rename list for the variable; if the variable is
4780 found, mark it. */
4781 for (u = gfc_rename_list; u; u = u->next)
4783 if (strcmp (u->use_name, sym->name) == 0)
4785 sym->attr.use_only = 1;
4786 break;
4791 if (p->u.rsym.renamed)
4792 sym->attr.use_rename = 1;
4794 return 1;
4798 /* Recursive function for cleaning up things after a module has been read. */
4800 static void
4801 read_cleanup (pointer_info *p)
4803 gfc_symtree *st;
4804 pointer_info *q;
4806 if (p == NULL)
4807 return;
4809 read_cleanup (p->left);
4810 read_cleanup (p->right);
4812 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
4814 gfc_namespace *ns;
4815 /* Add hidden symbols to the symtree. */
4816 q = get_integer (p->u.rsym.ns);
4817 ns = (gfc_namespace *) q->u.pointer;
4819 if (!p->u.rsym.sym->attr.vtype
4820 && !p->u.rsym.sym->attr.vtab)
4821 st = gfc_get_unique_symtree (ns);
4822 else
4824 /* There is no reason to use 'unique_symtrees' for vtabs or
4825 vtypes - their name is fine for a symtree and reduces the
4826 namespace pollution. */
4827 st = gfc_find_symtree (ns->sym_root, p->u.rsym.sym->name);
4828 if (!st)
4829 st = gfc_new_symtree (&ns->sym_root, p->u.rsym.sym->name);
4832 st->n.sym = p->u.rsym.sym;
4833 st->n.sym->refs++;
4835 /* Fixup any symtree references. */
4836 p->u.rsym.symtree = st;
4837 resolve_fixups (p->u.rsym.stfixup, st);
4838 p->u.rsym.stfixup = NULL;
4841 /* Free unused symbols. */
4842 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
4843 gfc_free_symbol (p->u.rsym.sym);
4847 /* It is not quite enough to check for ambiguity in the symbols by
4848 the loaded symbol and the new symbol not being identical. */
4849 static bool
4850 check_for_ambiguous (gfc_symbol *st_sym, pointer_info *info)
4852 gfc_symbol *rsym;
4853 module_locus locus;
4854 symbol_attribute attr;
4856 if (gfc_current_ns->proc_name && st_sym->name == gfc_current_ns->proc_name->name)
4858 gfc_error ("'%s' of module '%s', imported at %C, is also the name of the "
4859 "current program unit", st_sym->name, module_name);
4860 return true;
4863 rsym = info->u.rsym.sym;
4864 if (st_sym == rsym)
4865 return false;
4867 if (st_sym->attr.vtab || st_sym->attr.vtype)
4868 return false;
4870 /* If the existing symbol is generic from a different module and
4871 the new symbol is generic there can be no ambiguity. */
4872 if (st_sym->attr.generic
4873 && st_sym->module
4874 && st_sym->module != module_name)
4876 /* The new symbol's attributes have not yet been read. Since
4877 we need attr.generic, read it directly. */
4878 get_module_locus (&locus);
4879 set_module_locus (&info->u.rsym.where);
4880 mio_lparen ();
4881 attr.generic = 0;
4882 mio_symbol_attribute (&attr);
4883 set_module_locus (&locus);
4884 if (attr.generic)
4885 return false;
4888 return true;
4892 /* Read a module file. */
4894 static void
4895 read_module (void)
4897 module_locus operator_interfaces, user_operators, extensions, omp_udrs;
4898 const char *p;
4899 char name[GFC_MAX_SYMBOL_LEN + 1];
4900 int i;
4901 int ambiguous, j, nuse, symbol;
4902 pointer_info *info, *q;
4903 gfc_use_rename *u = NULL;
4904 gfc_symtree *st;
4905 gfc_symbol *sym;
4907 get_module_locus (&operator_interfaces); /* Skip these for now. */
4908 skip_list ();
4910 get_module_locus (&user_operators);
4911 skip_list ();
4912 skip_list ();
4914 /* Skip commons, equivalences and derived type extensions for now. */
4915 skip_list ();
4916 skip_list ();
4918 get_module_locus (&extensions);
4919 skip_list ();
4921 /* Skip OpenMP UDRs. */
4922 get_module_locus (&omp_udrs);
4923 skip_list ();
4925 mio_lparen ();
4927 /* Create the fixup nodes for all the symbols. */
4929 while (peek_atom () != ATOM_RPAREN)
4931 char* bind_label;
4932 require_atom (ATOM_INTEGER);
4933 info = get_integer (atom_int);
4935 info->type = P_SYMBOL;
4936 info->u.rsym.state = UNUSED;
4938 info->u.rsym.true_name = read_string ();
4939 info->u.rsym.module = read_string ();
4940 bind_label = read_string ();
4941 if (strlen (bind_label))
4942 info->u.rsym.binding_label = bind_label;
4943 else
4944 XDELETEVEC (bind_label);
4946 require_atom (ATOM_INTEGER);
4947 info->u.rsym.ns = atom_int;
4949 get_module_locus (&info->u.rsym.where);
4951 /* See if the symbol has already been loaded by a previous module.
4952 If so, we reference the existing symbol and prevent it from
4953 being loaded again. This should not happen if the symbol being
4954 read is an index for an assumed shape dummy array (ns != 1). */
4956 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
4958 if (sym == NULL
4959 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
4961 skip_list ();
4962 continue;
4965 info->u.rsym.state = USED;
4966 info->u.rsym.sym = sym;
4967 /* The current symbol has already been loaded, so we can avoid loading
4968 it again. However, if it is a derived type, some of its components
4969 can be used in expressions in the module. To avoid the module loading
4970 failing, we need to associate the module's component pointer indexes
4971 with the existing symbol's component pointers. */
4972 if (sym->attr.flavor == FL_DERIVED)
4974 gfc_component *c;
4976 /* First seek to the symbol's component list. */
4977 mio_lparen (); /* symbol opening. */
4978 skip_list (); /* skip symbol attribute. */
4980 mio_lparen (); /* component list opening. */
4981 for (c = sym->components; c; c = c->next)
4983 pointer_info *p;
4984 const char *comp_name;
4985 int n;
4987 mio_lparen (); /* component opening. */
4988 mio_integer (&n);
4989 p = get_integer (n);
4990 if (p->u.pointer == NULL)
4991 associate_integer_pointer (p, c);
4992 mio_pool_string (&comp_name);
4993 gcc_assert (comp_name == c->name);
4994 skip_list (1); /* component end. */
4996 mio_rparen (); /* component list closing. */
4998 skip_list (1); /* symbol end. */
5000 else
5001 skip_list ();
5003 /* Some symbols do not have a namespace (eg. formal arguments),
5004 so the automatic "unique symtree" mechanism must be suppressed
5005 by marking them as referenced. */
5006 q = get_integer (info->u.rsym.ns);
5007 if (q->u.pointer == NULL)
5009 info->u.rsym.referenced = 1;
5010 continue;
5013 /* If possible recycle the symtree that references the symbol.
5014 If a symtree is not found and the module does not import one,
5015 a unique-name symtree is found by read_cleanup. */
5016 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
5017 if (st != NULL)
5019 info->u.rsym.symtree = st;
5020 info->u.rsym.referenced = 1;
5024 mio_rparen ();
5026 /* Parse the symtree lists. This lets us mark which symbols need to
5027 be loaded. Renaming is also done at this point by replacing the
5028 symtree name. */
5030 mio_lparen ();
5032 while (peek_atom () != ATOM_RPAREN)
5034 mio_internal_string (name);
5035 mio_integer (&ambiguous);
5036 mio_integer (&symbol);
5038 info = get_integer (symbol);
5040 /* See how many use names there are. If none, go through the start
5041 of the loop at least once. */
5042 nuse = number_use_names (name, false);
5043 info->u.rsym.renamed = nuse ? 1 : 0;
5045 if (nuse == 0)
5046 nuse = 1;
5048 for (j = 1; j <= nuse; j++)
5050 /* Get the jth local name for this symbol. */
5051 p = find_use_name_n (name, &j, false);
5053 if (p == NULL && strcmp (name, module_name) == 0)
5054 p = name;
5056 /* Exception: Always import vtabs & vtypes. */
5057 if (p == NULL && name[0] == '_'
5058 && (strncmp (name, "__vtab_", 5) == 0
5059 || strncmp (name, "__vtype_", 6) == 0))
5060 p = name;
5062 /* Skip symtree nodes not in an ONLY clause, unless there
5063 is an existing symtree loaded from another USE statement. */
5064 if (p == NULL)
5066 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
5067 if (st != NULL
5068 && strcmp (st->n.sym->name, info->u.rsym.true_name) == 0
5069 && st->n.sym->module != NULL
5070 && strcmp (st->n.sym->module, info->u.rsym.module) == 0)
5072 info->u.rsym.symtree = st;
5073 info->u.rsym.sym = st->n.sym;
5075 continue;
5078 /* If a symbol of the same name and module exists already,
5079 this symbol, which is not in an ONLY clause, must not be
5080 added to the namespace(11.3.2). Note that find_symbol
5081 only returns the first occurrence that it finds. */
5082 if (!only_flag && !info->u.rsym.renamed
5083 && strcmp (name, module_name) != 0
5084 && find_symbol (gfc_current_ns->sym_root, name,
5085 module_name, 0))
5086 continue;
5088 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
5090 if (st != NULL)
5092 /* Check for ambiguous symbols. */
5093 if (check_for_ambiguous (st->n.sym, info))
5094 st->ambiguous = 1;
5095 else
5096 info->u.rsym.symtree = st;
5098 else
5100 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
5102 /* Create a symtree node in the current namespace for this
5103 symbol. */
5104 st = check_unique_name (p)
5105 ? gfc_get_unique_symtree (gfc_current_ns)
5106 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
5107 st->ambiguous = ambiguous;
5109 sym = info->u.rsym.sym;
5111 /* Create a symbol node if it doesn't already exist. */
5112 if (sym == NULL)
5114 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
5115 gfc_current_ns);
5116 info->u.rsym.sym->name = dt_lower_string (info->u.rsym.true_name);
5117 sym = info->u.rsym.sym;
5118 sym->module = gfc_get_string (info->u.rsym.module);
5120 if (info->u.rsym.binding_label)
5121 sym->binding_label =
5122 IDENTIFIER_POINTER (get_identifier
5123 (info->u.rsym.binding_label));
5126 st->n.sym = sym;
5127 st->n.sym->refs++;
5129 if (strcmp (name, p) != 0)
5130 sym->attr.use_rename = 1;
5132 if (name[0] != '_'
5133 || (strncmp (name, "__vtab_", 5) != 0
5134 && strncmp (name, "__vtype_", 6) != 0))
5135 sym->attr.use_only = only_flag;
5137 /* Store the symtree pointing to this symbol. */
5138 info->u.rsym.symtree = st;
5140 if (info->u.rsym.state == UNUSED)
5141 info->u.rsym.state = NEEDED;
5142 info->u.rsym.referenced = 1;
5147 mio_rparen ();
5149 /* Load intrinsic operator interfaces. */
5150 set_module_locus (&operator_interfaces);
5151 mio_lparen ();
5153 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
5155 if (i == INTRINSIC_USER)
5156 continue;
5158 if (only_flag)
5160 u = find_use_operator ((gfc_intrinsic_op) i);
5162 if (u == NULL)
5164 skip_list ();
5165 continue;
5168 u->found = 1;
5171 mio_interface (&gfc_current_ns->op[i]);
5172 if (u && !gfc_current_ns->op[i])
5173 u->found = 0;
5176 mio_rparen ();
5178 /* Load generic and user operator interfaces. These must follow the
5179 loading of symtree because otherwise symbols can be marked as
5180 ambiguous. */
5182 set_module_locus (&user_operators);
5184 load_operator_interfaces ();
5185 load_generic_interfaces ();
5187 load_commons ();
5188 load_equiv ();
5190 /* Load OpenMP user defined reductions. */
5191 set_module_locus (&omp_udrs);
5192 load_omp_udrs ();
5194 /* At this point, we read those symbols that are needed but haven't
5195 been loaded yet. If one symbol requires another, the other gets
5196 marked as NEEDED if its previous state was UNUSED. */
5198 while (load_needed (pi_root));
5200 /* Make sure all elements of the rename-list were found in the module. */
5202 for (u = gfc_rename_list; u; u = u->next)
5204 if (u->found)
5205 continue;
5207 if (u->op == INTRINSIC_NONE)
5209 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
5210 u->use_name, &u->where, module_name);
5211 continue;
5214 if (u->op == INTRINSIC_USER)
5216 gfc_error ("User operator '%s' referenced at %L not found "
5217 "in module '%s'", u->use_name, &u->where, module_name);
5218 continue;
5221 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
5222 "in module '%s'", gfc_op2string (u->op), &u->where,
5223 module_name);
5226 /* Now we should be in a position to fill f2k_derived with derived type
5227 extensions, since everything has been loaded. */
5228 set_module_locus (&extensions);
5229 load_derived_extensions ();
5231 /* Clean up symbol nodes that were never loaded, create references
5232 to hidden symbols. */
5234 read_cleanup (pi_root);
5238 /* Given an access type that is specific to an entity and the default
5239 access, return nonzero if the entity is publicly accessible. If the
5240 element is declared as PUBLIC, then it is public; if declared
5241 PRIVATE, then private, and otherwise it is public unless the default
5242 access in this context has been declared PRIVATE. */
5244 static bool
5245 check_access (gfc_access specific_access, gfc_access default_access)
5247 if (specific_access == ACCESS_PUBLIC)
5248 return TRUE;
5249 if (specific_access == ACCESS_PRIVATE)
5250 return FALSE;
5252 if (gfc_option.flag_module_private)
5253 return default_access == ACCESS_PUBLIC;
5254 else
5255 return default_access != ACCESS_PRIVATE;
5259 bool
5260 gfc_check_symbol_access (gfc_symbol *sym)
5262 if (sym->attr.vtab || sym->attr.vtype)
5263 return true;
5264 else
5265 return check_access (sym->attr.access, sym->ns->default_access);
5269 /* A structure to remember which commons we've already written. */
5271 struct written_common
5273 BBT_HEADER(written_common);
5274 const char *name, *label;
5277 static struct written_common *written_commons = NULL;
5279 /* Comparison function used for balancing the binary tree. */
5281 static int
5282 compare_written_commons (void *a1, void *b1)
5284 const char *aname = ((struct written_common *) a1)->name;
5285 const char *alabel = ((struct written_common *) a1)->label;
5286 const char *bname = ((struct written_common *) b1)->name;
5287 const char *blabel = ((struct written_common *) b1)->label;
5288 int c = strcmp (aname, bname);
5290 return (c != 0 ? c : strcmp (alabel, blabel));
5293 /* Free a list of written commons. */
5295 static void
5296 free_written_common (struct written_common *w)
5298 if (!w)
5299 return;
5301 if (w->left)
5302 free_written_common (w->left);
5303 if (w->right)
5304 free_written_common (w->right);
5306 free (w);
5309 /* Write a common block to the module -- recursive helper function. */
5311 static void
5312 write_common_0 (gfc_symtree *st, bool this_module)
5314 gfc_common_head *p;
5315 const char * name;
5316 int flags;
5317 const char *label;
5318 struct written_common *w;
5319 bool write_me = true;
5321 if (st == NULL)
5322 return;
5324 write_common_0 (st->left, this_module);
5326 /* We will write out the binding label, or "" if no label given. */
5327 name = st->n.common->name;
5328 p = st->n.common;
5329 label = (p->is_bind_c && p->binding_label) ? p->binding_label : "";
5331 /* Check if we've already output this common. */
5332 w = written_commons;
5333 while (w)
5335 int c = strcmp (name, w->name);
5336 c = (c != 0 ? c : strcmp (label, w->label));
5337 if (c == 0)
5338 write_me = false;
5340 w = (c < 0) ? w->left : w->right;
5343 if (this_module && p->use_assoc)
5344 write_me = false;
5346 if (write_me)
5348 /* Write the common to the module. */
5349 mio_lparen ();
5350 mio_pool_string (&name);
5352 mio_symbol_ref (&p->head);
5353 flags = p->saved ? 1 : 0;
5354 if (p->threadprivate)
5355 flags |= 2;
5356 mio_integer (&flags);
5358 /* Write out whether the common block is bind(c) or not. */
5359 mio_integer (&(p->is_bind_c));
5361 mio_pool_string (&label);
5362 mio_rparen ();
5364 /* Record that we have written this common. */
5365 w = XCNEW (struct written_common);
5366 w->name = p->name;
5367 w->label = label;
5368 gfc_insert_bbt (&written_commons, w, compare_written_commons);
5371 write_common_0 (st->right, this_module);
5375 /* Write a common, by initializing the list of written commons, calling
5376 the recursive function write_common_0() and cleaning up afterwards. */
5378 static void
5379 write_common (gfc_symtree *st)
5381 written_commons = NULL;
5382 write_common_0 (st, true);
5383 write_common_0 (st, false);
5384 free_written_common (written_commons);
5385 written_commons = NULL;
5389 /* Write the blank common block to the module. */
5391 static void
5392 write_blank_common (void)
5394 const char * name = BLANK_COMMON_NAME;
5395 int saved;
5396 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
5397 this, but it hasn't been checked. Just making it so for now. */
5398 int is_bind_c = 0;
5400 if (gfc_current_ns->blank_common.head == NULL)
5401 return;
5403 mio_lparen ();
5405 mio_pool_string (&name);
5407 mio_symbol_ref (&gfc_current_ns->blank_common.head);
5408 saved = gfc_current_ns->blank_common.saved;
5409 mio_integer (&saved);
5411 /* Write out whether the common block is bind(c) or not. */
5412 mio_integer (&is_bind_c);
5414 /* Write out an empty binding label. */
5415 write_atom (ATOM_STRING, "");
5417 mio_rparen ();
5421 /* Write equivalences to the module. */
5423 static void
5424 write_equiv (void)
5426 gfc_equiv *eq, *e;
5427 int num;
5429 num = 0;
5430 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
5432 mio_lparen ();
5434 for (e = eq; e; e = e->eq)
5436 if (e->module == NULL)
5437 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
5438 mio_allocated_string (e->module);
5439 mio_expr (&e->expr);
5442 num++;
5443 mio_rparen ();
5448 /* Write derived type extensions to the module. */
5450 static void
5451 write_dt_extensions (gfc_symtree *st)
5453 if (!gfc_check_symbol_access (st->n.sym))
5454 return;
5455 if (!(st->n.sym->ns && st->n.sym->ns->proc_name
5456 && st->n.sym->ns->proc_name->attr.flavor == FL_MODULE))
5457 return;
5459 mio_lparen ();
5460 mio_pool_string (&st->name);
5461 if (st->n.sym->module != NULL)
5462 mio_pool_string (&st->n.sym->module);
5463 else
5465 char name[GFC_MAX_SYMBOL_LEN + 1];
5466 if (iomode == IO_OUTPUT)
5467 strcpy (name, module_name);
5468 mio_internal_string (name);
5469 if (iomode == IO_INPUT)
5470 module_name = gfc_get_string (name);
5472 mio_rparen ();
5475 static void
5476 write_derived_extensions (gfc_symtree *st)
5478 if (!((st->n.sym->attr.flavor == FL_DERIVED)
5479 && (st->n.sym->f2k_derived != NULL)
5480 && (st->n.sym->f2k_derived->sym_root != NULL)))
5481 return;
5483 mio_lparen ();
5484 mio_symbol_ref (&(st->n.sym));
5485 gfc_traverse_symtree (st->n.sym->f2k_derived->sym_root,
5486 write_dt_extensions);
5487 mio_rparen ();
5491 /* Write a symbol to the module. */
5493 static void
5494 write_symbol (int n, gfc_symbol *sym)
5496 const char *label;
5498 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
5499 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
5501 mio_integer (&n);
5503 if (sym->attr.flavor == FL_DERIVED)
5505 const char *name;
5506 name = dt_upper_string (sym->name);
5507 mio_pool_string (&name);
5509 else
5510 mio_pool_string (&sym->name);
5512 mio_pool_string (&sym->module);
5513 if ((sym->attr.is_bind_c || sym->attr.is_iso_c) && sym->binding_label)
5515 label = sym->binding_label;
5516 mio_pool_string (&label);
5518 else
5519 write_atom (ATOM_STRING, "");
5521 mio_pointer_ref (&sym->ns);
5523 mio_symbol (sym);
5524 write_char ('\n');
5528 /* Recursive traversal function to write the initial set of symbols to
5529 the module. We check to see if the symbol should be written
5530 according to the access specification. */
5532 static void
5533 write_symbol0 (gfc_symtree *st)
5535 gfc_symbol *sym;
5536 pointer_info *p;
5537 bool dont_write = false;
5539 if (st == NULL)
5540 return;
5542 write_symbol0 (st->left);
5544 sym = st->n.sym;
5545 if (sym->module == NULL)
5546 sym->module = module_name;
5548 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5549 && !sym->attr.subroutine && !sym->attr.function)
5550 dont_write = true;
5552 if (!gfc_check_symbol_access (sym))
5553 dont_write = true;
5555 if (!dont_write)
5557 p = get_pointer (sym);
5558 if (p->type == P_UNKNOWN)
5559 p->type = P_SYMBOL;
5561 if (p->u.wsym.state != WRITTEN)
5563 write_symbol (p->integer, sym);
5564 p->u.wsym.state = WRITTEN;
5568 write_symbol0 (st->right);
5572 static void
5573 write_omp_udr (gfc_omp_udr *udr)
5575 switch (udr->rop)
5577 case OMP_REDUCTION_USER:
5578 /* Non-operators can't be used outside of the module. */
5579 if (udr->name[0] != '.')
5580 return;
5581 else
5583 gfc_symtree *st;
5584 size_t len = strlen (udr->name + 1);
5585 char *name = XALLOCAVEC (char, len);
5586 memcpy (name, udr->name, len - 1);
5587 name[len - 1] = '\0';
5588 st = gfc_find_symtree (gfc_current_ns->uop_root, name);
5589 /* If corresponding user operator is private, don't write
5590 the UDR. */
5591 if (st != NULL)
5593 gfc_user_op *uop = st->n.uop;
5594 if (!check_access (uop->access, uop->ns->default_access))
5595 return;
5598 break;
5599 case OMP_REDUCTION_PLUS:
5600 case OMP_REDUCTION_MINUS:
5601 case OMP_REDUCTION_TIMES:
5602 case OMP_REDUCTION_AND:
5603 case OMP_REDUCTION_OR:
5604 case OMP_REDUCTION_EQV:
5605 case OMP_REDUCTION_NEQV:
5606 /* If corresponding operator is private, don't write the UDR. */
5607 if (!check_access (gfc_current_ns->operator_access[udr->rop],
5608 gfc_current_ns->default_access))
5609 return;
5610 break;
5611 default:
5612 break;
5614 if (udr->ts.type == BT_DERIVED || udr->ts.type == BT_CLASS)
5616 /* If derived type is private, don't write the UDR. */
5617 if (!gfc_check_symbol_access (udr->ts.u.derived))
5618 return;
5621 mio_lparen ();
5622 mio_pool_string (&udr->name);
5623 mio_typespec (&udr->ts);
5624 mio_omp_udr_expr (udr, &udr->omp_out, &udr->omp_in, udr->combiner_ns, false);
5625 if (udr->initializer_ns)
5626 mio_omp_udr_expr (udr, &udr->omp_priv, &udr->omp_orig,
5627 udr->initializer_ns, true);
5628 mio_rparen ();
5632 static void
5633 write_omp_udrs (gfc_symtree *st)
5635 if (st == NULL)
5636 return;
5638 write_omp_udrs (st->left);
5639 gfc_omp_udr *udr;
5640 for (udr = st->n.omp_udr; udr; udr = udr->next)
5641 write_omp_udr (udr);
5642 write_omp_udrs (st->right);
5646 /* Type for the temporary tree used when writing secondary symbols. */
5648 struct sorted_pointer_info
5650 BBT_HEADER (sorted_pointer_info);
5652 pointer_info *p;
5655 #define gfc_get_sorted_pointer_info() XCNEW (sorted_pointer_info)
5657 /* Recursively traverse the temporary tree, free its contents. */
5659 static void
5660 free_sorted_pointer_info_tree (sorted_pointer_info *p)
5662 if (!p)
5663 return;
5665 free_sorted_pointer_info_tree (p->left);
5666 free_sorted_pointer_info_tree (p->right);
5668 free (p);
5671 /* Comparison function for the temporary tree. */
5673 static int
5674 compare_sorted_pointer_info (void *_spi1, void *_spi2)
5676 sorted_pointer_info *spi1, *spi2;
5677 spi1 = (sorted_pointer_info *)_spi1;
5678 spi2 = (sorted_pointer_info *)_spi2;
5680 if (spi1->p->integer < spi2->p->integer)
5681 return -1;
5682 if (spi1->p->integer > spi2->p->integer)
5683 return 1;
5684 return 0;
5688 /* Finds the symbols that need to be written and collects them in the
5689 sorted_pi tree so that they can be traversed in an order
5690 independent of memory addresses. */
5692 static void
5693 find_symbols_to_write(sorted_pointer_info **tree, pointer_info *p)
5695 if (!p)
5696 return;
5698 if (p->type == P_SYMBOL && p->u.wsym.state == NEEDS_WRITE)
5700 sorted_pointer_info *sp = gfc_get_sorted_pointer_info();
5701 sp->p = p;
5703 gfc_insert_bbt (tree, sp, compare_sorted_pointer_info);
5706 find_symbols_to_write (tree, p->left);
5707 find_symbols_to_write (tree, p->right);
5711 /* Recursive function that traverses the tree of symbols that need to be
5712 written and writes them in order. */
5714 static void
5715 write_symbol1_recursion (sorted_pointer_info *sp)
5717 if (!sp)
5718 return;
5720 write_symbol1_recursion (sp->left);
5722 pointer_info *p1 = sp->p;
5723 gcc_assert (p1->type == P_SYMBOL && p1->u.wsym.state == NEEDS_WRITE);
5725 p1->u.wsym.state = WRITTEN;
5726 write_symbol (p1->integer, p1->u.wsym.sym);
5727 p1->u.wsym.sym->attr.public_used = 1;
5729 write_symbol1_recursion (sp->right);
5733 /* Write the secondary set of symbols to the module file. These are
5734 symbols that were not public yet are needed by the public symbols
5735 or another dependent symbol. The act of writing a symbol can add
5736 symbols to the pointer_info tree, so we return nonzero if a symbol
5737 was written and pass that information upwards. The caller will
5738 then call this function again until nothing was written. It uses
5739 the utility functions and a temporary tree to ensure a reproducible
5740 ordering of the symbol output and thus the module file. */
5742 static int
5743 write_symbol1 (pointer_info *p)
5745 if (!p)
5746 return 0;
5748 /* Put symbols that need to be written into a tree sorted on the
5749 integer field. */
5751 sorted_pointer_info *spi_root = NULL;
5752 find_symbols_to_write (&spi_root, p);
5754 /* No symbols to write, return. */
5755 if (!spi_root)
5756 return 0;
5758 /* Otherwise, write and free the tree again. */
5759 write_symbol1_recursion (spi_root);
5760 free_sorted_pointer_info_tree (spi_root);
5762 return 1;
5766 /* Write operator interfaces associated with a symbol. */
5768 static void
5769 write_operator (gfc_user_op *uop)
5771 static char nullstring[] = "";
5772 const char *p = nullstring;
5774 if (uop->op == NULL || !check_access (uop->access, uop->ns->default_access))
5775 return;
5777 mio_symbol_interface (&uop->name, &p, &uop->op);
5781 /* Write generic interfaces from the namespace sym_root. */
5783 static void
5784 write_generic (gfc_symtree *st)
5786 gfc_symbol *sym;
5788 if (st == NULL)
5789 return;
5791 write_generic (st->left);
5793 sym = st->n.sym;
5794 if (sym && !check_unique_name (st->name)
5795 && sym->generic && gfc_check_symbol_access (sym))
5797 if (!sym->module)
5798 sym->module = module_name;
5800 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
5803 write_generic (st->right);
5807 static void
5808 write_symtree (gfc_symtree *st)
5810 gfc_symbol *sym;
5811 pointer_info *p;
5813 sym = st->n.sym;
5815 /* A symbol in an interface body must not be visible in the
5816 module file. */
5817 if (sym->ns != gfc_current_ns
5818 && sym->ns->proc_name
5819 && sym->ns->proc_name->attr.if_source == IFSRC_IFBODY)
5820 return;
5822 if (!gfc_check_symbol_access (sym)
5823 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5824 && !sym->attr.subroutine && !sym->attr.function))
5825 return;
5827 if (check_unique_name (st->name))
5828 return;
5830 p = find_pointer (sym);
5831 if (p == NULL)
5832 gfc_internal_error ("write_symtree(): Symbol not written");
5834 mio_pool_string (&st->name);
5835 mio_integer (&st->ambiguous);
5836 mio_integer (&p->integer);
5840 static void
5841 write_module (void)
5843 int i;
5845 /* Write the operator interfaces. */
5846 mio_lparen ();
5848 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
5850 if (i == INTRINSIC_USER)
5851 continue;
5853 mio_interface (check_access (gfc_current_ns->operator_access[i],
5854 gfc_current_ns->default_access)
5855 ? &gfc_current_ns->op[i] : NULL);
5858 mio_rparen ();
5859 write_char ('\n');
5860 write_char ('\n');
5862 mio_lparen ();
5863 gfc_traverse_user_op (gfc_current_ns, write_operator);
5864 mio_rparen ();
5865 write_char ('\n');
5866 write_char ('\n');
5868 mio_lparen ();
5869 write_generic (gfc_current_ns->sym_root);
5870 mio_rparen ();
5871 write_char ('\n');
5872 write_char ('\n');
5874 mio_lparen ();
5875 write_blank_common ();
5876 write_common (gfc_current_ns->common_root);
5877 mio_rparen ();
5878 write_char ('\n');
5879 write_char ('\n');
5881 mio_lparen ();
5882 write_equiv ();
5883 mio_rparen ();
5884 write_char ('\n');
5885 write_char ('\n');
5887 mio_lparen ();
5888 gfc_traverse_symtree (gfc_current_ns->sym_root,
5889 write_derived_extensions);
5890 mio_rparen ();
5891 write_char ('\n');
5892 write_char ('\n');
5894 mio_lparen ();
5895 write_omp_udrs (gfc_current_ns->omp_udr_root);
5896 mio_rparen ();
5897 write_char ('\n');
5898 write_char ('\n');
5900 /* Write symbol information. First we traverse all symbols in the
5901 primary namespace, writing those that need to be written.
5902 Sometimes writing one symbol will cause another to need to be
5903 written. A list of these symbols ends up on the write stack, and
5904 we end by popping the bottom of the stack and writing the symbol
5905 until the stack is empty. */
5907 mio_lparen ();
5909 write_symbol0 (gfc_current_ns->sym_root);
5910 while (write_symbol1 (pi_root))
5911 /* Nothing. */;
5913 mio_rparen ();
5915 write_char ('\n');
5916 write_char ('\n');
5918 mio_lparen ();
5919 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
5920 mio_rparen ();
5924 /* Read a CRC32 sum from the gzip trailer of a module file. Returns
5925 true on success, false on failure. */
5927 static bool
5928 read_crc32_from_module_file (const char* filename, uLong* crc)
5930 FILE *file;
5931 char buf[4];
5932 unsigned int val;
5934 /* Open the file in binary mode. */
5935 if ((file = fopen (filename, "rb")) == NULL)
5936 return false;
5938 /* The gzip crc32 value is found in the [END-8, END-4] bytes of the
5939 file. See RFC 1952. */
5940 if (fseek (file, -8, SEEK_END) != 0)
5942 fclose (file);
5943 return false;
5946 /* Read the CRC32. */
5947 if (fread (buf, 1, 4, file) != 4)
5949 fclose (file);
5950 return false;
5953 /* Close the file. */
5954 fclose (file);
5956 val = (buf[0] & 0xFF) + ((buf[1] & 0xFF) << 8) + ((buf[2] & 0xFF) << 16)
5957 + ((buf[3] & 0xFF) << 24);
5958 *crc = val;
5960 /* For debugging, the CRC value printed in hexadecimal should match
5961 the CRC printed by "zcat -l -v filename".
5962 printf("CRC of file %s is %x\n", filename, val); */
5964 return true;
5968 /* Given module, dump it to disk. If there was an error while
5969 processing the module, dump_flag will be set to zero and we delete
5970 the module file, even if it was already there. */
5972 void
5973 gfc_dump_module (const char *name, int dump_flag)
5975 int n;
5976 char *filename, *filename_tmp;
5977 uLong crc, crc_old;
5979 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
5980 if (gfc_option.module_dir != NULL)
5982 n += strlen (gfc_option.module_dir);
5983 filename = (char *) alloca (n);
5984 strcpy (filename, gfc_option.module_dir);
5985 strcat (filename, name);
5987 else
5989 filename = (char *) alloca (n);
5990 strcpy (filename, name);
5992 strcat (filename, MODULE_EXTENSION);
5994 /* Name of the temporary file used to write the module. */
5995 filename_tmp = (char *) alloca (n + 1);
5996 strcpy (filename_tmp, filename);
5997 strcat (filename_tmp, "0");
5999 /* There was an error while processing the module. We delete the
6000 module file, even if it was already there. */
6001 if (!dump_flag)
6003 unlink (filename);
6004 return;
6007 if (gfc_cpp_makedep ())
6008 gfc_cpp_add_target (filename);
6010 /* Write the module to the temporary file. */
6011 module_fp = gzopen (filename_tmp, "w");
6012 if (module_fp == NULL)
6013 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
6014 filename_tmp, xstrerror (errno));
6016 gzprintf (module_fp, "GFORTRAN module version '%s' created from %s\n",
6017 MOD_VERSION, gfc_source_file);
6019 /* Write the module itself. */
6020 iomode = IO_OUTPUT;
6021 module_name = gfc_get_string (name);
6023 init_pi_tree ();
6025 write_module ();
6027 free_pi_tree (pi_root);
6028 pi_root = NULL;
6030 write_char ('\n');
6032 if (gzclose (module_fp))
6033 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
6034 filename_tmp, xstrerror (errno));
6036 /* Read the CRC32 from the gzip trailers of the module files and
6037 compare. */
6038 if (!read_crc32_from_module_file (filename_tmp, &crc)
6039 || !read_crc32_from_module_file (filename, &crc_old)
6040 || crc_old != crc)
6042 /* Module file have changed, replace the old one. */
6043 if (rename (filename_tmp, filename))
6044 gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
6045 filename_tmp, filename, xstrerror (errno));
6047 else
6049 if (unlink (filename_tmp))
6050 gfc_fatal_error ("Can't delete temporary module file '%s': %s",
6051 filename_tmp, xstrerror (errno));
6056 static void
6057 create_intrinsic_function (const char *name, int id,
6058 const char *modname, intmod_id module,
6059 bool subroutine, gfc_symbol *result_type)
6061 gfc_intrinsic_sym *isym;
6062 gfc_symtree *tmp_symtree;
6063 gfc_symbol *sym;
6065 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
6066 if (tmp_symtree)
6068 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
6069 return;
6070 gfc_error ("Symbol '%s' already declared", name);
6073 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
6074 sym = tmp_symtree->n.sym;
6076 if (subroutine)
6078 gfc_isym_id isym_id = gfc_isym_id_by_intmod (module, id);
6079 isym = gfc_intrinsic_subroutine_by_id (isym_id);
6080 sym->attr.subroutine = 1;
6082 else
6084 gfc_isym_id isym_id = gfc_isym_id_by_intmod (module, id);
6085 isym = gfc_intrinsic_function_by_id (isym_id);
6087 sym->attr.function = 1;
6088 if (result_type)
6090 sym->ts.type = BT_DERIVED;
6091 sym->ts.u.derived = result_type;
6092 sym->ts.is_c_interop = 1;
6093 isym->ts.f90_type = BT_VOID;
6094 isym->ts.type = BT_DERIVED;
6095 isym->ts.f90_type = BT_VOID;
6096 isym->ts.u.derived = result_type;
6097 isym->ts.is_c_interop = 1;
6100 gcc_assert (isym);
6102 sym->attr.flavor = FL_PROCEDURE;
6103 sym->attr.intrinsic = 1;
6105 sym->module = gfc_get_string (modname);
6106 sym->attr.use_assoc = 1;
6107 sym->from_intmod = module;
6108 sym->intmod_sym_id = id;
6112 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
6113 the current namespace for all named constants, pointer types, and
6114 procedures in the module unless the only clause was used or a rename
6115 list was provided. */
6117 static void
6118 import_iso_c_binding_module (void)
6120 gfc_symbol *mod_sym = NULL, *return_type;
6121 gfc_symtree *mod_symtree = NULL, *tmp_symtree;
6122 gfc_symtree *c_ptr = NULL, *c_funptr = NULL;
6123 const char *iso_c_module_name = "__iso_c_binding";
6124 gfc_use_rename *u;
6125 int i;
6126 bool want_c_ptr = false, want_c_funptr = false;
6128 /* Look only in the current namespace. */
6129 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
6131 if (mod_symtree == NULL)
6133 /* symtree doesn't already exist in current namespace. */
6134 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree,
6135 false);
6137 if (mod_symtree != NULL)
6138 mod_sym = mod_symtree->n.sym;
6139 else
6140 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
6141 "create symbol for %s", iso_c_module_name);
6143 mod_sym->attr.flavor = FL_MODULE;
6144 mod_sym->attr.intrinsic = 1;
6145 mod_sym->module = gfc_get_string (iso_c_module_name);
6146 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
6149 /* Check whether C_PTR or C_FUNPTR are in the include list, if so, load it;
6150 check also whether C_NULL_(FUN)PTR or C_(FUN)LOC are requested, which
6151 need C_(FUN)PTR. */
6152 for (u = gfc_rename_list; u; u = u->next)
6154 if (strcmp (c_interop_kinds_table[ISOCBINDING_NULL_PTR].name,
6155 u->use_name) == 0)
6156 want_c_ptr = true;
6157 else if (strcmp (c_interop_kinds_table[ISOCBINDING_LOC].name,
6158 u->use_name) == 0)
6159 want_c_ptr = true;
6160 else if (strcmp (c_interop_kinds_table[ISOCBINDING_NULL_FUNPTR].name,
6161 u->use_name) == 0)
6162 want_c_funptr = true;
6163 else if (strcmp (c_interop_kinds_table[ISOCBINDING_FUNLOC].name,
6164 u->use_name) == 0)
6165 want_c_funptr = true;
6166 else if (strcmp (c_interop_kinds_table[ISOCBINDING_PTR].name,
6167 u->use_name) == 0)
6169 c_ptr = generate_isocbinding_symbol (iso_c_module_name,
6170 (iso_c_binding_symbol)
6171 ISOCBINDING_PTR,
6172 u->local_name[0] ? u->local_name
6173 : u->use_name,
6174 NULL, false);
6176 else if (strcmp (c_interop_kinds_table[ISOCBINDING_FUNPTR].name,
6177 u->use_name) == 0)
6179 c_funptr
6180 = generate_isocbinding_symbol (iso_c_module_name,
6181 (iso_c_binding_symbol)
6182 ISOCBINDING_FUNPTR,
6183 u->local_name[0] ? u->local_name
6184 : u->use_name,
6185 NULL, false);
6189 if ((want_c_ptr || !only_flag) && !c_ptr)
6190 c_ptr = generate_isocbinding_symbol (iso_c_module_name,
6191 (iso_c_binding_symbol)
6192 ISOCBINDING_PTR,
6193 NULL, NULL, only_flag);
6194 if ((want_c_funptr || !only_flag) && !c_funptr)
6195 c_funptr = generate_isocbinding_symbol (iso_c_module_name,
6196 (iso_c_binding_symbol)
6197 ISOCBINDING_FUNPTR,
6198 NULL, NULL, only_flag);
6200 /* Generate the symbols for the named constants representing
6201 the kinds for intrinsic data types. */
6202 for (i = 0; i < ISOCBINDING_NUMBER; i++)
6204 bool found = false;
6205 for (u = gfc_rename_list; u; u = u->next)
6206 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
6208 bool not_in_std;
6209 const char *name;
6210 u->found = 1;
6211 found = true;
6213 switch (i)
6215 #define NAMED_FUNCTION(a,b,c,d) \
6216 case a: \
6217 not_in_std = (gfc_option.allow_std & d) == 0; \
6218 name = b; \
6219 break;
6220 #define NAMED_SUBROUTINE(a,b,c,d) \
6221 case a: \
6222 not_in_std = (gfc_option.allow_std & d) == 0; \
6223 name = b; \
6224 break;
6225 #define NAMED_INTCST(a,b,c,d) \
6226 case a: \
6227 not_in_std = (gfc_option.allow_std & d) == 0; \
6228 name = b; \
6229 break;
6230 #define NAMED_REALCST(a,b,c,d) \
6231 case a: \
6232 not_in_std = (gfc_option.allow_std & d) == 0; \
6233 name = b; \
6234 break;
6235 #define NAMED_CMPXCST(a,b,c,d) \
6236 case a: \
6237 not_in_std = (gfc_option.allow_std & d) == 0; \
6238 name = b; \
6239 break;
6240 #include "iso-c-binding.def"
6241 default:
6242 not_in_std = false;
6243 name = "";
6246 if (not_in_std)
6248 gfc_error ("The symbol '%s', referenced at %L, is not "
6249 "in the selected standard", name, &u->where);
6250 continue;
6253 switch (i)
6255 #define NAMED_FUNCTION(a,b,c,d) \
6256 case a: \
6257 if (a == ISOCBINDING_LOC) \
6258 return_type = c_ptr->n.sym; \
6259 else if (a == ISOCBINDING_FUNLOC) \
6260 return_type = c_funptr->n.sym; \
6261 else \
6262 return_type = NULL; \
6263 create_intrinsic_function (u->local_name[0] \
6264 ? u->local_name : u->use_name, \
6265 a, iso_c_module_name, \
6266 INTMOD_ISO_C_BINDING, false, \
6267 return_type); \
6268 break;
6269 #define NAMED_SUBROUTINE(a,b,c,d) \
6270 case a: \
6271 create_intrinsic_function (u->local_name[0] ? u->local_name \
6272 : u->use_name, \
6273 a, iso_c_module_name, \
6274 INTMOD_ISO_C_BINDING, true, NULL); \
6275 break;
6276 #include "iso-c-binding.def"
6278 case ISOCBINDING_PTR:
6279 case ISOCBINDING_FUNPTR:
6280 /* Already handled above. */
6281 break;
6282 default:
6283 if (i == ISOCBINDING_NULL_PTR)
6284 tmp_symtree = c_ptr;
6285 else if (i == ISOCBINDING_NULL_FUNPTR)
6286 tmp_symtree = c_funptr;
6287 else
6288 tmp_symtree = NULL;
6289 generate_isocbinding_symbol (iso_c_module_name,
6290 (iso_c_binding_symbol) i,
6291 u->local_name[0]
6292 ? u->local_name : u->use_name,
6293 tmp_symtree, false);
6297 if (!found && !only_flag)
6299 /* Skip, if the symbol is not in the enabled standard. */
6300 switch (i)
6302 #define NAMED_FUNCTION(a,b,c,d) \
6303 case a: \
6304 if ((gfc_option.allow_std & d) == 0) \
6305 continue; \
6306 break;
6307 #define NAMED_SUBROUTINE(a,b,c,d) \
6308 case a: \
6309 if ((gfc_option.allow_std & d) == 0) \
6310 continue; \
6311 break;
6312 #define NAMED_INTCST(a,b,c,d) \
6313 case a: \
6314 if ((gfc_option.allow_std & d) == 0) \
6315 continue; \
6316 break;
6317 #define NAMED_REALCST(a,b,c,d) \
6318 case a: \
6319 if ((gfc_option.allow_std & d) == 0) \
6320 continue; \
6321 break;
6322 #define NAMED_CMPXCST(a,b,c,d) \
6323 case a: \
6324 if ((gfc_option.allow_std & d) == 0) \
6325 continue; \
6326 break;
6327 #include "iso-c-binding.def"
6328 default:
6329 ; /* Not GFC_STD_* versioned. */
6332 switch (i)
6334 #define NAMED_FUNCTION(a,b,c,d) \
6335 case a: \
6336 if (a == ISOCBINDING_LOC) \
6337 return_type = c_ptr->n.sym; \
6338 else if (a == ISOCBINDING_FUNLOC) \
6339 return_type = c_funptr->n.sym; \
6340 else \
6341 return_type = NULL; \
6342 create_intrinsic_function (b, a, iso_c_module_name, \
6343 INTMOD_ISO_C_BINDING, false, \
6344 return_type); \
6345 break;
6346 #define NAMED_SUBROUTINE(a,b,c,d) \
6347 case a: \
6348 create_intrinsic_function (b, a, iso_c_module_name, \
6349 INTMOD_ISO_C_BINDING, true, NULL); \
6350 break;
6351 #include "iso-c-binding.def"
6353 case ISOCBINDING_PTR:
6354 case ISOCBINDING_FUNPTR:
6355 /* Already handled above. */
6356 break;
6357 default:
6358 if (i == ISOCBINDING_NULL_PTR)
6359 tmp_symtree = c_ptr;
6360 else if (i == ISOCBINDING_NULL_FUNPTR)
6361 tmp_symtree = c_funptr;
6362 else
6363 tmp_symtree = NULL;
6364 generate_isocbinding_symbol (iso_c_module_name,
6365 (iso_c_binding_symbol) i, NULL,
6366 tmp_symtree, false);
6371 for (u = gfc_rename_list; u; u = u->next)
6373 if (u->found)
6374 continue;
6376 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6377 "module ISO_C_BINDING", u->use_name, &u->where);
6382 /* Add an integer named constant from a given module. */
6384 static void
6385 create_int_parameter (const char *name, int value, const char *modname,
6386 intmod_id module, int id)
6388 gfc_symtree *tmp_symtree;
6389 gfc_symbol *sym;
6391 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
6392 if (tmp_symtree != NULL)
6394 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
6395 return;
6396 else
6397 gfc_error ("Symbol '%s' already declared", name);
6400 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
6401 sym = tmp_symtree->n.sym;
6403 sym->module = gfc_get_string (modname);
6404 sym->attr.flavor = FL_PARAMETER;
6405 sym->ts.type = BT_INTEGER;
6406 sym->ts.kind = gfc_default_integer_kind;
6407 sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL, value);
6408 sym->attr.use_assoc = 1;
6409 sym->from_intmod = module;
6410 sym->intmod_sym_id = id;
6414 /* Value is already contained by the array constructor, but not
6415 yet the shape. */
6417 static void
6418 create_int_parameter_array (const char *name, int size, gfc_expr *value,
6419 const char *modname, intmod_id module, int id)
6421 gfc_symtree *tmp_symtree;
6422 gfc_symbol *sym;
6424 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
6425 if (tmp_symtree != NULL)
6427 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
6428 return;
6429 else
6430 gfc_error ("Symbol '%s' already declared", name);
6433 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
6434 sym = tmp_symtree->n.sym;
6436 sym->module = gfc_get_string (modname);
6437 sym->attr.flavor = FL_PARAMETER;
6438 sym->ts.type = BT_INTEGER;
6439 sym->ts.kind = gfc_default_integer_kind;
6440 sym->attr.use_assoc = 1;
6441 sym->from_intmod = module;
6442 sym->intmod_sym_id = id;
6443 sym->attr.dimension = 1;
6444 sym->as = gfc_get_array_spec ();
6445 sym->as->rank = 1;
6446 sym->as->type = AS_EXPLICIT;
6447 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
6448 sym->as->upper[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, size);
6450 sym->value = value;
6451 sym->value->shape = gfc_get_shape (1);
6452 mpz_init_set_ui (sym->value->shape[0], size);
6456 /* Add an derived type for a given module. */
6458 static void
6459 create_derived_type (const char *name, const char *modname,
6460 intmod_id module, int id)
6462 gfc_symtree *tmp_symtree;
6463 gfc_symbol *sym, *dt_sym;
6464 gfc_interface *intr, *head;
6466 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
6467 if (tmp_symtree != NULL)
6469 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
6470 return;
6471 else
6472 gfc_error ("Symbol '%s' already declared", name);
6475 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
6476 sym = tmp_symtree->n.sym;
6477 sym->module = gfc_get_string (modname);
6478 sym->from_intmod = module;
6479 sym->intmod_sym_id = id;
6480 sym->attr.flavor = FL_PROCEDURE;
6481 sym->attr.function = 1;
6482 sym->attr.generic = 1;
6484 gfc_get_sym_tree (dt_upper_string (sym->name),
6485 gfc_current_ns, &tmp_symtree, false);
6486 dt_sym = tmp_symtree->n.sym;
6487 dt_sym->name = gfc_get_string (sym->name);
6488 dt_sym->attr.flavor = FL_DERIVED;
6489 dt_sym->attr.private_comp = 1;
6490 dt_sym->attr.zero_comp = 1;
6491 dt_sym->attr.use_assoc = 1;
6492 dt_sym->module = gfc_get_string (modname);
6493 dt_sym->from_intmod = module;
6494 dt_sym->intmod_sym_id = id;
6496 head = sym->generic;
6497 intr = gfc_get_interface ();
6498 intr->sym = dt_sym;
6499 intr->where = gfc_current_locus;
6500 intr->next = head;
6501 sym->generic = intr;
6502 sym->attr.if_source = IFSRC_DECL;
6506 /* Read the contents of the module file into a temporary buffer. */
6508 static void
6509 read_module_to_tmpbuf ()
6511 /* We don't know the uncompressed size, so enlarge the buffer as
6512 needed. */
6513 int cursz = 4096;
6514 int rsize = cursz;
6515 int len = 0;
6517 module_content = XNEWVEC (char, cursz);
6519 while (1)
6521 int nread = gzread (module_fp, module_content + len, rsize);
6522 len += nread;
6523 if (nread < rsize)
6524 break;
6525 cursz *= 2;
6526 module_content = XRESIZEVEC (char, module_content, cursz);
6527 rsize = cursz - len;
6530 module_content = XRESIZEVEC (char, module_content, len + 1);
6531 module_content[len] = '\0';
6533 module_pos = 0;
6537 /* USE the ISO_FORTRAN_ENV intrinsic module. */
6539 static void
6540 use_iso_fortran_env_module (void)
6542 static char mod[] = "iso_fortran_env";
6543 gfc_use_rename *u;
6544 gfc_symbol *mod_sym;
6545 gfc_symtree *mod_symtree;
6546 gfc_expr *expr;
6547 int i, j;
6549 intmod_sym symbol[] = {
6550 #define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
6551 #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d },
6552 #define NAMED_DERIVED_TYPE(a,b,c,d) { a, b, 0, d },
6553 #define NAMED_FUNCTION(a,b,c,d) { a, b, c, d },
6554 #define NAMED_SUBROUTINE(a,b,c,d) { a, b, c, d },
6555 #include "iso-fortran-env.def"
6556 { ISOFORTRANENV_INVALID, NULL, -1234, 0 } };
6558 i = 0;
6559 #define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
6560 #include "iso-fortran-env.def"
6562 /* Generate the symbol for the module itself. */
6563 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
6564 if (mod_symtree == NULL)
6566 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree, false);
6567 gcc_assert (mod_symtree);
6568 mod_sym = mod_symtree->n.sym;
6570 mod_sym->attr.flavor = FL_MODULE;
6571 mod_sym->attr.intrinsic = 1;
6572 mod_sym->module = gfc_get_string (mod);
6573 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
6575 else
6576 if (!mod_symtree->n.sym->attr.intrinsic)
6577 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
6578 "non-intrinsic module name used previously", mod);
6580 /* Generate the symbols for the module integer named constants. */
6582 for (i = 0; symbol[i].name; i++)
6584 bool found = false;
6585 for (u = gfc_rename_list; u; u = u->next)
6587 if (strcmp (symbol[i].name, u->use_name) == 0)
6589 found = true;
6590 u->found = 1;
6592 if (!gfc_notify_std (symbol[i].standard, "The symbol '%s', "
6593 "referenced at %L, is not in the selected "
6594 "standard", symbol[i].name, &u->where))
6595 continue;
6597 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
6598 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
6599 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
6600 "constant from intrinsic module "
6601 "ISO_FORTRAN_ENV at %L is incompatible with "
6602 "option %s", &u->where,
6603 gfc_option.flag_default_integer
6604 ? "-fdefault-integer-8"
6605 : "-fdefault-real-8");
6606 switch (symbol[i].id)
6608 #define NAMED_INTCST(a,b,c,d) \
6609 case a:
6610 #include "iso-fortran-env.def"
6611 create_int_parameter (u->local_name[0] ? u->local_name
6612 : u->use_name,
6613 symbol[i].value, mod,
6614 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
6615 break;
6617 #define NAMED_KINDARRAY(a,b,KINDS,d) \
6618 case a:\
6619 expr = gfc_get_array_expr (BT_INTEGER, \
6620 gfc_default_integer_kind,\
6621 NULL); \
6622 for (j = 0; KINDS[j].kind != 0; j++) \
6623 gfc_constructor_append_expr (&expr->value.constructor, \
6624 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
6625 KINDS[j].kind), NULL); \
6626 create_int_parameter_array (u->local_name[0] ? u->local_name \
6627 : u->use_name, \
6628 j, expr, mod, \
6629 INTMOD_ISO_FORTRAN_ENV, \
6630 symbol[i].id); \
6631 break;
6632 #include "iso-fortran-env.def"
6634 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
6635 case a:
6636 #include "iso-fortran-env.def"
6637 create_derived_type (u->local_name[0] ? u->local_name
6638 : u->use_name,
6639 mod, INTMOD_ISO_FORTRAN_ENV,
6640 symbol[i].id);
6641 break;
6643 #define NAMED_FUNCTION(a,b,c,d) \
6644 case a:
6645 #include "iso-fortran-env.def"
6646 create_intrinsic_function (u->local_name[0] ? u->local_name
6647 : u->use_name,
6648 symbol[i].id, mod,
6649 INTMOD_ISO_FORTRAN_ENV, false,
6650 NULL);
6651 break;
6653 default:
6654 gcc_unreachable ();
6659 if (!found && !only_flag)
6661 if ((gfc_option.allow_std & symbol[i].standard) == 0)
6662 continue;
6664 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
6665 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
6666 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
6667 "from intrinsic module ISO_FORTRAN_ENV at %C is "
6668 "incompatible with option %s",
6669 gfc_option.flag_default_integer
6670 ? "-fdefault-integer-8" : "-fdefault-real-8");
6672 switch (symbol[i].id)
6674 #define NAMED_INTCST(a,b,c,d) \
6675 case a:
6676 #include "iso-fortran-env.def"
6677 create_int_parameter (symbol[i].name, symbol[i].value, mod,
6678 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
6679 break;
6681 #define NAMED_KINDARRAY(a,b,KINDS,d) \
6682 case a:\
6683 expr = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, \
6684 NULL); \
6685 for (j = 0; KINDS[j].kind != 0; j++) \
6686 gfc_constructor_append_expr (&expr->value.constructor, \
6687 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
6688 KINDS[j].kind), NULL); \
6689 create_int_parameter_array (symbol[i].name, j, expr, mod, \
6690 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);\
6691 break;
6692 #include "iso-fortran-env.def"
6694 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
6695 case a:
6696 #include "iso-fortran-env.def"
6697 create_derived_type (symbol[i].name, mod, INTMOD_ISO_FORTRAN_ENV,
6698 symbol[i].id);
6699 break;
6701 #define NAMED_FUNCTION(a,b,c,d) \
6702 case a:
6703 #include "iso-fortran-env.def"
6704 create_intrinsic_function (symbol[i].name, symbol[i].id, mod,
6705 INTMOD_ISO_FORTRAN_ENV, false,
6706 NULL);
6707 break;
6709 default:
6710 gcc_unreachable ();
6715 for (u = gfc_rename_list; u; u = u->next)
6717 if (u->found)
6718 continue;
6720 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6721 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
6726 /* Process a USE directive. */
6728 static void
6729 gfc_use_module (gfc_use_list *module)
6731 char *filename;
6732 gfc_state_data *p;
6733 int c, line, start;
6734 gfc_symtree *mod_symtree;
6735 gfc_use_list *use_stmt;
6736 locus old_locus = gfc_current_locus;
6738 gfc_current_locus = module->where;
6739 module_name = module->module_name;
6740 gfc_rename_list = module->rename;
6741 only_flag = module->only_flag;
6742 current_intmod = INTMOD_NONE;
6744 filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
6745 + 1);
6746 strcpy (filename, module_name);
6747 strcat (filename, MODULE_EXTENSION);
6749 /* First, try to find an non-intrinsic module, unless the USE statement
6750 specified that the module is intrinsic. */
6751 module_fp = NULL;
6752 if (!module->intrinsic)
6753 module_fp = gzopen_included_file (filename, true, true);
6755 /* Then, see if it's an intrinsic one, unless the USE statement
6756 specified that the module is non-intrinsic. */
6757 if (module_fp == NULL && !module->non_intrinsic)
6759 if (strcmp (module_name, "iso_fortran_env") == 0
6760 && gfc_notify_std (GFC_STD_F2003, "ISO_FORTRAN_ENV "
6761 "intrinsic module at %C"))
6763 use_iso_fortran_env_module ();
6764 free_rename (module->rename);
6765 module->rename = NULL;
6766 gfc_current_locus = old_locus;
6767 module->intrinsic = true;
6768 return;
6771 if (strcmp (module_name, "iso_c_binding") == 0
6772 && gfc_notify_std (GFC_STD_F2003, "ISO_C_BINDING module at %C"))
6774 import_iso_c_binding_module();
6775 free_rename (module->rename);
6776 module->rename = NULL;
6777 gfc_current_locus = old_locus;
6778 module->intrinsic = true;
6779 return;
6782 module_fp = gzopen_intrinsic_module (filename);
6784 if (module_fp == NULL && module->intrinsic)
6785 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
6786 module_name);
6788 /* Check for the IEEE modules, so we can mark their symbols
6789 accordingly when we read them. */
6790 if (strcmp (module_name, "ieee_features") == 0
6791 && gfc_notify_std (GFC_STD_F2003, "IEEE_FEATURES module at %C"))
6793 current_intmod = INTMOD_IEEE_FEATURES;
6795 else if (strcmp (module_name, "ieee_exceptions") == 0
6796 && gfc_notify_std (GFC_STD_F2003,
6797 "IEEE_EXCEPTIONS module at %C"))
6799 current_intmod = INTMOD_IEEE_EXCEPTIONS;
6801 else if (strcmp (module_name, "ieee_arithmetic") == 0
6802 && gfc_notify_std (GFC_STD_F2003,
6803 "IEEE_ARITHMETIC module at %C"))
6805 current_intmod = INTMOD_IEEE_ARITHMETIC;
6809 if (module_fp == NULL)
6810 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6811 filename, xstrerror (errno));
6813 /* Check that we haven't already USEd an intrinsic module with the
6814 same name. */
6816 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
6817 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
6818 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
6819 "intrinsic module name used previously", module_name);
6821 iomode = IO_INPUT;
6822 module_line = 1;
6823 module_column = 1;
6824 start = 0;
6826 read_module_to_tmpbuf ();
6827 gzclose (module_fp);
6829 /* Skip the first line of the module, after checking that this is
6830 a gfortran module file. */
6831 line = 0;
6832 while (line < 1)
6834 c = module_char ();
6835 if (c == EOF)
6836 bad_module ("Unexpected end of module");
6837 if (start++ < 3)
6838 parse_name (c);
6839 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
6840 || (start == 2 && strcmp (atom_name, " module") != 0))
6841 gfc_fatal_error ("File '%s' opened at %C is not a GNU Fortran"
6842 " module file", filename);
6843 if (start == 3)
6845 if (strcmp (atom_name, " version") != 0
6846 || module_char () != ' '
6847 || parse_atom () != ATOM_STRING
6848 || strcmp (atom_string, MOD_VERSION))
6849 gfc_fatal_error ("Cannot read module file '%s' opened at %C,"
6850 " because it was created by a different"
6851 " version of GNU Fortran", filename);
6853 free (atom_string);
6856 if (c == '\n')
6857 line++;
6860 /* Make sure we're not reading the same module that we may be building. */
6861 for (p = gfc_state_stack; p; p = p->previous)
6862 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
6863 gfc_fatal_error ("Can't USE the same module we're building!");
6865 init_pi_tree ();
6866 init_true_name_tree ();
6868 read_module ();
6870 free_true_name (true_name_root);
6871 true_name_root = NULL;
6873 free_pi_tree (pi_root);
6874 pi_root = NULL;
6876 XDELETEVEC (module_content);
6877 module_content = NULL;
6879 use_stmt = gfc_get_use_list ();
6880 *use_stmt = *module;
6881 use_stmt->next = gfc_current_ns->use_stmts;
6882 gfc_current_ns->use_stmts = use_stmt;
6884 gfc_current_locus = old_locus;
6888 /* Remove duplicated intrinsic operators from the rename list. */
6890 static void
6891 rename_list_remove_duplicate (gfc_use_rename *list)
6893 gfc_use_rename *seek, *last;
6895 for (; list; list = list->next)
6896 if (list->op != INTRINSIC_USER && list->op != INTRINSIC_NONE)
6898 last = list;
6899 for (seek = list->next; seek; seek = last->next)
6901 if (list->op == seek->op)
6903 last->next = seek->next;
6904 free (seek);
6906 else
6907 last = seek;
6913 /* Process all USE directives. */
6915 void
6916 gfc_use_modules (void)
6918 gfc_use_list *next, *seek, *last;
6920 for (next = module_list; next; next = next->next)
6922 bool non_intrinsic = next->non_intrinsic;
6923 bool intrinsic = next->intrinsic;
6924 bool neither = !non_intrinsic && !intrinsic;
6926 for (seek = next->next; seek; seek = seek->next)
6928 if (next->module_name != seek->module_name)
6929 continue;
6931 if (seek->non_intrinsic)
6932 non_intrinsic = true;
6933 else if (seek->intrinsic)
6934 intrinsic = true;
6935 else
6936 neither = true;
6939 if (intrinsic && neither && !non_intrinsic)
6941 char *filename;
6942 FILE *fp;
6944 filename = XALLOCAVEC (char,
6945 strlen (next->module_name)
6946 + strlen (MODULE_EXTENSION) + 1);
6947 strcpy (filename, next->module_name);
6948 strcat (filename, MODULE_EXTENSION);
6949 fp = gfc_open_included_file (filename, true, true);
6950 if (fp != NULL)
6952 non_intrinsic = true;
6953 fclose (fp);
6957 last = next;
6958 for (seek = next->next; seek; seek = last->next)
6960 if (next->module_name != seek->module_name)
6962 last = seek;
6963 continue;
6966 if ((!next->intrinsic && !seek->intrinsic)
6967 || (next->intrinsic && seek->intrinsic)
6968 || !non_intrinsic)
6970 if (!seek->only_flag)
6971 next->only_flag = false;
6972 if (seek->rename)
6974 gfc_use_rename *r = seek->rename;
6975 while (r->next)
6976 r = r->next;
6977 r->next = next->rename;
6978 next->rename = seek->rename;
6980 last->next = seek->next;
6981 free (seek);
6983 else
6984 last = seek;
6988 for (; module_list; module_list = next)
6990 next = module_list->next;
6991 rename_list_remove_duplicate (module_list->rename);
6992 gfc_use_module (module_list);
6993 free (module_list);
6995 gfc_rename_list = NULL;
6999 void
7000 gfc_free_use_stmts (gfc_use_list *use_stmts)
7002 gfc_use_list *next;
7003 for (; use_stmts; use_stmts = next)
7005 gfc_use_rename *next_rename;
7007 for (; use_stmts->rename; use_stmts->rename = next_rename)
7009 next_rename = use_stmts->rename->next;
7010 free (use_stmts->rename);
7012 next = use_stmts->next;
7013 free (use_stmts);
7018 void
7019 gfc_module_init_2 (void)
7021 last_atom = ATOM_LPAREN;
7022 gfc_rename_list = NULL;
7023 module_list = NULL;
7027 void
7028 gfc_module_done_2 (void)
7030 free_rename (gfc_rename_list);
7031 gfc_rename_list = NULL;