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