1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
5 Free Software Foundation, Inc.
6 Contributed by Andy Vaught
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
24 /* The syntax of gfortran modules resembles that of lisp lists, i.e. a
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
47 ( ( <common name> <symbol> <saved flag>)
53 ( <Symbol Number (in no particular order)>
55 <Module name of symbol>
56 ( <symbol information> )
65 In general, symbols refer to other symbols by their symbol number,
66 which are zero based. Symbols are written to the module in no
74 #include "parse.h" /* FIXME */
76 #include "constructor.h"
80 #define MODULE_EXTENSION ".mod"
82 /* Don't put any single quote (') in MOD_VERSION,
83 if yout want it to be recognized. */
84 #define MOD_VERSION "9"
87 /* Structure that describes a position within a module file. */
96 /* Structure for list of symbols of intrinsic modules. */
109 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
113 /* The fixup structure lists pointers to pointers that have to
114 be updated when a pointer value becomes known. */
116 typedef struct fixup_t
119 struct fixup_t *next;
124 /* Structure for holding extra info needed for pointers being read. */
140 typedef struct pointer_info
142 BBT_HEADER (pointer_info);
146 /* The first component of each member of the union is the pointer
153 void *pointer; /* Member for doing pointer searches. */
158 char *true_name, *module, *binding_label;
160 gfc_symtree *symtree;
161 enum gfc_rsym_state state;
162 int ns, referenced, renamed;
170 enum gfc_wsym_state state;
179 #define gfc_get_pointer_info() XCNEW (pointer_info)
182 /* Local variables */
184 /* The FILE for the module we're reading or writing. */
185 static FILE *module_fp;
187 /* MD5 context structure. */
188 static struct md5_ctx ctx;
190 /* The name of the module we're reading (USE'ing) or writing. */
191 static const char *module_name;
192 static gfc_use_list *module_list;
194 static int module_line, module_column, only_flag;
195 static int prev_module_line, prev_module_column, prev_character;
198 { IO_INPUT, IO_OUTPUT }
201 static gfc_use_rename *gfc_rename_list;
202 static pointer_info *pi_root;
203 static int symbol_number; /* Counter for assigning symbol numbers */
205 /* Tells mio_expr_ref to make symbols for unused equivalence members. */
206 static bool in_load_equiv;
210 /*****************************************************************/
212 /* Pointer/integer conversion. Pointers between structures are stored
213 as integers in the module file. The next couple of subroutines
214 handle this translation for reading and writing. */
216 /* Recursively free the tree of pointer structures. */
219 free_pi_tree (pointer_info *p)
224 if (p->fixup != NULL)
225 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
227 free_pi_tree (p->left);
228 free_pi_tree (p->right);
230 if (iomode == IO_INPUT)
232 XDELETEVEC (p->u.rsym.true_name);
233 XDELETEVEC (p->u.rsym.module);
234 XDELETEVEC (p->u.rsym.binding_label);
241 /* Compare pointers when searching by pointer. Used when writing a
245 compare_pointers (void *_sn1, void *_sn2)
247 pointer_info *sn1, *sn2;
249 sn1 = (pointer_info *) _sn1;
250 sn2 = (pointer_info *) _sn2;
252 if (sn1->u.pointer < sn2->u.pointer)
254 if (sn1->u.pointer > sn2->u.pointer)
261 /* Compare integers when searching by integer. Used when reading a
265 compare_integers (void *_sn1, void *_sn2)
267 pointer_info *sn1, *sn2;
269 sn1 = (pointer_info *) _sn1;
270 sn2 = (pointer_info *) _sn2;
272 if (sn1->integer < sn2->integer)
274 if (sn1->integer > sn2->integer)
281 /* Initialize the pointer_info tree. */
290 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
292 /* Pointer 0 is the NULL pointer. */
293 p = gfc_get_pointer_info ();
298 gfc_insert_bbt (&pi_root, p, compare);
300 /* Pointer 1 is the current namespace. */
301 p = gfc_get_pointer_info ();
302 p->u.pointer = gfc_current_ns;
304 p->type = P_NAMESPACE;
306 gfc_insert_bbt (&pi_root, p, compare);
312 /* During module writing, call here with a pointer to something,
313 returning the pointer_info node. */
315 static pointer_info *
316 find_pointer (void *gp)
323 if (p->u.pointer == gp)
325 p = (gp < p->u.pointer) ? p->left : p->right;
332 /* Given a pointer while writing, returns the pointer_info tree node,
333 creating it if it doesn't exist. */
335 static pointer_info *
336 get_pointer (void *gp)
340 p = find_pointer (gp);
344 /* Pointer doesn't have an integer. Give it one. */
345 p = gfc_get_pointer_info ();
348 p->integer = symbol_number++;
350 gfc_insert_bbt (&pi_root, p, compare_pointers);
356 /* Given an integer during reading, find it in the pointer_info tree,
357 creating the node if not found. */
359 static pointer_info *
360 get_integer (int integer)
370 c = compare_integers (&t, p);
374 p = (c < 0) ? p->left : p->right;
380 p = gfc_get_pointer_info ();
381 p->integer = integer;
384 gfc_insert_bbt (&pi_root, p, compare_integers);
390 /* Recursive function to find a pointer within a tree by brute force. */
392 static pointer_info *
393 fp2 (pointer_info *p, const void *target)
400 if (p->u.pointer == target)
403 q = fp2 (p->left, target);
407 return fp2 (p->right, target);
411 /* During reading, find a pointer_info node from the pointer value.
412 This amounts to a brute-force search. */
414 static pointer_info *
415 find_pointer2 (void *p)
417 return fp2 (pi_root, p);
421 /* Resolve any fixups using a known pointer. */
424 resolve_fixups (fixup_t *f, void *gp)
437 /* Convert a string such that it starts with a lower-case character. Used
438 to convert the symtree name of a derived-type to the symbol name or to
439 the name of the associated generic function. */
442 dt_lower_string (const char *name)
444 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
445 return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name[0]),
447 return gfc_get_string (name);
451 /* Convert a string such that it starts with an upper-case character. Used to
452 return the symtree-name for a derived type; the symbol name itself and the
453 symtree/symbol name of the associated generic function start with a lower-
457 dt_upper_string (const char *name)
459 if (name[0] != (char) TOUPPER ((unsigned char) name[0]))
460 return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name[0]),
462 return gfc_get_string (name);
465 /* Call here during module reading when we know what pointer to
466 associate with an integer. Any fixups that exist are resolved at
470 associate_integer_pointer (pointer_info *p, void *gp)
472 if (p->u.pointer != NULL)
473 gfc_internal_error ("associate_integer_pointer(): Already associated");
477 resolve_fixups (p->fixup, gp);
483 /* During module reading, given an integer and a pointer to a pointer,
484 either store the pointer from an already-known value or create a
485 fixup structure in order to store things later. Returns zero if
486 the reference has been actually stored, or nonzero if the reference
487 must be fixed later (i.e., associate_integer_pointer must be called
488 sometime later. Returns the pointer_info structure. */
490 static pointer_info *
491 add_fixup (int integer, void *gp)
497 p = get_integer (integer);
499 if (p->integer == 0 || p->u.pointer != NULL)
502 *cp = (char *) p->u.pointer;
511 f->pointer = (void **) gp;
518 /*****************************************************************/
520 /* Parser related subroutines */
522 /* Free the rename list left behind by a USE statement. */
525 free_rename (gfc_use_rename *list)
527 gfc_use_rename *next;
529 for (; list; list = next)
537 /* Match a USE statement. */
542 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
543 gfc_use_rename *tail = NULL, *new_use;
544 interface_type type, type2;
547 gfc_use_list *use_list;
549 use_list = gfc_get_use_list ();
551 if (gfc_match (" , ") == MATCH_YES)
553 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
555 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
556 "nature in USE statement at %C") == FAILURE)
559 if (strcmp (module_nature, "intrinsic") == 0)
560 use_list->intrinsic = true;
563 if (strcmp (module_nature, "non_intrinsic") == 0)
564 use_list->non_intrinsic = true;
567 gfc_error ("Module nature in USE statement at %C shall "
568 "be either INTRINSIC or NON_INTRINSIC");
575 /* Help output a better error message than "Unclassifiable
577 gfc_match (" %n", module_nature);
578 if (strcmp (module_nature, "intrinsic") == 0
579 || strcmp (module_nature, "non_intrinsic") == 0)
580 gfc_error ("\"::\" was expected after module nature at %C "
581 "but was not found");
588 m = gfc_match (" ::");
589 if (m == MATCH_YES &&
590 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
591 "\"USE :: module\" at %C") == FAILURE)
596 m = gfc_match ("% ");
605 use_list->where = gfc_current_locus;
607 m = gfc_match_name (name);
614 use_list->module_name = gfc_get_string (name);
616 if (gfc_match_eos () == MATCH_YES)
619 if (gfc_match_char (',') != MATCH_YES)
622 if (gfc_match (" only :") == MATCH_YES)
623 use_list->only_flag = true;
625 if (gfc_match_eos () == MATCH_YES)
630 /* Get a new rename struct and add it to the rename list. */
631 new_use = gfc_get_use_rename ();
632 new_use->where = gfc_current_locus;
635 if (use_list->rename == NULL)
636 use_list->rename = new_use;
638 tail->next = new_use;
641 /* See what kind of interface we're dealing with. Assume it is
643 new_use->op = INTRINSIC_NONE;
644 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
649 case INTERFACE_NAMELESS:
650 gfc_error ("Missing generic specification in USE statement at %C");
653 case INTERFACE_USER_OP:
654 case INTERFACE_GENERIC:
655 m = gfc_match (" =>");
657 if (type == INTERFACE_USER_OP && m == MATCH_YES
658 && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
659 "operators in USE statements at %C")
663 if (type == INTERFACE_USER_OP)
664 new_use->op = INTRINSIC_USER;
666 if (use_list->only_flag)
669 strcpy (new_use->use_name, name);
672 strcpy (new_use->local_name, name);
673 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
678 if (m == MATCH_ERROR)
686 strcpy (new_use->local_name, name);
688 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
693 if (m == MATCH_ERROR)
697 if (strcmp (new_use->use_name, use_list->module_name) == 0
698 || strcmp (new_use->local_name, use_list->module_name) == 0)
700 gfc_error ("The name '%s' at %C has already been used as "
701 "an external module name.", use_list->module_name);
706 case INTERFACE_INTRINSIC_OP:
714 if (gfc_match_eos () == MATCH_YES)
716 if (gfc_match_char (',') != MATCH_YES)
723 gfc_use_list *last = module_list;
726 last->next = use_list;
729 module_list = use_list;
734 gfc_syntax_error (ST_USE);
737 free_rename (use_list->rename);
743 /* Given a name and a number, inst, return the inst name
744 under which to load this symbol. Returns NULL if this
745 symbol shouldn't be loaded. If inst is zero, returns
746 the number of instances of this name. If interface is
747 true, a user-defined operator is sought, otherwise only
748 non-operators are sought. */
751 find_use_name_n (const char *name, int *inst, bool interface)
754 const char *low_name = NULL;
757 /* For derived types. */
758 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
759 low_name = dt_lower_string (name);
762 for (u = gfc_rename_list; u; u = u->next)
764 if ((!low_name && strcmp (u->use_name, name) != 0)
765 || (low_name && strcmp (u->use_name, low_name) != 0)
766 || (u->op == INTRINSIC_USER && !interface)
767 || (u->op != INTRINSIC_USER && interface))
780 return only_flag ? NULL : name;
786 if (u->local_name[0] == '\0')
788 return dt_upper_string (u->local_name);
791 return (u->local_name[0] != '\0') ? u->local_name : name;
795 /* Given a name, return the name under which to load this symbol.
796 Returns NULL if this symbol shouldn't be loaded. */
799 find_use_name (const char *name, bool interface)
802 return find_use_name_n (name, &i, interface);
806 /* Given a real name, return the number of use names associated with it. */
809 number_use_names (const char *name, bool interface)
812 find_use_name_n (name, &i, interface);
817 /* Try to find the operator in the current list. */
819 static gfc_use_rename *
820 find_use_operator (gfc_intrinsic_op op)
824 for (u = gfc_rename_list; u; u = u->next)
832 /*****************************************************************/
834 /* The next couple of subroutines maintain a tree used to avoid a
835 brute-force search for a combination of true name and module name.
836 While symtree names, the name that a particular symbol is known by
837 can changed with USE statements, we still have to keep track of the
838 true names to generate the correct reference, and also avoid
839 loading the same real symbol twice in a program unit.
841 When we start reading, the true name tree is built and maintained
842 as symbols are read. The tree is searched as we load new symbols
843 to see if it already exists someplace in the namespace. */
845 typedef struct true_name
847 BBT_HEADER (true_name);
853 static true_name *true_name_root;
856 /* Compare two true_name structures. */
859 compare_true_names (void *_t1, void *_t2)
864 t1 = (true_name *) _t1;
865 t2 = (true_name *) _t2;
867 c = ((t1->sym->module > t2->sym->module)
868 - (t1->sym->module < t2->sym->module));
872 return strcmp (t1->name, t2->name);
876 /* Given a true name, search the true name tree to see if it exists
877 within the main namespace. */
880 find_true_name (const char *name, const char *module)
886 t.name = gfc_get_string (name);
888 sym.module = gfc_get_string (module);
896 c = compare_true_names ((void *) (&t), (void *) p);
900 p = (c < 0) ? p->left : p->right;
907 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
910 add_true_name (gfc_symbol *sym)
914 t = XCNEW (true_name);
916 if (sym->attr.flavor == FL_DERIVED)
917 t->name = dt_upper_string (sym->name);
921 gfc_insert_bbt (&true_name_root, t, compare_true_names);
925 /* Recursive function to build the initial true name tree by
926 recursively traversing the current namespace. */
929 build_tnt (gfc_symtree *st)
935 build_tnt (st->left);
936 build_tnt (st->right);
938 if (st->n.sym->attr.flavor == FL_DERIVED)
939 name = dt_upper_string (st->n.sym->name);
941 name = st->n.sym->name;
943 if (find_true_name (name, st->n.sym->module) != NULL)
946 add_true_name (st->n.sym);
950 /* Initialize the true name tree with the current namespace. */
953 init_true_name_tree (void)
955 true_name_root = NULL;
956 build_tnt (gfc_current_ns->sym_root);
960 /* Recursively free a true name tree node. */
963 free_true_name (true_name *t)
967 free_true_name (t->left);
968 free_true_name (t->right);
974 /*****************************************************************/
976 /* Module reading and writing. */
980 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
984 static atom_type last_atom;
987 /* The name buffer must be at least as long as a symbol name. Right
988 now it's not clear how we're going to store numeric constants--
989 probably as a hexadecimal string, since this will allow the exact
990 number to be preserved (this can't be done by a decimal
991 representation). Worry about that later. TODO! */
993 #define MAX_ATOM_SIZE 100
996 static char *atom_string, atom_name[MAX_ATOM_SIZE];
999 /* Report problems with a module. Error reporting is not very
1000 elaborate, since this sorts of errors shouldn't really happen.
1001 This subroutine never returns. */
1003 static void bad_module (const char *) ATTRIBUTE_NORETURN;
1006 bad_module (const char *msgid)
1013 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
1014 module_name, module_line, module_column, msgid);
1017 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
1018 module_name, module_line, module_column, msgid);
1021 gfc_fatal_error ("Module %s at line %d column %d: %s",
1022 module_name, module_line, module_column, msgid);
1028 /* Set the module's input pointer. */
1031 set_module_locus (module_locus *m)
1033 module_column = m->column;
1034 module_line = m->line;
1035 fsetpos (module_fp, &m->pos);
1039 /* Get the module's input pointer so that we can restore it later. */
1042 get_module_locus (module_locus *m)
1044 m->column = module_column;
1045 m->line = module_line;
1046 fgetpos (module_fp, &m->pos);
1050 /* Get the next character in the module, updating our reckoning of
1058 c = getc (module_fp);
1061 bad_module ("Unexpected EOF");
1063 prev_module_line = module_line;
1064 prev_module_column = module_column;
1077 /* Unget a character while remembering the line and column. Works for
1078 a single character only. */
1081 module_unget_char (void)
1083 module_line = prev_module_line;
1084 module_column = prev_module_column;
1085 ungetc (prev_character, module_fp);
1088 /* Parse a string constant. The delimiter is guaranteed to be a
1098 atom_string = XNEWVEC (char, cursz);
1106 int c2 = module_char ();
1109 module_unget_char ();
1117 atom_string = XRESIZEVEC (char, atom_string, cursz);
1119 atom_string[len] = c;
1123 atom_string = XRESIZEVEC (char, atom_string, len + 1);
1124 atom_string[len] = '\0'; /* C-style string for debug purposes. */
1128 /* Parse a small integer. */
1131 parse_integer (int c)
1140 module_unget_char ();
1144 atom_int = 10 * atom_int + c - '0';
1145 if (atom_int > 99999999)
1146 bad_module ("Integer overflow");
1168 if (!ISALNUM (c) && c != '_' && c != '-')
1170 module_unget_char ();
1175 if (++len > GFC_MAX_SYMBOL_LEN)
1176 bad_module ("Name too long");
1184 /* Read the next atom in the module's input stream. */
1195 while (c == ' ' || c == '\r' || c == '\n');
1220 return ATOM_INTEGER;
1278 bad_module ("Bad name");
1285 /* Peek at the next atom on the input. */
1296 while (c == ' ' || c == '\r' || c == '\n');
1301 module_unget_char ();
1305 module_unget_char ();
1309 module_unget_char ();
1322 module_unget_char ();
1323 return ATOM_INTEGER;
1377 module_unget_char ();
1381 bad_module ("Bad name");
1386 /* Read the next atom from the input, requiring that it be a
1390 require_atom (atom_type type)
1396 column = module_column;
1405 p = _("Expected name");
1408 p = _("Expected left parenthesis");
1411 p = _("Expected right parenthesis");
1414 p = _("Expected integer");
1417 p = _("Expected string");
1420 gfc_internal_error ("require_atom(): bad atom type required");
1423 module_column = column;
1430 /* Given a pointer to an mstring array, require that the current input
1431 be one of the strings in the array. We return the enum value. */
1434 find_enum (const mstring *m)
1438 i = gfc_string2code (m, atom_name);
1442 bad_module ("find_enum(): Enum not found");
1448 /* Read a string. The caller is responsible for freeing. */
1454 require_atom (ATOM_STRING);
1461 /**************** Module output subroutines ***************************/
1463 /* Output a character to a module file. */
1466 write_char (char out)
1468 if (putc (out, module_fp) == EOF)
1469 gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno));
1471 /* Add this to our MD5. */
1472 md5_process_bytes (&out, sizeof (out), &ctx);
1484 /* Write an atom to a module. The line wrapping isn't perfect, but it
1485 should work most of the time. This isn't that big of a deal, since
1486 the file really isn't meant to be read by people anyway. */
1489 write_atom (atom_type atom, const void *v)
1499 p = (const char *) v;
1511 i = *((const int *) v);
1513 gfc_internal_error ("write_atom(): Writing negative integer");
1515 sprintf (buffer, "%d", i);
1520 gfc_internal_error ("write_atom(): Trying to write dab atom");
1524 if(p == NULL || *p == '\0')
1529 if (atom != ATOM_RPAREN)
1531 if (module_column + len > 72)
1536 if (last_atom != ATOM_LPAREN && module_column != 1)
1541 if (atom == ATOM_STRING)
1544 while (p != NULL && *p)
1546 if (atom == ATOM_STRING && *p == '\'')
1551 if (atom == ATOM_STRING)
1559 /***************** Mid-level I/O subroutines *****************/
1561 /* These subroutines let their caller read or write atoms without
1562 caring about which of the two is actually happening. This lets a
1563 subroutine concentrate on the actual format of the data being
1566 static void mio_expr (gfc_expr **);
1567 pointer_info *mio_symbol_ref (gfc_symbol **);
1568 pointer_info *mio_interface_rest (gfc_interface **);
1569 static void mio_symtree_ref (gfc_symtree **);
1571 /* Read or write an enumerated value. On writing, we return the input
1572 value for the convenience of callers. We avoid using an integer
1573 pointer because enums are sometimes inside bitfields. */
1576 mio_name (int t, const mstring *m)
1578 if (iomode == IO_OUTPUT)
1579 write_atom (ATOM_NAME, gfc_code2string (m, t));
1582 require_atom (ATOM_NAME);
1589 /* Specialization of mio_name. */
1591 #define DECL_MIO_NAME(TYPE) \
1592 static inline TYPE \
1593 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1595 return (TYPE) mio_name ((int) t, m); \
1597 #define MIO_NAME(TYPE) mio_name_##TYPE
1602 if (iomode == IO_OUTPUT)
1603 write_atom (ATOM_LPAREN, NULL);
1605 require_atom (ATOM_LPAREN);
1612 if (iomode == IO_OUTPUT)
1613 write_atom (ATOM_RPAREN, NULL);
1615 require_atom (ATOM_RPAREN);
1620 mio_integer (int *ip)
1622 if (iomode == IO_OUTPUT)
1623 write_atom (ATOM_INTEGER, ip);
1626 require_atom (ATOM_INTEGER);
1632 /* Read or write a gfc_intrinsic_op value. */
1635 mio_intrinsic_op (gfc_intrinsic_op* op)
1637 /* FIXME: Would be nicer to do this via the operators symbolic name. */
1638 if (iomode == IO_OUTPUT)
1640 int converted = (int) *op;
1641 write_atom (ATOM_INTEGER, &converted);
1645 require_atom (ATOM_INTEGER);
1646 *op = (gfc_intrinsic_op) atom_int;
1651 /* Read or write a character pointer that points to a string on the heap. */
1654 mio_allocated_string (const char *s)
1656 if (iomode == IO_OUTPUT)
1658 write_atom (ATOM_STRING, s);
1663 require_atom (ATOM_STRING);
1669 /* Functions for quoting and unquoting strings. */
1672 quote_string (const gfc_char_t *s, const size_t slength)
1674 const gfc_char_t *p;
1678 /* Calculate the length we'll need: a backslash takes two ("\\"),
1679 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1680 for (p = s, i = 0; i < slength; p++, i++)
1684 else if (!gfc_wide_is_printable (*p))
1690 q = res = XCNEWVEC (char, len + 1);
1691 for (p = s, i = 0; i < slength; p++, i++)
1694 *q++ = '\\', *q++ = '\\';
1695 else if (!gfc_wide_is_printable (*p))
1697 sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1698 (unsigned HOST_WIDE_INT) *p);
1702 *q++ = (unsigned char) *p;
1710 unquote_string (const char *s)
1716 for (p = s, len = 0; *p; p++, len++)
1723 else if (p[1] == 'U')
1724 p += 9; /* That is a "\U????????". */
1726 gfc_internal_error ("unquote_string(): got bad string");
1729 res = gfc_get_wide_string (len + 1);
1730 for (i = 0, p = s; i < len; i++, p++)
1735 res[i] = (unsigned char) *p;
1736 else if (p[1] == '\\')
1738 res[i] = (unsigned char) '\\';
1743 /* We read the 8-digits hexadecimal constant that follows. */
1748 gcc_assert (p[1] == 'U');
1749 for (j = 0; j < 8; j++)
1752 gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1766 /* Read or write a character pointer that points to a wide string on the
1767 heap, performing quoting/unquoting of nonprintable characters using the
1768 form \U???????? (where each ? is a hexadecimal digit).
1769 Length is the length of the string, only known and used in output mode. */
1771 static const gfc_char_t *
1772 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1774 if (iomode == IO_OUTPUT)
1776 char *quoted = quote_string (s, length);
1777 write_atom (ATOM_STRING, quoted);
1783 gfc_char_t *unquoted;
1785 require_atom (ATOM_STRING);
1786 unquoted = unquote_string (atom_string);
1793 /* Read or write a string that is in static memory. */
1796 mio_pool_string (const char **stringp)
1798 /* TODO: one could write the string only once, and refer to it via a
1801 /* As a special case we have to deal with a NULL string. This
1802 happens for the 'module' member of 'gfc_symbol's that are not in a
1803 module. We read / write these as the empty string. */
1804 if (iomode == IO_OUTPUT)
1806 const char *p = *stringp == NULL ? "" : *stringp;
1807 write_atom (ATOM_STRING, p);
1811 require_atom (ATOM_STRING);
1812 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1818 /* Read or write a string that is inside of some already-allocated
1822 mio_internal_string (char *string)
1824 if (iomode == IO_OUTPUT)
1825 write_atom (ATOM_STRING, string);
1828 require_atom (ATOM_STRING);
1829 strcpy (string, atom_string);
1836 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1837 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1838 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1839 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1840 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE,
1841 AB_ALLOC_COMP, AB_POINTER_COMP, AB_PROC_POINTER_COMP, AB_PRIVATE_COMP,
1842 AB_VALUE, AB_VOLATILE, AB_PROTECTED, AB_LOCK_COMP,
1843 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1844 AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
1845 AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER,
1850 static const mstring attr_bits[] =
1852 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1853 minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1854 minit ("DIMENSION", AB_DIMENSION),
1855 minit ("CODIMENSION", AB_CODIMENSION),
1856 minit ("CONTIGUOUS", AB_CONTIGUOUS),
1857 minit ("EXTERNAL", AB_EXTERNAL),
1858 minit ("INTRINSIC", AB_INTRINSIC),
1859 minit ("OPTIONAL", AB_OPTIONAL),
1860 minit ("POINTER", AB_POINTER),
1861 minit ("VOLATILE", AB_VOLATILE),
1862 minit ("TARGET", AB_TARGET),
1863 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1864 minit ("DUMMY", AB_DUMMY),
1865 minit ("RESULT", AB_RESULT),
1866 minit ("DATA", AB_DATA),
1867 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1868 minit ("IN_COMMON", AB_IN_COMMON),
1869 minit ("FUNCTION", AB_FUNCTION),
1870 minit ("SUBROUTINE", AB_SUBROUTINE),
1871 minit ("SEQUENCE", AB_SEQUENCE),
1872 minit ("ELEMENTAL", AB_ELEMENTAL),
1873 minit ("PURE", AB_PURE),
1874 minit ("RECURSIVE", AB_RECURSIVE),
1875 minit ("GENERIC", AB_GENERIC),
1876 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1877 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1878 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1879 minit ("IS_BIND_C", AB_IS_BIND_C),
1880 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1881 minit ("IS_ISO_C", AB_IS_ISO_C),
1882 minit ("VALUE", AB_VALUE),
1883 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1884 minit ("COARRAY_COMP", AB_COARRAY_COMP),
1885 minit ("LOCK_COMP", AB_LOCK_COMP),
1886 minit ("POINTER_COMP", AB_POINTER_COMP),
1887 minit ("PROC_POINTER_COMP", AB_PROC_POINTER_COMP),
1888 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1889 minit ("ZERO_COMP", AB_ZERO_COMP),
1890 minit ("PROTECTED", AB_PROTECTED),
1891 minit ("ABSTRACT", AB_ABSTRACT),
1892 minit ("IS_CLASS", AB_IS_CLASS),
1893 minit ("PROCEDURE", AB_PROCEDURE),
1894 minit ("PROC_POINTER", AB_PROC_POINTER),
1895 minit ("VTYPE", AB_VTYPE),
1896 minit ("VTAB", AB_VTAB),
1897 minit ("CLASS_POINTER", AB_CLASS_POINTER),
1898 minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE),
1902 /* For binding attributes. */
1903 static const mstring binding_passing[] =
1906 minit ("NOPASS", 1),
1909 static const mstring binding_overriding[] =
1911 minit ("OVERRIDABLE", 0),
1912 minit ("NON_OVERRIDABLE", 1),
1913 minit ("DEFERRED", 2),
1916 static const mstring binding_generic[] =
1918 minit ("SPECIFIC", 0),
1919 minit ("GENERIC", 1),
1922 static const mstring binding_ppc[] =
1924 minit ("NO_PPC", 0),
1929 /* Specialization of mio_name. */
1930 DECL_MIO_NAME (ab_attribute)
1931 DECL_MIO_NAME (ar_type)
1932 DECL_MIO_NAME (array_type)
1934 DECL_MIO_NAME (expr_t)
1935 DECL_MIO_NAME (gfc_access)
1936 DECL_MIO_NAME (gfc_intrinsic_op)
1937 DECL_MIO_NAME (ifsrc)
1938 DECL_MIO_NAME (save_state)
1939 DECL_MIO_NAME (procedure_type)
1940 DECL_MIO_NAME (ref_type)
1941 DECL_MIO_NAME (sym_flavor)
1942 DECL_MIO_NAME (sym_intent)
1943 #undef DECL_MIO_NAME
1945 /* Symbol attributes are stored in list with the first three elements
1946 being the enumerated fields, while the remaining elements (if any)
1947 indicate the individual attribute bits. The access field is not
1948 saved-- it controls what symbols are exported when a module is
1952 mio_symbol_attribute (symbol_attribute *attr)
1955 unsigned ext_attr,extension_level;
1959 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1960 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1961 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1962 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1963 attr->save = MIO_NAME (save_state) (attr->save, save_status);
1965 ext_attr = attr->ext_attr;
1966 mio_integer ((int *) &ext_attr);
1967 attr->ext_attr = ext_attr;
1969 extension_level = attr->extension;
1970 mio_integer ((int *) &extension_level);
1971 attr->extension = extension_level;
1973 if (iomode == IO_OUTPUT)
1975 if (attr->allocatable)
1976 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1977 if (attr->asynchronous)
1978 MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
1979 if (attr->dimension)
1980 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1981 if (attr->codimension)
1982 MIO_NAME (ab_attribute) (AB_CODIMENSION, attr_bits);
1983 if (attr->contiguous)
1984 MIO_NAME (ab_attribute) (AB_CONTIGUOUS, attr_bits);
1986 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1987 if (attr->intrinsic)
1988 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1990 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1992 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1993 if (attr->class_pointer)
1994 MIO_NAME (ab_attribute) (AB_CLASS_POINTER, attr_bits);
1995 if (attr->is_protected)
1996 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1998 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1999 if (attr->volatile_)
2000 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
2002 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
2003 if (attr->threadprivate)
2004 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
2006 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
2008 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
2009 /* We deliberately don't preserve the "entry" flag. */
2012 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
2013 if (attr->in_namelist)
2014 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
2015 if (attr->in_common)
2016 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
2019 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
2020 if (attr->subroutine)
2021 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
2023 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
2025 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
2028 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
2029 if (attr->elemental)
2030 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
2032 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
2033 if (attr->implicit_pure)
2034 MIO_NAME (ab_attribute) (AB_IMPLICIT_PURE, attr_bits);
2035 if (attr->recursive)
2036 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
2037 if (attr->always_explicit)
2038 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
2039 if (attr->cray_pointer)
2040 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
2041 if (attr->cray_pointee)
2042 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
2043 if (attr->is_bind_c)
2044 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
2045 if (attr->is_c_interop)
2046 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
2048 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
2049 if (attr->alloc_comp)
2050 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
2051 if (attr->pointer_comp)
2052 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
2053 if (attr->proc_pointer_comp)
2054 MIO_NAME (ab_attribute) (AB_PROC_POINTER_COMP, attr_bits);
2055 if (attr->private_comp)
2056 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
2057 if (attr->coarray_comp)
2058 MIO_NAME (ab_attribute) (AB_COARRAY_COMP, attr_bits);
2059 if (attr->lock_comp)
2060 MIO_NAME (ab_attribute) (AB_LOCK_COMP, attr_bits);
2061 if (attr->zero_comp)
2062 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
2064 MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
2065 if (attr->procedure)
2066 MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
2067 if (attr->proc_pointer)
2068 MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
2070 MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
2072 MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
2082 if (t == ATOM_RPAREN)
2085 bad_module ("Expected attribute bit name");
2087 switch ((ab_attribute) find_enum (attr_bits))
2089 case AB_ALLOCATABLE:
2090 attr->allocatable = 1;
2092 case AB_ASYNCHRONOUS:
2093 attr->asynchronous = 1;
2096 attr->dimension = 1;
2098 case AB_CODIMENSION:
2099 attr->codimension = 1;
2102 attr->contiguous = 1;
2108 attr->intrinsic = 1;
2116 case AB_CLASS_POINTER:
2117 attr->class_pointer = 1;
2120 attr->is_protected = 1;
2126 attr->volatile_ = 1;
2131 case AB_THREADPRIVATE:
2132 attr->threadprivate = 1;
2143 case AB_IN_NAMELIST:
2144 attr->in_namelist = 1;
2147 attr->in_common = 1;
2153 attr->subroutine = 1;
2165 attr->elemental = 1;
2170 case AB_IMPLICIT_PURE:
2171 attr->implicit_pure = 1;
2174 attr->recursive = 1;
2176 case AB_ALWAYS_EXPLICIT:
2177 attr->always_explicit = 1;
2179 case AB_CRAY_POINTER:
2180 attr->cray_pointer = 1;
2182 case AB_CRAY_POINTEE:
2183 attr->cray_pointee = 1;
2186 attr->is_bind_c = 1;
2188 case AB_IS_C_INTEROP:
2189 attr->is_c_interop = 1;
2195 attr->alloc_comp = 1;
2197 case AB_COARRAY_COMP:
2198 attr->coarray_comp = 1;
2201 attr->lock_comp = 1;
2203 case AB_POINTER_COMP:
2204 attr->pointer_comp = 1;
2206 case AB_PROC_POINTER_COMP:
2207 attr->proc_pointer_comp = 1;
2209 case AB_PRIVATE_COMP:
2210 attr->private_comp = 1;
2213 attr->zero_comp = 1;
2219 attr->procedure = 1;
2221 case AB_PROC_POINTER:
2222 attr->proc_pointer = 1;
2236 static const mstring bt_types[] = {
2237 minit ("INTEGER", BT_INTEGER),
2238 minit ("REAL", BT_REAL),
2239 minit ("COMPLEX", BT_COMPLEX),
2240 minit ("LOGICAL", BT_LOGICAL),
2241 minit ("CHARACTER", BT_CHARACTER),
2242 minit ("DERIVED", BT_DERIVED),
2243 minit ("CLASS", BT_CLASS),
2244 minit ("PROCEDURE", BT_PROCEDURE),
2245 minit ("UNKNOWN", BT_UNKNOWN),
2246 minit ("VOID", BT_VOID),
2252 mio_charlen (gfc_charlen **clp)
2258 if (iomode == IO_OUTPUT)
2262 mio_expr (&cl->length);
2266 if (peek_atom () != ATOM_RPAREN)
2268 cl = gfc_new_charlen (gfc_current_ns, NULL);
2269 mio_expr (&cl->length);
2278 /* See if a name is a generated name. */
2281 check_unique_name (const char *name)
2283 return *name == '@';
2288 mio_typespec (gfc_typespec *ts)
2292 ts->type = MIO_NAME (bt) (ts->type, bt_types);
2294 if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2295 mio_integer (&ts->kind);
2297 mio_symbol_ref (&ts->u.derived);
2299 mio_symbol_ref (&ts->interface);
2301 /* Add info for C interop and is_iso_c. */
2302 mio_integer (&ts->is_c_interop);
2303 mio_integer (&ts->is_iso_c);
2305 /* If the typespec is for an identifier either from iso_c_binding, or
2306 a constant that was initialized to an identifier from it, use the
2307 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2309 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2311 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2313 if (ts->type != BT_CHARACTER)
2315 /* ts->u.cl is only valid for BT_CHARACTER. */
2320 mio_charlen (&ts->u.cl);
2322 /* So as not to disturb the existing API, use an ATOM_NAME to
2323 transmit deferred characteristic for characters (F2003). */
2324 if (iomode == IO_OUTPUT)
2326 if (ts->type == BT_CHARACTER && ts->deferred)
2327 write_atom (ATOM_NAME, "DEFERRED_CL");
2329 else if (peek_atom () != ATOM_RPAREN)
2331 if (parse_atom () != ATOM_NAME)
2332 bad_module ("Expected string");
2340 static const mstring array_spec_types[] = {
2341 minit ("EXPLICIT", AS_EXPLICIT),
2342 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2343 minit ("DEFERRED", AS_DEFERRED),
2344 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2350 mio_array_spec (gfc_array_spec **asp)
2357 if (iomode == IO_OUTPUT)
2365 if (peek_atom () == ATOM_RPAREN)
2371 *asp = as = gfc_get_array_spec ();
2374 mio_integer (&as->rank);
2375 mio_integer (&as->corank);
2376 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2378 if (iomode == IO_INPUT && as->corank)
2379 as->cotype = (as->type == AS_DEFERRED) ? AS_DEFERRED : AS_EXPLICIT;
2381 for (i = 0; i < as->rank + as->corank; i++)
2383 mio_expr (&as->lower[i]);
2384 mio_expr (&as->upper[i]);
2392 /* Given a pointer to an array reference structure (which lives in a
2393 gfc_ref structure), find the corresponding array specification
2394 structure. Storing the pointer in the ref structure doesn't quite
2395 work when loading from a module. Generating code for an array
2396 reference also needs more information than just the array spec. */
2398 static const mstring array_ref_types[] = {
2399 minit ("FULL", AR_FULL),
2400 minit ("ELEMENT", AR_ELEMENT),
2401 minit ("SECTION", AR_SECTION),
2407 mio_array_ref (gfc_array_ref *ar)
2412 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2413 mio_integer (&ar->dimen);
2421 for (i = 0; i < ar->dimen; i++)
2422 mio_expr (&ar->start[i]);
2427 for (i = 0; i < ar->dimen; i++)
2429 mio_expr (&ar->start[i]);
2430 mio_expr (&ar->end[i]);
2431 mio_expr (&ar->stride[i]);
2437 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2440 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2441 we can't call mio_integer directly. Instead loop over each element
2442 and cast it to/from an integer. */
2443 if (iomode == IO_OUTPUT)
2445 for (i = 0; i < ar->dimen; i++)
2447 int tmp = (int)ar->dimen_type[i];
2448 write_atom (ATOM_INTEGER, &tmp);
2453 for (i = 0; i < ar->dimen; i++)
2455 require_atom (ATOM_INTEGER);
2456 ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2460 if (iomode == IO_INPUT)
2462 ar->where = gfc_current_locus;
2464 for (i = 0; i < ar->dimen; i++)
2465 ar->c_where[i] = gfc_current_locus;
2472 /* Saves or restores a pointer. The pointer is converted back and
2473 forth from an integer. We return the pointer_info pointer so that
2474 the caller can take additional action based on the pointer type. */
2476 static pointer_info *
2477 mio_pointer_ref (void *gp)
2481 if (iomode == IO_OUTPUT)
2483 p = get_pointer (*((char **) gp));
2484 write_atom (ATOM_INTEGER, &p->integer);
2488 require_atom (ATOM_INTEGER);
2489 p = add_fixup (atom_int, gp);
2496 /* Save and load references to components that occur within
2497 expressions. We have to describe these references by a number and
2498 by name. The number is necessary for forward references during
2499 reading, and the name is necessary if the symbol already exists in
2500 the namespace and is not loaded again. */
2503 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2505 char name[GFC_MAX_SYMBOL_LEN + 1];
2509 p = mio_pointer_ref (cp);
2510 if (p->type == P_UNKNOWN)
2511 p->type = P_COMPONENT;
2513 if (iomode == IO_OUTPUT)
2514 mio_pool_string (&(*cp)->name);
2517 mio_internal_string (name);
2519 if (sym && sym->attr.is_class)
2520 sym = sym->components->ts.u.derived;
2522 /* It can happen that a component reference can be read before the
2523 associated derived type symbol has been loaded. Return now and
2524 wait for a later iteration of load_needed. */
2528 if (sym->components != NULL && p->u.pointer == NULL)
2530 /* Symbol already loaded, so search by name. */
2531 q = gfc_find_component (sym, name, true, true);
2534 associate_integer_pointer (p, q);
2537 /* Make sure this symbol will eventually be loaded. */
2538 p = find_pointer2 (sym);
2539 if (p->u.rsym.state == UNUSED)
2540 p->u.rsym.state = NEEDED;
2545 static void mio_namespace_ref (gfc_namespace **nsp);
2546 static void mio_formal_arglist (gfc_formal_arglist **formal);
2547 static void mio_typebound_proc (gfc_typebound_proc** proc);
2550 mio_component (gfc_component *c, int vtype)
2554 gfc_formal_arglist *formal;
2558 if (iomode == IO_OUTPUT)
2560 p = get_pointer (c);
2561 mio_integer (&p->integer);
2566 p = get_integer (n);
2567 associate_integer_pointer (p, c);
2570 if (p->type == P_UNKNOWN)
2571 p->type = P_COMPONENT;
2573 mio_pool_string (&c->name);
2574 mio_typespec (&c->ts);
2575 mio_array_spec (&c->as);
2577 mio_symbol_attribute (&c->attr);
2578 if (c->ts.type == BT_CLASS)
2579 c->attr.class_ok = 1;
2580 c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types);
2583 mio_expr (&c->initializer);
2585 if (c->attr.proc_pointer)
2587 if (iomode == IO_OUTPUT)
2590 while (formal && !formal->sym)
2591 formal = formal->next;
2594 mio_namespace_ref (&formal->sym->ns);
2596 mio_namespace_ref (&c->formal_ns);
2600 mio_namespace_ref (&c->formal_ns);
2601 /* TODO: if (c->formal_ns)
2603 c->formal_ns->proc_name = c;
2608 mio_formal_arglist (&c->formal);
2610 mio_typebound_proc (&c->tb);
2618 mio_component_list (gfc_component **cp, int vtype)
2620 gfc_component *c, *tail;
2624 if (iomode == IO_OUTPUT)
2626 for (c = *cp; c; c = c->next)
2627 mio_component (c, vtype);
2636 if (peek_atom () == ATOM_RPAREN)
2639 c = gfc_get_component ();
2640 mio_component (c, vtype);
2656 mio_actual_arg (gfc_actual_arglist *a)
2659 mio_pool_string (&a->name);
2660 mio_expr (&a->expr);
2666 mio_actual_arglist (gfc_actual_arglist **ap)
2668 gfc_actual_arglist *a, *tail;
2672 if (iomode == IO_OUTPUT)
2674 for (a = *ap; a; a = a->next)
2684 if (peek_atom () != ATOM_LPAREN)
2687 a = gfc_get_actual_arglist ();
2703 /* Read and write formal argument lists. */
2706 mio_formal_arglist (gfc_formal_arglist **formal)
2708 gfc_formal_arglist *f, *tail;
2712 if (iomode == IO_OUTPUT)
2714 for (f = *formal; f; f = f->next)
2715 mio_symbol_ref (&f->sym);
2719 *formal = tail = NULL;
2721 while (peek_atom () != ATOM_RPAREN)
2723 f = gfc_get_formal_arglist ();
2724 mio_symbol_ref (&f->sym);
2726 if (*formal == NULL)
2739 /* Save or restore a reference to a symbol node. */
2742 mio_symbol_ref (gfc_symbol **symp)
2746 p = mio_pointer_ref (symp);
2747 if (p->type == P_UNKNOWN)
2750 if (iomode == IO_OUTPUT)
2752 if (p->u.wsym.state == UNREFERENCED)
2753 p->u.wsym.state = NEEDS_WRITE;
2757 if (p->u.rsym.state == UNUSED)
2758 p->u.rsym.state = NEEDED;
2764 /* Save or restore a reference to a symtree node. */
2767 mio_symtree_ref (gfc_symtree **stp)
2772 if (iomode == IO_OUTPUT)
2773 mio_symbol_ref (&(*stp)->n.sym);
2776 require_atom (ATOM_INTEGER);
2777 p = get_integer (atom_int);
2779 /* An unused equivalence member; make a symbol and a symtree
2781 if (in_load_equiv && p->u.rsym.symtree == NULL)
2783 /* Since this is not used, it must have a unique name. */
2784 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2786 /* Make the symbol. */
2787 if (p->u.rsym.sym == NULL)
2789 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2791 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2794 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2795 p->u.rsym.symtree->n.sym->refs++;
2796 p->u.rsym.referenced = 1;
2798 /* If the symbol is PRIVATE and in COMMON, load_commons will
2799 generate a fixup symbol, which must be associated. */
2801 resolve_fixups (p->fixup, p->u.rsym.sym);
2805 if (p->type == P_UNKNOWN)
2808 if (p->u.rsym.state == UNUSED)
2809 p->u.rsym.state = NEEDED;
2811 if (p->u.rsym.symtree != NULL)
2813 *stp = p->u.rsym.symtree;
2817 f = XCNEW (fixup_t);
2819 f->next = p->u.rsym.stfixup;
2820 p->u.rsym.stfixup = f;
2822 f->pointer = (void **) stp;
2829 mio_iterator (gfc_iterator **ip)
2835 if (iomode == IO_OUTPUT)
2842 if (peek_atom () == ATOM_RPAREN)
2848 *ip = gfc_get_iterator ();
2853 mio_expr (&iter->var);
2854 mio_expr (&iter->start);
2855 mio_expr (&iter->end);
2856 mio_expr (&iter->step);
2864 mio_constructor (gfc_constructor_base *cp)
2870 if (iomode == IO_OUTPUT)
2872 for (c = gfc_constructor_first (*cp); c; c = gfc_constructor_next (c))
2875 mio_expr (&c->expr);
2876 mio_iterator (&c->iterator);
2882 while (peek_atom () != ATOM_RPAREN)
2884 c = gfc_constructor_append_expr (cp, NULL, NULL);
2887 mio_expr (&c->expr);
2888 mio_iterator (&c->iterator);
2897 static const mstring ref_types[] = {
2898 minit ("ARRAY", REF_ARRAY),
2899 minit ("COMPONENT", REF_COMPONENT),
2900 minit ("SUBSTRING", REF_SUBSTRING),
2906 mio_ref (gfc_ref **rp)
2913 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2918 mio_array_ref (&r->u.ar);
2922 mio_symbol_ref (&r->u.c.sym);
2923 mio_component_ref (&r->u.c.component, r->u.c.sym);
2927 mio_expr (&r->u.ss.start);
2928 mio_expr (&r->u.ss.end);
2929 mio_charlen (&r->u.ss.length);
2938 mio_ref_list (gfc_ref **rp)
2940 gfc_ref *ref, *head, *tail;
2944 if (iomode == IO_OUTPUT)
2946 for (ref = *rp; ref; ref = ref->next)
2953 while (peek_atom () != ATOM_RPAREN)
2956 head = tail = gfc_get_ref ();
2959 tail->next = gfc_get_ref ();
2973 /* Read and write an integer value. */
2976 mio_gmp_integer (mpz_t *integer)
2980 if (iomode == IO_INPUT)
2982 if (parse_atom () != ATOM_STRING)
2983 bad_module ("Expected integer string");
2985 mpz_init (*integer);
2986 if (mpz_set_str (*integer, atom_string, 10))
2987 bad_module ("Error converting integer");
2993 p = mpz_get_str (NULL, 10, *integer);
2994 write_atom (ATOM_STRING, p);
3001 mio_gmp_real (mpfr_t *real)
3006 if (iomode == IO_INPUT)
3008 if (parse_atom () != ATOM_STRING)
3009 bad_module ("Expected real string");
3012 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
3017 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
3019 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
3021 write_atom (ATOM_STRING, p);
3026 atom_string = XCNEWVEC (char, strlen (p) + 20);
3028 sprintf (atom_string, "0.%s@%ld", p, exponent);
3030 /* Fix negative numbers. */
3031 if (atom_string[2] == '-')
3033 atom_string[0] = '-';
3034 atom_string[1] = '0';
3035 atom_string[2] = '.';
3038 write_atom (ATOM_STRING, atom_string);
3046 /* Save and restore the shape of an array constructor. */
3049 mio_shape (mpz_t **pshape, int rank)
3055 /* A NULL shape is represented by (). */
3058 if (iomode == IO_OUTPUT)
3070 if (t == ATOM_RPAREN)
3077 shape = gfc_get_shape (rank);
3081 for (n = 0; n < rank; n++)
3082 mio_gmp_integer (&shape[n]);
3088 static const mstring expr_types[] = {
3089 minit ("OP", EXPR_OP),
3090 minit ("FUNCTION", EXPR_FUNCTION),
3091 minit ("CONSTANT", EXPR_CONSTANT),
3092 minit ("VARIABLE", EXPR_VARIABLE),
3093 minit ("SUBSTRING", EXPR_SUBSTRING),
3094 minit ("STRUCTURE", EXPR_STRUCTURE),
3095 minit ("ARRAY", EXPR_ARRAY),
3096 minit ("NULL", EXPR_NULL),
3097 minit ("COMPCALL", EXPR_COMPCALL),
3101 /* INTRINSIC_ASSIGN is missing because it is used as an index for
3102 generic operators, not in expressions. INTRINSIC_USER is also
3103 replaced by the correct function name by the time we see it. */
3105 static const mstring intrinsics[] =
3107 minit ("UPLUS", INTRINSIC_UPLUS),
3108 minit ("UMINUS", INTRINSIC_UMINUS),
3109 minit ("PLUS", INTRINSIC_PLUS),
3110 minit ("MINUS", INTRINSIC_MINUS),
3111 minit ("TIMES", INTRINSIC_TIMES),
3112 minit ("DIVIDE", INTRINSIC_DIVIDE),
3113 minit ("POWER", INTRINSIC_POWER),
3114 minit ("CONCAT", INTRINSIC_CONCAT),
3115 minit ("AND", INTRINSIC_AND),
3116 minit ("OR", INTRINSIC_OR),
3117 minit ("EQV", INTRINSIC_EQV),
3118 minit ("NEQV", INTRINSIC_NEQV),
3119 minit ("EQ_SIGN", INTRINSIC_EQ),
3120 minit ("EQ", INTRINSIC_EQ_OS),
3121 minit ("NE_SIGN", INTRINSIC_NE),
3122 minit ("NE", INTRINSIC_NE_OS),
3123 minit ("GT_SIGN", INTRINSIC_GT),
3124 minit ("GT", INTRINSIC_GT_OS),
3125 minit ("GE_SIGN", INTRINSIC_GE),
3126 minit ("GE", INTRINSIC_GE_OS),
3127 minit ("LT_SIGN", INTRINSIC_LT),
3128 minit ("LT", INTRINSIC_LT_OS),
3129 minit ("LE_SIGN", INTRINSIC_LE),
3130 minit ("LE", INTRINSIC_LE_OS),
3131 minit ("NOT", INTRINSIC_NOT),
3132 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
3137 /* Remedy a couple of situations where the gfc_expr's can be defective. */
3140 fix_mio_expr (gfc_expr *e)
3142 gfc_symtree *ns_st = NULL;
3145 if (iomode != IO_OUTPUT)
3150 /* If this is a symtree for a symbol that came from a contained module
3151 namespace, it has a unique name and we should look in the current
3152 namespace to see if the required, non-contained symbol is available
3153 yet. If so, the latter should be written. */
3154 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
3156 const char *name = e->symtree->n.sym->name;
3157 if (e->symtree->n.sym->attr.flavor == FL_DERIVED)
3158 name = dt_upper_string (name);
3159 ns_st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3162 /* On the other hand, if the existing symbol is the module name or the
3163 new symbol is a dummy argument, do not do the promotion. */
3164 if (ns_st && ns_st->n.sym
3165 && ns_st->n.sym->attr.flavor != FL_MODULE
3166 && !e->symtree->n.sym->attr.dummy)
3169 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
3173 /* In some circumstances, a function used in an initialization
3174 expression, in one use associated module, can fail to be
3175 coupled to its symtree when used in a specification
3176 expression in another module. */
3177 fname = e->value.function.esym ? e->value.function.esym->name
3178 : e->value.function.isym->name;
3179 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3184 /* This is probably a reference to a private procedure from another
3185 module. To prevent a segfault, make a generic with no specific
3186 instances. If this module is used, without the required
3187 specific coming from somewhere, the appropriate error message
3189 gfc_get_symbol (fname, gfc_current_ns, &sym);
3190 sym->attr.flavor = FL_PROCEDURE;
3191 sym->attr.generic = 1;
3192 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3193 gfc_commit_symbol (sym);
3198 /* Read and write expressions. The form "()" is allowed to indicate a
3202 mio_expr (gfc_expr **ep)
3210 if (iomode == IO_OUTPUT)
3219 MIO_NAME (expr_t) (e->expr_type, expr_types);
3224 if (t == ATOM_RPAREN)
3231 bad_module ("Expected expression type");
3233 e = *ep = gfc_get_expr ();
3234 e->where = gfc_current_locus;
3235 e->expr_type = (expr_t) find_enum (expr_types);
3238 mio_typespec (&e->ts);
3239 mio_integer (&e->rank);
3243 switch (e->expr_type)
3247 = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3249 switch (e->value.op.op)
3251 case INTRINSIC_UPLUS:
3252 case INTRINSIC_UMINUS:
3254 case INTRINSIC_PARENTHESES:
3255 mio_expr (&e->value.op.op1);
3258 case INTRINSIC_PLUS:
3259 case INTRINSIC_MINUS:
3260 case INTRINSIC_TIMES:
3261 case INTRINSIC_DIVIDE:
3262 case INTRINSIC_POWER:
3263 case INTRINSIC_CONCAT:
3267 case INTRINSIC_NEQV:
3269 case INTRINSIC_EQ_OS:
3271 case INTRINSIC_NE_OS:
3273 case INTRINSIC_GT_OS:
3275 case INTRINSIC_GE_OS:
3277 case INTRINSIC_LT_OS:
3279 case INTRINSIC_LE_OS:
3280 mio_expr (&e->value.op.op1);
3281 mio_expr (&e->value.op.op2);
3285 bad_module ("Bad operator");
3291 mio_symtree_ref (&e->symtree);
3292 mio_actual_arglist (&e->value.function.actual);
3294 if (iomode == IO_OUTPUT)
3296 e->value.function.name
3297 = mio_allocated_string (e->value.function.name);
3298 flag = e->value.function.esym != NULL;
3299 mio_integer (&flag);
3301 mio_symbol_ref (&e->value.function.esym);
3303 write_atom (ATOM_STRING, e->value.function.isym->name);
3307 require_atom (ATOM_STRING);
3308 e->value.function.name = gfc_get_string (atom_string);
3311 mio_integer (&flag);
3313 mio_symbol_ref (&e->value.function.esym);
3316 require_atom (ATOM_STRING);
3317 e->value.function.isym = gfc_find_function (atom_string);
3325 mio_symtree_ref (&e->symtree);
3326 mio_ref_list (&e->ref);
3329 case EXPR_SUBSTRING:
3330 e->value.character.string
3331 = CONST_CAST (gfc_char_t *,
3332 mio_allocated_wide_string (e->value.character.string,
3333 e->value.character.length));
3334 mio_ref_list (&e->ref);
3337 case EXPR_STRUCTURE:
3339 mio_constructor (&e->value.constructor);
3340 mio_shape (&e->shape, e->rank);
3347 mio_gmp_integer (&e->value.integer);
3351 gfc_set_model_kind (e->ts.kind);
3352 mio_gmp_real (&e->value.real);
3356 gfc_set_model_kind (e->ts.kind);
3357 mio_gmp_real (&mpc_realref (e->value.complex));
3358 mio_gmp_real (&mpc_imagref (e->value.complex));
3362 mio_integer (&e->value.logical);
3366 mio_integer (&e->value.character.length);
3367 e->value.character.string
3368 = CONST_CAST (gfc_char_t *,
3369 mio_allocated_wide_string (e->value.character.string,
3370 e->value.character.length));
3374 bad_module ("Bad type in constant expression");
3392 /* Read and write namelists. */
3395 mio_namelist (gfc_symbol *sym)
3397 gfc_namelist *n, *m;
3398 const char *check_name;
3402 if (iomode == IO_OUTPUT)
3404 for (n = sym->namelist; n; n = n->next)
3405 mio_symbol_ref (&n->sym);
3409 /* This departure from the standard is flagged as an error.
3410 It does, in fact, work correctly. TODO: Allow it
3412 if (sym->attr.flavor == FL_NAMELIST)
3414 check_name = find_use_name (sym->name, false);
3415 if (check_name && strcmp (check_name, sym->name) != 0)
3416 gfc_error ("Namelist %s cannot be renamed by USE "
3417 "association to %s", sym->name, check_name);
3421 while (peek_atom () != ATOM_RPAREN)
3423 n = gfc_get_namelist ();
3424 mio_symbol_ref (&n->sym);
3426 if (sym->namelist == NULL)
3433 sym->namelist_tail = m;
3440 /* Save/restore lists of gfc_interface structures. When loading an
3441 interface, we are really appending to the existing list of
3442 interfaces. Checking for duplicate and ambiguous interfaces has to
3443 be done later when all symbols have been loaded. */
3446 mio_interface_rest (gfc_interface **ip)
3448 gfc_interface *tail, *p;
3449 pointer_info *pi = NULL;
3451 if (iomode == IO_OUTPUT)
3454 for (p = *ip; p; p = p->next)
3455 mio_symbol_ref (&p->sym);
3470 if (peek_atom () == ATOM_RPAREN)
3473 p = gfc_get_interface ();
3474 p->where = gfc_current_locus;
3475 pi = mio_symbol_ref (&p->sym);
3491 /* Save/restore a nameless operator interface. */
3494 mio_interface (gfc_interface **ip)
3497 mio_interface_rest (ip);
3501 /* Save/restore a named operator interface. */
3504 mio_symbol_interface (const char **name, const char **module,
3508 mio_pool_string (name);
3509 mio_pool_string (module);
3510 mio_interface_rest (ip);
3515 mio_namespace_ref (gfc_namespace **nsp)
3520 p = mio_pointer_ref (nsp);
3522 if (p->type == P_UNKNOWN)
3523 p->type = P_NAMESPACE;
3525 if (iomode == IO_INPUT && p->integer != 0)
3527 ns = (gfc_namespace *) p->u.pointer;
3530 ns = gfc_get_namespace (NULL, 0);
3531 associate_integer_pointer (p, ns);
3539 /* Save/restore the f2k_derived namespace of a derived-type symbol. */
3541 static gfc_namespace* current_f2k_derived;
3544 mio_typebound_proc (gfc_typebound_proc** proc)
3547 int overriding_flag;
3549 if (iomode == IO_INPUT)
3551 *proc = gfc_get_typebound_proc (NULL);
3552 (*proc)->where = gfc_current_locus;
3558 (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3560 /* IO the NON_OVERRIDABLE/DEFERRED combination. */
3561 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3562 overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3563 overriding_flag = mio_name (overriding_flag, binding_overriding);
3564 (*proc)->deferred = ((overriding_flag & 2) != 0);
3565 (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3566 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3568 (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3569 (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3570 (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3572 mio_pool_string (&((*proc)->pass_arg));
3574 flag = (int) (*proc)->pass_arg_num;
3575 mio_integer (&flag);
3576 (*proc)->pass_arg_num = (unsigned) flag;
3578 if ((*proc)->is_generic)
3585 if (iomode == IO_OUTPUT)
3586 for (g = (*proc)->u.generic; g; g = g->next)
3588 iop = (int) g->is_operator;
3590 mio_allocated_string (g->specific_st->name);
3594 (*proc)->u.generic = NULL;
3595 while (peek_atom () != ATOM_RPAREN)
3597 gfc_symtree** sym_root;
3599 g = gfc_get_tbp_generic ();
3603 g->is_operator = (bool) iop;
3605 require_atom (ATOM_STRING);
3606 sym_root = ¤t_f2k_derived->tb_sym_root;
3607 g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3610 g->next = (*proc)->u.generic;
3611 (*proc)->u.generic = g;
3617 else if (!(*proc)->ppc)
3618 mio_symtree_ref (&(*proc)->u.specific);
3623 /* Walker-callback function for this purpose. */
3625 mio_typebound_symtree (gfc_symtree* st)
3627 if (iomode == IO_OUTPUT && !st->n.tb)
3630 if (iomode == IO_OUTPUT)
3633 mio_allocated_string (st->name);
3635 /* For IO_INPUT, the above is done in mio_f2k_derived. */
3637 mio_typebound_proc (&st->n.tb);
3641 /* IO a full symtree (in all depth). */
3643 mio_full_typebound_tree (gfc_symtree** root)
3647 if (iomode == IO_OUTPUT)
3648 gfc_traverse_symtree (*root, &mio_typebound_symtree);
3651 while (peek_atom () == ATOM_LPAREN)
3657 require_atom (ATOM_STRING);
3658 st = gfc_get_tbp_symtree (root, atom_string);
3661 mio_typebound_symtree (st);
3669 mio_finalizer (gfc_finalizer **f)
3671 if (iomode == IO_OUTPUT)
3674 gcc_assert ((*f)->proc_tree); /* Should already be resolved. */
3675 mio_symtree_ref (&(*f)->proc_tree);
3679 *f = gfc_get_finalizer ();
3680 (*f)->where = gfc_current_locus; /* Value should not matter. */
3683 mio_symtree_ref (&(*f)->proc_tree);
3684 (*f)->proc_sym = NULL;
3689 mio_f2k_derived (gfc_namespace *f2k)
3691 current_f2k_derived = f2k;
3693 /* Handle the list of finalizer procedures. */
3695 if (iomode == IO_OUTPUT)
3698 for (f = f2k->finalizers; f; f = f->next)
3703 f2k->finalizers = NULL;
3704 while (peek_atom () != ATOM_RPAREN)
3706 gfc_finalizer *cur = NULL;
3707 mio_finalizer (&cur);
3708 cur->next = f2k->finalizers;
3709 f2k->finalizers = cur;
3714 /* Handle type-bound procedures. */
3715 mio_full_typebound_tree (&f2k->tb_sym_root);
3717 /* Type-bound user operators. */
3718 mio_full_typebound_tree (&f2k->tb_uop_root);
3720 /* Type-bound intrinsic operators. */
3722 if (iomode == IO_OUTPUT)
3725 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3727 gfc_intrinsic_op realop;
3729 if (op == INTRINSIC_USER || !f2k->tb_op[op])
3733 realop = (gfc_intrinsic_op) op;
3734 mio_intrinsic_op (&realop);
3735 mio_typebound_proc (&f2k->tb_op[op]);
3740 while (peek_atom () != ATOM_RPAREN)
3742 gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC. */
3745 mio_intrinsic_op (&op);
3746 mio_typebound_proc (&f2k->tb_op[op]);
3753 mio_full_f2k_derived (gfc_symbol *sym)