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