1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000-2014 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* The syntax of gfortran modules resembles that of lisp lists, i.e. a
23 sequence of atoms, which can be left or right parenthesis, names,
24 integers or strings. Parenthesis are always matched which allows
25 us to skip over sections at high speed without having to know
26 anything about the internal structure of the lists. A "name" is
27 usually a fortran 95 identifier, but can also start with '@' in
28 order to reference a hidden symbol.
30 The first line of a module is an informational message about what
31 created the module, the file it came from and when it was created.
32 The second line is a warning for people not to edit the module.
33 The rest of the module looks like:
35 ( ( <Interface info for UPLUS> )
36 ( <Interface info for UMINUS> )
39 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45 ( ( <common name> <symbol> <saved flag>)
51 ( <Symbol Number (in no particular order)>
53 <Module name of symbol>
54 ( <symbol information> )
63 In general, symbols refer to other symbols by their symbol number,
64 which are zero based. Symbols are written to the module in no
69 #include "coretypes.h"
73 #include "parse.h" /* FIXME */
74 #include "constructor.h"
77 #include "stringpool.h"
81 #define MODULE_EXTENSION ".mod"
83 /* Don't put any single quote (') in MOD_VERSION, if you want it to be
85 #define MOD_VERSION "13"
88 /* Structure that describes a position within a module file. */
97 /* Structure for list of symbols of intrinsic modules. */
110 P_UNKNOWN
= 0, P_OTHER
, P_NAMESPACE
, P_COMPONENT
, P_SYMBOL
114 /* The fixup structure lists pointers to pointers that have to
115 be updated when a pointer value becomes known. */
117 typedef struct fixup_t
120 struct fixup_t
*next
;
125 /* Structure for holding extra info needed for pointers being read. */
141 typedef struct pointer_info
143 BBT_HEADER (pointer_info
);
147 /* The first component of each member of the union is the pointer
154 void *pointer
; /* Member for doing pointer searches. */
159 char *true_name
, *module
, *binding_label
;
161 gfc_symtree
*symtree
;
162 enum gfc_rsym_state state
;
163 int ns
, referenced
, renamed
;
171 enum gfc_wsym_state state
;
180 #define gfc_get_pointer_info() XCNEW (pointer_info)
183 /* Local variables */
185 /* The gzFile for the module we're reading or writing. */
186 static gzFile module_fp
;
189 /* The name of the module we're reading (USE'ing) or writing. */
190 static const char *module_name
;
191 static gfc_use_list
*module_list
;
193 /* If we're reading an intrinsic module, this is its ID. */
194 static intmod_id current_intmod
;
196 /* Content of module. */
197 static char* module_content
;
199 static long module_pos
;
200 static int module_line
, module_column
, only_flag
;
201 static int prev_module_line
, prev_module_column
;
204 { IO_INPUT
, IO_OUTPUT
}
207 static gfc_use_rename
*gfc_rename_list
;
208 static pointer_info
*pi_root
;
209 static int symbol_number
; /* Counter for assigning symbol numbers */
211 /* Tells mio_expr_ref to make symbols for unused equivalence members. */
212 static bool in_load_equiv
;
216 /*****************************************************************/
218 /* Pointer/integer conversion. Pointers between structures are stored
219 as integers in the module file. The next couple of subroutines
220 handle this translation for reading and writing. */
222 /* Recursively free the tree of pointer structures. */
225 free_pi_tree (pointer_info
*p
)
230 if (p
->fixup
!= NULL
)
231 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
233 free_pi_tree (p
->left
);
234 free_pi_tree (p
->right
);
236 if (iomode
== IO_INPUT
)
238 XDELETEVEC (p
->u
.rsym
.true_name
);
239 XDELETEVEC (p
->u
.rsym
.module
);
240 XDELETEVEC (p
->u
.rsym
.binding_label
);
247 /* Compare pointers when searching by pointer. Used when writing a
251 compare_pointers (void *_sn1
, void *_sn2
)
253 pointer_info
*sn1
, *sn2
;
255 sn1
= (pointer_info
*) _sn1
;
256 sn2
= (pointer_info
*) _sn2
;
258 if (sn1
->u
.pointer
< sn2
->u
.pointer
)
260 if (sn1
->u
.pointer
> sn2
->u
.pointer
)
267 /* Compare integers when searching by integer. Used when reading a
271 compare_integers (void *_sn1
, void *_sn2
)
273 pointer_info
*sn1
, *sn2
;
275 sn1
= (pointer_info
*) _sn1
;
276 sn2
= (pointer_info
*) _sn2
;
278 if (sn1
->integer
< sn2
->integer
)
280 if (sn1
->integer
> sn2
->integer
)
287 /* Initialize the pointer_info tree. */
296 compare
= (iomode
== IO_INPUT
) ? compare_integers
: compare_pointers
;
298 /* Pointer 0 is the NULL pointer. */
299 p
= gfc_get_pointer_info ();
304 gfc_insert_bbt (&pi_root
, p
, compare
);
306 /* Pointer 1 is the current namespace. */
307 p
= gfc_get_pointer_info ();
308 p
->u
.pointer
= gfc_current_ns
;
310 p
->type
= P_NAMESPACE
;
312 gfc_insert_bbt (&pi_root
, p
, compare
);
318 /* During module writing, call here with a pointer to something,
319 returning the pointer_info node. */
321 static pointer_info
*
322 find_pointer (void *gp
)
329 if (p
->u
.pointer
== gp
)
331 p
= (gp
< p
->u
.pointer
) ? p
->left
: p
->right
;
338 /* Given a pointer while writing, returns the pointer_info tree node,
339 creating it if it doesn't exist. */
341 static pointer_info
*
342 get_pointer (void *gp
)
346 p
= find_pointer (gp
);
350 /* Pointer doesn't have an integer. Give it one. */
351 p
= gfc_get_pointer_info ();
354 p
->integer
= symbol_number
++;
356 gfc_insert_bbt (&pi_root
, p
, compare_pointers
);
362 /* Given an integer during reading, find it in the pointer_info tree,
363 creating the node if not found. */
365 static pointer_info
*
366 get_integer (int integer
)
376 c
= compare_integers (&t
, p
);
380 p
= (c
< 0) ? p
->left
: p
->right
;
386 p
= gfc_get_pointer_info ();
387 p
->integer
= integer
;
390 gfc_insert_bbt (&pi_root
, p
, compare_integers
);
396 /* Resolve any fixups using a known pointer. */
399 resolve_fixups (fixup_t
*f
, void *gp
)
412 /* Convert a string such that it starts with a lower-case character. Used
413 to convert the symtree name of a derived-type to the symbol name or to
414 the name of the associated generic function. */
417 dt_lower_string (const char *name
)
419 if (name
[0] != (char) TOLOWER ((unsigned char) name
[0]))
420 return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name
[0]),
422 return gfc_get_string (name
);
426 /* Convert a string such that it starts with an upper-case character. Used to
427 return the symtree-name for a derived type; the symbol name itself and the
428 symtree/symbol name of the associated generic function start with a lower-
432 dt_upper_string (const char *name
)
434 if (name
[0] != (char) TOUPPER ((unsigned char) name
[0]))
435 return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name
[0]),
437 return gfc_get_string (name
);
440 /* Call here during module reading when we know what pointer to
441 associate with an integer. Any fixups that exist are resolved at
445 associate_integer_pointer (pointer_info
*p
, void *gp
)
447 if (p
->u
.pointer
!= NULL
)
448 gfc_internal_error ("associate_integer_pointer(): Already associated");
452 resolve_fixups (p
->fixup
, gp
);
458 /* During module reading, given an integer and a pointer to a pointer,
459 either store the pointer from an already-known value or create a
460 fixup structure in order to store things later. Returns zero if
461 the reference has been actually stored, or nonzero if the reference
462 must be fixed later (i.e., associate_integer_pointer must be called
463 sometime later. Returns the pointer_info structure. */
465 static pointer_info
*
466 add_fixup (int integer
, void *gp
)
472 p
= get_integer (integer
);
474 if (p
->integer
== 0 || p
->u
.pointer
!= NULL
)
477 *cp
= (char *) p
->u
.pointer
;
486 f
->pointer
= (void **) gp
;
493 /*****************************************************************/
495 /* Parser related subroutines */
497 /* Free the rename list left behind by a USE statement. */
500 free_rename (gfc_use_rename
*list
)
502 gfc_use_rename
*next
;
504 for (; list
; list
= next
)
512 /* Match a USE statement. */
517 char name
[GFC_MAX_SYMBOL_LEN
+ 1], module_nature
[GFC_MAX_SYMBOL_LEN
+ 1];
518 gfc_use_rename
*tail
= NULL
, *new_use
;
519 interface_type type
, type2
;
522 gfc_use_list
*use_list
;
524 use_list
= gfc_get_use_list ();
526 if (gfc_match (" , ") == MATCH_YES
)
528 if ((m
= gfc_match (" %n ::", module_nature
)) == MATCH_YES
)
530 if (!gfc_notify_std (GFC_STD_F2003
, "module "
531 "nature in USE statement at %C"))
534 if (strcmp (module_nature
, "intrinsic") == 0)
535 use_list
->intrinsic
= true;
538 if (strcmp (module_nature
, "non_intrinsic") == 0)
539 use_list
->non_intrinsic
= true;
542 gfc_error ("Module nature in USE statement at %C shall "
543 "be either INTRINSIC or NON_INTRINSIC");
550 /* Help output a better error message than "Unclassifiable
552 gfc_match (" %n", module_nature
);
553 if (strcmp (module_nature
, "intrinsic") == 0
554 || strcmp (module_nature
, "non_intrinsic") == 0)
555 gfc_error ("\"::\" was expected after module nature at %C "
556 "but was not found");
563 m
= gfc_match (" ::");
564 if (m
== MATCH_YES
&&
565 !gfc_notify_std(GFC_STD_F2003
, "\"USE :: module\" at %C"))
570 m
= gfc_match ("% ");
579 use_list
->where
= gfc_current_locus
;
581 m
= gfc_match_name (name
);
588 use_list
->module_name
= gfc_get_string (name
);
590 if (gfc_match_eos () == MATCH_YES
)
593 if (gfc_match_char (',') != MATCH_YES
)
596 if (gfc_match (" only :") == MATCH_YES
)
597 use_list
->only_flag
= true;
599 if (gfc_match_eos () == MATCH_YES
)
604 /* Get a new rename struct and add it to the rename list. */
605 new_use
= gfc_get_use_rename ();
606 new_use
->where
= gfc_current_locus
;
609 if (use_list
->rename
== NULL
)
610 use_list
->rename
= new_use
;
612 tail
->next
= new_use
;
615 /* See what kind of interface we're dealing with. Assume it is
617 new_use
->op
= INTRINSIC_NONE
;
618 if (gfc_match_generic_spec (&type
, name
, &op
) == MATCH_ERROR
)
623 case INTERFACE_NAMELESS
:
624 gfc_error ("Missing generic specification in USE statement at %C");
627 case INTERFACE_USER_OP
:
628 case INTERFACE_GENERIC
:
629 m
= gfc_match (" =>");
631 if (type
== INTERFACE_USER_OP
&& m
== MATCH_YES
632 && (!gfc_notify_std(GFC_STD_F2003
, "Renaming "
633 "operators in USE statements at %C")))
636 if (type
== INTERFACE_USER_OP
)
637 new_use
->op
= INTRINSIC_USER
;
639 if (use_list
->only_flag
)
642 strcpy (new_use
->use_name
, name
);
645 strcpy (new_use
->local_name
, name
);
646 m
= gfc_match_generic_spec (&type2
, new_use
->use_name
, &op
);
651 if (m
== MATCH_ERROR
)
659 strcpy (new_use
->local_name
, name
);
661 m
= gfc_match_generic_spec (&type2
, new_use
->use_name
, &op
);
666 if (m
== MATCH_ERROR
)
670 if (strcmp (new_use
->use_name
, use_list
->module_name
) == 0
671 || strcmp (new_use
->local_name
, use_list
->module_name
) == 0)
673 gfc_error ("The name '%s' at %C has already been used as "
674 "an external module name.", use_list
->module_name
);
679 case INTERFACE_INTRINSIC_OP
:
687 if (gfc_match_eos () == MATCH_YES
)
689 if (gfc_match_char (',') != MATCH_YES
)
696 gfc_use_list
*last
= module_list
;
699 last
->next
= use_list
;
702 module_list
= use_list
;
707 gfc_syntax_error (ST_USE
);
710 free_rename (use_list
->rename
);
716 /* Given a name and a number, inst, return the inst name
717 under which to load this symbol. Returns NULL if this
718 symbol shouldn't be loaded. If inst is zero, returns
719 the number of instances of this name. If interface is
720 true, a user-defined operator is sought, otherwise only
721 non-operators are sought. */
724 find_use_name_n (const char *name
, int *inst
, bool interface
)
727 const char *low_name
= NULL
;
730 /* For derived types. */
731 if (name
[0] != (char) TOLOWER ((unsigned char) name
[0]))
732 low_name
= dt_lower_string (name
);
735 for (u
= gfc_rename_list
; u
; u
= u
->next
)
737 if ((!low_name
&& strcmp (u
->use_name
, name
) != 0)
738 || (low_name
&& strcmp (u
->use_name
, low_name
) != 0)
739 || (u
->op
== INTRINSIC_USER
&& !interface
)
740 || (u
->op
!= INTRINSIC_USER
&& interface
))
753 return only_flag
? NULL
: name
;
759 if (u
->local_name
[0] == '\0')
761 return dt_upper_string (u
->local_name
);
764 return (u
->local_name
[0] != '\0') ? u
->local_name
: name
;
768 /* Given a name, return the name under which to load this symbol.
769 Returns NULL if this symbol shouldn't be loaded. */
772 find_use_name (const char *name
, bool interface
)
775 return find_use_name_n (name
, &i
, interface
);
779 /* Given a real name, return the number of use names associated with it. */
782 number_use_names (const char *name
, bool interface
)
785 find_use_name_n (name
, &i
, interface
);
790 /* Try to find the operator in the current list. */
792 static gfc_use_rename
*
793 find_use_operator (gfc_intrinsic_op op
)
797 for (u
= gfc_rename_list
; u
; u
= u
->next
)
805 /*****************************************************************/
807 /* The next couple of subroutines maintain a tree used to avoid a
808 brute-force search for a combination of true name and module name.
809 While symtree names, the name that a particular symbol is known by
810 can changed with USE statements, we still have to keep track of the
811 true names to generate the correct reference, and also avoid
812 loading the same real symbol twice in a program unit.
814 When we start reading, the true name tree is built and maintained
815 as symbols are read. The tree is searched as we load new symbols
816 to see if it already exists someplace in the namespace. */
818 typedef struct true_name
820 BBT_HEADER (true_name
);
826 static true_name
*true_name_root
;
829 /* Compare two true_name structures. */
832 compare_true_names (void *_t1
, void *_t2
)
837 t1
= (true_name
*) _t1
;
838 t2
= (true_name
*) _t2
;
840 c
= ((t1
->sym
->module
> t2
->sym
->module
)
841 - (t1
->sym
->module
< t2
->sym
->module
));
845 return strcmp (t1
->name
, t2
->name
);
849 /* Given a true name, search the true name tree to see if it exists
850 within the main namespace. */
853 find_true_name (const char *name
, const char *module
)
859 t
.name
= gfc_get_string (name
);
861 sym
.module
= gfc_get_string (module
);
869 c
= compare_true_names ((void *) (&t
), (void *) p
);
873 p
= (c
< 0) ? p
->left
: p
->right
;
880 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
883 add_true_name (gfc_symbol
*sym
)
887 t
= XCNEW (true_name
);
889 if (sym
->attr
.flavor
== FL_DERIVED
)
890 t
->name
= dt_upper_string (sym
->name
);
894 gfc_insert_bbt (&true_name_root
, t
, compare_true_names
);
898 /* Recursive function to build the initial true name tree by
899 recursively traversing the current namespace. */
902 build_tnt (gfc_symtree
*st
)
908 build_tnt (st
->left
);
909 build_tnt (st
->right
);
911 if (st
->n
.sym
->attr
.flavor
== FL_DERIVED
)
912 name
= dt_upper_string (st
->n
.sym
->name
);
914 name
= st
->n
.sym
->name
;
916 if (find_true_name (name
, st
->n
.sym
->module
) != NULL
)
919 add_true_name (st
->n
.sym
);
923 /* Initialize the true name tree with the current namespace. */
926 init_true_name_tree (void)
928 true_name_root
= NULL
;
929 build_tnt (gfc_current_ns
->sym_root
);
933 /* Recursively free a true name tree node. */
936 free_true_name (true_name
*t
)
940 free_true_name (t
->left
);
941 free_true_name (t
->right
);
947 /*****************************************************************/
949 /* Module reading and writing. */
951 /* The following are versions similar to the ones in scanner.c, but
952 for dealing with compressed module files. */
955 gzopen_included_file_1 (const char *name
, gfc_directorylist
*list
,
956 bool module
, bool system
)
959 gfc_directorylist
*p
;
962 for (p
= list
; p
; p
= p
->next
)
964 if (module
&& !p
->use_for_modules
)
967 fullname
= (char *) alloca(strlen (p
->path
) + strlen (name
) + 1);
968 strcpy (fullname
, p
->path
);
969 strcat (fullname
, name
);
971 f
= gzopen (fullname
, "r");
974 if (gfc_cpp_makedep ())
975 gfc_cpp_add_dep (fullname
, system
);
985 gzopen_included_file (const char *name
, bool include_cwd
, bool module
)
989 if (IS_ABSOLUTE_PATH (name
) || include_cwd
)
991 f
= gzopen (name
, "r");
992 if (f
&& gfc_cpp_makedep ())
993 gfc_cpp_add_dep (name
, false);
997 f
= gzopen_included_file_1 (name
, include_dirs
, module
, false);
1003 gzopen_intrinsic_module (const char* name
)
1007 if (IS_ABSOLUTE_PATH (name
))
1009 f
= gzopen (name
, "r");
1010 if (f
&& gfc_cpp_makedep ())
1011 gfc_cpp_add_dep (name
, true);
1015 f
= gzopen_included_file_1 (name
, intrinsic_modules_dirs
, true, true);
1023 ATOM_NAME
, ATOM_LPAREN
, ATOM_RPAREN
, ATOM_INTEGER
, ATOM_STRING
1027 static atom_type last_atom
;
1030 /* The name buffer must be at least as long as a symbol name. Right
1031 now it's not clear how we're going to store numeric constants--
1032 probably as a hexadecimal string, since this will allow the exact
1033 number to be preserved (this can't be done by a decimal
1034 representation). Worry about that later. TODO! */
1036 #define MAX_ATOM_SIZE 100
1038 static int atom_int
;
1039 static char *atom_string
, atom_name
[MAX_ATOM_SIZE
];
1042 /* Report problems with a module. Error reporting is not very
1043 elaborate, since this sorts of errors shouldn't really happen.
1044 This subroutine never returns. */
1046 static void bad_module (const char *) ATTRIBUTE_NORETURN
;
1049 bad_module (const char *msgid
)
1051 XDELETEVEC (module_content
);
1052 module_content
= NULL
;
1057 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
1058 module_name
, module_line
, module_column
, msgid
);
1061 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
1062 module_name
, module_line
, module_column
, msgid
);
1065 gfc_fatal_error ("Module %s at line %d column %d: %s",
1066 module_name
, module_line
, module_column
, msgid
);
1072 /* Set the module's input pointer. */
1075 set_module_locus (module_locus
*m
)
1077 module_column
= m
->column
;
1078 module_line
= m
->line
;
1079 module_pos
= m
->pos
;
1083 /* Get the module's input pointer so that we can restore it later. */
1086 get_module_locus (module_locus
*m
)
1088 m
->column
= module_column
;
1089 m
->line
= module_line
;
1090 m
->pos
= module_pos
;
1094 /* Get the next character in the module, updating our reckoning of
1100 const char c
= module_content
[module_pos
++];
1102 bad_module ("Unexpected EOF");
1104 prev_module_line
= module_line
;
1105 prev_module_column
= module_column
;
1117 /* Unget a character while remembering the line and column. Works for
1118 a single character only. */
1121 module_unget_char (void)
1123 module_line
= prev_module_line
;
1124 module_column
= prev_module_column
;
1128 /* Parse a string constant. The delimiter is guaranteed to be a
1138 atom_string
= XNEWVEC (char, cursz
);
1146 int c2
= module_char ();
1149 module_unget_char ();
1157 atom_string
= XRESIZEVEC (char, atom_string
, cursz
);
1159 atom_string
[len
] = c
;
1163 atom_string
= XRESIZEVEC (char, atom_string
, len
+ 1);
1164 atom_string
[len
] = '\0'; /* C-style string for debug purposes. */
1168 /* Parse a small integer. */
1171 parse_integer (int c
)
1180 module_unget_char ();
1184 atom_int
= 10 * atom_int
+ c
- '0';
1185 if (atom_int
> 99999999)
1186 bad_module ("Integer overflow");
1208 if (!ISALNUM (c
) && c
!= '_' && c
!= '-')
1210 module_unget_char ();
1215 if (++len
> GFC_MAX_SYMBOL_LEN
)
1216 bad_module ("Name too long");
1224 /* Read the next atom in the module's input stream. */
1235 while (c
== ' ' || c
== '\r' || c
== '\n');
1260 return ATOM_INTEGER
;
1318 bad_module ("Bad name");
1325 /* Peek at the next atom on the input. */
1336 while (c
== ' ' || c
== '\r' || c
== '\n');
1341 module_unget_char ();
1345 module_unget_char ();
1349 module_unget_char ();
1362 module_unget_char ();
1363 return ATOM_INTEGER
;
1417 module_unget_char ();
1421 bad_module ("Bad name");
1426 /* Read the next atom from the input, requiring that it be a
1430 require_atom (atom_type type
)
1436 column
= module_column
;
1445 p
= _("Expected name");
1448 p
= _("Expected left parenthesis");
1451 p
= _("Expected right parenthesis");
1454 p
= _("Expected integer");
1457 p
= _("Expected string");
1460 gfc_internal_error ("require_atom(): bad atom type required");
1463 module_column
= column
;
1470 /* Given a pointer to an mstring array, require that the current input
1471 be one of the strings in the array. We return the enum value. */
1474 find_enum (const mstring
*m
)
1478 i
= gfc_string2code (m
, atom_name
);
1482 bad_module ("find_enum(): Enum not found");
1488 /* Read a string. The caller is responsible for freeing. */
1494 require_atom (ATOM_STRING
);
1501 /**************** Module output subroutines ***************************/
1503 /* Output a character to a module file. */
1506 write_char (char out
)
1508 if (gzputc (module_fp
, out
) == EOF
)
1509 gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno
));
1521 /* Write an atom to a module. The line wrapping isn't perfect, but it
1522 should work most of the time. This isn't that big of a deal, since
1523 the file really isn't meant to be read by people anyway. */
1526 write_atom (atom_type atom
, const void *v
)
1536 p
= (const char *) v
;
1548 i
= *((const int *) v
);
1550 gfc_internal_error ("write_atom(): Writing negative integer");
1552 sprintf (buffer
, "%d", i
);
1557 gfc_internal_error ("write_atom(): Trying to write dab atom");
1561 if(p
== NULL
|| *p
== '\0')
1566 if (atom
!= ATOM_RPAREN
)
1568 if (module_column
+ len
> 72)
1573 if (last_atom
!= ATOM_LPAREN
&& module_column
!= 1)
1578 if (atom
== ATOM_STRING
)
1581 while (p
!= NULL
&& *p
)
1583 if (atom
== ATOM_STRING
&& *p
== '\'')
1588 if (atom
== ATOM_STRING
)
1596 /***************** Mid-level I/O subroutines *****************/
1598 /* These subroutines let their caller read or write atoms without
1599 caring about which of the two is actually happening. This lets a
1600 subroutine concentrate on the actual format of the data being
1603 static void mio_expr (gfc_expr
**);
1604 pointer_info
*mio_symbol_ref (gfc_symbol
**);
1605 pointer_info
*mio_interface_rest (gfc_interface
**);
1606 static void mio_symtree_ref (gfc_symtree
**);
1608 /* Read or write an enumerated value. On writing, we return the input
1609 value for the convenience of callers. We avoid using an integer
1610 pointer because enums are sometimes inside bitfields. */
1613 mio_name (int t
, const mstring
*m
)
1615 if (iomode
== IO_OUTPUT
)
1616 write_atom (ATOM_NAME
, gfc_code2string (m
, t
));
1619 require_atom (ATOM_NAME
);
1626 /* Specialization of mio_name. */
1628 #define DECL_MIO_NAME(TYPE) \
1629 static inline TYPE \
1630 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1632 return (TYPE) mio_name ((int) t, m); \
1634 #define MIO_NAME(TYPE) mio_name_##TYPE
1639 if (iomode
== IO_OUTPUT
)
1640 write_atom (ATOM_LPAREN
, NULL
);
1642 require_atom (ATOM_LPAREN
);
1649 if (iomode
== IO_OUTPUT
)
1650 write_atom (ATOM_RPAREN
, NULL
);
1652 require_atom (ATOM_RPAREN
);
1657 mio_integer (int *ip
)
1659 if (iomode
== IO_OUTPUT
)
1660 write_atom (ATOM_INTEGER
, ip
);
1663 require_atom (ATOM_INTEGER
);
1669 /* Read or write a gfc_intrinsic_op value. */
1672 mio_intrinsic_op (gfc_intrinsic_op
* op
)
1674 /* FIXME: Would be nicer to do this via the operators symbolic name. */
1675 if (iomode
== IO_OUTPUT
)
1677 int converted
= (int) *op
;
1678 write_atom (ATOM_INTEGER
, &converted
);
1682 require_atom (ATOM_INTEGER
);
1683 *op
= (gfc_intrinsic_op
) atom_int
;
1688 /* Read or write a character pointer that points to a string on the heap. */
1691 mio_allocated_string (const char *s
)
1693 if (iomode
== IO_OUTPUT
)
1695 write_atom (ATOM_STRING
, s
);
1700 require_atom (ATOM_STRING
);
1706 /* Functions for quoting and unquoting strings. */
1709 quote_string (const gfc_char_t
*s
, const size_t slength
)
1711 const gfc_char_t
*p
;
1715 /* Calculate the length we'll need: a backslash takes two ("\\"),
1716 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1717 for (p
= s
, i
= 0; i
< slength
; p
++, i
++)
1721 else if (!gfc_wide_is_printable (*p
))
1727 q
= res
= XCNEWVEC (char, len
+ 1);
1728 for (p
= s
, i
= 0; i
< slength
; p
++, i
++)
1731 *q
++ = '\\', *q
++ = '\\';
1732 else if (!gfc_wide_is_printable (*p
))
1734 sprintf (q
, "\\U%08" HOST_WIDE_INT_PRINT
"x",
1735 (unsigned HOST_WIDE_INT
) *p
);
1739 *q
++ = (unsigned char) *p
;
1747 unquote_string (const char *s
)
1753 for (p
= s
, len
= 0; *p
; p
++, len
++)
1760 else if (p
[1] == 'U')
1761 p
+= 9; /* That is a "\U????????". */
1763 gfc_internal_error ("unquote_string(): got bad string");
1766 res
= gfc_get_wide_string (len
+ 1);
1767 for (i
= 0, p
= s
; i
< len
; i
++, p
++)
1772 res
[i
] = (unsigned char) *p
;
1773 else if (p
[1] == '\\')
1775 res
[i
] = (unsigned char) '\\';
1780 /* We read the 8-digits hexadecimal constant that follows. */
1785 gcc_assert (p
[1] == 'U');
1786 for (j
= 0; j
< 8; j
++)
1789 gcc_assert (sscanf (&p
[j
+2], "%01x", &n
) == 1);
1803 /* Read or write a character pointer that points to a wide string on the
1804 heap, performing quoting/unquoting of nonprintable characters using the
1805 form \U???????? (where each ? is a hexadecimal digit).
1806 Length is the length of the string, only known and used in output mode. */
1808 static const gfc_char_t
*
1809 mio_allocated_wide_string (const gfc_char_t
*s
, const size_t length
)
1811 if (iomode
== IO_OUTPUT
)
1813 char *quoted
= quote_string (s
, length
);
1814 write_atom (ATOM_STRING
, quoted
);
1820 gfc_char_t
*unquoted
;
1822 require_atom (ATOM_STRING
);
1823 unquoted
= unquote_string (atom_string
);
1830 /* Read or write a string that is in static memory. */
1833 mio_pool_string (const char **stringp
)
1835 /* TODO: one could write the string only once, and refer to it via a
1838 /* As a special case we have to deal with a NULL string. This
1839 happens for the 'module' member of 'gfc_symbol's that are not in a
1840 module. We read / write these as the empty string. */
1841 if (iomode
== IO_OUTPUT
)
1843 const char *p
= *stringp
== NULL
? "" : *stringp
;
1844 write_atom (ATOM_STRING
, p
);
1848 require_atom (ATOM_STRING
);
1849 *stringp
= atom_string
[0] == '\0' ? NULL
: gfc_get_string (atom_string
);
1855 /* Read or write a string that is inside of some already-allocated
1859 mio_internal_string (char *string
)
1861 if (iomode
== IO_OUTPUT
)
1862 write_atom (ATOM_STRING
, string
);
1865 require_atom (ATOM_STRING
);
1866 strcpy (string
, atom_string
);
1873 { AB_ALLOCATABLE
, AB_DIMENSION
, AB_EXTERNAL
, AB_INTRINSIC
, AB_OPTIONAL
,
1874 AB_POINTER
, AB_TARGET
, AB_DUMMY
, AB_RESULT
, AB_DATA
,
1875 AB_IN_NAMELIST
, AB_IN_COMMON
, AB_FUNCTION
, AB_SUBROUTINE
, AB_SEQUENCE
,
1876 AB_ELEMENTAL
, AB_PURE
, AB_RECURSIVE
, AB_GENERIC
, AB_ALWAYS_EXPLICIT
,
1877 AB_CRAY_POINTER
, AB_CRAY_POINTEE
, AB_THREADPRIVATE
,
1878 AB_ALLOC_COMP
, AB_POINTER_COMP
, AB_PROC_POINTER_COMP
, AB_PRIVATE_COMP
,
1879 AB_VALUE
, AB_VOLATILE
, AB_PROTECTED
, AB_LOCK_COMP
,
1880 AB_IS_BIND_C
, AB_IS_C_INTEROP
, AB_IS_ISO_C
, AB_ABSTRACT
, AB_ZERO_COMP
,
1881 AB_IS_CLASS
, AB_PROCEDURE
, AB_PROC_POINTER
, AB_ASYNCHRONOUS
, AB_CODIMENSION
,
1882 AB_COARRAY_COMP
, AB_VTYPE
, AB_VTAB
, AB_CONTIGUOUS
, AB_CLASS_POINTER
,
1883 AB_IMPLICIT_PURE
, AB_ARTIFICIAL
, AB_UNLIMITED_POLY
, AB_OMP_DECLARE_TARGET
1887 static const mstring attr_bits
[] =
1889 minit ("ALLOCATABLE", AB_ALLOCATABLE
),
1890 minit ("ARTIFICIAL", AB_ARTIFICIAL
),
1891 minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS
),
1892 minit ("DIMENSION", AB_DIMENSION
),
1893 minit ("CODIMENSION", AB_CODIMENSION
),
1894 minit ("CONTIGUOUS", AB_CONTIGUOUS
),
1895 minit ("EXTERNAL", AB_EXTERNAL
),
1896 minit ("INTRINSIC", AB_INTRINSIC
),
1897 minit ("OPTIONAL", AB_OPTIONAL
),
1898 minit ("POINTER", AB_POINTER
),
1899 minit ("VOLATILE", AB_VOLATILE
),
1900 minit ("TARGET", AB_TARGET
),
1901 minit ("THREADPRIVATE", AB_THREADPRIVATE
),
1902 minit ("DUMMY", AB_DUMMY
),
1903 minit ("RESULT", AB_RESULT
),
1904 minit ("DATA", AB_DATA
),
1905 minit ("IN_NAMELIST", AB_IN_NAMELIST
),
1906 minit ("IN_COMMON", AB_IN_COMMON
),
1907 minit ("FUNCTION", AB_FUNCTION
),
1908 minit ("SUBROUTINE", AB_SUBROUTINE
),
1909 minit ("SEQUENCE", AB_SEQUENCE
),
1910 minit ("ELEMENTAL", AB_ELEMENTAL
),
1911 minit ("PURE", AB_PURE
),
1912 minit ("RECURSIVE", AB_RECURSIVE
),
1913 minit ("GENERIC", AB_GENERIC
),
1914 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT
),
1915 minit ("CRAY_POINTER", AB_CRAY_POINTER
),
1916 minit ("CRAY_POINTEE", AB_CRAY_POINTEE
),
1917 minit ("IS_BIND_C", AB_IS_BIND_C
),
1918 minit ("IS_C_INTEROP", AB_IS_C_INTEROP
),
1919 minit ("IS_ISO_C", AB_IS_ISO_C
),
1920 minit ("VALUE", AB_VALUE
),
1921 minit ("ALLOC_COMP", AB_ALLOC_COMP
),
1922 minit ("COARRAY_COMP", AB_COARRAY_COMP
),
1923 minit ("LOCK_COMP", AB_LOCK_COMP
),
1924 minit ("POINTER_COMP", AB_POINTER_COMP
),
1925 minit ("PROC_POINTER_COMP", AB_PROC_POINTER_COMP
),
1926 minit ("PRIVATE_COMP", AB_PRIVATE_COMP
),
1927 minit ("ZERO_COMP", AB_ZERO_COMP
),
1928 minit ("PROTECTED", AB_PROTECTED
),
1929 minit ("ABSTRACT", AB_ABSTRACT
),
1930 minit ("IS_CLASS", AB_IS_CLASS
),
1931 minit ("PROCEDURE", AB_PROCEDURE
),
1932 minit ("PROC_POINTER", AB_PROC_POINTER
),
1933 minit ("VTYPE", AB_VTYPE
),
1934 minit ("VTAB", AB_VTAB
),
1935 minit ("CLASS_POINTER", AB_CLASS_POINTER
),
1936 minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE
),
1937 minit ("UNLIMITED_POLY", AB_UNLIMITED_POLY
),
1938 minit ("OMP_DECLARE_TARGET", AB_OMP_DECLARE_TARGET
),
1942 /* For binding attributes. */
1943 static const mstring binding_passing
[] =
1946 minit ("NOPASS", 1),
1949 static const mstring binding_overriding
[] =
1951 minit ("OVERRIDABLE", 0),
1952 minit ("NON_OVERRIDABLE", 1),
1953 minit ("DEFERRED", 2),
1956 static const mstring binding_generic
[] =
1958 minit ("SPECIFIC", 0),
1959 minit ("GENERIC", 1),
1962 static const mstring binding_ppc
[] =
1964 minit ("NO_PPC", 0),
1969 /* Specialization of mio_name. */
1970 DECL_MIO_NAME (ab_attribute
)
1971 DECL_MIO_NAME (ar_type
)
1972 DECL_MIO_NAME (array_type
)
1974 DECL_MIO_NAME (expr_t
)
1975 DECL_MIO_NAME (gfc_access
)
1976 DECL_MIO_NAME (gfc_intrinsic_op
)
1977 DECL_MIO_NAME (ifsrc
)
1978 DECL_MIO_NAME (save_state
)
1979 DECL_MIO_NAME (procedure_type
)
1980 DECL_MIO_NAME (ref_type
)
1981 DECL_MIO_NAME (sym_flavor
)
1982 DECL_MIO_NAME (sym_intent
)
1983 #undef DECL_MIO_NAME
1985 /* Symbol attributes are stored in list with the first three elements
1986 being the enumerated fields, while the remaining elements (if any)
1987 indicate the individual attribute bits. The access field is not
1988 saved-- it controls what symbols are exported when a module is
1992 mio_symbol_attribute (symbol_attribute
*attr
)
1995 unsigned ext_attr
,extension_level
;
1999 attr
->flavor
= MIO_NAME (sym_flavor
) (attr
->flavor
, flavors
);
2000 attr
->intent
= MIO_NAME (sym_intent
) (attr
->intent
, intents
);
2001 attr
->proc
= MIO_NAME (procedure_type
) (attr
->proc
, procedures
);
2002 attr
->if_source
= MIO_NAME (ifsrc
) (attr
->if_source
, ifsrc_types
);
2003 attr
->save
= MIO_NAME (save_state
) (attr
->save
, save_status
);
2005 ext_attr
= attr
->ext_attr
;
2006 mio_integer ((int *) &ext_attr
);
2007 attr
->ext_attr
= ext_attr
;
2009 extension_level
= attr
->extension
;
2010 mio_integer ((int *) &extension_level
);
2011 attr
->extension
= extension_level
;
2013 if (iomode
== IO_OUTPUT
)
2015 if (attr
->allocatable
)
2016 MIO_NAME (ab_attribute
) (AB_ALLOCATABLE
, attr_bits
);
2017 if (attr
->artificial
)
2018 MIO_NAME (ab_attribute
) (AB_ARTIFICIAL
, attr_bits
);
2019 if (attr
->asynchronous
)
2020 MIO_NAME (ab_attribute
) (AB_ASYNCHRONOUS
, attr_bits
);
2021 if (attr
->dimension
)
2022 MIO_NAME (ab_attribute
) (AB_DIMENSION
, attr_bits
);
2023 if (attr
->codimension
)
2024 MIO_NAME (ab_attribute
) (AB_CODIMENSION
, attr_bits
);
2025 if (attr
->contiguous
)
2026 MIO_NAME (ab_attribute
) (AB_CONTIGUOUS
, attr_bits
);
2028 MIO_NAME (ab_attribute
) (AB_EXTERNAL
, attr_bits
);
2029 if (attr
->intrinsic
)
2030 MIO_NAME (ab_attribute
) (AB_INTRINSIC
, attr_bits
);
2032 MIO_NAME (ab_attribute
) (AB_OPTIONAL
, attr_bits
);
2034 MIO_NAME (ab_attribute
) (AB_POINTER
, attr_bits
);
2035 if (attr
->class_pointer
)
2036 MIO_NAME (ab_attribute
) (AB_CLASS_POINTER
, attr_bits
);
2037 if (attr
->is_protected
)
2038 MIO_NAME (ab_attribute
) (AB_PROTECTED
, attr_bits
);
2040 MIO_NAME (ab_attribute
) (AB_VALUE
, attr_bits
);
2041 if (attr
->volatile_
)
2042 MIO_NAME (ab_attribute
) (AB_VOLATILE
, attr_bits
);
2044 MIO_NAME (ab_attribute
) (AB_TARGET
, attr_bits
);
2045 if (attr
->threadprivate
)
2046 MIO_NAME (ab_attribute
) (AB_THREADPRIVATE
, attr_bits
);
2048 MIO_NAME (ab_attribute
) (AB_DUMMY
, attr_bits
);
2050 MIO_NAME (ab_attribute
) (AB_RESULT
, attr_bits
);
2051 /* We deliberately don't preserve the "entry" flag. */
2054 MIO_NAME (ab_attribute
) (AB_DATA
, attr_bits
);
2055 if (attr
->in_namelist
)
2056 MIO_NAME (ab_attribute
) (AB_IN_NAMELIST
, attr_bits
);
2057 if (attr
->in_common
)
2058 MIO_NAME (ab_attribute
) (AB_IN_COMMON
, attr_bits
);
2061 MIO_NAME (ab_attribute
) (AB_FUNCTION
, attr_bits
);
2062 if (attr
->subroutine
)
2063 MIO_NAME (ab_attribute
) (AB_SUBROUTINE
, attr_bits
);
2065 MIO_NAME (ab_attribute
) (AB_GENERIC
, attr_bits
);
2067 MIO_NAME (ab_attribute
) (AB_ABSTRACT
, attr_bits
);
2070 MIO_NAME (ab_attribute
) (AB_SEQUENCE
, attr_bits
);
2071 if (attr
->elemental
)
2072 MIO_NAME (ab_attribute
) (AB_ELEMENTAL
, attr_bits
);
2074 MIO_NAME (ab_attribute
) (AB_PURE
, attr_bits
);
2075 if (attr
->implicit_pure
)
2076 MIO_NAME (ab_attribute
) (AB_IMPLICIT_PURE
, attr_bits
);
2077 if (attr
->unlimited_polymorphic
)
2078 MIO_NAME (ab_attribute
) (AB_UNLIMITED_POLY
, attr_bits
);
2079 if (attr
->recursive
)
2080 MIO_NAME (ab_attribute
) (AB_RECURSIVE
, attr_bits
);
2081 if (attr
->always_explicit
)
2082 MIO_NAME (ab_attribute
) (AB_ALWAYS_EXPLICIT
, attr_bits
);
2083 if (attr
->cray_pointer
)
2084 MIO_NAME (ab_attribute
) (AB_CRAY_POINTER
, attr_bits
);
2085 if (attr
->cray_pointee
)
2086 MIO_NAME (ab_attribute
) (AB_CRAY_POINTEE
, attr_bits
);
2087 if (attr
->is_bind_c
)
2088 MIO_NAME(ab_attribute
) (AB_IS_BIND_C
, attr_bits
);
2089 if (attr
->is_c_interop
)
2090 MIO_NAME(ab_attribute
) (AB_IS_C_INTEROP
, attr_bits
);
2092 MIO_NAME(ab_attribute
) (AB_IS_ISO_C
, attr_bits
);
2093 if (attr
->alloc_comp
)
2094 MIO_NAME (ab_attribute
) (AB_ALLOC_COMP
, attr_bits
);
2095 if (attr
->pointer_comp
)
2096 MIO_NAME (ab_attribute
) (AB_POINTER_COMP
, attr_bits
);
2097 if (attr
->proc_pointer_comp
)
2098 MIO_NAME (ab_attribute
) (AB_PROC_POINTER_COMP
, attr_bits
);
2099 if (attr
->private_comp
)
2100 MIO_NAME (ab_attribute
) (AB_PRIVATE_COMP
, attr_bits
);
2101 if (attr
->coarray_comp
)
2102 MIO_NAME (ab_attribute
) (AB_COARRAY_COMP
, attr_bits
);
2103 if (attr
->lock_comp
)
2104 MIO_NAME (ab_attribute
) (AB_LOCK_COMP
, attr_bits
);
2105 if (attr
->zero_comp
)
2106 MIO_NAME (ab_attribute
) (AB_ZERO_COMP
, attr_bits
);
2108 MIO_NAME (ab_attribute
) (AB_IS_CLASS
, attr_bits
);
2109 if (attr
->procedure
)
2110 MIO_NAME (ab_attribute
) (AB_PROCEDURE
, attr_bits
);
2111 if (attr
->proc_pointer
)
2112 MIO_NAME (ab_attribute
) (AB_PROC_POINTER
, attr_bits
);
2114 MIO_NAME (ab_attribute
) (AB_VTYPE
, attr_bits
);
2116 MIO_NAME (ab_attribute
) (AB_VTAB
, attr_bits
);
2117 if (attr
->omp_declare_target
)
2118 MIO_NAME (ab_attribute
) (AB_OMP_DECLARE_TARGET
, attr_bits
);
2128 if (t
== ATOM_RPAREN
)
2131 bad_module ("Expected attribute bit name");
2133 switch ((ab_attribute
) find_enum (attr_bits
))
2135 case AB_ALLOCATABLE
:
2136 attr
->allocatable
= 1;
2139 attr
->artificial
= 1;
2141 case AB_ASYNCHRONOUS
:
2142 attr
->asynchronous
= 1;
2145 attr
->dimension
= 1;
2147 case AB_CODIMENSION
:
2148 attr
->codimension
= 1;
2151 attr
->contiguous
= 1;
2157 attr
->intrinsic
= 1;
2165 case AB_CLASS_POINTER
:
2166 attr
->class_pointer
= 1;
2169 attr
->is_protected
= 1;
2175 attr
->volatile_
= 1;
2180 case AB_THREADPRIVATE
:
2181 attr
->threadprivate
= 1;
2192 case AB_IN_NAMELIST
:
2193 attr
->in_namelist
= 1;
2196 attr
->in_common
= 1;
2202 attr
->subroutine
= 1;
2214 attr
->elemental
= 1;
2219 case AB_IMPLICIT_PURE
:
2220 attr
->implicit_pure
= 1;
2222 case AB_UNLIMITED_POLY
:
2223 attr
->unlimited_polymorphic
= 1;
2226 attr
->recursive
= 1;
2228 case AB_ALWAYS_EXPLICIT
:
2229 attr
->always_explicit
= 1;
2231 case AB_CRAY_POINTER
:
2232 attr
->cray_pointer
= 1;
2234 case AB_CRAY_POINTEE
:
2235 attr
->cray_pointee
= 1;
2238 attr
->is_bind_c
= 1;
2240 case AB_IS_C_INTEROP
:
2241 attr
->is_c_interop
= 1;
2247 attr
->alloc_comp
= 1;
2249 case AB_COARRAY_COMP
:
2250 attr
->coarray_comp
= 1;
2253 attr
->lock_comp
= 1;
2255 case AB_POINTER_COMP
:
2256 attr
->pointer_comp
= 1;
2258 case AB_PROC_POINTER_COMP
:
2259 attr
->proc_pointer_comp
= 1;
2261 case AB_PRIVATE_COMP
:
2262 attr
->private_comp
= 1;
2265 attr
->zero_comp
= 1;
2271 attr
->procedure
= 1;
2273 case AB_PROC_POINTER
:
2274 attr
->proc_pointer
= 1;
2282 case AB_OMP_DECLARE_TARGET
:
2283 attr
->omp_declare_target
= 1;
2291 static const mstring bt_types
[] = {
2292 minit ("INTEGER", BT_INTEGER
),
2293 minit ("REAL", BT_REAL
),
2294 minit ("COMPLEX", BT_COMPLEX
),
2295 minit ("LOGICAL", BT_LOGICAL
),
2296 minit ("CHARACTER", BT_CHARACTER
),
2297 minit ("DERIVED", BT_DERIVED
),
2298 minit ("CLASS", BT_CLASS
),
2299 minit ("PROCEDURE", BT_PROCEDURE
),
2300 minit ("UNKNOWN", BT_UNKNOWN
),
2301 minit ("VOID", BT_VOID
),
2302 minit ("ASSUMED", BT_ASSUMED
),
2308 mio_charlen (gfc_charlen
**clp
)
2314 if (iomode
== IO_OUTPUT
)
2318 mio_expr (&cl
->length
);
2322 if (peek_atom () != ATOM_RPAREN
)
2324 cl
= gfc_new_charlen (gfc_current_ns
, NULL
);
2325 mio_expr (&cl
->length
);
2334 /* See if a name is a generated name. */
2337 check_unique_name (const char *name
)
2339 return *name
== '@';
2344 mio_typespec (gfc_typespec
*ts
)
2348 ts
->type
= MIO_NAME (bt
) (ts
->type
, bt_types
);
2350 if (ts
->type
!= BT_DERIVED
&& ts
->type
!= BT_CLASS
)
2351 mio_integer (&ts
->kind
);
2353 mio_symbol_ref (&ts
->u
.derived
);
2355 mio_symbol_ref (&ts
->interface
);
2357 /* Add info for C interop and is_iso_c. */
2358 mio_integer (&ts
->is_c_interop
);
2359 mio_integer (&ts
->is_iso_c
);
2361 /* If the typespec is for an identifier either from iso_c_binding, or
2362 a constant that was initialized to an identifier from it, use the
2363 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2365 ts
->f90_type
= MIO_NAME (bt
) (ts
->f90_type
, bt_types
);
2367 ts
->f90_type
= MIO_NAME (bt
) (ts
->type
, bt_types
);
2369 if (ts
->type
!= BT_CHARACTER
)
2371 /* ts->u.cl is only valid for BT_CHARACTER. */
2376 mio_charlen (&ts
->u
.cl
);
2378 /* So as not to disturb the existing API, use an ATOM_NAME to
2379 transmit deferred characteristic for characters (F2003). */
2380 if (iomode
== IO_OUTPUT
)
2382 if (ts
->type
== BT_CHARACTER
&& ts
->deferred
)
2383 write_atom (ATOM_NAME
, "DEFERRED_CL");
2385 else if (peek_atom () != ATOM_RPAREN
)
2387 if (parse_atom () != ATOM_NAME
)
2388 bad_module ("Expected string");
2396 static const mstring array_spec_types
[] = {
2397 minit ("EXPLICIT", AS_EXPLICIT
),
2398 minit ("ASSUMED_RANK", AS_ASSUMED_RANK
),
2399 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE
),
2400 minit ("DEFERRED", AS_DEFERRED
),
2401 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE
),
2407 mio_array_spec (gfc_array_spec
**asp
)
2414 if (iomode
== IO_OUTPUT
)
2422 /* mio_integer expects nonnegative values. */
2423 rank
= as
->rank
> 0 ? as
->rank
: 0;
2424 mio_integer (&rank
);
2428 if (peek_atom () == ATOM_RPAREN
)
2434 *asp
= as
= gfc_get_array_spec ();
2435 mio_integer (&as
->rank
);
2438 mio_integer (&as
->corank
);
2439 as
->type
= MIO_NAME (array_type
) (as
->type
, array_spec_types
);
2441 if (iomode
== IO_INPUT
&& as
->type
== AS_ASSUMED_RANK
)
2443 if (iomode
== IO_INPUT
&& as
->corank
)
2444 as
->cotype
= (as
->type
== AS_DEFERRED
) ? AS_DEFERRED
: AS_EXPLICIT
;
2446 if (as
->rank
+ as
->corank
> 0)
2447 for (i
= 0; i
< as
->rank
+ as
->corank
; i
++)
2449 mio_expr (&as
->lower
[i
]);
2450 mio_expr (&as
->upper
[i
]);
2458 /* Given a pointer to an array reference structure (which lives in a
2459 gfc_ref structure), find the corresponding array specification
2460 structure. Storing the pointer in the ref structure doesn't quite
2461 work when loading from a module. Generating code for an array
2462 reference also needs more information than just the array spec. */
2464 static const mstring array_ref_types
[] = {
2465 minit ("FULL", AR_FULL
),
2466 minit ("ELEMENT", AR_ELEMENT
),
2467 minit ("SECTION", AR_SECTION
),
2473 mio_array_ref (gfc_array_ref
*ar
)
2478 ar
->type
= MIO_NAME (ar_type
) (ar
->type
, array_ref_types
);
2479 mio_integer (&ar
->dimen
);
2487 for (i
= 0; i
< ar
->dimen
; i
++)
2488 mio_expr (&ar
->start
[i
]);
2493 for (i
= 0; i
< ar
->dimen
; i
++)
2495 mio_expr (&ar
->start
[i
]);
2496 mio_expr (&ar
->end
[i
]);
2497 mio_expr (&ar
->stride
[i
]);
2503 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2506 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2507 we can't call mio_integer directly. Instead loop over each element
2508 and cast it to/from an integer. */
2509 if (iomode
== IO_OUTPUT
)
2511 for (i
= 0; i
< ar
->dimen
; i
++)
2513 int tmp
= (int)ar
->dimen_type
[i
];
2514 write_atom (ATOM_INTEGER
, &tmp
);
2519 for (i
= 0; i
< ar
->dimen
; i
++)
2521 require_atom (ATOM_INTEGER
);
2522 ar
->dimen_type
[i
] = (enum gfc_array_ref_dimen_type
) atom_int
;
2526 if (iomode
== IO_INPUT
)
2528 ar
->where
= gfc_current_locus
;
2530 for (i
= 0; i
< ar
->dimen
; i
++)
2531 ar
->c_where
[i
] = gfc_current_locus
;
2538 /* Saves or restores a pointer. The pointer is converted back and
2539 forth from an integer. We return the pointer_info pointer so that
2540 the caller can take additional action based on the pointer type. */
2542 static pointer_info
*
2543 mio_pointer_ref (void *gp
)
2547 if (iomode
== IO_OUTPUT
)
2549 p
= get_pointer (*((char **) gp
));
2550 write_atom (ATOM_INTEGER
, &p
->integer
);
2554 require_atom (ATOM_INTEGER
);
2555 p
= add_fixup (atom_int
, gp
);
2562 /* Save and load references to components that occur within
2563 expressions. We have to describe these references by a number and
2564 by name. The number is necessary for forward references during
2565 reading, and the name is necessary if the symbol already exists in
2566 the namespace and is not loaded again. */
2569 mio_component_ref (gfc_component
**cp
)
2573 p
= mio_pointer_ref (cp
);
2574 if (p
->type
== P_UNKNOWN
)
2575 p
->type
= P_COMPONENT
;
2579 static void mio_namespace_ref (gfc_namespace
**nsp
);
2580 static void mio_formal_arglist (gfc_formal_arglist
**formal
);
2581 static void mio_typebound_proc (gfc_typebound_proc
** proc
);
2584 mio_component (gfc_component
*c
, int vtype
)
2591 if (iomode
== IO_OUTPUT
)
2593 p
= get_pointer (c
);
2594 mio_integer (&p
->integer
);
2599 p
= get_integer (n
);
2600 associate_integer_pointer (p
, c
);
2603 if (p
->type
== P_UNKNOWN
)
2604 p
->type
= P_COMPONENT
;
2606 mio_pool_string (&c
->name
);
2607 mio_typespec (&c
->ts
);
2608 mio_array_spec (&c
->as
);
2610 mio_symbol_attribute (&c
->attr
);
2611 if (c
->ts
.type
== BT_CLASS
)
2612 c
->attr
.class_ok
= 1;
2613 c
->attr
.access
= MIO_NAME (gfc_access
) (c
->attr
.access
, access_types
);
2615 if (!vtype
|| strcmp (c
->name
, "_final") == 0
2616 || strcmp (c
->name
, "_hash") == 0)
2617 mio_expr (&c
->initializer
);
2619 if (c
->attr
.proc_pointer
)
2620 mio_typebound_proc (&c
->tb
);
2627 mio_component_list (gfc_component
**cp
, int vtype
)
2629 gfc_component
*c
, *tail
;
2633 if (iomode
== IO_OUTPUT
)
2635 for (c
= *cp
; c
; c
= c
->next
)
2636 mio_component (c
, vtype
);
2645 if (peek_atom () == ATOM_RPAREN
)
2648 c
= gfc_get_component ();
2649 mio_component (c
, vtype
);
2665 mio_actual_arg (gfc_actual_arglist
*a
)
2668 mio_pool_string (&a
->name
);
2669 mio_expr (&a
->expr
);
2675 mio_actual_arglist (gfc_actual_arglist
**ap
)
2677 gfc_actual_arglist
*a
, *tail
;
2681 if (iomode
== IO_OUTPUT
)
2683 for (a
= *ap
; a
; a
= a
->next
)
2693 if (peek_atom () != ATOM_LPAREN
)
2696 a
= gfc_get_actual_arglist ();
2712 /* Read and write formal argument lists. */
2715 mio_formal_arglist (gfc_formal_arglist
**formal
)
2717 gfc_formal_arglist
*f
, *tail
;
2721 if (iomode
== IO_OUTPUT
)
2723 for (f
= *formal
; f
; f
= f
->next
)
2724 mio_symbol_ref (&f
->sym
);
2728 *formal
= tail
= NULL
;
2730 while (peek_atom () != ATOM_RPAREN
)
2732 f
= gfc_get_formal_arglist ();
2733 mio_symbol_ref (&f
->sym
);
2735 if (*formal
== NULL
)
2748 /* Save or restore a reference to a symbol node. */
2751 mio_symbol_ref (gfc_symbol
**symp
)
2755 p
= mio_pointer_ref (symp
);
2756 if (p
->type
== P_UNKNOWN
)
2759 if (iomode
== IO_OUTPUT
)
2761 if (p
->u
.wsym
.state
== UNREFERENCED
)
2762 p
->u
.wsym
.state
= NEEDS_WRITE
;
2766 if (p
->u
.rsym
.state
== UNUSED
)
2767 p
->u
.rsym
.state
= NEEDED
;
2773 /* Save or restore a reference to a symtree node. */
2776 mio_symtree_ref (gfc_symtree
**stp
)
2781 if (iomode
== IO_OUTPUT
)
2782 mio_symbol_ref (&(*stp
)->n
.sym
);
2785 require_atom (ATOM_INTEGER
);
2786 p
= get_integer (atom_int
);
2788 /* An unused equivalence member; make a symbol and a symtree
2790 if (in_load_equiv
&& p
->u
.rsym
.symtree
== NULL
)
2792 /* Since this is not used, it must have a unique name. */
2793 p
->u
.rsym
.symtree
= gfc_get_unique_symtree (gfc_current_ns
);
2795 /* Make the symbol. */
2796 if (p
->u
.rsym
.sym
== NULL
)
2798 p
->u
.rsym
.sym
= gfc_new_symbol (p
->u
.rsym
.true_name
,
2800 p
->u
.rsym
.sym
->module
= gfc_get_string (p
->u
.rsym
.module
);
2803 p
->u
.rsym
.symtree
->n
.sym
= p
->u
.rsym
.sym
;
2804 p
->u
.rsym
.symtree
->n
.sym
->refs
++;
2805 p
->u
.rsym
.referenced
= 1;
2807 /* If the symbol is PRIVATE and in COMMON, load_commons will
2808 generate a fixup symbol, which must be associated. */
2810 resolve_fixups (p
->fixup
, p
->u
.rsym
.sym
);
2814 if (p
->type
== P_UNKNOWN
)
2817 if (p
->u
.rsym
.state
== UNUSED
)
2818 p
->u
.rsym
.state
= NEEDED
;
2820 if (p
->u
.rsym
.symtree
!= NULL
)
2822 *stp
= p
->u
.rsym
.symtree
;
2826 f
= XCNEW (fixup_t
);
2828 f
->next
= p
->u
.rsym
.stfixup
;
2829 p
->u
.rsym
.stfixup
= f
;
2831 f
->pointer
= (void **) stp
;
2838 mio_iterator (gfc_iterator
**ip
)
2844 if (iomode
== IO_OUTPUT
)
2851 if (peek_atom () == ATOM_RPAREN
)
2857 *ip
= gfc_get_iterator ();
2862 mio_expr (&iter
->var
);
2863 mio_expr (&iter
->start
);
2864 mio_expr (&iter
->end
);
2865 mio_expr (&iter
->step
);
2873 mio_constructor (gfc_constructor_base
*cp
)
2879 if (iomode
== IO_OUTPUT
)
2881 for (c
= gfc_constructor_first (*cp
); c
; c
= gfc_constructor_next (c
))
2884 mio_expr (&c
->expr
);
2885 mio_iterator (&c
->iterator
);
2891 while (peek_atom () != ATOM_RPAREN
)
2893 c
= gfc_constructor_append_expr (cp
, NULL
, NULL
);
2896 mio_expr (&c
->expr
);
2897 mio_iterator (&c
->iterator
);
2906 static const mstring ref_types
[] = {
2907 minit ("ARRAY", REF_ARRAY
),
2908 minit ("COMPONENT", REF_COMPONENT
),
2909 minit ("SUBSTRING", REF_SUBSTRING
),
2915 mio_ref (gfc_ref
**rp
)
2922 r
->type
= MIO_NAME (ref_type
) (r
->type
, ref_types
);
2927 mio_array_ref (&r
->u
.ar
);
2931 mio_symbol_ref (&r
->u
.c
.sym
);
2932 mio_component_ref (&r
->u
.c
.component
);
2936 mio_expr (&r
->u
.ss
.start
);
2937 mio_expr (&r
->u
.ss
.end
);
2938 mio_charlen (&r
->u
.ss
.length
);
2947 mio_ref_list (gfc_ref
**rp
)
2949 gfc_ref
*ref
, *head
, *tail
;
2953 if (iomode
== IO_OUTPUT
)
2955 for (ref
= *rp
; ref
; ref
= ref
->next
)
2962 while (peek_atom () != ATOM_RPAREN
)
2965 head
= tail
= gfc_get_ref ();
2968 tail
->next
= gfc_get_ref ();
2982 /* Read and write an integer value. */
2985 mio_gmp_integer (mpz_t
*integer
)
2989 if (iomode
== IO_INPUT
)
2991 if (parse_atom () != ATOM_STRING
)
2992 bad_module ("Expected integer string");
2994 mpz_init (*integer
);
2995 if (mpz_set_str (*integer
, atom_string
, 10))
2996 bad_module ("Error converting integer");
3002 p
= mpz_get_str (NULL
, 10, *integer
);
3003 write_atom (ATOM_STRING
, p
);
3010 mio_gmp_real (mpfr_t
*real
)
3015 if (iomode
== IO_INPUT
)
3017 if (parse_atom () != ATOM_STRING
)
3018 bad_module ("Expected real string");
3021 mpfr_set_str (*real
, atom_string
, 16, GFC_RND_MODE
);
3026 p
= mpfr_get_str (NULL
, &exponent
, 16, 0, *real
, GFC_RND_MODE
);
3028 if (mpfr_nan_p (*real
) || mpfr_inf_p (*real
))
3030 write_atom (ATOM_STRING
, p
);
3035 atom_string
= XCNEWVEC (char, strlen (p
) + 20);
3037 sprintf (atom_string
, "0.%s@%ld", p
, exponent
);
3039 /* Fix negative numbers. */
3040 if (atom_string
[2] == '-')
3042 atom_string
[0] = '-';
3043 atom_string
[1] = '0';
3044 atom_string
[2] = '.';
3047 write_atom (ATOM_STRING
, atom_string
);
3055 /* Save and restore the shape of an array constructor. */
3058 mio_shape (mpz_t
**pshape
, int rank
)
3064 /* A NULL shape is represented by (). */
3067 if (iomode
== IO_OUTPUT
)
3079 if (t
== ATOM_RPAREN
)
3086 shape
= gfc_get_shape (rank
);
3090 for (n
= 0; n
< rank
; n
++)
3091 mio_gmp_integer (&shape
[n
]);
3097 static const mstring expr_types
[] = {
3098 minit ("OP", EXPR_OP
),
3099 minit ("FUNCTION", EXPR_FUNCTION
),
3100 minit ("CONSTANT", EXPR_CONSTANT
),
3101 minit ("VARIABLE", EXPR_VARIABLE
),
3102 minit ("SUBSTRING", EXPR_SUBSTRING
),
3103 minit ("STRUCTURE", EXPR_STRUCTURE
),
3104 minit ("ARRAY", EXPR_ARRAY
),
3105 minit ("NULL", EXPR_NULL
),
3106 minit ("COMPCALL", EXPR_COMPCALL
),
3110 /* INTRINSIC_ASSIGN is missing because it is used as an index for
3111 generic operators, not in expressions. INTRINSIC_USER is also
3112 replaced by the correct function name by the time we see it. */
3114 static const mstring intrinsics
[] =
3116 minit ("UPLUS", INTRINSIC_UPLUS
),
3117 minit ("UMINUS", INTRINSIC_UMINUS
),
3118 minit ("PLUS", INTRINSIC_PLUS
),
3119 minit ("MINUS", INTRINSIC_MINUS
),
3120 minit ("TIMES", INTRINSIC_TIMES
),
3121 minit ("DIVIDE", INTRINSIC_DIVIDE
),
3122 minit ("POWER", INTRINSIC_POWER
),
3123 minit ("CONCAT", INTRINSIC_CONCAT
),
3124 minit ("AND", INTRINSIC_AND
),
3125 minit ("OR", INTRINSIC_OR
),
3126 minit ("EQV", INTRINSIC_EQV
),
3127 minit ("NEQV", INTRINSIC_NEQV
),
3128 minit ("EQ_SIGN", INTRINSIC_EQ
),
3129 minit ("EQ", INTRINSIC_EQ_OS
),
3130 minit ("NE_SIGN", INTRINSIC_NE
),
3131 minit ("NE", INTRINSIC_NE_OS
),
3132 minit ("GT_SIGN", INTRINSIC_GT
),
3133 minit ("GT", INTRINSIC_GT_OS
),
3134 minit ("GE_SIGN", INTRINSIC_GE
),
3135 minit ("GE", INTRINSIC_GE_OS
),
3136 minit ("LT_SIGN", INTRINSIC_LT
),
3137 minit ("LT", INTRINSIC_LT_OS
),
3138 minit ("LE_SIGN", INTRINSIC_LE
),
3139 minit ("LE", INTRINSIC_LE_OS
),
3140 minit ("NOT", INTRINSIC_NOT
),
3141 minit ("PARENTHESES", INTRINSIC_PARENTHESES
),
3142 minit ("USER", INTRINSIC_USER
),
3147 /* Remedy a couple of situations where the gfc_expr's can be defective. */
3150 fix_mio_expr (gfc_expr
*e
)
3152 gfc_symtree
*ns_st
= NULL
;
3155 if (iomode
!= IO_OUTPUT
)
3160 /* If this is a symtree for a symbol that came from a contained module
3161 namespace, it has a unique name and we should look in the current
3162 namespace to see if the required, non-contained symbol is available
3163 yet. If so, the latter should be written. */
3164 if (e
->symtree
->n
.sym
&& check_unique_name (e
->symtree
->name
))
3166 const char *name
= e
->symtree
->n
.sym
->name
;
3167 if (e
->symtree
->n
.sym
->attr
.flavor
== FL_DERIVED
)
3168 name
= dt_upper_string (name
);
3169 ns_st
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
3172 /* On the other hand, if the existing symbol is the module name or the
3173 new symbol is a dummy argument, do not do the promotion. */
3174 if (ns_st
&& ns_st
->n
.sym
3175 && ns_st
->n
.sym
->attr
.flavor
!= FL_MODULE
3176 && !e
->symtree
->n
.sym
->attr
.dummy
)
3179 else if (e
->expr_type
== EXPR_FUNCTION
3180 && (e
->value
.function
.name
|| e
->value
.function
.isym
))
3184 /* In some circumstances, a function used in an initialization
3185 expression, in one use associated module, can fail to be
3186 coupled to its symtree when used in a specification
3187 expression in another module. */
3188 fname
= e
->value
.function
.esym
? e
->value
.function
.esym
->name
3189 : e
->value
.function
.isym
->name
;
3190 e
->symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, fname
);
3195 /* This is probably a reference to a private procedure from another
3196 module. To prevent a segfault, make a generic with no specific
3197 instances. If this module is used, without the required
3198 specific coming from somewhere, the appropriate error message
3200 gfc_get_symbol (fname
, gfc_current_ns
, &sym
);
3201 sym
->attr
.flavor
= FL_PROCEDURE
;
3202 sym
->attr
.generic
= 1;
3203 e
->symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, fname
);
3204 gfc_commit_symbol (sym
);
3209 /* Read and write expressions. The form "()" is allowed to indicate a
3213 mio_expr (gfc_expr
**ep
)
3221 if (iomode
== IO_OUTPUT
)
3230 MIO_NAME (expr_t
) (e
->expr_type
, expr_types
);
3235 if (t
== ATOM_RPAREN
)
3242 bad_module ("Expected expression type");
3244 e
= *ep
= gfc_get_expr ();
3245 e
->where
= gfc_current_locus
;
3246 e
->expr_type
= (expr_t
) find_enum (expr_types
);
3249 mio_typespec (&e
->ts
);
3250 mio_integer (&e
->rank
);
3254 switch (e
->expr_type
)
3258 = MIO_NAME (gfc_intrinsic_op
) (e
->value
.op
.op
, intrinsics
);
3260 switch (e
->value
.op
.op
)
3262 case INTRINSIC_UPLUS
:
3263 case INTRINSIC_UMINUS
:
3265 case INTRINSIC_PARENTHESES
:
3266 mio_expr (&e
->value
.op
.op1
);
3269 case INTRINSIC_PLUS
:
3270 case INTRINSIC_MINUS
:
3271 case INTRINSIC_TIMES
:
3272 case INTRINSIC_DIVIDE
:
3273 case INTRINSIC_POWER
:
3274 case INTRINSIC_CONCAT
:
3278 case INTRINSIC_NEQV
:
3280 case INTRINSIC_EQ_OS
:
3282 case INTRINSIC_NE_OS
:
3284 case INTRINSIC_GT_OS
:
3286 case INTRINSIC_GE_OS
:
3288 case INTRINSIC_LT_OS
:
3290 case INTRINSIC_LE_OS
:
3291 mio_expr (&e
->value
.op
.op1
);
3292 mio_expr (&e
->value
.op
.op2
);
3295 case INTRINSIC_USER
:
3296 /* INTRINSIC_USER should not appear in resolved expressions,
3297 though for UDRs we need to stream unresolved ones. */
3298 if (iomode
== IO_OUTPUT
)
3299 write_atom (ATOM_STRING
, e
->value
.op
.uop
->name
);
3302 char *name
= read_string ();
3303 const char *uop_name
= find_use_name (name
, true);
3304 if (uop_name
== NULL
)
3306 size_t len
= strlen (name
);
3307 char *name2
= XCNEWVEC (char, len
+ 2);
3308 memcpy (name2
, name
, len
);
3310 name2
[len
+ 1] = '\0';
3312 uop_name
= name
= name2
;
3314 e
->value
.op
.uop
= gfc_get_uop (uop_name
);
3317 mio_expr (&e
->value
.op
.op1
);
3318 mio_expr (&e
->value
.op
.op2
);
3322 bad_module ("Bad operator");
3328 mio_symtree_ref (&e
->symtree
);
3329 mio_actual_arglist (&e
->value
.function
.actual
);
3331 if (iomode
== IO_OUTPUT
)
3333 e
->value
.function
.name
3334 = mio_allocated_string (e
->value
.function
.name
);
3335 if (e
->value
.function
.esym
)
3339 else if (e
->value
.function
.isym
== NULL
)
3343 mio_integer (&flag
);
3347 mio_symbol_ref (&e
->value
.function
.esym
);
3350 mio_ref_list (&e
->ref
);
3355 write_atom (ATOM_STRING
, e
->value
.function
.isym
->name
);
3360 require_atom (ATOM_STRING
);
3361 if (atom_string
[0] == '\0')
3362 e
->value
.function
.name
= NULL
;
3364 e
->value
.function
.name
= gfc_get_string (atom_string
);
3367 mio_integer (&flag
);
3371 mio_symbol_ref (&e
->value
.function
.esym
);
3374 mio_ref_list (&e
->ref
);
3379 require_atom (ATOM_STRING
);
3380 e
->value
.function
.isym
= gfc_find_function (atom_string
);
3388 mio_symtree_ref (&e
->symtree
);
3389 mio_ref_list (&e
->ref
);
3392 case EXPR_SUBSTRING
:
3393 e
->value
.character
.string
3394 = CONST_CAST (gfc_char_t
*,
3395 mio_allocated_wide_string (e
->value
.character
.string
,
3396 e
->value
.character
.length
));
3397 mio_ref_list (&e
->ref
);
3400 case EXPR_STRUCTURE
:
3402 mio_constructor (&e
->value
.constructor
);
3403 mio_shape (&e
->shape
, e
->rank
);
3410 mio_gmp_integer (&e
->value
.integer
);
3414 gfc_set_model_kind (e
->ts
.kind
);
3415 mio_gmp_real (&e
->value
.real
);
3419 gfc_set_model_kind (e
->ts
.kind
);
3420 mio_gmp_real (&mpc_realref (e
->value
.complex));
3421 mio_gmp_real (&mpc_imagref (e
->value
.complex));
3425 mio_integer (&e
->value
.logical
);
3429 mio_integer (&e
->value
.character
.length
);
3430 e
->value
.character
.string
3431 = CONST_CAST (gfc_char_t
*,
3432 mio_allocated_wide_string (e
->value
.character
.string
,
3433 e
->value
.character
.length
));
3437 bad_module ("Bad type in constant expression");
3455 /* Read and write namelists. */
3458 mio_namelist (gfc_symbol
*sym
)
3460 gfc_namelist
*n
, *m
;
3461 const char *check_name
;
3465 if (iomode
== IO_OUTPUT
)
3467 for (n
= sym
->namelist
; n
; n
= n
->next
)
3468 mio_symbol_ref (&n
->sym
);
3472 /* This departure from the standard is flagged as an error.
3473 It does, in fact, work correctly. TODO: Allow it
3475 if (sym
->attr
.flavor
== FL_NAMELIST
)
3477 check_name
= find_use_name (sym
->name
, false);
3478 if (check_name
&& strcmp (check_name
, sym
->name
) != 0)
3479 gfc_error ("Namelist %s cannot be renamed by USE "
3480 "association to %s", sym
->name
, check_name
);
3484 while (peek_atom () != ATOM_RPAREN
)
3486 n
= gfc_get_namelist ();
3487 mio_symbol_ref (&n
->sym
);
3489 if (sym
->namelist
== NULL
)
3496 sym
->namelist_tail
= m
;
3503 /* Save/restore lists of gfc_interface structures. When loading an
3504 interface, we are really appending to the existing list of
3505 interfaces. Checking for duplicate and ambiguous interfaces has to
3506 be done later when all symbols have been loaded. */
3509 mio_interface_rest (gfc_interface
**ip
)
3511 gfc_interface
*tail
, *p
;
3512 pointer_info
*pi
= NULL
;
3514 if (iomode
== IO_OUTPUT
)
3517 for (p
= *ip
; p
; p
= p
->next
)
3518 mio_symbol_ref (&p
->sym
);
3533 if (peek_atom () == ATOM_RPAREN
)
3536 p
= gfc_get_interface ();
3537 p
->where
= gfc_current_locus
;
3538 pi
= mio_symbol_ref (&p
->sym
);
3554 /* Save/restore a nameless operator interface. */
3557 mio_interface (gfc_interface
**ip
)
3560 mio_interface_rest (ip
);
3564 /* Save/restore a named operator interface. */
3567 mio_symbol_interface (const char **name
, const char **module
,
3571 mio_pool_string (name
);
3572 mio_pool_string (module
);
3573 mio_interface_rest (ip
);
3578 mio_namespace_ref (gfc_namespace
**nsp
)
3583 p
= mio_pointer_ref (nsp
);
3585 if (p
->type
== P_UNKNOWN
)
3586 p
->type
= P_NAMESPACE
;
3588 if (iomode
== IO_INPUT
&& p
->integer
!= 0)
3590 ns
= (gfc_namespace
*) p
->u
.pointer
;
3593 ns
= gfc_get_namespace (NULL
, 0);
3594 associate_integer_pointer (p
, ns
);
3602 /* Save/restore the f2k_derived namespace of a derived-type symbol. */
3604 static gfc_namespace
* current_f2k_derived
;
3607 mio_typebound_proc (gfc_typebound_proc
** proc
)
3610 int overriding_flag
;
3612 if (iomode
== IO_INPUT
)
3614 *proc
= gfc_get_typebound_proc (NULL
);
3615 (*proc
)->where
= gfc_current_locus
;
3621 (*proc
)->access
= MIO_NAME (gfc_access
) ((*proc
)->access
, access_types
);
3623 /* IO the NON_OVERRIDABLE/DEFERRED combination. */
3624 gcc_assert (!((*proc
)->deferred
&& (*proc
)->non_overridable
));
3625 overriding_flag
= ((*proc
)->deferred
<< 1) | (*proc
)->non_overridable
;
3626 overriding_flag
= mio_name (overriding_flag
, binding_overriding
);
3627 (*proc
)->deferred
= ((overriding_flag
& 2) != 0);
3628 (*proc
)->non_overridable
= ((overriding_flag
& 1) != 0);
3629 gcc_assert (!((*proc
)->deferred
&& (*proc
)->non_overridable
));
3631 (*proc
)->nopass
= mio_name ((*proc
)->nopass
, binding_passing
);
3632 (*proc
)->is_generic
= mio_name ((*proc
)->is_generic
, binding_generic
);
3633 (*proc
)->ppc
= mio_name((*proc
)->ppc
, binding_ppc
);
3635 mio_pool_string (&((*proc
)->pass_arg
));
3637 flag
= (int) (*proc
)->pass_arg_num
;
3638 mio_integer (&flag
);
3639 (*proc
)->pass_arg_num
= (unsigned) flag
;
3641 if ((*proc
)->is_generic
)
3648 if (iomode
== IO_OUTPUT
)
3649 for (g
= (*proc
)->u
.generic
; g
; g
= g
->next
)
3651 iop
= (int) g
->is_operator
;
3653 mio_allocated_string (g
->specific_st
->name
);
3657 (*proc
)->u
.generic
= NULL
;
3658 while (peek_atom () != ATOM_RPAREN
)
3660 gfc_symtree
** sym_root
;
3662 g
= gfc_get_tbp_generic ();
3666 g
->is_operator
= (bool) iop
;
3668 require_atom (ATOM_STRING
);
3669 sym_root
= ¤t_f2k_derived
->tb_sym_root
;
3670 g
->specific_st
= gfc_get_tbp_symtree (sym_root
, atom_string
);
3673 g
->next
= (*proc
)->u
.generic
;
3674 (*proc
)->u
.generic
= g
;
3680 else if (!(*proc
)->ppc
)
3681 mio_symtree_ref (&(*proc
)->u
.specific
);
3686 /* Walker-callback function for this purpose. */
3688 mio_typebound_symtree (gfc_symtree
* st
)
3690 if (iomode
== IO_OUTPUT
&& !st
->n
.tb
)
3693 if (iomode
== IO_OUTPUT
)
3696 mio_allocated_string (st
->name
);
3698 /* For IO_INPUT, the above is done in mio_f2k_derived. */
3700 mio_typebound_proc (&st
->n
.tb
);
3704 /* IO a full symtree (in all depth). */
3706 mio_full_typebound_tree (gfc_symtree
** root
)
3710 if (iomode
== IO_OUTPUT
)
3711 gfc_traverse_symtree (*root
, &mio_typebound_symtree
);
3714 while (peek_atom () == ATOM_LPAREN
)
3720 require_atom (ATOM_STRING
);
3721 st
= gfc_get_tbp_symtree (root
, atom_string
);
3724 mio_typebound_symtree (st
);
3732 mio_finalizer (gfc_finalizer
**f
)
3734 if (iomode
== IO_OUTPUT
)
3737 gcc_assert ((*f
)->proc_tree
); /* Should already be resolved. */
3738 mio_symtree_ref (&(*f
)->proc_tree
);
3742 *f
= gfc_get_finalizer ();
3743 (*f
)->where
= gfc_current_locus
; /* Value should not matter. */
3746 mio_symtree_ref (&(*f
)->proc_tree
);
3747 (*f
)->proc_sym
= NULL
;
3752 mio_f2k_derived (gfc_namespace
*f2k
)
3754 current_f2k_derived
= f2k
;
3756 /* Handle the list of finalizer procedures. */
3758 if (iomode
== IO_OUTPUT
)
3761 for (f
= f2k
->finalizers
; f
; f
= f
->next
)
3766 f2k
->finalizers
= NULL
;
3767 while (peek_atom () != ATOM_RPAREN
)
3769 gfc_finalizer
*cur
= NULL
;
3770 mio_finalizer (&cur
);
3771 cur
->next
= f2k
->finalizers
;
3772 f2k
->finalizers
= cur
;
3777 /* Handle type-bound procedures. */
3778 mio_full_typebound_tree (&f2k
->tb_sym_root
);
3780 /* Type-bound user operators. */
3781 mio_full_typebound_tree (&f2k
->tb_uop_root
);
3783 /* Type-bound intrinsic operators. */
3785 if (iomode
== IO_OUTPUT
)
3788 for (op
= GFC_INTRINSIC_BEGIN
; op
!= GFC_INTRINSIC_END
; ++op
)
3790 gfc_intrinsic_op realop
;
3792 if (op
== INTRINSIC_USER
|| !f2k
->tb_op
[op
])
3796 realop
= (gfc_intrinsic_op
) op
;
3797 mio_intrinsic_op (&realop
);
3798 mio_typebound_proc (&f2k
->tb_op
[op
]);
3803 while (peek_atom () != ATOM_RPAREN
)
3805 gfc_intrinsic_op op
= GFC_INTRINSIC_BEGIN
; /* Silence GCC. */
3808 mio_intrinsic_op (&op
);
3809 mio_typebound_proc (&f2k
->tb_op
[op
]);
3816 mio_full_f2k_derived (gfc_symbol
*sym
)
3820 if (iomode
== IO_OUTPUT
)
3822 if (sym
->f2k_derived
)
3823 mio_f2k_derived (sym
->f2k_derived
);
3827 if (peek_atom () != ATOM_RPAREN
)
3829 sym
->f2k_derived
= gfc_get_namespace (NULL
, 0);
3830 mio_f2k_derived (sym
->f2k_derived
);
3833 gcc_assert (!sym
->f2k_derived
);
3839 static const mstring omp_declare_simd_clauses
[] =
3841 minit ("INBRANCH", 0),
3842 minit ("NOTINBRANCH", 1),
3843 minit ("SIMDLEN", 2),
3844 minit ("UNIFORM", 3),
3845 minit ("LINEAR", 4),
3846 minit ("ALIGNED", 5),
3850 /* Handle !$omp declare simd. */
3853 mio_omp_declare_simd (gfc_namespace
*ns
, gfc_omp_declare_simd
**odsp
)
3855 if (iomode
== IO_OUTPUT
)
3860 else if (peek_atom () != ATOM_LPAREN
)
3863 gfc_omp_declare_simd
*ods
= *odsp
;
3866 if (iomode
== IO_OUTPUT
)
3868 write_atom (ATOM_NAME
, "OMP_DECLARE_SIMD");
3871 gfc_omp_namelist
*n
;
3873 if (ods
->clauses
->inbranch
)
3874 mio_name (0, omp_declare_simd_clauses
);
3875 if (ods
->clauses
->notinbranch
)
3876 mio_name (1, omp_declare_simd_clauses
);
3877 if (ods
->clauses
->simdlen_expr
)
3879 mio_name (2, omp_declare_simd_clauses
);
3880 mio_expr (&ods
->clauses
->simdlen_expr
);
3882 for (n
= ods
->clauses
->lists
[OMP_LIST_UNIFORM
]; n
; n
= n
->next
)
3884 mio_name (3, omp_declare_simd_clauses
);
3885 mio_symbol_ref (&n
->sym
);
3887 for (n
= ods
->clauses
->lists
[OMP_LIST_LINEAR
]; n
; n
= n
->next
)
3889 mio_name (4, omp_declare_simd_clauses
);
3890 mio_symbol_ref (&n
->sym
);
3891 mio_expr (&n
->expr
);
3893 for (n
= ods
->clauses
->lists
[OMP_LIST_ALIGNED
]; n
; n
= n
->next
)
3895 mio_name (5, omp_declare_simd_clauses
);
3896 mio_symbol_ref (&n
->sym
);
3897 mio_expr (&n
->expr
);
3903 gfc_omp_namelist
**ptrs
[3] = { NULL
, NULL
, NULL
};
3905 require_atom (ATOM_NAME
);
3906 *odsp
= ods
= gfc_get_omp_declare_simd ();
3907 ods
->where
= gfc_current_locus
;
3908 ods
->proc_name
= ns
->proc_name
;
3909 if (peek_atom () == ATOM_NAME
)
3911 ods
->clauses
= gfc_get_omp_clauses ();
3912 ptrs
[0] = &ods
->clauses
->lists
[OMP_LIST_UNIFORM
];
3913 ptrs
[1] = &ods
->clauses
->lists
[OMP_LIST_LINEAR
];
3914 ptrs
[2] = &ods
->clauses
->lists
[OMP_LIST_ALIGNED
];
3916 while (peek_atom () == ATOM_NAME
)
3918 gfc_omp_namelist
*n
;
3919 int t
= mio_name (0, omp_declare_simd_clauses
);
3923 case 0: ods
->clauses
->inbranch
= true; break;
3924 case 1: ods
->clauses
->notinbranch
= true; break;
3925 case 2: mio_expr (&ods
->clauses
->simdlen_expr
); break;
3929 *ptrs
[t
- 3] = n
= gfc_get_omp_namelist ();
3930 ptrs
[t
- 3] = &n
->next
;
3931 mio_symbol_ref (&n
->sym
);
3933 mio_expr (&n
->expr
);
3939 mio_omp_declare_simd (ns
, &ods
->next
);
3945 static const mstring omp_declare_reduction_stmt
[] =
3947 minit ("ASSIGN", 0),
3954 mio_omp_udr_expr (gfc_omp_udr
*udr
, gfc_symbol
**sym1
, gfc_symbol
**sym2
,
3955 gfc_namespace
*ns
, bool is_initializer
)
3957 if (iomode
== IO_OUTPUT
)
3959 if ((*sym1
)->module
== NULL
)
3961 (*sym1
)->module
= module_name
;
3962 (*sym2
)->module
= module_name
;
3964 mio_symbol_ref (sym1
);
3965 mio_symbol_ref (sym2
);
3966 if (ns
->code
->op
== EXEC_ASSIGN
)
3968 mio_name (0, omp_declare_reduction_stmt
);
3969 mio_expr (&ns
->code
->expr1
);
3970 mio_expr (&ns
->code
->expr2
);
3975 mio_name (1, omp_declare_reduction_stmt
);
3976 mio_symtree_ref (&ns
->code
->symtree
);
3977 mio_actual_arglist (&ns
->code
->ext
.actual
);
3979 flag
= ns
->code
->resolved_isym
!= NULL
;
3980 mio_integer (&flag
);
3982 write_atom (ATOM_STRING
, ns
->code
->resolved_isym
->name
);
3984 mio_symbol_ref (&ns
->code
->resolved_sym
);
3989 pointer_info
*p1
= mio_symbol_ref (sym1
);
3990 pointer_info
*p2
= mio_symbol_ref (sym2
);
3992 gcc_assert (p1
->u
.rsym
.ns
== p2
->u
.rsym
.ns
);
3993 gcc_assert (p1
->u
.rsym
.sym
== NULL
);
3994 /* Add hidden symbols to the symtree. */
3995 pointer_info
*q
= get_integer (p1
->u
.rsym
.ns
);
3996 q
->u
.pointer
= (void *) ns
;
3997 sym
= gfc_new_symbol (is_initializer
? "omp_priv" : "omp_out", ns
);
3999 sym
->module
= gfc_get_string (p1
->u
.rsym
.module
);
4000 associate_integer_pointer (p1
, sym
);
4001 sym
->attr
.omp_udr_artificial_var
= 1;
4002 gcc_assert (p2
->u
.rsym
.sym
== NULL
);
4003 sym
= gfc_new_symbol (is_initializer
? "omp_orig" : "omp_in", ns
);
4005 sym
->module
= gfc_get_string (p2
->u
.rsym
.module
);
4006 associate_integer_pointer (p2
, sym
);
4007 sym
->attr
.omp_udr_artificial_var
= 1;
4008 if (mio_name (0, omp_declare_reduction_stmt
) == 0)
4010 ns
->code
= gfc_get_code (EXEC_ASSIGN
);
4011 mio_expr (&ns
->code
->expr1
);
4012 mio_expr (&ns
->code
->expr2
);
4017 ns
->code
= gfc_get_code (EXEC_CALL
);
4018 mio_symtree_ref (&ns
->code
->symtree
);
4019 mio_actual_arglist (&ns
->code
->ext
.actual
);
4021 mio_integer (&flag
);
4024 require_atom (ATOM_STRING
);
4025 ns
->code
->resolved_isym
= gfc_find_subroutine (atom_string
);
4029 mio_symbol_ref (&ns
->code
->resolved_sym
);
4031 ns
->code
->loc
= gfc_current_locus
;
4037 /* Unlike most other routines, the address of the symbol node is already
4038 fixed on input and the name/module has already been filled in.
4039 If you update the symbol format here, don't forget to update read_module
4040 as well (look for "seek to the symbol's component list"). */
4043 mio_symbol (gfc_symbol
*sym
)
4045 int intmod
= INTMOD_NONE
;
4049 mio_symbol_attribute (&sym
->attr
);
4051 /* Note that components are always saved, even if they are supposed
4052 to be private. Component access is checked during searching. */
4053 mio_component_list (&sym
->components
, sym
->attr
.vtype
);
4054 if (sym
->components
!= NULL
)
4055 sym
->component_access
4056 = MIO_NAME (gfc_access
) (sym
->component_access
, access_types
);
4058 mio_typespec (&sym
->ts
);
4059 if (sym
->ts
.type
== BT_CLASS
)
4060 sym
->attr
.class_ok
= 1;
4062 if (iomode
== IO_OUTPUT
)
4063 mio_namespace_ref (&sym
->formal_ns
);
4066 mio_namespace_ref (&sym
->formal_ns
);
4068 sym
->formal_ns
->proc_name
= sym
;
4071 /* Save/restore common block links. */
4072 mio_symbol_ref (&sym
->common_next
);
4074 mio_formal_arglist (&sym
->formal
);
4076 if (sym
->attr
.flavor
== FL_PARAMETER
)
4077 mio_expr (&sym
->value
);
4079 mio_array_spec (&sym
->as
);
4081 mio_symbol_ref (&sym
->result
);
4083 if (sym
->attr
.cray_pointee
)
4084 mio_symbol_ref (&sym
->cp_pointer
);
4086 /* Load/save the f2k_derived namespace of a derived-type symbol. */
4087 mio_full_f2k_derived (sym
);
4091 /* Add the fields that say whether this is from an intrinsic module,
4092 and if so, what symbol it is within the module. */
4093 /* mio_integer (&(sym->from_intmod)); */
4094 if (iomode
== IO_OUTPUT
)
4096 intmod
= sym
->from_intmod
;
4097 mio_integer (&intmod
);
4101 mio_integer (&intmod
);
4103 sym
->from_intmod
= current_intmod
;
4105 sym
->from_intmod
= (intmod_id
) intmod
;
4108 mio_integer (&(sym
->intmod_sym_id
));
4110 if (sym
->attr
.flavor
== FL_DERIVED
)
4111 mio_integer (&(sym
->hash_value
));
4114 && sym
->formal_ns
->proc_name
== sym
4115 && sym
->formal_ns
->entries
== NULL
)
4116 mio_omp_declare_simd (sym
->formal_ns
, &sym
->formal_ns
->omp_declare_simd
);
4122 /************************* Top level subroutines *************************/
4124 /* Given a root symtree node and a symbol, try to find a symtree that
4125 references the symbol that is not a unique name. */
4127 static gfc_symtree
*
4128 find_symtree_for_symbol (gfc_symtree
*st
, gfc_symbol
*sym
)
4130 gfc_symtree
*s
= NULL
;
4135 s
= find_symtree_for_symbol (st
->right
, sym
);
4138 s
= find_symtree_for_symbol (st
->left
, sym
);
4142 if (st
->n
.sym
== sym
&& !check_unique_name (st
->name
))
4149 /* A recursive function to look for a specific symbol by name and by
4150 module. Whilst several symtrees might point to one symbol, its
4151 is sufficient for the purposes here than one exist. Note that
4152 generic interfaces are distinguished as are symbols that have been
4153 renamed in another module. */
4154 static gfc_symtree
*
4155 find_symbol (gfc_symtree
*st
, const char *name
,
4156 const char *module
, int generic
)
4159 gfc_symtree
*retval
, *s
;
4161 if (st
== NULL
|| st
->n
.sym
== NULL
)
4164 c
= strcmp (name
, st
->n
.sym
->name
);
4165 if (c
== 0 && st
->n
.sym
->module
4166 && strcmp (module
, st
->n
.sym
->module
) == 0
4167 && !check_unique_name (st
->name
))
4169 s
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
4171 /* Detect symbols that are renamed by use association in another
4172 module by the absence of a symtree and null attr.use_rename,
4173 since the latter is not transmitted in the module file. */
4174 if (((!generic
&& !st
->n
.sym
->attr
.generic
)
4175 || (generic
&& st
->n
.sym
->attr
.generic
))
4176 && !(s
== NULL
&& !st
->n
.sym
->attr
.use_rename
))
4180 retval
= find_symbol (st
->left
, name
, module
, generic
);
4183 retval
= find_symbol (st
->right
, name
, module
, generic
);
4189 /* Skip a list between balanced left and right parens.
4190 By setting NEST_LEVEL one assumes that a number of NEST_LEVEL opening parens
4191 have been already parsed by hand, and the remaining of the content is to be
4192 skipped here. The default value is 0 (balanced parens). */
4195 skip_list (int nest_level
= 0)
4202 switch (parse_atom ())
4225 /* Load operator interfaces from the module. Interfaces are unusual
4226 in that they attach themselves to existing symbols. */
4229 load_operator_interfaces (void)
4232 char name
[GFC_MAX_SYMBOL_LEN
+ 1], module
[GFC_MAX_SYMBOL_LEN
+ 1];
4234 pointer_info
*pi
= NULL
;
4239 while (peek_atom () != ATOM_RPAREN
)
4243 mio_internal_string (name
);
4244 mio_internal_string (module
);
4246 n
= number_use_names (name
, true);
4249 for (i
= 1; i
<= n
; i
++)
4251 /* Decide if we need to load this one or not. */
4252 p
= find_use_name_n (name
, &i
, true);
4256 while (parse_atom () != ATOM_RPAREN
);
4262 uop
= gfc_get_uop (p
);
4263 pi
= mio_interface_rest (&uop
->op
);
4267 if (gfc_find_uop (p
, NULL
))
4269 uop
= gfc_get_uop (p
);
4270 uop
->op
= gfc_get_interface ();
4271 uop
->op
->where
= gfc_current_locus
;
4272 add_fixup (pi
->integer
, &uop
->op
->sym
);
4281 /* Load interfaces from the module. Interfaces are unusual in that
4282 they attach themselves to existing symbols. */
4285 load_generic_interfaces (void)
4288 char name
[GFC_MAX_SYMBOL_LEN
+ 1], module
[GFC_MAX_SYMBOL_LEN
+ 1];
4290 gfc_interface
*generic
= NULL
, *gen
= NULL
;
4292 bool ambiguous_set
= false;
4296 while (peek_atom () != ATOM_RPAREN
)
4300 mio_internal_string (name
);
4301 mio_internal_string (module
);
4303 n
= number_use_names (name
, false);
4304 renamed
= n
? 1 : 0;
4307 for (i
= 1; i
<= n
; i
++)
4310 /* Decide if we need to load this one or not. */
4311 p
= find_use_name_n (name
, &i
, false);
4313 st
= find_symbol (gfc_current_ns
->sym_root
,
4314 name
, module_name
, 1);
4316 if (!p
|| gfc_find_symbol (p
, NULL
, 0, &sym
))
4318 /* Skip the specific names for these cases. */
4319 while (i
== 1 && parse_atom () != ATOM_RPAREN
);
4324 /* If the symbol exists already and is being USEd without being
4325 in an ONLY clause, do not load a new symtree(11.3.2). */
4326 if (!only_flag
&& st
)
4334 if (strcmp (st
->name
, p
) != 0)
4336 st
= gfc_new_symtree (&gfc_current_ns
->sym_root
, p
);
4342 /* Since we haven't found a valid generic interface, we had
4346 gfc_get_symbol (p
, NULL
, &sym
);
4347 sym
->name
= gfc_get_string (name
);
4348 sym
->module
= module_name
;
4349 sym
->attr
.flavor
= FL_PROCEDURE
;
4350 sym
->attr
.generic
= 1;
4351 sym
->attr
.use_assoc
= 1;
4356 /* Unless sym is a generic interface, this reference
4359 st
= gfc_find_symtree (gfc_current_ns
->sym_root
, p
);
4363 if (st
&& !sym
->attr
.generic
4366 && strcmp (module
, sym
->module
))
4368 ambiguous_set
= true;
4373 sym
->attr
.use_only
= only_flag
;
4374 sym
->attr
.use_rename
= renamed
;
4378 mio_interface_rest (&sym
->generic
);
4379 generic
= sym
->generic
;
4381 else if (!sym
->generic
)
4383 sym
->generic
= generic
;
4384 sym
->attr
.generic_copy
= 1;
4387 /* If a procedure that is not generic has generic interfaces
4388 that include itself, it is generic! We need to take care
4389 to retain symbols ambiguous that were already so. */
4390 if (sym
->attr
.use_assoc
4391 && !sym
->attr
.generic
4392 && sym
->attr
.flavor
== FL_PROCEDURE
)
4394 for (gen
= generic
; gen
; gen
= gen
->next
)
4396 if (gen
->sym
== sym
)
4398 sym
->attr
.generic
= 1;
4413 /* Load common blocks. */
4418 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4423 while (peek_atom () != ATOM_RPAREN
)
4428 mio_internal_string (name
);
4430 p
= gfc_get_common (name
, 1);
4432 mio_symbol_ref (&p
->head
);
4433 mio_integer (&flags
);
4437 p
->threadprivate
= 1;
4440 /* Get whether this was a bind(c) common or not. */
4441 mio_integer (&p
->is_bind_c
);
4442 /* Get the binding label. */
4443 label
= read_string ();
4445 p
->binding_label
= IDENTIFIER_POINTER (get_identifier (label
));
4455 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
4456 so that unused variables are not loaded and so that the expression can
4462 gfc_equiv
*head
, *tail
, *end
, *eq
;
4466 in_load_equiv
= true;
4468 end
= gfc_current_ns
->equiv
;
4469 while (end
!= NULL
&& end
->next
!= NULL
)
4472 while (peek_atom () != ATOM_RPAREN
) {
4476 while(peek_atom () != ATOM_RPAREN
)
4479 head
= tail
= gfc_get_equiv ();
4482 tail
->eq
= gfc_get_equiv ();
4486 mio_pool_string (&tail
->module
);
4487 mio_expr (&tail
->expr
);
4490 /* Unused equivalence members have a unique name. In addition, it
4491 must be checked that the symbols are from the same module. */
4493 for (eq
= head
; eq
; eq
= eq
->eq
)
4495 if (eq
->expr
->symtree
->n
.sym
->module
4496 && head
->expr
->symtree
->n
.sym
->module
4497 && strcmp (head
->expr
->symtree
->n
.sym
->module
,
4498 eq
->expr
->symtree
->n
.sym
->module
) == 0
4499 && !check_unique_name (eq
->expr
->symtree
->name
))
4508 for (eq
= head
; eq
; eq
= head
)
4511 gfc_free_expr (eq
->expr
);
4517 gfc_current_ns
->equiv
= head
;
4528 in_load_equiv
= false;
4532 /* This function loads the sym_root of f2k_derived with the extensions to
4533 the derived type. */
4535 load_derived_extensions (void)
4538 gfc_symbol
*derived
;
4542 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4543 char module
[GFC_MAX_SYMBOL_LEN
+ 1];
4547 while (peek_atom () != ATOM_RPAREN
)
4550 mio_integer (&symbol
);
4551 info
= get_integer (symbol
);
4552 derived
= info
->u
.rsym
.sym
;
4554 /* This one is not being loaded. */
4555 if (!info
|| !derived
)
4557 while (peek_atom () != ATOM_RPAREN
)
4562 gcc_assert (derived
->attr
.flavor
== FL_DERIVED
);
4563 if (derived
->f2k_derived
== NULL
)
4564 derived
->f2k_derived
= gfc_get_namespace (NULL
, 0);
4566 while (peek_atom () != ATOM_RPAREN
)
4569 mio_internal_string (name
);
4570 mio_internal_string (module
);
4572 /* Only use one use name to find the symbol. */
4574 p
= find_use_name_n (name
, &j
, false);
4577 st
= gfc_find_symtree (gfc_current_ns
->sym_root
, p
);
4579 st
= gfc_find_symtree (derived
->f2k_derived
->sym_root
, name
);
4582 /* Only use the real name in f2k_derived to ensure a single
4584 st
= gfc_new_symtree (&derived
->f2k_derived
->sym_root
, name
);
4597 /* This function loads OpenMP user defined reductions. */
4599 load_omp_udrs (void)
4602 while (peek_atom () != ATOM_RPAREN
)
4604 const char *name
, *newname
;
4608 gfc_omp_reduction_op rop
= OMP_REDUCTION_USER
;
4611 mio_pool_string (&name
);
4613 if (strncmp (name
, "operator ", sizeof ("operator ") - 1) == 0)
4615 const char *p
= name
+ sizeof ("operator ") - 1;
4616 if (strcmp (p
, "+") == 0)
4617 rop
= OMP_REDUCTION_PLUS
;
4618 else if (strcmp (p
, "*") == 0)
4619 rop
= OMP_REDUCTION_TIMES
;
4620 else if (strcmp (p
, "-") == 0)
4621 rop
= OMP_REDUCTION_MINUS
;
4622 else if (strcmp (p
, ".and.") == 0)
4623 rop
= OMP_REDUCTION_AND
;
4624 else if (strcmp (p
, ".or.") == 0)
4625 rop
= OMP_REDUCTION_OR
;
4626 else if (strcmp (p
, ".eqv.") == 0)
4627 rop
= OMP_REDUCTION_EQV
;
4628 else if (strcmp (p
, ".neqv.") == 0)
4629 rop
= OMP_REDUCTION_NEQV
;
4632 if (rop
== OMP_REDUCTION_USER
&& name
[0] == '.')
4634 size_t len
= strlen (name
+ 1);
4635 altname
= XALLOCAVEC (char, len
);
4636 gcc_assert (name
[len
] == '.');
4637 memcpy (altname
, name
+ 1, len
- 1);
4638 altname
[len
- 1] = '\0';
4641 if (rop
== OMP_REDUCTION_USER
)
4642 newname
= find_use_name (altname
? altname
: name
, !!altname
);
4643 else if (only_flag
&& find_use_operator ((gfc_intrinsic_op
) rop
) == NULL
)
4645 if (newname
== NULL
)
4650 if (altname
&& newname
!= altname
)
4652 size_t len
= strlen (newname
);
4653 altname
= XALLOCAVEC (char, len
+ 3);
4655 memcpy (altname
+ 1, newname
, len
);
4656 altname
[len
+ 1] = '.';
4657 altname
[len
+ 2] = '\0';
4658 name
= gfc_get_string (altname
);
4660 st
= gfc_find_symtree (gfc_current_ns
->omp_udr_root
, name
);
4661 gfc_omp_udr
*udr
= gfc_omp_udr_find (st
, &ts
);
4664 require_atom (ATOM_INTEGER
);
4665 pointer_info
*p
= get_integer (atom_int
);
4666 if (strcmp (p
->u
.rsym
.module
, udr
->omp_out
->module
))
4668 gfc_error ("Ambiguous !$OMP DECLARE REDUCTION from "
4670 p
->u
.rsym
.module
, &gfc_current_locus
);
4671 gfc_error ("Previous !$OMP DECLARE REDUCTION from module "
4673 udr
->omp_out
->module
, &udr
->where
);
4678 udr
= gfc_get_omp_udr ();
4682 udr
->where
= gfc_current_locus
;
4683 udr
->combiner_ns
= gfc_get_namespace (gfc_current_ns
, 1);
4684 udr
->combiner_ns
->proc_name
= gfc_current_ns
->proc_name
;
4685 mio_omp_udr_expr (udr
, &udr
->omp_out
, &udr
->omp_in
, udr
->combiner_ns
,
4687 if (peek_atom () != ATOM_RPAREN
)
4689 udr
->initializer_ns
= gfc_get_namespace (gfc_current_ns
, 1);
4690 udr
->initializer_ns
->proc_name
= gfc_current_ns
->proc_name
;
4691 mio_omp_udr_expr (udr
, &udr
->omp_priv
, &udr
->omp_orig
,
4692 udr
->initializer_ns
, true);
4696 udr
->next
= st
->n
.omp_udr
;
4697 st
->n
.omp_udr
= udr
;
4701 st
= gfc_new_symtree (&gfc_current_ns
->omp_udr_root
, name
);
4702 st
->n
.omp_udr
= udr
;
4710 /* Recursive function to traverse the pointer_info tree and load a
4711 needed symbol. We return nonzero if we load a symbol and stop the
4712 traversal, because the act of loading can alter the tree. */
4715 load_needed (pointer_info
*p
)
4726 rv
|= load_needed (p
->left
);
4727 rv
|= load_needed (p
->right
);
4729 if (p
->type
!= P_SYMBOL
|| p
->u
.rsym
.state
!= NEEDED
)
4732 p
->u
.rsym
.state
= USED
;
4734 set_module_locus (&p
->u
.rsym
.where
);
4736 sym
= p
->u
.rsym
.sym
;
4739 q
= get_integer (p
->u
.rsym
.ns
);
4741 ns
= (gfc_namespace
*) q
->u
.pointer
;
4744 /* Create an interface namespace if necessary. These are
4745 the namespaces that hold the formal parameters of module
4748 ns
= gfc_get_namespace (NULL
, 0);
4749 associate_integer_pointer (q
, ns
);
4752 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
4753 doesn't go pear-shaped if the symbol is used. */
4755 gfc_find_symbol (p
->u
.rsym
.module
, gfc_current_ns
,
4758 sym
= gfc_new_symbol (p
->u
.rsym
.true_name
, ns
);
4759 sym
->name
= dt_lower_string (p
->u
.rsym
.true_name
);
4760 sym
->module
= gfc_get_string (p
->u
.rsym
.module
);
4761 if (p
->u
.rsym
.binding_label
)
4762 sym
->binding_label
= IDENTIFIER_POINTER (get_identifier
4763 (p
->u
.rsym
.binding_label
));
4765 associate_integer_pointer (p
, sym
);
4769 sym
->attr
.use_assoc
= 1;
4771 /* Mark as only or rename for later diagnosis for explicitly imported
4772 but not used warnings; don't mark internal symbols such as __vtab,
4773 __def_init etc. Only mark them if they have been explicitly loaded. */
4775 if (only_flag
&& sym
->name
[0] != '_' && sym
->name
[1] != '_')
4779 /* Search the use/rename list for the variable; if the variable is
4781 for (u
= gfc_rename_list
; u
; u
= u
->next
)
4783 if (strcmp (u
->use_name
, sym
->name
) == 0)
4785 sym
->attr
.use_only
= 1;
4791 if (p
->u
.rsym
.renamed
)
4792 sym
->attr
.use_rename
= 1;
4798 /* Recursive function for cleaning up things after a module has been read. */
4801 read_cleanup (pointer_info
*p
)
4809 read_cleanup (p
->left
);
4810 read_cleanup (p
->right
);
4812 if (p
->type
== P_SYMBOL
&& p
->u
.rsym
.state
== USED
&& !p
->u
.rsym
.referenced
)
4815 /* Add hidden symbols to the symtree. */
4816 q
= get_integer (p
->u
.rsym
.ns
);
4817 ns
= (gfc_namespace
*) q
->u
.pointer
;
4819 if (!p
->u
.rsym
.sym
->attr
.vtype
4820 && !p
->u
.rsym
.sym
->attr
.vtab
)
4821 st
= gfc_get_unique_symtree (ns
);
4824 /* There is no reason to use 'unique_symtrees' for vtabs or
4825 vtypes - their name is fine for a symtree and reduces the
4826 namespace pollution. */
4827 st
= gfc_find_symtree (ns
->sym_root
, p
->u
.rsym
.sym
->name
);
4829 st
= gfc_new_symtree (&ns
->sym_root
, p
->u
.rsym
.sym
->name
);
4832 st
->n
.sym
= p
->u
.rsym
.sym
;
4835 /* Fixup any symtree references. */
4836 p
->u
.rsym
.symtree
= st
;
4837 resolve_fixups (p
->u
.rsym
.stfixup
, st
);
4838 p
->u
.rsym
.stfixup
= NULL
;
4841 /* Free unused symbols. */
4842 if (p
->type
== P_SYMBOL
&& p
->u
.rsym
.state
== UNUSED
)
4843 gfc_free_symbol (p
->u
.rsym
.sym
);
4847 /* It is not quite enough to check for ambiguity in the symbols by
4848 the loaded symbol and the new symbol not being identical. */
4850 check_for_ambiguous (gfc_symbol
*st_sym
, pointer_info
*info
)
4854 symbol_attribute attr
;
4856 if (gfc_current_ns
->proc_name
&& st_sym
->name
== gfc_current_ns
->proc_name
->name
)
4858 gfc_error ("'%s' of module '%s', imported at %C, is also the name of the "
4859 "current program unit", st_sym
->name
, module_name
);
4863 rsym
= info
->u
.rsym
.sym
;
4867 if (st_sym
->attr
.vtab
|| st_sym
->attr
.vtype
)
4870 /* If the existing symbol is generic from a different module and
4871 the new symbol is generic there can be no ambiguity. */
4872 if (st_sym
->attr
.generic
4874 && st_sym
->module
!= module_name
)
4876 /* The new symbol's attributes have not yet been read. Since
4877 we need attr.generic, read it directly. */
4878 get_module_locus (&locus
);
4879 set_module_locus (&info
->u
.rsym
.where
);
4882 mio_symbol_attribute (&attr
);
4883 set_module_locus (&locus
);
4892 /* Read a module file. */
4897 module_locus operator_interfaces
, user_operators
, extensions
, omp_udrs
;
4899 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4901 int ambiguous
, j
, nuse
, symbol
;
4902 pointer_info
*info
, *q
;
4903 gfc_use_rename
*u
= NULL
;
4907 get_module_locus (&operator_interfaces
); /* Skip these for now. */
4910 get_module_locus (&user_operators
);
4914 /* Skip commons, equivalences and derived type extensions for now. */
4918 get_module_locus (&extensions
);
4921 /* Skip OpenMP UDRs. */
4922 get_module_locus (&omp_udrs
);
4927 /* Create the fixup nodes for all the symbols. */
4929 while (peek_atom () != ATOM_RPAREN
)
4932 require_atom (ATOM_INTEGER
);
4933 info
= get_integer (atom_int
);
4935 info
->type
= P_SYMBOL
;
4936 info
->u
.rsym
.state
= UNUSED
;
4938 info
->u
.rsym
.true_name
= read_string ();
4939 info
->u
.rsym
.module
= read_string ();
4940 bind_label
= read_string ();
4941 if (strlen (bind_label
))
4942 info
->u
.rsym
.binding_label
= bind_label
;
4944 XDELETEVEC (bind_label
);
4946 require_atom (ATOM_INTEGER
);
4947 info
->u
.rsym
.ns
= atom_int
;
4949 get_module_locus (&info
->u
.rsym
.where
);
4951 /* See if the symbol has already been loaded by a previous module.
4952 If so, we reference the existing symbol and prevent it from
4953 being loaded again. This should not happen if the symbol being
4954 read is an index for an assumed shape dummy array (ns != 1). */
4956 sym
= find_true_name (info
->u
.rsym
.true_name
, info
->u
.rsym
.module
);
4959 || (sym
->attr
.flavor
== FL_VARIABLE
&& info
->u
.rsym
.ns
!=1))
4965 info
->u
.rsym
.state
= USED
;
4966 info
->u
.rsym
.sym
= sym
;
4967 /* The current symbol has already been loaded, so we can avoid loading
4968 it again. However, if it is a derived type, some of its components
4969 can be used in expressions in the module. To avoid the module loading
4970 failing, we need to associate the module's component pointer indexes
4971 with the existing symbol's component pointers. */
4972 if (sym
->attr
.flavor
== FL_DERIVED
)
4976 /* First seek to the symbol's component list. */
4977 mio_lparen (); /* symbol opening. */
4978 skip_list (); /* skip symbol attribute. */
4980 mio_lparen (); /* component list opening. */
4981 for (c
= sym
->components
; c
; c
= c
->next
)
4984 const char *comp_name
;
4987 mio_lparen (); /* component opening. */
4989 p
= get_integer (n
);
4990 if (p
->u
.pointer
== NULL
)
4991 associate_integer_pointer (p
, c
);
4992 mio_pool_string (&comp_name
);
4993 gcc_assert (comp_name
== c
->name
);
4994 skip_list (1); /* component end. */
4996 mio_rparen (); /* component list closing. */
4998 skip_list (1); /* symbol end. */
5003 /* Some symbols do not have a namespace (eg. formal arguments),
5004 so the automatic "unique symtree" mechanism must be suppressed
5005 by marking them as referenced. */
5006 q
= get_integer (info
->u
.rsym
.ns
);
5007 if (q
->u
.pointer
== NULL
)
5009 info
->u
.rsym
.referenced
= 1;
5013 /* If possible recycle the symtree that references the symbol.
5014 If a symtree is not found and the module does not import one,
5015 a unique-name symtree is found by read_cleanup. */
5016 st
= find_symtree_for_symbol (gfc_current_ns
->sym_root
, sym
);
5019 info
->u
.rsym
.symtree
= st
;
5020 info
->u
.rsym
.referenced
= 1;
5026 /* Parse the symtree lists. This lets us mark which symbols need to
5027 be loaded. Renaming is also done at this point by replacing the
5032 while (peek_atom () != ATOM_RPAREN
)
5034 mio_internal_string (name
);
5035 mio_integer (&ambiguous
);
5036 mio_integer (&symbol
);
5038 info
= get_integer (symbol
);
5040 /* See how many use names there are. If none, go through the start
5041 of the loop at least once. */
5042 nuse
= number_use_names (name
, false);
5043 info
->u
.rsym
.renamed
= nuse
? 1 : 0;
5048 for (j
= 1; j
<= nuse
; j
++)
5050 /* Get the jth local name for this symbol. */
5051 p
= find_use_name_n (name
, &j
, false);
5053 if (p
== NULL
&& strcmp (name
, module_name
) == 0)
5056 /* Exception: Always import vtabs & vtypes. */
5057 if (p
== NULL
&& name
[0] == '_'
5058 && (strncmp (name
, "__vtab_", 5) == 0
5059 || strncmp (name
, "__vtype_", 6) == 0))
5062 /* Skip symtree nodes not in an ONLY clause, unless there
5063 is an existing symtree loaded from another USE statement. */
5066 st
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
5068 && strcmp (st
->n
.sym
->name
, info
->u
.rsym
.true_name
) == 0
5069 && st
->n
.sym
->module
!= NULL
5070 && strcmp (st
->n
.sym
->module
, info
->u
.rsym
.module
) == 0)
5072 info
->u
.rsym
.symtree
= st
;
5073 info
->u
.rsym
.sym
= st
->n
.sym
;
5078 /* If a symbol of the same name and module exists already,
5079 this symbol, which is not in an ONLY clause, must not be
5080 added to the namespace(11.3.2). Note that find_symbol
5081 only returns the first occurrence that it finds. */
5082 if (!only_flag
&& !info
->u
.rsym
.renamed
5083 && strcmp (name
, module_name
) != 0
5084 && find_symbol (gfc_current_ns
->sym_root
, name
,
5088 st
= gfc_find_symtree (gfc_current_ns
->sym_root
, p
);
5092 /* Check for ambiguous symbols. */
5093 if (check_for_ambiguous (st
->n
.sym
, info
))
5096 info
->u
.rsym
.symtree
= st
;
5100 st
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
5102 /* Create a symtree node in the current namespace for this
5104 st
= check_unique_name (p
)
5105 ? gfc_get_unique_symtree (gfc_current_ns
)
5106 : gfc_new_symtree (&gfc_current_ns
->sym_root
, p
);
5107 st
->ambiguous
= ambiguous
;
5109 sym
= info
->u
.rsym
.sym
;
5111 /* Create a symbol node if it doesn't already exist. */
5114 info
->u
.rsym
.sym
= gfc_new_symbol (info
->u
.rsym
.true_name
,
5116 info
->u
.rsym
.sym
->name
= dt_lower_string (info
->u
.rsym
.true_name
);
5117 sym
= info
->u
.rsym
.sym
;
5118 sym
->module
= gfc_get_string (info
->u
.rsym
.module
);
5120 if (info
->u
.rsym
.binding_label
)
5121 sym
->binding_label
=
5122 IDENTIFIER_POINTER (get_identifier
5123 (info
->u
.rsym
.binding_label
));
5129 if (strcmp (name
, p
) != 0)
5130 sym
->attr
.use_rename
= 1;
5133 || (strncmp (name
, "__vtab_", 5) != 0
5134 && strncmp (name
, "__vtype_", 6) != 0))
5135 sym
->attr
.use_only
= only_flag
;
5137 /* Store the symtree pointing to this symbol. */
5138 info
->u
.rsym
.symtree
= st
;
5140 if (info
->u
.rsym
.state
== UNUSED
)
5141 info
->u
.rsym
.state
= NEEDED
;
5142 info
->u
.rsym
.referenced
= 1;
5149 /* Load intrinsic operator interfaces. */
5150 set_module_locus (&operator_interfaces
);
5153 for (i
= GFC_INTRINSIC_BEGIN
; i
!= GFC_INTRINSIC_END
; i
++)
5155 if (i
== INTRINSIC_USER
)
5160 u
= find_use_operator ((gfc_intrinsic_op
) i
);
5171 mio_interface (&gfc_current_ns
->op
[i
]);
5172 if (u
&& !gfc_current_ns
->op
[i
])
5178 /* Load generic and user operator interfaces. These must follow the
5179 loading of symtree because otherwise symbols can be marked as
5182 set_module_locus (&user_operators
);
5184 load_operator_interfaces ();
5185 load_generic_interfaces ();
5190 /* Load OpenMP user defined reductions. */
5191 set_module_locus (&omp_udrs
);
5194 /* At this point, we read those symbols that are needed but haven't
5195 been loaded yet. If one symbol requires another, the other gets
5196 marked as NEEDED if its previous state was UNUSED. */
5198 while (load_needed (pi_root
));
5200 /* Make sure all elements of the rename-list were found in the module. */
5202 for (u
= gfc_rename_list
; u
; u
= u
->next
)
5207 if (u
->op
== INTRINSIC_NONE
)
5209 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
5210 u
->use_name
, &u
->where
, module_name
);
5214 if (u
->op
== INTRINSIC_USER
)
5216 gfc_error ("User operator '%s' referenced at %L not found "
5217 "in module '%s'", u
->use_name
, &u
->where
, module_name
);
5221 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
5222 "in module '%s'", gfc_op2string (u
->op
), &u
->where
,
5226 /* Now we should be in a position to fill f2k_derived with derived type
5227 extensions, since everything has been loaded. */
5228 set_module_locus (&extensions
);
5229 load_derived_extensions ();
5231 /* Clean up symbol nodes that were never loaded, create references
5232 to hidden symbols. */
5234 read_cleanup (pi_root
);
5238 /* Given an access type that is specific to an entity and the default
5239 access, return nonzero if the entity is publicly accessible. If the
5240 element is declared as PUBLIC, then it is public; if declared
5241 PRIVATE, then private, and otherwise it is public unless the default
5242 access in this context has been declared PRIVATE. */
5245 check_access (gfc_access specific_access
, gfc_access default_access
)
5247 if (specific_access
== ACCESS_PUBLIC
)
5249 if (specific_access
== ACCESS_PRIVATE
)
5252 if (gfc_option
.flag_module_private
)
5253 return default_access
== ACCESS_PUBLIC
;
5255 return default_access
!= ACCESS_PRIVATE
;
5260 gfc_check_symbol_access (gfc_symbol
*sym
)
5262 if (sym
->attr
.vtab
|| sym
->attr
.vtype
)
5265 return check_access (sym
->attr
.access
, sym
->ns
->default_access
);
5269 /* A structure to remember which commons we've already written. */
5271 struct written_common
5273 BBT_HEADER(written_common
);
5274 const char *name
, *label
;
5277 static struct written_common
*written_commons
= NULL
;
5279 /* Comparison function used for balancing the binary tree. */
5282 compare_written_commons (void *a1
, void *b1
)
5284 const char *aname
= ((struct written_common
*) a1
)->name
;
5285 const char *alabel
= ((struct written_common
*) a1
)->label
;
5286 const char *bname
= ((struct written_common
*) b1
)->name
;
5287 const char *blabel
= ((struct written_common
*) b1
)->label
;
5288 int c
= strcmp (aname
, bname
);
5290 return (c
!= 0 ? c
: strcmp (alabel
, blabel
));
5293 /* Free a list of written commons. */
5296 free_written_common (struct written_common
*w
)
5302 free_written_common (w
->left
);
5304 free_written_common (w
->right
);
5309 /* Write a common block to the module -- recursive helper function. */
5312 write_common_0 (gfc_symtree
*st
, bool this_module
)
5318 struct written_common
*w
;
5319 bool write_me
= true;
5324 write_common_0 (st
->left
, this_module
);
5326 /* We will write out the binding label, or "" if no label given. */
5327 name
= st
->n
.common
->name
;
5329 label
= (p
->is_bind_c
&& p
->binding_label
) ? p
->binding_label
: "";
5331 /* Check if we've already output this common. */
5332 w
= written_commons
;
5335 int c
= strcmp (name
, w
->name
);
5336 c
= (c
!= 0 ? c
: strcmp (label
, w
->label
));
5340 w
= (c
< 0) ? w
->left
: w
->right
;
5343 if (this_module
&& p
->use_assoc
)
5348 /* Write the common to the module. */
5350 mio_pool_string (&name
);
5352 mio_symbol_ref (&p
->head
);
5353 flags
= p
->saved
? 1 : 0;
5354 if (p
->threadprivate
)
5356 mio_integer (&flags
);
5358 /* Write out whether the common block is bind(c) or not. */
5359 mio_integer (&(p
->is_bind_c
));
5361 mio_pool_string (&label
);
5364 /* Record that we have written this common. */
5365 w
= XCNEW (struct written_common
);
5368 gfc_insert_bbt (&written_commons
, w
, compare_written_commons
);
5371 write_common_0 (st
->right
, this_module
);
5375 /* Write a common, by initializing the list of written commons, calling
5376 the recursive function write_common_0() and cleaning up afterwards. */
5379 write_common (gfc_symtree
*st
)
5381 written_commons
= NULL
;
5382 write_common_0 (st
, true);
5383 write_common_0 (st
, false);
5384 free_written_common (written_commons
);
5385 written_commons
= NULL
;
5389 /* Write the blank common block to the module. */
5392 write_blank_common (void)
5394 const char * name
= BLANK_COMMON_NAME
;
5396 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
5397 this, but it hasn't been checked. Just making it so for now. */
5400 if (gfc_current_ns
->blank_common
.head
== NULL
)
5405 mio_pool_string (&name
);
5407 mio_symbol_ref (&gfc_current_ns
->blank_common
.head
);
5408 saved
= gfc_current_ns
->blank_common
.saved
;
5409 mio_integer (&saved
);
5411 /* Write out whether the common block is bind(c) or not. */
5412 mio_integer (&is_bind_c
);
5414 /* Write out an empty binding label. */
5415 write_atom (ATOM_STRING
, "");
5421 /* Write equivalences to the module. */
5430 for (eq
= gfc_current_ns
->equiv
; eq
; eq
= eq
->next
)
5434 for (e
= eq
; e
; e
= e
->eq
)
5436 if (e
->module
== NULL
)
5437 e
->module
= gfc_get_string ("%s.eq.%d", module_name
, num
);
5438 mio_allocated_string (e
->module
);
5439 mio_expr (&e
->expr
);
5448 /* Write derived type extensions to the module. */
5451 write_dt_extensions (gfc_symtree
*st
)
5453 if (!gfc_check_symbol_access (st
->n
.sym
))
5455 if (!(st
->n
.sym
->ns
&& st
->n
.sym
->ns
->proc_name
5456 && st
->n
.sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
))
5460 mio_pool_string (&st
->name
);
5461 if (st
->n
.sym
->module
!= NULL
)
5462 mio_pool_string (&st
->n
.sym
->module
);
5465 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
5466 if (iomode
== IO_OUTPUT
)
5467 strcpy (name
, module_name
);
5468 mio_internal_string (name
);
5469 if (iomode
== IO_INPUT
)
5470 module_name
= gfc_get_string (name
);
5476 write_derived_extensions (gfc_symtree
*st
)
5478 if (!((st
->n
.sym
->attr
.flavor
== FL_DERIVED
)
5479 && (st
->n
.sym
->f2k_derived
!= NULL
)
5480 && (st
->n
.sym
->f2k_derived
->sym_root
!= NULL
)))
5484 mio_symbol_ref (&(st
->n
.sym
));
5485 gfc_traverse_symtree (st
->n
.sym
->f2k_derived
->sym_root
,
5486 write_dt_extensions
);
5491 /* Write a symbol to the module. */
5494 write_symbol (int n
, gfc_symbol
*sym
)
5498 if (sym
->attr
.flavor
== FL_UNKNOWN
|| sym
->attr
.flavor
== FL_LABEL
)
5499 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym
->name
);
5503 if (sym
->attr
.flavor
== FL_DERIVED
)
5506 name
= dt_upper_string (sym
->name
);
5507 mio_pool_string (&name
);
5510 mio_pool_string (&sym
->name
);
5512 mio_pool_string (&sym
->module
);
5513 if ((sym
->attr
.is_bind_c
|| sym
->attr
.is_iso_c
) && sym
->binding_label
)
5515 label
= sym
->binding_label
;
5516 mio_pool_string (&label
);
5519 write_atom (ATOM_STRING
, "");
5521 mio_pointer_ref (&sym
->ns
);
5528 /* Recursive traversal function to write the initial set of symbols to
5529 the module. We check to see if the symbol should be written
5530 according to the access specification. */
5533 write_symbol0 (gfc_symtree
*st
)
5537 bool dont_write
= false;
5542 write_symbol0 (st
->left
);
5545 if (sym
->module
== NULL
)
5546 sym
->module
= module_name
;
5548 if (sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.generic
5549 && !sym
->attr
.subroutine
&& !sym
->attr
.function
)
5552 if (!gfc_check_symbol_access (sym
))
5557 p
= get_pointer (sym
);
5558 if (p
->type
== P_UNKNOWN
)
5561 if (p
->u
.wsym
.state
!= WRITTEN
)
5563 write_symbol (p
->integer
, sym
);
5564 p
->u
.wsym
.state
= WRITTEN
;
5568 write_symbol0 (st
->right
);
5573 write_omp_udr (gfc_omp_udr
*udr
)
5577 case OMP_REDUCTION_USER
:
5578 /* Non-operators can't be used outside of the module. */
5579 if (udr
->name
[0] != '.')
5584 size_t len
= strlen (udr
->name
+ 1);
5585 char *name
= XALLOCAVEC (char, len
);
5586 memcpy (name
, udr
->name
, len
- 1);
5587 name
[len
- 1] = '\0';
5588 st
= gfc_find_symtree (gfc_current_ns
->uop_root
, name
);
5589 /* If corresponding user operator is private, don't write
5593 gfc_user_op
*uop
= st
->n
.uop
;
5594 if (!check_access (uop
->access
, uop
->ns
->default_access
))
5599 case OMP_REDUCTION_PLUS
:
5600 case OMP_REDUCTION_MINUS
:
5601 case OMP_REDUCTION_TIMES
:
5602 case OMP_REDUCTION_AND
:
5603 case OMP_REDUCTION_OR
:
5604 case OMP_REDUCTION_EQV
:
5605 case OMP_REDUCTION_NEQV
:
5606 /* If corresponding operator is private, don't write the UDR. */
5607 if (!check_access (gfc_current_ns
->operator_access
[udr
->rop
],
5608 gfc_current_ns
->default_access
))
5614 if (udr
->ts
.type
== BT_DERIVED
|| udr
->ts
.type
== BT_CLASS
)
5616 /* If derived type is private, don't write the UDR. */
5617 if (!gfc_check_symbol_access (udr
->ts
.u
.derived
))
5622 mio_pool_string (&udr
->name
);
5623 mio_typespec (&udr
->ts
);
5624 mio_omp_udr_expr (udr
, &udr
->omp_out
, &udr
->omp_in
, udr
->combiner_ns
, false);
5625 if (udr
->initializer_ns
)
5626 mio_omp_udr_expr (udr
, &udr
->omp_priv
, &udr
->omp_orig
,
5627 udr
->initializer_ns
, true);
5633 write_omp_udrs (gfc_symtree
*st
)
5638 write_omp_udrs (st
->left
);
5640 for (udr
= st
->n
.omp_udr
; udr
; udr
= udr
->next
)
5641 write_omp_udr (udr
);
5642 write_omp_udrs (st
->right
);
5646 /* Type for the temporary tree used when writing secondary symbols. */
5648 struct sorted_pointer_info
5650 BBT_HEADER (sorted_pointer_info
);
5655 #define gfc_get_sorted_pointer_info() XCNEW (sorted_pointer_info)
5657 /* Recursively traverse the temporary tree, free its contents. */
5660 free_sorted_pointer_info_tree (sorted_pointer_info
*p
)
5665 free_sorted_pointer_info_tree (p
->left
);
5666 free_sorted_pointer_info_tree (p
->right
);
5671 /* Comparison function for the temporary tree. */
5674 compare_sorted_pointer_info (void *_spi1
, void *_spi2
)
5676 sorted_pointer_info
*spi1
, *spi2
;
5677 spi1
= (sorted_pointer_info
*)_spi1
;
5678 spi2
= (sorted_pointer_info
*)_spi2
;
5680 if (spi1
->p
->integer
< spi2
->p
->integer
)
5682 if (spi1
->p
->integer
> spi2
->p
->integer
)
5688 /* Finds the symbols that need to be written and collects them in the
5689 sorted_pi tree so that they can be traversed in an order
5690 independent of memory addresses. */
5693 find_symbols_to_write(sorted_pointer_info
**tree
, pointer_info
*p
)
5698 if (p
->type
== P_SYMBOL
&& p
->u
.wsym
.state
== NEEDS_WRITE
)
5700 sorted_pointer_info
*sp
= gfc_get_sorted_pointer_info();
5703 gfc_insert_bbt (tree
, sp
, compare_sorted_pointer_info
);
5706 find_symbols_to_write (tree
, p
->left
);
5707 find_symbols_to_write (tree
, p
->right
);
5711 /* Recursive function that traverses the tree of symbols that need to be
5712 written and writes them in order. */
5715 write_symbol1_recursion (sorted_pointer_info
*sp
)
5720 write_symbol1_recursion (sp
->left
);
5722 pointer_info
*p1
= sp
->p
;
5723 gcc_assert (p1
->type
== P_SYMBOL
&& p1
->u
.wsym
.state
== NEEDS_WRITE
);
5725 p1
->u
.wsym
.state
= WRITTEN
;
5726 write_symbol (p1
->integer
, p1
->u
.wsym
.sym
);
5727 p1
->u
.wsym
.sym
->attr
.public_used
= 1;
5729 write_symbol1_recursion (sp
->right
);
5733 /* Write the secondary set of symbols to the module file. These are
5734 symbols that were not public yet are needed by the public symbols
5735 or another dependent symbol. The act of writing a symbol can add
5736 symbols to the pointer_info tree, so we return nonzero if a symbol
5737 was written and pass that information upwards. The caller will
5738 then call this function again until nothing was written. It uses
5739 the utility functions and a temporary tree to ensure a reproducible
5740 ordering of the symbol output and thus the module file. */
5743 write_symbol1 (pointer_info
*p
)
5748 /* Put symbols that need to be written into a tree sorted on the
5751 sorted_pointer_info
*spi_root
= NULL
;
5752 find_symbols_to_write (&spi_root
, p
);
5754 /* No symbols to write, return. */
5758 /* Otherwise, write and free the tree again. */
5759 write_symbol1_recursion (spi_root
);
5760 free_sorted_pointer_info_tree (spi_root
);
5766 /* Write operator interfaces associated with a symbol. */
5769 write_operator (gfc_user_op
*uop
)
5771 static char nullstring
[] = "";
5772 const char *p
= nullstring
;
5774 if (uop
->op
== NULL
|| !check_access (uop
->access
, uop
->ns
->default_access
))
5777 mio_symbol_interface (&uop
->name
, &p
, &uop
->op
);
5781 /* Write generic interfaces from the namespace sym_root. */
5784 write_generic (gfc_symtree
*st
)
5791 write_generic (st
->left
);
5794 if (sym
&& !check_unique_name (st
->name
)
5795 && sym
->generic
&& gfc_check_symbol_access (sym
))
5798 sym
->module
= module_name
;
5800 mio_symbol_interface (&st
->name
, &sym
->module
, &sym
->generic
);
5803 write_generic (st
->right
);
5808 write_symtree (gfc_symtree
*st
)
5815 /* A symbol in an interface body must not be visible in the
5817 if (sym
->ns
!= gfc_current_ns
5818 && sym
->ns
->proc_name
5819 && sym
->ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
)
5822 if (!gfc_check_symbol_access (sym
)
5823 || (sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.generic
5824 && !sym
->attr
.subroutine
&& !sym
->attr
.function
))
5827 if (check_unique_name (st
->name
))
5830 p
= find_pointer (sym
);
5832 gfc_internal_error ("write_symtree(): Symbol not written");
5834 mio_pool_string (&st
->name
);
5835 mio_integer (&st
->ambiguous
);
5836 mio_integer (&p
->integer
);
5845 /* Write the operator interfaces. */
5848 for (i
= GFC_INTRINSIC_BEGIN
; i
!= GFC_INTRINSIC_END
; i
++)
5850 if (i
== INTRINSIC_USER
)
5853 mio_interface (check_access (gfc_current_ns
->operator_access
[i
],
5854 gfc_current_ns
->default_access
)
5855 ? &gfc_current_ns
->op
[i
] : NULL
);
5863 gfc_traverse_user_op (gfc_current_ns
, write_operator
);
5869 write_generic (gfc_current_ns
->sym_root
);
5875 write_blank_common ();
5876 write_common (gfc_current_ns
->common_root
);
5888 gfc_traverse_symtree (gfc_current_ns
->sym_root
,
5889 write_derived_extensions
);
5895 write_omp_udrs (gfc_current_ns
->omp_udr_root
);
5900 /* Write symbol information. First we traverse all symbols in the
5901 primary namespace, writing those that need to be written.
5902 Sometimes writing one symbol will cause another to need to be
5903 written. A list of these symbols ends up on the write stack, and
5904 we end by popping the bottom of the stack and writing the symbol
5905 until the stack is empty. */
5909 write_symbol0 (gfc_current_ns
->sym_root
);
5910 while (write_symbol1 (pi_root
))
5919 gfc_traverse_symtree (gfc_current_ns
->sym_root
, write_symtree
);
5924 /* Read a CRC32 sum from the gzip trailer of a module file. Returns
5925 true on success, false on failure. */
5928 read_crc32_from_module_file (const char* filename
, uLong
* crc
)
5934 /* Open the file in binary mode. */
5935 if ((file
= fopen (filename
, "rb")) == NULL
)
5938 /* The gzip crc32 value is found in the [END-8, END-4] bytes of the
5939 file. See RFC 1952. */
5940 if (fseek (file
, -8, SEEK_END
) != 0)
5946 /* Read the CRC32. */
5947 if (fread (buf
, 1, 4, file
) != 4)
5953 /* Close the file. */
5956 val
= (buf
[0] & 0xFF) + ((buf
[1] & 0xFF) << 8) + ((buf
[2] & 0xFF) << 16)
5957 + ((buf
[3] & 0xFF) << 24);
5960 /* For debugging, the CRC value printed in hexadecimal should match
5961 the CRC printed by "zcat -l -v filename".
5962 printf("CRC of file %s is %x\n", filename, val); */
5968 /* Given module, dump it to disk. If there was an error while
5969 processing the module, dump_flag will be set to zero and we delete
5970 the module file, even if it was already there. */
5973 gfc_dump_module (const char *name
, int dump_flag
)
5976 char *filename
, *filename_tmp
;
5979 n
= strlen (name
) + strlen (MODULE_EXTENSION
) + 1;
5980 if (gfc_option
.module_dir
!= NULL
)
5982 n
+= strlen (gfc_option
.module_dir
);
5983 filename
= (char *) alloca (n
);
5984 strcpy (filename
, gfc_option
.module_dir
);
5985 strcat (filename
, name
);
5989 filename
= (char *) alloca (n
);
5990 strcpy (filename
, name
);
5992 strcat (filename
, MODULE_EXTENSION
);
5994 /* Name of the temporary file used to write the module. */
5995 filename_tmp
= (char *) alloca (n
+ 1);
5996 strcpy (filename_tmp
, filename
);
5997 strcat (filename_tmp
, "0");
5999 /* There was an error while processing the module. We delete the
6000 module file, even if it was already there. */
6007 if (gfc_cpp_makedep ())
6008 gfc_cpp_add_target (filename
);
6010 /* Write the module to the temporary file. */
6011 module_fp
= gzopen (filename_tmp
, "w");
6012 if (module_fp
== NULL
)
6013 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
6014 filename_tmp
, xstrerror (errno
));
6016 gzprintf (module_fp
, "GFORTRAN module version '%s' created from %s\n",
6017 MOD_VERSION
, gfc_source_file
);
6019 /* Write the module itself. */
6021 module_name
= gfc_get_string (name
);
6027 free_pi_tree (pi_root
);
6032 if (gzclose (module_fp
))
6033 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
6034 filename_tmp
, xstrerror (errno
));
6036 /* Read the CRC32 from the gzip trailers of the module files and
6038 if (!read_crc32_from_module_file (filename_tmp
, &crc
)
6039 || !read_crc32_from_module_file (filename
, &crc_old
)
6042 /* Module file have changed, replace the old one. */
6043 if (remove (filename
) && errno
!= ENOENT
)
6044 gfc_fatal_error ("Can't delete module file '%s': %s", filename
,
6046 if (rename (filename_tmp
, filename
))
6047 gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
6048 filename_tmp
, filename
, xstrerror (errno
));
6052 if (remove (filename_tmp
))
6053 gfc_fatal_error ("Can't delete temporary module file '%s': %s",
6054 filename_tmp
, xstrerror (errno
));
6060 create_intrinsic_function (const char *name
, int id
,
6061 const char *modname
, intmod_id module
,
6062 bool subroutine
, gfc_symbol
*result_type
)
6064 gfc_intrinsic_sym
*isym
;
6065 gfc_symtree
*tmp_symtree
;
6068 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
6071 if (strcmp (modname
, tmp_symtree
->n
.sym
->module
) == 0)
6073 gfc_error ("Symbol '%s' already declared", name
);
6076 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp_symtree
, false);
6077 sym
= tmp_symtree
->n
.sym
;
6081 gfc_isym_id isym_id
= gfc_isym_id_by_intmod (module
, id
);
6082 isym
= gfc_intrinsic_subroutine_by_id (isym_id
);
6083 sym
->attr
.subroutine
= 1;
6087 gfc_isym_id isym_id
= gfc_isym_id_by_intmod (module
, id
);
6088 isym
= gfc_intrinsic_function_by_id (isym_id
);
6090 sym
->attr
.function
= 1;
6093 sym
->ts
.type
= BT_DERIVED
;
6094 sym
->ts
.u
.derived
= result_type
;
6095 sym
->ts
.is_c_interop
= 1;
6096 isym
->ts
.f90_type
= BT_VOID
;
6097 isym
->ts
.type
= BT_DERIVED
;
6098 isym
->ts
.f90_type
= BT_VOID
;
6099 isym
->ts
.u
.derived
= result_type
;
6100 isym
->ts
.is_c_interop
= 1;
6105 sym
->attr
.flavor
= FL_PROCEDURE
;
6106 sym
->attr
.intrinsic
= 1;
6108 sym
->module
= gfc_get_string (modname
);
6109 sym
->attr
.use_assoc
= 1;
6110 sym
->from_intmod
= module
;
6111 sym
->intmod_sym_id
= id
;
6115 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
6116 the current namespace for all named constants, pointer types, and
6117 procedures in the module unless the only clause was used or a rename
6118 list was provided. */
6121 import_iso_c_binding_module (void)
6123 gfc_symbol
*mod_sym
= NULL
, *return_type
;
6124 gfc_symtree
*mod_symtree
= NULL
, *tmp_symtree
;
6125 gfc_symtree
*c_ptr
= NULL
, *c_funptr
= NULL
;
6126 const char *iso_c_module_name
= "__iso_c_binding";
6129 bool want_c_ptr
= false, want_c_funptr
= false;
6131 /* Look only in the current namespace. */
6132 mod_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, iso_c_module_name
);
6134 if (mod_symtree
== NULL
)
6136 /* symtree doesn't already exist in current namespace. */
6137 gfc_get_sym_tree (iso_c_module_name
, gfc_current_ns
, &mod_symtree
,
6140 if (mod_symtree
!= NULL
)
6141 mod_sym
= mod_symtree
->n
.sym
;
6143 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
6144 "create symbol for %s", iso_c_module_name
);
6146 mod_sym
->attr
.flavor
= FL_MODULE
;
6147 mod_sym
->attr
.intrinsic
= 1;
6148 mod_sym
->module
= gfc_get_string (iso_c_module_name
);
6149 mod_sym
->from_intmod
= INTMOD_ISO_C_BINDING
;
6152 /* Check whether C_PTR or C_FUNPTR are in the include list, if so, load it;
6153 check also whether C_NULL_(FUN)PTR or C_(FUN)LOC are requested, which
6155 for (u
= gfc_rename_list
; u
; u
= u
->next
)
6157 if (strcmp (c_interop_kinds_table
[ISOCBINDING_NULL_PTR
].name
,
6160 else if (strcmp (c_interop_kinds_table
[ISOCBINDING_LOC
].name
,
6163 else if (strcmp (c_interop_kinds_table
[ISOCBINDING_NULL_FUNPTR
].name
,
6165 want_c_funptr
= true;
6166 else if (strcmp (c_interop_kinds_table
[ISOCBINDING_FUNLOC
].name
,
6168 want_c_funptr
= true;
6169 else if (strcmp (c_interop_kinds_table
[ISOCBINDING_PTR
].name
,
6172 c_ptr
= generate_isocbinding_symbol (iso_c_module_name
,
6173 (iso_c_binding_symbol
)
6175 u
->local_name
[0] ? u
->local_name
6179 else if (strcmp (c_interop_kinds_table
[ISOCBINDING_FUNPTR
].name
,
6183 = generate_isocbinding_symbol (iso_c_module_name
,
6184 (iso_c_binding_symbol
)
6186 u
->local_name
[0] ? u
->local_name
6192 if ((want_c_ptr
|| !only_flag
) && !c_ptr
)
6193 c_ptr
= generate_isocbinding_symbol (iso_c_module_name
,
6194 (iso_c_binding_symbol
)
6196 NULL
, NULL
, only_flag
);
6197 if ((want_c_funptr
|| !only_flag
) && !c_funptr
)
6198 c_funptr
= generate_isocbinding_symbol (iso_c_module_name
,
6199 (iso_c_binding_symbol
)
6201 NULL
, NULL
, only_flag
);
6203 /* Generate the symbols for the named constants representing
6204 the kinds for intrinsic data types. */
6205 for (i
= 0; i
< ISOCBINDING_NUMBER
; i
++)
6208 for (u
= gfc_rename_list
; u
; u
= u
->next
)
6209 if (strcmp (c_interop_kinds_table
[i
].name
, u
->use_name
) == 0)
6218 #define NAMED_FUNCTION(a,b,c,d) \
6220 not_in_std = (gfc_option.allow_std & d) == 0; \
6223 #define NAMED_SUBROUTINE(a,b,c,d) \
6225 not_in_std = (gfc_option.allow_std & d) == 0; \
6228 #define NAMED_INTCST(a,b,c,d) \
6230 not_in_std = (gfc_option.allow_std & d) == 0; \
6233 #define NAMED_REALCST(a,b,c,d) \
6235 not_in_std = (gfc_option.allow_std & d) == 0; \
6238 #define NAMED_CMPXCST(a,b,c,d) \
6240 not_in_std = (gfc_option.allow_std & d) == 0; \
6243 #include "iso-c-binding.def"
6251 gfc_error ("The symbol '%s', referenced at %L, is not "
6252 "in the selected standard", name
, &u
->where
);
6258 #define NAMED_FUNCTION(a,b,c,d) \
6260 if (a == ISOCBINDING_LOC) \
6261 return_type = c_ptr->n.sym; \
6262 else if (a == ISOCBINDING_FUNLOC) \
6263 return_type = c_funptr->n.sym; \
6265 return_type = NULL; \
6266 create_intrinsic_function (u->local_name[0] \
6267 ? u->local_name : u->use_name, \
6268 a, iso_c_module_name, \
6269 INTMOD_ISO_C_BINDING, false, \
6272 #define NAMED_SUBROUTINE(a,b,c,d) \
6274 create_intrinsic_function (u->local_name[0] ? u->local_name \
6276 a, iso_c_module_name, \
6277 INTMOD_ISO_C_BINDING, true, NULL); \
6279 #include "iso-c-binding.def"
6281 case ISOCBINDING_PTR
:
6282 case ISOCBINDING_FUNPTR
:
6283 /* Already handled above. */
6286 if (i
== ISOCBINDING_NULL_PTR
)
6287 tmp_symtree
= c_ptr
;
6288 else if (i
== ISOCBINDING_NULL_FUNPTR
)
6289 tmp_symtree
= c_funptr
;
6292 generate_isocbinding_symbol (iso_c_module_name
,
6293 (iso_c_binding_symbol
) i
,
6295 ? u
->local_name
: u
->use_name
,
6296 tmp_symtree
, false);
6300 if (!found
&& !only_flag
)
6302 /* Skip, if the symbol is not in the enabled standard. */
6305 #define NAMED_FUNCTION(a,b,c,d) \
6307 if ((gfc_option.allow_std & d) == 0) \
6310 #define NAMED_SUBROUTINE(a,b,c,d) \
6312 if ((gfc_option.allow_std & d) == 0) \
6315 #define NAMED_INTCST(a,b,c,d) \
6317 if ((gfc_option.allow_std & d) == 0) \
6320 #define NAMED_REALCST(a,b,c,d) \
6322 if ((gfc_option.allow_std & d) == 0) \
6325 #define NAMED_CMPXCST(a,b,c,d) \
6327 if ((gfc_option.allow_std & d) == 0) \
6330 #include "iso-c-binding.def"
6332 ; /* Not GFC_STD_* versioned. */
6337 #define NAMED_FUNCTION(a,b,c,d) \
6339 if (a == ISOCBINDING_LOC) \
6340 return_type = c_ptr->n.sym; \
6341 else if (a == ISOCBINDING_FUNLOC) \
6342 return_type = c_funptr->n.sym; \
6344 return_type = NULL; \
6345 create_intrinsic_function (b, a, iso_c_module_name, \
6346 INTMOD_ISO_C_BINDING, false, \
6349 #define NAMED_SUBROUTINE(a,b,c,d) \
6351 create_intrinsic_function (b, a, iso_c_module_name, \
6352 INTMOD_ISO_C_BINDING, true, NULL); \
6354 #include "iso-c-binding.def"
6356 case ISOCBINDING_PTR
:
6357 case ISOCBINDING_FUNPTR
:
6358 /* Already handled above. */
6361 if (i
== ISOCBINDING_NULL_PTR
)
6362 tmp_symtree
= c_ptr
;
6363 else if (i
== ISOCBINDING_NULL_FUNPTR
)
6364 tmp_symtree
= c_funptr
;
6367 generate_isocbinding_symbol (iso_c_module_name
,
6368 (iso_c_binding_symbol
) i
, NULL
,
6369 tmp_symtree
, false);
6374 for (u
= gfc_rename_list
; u
; u
= u
->next
)
6379 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6380 "module ISO_C_BINDING", u
->use_name
, &u
->where
);
6385 /* Add an integer named constant from a given module. */
6388 create_int_parameter (const char *name
, int value
, const char *modname
,
6389 intmod_id module
, int id
)
6391 gfc_symtree
*tmp_symtree
;
6394 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
6395 if (tmp_symtree
!= NULL
)
6397 if (strcmp (modname
, tmp_symtree
->n
.sym
->module
) == 0)
6400 gfc_error ("Symbol '%s' already declared", name
);
6403 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp_symtree
, false);
6404 sym
= tmp_symtree
->n
.sym
;
6406 sym
->module
= gfc_get_string (modname
);
6407 sym
->attr
.flavor
= FL_PARAMETER
;
6408 sym
->ts
.type
= BT_INTEGER
;
6409 sym
->ts
.kind
= gfc_default_integer_kind
;
6410 sym
->value
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, value
);
6411 sym
->attr
.use_assoc
= 1;
6412 sym
->from_intmod
= module
;
6413 sym
->intmod_sym_id
= id
;
6417 /* Value is already contained by the array constructor, but not
6421 create_int_parameter_array (const char *name
, int size
, gfc_expr
*value
,
6422 const char *modname
, intmod_id module
, int id
)
6424 gfc_symtree
*tmp_symtree
;
6427 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
6428 if (tmp_symtree
!= NULL
)
6430 if (strcmp (modname
, tmp_symtree
->n
.sym
->module
) == 0)
6433 gfc_error ("Symbol '%s' already declared", name
);
6436 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp_symtree
, false);
6437 sym
= tmp_symtree
->n
.sym
;
6439 sym
->module
= gfc_get_string (modname
);
6440 sym
->attr
.flavor
= FL_PARAMETER
;
6441 sym
->ts
.type
= BT_INTEGER
;
6442 sym
->ts
.kind
= gfc_default_integer_kind
;
6443 sym
->attr
.use_assoc
= 1;
6444 sym
->from_intmod
= module
;
6445 sym
->intmod_sym_id
= id
;
6446 sym
->attr
.dimension
= 1;
6447 sym
->as
= gfc_get_array_spec ();
6449 sym
->as
->type
= AS_EXPLICIT
;
6450 sym
->as
->lower
[0] = gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 1);
6451 sym
->as
->upper
[0] = gfc_get_int_expr (gfc_default_integer_kind
, NULL
, size
);
6454 sym
->value
->shape
= gfc_get_shape (1);
6455 mpz_init_set_ui (sym
->value
->shape
[0], size
);
6459 /* Add an derived type for a given module. */
6462 create_derived_type (const char *name
, const char *modname
,
6463 intmod_id module
, int id
)
6465 gfc_symtree
*tmp_symtree
;
6466 gfc_symbol
*sym
, *dt_sym
;
6467 gfc_interface
*intr
, *head
;
6469 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
6470 if (tmp_symtree
!= NULL
)
6472 if (strcmp (modname
, tmp_symtree
->n
.sym
->module
) == 0)
6475 gfc_error ("Symbol '%s' already declared", name
);
6478 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp_symtree
, false);
6479 sym
= tmp_symtree
->n
.sym
;
6480 sym
->module
= gfc_get_string (modname
);
6481 sym
->from_intmod
= module
;
6482 sym
->intmod_sym_id
= id
;
6483 sym
->attr
.flavor
= FL_PROCEDURE
;
6484 sym
->attr
.function
= 1;
6485 sym
->attr
.generic
= 1;
6487 gfc_get_sym_tree (dt_upper_string (sym
->name
),
6488 gfc_current_ns
, &tmp_symtree
, false);
6489 dt_sym
= tmp_symtree
->n
.sym
;
6490 dt_sym
->name
= gfc_get_string (sym
->name
);
6491 dt_sym
->attr
.flavor
= FL_DERIVED
;
6492 dt_sym
->attr
.private_comp
= 1;
6493 dt_sym
->attr
.zero_comp
= 1;
6494 dt_sym
->attr
.use_assoc
= 1;
6495 dt_sym
->module
= gfc_get_string (modname
);
6496 dt_sym
->from_intmod
= module
;
6497 dt_sym
->intmod_sym_id
= id
;
6499 head
= sym
->generic
;
6500 intr
= gfc_get_interface ();
6502 intr
->where
= gfc_current_locus
;
6504 sym
->generic
= intr
;
6505 sym
->attr
.if_source
= IFSRC_DECL
;
6509 /* Read the contents of the module file into a temporary buffer. */
6512 read_module_to_tmpbuf ()
6514 /* We don't know the uncompressed size, so enlarge the buffer as
6520 module_content
= XNEWVEC (char, cursz
);
6524 int nread
= gzread (module_fp
, module_content
+ len
, rsize
);
6529 module_content
= XRESIZEVEC (char, module_content
, cursz
);
6530 rsize
= cursz
- len
;
6533 module_content
= XRESIZEVEC (char, module_content
, len
+ 1);
6534 module_content
[len
] = '\0';
6540 /* USE the ISO_FORTRAN_ENV intrinsic module. */
6543 use_iso_fortran_env_module (void)
6545 static char mod
[] = "iso_fortran_env";
6547 gfc_symbol
*mod_sym
;
6548 gfc_symtree
*mod_symtree
;
6552 intmod_sym symbol
[] = {
6553 #define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
6554 #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d },
6555 #define NAMED_DERIVED_TYPE(a,b,c,d) { a, b, 0, d },
6556 #define NAMED_FUNCTION(a,b,c,d) { a, b, c, d },
6557 #define NAMED_SUBROUTINE(a,b,c,d) { a, b, c, d },
6558 #include "iso-fortran-env.def"
6559 { ISOFORTRANENV_INVALID
, NULL
, -1234, 0 } };
6562 #define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
6563 #include "iso-fortran-env.def"
6565 /* Generate the symbol for the module itself. */
6566 mod_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, mod
);
6567 if (mod_symtree
== NULL
)
6569 gfc_get_sym_tree (mod
, gfc_current_ns
, &mod_symtree
, false);
6570 gcc_assert (mod_symtree
);
6571 mod_sym
= mod_symtree
->n
.sym
;
6573 mod_sym
->attr
.flavor
= FL_MODULE
;
6574 mod_sym
->attr
.intrinsic
= 1;
6575 mod_sym
->module
= gfc_get_string (mod
);
6576 mod_sym
->from_intmod
= INTMOD_ISO_FORTRAN_ENV
;
6579 if (!mod_symtree
->n
.sym
->attr
.intrinsic
)
6580 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
6581 "non-intrinsic module name used previously", mod
);
6583 /* Generate the symbols for the module integer named constants. */
6585 for (i
= 0; symbol
[i
].name
; i
++)
6588 for (u
= gfc_rename_list
; u
; u
= u
->next
)
6590 if (strcmp (symbol
[i
].name
, u
->use_name
) == 0)
6595 if (!gfc_notify_std (symbol
[i
].standard
, "The symbol '%s', "
6596 "referenced at %L, is not in the selected "
6597 "standard", symbol
[i
].name
, &u
->where
))
6600 if ((gfc_option
.flag_default_integer
|| gfc_option
.flag_default_real
)
6601 && symbol
[i
].id
== ISOFORTRANENV_NUMERIC_STORAGE_SIZE
)
6602 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
6603 "constant from intrinsic module "
6604 "ISO_FORTRAN_ENV at %L is incompatible with "
6605 "option %s", &u
->where
,
6606 gfc_option
.flag_default_integer
6607 ? "-fdefault-integer-8"
6608 : "-fdefault-real-8");
6609 switch (symbol
[i
].id
)
6611 #define NAMED_INTCST(a,b,c,d) \
6613 #include "iso-fortran-env.def"
6614 create_int_parameter (u
->local_name
[0] ? u
->local_name
6616 symbol
[i
].value
, mod
,
6617 INTMOD_ISO_FORTRAN_ENV
, symbol
[i
].id
);
6620 #define NAMED_KINDARRAY(a,b,KINDS,d) \
6622 expr = gfc_get_array_expr (BT_INTEGER, \
6623 gfc_default_integer_kind,\
6625 for (j = 0; KINDS[j].kind != 0; j++) \
6626 gfc_constructor_append_expr (&expr->value.constructor, \
6627 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
6628 KINDS[j].kind), NULL); \
6629 create_int_parameter_array (u->local_name[0] ? u->local_name \
6632 INTMOD_ISO_FORTRAN_ENV, \
6635 #include "iso-fortran-env.def"
6637 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
6639 #include "iso-fortran-env.def"
6640 create_derived_type (u
->local_name
[0] ? u
->local_name
6642 mod
, INTMOD_ISO_FORTRAN_ENV
,
6646 #define NAMED_FUNCTION(a,b,c,d) \
6648 #include "iso-fortran-env.def"
6649 create_intrinsic_function (u
->local_name
[0] ? u
->local_name
6652 INTMOD_ISO_FORTRAN_ENV
, false,
6662 if (!found
&& !only_flag
)
6664 if ((gfc_option
.allow_std
& symbol
[i
].standard
) == 0)
6667 if ((gfc_option
.flag_default_integer
|| gfc_option
.flag_default_real
)
6668 && symbol
[i
].id
== ISOFORTRANENV_NUMERIC_STORAGE_SIZE
)
6669 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
6670 "from intrinsic module ISO_FORTRAN_ENV at %C is "
6671 "incompatible with option %s",
6672 gfc_option
.flag_default_integer
6673 ? "-fdefault-integer-8" : "-fdefault-real-8");
6675 switch (symbol
[i
].id
)
6677 #define NAMED_INTCST(a,b,c,d) \
6679 #include "iso-fortran-env.def"
6680 create_int_parameter (symbol
[i
].name
, symbol
[i
].value
, mod
,
6681 INTMOD_ISO_FORTRAN_ENV
, symbol
[i
].id
);
6684 #define NAMED_KINDARRAY(a,b,KINDS,d) \
6686 expr = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, \
6688 for (j = 0; KINDS[j].kind != 0; j++) \
6689 gfc_constructor_append_expr (&expr->value.constructor, \
6690 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
6691 KINDS[j].kind), NULL); \
6692 create_int_parameter_array (symbol[i].name, j, expr, mod, \
6693 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);\
6695 #include "iso-fortran-env.def"
6697 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
6699 #include "iso-fortran-env.def"
6700 create_derived_type (symbol
[i
].name
, mod
, INTMOD_ISO_FORTRAN_ENV
,
6704 #define NAMED_FUNCTION(a,b,c,d) \
6706 #include "iso-fortran-env.def"
6707 create_intrinsic_function (symbol
[i
].name
, symbol
[i
].id
, mod
,
6708 INTMOD_ISO_FORTRAN_ENV
, false,
6718 for (u
= gfc_rename_list
; u
; u
= u
->next
)
6723 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6724 "module ISO_FORTRAN_ENV", u
->use_name
, &u
->where
);
6729 /* Process a USE directive. */
6732 gfc_use_module (gfc_use_list
*module
)
6737 gfc_symtree
*mod_symtree
;
6738 gfc_use_list
*use_stmt
;
6739 locus old_locus
= gfc_current_locus
;
6741 gfc_current_locus
= module
->where
;
6742 module_name
= module
->module_name
;
6743 gfc_rename_list
= module
->rename
;
6744 only_flag
= module
->only_flag
;
6745 current_intmod
= INTMOD_NONE
;
6747 if (!only_flag
&& gfc_option
.warn_use_without_only
)
6748 gfc_warning_now ("USE statement at %C has no ONLY qualifier");
6750 filename
= XALLOCAVEC (char, strlen (module_name
) + strlen (MODULE_EXTENSION
)
6752 strcpy (filename
, module_name
);
6753 strcat (filename
, MODULE_EXTENSION
);
6755 /* First, try to find an non-intrinsic module, unless the USE statement
6756 specified that the module is intrinsic. */
6758 if (!module
->intrinsic
)
6759 module_fp
= gzopen_included_file (filename
, true, true);
6761 /* Then, see if it's an intrinsic one, unless the USE statement
6762 specified that the module is non-intrinsic. */
6763 if (module_fp
== NULL
&& !module
->non_intrinsic
)
6765 if (strcmp (module_name
, "iso_fortran_env") == 0
6766 && gfc_notify_std (GFC_STD_F2003
, "ISO_FORTRAN_ENV "
6767 "intrinsic module at %C"))
6769 use_iso_fortran_env_module ();
6770 free_rename (module
->rename
);
6771 module
->rename
= NULL
;
6772 gfc_current_locus
= old_locus
;
6773 module
->intrinsic
= true;
6777 if (strcmp (module_name
, "iso_c_binding") == 0
6778 && gfc_notify_std (GFC_STD_F2003
, "ISO_C_BINDING module at %C"))
6780 import_iso_c_binding_module();
6781 free_rename (module
->rename
);
6782 module
->rename
= NULL
;
6783 gfc_current_locus
= old_locus
;
6784 module
->intrinsic
= true;
6788 module_fp
= gzopen_intrinsic_module (filename
);
6790 if (module_fp
== NULL
&& module
->intrinsic
)
6791 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
6794 /* Check for the IEEE modules, so we can mark their symbols
6795 accordingly when we read them. */
6796 if (strcmp (module_name
, "ieee_features") == 0
6797 && gfc_notify_std (GFC_STD_F2003
, "IEEE_FEATURES module at %C"))
6799 current_intmod
= INTMOD_IEEE_FEATURES
;
6801 else if (strcmp (module_name
, "ieee_exceptions") == 0
6802 && gfc_notify_std (GFC_STD_F2003
,
6803 "IEEE_EXCEPTIONS module at %C"))
6805 current_intmod
= INTMOD_IEEE_EXCEPTIONS
;
6807 else if (strcmp (module_name
, "ieee_arithmetic") == 0
6808 && gfc_notify_std (GFC_STD_F2003
,
6809 "IEEE_ARITHMETIC module at %C"))
6811 current_intmod
= INTMOD_IEEE_ARITHMETIC
;
6815 if (module_fp
== NULL
)
6816 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6817 filename
, xstrerror (errno
));
6819 /* Check that we haven't already USEd an intrinsic module with the
6822 mod_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, module_name
);
6823 if (mod_symtree
&& mod_symtree
->n
.sym
->attr
.intrinsic
)
6824 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
6825 "intrinsic module name used previously", module_name
);
6832 read_module_to_tmpbuf ();
6833 gzclose (module_fp
);
6835 /* Skip the first line of the module, after checking that this is
6836 a gfortran module file. */
6842 bad_module ("Unexpected end of module");
6845 if ((start
== 1 && strcmp (atom_name
, "GFORTRAN") != 0)
6846 || (start
== 2 && strcmp (atom_name
, " module") != 0))
6847 gfc_fatal_error ("File '%s' opened at %C is not a GNU Fortran"
6848 " module file", filename
);
6851 if (strcmp (atom_name
, " version") != 0
6852 || module_char () != ' '
6853 || parse_atom () != ATOM_STRING
6854 || strcmp (atom_string
, MOD_VERSION
))
6855 gfc_fatal_error ("Cannot read module file '%s' opened at %C,"
6856 " because it was created by a different"
6857 " version of GNU Fortran", filename
);
6866 /* Make sure we're not reading the same module that we may be building. */
6867 for (p
= gfc_state_stack
; p
; p
= p
->previous
)
6868 if (p
->state
== COMP_MODULE
&& strcmp (p
->sym
->name
, module_name
) == 0)
6869 gfc_fatal_error ("Can't USE the same module we're building!");
6872 init_true_name_tree ();
6876 free_true_name (true_name_root
);
6877 true_name_root
= NULL
;
6879 free_pi_tree (pi_root
);
6882 XDELETEVEC (module_content
);
6883 module_content
= NULL
;
6885 use_stmt
= gfc_get_use_list ();
6886 *use_stmt
= *module
;
6887 use_stmt
->next
= gfc_current_ns
->use_stmts
;
6888 gfc_current_ns
->use_stmts
= use_stmt
;
6890 gfc_current_locus
= old_locus
;
6894 /* Remove duplicated intrinsic operators from the rename list. */
6897 rename_list_remove_duplicate (gfc_use_rename
*list
)
6899 gfc_use_rename
*seek
, *last
;
6901 for (; list
; list
= list
->next
)
6902 if (list
->op
!= INTRINSIC_USER
&& list
->op
!= INTRINSIC_NONE
)
6905 for (seek
= list
->next
; seek
; seek
= last
->next
)
6907 if (list
->op
== seek
->op
)
6909 last
->next
= seek
->next
;
6919 /* Process all USE directives. */
6922 gfc_use_modules (void)
6924 gfc_use_list
*next
, *seek
, *last
;
6926 for (next
= module_list
; next
; next
= next
->next
)
6928 bool non_intrinsic
= next
->non_intrinsic
;
6929 bool intrinsic
= next
->intrinsic
;
6930 bool neither
= !non_intrinsic
&& !intrinsic
;
6932 for (seek
= next
->next
; seek
; seek
= seek
->next
)
6934 if (next
->module_name
!= seek
->module_name
)
6937 if (seek
->non_intrinsic
)
6938 non_intrinsic
= true;
6939 else if (seek
->intrinsic
)
6945 if (intrinsic
&& neither
&& !non_intrinsic
)
6950 filename
= XALLOCAVEC (char,
6951 strlen (next
->module_name
)
6952 + strlen (MODULE_EXTENSION
) + 1);
6953 strcpy (filename
, next
->module_name
);
6954 strcat (filename
, MODULE_EXTENSION
);
6955 fp
= gfc_open_included_file (filename
, true, true);
6958 non_intrinsic
= true;
6964 for (seek
= next
->next
; seek
; seek
= last
->next
)
6966 if (next
->module_name
!= seek
->module_name
)
6972 if ((!next
->intrinsic
&& !seek
->intrinsic
)
6973 || (next
->intrinsic
&& seek
->intrinsic
)
6976 if (!seek
->only_flag
)
6977 next
->only_flag
= false;
6980 gfc_use_rename
*r
= seek
->rename
;
6983 r
->next
= next
->rename
;
6984 next
->rename
= seek
->rename
;
6986 last
->next
= seek
->next
;
6994 for (; module_list
; module_list
= next
)
6996 next
= module_list
->next
;
6997 rename_list_remove_duplicate (module_list
->rename
);
6998 gfc_use_module (module_list
);
7001 gfc_rename_list
= NULL
;
7006 gfc_free_use_stmts (gfc_use_list
*use_stmts
)
7009 for (; use_stmts
; use_stmts
= next
)
7011 gfc_use_rename
*next_rename
;
7013 for (; use_stmts
->rename
; use_stmts
->rename
= next_rename
)
7015 next_rename
= use_stmts
->rename
->next
;
7016 free (use_stmts
->rename
);
7018 next
= use_stmts
->next
;
7025 gfc_module_init_2 (void)
7027 last_atom
= ATOM_LPAREN
;
7028 gfc_rename_list
= NULL
;
7034 gfc_module_done_2 (void)
7036 free_rename (gfc_rename_list
);
7037 gfc_rename_list
= NULL
;