]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/fortran/module.c
re PR fortran/47203 (USE of module with same name as SUBROUTINE not reject, but also...
[thirdparty/gcc.git] / gcc / fortran / module.c
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 2009, 2010, 2011, 2012
5 Free Software Foundation, Inc.
6 Contributed by Andy Vaught
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
23
24 /* The syntax of gfortran modules resembles that of lisp lists, i.e. a
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
31
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
36
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
39 ...
40 )
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42 ...
43 )
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45 ...
46 )
47 ( ( <common name> <symbol> <saved flag>)
48 ...
49 )
50
51 ( equivalence list )
52
53 ( <Symbol Number (in no particular order)>
54 <True name of symbol>
55 <Module name of symbol>
56 ( <symbol information> )
57 ...
58 )
59 ( <Symtree name>
60 <Ambiguous flag>
61 <Symbol number>
62 ...
63 )
64
65 In general, symbols refer to other symbols by their symbol number,
66 which are zero based. Symbols are written to the module in no
67 particular order. */
68
69 #include "config.h"
70 #include "system.h"
71 #include "coretypes.h"
72 #include "gfortran.h"
73 #include "arith.h"
74 #include "match.h"
75 #include "parse.h" /* FIXME */
76 #include "md5.h"
77 #include "constructor.h"
78 #include "cpp.h"
79 #include "tree.h"
80
81 #define MODULE_EXTENSION ".mod"
82
83 /* Don't put any single quote (') in MOD_VERSION,
84 if yout want it to be recognized. */
85 #define MOD_VERSION "9"
86
87
88 /* Structure that describes a position within a module file. */
89
90 typedef struct
91 {
92 int column, line;
93 fpos_t pos;
94 }
95 module_locus;
96
97 /* Structure for list of symbols of intrinsic modules. */
98 typedef struct
99 {
100 int id;
101 const char *name;
102 int value;
103 int standard;
104 }
105 intmod_sym;
106
107
108 typedef enum
109 {
110 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
111 }
112 pointer_t;
113
114 /* The fixup structure lists pointers to pointers that have to
115 be updated when a pointer value becomes known. */
116
117 typedef struct fixup_t
118 {
119 void **pointer;
120 struct fixup_t *next;
121 }
122 fixup_t;
123
124
125 /* Structure for holding extra info needed for pointers being read. */
126
127 enum gfc_rsym_state
128 {
129 UNUSED,
130 NEEDED,
131 USED
132 };
133
134 enum gfc_wsym_state
135 {
136 UNREFERENCED = 0,
137 NEEDS_WRITE,
138 WRITTEN
139 };
140
141 typedef struct pointer_info
142 {
143 BBT_HEADER (pointer_info);
144 int integer;
145 pointer_t type;
146
147 /* The first component of each member of the union is the pointer
148 being stored. */
149
150 fixup_t *fixup;
151
152 union
153 {
154 void *pointer; /* Member for doing pointer searches. */
155
156 struct
157 {
158 gfc_symbol *sym;
159 char *true_name, *module, *binding_label;
160 fixup_t *stfixup;
161 gfc_symtree *symtree;
162 enum gfc_rsym_state state;
163 int ns, referenced, renamed;
164 module_locus where;
165 }
166 rsym;
167
168 struct
169 {
170 gfc_symbol *sym;
171 enum gfc_wsym_state state;
172 }
173 wsym;
174 }
175 u;
176
177 }
178 pointer_info;
179
180 #define gfc_get_pointer_info() XCNEW (pointer_info)
181
182
183 /* Local variables */
184
185 /* The FILE for the module we're reading or writing. */
186 static FILE *module_fp;
187
188 /* MD5 context structure. */
189 static struct md5_ctx ctx;
190
191 /* The name of the module we're reading (USE'ing) or writing. */
192 static const char *module_name;
193 static gfc_use_list *module_list;
194
195 static int module_line, module_column, only_flag;
196 static int prev_module_line, prev_module_column, prev_character;
197
198 static enum
199 { IO_INPUT, IO_OUTPUT }
200 iomode;
201
202 static gfc_use_rename *gfc_rename_list;
203 static pointer_info *pi_root;
204 static int symbol_number; /* Counter for assigning symbol numbers */
205
206 /* Tells mio_expr_ref to make symbols for unused equivalence members. */
207 static bool in_load_equiv;
208
209
210
211 /*****************************************************************/
212
213 /* Pointer/integer conversion. Pointers between structures are stored
214 as integers in the module file. The next couple of subroutines
215 handle this translation for reading and writing. */
216
217 /* Recursively free the tree of pointer structures. */
218
219 static void
220 free_pi_tree (pointer_info *p)
221 {
222 if (p == NULL)
223 return;
224
225 if (p->fixup != NULL)
226 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
227
228 free_pi_tree (p->left);
229 free_pi_tree (p->right);
230
231 if (iomode == IO_INPUT)
232 {
233 XDELETEVEC (p->u.rsym.true_name);
234 XDELETEVEC (p->u.rsym.module);
235 XDELETEVEC (p->u.rsym.binding_label);
236 }
237
238 free (p);
239 }
240
241
242 /* Compare pointers when searching by pointer. Used when writing a
243 module. */
244
245 static int
246 compare_pointers (void *_sn1, void *_sn2)
247 {
248 pointer_info *sn1, *sn2;
249
250 sn1 = (pointer_info *) _sn1;
251 sn2 = (pointer_info *) _sn2;
252
253 if (sn1->u.pointer < sn2->u.pointer)
254 return -1;
255 if (sn1->u.pointer > sn2->u.pointer)
256 return 1;
257
258 return 0;
259 }
260
261
262 /* Compare integers when searching by integer. Used when reading a
263 module. */
264
265 static int
266 compare_integers (void *_sn1, void *_sn2)
267 {
268 pointer_info *sn1, *sn2;
269
270 sn1 = (pointer_info *) _sn1;
271 sn2 = (pointer_info *) _sn2;
272
273 if (sn1->integer < sn2->integer)
274 return -1;
275 if (sn1->integer > sn2->integer)
276 return 1;
277
278 return 0;
279 }
280
281
282 /* Initialize the pointer_info tree. */
283
284 static void
285 init_pi_tree (void)
286 {
287 compare_fn compare;
288 pointer_info *p;
289
290 pi_root = NULL;
291 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
292
293 /* Pointer 0 is the NULL pointer. */
294 p = gfc_get_pointer_info ();
295 p->u.pointer = NULL;
296 p->integer = 0;
297 p->type = P_OTHER;
298
299 gfc_insert_bbt (&pi_root, p, compare);
300
301 /* Pointer 1 is the current namespace. */
302 p = gfc_get_pointer_info ();
303 p->u.pointer = gfc_current_ns;
304 p->integer = 1;
305 p->type = P_NAMESPACE;
306
307 gfc_insert_bbt (&pi_root, p, compare);
308
309 symbol_number = 2;
310 }
311
312
313 /* During module writing, call here with a pointer to something,
314 returning the pointer_info node. */
315
316 static pointer_info *
317 find_pointer (void *gp)
318 {
319 pointer_info *p;
320
321 p = pi_root;
322 while (p != NULL)
323 {
324 if (p->u.pointer == gp)
325 break;
326 p = (gp < p->u.pointer) ? p->left : p->right;
327 }
328
329 return p;
330 }
331
332
333 /* Given a pointer while writing, returns the pointer_info tree node,
334 creating it if it doesn't exist. */
335
336 static pointer_info *
337 get_pointer (void *gp)
338 {
339 pointer_info *p;
340
341 p = find_pointer (gp);
342 if (p != NULL)
343 return p;
344
345 /* Pointer doesn't have an integer. Give it one. */
346 p = gfc_get_pointer_info ();
347
348 p->u.pointer = gp;
349 p->integer = symbol_number++;
350
351 gfc_insert_bbt (&pi_root, p, compare_pointers);
352
353 return p;
354 }
355
356
357 /* Given an integer during reading, find it in the pointer_info tree,
358 creating the node if not found. */
359
360 static pointer_info *
361 get_integer (int integer)
362 {
363 pointer_info *p, t;
364 int c;
365
366 t.integer = integer;
367
368 p = pi_root;
369 while (p != NULL)
370 {
371 c = compare_integers (&t, p);
372 if (c == 0)
373 break;
374
375 p = (c < 0) ? p->left : p->right;
376 }
377
378 if (p != NULL)
379 return p;
380
381 p = gfc_get_pointer_info ();
382 p->integer = integer;
383 p->u.pointer = NULL;
384
385 gfc_insert_bbt (&pi_root, p, compare_integers);
386
387 return p;
388 }
389
390
391 /* Recursive function to find a pointer within a tree by brute force. */
392
393 static pointer_info *
394 fp2 (pointer_info *p, const void *target)
395 {
396 pointer_info *q;
397
398 if (p == NULL)
399 return NULL;
400
401 if (p->u.pointer == target)
402 return p;
403
404 q = fp2 (p->left, target);
405 if (q != NULL)
406 return q;
407
408 return fp2 (p->right, target);
409 }
410
411
412 /* During reading, find a pointer_info node from the pointer value.
413 This amounts to a brute-force search. */
414
415 static pointer_info *
416 find_pointer2 (void *p)
417 {
418 return fp2 (pi_root, p);
419 }
420
421
422 /* Resolve any fixups using a known pointer. */
423
424 static void
425 resolve_fixups (fixup_t *f, void *gp)
426 {
427 fixup_t *next;
428
429 for (; f; f = next)
430 {
431 next = f->next;
432 *(f->pointer) = gp;
433 free (f);
434 }
435 }
436
437
438 /* Convert a string such that it starts with a lower-case character. Used
439 to convert the symtree name of a derived-type to the symbol name or to
440 the name of the associated generic function. */
441
442 static const char *
443 dt_lower_string (const char *name)
444 {
445 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
446 return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name[0]),
447 &name[1]);
448 return gfc_get_string (name);
449 }
450
451
452 /* Convert a string such that it starts with an upper-case character. Used to
453 return the symtree-name for a derived type; the symbol name itself and the
454 symtree/symbol name of the associated generic function start with a lower-
455 case character. */
456
457 static const char *
458 dt_upper_string (const char *name)
459 {
460 if (name[0] != (char) TOUPPER ((unsigned char) name[0]))
461 return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name[0]),
462 &name[1]);
463 return gfc_get_string (name);
464 }
465
466 /* Call here during module reading when we know what pointer to
467 associate with an integer. Any fixups that exist are resolved at
468 this time. */
469
470 static void
471 associate_integer_pointer (pointer_info *p, void *gp)
472 {
473 if (p->u.pointer != NULL)
474 gfc_internal_error ("associate_integer_pointer(): Already associated");
475
476 p->u.pointer = gp;
477
478 resolve_fixups (p->fixup, gp);
479
480 p->fixup = NULL;
481 }
482
483
484 /* During module reading, given an integer and a pointer to a pointer,
485 either store the pointer from an already-known value or create a
486 fixup structure in order to store things later. Returns zero if
487 the reference has been actually stored, or nonzero if the reference
488 must be fixed later (i.e., associate_integer_pointer must be called
489 sometime later. Returns the pointer_info structure. */
490
491 static pointer_info *
492 add_fixup (int integer, void *gp)
493 {
494 pointer_info *p;
495 fixup_t *f;
496 char **cp;
497
498 p = get_integer (integer);
499
500 if (p->integer == 0 || p->u.pointer != NULL)
501 {
502 cp = (char **) gp;
503 *cp = (char *) p->u.pointer;
504 }
505 else
506 {
507 f = XCNEW (fixup_t);
508
509 f->next = p->fixup;
510 p->fixup = f;
511
512 f->pointer = (void **) gp;
513 }
514
515 return p;
516 }
517
518
519 /*****************************************************************/
520
521 /* Parser related subroutines */
522
523 /* Free the rename list left behind by a USE statement. */
524
525 static void
526 free_rename (gfc_use_rename *list)
527 {
528 gfc_use_rename *next;
529
530 for (; list; list = next)
531 {
532 next = list->next;
533 free (list);
534 }
535 }
536
537
538 /* Match a USE statement. */
539
540 match
541 gfc_match_use (void)
542 {
543 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
544 gfc_use_rename *tail = NULL, *new_use;
545 interface_type type, type2;
546 gfc_intrinsic_op op;
547 match m;
548 gfc_use_list *use_list;
549
550 use_list = gfc_get_use_list ();
551
552 if (gfc_match (" , ") == MATCH_YES)
553 {
554 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
555 {
556 if (gfc_notify_std (GFC_STD_F2003, "module "
557 "nature in USE statement at %C") == FAILURE)
558 goto cleanup;
559
560 if (strcmp (module_nature, "intrinsic") == 0)
561 use_list->intrinsic = true;
562 else
563 {
564 if (strcmp (module_nature, "non_intrinsic") == 0)
565 use_list->non_intrinsic = true;
566 else
567 {
568 gfc_error ("Module nature in USE statement at %C shall "
569 "be either INTRINSIC or NON_INTRINSIC");
570 goto cleanup;
571 }
572 }
573 }
574 else
575 {
576 /* Help output a better error message than "Unclassifiable
577 statement". */
578 gfc_match (" %n", module_nature);
579 if (strcmp (module_nature, "intrinsic") == 0
580 || strcmp (module_nature, "non_intrinsic") == 0)
581 gfc_error ("\"::\" was expected after module nature at %C "
582 "but was not found");
583 free (use_list);
584 return m;
585 }
586 }
587 else
588 {
589 m = gfc_match (" ::");
590 if (m == MATCH_YES &&
591 gfc_notify_std (GFC_STD_F2003,
592 "\"USE :: module\" at %C") == FAILURE)
593 goto cleanup;
594
595 if (m != MATCH_YES)
596 {
597 m = gfc_match ("% ");
598 if (m != MATCH_YES)
599 {
600 free (use_list);
601 return m;
602 }
603 }
604 }
605
606 use_list->where = gfc_current_locus;
607
608 m = gfc_match_name (name);
609 if (m != MATCH_YES)
610 {
611 free (use_list);
612 return m;
613 }
614
615 use_list->module_name = gfc_get_string (name);
616
617 if (gfc_match_eos () == MATCH_YES)
618 goto done;
619
620 if (gfc_match_char (',') != MATCH_YES)
621 goto syntax;
622
623 if (gfc_match (" only :") == MATCH_YES)
624 use_list->only_flag = true;
625
626 if (gfc_match_eos () == MATCH_YES)
627 goto done;
628
629 for (;;)
630 {
631 /* Get a new rename struct and add it to the rename list. */
632 new_use = gfc_get_use_rename ();
633 new_use->where = gfc_current_locus;
634 new_use->found = 0;
635
636 if (use_list->rename == NULL)
637 use_list->rename = new_use;
638 else
639 tail->next = new_use;
640 tail = new_use;
641
642 /* See what kind of interface we're dealing with. Assume it is
643 not an operator. */
644 new_use->op = INTRINSIC_NONE;
645 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
646 goto cleanup;
647
648 switch (type)
649 {
650 case INTERFACE_NAMELESS:
651 gfc_error ("Missing generic specification in USE statement at %C");
652 goto cleanup;
653
654 case INTERFACE_USER_OP:
655 case INTERFACE_GENERIC:
656 m = gfc_match (" =>");
657
658 if (type == INTERFACE_USER_OP && m == MATCH_YES
659 && (gfc_notify_std (GFC_STD_F2003, "Renaming "
660 "operators in USE statements at %C")
661 == FAILURE))
662 goto cleanup;
663
664 if (type == INTERFACE_USER_OP)
665 new_use->op = INTRINSIC_USER;
666
667 if (use_list->only_flag)
668 {
669 if (m != MATCH_YES)
670 strcpy (new_use->use_name, name);
671 else
672 {
673 strcpy (new_use->local_name, name);
674 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
675 if (type != type2)
676 goto syntax;
677 if (m == MATCH_NO)
678 goto syntax;
679 if (m == MATCH_ERROR)
680 goto cleanup;
681 }
682 }
683 else
684 {
685 if (m != MATCH_YES)
686 goto syntax;
687 strcpy (new_use->local_name, name);
688
689 m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
690 if (type != type2)
691 goto syntax;
692 if (m == MATCH_NO)
693 goto syntax;
694 if (m == MATCH_ERROR)
695 goto cleanup;
696 }
697
698 if (strcmp (new_use->use_name, use_list->module_name) == 0
699 || strcmp (new_use->local_name, use_list->module_name) == 0)
700 {
701 gfc_error ("The name '%s' at %C has already been used as "
702 "an external module name.", use_list->module_name);
703 goto cleanup;
704 }
705 break;
706
707 case INTERFACE_INTRINSIC_OP:
708 new_use->op = op;
709 break;
710
711 default:
712 gcc_unreachable ();
713 }
714
715 if (gfc_match_eos () == MATCH_YES)
716 break;
717 if (gfc_match_char (',') != MATCH_YES)
718 goto syntax;
719 }
720
721 done:
722 if (module_list)
723 {
724 gfc_use_list *last = module_list;
725 while (last->next)
726 last = last->next;
727 last->next = use_list;
728 }
729 else
730 module_list = use_list;
731
732 return MATCH_YES;
733
734 syntax:
735 gfc_syntax_error (ST_USE);
736
737 cleanup:
738 free_rename (use_list->rename);
739 free (use_list);
740 return MATCH_ERROR;
741 }
742
743
744 /* Given a name and a number, inst, return the inst name
745 under which to load this symbol. Returns NULL if this
746 symbol shouldn't be loaded. If inst is zero, returns
747 the number of instances of this name. If interface is
748 true, a user-defined operator is sought, otherwise only
749 non-operators are sought. */
750
751 static const char *
752 find_use_name_n (const char *name, int *inst, bool interface)
753 {
754 gfc_use_rename *u;
755 const char *low_name = NULL;
756 int i;
757
758 /* For derived types. */
759 if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
760 low_name = dt_lower_string (name);
761
762 i = 0;
763 for (u = gfc_rename_list; u; u = u->next)
764 {
765 if ((!low_name && strcmp (u->use_name, name) != 0)
766 || (low_name && strcmp (u->use_name, low_name) != 0)
767 || (u->op == INTRINSIC_USER && !interface)
768 || (u->op != INTRINSIC_USER && interface))
769 continue;
770 if (++i == *inst)
771 break;
772 }
773
774 if (!*inst)
775 {
776 *inst = i;
777 return NULL;
778 }
779
780 if (u == NULL)
781 return only_flag ? NULL : name;
782
783 u->found = 1;
784
785 if (low_name)
786 {
787 if (u->local_name[0] == '\0')
788 return name;
789 return dt_upper_string (u->local_name);
790 }
791
792 return (u->local_name[0] != '\0') ? u->local_name : name;
793 }
794
795
796 /* Given a name, return the name under which to load this symbol.
797 Returns NULL if this symbol shouldn't be loaded. */
798
799 static const char *
800 find_use_name (const char *name, bool interface)
801 {
802 int i = 1;
803 return find_use_name_n (name, &i, interface);
804 }
805
806
807 /* Given a real name, return the number of use names associated with it. */
808
809 static int
810 number_use_names (const char *name, bool interface)
811 {
812 int i = 0;
813 find_use_name_n (name, &i, interface);
814 return i;
815 }
816
817
818 /* Try to find the operator in the current list. */
819
820 static gfc_use_rename *
821 find_use_operator (gfc_intrinsic_op op)
822 {
823 gfc_use_rename *u;
824
825 for (u = gfc_rename_list; u; u = u->next)
826 if (u->op == op)
827 return u;
828
829 return NULL;
830 }
831
832
833 /*****************************************************************/
834
835 /* The next couple of subroutines maintain a tree used to avoid a
836 brute-force search for a combination of true name and module name.
837 While symtree names, the name that a particular symbol is known by
838 can changed with USE statements, we still have to keep track of the
839 true names to generate the correct reference, and also avoid
840 loading the same real symbol twice in a program unit.
841
842 When we start reading, the true name tree is built and maintained
843 as symbols are read. The tree is searched as we load new symbols
844 to see if it already exists someplace in the namespace. */
845
846 typedef struct true_name
847 {
848 BBT_HEADER (true_name);
849 const char *name;
850 gfc_symbol *sym;
851 }
852 true_name;
853
854 static true_name *true_name_root;
855
856
857 /* Compare two true_name structures. */
858
859 static int
860 compare_true_names (void *_t1, void *_t2)
861 {
862 true_name *t1, *t2;
863 int c;
864
865 t1 = (true_name *) _t1;
866 t2 = (true_name *) _t2;
867
868 c = ((t1->sym->module > t2->sym->module)
869 - (t1->sym->module < t2->sym->module));
870 if (c != 0)
871 return c;
872
873 return strcmp (t1->name, t2->name);
874 }
875
876
877 /* Given a true name, search the true name tree to see if it exists
878 within the main namespace. */
879
880 static gfc_symbol *
881 find_true_name (const char *name, const char *module)
882 {
883 true_name t, *p;
884 gfc_symbol sym;
885 int c;
886
887 t.name = gfc_get_string (name);
888 if (module != NULL)
889 sym.module = gfc_get_string (module);
890 else
891 sym.module = NULL;
892 t.sym = &sym;
893
894 p = true_name_root;
895 while (p != NULL)
896 {
897 c = compare_true_names ((void *) (&t), (void *) p);
898 if (c == 0)
899 return p->sym;
900
901 p = (c < 0) ? p->left : p->right;
902 }
903
904 return NULL;
905 }
906
907
908 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
909
910 static void
911 add_true_name (gfc_symbol *sym)
912 {
913 true_name *t;
914
915 t = XCNEW (true_name);
916 t->sym = sym;
917 if (sym->attr.flavor == FL_DERIVED)
918 t->name = dt_upper_string (sym->name);
919 else
920 t->name = sym->name;
921
922 gfc_insert_bbt (&true_name_root, t, compare_true_names);
923 }
924
925
926 /* Recursive function to build the initial true name tree by
927 recursively traversing the current namespace. */
928
929 static void
930 build_tnt (gfc_symtree *st)
931 {
932 const char *name;
933 if (st == NULL)
934 return;
935
936 build_tnt (st->left);
937 build_tnt (st->right);
938
939 if (st->n.sym->attr.flavor == FL_DERIVED)
940 name = dt_upper_string (st->n.sym->name);
941 else
942 name = st->n.sym->name;
943
944 if (find_true_name (name, st->n.sym->module) != NULL)
945 return;
946
947 add_true_name (st->n.sym);
948 }
949
950
951 /* Initialize the true name tree with the current namespace. */
952
953 static void
954 init_true_name_tree (void)
955 {
956 true_name_root = NULL;
957 build_tnt (gfc_current_ns->sym_root);
958 }
959
960
961 /* Recursively free a true name tree node. */
962
963 static void
964 free_true_name (true_name *t)
965 {
966 if (t == NULL)
967 return;
968 free_true_name (t->left);
969 free_true_name (t->right);
970
971 free (t);
972 }
973
974
975 /*****************************************************************/
976
977 /* Module reading and writing. */
978
979 typedef enum
980 {
981 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
982 }
983 atom_type;
984
985 static atom_type last_atom;
986
987
988 /* The name buffer must be at least as long as a symbol name. Right
989 now it's not clear how we're going to store numeric constants--
990 probably as a hexadecimal string, since this will allow the exact
991 number to be preserved (this can't be done by a decimal
992 representation). Worry about that later. TODO! */
993
994 #define MAX_ATOM_SIZE 100
995
996 static int atom_int;
997 static char *atom_string, atom_name[MAX_ATOM_SIZE];
998
999
1000 /* Report problems with a module. Error reporting is not very
1001 elaborate, since this sorts of errors shouldn't really happen.
1002 This subroutine never returns. */
1003
1004 static void bad_module (const char *) ATTRIBUTE_NORETURN;
1005
1006 static void
1007 bad_module (const char *msgid)
1008 {
1009 fclose (module_fp);
1010
1011 switch (iomode)
1012 {
1013 case IO_INPUT:
1014 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
1015 module_name, module_line, module_column, msgid);
1016 break;
1017 case IO_OUTPUT:
1018 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
1019 module_name, module_line, module_column, msgid);
1020 break;
1021 default:
1022 gfc_fatal_error ("Module %s at line %d column %d: %s",
1023 module_name, module_line, module_column, msgid);
1024 break;
1025 }
1026 }
1027
1028
1029 /* Set the module's input pointer. */
1030
1031 static void
1032 set_module_locus (module_locus *m)
1033 {
1034 module_column = m->column;
1035 module_line = m->line;
1036 fsetpos (module_fp, &m->pos);
1037 }
1038
1039
1040 /* Get the module's input pointer so that we can restore it later. */
1041
1042 static void
1043 get_module_locus (module_locus *m)
1044 {
1045 m->column = module_column;
1046 m->line = module_line;
1047 fgetpos (module_fp, &m->pos);
1048 }
1049
1050
1051 /* Get the next character in the module, updating our reckoning of
1052 where we are. */
1053
1054 static int
1055 module_char (void)
1056 {
1057 int c;
1058
1059 c = getc (module_fp);
1060
1061 if (c == EOF)
1062 bad_module ("Unexpected EOF");
1063
1064 prev_module_line = module_line;
1065 prev_module_column = module_column;
1066 prev_character = c;
1067
1068 if (c == '\n')
1069 {
1070 module_line++;
1071 module_column = 0;
1072 }
1073
1074 module_column++;
1075 return c;
1076 }
1077
1078 /* Unget a character while remembering the line and column. Works for
1079 a single character only. */
1080
1081 static void
1082 module_unget_char (void)
1083 {
1084 module_line = prev_module_line;
1085 module_column = prev_module_column;
1086 ungetc (prev_character, module_fp);
1087 }
1088
1089 /* Parse a string constant. The delimiter is guaranteed to be a
1090 single quote. */
1091
1092 static void
1093 parse_string (void)
1094 {
1095 int c;
1096 size_t cursz = 30;
1097 size_t len = 0;
1098
1099 atom_string = XNEWVEC (char, cursz);
1100
1101 for ( ; ; )
1102 {
1103 c = module_char ();
1104
1105 if (c == '\'')
1106 {
1107 int c2 = module_char ();
1108 if (c2 != '\'')
1109 {
1110 module_unget_char ();
1111 break;
1112 }
1113 }
1114
1115 if (len >= cursz)
1116 {
1117 cursz *= 2;
1118 atom_string = XRESIZEVEC (char, atom_string, cursz);
1119 }
1120 atom_string[len] = c;
1121 len++;
1122 }
1123
1124 atom_string = XRESIZEVEC (char, atom_string, len + 1);
1125 atom_string[len] = '\0'; /* C-style string for debug purposes. */
1126 }
1127
1128
1129 /* Parse a small integer. */
1130
1131 static void
1132 parse_integer (int c)
1133 {
1134 atom_int = c - '0';
1135
1136 for (;;)
1137 {
1138 c = module_char ();
1139 if (!ISDIGIT (c))
1140 {
1141 module_unget_char ();
1142 break;
1143 }
1144
1145 atom_int = 10 * atom_int + c - '0';
1146 if (atom_int > 99999999)
1147 bad_module ("Integer overflow");
1148 }
1149
1150 }
1151
1152
1153 /* Parse a name. */
1154
1155 static void
1156 parse_name (int c)
1157 {
1158 char *p;
1159 int len;
1160
1161 p = atom_name;
1162
1163 *p++ = c;
1164 len = 1;
1165
1166 for (;;)
1167 {
1168 c = module_char ();
1169 if (!ISALNUM (c) && c != '_' && c != '-')
1170 {
1171 module_unget_char ();
1172 break;
1173 }
1174
1175 *p++ = c;
1176 if (++len > GFC_MAX_SYMBOL_LEN)
1177 bad_module ("Name too long");
1178 }
1179
1180 *p = '\0';
1181
1182 }
1183
1184
1185 /* Read the next atom in the module's input stream. */
1186
1187 static atom_type
1188 parse_atom (void)
1189 {
1190 int c;
1191
1192 do
1193 {
1194 c = module_char ();
1195 }
1196 while (c == ' ' || c == '\r' || c == '\n');
1197
1198 switch (c)
1199 {
1200 case '(':
1201 return ATOM_LPAREN;
1202
1203 case ')':
1204 return ATOM_RPAREN;
1205
1206 case '\'':
1207 parse_string ();
1208 return ATOM_STRING;
1209
1210 case '0':
1211 case '1':
1212 case '2':
1213 case '3':
1214 case '4':
1215 case '5':
1216 case '6':
1217 case '7':
1218 case '8':
1219 case '9':
1220 parse_integer (c);
1221 return ATOM_INTEGER;
1222
1223 case 'a':
1224 case 'b':
1225 case 'c':
1226 case 'd':
1227 case 'e':
1228 case 'f':
1229 case 'g':
1230 case 'h':
1231 case 'i':
1232 case 'j':
1233 case 'k':
1234 case 'l':
1235 case 'm':
1236 case 'n':
1237 case 'o':
1238 case 'p':
1239 case 'q':
1240 case 'r':
1241 case 's':
1242 case 't':
1243 case 'u':
1244 case 'v':
1245 case 'w':
1246 case 'x':
1247 case 'y':
1248 case 'z':
1249 case 'A':
1250 case 'B':
1251 case 'C':
1252 case 'D':
1253 case 'E':
1254 case 'F':
1255 case 'G':
1256 case 'H':
1257 case 'I':
1258 case 'J':
1259 case 'K':
1260 case 'L':
1261 case 'M':
1262 case 'N':
1263 case 'O':
1264 case 'P':
1265 case 'Q':
1266 case 'R':
1267 case 'S':
1268 case 'T':
1269 case 'U':
1270 case 'V':
1271 case 'W':
1272 case 'X':
1273 case 'Y':
1274 case 'Z':
1275 parse_name (c);
1276 return ATOM_NAME;
1277
1278 default:
1279 bad_module ("Bad name");
1280 }
1281
1282 /* Not reached. */
1283 }
1284
1285
1286 /* Peek at the next atom on the input. */
1287
1288 static atom_type
1289 peek_atom (void)
1290 {
1291 int c;
1292
1293 do
1294 {
1295 c = module_char ();
1296 }
1297 while (c == ' ' || c == '\r' || c == '\n');
1298
1299 switch (c)
1300 {
1301 case '(':
1302 module_unget_char ();
1303 return ATOM_LPAREN;
1304
1305 case ')':
1306 module_unget_char ();
1307 return ATOM_RPAREN;
1308
1309 case '\'':
1310 module_unget_char ();
1311 return ATOM_STRING;
1312
1313 case '0':
1314 case '1':
1315 case '2':
1316 case '3':
1317 case '4':
1318 case '5':
1319 case '6':
1320 case '7':
1321 case '8':
1322 case '9':
1323 module_unget_char ();
1324 return ATOM_INTEGER;
1325
1326 case 'a':
1327 case 'b':
1328 case 'c':
1329 case 'd':
1330 case 'e':
1331 case 'f':
1332 case 'g':
1333 case 'h':
1334 case 'i':
1335 case 'j':
1336 case 'k':
1337 case 'l':
1338 case 'm':
1339 case 'n':
1340 case 'o':
1341 case 'p':
1342 case 'q':
1343 case 'r':
1344 case 's':
1345 case 't':
1346 case 'u':
1347 case 'v':
1348 case 'w':
1349 case 'x':
1350 case 'y':
1351 case 'z':
1352 case 'A':
1353 case 'B':
1354 case 'C':
1355 case 'D':
1356 case 'E':
1357 case 'F':
1358 case 'G':
1359 case 'H':
1360 case 'I':
1361 case 'J':
1362 case 'K':
1363 case 'L':
1364 case 'M':
1365 case 'N':
1366 case 'O':
1367 case 'P':
1368 case 'Q':
1369 case 'R':
1370 case 'S':
1371 case 'T':
1372 case 'U':
1373 case 'V':
1374 case 'W':
1375 case 'X':
1376 case 'Y':
1377 case 'Z':
1378 module_unget_char ();
1379 return ATOM_NAME;
1380
1381 default:
1382 bad_module ("Bad name");
1383 }
1384 }
1385
1386
1387 /* Read the next atom from the input, requiring that it be a
1388 particular kind. */
1389
1390 static void
1391 require_atom (atom_type type)
1392 {
1393 atom_type t;
1394 const char *p;
1395 int column, line;
1396
1397 column = module_column;
1398 line = module_line;
1399
1400 t = parse_atom ();
1401 if (t != type)
1402 {
1403 switch (type)
1404 {
1405 case ATOM_NAME:
1406 p = _("Expected name");
1407 break;
1408 case ATOM_LPAREN:
1409 p = _("Expected left parenthesis");
1410 break;
1411 case ATOM_RPAREN:
1412 p = _("Expected right parenthesis");
1413 break;
1414 case ATOM_INTEGER:
1415 p = _("Expected integer");
1416 break;
1417 case ATOM_STRING:
1418 p = _("Expected string");
1419 break;
1420 default:
1421 gfc_internal_error ("require_atom(): bad atom type required");
1422 }
1423
1424 module_column = column;
1425 module_line = line;
1426 bad_module (p);
1427 }
1428 }
1429
1430
1431 /* Given a pointer to an mstring array, require that the current input
1432 be one of the strings in the array. We return the enum value. */
1433
1434 static int
1435 find_enum (const mstring *m)
1436 {
1437 int i;
1438
1439 i = gfc_string2code (m, atom_name);
1440 if (i >= 0)
1441 return i;
1442
1443 bad_module ("find_enum(): Enum not found");
1444
1445 /* Not reached. */
1446 }
1447
1448
1449 /* Read a string. The caller is responsible for freeing. */
1450
1451 static char*
1452 read_string (void)
1453 {
1454 char* p;
1455 require_atom (ATOM_STRING);
1456 p = atom_string;
1457 atom_string = NULL;
1458 return p;
1459 }
1460
1461
1462 /**************** Module output subroutines ***************************/
1463
1464 /* Output a character to a module file. */
1465
1466 static void
1467 write_char (char out)
1468 {
1469 if (putc (out, module_fp) == EOF)
1470 gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno));
1471
1472 /* Add this to our MD5. */
1473 md5_process_bytes (&out, sizeof (out), &ctx);
1474
1475 if (out != '\n')
1476 module_column++;
1477 else
1478 {
1479 module_column = 1;
1480 module_line++;
1481 }
1482 }
1483
1484
1485 /* Write an atom to a module. The line wrapping isn't perfect, but it
1486 should work most of the time. This isn't that big of a deal, since
1487 the file really isn't meant to be read by people anyway. */
1488
1489 static void
1490 write_atom (atom_type atom, const void *v)
1491 {
1492 char buffer[20];
1493 int i, len;
1494 const char *p;
1495
1496 switch (atom)
1497 {
1498 case ATOM_STRING:
1499 case ATOM_NAME:
1500 p = (const char *) v;
1501 break;
1502
1503 case ATOM_LPAREN:
1504 p = "(";
1505 break;
1506
1507 case ATOM_RPAREN:
1508 p = ")";
1509 break;
1510
1511 case ATOM_INTEGER:
1512 i = *((const int *) v);
1513 if (i < 0)
1514 gfc_internal_error ("write_atom(): Writing negative integer");
1515
1516 sprintf (buffer, "%d", i);
1517 p = buffer;
1518 break;
1519
1520 default:
1521 gfc_internal_error ("write_atom(): Trying to write dab atom");
1522
1523 }
1524
1525 if(p == NULL || *p == '\0')
1526 len = 0;
1527 else
1528 len = strlen (p);
1529
1530 if (atom != ATOM_RPAREN)
1531 {
1532 if (module_column + len > 72)
1533 write_char ('\n');
1534 else
1535 {
1536
1537 if (last_atom != ATOM_LPAREN && module_column != 1)
1538 write_char (' ');
1539 }
1540 }
1541
1542 if (atom == ATOM_STRING)
1543 write_char ('\'');
1544
1545 while (p != NULL && *p)
1546 {
1547 if (atom == ATOM_STRING && *p == '\'')
1548 write_char ('\'');
1549 write_char (*p++);
1550 }
1551
1552 if (atom == ATOM_STRING)
1553 write_char ('\'');
1554
1555 last_atom = atom;
1556 }
1557
1558
1559
1560 /***************** Mid-level I/O subroutines *****************/
1561
1562 /* These subroutines let their caller read or write atoms without
1563 caring about which of the two is actually happening. This lets a
1564 subroutine concentrate on the actual format of the data being
1565 written. */
1566
1567 static void mio_expr (gfc_expr **);
1568 pointer_info *mio_symbol_ref (gfc_symbol **);
1569 pointer_info *mio_interface_rest (gfc_interface **);
1570 static void mio_symtree_ref (gfc_symtree **);
1571
1572 /* Read or write an enumerated value. On writing, we return the input
1573 value for the convenience of callers. We avoid using an integer
1574 pointer because enums are sometimes inside bitfields. */
1575
1576 static int
1577 mio_name (int t, const mstring *m)
1578 {
1579 if (iomode == IO_OUTPUT)
1580 write_atom (ATOM_NAME, gfc_code2string (m, t));
1581 else
1582 {
1583 require_atom (ATOM_NAME);
1584 t = find_enum (m);
1585 }
1586
1587 return t;
1588 }
1589
1590 /* Specialization of mio_name. */
1591
1592 #define DECL_MIO_NAME(TYPE) \
1593 static inline TYPE \
1594 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1595 { \
1596 return (TYPE) mio_name ((int) t, m); \
1597 }
1598 #define MIO_NAME(TYPE) mio_name_##TYPE
1599
1600 static void
1601 mio_lparen (void)
1602 {
1603 if (iomode == IO_OUTPUT)
1604 write_atom (ATOM_LPAREN, NULL);
1605 else
1606 require_atom (ATOM_LPAREN);
1607 }
1608
1609
1610 static void
1611 mio_rparen (void)
1612 {
1613 if (iomode == IO_OUTPUT)
1614 write_atom (ATOM_RPAREN, NULL);
1615 else
1616 require_atom (ATOM_RPAREN);
1617 }
1618
1619
1620 static void
1621 mio_integer (int *ip)
1622 {
1623 if (iomode == IO_OUTPUT)
1624 write_atom (ATOM_INTEGER, ip);
1625 else
1626 {
1627 require_atom (ATOM_INTEGER);
1628 *ip = atom_int;
1629 }
1630 }
1631
1632
1633 /* Read or write a gfc_intrinsic_op value. */
1634
1635 static void
1636 mio_intrinsic_op (gfc_intrinsic_op* op)
1637 {
1638 /* FIXME: Would be nicer to do this via the operators symbolic name. */
1639 if (iomode == IO_OUTPUT)
1640 {
1641 int converted = (int) *op;
1642 write_atom (ATOM_INTEGER, &converted);
1643 }
1644 else
1645 {
1646 require_atom (ATOM_INTEGER);
1647 *op = (gfc_intrinsic_op) atom_int;
1648 }
1649 }
1650
1651
1652 /* Read or write a character pointer that points to a string on the heap. */
1653
1654 static const char *
1655 mio_allocated_string (const char *s)
1656 {
1657 if (iomode == IO_OUTPUT)
1658 {
1659 write_atom (ATOM_STRING, s);
1660 return s;
1661 }
1662 else
1663 {
1664 require_atom (ATOM_STRING);
1665 return atom_string;
1666 }
1667 }
1668
1669
1670 /* Functions for quoting and unquoting strings. */
1671
1672 static char *
1673 quote_string (const gfc_char_t *s, const size_t slength)
1674 {
1675 const gfc_char_t *p;
1676 char *res, *q;
1677 size_t len = 0, i;
1678
1679 /* Calculate the length we'll need: a backslash takes two ("\\"),
1680 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1681 for (p = s, i = 0; i < slength; p++, i++)
1682 {
1683 if (*p == '\\')
1684 len += 2;
1685 else if (!gfc_wide_is_printable (*p))
1686 len += 10;
1687 else
1688 len++;
1689 }
1690
1691 q = res = XCNEWVEC (char, len + 1);
1692 for (p = s, i = 0; i < slength; p++, i++)
1693 {
1694 if (*p == '\\')
1695 *q++ = '\\', *q++ = '\\';
1696 else if (!gfc_wide_is_printable (*p))
1697 {
1698 sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1699 (unsigned HOST_WIDE_INT) *p);
1700 q += 10;
1701 }
1702 else
1703 *q++ = (unsigned char) *p;
1704 }
1705
1706 res[len] = '\0';
1707 return res;
1708 }
1709
1710 static gfc_char_t *
1711 unquote_string (const char *s)
1712 {
1713 size_t len, i;
1714 const char *p;
1715 gfc_char_t *res;
1716
1717 for (p = s, len = 0; *p; p++, len++)
1718 {
1719 if (*p != '\\')
1720 continue;
1721
1722 if (p[1] == '\\')
1723 p++;
1724 else if (p[1] == 'U')
1725 p += 9; /* That is a "\U????????". */
1726 else
1727 gfc_internal_error ("unquote_string(): got bad string");
1728 }
1729
1730 res = gfc_get_wide_string (len + 1);
1731 for (i = 0, p = s; i < len; i++, p++)
1732 {
1733 gcc_assert (*p);
1734
1735 if (*p != '\\')
1736 res[i] = (unsigned char) *p;
1737 else if (p[1] == '\\')
1738 {
1739 res[i] = (unsigned char) '\\';
1740 p++;
1741 }
1742 else
1743 {
1744 /* We read the 8-digits hexadecimal constant that follows. */
1745 int j;
1746 unsigned n;
1747 gfc_char_t c = 0;
1748
1749 gcc_assert (p[1] == 'U');
1750 for (j = 0; j < 8; j++)
1751 {
1752 c = c << 4;
1753 gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1754 c += n;
1755 }
1756
1757 res[i] = c;
1758 p += 9;
1759 }
1760 }
1761
1762 res[len] = '\0';
1763 return res;
1764 }
1765
1766
1767 /* Read or write a character pointer that points to a wide string on the
1768 heap, performing quoting/unquoting of nonprintable characters using the
1769 form \U???????? (where each ? is a hexadecimal digit).
1770 Length is the length of the string, only known and used in output mode. */
1771
1772 static const gfc_char_t *
1773 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1774 {
1775 if (iomode == IO_OUTPUT)
1776 {
1777 char *quoted = quote_string (s, length);
1778 write_atom (ATOM_STRING, quoted);
1779 free (quoted);
1780 return s;
1781 }
1782 else
1783 {
1784 gfc_char_t *unquoted;
1785
1786 require_atom (ATOM_STRING);
1787 unquoted = unquote_string (atom_string);
1788 free (atom_string);
1789 return unquoted;
1790 }
1791 }
1792
1793
1794 /* Read or write a string that is in static memory. */
1795
1796 static void
1797 mio_pool_string (const char **stringp)
1798 {
1799 /* TODO: one could write the string only once, and refer to it via a
1800 fixup pointer. */
1801
1802 /* As a special case we have to deal with a NULL string. This
1803 happens for the 'module' member of 'gfc_symbol's that are not in a
1804 module. We read / write these as the empty string. */
1805 if (iomode == IO_OUTPUT)
1806 {
1807 const char *p = *stringp == NULL ? "" : *stringp;
1808 write_atom (ATOM_STRING, p);
1809 }
1810 else
1811 {
1812 require_atom (ATOM_STRING);
1813 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1814 free (atom_string);
1815 }
1816 }
1817
1818
1819 /* Read or write a string that is inside of some already-allocated
1820 structure. */
1821
1822 static void
1823 mio_internal_string (char *string)
1824 {
1825 if (iomode == IO_OUTPUT)
1826 write_atom (ATOM_STRING, string);
1827 else
1828 {
1829 require_atom (ATOM_STRING);
1830 strcpy (string, atom_string);
1831 free (atom_string);
1832 }
1833 }
1834
1835
1836 typedef enum
1837 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1838 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1839 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1840 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1841 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE,
1842 AB_ALLOC_COMP, AB_POINTER_COMP, AB_PROC_POINTER_COMP, AB_PRIVATE_COMP,
1843 AB_VALUE, AB_VOLATILE, AB_PROTECTED, AB_LOCK_COMP,
1844 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1845 AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
1846 AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER,
1847 AB_IMPLICIT_PURE, AB_ARTIFICIAL, AB_UNLIMITED_POLY
1848 }
1849 ab_attribute;
1850
1851 static const mstring attr_bits[] =
1852 {
1853 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1854 minit ("ARTIFICIAL", AB_ARTIFICIAL),
1855 minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1856 minit ("DIMENSION", AB_DIMENSION),
1857 minit ("CODIMENSION", AB_CODIMENSION),
1858 minit ("CONTIGUOUS", AB_CONTIGUOUS),
1859 minit ("EXTERNAL", AB_EXTERNAL),
1860 minit ("INTRINSIC", AB_INTRINSIC),
1861 minit ("OPTIONAL", AB_OPTIONAL),
1862 minit ("POINTER", AB_POINTER),
1863 minit ("VOLATILE", AB_VOLATILE),
1864 minit ("TARGET", AB_TARGET),
1865 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1866 minit ("DUMMY", AB_DUMMY),
1867 minit ("RESULT", AB_RESULT),
1868 minit ("DATA", AB_DATA),
1869 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1870 minit ("IN_COMMON", AB_IN_COMMON),
1871 minit ("FUNCTION", AB_FUNCTION),
1872 minit ("SUBROUTINE", AB_SUBROUTINE),
1873 minit ("SEQUENCE", AB_SEQUENCE),
1874 minit ("ELEMENTAL", AB_ELEMENTAL),
1875 minit ("PURE", AB_PURE),
1876 minit ("RECURSIVE", AB_RECURSIVE),
1877 minit ("GENERIC", AB_GENERIC),
1878 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1879 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1880 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1881 minit ("IS_BIND_C", AB_IS_BIND_C),
1882 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1883 minit ("IS_ISO_C", AB_IS_ISO_C),
1884 minit ("VALUE", AB_VALUE),
1885 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1886 minit ("COARRAY_COMP", AB_COARRAY_COMP),
1887 minit ("LOCK_COMP", AB_LOCK_COMP),
1888 minit ("POINTER_COMP", AB_POINTER_COMP),
1889 minit ("PROC_POINTER_COMP", AB_PROC_POINTER_COMP),
1890 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1891 minit ("ZERO_COMP", AB_ZERO_COMP),
1892 minit ("PROTECTED", AB_PROTECTED),
1893 minit ("ABSTRACT", AB_ABSTRACT),
1894 minit ("IS_CLASS", AB_IS_CLASS),
1895 minit ("PROCEDURE", AB_PROCEDURE),
1896 minit ("PROC_POINTER", AB_PROC_POINTER),
1897 minit ("VTYPE", AB_VTYPE),
1898 minit ("VTAB", AB_VTAB),
1899 minit ("CLASS_POINTER", AB_CLASS_POINTER),
1900 minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE),
1901 minit ("UNLIMITED_POLY", AB_UNLIMITED_POLY),
1902 minit (NULL, -1)
1903 };
1904
1905 /* For binding attributes. */
1906 static const mstring binding_passing[] =
1907 {
1908 minit ("PASS", 0),
1909 minit ("NOPASS", 1),
1910 minit (NULL, -1)
1911 };
1912 static const mstring binding_overriding[] =
1913 {
1914 minit ("OVERRIDABLE", 0),
1915 minit ("NON_OVERRIDABLE", 1),
1916 minit ("DEFERRED", 2),
1917 minit (NULL, -1)
1918 };
1919 static const mstring binding_generic[] =
1920 {
1921 minit ("SPECIFIC", 0),
1922 minit ("GENERIC", 1),
1923 minit (NULL, -1)
1924 };
1925 static const mstring binding_ppc[] =
1926 {
1927 minit ("NO_PPC", 0),
1928 minit ("PPC", 1),
1929 minit (NULL, -1)
1930 };
1931
1932 /* Specialization of mio_name. */
1933 DECL_MIO_NAME (ab_attribute)
1934 DECL_MIO_NAME (ar_type)
1935 DECL_MIO_NAME (array_type)
1936 DECL_MIO_NAME (bt)
1937 DECL_MIO_NAME (expr_t)
1938 DECL_MIO_NAME (gfc_access)
1939 DECL_MIO_NAME (gfc_intrinsic_op)
1940 DECL_MIO_NAME (ifsrc)
1941 DECL_MIO_NAME (save_state)
1942 DECL_MIO_NAME (procedure_type)
1943 DECL_MIO_NAME (ref_type)
1944 DECL_MIO_NAME (sym_flavor)
1945 DECL_MIO_NAME (sym_intent)
1946 #undef DECL_MIO_NAME
1947
1948 /* Symbol attributes are stored in list with the first three elements
1949 being the enumerated fields, while the remaining elements (if any)
1950 indicate the individual attribute bits. The access field is not
1951 saved-- it controls what symbols are exported when a module is
1952 written. */
1953
1954 static void
1955 mio_symbol_attribute (symbol_attribute *attr)
1956 {
1957 atom_type t;
1958 unsigned ext_attr,extension_level;
1959
1960 mio_lparen ();
1961
1962 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1963 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1964 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1965 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1966 attr->save = MIO_NAME (save_state) (attr->save, save_status);
1967
1968 ext_attr = attr->ext_attr;
1969 mio_integer ((int *) &ext_attr);
1970 attr->ext_attr = ext_attr;
1971
1972 extension_level = attr->extension;
1973 mio_integer ((int *) &extension_level);
1974 attr->extension = extension_level;
1975
1976 if (iomode == IO_OUTPUT)
1977 {
1978 if (attr->allocatable)
1979 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1980 if (attr->artificial)
1981 MIO_NAME (ab_attribute) (AB_ARTIFICIAL, attr_bits);
1982 if (attr->asynchronous)
1983 MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
1984 if (attr->dimension)
1985 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1986 if (attr->codimension)
1987 MIO_NAME (ab_attribute) (AB_CODIMENSION, attr_bits);
1988 if (attr->contiguous)
1989 MIO_NAME (ab_attribute) (AB_CONTIGUOUS, attr_bits);
1990 if (attr->external)
1991 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1992 if (attr->intrinsic)
1993 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1994 if (attr->optional)
1995 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1996 if (attr->pointer)
1997 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1998 if (attr->class_pointer)
1999 MIO_NAME (ab_attribute) (AB_CLASS_POINTER, attr_bits);
2000 if (attr->is_protected)
2001 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
2002 if (attr->value)
2003 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
2004 if (attr->volatile_)
2005 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
2006 if (attr->target)
2007 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
2008 if (attr->threadprivate)
2009 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
2010 if (attr->dummy)
2011 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
2012 if (attr->result)
2013 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
2014 /* We deliberately don't preserve the "entry" flag. */
2015
2016 if (attr->data)
2017 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
2018 if (attr->in_namelist)
2019 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
2020 if (attr->in_common)
2021 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
2022
2023 if (attr->function)
2024 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
2025 if (attr->subroutine)
2026 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
2027 if (attr->generic)
2028 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
2029 if (attr->abstract)
2030 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
2031
2032 if (attr->sequence)
2033 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
2034 if (attr->elemental)
2035 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
2036 if (attr->pure)
2037 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
2038 if (attr->implicit_pure)
2039 MIO_NAME (ab_attribute) (AB_IMPLICIT_PURE, attr_bits);
2040 if (attr->unlimited_polymorphic)
2041 MIO_NAME (ab_attribute) (AB_UNLIMITED_POLY, attr_bits);
2042 if (attr->recursive)
2043 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
2044 if (attr->always_explicit)
2045 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
2046 if (attr->cray_pointer)
2047 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
2048 if (attr->cray_pointee)
2049 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
2050 if (attr->is_bind_c)
2051 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
2052 if (attr->is_c_interop)
2053 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
2054 if (attr->is_iso_c)
2055 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
2056 if (attr->alloc_comp)
2057 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
2058 if (attr->pointer_comp)
2059 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
2060 if (attr->proc_pointer_comp)
2061 MIO_NAME (ab_attribute) (AB_PROC_POINTER_COMP, attr_bits);
2062 if (attr->private_comp)
2063 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
2064 if (attr->coarray_comp)
2065 MIO_NAME (ab_attribute) (AB_COARRAY_COMP, attr_bits);
2066 if (attr->lock_comp)
2067 MIO_NAME (ab_attribute) (AB_LOCK_COMP, attr_bits);
2068 if (attr->zero_comp)
2069 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
2070 if (attr->is_class)
2071 MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
2072 if (attr->procedure)
2073 MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
2074 if (attr->proc_pointer)
2075 MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
2076 if (attr->vtype)
2077 MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
2078 if (attr->vtab)
2079 MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
2080
2081 mio_rparen ();
2082
2083 }
2084 else
2085 {
2086 for (;;)
2087 {
2088 t = parse_atom ();
2089 if (t == ATOM_RPAREN)
2090 break;
2091 if (t != ATOM_NAME)
2092 bad_module ("Expected attribute bit name");
2093
2094 switch ((ab_attribute) find_enum (attr_bits))
2095 {
2096 case AB_ALLOCATABLE:
2097 attr->allocatable = 1;
2098 break;
2099 case AB_ARTIFICIAL:
2100 attr->artificial = 1;
2101 break;
2102 case AB_ASYNCHRONOUS:
2103 attr->asynchronous = 1;
2104 break;
2105 case AB_DIMENSION:
2106 attr->dimension = 1;
2107 break;
2108 case AB_CODIMENSION:
2109 attr->codimension = 1;
2110 break;
2111 case AB_CONTIGUOUS:
2112 attr->contiguous = 1;
2113 break;
2114 case AB_EXTERNAL:
2115 attr->external = 1;
2116 break;
2117 case AB_INTRINSIC:
2118 attr->intrinsic = 1;
2119 break;
2120 case AB_OPTIONAL:
2121 attr->optional = 1;
2122 break;
2123 case AB_POINTER:
2124 attr->pointer = 1;
2125 break;
2126 case AB_CLASS_POINTER:
2127 attr->class_pointer = 1;
2128 break;
2129 case AB_PROTECTED:
2130 attr->is_protected = 1;
2131 break;
2132 case AB_VALUE:
2133 attr->value = 1;
2134 break;
2135 case AB_VOLATILE:
2136 attr->volatile_ = 1;
2137 break;
2138 case AB_TARGET:
2139 attr->target = 1;
2140 break;
2141 case AB_THREADPRIVATE:
2142 attr->threadprivate = 1;
2143 break;
2144 case AB_DUMMY:
2145 attr->dummy = 1;
2146 break;
2147 case AB_RESULT:
2148 attr->result = 1;
2149 break;
2150 case AB_DATA:
2151 attr->data = 1;
2152 break;
2153 case AB_IN_NAMELIST:
2154 attr->in_namelist = 1;
2155 break;
2156 case AB_IN_COMMON:
2157 attr->in_common = 1;
2158 break;
2159 case AB_FUNCTION:
2160 attr->function = 1;
2161 break;
2162 case AB_SUBROUTINE:
2163 attr->subroutine = 1;
2164 break;
2165 case AB_GENERIC:
2166 attr->generic = 1;
2167 break;
2168 case AB_ABSTRACT:
2169 attr->abstract = 1;
2170 break;
2171 case AB_SEQUENCE:
2172 attr->sequence = 1;
2173 break;
2174 case AB_ELEMENTAL:
2175 attr->elemental = 1;
2176 break;
2177 case AB_PURE:
2178 attr->pure = 1;
2179 break;
2180 case AB_IMPLICIT_PURE:
2181 attr->implicit_pure = 1;
2182 break;
2183 case AB_UNLIMITED_POLY:
2184 attr->unlimited_polymorphic = 1;
2185 break;
2186 case AB_RECURSIVE:
2187 attr->recursive = 1;
2188 break;
2189 case AB_ALWAYS_EXPLICIT:
2190 attr->always_explicit = 1;
2191 break;
2192 case AB_CRAY_POINTER:
2193 attr->cray_pointer = 1;
2194 break;
2195 case AB_CRAY_POINTEE:
2196 attr->cray_pointee = 1;
2197 break;
2198 case AB_IS_BIND_C:
2199 attr->is_bind_c = 1;
2200 break;
2201 case AB_IS_C_INTEROP:
2202 attr->is_c_interop = 1;
2203 break;
2204 case AB_IS_ISO_C:
2205 attr->is_iso_c = 1;
2206 break;
2207 case AB_ALLOC_COMP:
2208 attr->alloc_comp = 1;
2209 break;
2210 case AB_COARRAY_COMP:
2211 attr->coarray_comp = 1;
2212 break;
2213 case AB_LOCK_COMP:
2214 attr->lock_comp = 1;
2215 break;
2216 case AB_POINTER_COMP:
2217 attr->pointer_comp = 1;
2218 break;
2219 case AB_PROC_POINTER_COMP:
2220 attr->proc_pointer_comp = 1;
2221 break;
2222 case AB_PRIVATE_COMP:
2223 attr->private_comp = 1;
2224 break;
2225 case AB_ZERO_COMP:
2226 attr->zero_comp = 1;
2227 break;
2228 case AB_IS_CLASS:
2229 attr->is_class = 1;
2230 break;
2231 case AB_PROCEDURE:
2232 attr->procedure = 1;
2233 break;
2234 case AB_PROC_POINTER:
2235 attr->proc_pointer = 1;
2236 break;
2237 case AB_VTYPE:
2238 attr->vtype = 1;
2239 break;
2240 case AB_VTAB:
2241 attr->vtab = 1;
2242 break;
2243 }
2244 }
2245 }
2246 }
2247
2248
2249 static const mstring bt_types[] = {
2250 minit ("INTEGER", BT_INTEGER),
2251 minit ("REAL", BT_REAL),
2252 minit ("COMPLEX", BT_COMPLEX),
2253 minit ("LOGICAL", BT_LOGICAL),
2254 minit ("CHARACTER", BT_CHARACTER),
2255 minit ("DERIVED", BT_DERIVED),
2256 minit ("CLASS", BT_CLASS),
2257 minit ("PROCEDURE", BT_PROCEDURE),
2258 minit ("UNKNOWN", BT_UNKNOWN),
2259 minit ("VOID", BT_VOID),
2260 minit ("ASSUMED", BT_ASSUMED),
2261 minit (NULL, -1)
2262 };
2263
2264
2265 static void
2266 mio_charlen (gfc_charlen **clp)
2267 {
2268 gfc_charlen *cl;
2269
2270 mio_lparen ();
2271
2272 if (iomode == IO_OUTPUT)
2273 {
2274 cl = *clp;
2275 if (cl != NULL)
2276 mio_expr (&cl->length);
2277 }
2278 else
2279 {
2280 if (peek_atom () != ATOM_RPAREN)
2281 {
2282 cl = gfc_new_charlen (gfc_current_ns, NULL);
2283 mio_expr (&cl->length);
2284 *clp = cl;
2285 }
2286 }
2287
2288 mio_rparen ();
2289 }
2290
2291
2292 /* See if a name is a generated name. */
2293
2294 static int
2295 check_unique_name (const char *name)
2296 {
2297 return *name == '@';
2298 }
2299
2300
2301 static void
2302 mio_typespec (gfc_typespec *ts)
2303 {
2304 mio_lparen ();
2305
2306 ts->type = MIO_NAME (bt) (ts->type, bt_types);
2307
2308 if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2309 mio_integer (&ts->kind);
2310 else
2311 mio_symbol_ref (&ts->u.derived);
2312
2313 mio_symbol_ref (&ts->interface);
2314
2315 /* Add info for C interop and is_iso_c. */
2316 mio_integer (&ts->is_c_interop);
2317 mio_integer (&ts->is_iso_c);
2318
2319 /* If the typespec is for an identifier either from iso_c_binding, or
2320 a constant that was initialized to an identifier from it, use the
2321 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2322 if (ts->is_iso_c)
2323 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2324 else
2325 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2326
2327 if (ts->type != BT_CHARACTER)
2328 {
2329 /* ts->u.cl is only valid for BT_CHARACTER. */
2330 mio_lparen ();
2331 mio_rparen ();
2332 }
2333 else
2334 mio_charlen (&ts->u.cl);
2335
2336 /* So as not to disturb the existing API, use an ATOM_NAME to
2337 transmit deferred characteristic for characters (F2003). */
2338 if (iomode == IO_OUTPUT)
2339 {
2340 if (ts->type == BT_CHARACTER && ts->deferred)
2341 write_atom (ATOM_NAME, "DEFERRED_CL");
2342 }
2343 else if (peek_atom () != ATOM_RPAREN)
2344 {
2345 if (parse_atom () != ATOM_NAME)
2346 bad_module ("Expected string");
2347 ts->deferred = 1;
2348 }
2349
2350 mio_rparen ();
2351 }
2352
2353
2354 static const mstring array_spec_types[] = {
2355 minit ("EXPLICIT", AS_EXPLICIT),
2356 minit ("ASSUMED_RANK", AS_ASSUMED_RANK),
2357 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2358 minit ("DEFERRED", AS_DEFERRED),
2359 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2360 minit (NULL, -1)
2361 };
2362
2363
2364 static void
2365 mio_array_spec (gfc_array_spec **asp)
2366 {
2367 gfc_array_spec *as;
2368 int i;
2369
2370 mio_lparen ();
2371
2372 if (iomode == IO_OUTPUT)
2373 {
2374 int rank;
2375
2376 if (*asp == NULL)
2377 goto done;
2378 as = *asp;
2379
2380 /* mio_integer expects nonnegative values. */
2381 rank = as->rank > 0 ? as->rank : 0;
2382 mio_integer (&rank);
2383 }
2384 else
2385 {
2386 if (peek_atom () == ATOM_RPAREN)
2387 {
2388 *asp = NULL;
2389 goto done;
2390 }
2391
2392 *asp = as = gfc_get_array_spec ();
2393 mio_integer (&as->rank);
2394 }
2395
2396 mio_integer (&as->corank);
2397 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2398
2399 if (iomode == IO_INPUT && as->type == AS_ASSUMED_RANK)
2400 as->rank = -1;
2401 if (iomode == IO_INPUT && as->corank)
2402 as->cotype = (as->type == AS_DEFERRED) ? AS_DEFERRED : AS_EXPLICIT;
2403
2404 if (as->rank + as->corank > 0)
2405 for (i = 0; i < as->rank + as->corank; i++)
2406 {
2407 mio_expr (&as->lower[i]);
2408 mio_expr (&as->upper[i]);
2409 }
2410
2411 done:
2412 mio_rparen ();
2413 }
2414
2415
2416 /* Given a pointer to an array reference structure (which lives in a
2417 gfc_ref structure), find the corresponding array specification
2418 structure. Storing the pointer in the ref structure doesn't quite
2419 work when loading from a module. Generating code for an array
2420 reference also needs more information than just the array spec. */
2421
2422 static const mstring array_ref_types[] = {
2423 minit ("FULL", AR_FULL),
2424 minit ("ELEMENT", AR_ELEMENT),
2425 minit ("SECTION", AR_SECTION),
2426 minit (NULL, -1)
2427 };
2428
2429
2430 static void
2431 mio_array_ref (gfc_array_ref *ar)
2432 {
2433 int i;
2434
2435 mio_lparen ();
2436 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2437 mio_integer (&ar->dimen);
2438
2439 switch (ar->type)
2440 {
2441 case AR_FULL:
2442 break;
2443
2444 case AR_ELEMENT:
2445 for (i = 0; i < ar->dimen; i++)
2446 mio_expr (&ar->start[i]);
2447
2448 break;
2449
2450 case AR_SECTION:
2451 for (i = 0; i < ar->dimen; i++)
2452 {
2453 mio_expr (&ar->start[i]);
2454 mio_expr (&ar->end[i]);
2455 mio_expr (&ar->stride[i]);
2456 }
2457
2458 break;
2459
2460 case AR_UNKNOWN:
2461 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2462 }
2463
2464 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2465 we can't call mio_integer directly. Instead loop over each element
2466 and cast it to/from an integer. */
2467 if (iomode == IO_OUTPUT)
2468 {
2469 for (i = 0; i < ar->dimen; i++)
2470 {
2471 int tmp = (int)ar->dimen_type[i];
2472 write_atom (ATOM_INTEGER, &tmp);
2473 }
2474 }
2475 else
2476 {
2477 for (i = 0; i < ar->dimen; i++)
2478 {
2479 require_atom (ATOM_INTEGER);
2480 ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2481 }
2482 }
2483
2484 if (iomode == IO_INPUT)
2485 {
2486 ar->where = gfc_current_locus;
2487
2488 for (i = 0; i < ar->dimen; i++)
2489 ar->c_where[i] = gfc_current_locus;
2490 }
2491
2492 mio_rparen ();
2493 }
2494
2495
2496 /* Saves or restores a pointer. The pointer is converted back and
2497 forth from an integer. We return the pointer_info pointer so that
2498 the caller can take additional action based on the pointer type. */
2499
2500 static pointer_info *
2501 mio_pointer_ref (void *gp)
2502 {
2503 pointer_info *p;
2504
2505 if (iomode == IO_OUTPUT)
2506 {
2507 p = get_pointer (*((char **) gp));
2508 write_atom (ATOM_INTEGER, &p->integer);
2509 }
2510 else
2511 {
2512 require_atom (ATOM_INTEGER);
2513 p = add_fixup (atom_int, gp);
2514 }
2515
2516 return p;
2517 }
2518
2519
2520 /* Save and load references to components that occur within
2521 expressions. We have to describe these references by a number and
2522 by name. The number is necessary for forward references during
2523 reading, and the name is necessary if the symbol already exists in
2524 the namespace and is not loaded again. */
2525
2526 static void
2527 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2528 {
2529 char name[GFC_MAX_SYMBOL_LEN + 1];
2530 gfc_component *q;
2531 pointer_info *p;
2532
2533 p = mio_pointer_ref (cp);
2534 if (p->type == P_UNKNOWN)
2535 p->type = P_COMPONENT;
2536
2537 if (iomode == IO_OUTPUT)
2538 mio_pool_string (&(*cp)->name);
2539 else
2540 {
2541 mio_internal_string (name);
2542
2543 if (sym && sym->attr.is_class)
2544 sym = sym->components->ts.u.derived;
2545
2546 /* It can happen that a component reference can be read before the
2547 associated derived type symbol has been loaded. Return now and
2548 wait for a later iteration of load_needed. */
2549 if (sym == NULL)
2550 return;
2551
2552 if (sym->components != NULL && p->u.pointer == NULL)
2553 {
2554 /* Symbol already loaded, so search by name. */
2555 q = gfc_find_component (sym, name, true, true);
2556
2557 if (q)
2558 associate_integer_pointer (p, q);
2559 }
2560
2561 /* Make sure this symbol will eventually be loaded. */
2562 p = find_pointer2 (sym);
2563 if (p->u.rsym.state == UNUSED)
2564 p->u.rsym.state = NEEDED;
2565 }
2566 }
2567
2568
2569 static void mio_namespace_ref (gfc_namespace **nsp);
2570 static void mio_formal_arglist (gfc_formal_arglist **formal);
2571 static void mio_typebound_proc (gfc_typebound_proc** proc);
2572
2573 static void
2574 mio_component (gfc_component *c, int vtype)
2575 {
2576 pointer_info *p;
2577 int n;
2578 gfc_formal_arglist *formal;
2579
2580 mio_lparen ();
2581
2582 if (iomode == IO_OUTPUT)
2583 {
2584 p = get_pointer (c);
2585 mio_integer (&p->integer);
2586 }
2587 else
2588 {
2589 mio_integer (&n);
2590 p = get_integer (n);
2591 associate_integer_pointer (p, c);
2592 }
2593
2594 if (p->type == P_UNKNOWN)
2595 p->type = P_COMPONENT;
2596
2597 mio_pool_string (&c->name);
2598 mio_typespec (&c->ts);
2599 mio_array_spec (&c->as);
2600
2601 mio_symbol_attribute (&c->attr);
2602 if (c->ts.type == BT_CLASS)
2603 c->attr.class_ok = 1;
2604 c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types);
2605
2606 if (!vtype || strcmp (c->name, "_final") == 0
2607 || strcmp (c->name, "_hash") == 0)
2608 mio_expr (&c->initializer);
2609
2610 if (c->attr.proc_pointer)
2611 {
2612 if (iomode == IO_OUTPUT)
2613 {
2614 formal = c->formal;
2615 while (formal && !formal->sym)
2616 formal = formal->next;
2617
2618 if (formal)
2619 mio_namespace_ref (&formal->sym->ns);
2620 else
2621 mio_namespace_ref (&c->formal_ns);
2622 }
2623 else
2624 {
2625 mio_namespace_ref (&c->formal_ns);
2626 /* TODO: if (c->formal_ns)
2627 {
2628 c->formal_ns->proc_name = c;
2629 c->refs++;
2630 }*/
2631 }
2632
2633 mio_formal_arglist (&c->formal);
2634
2635 mio_typebound_proc (&c->tb);
2636 }
2637
2638 mio_rparen ();
2639 }
2640
2641
2642 static void
2643 mio_component_list (gfc_component **cp, int vtype)
2644 {
2645 gfc_component *c, *tail;
2646
2647 mio_lparen ();
2648
2649 if (iomode == IO_OUTPUT)
2650 {
2651 for (c = *cp; c; c = c->next)
2652 mio_component (c, vtype);
2653 }
2654 else
2655 {
2656 *cp = NULL;
2657 tail = NULL;
2658
2659 for (;;)
2660 {
2661 if (peek_atom () == ATOM_RPAREN)
2662 break;
2663
2664 c = gfc_get_component ();
2665 mio_component (c, vtype);
2666
2667 if (tail == NULL)
2668 *cp = c;
2669 else
2670 tail->next = c;
2671
2672 tail = c;
2673 }
2674 }
2675
2676 mio_rparen ();
2677 }
2678
2679
2680 static void
2681 mio_actual_arg (gfc_actual_arglist *a)
2682 {
2683 mio_lparen ();
2684 mio_pool_string (&a->name);
2685 mio_expr (&a->expr);
2686 mio_rparen ();
2687 }
2688
2689
2690 static void
2691 mio_actual_arglist (gfc_actual_arglist **ap)
2692 {
2693 gfc_actual_arglist *a, *tail;
2694
2695 mio_lparen ();
2696
2697 if (iomode == IO_OUTPUT)
2698 {
2699 for (a = *ap; a; a = a->next)
2700 mio_actual_arg (a);
2701
2702 }
2703 else
2704 {
2705 tail = NULL;
2706
2707 for (;;)
2708 {
2709 if (peek_atom () != ATOM_LPAREN)
2710 break;
2711
2712 a = gfc_get_actual_arglist ();
2713
2714 if (tail == NULL)
2715 *ap = a;
2716 else
2717 tail->next = a;
2718
2719 tail = a;
2720 mio_actual_arg (a);
2721 }
2722 }
2723
2724 mio_rparen ();
2725 }
2726
2727
2728 /* Read and write formal argument lists. */
2729
2730 static void
2731 mio_formal_arglist (gfc_formal_arglist **formal)
2732 {
2733 gfc_formal_arglist *f, *tail;
2734
2735 mio_lparen ();
2736
2737 if (iomode == IO_OUTPUT)
2738 {
2739 for (f = *formal; f; f = f->next)
2740 mio_symbol_ref (&f->sym);
2741 }
2742 else
2743 {
2744 *formal = tail = NULL;
2745
2746 while (peek_atom () != ATOM_RPAREN)
2747 {
2748 f = gfc_get_formal_arglist ();
2749 mio_symbol_ref (&f->sym);
2750
2751 if (*formal == NULL)
2752 *formal = f;
2753 else
2754 tail->next = f;
2755
2756 tail = f;
2757 }
2758 }
2759
2760 mio_rparen ();
2761 }
2762
2763
2764 /* Save or restore a reference to a symbol node. */
2765
2766 pointer_info *
2767 mio_symbol_ref (gfc_symbol **symp)
2768 {
2769 pointer_info *p;
2770
2771 p = mio_pointer_ref (symp);
2772 if (p->type == P_UNKNOWN)
2773 p->type = P_SYMBOL;
2774
2775 if (iomode == IO_OUTPUT)
2776 {
2777 if (p->u.wsym.state == UNREFERENCED)
2778 p->u.wsym.state = NEEDS_WRITE;
2779 }
2780 else
2781 {
2782 if (p->u.rsym.state == UNUSED)
2783 p->u.rsym.state = NEEDED;
2784 }
2785 return p;
2786 }
2787
2788
2789 /* Save or restore a reference to a symtree node. */
2790
2791 static void
2792 mio_symtree_ref (gfc_symtree **stp)
2793 {
2794 pointer_info *p;
2795 fixup_t *f;
2796
2797 if (iomode == IO_OUTPUT)
2798 mio_symbol_ref (&(*stp)->n.sym);
2799 else
2800 {
2801 require_atom (ATOM_INTEGER);
2802 p = get_integer (atom_int);
2803
2804 /* An unused equivalence member; make a symbol and a symtree
2805 for it. */
2806 if (in_load_equiv && p->u.rsym.symtree == NULL)
2807 {
2808 /* Since this is not used, it must have a unique name. */
2809 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2810
2811 /* Make the symbol. */
2812 if (p->u.rsym.sym == NULL)
2813 {
2814 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2815 gfc_current_ns);
2816 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2817 }
2818
2819 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2820 p->u.rsym.symtree->n.sym->refs++;
2821 p->u.rsym.referenced = 1;
2822
2823 /* If the symbol is PRIVATE and in COMMON, load_commons will
2824 generate a fixup symbol, which must be associated. */
2825 if (p->fixup)
2826 resolve_fixups (p->fixup, p->u.rsym.sym);
2827 p->fixup = NULL;
2828 }
2829
2830 if (p->type == P_UNKNOWN)
2831 p->type = P_SYMBOL;
2832
2833 if (p->u.rsym.state == UNUSED)
2834 p->u.rsym.state = NEEDED;
2835
2836 if (p->u.rsym.symtree != NULL)
2837 {
2838 *stp = p->u.rsym.symtree;
2839 }
2840 else
2841 {
2842 f = XCNEW (fixup_t);
2843
2844 f->next = p->u.rsym.stfixup;
2845 p->u.rsym.stfixup = f;
2846
2847 f->pointer = (void **) stp;
2848 }
2849 }
2850 }
2851
2852
2853 static void
2854 mio_iterator (gfc_iterator **ip)
2855 {
2856 gfc_iterator *iter;
2857
2858 mio_lparen ();
2859
2860 if (iomode == IO_OUTPUT)
2861 {
2862 if (*ip == NULL)
2863 goto done;
2864 }
2865 else
2866 {
2867 if (peek_atom () == ATOM_RPAREN)
2868 {
2869 *ip = NULL;
2870 goto done;
2871 }
2872
2873 *ip = gfc_get_iterator ();
2874 }
2875
2876 iter = *ip;
2877
2878 mio_expr (&iter->var);
2879 mio_expr (&iter->start);
2880 mio_expr (&iter->end);
2881 mio_expr (&iter->step);
2882
2883 done:
2884 mio_rparen ();
2885 }
2886
2887
2888 static void
2889 mio_constructor (gfc_constructor_base *cp)
2890 {
2891 gfc_constructor *c;
2892
2893 mio_lparen ();
2894
2895 if (iomode == IO_OUTPUT)
2896 {
2897 for (c = gfc_constructor_first (*cp); c; c = gfc_constructor_next (c))
2898 {
2899 mio_lparen ();
2900 mio_expr (&c->expr);
2901 mio_iterator (&c->iterator);
2902 mio_rparen ();
2903 }
2904 }
2905 else
2906 {
2907 while (peek_atom () != ATOM_RPAREN)
2908 {
2909 c = gfc_constructor_append_expr (cp, NULL, NULL);
2910
2911 mio_lparen ();
2912 mio_expr (&c->expr);
2913 mio_iterator (&c->iterator);
2914 mio_rparen ();
2915 }
2916 }
2917
2918 mio_rparen ();
2919 }
2920
2921
2922 static const mstring ref_types[] = {
2923 minit ("ARRAY", REF_ARRAY),
2924 minit ("COMPONENT", REF_COMPONENT),
2925 minit ("SUBSTRING", REF_SUBSTRING),
2926 minit (NULL, -1)
2927 };
2928
2929
2930 static void
2931 mio_ref (gfc_ref **rp)
2932 {
2933 gfc_ref *r;
2934
2935 mio_lparen ();
2936
2937 r = *rp;
2938 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2939
2940 switch (r->type)
2941 {
2942 case REF_ARRAY:
2943 mio_array_ref (&r->u.ar);
2944 break;
2945
2946 case REF_COMPONENT:
2947 mio_symbol_ref (&r->u.c.sym);
2948 mio_component_ref (&r->u.c.component, r->u.c.sym);
2949 break;
2950
2951 case REF_SUBSTRING:
2952 mio_expr (&r->u.ss.start);
2953 mio_expr (&r->u.ss.end);
2954 mio_charlen (&r->u.ss.length);
2955 break;
2956 }
2957
2958 mio_rparen ();
2959 }
2960
2961
2962 static void
2963 mio_ref_list (gfc_ref **rp)
2964 {
2965 gfc_ref *ref, *head, *tail;
2966
2967 mio_lparen ();
2968
2969 if (iomode == IO_OUTPUT)
2970 {
2971 for (ref = *rp; ref; ref = ref->next)
2972 mio_ref (&ref);
2973 }
2974 else
2975 {
2976 head = tail = NULL;
2977
2978 while (peek_atom () != ATOM_RPAREN)
2979 {
2980 if (head == NULL)
2981 head = tail = gfc_get_ref ();
2982 else
2983 {
2984 tail->next = gfc_get_ref ();
2985 tail = tail->next;
2986 }
2987
2988 mio_ref (&tail);
2989 }
2990
2991 *rp = head;
2992 }
2993
2994 mio_rparen ();
2995 }
2996
2997
2998 /* Read and write an integer value. */
2999
3000 static void
3001 mio_gmp_integer (mpz_t *integer)
3002 {
3003 char *p;
3004
3005 if (iomode == IO_INPUT)
3006 {
3007 if (parse_atom () != ATOM_STRING)
3008 bad_module ("Expected integer string");
3009
3010 mpz_init (*integer);
3011 if (mpz_set_str (*integer, atom_string, 10))
3012 bad_module ("Error converting integer");
3013
3014 free (atom_string);
3015 }
3016 else
3017 {
3018 p = mpz_get_str (NULL, 10, *integer);
3019 write_atom (ATOM_STRING, p);
3020 free (p);
3021 }
3022 }
3023
3024
3025 static void
3026 mio_gmp_real (mpfr_t *real)
3027 {
3028 mp_exp_t exponent;
3029 char *p;
3030
3031 if (iomode == IO_INPUT)
3032 {
3033 if (parse_atom () != ATOM_STRING)
3034 bad_module ("Expected real string");
3035
3036 mpfr_init (*real);
3037 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
3038 free (atom_string);
3039 }
3040 else
3041 {
3042 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
3043
3044 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
3045 {
3046 write_atom (ATOM_STRING, p);
3047 free (p);
3048 return;
3049 }
3050
3051 atom_string = XCNEWVEC (char, strlen (p) + 20);
3052
3053 sprintf (atom_string, "0.%s@%ld", p, exponent);
3054
3055 /* Fix negative numbers. */
3056 if (atom_string[2] == '-')
3057 {
3058 atom_string[0] = '-';
3059 atom_string[1] = '0';
3060 atom_string[2] = '.';
3061 }
3062
3063 write_atom (ATOM_STRING, atom_string);
3064
3065 free (atom_string);
3066 free (p);
3067 }
3068 }
3069
3070
3071 /* Save and restore the shape of an array constructor. */
3072
3073 static void
3074 mio_shape (mpz_t **pshape, int rank)
3075 {
3076 mpz_t *shape;
3077 atom_type t;
3078 int n;
3079
3080 /* A NULL shape is represented by (). */
3081 mio_lparen ();
3082
3083 if (iomode == IO_OUTPUT)
3084 {
3085 shape = *pshape;
3086 if (!shape)
3087 {
3088 mio_rparen ();
3089 return;
3090 }
3091 }
3092 else
3093 {
3094 t = peek_atom ();
3095 if (t == ATOM_RPAREN)
3096 {
3097 *pshape = NULL;
3098 mio_rparen ();
3099 return;
3100 }
3101
3102 shape = gfc_get_shape (rank);
3103 *pshape = shape;
3104 }
3105
3106 for (n = 0; n < rank; n++)
3107 mio_gmp_integer (&shape[n]);
3108
3109 mio_rparen ();
3110 }
3111
3112
3113 static const mstring expr_types[] = {
3114 minit ("OP", EXPR_OP),
3115 minit ("FUNCTION", EXPR_FUNCTION),
3116 minit ("CONSTANT", EXPR_CONSTANT),
3117 minit ("VARIABLE", EXPR_VARIABLE),
3118 minit ("SUBSTRING", EXPR_SUBSTRING),
3119 minit ("STRUCTURE", EXPR_STRUCTURE),
3120 minit ("ARRAY", EXPR_ARRAY),
3121 minit ("NULL", EXPR_NULL),
3122 minit ("COMPCALL", EXPR_COMPCALL),
3123 minit (NULL, -1)
3124 };
3125
3126 /* INTRINSIC_ASSIGN is missing because it is used as an index for
3127 generic operators, not in expressions. INTRINSIC_USER is also
3128 replaced by the correct function name by the time we see it. */
3129
3130 static const mstring intrinsics[] =
3131 {
3132 minit ("UPLUS", INTRINSIC_UPLUS),
3133 minit ("UMINUS", INTRINSIC_UMINUS),
3134 minit ("PLUS", INTRINSIC_PLUS),
3135 minit ("MINUS", INTRINSIC_MINUS),
3136 minit ("TIMES", INTRINSIC_TIMES),
3137 minit ("DIVIDE", INTRINSIC_DIVIDE),
3138 minit ("POWER", INTRINSIC_POWER),
3139 minit ("CONCAT", INTRINSIC_CONCAT),
3140 minit ("AND", INTRINSIC_AND),
3141 minit ("OR", INTRINSIC_OR),
3142 minit ("EQV", INTRINSIC_EQV),
3143 minit ("NEQV", INTRINSIC_NEQV),
3144 minit ("EQ_SIGN", INTRINSIC_EQ),
3145 minit ("EQ", INTRINSIC_EQ_OS),
3146 minit ("NE_SIGN", INTRINSIC_NE),
3147 minit ("NE", INTRINSIC_NE_OS),
3148 minit ("GT_SIGN", INTRINSIC_GT),
3149 minit ("GT", INTRINSIC_GT_OS),
3150 minit ("GE_SIGN", INTRINSIC_GE),
3151 minit ("GE", INTRINSIC_GE_OS),
3152 minit ("LT_SIGN", INTRINSIC_LT),
3153 minit ("LT", INTRINSIC_LT_OS),
3154 minit ("LE_SIGN", INTRINSIC_LE),
3155 minit ("LE", INTRINSIC_LE_OS),
3156 minit ("NOT", INTRINSIC_NOT),
3157 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
3158 minit (NULL, -1)
3159 };
3160
3161
3162 /* Remedy a couple of situations where the gfc_expr's can be defective. */
3163
3164 static void
3165 fix_mio_expr (gfc_expr *e)
3166 {
3167 gfc_symtree *ns_st = NULL;
3168 const char *fname;
3169
3170 if (iomode != IO_OUTPUT)
3171 return;
3172
3173 if (e->symtree)
3174 {
3175 /* If this is a symtree for a symbol that came from a contained module
3176 namespace, it has a unique name and we should look in the current
3177 namespace to see if the required, non-contained symbol is available
3178 yet. If so, the latter should be written. */
3179 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
3180 {
3181 const char *name = e->symtree->n.sym->name;
3182 if (e->symtree->n.sym->attr.flavor == FL_DERIVED)
3183 name = dt_upper_string (name);
3184 ns_st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3185 }
3186
3187 /* On the other hand, if the existing symbol is the module name or the
3188 new symbol is a dummy argument, do not do the promotion. */
3189 if (ns_st && ns_st->n.sym
3190 && ns_st->n.sym->attr.flavor != FL_MODULE
3191 && !e->symtree->n.sym->attr.dummy)
3192 e->symtree = ns_st;
3193 }
3194 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
3195 {
3196 gfc_symbol *sym;
3197
3198 /* In some circumstances, a function used in an initialization
3199 expression, in one use associated module, can fail to be
3200 coupled to its symtree when used in a specification
3201 expression in another module. */
3202 fname = e->value.function.esym ? e->value.function.esym->name
3203 : e->value.function.isym->name;
3204 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3205
3206 if (e->symtree)
3207 return;
3208
3209 /* This is probably a reference to a private procedure from another
3210 module. To prevent a segfault, make a generic with no specific
3211 instances. If this module is used, without the required
3212 specific coming from somewhere, the appropriate error message
3213 is issued. */
3214 gfc_get_symbol (fname, gfc_current_ns, &sym);
3215 sym->attr.flavor = FL_PROCEDURE;
3216 sym->attr.generic = 1;
3217 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
3218 gfc_commit_symbol (sym);
3219 }
3220 }
3221
3222
3223 /* Read and write expressions. The form "()" is allowed to indicate a
3224 NULL expression. */
3225
3226 static void
3227 mio_expr (gfc_expr **ep)
3228 {
3229 gfc_expr *e;
3230 atom_type t;
3231 int flag;
3232
3233 mio_lparen ();
3234
3235 if (iomode == IO_OUTPUT)
3236 {
3237 if (*ep == NULL)
3238 {
3239 mio_rparen ();
3240 return;
3241 }
3242
3243 e = *ep;
3244 MIO_NAME (expr_t) (e->expr_type, expr_types);
3245 }
3246 else
3247 {
3248 t = parse_atom ();
3249 if (t == ATOM_RPAREN)
3250 {
3251 *ep = NULL;
3252 return;
3253 }
3254
3255 if (t != ATOM_NAME)
3256 bad_module ("Expected expression type");
3257
3258 e = *ep = gfc_get_expr ();
3259 e->where = gfc_current_locus;
3260 e->expr_type = (expr_t) find_enum (expr_types);
3261 }
3262
3263 mio_typespec (&e->ts);
3264 mio_integer (&e->rank);
3265
3266 fix_mio_expr (e);
3267
3268 switch (e->expr_type)
3269 {
3270 case EXPR_OP:
3271 e->value.op.op
3272 = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3273
3274 switch (e->value.op.op)
3275 {
3276 case INTRINSIC_UPLUS:
3277 case INTRINSIC_UMINUS:
3278 case INTRINSIC_NOT:
3279 case INTRINSIC_PARENTHESES:
3280 mio_expr (&e->value.op.op1);
3281 break;
3282
3283 case INTRINSIC_PLUS:
3284 case INTRINSIC_MINUS:
3285 case INTRINSIC_TIMES:
3286 case INTRINSIC_DIVIDE:
3287 case INTRINSIC_POWER:
3288 case INTRINSIC_CONCAT:
3289 case INTRINSIC_AND:
3290 case INTRINSIC_OR:
3291 case INTRINSIC_EQV:
3292 case INTRINSIC_NEQV:
3293 case INTRINSIC_EQ:
3294 case INTRINSIC_EQ_OS:
3295 case INTRINSIC_NE:
3296 case INTRINSIC_NE_OS:
3297 case INTRINSIC_GT:
3298 case INTRINSIC_GT_OS:
3299 case INTRINSIC_GE:
3300 case INTRINSIC_GE_OS:
3301 case INTRINSIC_LT:
3302 case INTRINSIC_LT_OS:
3303 case INTRINSIC_LE:
3304 case INTRINSIC_LE_OS:
3305 mio_expr (&e->value.op.op1);
3306 mio_expr (&e->value.op.op2);
3307 break;
3308
3309 default:
3310 bad_module ("Bad operator");
3311 }
3312
3313 break;
3314
3315 case EXPR_FUNCTION:
3316 mio_symtree_ref (&e->symtree);
3317 mio_actual_arglist (&e->value.function.actual);
3318
3319 if (iomode == IO_OUTPUT)
3320 {
3321 e->value.function.name
3322 = mio_allocated_string (e->value.function.name);
3323 flag = e->value.function.esym != NULL;
3324 mio_integer (&flag);
3325 if (flag)
3326 mio_symbol_ref (&e->value.function.esym);
3327 else
3328 write_atom (ATOM_STRING, e->value.function.isym->name);
3329 }
3330 else
3331 {
3332 require_atom (ATOM_STRING);
3333 e->value.function.name = gfc_get_string (atom_string);
3334 free (atom_string);
3335
3336 mio_integer (&flag);
3337 if (flag)
3338 mio_symbol_ref (&e->value.function.esym);
3339 else
3340 {
3341 require_atom (ATOM_STRING);
3342 e->value.function.isym = gfc_find_function (atom_string);
3343 free (atom_string);
3344 }
3345 }
3346
3347 break;
3348
3349 case EXPR_VARIABLE:
3350 mio_symtree_ref (&e->symtree);
3351 mio_ref_list (&e->ref);
3352 break;
3353
3354 case EXPR_SUBSTRING:
3355 e->value.character.string
3356 = CONST_CAST (gfc_char_t *,
3357 mio_allocated_wide_string (e->value.character.string,
3358 e->value.character.length));
3359 mio_ref_list (&e->ref);
3360 break;
3361
3362 case EXPR_STRUCTURE:
3363 case EXPR_ARRAY:
3364 mio_constructor (&e->value.constructor);
3365 mio_shape (&e->shape, e->rank);
3366 break;
3367
3368 case EXPR_CONSTANT:
3369 switch (e->ts.type)
3370 {
3371 case BT_INTEGER:
3372 mio_gmp_integer (&e->value.integer);
3373 break;
3374
3375 case BT_REAL:
3376 gfc_set_model_kind (e->ts.kind);
3377 mio_gmp_real (&e->value.real);
3378 break;
3379
3380 case BT_COMPLEX:
3381 gfc_set_model_kind (e->ts.kind);
3382 mio_gmp_real (&mpc_realref (e->value.complex));
3383 mio_gmp_real (&mpc_imagref (e->value.complex));
3384 break;
3385
3386 case BT_LOGICAL:
3387 mio_integer (&e->value.logical);
3388 break;
3389
3390 case BT_CHARACTER:
3391 mio_integer (&e->value.character.length);
3392 e->value.character.string
3393 = CONST_CAST (gfc_char_t *,
3394 mio_allocated_wide_string (e->value.character.string,
3395 e->value.character.length));
3396 break;
3397
3398 default:
3399 bad_module ("Bad type in constant expression");
3400 }
3401
3402 break;
3403
3404 case EXPR_NULL:
3405 break;
3406
3407 case EXPR_COMPCALL:
3408 case EXPR_PPC:
3409 gcc_unreachable ();
3410 break;
3411 }
3412
3413 mio_rparen ();
3414 }
3415
3416
3417 /* Read and write namelists. */
3418
3419 static void
3420 mio_namelist (gfc_symbol *sym)
3421 {
3422 gfc_namelist *n, *m;
3423 const char *check_name;
3424
3425 mio_lparen ();
3426
3427 if (iomode == IO_OUTPUT)
3428 {
3429 for (n = sym->namelist; n; n = n->next)
3430 mio_symbol_ref (&n->sym);
3431 }
3432 else
3433 {
3434 /* This departure from the standard is flagged as an error.
3435 It does, in fact, work correctly. TODO: Allow it
3436 conditionally? */
3437 if (sym->attr.flavor == FL_NAMELIST)
3438 {
3439 check_name = find_use_name (sym->name, false);
3440 if (check_name && strcmp (check_name, sym->name) != 0)
3441 gfc_error ("Namelist %s cannot be renamed by USE "
3442 "association to %s", sym->name, check_name);
3443 }
3444
3445 m = NULL;
3446 while (peek_atom () != ATOM_RPAREN)
3447 {
3448 n = gfc_get_namelist ();
3449 mio_symbol_ref (&n->sym);
3450
3451 if (sym->namelist == NULL)
3452 sym->namelist = n;
3453 else
3454 m->next = n;
3455
3456 m = n;
3457 }
3458 sym->namelist_tail = m;
3459 }
3460
3461 mio_rparen ();
3462 }
3463
3464
3465 /* Save/restore lists of gfc_interface structures. When loading an
3466 interface, we are really appending to the existing list of
3467 interfaces. Checking for duplicate and ambiguous interfaces has to
3468 be done later when all symbols have been loaded. */
3469
3470 pointer_info *
3471 mio_interface_rest (gfc_interface **ip)
3472 {
3473 gfc_interface *tail, *p;
3474 pointer_info *pi = NULL;
3475
3476 if (iomode == IO_OUTPUT)
3477 {
3478 if (ip != NULL)
3479 for (p = *ip; p; p = p->next)
3480 mio_symbol_ref (&p->sym);
3481 }
3482 else
3483 {
3484 if (*ip == NULL)
3485 tail = NULL;
3486 else
3487 {
3488 tail = *ip;
3489 while (tail->next)
3490 tail = tail->next;
3491 }
3492
3493 for (;;)
3494 {
3495 if (peek_atom () == ATOM_RPAREN)
3496 break;
3497
3498 p = gfc_get_interface ();
3499 p->where = gfc_current_locus;
3500 pi = mio_symbol_ref (&p->sym);
3501
3502 if (tail == NULL)
3503 *ip = p;
3504 else
3505 tail->next = p;
3506
3507 tail = p;
3508 }
3509 }
3510
3511 mio_rparen ();
3512 return pi;
3513 }
3514
3515
3516 /* Save/restore a nameless operator interface. */
3517
3518 static void
3519 mio_interface (gfc_interface **ip)
3520 {
3521 mio_lparen ();
3522 mio_interface_rest (ip);
3523 }
3524
3525
3526 /* Save/restore a named operator interface. */
3527
3528 static void
3529 mio_symbol_interface (const char **name, const char **module,
3530 gfc_interface **ip)
3531 {
3532 mio_lparen ();
3533 mio_pool_string (name);
3534 mio_pool_string (module);
3535 mio_interface_rest (ip);
3536 }
3537
3538
3539 static void
3540 mio_namespace_ref (gfc_namespace **nsp)
3541 {
3542 gfc_namespace *ns;
3543 pointer_info *p;
3544
3545 p = mio_pointer_ref (nsp);
3546
3547 if (p->type == P_UNKNOWN)
3548 p->type = P_NAMESPACE;
3549
3550 if (iomode == IO_INPUT && p->integer != 0)
3551 {
3552 ns = (gfc_namespace *) p->u.pointer;
3553 if (ns == NULL)
3554 {
3555 ns = gfc_get_namespace (NULL, 0);
3556 associate_integer_pointer (p, ns);
3557 }
3558 else
3559 ns->refs++;
3560 }
3561 }
3562
3563
3564 /* Save/restore the f2k_derived namespace of a derived-type symbol. */
3565
3566 static gfc_namespace* current_f2k_derived;
3567
3568 static void
3569 mio_typebound_proc (gfc_typebound_proc** proc)
3570 {
3571 int flag;
3572 int overriding_flag;
3573
3574 if (iomode == IO_INPUT)
3575 {
3576 *proc = gfc_get_typebound_proc (NULL);
3577 (*proc)->where = gfc_current_locus;
3578 }
3579 gcc_assert (*proc);
3580
3581 mio_lparen ();
3582
3583 (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3584
3585 /* IO the NON_OVERRIDABLE/DEFERRED combination. */
3586 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3587 overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3588 overriding_flag = mio_name (overriding_flag, binding_overriding);
3589 (*proc)->deferred = ((overriding_flag & 2) != 0);
3590 (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3591 gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3592
3593 (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3594 (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3595 (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3596
3597 mio_pool_string (&((*proc)->pass_arg));
3598
3599 flag = (int) (*proc)->pass_arg_num;
3600 mio_integer (&flag);
3601 (*proc)->pass_arg_num = (unsigned) flag;
3602
3603 if ((*proc)->is_generic)
3604 {
3605 gfc_tbp_generic* g;
3606 int iop;
3607
3608 mio_lparen ();
3609
3610 if (iomode == IO_OUTPUT)
3611 for (g = (*proc)->u.generic; g; g = g->next)
3612 {
3613 iop = (int) g->is_operator;
3614 mio_integer (&iop);
3615 mio_allocated_string (g->specific_st->name);
3616 }
3617 else
3618 {
3619 (*proc)->u.generic = NULL;
3620 while (peek_atom () != ATOM_RPAREN)
3621 {
3622 gfc_symtree** sym_root;
3623
3624 g = gfc_get_tbp_generic ();
3625 g->specific = NULL;
3626
3627 mio_integer (&iop);
3628 g->is_operator = (bool) iop;
3629
3630 require_atom (ATOM_STRING);
3631 sym_root = &current_f2k_derived->tb_sym_root;
3632 g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3633 free (atom_string);
3634
3635 g->next = (*proc)->u.generic;
3636 (*proc)->u.generic = g;
3637 }
3638 }
3639
3640 mio_rparen ();
3641 }
3642 else if (!(*proc)->ppc)
3643 mio_symtree_ref (&(*proc)->u.specific);
3644
3645 mio_rparen ();
3646 }
3647
3648 /* Walker-callback function for this purpose. */
3649 static void
3650 mio_typebound_symtree (gfc_symtree* st)
3651 {
3652 if (iomode == IO_OUTPUT && !st->n.tb)
3653 return;
3654
3655 if (iomode == IO_OUTPUT)
3656 {
3657 mio_lparen ();
3658 mio_allocated_string (st->name);
3659 }
3660 /* For IO_INPUT, the above is done in mio_f2k_derived. */
3661
3662 mio_typebound_proc (&st->n.tb);
3663 mio_rparen ();
3664 }
3665
3666 /* IO a full symtree (in all depth). */
3667 static void
3668 mio_full_typebound_tree (gfc_symtree** root)
3669 {
3670 mio_lparen ();
3671
3672 if (iomode == IO_OUTPUT)
3673 gfc_traverse_symtree (*root, &mio_typebound_symtree);
3674 else
3675 {
3676 while (peek_atom () == ATOM_LPAREN)
3677 {
3678 gfc_symtree* st;
3679
3680 mio_lparen ();
3681
3682 require_atom (ATOM_STRING);
3683 st = gfc_get_tbp_symtree (root, atom_string);
3684 free (atom_string);
3685
3686 mio_typebound_symtree (st);
3687 }
3688 }
3689
3690 mio_rparen ();
3691 }
3692
3693 static void
3694 mio_finalizer (gfc_finalizer **f)
3695 {
3696 if (iomode == IO_OUTPUT)
3697 {
3698 gcc_assert (*f);
3699 gcc_assert ((*f)->proc_tree); /* Should already be resolved. */
3700 mio_symtree_ref (&(*f)->proc_tree);
3701 }
3702 else
3703 {
3704 *f = gfc_get_finalizer ();
3705 (*f)->where = gfc_current_locus; /* Value should not matter. */
3706 (*f)->next = NULL;
3707
3708 mio_symtree_ref (&(*f)->proc_tree);
3709 (*f)->proc_sym = NULL;
3710 }
3711 }
3712
3713 static void
3714 mio_f2k_derived (gfc_namespace *f2k)
3715 {
3716 current_f2k_derived = f2k;
3717
3718 /* Handle the list of finalizer procedures. */
3719 mio_lparen ();
3720 if (iomode == IO_OUTPUT)
3721 {
3722 gfc_finalizer *f;
3723 for (f = f2k->finalizers; f; f = f->next)
3724 mio_finalizer (&f);
3725 }
3726 else
3727 {
3728 f2k->finalizers = NULL;
3729 while (peek_atom () != ATOM_RPAREN)
3730 {
3731 gfc_finalizer *cur = NULL;
3732 mio_finalizer (&cur);
3733 cur->next = f2k->finalizers;
3734 f2k->finalizers = cur;
3735 }
3736 }
3737 mio_rparen ();
3738
3739 /* Handle type-bound procedures. */
3740 mio_full_typebound_tree (&f2k->tb_sym_root);
3741
3742 /* Type-bound user operators. */
3743 mio_full_typebound_tree (&f2k->tb_uop_root);
3744
3745 /* Type-bound intrinsic operators. */
3746 mio_lparen ();
3747 if (iomode == IO_OUTPUT)
3748 {
3749 int op;
3750 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3751 {
3752 gfc_intrinsic_op realop;
3753
3754 if (op == INTRINSIC_USER || !f2k->tb_op[op])
3755 continue;
3756
3757 mio_lparen ();
3758 realop = (gfc_intrinsic_op) op;
3759 mio_intrinsic_op (&realop);
3760 mio_typebound_proc (&f2k->tb_op[op]);
3761 mio_rparen ();
3762 }
3763 }
3764 else
3765 while (peek_atom () != ATOM_RPAREN)
3766 {
3767 gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC. */
3768
3769 mio_lparen ();
3770 mio_intrinsic_op (&op);
3771 mio_typebound_proc (&f2k->tb_op[op]);
3772 mio_rparen ();
3773 }
3774 mio_rparen ();
3775 }
3776
3777 static void
3778 mio_full_f2k_derived (gfc_symbol *sym)
3779 {
3780 mio_lparen ();
3781
3782 if (iomode == IO_OUTPUT)
3783 {
3784 if (sym->f2k_derived)
3785 mio_f2k_derived (sym->f2k_derived);
3786 }
3787 else
3788 {
3789 if (peek_atom () != ATOM_RPAREN)
3790 {
3791 sym->f2k_derived = gfc_get_namespace (NULL, 0);
3792 mio_f2k_derived (sym->f2k_derived);
3793 }
3794 else
3795 gcc_assert (!sym->f2k_derived);
3796 }
3797
3798 mio_rparen ();
3799 }
3800
3801
3802 /* Unlike most other routines, the address of the symbol node is already
3803 fixed on input and the name/module has already been filled in. */
3804
3805 static void
3806 mio_symbol (gfc_symbol *sym)
3807 {
3808 int intmod = INTMOD_NONE;
3809
3810 mio_lparen ();
3811
3812 mio_symbol_attribute (&sym->attr);
3813 mio_typespec (&sym->ts);
3814 if (sym->ts.type == BT_CLASS)
3815 sym->attr.class_ok = 1;
3816
3817 if (iomode == IO_OUTPUT)
3818 mio_namespace_ref (&sym->formal_ns);
3819 else
3820 {
3821 mio_namespace_ref (&sym->formal_ns);
3822 if (sym->formal_ns)
3823 sym->formal_ns->proc_name = sym;
3824 }
3825
3826 /* Save/restore common block links. */
3827 mio_symbol_ref (&sym->common_next);
3828
3829 mio_formal_arglist (&sym->formal);
3830
3831 if (sym->attr.flavor == FL_PARAMETER)
3832 mio_expr (&sym->value);
3833
3834 mio_array_spec (&sym->as);
3835
3836 mio_symbol_ref (&sym->result);
3837
3838 if (sym->attr.cray_pointee)
3839 mio_symbol_ref (&sym->cp_pointer);
3840
3841 /* Note that components are always saved, even if they are supposed
3842 to be private. Component access is checked during searching. */
3843
3844 mio_component_list (&sym->components, sym->attr.vtype);
3845
3846 if (sym->components != NULL)
3847 sym->component_access
3848 = MIO_NAME (gfc_access) (sym->component_access, access_types);
3849
3850 /* Load/save the f2k_derived namespace of a derived-type symbol. */
3851 mio_full_f2k_derived (sym);
3852
3853 mio_namelist (sym);
3854
3855 /* Add the fields that say whether this is from an intrinsic module,
3856 and if so, what symbol it is within the module. */
3857 /* mio_integer (&(sym->from_intmod)); */
3858 if (iomode == IO_OUTPUT)
3859 {
3860 intmod = sym->from_intmod;
3861 mio_integer (&intmod);
3862 }
3863 else
3864 {
3865 mio_integer (&intmod);
3866 sym->from_intmod = (intmod_id) intmod;
3867 }
3868
3869 mio_integer (&(sym->intmod_sym_id));
3870
3871 if (sym->attr.flavor == FL_DERIVED)
3872 mio_integer (&(sym->hash_value));
3873
3874 mio_rparen ();
3875 }
3876
3877
3878 /************************* Top level subroutines *************************/
3879
3880 /* Given a root symtree node and a symbol, try to find a symtree that
3881 references the symbol that is not a unique name. */
3882
3883 static gfc_symtree *
3884 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3885 {
3886 gfc_symtree *s = NULL;
3887
3888 if (st == NULL)
3889 return s;
3890
3891 s = find_symtree_for_symbol (st->right, sym);
3892 if (s != NULL)
3893 return s;
3894 s = find_symtree_for_symbol (st->left, sym);
3895 if (s != NULL)
3896 return s;
3897
3898 if (st->n.sym == sym && !check_unique_name (st->name))
3899 return st;
3900
3901 return s;
3902 }
3903
3904
3905 /* A recursive function to look for a specific symbol by name and by
3906 module. Whilst several symtrees might point to one symbol, its
3907 is sufficient for the purposes here than one exist. Note that
3908 generic interfaces are distinguished as are symbols that have been
3909 renamed in another module. */
3910 static gfc_symtree *
3911 find_symbol (gfc_symtree *st, const char *name,
3912 const char *module, int generic)
3913 {
3914 int c;
3915 gfc_symtree *retval, *s;
3916
3917 if (st == NULL || st->n.sym == NULL)
3918 return NULL;
3919
3920 c = strcmp (name, st->n.sym->name);
3921 if (c == 0 && st->n.sym->module
3922 && strcmp (module, st->n.sym->module) == 0
3923 && !check_unique_name (st->name))
3924 {
3925 s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3926
3927 /* Detect symbols that are renamed by use association in another
3928 module by the absence of a symtree and null attr.use_rename,
3929 since the latter is not transmitted in the module file. */
3930 if (((!generic && !st->n.sym->attr.generic)
3931 || (generic && st->n.sym->attr.generic))
3932 && !(s == NULL && !st->n.sym->attr.use_rename))
3933 return st;
3934 }
3935
3936 retval = find_symbol (st->left, name, module, generic);
3937
3938 if (retval == NULL)
3939 retval = find_symbol (st->right, name, module, generic);
3940
3941 return retval;
3942 }
3943
3944
3945 /* Skip a list between balanced left and right parens. */
3946
3947 static void
3948 skip_list (void)
3949 {
3950 int level;
3951
3952 level = 0;
3953 do
3954 {
3955 switch (parse_atom ())
3956 {
3957 case ATOM_LPAREN:
3958 level++;
3959 break;
3960
3961 case ATOM_RPAREN:
3962 level--;
3963 break;
3964
3965 case ATOM_STRING:
3966 free (atom_string);
3967 break;
3968
3969 case ATOM_NAME:
3970 case ATOM_INTEGER:
3971 break;
3972 }
3973 }
3974 while (level > 0);
3975 }
3976
3977
3978 /* Load operator interfaces from the module. Interfaces are unusual
3979 in that they attach themselves to existing symbols. */
3980
3981 static void
3982 load_operator_interfaces (void)
3983 {
3984 const char *p;
3985 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3986 gfc_user_op *uop;
3987 pointer_info *pi = NULL;
3988 int n, i;
3989
3990 mio_lparen ();
3991
3992 while (peek_atom () != ATOM_RPAREN)
3993 {
3994 mio_lparen ();
3995
3996 mio_internal_string (name);
3997 mio_internal_string (module);
3998
3999 n = number_use_names (name, true);
4000 n = n ? n : 1;
4001
4002 for (i = 1; i <= n; i++)
4003 {
4004 /* Decide if we need to load this one or not. */
4005 p = find_use_name_n (name, &i, true);
4006
4007 if (p == NULL)
4008 {
4009 while (parse_atom () != ATOM_RPAREN);
4010 continue;
4011 }
4012
4013 if (i == 1)
4014 {
4015 uop = gfc_get_uop (p);
4016 pi = mio_interface_rest (&uop->op);
4017 }
4018 else
4019 {
4020 if (gfc_find_uop (p, NULL))
4021 continue;
4022 uop = gfc_get_uop (p);
4023 uop->op = gfc_get_interface ();
4024 uop->op->where = gfc_current_locus;
4025 add_fixup (pi->integer, &uop->op->sym);
4026 }
4027 }
4028 }
4029
4030 mio_rparen ();
4031 }
4032
4033
4034 /* Load interfaces from the module. Interfaces are unusual in that
4035 they attach themselves to existing symbols. */
4036
4037 static void
4038 load_generic_interfaces (void)
4039 {
4040 const char *p;
4041 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
4042 gfc_symbol *sym;
4043 gfc_interface *generic = NULL, *gen = NULL;
4044 int n, i, renamed;
4045 bool ambiguous_set = false;
4046
4047 mio_lparen ();
4048
4049 while (peek_atom () != ATOM_RPAREN)
4050 {
4051 mio_lparen ();
4052
4053 mio_internal_string (name);
4054 mio_internal_string (module);
4055
4056 n = number_use_names (name, false);
4057 renamed = n ? 1 : 0;
4058 n = n ? n : 1;
4059
4060 for (i = 1; i <= n; i++)
4061 {
4062 gfc_symtree *st;
4063 /* Decide if we need to load this one or not. */
4064 p = find_use_name_n (name, &i, false);
4065
4066 st = find_symbol (gfc_current_ns->sym_root,
4067 name, module_name, 1);
4068
4069 if (!p || gfc_find_symbol (p, NULL, 0, &sym))
4070 {
4071 /* Skip the specific names for these cases. */
4072 while (i == 1 && parse_atom () != ATOM_RPAREN);
4073
4074 continue;
4075 }
4076
4077 /* If the symbol exists already and is being USEd without being
4078 in an ONLY clause, do not load a new symtree(11.3.2). */
4079 if (!only_flag && st)
4080 sym = st->n.sym;
4081
4082 if (!sym)
4083 {
4084 if (st)
4085 {
4086 sym = st->n.sym;
4087 if (strcmp (st->name, p) != 0)
4088 {
4089 st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
4090 st->n.sym = sym;
4091 sym->refs++;
4092 }
4093 }
4094
4095 /* Since we haven't found a valid generic interface, we had
4096 better make one. */
4097 if (!sym)
4098 {
4099 gfc_get_symbol (p, NULL, &sym);
4100 sym->name = gfc_get_string (name);
4101 sym->module = module_name;
4102 sym->attr.flavor = FL_PROCEDURE;
4103 sym->attr.generic = 1;
4104 sym->attr.use_assoc = 1;
4105 }
4106 }
4107 else
4108 {
4109 /* Unless sym is a generic interface, this reference
4110 is ambiguous. */
4111 if (st == NULL)
4112 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4113
4114 sym = st->n.sym;
4115
4116 if (st && !sym->attr.generic
4117 && !st->ambiguous
4118 && sym->module
4119 && strcmp(module, sym->module))
4120 {
4121 ambiguous_set = true;
4122 st->ambiguous = 1;
4123 }
4124 }
4125
4126 sym->attr.use_only = only_flag;
4127 sym->attr.use_rename = renamed;
4128
4129 if (i == 1)
4130 {
4131 mio_interface_rest (&sym->generic);
4132 generic = sym->generic;
4133 }
4134 else if (!sym->generic)
4135 {
4136 sym->generic = generic;
4137 sym->attr.generic_copy = 1;
4138 }
4139
4140 /* If a procedure that is not generic has generic interfaces
4141 that include itself, it is generic! We need to take care
4142 to retain symbols ambiguous that were already so. */
4143 if (sym->attr.use_assoc
4144 && !sym->attr.generic
4145 && sym->attr.flavor == FL_PROCEDURE)
4146 {
4147 for (gen = generic; gen; gen = gen->next)
4148 {
4149 if (gen->sym == sym)
4150 {
4151 sym->attr.generic = 1;
4152 if (ambiguous_set)
4153 st->ambiguous = 0;
4154 break;
4155 }
4156 }
4157 }
4158
4159 }
4160 }
4161
4162 mio_rparen ();
4163 }
4164
4165
4166 /* Load common blocks. */
4167
4168 static void
4169 load_commons (void)
4170 {
4171 char name[GFC_MAX_SYMBOL_LEN + 1];
4172 gfc_common_head *p;
4173
4174 mio_lparen ();
4175
4176 while (peek_atom () != ATOM_RPAREN)
4177 {
4178 int flags;
4179 char* label;
4180 mio_lparen ();
4181 mio_internal_string (name);
4182
4183 p = gfc_get_common (name, 1);
4184
4185 mio_symbol_ref (&p->head);
4186 mio_integer (&flags);
4187 if (flags & 1)
4188 p->saved = 1;
4189 if (flags & 2)
4190 p->threadprivate = 1;
4191 p->use_assoc = 1;
4192
4193 /* Get whether this was a bind(c) common or not. */
4194 mio_integer (&p->is_bind_c);
4195 /* Get the binding label. */
4196 label = read_string ();
4197 if (strlen (label))
4198 p->binding_label = IDENTIFIER_POINTER (get_identifier (label));
4199 XDELETEVEC (label);
4200
4201 mio_rparen ();
4202 }
4203
4204 mio_rparen ();
4205 }
4206
4207
4208 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
4209 so that unused variables are not loaded and so that the expression can
4210 be safely freed. */
4211
4212 static void
4213 load_equiv (void)
4214 {
4215 gfc_equiv *head, *tail, *end, *eq;
4216 bool unused;
4217
4218 mio_lparen ();
4219 in_load_equiv = true;
4220
4221 end = gfc_current_ns->equiv;
4222 while (end != NULL && end->next != NULL)
4223 end = end->next;
4224
4225 while (peek_atom () != ATOM_RPAREN) {
4226 mio_lparen ();
4227 head = tail = NULL;
4228
4229 while(peek_atom () != ATOM_RPAREN)
4230 {
4231 if (head == NULL)
4232 head = tail = gfc_get_equiv ();
4233 else
4234 {
4235 tail->eq = gfc_get_equiv ();
4236 tail = tail->eq;
4237 }
4238
4239 mio_pool_string (&tail->module);
4240 mio_expr (&tail->expr);
4241 }
4242
4243 /* Unused equivalence members have a unique name. In addition, it
4244 must be checked that the symbols are from the same module. */
4245 unused = true;
4246 for (eq = head; eq; eq = eq->eq)
4247 {
4248 if (eq->expr->symtree->n.sym->module
4249 && head->expr->symtree->n.sym->module
4250 && strcmp (head->expr->symtree->n.sym->module,
4251 eq->expr->symtree->n.sym->module) == 0
4252 && !check_unique_name (eq->expr->symtree->name))
4253 {
4254 unused = false;
4255 break;
4256 }
4257 }
4258
4259 if (unused)
4260 {
4261 for (eq = head; eq; eq = head)
4262 {
4263 head = eq->eq;
4264 gfc_free_expr (eq->expr);
4265 free (eq);
4266 }
4267 }
4268
4269 if (end == NULL)
4270 gfc_current_ns->equiv = head;
4271 else
4272 end->next = head;
4273
4274 if (head != NULL)
4275 end = head;
4276
4277 mio_rparen ();
4278 }
4279
4280 mio_rparen ();
4281 in_load_equiv = false;
4282 }
4283
4284
4285 /* This function loads the sym_root of f2k_derived with the extensions to
4286 the derived type. */
4287 static void
4288 load_derived_extensions (void)
4289 {
4290 int symbol, j;
4291 gfc_symbol *derived;
4292 gfc_symbol *dt;
4293 gfc_symtree *st;
4294 pointer_info *info;
4295 char name[GFC_MAX_SYMBOL_LEN + 1];
4296 char module[GFC_MAX_SYMBOL_LEN + 1];
4297 const char *p;
4298
4299 mio_lparen ();
4300 while (peek_atom () != ATOM_RPAREN)
4301 {
4302 mio_lparen ();
4303 mio_integer (&symbol);
4304 info = get_integer (symbol);
4305 derived = info->u.rsym.sym;
4306
4307 /* This one is not being loaded. */
4308 if (!info || !derived)
4309 {
4310 while (peek_atom () != ATOM_RPAREN)
4311 skip_list ();
4312 continue;
4313 }
4314
4315 gcc_assert (derived->attr.flavor == FL_DERIVED);
4316 if (derived->f2k_derived == NULL)
4317 derived->f2k_derived = gfc_get_namespace (NULL, 0);
4318
4319 while (peek_atom () != ATOM_RPAREN)
4320 {
4321 mio_lparen ();
4322 mio_internal_string (name);
4323 mio_internal_string (module);
4324
4325 /* Only use one use name to find the symbol. */
4326 j = 1;
4327 p = find_use_name_n (name, &j, false);
4328 if (p)
4329 {
4330 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4331 dt = st->n.sym;
4332 st = gfc_find_symtree (derived->f2k_derived->sym_root, name);
4333 if (st == NULL)
4334 {
4335 /* Only use the real name in f2k_derived to ensure a single
4336 symtree. */
4337 st = gfc_new_symtree (&derived->f2k_derived->sym_root, name);
4338 st->n.sym = dt;
4339 st->n.sym->refs++;
4340 }
4341 }
4342 mio_rparen ();
4343 }
4344 mio_rparen ();
4345 }
4346 mio_rparen ();
4347 }
4348
4349
4350 /* Recursive function to traverse the pointer_info tree and load a
4351 needed symbol. We return nonzero if we load a symbol and stop the
4352 traversal, because the act of loading can alter the tree. */
4353
4354 static int
4355 load_needed (pointer_info *p)
4356 {
4357 gfc_namespace *ns;
4358 pointer_info *q;
4359 gfc_symbol *sym;
4360 int rv;
4361
4362 rv = 0;
4363 if (p == NULL)
4364 return rv;
4365
4366 rv |= load_needed (p->left);
4367 rv |= load_needed (p->right);
4368
4369 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
4370 return rv;
4371
4372 p->u.rsym.state = USED;
4373
4374 set_module_locus (&p->u.rsym.where);
4375
4376 sym = p->u.rsym.sym;
4377 if (sym == NULL)
4378 {
4379 q = get_integer (p->u.rsym.ns);
4380
4381 ns = (gfc_namespace *) q->u.pointer;
4382 if (ns == NULL)
4383 {
4384 /* Create an interface namespace if necessary. These are
4385 the namespaces that hold the formal parameters of module
4386 procedures. */
4387
4388 ns = gfc_get_namespace (NULL, 0);
4389 associate_integer_pointer (q, ns);
4390 }
4391
4392 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
4393 doesn't go pear-shaped if the symbol is used. */
4394 if (!ns->proc_name)
4395 gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
4396 1, &ns->proc_name);
4397
4398 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
4399 sym->name = dt_lower_string (p->u.rsym.true_name);
4400 sym->module = gfc_get_string (p->u.rsym.module);
4401 if (p->u.rsym.binding_label)
4402 sym->binding_label = IDENTIFIER_POINTER (get_identifier
4403 (p->u.rsym.binding_label));
4404
4405 associate_integer_pointer (p, sym);
4406 }
4407
4408 mio_symbol (sym);
4409 sym->attr.use_assoc = 1;
4410
4411 /* Mark as only or rename for later diagnosis for explicitly imported
4412 but not used warnings; don't mark internal symbols such as __vtab,
4413 __def_init etc. Only mark them if they have been explicitly loaded. */
4414
4415 if (only_flag && sym->name[0] != '_' && sym->name[1] != '_')
4416 {
4417 gfc_use_rename *u;
4418
4419 /* Search the use/rename list for the variable; if the variable is
4420 found, mark it. */
4421 for (u = gfc_rename_list; u; u = u->next)
4422 {
4423 if (strcmp (u->use_name, sym->name) == 0)
4424 {
4425 sym->attr.use_only = 1;
4426 break;
4427 }
4428 }
4429 }
4430
4431 if (p->u.rsym.renamed)
4432 sym->attr.use_rename = 1;
4433
4434 return 1;
4435 }
4436
4437
4438 /* Recursive function for cleaning up things after a module has been read. */
4439
4440 static void
4441 read_cleanup (pointer_info *p)
4442 {
4443 gfc_symtree *st;
4444 pointer_info *q;
4445
4446 if (p == NULL)
4447 return;
4448
4449 read_cleanup (p->left);
4450 read_cleanup (p->right);
4451
4452 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
4453 {
4454 gfc_namespace *ns;
4455 /* Add hidden symbols to the symtree. */
4456 q = get_integer (p->u.rsym.ns);
4457 ns = (gfc_namespace *) q->u.pointer;
4458
4459 if (!p->u.rsym.sym->attr.vtype
4460 && !p->u.rsym.sym->attr.vtab)
4461 st = gfc_get_unique_symtree (ns);
4462 else
4463 {
4464 /* There is no reason to use 'unique_symtrees' for vtabs or
4465 vtypes - their name is fine for a symtree and reduces the
4466 namespace pollution. */
4467 st = gfc_find_symtree (ns->sym_root, p->u.rsym.sym->name);
4468 if (!st)
4469 st = gfc_new_symtree (&ns->sym_root, p->u.rsym.sym->name);
4470 }
4471
4472 st->n.sym = p->u.rsym.sym;
4473 st->n.sym->refs++;
4474
4475 /* Fixup any symtree references. */
4476 p->u.rsym.symtree = st;
4477 resolve_fixups (p->u.rsym.stfixup, st);
4478 p->u.rsym.stfixup = NULL;
4479 }
4480
4481 /* Free unused symbols. */
4482 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
4483 gfc_free_symbol (p->u.rsym.sym);
4484 }
4485
4486
4487 /* It is not quite enough to check for ambiguity in the symbols by
4488 the loaded symbol and the new symbol not being identical. */
4489 static bool
4490 check_for_ambiguous (gfc_symbol *st_sym, pointer_info *info)
4491 {
4492 gfc_symbol *rsym;
4493 module_locus locus;
4494 symbol_attribute attr;
4495
4496 if (st_sym->name == gfc_current_ns->proc_name->name)
4497 {
4498 gfc_error ("'%s' of module '%s', imported at %C, is also the name of the "
4499 "current program unit", st_sym->name, module_name);
4500 return true;
4501 }
4502
4503 rsym = info->u.rsym.sym;
4504 if (st_sym == rsym)
4505 return false;
4506
4507 if (st_sym->attr.vtab || st_sym->attr.vtype)
4508 return false;
4509
4510 /* If the existing symbol is generic from a different module and
4511 the new symbol is generic there can be no ambiguity. */
4512 if (st_sym->attr.generic
4513 && st_sym->module
4514 && st_sym->module != module_name)
4515 {
4516 /* The new symbol's attributes have not yet been read. Since
4517 we need attr.generic, read it directly. */
4518 get_module_locus (&locus);
4519 set_module_locus (&info->u.rsym.where);
4520 mio_lparen ();
4521 attr.generic = 0;
4522 mio_symbol_attribute (&attr);
4523 set_module_locus (&locus);
4524 if (attr.generic)
4525 return false;
4526 }
4527
4528 return true;
4529 }
4530
4531
4532 /* Read a module file. */
4533
4534 static void
4535 read_module (void)
4536 {
4537 module_locus operator_interfaces, user_operators, extensions;
4538 const char *p;
4539 char name[GFC_MAX_SYMBOL_LEN + 1];
4540 int i;
4541 int ambiguous, j, nuse, symbol;
4542 pointer_info *info, *q;
4543 gfc_use_rename *u = NULL;
4544 gfc_symtree *st;
4545 gfc_symbol *sym;
4546
4547 get_module_locus (&operator_interfaces); /* Skip these for now. */
4548 skip_list ();
4549
4550 get_module_locus (&user_operators);
4551 skip_list ();
4552 skip_list ();
4553
4554 /* Skip commons, equivalences and derived type extensions for now. */
4555 skip_list ();
4556 skip_list ();
4557
4558 get_module_locus (&extensions);
4559 skip_list ();
4560
4561 mio_lparen ();
4562
4563 /* Create the fixup nodes for all the symbols. */
4564
4565 while (peek_atom () != ATOM_RPAREN)
4566 {
4567 char* bind_label;
4568 require_atom (ATOM_INTEGER);
4569 info = get_integer (atom_int);
4570
4571 info->type = P_SYMBOL;
4572 info->u.rsym.state = UNUSED;
4573
4574 info->u.rsym.true_name = read_string ();
4575 info->u.rsym.module = read_string ();
4576 bind_label = read_string ();
4577 if (strlen (bind_label))
4578 info->u.rsym.binding_label = bind_label;
4579 else
4580 XDELETEVEC (bind_label);
4581
4582 require_atom (ATOM_INTEGER);
4583 info->u.rsym.ns = atom_int;
4584
4585 get_module_locus (&info->u.rsym.where);
4586 skip_list ();
4587
4588 /* See if the symbol has already been loaded by a previous module.
4589 If so, we reference the existing symbol and prevent it from
4590 being loaded again. This should not happen if the symbol being
4591 read is an index for an assumed shape dummy array (ns != 1). */
4592
4593 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
4594
4595 if (sym == NULL
4596 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
4597 continue;
4598
4599 info->u.rsym.state = USED;
4600 info->u.rsym.sym = sym;
4601
4602 /* Some symbols do not have a namespace (eg. formal arguments),
4603 so the automatic "unique symtree" mechanism must be suppressed
4604 by marking them as referenced. */
4605 q = get_integer (info->u.rsym.ns);
4606 if (q->u.pointer == NULL)
4607 {
4608 info->u.rsym.referenced = 1;
4609 continue;
4610 }
4611
4612 /* If possible recycle the symtree that references the symbol.
4613 If a symtree is not found and the module does not import one,
4614 a unique-name symtree is found by read_cleanup. */
4615 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
4616 if (st != NULL)
4617 {
4618 info->u.rsym.symtree = st;
4619 info->u.rsym.referenced = 1;
4620 }
4621 }
4622
4623 mio_rparen ();
4624
4625 /* Parse the symtree lists. This lets us mark which symbols need to
4626 be loaded. Renaming is also done at this point by replacing the
4627 symtree name. */
4628
4629 mio_lparen ();
4630
4631 while (peek_atom () != ATOM_RPAREN)
4632 {
4633 mio_internal_string (name);
4634 mio_integer (&ambiguous);
4635 mio_integer (&symbol);
4636
4637 info = get_integer (symbol);
4638
4639 /* See how many use names there are. If none, go through the start
4640 of the loop at least once. */
4641 nuse = number_use_names (name, false);
4642 info->u.rsym.renamed = nuse ? 1 : 0;
4643
4644 if (nuse == 0)
4645 nuse = 1;
4646
4647 for (j = 1; j <= nuse; j++)
4648 {
4649 /* Get the jth local name for this symbol. */
4650 p = find_use_name_n (name, &j, false);
4651
4652 if (p == NULL && strcmp (name, module_name) == 0)
4653 p = name;
4654
4655 /* Exception: Always import vtabs & vtypes. */
4656 if (p == NULL && name[0] == '_'
4657 && (strncmp (name, "__vtab_", 5) == 0
4658 || strncmp (name, "__vtype_", 6) == 0))
4659 p = name;
4660
4661 /* Skip symtree nodes not in an ONLY clause, unless there
4662 is an existing symtree loaded from another USE statement. */
4663 if (p == NULL)
4664 {
4665 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4666 if (st != NULL
4667 && strcmp (st->n.sym->name, info->u.rsym.true_name) == 0
4668 && st->n.sym->module != NULL
4669 && strcmp (st->n.sym->module, info->u.rsym.module) == 0)
4670 {
4671 info->u.rsym.symtree = st;
4672 info->u.rsym.sym = st->n.sym;
4673 }
4674 continue;
4675 }
4676
4677 /* If a symbol of the same name and module exists already,
4678 this symbol, which is not in an ONLY clause, must not be
4679 added to the namespace(11.3.2). Note that find_symbol
4680 only returns the first occurrence that it finds. */
4681 if (!only_flag && !info->u.rsym.renamed
4682 && strcmp (name, module_name) != 0
4683 && find_symbol (gfc_current_ns->sym_root, name,
4684 module_name, 0))
4685 continue;
4686
4687 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
4688
4689 if (st != NULL)
4690 {
4691 /* Check for ambiguous symbols. */
4692 if (check_for_ambiguous (st->n.sym, info))
4693 st->ambiguous = 1;
4694 else
4695 info->u.rsym.symtree = st;
4696 }
4697 else
4698 {
4699 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
4700
4701 /* Create a symtree node in the current namespace for this
4702 symbol. */
4703 st = check_unique_name (p)
4704 ? gfc_get_unique_symtree (gfc_current_ns)
4705 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
4706 st->ambiguous = ambiguous;
4707
4708 sym = info->u.rsym.sym;
4709
4710 /* Create a symbol node if it doesn't already exist. */
4711 if (sym == NULL)
4712 {
4713 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
4714 gfc_current_ns);
4715 info->u.rsym.sym->name = dt_lower_string (info->u.rsym.true_name);
4716 sym = info->u.rsym.sym;
4717 sym->module = gfc_get_string (info->u.rsym.module);
4718
4719 if (info->u.rsym.binding_label)
4720 sym->binding_label =
4721 IDENTIFIER_POINTER (get_identifier
4722 (info->u.rsym.binding_label));
4723 }
4724
4725 st->n.sym = sym;
4726 st->n.sym->refs++;
4727
4728 if (strcmp (name, p) != 0)
4729 sym->attr.use_rename = 1;
4730
4731 if (name[0] != '_'
4732 || (strncmp (name, "__vtab_", 5) != 0
4733 && strncmp (name, "__vtype_", 6) != 0))
4734 sym->attr.use_only = only_flag;
4735
4736 /* Store the symtree pointing to this symbol. */
4737 info->u.rsym.symtree = st;
4738
4739 if (info->u.rsym.state == UNUSED)
4740 info->u.rsym.state = NEEDED;
4741 info->u.rsym.referenced = 1;
4742 }
4743 }
4744 }
4745
4746 mio_rparen ();
4747
4748 /* Load intrinsic operator interfaces. */
4749 set_module_locus (&operator_interfaces);
4750 mio_lparen ();
4751
4752 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4753 {
4754 if (i == INTRINSIC_USER)
4755 continue;
4756
4757 if (only_flag)
4758 {
4759 u = find_use_operator ((gfc_intrinsic_op) i);
4760
4761 if (u == NULL)
4762 {
4763 skip_list ();
4764 continue;
4765 }
4766
4767 u->found = 1;
4768 }
4769
4770 mio_interface (&gfc_current_ns->op[i]);
4771 if (u && !gfc_current_ns->op[i])
4772 u->found = 0;
4773 }
4774
4775 mio_rparen ();
4776
4777 /* Load generic and user operator interfaces. These must follow the
4778 loading of symtree because otherwise symbols can be marked as
4779 ambiguous. */
4780
4781 set_module_locus (&user_operators);
4782
4783 load_operator_interfaces ();
4784 load_generic_interfaces ();
4785
4786 load_commons ();
4787 load_equiv ();
4788
4789 /* At this point, we read those symbols that are needed but haven't
4790 been loaded yet. If one symbol requires another, the other gets
4791 marked as NEEDED if its previous state was UNUSED. */
4792
4793 while (load_needed (pi_root));
4794
4795 /* Make sure all elements of the rename-list were found in the module. */
4796
4797 for (u = gfc_rename_list; u; u = u->next)
4798 {
4799 if (u->found)
4800 continue;
4801
4802 if (u->op == INTRINSIC_NONE)
4803 {
4804 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
4805 u->use_name, &u->where, module_name);
4806 continue;
4807 }
4808
4809 if (u->op == INTRINSIC_USER)
4810 {
4811 gfc_error ("User operator '%s' referenced at %L not found "
4812 "in module '%s'", u->use_name, &u->where, module_name);
4813 continue;
4814 }
4815
4816 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4817 "in module '%s'", gfc_op2string (u->op), &u->where,
4818 module_name);
4819 }
4820
4821 /* Now we should be in a position to fill f2k_derived with derived type
4822 extensions, since everything has been loaded. */
4823 set_module_locus (&extensions);
4824 load_derived_extensions ();
4825
4826 /* Clean up symbol nodes that were never loaded, create references
4827 to hidden symbols. */
4828
4829 read_cleanup (pi_root);
4830 }
4831
4832
4833 /* Given an access type that is specific to an entity and the default
4834 access, return nonzero if the entity is publicly accessible. If the
4835 element is declared as PUBLIC, then it is public; if declared
4836 PRIVATE, then private, and otherwise it is public unless the default
4837 access in this context has been declared PRIVATE. */
4838
4839 static bool
4840 check_access (gfc_access specific_access, gfc_access default_access)
4841 {
4842 if (specific_access == ACCESS_PUBLIC)
4843 return TRUE;
4844 if (specific_access == ACCESS_PRIVATE)
4845 return FALSE;
4846
4847 if (gfc_option.flag_module_private)
4848 return default_access == ACCESS_PUBLIC;
4849 else
4850 return default_access != ACCESS_PRIVATE;
4851 }
4852
4853
4854 bool
4855 gfc_check_symbol_access (gfc_symbol *sym)
4856 {
4857 if (sym->attr.vtab || sym->attr.vtype)
4858 return true;
4859 else
4860 return check_access (sym->attr.access, sym->ns->default_access);
4861 }
4862
4863
4864 /* A structure to remember which commons we've already written. */
4865
4866 struct written_common
4867 {
4868 BBT_HEADER(written_common);
4869 const char *name, *label;
4870 };
4871
4872 static struct written_common *written_commons = NULL;
4873
4874 /* Comparison function used for balancing the binary tree. */
4875
4876 static int
4877 compare_written_commons (void *a1, void *b1)
4878 {
4879 const char *aname = ((struct written_common *) a1)->name;
4880 const char *alabel = ((struct written_common *) a1)->label;
4881 const char *bname = ((struct written_common *) b1)->name;
4882 const char *blabel = ((struct written_common *) b1)->label;
4883 int c = strcmp (aname, bname);
4884
4885 return (c != 0 ? c : strcmp (alabel, blabel));
4886 }
4887
4888 /* Free a list of written commons. */
4889
4890 static void
4891 free_written_common (struct written_common *w)
4892 {
4893 if (!w)
4894 return;
4895
4896 if (w->left)
4897 free_written_common (w->left);
4898 if (w->right)
4899 free_written_common (w->right);
4900
4901 free (w);
4902 }
4903
4904 /* Write a common block to the module -- recursive helper function. */
4905
4906 static void
4907 write_common_0 (gfc_symtree *st, bool this_module)
4908 {
4909 gfc_common_head *p;
4910 const char * name;
4911 int flags;
4912 const char *label;
4913 struct written_common *w;
4914 bool write_me = true;
4915
4916 if (st == NULL)
4917 return;
4918
4919 write_common_0 (st->left, this_module);
4920
4921 /* We will write out the binding label, or "" if no label given. */
4922 name = st->n.common->name;
4923 p = st->n.common;
4924 label = (p->is_bind_c && p->binding_label) ? p->binding_label : "";
4925
4926 /* Check if we've already output this common. */
4927 w = written_commons;
4928 while (w)
4929 {
4930 int c = strcmp (name, w->name);
4931 c = (c != 0 ? c : strcmp (label, w->label));
4932 if (c == 0)
4933 write_me = false;
4934
4935 w = (c < 0) ? w->left : w->right;
4936 }
4937
4938 if (this_module && p->use_assoc)
4939 write_me = false;
4940
4941 if (write_me)
4942 {
4943 /* Write the common to the module. */
4944 mio_lparen ();
4945 mio_pool_string (&name);
4946
4947 mio_symbol_ref (&p->head);
4948 flags = p->saved ? 1 : 0;
4949 if (p->threadprivate)
4950 flags |= 2;
4951 mio_integer (&flags);
4952
4953 /* Write out whether the common block is bind(c) or not. */
4954 mio_integer (&(p->is_bind_c));
4955
4956 mio_pool_string (&label);
4957 mio_rparen ();
4958
4959 /* Record that we have written this common. */
4960 w = XCNEW (struct written_common);
4961 w->name = p->name;
4962 w->label = label;
4963 gfc_insert_bbt (&written_commons, w, compare_written_commons);
4964 }
4965
4966 write_common_0 (st->right, this_module);
4967 }
4968
4969
4970 /* Write a common, by initializing the list of written commons, calling
4971 the recursive function write_common_0() and cleaning up afterwards. */
4972
4973 static void
4974 write_common (gfc_symtree *st)
4975 {
4976 written_commons = NULL;
4977 write_common_0 (st, true);
4978 write_common_0 (st, false);
4979 free_written_common (written_commons);
4980 written_commons = NULL;
4981 }
4982
4983
4984 /* Write the blank common block to the module. */
4985
4986 static void
4987 write_blank_common (void)
4988 {
4989 const char * name = BLANK_COMMON_NAME;
4990 int saved;
4991 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
4992 this, but it hasn't been checked. Just making it so for now. */
4993 int is_bind_c = 0;
4994
4995 if (gfc_current_ns->blank_common.head == NULL)
4996 return;
4997
4998 mio_lparen ();
4999
5000 mio_pool_string (&name);
5001
5002 mio_symbol_ref (&gfc_current_ns->blank_common.head);
5003 saved = gfc_current_ns->blank_common.saved;
5004 mio_integer (&saved);
5005
5006 /* Write out whether the common block is bind(c) or not. */
5007 mio_integer (&is_bind_c);
5008
5009 /* Write out an empty binding label. */
5010 write_atom (ATOM_STRING, "");
5011
5012 mio_rparen ();
5013 }
5014
5015
5016 /* Write equivalences to the module. */
5017
5018 static void
5019 write_equiv (void)
5020 {
5021 gfc_equiv *eq, *e;
5022 int num;
5023
5024 num = 0;
5025 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
5026 {
5027 mio_lparen ();
5028
5029 for (e = eq; e; e = e->eq)
5030 {
5031 if (e->module == NULL)
5032 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
5033 mio_allocated_string (e->module);
5034 mio_expr (&e->expr);
5035 }
5036
5037 num++;
5038 mio_rparen ();
5039 }
5040 }
5041
5042
5043 /* Write derived type extensions to the module. */
5044
5045 static void
5046 write_dt_extensions (gfc_symtree *st)
5047 {
5048 if (!gfc_check_symbol_access (st->n.sym))
5049 return;
5050 if (!(st->n.sym->ns && st->n.sym->ns->proc_name
5051 && st->n.sym->ns->proc_name->attr.flavor == FL_MODULE))
5052 return;
5053
5054 mio_lparen ();
5055 mio_pool_string (&st->name);
5056 if (st->n.sym->module != NULL)
5057 mio_pool_string (&st->n.sym->module);
5058 else
5059 {
5060 char name[GFC_MAX_SYMBOL_LEN + 1];
5061 if (iomode == IO_OUTPUT)
5062 strcpy (name, module_name);
5063 mio_internal_string (name);
5064 if (iomode == IO_INPUT)
5065 module_name = gfc_get_string (name);
5066 }
5067 mio_rparen ();
5068 }
5069
5070 static void
5071 write_derived_extensions (gfc_symtree *st)
5072 {
5073 if (!((st->n.sym->attr.flavor == FL_DERIVED)
5074 && (st->n.sym->f2k_derived != NULL)
5075 && (st->n.sym->f2k_derived->sym_root != NULL)))
5076 return;
5077
5078 mio_lparen ();
5079 mio_symbol_ref (&(st->n.sym));
5080 gfc_traverse_symtree (st->n.sym->f2k_derived->sym_root,
5081 write_dt_extensions);
5082 mio_rparen ();
5083 }
5084
5085
5086 /* Write a symbol to the module. */
5087
5088 static void
5089 write_symbol (int n, gfc_symbol *sym)
5090 {
5091 const char *label;
5092
5093 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
5094 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
5095
5096 mio_integer (&n);
5097
5098 if (sym->attr.flavor == FL_DERIVED)
5099 {
5100 const char *name;
5101 name = dt_upper_string (sym->name);
5102 mio_pool_string (&name);
5103 }
5104 else
5105 mio_pool_string (&sym->name);
5106
5107 mio_pool_string (&sym->module);
5108 if ((sym->attr.is_bind_c || sym->attr.is_iso_c) && sym->binding_label)
5109 {
5110 label = sym->binding_label;
5111 mio_pool_string (&label);
5112 }
5113 else
5114 write_atom (ATOM_STRING, "");
5115
5116 mio_pointer_ref (&sym->ns);
5117
5118 mio_symbol (sym);
5119 write_char ('\n');
5120 }
5121
5122
5123 /* Recursive traversal function to write the initial set of symbols to
5124 the module. We check to see if the symbol should be written
5125 according to the access specification. */
5126
5127 static void
5128 write_symbol0 (gfc_symtree *st)
5129 {
5130 gfc_symbol *sym;
5131 pointer_info *p;
5132 bool dont_write = false;
5133
5134 if (st == NULL)
5135 return;
5136
5137 write_symbol0 (st->left);
5138
5139 sym = st->n.sym;
5140 if (sym->module == NULL)
5141 sym->module = module_name;
5142
5143 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5144 && !sym->attr.subroutine && !sym->attr.function)
5145 dont_write = true;
5146
5147 if (!gfc_check_symbol_access (sym))
5148 dont_write = true;
5149
5150 if (!dont_write)
5151 {
5152 p = get_pointer (sym);
5153 if (p->type == P_UNKNOWN)
5154 p->type = P_SYMBOL;
5155
5156 if (p->u.wsym.state != WRITTEN)
5157 {
5158 write_symbol (p->integer, sym);
5159 p->u.wsym.state = WRITTEN;
5160 }
5161 }
5162
5163 write_symbol0 (st->right);
5164 }
5165
5166
5167 /* Type for the temporary tree used when writing secondary symbols. */
5168
5169 struct sorted_pointer_info
5170 {
5171 BBT_HEADER (sorted_pointer_info);
5172
5173 pointer_info *p;
5174 };
5175
5176 #define gfc_get_sorted_pointer_info() XCNEW (sorted_pointer_info)
5177
5178 /* Recursively traverse the temporary tree, free its contents. */
5179
5180 static void
5181 free_sorted_pointer_info_tree (sorted_pointer_info *p)
5182 {
5183 if (!p)
5184 return;
5185
5186 free_sorted_pointer_info_tree (p->left);
5187 free_sorted_pointer_info_tree (p->right);
5188
5189 free (p);
5190 }
5191
5192 /* Comparison function for the temporary tree. */
5193
5194 static int
5195 compare_sorted_pointer_info (void *_spi1, void *_spi2)
5196 {
5197 sorted_pointer_info *spi1, *spi2;
5198 spi1 = (sorted_pointer_info *)_spi1;
5199 spi2 = (sorted_pointer_info *)_spi2;
5200
5201 if (spi1->p->integer < spi2->p->integer)
5202 return -1;
5203 if (spi1->p->integer > spi2->p->integer)
5204 return 1;
5205 return 0;
5206 }
5207
5208
5209 /* Finds the symbols that need to be written and collects them in the
5210 sorted_pi tree so that they can be traversed in an order
5211 independent of memory addresses. */
5212
5213 static void
5214 find_symbols_to_write(sorted_pointer_info **tree, pointer_info *p)
5215 {
5216 if (!p)
5217 return;
5218
5219 if (p->type == P_SYMBOL && p->u.wsym.state == NEEDS_WRITE)
5220 {
5221 sorted_pointer_info *sp = gfc_get_sorted_pointer_info();
5222 sp->p = p;
5223
5224 gfc_insert_bbt (tree, sp, compare_sorted_pointer_info);
5225 }
5226
5227 find_symbols_to_write (tree, p->left);
5228 find_symbols_to_write (tree, p->right);
5229 }
5230
5231
5232 /* Recursive function that traverses the tree of symbols that need to be
5233 written and writes them in order. */
5234
5235 static void
5236 write_symbol1_recursion (sorted_pointer_info *sp)
5237 {
5238 if (!sp)
5239 return;
5240
5241 write_symbol1_recursion (sp->left);
5242
5243 pointer_info *p1 = sp->p;
5244 gcc_assert (p1->type == P_SYMBOL && p1->u.wsym.state == NEEDS_WRITE);
5245
5246 p1->u.wsym.state = WRITTEN;
5247 write_symbol (p1->integer, p1->u.wsym.sym);
5248 p1->u.wsym.sym->attr.public_used = 1;
5249
5250 write_symbol1_recursion (sp->right);
5251 }
5252
5253
5254 /* Write the secondary set of symbols to the module file. These are
5255 symbols that were not public yet are needed by the public symbols
5256 or another dependent symbol. The act of writing a symbol can add
5257 symbols to the pointer_info tree, so we return nonzero if a symbol
5258 was written and pass that information upwards. The caller will
5259 then call this function again until nothing was written. It uses
5260 the utility functions and a temporary tree to ensure a reproducible
5261 ordering of the symbol output and thus the module file. */
5262
5263 static int
5264 write_symbol1 (pointer_info *p)
5265 {
5266 if (!p)
5267 return 0;
5268
5269 /* Put symbols that need to be written into a tree sorted on the
5270 integer field. */
5271
5272 sorted_pointer_info *spi_root = NULL;
5273 find_symbols_to_write (&spi_root, p);
5274
5275 /* No symbols to write, return. */
5276 if (!spi_root)
5277 return 0;
5278
5279 /* Otherwise, write and free the tree again. */
5280 write_symbol1_recursion (spi_root);
5281 free_sorted_pointer_info_tree (spi_root);
5282
5283 return 1;
5284 }
5285
5286
5287 /* Write operator interfaces associated with a symbol. */
5288
5289 static void
5290 write_operator (gfc_user_op *uop)
5291 {
5292 static char nullstring[] = "";
5293 const char *p = nullstring;
5294
5295 if (uop->op == NULL || !check_access (uop->access, uop->ns->default_access))
5296 return;
5297
5298 mio_symbol_interface (&uop->name, &p, &uop->op);
5299 }
5300
5301
5302 /* Write generic interfaces from the namespace sym_root. */
5303
5304 static void
5305 write_generic (gfc_symtree *st)
5306 {
5307 gfc_symbol *sym;
5308
5309 if (st == NULL)
5310 return;
5311
5312 write_generic (st->left);
5313
5314 sym = st->n.sym;
5315 if (sym && !check_unique_name (st->name)
5316 && sym->generic && gfc_check_symbol_access (sym))
5317 {
5318 if (!sym->module)
5319 sym->module = module_name;
5320
5321 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
5322 }
5323
5324 write_generic (st->right);
5325 }
5326
5327
5328 static void
5329 write_symtree (gfc_symtree *st)
5330 {
5331 gfc_symbol *sym;
5332 pointer_info *p;
5333
5334 sym = st->n.sym;
5335
5336 /* A symbol in an interface body must not be visible in the
5337 module file. */
5338 if (sym->ns != gfc_current_ns
5339 && sym->ns->proc_name
5340 && sym->ns->proc_name->attr.if_source == IFSRC_IFBODY)
5341 return;
5342
5343 if (!gfc_check_symbol_access (sym)
5344 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
5345 && !sym->attr.subroutine && !sym->attr.function))
5346 return;
5347
5348 if (check_unique_name (st->name))
5349 return;
5350
5351 p = find_pointer (sym);
5352 if (p == NULL)
5353 gfc_internal_error ("write_symtree(): Symbol not written");
5354
5355 mio_pool_string (&st->name);
5356 mio_integer (&st->ambiguous);
5357 mio_integer (&p->integer);
5358 }
5359
5360
5361 static void
5362 write_module (void)
5363 {
5364 int i;
5365
5366 /* Write the operator interfaces. */
5367 mio_lparen ();
5368
5369 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
5370 {
5371 if (i == INTRINSIC_USER)
5372 continue;
5373
5374 mio_interface (check_access (gfc_current_ns->operator_access[i],
5375 gfc_current_ns->default_access)
5376 ? &gfc_current_ns->op[i] : NULL);
5377 }
5378
5379 mio_rparen ();
5380 write_char ('\n');
5381 write_char ('\n');
5382
5383 mio_lparen ();
5384 gfc_traverse_user_op (gfc_current_ns, write_operator);
5385 mio_rparen ();
5386 write_char ('\n');
5387 write_char ('\n');
5388
5389 mio_lparen ();
5390 write_generic (gfc_current_ns->sym_root);
5391 mio_rparen ();
5392 write_char ('\n');
5393 write_char ('\n');
5394
5395 mio_lparen ();
5396 write_blank_common ();
5397 write_common (gfc_current_ns->common_root);
5398 mio_rparen ();
5399 write_char ('\n');
5400 write_char ('\n');
5401
5402 mio_lparen ();
5403 write_equiv ();
5404 mio_rparen ();
5405 write_char ('\n');
5406 write_char ('\n');
5407
5408 mio_lparen ();
5409 gfc_traverse_symtree (gfc_current_ns->sym_root,
5410 write_derived_extensions);
5411 mio_rparen ();
5412 write_char ('\n');
5413 write_char ('\n');
5414
5415 /* Write symbol information. First we traverse all symbols in the
5416 primary namespace, writing those that need to be written.
5417 Sometimes writing one symbol will cause another to need to be
5418 written. A list of these symbols ends up on the write stack, and
5419 we end by popping the bottom of the stack and writing the symbol
5420 until the stack is empty. */
5421
5422 mio_lparen ();
5423
5424 write_symbol0 (gfc_current_ns->sym_root);
5425 while (write_symbol1 (pi_root))
5426 /* Nothing. */;
5427
5428 mio_rparen ();
5429
5430 write_char ('\n');
5431 write_char ('\n');
5432
5433 mio_lparen ();
5434 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
5435 mio_rparen ();
5436 }
5437
5438
5439 /* Read a MD5 sum from the header of a module file. If the file cannot
5440 be opened, or we have any other error, we return -1. */
5441
5442 static int
5443 read_md5_from_module_file (const char * filename, unsigned char md5[16])
5444 {
5445 FILE *file;
5446 char buf[1024];
5447 int n;
5448
5449 /* Open the file. */
5450 if ((file = fopen (filename, "r")) == NULL)
5451 return -1;
5452
5453 /* Read the first line. */
5454 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5455 {
5456 fclose (file);
5457 return -1;
5458 }
5459
5460 /* The file also needs to be overwritten if the version number changed. */
5461 n = strlen ("GFORTRAN module version '" MOD_VERSION "' created");
5462 if (strncmp (buf, "GFORTRAN module version '" MOD_VERSION "' created", n) != 0)
5463 {
5464 fclose (file);
5465 return -1;
5466 }
5467
5468 /* Read a second line. */
5469 if (fgets (buf, sizeof (buf) - 1, file) == NULL)
5470 {
5471 fclose (file);
5472 return -1;
5473 }
5474
5475 /* Close the file. */
5476 fclose (file);
5477
5478 /* If the header is not what we expect, or is too short, bail out. */
5479 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
5480 return -1;
5481
5482 /* Now, we have a real MD5, read it into the array. */
5483 for (n = 0; n < 16; n++)
5484 {
5485 unsigned int x;
5486
5487 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
5488 return -1;
5489
5490 md5[n] = x;
5491 }
5492
5493 return 0;
5494 }
5495
5496
5497 /* Given module, dump it to disk. If there was an error while
5498 processing the module, dump_flag will be set to zero and we delete
5499 the module file, even if it was already there. */
5500
5501 void
5502 gfc_dump_module (const char *name, int dump_flag)
5503 {
5504 int n;
5505 char *filename, *filename_tmp;
5506 fpos_t md5_pos;
5507 unsigned char md5_new[16], md5_old[16];
5508
5509 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
5510 if (gfc_option.module_dir != NULL)
5511 {
5512 n += strlen (gfc_option.module_dir);
5513 filename = (char *) alloca (n);
5514 strcpy (filename, gfc_option.module_dir);
5515 strcat (filename, name);
5516 }
5517 else
5518 {
5519 filename = (char *) alloca (n);
5520 strcpy (filename, name);
5521 }
5522 strcat (filename, MODULE_EXTENSION);
5523
5524 /* Name of the temporary file used to write the module. */
5525 filename_tmp = (char *) alloca (n + 1);
5526 strcpy (filename_tmp, filename);
5527 strcat (filename_tmp, "0");
5528
5529 /* There was an error while processing the module. We delete the
5530 module file, even if it was already there. */
5531 if (!dump_flag)
5532 {
5533 unlink (filename);
5534 return;
5535 }
5536
5537 if (gfc_cpp_makedep ())
5538 gfc_cpp_add_target (filename);
5539
5540 /* Write the module to the temporary file. */
5541 module_fp = fopen (filename_tmp, "w");
5542 if (module_fp == NULL)
5543 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
5544 filename_tmp, xstrerror (errno));
5545
5546 /* Write the header, including space reserved for the MD5 sum. */
5547 fprintf (module_fp, "GFORTRAN module version '%s' created from %s\n"
5548 "MD5:", MOD_VERSION, gfc_source_file);
5549 fgetpos (module_fp, &md5_pos);
5550 fputs ("00000000000000000000000000000000 -- "
5551 "If you edit this, you'll get what you deserve.\n\n", module_fp);
5552
5553 /* Initialize the MD5 context that will be used for output. */
5554 md5_init_ctx (&ctx);
5555
5556 /* Write the module itself. */
5557 iomode = IO_OUTPUT;
5558 module_name = gfc_get_string (name);
5559
5560 init_pi_tree ();
5561
5562 write_module ();
5563
5564 free_pi_tree (pi_root);
5565 pi_root = NULL;
5566
5567 write_char ('\n');
5568
5569 /* Write the MD5 sum to the header of the module file. */
5570 md5_finish_ctx (&ctx, md5_new);
5571 fsetpos (module_fp, &md5_pos);
5572 for (n = 0; n < 16; n++)
5573 fprintf (module_fp, "%02x", md5_new[n]);
5574
5575 if (fclose (module_fp))
5576 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
5577 filename_tmp, xstrerror (errno));
5578
5579 /* Read the MD5 from the header of the old module file and compare. */
5580 if (read_md5_from_module_file (filename, md5_old) != 0
5581 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
5582 {
5583 /* Module file have changed, replace the old one. */
5584 if (unlink (filename) && errno != ENOENT)
5585 gfc_fatal_error ("Can't delete module file '%s': %s", filename,
5586 xstrerror (errno));
5587 if (rename (filename_tmp, filename))
5588 gfc_fatal_error ("Can't rename module file '%s' to '%s': %s",
5589 filename_tmp, filename, xstrerror (errno));
5590 }
5591 else
5592 {
5593 if (unlink (filename_tmp))
5594 gfc_fatal_error ("Can't delete temporary module file '%s': %s",
5595 filename_tmp, xstrerror (errno));
5596 }
5597 }
5598
5599
5600 static void
5601 create_intrinsic_function (const char *name, gfc_isym_id id,
5602 const char *modname, intmod_id module)
5603 {
5604 gfc_intrinsic_sym *isym;
5605 gfc_symtree *tmp_symtree;
5606 gfc_symbol *sym;
5607
5608 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5609 if (tmp_symtree)
5610 {
5611 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5612 return;
5613 gfc_error ("Symbol '%s' already declared", name);
5614 }
5615
5616 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5617 sym = tmp_symtree->n.sym;
5618
5619 isym = gfc_intrinsic_function_by_id (id);
5620 gcc_assert (isym);
5621
5622 sym->attr.flavor = FL_PROCEDURE;
5623 sym->attr.intrinsic = 1;
5624
5625 sym->module = gfc_get_string (modname);
5626 sym->attr.use_assoc = 1;
5627 sym->from_intmod = module;
5628 sym->intmod_sym_id = id;
5629 }
5630
5631
5632 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
5633 the current namespace for all named constants, pointer types, and
5634 procedures in the module unless the only clause was used or a rename
5635 list was provided. */
5636
5637 static void
5638 import_iso_c_binding_module (void)
5639 {
5640 gfc_symbol *mod_sym = NULL;
5641 gfc_symtree *mod_symtree = NULL;
5642 const char *iso_c_module_name = "__iso_c_binding";
5643 gfc_use_rename *u;
5644 int i;
5645
5646 /* Look only in the current namespace. */
5647 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
5648
5649 if (mod_symtree == NULL)
5650 {
5651 /* symtree doesn't already exist in current namespace. */
5652 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree,
5653 false);
5654
5655 if (mod_symtree != NULL)
5656 mod_sym = mod_symtree->n.sym;
5657 else
5658 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
5659 "create symbol for %s", iso_c_module_name);
5660
5661 mod_sym->attr.flavor = FL_MODULE;
5662 mod_sym->attr.intrinsic = 1;
5663 mod_sym->module = gfc_get_string (iso_c_module_name);
5664 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
5665 }
5666
5667 /* Generate the symbols for the named constants representing
5668 the kinds for intrinsic data types. */
5669 for (i = 0; i < ISOCBINDING_NUMBER; i++)
5670 {
5671 bool found = false;
5672 for (u = gfc_rename_list; u; u = u->next)
5673 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
5674 {
5675 bool not_in_std;
5676 const char *name;
5677 u->found = 1;
5678 found = true;
5679
5680 switch (i)
5681 {
5682 #define NAMED_FUNCTION(a,b,c,d) \
5683 case a: \
5684 not_in_std = (gfc_option.allow_std & d) == 0; \
5685 name = b; \
5686 break;
5687 #include "iso-c-binding.def"
5688 #undef NAMED_FUNCTION
5689 #define NAMED_INTCST(a,b,c,d) \
5690 case a: \
5691 not_in_std = (gfc_option.allow_std & d) == 0; \
5692 name = b; \
5693 break;
5694 #include "iso-c-binding.def"
5695 #undef NAMED_INTCST
5696 #define NAMED_REALCST(a,b,c,d) \
5697 case a: \
5698 not_in_std = (gfc_option.allow_std & d) == 0; \
5699 name = b; \
5700 break;
5701 #include "iso-c-binding.def"
5702 #undef NAMED_REALCST
5703 #define NAMED_CMPXCST(a,b,c,d) \
5704 case a: \
5705 not_in_std = (gfc_option.allow_std & d) == 0; \
5706 name = b; \
5707 break;
5708 #include "iso-c-binding.def"
5709 #undef NAMED_CMPXCST
5710 default:
5711 not_in_std = false;
5712 name = "";
5713 }
5714
5715 if (not_in_std)
5716 {
5717 gfc_error ("The symbol '%s', referenced at %L, is not "
5718 "in the selected standard", name, &u->where);
5719 continue;
5720 }
5721
5722 switch (i)
5723 {
5724 #define NAMED_FUNCTION(a,b,c,d) \
5725 case a: \
5726 create_intrinsic_function (u->local_name[0] ? u->local_name \
5727 : u->use_name, \
5728 (gfc_isym_id) c, \
5729 iso_c_module_name, \
5730 INTMOD_ISO_C_BINDING); \
5731 break;
5732 #include "iso-c-binding.def"
5733 #undef NAMED_FUNCTION
5734
5735 default:
5736 generate_isocbinding_symbol (iso_c_module_name,
5737 (iso_c_binding_symbol) i,
5738 u->local_name[0] ? u->local_name
5739 : u->use_name);
5740 }
5741 }
5742
5743 if (!found && !only_flag)
5744 {
5745 /* Skip, if the symbol is not in the enabled standard. */
5746 switch (i)
5747 {
5748 #define NAMED_FUNCTION(a,b,c,d) \
5749 case a: \
5750 if ((gfc_option.allow_std & d) == 0) \
5751 continue; \
5752 break;
5753 #include "iso-c-binding.def"
5754 #undef NAMED_FUNCTION
5755
5756 #define NAMED_INTCST(a,b,c,d) \
5757 case a: \
5758 if ((gfc_option.allow_std & d) == 0) \
5759 continue; \
5760 break;
5761 #include "iso-c-binding.def"
5762 #undef NAMED_INTCST
5763 #define NAMED_REALCST(a,b,c,d) \
5764 case a: \
5765 if ((gfc_option.allow_std & d) == 0) \
5766 continue; \
5767 break;
5768 #include "iso-c-binding.def"
5769 #undef NAMED_REALCST
5770 #define NAMED_CMPXCST(a,b,c,d) \
5771 case a: \
5772 if ((gfc_option.allow_std & d) == 0) \
5773 continue; \
5774 break;
5775 #include "iso-c-binding.def"
5776 #undef NAMED_CMPXCST
5777 default:
5778 ; /* Not GFC_STD_* versioned. */
5779 }
5780
5781 switch (i)
5782 {
5783 #define NAMED_FUNCTION(a,b,c,d) \
5784 case a: \
5785 create_intrinsic_function (b, (gfc_isym_id) c, \
5786 iso_c_module_name, \
5787 INTMOD_ISO_C_BINDING); \
5788 break;
5789 #include "iso-c-binding.def"
5790 #undef NAMED_FUNCTION
5791
5792 default:
5793 generate_isocbinding_symbol (iso_c_module_name,
5794 (iso_c_binding_symbol) i, NULL);
5795 }
5796 }
5797 }
5798
5799 for (u = gfc_rename_list; u; u = u->next)
5800 {
5801 if (u->found)
5802 continue;
5803
5804 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
5805 "module ISO_C_BINDING", u->use_name, &u->where);
5806 }
5807 }
5808
5809
5810 /* Add an integer named constant from a given module. */
5811
5812 static void
5813 create_int_parameter (const char *name, int value, const char *modname,
5814 intmod_id module, int id)
5815 {
5816 gfc_symtree *tmp_symtree;
5817 gfc_symbol *sym;
5818
5819 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5820 if (tmp_symtree != NULL)
5821 {
5822 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5823 return;
5824 else
5825 gfc_error ("Symbol '%s' already declared", name);
5826 }
5827
5828 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5829 sym = tmp_symtree->n.sym;
5830
5831 sym->module = gfc_get_string (modname);
5832 sym->attr.flavor = FL_PARAMETER;
5833 sym->ts.type = BT_INTEGER;
5834 sym->ts.kind = gfc_default_integer_kind;
5835 sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL, value);
5836 sym->attr.use_assoc = 1;
5837 sym->from_intmod = module;
5838 sym->intmod_sym_id = id;
5839 }
5840
5841
5842 /* Value is already contained by the array constructor, but not
5843 yet the shape. */
5844
5845 static void
5846 create_int_parameter_array (const char *name, int size, gfc_expr *value,
5847 const char *modname, intmod_id module, int id)
5848 {
5849 gfc_symtree *tmp_symtree;
5850 gfc_symbol *sym;
5851
5852 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5853 if (tmp_symtree != NULL)
5854 {
5855 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5856 return;
5857 else
5858 gfc_error ("Symbol '%s' already declared", name);
5859 }
5860
5861 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5862 sym = tmp_symtree->n.sym;
5863
5864 sym->module = gfc_get_string (modname);
5865 sym->attr.flavor = FL_PARAMETER;
5866 sym->ts.type = BT_INTEGER;
5867 sym->ts.kind = gfc_default_integer_kind;
5868 sym->attr.use_assoc = 1;
5869 sym->from_intmod = module;
5870 sym->intmod_sym_id = id;
5871 sym->attr.dimension = 1;
5872 sym->as = gfc_get_array_spec ();
5873 sym->as->rank = 1;
5874 sym->as->type = AS_EXPLICIT;
5875 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
5876 sym->as->upper[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, size);
5877
5878 sym->value = value;
5879 sym->value->shape = gfc_get_shape (1);
5880 mpz_init_set_ui (sym->value->shape[0], size);
5881 }
5882
5883
5884 /* Add an derived type for a given module. */
5885
5886 static void
5887 create_derived_type (const char *name, const char *modname,
5888 intmod_id module, int id)
5889 {
5890 gfc_symtree *tmp_symtree;
5891 gfc_symbol *sym, *dt_sym;
5892 gfc_interface *intr, *head;
5893
5894 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
5895 if (tmp_symtree != NULL)
5896 {
5897 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
5898 return;
5899 else
5900 gfc_error ("Symbol '%s' already declared", name);
5901 }
5902
5903 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
5904 sym = tmp_symtree->n.sym;
5905 sym->module = gfc_get_string (modname);
5906 sym->from_intmod = module;
5907 sym->intmod_sym_id = id;
5908 sym->attr.flavor = FL_PROCEDURE;
5909 sym->attr.function = 1;
5910 sym->attr.generic = 1;
5911
5912 gfc_get_sym_tree (dt_upper_string (sym->name),
5913 gfc_current_ns, &tmp_symtree, false);
5914 dt_sym = tmp_symtree->n.sym;
5915 dt_sym->name = gfc_get_string (sym->name);
5916 dt_sym->attr.flavor = FL_DERIVED;
5917 dt_sym->attr.private_comp = 1;
5918 dt_sym->attr.zero_comp = 1;
5919 dt_sym->attr.use_assoc = 1;
5920 dt_sym->module = gfc_get_string (modname);
5921 dt_sym->from_intmod = module;
5922 dt_sym->intmod_sym_id = id;
5923
5924 head = sym->generic;
5925 intr = gfc_get_interface ();
5926 intr->sym = dt_sym;
5927 intr->where = gfc_current_locus;
5928 intr->next = head;
5929 sym->generic = intr;
5930 sym->attr.if_source = IFSRC_DECL;
5931 }
5932
5933
5934 /* USE the ISO_FORTRAN_ENV intrinsic module. */
5935
5936 static void
5937 use_iso_fortran_env_module (void)
5938 {
5939 static char mod[] = "iso_fortran_env";
5940 gfc_use_rename *u;
5941 gfc_symbol *mod_sym;
5942 gfc_symtree *mod_symtree;
5943 gfc_expr *expr;
5944 int i, j;
5945
5946 intmod_sym symbol[] = {
5947 #define NAMED_INTCST(a,b,c,d) { a, b, 0, d },
5948 #include "iso-fortran-env.def"
5949 #undef NAMED_INTCST
5950 #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d },
5951 #include "iso-fortran-env.def"
5952 #undef NAMED_KINDARRAY
5953 #define NAMED_DERIVED_TYPE(a,b,c,d) { a, b, 0, d },
5954 #include "iso-fortran-env.def"
5955 #undef NAMED_DERIVED_TYPE
5956 #define NAMED_FUNCTION(a,b,c,d) { a, b, c, d },
5957 #include "iso-fortran-env.def"
5958 #undef NAMED_FUNCTION
5959 { ISOFORTRANENV_INVALID, NULL, -1234, 0 } };
5960
5961 i = 0;
5962 #define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
5963 #include "iso-fortran-env.def"
5964 #undef NAMED_INTCST
5965
5966 /* Generate the symbol for the module itself. */
5967 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
5968 if (mod_symtree == NULL)
5969 {
5970 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree, false);
5971 gcc_assert (mod_symtree);
5972 mod_sym = mod_symtree->n.sym;
5973
5974 mod_sym->attr.flavor = FL_MODULE;
5975 mod_sym->attr.intrinsic = 1;
5976 mod_sym->module = gfc_get_string (mod);
5977 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
5978 }
5979 else
5980 if (!mod_symtree->n.sym->attr.intrinsic)
5981 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
5982 "non-intrinsic module name used previously", mod);
5983
5984 /* Generate the symbols for the module integer named constants. */
5985
5986 for (i = 0; symbol[i].name; i++)
5987 {
5988 bool found = false;
5989 for (u = gfc_rename_list; u; u = u->next)
5990 {
5991 if (strcmp (symbol[i].name, u->use_name) == 0)
5992 {
5993 found = true;
5994 u->found = 1;
5995
5996 if (gfc_notify_std (symbol[i].standard, "The symbol '%s', "
5997 "referenced at %L, is not in the selected "
5998 "standard", symbol[i].name,
5999 &u->where) == FAILURE)
6000 continue;
6001
6002 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
6003 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
6004 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named "
6005 "constant from intrinsic module "
6006 "ISO_FORTRAN_ENV at %L is incompatible with "
6007 "option %s", &u->where,
6008 gfc_option.flag_default_integer
6009 ? "-fdefault-integer-8"
6010 : "-fdefault-real-8");
6011 switch (symbol[i].id)
6012 {
6013 #define NAMED_INTCST(a,b,c,d) \
6014 case a:
6015 #include "iso-fortran-env.def"
6016 #undef NAMED_INTCST
6017 create_int_parameter (u->local_name[0] ? u->local_name
6018 : u->use_name,
6019 symbol[i].value, mod,
6020 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
6021 break;
6022
6023 #define NAMED_KINDARRAY(a,b,KINDS,d) \
6024 case a:\
6025 expr = gfc_get_array_expr (BT_INTEGER, \
6026 gfc_default_integer_kind,\
6027 NULL); \
6028 for (j = 0; KINDS[j].kind != 0; j++) \
6029 gfc_constructor_append_expr (&expr->value.constructor, \
6030 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
6031 KINDS[j].kind), NULL); \
6032 create_int_parameter_array (u->local_name[0] ? u->local_name \
6033 : u->use_name, \
6034 j, expr, mod, \
6035 INTMOD_ISO_FORTRAN_ENV, \
6036 symbol[i].id); \
6037 break;
6038 #include "iso-fortran-env.def"
6039 #undef NAMED_KINDARRAY
6040
6041 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
6042 case a:
6043 #include "iso-fortran-env.def"
6044 create_derived_type (u->local_name[0] ? u->local_name
6045 : u->use_name,
6046 mod, INTMOD_ISO_FORTRAN_ENV,
6047 symbol[i].id);
6048 break;
6049 #undef NAMED_DERIVED_TYPE
6050
6051 #define NAMED_FUNCTION(a,b,c,d) \
6052 case a:
6053 #include "iso-fortran-env.def"
6054 #undef NAMED_FUNCTION
6055 create_intrinsic_function (u->local_name[0] ? u->local_name
6056 : u->use_name,
6057 (gfc_isym_id) symbol[i].value, mod,
6058 INTMOD_ISO_FORTRAN_ENV);
6059 break;
6060
6061 default:
6062 gcc_unreachable ();
6063 }
6064 }
6065 }
6066
6067 if (!found && !only_flag)
6068 {
6069 if ((gfc_option.allow_std & symbol[i].standard) == 0)
6070 continue;
6071
6072 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
6073 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
6074 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
6075 "from intrinsic module ISO_FORTRAN_ENV at %C is "
6076 "incompatible with option %s",
6077 gfc_option.flag_default_integer
6078 ? "-fdefault-integer-8" : "-fdefault-real-8");
6079
6080 switch (symbol[i].id)
6081 {
6082 #define NAMED_INTCST(a,b,c,d) \
6083 case a:
6084 #include "iso-fortran-env.def"
6085 #undef NAMED_INTCST
6086 create_int_parameter (symbol[i].name, symbol[i].value, mod,
6087 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);
6088 break;
6089
6090 #define NAMED_KINDARRAY(a,b,KINDS,d) \
6091 case a:\
6092 expr = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, \
6093 NULL); \
6094 for (j = 0; KINDS[j].kind != 0; j++) \
6095 gfc_constructor_append_expr (&expr->value.constructor, \
6096 gfc_get_int_expr (gfc_default_integer_kind, NULL, \
6097 KINDS[j].kind), NULL); \
6098 create_int_parameter_array (symbol[i].name, j, expr, mod, \
6099 INTMOD_ISO_FORTRAN_ENV, symbol[i].id);\
6100 break;
6101 #include "iso-fortran-env.def"
6102 #undef NAMED_KINDARRAY
6103
6104 #define NAMED_DERIVED_TYPE(a,b,TYPE,STD) \
6105 case a:
6106 #include "iso-fortran-env.def"
6107 create_derived_type (symbol[i].name, mod, INTMOD_ISO_FORTRAN_ENV,
6108 symbol[i].id);
6109 break;
6110 #undef NAMED_DERIVED_TYPE
6111
6112 #define NAMED_FUNCTION(a,b,c,d) \
6113 case a:
6114 #include "iso-fortran-env.def"
6115 #undef NAMED_FUNCTION
6116 create_intrinsic_function (symbol[i].name,
6117 (gfc_isym_id) symbol[i].value, mod,
6118 INTMOD_ISO_FORTRAN_ENV);
6119 break;
6120
6121 default:
6122 gcc_unreachable ();
6123 }
6124 }
6125 }
6126
6127 for (u = gfc_rename_list; u; u = u->next)
6128 {
6129 if (u->found)
6130 continue;
6131
6132 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
6133 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
6134 }
6135 }
6136
6137
6138 /* Process a USE directive. */
6139
6140 static void
6141 gfc_use_module (gfc_use_list *module)
6142 {
6143 char *filename;
6144 gfc_state_data *p;
6145 int c, line, start;
6146 gfc_symtree *mod_symtree;
6147 gfc_use_list *use_stmt;
6148 locus old_locus = gfc_current_locus;
6149
6150 gfc_current_locus = module->where;
6151 module_name = module->module_name;
6152 gfc_rename_list = module->rename;
6153 only_flag = module->only_flag;
6154
6155 filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
6156 + 1);
6157 strcpy (filename, module_name);
6158 strcat (filename, MODULE_EXTENSION);
6159
6160 /* First, try to find an non-intrinsic module, unless the USE statement
6161 specified that the module is intrinsic. */
6162 module_fp = NULL;
6163 if (!module->intrinsic)
6164 module_fp = gfc_open_included_file (filename, true, true);
6165
6166 /* Then, see if it's an intrinsic one, unless the USE statement
6167 specified that the module is non-intrinsic. */
6168 if (module_fp == NULL && !module->non_intrinsic)
6169 {
6170 if (strcmp (module_name, "iso_fortran_env") == 0
6171 && gfc_notify_std (GFC_STD_F2003, "ISO_FORTRAN_ENV "
6172 "intrinsic module at %C") != FAILURE)
6173 {
6174 use_iso_fortran_env_module ();
6175 free_rename (module->rename);
6176 module->rename = NULL;
6177 gfc_current_locus = old_locus;
6178 module->intrinsic = true;
6179 return;
6180 }
6181
6182 if (strcmp (module_name, "iso_c_binding") == 0
6183 && gfc_notify_std (GFC_STD_F2003,
6184 "ISO_C_BINDING module at %C") != FAILURE)
6185 {
6186 import_iso_c_binding_module();
6187 free_rename (module->rename);
6188 module->rename = NULL;
6189 gfc_current_locus = old_locus;
6190 module->intrinsic = true;
6191 return;
6192 }
6193
6194 module_fp = gfc_open_intrinsic_module (filename);
6195
6196 if (module_fp == NULL && module->intrinsic)
6197 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
6198 module_name);
6199 }
6200
6201 if (module_fp == NULL)
6202 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6203 filename, xstrerror (errno));
6204
6205 /* Check that we haven't already USEd an intrinsic module with the
6206 same name. */
6207
6208 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
6209 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
6210 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
6211 "intrinsic module name used previously", module_name);
6212
6213 iomode = IO_INPUT;
6214 module_line = 1;
6215 module_column = 1;
6216 start = 0;
6217
6218 /* Skip the first two lines of the module, after checking that this is
6219 a gfortran module file. */
6220 line = 0;
6221 while (line < 2)
6222 {
6223 c = module_char ();
6224 if (c == EOF)
6225 bad_module ("Unexpected end of module");
6226 if (start++ < 3)
6227 parse_name (c);
6228 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
6229 || (start == 2 && strcmp (atom_name, " module") != 0))
6230 gfc_fatal_error ("File '%s' opened at %C is not a GNU Fortran"
6231 " module file", filename);
6232 if (start == 3)
6233 {
6234 if (strcmp (atom_name, " version") != 0
6235 || module_char () != ' '
6236 || parse_atom () != ATOM_STRING
6237 || strcmp (atom_string, MOD_VERSION))
6238 gfc_fatal_error ("Cannot read module file '%s' opened at %C,"
6239 " because it was created by a different"
6240 " version of GNU Fortran", filename);
6241
6242 free (atom_string);
6243 }
6244
6245 if (c == '\n')
6246 line++;
6247 }
6248
6249 /* Make sure we're not reading the same module that we may be building. */
6250 for (p = gfc_state_stack; p; p = p->previous)
6251 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
6252 gfc_fatal_error ("Can't USE the same module we're building!");
6253
6254 init_pi_tree ();
6255 init_true_name_tree ();
6256
6257 read_module ();
6258
6259 free_true_name (true_name_root);
6260 true_name_root = NULL;
6261
6262 free_pi_tree (pi_root);
6263 pi_root = NULL;
6264
6265 fclose (module_fp);
6266
6267 use_stmt = gfc_get_use_list ();
6268 *use_stmt = *module;
6269 use_stmt->next = gfc_current_ns->use_stmts;
6270 gfc_current_ns->use_stmts = use_stmt;
6271
6272 gfc_current_locus = old_locus;
6273 }
6274
6275
6276 /* Remove duplicated intrinsic operators from the rename list. */
6277
6278 static void
6279 rename_list_remove_duplicate (gfc_use_rename *list)
6280 {
6281 gfc_use_rename *seek, *last;
6282
6283 for (; list; list = list->next)
6284 if (list->op != INTRINSIC_USER && list->op != INTRINSIC_NONE)
6285 {
6286 last = list;
6287 for (seek = list->next; seek; seek = last->next)
6288 {
6289 if (list->op == seek->op)
6290 {
6291 last->next = seek->next;
6292 free (seek);
6293 }
6294 else
6295 last = seek;
6296 }
6297 }
6298 }
6299
6300
6301 /* Process all USE directives. */
6302
6303 void
6304 gfc_use_modules (void)
6305 {
6306 gfc_use_list *next, *seek, *last;
6307
6308 for (next = module_list; next; next = next->next)
6309 {
6310 bool non_intrinsic = next->non_intrinsic;
6311 bool intrinsic = next->intrinsic;
6312 bool neither = !non_intrinsic && !intrinsic;
6313
6314 for (seek = next->next; seek; seek = seek->next)
6315 {
6316 if (next->module_name != seek->module_name)
6317 continue;
6318
6319 if (seek->non_intrinsic)
6320 non_intrinsic = true;
6321 else if (seek->intrinsic)
6322 intrinsic = true;
6323 else
6324 neither = true;
6325 }
6326
6327 if (intrinsic && neither && !non_intrinsic)
6328 {
6329 char *filename;
6330 FILE *fp;
6331
6332 filename = XALLOCAVEC (char,
6333 strlen (next->module_name)
6334 + strlen (MODULE_EXTENSION) + 1);
6335 strcpy (filename, next->module_name);
6336 strcat (filename, MODULE_EXTENSION);
6337 fp = gfc_open_included_file (filename, true, true);
6338 if (fp != NULL)
6339 {
6340 non_intrinsic = true;
6341 fclose (fp);
6342 }
6343 }
6344
6345 last = next;
6346 for (seek = next->next; seek; seek = last->next)
6347 {
6348 if (next->module_name != seek->module_name)
6349 {
6350 last = seek;
6351 continue;
6352 }
6353
6354 if ((!next->intrinsic && !seek->intrinsic)
6355 || (next->intrinsic && seek->intrinsic)
6356 || !non_intrinsic)
6357 {
6358 if (!seek->only_flag)
6359 next->only_flag = false;
6360 if (seek->rename)
6361 {
6362 gfc_use_rename *r = seek->rename;
6363 while (r->next)
6364 r = r->next;
6365 r->next = next->rename;
6366 next->rename = seek->rename;
6367 }
6368 last->next = seek->next;
6369 free (seek);
6370 }
6371 else
6372 last = seek;
6373 }
6374 }
6375
6376 for (; module_list; module_list = next)
6377 {
6378 next = module_list->next;
6379 rename_list_remove_duplicate (module_list->rename);
6380 gfc_use_module (module_list);
6381 free (module_list);
6382 }
6383 gfc_rename_list = NULL;
6384 }
6385
6386
6387 void
6388 gfc_free_use_stmts (gfc_use_list *use_stmts)
6389 {
6390 gfc_use_list *next;
6391 for (; use_stmts; use_stmts = next)
6392 {
6393 gfc_use_rename *next_rename;
6394
6395 for (; use_stmts->rename; use_stmts->rename = next_rename)
6396 {
6397 next_rename = use_stmts->rename->next;
6398 free (use_stmts->rename);
6399 }
6400 next = use_stmts->next;
6401 free (use_stmts);
6402 }
6403 }
6404
6405
6406 void
6407 gfc_module_init_2 (void)
6408 {
6409 last_atom = ATOM_LPAREN;
6410 gfc_rename_list = NULL;
6411 module_list = NULL;
6412 }
6413
6414
6415 void
6416 gfc_module_done_2 (void)
6417 {
6418 free_rename (gfc_rename_list);
6419 gfc_rename_list = NULL;
6420 }