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"
79 #define MODULE_EXTENSION ".mod"
81 /* Don't put any single quote (') in MOD_VERSION,
82 if yout want it to be recognized. */
83 #define MOD_VERSION "8"
86 /* Structure that describes a position within a module file. */
95 /* Structure for list of symbols of intrinsic modules. */
108 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
112 /* The fixup structure lists pointers to pointers that have to
113 be updated when a pointer value becomes known. */
115 typedef struct fixup_t
118 struct fixup_t *next;
123 /* Structure for holding extra info needed for pointers being read. */
139 typedef struct pointer_info
141 BBT_HEADER (pointer_info);
145 /* The first component of each member of the union is the pointer
152 void *pointer; /* Member for doing pointer searches. */
157 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
158 enum gfc_rsym_state state;
159 int ns, referenced, renamed;
162 gfc_symtree *symtree;
163 char binding_label[GFC_MAX_SYMBOL_LEN + 1];
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);
234 /* Compare pointers when searching by pointer. Used when writing a
238 compare_pointers (void *_sn1, void *_sn2)
240 pointer_info *sn1, *sn2;
242 sn1 = (pointer_info *) _sn1;
243 sn2 = (pointer_info *) _sn2;
245 if (sn1->u.pointer < sn2->u.pointer)
247 if (sn1->u.pointer > sn2->u.pointer)
254 /* Compare integers when searching by integer. Used when reading a
258 compare_integers (void *_sn1, void *_sn2)
260 pointer_info *sn1, *sn2;
262 sn1 = (pointer_info *) _sn1;
263 sn2 = (pointer_info *) _sn2;
265 if (sn1->integer < sn2->integer)
267 if (sn1->integer > sn2->integer)
274 /* Initialize the pointer_info tree. */
283 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
285 /* Pointer 0 is the NULL pointer. */
286 p = gfc_get_pointer_info ();
291 gfc_insert_bbt (&pi_root, p, compare);
293 /* Pointer 1 is the current namespace. */
294 p = gfc_get_pointer_info ();
295 p->u.pointer = gfc_current_ns;
297 p->type = P_NAMESPACE;
299 gfc_insert_bbt (&pi_root, p, compare);
305 /* During module writing, call here with a pointer to something,
306 returning the pointer_info node. */
308 static pointer_info *
309 find_pointer (void *gp)
316 if (p->u.pointer == gp)
318 p = (gp < p->u.pointer) ? p->left : p->right;
325 /* Given a pointer while writing, returns the pointer_info tree node,
326 creating it if it doesn't exist. */
328 static pointer_info *
329 get_pointer (void *gp)
333 p = find_pointer (gp);
337 /* Pointer doesn't have an integer. Give it one. */
338 p = gfc_get_pointer_info ();
341 p->integer = symbol_number++;
343 gfc_insert_bbt (&pi_root, p, compare_pointers);
349 /* Given an integer during reading, find it in the pointer_info tree,
350 creating the node if not found. */
352 static pointer_info *
353 get_integer (int integer)
363 c = compare_integers (&t, p);
367 p = (c < 0) ? p->left : p->right;
373 p = gfc_get_pointer_info ();
374 p->integer = integer;
377 gfc_insert_bbt (&pi_root, p, compare_integers);
383 /* Recursive function to find a pointer within a tree by brute force. */
385 static pointer_info *
386 fp2 (pointer_info *p, const void *target)
393 if (p->u.pointer == target)
396 q = fp2 (p->left, target);
400 return fp2 (p->right, target);
404 /* During reading, find a pointer_info node from the pointer value.
405 This amounts to a brute-force search. */
407 static pointer_info *
408 find_pointer2 (void *p)
410 return fp2 (pi_root, p);
414 /* Resolve any fixups using a known pointer. */
417 resolve_fixups (fixup_t *f, void *gp)
430 /* Convert a string such that it starts with a lower-case character. Used
431 to convert the symtree name of a derived-type to the symbol name or to
432 the name of the associated generic function. */
435 dt_lower_string (const char *name)
437 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
438 return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name[0]),
440 return gfc_get_string (name);
444 /* Convert a string such that it starts with an upper-case character. Used to
445 return the symtree-name for a derived type; the symbol name itself and the
446 symtree/symbol name of the associated generic function start with a lower-
450 dt_upper_string (const char *name)
452 if (name[0] != (char) TOUPPER ((unsigned char) name[0]))
453 return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name[0]),
455 return gfc_get_string (name);
458 /* Call here during module reading when we know what pointer to
459 associate with an integer. Any fixups that exist are resolved at
463 associate_integer_pointer (pointer_info *p, void *gp)
465 if (p->u.pointer != NULL)
466 gfc_internal_error ("associate_integer_pointer(): Already associated");
470 resolve_fixups (p->fixup, gp);
476 /* During module reading, given an integer and a pointer to a pointer,
477 either store the pointer from an already-known value or create a
478 fixup structure in order to store things later. Returns zero if
479 the reference has been actually stored, or nonzero if the reference
480 must be fixed later (i.e., associate_integer_pointer must be called
481 sometime later. Returns the pointer_info structure. */
483 static pointer_info *
484 add_fixup (int integer, void *gp)
490 p = get_integer (integer);
492 if (p->integer == 0 || p->u.pointer != NULL)
495 *cp = (char *) p->u.pointer;
504 f->pointer = (void **) gp;
511 /*****************************************************************/
513 /* Parser related subroutines */
515 /* Free the rename list left behind by a USE statement. */
518 free_rename (gfc_use_rename *list)
520 gfc_use_rename *next;
522 for (; list; list = next)
530 /* Match a USE statement. */
535 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
536 gfc_use_rename *tail = NULL, *new_use;
537 interface_type type, type2;
540 gfc_use_list *use_list;
542 use_list = gfc_get_use_list ();
544 if (gfc_match (" , ") == MATCH_YES)
546 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
548 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
549 "nature in USE statement at %C") == FAILURE)
552 if (strcmp (module_nature, "intrinsic") == 0)
553 use_list->intrinsic = true;
556 if (strcmp (module_nature, "non_intrinsic") == 0)
557 use_list->non_intrinsic = true;
560 gfc_error ("Module nature in USE statement at %C shall "
561 "be either INTRINSIC or NON_INTRINSIC");
568 /* Help output a better error message than "Unclassifiable
570 gfc_match (" %n", module_nature);
571 if (strcmp (module_nature, "intrinsic") == 0
572 || strcmp (module_nature, "non_intrinsic") == 0)
573 gfc_error ("\"::\" was expected after module nature at %C "
574 "but was not found");
581 m = gfc_match (" ::");
582 if (m == MATCH_YES &&
583 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
584 "\"USE :: module\" at %C") == FAILURE)
589 m = gfc_match ("% ");
598 use_list->where = gfc_current_locus;
600 m = gfc_match_name (name);
607 use_list->module_name = gfc_get_string (name);
609 if (gfc_match_eos () == MATCH_YES)
612 if (gfc_match_char (',') != MATCH_YES)
615 if (gfc_match (" only :") == MATCH_YES)
616 use_list->only_flag = true;
618 if (gfc_match_eos () == MATCH_YES)
623 /* Get a new rename struct and add it to the rename list. */
624 new_use = gfc_get_use_rename ();
625 new_use->where = gfc_current_locus;
628 if (use_list->rename == NULL)
629 use_list->rename = new_use;
631 tail->next = new_use;
634 /* See what kind of interface we're dealing with. Assume it is
636 new_use->op = INTRINSIC_NONE;
637 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
642 case INTERFACE_NAMELESS:
643 gfc_error ("Missing generic specification in USE statement at %C");
646 case INTERFACE_USER_OP:
647 case INTERFACE_GENERIC:
648 m = gfc_match (" =>");
650 if (type == INTERFACE_USER_OP && m == MATCH_YES
651 && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
652 "operators in USE statements at %C")
656 if (type == INTERFACE_USER_OP)
657 new_use->op = INTRINSIC_USER;
659 if (use_list->only_flag)
662 strcpy (new_use->use_name, name);
665 strcpy (new_use->local_name, name);
666 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
671 if (m == MATCH_ERROR)
679 strcpy (new_use->local_name, name);
681 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
686 if (m == MATCH_ERROR)
690 if (strcmp (new_use->use_name, use_list->module_name) == 0
691 || strcmp (new_use->local_name, use_list->module_name) == 0)
693 gfc_error ("The name '%s' at %C has already been used as "
694 "an external module name.", use_list->module_name);
699 case INTERFACE_INTRINSIC_OP:
707 if (gfc_match_eos () == MATCH_YES)
709 if (gfc_match_char (',') != MATCH_YES)
716 gfc_use_list *last = module_list;
719 last->next = use_list;
722 module_list = use_list;
727 gfc_syntax_error (ST_USE);
730 free_rename (use_list->rename);
736 /* Given a name and a number, inst, return the inst name
737 under which to load this symbol. Returns NULL if this
738 symbol shouldn't be loaded. If inst is zero, returns
739 the number of instances of this name. If interface is
740 true, a user-defined operator is sought, otherwise only
741 non-operators are sought. */
744 find_use_name_n (const char *name, int *inst, bool interface)
747 const char *low_name = NULL;
750 /* For derived types. */
751 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
752 low_name = dt_lower_string (name);
755 for (u = gfc_rename_list; u; u = u->next)
757 if ((!low_name && strcmp (u->use_name, name) != 0)
758 || (low_name && strcmp (u->use_name, low_name) != 0)
759 || (u->op == INTRINSIC_USER && !interface)
760 || (u->op != INTRINSIC_USER && interface))
773 return only_flag ? NULL : name;
779 if (u->local_name[0] == '\0')
781 return dt_upper_string (u->local_name);
784 return (u->local_name[0] != '\0') ? u->local_name : name;
788 /* Given a name, return the name under which to load this symbol.
789 Returns NULL if this symbol shouldn't be loaded. */
792 find_use_name (const char *name, bool interface)
795 return find_use_name_n (name, &i, interface);
799 /* Given a real name, return the number of use names associated with it. */
802 number_use_names (const char *name, bool interface)
805 find_use_name_n (name, &i, interface);
810 /* Try to find the operator in the current list. */
812 static gfc_use_rename *
813 find_use_operator (gfc_intrinsic_op op)
817 for (u = gfc_rename_list; u; u = u->next)
825 /*****************************************************************/
827 /* The next couple of subroutines maintain a tree used to avoid a
828 brute-force search for a combination of true name and module name.
829 While symtree names, the name that a particular symbol is known by
830 can changed with USE statements, we still have to keep track of the
831 true names to generate the correct reference, and also avoid
832 loading the same real symbol twice in a program unit.
834 When we start reading, the true name tree is built and maintained
835 as symbols are read. The tree is searched as we load new symbols
836 to see if it already exists someplace in the namespace. */
838 typedef struct true_name
840 BBT_HEADER (true_name);
846 static true_name *true_name_root;
849 /* Compare two true_name structures. */
852 compare_true_names (void *_t1, void *_t2)
857 t1 = (true_name *) _t1;
858 t2 = (true_name *) _t2;
860 c = ((t1->sym->module > t2->sym->module)
861 - (t1->sym->module < t2->sym->module));
865 return strcmp (t1->name, t2->name);
869 /* Given a true name, search the true name tree to see if it exists
870 within the main namespace. */
873 find_true_name (const char *name, const char *module)
879 t.name = gfc_get_string (name);
881 sym.module = gfc_get_string (module);
889 c = compare_true_names ((void *) (&t), (void *) p);
893 p = (c < 0) ? p->left : p->right;
900 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
903 add_true_name (gfc_symbol *sym)
907 t = XCNEW (true_name);
909 if (sym->attr.flavor == FL_DERIVED)
910 t->name = dt_upper_string (sym->name);
914 gfc_insert_bbt (&true_name_root, t, compare_true_names);
918 /* Recursive function to build the initial true name tree by
919 recursively traversing the current namespace. */
922 build_tnt (gfc_symtree *st)
928 build_tnt (st->left);
929 build_tnt (st->right);
931 if (st->n.sym->attr.flavor == FL_DERIVED)
932 name = dt_upper_string (st->n.sym->name);
934 name = st->n.sym->name;
936 if (find_true_name (name, st->n.sym->module) != NULL)
939 add_true_name (st->n.sym);
943 /* Initialize the true name tree with the current namespace. */
946 init_true_name_tree (void)
948 true_name_root = NULL;
949 build_tnt (gfc_current_ns->sym_root);
953 /* Recursively free a true name tree node. */
956 free_true_name (true_name *t)
960 free_true_name (t->left);
961 free_true_name (t->right);
967 /*****************************************************************/
969 /* Module reading and writing. */
973 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
977 static atom_type last_atom;
980 /* The name buffer must be at least as long as a symbol name. Right
981 now it's not clear how we're going to store numeric constants--
982 probably as a hexadecimal string, since this will allow the exact
983 number to be preserved (this can't be done by a decimal
984 representation). Worry about that later. TODO! */
986 #define MAX_ATOM_SIZE 100
989 static char *atom_string, atom_name[MAX_ATOM_SIZE];
992 /* Report problems with a module. Error reporting is not very
993 elaborate, since this sorts of errors shouldn't really happen.
994 This subroutine never returns. */
996 static void bad_module (const char *) ATTRIBUTE_NORETURN;
999 bad_module (const char *msgid)
1006 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
1007 module_name, module_line, module_column, msgid);
1010 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
1011 module_name, module_line, module_column, msgid);
1014 gfc_fatal_error ("Module %s at line %d column %d: %s",
1015 module_name, module_line, module_column, msgid);
1021 /* Set the module's input pointer. */
1024 set_module_locus (module_locus *m)
1026 module_column = m->column;
1027 module_line = m->line;
1028 fsetpos (module_fp, &m->pos);
1032 /* Get the module's input pointer so that we can restore it later. */
1035 get_module_locus (module_locus *m)
1037 m->column = module_column;
1038 m->line = module_line;
1039 fgetpos (module_fp, &m->pos);
1043 /* Get the next character in the module, updating our reckoning of
1051 c = getc (module_fp);
1054 bad_module ("Unexpected EOF");
1056 prev_module_line = module_line;
1057 prev_module_column = module_column;
1070 /* Unget a character while remembering the line and column. Works for
1071 a single character only. */
1074 module_unget_char (void)
1076 module_line = prev_module_line;
1077 module_column = prev_module_column;
1078 ungetc (prev_character, module_fp);
1081 /* Parse a string constant. The delimiter is guaranteed to be a
1091 atom_string = XNEWVEC (char, cursz);
1099 int c2 = module_char ();
1102 module_unget_char ();
1110 atom_string = XRESIZEVEC (char, atom_string, cursz);
1112 atom_string[len] = c;
1116 atom_string = XRESIZEVEC (char, atom_string, len + 1);
1117 atom_string[len] = '\0'; /* C-style string for debug purposes. */
1121 /* Parse a small integer. */
1124 parse_integer (int c)
1133 module_unget_char ();
1137 atom_int = 10 * atom_int + c - '0';
1138 if (atom_int > 99999999)
1139 bad_module ("Integer overflow");
1161 if (!ISALNUM (c) && c != '_' && c != '-')
1163 module_unget_char ();
1168 if (++len > GFC_MAX_SYMBOL_LEN)
1169 bad_module ("Name too long");
1177 /* Read the next atom in the module's input stream. */
1188 while (c == ' ' || c == '\r' || c == '\n');
1213 return ATOM_INTEGER;
1271 bad_module ("Bad name");
1278 /* Peek at the next atom on the input. */
1289 while (c == ' ' || c == '\r' || c == '\n');
1294 module_unget_char ();
1298 module_unget_char ();
1302 module_unget_char ();
1315 module_unget_char ();
1316 return ATOM_INTEGER;
1370 module_unget_char ();
1374 bad_module ("Bad name");
1379 /* Read the next atom from the input, requiring that it be a
1383 require_atom (atom_type type)
1389 column = module_column;
1398 p = _("Expected name");
1401 p = _("Expected left parenthesis");
1404 p = _("Expected right parenthesis");
1407 p = _("Expected integer");
1410 p = _("Expected string");
1413 gfc_internal_error ("require_atom(): bad atom type required");
1416 module_column = column;
1423 /* Given a pointer to an mstring array, require that the current input
1424 be one of the strings in the array. We return the enum value. */
1427 find_enum (const mstring *m)
1431 i = gfc_string2code (m, atom_name);
1435 bad_module ("find_enum(): Enum not found");
1441 /**************** Module output subroutines ***************************/
1443 /* Output a character to a module file. */
1446 write_char (char out)
1448 if (putc (out, module_fp) == EOF)
1449 gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno));
1451 /* Add this to our MD5. */
1452 md5_process_bytes (&out, sizeof (out), &ctx);
1464 /* Write an atom to a module. The line wrapping isn't perfect, but it
1465 should work most of the time. This isn't that big of a deal, since
1466 the file really isn't meant to be read by people anyway. */
1469 write_atom (atom_type atom, const void *v)
1479 p = (const char *) v;
1491 i = *((const int *) v);
1493 gfc_internal_error ("write_atom(): Writing negative integer");
1495 sprintf (buffer, "%d", i);
1500 gfc_internal_error ("write_atom(): Trying to write dab atom");
1504 if(p == NULL || *p == '\0')
1509 if (atom != ATOM_RPAREN)
1511 if (module_column + len > 72)
1516 if (last_atom != ATOM_LPAREN && module_column != 1)
1521 if (atom == ATOM_STRING)
1524 while (p != NULL && *p)
1526 if (atom == ATOM_STRING && *p == '\'')
1531 if (atom == ATOM_STRING)
1539 /***************** Mid-level I/O subroutines *****************/
1541 /* These subroutines let their caller read or write atoms without
1542 caring about which of the two is actually happening. This lets a
1543 subroutine concentrate on the actual format of the data being
1546 static void mio_expr (gfc_expr **);
1547 pointer_info *mio_symbol_ref (gfc_symbol **);
1548 pointer_info *mio_interface_rest (gfc_interface **);
1549 static void mio_symtree_ref (gfc_symtree **);
1551 /* Read or write an enumerated value. On writing, we return the input
1552 value for the convenience of callers. We avoid using an integer
1553 pointer because enums are sometimes inside bitfields. */
1556 mio_name (int t, const mstring *m)
1558 if (iomode == IO_OUTPUT)
1559 write_atom (ATOM_NAME, gfc_code2string (m, t));
1562 require_atom (ATOM_NAME);
1569 /* Specialization of mio_name. */
1571 #define DECL_MIO_NAME(TYPE) \
1572 static inline TYPE \
1573 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1575 return (TYPE) mio_name ((int) t, m); \
1577 #define MIO_NAME(TYPE) mio_name_##TYPE
1582 if (iomode == IO_OUTPUT)
1583 write_atom (ATOM_LPAREN, NULL);
1585 require_atom (ATOM_LPAREN);
1592 if (iomode == IO_OUTPUT)
1593 write_atom (ATOM_RPAREN, NULL);
1595 require_atom (ATOM_RPAREN);
1600 mio_integer (int *ip)
1602 if (iomode == IO_OUTPUT)
1603 write_atom (ATOM_INTEGER, ip);
1606 require_atom (ATOM_INTEGER);
1612 /* Read or write a gfc_intrinsic_op value. */
1615 mio_intrinsic_op (gfc_intrinsic_op* op)
1617 /* FIXME: Would be nicer to do this via the operators symbolic name. */
1618 if (iomode == IO_OUTPUT)
1620 int converted = (int) *op;
1621 write_atom (ATOM_INTEGER, &converted);
1625 require_atom (ATOM_INTEGER);
1626 *op = (gfc_intrinsic_op) atom_int;
1631 /* Read or write a character pointer that points to a string on the heap. */
1634 mio_allocated_string (const char *s)
1636 if (iomode == IO_OUTPUT)
1638 write_atom (ATOM_STRING, s);
1643 require_atom (ATOM_STRING);
1649 /* Functions for quoting and unquoting strings. */
1652 quote_string (const gfc_char_t *s, const size_t slength)
1654 const gfc_char_t *p;
1658 /* Calculate the length we'll need: a backslash takes two ("\\"),
1659 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1660 for (p = s, i = 0; i < slength; p++, i++)
1664 else if (!gfc_wide_is_printable (*p))
1670 q = res = XCNEWVEC (char, len + 1);
1671 for (p = s, i = 0; i < slength; p++, i++)
1674 *q++ = '\\', *q++ = '\\';
1675 else if (!gfc_wide_is_printable (*p))
1677 sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1678 (unsigned HOST_WIDE_INT) *p);
1682 *q++ = (unsigned char) *p;
1690 unquote_string (const char *s)
1696 for (p = s, len = 0; *p; p++, len++)
1703 else if (p[1] == 'U')
1704 p += 9; /* That is a "\U????????". */
1706 gfc_internal_error ("unquote_string(): got bad string");
1709 res = gfc_get_wide_string (len + 1);
1710 for (i = 0, p = s; i < len; i++, p++)
1715 res[i] = (unsigned char) *p;
1716 else if (p[1] == '\\')
1718 res[i] = (unsigned char) '\\';
1723 /* We read the 8-digits hexadecimal constant that follows. */
1728 gcc_assert (p[1] == 'U');
1729 for (j = 0; j < 8; j++)
1732 gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1746 /* Read or write a character pointer that points to a wide string on the
1747 heap, performing quoting/unquoting of nonprintable characters using the
1748 form \U???????? (where each ? is a hexadecimal digit).
1749 Length is the length of the string, only known and used in output mode. */
1751 static const gfc_char_t *
1752 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1754 if (iomode == IO_OUTPUT)
1756 char *quoted = quote_string (s, length);
1757 write_atom (ATOM_STRING, quoted);
1763 gfc_char_t *unquoted;
1765 require_atom (ATOM_STRING);
1766 unquoted = unquote_string (atom_string);
1773 /* Read or write a string that is in static memory. */
1776 mio_pool_string (const char **stringp)
1778 /* TODO: one could write the string only once, and refer to it via a
1781 /* As a special case we have to deal with a NULL string. This
1782 happens for the 'module' member of 'gfc_symbol's that are not in a
1783 module. We read / write these as the empty string. */
1784 if (iomode == IO_OUTPUT)
1786 const char *p = *stringp == NULL ? "" : *stringp;
1787 write_atom (ATOM_STRING, p);
1791 require_atom (ATOM_STRING);
1792 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1798 /* Read or write a string that is inside of some already-allocated
1802 mio_internal_string (char *string)
1804 if (iomode == IO_OUTPUT)
1805 write_atom (ATOM_STRING, string);
1808 require_atom (ATOM_STRING);
1809 strcpy (string, atom_string);
1816 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1817 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1818 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1819 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1820 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE,
1821 AB_ALLOC_COMP, AB_POINTER_COMP, AB_PROC_POINTER_COMP, AB_PRIVATE_COMP,
1822 AB_VALUE, AB_VOLATILE, AB_PROTECTED, AB_LOCK_COMP,
1823 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1824 AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
1825 AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER,
1830 static const mstring attr_bits[] =
1832 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1833 minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1834 minit ("DIMENSION", AB_DIMENSION),
1835 minit ("CODIMENSION", AB_CODIMENSION),
1836 minit ("CONTIGUOUS", AB_CONTIGUOUS),
1837 minit ("EXTERNAL", AB_EXTERNAL),
1838 minit ("INTRINSIC", AB_INTRINSIC),
1839 minit ("OPTIONAL", AB_OPTIONAL),
1840 minit ("POINTER", AB_POINTER),
1841 minit ("VOLATILE", AB_VOLATILE),
1842 minit ("TARGET", AB_TARGET),
1843 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1844 minit ("DUMMY", AB_DUMMY),
1845 minit ("RESULT", AB_RESULT),
1846 minit ("DATA", AB_DATA),
1847 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1848 minit ("IN_COMMON", AB_IN_COMMON),
1849 minit ("FUNCTION", AB_FUNCTION),
1850 minit ("SUBROUTINE", AB_SUBROUTINE),
1851 minit ("SEQUENCE", AB_SEQUENCE),
1852 minit ("ELEMENTAL", AB_ELEMENTAL),
1853 minit ("PURE", AB_PURE),
1854 minit ("RECURSIVE", AB_RECURSIVE),
1855 minit ("GENERIC", AB_GENERIC),
1856 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1857 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1858 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1859 minit ("IS_BIND_C", AB_IS_BIND_C),
1860 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1861 minit ("IS_ISO_C", AB_IS_ISO_C),
1862 minit ("VALUE", AB_VALUE),
1863 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1864 minit ("COARRAY_COMP", AB_COARRAY_COMP),
1865 minit ("LOCK_COMP", AB_LOCK_COMP),
1866 minit ("POINTER_COMP", AB_POINTER_COMP),
1867 minit ("PROC_POINTER_COMP", AB_PROC_POINTER_COMP),
1868 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1869 minit ("ZERO_COMP", AB_ZERO_COMP),
1870 minit ("PROTECTED", AB_PROTECTED),
1871 minit ("ABSTRACT", AB_ABSTRACT),
1872 minit ("IS_CLASS", AB_IS_CLASS),
1873 minit ("PROCEDURE", AB_PROCEDURE),
1874 minit ("PROC_POINTER", AB_PROC_POINTER),
1875 minit ("VTYPE", AB_VTYPE),
1876 minit ("VTAB", AB_VTAB),
1877 minit ("CLASS_POINTER", AB_CLASS_POINTER),
1878 minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE),
1882 /* For binding attributes. */
1883 static const mstring binding_passing[] =
1886 minit ("NOPASS", 1),
1889 static const mstring binding_overriding[] =
1891 minit ("OVERRIDABLE", 0),
1892 minit ("NON_OVERRIDABLE", 1),
1893 minit ("DEFERRED", 2),
1896 static const mstring binding_generic[] =
1898 minit ("SPECIFIC", 0),
1899 minit ("GENERIC", 1),
1902 static const mstring binding_ppc[] =
1904 minit ("NO_PPC", 0),
1909 /* Specialization of mio_name. */
1910 DECL_MIO_NAME (ab_attribute)
1911 DECL_MIO_NAME (ar_type)
1912 DECL_MIO_NAME (array_type)
1914 DECL_MIO_NAME (expr_t)
1915 DECL_MIO_NAME (gfc_access)
1916 DECL_MIO_NAME (gfc_intrinsic_op)
1917 DECL_MIO_NAME (ifsrc)
1918 DECL_MIO_NAME (save_state)
1919 DECL_MIO_NAME (procedure_type)
1920 DECL_MIO_NAME (ref_type)
1921 DECL_MIO_NAME (sym_flavor)
1922 DECL_MIO_NAME (sym_intent)
1923 #undef DECL_MIO_NAME
1925 /* Symbol attributes are stored in list with the first three elements
1926 being the enumerated fields, while the remaining elements (if any)
1927 indicate the individual attribute bits. The access field is not
1928 saved-- it controls what symbols are exported when a module is
1932 mio_symbol_attribute (symbol_attribute *attr)
1935 unsigned ext_attr,extension_level;
1939 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1940 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1941 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1942 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1943 attr->save = MIO_NAME (save_state) (attr->save, save_status);
1945 ext_attr = attr->ext_attr;
1946 mio_integer ((int *) &ext_attr);
1947 attr->ext_attr = ext_attr;
1949 extension_level = attr->extension;
1950 mio_integer ((int *) &extension_level);
1951 attr->extension = extension_level;
1953 if (iomode == IO_OUTPUT)
1955 if (attr->allocatable)
1956 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1957 if (attr->asynchronous)
1958 MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
1959 if (attr->dimension)
1960 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1961 if (attr->codimension)
1962 MIO_NAME (ab_attribute) (AB_CODIMENSION, attr_bits);
1963 if (attr->contiguous)
1964 MIO_NAME (ab_attribute) (AB_CONTIGUOUS, attr_bits);
1966 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1967 if (attr->intrinsic)
1968 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1970 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1972 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1973 if (attr->class_pointer)
1974 MIO_NAME (ab_attribute) (AB_CLASS_POINTER, attr_bits);
1975 if (attr->is_protected)
1976 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1978 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1979 if (attr->volatile_)
1980 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1982 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1983 if (attr->threadprivate)
1984 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1986 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1988 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1989 /* We deliberately don't preserve the "entry" flag. */
1992 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1993 if (attr->in_namelist)
1994 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1995 if (attr->in_common)
1996 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1999 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
2000 if (attr->subroutine)
2001 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
2003 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
2005 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
2008 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
2009 if (attr->elemental)
2010 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
2012 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
2013 if (attr->implicit_pure)
2014 MIO_NAME (ab_attribute) (AB_IMPLICIT_PURE, attr_bits);
2015 if (attr->recursive)
2016 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
2017 if (attr->always_explicit)
2018 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
2019 if (attr->cray_pointer)
2020 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
2021 if (attr->cray_pointee)
2022 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
2023 if (attr->is_bind_c)
2024 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
2025 if (attr->is_c_interop)
2026 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
2028 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
2029 if (attr->alloc_comp)
2030 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
2031 if (attr->pointer_comp)
2032 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
2033 if (attr->proc_pointer_comp)
2034 MIO_NAME (ab_attribute) (AB_PROC_POINTER_COMP, attr_bits);
2035 if (attr->private_comp)
2036 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
2037 if (attr->coarray_comp)
2038 MIO_NAME (ab_attribute) (AB_COARRAY_COMP, attr_bits);
2039 if (attr->lock_comp)
2040 MIO_NAME (ab_attribute) (AB_LOCK_COMP, attr_bits);
2041 if (attr->zero_comp)
2042 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
2044 MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
2045 if (attr->procedure)
2046 MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
2047 if (attr->proc_pointer)
2048 MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
2050 MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
2052 MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
2062 if (t == ATOM_RPAREN)
2065 bad_module ("Expected attribute bit name");
2067 switch ((ab_attribute) find_enum (attr_bits))
2069 case AB_ALLOCATABLE:
2070 attr->allocatable = 1;
2072 case AB_ASYNCHRONOUS:
2073 attr->asynchronous = 1;
2076 attr->dimension = 1;
2078 case AB_CODIMENSION:
2079 attr->codimension = 1;
2082 attr->contiguous = 1;
2088 attr->intrinsic = 1;
2096 case AB_CLASS_POINTER:
2097 attr->class_pointer = 1;
2100 attr->is_protected = 1;
2106 attr->volatile_ = 1;
2111 case AB_THREADPRIVATE:
2112 attr->threadprivate = 1;
2123 case AB_IN_NAMELIST:
2124 attr->in_namelist = 1;
2127 attr->in_common = 1;
2133 attr->subroutine = 1;
2145 attr->elemental = 1;
2150 case AB_IMPLICIT_PURE:
2151 attr->implicit_pure = 1;
2154 attr->recursive = 1;
2156 case AB_ALWAYS_EXPLICIT:
2157 attr->always_explicit = 1;
2159 case AB_CRAY_POINTER:
2160 attr->cray_pointer = 1;
2162 case AB_CRAY_POINTEE:
2163 attr->cray_pointee = 1;
2166 attr->is_bind_c = 1;
2168 case AB_IS_C_INTEROP:
2169 attr->is_c_interop = 1;
2175 attr->alloc_comp = 1;
2177 case AB_COARRAY_COMP:
2178 attr->coarray_comp = 1;
2181 attr->lock_comp = 1;
2183 case AB_POINTER_COMP:
2184 attr->pointer_comp = 1;
2186 case AB_PROC_POINTER_COMP:
2187 attr->proc_pointer_comp = 1;
2189 case AB_PRIVATE_COMP:
2190 attr->private_comp = 1;
2193 attr->zero_comp = 1;
2199 attr->procedure = 1;
2201 case AB_PROC_POINTER:
2202 attr->proc_pointer = 1;
2216 static const mstring bt_types[] = {
2217 minit ("INTEGER", BT_INTEGER),
2218 minit ("REAL", BT_REAL),
2219 minit ("COMPLEX", BT_COMPLEX),
2220 minit ("LOGICAL", BT_LOGICAL),
2221 minit ("CHARACTER", BT_CHARACTER),
2222 minit ("DERIVED", BT_DERIVED),
2223 minit ("CLASS", BT_CLASS),
2224 minit ("PROCEDURE", BT_PROCEDURE),
2225 minit ("UNKNOWN", BT_UNKNOWN),
2226 minit ("VOID", BT_VOID),
2232 mio_charlen (gfc_charlen **clp)
2238 if (iomode == IO_OUTPUT)
2242 mio_expr (&cl->length);
2246 if (peek_atom () != ATOM_RPAREN)
2248 cl = gfc_new_charlen (gfc_current_ns, NULL);
2249 mio_expr (&cl->length);
2258 /* See if a name is a generated name. */
2261 check_unique_name (const char *name)
2263 return *name == '@';
2268 mio_typespec (gfc_typespec *ts)
2272 ts->type = MIO_NAME (bt) (ts->type, bt_types);
2274 if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2275 mio_integer (&ts->kind);
2277 mio_symbol_ref (&ts->u.derived);
2279 mio_symbol_ref (&ts->interface);
2281 /* Add info for C interop and is_iso_c. */
2282 mio_integer (&ts->is_c_interop);
2283 mio_integer (&ts->is_iso_c);
2285 /* If the typespec is for an identifier either from iso_c_binding, or
2286 a constant that was initialized to an identifier from it, use the
2287 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2289 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2291 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2293 if (ts->type != BT_CHARACTER)
2295 /* ts->u.cl is only valid for BT_CHARACTER. */
2300 mio_charlen (&ts->u.cl);
2302 /* So as not to disturb the existing API, use an ATOM_NAME to
2303 transmit deferred characteristic for characters (F2003). */
2304 if (iomode == IO_OUTPUT)
2306 if (ts->type == BT_CHARACTER && ts->deferred)
2307 write_atom (ATOM_NAME, "DEFERRED_CL");
2309 else if (peek_atom () != ATOM_RPAREN)
2311 if (parse_atom () != ATOM_NAME)
2312 bad_module ("Expected string");
2320 static const mstring array_spec_types[] = {
2321 minit ("EXPLICIT", AS_EXPLICIT),
2322 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2323 minit ("DEFERRED", AS_DEFERRED),
2324 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2330 mio_array_spec (gfc_array_spec **asp)
2337 if (iomode == IO_OUTPUT)
2345 if (peek_atom () == ATOM_RPAREN)
2351 *asp = as = gfc_get_array_spec ();
2354 mio_integer (&as->rank);
2355 mio_integer (&as->corank);
2356 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2358 if (iomode == IO_INPUT && as->corank)
2359 as->cotype = (as->type == AS_DEFERRED) ? AS_DEFERRED : AS_EXPLICIT;
2361 for (i = 0; i < as->rank + as->corank; i++)
2363 mio_expr (&as->lower[i]);
2364 mio_expr (&as->upper[i]);
2372 /* Given a pointer to an array reference structure (which lives in a
2373 gfc_ref structure), find the corresponding array specification
2374 structure. Storing the pointer in the ref structure doesn't quite
2375 work when loading from a module. Generating code for an array
2376 reference also needs more information than just the array spec. */
2378 static const mstring array_ref_types[] = {
2379 minit ("FULL", AR_FULL),
2380 minit ("ELEMENT", AR_ELEMENT),
2381 minit ("SECTION", AR_SECTION),
2387 mio_array_ref (gfc_array_ref *ar)
2392 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2393 mio_integer (&ar->dimen);
2401 for (i = 0; i < ar->dimen; i++)
2402 mio_expr (&ar->start[i]);
2407 for (i = 0; i < ar->dimen; i++)
2409 mio_expr (&ar->start[i]);
2410 mio_expr (&ar->end[i]);
2411 mio_expr (&ar->stride[i]);
2417 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2420 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2421 we can't call mio_integer directly. Instead loop over each element
2422 and cast it to/from an integer. */
2423 if (iomode == IO_OUTPUT)
2425 for (i = 0; i < ar->dimen; i++)
2427 int tmp = (int)ar->dimen_type[i];
2428 write_atom (ATOM_INTEGER, &tmp);
2433 for (i = 0; i < ar->dimen; i++)
2435 require_atom (ATOM_INTEGER);
2436 ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2440 if (iomode == IO_INPUT)
2442 ar->where = gfc_current_locus;
2444 for (i = 0; i < ar->dimen; i++)
2445 ar->c_where[i] = gfc_current_locus;
2452 /* Saves or restores a pointer. The pointer is converted back and
2453 forth from an integer. We return the pointer_info pointer so that
2454 the caller can take additional action based on the pointer type. */
2456 static pointer_info *
2457 mio_pointer_ref (void *gp)
2461 if (iomode == IO_OUTPUT)
2463 p = get_pointer (*((char **) gp));
2464 write_atom (ATOM_INTEGER, &p->integer);
2468 require_atom (ATOM_INTEGER);
2469 p = add_fixup (atom_int, gp);
2476 /* Save and load references to components that occur within
2477 expressions. We have to describe these references by a number and
2478 by name. The number is necessary for forward references during
2479 reading, and the name is necessary if the symbol already exists in
2480 the namespace and is not loaded again. */
2483 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2485 char name[GFC_MAX_SYMBOL_LEN + 1];
2489 p = mio_pointer_ref (cp);
2490 if (p->type == P_UNKNOWN)
2491 p->type = P_COMPONENT;
2493 if (iomode == IO_OUTPUT)
2494 mio_pool_string (&(*cp)->name);
2497 mio_internal_string (name);
2499 if (sym && sym->attr.is_class)
2500 sym = sym->components->ts.u.derived;
2502 /* It can happen that a component reference can be read before the
2503 associated derived type symbol has been loaded. Return now and
2504 wait for a later iteration of load_needed. */
2508 if (sym->components != NULL && p->u.pointer == NULL)
2510 /* Symbol already loaded, so search by name. */
2511 q = gfc_find_component (sym, name, true, true);
2514 associate_integer_pointer (p, q);
2517 /* Make sure this symbol will eventually be loaded. */
2518 p = find_pointer2 (sym);
2519 if (p->u.rsym.state == UNUSED)
2520 p->u.rsym.state = NEEDED;
2525 static void mio_namespace_ref (gfc_namespace **nsp);
2526 static void mio_formal_arglist (gfc_formal_arglist **formal);
2527 static void mio_typebound_proc (gfc_typebound_proc** proc);
2530 mio_component (gfc_component *c, int vtype)
2534 gfc_formal_arglist *formal;
2538 if (iomode == IO_OUTPUT)
2540 p = get_pointer (c);
2541 mio_integer (&p->integer);
2546 p = get_integer (n);
2547 associate_integer_pointer (p, c);
2550 if (p->type == P_UNKNOWN)
2551 p->type = P_COMPONENT;
2553 mio_pool_string (&c->name);
2554 mio_typespec (&c->ts);
2555 mio_array_spec (&c->as);
2557 mio_symbol_attribute (&c->attr);
2558 if (c->ts.type == BT_CLASS)
2559 c->attr.class_ok = 1;
2560 c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types);
2563 mio_expr (&c->initializer);
2565 if (c->attr.proc_pointer)
2567 if (iomode == IO_OUTPUT)
2570 while (formal && !formal->sym)
2571 formal = formal->next;
2574 mio_namespace_ref (&formal->sym->ns);
2576 mio_namespace_ref (&c->formal_ns);
2580 mio_namespace_ref (&c->formal_ns);
2581 /* TODO: if (c->formal_ns)
2583 c->formal_ns->proc_name = c;
2588 mio_formal_arglist (&c->formal);
2590 mio_typebound_proc (&c->tb);
2598 mio_component_list (gfc_component **cp, int vtype)
2600 gfc_component *c, *tail;
2604 if (iomode == IO_OUTPUT)
2606 for (c = *cp; c; c = c->next)
2607 mio_component (c, vtype);
2616 if (peek_atom () == ATOM_RPAREN)
2619 c = gfc_get_component ();
2620 mio_component (c, vtype);
2636 mio_actual_arg (gfc_actual_arglist *a)
2639 mio_pool_string (&a->name);
2640 mio_expr (&a->expr);
2646 mio_actual_arglist (gfc_actual_arglist **ap)
2648 gfc_actual_arglist *a, *tail;
2652 if (iomode == IO_OUTPUT)
2654 for (a = *ap; a; a = a->next)
2664 if (peek_atom () != ATOM_LPAREN)
2667 a = gfc_get_actual_arglist ();
2683 /* Read and write formal argument lists. */
2686 mio_formal_arglist (gfc_formal_arglist **formal)
2688 gfc_formal_arglist *f, *tail;
2692 if (iomode == IO_OUTPUT)
2694 for (f = *formal; f; f = f->next)
2695 mio_symbol_ref (&f->sym);
2699 *formal = tail = NULL;
2701 while (peek_atom () != ATOM_RPAREN)
2703 f = gfc_get_formal_arglist ();
2704 mio_symbol_ref (&f->sym);
2706 if (*formal == NULL)
2719 /* Save or restore a reference to a symbol node. */
2722 mio_symbol_ref (gfc_symbol **symp)
2726 p = mio_pointer_ref (symp);
2727 if (p->type == P_UNKNOWN)
2730 if (iomode == IO_OUTPUT)
2732 if (p->u.wsym.state == UNREFERENCED)
2733 p->u.wsym.state = NEEDS_WRITE;
2737 if (p->u.rsym.state == UNUSED)
2738 p->u.rsym.state = NEEDED;
2744 /* Save or restore a reference to a symtree node. */
2747 mio_symtree_ref (gfc_symtree **stp)
2752 if (iomode == IO_OUTPUT)
2753 mio_symbol_ref (&(*stp)->n.sym);
2756 require_atom (ATOM_INTEGER);
2757 p = get_integer (atom_int);
2759 /* An unused equivalence member; make a symbol and a symtree
2761 if (in_load_equiv && p->u.rsym.symtree == NULL)
2763 /* Since this is not used, it must have a unique name. */
2764 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2766 /* Make the symbol. */
2767 if (p->u.rsym.sym == NULL)
2769 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2771 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2774 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2775 p->u.rsym.symtree->n.sym->refs++;
2776 p->u.rsym.referenced = 1;
2778 /* If the symbol is PRIVATE and in COMMON, load_commons will
2779 generate a fixup symbol, which must be associated. */
2781 resolve_fixups (p->fixup, p->u.rsym.sym);
2785 if (p->type == P_UNKNOWN)
2788 if (p->u.rsym.state == UNUSED)
2789 p->u.rsym.state = NEEDED;
2791 if (p->u.rsym.symtree != NULL)
2793 *stp = p->u.rsym.symtree;
2797 f = XCNEW (fixup_t);
2799 f->next = p->u.rsym.stfixup;
2800 p->u.rsym.stfixup = f;
2802 f->pointer = (void **) stp;
2809 mio_iterator (gfc_iterator **ip)
2815 if (iomode == IO_OUTPUT)
2822 if (peek_atom () == ATOM_RPAREN)
2828 *ip = gfc_get_iterator ();
2833 mio_expr (&iter->var);
2834 mio_expr (&iter->start);
2835 mio_expr (&iter->end);
2836 mio_expr (&iter->step);
2844 mio_constructor (gfc_constructor_base *cp)
2850 if (iomode == IO_OUTPUT)
2852 for (c = gfc_constructor_first (*cp); c; c = gfc_constructor_next (c))
2855 mio_expr (&c->expr);
2856 mio_iterator (&c->iterator);
2862 while (peek_atom () != ATOM_RPAREN)
2864 c = gfc_constructor_append_expr (cp, NULL, NULL);
2867 mio_expr (&c->expr);
2868 mio_iterator (&c->iterator);
2877 static const mstring ref_types[] = {
2878 minit ("ARRAY", REF_ARRAY),
2879 minit ("COMPONENT", REF_COMPONENT),
2880 minit ("SUBSTRING", REF_SUBSTRING),
2886 mio_ref (gfc_ref **rp)
2893 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2898 mio_array_ref (&r->u.ar);
2902 mio_symbol_ref (&r->u.c.sym);
2903 mio_component_ref (&r->u.c.component, r->u.c.sym);
2907 mio_expr (&r->u.ss.start);
2908 mio_expr (&r->u.ss.end);
2909 mio_charlen (&r->u.ss.length);
2918 mio_ref_list (gfc_ref **rp)
2920 gfc_ref *ref, *head, *tail;
2924 if (iomode == IO_OUTPUT)
2926 for (ref = *rp; ref; ref = ref->next)
2933 while (peek_atom () != ATOM_RPAREN)
2936 head = tail = gfc_get_ref ();
2939 tail->next = gfc_get_ref ();
2953 /* Read and write an integer value. */
2956 mio_gmp_integer (mpz_t *integer)
2960 if (iomode == IO_INPUT)
2962 if (parse_atom () != ATOM_STRING)
2963 bad_module ("Expected integer string");
2965 mpz_init (*integer);
2966 if (mpz_set_str (*integer, atom_string, 10))
2967 bad_module ("Error converting integer");
2973 p = mpz_get_str (NULL, 10, *integer);
2974 write_atom (ATOM_STRING, p);
2981 mio_gmp_real (mpfr_t *real)
2986 if (iomode == IO_INPUT)
2988 if (parse_atom () != ATOM_STRING)
2989 bad_module ("Expected real string");
2992 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2997 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2999 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
3001 write_atom (ATOM_STRING, p);
3006 atom_string = XCNEWVEC (char, strlen (p) + 20);
3008 sprintf (atom_string, "0.%s@%ld", p, exponent);
3010 /* Fix negative numbers. */
3011 if (atom_string[2] == '-')
3013 atom_string[0] = '-';
3014 atom_string[1] = '0';
3015 atom_string[2] = '.';
3018 write_atom (ATOM_STRING, atom_string);
3026 /* Save and restore the shape of an array constructor. */
3029 mio_shape (mpz_t **pshape, int rank)
3035 /* A NULL shape is represented by (). */
3038 if (iomode == IO_OUTPUT)
3050 if (t == ATOM_RPAREN)
3057 shape = gfc_get_shape (rank);
3061 for (n = 0; n < rank; n++)
3062 mio_gmp_integer (&shape[n]);
3068 static const mstring expr_types[] = {
3069 minit ("OP", EXPR_OP),
3070 minit ("FUNCTION", EXPR_FUNCTION),
3071 minit ("CONSTANT", EXPR_CONSTANT),
3072 minit ("VARIABLE", EXPR_VARIABLE),
3073 minit ("SUBSTRING", EXPR_SUBSTRING),
3074 minit ("STRUCTURE", EXPR_STRUCTURE),
3075 minit ("ARRAY", EXPR_ARRAY),
3076 minit ("NULL", EXPR_NULL),
3077 minit ("COMPCALL", EXPR_COMPCALL),
3081 /* INTRINSIC_ASSIGN is missing because it is used as an index for
3082 generic operators, not in expressions. INTRINSIC_USER is also
3083 replaced by the correct function name by the time we see it. */
3085 static const mstring intrinsics[] =
3087 minit ("UPLUS", INTRINSIC_UPLUS),
3088 minit ("UMINUS", INTRINSIC_UMINUS),
3089 minit ("PLUS", INTRINSIC_PLUS),
3090 minit ("MINUS", INTRINSIC_MINUS),
3091 minit ("TIMES", INTRINSIC_TIMES),
3092 minit ("DIVIDE", INTRINSIC_DIVIDE),
3093 minit ("POWER", INTRINSIC_POWER),
3094 minit ("CONCAT", INTRINSIC_CONCAT),
3095 minit ("AND", INTRINSIC_AND),
3096 minit ("OR", INTRINSIC_OR),
3097 minit ("EQV", INTRINSIC_EQV),
3098 minit ("NEQV", INTRINSIC_NEQV),
3099 minit ("EQ_SIGN", INTRINSIC_EQ),
3100 minit ("EQ", INTRINSIC_EQ_OS),
3101 minit ("NE_SIGN", INTRINSIC_NE),
3102 minit ("NE", INTRINSIC_NE_OS),
3103 minit ("GT_SIGN", INTRINSIC_GT),
3104 minit ("GT", INTRINSIC_GT_OS),
3105 minit ("GE_SIGN", INTRINSIC_GE),
3106 minit ("GE", INTRINSIC_GE_OS),
3107 minit ("LT_SIGN", INTRINSIC_LT),
3108 minit ("LT", INTRINSIC_LT_OS),
3109 minit ("LE_SIGN", INTRINSIC_LE),
3110 minit ("LE", INTRINSIC_LE_OS),
3111 minit ("NOT", INTRINSIC_NOT),
3112 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
3117 /* Remedy a couple of situations where the gfc_expr's can be defective. */
3120 fix_mio_expr (gfc_expr *e)
3122 gfc_symtree *ns_st = NULL;
3125 if (iomode != IO_OUTPUT)
3130 /* If this is a symtree for a symbol that came from a contained module
3131 namespace, it has a unique name and we should look in the current
3132 namespace to see if the required, non-contained symbol is available
3133 yet. If so, the latter should be written. */
3134 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
3136 const char *name = e->symtree->n.sym->name;
3137 if (e->symtree->n.sym->attr.flavor == FL_DERIVED)
3138 name = dt_upper_string (name);
3139 ns_st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3142 /* On the other hand, if the existing symbol is the module name or the
3143 new symbol is a dummy argument, do not do the promotion. */
3144 if (ns_st && ns_st->n.sym
3145 && ns_st->n.sym->attr.flavor != FL_MODULE
3146 && !e->symtree->n.sym->attr.dummy)
3149 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
3153 /* In some circumstances, a function used in an initialization
3154 expression, in one use associated module, can fail to be
3155 coupled to its symtree when used in a specification
3156 expression in another module. */
3157 fname = e->value.function.esym ? e->value.function.esym->name
3158 : e->value.function.isym->name;
3159 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3164 /* This is probably a reference to a private procedure from another
3165 module. To prevent a segfault, make a generic with no specific
3166 instances. If this module is used, without the required
3167 specific coming from somewhere, the appropriate error message
3169 gfc_get_symbol (fname, gfc_current_ns, &sym);
3170 sym->attr.flavor = FL_PROCEDURE;
3171 sym->attr.generic = 1;
3172 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3173 gfc_commit_symbol (sym);
3178 /* Read and write expressions. The form "()" is allowed to indicate a
3182 mio_expr (gfc_expr **ep)
3190 if (iomode == IO_OUTPUT)
3199 MIO_NAME (expr_t) (e->expr_type, expr_types);
3204 if (t == ATOM_RPAREN)
3211 bad_module ("Expected expression type");
3213 e = *ep = gfc_get_expr ();
3214 e->where = gfc_current_locus;
3215 e->expr_type = (expr_t) find_enum (expr_types);
3218 mio_typespec (&e->ts);
3219 mio_integer (&e->rank);
3223 switch (e->expr_type)
3227 = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3229 switch (e->value.op.op)
3231 case INTRINSIC_UPLUS:
3232 case INTRINSIC_UMINUS:
3234 case INTRINSIC_PARENTHESES:
3235 mio_expr (&e->value.op.op1);
3238 case INTRINSIC_PLUS:
3239 case INTRINSIC_MINUS:
3240 case INTRINSIC_TIMES:
3241 case INTRINSIC_DIVIDE:
3242 case INTRINSIC_POWER:
3243 case INTRINSIC_CONCAT:
3247 case INTRINSIC_NEQV:
3249 case INTRINSIC_EQ_OS:
3251 case INTRINSIC_NE_OS:
3253 case INTRINSIC_GT_OS:
3255 case INTRINSIC_GE_OS:
3257 case INTRINSIC_LT_OS:
3259 case INTRINSIC_LE_OS:
3260 mio_expr (&e->value.op.op1);
3261 mio_expr (&e->value.op.op2);
3265 bad_module ("Bad operator");
3271 mio_symtree_ref (&e->symtree);
3272 mio_actual_arglist (&e->value.function.actual);
3274 if (iomode == IO_OUTPUT)
3276 e->value.function.name
3277 = mio_allocated_string (e->value.function.name);
3278 flag = e->value.function.esym != NULL;
3279 mio_integer (&flag);
3281 mio_symbol_ref (&e->value.function.esym);
3283 write_atom (ATOM_STRING, e->value.function.isym->name);
3287 require_atom (ATOM_STRING);
3288 e->value.function.name = gfc_get_string (atom_string);
3291 mio_integer (&flag);
3293 mio_symbol_ref (&e->value.function.esym);
3296 require_atom (ATOM_STRING);
3297 e->value.function.isym = gfc_find_function (atom_string);
3305 mio_symtree_ref (&e->symtree);
3306 mio_ref_list (&e->ref);
3309 case EXPR_SUBSTRING:
3310 e->value.character.string
3311 = CONST_CAST (gfc_char_t *,
3312 mio_allocated_wide_string (e->value.character.string,
3313 e->value.character.length));
3314 mio_ref_list (&e->ref);
3317 case EXPR_STRUCTURE:
3319 mio_constructor (&e->value.constructor);
3320 mio_shape (&e->shape, e->rank);
3327 mio_gmp_integer (&e->value.integer);
3331 gfc_set_model_kind (e->ts.kind);
3332 mio_gmp_real (&e->value.real);
3336 gfc_set_model_kind (e->ts.kind);
3337 mio_gmp_real (&mpc_realref (e->value.complex));
3338 mio_gmp_real (&mpc_imagref (e->value.complex));
3342 mio_integer (&e->value.logical);
3346 mio_integer (&e->value.character.length);
3347 e->value.character.string
3348 = CONST_CAST (gfc_char_t *,
3349 mio_allocated_wide_string (e->value.character.string,
3350 e->value.character.length));
3354 bad_module ("Bad type in constant expression");
3372 /* Read and write namelists. */
3375 mio_namelist (gfc_symbol *sym)
3377 gfc_namelist *n, *m;
3378 const char *check_name;
3382 if (iomode == IO_OUTPUT)
3384 for (n = sym->namelist; n; n = n->next)
3385 mio_symbol_ref (&n->sym);
3389 /* This departure from the standard is flagged as an error.
3390 It does, in fact, work correctly. TODO: Allow it
3392 if (sym->attr.flavor == FL_NAMELIST)
3394 check_name = find_use_name (sym->name, false);
3395 if (check_name && strcmp (check_name, sym->name) != 0)
3396 gfc_error ("Namelist %s cannot be renamed by USE "
3397 "association to %s", sym->name, check_name);
3401 while (peek_atom () != ATOM_RPAREN)
3403 n = gfc_get_namelist ();
3404 mio_symbol_ref (&n->sym);
3406 if (sym->namelist == NULL)
3413 sym->namelist_tail = m;
3420 /* Save/restore lists of gfc_interface structures. When loading an
3421 interface, we are really appending to the existing list of
3422 interfaces. Checking for duplicate and ambiguous interfaces has to
3423 be done later when all symbols have been loaded. */
3426 mio_interface_rest (gfc_interface **ip)
3428 gfc_interface *tail, *p;
3429 pointer_info *pi = NULL;
3431 if (iomode == IO_OUTPUT)
3434 for (p = *ip; p; p = p->next)
3435 mio_symbol_ref (&p->sym);
3450 if (peek_atom () == ATOM_RPAREN)
3453 p = gfc_get_interface ();
3454 p->where = gfc_current_locus;
3455 pi = mio_symbol_ref (&p->sym);
3471 /* Save/restore a nameless operator interface. */
3474 mio_interface (gfc_interface **ip)
3477 mio_interface_rest (ip);
3481 /* Save/restore a named operator interface. */
3484 mio_symbol_interface (const char **name, const char **module,
3488 mio_pool_string (name);
3489 mio_pool_string (module);
3490 mio_interface_rest (ip);
3495 mio_namespace_ref (gfc_namespace **nsp)
3500 p = mio_pointer_ref (nsp);
3502 if (p->type == P_UNKNOWN)
3503 p->type = P_NAMESPACE;
3505 if (iomode == IO_INPUT && p->integer != 0)
3507 ns = (gfc_namespace *) p->u.pointer;
3510 ns = gfc_get_namespace (NULL, 0);
3511 associate_integer_pointer (p, ns);
3519 /* Save/restore the f2k_derived namespace of a derived-type symbol. */
3521 static gfc_namespace* current_f2k_derived;
3524 mio_typebound_proc (gfc_typebound_proc** proc)
3527 int overriding_flag;
3529 if (iomode == IO_INPUT)
3531 *proc = gfc_get_typebound_proc (NULL);
3532 (*proc)->where = gfc_current_locus;
3538 (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3540 /* IO the NON_OVERRIDABLE/DEFERRED combination. */
3541 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3542 overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3543 overriding_flag = mio_name (overriding_flag, binding_overriding);
3544 (*proc)->deferred = ((overriding_flag & 2) != 0);
3545 (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3546 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3548 (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3549 (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3550 (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3552 mio_pool_string (&((*proc)->pass_arg));
3554 flag = (int) (*proc)->pass_arg_num;
3555 mio_integer (&flag);
3556 (*proc)->pass_arg_num = (unsigned) flag;
3558 if ((*proc)->is_generic)
3564 if (iomode == IO_OUTPUT)
3565 for (g = (*proc)->u.generic; g; g = g->next)
3566 mio_allocated_string (g->specific_st->name);
3569 (*proc)->u.generic = NULL;
3570 while (peek_atom () != ATOM_RPAREN)
3572 gfc_symtree** sym_root;
3574 g = gfc_get_tbp_generic ();
3577 require_atom (ATOM_STRING);
3578 sym_root = ¤t_f2k_derived->tb_sym_root;
3579 g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3582 g->next = (*proc)->u.generic;
3583 (*proc)->u.generic = g;
3589 else if (!(*proc)->ppc)
3590 mio_symtree_ref (&(*proc)->u.specific);
3595 /* Walker-callback function for this purpose. */
3597 mio_typebound_symtree (gfc_symtree* st)
3599 if (iomode == IO_OUTPUT && !st->n.tb)
3602 if (iomode == IO_OUTPUT)
3605 mio_allocated_string (st->name);
3607 /* For IO_INPUT, the above is done in mio_f2k_derived. */
3609 mio_typebound_proc (&st->n.tb);
3613 /* IO a full symtree (in all depth). */
3615 mio_full_typebound_tree (gfc_symtree** root)
3619 if (iomode == IO_OUTPUT)
3620 gfc_traverse_symtree (*root, &mio_typebound_symtree);
3623 while (peek_atom () == ATOM_LPAREN)
3629 require_atom (ATOM_STRING);
3630 st = gfc_get_tbp_symtree (root, atom_string);
3633 mio_typebound_symtree (st);
3641 mio_finalizer (gfc_finalizer **f)
3643 if (iomode == IO_OUTPUT)
3646 gcc_assert ((*f)->proc_tree); /* Should already be resolved. */
3647 mio_symtree_ref (&(*f)->proc_tree);
3651 *f = gfc_get_finalizer ();
3652 (*f)->where = gfc_current_locus; /* Value should not matter. */
3655 mio_symtree_ref (&(*f)->proc_tree);
3656 (*f)->proc_sym = NULL;
3661 mio_f2k_derived (gfc_namespace *f2k)
3663 current_f2k_derived = f2k;
3665 /* Handle the list of finalizer procedures. */
3667 if (iomode == IO_OUTPUT)
3670 for (f = f2k->finalizers; f; f = f->next)
3675 f2k->finalizers = NULL;
3676 while (peek_atom () != ATOM_RPAREN)
3678 gfc_finalizer *cur = NULL;
3679 mio_finalizer (&cur);
3680 cur->next = f2k->finalizers;
3681 f2k->finalizers = cur;
3686 /* Handle type-bound procedures. */
3687 mio_full_typebound_tree (&f2k->tb_sym_root);
3689 /* Type-bound user operators. */
3690 mio_full_typebound_tree (&f2k->tb_uop_root);
3692 /* Type-bound intrinsic operators. */
3694 if (iomode == IO_OUTPUT)
3697 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3699 gfc_intrinsic_op realop;
3701 if (op == INTRINSIC_USER || !f2k->tb_op[op])
3705 realop = (gfc_intrinsic_op) op;
3706 mio_intrinsic_op (&realop);
3707 mio_typebound_proc (&f2k->tb_op[op]);
3712 while (peek_atom () != ATOM_RPAREN)
3714 gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC. */
3717 mio_intrinsic_op (&op);
3718 mio_typebound_proc (&f2k->tb_op[op]);
3725 mio_full_f2k_derived (gfc_symbol *sym)
3729 if (iomode == IO_OUTPUT)
3731 if (sym->f2k_derived)
3732 mio_f2k_derived (sym->f2k_derived);
3736 if (peek_atom () != ATOM_RPAREN)
3738 sym->f2k_derived = gfc_get_namespace (NULL, 0);
3739 mio_f2k_derived (sym->f2k_derived);
3742 gcc_assert (!sym->f2k_derived);
3749 /* Unlike most other routines, the address of the symbol node is already
3750 fixed on input and the name/module has already been filled in. */
3753 mio_symbol (gfc_symbol *sym)
3755 int intmod = INTMOD_NONE;
3759 mio_symbol_attribute (&sym->attr);
3760 mio_typespec (&sym->ts);
3761 if (sym->ts.type == BT_CLASS)
3762 sym->attr.class_ok = 1;
3764 if (iomode == IO_OUTPUT)
3765 mio_namespace_ref (&sym->formal_ns);
3768 mio_namespace_ref (&sym->formal_ns);
3771 sym->formal_ns->proc_name = sym;
3776 /* Save/restore common block links. */
3777 mio_symbol_ref (&sym->common_next);
3779 mio_formal_arglist (&sym->formal);
3781 if (sym->attr.flavor == FL_PARAMETER)
3782 mio_expr (&sym->value);
3784 mio_array_spec (&sym->as);
3786 mio_symbol_ref (&sym->result);
3788 if (sym->attr.cray_pointee)
3789 mio_symbol_ref (&sym->cp_pointer);
3791 /* Note that components are always saved, even if they are supposed
3792 to be private. Component access is checked during searching. */
3794 mio_component_list (&sym->components, sym->attr.vtype);
3796 if (sym->components != NULL)
3797 sym->component_access
3798 = MIO_NAME (gfc_access) (sym->component_access, access_types);
3800 /* Load/save the f2k_derived namespace of a derived-type symbol. */
3801 mio_full_f2k_derived (sym);
3805 /* Add the fields that say whether this is from an intrinsic module,
3806 and if so, what symbol it is within the module. */
3807 /* mio_integer (&(sym->from_intmod)); */
3808 if (iomode == IO_OUTPUT)
3810 intmod = sym->from_intmod;
3811 mio_integer (&intmod);
3815 mio_integer (&intmod);
3816 sym->from_intmod = (intmod_id) intmod;
3819 mio_integer (&(sym->intmod_sym_id));
3821 if (sym->attr.flavor == FL_DERIVED)
3822 mio_integer (&(sym->hash_value));
3828 /************************* Top level subroutines *************************/
3830 /* Given a root symtree node and a symbol, try to find a symtree that
3831 references the symbol that is not a unique name. */
3833 static gfc_symtree *
3834 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3836 gfc_symtree *s = NULL;
3841 s = find_symtree_for_symbol (st->right, sym);
3844 s = find_symtree_for_symbol (st->left, sym);
3848 if (st->n.sym == sym && !check_unique_name (st->name))
3855 /* A recursive function to look for a specific symbol by name and by
3856 module. Whilst several symtrees might point to one symbol, its
3857 is sufficient for the purposes here than one exist. Note that
3858 generic interfaces are distinguished as are symbols that have been
3859 renamed in another module. */
3860 static gfc_symtree *
3861 find_symbol (gfc_symtree *st, const char *name,
3862 const char *module, int generic)
3865 gfc_symtree *retval, *s;
3867 if (st == NULL || st->n.sym == NULL)
3870 c = strcmp (name, st->n.sym->name);
3871 if (c == 0 && st->n.sym->module
3872 && strcmp (module, st->n.sym->module) == 0
3873 && !check_unique_name (st->name))
3875 s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3877 /* Detect symbols that are renamed by use association in another
3878 module by the absence of a symtree and null attr.use_rename,
3879 since the latter is not transmitted in the module file. */
3880 if (((!generic && !st->n.sym->attr.generic)
3881 || (generic && st->n.sym->attr.generic))
3882 && !(s == NULL && !st->n.sym->attr.use_rename))
3886 retval = find_symbol (st->left, name, module, generic);
3889 retval = find_symbol (st->right, name, module, generic);
3895 /* Skip a list between balanced left and right parens. */
3905 switch (parse_atom ())
3928 /* Load operator interfaces from the module. Interfaces are unusual
3929 in that they attach themselves to existing symbols. */
3932 load_operator_interfaces (void)
3935 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3937 pointer_info *pi = NULL;
3942 while (peek_atom () != ATOM_RPAREN)
3946 mio_internal_string (name);
3947 mio_internal_string (module);
3949 n = number_use_names (name, true);
3952 for (i = 1; i <= n; i++)
3954 /* Decide if we need to load this one or not. */
3955 p = find_use_name_n (name, &i, true);
3959 while (parse_atom () != ATOM_RPAREN);
3965 uop = gfc_get_uop (p);
3966 pi = mio_interface_rest (&uop->op);
3970 if (gfc_find_uop (p, NULL))
3972 uop = gfc_get_uop (p);
3973 uop->op = gfc_get_interface ();
3974 uop->op->where = gfc_current_locus;
3975 add_fixup (pi->integer, &uop->op->sym);
3984 /* Load interfaces from the module. Interfaces are unusual in that
3985 they attach themselves to existing symbols. */
3988 load_generic_interfaces (void)
3991 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3993 gfc_interface *generic = NULL, *gen = NULL;
3995 bool ambiguous_set = false;
3999 while (peek_atom () != ATOM_RPAREN)
4003 mio_internal_string (name);
4004 mio_internal_string (module);
4006 n = number_use_names (name, false);
4007 renamed = n ? 1 : 0;
4010 for (i = 1; i <= n; i++)
4013 /* Decide if we need to load this one or not. */
4014 p = find_use_name_n (name, &i, false);
4016 st = find_symbol (gfc_current_ns->sym_root,
4017 name, module_name, 1);
4019 if (!p || gfc_find_symbol (p, NULL, 0, &sym))
4021 /* Skip the specific names for these cases. */
4022 while (i == 1 && parse_atom () != ATOM_RPAREN);
4027 /* If the symbol exists already and is being USEd without being
4028 in an ONLY clause, do not load a new symtree(11.3.2). */
4029 if (!only_flag && st)
4037 if (strcmp (st->name, p) != 0)
4039 st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
4045 /* Since we haven't found a valid generic interface, we had
4049 gfc_get_symbol (p, NULL, &sym);
4050 sym->name = gfc_get_string (name);
4051 sym->module = module_name;
4052 sym->attr.flavor = FL_PROCEDURE;
4053 sym->attr.generic = 1;
4054 sym->attr.use_assoc = 1;
4059 /* Unless sym is a generic interface, this reference
4062 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4066 if (st && !sym->attr.generic
4069 && strcmp(module, sym->module))
4071 ambiguous_set = true;
4076 sym->attr.use_only = only_flag;
4077 sym->attr.use_rename = renamed;
4081 mio_interface_rest (&sym->generic);
4082 generic = sym->generic;
4084 else if (!sym->generic)
4086 sym->generic = generic;
4087 sym->attr.generic_copy = 1;
4090 /* If a procedure that is not generic has generic interfaces
4091 that include itself, it is generic! We need to take care
4092 to retain symbols ambiguous that were already so. */
4093 if (sym->attr.use_assoc
4094 && !sym->attr.generic
4095 && sym->attr.flavor == FL_PROCEDURE)
4097 for (gen = generic; gen; gen = gen->next)
4099 if (gen->sym == sym)
4101 sym->attr.generic = 1;
4116 /* Load common blocks. */
4121 char name[GFC_MAX_SYMBOL_LEN + 1];
4126 while (peek_atom () != ATOM_RPAREN)
4130 mio_internal_string (name);
4132 p = gfc_get_common (name, 1);
4134 mio_symbol_ref (&p->head);
4135 mio_integer (&flags);
4139 p->threadprivate = 1;
4142 /* Get whether this was a bind(c) common or not. */
4143 mio_integer (&p->is_bind_c);
4144 /* Get the binding label. */
4145 mio_internal_string (p->binding_label);
4154 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
4155 so that unused variables are not loaded and so that the expression can
4161 gfc_equiv *head, *tail, *end, *eq;
4165 in_load_equiv = true;
4167 end = gfc_current_ns->equiv;
4168 while (end != NULL && end->next != NULL)
4171 while (peek_atom () != ATOM_RPAREN) {
4175 while(peek_atom () != ATOM_RPAREN)
4178 head = tail = gfc_get_equiv ();
4181 tail->eq = gfc_get_equiv ();
4185 mio_pool_string (&tail->module);
4186 mio_expr (&tail->expr);
4189 /* Unused equivalence members have a unique name. In addition, it
4190 must be checked that the symbols are from the same module. */
4192 for (eq = head; eq; eq = eq->eq)
4194 if (eq->expr->symtree->n.sym->module
4195 && head->expr->symtree->n.sym->module
4196 && strcmp (head->expr->symtree->n.sym->module,
4197 eq->expr->symtree->n.sym->module) == 0
4198 && !check_unique_name (eq->expr->symtree->name))
4207 for (eq = head; eq; eq = head)
4210 gfc_free_expr (eq->expr);
4216 gfc_current_ns->equiv = head;
4227 in_load_equiv = false;
4231 /* This function loads the sym_root of f2k_derived with the extensions to
4232 the derived type. */
4234 load_derived_extensions (void)
4237 gfc_symbol *derived;
4241 char name[GFC_MAX_SYMBOL_LEN + 1];
4242 char module[GFC_MAX_SYMBOL_LEN + 1];
4246 while (peek_atom () != ATOM_RPAREN)
4249 mio_integer (&symbol);
4250 info = get_integer (symbol);
4251 derived = info->u.rsym.sym;
4253 /* This one is not being loaded. */
4254 if (!info || !derived)
4256 while (peek_atom () != ATOM_RPAREN)
4261 gcc_assert (derived->attr.flavor == FL_DERIVED);
4262 if (derived->f2k_derived == NULL)
4263 derived->f2k_derived = gfc_get_namespace (NULL, 0);
4265 while (peek_atom () != ATOM_RPAREN)
4268 mio_internal_string (name);
4269 mio_internal_string (module);
4271 /* Only use one use name to find the symbol. */
4273 p = find_use_name_n (name, &j, false);
4276 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4278 st = gfc_find_symtree (derived->f2k_derived->sym_root, name);
4281 /* Only use the real name in f2k_derived to ensure a single
4283 st = gfc_new_symtree (&derived->f2k_derived->sym_root, name);
4296 /* Recursive function to traverse the pointer_info tree and load a
4297 needed symbol. We return nonzero if we load a symbol and stop the
4298 traversal, because the act of loading can alter the tree. */
4301 load_needed (pointer_info *p)
4312 rv |= load_needed (p->left);
4313 rv |= load_needed (p->right);
4315 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
4318 p->u.rsym.state = USED;
4320 set_module_locus (&p->u.rsym.where);
4322 sym = p->u.rsym.sym;
4325 q = get_integer (p->u.rsym.ns);
4327 ns = (gfc_namespace *) q->u.pointer;
4330 /* Create an interface namespace if necessary. These are
4331 the namespaces that hold the formal parameters of module
4334 ns = gfc_get_namespace (NULL, 0);
4335 associate_integer_pointer (q, ns);
4338 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
4339 doesn't go pear-shaped if the symbol is used. */
4341 gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
4344 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
4345 sym->name = dt_lower_string (p->u.rsym.true_name);
4346 sym->module = gfc_get_string (p->u.rsym.module);
4347 strcpy (sym->binding_label, p->u.rsym.binding_label);
4349 associate_integer_pointer (p, sym);
4353 sym->attr.use_assoc = 1;
4355 /* Mark as only or rename for later diagnosis for explicitly imported
4356 but not used warnings; don't mark internal symbols such as __vtab,
4358 if (only_flag && sym->name[0] != '_' && sym->name[1] != '_')
4359 sym->attr.use_only = 1;
4360 if (p->u.rsym.renamed)
4361 sym->attr.use_rename = 1;
4367 /* Recursive function for cleaning up things after a module has been read. */
4370 read_cleanup (pointer_info *p)
4378 read_cleanup (p->left);
4379 read_cleanup (p->right);
4381 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
4384 /* Add hidden symbols to the symtree. */
4385 q = get_integer (p->u.rsym.ns);
4386 ns = (gfc_namespace *) q->u.pointer;
4388 if (!p->u.rsym.sym->attr.vtype
4389 && !p->u.rsym.sym->attr.vtab)
4390 st = gfc_get_unique_symtree (ns);
4393 /* There is no reason to use 'unique_symtrees' for vtabs or
4394 vtypes - their name is fine for a symtree and reduces the
4395 namespace pollution. */
4396 st = gfc_find_symtree (ns->sym_root, p->u.rsym.sym->name);
4398 st = gfc_new_symtree (&ns->sym_root, p->u.rsym.sym->name);
4401 st->n.sym = p->u.rsym.sym;
4404 /* Fixup any symtree references. */
4405 p->u.rsym.symtree = st;
4406 resolve_fixups (p->u.rsym.stfixup, st);
4407 p->u.rsym.stfixup = NULL;
4410 /* Free unused symbols. */
4411 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
4412 gfc_free_symbol (p->u.rsym.sym);
4416 /* It is not quite enough to check for ambiguity in the symbols by
4417 the loaded symbol and the new symbol not being identical. */
4419 check_for_ambiguous (gfc_symbol *st_sym, pointer_info *info)
4423 symbol_attribute attr;
4425 if (st_sym->ns->proc_name && st_sym->name == st_sym->ns->proc_name->name)
4427 gfc_error ("'%s' of module '%s', imported at %C, is also the name of the "
4428 "current program unit", st_sym->name, module_name);
4432 rsym = info->u.rsym.sym;
4436 if (st_sym->attr.vtab || st_sym->attr.vtype)
4439 /* If the existing symbol is generic from a different module and
4440 the new symbol is generic there can be no ambiguity. */
4441 if (st_sym->attr.generic
4443 && st_sym->module != module_name)
4445 /* The new symbol's attributes have not yet been read. Since
4446 we need attr.generic, read it directly. */
4447 get_module_locus (&locus);
4448 set_module_locus (&info->u.rsym.where);
4451 mio_symbol_attribute (&attr);
4452 set_module_locus (&locus);
4461 /* Read a module file. */
4466 module_locus operator_interfaces, user_operators, extensions;
4468 char name[GFC_MAX_SYMBOL_LEN + 1];
4470 int ambiguous, j, nuse, symbol;
4471 pointer_info *info, *q;
4472 gfc_use_rename *u = NULL;
4476 get_module_locus (&operator_interfaces); /* Skip these for now. */
4479 get_module_locus (&user_operators);
4483 /* Skip commons, equivalences and derived type extensions for now. */
4487 get_module_locus (&extensions);
4492 /* Create the fixup nodes for all the symbols. */
4494 while (peek_atom () != ATOM_RPAREN)
4496 require_atom (ATOM_INTEGER);
4497 info = get_integer (atom_int);
4499 info->type = P_SYMBOL;
4500 info->u.rsym.state = UNUSED;
4502 mio_internal_string (info->u.rsym.true_name);
4503 mio_internal_string (info->u.rsym.module);
4504 mio_internal_string (info->u.rsym.binding_label);
4507 require_atom (ATOM_INTEGER);
4508 info->u.rsym.ns = atom_int;
4510 get_module_locus (&info->u.rsym.where);
4513 /* See if the symbol has already been loaded by a previous module.
4514 If so, we reference the existing symbol and prevent it from
4515 being loaded again. This should not happen if the symbol being
4516 read is an index for an assumed shape dummy array (ns != 1). */
4518 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
4521 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
4524 info->u.rsym.state = USED;
4525 info->u.rsym.sym = sym;
4527 /* Some symbols do not have a namespace (eg. formal arguments),
4528 so the automatic "unique symtree" mechanism must be suppressed
4529 by marking them as referenced. */
4530 q = get_integer (info->u.rsym.ns);
4531 if (q->u.pointer == NULL)
4533 info->u.rsym.referenced = 1;
4537 /* If possible recycle the symtree that references the symbol.
4538 If a symtree is not found and the module does not import one,
4539 a unique-name symtree is found by read_cleanup. */
4540 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
4543 info->u.rsym.symtree = st;
4544 info->u.rsym.referenced = 1;
4550 /* Parse the symtree lists. This lets us mark which symbols need to
4551 be loaded. Renaming is also done at this point by replacing the
4556 while (peek_atom () != ATOM_RPAREN)
4558 mio_internal_string (name);
4559 mio_integer (&ambiguous);
4560 mio_integer (&symbol);
4562 info = get_integer (symbol);
4564 /* See how many use names there are. If none, go through the start
4565 of the loop at least once. */
4566 nuse = number_use_names (name, false);
4567 info->u.rsym.renamed = nuse ? 1 : 0;
4572 for (j = 1; j <= nuse; j++)
4574 /* Get the jth local name for this symbol. */
4575 p = find_use_name_n (name, &j, false);
4577 if (p == NULL && strcmp (name, module_name) == 0)
4580 /* Exception: Always import vtabs & vtypes. */
4581 if (p == NULL && name[0] == '_'
4582 && (strncmp (name, "__vtab_", 5) == 0
4583 || strncmp (name, "__vtype_", 6) == 0))
4586 /* Skip symtree nodes not in an ONLY clause, unless there
4587 is an existing symtree loaded from another USE statement. */
4590 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4592 info->u.rsym.symtree = st;
4596 /* If a symbol of the same name and module exists already,
4597 this symbol, which is not in an ONLY clause, must not be
4598 added to the namespace(11.3.2). Note that find_symbol
4599 only returns the first occurrence that it finds. */
4600 if (!only_flag && !info->u.rsym.renamed
4601 && strcmp (name, module_name) != 0
4602 && find_symbol (gfc_current_ns->sym_root, name,
4606 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4610 /* Check for ambiguous symbols. */
4611 if (check_for_ambiguous (st->n.sym, info))
4613 info->u.rsym.symtree = st;
4617 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4619 /* Create a symtree node in the current namespace for this
4621 st = check_unique_name (p)
4622 ? gfc_get_unique_symtree (gfc_current_ns)
4623 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
4624 st->ambiguous = ambiguous;
4626 sym = info->u.rsym.sym;
4628 /* Create a symbol node if it doesn't already exist. */
4631 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
4633 info->u.rsym.sym->name = dt_lower_string (info->u.rsym.true_name);
4634 sym = info->u.rsym.sym;
4635 sym->module = gfc_get_string (info->u.rsym.module);
4637 /* TODO: hmm, can we test this? Do we know it will be
4638 initialized to zeros? */
4639 if (info->u.rsym.binding_label[0] != '\0')
4640 strcpy (sym->binding_label, info->u.rsym.binding_label);
4646 if (strcmp (name, p) != 0)
4647 sym->attr.use_rename = 1;
4650 || (strncmp (name, "__vtab_", 5) != 0
4651 && strncmp (name, "__vtype_", 6) != 0))
4652 sym->attr.use_only = only_flag;
4654 /* Store the symtree pointing to this symbol. */
4655 info->u.rsym.symtree = st;
4657 if (info->u.rsym.state == UNUSED)
4658 info->u.rsym.state = NEEDED;
4659 info->u.rsym.referenced = 1;
4666 /* Load intrinsic operator interfaces. */
4667 set_module_locus (&operator_interfaces);
4670 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4672 if (i == INTRINSIC_USER)
4677 u = find_use_operator ((gfc_intrinsic_op) i);
4688 mio_interface (&gfc_current_ns->op[i]);
4689 if (u && !gfc_current_ns->op[i])
4695 /* Load generic and user operator interfaces. These must follow the
4696 loading of symtree because otherwise symbols can be marked as
4699 set_module_locus (&user_operators);
4701 load_operator_interfaces ();
4702 load_generic_interfaces ();
4707 /* At this point, we read those symbols that are needed but haven't
4708 been loaded yet. If one symbol requires another, the other gets
4709 marked as NEEDED if its previous state was UNUSED. */
4711 while (load_needed (pi_root));
4713 /* Make sure all elements of the rename-list were found in the module. */
4715 for (u = gfc_rename_list; u; u = u->next)
4720 if (u->op == INTRINSIC_NONE)
4722 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
4723 u->use_name, &u->where, module_name);
4727 if (u->op == INTRINSIC_USER)
4729 gfc_error ("User operator '%s' referenced at %L not found "
4730 "in module '%s'", u->use_name, &u->where, module_name);
4734 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4735 "in module '%s'", gfc_op2string (u->op), &u->where,
4739 /* Now we should be in a position to fill f2k_derived with derived type
4740 extensions, since everything has been loaded. */
4741 set_module_locus (&extensions);
4742 load_derived_extensions ();
4744 /* Clean up symbol nodes that were never loaded, create references
4745 to hidden symbols. */
4747 read_cleanup (pi_root);
4751 /* Given an access type that is specific to an entity and the default
4752 access, return nonzero if the entity is publicly accessible. If the
4753 element is declared as PUBLIC, then it is public; if declared
4754 PRIVATE, then private, and otherwise it is public unless the default
4755 access in this context has been declared PRIVATE. */
4758 check_access (gfc_access specific_access, gfc_access default_access)
4760 if (specific_access == ACCESS_PUBLIC)
4762 if (specific_access == ACCESS_PRIVATE)
4765 if (gfc_option.flag_module_private)
4766 return default_access == ACCESS_PUBLIC;
4768 return default_access != ACCESS_PRIVATE;
4773 gfc_check_symbol_access (gfc_symbol *sym)
4775 if (sym->attr.vtab || sym->attr.vtype)
4778 return check_access (sym->attr.access, sym->ns->default_access);
4782 /* A structure to remember which commons we've already written. */
4784 struct written_common
4786 BBT_HEADER(written_common);
4787 const char *name, *label;
4790 static struct written_common *written_commons = NULL;
4792 /* Comparison function used for balancing the binary tree. */
4795 compare_written_commons (void *a1, void *b1)
4797 const char *aname = ((struct written_common *) a1)->name;
4798 const char *alabel = ((struct written_common *) a1)->label;
4799 const char *bname = ((struct written_common *) b1)->name;
4800 const char *blabel = ((struct written_common *) b1)->label;
4801 int c = strcmp (aname, bname);
4803 return (c != 0 ? c : strcmp (alabel, blabel));
4806 /* Free a list of written commons. */
4809 free_written_common (struct written_common *w)
4815 free_written_common (w->left);
4817 free_written_common (w->right);
4822 /* Write a common block to the module -- recursive helper function. */
4825 write_common_0 (gfc_symtree *st, bool this_module)
4831 struct written_common *w;
4832 bool write_me = true;
4837 write_common_0 (st->left, this_module);
4839 /* We will write out the binding label, or the name if no label given. */
4840 name = st->n.common->name;
4842 label = p->is_bind_c ? p->binding_label : p->name;
4844 /* Check if we've already output this common. */
4845 w = written_commons;
4848 int c = strcmp (name, w->name);
4849 c = (c != 0 ? c : strcmp (label, w->label));
4853 w = (c < 0) ? w->left : w->right;
4856 if (this_module && p->use_assoc)
4861 /* Write the common to the module. */
4863 mio_pool_string (&name);
4865 mio_symbol_ref (&p->head);
4866 flags = p->saved ? 1 : 0;
4867 if (p->threadprivate)
4869 mio_integer (&flags);
4871 /* Write out whether the common block is bind(c) or not. */
4872 mio_integer (&(p->is_bind_c));
4874 mio_pool_string (&label);
4877 /* Record that we have written this common. */
4878 w = XCNEW (struct written_common);
4881 gfc_insert_bbt (&written_commons, w, compare_written_commons);
4884 write_common_0 (st->right, this_module);
4888 /* Write a common, by initializing the list of written commons, calling
4889 the recursive function write_common_0() and cleaning up afterwards. */
4892 write_common (gfc_symtree *st)
4894 written_commons = NULL;
4895 write_common_0 (st, true);
4896 write_common_0 (st, false);
4897 free_written_common (written_commons);
4898 written_commons = NULL;
4902 /* Write the blank common block to the module. */
4905 write_blank_common (void)
4907 const char * name = BLANK_COMMON_NAME;
4909 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
4910 this, but it hasn't been checked. Just making it so for now. */
4913 if (gfc_current_ns->blank_common.head == NULL)
4918 mio_pool_string (&name);
4920 mio_symbol_ref (&gfc_current_ns->blank_common.head);
4921 saved = gfc_current_ns->blank_common.saved;
4922 mio_integer (&saved);
4924 /* Write out whether the common block is bind(c) or not. */
4925 mio_integer (&is_bind_c);
4927 /* Write out the binding label, which is BLANK_COMMON_NAME, though
4928 it doesn't matter because the label isn't used. */
4929 mio_pool_string (&name);
4935 /* Write equivalences to the module. */
4944 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
4948 for (e = eq; e; e = e->eq)
4950 if (e->module == NULL)
4951 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
4952 mio_allocated_string (e->module);
4953 mio_expr (&e->expr);
4962 /* Write derived type extensions to the module. */
4965 write_dt_extensions (gfc_symtree *st)
4967 if (!gfc_check_symbol_access (st->n.sym))
4969 if (!(st->n.sym->ns && st->n.sym->ns->proc_name
4970 && st->n.sym->ns->proc_name->attr.flavor == FL_MODULE))
4974 mio_pool_string (&st->name);
4975 if (st->n.sym->module != NULL)
4976 mio_pool_string (&st->n.sym->module);
4979 char name[GFC_MAX_SYMBOL_LEN + 1];
4980 if (iomode == IO_OUTPUT)
4981 strcpy (name, module_name);
4982 mio_internal_string (name);
4983 if (iomode == IO_INPUT)
4984 module_name = gfc_get_string (name);
4990 write_derived_extensions (gfc_symtree *st)
4992 if (!((st->n.sym->attr.flavor == FL_DERIVED)
4993 && (st->n.sym->f2k_derived != NULL)
4994 && (st->n.sym->f2k_derived->sym_root != NULL)))
4998 mio_symbol_ref (&(st->n.sym));
4999 gfc_traverse_symtree (st->n.sym->f2k_derived->sym_root,
5000 write_dt_extensions);
5005 /* Write a symbol to the module. */
5008 write_symbol (int n, gfc_symbol *sym)
5012 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
5013 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
5017 if (sym->attr.flavor == FL_DERIVED)
5020 name = dt_upper_string (sym->name);
5021 mio_pool_string (&name);
5024 mio_pool_string (&sym->name);
5026 mio_pool_string (&sym->module);
5027 if (sym->attr.is_bind_c || sym->attr.is_iso_c)
5029 label = sym->binding_label;
5030 mio_pool_string (&label);
5033 mio_pool_string (&sym->name);
5035 mio_pointer_ref (&sym->ns);
5042 /* Recursive traversal function to write the initial set of symbols to
5043 the module. We check to see if the symbol should be written
5044 according to the access specification. */
5047 write_symbol0 (gfc_symtree *st)
5051 bool dont_write = false;
5056 write_symbol0 (st->left);
5059 if (sym->module == NULL)
5060 sym->module = module_name;
5062 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5063 && !sym->attr.subroutine && !sym->attr.function)
5066 if (!gfc_check_symbol_access (sym))
5071 p = get_pointer (sym);
5072 if (p->type == P_UNKNOWN)
5075 if (p->u.wsym.state != WRITTEN)
5077 write_symbol (p->integer, sym);
5078 p->u.wsym.state = WRITTEN;
5082 write_symbol0 (st->right);
5086 /* Recursive traversal function to write the secondary set of symbols
5087 to the module file. These are symbols that were not public yet are
5088 needed by the public symbols or another dependent symbol. The act
5089 of writing a symbol can modify the pointer_info tree, so we cease
5090 traversal if we find a symbol to write. We return nonzero if a
5091 symbol was written and pass that information upwards. */
5094 write_symbol1 (pointer_info *p)
5101 result = write_symbol1 (p->left);
5103 if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
5105 p->u.wsym.state = WRITTEN;
5106 write_symbol (p->integer, p->u.wsym.sym);
5110 result |= write_symbol1 (p->right);
5115 /* Write operator interfaces associated with a symbol. */
5118 write_operator (gfc_user_op *uop)
5120 static char nullstring[] = "";
5121 const char *p = nullstring;
5123 if (uop->op == NULL || !check_access (uop->access, uop->ns->default_access))
5126 mio_symbol_interface (&uop->name, &p, &uop->op);
5130 /* Write generic interfaces from the namespace sym_root. */
5133 write_generic (gfc_symtree *st)
5140 write_generic (st->left);
5141 write_generic (st->right);
5144 if (!sym || check_unique_name (st->name))
5147 if (sym->generic == NULL || !gfc_check_symbol_access (sym))
5150 if (sym->module == NULL)
5151 sym->module = module_name;
5153 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
5158 write_symtree (gfc_symtree *st)
5165 /* A symbol in an interface body must not be visible in the
5167 if (sym->ns != gfc_current_ns
5168 && sym->ns->proc_name
5169 && sym->ns->proc_name->attr.if_source == IFSRC_IFBODY)
5172 if (!gfc_check_symbol_access (sym)
5173 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5174 && !sym->attr.subroutine && !sym->attr.function))
5177 if (check_unique_name (st->name))
5180 p = find_pointer (sym);
5182 gfc_internal_error ("write_symtree(): Symbol not written");
5184 mio_pool_string (&st->name);
5185 mio_integer (&st->ambiguous);
5186 mio_integer (&p->integer);
5195 /* Write the operator interfaces. */
5198 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
5200 if (i == INTRINSIC_USER)
5203 mio_interface (check_access (gfc_current_ns->operator_access[i],
5204 gfc_current_ns->default_access)
5205 ? &gfc_current_ns->op[i] : NULL);
5213 gfc_traverse_user_op (gfc_current_ns, write_operator);
5219 write_generic (gfc_current_ns->sym_root);
5225 write_blank_common ();
5226 write_common (gfc_current_ns->common_root);
5238 gfc_traverse_symtree (gfc_current_ns->sym_root,
5239 write_derived_extensions);
5244 /* Write symbol information. First we traverse all symbols in the
5245 primary namespace, writing those that need to be written.
5246 Sometimes writing one symbol will cause another to need to be
5247 written. A list of these symbols ends up on the write stack, and
5248 we end by popping the bottom of the stack and writing the symbol
5249 until the stack is empty. */
5253 write_symbol0 (gfc_current_ns->sym_root);
5254 while (write_symbol1 (pi_root))
5263 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
5268 /* Read a MD5 sum from the header of a module file. If the file cannot
5269 be opened, or we have any other error, we return -1. */
5272 read_md5_from_module_file (const char * filename, unsigned char md5[16])
5278 /* Open the file. */
5279 if ((file = fopen (filename, "r")) == NULL)
5282 /* Read the first line. */
5283 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5289 /* The file also needs to be overwritten if the version number changed. */
5290 n = strlen ("GFORTRAN module version '" MOD_VERSION "' created");
5291 if (strncmp (buf, "GFORTRAN module version '" MOD_VERSION "' created", n) != 0)
5297 /* Read a second line. */
5298 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5304 /* Close the file. */
5307 /* If the header is not what we expect, or is too short, bail out. */
5308 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
5311 /* Now, we have a real MD5, read it into the array. */
5312 for (n = 0; n < 16; n++)
5316 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
5326 /* Given module, dump it to disk. If there was an error while
5327 processing the module, dump_flag will be set to zero and we delete
5328 the module file, even if it was already there. */
5331 gfc_dump_module (const char *name, int dump_flag)
5334 char *filename, *filename_tmp;
5336 unsigned char md5_new[16], md5_old[16];
5338 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
5339 if (gfc_option.module_dir != NULL)
5341 n += strlen (gfc_option.module_dir);
5342 filename = (char *) alloca (n);
5343 strcpy (filename, gfc_option.module_dir);
5344 strcat (filename, name);
5348 filename = (char *) alloca (n);
5349 strcpy (filename, name);
5351 strcat (filename, MODULE_EXTENSION);
5353 /* Name of the temporary file used to write the module. */
5354 filename_tmp = (char *) alloca (n + 1);
5355 strcpy (filename_tmp, filename);
5356 strcat (filename_tmp, "0");
5358 /* There was an error while processing the module. We delete the
5359 module file, even if it was already there. */
5366 if (gfc_cpp_makedep ())
5367 gfc_cpp_add_target (filename);
5369 /* Write the module to the temporary file. */
5370 module_fp = fopen (filename_tmp, "w");
5371 if (module_fp == NULL)
5372 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
5373 filename_tmp, xstrerror (errno));
5375 /* Write the header, including space reserved for the MD5 sum. */
5376 fprintf (module_fp, "GFORTRAN module version '%s' created from %s\n"
5377 "MD5:", MOD_VERSION, gfc_source_file);
5378 fgetpos (module_fp, &md5_pos);
5379 fputs ("00000000000000000000000000000000 -- "
5380 "If you edit this, you'll get what you deserve.\n\n", module_fp);
5382 /* Initialize the MD5 context that will be used for output. */
5383 md5_init_ctx (&ctx);
5385 /* Write the module itself. */
5387 module_name = gfc_get_string (name);
5393 free_pi_tree (pi_root);
5398 /* Write the MD5 sum to the header of the module file. */
5399 md5_finish_ctx (&ctx, md5_new);
5400 fsetpos (module_fp, &md5_pos);
5401 for (n = 0; n < 16; n++)
5402 fprintf (module_fp, "%02x", md5_new[n]);
5404 if (fclose (module_fp))
5405 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
5406 filename_tmp, xstrerror (errno));
5408 /* Read the MD5 from the header of the old module file and compare. */
5409 if (read_md5_from_module_file (filename, md5_old) != 0
5410 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
5412 /* Module file have changed, replace the old one. */
5413 if (unlink (filename) && errno != ENOENT)
5414 gfc_fatal_error ("Can't delete module file '%s': %s", filename,
5416 if (rename (filename_tmp, filename))
5417 gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
5418 filename_tmp, filename, xstrerror (errno));
5422 if (unlink (filename_tmp))
5423 gfc_fatal_error ("Can't delete temporary module file '%s': %s",
5424 filename_tmp, xstrerror (errno));
5430 create_intrinsic_function (const char *name, gfc_isym_id id,
5431 const char *modname, intmod_id module)
5433 gfc_intrinsic_sym *isym;
5434 gfc_symtree *tmp_symtree;
5437 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5440 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5442 gfc_error ("Symbol '%s' already declared", name);
5445 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5446 sym = tmp_symtree->n.sym;
5448 isym = gfc_intrinsic_function_by_id (id);
5451 sym->attr.flavor = FL_PROCEDURE;
5452 sym->attr.intrinsic = 1;
5454 sym->module = gfc_get_string (modname);
5455 sym->attr.use_assoc = 1;
5456 sym->from_intmod = module;
5457 sym->intmod_sym_id = id;
5461 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
5462 the current namespace for all named constants, pointer types, and
5463 procedures in the module unless the only clause was used or a rename
5464 list was provided. */
5467 import_iso_c_binding_module (void)
5469 gfc_symbol *mod_sym = NULL;
5470 gfc_symtree *mod_symtree = NULL;
5471 const char *iso_c_module_name = "__iso_c_binding";
5475 /* Look only in the current namespace. */
5476 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
5478 if (mod_symtree == NULL)
5480 /* symtree doesn't already exist in current namespace. */
5481 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree,
5484 if (mod_symtree != NULL)
5485 mod_sym = mod_symtree->n.sym;
5487 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
5488 "create symbol for %s", iso_c_module_name);
5490 mod_sym->attr.flavor = FL_MODULE;
5491 mod_sym->attr.intrinsic = 1;
5492 mod_sym->module = gfc_get_string (iso_c_module_name);
5493 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
5496 /* Generate the symbols for the named constants representing
5497 the kinds for intrinsic data types. */
5498 for (i = 0; i < ISOCBINDING_NUMBER; i++)
5501 for (u = gfc_rename_list; u; u = u->next)
5502 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
5511 #define NAMED_FUNCTION(a,b,c,d) \
5513 not_in_std = (gfc_option.allow_std & d) == 0; \
5516 #include "iso-c-binding.def"
5517 #undef NAMED_FUNCTION
5518 #define NAMED_INTCST(a,b,c,d) \
5520 not_in_std = (gfc_option.allow_std & d) == 0; \
5523 #include "iso-c-binding.def"
5525 #define NAMED_REALCST(a,b,c,d) \
5527 not_in_std = (gfc_option.allow_std & d) == 0; \
5530 #include "iso-c-binding.def"
5531 #undef NAMED_REALCST
5532 #define NAMED_CMPXCST(a,b,c,d) \
5534 not_in_std = (gfc_option.allow_std & d) == 0; \
5537 #include "iso-c-binding.def"
5538 #undef NAMED_CMPXCST
5546 gfc_error ("The symbol '%s', referenced at %L, is not "
5547 "in the selected standard", name, &u->where);
5553 #define NAMED_FUNCTION(a,b,c,d) \
5555 create_intrinsic_function (u->local_name[0] ? u->local_name \
5558 iso_c_module_name, \
5559 INTMOD_ISO_C_BINDING); \
5561 #include "iso-c-binding.def"
5562 #undef NAMED_FUNCTION
5565 generate_isocbinding_symbol (iso_c_module_name,
5566 (iso_c_binding_symbol) i,
5567 u->local_name[0] ? u->local_name
5572 if (!found && !only_flag)
5574 /* Skip, if the symbol is not in the enabled standard. */
5577 #define NAMED_FUNCTION(a,b,c,d) \
5579 if ((gfc_option.allow_std & d) == 0) \
5582 #include "iso-c-binding.def"
5583 #undef NAMED_FUNCTION
5585 #define NAMED_INTCST(a,b,c,d) \
5587 if ((gfc_option.allow_std & d) == 0) \
5590 #include "iso-c-binding.def"
5592 #define NAMED_REALCST(a,b,c,d) \
5594 if ((gfc_option.allow_std & d) == 0) \
5597 #include "iso-c-binding.def"
5598 #undef NAMED_REALCST
5599 #define NAMED_CMPXCST(a,b,c,d) \
5601 if ((gfc_option.allow_std & d) == 0) \
5604 #include "iso-c-binding.def"
5605 #undef NAMED_CMPXCST
5607 ; /* Not GFC_STD_* versioned. */
5612 #define NAMED_FUNCTION(a,b,c,d) \
5614 create_intrinsic_function (b, (gfc_isym_id) c, \
5615 iso_c_module_name, \
5616 INTMOD_ISO_C_BINDING); \
5618 #include "iso-c-binding.def"
5619 #undef NAMED_FUNCTION
5622 generate_isocbinding_symbol (iso_c_module_name,
5623 (iso_c_binding_symbol) i, NULL);
5628 for (u = gfc_rename_list; u; u = u->next)
5633 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5634 "module ISO_C_BINDING", u->use_name, &u->where);
5639 /* Add an integer named constant from a given module. */
5642 create_int_parameter (const char *name, int value, const char *modname,
5643 intmod_id module, int id)
5645 gfc_symtree *tmp_symtree;
5648 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5649 if (tmp_symtree != NULL)
5651 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5654 gfc_error ("Symbol '%s' already declared", name);
5657 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5658 sym = tmp_symtree->n.sym;
5660 sym->module = gfc_get_string (modname);
5661 sym->attr.flavor = FL_PARAMETER;
5662 sym->ts.type = BT_INTEGER;
5663 sym->ts.kind = gfc_default_integer_kind;
5664 sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL, value);
5665 sym->attr.use_assoc = 1;
5666 sym->from_intmod = module;
5667 sym->intmod_sym_id = id;
5671 /* Value is already contained by the array constructor, but not
5675 create_int_parameter_array (const char *name, int size, gfc_expr *value,
5676 const char *modname, intmod_id module, int id)
5678 gfc_symtree *tmp_symtree;
5681 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5682 if (tmp_symtree != NULL)
5684 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5687 gfc_error ("Symbol '%s' already declared", name);
5690 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5691 sym = tmp_symtree->n.sym;
5693 sym->module = gfc_get_string (modname);
5694 sym->attr.flavor = FL_PARAMETER;
5695 sym->ts.type = BT_INTEGER;
5696 sym->ts.kind = gfc_default_integer_kind;
5697 sym->attr.use_assoc = 1;
5698 sym->from_intmod = module;
5699 sym->intmod_sym_id = id;
5700 sym->attr.dimension = 1;
5701 sym->as = gfc_get_array_spec ();
5703 sym->as->type = AS_EXPLICIT;
5704 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
5705 sym->as->upper[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, size);
5708 sym->value->shape = gfc_get_shape (1);
5709 mpz_init_set_ui (sym->value->shape[0], size);
5713 /* Add an derived type for a given module. */
5716 create_derived_type (const char *name, const char *modname,
5717 intmod_id module, int id)
5719 gfc_symtree *tmp_symtree;
5720 gfc_symbol *sym, *dt_sym;
5721 gfc_interface *intr, *head;
5723 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5724 if (tmp_symtree != NULL)
5726 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5729 gfc_error ("Symbol '%s' already declared", name);
5732 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5733 sym = tmp_symtree->n.sym;
5734 sym->module = gfc_get_string (modname);
5735 sym->from_intmod = module;
5736 sym->intmod_sym_id = id;
5737 sym->attr.flavor = FL_PROCEDURE;
5738 sym->attr.function = 1;
5739 sym->attr.generic = 1;
5741 gfc_get_sym_tree (dt_upper_string (sym->name),
5742 gfc_current_ns, &tmp_symtree, false);
5743 dt_sym = tmp_symtree->n.sym;
5744 dt_sym->name = gfc_get_string (sym->name);
5745 dt_sym->attr.flavor = FL_DERIVED;
5746 dt_sym->attr.private_comp = 1;
5747 dt_sym->attr.zero_comp = 1;
5748 dt_sym->attr.use_assoc = 1;
5749 dt_sym->module = gfc_get_string (modname);
5750 dt_sym->from_intmod = module;
5751 dt_sym->intmod_sym_id = id;
5753 head = sym->generic;
5754 intr = gfc_get_interface ();
5756 intr->where = gfc_current_locus;
5758 sym->generic = intr;
5759 sym->attr.if_source = IFSRC_DECL;
5763 /* USE the ISO_FORTRAN_ENV intrinsic module. */
5766 use_iso_fortran_env_module (void)
5768 static char mod[] = "iso_fortran_env";
5770 gfc_symbol *mod_sym;
5771 gfc_symtree *mod_symtree;
5775 intmod_sym symbol[] = {
5776 #define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
5777 #include "iso-fortran-env.def"
5779 #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d },
5780 #include "iso-fortran-env.def"
5781 #undef NAMED_KINDARRAY
5782 #define NAMED_DERIVED_TYPE(a,b,c,d) { a, b, 0, d },
5783 #include "iso-fortran-env.def"
5784 #undef NAMED_DERIVED_TYPE
5785 #define NAMED_FUNCTION(a,b,c,d) { a, b, c, d },
5786 #include "iso-fortran-env.def"
5787 #undef NAMED_FUNCTION
5788 { ISOFORTRANENV_INVALID, NULL, -1234, 0 } };
5791 #define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
5792 #include "iso-fortran-env.def"
5795 /* Generate the symbol for the module itself. */
5796 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
5797 if (mod_symtree == NULL)
5799 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree, false);
5800 gcc_assert (mod_symtree);
5801 mod_sym = mod_symtree->n.sym;
5803 mod_sym->attr.flavor = FL_MODULE;
5804 mod_sym->attr.intrinsic = 1;
5805 mod_sym->module = gfc_get_string (mod);
5806 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
5809 if (!mod_symtree->n.sym->attr.intrinsic)
5810 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
5811 "non-intrinsic module name used previously", mod);
5813 /* Generate the symbols for the module integer named constants. */
5815 for (i = 0; symbol[i].name; i++)
5818 for (u = gfc_rename_list; u; u = u->next)
5820 if (strcmp (symbol[i].name, u->use_name) == 0)
5825 if (gfc_notify_std (symbol[i].standard, "The symbol '%s', "
5826 "referenced at %L, is not in the selected "
5827 "standard", symbol[i].name,
5828 &u->where) == FAILURE)
5831 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5832 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5833 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
5834 "constant from intrinsic module "
5835 "ISO_FORTRAN_ENV at %L is incompatible with "
5836 "option %s", &u->where,
5837 gfc_option.flag_default_integer
5838 ? "-fdefault-integer-8"
5839 : "-fdefault-real-8");
5840 switch (symbol[i].id)
5842 #define NAMED_INTCST(a,b,c,d) \
5844 #include "iso-fortran-env.def"
5846 create_int_parameter (u->local_name[0] ? u->local_name
5848 symbol[i].value, mod,
5849 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
5852 #define NAMED_KINDARRAY(a,b,KINDS,d) \
5854 expr = gfc_get_array_expr (BT_INTEGER, \
5855 gfc_default_integer_kind,\
5857 for (j = 0; KINDS[j].kind != 0; j++) \
5858 gfc_constructor_append_expr (&expr->value.constructor, \
5859 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
5860 KINDS[j].kind), NULL); \
5861 create_int_parameter_array (u->local_name[0] ? u->local_name \
5864 INTMOD_ISO_FORTRAN_ENV, \
5867 #include "iso-fortran-env.def"
5868 #undef NAMED_KINDARRAY
5870 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
5872 #include "iso-fortran-env.def"
5873 create_derived_type (u->local_name[0] ? u->local_name
5875 mod, INTMOD_ISO_FORTRAN_ENV,
5878 #undef NAMED_DERIVED_TYPE
5880 #define NAMED_FUNCTION(a,b,c,d) \
5882 #include "iso-fortran-env.def"
5883 #undef NAMED_FUNCTION
5884 create_intrinsic_function (u->local_name[0] ? u->local_name
5886 (gfc_isym_id) symbol[i].value, mod,
5887 INTMOD_ISO_FORTRAN_ENV);
5896 if (!found && !only_flag)
5898 if ((gfc_option.allow_std & symbol[i].standard) == 0)
5901 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
5902 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
5903 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
5904 "from intrinsic module ISO_FORTRAN_ENV at %C is "
5905 "incompatible with option %s",
5906 gfc_option.flag_default_integer
5907 ? "-fdefault-integer-8" : "-fdefault-real-8");
5909 switch (symbol[i].id)
5911 #define NAMED_INTCST(a,b,c,d) \
5913 #include "iso-fortran-env.def"
5915 create_int_parameter (symbol[i].name, symbol[i].value, mod,
5916 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
5919 #define NAMED_KINDARRAY(a,b,KINDS,d) \
5921 expr = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, \
5923 for (j = 0; KINDS[j].kind != 0; j++) \
5924 gfc_constructor_append_expr (&expr->value.constructor, \
5925 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
5926 KINDS[j].kind), NULL); \
5927 create_int_parameter_array (symbol[i].name, j, expr, mod, \
5928 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);\
5930 #include "iso-fortran-env.def"
5931 #undef NAMED_KINDARRAY
5933 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
5935 #include "iso-fortran-env.def"
5936 create_derived_type (symbol[i].name, mod, INTMOD_ISO_FORTRAN_ENV,
5939 #undef NAMED_DERIVED_TYPE
5941 #define NAMED_FUNCTION(a,b,c,d) \
5943 #include "iso-fortran-env.def"
5944 #undef NAMED_FUNCTION
5945 create_intrinsic_function (symbol[i].name,
5946 (gfc_isym_id) symbol[i].value, mod,
5947 INTMOD_ISO_FORTRAN_ENV);
5956 for (u = gfc_rename_list; u; u = u->next)
5961 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5962 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
5967 /* Process a USE directive. */
5970 gfc_use_module (gfc_use_list *module)
5975 gfc_symtree *mod_symtree;
5976 gfc_use_list *use_stmt;
5977 locus old_locus = gfc_current_locus;
5979 gfc_current_locus = module->where;
5980 module_name = module->module_name;
5981 gfc_rename_list = module->rename;
5982 only_flag = module->only_flag;
5984 filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
5986 strcpy (filename, module_name);
5987 strcat (filename, MODULE_EXTENSION);
5989 /* First, try to find an non-intrinsic module, unless the USE statement
5990 specified that the module is intrinsic. */
5992 if (!module->intrinsic)
5993 module_fp = gfc_open_included_file (filename, true, true);
5995 /* Then, see if it's an intrinsic one, unless the USE statement
5996 specified that the module is non-intrinsic. */
5997 if (module_fp == NULL && !module->non_intrinsic)
5999 if (strcmp (module_name, "iso_fortran_env") == 0
6000 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
6001 "intrinsic module at %C") != FAILURE)
6003 use_iso_fortran_env_module ();
6004 gfc_current_locus = old_locus;
6005 module->intrinsic = true;
6009 if (strcmp (module_name, "iso_c_binding") == 0
6010 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
6011 "ISO_C_BINDING module at %C") != FAILURE)
6013 import_iso_c_binding_module();
6014 gfc_current_locus = old_locus;
6015 module->intrinsic = true;
6019 module_fp = gfc_open_intrinsic_module (filename);
6021 if (module_fp == NULL && module->intrinsic)
6022 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
6026 if (module_fp == NULL)
6027 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6028 filename, xstrerror (errno));
6030 /* Check that we haven't already USEd an intrinsic module with the
6033 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
6034 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
6035 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
6036 "intrinsic module name used previously", module_name);
6043 /* Skip the first two lines of the module, after checking that this is
6044 a gfortran module file. */
6050 bad_module ("Unexpected end of module");
6053 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
6054 || (start == 2 && strcmp (atom_name, " module") != 0))
6055 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
6059 if (strcmp (atom_name, " version") != 0
6060 || module_char () != ' '
6061 || parse_atom () != ATOM_STRING)
6062 gfc_fatal_error ("Parse error when checking module version"
6063 " for file '%s' opened at %C", filename);
6065 if (strcmp (atom_string, MOD_VERSION))
6067 gfc_fatal_error ("Wrong module version '%s' (expected '%s') "
6068 "for file '%s' opened at %C", atom_string,
6069 MOD_VERSION, filename);
6079 /* Make sure we're not reading the same module that we may be building. */
6080 for (p = gfc_state_stack; p; p = p->previous)
6081 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
6082 gfc_fatal_error ("Can't USE the same module we're building!");
6085 init_true_name_tree ();
6089 free_true_name (true_name_root);
6090 true_name_root = NULL;
6092 free_pi_tree (pi_root);
6097 use_stmt = gfc_get_use_list ();
6098 *use_stmt = *module;
6099 use_stmt->next = gfc_current_ns->use_stmts;
6100 gfc_current_ns->use_stmts = use_stmt;
6102 gfc_current_locus = old_locus;
6106 /* Remove duplicated intrinsic operators from the rename list. */
6109 rename_list_remove_duplicate (gfc_use_rename *list)
6111 gfc_use_rename *seek, *last;
6113 for (; list; list = list->next)
6114 if (list->op != INTRINSIC_USER && list->op != INTRINSIC_NONE)
6117 for (seek = list->next; seek; seek = last->next)
6119 if (list->op == seek->op)
6121 last->next = seek->next;
6131 /* Process all USE directives. */
6134 gfc_use_modules (void)
6136 gfc_use_list *next, *seek, *last;
6138 for (next = module_list; next; next = next->next)
6140 bool non_intrinsic = next->non_intrinsic;
6141 bool intrinsic = next->intrinsic;
6142 bool neither = !non_intrinsic && !intrinsic;
6144 for (seek = next->next; seek; seek = seek->next)
6146 if (next->module_name != seek->module_name)
6149 if (seek->non_intrinsic)
6150 non_intrinsic = true;
6151 else if (seek->intrinsic)
6157 if (intrinsic && neither && !non_intrinsic)
6162 filename = XALLOCAVEC (char,
6163 strlen (next->module_name)
6164 + strlen (MODULE_EXTENSION) + 1);
6165 strcpy (filename, next->module_name);
6166 strcat (filename, MODULE_EXTENSION);
6167 fp = gfc_open_included_file (filename, true, true);
6170 non_intrinsic = true;
6176 for (seek = next->next; seek; seek = last->next)
6178 if (next->module_name != seek->module_name)
6184 if ((!next->intrinsic && !seek->intrinsic)
6185 || (next->intrinsic && seek->intrinsic)
6188 if (!seek->only_flag)
6189 next->only_flag = false;
6192 gfc_use_rename *r = seek->rename;
6195 r->next = next->rename;
6196 next->rename = seek->rename;
6198 last->next = seek->next;
6206 for (; module_list; module_list = next)
6208 next = module_list->next;
6209 rename_list_remove_duplicate (module_list->rename);
6210 gfc_use_module (module_list);
6211 if (module_list->intrinsic)
6212 free_rename (module_list->rename);
6215 gfc_rename_list = NULL;
6220 gfc_free_use_stmts (gfc_use_list *use_stmts)
6223 for (; use_stmts; use_stmts = next)
6225 gfc_use_rename *next_rename;
6227 for (; use_stmts->rename; use_stmts->rename = next_rename)
6229 next_rename = use_stmts->rename->next;
6230 free (use_stmts->rename);
6232 next = use_stmts->next;
6239 gfc_module_init_2 (void)
6241 last_atom = ATOM_LPAREN;
6242 gfc_rename_list = NULL;
6248 gfc_module_done_2 (void)
6250 free_rename (gfc_rename_list);
6251 gfc_rename_list = NULL;