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 && strcmp (st->n.sym->name, info->u.rsym.true_name) == 0
4646 && st->n.sym->module != NULL
4647 && strcmp (st->n.sym->module, info->u.rsym.module) == 0)
4649 info->u.rsym.symtree = st;
4650 info->u.rsym.sym = st->n.sym;
4655 /* If a symbol of the same name and module exists already,
4656 this symbol, which is not in an ONLY clause, must not be
4657 added to the namespace(11.3.2). Note that find_symbol
4658 only returns the first occurrence that it finds. */
4659 if (!only_flag && !info->u.rsym.renamed
4660 && strcmp (name, module_name) != 0
4661 && find_symbol (gfc_current_ns->sym_root, name,
4665 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4669 /* Check for ambiguous symbols. */
4670 if (check_for_ambiguous (st->n.sym, info))
4673 info->u.rsym.symtree = st;
4677 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4679 /* Create a symtree node in the current namespace for this
4681 st = check_unique_name (p)
4682 ? gfc_get_unique_symtree (gfc_current_ns)
4683 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
4684 st->ambiguous = ambiguous;
4686 sym = info->u.rsym.sym;
4688 /* Create a symbol node if it doesn't already exist. */
4691 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
4693 info->u.rsym.sym->name = dt_lower_string (info->u.rsym.true_name);
4694 sym = info->u.rsym.sym;
4695 sym->module = gfc_get_string (info->u.rsym.module);
4697 if (info->u.rsym.binding_label)
4698 sym->binding_label =
4699 IDENTIFIER_POINTER (get_identifier
4700 (info->u.rsym.binding_label));
4706 if (strcmp (name, p) != 0)
4707 sym->attr.use_rename = 1;
4710 || (strncmp (name, "__vtab_", 5) != 0
4711 && strncmp (name, "__vtype_", 6) != 0))
4712 sym->attr.use_only = only_flag;
4714 /* Store the symtree pointing to this symbol. */
4715 info->u.rsym.symtree = st;
4717 if (info->u.rsym.state == UNUSED)
4718 info->u.rsym.state = NEEDED;
4719 info->u.rsym.referenced = 1;
4726 /* Load intrinsic operator interfaces. */
4727 set_module_locus (&operator_interfaces);
4730 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4732 if (i == INTRINSIC_USER)
4737 u = find_use_operator ((gfc_intrinsic_op) i);
4748 mio_interface (&gfc_current_ns->op[i]);
4749 if (u && !gfc_current_ns->op[i])
4755 /* Load generic and user operator interfaces. These must follow the
4756 loading of symtree because otherwise symbols can be marked as
4759 set_module_locus (&user_operators);
4761 load_operator_interfaces ();
4762 load_generic_interfaces ();
4767 /* At this point, we read those symbols that are needed but haven't
4768 been loaded yet. If one symbol requires another, the other gets
4769 marked as NEEDED if its previous state was UNUSED. */
4771 while (load_needed (pi_root));
4773 /* Make sure all elements of the rename-list were found in the module. */
4775 for (u = gfc_rename_list; u; u = u->next)
4780 if (u->op == INTRINSIC_NONE)
4782 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
4783 u->use_name, &u->where, module_name);
4787 if (u->op == INTRINSIC_USER)
4789 gfc_error ("User operator '%s' referenced at %L not found "
4790 "in module '%s'", u->use_name, &u->where, module_name);
4794 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4795 "in module '%s'", gfc_op2string (u->op), &u->where,
4799 /* Now we should be in a position to fill f2k_derived with derived type
4800 extensions, since everything has been loaded. */
4801 set_module_locus (&extensions);
4802 load_derived_extensions ();
4804 /* Clean up symbol nodes that were never loaded, create references
4805 to hidden symbols. */
4807 read_cleanup (pi_root);
4811 /* Given an access type that is specific to an entity and the default
4812 access, return nonzero if the entity is publicly accessible. If the
4813 element is declared as PUBLIC, then it is public; if declared
4814 PRIVATE, then private, and otherwise it is public unless the default
4815 access in this context has been declared PRIVATE. */
4818 check_access (gfc_access specific_access, gfc_access default_access)
4820 if (specific_access == ACCESS_PUBLIC)
4822 if (specific_access == ACCESS_PRIVATE)
4825 if (gfc_option.flag_module_private)
4826 return default_access == ACCESS_PUBLIC;
4828 return default_access != ACCESS_PRIVATE;
4833 gfc_check_symbol_access (gfc_symbol *sym)
4835 if (sym->attr.vtab || sym->attr.vtype)
4838 return check_access (sym->attr.access, sym->ns->default_access);
4842 /* A structure to remember which commons we've already written. */
4844 struct written_common
4846 BBT_HEADER(written_common);
4847 const char *name, *label;
4850 static struct written_common *written_commons = NULL;
4852 /* Comparison function used for balancing the binary tree. */
4855 compare_written_commons (void *a1, void *b1)
4857 const char *aname = ((struct written_common *) a1)->name;
4858 const char *alabel = ((struct written_common *) a1)->label;
4859 const char *bname = ((struct written_common *) b1)->name;
4860 const char *blabel = ((struct written_common *) b1)->label;
4861 int c = strcmp (aname, bname);
4863 return (c != 0 ? c : strcmp (alabel, blabel));
4866 /* Free a list of written commons. */
4869 free_written_common (struct written_common *w)
4875 free_written_common (w->left);
4877 free_written_common (w->right);
4882 /* Write a common block to the module -- recursive helper function. */
4885 write_common_0 (gfc_symtree *st, bool this_module)
4891 struct written_common *w;
4892 bool write_me = true;
4897 write_common_0 (st->left, this_module);
4899 /* We will write out the binding label, or "" if no label given. */
4900 name = st->n.common->name;
4902 label = (p->is_bind_c && p->binding_label) ? p->binding_label : "";
4904 /* Check if we've already output this common. */
4905 w = written_commons;
4908 int c = strcmp (name, w->name);
4909 c = (c != 0 ? c : strcmp (label, w->label));
4913 w = (c < 0) ? w->left : w->right;
4916 if (this_module && p->use_assoc)
4921 /* Write the common to the module. */
4923 mio_pool_string (&name);
4925 mio_symbol_ref (&p->head);
4926 flags = p->saved ? 1 : 0;
4927 if (p->threadprivate)
4929 mio_integer (&flags);
4931 /* Write out whether the common block is bind(c) or not. */
4932 mio_integer (&(p->is_bind_c));
4934 mio_pool_string (&label);
4937 /* Record that we have written this common. */
4938 w = XCNEW (struct written_common);
4941 gfc_insert_bbt (&written_commons, w, compare_written_commons);
4944 write_common_0 (st->right, this_module);
4948 /* Write a common, by initializing the list of written commons, calling
4949 the recursive function write_common_0() and cleaning up afterwards. */
4952 write_common (gfc_symtree *st)
4954 written_commons = NULL;
4955 write_common_0 (st, true);
4956 write_common_0 (st, false);
4957 free_written_common (written_commons);
4958 written_commons = NULL;
4962 /* Write the blank common block to the module. */
4965 write_blank_common (void)
4967 const char * name = BLANK_COMMON_NAME;
4969 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
4970 this, but it hasn't been checked. Just making it so for now. */
4973 if (gfc_current_ns->blank_common.head == NULL)
4978 mio_pool_string (&name);
4980 mio_symbol_ref (&gfc_current_ns->blank_common.head);
4981 saved = gfc_current_ns->blank_common.saved;
4982 mio_integer (&saved);
4984 /* Write out whether the common block is bind(c) or not. */
4985 mio_integer (&is_bind_c);
4987 /* Write out an empty binding label. */
4988 write_atom (ATOM_STRING, "");
4994 /* Write equivalences to the module. */
5003 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
5007 for (e = eq; e; e = e->eq)
5009 if (e->module == NULL)
5010 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
5011 mio_allocated_string (e->module);
5012 mio_expr (&e->expr);
5021 /* Write derived type extensions to the module. */
5024 write_dt_extensions (gfc_symtree *st)
5026 if (!gfc_check_symbol_access (st->n.sym))
5028 if (!(st->n.sym->ns && st->n.sym->ns->proc_name
5029 && st->n.sym->ns->proc_name->attr.flavor == FL_MODULE))
5033 mio_pool_string (&st->name);
5034 if (st->n.sym->module != NULL)
5035 mio_pool_string (&st->n.sym->module);
5038 char name[GFC_MAX_SYMBOL_LEN + 1];
5039 if (iomode == IO_OUTPUT)
5040 strcpy (name, module_name);
5041 mio_internal_string (name);
5042 if (iomode == IO_INPUT)
5043 module_name = gfc_get_string (name);
5049 write_derived_extensions (gfc_symtree *st)
5051 if (!((st->n.sym->attr.flavor == FL_DERIVED)
5052 && (st->n.sym->f2k_derived != NULL)
5053 && (st->n.sym->f2k_derived->sym_root != NULL)))
5057 mio_symbol_ref (&(st->n.sym));
5058 gfc_traverse_symtree (st->n.sym->f2k_derived->sym_root,
5059 write_dt_extensions);
5064 /* Write a symbol to the module. */
5067 write_symbol (int n, gfc_symbol *sym)
5071 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
5072 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
5076 if (sym->attr.flavor == FL_DERIVED)
5079 name = dt_upper_string (sym->name);
5080 mio_pool_string (&name);
5083 mio_pool_string (&sym->name);
5085 mio_pool_string (&sym->module);
5086 if ((sym->attr.is_bind_c || sym->attr.is_iso_c) && sym->binding_label)
5088 label = sym->binding_label;
5089 mio_pool_string (&label);
5092 write_atom (ATOM_STRING, "");
5094 mio_pointer_ref (&sym->ns);
5101 /* Recursive traversal function to write the initial set of symbols to
5102 the module. We check to see if the symbol should be written
5103 according to the access specification. */
5106 write_symbol0 (gfc_symtree *st)
5110 bool dont_write = false;
5115 write_symbol0 (st->left);
5118 if (sym->module == NULL)
5119 sym->module = module_name;
5121 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5122 && !sym->attr.subroutine && !sym->attr.function)
5125 if (!gfc_check_symbol_access (sym))
5130 p = get_pointer (sym);
5131 if (p->type == P_UNKNOWN)
5134 if (p->u.wsym.state != WRITTEN)
5136 write_symbol (p->integer, sym);
5137 p->u.wsym.state = WRITTEN;
5141 write_symbol0 (st->right);
5145 /* Recursive traversal function to write the secondary set of symbols
5146 to the module file. These are symbols that were not public yet are
5147 needed by the public symbols or another dependent symbol. The act
5148 of writing a symbol can modify the pointer_info tree, so we cease
5149 traversal if we find a symbol to write. We return nonzero if a
5150 symbol was written and pass that information upwards. */
5153 write_symbol1 (pointer_info *p)
5160 result = write_symbol1 (p->left);
5162 if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
5164 p->u.wsym.state = WRITTEN;
5165 write_symbol (p->integer, p->u.wsym.sym);
5169 result |= write_symbol1 (p->right);
5174 /* Write operator interfaces associated with a symbol. */
5177 write_operator (gfc_user_op *uop)
5179 static char nullstring[] = "";
5180 const char *p = nullstring;
5182 if (uop->op == NULL || !check_access (uop->access, uop->ns->default_access))
5185 mio_symbol_interface (&uop->name, &p, &uop->op);
5189 /* Write generic interfaces from the namespace sym_root. */
5192 write_generic (gfc_symtree *st)
5199 write_generic (st->left);
5200 write_generic (st->right);
5203 if (!sym || check_unique_name (st->name))
5206 if (sym->generic == NULL || !gfc_check_symbol_access (sym))
5209 if (sym->module == NULL)
5210 sym->module = module_name;
5212 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
5217 write_symtree (gfc_symtree *st)
5224 /* A symbol in an interface body must not be visible in the
5226 if (sym->ns != gfc_current_ns
5227 && sym->ns->proc_name
5228 && sym->ns->proc_name->attr.if_source == IFSRC_IFBODY)
5231 if (!gfc_check_symbol_access (sym)
5232 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5233 && !sym->attr.subroutine && !sym->attr.function))
5236 if (check_unique_name (st->name))
5239 p = find_pointer (sym);
5241 gfc_internal_error ("write_symtree(): Symbol not written");
5243 mio_pool_string (&st->name);
5244 mio_integer (&st->ambiguous);
5245 mio_integer (&p->integer);
5254 /* Write the operator interfaces. */
5257 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
5259 if (i == INTRINSIC_USER)
5262 mio_interface (check_access (gfc_current_ns->operator_access[i],
5263 gfc_current_ns->default_access)
5264 ? &gfc_current_ns->op[i] : NULL);
5272 gfc_traverse_user_op (gfc_current_ns, write_operator);
5278 write_generic (gfc_current_ns->sym_root);
5284 write_blank_common ();
5285 write_common (gfc_current_ns->common_root);
5297 gfc_traverse_symtree (gfc_current_ns->sym_root,
5298 write_derived_extensions);
5303 /* Write symbol information. First we traverse all symbols in the
5304 primary namespace, writing those that need to be written.
5305 Sometimes writing one symbol will cause another to need to be
5306 written. A list of these symbols ends up on the write stack, and
5307 we end by popping the bottom of the stack and writing the symbol
5308 until the stack is empty. */
5312 write_symbol0 (gfc_current_ns->sym_root);
5313 while (write_symbol1 (pi_root))
5322 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
5327 /* Read a MD5 sum from the header of a module file. If the file cannot
5328 be opened, or we have any other error, we return -1. */
5331 read_md5_from_module_file (const char * filename, unsigned char md5[16])
5337 /* Open the file. */
5338 if ((file = fopen (filename, "r")) == NULL)
5341 /* Read the first line. */
5342 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5348 /* The file also needs to be overwritten if the version number changed. */
5349 n = strlen ("GFORTRAN module version '" MOD_VERSION "' created");
5350 if (strncmp (buf, "GFORTRAN module version '" MOD_VERSION "' created", n) != 0)
5356 /* Read a second line. */
5357 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5363 /* Close the file. */
5366 /* If the header is not what we expect, or is too short, bail out. */
5367 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
5370 /* Now, we have a real MD5, read it into the array. */
5371 for (n = 0; n < 16; n++)
5375 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
5385 /* Given module, dump it to disk. If there was an error while
5386 processing the module, dump_flag will be set to zero and we delete
5387 the module file, even if it was already there. */
5390 gfc_dump_module (const char *name, int dump_flag)
5393 char *filename, *filename_tmp;
5395 unsigned char md5_new[16], md5_old[16];
5397 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
5398 if (gfc_option.module_dir != NULL)
5400 n += strlen (gfc_option.module_dir);
5401 filename = (char *) alloca (n);
5402 strcpy (filename, gfc_option.module_dir);
5403 strcat (filename, name);
5407 filename = (char *) alloca (n);
5408 strcpy (filename, name);
5410 strcat (filename, MODULE_EXTENSION);
5412 /* Name of the temporary file used to write the module. */
5413 filename_tmp = (char *) alloca (n + 1);
5414 strcpy (filename_tmp, filename);
5415 strcat (filename_tmp, "0");
5417 /* There was an error while processing the module. We delete the
5418 module file, even if it was already there. */
5425 if (gfc_cpp_makedep ())
5426 gfc_cpp_add_target (filename);
5428 /* Write the module to the temporary file. */
5429 module_fp = fopen (filename_tmp, "w");
5430 if (module_fp == NULL)
5431 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
5432 filename_tmp, xstrerror (errno));
5434 /* Write the header, including space reserved for the MD5 sum. */
5435 fprintf (module_fp, "GFORTRAN module version '%s' created from %s\n"
5436 "MD5:", MOD_VERSION, gfc_source_file);
5437 fgetpos (module_fp, &md5_pos);
5438 fputs ("00000000000000000000000000000000 -- "
5439 "If you edit this, you'll get what you deserve.\n\n", module_fp);
5441 /* Initialize the MD5 context that will be used for output. */
5442 md5_init_ctx (&ctx);
5444 /* Write the module itself. */
5446 module_name = gfc_get_string (name);
5452 free_pi_tree (pi_root);
5457 /* Write the MD5 sum to the header of the module file. */
5458 md5_finish_ctx (&ctx, md5_new);
5459 fsetpos (module_fp, &md5_pos);
5460 for (n = 0; n < 16; n++)
5461 fprintf (module_fp, "%02x", md5_new[n]);
5463 if (fclose (module_fp))
5464 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
5465 filename_tmp, xstrerror (errno));
5467 /* Read the MD5 from the header of the old module file and compare. */
5468 if (read_md5_from_module_file (filename, md5_old) != 0
5469 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
5471 /* Module file have changed, replace the old one. */
5472 if (unlink (filename) && errno != ENOENT)
5473 gfc_fatal_error ("Can't delete module file '%s': %s", filename,
5475 if (rename (filename_tmp, filename))
5476 gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
5477 filename_tmp, filename, xstrerror (errno));
5481 if (unlink (filename_tmp))
5482 gfc_fatal_error ("Can't delete temporary module file '%s': %s",
5483 filename_tmp, xstrerror (errno));
5489 create_intrinsic_function (const char *name, gfc_isym_id id,
5490 const char *modname, intmod_id module)
5492 gfc_intrinsic_sym *isym;
5493 gfc_symtree *tmp_symtree;
5496 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5499 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5501 gfc_error ("Symbol '%s' already declared", name);
5504 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5505 sym = tmp_symtree->n.sym;
5507 isym = gfc_intrinsic_function_by_id (id);
5510 sym->attr.flavor = FL_PROCEDURE;
5511 sym->attr.intrinsic = 1;
5513 sym->module = gfc_get_string (modname);
5514 sym->attr.use_assoc = 1;
5515 sym->from_intmod = module;
5516 sym->intmod_sym_id = id;
5520 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
5521 the current namespace for all named constants, pointer types, and
5522 procedures in the module unless the only clause was used or a rename
5523 list was provided. */
5526 import_iso_c_binding_module (void)
5528 gfc_symbol *mod_sym = NULL;
5529 gfc_symtree *mod_symtree = NULL;
5530 const char *iso_c_module_name = "__iso_c_binding";
5534 /* Look only in the current namespace. */
5535 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
5537 if (mod_symtree == NULL)
5539 /* symtree doesn't already exist in current namespace. */
5540 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree,
5543 if (mod_symtree != NULL)
5544 mod_sym = mod_symtree->n.sym;
5546 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
5547 "create symbol for %s", iso_c_module_name);
5549 mod_sym->attr.flavor = FL_MODULE;
5550 mod_sym->attr.intrinsic = 1;
5551 mod_sym->module = gfc_get_string (iso_c_module_name);
5552 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
5555 /* Generate the symbols for the named constants representing
5556 the kinds for intrinsic data types. */
5557 for (i = 0; i < ISOCBINDING_NUMBER; i++)
5560 for (u = gfc_rename_list; u; u = u->next)
5561 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
5570 #define NAMED_FUNCTION(a,b,c,d) \
5572 not_in_std = (gfc_option.allow_std & d) == 0; \
5575 #include "iso-c-binding.def"
5576 #undef NAMED_FUNCTION
5577 #define NAMED_INTCST(a,b,c,d) \
5579 not_in_std = (gfc_option.allow_std & d) == 0; \
5582 #include "iso-c-binding.def"
5584 #define NAMED_REALCST(a,b,c,d) \
5586 not_in_std = (gfc_option.allow_std & d) == 0; \
5589 #include "iso-c-binding.def"
5590 #undef NAMED_REALCST
5591 #define NAMED_CMPXCST(a,b,c,d) \
5593 not_in_std = (gfc_option.allow_std & d) == 0; \
5596 #include "iso-c-binding.def"
5597 #undef NAMED_CMPXCST
5605 gfc_error ("The symbol '%s', referenced at %L, is not "
5606 "in the selected standard", name, &u->where);
5612 #define NAMED_FUNCTION(a,b,c,d) \
5614 create_intrinsic_function (u->local_name[0] ? u->local_name \
5617 iso_c_module_name, \
5618 INTMOD_ISO_C_BINDING); \
5620 #include "iso-c-binding.def"
5621 #undef NAMED_FUNCTION
5624 generate_isocbinding_symbol (iso_c_module_name,
5625 (iso_c_binding_symbol) i,
5626 u->local_name[0] ? u->local_name
5631 if (!found && !only_flag)
5633 /* Skip, if the symbol is not in the enabled standard. */
5636 #define NAMED_FUNCTION(a,b,c,d) \
5638 if ((gfc_option.allow_std & d) == 0) \
5641 #include "iso-c-binding.def"
5642 #undef NAMED_FUNCTION
5644 #define NAMED_INTCST(a,b,c,d) \
5646 if ((gfc_option.allow_std & d) == 0) \
5649 #include "iso-c-binding.def"
5651 #define NAMED_REALCST(a,b,c,d) \
5653 if ((gfc_option.allow_std & d) == 0) \
5656 #include "iso-c-binding.def"
5657 #undef NAMED_REALCST
5658 #define NAMED_CMPXCST(a,b,c,d) \
5660 if ((gfc_option.allow_std & d) == 0) \
5663 #include "iso-c-binding.def"
5664 #undef NAMED_CMPXCST
5666 ; /* Not GFC_STD_* versioned. */
5671 #define NAMED_FUNCTION(a,b,c,d) \
5673 create_intrinsic_function (b, (gfc_isym_id) c, \
5674 iso_c_module_name, \
5675 INTMOD_ISO_C_BINDING); \
5677 #include "iso-c-binding.def"
5678 #undef NAMED_FUNCTION
5681 generate_isocbinding_symbol (iso_c_module_name,
5682 (iso_c_binding_symbol) i, NULL);
5687 for (u = gfc_rename_list; u; u = u->next)
5692 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5693 "module ISO_C_BINDING", u->use_name, &u->where);
5698 /* Add an integer named constant from a given module. */
5701 create_int_parameter (const char *name, int value, const char *modname,
5702 intmod_id module, int id)
5704 gfc_symtree *tmp_symtree;
5707 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5708 if (tmp_symtree != NULL)
5710 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5713 gfc_error ("Symbol '%s' already declared", name);
5716 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5717 sym = tmp_symtree->n.sym;
5719 sym->module = gfc_get_string (modname);
5720 sym->attr.flavor = FL_PARAMETER;
5721 sym->ts.type = BT_INTEGER;
5722 sym->ts.kind = gfc_default_integer_kind;
5723 sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL, value);
5724 sym->attr.use_assoc = 1;
5725 sym->from_intmod = module;
5726 sym->intmod_sym_id = id;
5730 /* Value is already contained by the array constructor, but not
5734 create_int_parameter_array (const char *name, int size, gfc_expr *value,
5735 const char *modname, intmod_id module, int id)
5737 gfc_symtree *tmp_symtree;
5740 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5741 if (tmp_symtree != NULL)
5743 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5746 gfc_error ("Symbol '%s' already declared", name);
5749 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5750 sym = tmp_symtree->n.sym;
5752 sym->module = gfc_get_string (modname);
5753 sym->attr.flavor = FL_PARAMETER;
5754 sym->ts.type = BT_INTEGER;
5755 sym->ts.kind = gfc_default_integer_kind;
5756 sym->attr.use_assoc = 1;
5757 sym->from_intmod = module;
5758 sym->intmod_sym_id = id;
5759 sym->attr.dimension = 1;
5760 sym->as = gfc_get_array_spec ();
5762 sym->as->type = AS_EXPLICIT;
5763 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
5764 sym->as->upper[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, size);
5767 sym->value->shape = gfc_get_shape (1);
5768 mpz_init_set_ui (sym->value->shape[0], size);
5772 /* Add an derived type for a given module. */
5775 create_derived_type (const char *name, const char *modname,
5776 intmod_id module, int id)
5778 gfc_symtree *tmp_symtree;
5779 gfc_symbol *sym, *dt_sym;
5780 gfc_interface *intr, *head;
5782 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5783 if (tmp_symtree != NULL)
5785 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5788 gfc_error ("Symbol '%s' already declared", name);
5791 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5792 sym = tmp_symtree->n.sym;
5793 sym->module = gfc_get_string (modname);
5794 sym->from_intmod = module;
5795 sym->intmod_sym_id = id;
5796 sym->attr.flavor = FL_PROCEDURE;
5797 sym->attr.function = 1;
5798 sym->attr.generic = 1;
5800 gfc_get_sym_tree (dt_upper_string (sym->name),
5801 gfc_current_ns, &tmp_symtree, false);
5802 dt_sym = tmp_symtree->n.sym;
5803 dt_sym->name = gfc_get_string (sym->name);
5804 dt_sym->attr.flavor = FL_DERIVED;
5805 dt_sym->attr.private_comp = 1;
5806 dt_sym->attr.zero_comp = 1;
5807 dt_sym->attr.use_assoc = 1;
5808 dt_sym->module = gfc_get_string (modname);
5809 dt_sym->from_intmod = module;
5810 dt_sym->intmod_sym_id = id;
5812 head = sym->generic;
5813 intr = gfc_get_interface ();
5815 intr->where = gfc_current_locus;
5817 sym->generic = intr;
5818 sym->attr.if_source = IFSRC_DECL;
5822 /* USE the ISO_FORTRAN_ENV intrinsic module. */
5825 use_iso_fortran_env_module (void)
5827 static char mod[] = "iso_fortran_env";
5829 gfc_symbol *mod_sym;
5830 gfc_symtree *mod_symtree;
5834 intmod_sym symbol[] = {
5835 #define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
5836 #include "iso-fortran-env.def"
5838 #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d },
5839 #include "iso-fortran-env.def"
5840 #undef NAMED_KINDARRAY
5841 #define NAMED_DERIVED_TYPE(a,b,c,d) { a, b, 0, d },
5842 #include "iso-fortran-env.def"
5843 #undef NAMED_DERIVED_TYPE
5844 #define NAMED_FUNCTION(a,b,c,d) { a, b, c, d },
5845 #include "iso-fortran-env.def"
5846 #undef NAMED_FUNCTION
5847 { ISOFORTRANENV_INVALID, NULL, -1234, 0 } };
5850 #define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
5851 #include "iso-fortran-env.def"
5854 /* Generate the symbol for the module itself. */
5855 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
5856 if (mod_symtree == NULL)
5858 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree, false);
5859 gcc_assert (mod_symtree);
5860 mod_sym = mod_symtree->n.sym;
5862 mod_sym->attr.flavor = FL_MODULE;
5863 mod_sym->attr.intrinsic = 1;
5864 mod_sym->module = gfc_get_string (mod);
5865 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
5868 if (!mod_symtree->n.sym->attr.intrinsic)
5869 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
5870 "non-intrinsic module name used previously", mod);
5872 /* Generate the symbols for the module integer named constants. */
5874 for (i = 0; symbol[i].name; i++)
5877 for (u = gfc_rename_list; u; u = u->next)
5879 if (strcmp (symbol[i].name, u->use_name) == 0)
5884 if (gfc_notify_std (symbol[i].standard, "The symbol '%s', "
5885 "referenced at %L, is not in the selected "
5886 "standard", symbol[i].name,
5887 &u->where) == FAILURE)
5890 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5891 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5892 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
5893 "constant from intrinsic module "
5894 "ISO_FORTRAN_ENV at %L is incompatible with "
5895 "option %s", &u->where,
5896 gfc_option.flag_default_integer
5897 ? "-fdefault-integer-8"
5898 : "-fdefault-real-8");
5899 switch (symbol[i].id)
5901 #define NAMED_INTCST(a,b,c,d) \
5903 #include "iso-fortran-env.def"
5905 create_int_parameter (u->local_name[0] ? u->local_name
5907 symbol[i].value, mod,
5908 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
5911 #define NAMED_KINDARRAY(a,b,KINDS,d) \
5913 expr = gfc_get_array_expr (BT_INTEGER, \
5914 gfc_default_integer_kind,\
5916 for (j = 0; KINDS[j].kind != 0; j++) \
5917 gfc_constructor_append_expr (&expr->value.constructor, \
5918 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
5919 KINDS[j].kind), NULL); \
5920 create_int_parameter_array (u->local_name[0] ? u->local_name \
5923 INTMOD_ISO_FORTRAN_ENV, \
5926 #include "iso-fortran-env.def"
5927 #undef NAMED_KINDARRAY
5929 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
5931 #include "iso-fortran-env.def"
5932 create_derived_type (u->local_name[0] ? u->local_name
5934 mod, INTMOD_ISO_FORTRAN_ENV,
5937 #undef NAMED_DERIVED_TYPE
5939 #define NAMED_FUNCTION(a,b,c,d) \
5941 #include "iso-fortran-env.def"
5942 #undef NAMED_FUNCTION
5943 create_intrinsic_function (u->local_name[0] ? u->local_name
5945 (gfc_isym_id) symbol[i].value, mod,
5946 INTMOD_ISO_FORTRAN_ENV);
5955 if (!found && !only_flag)
5957 if ((gfc_option.allow_std & symbol[i].standard) == 0)
5960 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5961 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5962 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
5963 "from intrinsic module ISO_FORTRAN_ENV at %C is "
5964 "incompatible with option %s",
5965 gfc_option.flag_default_integer
5966 ? "-fdefault-integer-8" : "-fdefault-real-8");
5968 switch (symbol[i].id)
5970 #define NAMED_INTCST(a,b,c,d) \
5972 #include "iso-fortran-env.def"
5974 create_int_parameter (symbol[i].name, symbol[i].value, mod,
5975 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
5978 #define NAMED_KINDARRAY(a,b,KINDS,d) \
5980 expr = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, \
5982 for (j = 0; KINDS[j].kind != 0; j++) \
5983 gfc_constructor_append_expr (&expr->value.constructor, \
5984 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
5985 KINDS[j].kind), NULL); \
5986 create_int_parameter_array (symbol[i].name, j, expr, mod, \
5987 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);\
5989 #include "iso-fortran-env.def"
5990 #undef NAMED_KINDARRAY
5992 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
5994 #include "iso-fortran-env.def"
5995 create_derived_type (symbol[i].name, mod, INTMOD_ISO_FORTRAN_ENV,
5998 #undef NAMED_DERIVED_TYPE
6000 #define NAMED_FUNCTION(a,b,c,d) \
6002 #include "iso-fortran-env.def"
6003 #undef NAMED_FUNCTION
6004 create_intrinsic_function (symbol[i].name,
6005 (gfc_isym_id) symbol[i].value, mod,
6006 INTMOD_ISO_FORTRAN_ENV);
6015 for (u = gfc_rename_list; u; u = u->next)
6020 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6021 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
6026 /* Process a USE directive. */
6029 gfc_use_module (gfc_use_list *module)
6034 gfc_symtree *mod_symtree;
6035 gfc_use_list *use_stmt;
6036 locus old_locus = gfc_current_locus;
6038 gfc_current_locus = module->where;
6039 module_name = module->module_name;
6040 gfc_rename_list = module->rename;
6041 only_flag = module->only_flag;
6043 filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
6045 strcpy (filename, module_name);
6046 strcat (filename, MODULE_EXTENSION);
6048 /* First, try to find an non-intrinsic module, unless the USE statement
6049 specified that the module is intrinsic. */
6051 if (!module->intrinsic)
6052 module_fp = gfc_open_included_file (filename, true, true);
6054 /* Then, see if it's an intrinsic one, unless the USE statement
6055 specified that the module is non-intrinsic. */
6056 if (module_fp == NULL && !module->non_intrinsic)
6058 if (strcmp (module_name, "iso_fortran_env") == 0
6059 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
6060 "intrinsic module at %C") != FAILURE)
6062 use_iso_fortran_env_module ();
6063 gfc_current_locus = old_locus;
6064 module->intrinsic = true;
6068 if (strcmp (module_name, "iso_c_binding") == 0
6069 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
6070 "ISO_C_BINDING module at %C") != FAILURE)
6072 import_iso_c_binding_module();
6073 gfc_current_locus = old_locus;
6074 module->intrinsic = true;
6078 module_fp = gfc_open_intrinsic_module (filename);
6080 if (module_fp == NULL && module->intrinsic)
6081 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
6085 if (module_fp == NULL)
6086 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6087 filename, xstrerror (errno));
6089 /* Check that we haven't already USEd an intrinsic module with the
6092 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
6093 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
6094 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
6095 "intrinsic module name used previously", module_name);
6102 /* Skip the first two lines of the module, after checking that this is
6103 a gfortran module file. */
6109 bad_module ("Unexpected end of module");
6112 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
6113 || (start == 2 && strcmp (atom_name, " module") != 0))
6114 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
6118 if (strcmp (atom_name, " version") != 0
6119 || module_char () != ' '
6120 || parse_atom () != ATOM_STRING)
6121 gfc_fatal_error ("Parse error when checking module version"
6122 " for file '%s' opened at %C", filename);
6124 if (strcmp (atom_string, MOD_VERSION))
6126 gfc_fatal_error ("Wrong module version '%s' (expected '%s') "
6127 "for file '%s' opened at %C", atom_string,
6128 MOD_VERSION, filename);
6138 /* Make sure we're not reading the same module that we may be building. */
6139 for (p = gfc_state_stack; p; p = p->previous)
6140 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
6141 gfc_fatal_error ("Can't USE the same module we're building!");
6144 init_true_name_tree ();
6148 free_true_name (true_name_root);
6149 true_name_root = NULL;
6151 free_pi_tree (pi_root);
6156 use_stmt = gfc_get_use_list ();
6157 *use_stmt = *module;
6158 use_stmt->next = gfc_current_ns->use_stmts;
6159 gfc_current_ns->use_stmts = use_stmt;
6161 gfc_current_locus = old_locus;
6165 /* Remove duplicated intrinsic operators from the rename list. */
6168 rename_list_remove_duplicate (gfc_use_rename *list)
6170 gfc_use_rename *seek, *last;
6172 for (; list; list = list->next)
6173 if (list->op != INTRINSIC_USER && list->op != INTRINSIC_NONE)
6176 for (seek = list->next; seek; seek = last->next)
6178 if (list->op == seek->op)
6180 last->next = seek->next;
6190 /* Process all USE directives. */
6193 gfc_use_modules (void)
6195 gfc_use_list *next, *seek, *last;
6197 for (next = module_list; next; next = next->next)
6199 bool non_intrinsic = next->non_intrinsic;
6200 bool intrinsic = next->intrinsic;
6201 bool neither = !non_intrinsic && !intrinsic;
6203 for (seek = next->next; seek; seek = seek->next)
6205 if (next->module_name != seek->module_name)
6208 if (seek->non_intrinsic)
6209 non_intrinsic = true;
6210 else if (seek->intrinsic)
6216 if (intrinsic && neither && !non_intrinsic)
6221 filename = XALLOCAVEC (char,
6222 strlen (next->module_name)
6223 + strlen (MODULE_EXTENSION) + 1);
6224 strcpy (filename, next->module_name);
6225 strcat (filename, MODULE_EXTENSION);
6226 fp = gfc_open_included_file (filename, true, true);
6229 non_intrinsic = true;
6235 for (seek = next->next; seek; seek = last->next)
6237 if (next->module_name != seek->module_name)
6243 if ((!next->intrinsic && !seek->intrinsic)
6244 || (next->intrinsic && seek->intrinsic)
6247 if (!seek->only_flag)
6248 next->only_flag = false;
6251 gfc_use_rename *r = seek->rename;
6254 r->next = next->rename;
6255 next->rename = seek->rename;
6257 last->next = seek->next;
6265 for (; module_list; module_list = next)
6267 next = module_list->next;
6268 rename_list_remove_duplicate (module_list->rename);
6269 gfc_use_module (module_list);
6270 if (module_list->intrinsic)
6271 free_rename (module_list->rename);
6274 gfc_rename_list = NULL;
6279 gfc_free_use_stmts (gfc_use_list *use_stmts)
6282 for (; use_stmts; use_stmts = next)
6284 gfc_use_rename *next_rename;
6286 for (; use_stmts->rename; use_stmts->rename = next_rename)
6288 next_rename = use_stmts->rename->next;
6289 free (use_stmts->rename);
6291 next = use_stmts->next;
6298 gfc_module_init_2 (void)
6300 last_atom = ATOM_LPAREN;
6301 gfc_rename_list = NULL;
6307 gfc_module_done_2 (void)
6309 free_rename (gfc_rename_list);
6310 gfc_rename_list = NULL;