1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
5 Free Software Foundation, Inc.
6 Contributed by Andy Vaught
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
24 /* The syntax of gfortran modules resembles that of lisp lists, i.e. a
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
47 ( ( <common name> <symbol> <saved flag>)
53 ( <Symbol Number (in no particular order)>
55 <Module name of symbol>
56 ( <symbol information> )
65 In general, symbols refer to other symbols by their symbol number,
66 which are zero based. Symbols are written to the module in no
74 #include "parse.h" /* FIXME */
76 #include "constructor.h"
80 #define MODULE_EXTENSION ".mod"
82 /* Don't put any single quote (') in MOD_VERSION,
83 if yout want it to be recognized. */
84 #define MOD_VERSION "9"
87 /* Structure that describes a position within a module file. */
96 /* Structure for list of symbols of intrinsic modules. */
109 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
113 /* The fixup structure lists pointers to pointers that have to
114 be updated when a pointer value becomes known. */
116 typedef struct fixup_t
119 struct fixup_t *next;
124 /* Structure for holding extra info needed for pointers being read. */
140 typedef struct pointer_info
142 BBT_HEADER (pointer_info);
146 /* The first component of each member of the union is the pointer
153 void *pointer; /* Member for doing pointer searches. */
158 char *true_name, *module, *binding_label;
160 gfc_symtree *symtree;
161 enum gfc_rsym_state state;
162 int ns, referenced, renamed;
170 enum gfc_wsym_state state;
179 #define gfc_get_pointer_info() XCNEW (pointer_info)
182 /* Local variables */
184 /* The FILE for the module we're reading or writing. */
185 static FILE *module_fp;
187 /* MD5 context structure. */
188 static struct md5_ctx ctx;
190 /* The name of the module we're reading (USE'ing) or writing. */
191 static const char *module_name;
192 static gfc_use_list *module_list;
194 static int module_line, module_column, only_flag;
195 static int prev_module_line, prev_module_column, prev_character;
198 { IO_INPUT, IO_OUTPUT }
201 static gfc_use_rename *gfc_rename_list;
202 static pointer_info *pi_root;
203 static int symbol_number; /* Counter for assigning symbol numbers */
205 /* Tells mio_expr_ref to make symbols for unused equivalence members. */
206 static bool in_load_equiv;
210 /*****************************************************************/
212 /* Pointer/integer conversion. Pointers between structures are stored
213 as integers in the module file. The next couple of subroutines
214 handle this translation for reading and writing. */
216 /* Recursively free the tree of pointer structures. */
219 free_pi_tree (pointer_info *p)
224 if (p->fixup != NULL)
225 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
227 free_pi_tree (p->left);
228 free_pi_tree (p->right);
230 if (iomode == IO_INPUT)
232 XDELETEVEC (p->u.rsym.true_name);
233 XDELETEVEC (p->u.rsym.module);
234 XDELETEVEC (p->u.rsym.binding_label);
241 /* Compare pointers when searching by pointer. Used when writing a
245 compare_pointers (void *_sn1, void *_sn2)
247 pointer_info *sn1, *sn2;
249 sn1 = (pointer_info *) _sn1;
250 sn2 = (pointer_info *) _sn2;
252 if (sn1->u.pointer < sn2->u.pointer)
254 if (sn1->u.pointer > sn2->u.pointer)
261 /* Compare integers when searching by integer. Used when reading a
265 compare_integers (void *_sn1, void *_sn2)
267 pointer_info *sn1, *sn2;
269 sn1 = (pointer_info *) _sn1;
270 sn2 = (pointer_info *) _sn2;
272 if (sn1->integer < sn2->integer)
274 if (sn1->integer > sn2->integer)
281 /* Initialize the pointer_info tree. */
290 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
292 /* Pointer 0 is the NULL pointer. */
293 p = gfc_get_pointer_info ();
298 gfc_insert_bbt (&pi_root, p, compare);
300 /* Pointer 1 is the current namespace. */
301 p = gfc_get_pointer_info ();
302 p->u.pointer = gfc_current_ns;
304 p->type = P_NAMESPACE;
306 gfc_insert_bbt (&pi_root, p, compare);
312 /* During module writing, call here with a pointer to something,
313 returning the pointer_info node. */
315 static pointer_info *
316 find_pointer (void *gp)
323 if (p->u.pointer == gp)
325 p = (gp < p->u.pointer) ? p->left : p->right;
332 /* Given a pointer while writing, returns the pointer_info tree node,
333 creating it if it doesn't exist. */
335 static pointer_info *
336 get_pointer (void *gp)
340 p = find_pointer (gp);
344 /* Pointer doesn't have an integer. Give it one. */
345 p = gfc_get_pointer_info ();
348 p->integer = symbol_number++;
350 gfc_insert_bbt (&pi_root, p, compare_pointers);
356 /* Given an integer during reading, find it in the pointer_info tree,
357 creating the node if not found. */
359 static pointer_info *
360 get_integer (int integer)
370 c = compare_integers (&t, p);
374 p = (c < 0) ? p->left : p->right;
380 p = gfc_get_pointer_info ();
381 p->integer = integer;
384 gfc_insert_bbt (&pi_root, p, compare_integers);
390 /* Recursive function to find a pointer within a tree by brute force. */
392 static pointer_info *
393 fp2 (pointer_info *p, const void *target)
400 if (p->u.pointer == target)
403 q = fp2 (p->left, target);
407 return fp2 (p->right, target);
411 /* During reading, find a pointer_info node from the pointer value.
412 This amounts to a brute-force search. */
414 static pointer_info *
415 find_pointer2 (void *p)
417 return fp2 (pi_root, p);
421 /* Resolve any fixups using a known pointer. */
424 resolve_fixups (fixup_t *f, void *gp)
437 /* Convert a string such that it starts with a lower-case character. Used
438 to convert the symtree name of a derived-type to the symbol name or to
439 the name of the associated generic function. */
442 dt_lower_string (const char *name)
444 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
445 return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name[0]),
447 return gfc_get_string (name);
451 /* Convert a string such that it starts with an upper-case character. Used to
452 return the symtree-name for a derived type; the symbol name itself and the
453 symtree/symbol name of the associated generic function start with a lower-
457 dt_upper_string (const char *name)
459 if (name[0] != (char) TOUPPER ((unsigned char) name[0]))
460 return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name[0]),
462 return gfc_get_string (name);
465 /* Call here during module reading when we know what pointer to
466 associate with an integer. Any fixups that exist are resolved at
470 associate_integer_pointer (pointer_info *p, void *gp)
472 if (p->u.pointer != NULL)
473 gfc_internal_error ("associate_integer_pointer(): Already associated");
477 resolve_fixups (p->fixup, gp);
483 /* During module reading, given an integer and a pointer to a pointer,
484 either store the pointer from an already-known value or create a
485 fixup structure in order to store things later. Returns zero if
486 the reference has been actually stored, or nonzero if the reference
487 must be fixed later (i.e., associate_integer_pointer must be called
488 sometime later. Returns the pointer_info structure. */
490 static pointer_info *
491 add_fixup (int integer, void *gp)
497 p = get_integer (integer);
499 if (p->integer == 0 || p->u.pointer != NULL)
502 *cp = (char *) p->u.pointer;
511 f->pointer = (void **) gp;
518 /*****************************************************************/
520 /* Parser related subroutines */
522 /* Free the rename list left behind by a USE statement. */
525 free_rename (gfc_use_rename *list)
527 gfc_use_rename *next;
529 for (; list; list = next)
537 /* Match a USE statement. */
542 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
543 gfc_use_rename *tail = NULL, *new_use;
544 interface_type type, type2;
547 gfc_use_list *use_list;
549 use_list = gfc_get_use_list ();
551 if (gfc_match (" , ") == MATCH_YES)
553 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
555 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
556 "nature in USE statement at %C") == FAILURE)
559 if (strcmp (module_nature, "intrinsic") == 0)
560 use_list->intrinsic = true;
563 if (strcmp (module_nature, "non_intrinsic") == 0)
564 use_list->non_intrinsic = true;
567 gfc_error ("Module nature in USE statement at %C shall "
568 "be either INTRINSIC or NON_INTRINSIC");
575 /* Help output a better error message than "Unclassifiable
577 gfc_match (" %n", module_nature);
578 if (strcmp (module_nature, "intrinsic") == 0
579 || strcmp (module_nature, "non_intrinsic") == 0)
580 gfc_error ("\"::\" was expected after module nature at %C "
581 "but was not found");
588 m = gfc_match (" ::");
589 if (m == MATCH_YES &&
590 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
591 "\"USE :: module\" at %C") == FAILURE)
596 m = gfc_match ("% ");
605 use_list->where = gfc_current_locus;
607 m = gfc_match_name (name);
614 use_list->module_name = gfc_get_string (name);
616 if (gfc_match_eos () == MATCH_YES)
619 if (gfc_match_char (',') != MATCH_YES)
622 if (gfc_match (" only :") == MATCH_YES)
623 use_list->only_flag = true;
625 if (gfc_match_eos () == MATCH_YES)
630 /* Get a new rename struct and add it to the rename list. */
631 new_use = gfc_get_use_rename ();
632 new_use->where = gfc_current_locus;
635 if (use_list->rename == NULL)
636 use_list->rename = new_use;
638 tail->next = new_use;
641 /* See what kind of interface we're dealing with. Assume it is
643 new_use->op = INTRINSIC_NONE;
644 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
649 case INTERFACE_NAMELESS:
650 gfc_error ("Missing generic specification in USE statement at %C");
653 case INTERFACE_USER_OP:
654 case INTERFACE_GENERIC:
655 m = gfc_match (" =>");
657 if (type == INTERFACE_USER_OP && m == MATCH_YES
658 && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
659 "operators in USE statements at %C")
663 if (type == INTERFACE_USER_OP)
664 new_use->op = INTRINSIC_USER;
666 if (use_list->only_flag)
669 strcpy (new_use->use_name, name);
672 strcpy (new_use->local_name, name);
673 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
678 if (m == MATCH_ERROR)
686 strcpy (new_use->local_name, name);
688 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
693 if (m == MATCH_ERROR)
697 if (strcmp (new_use->use_name, use_list->module_name) == 0
698 || strcmp (new_use->local_name, use_list->module_name) == 0)
700 gfc_error ("The name '%s' at %C has already been used as "
701 "an external module name.", use_list->module_name);
706 case INTERFACE_INTRINSIC_OP:
714 if (gfc_match_eos () == MATCH_YES)
716 if (gfc_match_char (',') != MATCH_YES)
723 gfc_use_list *last = module_list;
726 last->next = use_list;
729 module_list = use_list;
734 gfc_syntax_error (ST_USE);
737 free_rename (use_list->rename);
743 /* Given a name and a number, inst, return the inst name
744 under which to load this symbol. Returns NULL if this
745 symbol shouldn't be loaded. If inst is zero, returns
746 the number of instances of this name. If interface is
747 true, a user-defined operator is sought, otherwise only
748 non-operators are sought. */
751 find_use_name_n (const char *name, int *inst, bool interface)
754 const char *low_name = NULL;
757 /* For derived types. */
758 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
759 low_name = dt_lower_string (name);
762 for (u = gfc_rename_list; u; u = u->next)
764 if ((!low_name && strcmp (u->use_name, name) != 0)
765 || (low_name && strcmp (u->use_name, low_name) != 0)
766 || (u->op == INTRINSIC_USER && !interface)
767 || (u->op != INTRINSIC_USER && interface))
780 return only_flag ? NULL : name;
786 if (u->local_name[0] == '\0')
788 return dt_upper_string (u->local_name);
791 return (u->local_name[0] != '\0') ? u->local_name : name;
795 /* Given a name, return the name under which to load this symbol.
796 Returns NULL if this symbol shouldn't be loaded. */
799 find_use_name (const char *name, bool interface)
802 return find_use_name_n (name, &i, interface);
806 /* Given a real name, return the number of use names associated with it. */
809 number_use_names (const char *name, bool interface)
812 find_use_name_n (name, &i, interface);
817 /* Try to find the operator in the current list. */
819 static gfc_use_rename *
820 find_use_operator (gfc_intrinsic_op op)
824 for (u = gfc_rename_list; u; u = u->next)
832 /*****************************************************************/
834 /* The next couple of subroutines maintain a tree used to avoid a
835 brute-force search for a combination of true name and module name.
836 While symtree names, the name that a particular symbol is known by
837 can changed with USE statements, we still have to keep track of the
838 true names to generate the correct reference, and also avoid
839 loading the same real symbol twice in a program unit.
841 When we start reading, the true name tree is built and maintained
842 as symbols are read. The tree is searched as we load new symbols
843 to see if it already exists someplace in the namespace. */
845 typedef struct true_name
847 BBT_HEADER (true_name);
853 static true_name *true_name_root;
856 /* Compare two true_name structures. */
859 compare_true_names (void *_t1, void *_t2)
864 t1 = (true_name *) _t1;
865 t2 = (true_name *) _t2;
867 c = ((t1->sym->module > t2->sym->module)
868 - (t1->sym->module < t2->sym->module));
872 return strcmp (t1->name, t2->name);
876 /* Given a true name, search the true name tree to see if it exists
877 within the main namespace. */
880 find_true_name (const char *name, const char *module)
886 t.name = gfc_get_string (name);
888 sym.module = gfc_get_string (module);
896 c = compare_true_names ((void *) (&t), (void *) p);
900 p = (c < 0) ? p->left : p->right;
907 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
910 add_true_name (gfc_symbol *sym)
914 t = XCNEW (true_name);
916 if (sym->attr.flavor == FL_DERIVED)
917 t->name = dt_upper_string (sym->name);
921 gfc_insert_bbt (&true_name_root, t, compare_true_names);
925 /* Recursive function to build the initial true name tree by
926 recursively traversing the current namespace. */
929 build_tnt (gfc_symtree *st)
935 build_tnt (st->left);
936 build_tnt (st->right);
938 if (st->n.sym->attr.flavor == FL_DERIVED)
939 name = dt_upper_string (st->n.sym->name);
941 name = st->n.sym->name;
943 if (find_true_name (name, st->n.sym->module) != NULL)
946 add_true_name (st->n.sym);
950 /* Initialize the true name tree with the current namespace. */
953 init_true_name_tree (void)
955 true_name_root = NULL;
956 build_tnt (gfc_current_ns->sym_root);
960 /* Recursively free a true name tree node. */
963 free_true_name (true_name *t)
967 free_true_name (t->left);
968 free_true_name (t->right);
974 /*****************************************************************/
976 /* Module reading and writing. */
980 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
984 static atom_type last_atom;
987 /* The name buffer must be at least as long as a symbol name. Right
988 now it's not clear how we're going to store numeric constants--
989 probably as a hexadecimal string, since this will allow the exact
990 number to be preserved (this can't be done by a decimal
991 representation). Worry about that later. TODO! */
993 #define MAX_ATOM_SIZE 100
996 static char *atom_string, atom_name[MAX_ATOM_SIZE];
999 /* Report problems with a module. Error reporting is not very
1000 elaborate, since this sorts of errors shouldn't really happen.
1001 This subroutine never returns. */
1003 static void bad_module (const char *) ATTRIBUTE_NORETURN;
1006 bad_module (const char *msgid)
1013 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
1014 module_name, module_line, module_column, msgid);
1017 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
1018 module_name, module_line, module_column, msgid);
1021 gfc_fatal_error ("Module %s at line %d column %d: %s",
1022 module_name, module_line, module_column, msgid);
1028 /* Set the module's input pointer. */
1031 set_module_locus (module_locus *m)
1033 module_column = m->column;
1034 module_line = m->line;
1035 fsetpos (module_fp, &m->pos);
1039 /* Get the module's input pointer so that we can restore it later. */
1042 get_module_locus (module_locus *m)
1044 m->column = module_column;
1045 m->line = module_line;
1046 fgetpos (module_fp, &m->pos);
1050 /* Get the next character in the module, updating our reckoning of
1058 c = getc (module_fp);
1061 bad_module ("Unexpected EOF");
1063 prev_module_line = module_line;
1064 prev_module_column = module_column;
1077 /* Unget a character while remembering the line and column. Works for
1078 a single character only. */
1081 module_unget_char (void)
1083 module_line = prev_module_line;
1084 module_column = prev_module_column;
1085 ungetc (prev_character, module_fp);
1088 /* Parse a string constant. The delimiter is guaranteed to be a
1098 atom_string = XNEWVEC (char, cursz);
1106 int c2 = module_char ();
1109 module_unget_char ();
1117 atom_string = XRESIZEVEC (char, atom_string, cursz);
1119 atom_string[len] = c;
1123 atom_string = XRESIZEVEC (char, atom_string, len + 1);
1124 atom_string[len] = '\0'; /* C-style string for debug purposes. */
1128 /* Parse a small integer. */
1131 parse_integer (int c)
1140 module_unget_char ();
1144 atom_int = 10 * atom_int + c - '0';
1145 if (atom_int > 99999999)
1146 bad_module ("Integer overflow");
1168 if (!ISALNUM (c) && c != '_' && c != '-')
1170 module_unget_char ();
1175 if (++len > GFC_MAX_SYMBOL_LEN)
1176 bad_module ("Name too long");
1184 /* Read the next atom in the module's input stream. */
1195 while (c == ' ' || c == '\r' || c == '\n');
1220 return ATOM_INTEGER;
1278 bad_module ("Bad name");
1285 /* Peek at the next atom on the input. */
1296 while (c == ' ' || c == '\r' || c == '\n');
1301 module_unget_char ();
1305 module_unget_char ();
1309 module_unget_char ();
1322 module_unget_char ();
1323 return ATOM_INTEGER;
1377 module_unget_char ();
1381 bad_module ("Bad name");
1386 /* Read the next atom from the input, requiring that it be a
1390 require_atom (atom_type type)
1396 column = module_column;
1405 p = _("Expected name");
1408 p = _("Expected left parenthesis");
1411 p = _("Expected right parenthesis");
1414 p = _("Expected integer");
1417 p = _("Expected string");
1420 gfc_internal_error ("require_atom(): bad atom type required");
1423 module_column = column;
1430 /* Given a pointer to an mstring array, require that the current input
1431 be one of the strings in the array. We return the enum value. */
1434 find_enum (const mstring *m)
1438 i = gfc_string2code (m, atom_name);
1442 bad_module ("find_enum(): Enum not found");
1448 /* Read a string. The caller is responsible for freeing. */
1454 require_atom (ATOM_STRING);
1461 /**************** Module output subroutines ***************************/
1463 /* Output a character to a module file. */
1466 write_char (char out)
1468 if (putc (out, module_fp) == EOF)
1469 gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno));
1471 /* Add this to our MD5. */
1472 md5_process_bytes (&out, sizeof (out), &ctx);
1484 /* Write an atom to a module. The line wrapping isn't perfect, but it
1485 should work most of the time. This isn't that big of a deal, since
1486 the file really isn't meant to be read by people anyway. */
1489 write_atom (atom_type atom, const void *v)
1499 p = (const char *) v;
1511 i = *((const int *) v);
1513 gfc_internal_error ("write_atom(): Writing negative integer");
1515 sprintf (buffer, "%d", i);
1520 gfc_internal_error ("write_atom(): Trying to write dab atom");
1524 if(p == NULL || *p == '\0')
1529 if (atom != ATOM_RPAREN)
1531 if (module_column + len > 72)
1536 if (last_atom != ATOM_LPAREN && module_column != 1)
1541 if (atom == ATOM_STRING)
1544 while (p != NULL && *p)
1546 if (atom == ATOM_STRING && *p == '\'')
1551 if (atom == ATOM_STRING)
1559 /***************** Mid-level I/O subroutines *****************/
1561 /* These subroutines let their caller read or write atoms without
1562 caring about which of the two is actually happening. This lets a
1563 subroutine concentrate on the actual format of the data being
1566 static void mio_expr (gfc_expr **);
1567 pointer_info *mio_symbol_ref (gfc_symbol **);
1568 pointer_info *mio_interface_rest (gfc_interface **);
1569 static void mio_symtree_ref (gfc_symtree **);
1571 /* Read or write an enumerated value. On writing, we return the input
1572 value for the convenience of callers. We avoid using an integer
1573 pointer because enums are sometimes inside bitfields. */
1576 mio_name (int t, const mstring *m)
1578 if (iomode == IO_OUTPUT)
1579 write_atom (ATOM_NAME, gfc_code2string (m, t));
1582 require_atom (ATOM_NAME);
1589 /* Specialization of mio_name. */
1591 #define DECL_MIO_NAME(TYPE) \
1592 static inline TYPE \
1593 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1595 return (TYPE) mio_name ((int) t, m); \
1597 #define MIO_NAME(TYPE) mio_name_##TYPE
1602 if (iomode == IO_OUTPUT)
1603 write_atom (ATOM_LPAREN, NULL);
1605 require_atom (ATOM_LPAREN);
1612 if (iomode == IO_OUTPUT)
1613 write_atom (ATOM_RPAREN, NULL);
1615 require_atom (ATOM_RPAREN);
1620 mio_integer (int *ip)
1622 if (iomode == IO_OUTPUT)
1623 write_atom (ATOM_INTEGER, ip);
1626 require_atom (ATOM_INTEGER);
1632 /* Read or write a gfc_intrinsic_op value. */
1635 mio_intrinsic_op (gfc_intrinsic_op* op)
1637 /* FIXME: Would be nicer to do this via the operators symbolic name. */
1638 if (iomode == IO_OUTPUT)
1640 int converted = (int) *op;
1641 write_atom (ATOM_INTEGER, &converted);
1645 require_atom (ATOM_INTEGER);
1646 *op = (gfc_intrinsic_op) atom_int;
1651 /* Read or write a character pointer that points to a string on the heap. */
1654 mio_allocated_string (const char *s)
1656 if (iomode == IO_OUTPUT)
1658 write_atom (ATOM_STRING, s);
1663 require_atom (ATOM_STRING);
1669 /* Functions for quoting and unquoting strings. */
1672 quote_string (const gfc_char_t *s, const size_t slength)
1674 const gfc_char_t *p;
1678 /* Calculate the length we'll need: a backslash takes two ("\\"),
1679 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1680 for (p = s, i = 0; i < slength; p++, i++)
1684 else if (!gfc_wide_is_printable (*p))
1690 q = res = XCNEWVEC (char, len + 1);
1691 for (p = s, i = 0; i < slength; p++, i++)
1694 *q++ = '\\', *q++ = '\\';
1695 else if (!gfc_wide_is_printable (*p))
1697 sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1698 (unsigned HOST_WIDE_INT) *p);
1702 *q++ = (unsigned char) *p;
1710 unquote_string (const char *s)
1716 for (p = s, len = 0; *p; p++, len++)
1723 else if (p[1] == 'U')
1724 p += 9; /* That is a "\U????????". */
1726 gfc_internal_error ("unquote_string(): got bad string");
1729 res = gfc_get_wide_string (len + 1);
1730 for (i = 0, p = s; i < len; i++, p++)
1735 res[i] = (unsigned char) *p;
1736 else if (p[1] == '\\')
1738 res[i] = (unsigned char) '\\';
1743 /* We read the 8-digits hexadecimal constant that follows. */
1748 gcc_assert (p[1] == 'U');
1749 for (j = 0; j < 8; j++)
1752 gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1766 /* Read or write a character pointer that points to a wide string on the
1767 heap, performing quoting/unquoting of nonprintable characters using the
1768 form \U???????? (where each ? is a hexadecimal digit).
1769 Length is the length of the string, only known and used in output mode. */
1771 static const gfc_char_t *
1772 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1774 if (iomode == IO_OUTPUT)
1776 char *quoted = quote_string (s, length);
1777 write_atom (ATOM_STRING, quoted);
1783 gfc_char_t *unquoted;
1785 require_atom (ATOM_STRING);
1786 unquoted = unquote_string (atom_string);
1793 /* Read or write a string that is in static memory. */
1796 mio_pool_string (const char **stringp)
1798 /* TODO: one could write the string only once, and refer to it via a
1801 /* As a special case we have to deal with a NULL string. This
1802 happens for the 'module' member of 'gfc_symbol's that are not in a
1803 module. We read / write these as the empty string. */
1804 if (iomode == IO_OUTPUT)
1806 const char *p = *stringp == NULL ? "" : *stringp;
1807 write_atom (ATOM_STRING, p);
1811 require_atom (ATOM_STRING);
1812 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1818 /* Read or write a string that is inside of some already-allocated
1822 mio_internal_string (char *string)
1824 if (iomode == IO_OUTPUT)
1825 write_atom (ATOM_STRING, string);
1828 require_atom (ATOM_STRING);
1829 strcpy (string, atom_string);
1836 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1837 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1838 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1839 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1840 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE,
1841 AB_ALLOC_COMP, AB_POINTER_COMP, AB_PROC_POINTER_COMP, AB_PRIVATE_COMP,
1842 AB_VALUE, AB_VOLATILE, AB_PROTECTED, AB_LOCK_COMP,
1843 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1844 AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
1845 AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER,
1850 static const mstring attr_bits[] =
1852 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1853 minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1854 minit ("DIMENSION", AB_DIMENSION),
1855 minit ("CODIMENSION", AB_CODIMENSION),
1856 minit ("CONTIGUOUS", AB_CONTIGUOUS),
1857 minit ("EXTERNAL", AB_EXTERNAL),
1858 minit ("INTRINSIC", AB_INTRINSIC),
1859 minit ("OPTIONAL", AB_OPTIONAL),
1860 minit ("POINTER", AB_POINTER),
1861 minit ("VOLATILE", AB_VOLATILE),
1862 minit ("TARGET", AB_TARGET),
1863 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1864 minit ("DUMMY", AB_DUMMY),
1865 minit ("RESULT", AB_RESULT),
1866 minit ("DATA", AB_DATA),
1867 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1868 minit ("IN_COMMON", AB_IN_COMMON),
1869 minit ("FUNCTION", AB_FUNCTION),
1870 minit ("SUBROUTINE", AB_SUBROUTINE),
1871 minit ("SEQUENCE", AB_SEQUENCE),
1872 minit ("ELEMENTAL", AB_ELEMENTAL),
1873 minit ("PURE", AB_PURE),
1874 minit ("RECURSIVE", AB_RECURSIVE),
1875 minit ("GENERIC", AB_GENERIC),
1876 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1877 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1878 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1879 minit ("IS_BIND_C", AB_IS_BIND_C),
1880 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1881 minit ("IS_ISO_C", AB_IS_ISO_C),
1882 minit ("VALUE", AB_VALUE),
1883 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1884 minit ("COARRAY_COMP", AB_COARRAY_COMP),
1885 minit ("LOCK_COMP", AB_LOCK_COMP),
1886 minit ("POINTER_COMP", AB_POINTER_COMP),
1887 minit ("PROC_POINTER_COMP", AB_PROC_POINTER_COMP),
1888 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1889 minit ("ZERO_COMP", AB_ZERO_COMP),
1890 minit ("PROTECTED", AB_PROTECTED),
1891 minit ("ABSTRACT", AB_ABSTRACT),
1892 minit ("IS_CLASS", AB_IS_CLASS),
1893 minit ("PROCEDURE", AB_PROCEDURE),
1894 minit ("PROC_POINTER", AB_PROC_POINTER),
1895 minit ("VTYPE", AB_VTYPE),
1896 minit ("VTAB", AB_VTAB),
1897 minit ("CLASS_POINTER", AB_CLASS_POINTER),
1898 minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE),
1902 /* For binding attributes. */
1903 static const mstring binding_passing[] =
1906 minit ("NOPASS", 1),
1909 static const mstring binding_overriding[] =
1911 minit ("OVERRIDABLE", 0),
1912 minit ("NON_OVERRIDABLE", 1),
1913 minit ("DEFERRED", 2),
1916 static const mstring binding_generic[] =
1918 minit ("SPECIFIC", 0),
1919 minit ("GENERIC", 1),
1922 static const mstring binding_ppc[] =
1924 minit ("NO_PPC", 0),
1929 /* Specialization of mio_name. */
1930 DECL_MIO_NAME (ab_attribute)
1931 DECL_MIO_NAME (ar_type)
1932 DECL_MIO_NAME (array_type)
1934 DECL_MIO_NAME (expr_t)
1935 DECL_MIO_NAME (gfc_access)
1936 DECL_MIO_NAME (gfc_intrinsic_op)
1937 DECL_MIO_NAME (ifsrc)
1938 DECL_MIO_NAME (save_state)
1939 DECL_MIO_NAME (procedure_type)
1940 DECL_MIO_NAME (ref_type)
1941 DECL_MIO_NAME (sym_flavor)
1942 DECL_MIO_NAME (sym_intent)
1943 #undef DECL_MIO_NAME
1945 /* Symbol attributes are stored in list with the first three elements
1946 being the enumerated fields, while the remaining elements (if any)
1947 indicate the individual attribute bits. The access field is not
1948 saved-- it controls what symbols are exported when a module is
1952 mio_symbol_attribute (symbol_attribute *attr)
1955 unsigned ext_attr,extension_level;
1959 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1960 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1961 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1962 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1963 attr->save = MIO_NAME (save_state) (attr->save, save_status);
1965 ext_attr = attr->ext_attr;
1966 mio_integer ((int *) &ext_attr);
1967 attr->ext_attr = ext_attr;
1969 extension_level = attr->extension;
1970 mio_integer ((int *) &extension_level);
1971 attr->extension = extension_level;
1973 if (iomode == IO_OUTPUT)
1975 if (attr->allocatable)
1976 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1977 if (attr->asynchronous)
1978 MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
1979 if (attr->dimension)
1980 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1981 if (attr->codimension)
1982 MIO_NAME (ab_attribute) (AB_CODIMENSION, attr_bits);
1983 if (attr->contiguous)
1984 MIO_NAME (ab_attribute) (AB_CONTIGUOUS, attr_bits);
1986 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1987 if (attr->intrinsic)
1988 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1990 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1992 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1993 if (attr->class_pointer)
1994 MIO_NAME (ab_attribute) (AB_CLASS_POINTER, attr_bits);
1995 if (attr->is_protected)
1996 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1998 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1999 if (attr->volatile_)
2000 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
2002 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
2003 if (attr->threadprivate)
2004 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
2006 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
2008 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
2009 /* We deliberately don't preserve the "entry" flag. */
2012 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
2013 if (attr->in_namelist)
2014 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
2015 if (attr->in_common)
2016 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
2019 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
2020 if (attr->subroutine)
2021 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
2023 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
2025 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
2028 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
2029 if (attr->elemental)
2030 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
2032 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
2033 if (attr->implicit_pure)
2034 MIO_NAME (ab_attribute) (AB_IMPLICIT_PURE, attr_bits);
2035 if (attr->recursive)
2036 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
2037 if (attr->always_explicit)
2038 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
2039 if (attr->cray_pointer)
2040 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
2041 if (attr->cray_pointee)
2042 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
2043 if (attr->is_bind_c)
2044 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
2045 if (attr->is_c_interop)
2046 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
2048 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
2049 if (attr->alloc_comp)
2050 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
2051 if (attr->pointer_comp)
2052 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
2053 if (attr->proc_pointer_comp)
2054 MIO_NAME (ab_attribute) (AB_PROC_POINTER_COMP, attr_bits);
2055 if (attr->private_comp)
2056 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
2057 if (attr->coarray_comp)
2058 MIO_NAME (ab_attribute) (AB_COARRAY_COMP, attr_bits);
2059 if (attr->lock_comp)
2060 MIO_NAME (ab_attribute) (AB_LOCK_COMP, attr_bits);
2061 if (attr->zero_comp)
2062 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
2064 MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
2065 if (attr->procedure)
2066 MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
2067 if (attr->proc_pointer)
2068 MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
2070 MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
2072 MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
2082 if (t == ATOM_RPAREN)
2085 bad_module ("Expected attribute bit name");
2087 switch ((ab_attribute) find_enum (attr_bits))
2089 case AB_ALLOCATABLE:
2090 attr->allocatable = 1;
2092 case AB_ASYNCHRONOUS:
2093 attr->asynchronous = 1;
2096 attr->dimension = 1;
2098 case AB_CODIMENSION:
2099 attr->codimension = 1;
2102 attr->contiguous = 1;
2108 attr->intrinsic = 1;
2116 case AB_CLASS_POINTER:
2117 attr->class_pointer = 1;
2120 attr->is_protected = 1;
2126 attr->volatile_ = 1;
2131 case AB_THREADPRIVATE:
2132 attr->threadprivate = 1;
2143 case AB_IN_NAMELIST:
2144 attr->in_namelist = 1;
2147 attr->in_common = 1;
2153 attr->subroutine = 1;
2165 attr->elemental = 1;
2170 case AB_IMPLICIT_PURE:
2171 attr->implicit_pure = 1;
2174 attr->recursive = 1;
2176 case AB_ALWAYS_EXPLICIT:
2177 attr->always_explicit = 1;
2179 case AB_CRAY_POINTER:
2180 attr->cray_pointer = 1;
2182 case AB_CRAY_POINTEE:
2183 attr->cray_pointee = 1;
2186 attr->is_bind_c = 1;
2188 case AB_IS_C_INTEROP:
2189 attr->is_c_interop = 1;
2195 attr->alloc_comp = 1;
2197 case AB_COARRAY_COMP:
2198 attr->coarray_comp = 1;
2201 attr->lock_comp = 1;
2203 case AB_POINTER_COMP:
2204 attr->pointer_comp = 1;
2206 case AB_PROC_POINTER_COMP:
2207 attr->proc_pointer_comp = 1;
2209 case AB_PRIVATE_COMP:
2210 attr->private_comp = 1;
2213 attr->zero_comp = 1;
2219 attr->procedure = 1;
2221 case AB_PROC_POINTER:
2222 attr->proc_pointer = 1;
2236 static const mstring bt_types[] = {
2237 minit ("INTEGER", BT_INTEGER),
2238 minit ("REAL", BT_REAL),
2239 minit ("COMPLEX", BT_COMPLEX),
2240 minit ("LOGICAL", BT_LOGICAL),
2241 minit ("CHARACTER", BT_CHARACTER),
2242 minit ("DERIVED", BT_DERIVED),
2243 minit ("CLASS", BT_CLASS),
2244 minit ("PROCEDURE", BT_PROCEDURE),
2245 minit ("UNKNOWN", BT_UNKNOWN),
2246 minit ("VOID", BT_VOID),
2252 mio_charlen (gfc_charlen **clp)
2258 if (iomode == IO_OUTPUT)
2262 mio_expr (&cl->length);
2266 if (peek_atom () != ATOM_RPAREN)
2268 cl = gfc_new_charlen (gfc_current_ns, NULL);
2269 mio_expr (&cl->length);
2278 /* See if a name is a generated name. */
2281 check_unique_name (const char *name)
2283 return *name == '@';
2288 mio_typespec (gfc_typespec *ts)
2292 ts->type = MIO_NAME (bt) (ts->type, bt_types);
2294 if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2295 mio_integer (&ts->kind);
2297 mio_symbol_ref (&ts->u.derived);
2299 mio_symbol_ref (&ts->interface);
2301 /* Add info for C interop and is_iso_c. */
2302 mio_integer (&ts->is_c_interop);
2303 mio_integer (&ts->is_iso_c);
2305 /* If the typespec is for an identifier either from iso_c_binding, or
2306 a constant that was initialized to an identifier from it, use the
2307 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2309 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2311 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2313 if (ts->type != BT_CHARACTER)
2315 /* ts->u.cl is only valid for BT_CHARACTER. */
2320 mio_charlen (&ts->u.cl);
2322 /* So as not to disturb the existing API, use an ATOM_NAME to
2323 transmit deferred characteristic for characters (F2003). */
2324 if (iomode == IO_OUTPUT)
2326 if (ts->type == BT_CHARACTER && ts->deferred)
2327 write_atom (ATOM_NAME, "DEFERRED_CL");
2329 else if (peek_atom () != ATOM_RPAREN)
2331 if (parse_atom () != ATOM_NAME)
2332 bad_module ("Expected string");
2340 static const mstring array_spec_types[] = {
2341 minit ("EXPLICIT", AS_EXPLICIT),
2342 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2343 minit ("DEFERRED", AS_DEFERRED),
2344 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2350 mio_array_spec (gfc_array_spec **asp)
2357 if (iomode == IO_OUTPUT)
2365 if (peek_atom () == ATOM_RPAREN)
2371 *asp = as = gfc_get_array_spec ();
2374 mio_integer (&as->rank);
2375 mio_integer (&as->corank);
2376 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2378 if (iomode == IO_INPUT && as->corank)
2379 as->cotype = (as->type == AS_DEFERRED) ? AS_DEFERRED : AS_EXPLICIT;
2381 for (i = 0; i < as->rank + as->corank; i++)
2383 mio_expr (&as->lower[i]);
2384 mio_expr (&as->upper[i]);
2392 /* Given a pointer to an array reference structure (which lives in a
2393 gfc_ref structure), find the corresponding array specification
2394 structure. Storing the pointer in the ref structure doesn't quite
2395 work when loading from a module. Generating code for an array
2396 reference also needs more information than just the array spec. */
2398 static const mstring array_ref_types[] = {
2399 minit ("FULL", AR_FULL),
2400 minit ("ELEMENT", AR_ELEMENT),
2401 minit ("SECTION", AR_SECTION),
2407 mio_array_ref (gfc_array_ref *ar)
2412 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2413 mio_integer (&ar->dimen);
2421 for (i = 0; i < ar->dimen; i++)
2422 mio_expr (&ar->start[i]);
2427 for (i = 0; i < ar->dimen; i++)
2429 mio_expr (&ar->start[i]);
2430 mio_expr (&ar->end[i]);
2431 mio_expr (&ar->stride[i]);
2437 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2440 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2441 we can't call mio_integer directly. Instead loop over each element
2442 and cast it to/from an integer. */
2443 if (iomode == IO_OUTPUT)
2445 for (i = 0; i < ar->dimen; i++)
2447 int tmp = (int)ar->dimen_type[i];
2448 write_atom (ATOM_INTEGER, &tmp);
2453 for (i = 0; i < ar->dimen; i++)
2455 require_atom (ATOM_INTEGER);
2456 ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2460 if (iomode == IO_INPUT)
2462 ar->where = gfc_current_locus;
2464 for (i = 0; i < ar->dimen; i++)
2465 ar->c_where[i] = gfc_current_locus;
2472 /* Saves or restores a pointer. The pointer is converted back and
2473 forth from an integer. We return the pointer_info pointer so that
2474 the caller can take additional action based on the pointer type. */
2476 static pointer_info *
2477 mio_pointer_ref (void *gp)
2481 if (iomode == IO_OUTPUT)
2483 p = get_pointer (*((char **) gp));
2484 write_atom (ATOM_INTEGER, &p->integer);
2488 require_atom (ATOM_INTEGER);
2489 p = add_fixup (atom_int, gp);
2496 /* Save and load references to components that occur within
2497 expressions. We have to describe these references by a number and
2498 by name. The number is necessary for forward references during
2499 reading, and the name is necessary if the symbol already exists in
2500 the namespace and is not loaded again. */
2503 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2505 char name[GFC_MAX_SYMBOL_LEN + 1];
2509 p = mio_pointer_ref (cp);
2510 if (p->type == P_UNKNOWN)
2511 p->type = P_COMPONENT;
2513 if (iomode == IO_OUTPUT)
2514 mio_pool_string (&(*cp)->name);
2517 mio_internal_string (name);
2519 if (sym && sym->attr.is_class)
2520 sym = sym->components->ts.u.derived;
2522 /* It can happen that a component reference can be read before the
2523 associated derived type symbol has been loaded. Return now and
2524 wait for a later iteration of load_needed. */
2528 if (sym->components != NULL && p->u.pointer == NULL)
2530 /* Symbol already loaded, so search by name. */
2531 q = gfc_find_component (sym, name, true, true);
2534 associate_integer_pointer (p, q);
2537 /* Make sure this symbol will eventually be loaded. */
2538 p = find_pointer2 (sym);
2539 if (p->u.rsym.state == UNUSED)
2540 p->u.rsym.state = NEEDED;
2545 static void mio_namespace_ref (gfc_namespace **nsp);
2546 static void mio_formal_arglist (gfc_formal_arglist **formal);
2547 static void mio_typebound_proc (gfc_typebound_proc** proc);
2550 mio_component (gfc_component *c, int vtype)
2554 gfc_formal_arglist *formal;
2558 if (iomode == IO_OUTPUT)
2560 p = get_pointer (c);
2561 mio_integer (&p->integer);
2566 p = get_integer (n);
2567 associate_integer_pointer (p, c);
2570 if (p->type == P_UNKNOWN)
2571 p->type = P_COMPONENT;
2573 mio_pool_string (&c->name);
2574 mio_typespec (&c->ts);
2575 mio_array_spec (&c->as);
2577 mio_symbol_attribute (&c->attr);
2578 if (c->ts.type == BT_CLASS)
2579 c->attr.class_ok = 1;
2580 c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types);
2583 mio_expr (&c->initializer);
2585 if (c->attr.proc_pointer)
2587 if (iomode == IO_OUTPUT)
2590 while (formal && !formal->sym)
2591 formal = formal->next;
2594 mio_namespace_ref (&formal->sym->ns);
2596 mio_namespace_ref (&c->formal_ns);
2600 mio_namespace_ref (&c->formal_ns);
2601 /* TODO: if (c->formal_ns)
2603 c->formal_ns->proc_name = c;
2608 mio_formal_arglist (&c->formal);
2610 mio_typebound_proc (&c->tb);
2618 mio_component_list (gfc_component **cp, int vtype)
2620 gfc_component *c, *tail;
2624 if (iomode == IO_OUTPUT)
2626 for (c = *cp; c; c = c->next)
2627 mio_component (c, vtype);
2636 if (peek_atom () == ATOM_RPAREN)
2639 c = gfc_get_component ();
2640 mio_component (c, vtype);
2656 mio_actual_arg (gfc_actual_arglist *a)
2659 mio_pool_string (&a->name);
2660 mio_expr (&a->expr);
2666 mio_actual_arglist (gfc_actual_arglist **ap)
2668 gfc_actual_arglist *a, *tail;
2672 if (iomode == IO_OUTPUT)
2674 for (a = *ap; a; a = a->next)
2684 if (peek_atom () != ATOM_LPAREN)
2687 a = gfc_get_actual_arglist ();
2703 /* Read and write formal argument lists. */
2706 mio_formal_arglist (gfc_formal_arglist **formal)
2708 gfc_formal_arglist *f, *tail;
2712 if (iomode == IO_OUTPUT)
2714 for (f = *formal; f; f = f->next)
2715 mio_symbol_ref (&f->sym);
2719 *formal = tail = NULL;
2721 while (peek_atom () != ATOM_RPAREN)
2723 f = gfc_get_formal_arglist ();
2724 mio_symbol_ref (&f->sym);
2726 if (*formal == NULL)
2739 /* Save or restore a reference to a symbol node. */
2742 mio_symbol_ref (gfc_symbol **symp)
2746 p = mio_pointer_ref (symp);
2747 if (p->type == P_UNKNOWN)
2750 if (iomode == IO_OUTPUT)
2752 if (p->u.wsym.state == UNREFERENCED)
2753 p->u.wsym.state = NEEDS_WRITE;
2757 if (p->u.rsym.state == UNUSED)
2758 p->u.rsym.state = NEEDED;
2764 /* Save or restore a reference to a symtree node. */
2767 mio_symtree_ref (gfc_symtree **stp)
2772 if (iomode == IO_OUTPUT)
2773 mio_symbol_ref (&(*stp)->n.sym);
2776 require_atom (ATOM_INTEGER);
2777 p = get_integer (atom_int);
2779 /* An unused equivalence member; make a symbol and a symtree
2781 if (in_load_equiv && p->u.rsym.symtree == NULL)
2783 /* Since this is not used, it must have a unique name. */
2784 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2786 /* Make the symbol. */
2787 if (p->u.rsym.sym == NULL)
2789 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2791 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2794 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2795 p->u.rsym.symtree->n.sym->refs++;
2796 p->u.rsym.referenced = 1;
2798 /* If the symbol is PRIVATE and in COMMON, load_commons will
2799 generate a fixup symbol, which must be associated. */
2801 resolve_fixups (p->fixup, p->u.rsym.sym);
2805 if (p->type == P_UNKNOWN)
2808 if (p->u.rsym.state == UNUSED)
2809 p->u.rsym.state = NEEDED;
2811 if (p->u.rsym.symtree != NULL)
2813 *stp = p->u.rsym.symtree;
2817 f = XCNEW (fixup_t);
2819 f->next = p->u.rsym.stfixup;
2820 p->u.rsym.stfixup = f;
2822 f->pointer = (void **) stp;
2829 mio_iterator (gfc_iterator **ip)
2835 if (iomode == IO_OUTPUT)
2842 if (peek_atom () == ATOM_RPAREN)
2848 *ip = gfc_get_iterator ();
2853 mio_expr (&iter->var);
2854 mio_expr (&iter->start);
2855 mio_expr (&iter->end);
2856 mio_expr (&iter->step);
2864 mio_constructor (gfc_constructor_base *cp)
2870 if (iomode == IO_OUTPUT)
2872 for (c = gfc_constructor_first (*cp); c; c = gfc_constructor_next (c))
2875 mio_expr (&c->expr);
2876 mio_iterator (&c->iterator);
2882 while (peek_atom () != ATOM_RPAREN)
2884 c = gfc_constructor_append_expr (cp, NULL, NULL);
2887 mio_expr (&c->expr);
2888 mio_iterator (&c->iterator);
2897 static const mstring ref_types[] = {
2898 minit ("ARRAY", REF_ARRAY),
2899 minit ("COMPONENT", REF_COMPONENT),
2900 minit ("SUBSTRING", REF_SUBSTRING),
2906 mio_ref (gfc_ref **rp)
2913 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2918 mio_array_ref (&r->u.ar);
2922 mio_symbol_ref (&r->u.c.sym);
2923 mio_component_ref (&r->u.c.component, r->u.c.sym);
2927 mio_expr (&r->u.ss.start);
2928 mio_expr (&r->u.ss.end);
2929 mio_charlen (&r->u.ss.length);
2938 mio_ref_list (gfc_ref **rp)
2940 gfc_ref *ref, *head, *tail;
2944 if (iomode == IO_OUTPUT)
2946 for (ref = *rp; ref; ref = ref->next)
2953 while (peek_atom () != ATOM_RPAREN)
2956 head = tail = gfc_get_ref ();
2959 tail->next = gfc_get_ref ();
2973 /* Read and write an integer value. */
2976 mio_gmp_integer (mpz_t *integer)
2980 if (iomode == IO_INPUT)
2982 if (parse_atom () != ATOM_STRING)
2983 bad_module ("Expected integer string");
2985 mpz_init (*integer);
2986 if (mpz_set_str (*integer, atom_string, 10))
2987 bad_module ("Error converting integer");
2993 p = mpz_get_str (NULL, 10, *integer);
2994 write_atom (ATOM_STRING, p);
3001 mio_gmp_real (mpfr_t *real)
3006 if (iomode == IO_INPUT)
3008 if (parse_atom () != ATOM_STRING)
3009 bad_module ("Expected real string");
3012 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
3017 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
3019 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
3021 write_atom (ATOM_STRING, p);
3026 atom_string = XCNEWVEC (char, strlen (p) + 20);
3028 sprintf (atom_string, "0.%s@%ld", p, exponent);
3030 /* Fix negative numbers. */
3031 if (atom_string[2] == '-')
3033 atom_string[0] = '-';
3034 atom_string[1] = '0';
3035 atom_string[2] = '.';
3038 write_atom (ATOM_STRING, atom_string);
3046 /* Save and restore the shape of an array constructor. */
3049 mio_shape (mpz_t **pshape, int rank)
3055 /* A NULL shape is represented by (). */
3058 if (iomode == IO_OUTPUT)
3070 if (t == ATOM_RPAREN)
3077 shape = gfc_get_shape (rank);
3081 for (n = 0; n < rank; n++)
3082 mio_gmp_integer (&shape[n]);
3088 static const mstring expr_types[] = {
3089 minit ("OP", EXPR_OP),
3090 minit ("FUNCTION", EXPR_FUNCTION),
3091 minit ("CONSTANT", EXPR_CONSTANT),
3092 minit ("VARIABLE", EXPR_VARIABLE),
3093 minit ("SUBSTRING", EXPR_SUBSTRING),
3094 minit ("STRUCTURE", EXPR_STRUCTURE),
3095 minit ("ARRAY", EXPR_ARRAY),
3096 minit ("NULL", EXPR_NULL),
3097 minit ("COMPCALL", EXPR_COMPCALL),
3101 /* INTRINSIC_ASSIGN is missing because it is used as an index for
3102 generic operators, not in expressions. INTRINSIC_USER is also
3103 replaced by the correct function name by the time we see it. */
3105 static const mstring intrinsics[] =
3107 minit ("UPLUS", INTRINSIC_UPLUS),
3108 minit ("UMINUS", INTRINSIC_UMINUS),
3109 minit ("PLUS", INTRINSIC_PLUS),
3110 minit ("MINUS", INTRINSIC_MINUS),
3111 minit ("TIMES", INTRINSIC_TIMES),
3112 minit ("DIVIDE", INTRINSIC_DIVIDE),
3113 minit ("POWER", INTRINSIC_POWER),
3114 minit ("CONCAT", INTRINSIC_CONCAT),
3115 minit ("AND", INTRINSIC_AND),
3116 minit ("OR", INTRINSIC_OR),
3117 minit ("EQV", INTRINSIC_EQV),
3118 minit ("NEQV", INTRINSIC_NEQV),
3119 minit ("EQ_SIGN", INTRINSIC_EQ),
3120 minit ("EQ", INTRINSIC_EQ_OS),
3121 minit ("NE_SIGN", INTRINSIC_NE),
3122 minit ("NE", INTRINSIC_NE_OS),
3123 minit ("GT_SIGN", INTRINSIC_GT),
3124 minit ("GT", INTRINSIC_GT_OS),
3125 minit ("GE_SIGN", INTRINSIC_GE),
3126 minit ("GE", INTRINSIC_GE_OS),
3127 minit ("LT_SIGN", INTRINSIC_LT),
3128 minit ("LT", INTRINSIC_LT_OS),
3129 minit ("LE_SIGN", INTRINSIC_LE),
3130 minit ("LE", INTRINSIC_LE_OS),
3131 minit ("NOT", INTRINSIC_NOT),
3132 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
3137 /* Remedy a couple of situations where the gfc_expr's can be defective. */
3140 fix_mio_expr (gfc_expr *e)
3142 gfc_symtree *ns_st = NULL;
3145 if (iomode != IO_OUTPUT)
3150 /* If this is a symtree for a symbol that came from a contained module
3151 namespace, it has a unique name and we should look in the current
3152 namespace to see if the required, non-contained symbol is available
3153 yet. If so, the latter should be written. */
3154 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
3156 const char *name = e->symtree->n.sym->name;
3157 if (e->symtree->n.sym->attr.flavor == FL_DERIVED)
3158 name = dt_upper_string (name);
3159 ns_st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3162 /* On the other hand, if the existing symbol is the module name or the
3163 new symbol is a dummy argument, do not do the promotion. */
3164 if (ns_st && ns_st->n.sym
3165 && ns_st->n.sym->attr.flavor != FL_MODULE
3166 && !e->symtree->n.sym->attr.dummy)
3169 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
3173 /* In some circumstances, a function used in an initialization
3174 expression, in one use associated module, can fail to be
3175 coupled to its symtree when used in a specification
3176 expression in another module. */
3177 fname = e->value.function.esym ? e->value.function.esym->name
3178 : e->value.function.isym->name;
3179 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3184 /* This is probably a reference to a private procedure from another
3185 module. To prevent a segfault, make a generic with no specific
3186 instances. If this module is used, without the required
3187 specific coming from somewhere, the appropriate error message
3189 gfc_get_symbol (fname, gfc_current_ns, &sym);
3190 sym->attr.flavor = FL_PROCEDURE;
3191 sym->attr.generic = 1;
3192 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3193 gfc_commit_symbol (sym);
3198 /* Read and write expressions. The form "()" is allowed to indicate a
3202 mio_expr (gfc_expr **ep)
3210 if (iomode == IO_OUTPUT)
3219 MIO_NAME (expr_t) (e->expr_type, expr_types);
3224 if (t == ATOM_RPAREN)
3231 bad_module ("Expected expression type");
3233 e = *ep = gfc_get_expr ();
3234 e->where = gfc_current_locus;
3235 e->expr_type = (expr_t) find_enum (expr_types);
3238 mio_typespec (&e->ts);
3239 mio_integer (&e->rank);
3243 switch (e->expr_type)
3247 = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3249 switch (e->value.op.op)
3251 case INTRINSIC_UPLUS:
3252 case INTRINSIC_UMINUS:
3254 case INTRINSIC_PARENTHESES:
3255 mio_expr (&e->value.op.op1);
3258 case INTRINSIC_PLUS:
3259 case INTRINSIC_MINUS:
3260 case INTRINSIC_TIMES:
3261 case INTRINSIC_DIVIDE:
3262 case INTRINSIC_POWER:
3263 case INTRINSIC_CONCAT:
3267 case INTRINSIC_NEQV:
3269 case INTRINSIC_EQ_OS:
3271 case INTRINSIC_NE_OS:
3273 case INTRINSIC_GT_OS:
3275 case INTRINSIC_GE_OS:
3277 case INTRINSIC_LT_OS:
3279 case INTRINSIC_LE_OS:
3280 mio_expr (&e->value.op.op1);
3281 mio_expr (&e->value.op.op2);
3285 bad_module ("Bad operator");
3291 mio_symtree_ref (&e->symtree);
3292 mio_actual_arglist (&e->value.function.actual);
3294 if (iomode == IO_OUTPUT)
3296 e->value.function.name
3297 = mio_allocated_string (e->value.function.name);
3298 flag = e->value.function.esym != NULL;
3299 mio_integer (&flag);
3301 mio_symbol_ref (&e->value.function.esym);
3303 write_atom (ATOM_STRING, e->value.function.isym->name);
3307 require_atom (ATOM_STRING);
3308 e->value.function.name = gfc_get_string (atom_string);
3311 mio_integer (&flag);
3313 mio_symbol_ref (&e->value.function.esym);
3316 require_atom (ATOM_STRING);
3317 e->value.function.isym = gfc_find_function (atom_string);
3325 mio_symtree_ref (&e->symtree);
3326 mio_ref_list (&e->ref);
3329 case EXPR_SUBSTRING:
3330 e->value.character.string
3331 = CONST_CAST (gfc_char_t *,
3332 mio_allocated_wide_string (e->value.character.string,
3333 e->value.character.length));
3334 mio_ref_list (&e->ref);
3337 case EXPR_STRUCTURE:
3339 mio_constructor (&e->value.constructor);
3340 mio_shape (&e->shape, e->rank);
3347 mio_gmp_integer (&e->value.integer);
3351 gfc_set_model_kind (e->ts.kind);
3352 mio_gmp_real (&e->value.real);
3356 gfc_set_model_kind (e->ts.kind);
3357 mio_gmp_real (&mpc_realref (e->value.complex));
3358 mio_gmp_real (&mpc_imagref (e->value.complex));
3362 mio_integer (&e->value.logical);
3366 mio_integer (&e->value.character.length);
3367 e->value.character.string
3368 = CONST_CAST (gfc_char_t *,
3369 mio_allocated_wide_string (e->value.character.string,
3370 e->value.character.length));
3374 bad_module ("Bad type in constant expression");
3392 /* Read and write namelists. */
3395 mio_namelist (gfc_symbol *sym)
3397 gfc_namelist *n, *m;
3398 const char *check_name;
3402 if (iomode == IO_OUTPUT)
3404 for (n = sym->namelist; n; n = n->next)
3405 mio_symbol_ref (&n->sym);
3409 /* This departure from the standard is flagged as an error.
3410 It does, in fact, work correctly. TODO: Allow it
3412 if (sym->attr.flavor == FL_NAMELIST)
3414 check_name = find_use_name (sym->name, false);
3415 if (check_name && strcmp (check_name, sym->name) != 0)
3416 gfc_error ("Namelist %s cannot be renamed by USE "
3417 "association to %s", sym->name, check_name);
3421 while (peek_atom () != ATOM_RPAREN)
3423 n = gfc_get_namelist ();
3424 mio_symbol_ref (&n->sym);
3426 if (sym->namelist == NULL)
3433 sym->namelist_tail = m;
3440 /* Save/restore lists of gfc_interface structures. When loading an
3441 interface, we are really appending to the existing list of
3442 interfaces. Checking for duplicate and ambiguous interfaces has to
3443 be done later when all symbols have been loaded. */
3446 mio_interface_rest (gfc_interface **ip)
3448 gfc_interface *tail, *p;
3449 pointer_info *pi = NULL;
3451 if (iomode == IO_OUTPUT)
3454 for (p = *ip; p; p = p->next)
3455 mio_symbol_ref (&p->sym);
3470 if (peek_atom () == ATOM_RPAREN)
3473 p = gfc_get_interface ();
3474 p->where = gfc_current_locus;
3475 pi = mio_symbol_ref (&p->sym);
3491 /* Save/restore a nameless operator interface. */
3494 mio_interface (gfc_interface **ip)
3497 mio_interface_rest (ip);
3501 /* Save/restore a named operator interface. */
3504 mio_symbol_interface (const char **name, const char **module,
3508 mio_pool_string (name);
3509 mio_pool_string (module);
3510 mio_interface_rest (ip);
3515 mio_namespace_ref (gfc_namespace **nsp)
3520 p = mio_pointer_ref (nsp);
3522 if (p->type == P_UNKNOWN)
3523 p->type = P_NAMESPACE;
3525 if (iomode == IO_INPUT && p->integer != 0)
3527 ns = (gfc_namespace *) p->u.pointer;
3530 ns = gfc_get_namespace (NULL, 0);
3531 associate_integer_pointer (p, ns);
3539 /* Save/restore the f2k_derived namespace of a derived-type symbol. */
3541 static gfc_namespace* current_f2k_derived;
3544 mio_typebound_proc (gfc_typebound_proc** proc)
3547 int overriding_flag;
3549 if (iomode == IO_INPUT)
3551 *proc = gfc_get_typebound_proc (NULL);
3552 (*proc)->where = gfc_current_locus;
3558 (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3560 /* IO the NON_OVERRIDABLE/DEFERRED combination. */
3561 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3562 overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3563 overriding_flag = mio_name (overriding_flag, binding_overriding);
3564 (*proc)->deferred = ((overriding_flag & 2) != 0);
3565 (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3566 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3568 (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3569 (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3570 (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3572 mio_pool_string (&((*proc)->pass_arg));
3574 flag = (int) (*proc)->pass_arg_num;
3575 mio_integer (&flag);
3576 (*proc)->pass_arg_num = (unsigned) flag;
3578 if ((*proc)->is_generic)
3585 if (iomode == IO_OUTPUT)
3586 for (g = (*proc)->u.generic; g; g = g->next)
3588 iop = (int) g->is_operator;
3590 mio_allocated_string (g->specific_st->name);
3594 (*proc)->u.generic = NULL;
3595 while (peek_atom () != ATOM_RPAREN)
3597 gfc_symtree** sym_root;
3599 g = gfc_get_tbp_generic ();
3603 g->is_operator = (bool) iop;
3605 require_atom (ATOM_STRING);
3606 sym_root = ¤t_f2k_derived->tb_sym_root;
3607 g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3610 g->next = (*proc)->u.generic;
3611 (*proc)->u.generic = g;
3617 else if (!(*proc)->ppc)
3618 mio_symtree_ref (&(*proc)->u.specific);
3623 /* Walker-callback function for this purpose. */
3625 mio_typebound_symtree (gfc_symtree* st)
3627 if (iomode == IO_OUTPUT && !st->n.tb)
3630 if (iomode == IO_OUTPUT)
3633 mio_allocated_string (st->name);
3635 /* For IO_INPUT, the above is done in mio_f2k_derived. */
3637 mio_typebound_proc (&st->n.tb);
3641 /* IO a full symtree (in all depth). */
3643 mio_full_typebound_tree (gfc_symtree** root)
3647 if (iomode == IO_OUTPUT)
3648 gfc_traverse_symtree (*root, &mio_typebound_symtree);
3651 while (peek_atom () == ATOM_LPAREN)
3657 require_atom (ATOM_STRING);
3658 st = gfc_get_tbp_symtree (root, atom_string);
3661 mio_typebound_symtree (st);
3669 mio_finalizer (gfc_finalizer **f)
3671 if (iomode == IO_OUTPUT)
3674 gcc_assert ((*f)->proc_tree); /* Should already be resolved. */
3675 mio_symtree_ref (&(*f)->proc_tree);
3679 *f = gfc_get_finalizer ();
3680 (*f)->where = gfc_current_locus; /* Value should not matter. */
3683 mio_symtree_ref (&(*f)->proc_tree);
3684 (*f)->proc_sym = NULL;
3689 mio_f2k_derived (gfc_namespace *f2k)
3691 current_f2k_derived = f2k;
3693 /* Handle the list of finalizer procedures. */
3695 if (iomode == IO_OUTPUT)
3698 for (f = f2k->finalizers; f; f = f->next)
3703 f2k->finalizers = NULL;
3704 while (peek_atom () != ATOM_RPAREN)
3706 gfc_finalizer *cur = NULL;
3707 mio_finalizer (&cur);
3708 cur->next = f2k->finalizers;
3709 f2k->finalizers = cur;
3714 /* Handle type-bound procedures. */
3715 mio_full_typebound_tree (&f2k->tb_sym_root);
3717 /* Type-bound user operators. */
3718 mio_full_typebound_tree (&f2k->tb_uop_root);
3720 /* Type-bound intrinsic operators. */
3722 if (iomode == IO_OUTPUT)
3725 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3727 gfc_intrinsic_op realop;
3729 if (op == INTRINSIC_USER || !f2k->tb_op[op])
3733 realop = (gfc_intrinsic_op) op;
3734 mio_intrinsic_op (&realop);
3735 mio_typebound_proc (&f2k->tb_op[op]);
3740 while (peek_atom () != ATOM_RPAREN)
3742 gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC. */
3745 mio_intrinsic_op (&op);
3746 mio_typebound_proc (&f2k->tb_op[op]);
3753 mio_full_f2k_derived (gfc_symbol *sym)
3757 if (iomode == IO_OUTPUT)
3759 if (sym->f2k_derived)
3760 mio_f2k_derived (sym->f2k_derived);
3764 if (peek_atom () != ATOM_RPAREN)
3766 sym->f2k_derived = gfc_get_namespace (NULL, 0);
3767 mio_f2k_derived (sym->f2k_derived);
3770 gcc_assert (!sym->f2k_derived);
3777 /* Unlike most other routines, the address of the symbol node is already
3778 fixed on input and the name/module has already been filled in. */
3781 mio_symbol (gfc_symbol *sym)
3783 int intmod = INTMOD_NONE;
3787 mio_symbol_attribute (&sym->attr);
3788 mio_typespec (&sym->ts);
3789 if (sym->ts.type == BT_CLASS)
3790 sym->attr.class_ok = 1;
3792 if (iomode == IO_OUTPUT)
3793 mio_namespace_ref (&sym->formal_ns);
3796 mio_namespace_ref (&sym->formal_ns);
3799 sym->formal_ns->proc_name = sym;
3804 /* Save/restore common block links. */
3805 mio_symbol_ref (&sym->common_next);
3807 mio_formal_arglist (&sym->formal);
3809 if (sym->attr.flavor == FL_PARAMETER)
3810 mio_expr (&sym->value);
3812 mio_array_spec (&sym->as);
3814 mio_symbol_ref (&sym->result);
3816 if (sym->attr.cray_pointee)
3817 mio_symbol_ref (&sym->cp_pointer);
3819 /* Note that components are always saved, even if they are supposed
3820 to be private. Component access is checked during searching. */
3822 mio_component_list (&sym->components, sym->attr.vtype);
3824 if (sym->components != NULL)
3825 sym->component_access
3826 = MIO_NAME (gfc_access) (sym->component_access, access_types);
3828 /* Load/save the f2k_derived namespace of a derived-type symbol. */
3829 mio_full_f2k_derived (sym);
3833 /* Add the fields that say whether this is from an intrinsic module,
3834 and if so, what symbol it is within the module. */
3835 /* mio_integer (&(sym->from_intmod)); */
3836 if (iomode == IO_OUTPUT)
3838 intmod = sym->from_intmod;
3839 mio_integer (&intmod);
3843 mio_integer (&intmod);
3844 sym->from_intmod = (intmod_id) intmod;
3847 mio_integer (&(sym->intmod_sym_id));
3849 if (sym->attr.flavor == FL_DERIVED)
3850 mio_integer (&(sym->hash_value));
3856 /************************* Top level subroutines *************************/
3858 /* Given a root symtree node and a symbol, try to find a symtree that
3859 references the symbol that is not a unique name. */
3861 static gfc_symtree *
3862 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3864 gfc_symtree *s = NULL;
3869 s = find_symtree_for_symbol (st->right, sym);
3872 s = find_symtree_for_symbol (st->left, sym);
3876 if (st->n.sym == sym && !check_unique_name (st->name))
3883 /* A recursive function to look for a specific symbol by name and by
3884 module. Whilst several symtrees might point to one symbol, its
3885 is sufficient for the purposes here than one exist. Note that
3886 generic interfaces are distinguished as are symbols that have been
3887 renamed in another module. */
3888 static gfc_symtree *
3889 find_symbol (gfc_symtree *st, const char *name,
3890 const char *module, int generic)
3893 gfc_symtree *retval, *s;
3895 if (st == NULL || st->n.sym == NULL)
3898 c = strcmp (name, st->n.sym->name);
3899 if (c == 0 && st->n.sym->module
3900 && strcmp (module, st->n.sym->module) == 0
3901 && !check_unique_name (st->name))
3903 s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3905 /* Detect symbols that are renamed by use association in another
3906 module by the absence of a symtree and null attr.use_rename,
3907 since the latter is not transmitted in the module file. */
3908 if (((!generic && !st->n.sym->attr.generic)
3909 || (generic && st->n.sym->attr.generic))
3910 && !(s == NULL && !st->n.sym->attr.use_rename))
3914 retval = find_symbol (st->left, name, module, generic);
3917 retval = find_symbol (st->right, name, module, generic);
3923 /* Skip a list between balanced left and right parens. */
3933 switch (parse_atom ())
3956 /* Load operator interfaces from the module. Interfaces are unusual
3957 in that they attach themselves to existing symbols. */
3960 load_operator_interfaces (void)
3963 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3965 pointer_info *pi = NULL;
3970 while (peek_atom () != ATOM_RPAREN)
3974 mio_internal_string (name);
3975 mio_internal_string (module);
3977 n = number_use_names (name, true);
3980 for (i = 1; i <= n; i++)
3982 /* Decide if we need to load this one or not. */
3983 p = find_use_name_n (name, &i, true);
3987 while (parse_atom () != ATOM_RPAREN);
3993 uop = gfc_get_uop (p);
3994 pi = mio_interface_rest (&uop->op);
3998 if (gfc_find_uop (p, NULL))
4000 uop = gfc_get_uop (p);
4001 uop->op = gfc_get_interface ();
4002 uop->op->where = gfc_current_locus;
4003 add_fixup (pi->integer, &uop->op->sym);
4012 /* Load interfaces from the module. Interfaces are unusual in that
4013 they attach themselves to existing symbols. */
4016 load_generic_interfaces (void)
4019 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
4021 gfc_interface *generic = NULL, *gen = NULL;
4023 bool ambiguous_set = false;
4027 while (peek_atom () != ATOM_RPAREN)
4031 mio_internal_string (name);
4032 mio_internal_string (module);
4034 n = number_use_names (name, false);
4035 renamed = n ? 1 : 0;
4038 for (i = 1; i <= n; i++)
4041 /* Decide if we need to load this one or not. */
4042 p = find_use_name_n (name, &i, false);
4044 st = find_symbol (gfc_current_ns->sym_root,
4045 name, module_name, 1);
4047 if (!p || gfc_find_symbol (p, NULL, 0, &sym))
4049 /* Skip the specific names for these cases. */
4050 while (i == 1 && parse_atom () != ATOM_RPAREN);
4055 /* If the symbol exists already and is being USEd without being
4056 in an ONLY clause, do not load a new symtree(11.3.2). */
4057 if (!only_flag && st)
4065 if (strcmp (st->name, p) != 0)
4067 st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
4073 /* Since we haven't found a valid generic interface, we had
4077 gfc_get_symbol (p, NULL, &sym);
4078 sym->name = gfc_get_string (name);
4079 sym->module = module_name;
4080 sym->attr.flavor = FL_PROCEDURE;
4081 sym->attr.generic = 1;
4082 sym->attr.use_assoc = 1;
4087 /* Unless sym is a generic interface, this reference
4090 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4094 if (st && !sym->attr.generic
4097 && strcmp(module, sym->module))
4099 ambiguous_set = true;
4104 sym->attr.use_only = only_flag;
4105 sym->attr.use_rename = renamed;
4109 mio_interface_rest (&sym->generic);
4110 generic = sym->generic;
4112 else if (!sym->generic)
4114 sym->generic = generic;
4115 sym->attr.generic_copy = 1;
4118 /* If a procedure that is not generic has generic interfaces
4119 that include itself, it is generic! We need to take care
4120 to retain symbols ambiguous that were already so. */
4121 if (sym->attr.use_assoc
4122 && !sym->attr.generic
4123 && sym->attr.flavor == FL_PROCEDURE)
4125 for (gen = generic; gen; gen = gen->next)
4127 if (gen->sym == sym)
4129 sym->attr.generic = 1;
4144 /* Load common blocks. */
4149 char name[GFC_MAX_SYMBOL_LEN + 1];
4154 while (peek_atom () != ATOM_RPAREN)
4159 mio_internal_string (name);
4161 p = gfc_get_common (name, 1);
4163 mio_symbol_ref (&p->head);
4164 mio_integer (&flags);
4168 p->threadprivate = 1;
4171 /* Get whether this was a bind(c) common or not. */
4172 mio_integer (&p->is_bind_c);
4173 /* Get the binding label. */
4174 label = read_string ();
4176 p->binding_label = IDENTIFIER_POINTER (get_identifier (label));
4186 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
4187 so that unused variables are not loaded and so that the expression can
4193 gfc_equiv *head, *tail, *end, *eq;
4197 in_load_equiv = true;
4199 end = gfc_current_ns->equiv;
4200 while (end != NULL && end->next != NULL)
4203 while (peek_atom () != ATOM_RPAREN) {
4207 while(peek_atom () != ATOM_RPAREN)
4210 head = tail = gfc_get_equiv ();
4213 tail->eq = gfc_get_equiv ();
4217 mio_pool_string (&tail->module);
4218 mio_expr (&tail->expr);
4221 /* Unused equivalence members have a unique name. In addition, it
4222 must be checked that the symbols are from the same module. */
4224 for (eq = head; eq; eq = eq->eq)
4226 if (eq->expr->symtree->n.sym->module
4227 && head->expr->symtree->n.sym->module
4228 && strcmp (head->expr->symtree->n.sym->module,
4229 eq->expr->symtree->n.sym->module) == 0
4230 && !check_unique_name (eq->expr->symtree->name))
4239 for (eq = head; eq; eq = head)
4242 gfc_free_expr (eq->expr);
4248 gfc_current_ns->equiv = head;
4259 in_load_equiv = false;
4263 /* This function loads the sym_root of f2k_derived with the extensions to
4264 the derived type. */
4266 load_derived_extensions (void)
4269 gfc_symbol *derived;
4273 char name[GFC_MAX_SYMBOL_LEN + 1];
4274 char module[GFC_MAX_SYMBOL_LEN + 1];
4278 while (peek_atom () != ATOM_RPAREN)
4281 mio_integer (&symbol);
4282 info = get_integer (symbol);
4283 derived = info->u.rsym.sym;
4285 /* This one is not being loaded. */
4286 if (!info || !derived)
4288 while (peek_atom () != ATOM_RPAREN)
4293 gcc_assert (derived->attr.flavor == FL_DERIVED);
4294 if (derived->f2k_derived == NULL)
4295 derived->f2k_derived = gfc_get_namespace (NULL, 0);
4297 while (peek_atom () != ATOM_RPAREN)
4300 mio_internal_string (name);
4301 mio_internal_string (module);
4303 /* Only use one use name to find the symbol. */
4305 p = find_use_name_n (name, &j, false);
4308 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4310 st = gfc_find_symtree (derived->f2k_derived->sym_root, name);
4313 /* Only use the real name in f2k_derived to ensure a single
4315 st = gfc_new_symtree (&derived->f2k_derived->sym_root, name);
4328 /* Recursive function to traverse the pointer_info tree and load a
4329 needed symbol. We return nonzero if we load a symbol and stop the
4330 traversal, because the act of loading can alter the tree. */
4333 load_needed (pointer_info *p)
4344 rv |= load_needed (p->left);
4345 rv |= load_needed (p->right);
4347 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
4350 p->u.rsym.state = USED;
4352 set_module_locus (&p->u.rsym.where);
4354 sym = p->u.rsym.sym;
4357 q = get_integer (p->u.rsym.ns);
4359 ns = (gfc_namespace *) q->u.pointer;
4362 /* Create an interface namespace if necessary. These are
4363 the namespaces that hold the formal parameters of module
4366 ns = gfc_get_namespace (NULL, 0);
4367 associate_integer_pointer (q, ns);
4370 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
4371 doesn't go pear-shaped if the symbol is used. */
4373 gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
4376 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
4377 sym->name = dt_lower_string (p->u.rsym.true_name);
4378 sym->module = gfc_get_string (p->u.rsym.module);
4379 if (p->u.rsym.binding_label)
4380 sym->binding_label = IDENTIFIER_POINTER (get_identifier
4381 (p->u.rsym.binding_label));
4383 associate_integer_pointer (p, sym);
4387 sym->attr.use_assoc = 1;
4389 /* Mark as only or rename for later diagnosis for explicitly imported
4390 but not used warnings; don't mark internal symbols such as __vtab,
4391 __def_init etc. Only mark them if they have been explicitly loaded. */
4393 if (only_flag && sym->name[0] != '_' && sym->name[1] != '_')
4397 /* Search the use/rename list for the variable; if the variable is
4399 for (u = gfc_rename_list; u; u = u->next)
4401 if (strcmp (u->use_name, sym->name) == 0)
4403 sym->attr.use_only = 1;
4409 if (p->u.rsym.renamed)
4410 sym->attr.use_rename = 1;
4416 /* Recursive function for cleaning up things after a module has been read. */
4419 read_cleanup (pointer_info *p)
4427 read_cleanup (p->left);
4428 read_cleanup (p->right);
4430 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
4433 /* Add hidden symbols to the symtree. */
4434 q = get_integer (p->u.rsym.ns);
4435 ns = (gfc_namespace *) q->u.pointer;
4437 if (!p->u.rsym.sym->attr.vtype
4438 && !p->u.rsym.sym->attr.vtab)
4439 st = gfc_get_unique_symtree (ns);
4442 /* There is no reason to use 'unique_symtrees' for vtabs or
4443 vtypes - their name is fine for a symtree and reduces the
4444 namespace pollution. */
4445 st = gfc_find_symtree (ns->sym_root, p->u.rsym.sym->name);
4447 st = gfc_new_symtree (&ns->sym_root, p->u.rsym.sym->name);
4450 st->n.sym = p->u.rsym.sym;
4453 /* Fixup any symtree references. */
4454 p->u.rsym.symtree = st;
4455 resolve_fixups (p->u.rsym.stfixup, st);
4456 p->u.rsym.stfixup = NULL;
4459 /* Free unused symbols. */
4460 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
4461 gfc_free_symbol (p->u.rsym.sym);
4465 /* It is not quite enough to check for ambiguity in the symbols by
4466 the loaded symbol and the new symbol not being identical. */
4468 check_for_ambiguous (gfc_symbol *st_sym, pointer_info *info)
4472 symbol_attribute attr;
4474 if (st_sym->ns->proc_name && st_sym->name == st_sym->ns->proc_name->name)
4476 gfc_error ("'%s' of module '%s', imported at %C, is also the name of the "
4477 "current program unit", st_sym->name, module_name);
4481 rsym = info->u.rsym.sym;
4485 if (st_sym->attr.vtab || st_sym->attr.vtype)
4488 /* If the existing symbol is generic from a different module and
4489 the new symbol is generic there can be no ambiguity. */
4490 if (st_sym->attr.generic
4492 && st_sym->module != module_name)
4494 /* The new symbol's attributes have not yet been read. Since
4495 we need attr.generic, read it directly. */
4496 get_module_locus (&locus);
4497 set_module_locus (&info->u.rsym.where);
4500 mio_symbol_attribute (&attr);
4501 set_module_locus (&locus);
4510 /* Read a module file. */
4515 module_locus operator_interfaces, user_operators, extensions;
4517 char name[GFC_MAX_SYMBOL_LEN + 1];
4519 int ambiguous, j, nuse, symbol;
4520 pointer_info *info, *q;
4521 gfc_use_rename *u = NULL;
4525 get_module_locus (&operator_interfaces); /* Skip these for now. */
4528 get_module_locus (&user_operators);
4532 /* Skip commons, equivalences and derived type extensions for now. */
4536 get_module_locus (&extensions);
4541 /* Create the fixup nodes for all the symbols. */
4543 while (peek_atom () != ATOM_RPAREN)
4546 require_atom (ATOM_INTEGER);
4547 info = get_integer (atom_int);
4549 info->type = P_SYMBOL;
4550 info->u.rsym.state = UNUSED;
4552 info->u.rsym.true_name = read_string ();
4553 info->u.rsym.module = read_string ();
4554 bind_label = read_string ();
4555 if (strlen (bind_label))
4556 info->u.rsym.binding_label = bind_label;
4558 XDELETEVEC (bind_label);
4560 require_atom (ATOM_INTEGER);
4561 info->u.rsym.ns = atom_int;
4563 get_module_locus (&info->u.rsym.where);
4566 /* See if the symbol has already been loaded by a previous module.
4567 If so, we reference the existing symbol and prevent it from
4568 being loaded again. This should not happen if the symbol being
4569 read is an index for an assumed shape dummy array (ns != 1). */
4571 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
4574 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
4577 info->u.rsym.state = USED;
4578 info->u.rsym.sym = sym;
4580 /* Some symbols do not have a namespace (eg. formal arguments),
4581 so the automatic "unique symtree" mechanism must be suppressed
4582 by marking them as referenced. */
4583 q = get_integer (info->u.rsym.ns);
4584 if (q->u.pointer == NULL)
4586 info->u.rsym.referenced = 1;
4590 /* If possible recycle the symtree that references the symbol.
4591 If a symtree is not found and the module does not import one,
4592 a unique-name symtree is found by read_cleanup. */
4593 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
4596 info->u.rsym.symtree = st;
4597 info->u.rsym.referenced = 1;
4603 /* Parse the symtree lists. This lets us mark which symbols need to
4604 be loaded. Renaming is also done at this point by replacing the
4609 while (peek_atom () != ATOM_RPAREN)
4611 mio_internal_string (name);
4612 mio_integer (&ambiguous);
4613 mio_integer (&symbol);
4615 info = get_integer (symbol);
4617 /* See how many use names there are. If none, go through the start
4618 of the loop at least once. */
4619 nuse = number_use_names (name, false);
4620 info->u.rsym.renamed = nuse ? 1 : 0;
4625 for (j = 1; j <= nuse; j++)
4627 /* Get the jth local name for this symbol. */
4628 p = find_use_name_n (name, &j, false);
4630 if (p == NULL && strcmp (name, module_name) == 0)
4633 /* Exception: Always import vtabs & vtypes. */
4634 if (p == NULL && name[0] == '_'
4635 && (strncmp (name, "__vtab_", 5) == 0
4636 || strncmp (name, "__vtype_", 6) == 0))
4639 /* Skip symtree nodes not in an ONLY clause, unless there
4640 is an existing symtree loaded from another USE statement. */
4643 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4645 info->u.rsym.symtree = st;
4649 /* If a symbol of the same name and module exists already,
4650 this symbol, which is not in an ONLY clause, must not be
4651 added to the namespace(11.3.2). Note that find_symbol
4652 only returns the first occurrence that it finds. */
4653 if (!only_flag && !info->u.rsym.renamed
4654 && strcmp (name, module_name) != 0
4655 && find_symbol (gfc_current_ns->sym_root, name,
4659 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4663 /* Check for ambiguous symbols. */
4664 if (check_for_ambiguous (st->n.sym, info))
4666 info->u.rsym.symtree = st;
4670 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4672 /* Create a symtree node in the current namespace for this
4674 st = check_unique_name (p)
4675 ? gfc_get_unique_symtree (gfc_current_ns)
4676 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
4677 st->ambiguous = ambiguous;
4679 sym = info->u.rsym.sym;
4681 /* Create a symbol node if it doesn't already exist. */
4684 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
4686 info->u.rsym.sym->name = dt_lower_string (info->u.rsym.true_name);
4687 sym = info->u.rsym.sym;
4688 sym->module = gfc_get_string (info->u.rsym.module);
4690 if (info->u.rsym.binding_label)
4691 sym->binding_label =
4692 IDENTIFIER_POINTER (get_identifier
4693 (info->u.rsym.binding_label));
4699 if (strcmp (name, p) != 0)
4700 sym->attr.use_rename = 1;
4703 || (strncmp (name, "__vtab_", 5) != 0
4704 && strncmp (name, "__vtype_", 6) != 0))
4705 sym->attr.use_only = only_flag;
4707 /* Store the symtree pointing to this symbol. */
4708 info->u.rsym.symtree = st;
4710 if (info->u.rsym.state == UNUSED)
4711 info->u.rsym.state = NEEDED;
4712 info->u.rsym.referenced = 1;
4719 /* Load intrinsic operator interfaces. */
4720 set_module_locus (&operator_interfaces);
4723 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4725 if (i == INTRINSIC_USER)
4730 u = find_use_operator ((gfc_intrinsic_op) i);
4741 mio_interface (&gfc_current_ns->op[i]);
4742 if (u && !gfc_current_ns->op[i])
4748 /* Load generic and user operator interfaces. These must follow the
4749 loading of symtree because otherwise symbols can be marked as
4752 set_module_locus (&user_operators);
4754 load_operator_interfaces ();
4755 load_generic_interfaces ();
4760 /* At this point, we read those symbols that are needed but haven't
4761 been loaded yet. If one symbol requires another, the other gets
4762 marked as NEEDED if its previous state was UNUSED. */
4764 while (load_needed (pi_root));
4766 /* Make sure all elements of the rename-list were found in the module. */
4768 for (u = gfc_rename_list; u; u = u->next)
4773 if (u->op == INTRINSIC_NONE)
4775 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
4776 u->use_name, &u->where, module_name);
4780 if (u->op == INTRINSIC_USER)
4782 gfc_error ("User operator '%s' referenced at %L not found "
4783 "in module '%s'", u->use_name, &u->where, module_name);
4787 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4788 "in module '%s'", gfc_op2string (u->op), &u->where,
4792 /* Now we should be in a position to fill f2k_derived with derived type
4793 extensions, since everything has been loaded. */
4794 set_module_locus (&extensions);
4795 load_derived_extensions ();
4797 /* Clean up symbol nodes that were never loaded, create references
4798 to hidden symbols. */
4800 read_cleanup (pi_root);
4804 /* Given an access type that is specific to an entity and the default
4805 access, return nonzero if the entity is publicly accessible. If the
4806 element is declared as PUBLIC, then it is public; if declared
4807 PRIVATE, then private, and otherwise it is public unless the default
4808 access in this context has been declared PRIVATE. */
4811 check_access (gfc_access specific_access, gfc_access default_access)
4813 if (specific_access == ACCESS_PUBLIC)
4815 if (specific_access == ACCESS_PRIVATE)
4818 if (gfc_option.flag_module_private)
4819 return default_access == ACCESS_PUBLIC;
4821 return default_access != ACCESS_PRIVATE;
4826 gfc_check_symbol_access (gfc_symbol *sym)
4828 if (sym->attr.vtab || sym->attr.vtype)
4831 return check_access (sym->attr.access, sym->ns->default_access);
4835 /* A structure to remember which commons we've already written. */
4837 struct written_common
4839 BBT_HEADER(written_common);
4840 const char *name, *label;
4843 static struct written_common *written_commons = NULL;
4845 /* Comparison function used for balancing the binary tree. */
4848 compare_written_commons (void *a1, void *b1)
4850 const char *aname = ((struct written_common *) a1)->name;
4851 const char *alabel = ((struct written_common *) a1)->label;
4852 const char *bname = ((struct written_common *) b1)->name;
4853 const char *blabel = ((struct written_common *) b1)->label;
4854 int c = strcmp (aname, bname);
4856 return (c != 0 ? c : strcmp (alabel, blabel));
4859 /* Free a list of written commons. */
4862 free_written_common (struct written_common *w)
4868 free_written_common (w->left);
4870 free_written_common (w->right);
4875 /* Write a common block to the module -- recursive helper function. */
4878 write_common_0 (gfc_symtree *st, bool this_module)
4884 struct written_common *w;
4885 bool write_me = true;
4890 write_common_0 (st->left, this_module);
4892 /* We will write out the binding label, or "" if no label given. */
4893 name = st->n.common->name;
4895 label = (p->is_bind_c && p->binding_label) ? p->binding_label : "";
4897 /* Check if we've already output this common. */
4898 w = written_commons;
4901 int c = strcmp (name, w->name);
4902 c = (c != 0 ? c : strcmp (label, w->label));
4906 w = (c < 0) ? w->left : w->right;
4909 if (this_module && p->use_assoc)
4914 /* Write the common to the module. */
4916 mio_pool_string (&name);
4918 mio_symbol_ref (&p->head);
4919 flags = p->saved ? 1 : 0;
4920 if (p->threadprivate)
4922 mio_integer (&flags);
4924 /* Write out whether the common block is bind(c) or not. */
4925 mio_integer (&(p->is_bind_c));
4927 mio_pool_string (&label);
4930 /* Record that we have written this common. */
4931 w = XCNEW (struct written_common);
4934 gfc_insert_bbt (&written_commons, w, compare_written_commons);
4937 write_common_0 (st->right, this_module);
4941 /* Write a common, by initializing the list of written commons, calling
4942 the recursive function write_common_0() and cleaning up afterwards. */
4945 write_common (gfc_symtree *st)
4947 written_commons = NULL;
4948 write_common_0 (st, true);
4949 write_common_0 (st, false);
4950 free_written_common (written_commons);
4951 written_commons = NULL;
4955 /* Write the blank common block to the module. */
4958 write_blank_common (void)
4960 const char * name = BLANK_COMMON_NAME;
4962 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
4963 this, but it hasn't been checked. Just making it so for now. */
4966 if (gfc_current_ns->blank_common.head == NULL)
4971 mio_pool_string (&name);
4973 mio_symbol_ref (&gfc_current_ns->blank_common.head);
4974 saved = gfc_current_ns->blank_common.saved;
4975 mio_integer (&saved);
4977 /* Write out whether the common block is bind(c) or not. */
4978 mio_integer (&is_bind_c);
4980 /* Write out an empty binding label. */
4981 write_atom (ATOM_STRING, "");
4987 /* Write equivalences to the module. */
4996 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
5000 for (e = eq; e; e = e->eq)
5002 if (e->module == NULL)
5003 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
5004 mio_allocated_string (e->module);
5005 mio_expr (&e->expr);
5014 /* Write derived type extensions to the module. */
5017 write_dt_extensions (gfc_symtree *st)
5019 if (!gfc_check_symbol_access (st->n.sym))
5021 if (!(st->n.sym->ns && st->n.sym->ns->proc_name
5022 && st->n.sym->ns->proc_name->attr.flavor == FL_MODULE))
5026 mio_pool_string (&st->name);
5027 if (st->n.sym->module != NULL)
5028 mio_pool_string (&st->n.sym->module);
5031 char name[GFC_MAX_SYMBOL_LEN + 1];
5032 if (iomode == IO_OUTPUT)
5033 strcpy (name, module_name);
5034 mio_internal_string (name);
5035 if (iomode == IO_INPUT)
5036 module_name = gfc_get_string (name);
5042 write_derived_extensions (gfc_symtree *st)
5044 if (!((st->n.sym->attr.flavor == FL_DERIVED)
5045 && (st->n.sym->f2k_derived != NULL)
5046 && (st->n.sym->f2k_derived->sym_root != NULL)))
5050 mio_symbol_ref (&(st->n.sym));
5051 gfc_traverse_symtree (st->n.sym->f2k_derived->sym_root,
5052 write_dt_extensions);
5057 /* Write a symbol to the module. */
5060 write_symbol (int n, gfc_symbol *sym)
5064 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
5065 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
5069 if (sym->attr.flavor == FL_DERIVED)
5072 name = dt_upper_string (sym->name);
5073 mio_pool_string (&name);
5076 mio_pool_string (&sym->name);
5078 mio_pool_string (&sym->module);
5079 if ((sym->attr.is_bind_c || sym->attr.is_iso_c) && sym->binding_label)
5081 label = sym->binding_label;
5082 mio_pool_string (&label);
5085 write_atom (ATOM_STRING, "");
5087 mio_pointer_ref (&sym->ns);
5094 /* Recursive traversal function to write the initial set of symbols to
5095 the module. We check to see if the symbol should be written
5096 according to the access specification. */
5099 write_symbol0 (gfc_symtree *st)
5103 bool dont_write = false;
5108 write_symbol0 (st->left);
5111 if (sym->module == NULL)
5112 sym->module = module_name;
5114 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5115 && !sym->attr.subroutine && !sym->attr.function)
5118 if (!gfc_check_symbol_access (sym))
5123 p = get_pointer (sym);
5124 if (p->type == P_UNKNOWN)
5127 if (p->u.wsym.state != WRITTEN)
5129 write_symbol (p->integer, sym);
5130 p->u.wsym.state = WRITTEN;
5134 write_symbol0 (st->right);
5138 /* Recursive traversal function to write the secondary set of symbols
5139 to the module file. These are symbols that were not public yet are
5140 needed by the public symbols or another dependent symbol. The act
5141 of writing a symbol can modify the pointer_info tree, so we cease
5142 traversal if we find a symbol to write. We return nonzero if a
5143 symbol was written and pass that information upwards. */
5146 write_symbol1 (pointer_info *p)
5153 result = write_symbol1 (p->left);
5155 if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
5157 p->u.wsym.state = WRITTEN;
5158 write_symbol (p->integer, p->u.wsym.sym);
5162 result |= write_symbol1 (p->right);
5167 /* Write operator interfaces associated with a symbol. */
5170 write_operator (gfc_user_op *uop)
5172 static char nullstring[] = "";
5173 const char *p = nullstring;
5175 if (uop->op == NULL || !check_access (uop->access, uop->ns->default_access))
5178 mio_symbol_interface (&uop->name, &p, &uop->op);
5182 /* Write generic interfaces from the namespace sym_root. */
5185 write_generic (gfc_symtree *st)
5192 write_generic (st->left);
5193 write_generic (st->right);
5196 if (!sym || check_unique_name (st->name))
5199 if (sym->generic == NULL || !gfc_check_symbol_access (sym))
5202 if (sym->module == NULL)
5203 sym->module = module_name;
5205 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
5210 write_symtree (gfc_symtree *st)
5217 /* A symbol in an interface body must not be visible in the
5219 if (sym->ns != gfc_current_ns
5220 && sym->ns->proc_name
5221 && sym->ns->proc_name->attr.if_source == IFSRC_IFBODY)
5224 if (!gfc_check_symbol_access (sym)
5225 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5226 && !sym->attr.subroutine && !sym->attr.function))
5229 if (check_unique_name (st->name))
5232 p = find_pointer (sym);
5234 gfc_internal_error ("write_symtree(): Symbol not written");
5236 mio_pool_string (&st->name);
5237 mio_integer (&st->ambiguous);
5238 mio_integer (&p->integer);
5247 /* Write the operator interfaces. */
5250 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
5252 if (i == INTRINSIC_USER)
5255 mio_interface (check_access (gfc_current_ns->operator_access[i],
5256 gfc_current_ns->default_access)
5257 ? &gfc_current_ns->op[i] : NULL);
5265 gfc_traverse_user_op (gfc_current_ns, write_operator);
5271 write_generic (gfc_current_ns->sym_root);
5277 write_blank_common ();
5278 write_common (gfc_current_ns->common_root);
5290 gfc_traverse_symtree (gfc_current_ns->sym_root,
5291 write_derived_extensions);
5296 /* Write symbol information. First we traverse all symbols in the
5297 primary namespace, writing those that need to be written.
5298 Sometimes writing one symbol will cause another to need to be
5299 written. A list of these symbols ends up on the write stack, and
5300 we end by popping the bottom of the stack and writing the symbol
5301 until the stack is empty. */
5305 write_symbol0 (gfc_current_ns->sym_root);
5306 while (write_symbol1 (pi_root))
5315 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
5320 /* Read a MD5 sum from the header of a module file. If the file cannot
5321 be opened, or we have any other error, we return -1. */
5324 read_md5_from_module_file (const char * filename, unsigned char md5[16])
5330 /* Open the file. */
5331 if ((file = fopen (filename, "r")) == NULL)
5334 /* Read the first line. */
5335 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5341 /* The file also needs to be overwritten if the version number changed. */
5342 n = strlen ("GFORTRAN module version '" MOD_VERSION "' created");
5343 if (strncmp (buf, "GFORTRAN module version '" MOD_VERSION "' created", n) != 0)
5349 /* Read a second line. */
5350 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5356 /* Close the file. */
5359 /* If the header is not what we expect, or is too short, bail out. */
5360 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
5363 /* Now, we have a real MD5, read it into the array. */
5364 for (n = 0; n < 16; n++)
5368 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
5378 /* Given module, dump it to disk. If there was an error while
5379 processing the module, dump_flag will be set to zero and we delete
5380 the module file, even if it was already there. */
5383 gfc_dump_module (const char *name, int dump_flag)
5386 char *filename, *filename_tmp;
5388 unsigned char md5_new[16], md5_old[16];
5390 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
5391 if (gfc_option.module_dir != NULL)
5393 n += strlen (gfc_option.module_dir);
5394 filename = (char *) alloca (n);
5395 strcpy (filename, gfc_option.module_dir);
5396 strcat (filename, name);
5400 filename = (char *) alloca (n);
5401 strcpy (filename, name);
5403 strcat (filename, MODULE_EXTENSION);
5405 /* Name of the temporary file used to write the module. */
5406 filename_tmp = (char *) alloca (n + 1);
5407 strcpy (filename_tmp, filename);
5408 strcat (filename_tmp, "0");
5410 /* There was an error while processing the module. We delete the
5411 module file, even if it was already there. */
5418 if (gfc_cpp_makedep ())
5419 gfc_cpp_add_target (filename);
5421 /* Write the module to the temporary file. */
5422 module_fp = fopen (filename_tmp, "w");
5423 if (module_fp == NULL)
5424 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
5425 filename_tmp, xstrerror (errno));
5427 /* Write the header, including space reserved for the MD5 sum. */
5428 fprintf (module_fp, "GFORTRAN module version '%s' created from %s\n"
5429 "MD5:", MOD_VERSION, gfc_source_file);
5430 fgetpos (module_fp, &md5_pos);
5431 fputs ("00000000000000000000000000000000 -- "
5432 "If you edit this, you'll get what you deserve.\n\n", module_fp);
5434 /* Initialize the MD5 context that will be used for output. */
5435 md5_init_ctx (&ctx);
5437 /* Write the module itself. */
5439 module_name = gfc_get_string (name);
5445 free_pi_tree (pi_root);
5450 /* Write the MD5 sum to the header of the module file. */
5451 md5_finish_ctx (&ctx, md5_new);
5452 fsetpos (module_fp, &md5_pos);
5453 for (n = 0; n < 16; n++)
5454 fprintf (module_fp, "%02x", md5_new[n]);
5456 if (fclose (module_fp))
5457 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
5458 filename_tmp, xstrerror (errno));
5460 /* Read the MD5 from the header of the old module file and compare. */
5461 if (read_md5_from_module_file (filename, md5_old) != 0
5462 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
5464 /* Module file have changed, replace the old one. */
5465 if (unlink (filename) && errno != ENOENT)
5466 gfc_fatal_error ("Can't delete module file '%s': %s", filename,
5468 if (rename (filename_tmp, filename))
5469 gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
5470 filename_tmp, filename, xstrerror (errno));
5474 if (unlink (filename_tmp))
5475 gfc_fatal_error ("Can't delete temporary module file '%s': %s",
5476 filename_tmp, xstrerror (errno));
5482 create_intrinsic_function (const char *name, gfc_isym_id id,
5483 const char *modname, intmod_id module)
5485 gfc_intrinsic_sym *isym;
5486 gfc_symtree *tmp_symtree;
5489 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5492 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5494 gfc_error ("Symbol '%s' already declared", name);
5497 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5498 sym = tmp_symtree->n.sym;
5500 isym = gfc_intrinsic_function_by_id (id);
5503 sym->attr.flavor = FL_PROCEDURE;
5504 sym->attr.intrinsic = 1;
5506 sym->module = gfc_get_string (modname);
5507 sym->attr.use_assoc = 1;
5508 sym->from_intmod = module;
5509 sym->intmod_sym_id = id;
5513 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
5514 the current namespace for all named constants, pointer types, and
5515 procedures in the module unless the only clause was used or a rename
5516 list was provided. */
5519 import_iso_c_binding_module (void)
5521 gfc_symbol *mod_sym = NULL;
5522 gfc_symtree *mod_symtree = NULL;
5523 const char *iso_c_module_name = "__iso_c_binding";
5527 /* Look only in the current namespace. */
5528 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
5530 if (mod_symtree == NULL)
5532 /* symtree doesn't already exist in current namespace. */
5533 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree,
5536 if (mod_symtree != NULL)
5537 mod_sym = mod_symtree->n.sym;
5539 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
5540 "create symbol for %s", iso_c_module_name);
5542 mod_sym->attr.flavor = FL_MODULE;
5543 mod_sym->attr.intrinsic = 1;
5544 mod_sym->module = gfc_get_string (iso_c_module_name);
5545 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
5548 /* Generate the symbols for the named constants representing
5549 the kinds for intrinsic data types. */
5550 for (i = 0; i < ISOCBINDING_NUMBER; i++)
5553 for (u = gfc_rename_list; u; u = u->next)
5554 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
5563 #define NAMED_FUNCTION(a,b,c,d) \
5565 not_in_std = (gfc_option.allow_std & d) == 0; \
5568 #include "iso-c-binding.def"
5569 #undef NAMED_FUNCTION
5570 #define NAMED_INTCST(a,b,c,d) \
5572 not_in_std = (gfc_option.allow_std & d) == 0; \
5575 #include "iso-c-binding.def"
5577 #define NAMED_REALCST(a,b,c,d) \
5579 not_in_std = (gfc_option.allow_std & d) == 0; \
5582 #include "iso-c-binding.def"
5583 #undef NAMED_REALCST
5584 #define NAMED_CMPXCST(a,b,c,d) \
5586 not_in_std = (gfc_option.allow_std & d) == 0; \
5589 #include "iso-c-binding.def"
5590 #undef NAMED_CMPXCST
5598 gfc_error ("The symbol '%s', referenced at %L, is not "
5599 "in the selected standard", name, &u->where);
5605 #define NAMED_FUNCTION(a,b,c,d) \
5607 create_intrinsic_function (u->local_name[0] ? u->local_name \
5610 iso_c_module_name, \
5611 INTMOD_ISO_C_BINDING); \
5613 #include "iso-c-binding.def"
5614 #undef NAMED_FUNCTION
5617 generate_isocbinding_symbol (iso_c_module_name,
5618 (iso_c_binding_symbol) i,
5619 u->local_name[0] ? u->local_name
5624 if (!found && !only_flag)
5626 /* Skip, if the symbol is not in the enabled standard. */
5629 #define NAMED_FUNCTION(a,b,c,d) \
5631 if ((gfc_option.allow_std & d) == 0) \
5634 #include "iso-c-binding.def"
5635 #undef NAMED_FUNCTION
5637 #define NAMED_INTCST(a,b,c,d) \
5639 if ((gfc_option.allow_std & d) == 0) \
5642 #include "iso-c-binding.def"
5644 #define NAMED_REALCST(a,b,c,d) \
5646 if ((gfc_option.allow_std & d) == 0) \
5649 #include "iso-c-binding.def"
5650 #undef NAMED_REALCST
5651 #define NAMED_CMPXCST(a,b,c,d) \
5653 if ((gfc_option.allow_std & d) == 0) \
5656 #include "iso-c-binding.def"
5657 #undef NAMED_CMPXCST
5659 ; /* Not GFC_STD_* versioned. */
5664 #define NAMED_FUNCTION(a,b,c,d) \
5666 create_intrinsic_function (b, (gfc_isym_id) c, \
5667 iso_c_module_name, \
5668 INTMOD_ISO_C_BINDING); \
5670 #include "iso-c-binding.def"
5671 #undef NAMED_FUNCTION
5674 generate_isocbinding_symbol (iso_c_module_name,
5675 (iso_c_binding_symbol) i, NULL);
5680 for (u = gfc_rename_list; u; u = u->next)
5685 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5686 "module ISO_C_BINDING", u->use_name, &u->where);
5691 /* Add an integer named constant from a given module. */
5694 create_int_parameter (const char *name, int value, const char *modname,
5695 intmod_id module, int id)
5697 gfc_symtree *tmp_symtree;
5700 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5701 if (tmp_symtree != NULL)
5703 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5706 gfc_error ("Symbol '%s' already declared", name);
5709 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5710 sym = tmp_symtree->n.sym;
5712 sym->module = gfc_get_string (modname);
5713 sym->attr.flavor = FL_PARAMETER;
5714 sym->ts.type = BT_INTEGER;
5715 sym->ts.kind = gfc_default_integer_kind;
5716 sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL, value);
5717 sym->attr.use_assoc = 1;
5718 sym->from_intmod = module;
5719 sym->intmod_sym_id = id;
5723 /* Value is already contained by the array constructor, but not
5727 create_int_parameter_array (const char *name, int size, gfc_expr *value,
5728 const char *modname, intmod_id module, int id)
5730 gfc_symtree *tmp_symtree;
5733 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5734 if (tmp_symtree != NULL)
5736 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5739 gfc_error ("Symbol '%s' already declared", name);
5742 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5743 sym = tmp_symtree->n.sym;
5745 sym->module = gfc_get_string (modname);
5746 sym->attr.flavor = FL_PARAMETER;
5747 sym->ts.type = BT_INTEGER;
5748 sym->ts.kind = gfc_default_integer_kind;
5749 sym->attr.use_assoc = 1;
5750 sym->from_intmod = module;
5751 sym->intmod_sym_id = id;
5752 sym->attr.dimension = 1;
5753 sym->as = gfc_get_array_spec ();
5755 sym->as->type = AS_EXPLICIT;
5756 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
5757 sym->as->upper[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, size);
5760 sym->value->shape = gfc_get_shape (1);
5761 mpz_init_set_ui (sym->value->shape[0], size);
5765 /* Add an derived type for a given module. */
5768 create_derived_type (const char *name, const char *modname,
5769 intmod_id module, int id)
5771 gfc_symtree *tmp_symtree;
5772 gfc_symbol *sym, *dt_sym;
5773 gfc_interface *intr, *head;
5775 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5776 if (tmp_symtree != NULL)
5778 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5781 gfc_error ("Symbol '%s' already declared", name);
5784 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5785 sym = tmp_symtree->n.sym;
5786 sym->module = gfc_get_string (modname);
5787 sym->from_intmod = module;
5788 sym->intmod_sym_id = id;
5789 sym->attr.flavor = FL_PROCEDURE;
5790 sym->attr.function = 1;
5791 sym->attr.generic = 1;
5793 gfc_get_sym_tree (dt_upper_string (sym->name),
5794 gfc_current_ns, &tmp_symtree, false);
5795 dt_sym = tmp_symtree->n.sym;
5796 dt_sym->name = gfc_get_string (sym->name);
5797 dt_sym->attr.flavor = FL_DERIVED;
5798 dt_sym->attr.private_comp = 1;
5799 dt_sym->attr.zero_comp = 1;
5800 dt_sym->attr.use_assoc = 1;
5801 dt_sym->module = gfc_get_string (modname);
5802 dt_sym->from_intmod = module;
5803 dt_sym->intmod_sym_id = id;
5805 head = sym->generic;
5806 intr = gfc_get_interface ();
5808 intr->where = gfc_current_locus;
5810 sym->generic = intr;
5811 sym->attr.if_source = IFSRC_DECL;
5815 /* USE the ISO_FORTRAN_ENV intrinsic module. */
5818 use_iso_fortran_env_module (void)
5820 static char mod[] = "iso_fortran_env";
5822 gfc_symbol *mod_sym;
5823 gfc_symtree *mod_symtree;
5827 intmod_sym symbol[] = {
5828 #define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
5829 #include "iso-fortran-env.def"
5831 #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d },
5832 #include "iso-fortran-env.def"
5833 #undef NAMED_KINDARRAY
5834 #define NAMED_DERIVED_TYPE(a,b,c,d) { a, b, 0, d },
5835 #include "iso-fortran-env.def"
5836 #undef NAMED_DERIVED_TYPE
5837 #define NAMED_FUNCTION(a,b,c,d) { a, b, c, d },
5838 #include "iso-fortran-env.def"
5839 #undef NAMED_FUNCTION
5840 { ISOFORTRANENV_INVALID, NULL, -1234, 0 } };
5843 #define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
5844 #include "iso-fortran-env.def"
5847 /* Generate the symbol for the module itself. */
5848 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
5849 if (mod_symtree == NULL)
5851 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree, false);
5852 gcc_assert (mod_symtree);
5853 mod_sym = mod_symtree->n.sym;
5855 mod_sym->attr.flavor = FL_MODULE;
5856 mod_sym->attr.intrinsic = 1;
5857 mod_sym->module = gfc_get_string (mod);
5858 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
5861 if (!mod_symtree->n.sym->attr.intrinsic)
5862 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
5863 "non-intrinsic module name used previously", mod);
5865 /* Generate the symbols for the module integer named constants. */
5867 for (i = 0; symbol[i].name; i++)
5870 for (u = gfc_rename_list; u; u = u->next)
5872 if (strcmp (symbol[i].name, u->use_name) == 0)
5877 if (gfc_notify_std (symbol[i].standard, "The symbol '%s', "
5878 "referenced at %L, is not in the selected "
5879 "standard", symbol[i].name,
5880 &u->where) == FAILURE)
5883 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5884 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5885 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
5886 "constant from intrinsic module "
5887 "ISO_FORTRAN_ENV at %L is incompatible with "
5888 "option %s", &u->where,
5889 gfc_option.flag_default_integer
5890 ? "-fdefault-integer-8"
5891 : "-fdefault-real-8");
5892 switch (symbol[i].id)
5894 #define NAMED_INTCST(a,b,c,d) \
5896 #include "iso-fortran-env.def"
5898 create_int_parameter (u->local_name[0] ? u->local_name
5900 symbol[i].value, mod,
5901 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
5904 #define NAMED_KINDARRAY(a,b,KINDS,d) \
5906 expr = gfc_get_array_expr (BT_INTEGER, \
5907 gfc_default_integer_kind,\
5909 for (j = 0; KINDS[j].kind != 0; j++) \
5910 gfc_constructor_append_expr (&expr->value.constructor, \
5911 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
5912 KINDS[j].kind), NULL); \
5913 create_int_parameter_array (u->local_name[0] ? u->local_name \
5916 INTMOD_ISO_FORTRAN_ENV, \
5919 #include "iso-fortran-env.def"
5920 #undef NAMED_KINDARRAY
5922 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
5924 #include "iso-fortran-env.def"
5925 create_derived_type (u->local_name[0] ? u->local_name
5927 mod, INTMOD_ISO_FORTRAN_ENV,
5930 #undef NAMED_DERIVED_TYPE
5932 #define NAMED_FUNCTION(a,b,c,d) \
5934 #include "iso-fortran-env.def"
5935 #undef NAMED_FUNCTION
5936 create_intrinsic_function (u->local_name[0] ? u->local_name
5938 (gfc_isym_id) symbol[i].value, mod,
5939 INTMOD_ISO_FORTRAN_ENV);
5948 if (!found && !only_flag)
5950 if ((gfc_option.allow_std & symbol[i].standard) == 0)
5953 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5954 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5955 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
5956 "from intrinsic module ISO_FORTRAN_ENV at %C is "
5957 "incompatible with option %s",
5958 gfc_option.flag_default_integer
5959 ? "-fdefault-integer-8" : "-fdefault-real-8");
5961 switch (symbol[i].id)
5963 #define NAMED_INTCST(a,b,c,d) \
5965 #include "iso-fortran-env.def"
5967 create_int_parameter (symbol[i].name, symbol[i].value, mod,
5968 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
5971 #define NAMED_KINDARRAY(a,b,KINDS,d) \
5973 expr = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, \
5975 for (j = 0; KINDS[j].kind != 0; j++) \
5976 gfc_constructor_append_expr (&expr->value.constructor, \
5977 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
5978 KINDS[j].kind), NULL); \
5979 create_int_parameter_array (symbol[i].name, j, expr, mod, \
5980 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);\
5982 #include "iso-fortran-env.def"
5983 #undef NAMED_KINDARRAY
5985 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
5987 #include "iso-fortran-env.def"
5988 create_derived_type (symbol[i].name, mod, INTMOD_ISO_FORTRAN_ENV,
5991 #undef NAMED_DERIVED_TYPE
5993 #define NAMED_FUNCTION(a,b,c,d) \
5995 #include "iso-fortran-env.def"
5996 #undef NAMED_FUNCTION
5997 create_intrinsic_function (symbol[i].name,
5998 (gfc_isym_id) symbol[i].value, mod,
5999 INTMOD_ISO_FORTRAN_ENV);
6008 for (u = gfc_rename_list; u; u = u->next)
6013 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6014 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
6019 /* Process a USE directive. */
6022 gfc_use_module (gfc_use_list *module)
6027 gfc_symtree *mod_symtree;
6028 gfc_use_list *use_stmt;
6029 locus old_locus = gfc_current_locus;
6031 gfc_current_locus = module->where;
6032 module_name = module->module_name;
6033 gfc_rename_list = module->rename;
6034 only_flag = module->only_flag;
6036 filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
6038 strcpy (filename, module_name);
6039 strcat (filename, MODULE_EXTENSION);
6041 /* First, try to find an non-intrinsic module, unless the USE statement
6042 specified that the module is intrinsic. */
6044 if (!module->intrinsic)
6045 module_fp = gfc_open_included_file (filename, true, true);
6047 /* Then, see if it's an intrinsic one, unless the USE statement
6048 specified that the module is non-intrinsic. */
6049 if (module_fp == NULL && !module->non_intrinsic)
6051 if (strcmp (module_name, "iso_fortran_env") == 0
6052 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
6053 "intrinsic module at %C") != FAILURE)
6055 use_iso_fortran_env_module ();
6056 gfc_current_locus = old_locus;
6057 module->intrinsic = true;
6061 if (strcmp (module_name, "iso_c_binding") == 0
6062 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
6063 "ISO_C_BINDING module at %C") != FAILURE)
6065 import_iso_c_binding_module();
6066 gfc_current_locus = old_locus;
6067 module->intrinsic = true;
6071 module_fp = gfc_open_intrinsic_module (filename);
6073 if (module_fp == NULL && module->intrinsic)
6074 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
6078 if (module_fp == NULL)
6079 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6080 filename, xstrerror (errno));
6082 /* Check that we haven't already USEd an intrinsic module with the
6085 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
6086 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
6087 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
6088 "intrinsic module name used previously", module_name);
6095 /* Skip the first two lines of the module, after checking that this is
6096 a gfortran module file. */
6102 bad_module ("Unexpected end of module");
6105 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
6106 || (start == 2 && strcmp (atom_name, " module") != 0))
6107 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
6111 if (strcmp (atom_name, " version") != 0
6112 || module_char () != ' '
6113 || parse_atom () != ATOM_STRING)
6114 gfc_fatal_error ("Parse error when checking module version"
6115 " for file '%s' opened at %C", filename);
6117 if (strcmp (atom_string, MOD_VERSION))
6119 gfc_fatal_error ("Wrong module version '%s' (expected '%s') "
6120 "for file '%s' opened at %C", atom_string,
6121 MOD_VERSION, filename);
6131 /* Make sure we're not reading the same module that we may be building. */
6132 for (p = gfc_state_stack; p; p = p->previous)
6133 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
6134 gfc_fatal_error ("Can't USE the same module we're building!");
6137 init_true_name_tree ();
6141 free_true_name (true_name_root);
6142 true_name_root = NULL;
6144 free_pi_tree (pi_root);
6149 use_stmt = gfc_get_use_list ();
6150 *use_stmt = *module;
6151 use_stmt->next = gfc_current_ns->use_stmts;
6152 gfc_current_ns->use_stmts = use_stmt;
6154 gfc_current_locus = old_locus;
6158 /* Remove duplicated intrinsic operators from the rename list. */
6161 rename_list_remove_duplicate (gfc_use_rename *list)
6163 gfc_use_rename *seek, *last;
6165 for (; list; list = list->next)
6166 if (list->op != INTRINSIC_USER && list->op != INTRINSIC_NONE)
6169 for (seek = list->next; seek; seek = last->next)
6171 if (list->op == seek->op)
6173 last->next = seek->next;
6183 /* Process all USE directives. */
6186 gfc_use_modules (void)
6188 gfc_use_list *next, *seek, *last;
6190 for (next = module_list; next; next = next->next)
6192 bool non_intrinsic = next->non_intrinsic;
6193 bool intrinsic = next->intrinsic;
6194 bool neither = !non_intrinsic && !intrinsic;
6196 for (seek = next->next; seek; seek = seek->next)
6198 if (next->module_name != seek->module_name)
6201 if (seek->non_intrinsic)
6202 non_intrinsic = true;
6203 else if (seek->intrinsic)
6209 if (intrinsic && neither && !non_intrinsic)
6214 filename = XALLOCAVEC (char,
6215 strlen (next->module_name)
6216 + strlen (MODULE_EXTENSION) + 1);
6217 strcpy (filename, next->module_name);
6218 strcat (filename, MODULE_EXTENSION);
6219 fp = gfc_open_included_file (filename, true, true);
6222 non_intrinsic = true;
6228 for (seek = next->next; seek; seek = last->next)
6230 if (next->module_name != seek->module_name)
6236 if ((!next->intrinsic && !seek->intrinsic)
6237 || (next->intrinsic && seek->intrinsic)
6240 if (!seek->only_flag)
6241 next->only_flag = false;
6244 gfc_use_rename *r = seek->rename;
6247 r->next = next->rename;
6248 next->rename = seek->rename;
6250 last->next = seek->next;
6258 for (; module_list; module_list = next)
6260 next = module_list->next;
6261 rename_list_remove_duplicate (module_list->rename);
6262 gfc_use_module (module_list);
6263 if (module_list->intrinsic)
6264 free_rename (module_list->rename);
6267 gfc_rename_list = NULL;
6272 gfc_free_use_stmts (gfc_use_list *use_stmts)
6275 for (; use_stmts; use_stmts = next)
6277 gfc_use_rename *next_rename;
6279 for (; use_stmts->rename; use_stmts->rename = next_rename)
6281 next_rename = use_stmts->rename->next;
6282 free (use_stmts->rename);
6284 next = use_stmts->next;
6291 gfc_module_init_2 (void)
6293 last_atom = ATOM_LPAREN;
6294 gfc_rename_list = NULL;
6300 gfc_module_done_2 (void)
6302 free_rename (gfc_rename_list);
6303 gfc_rename_list = NULL;