arith.c: (gfc_arith_concat...
[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 Free Software Foundation, Inc.
5 Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
22
23 /* The syntax of gfortran modules resembles that of lisp lists, ie a
24 sequence of atoms, which can be left or right parenthesis, names,
25 integers or strings. Parenthesis are always matched which allows
26 us to skip over sections at high speed without having to know
27 anything about the internal structure of the lists. A "name" is
28 usually a fortran 95 identifier, but can also start with '@' in
29 order to reference a hidden symbol.
30
31 The first line of a module is an informational message about what
32 created the module, the file it came from and when it was created.
33 The second line is a warning for people not to edit the module.
34 The rest of the module looks like:
35
36 ( ( <Interface info for UPLUS> )
37 ( <Interface info for UMINUS> )
38 ...
39 )
40 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
41 ...
42 )
43 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
44 ...
45 )
46 ( ( <common name> <symbol> <saved flag>)
47 ...
48 )
49
50 ( equivalence list )
51
52 ( <Symbol Number (in no particular order)>
53 <True name of symbol>
54 <Module name of symbol>
55 ( <symbol information> )
56 ...
57 )
58 ( <Symtree name>
59 <Ambiguous flag>
60 <Symbol number>
61 ...
62 )
63
64 In general, symbols refer to other symbols by their symbol number,
65 which are zero based. Symbols are written to the module in no
66 particular order. */
67
68 #include "config.h"
69 #include "system.h"
70 #include "gfortran.h"
71 #include "arith.h"
72 #include "match.h"
73 #include "parse.h" /* FIXME */
74 #include "md5.h"
75
76 #define MODULE_EXTENSION ".mod"
77
78
79 /* Structure that describes a position within a module file. */
80
81 typedef struct
82 {
83 int column, line;
84 fpos_t pos;
85 }
86 module_locus;
87
88 /* Structure for list of symbols of intrinsic modules. */
89 typedef struct
90 {
91 int id;
92 const char *name;
93 int value;
94 }
95 intmod_sym;
96
97
98 typedef enum
99 {
100 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
101 }
102 pointer_t;
103
104 /* The fixup structure lists pointers to pointers that have to
105 be updated when a pointer value becomes known. */
106
107 typedef struct fixup_t
108 {
109 void **pointer;
110 struct fixup_t *next;
111 }
112 fixup_t;
113
114
115 /* Structure for holding extra info needed for pointers being read. */
116
117 typedef struct pointer_info
118 {
119 BBT_HEADER (pointer_info);
120 int integer;
121 pointer_t type;
122
123 /* The first component of each member of the union is the pointer
124 being stored. */
125
126 fixup_t *fixup;
127
128 union
129 {
130 void *pointer; /* Member for doing pointer searches. */
131
132 struct
133 {
134 gfc_symbol *sym;
135 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
136 enum
137 { UNUSED, NEEDED, USED }
138 state;
139 int ns, referenced, renamed;
140 module_locus where;
141 fixup_t *stfixup;
142 gfc_symtree *symtree;
143 char binding_label[GFC_MAX_SYMBOL_LEN + 1];
144 }
145 rsym;
146
147 struct
148 {
149 gfc_symbol *sym;
150 enum
151 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
152 state;
153 }
154 wsym;
155 }
156 u;
157
158 }
159 pointer_info;
160
161 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
162
163
164 /* Lists of rename info for the USE statement. */
165
166 typedef struct gfc_use_rename
167 {
168 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
169 struct gfc_use_rename *next;
170 int found;
171 gfc_intrinsic_op operator;
172 locus where;
173 }
174 gfc_use_rename;
175
176 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
177
178 /* Local variables */
179
180 /* The FILE for the module we're reading or writing. */
181 static FILE *module_fp;
182
183 /* MD5 context structure. */
184 static struct md5_ctx ctx;
185
186 /* The name of the module we're reading (USE'ing) or writing. */
187 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
188
189 /* The way the module we're reading was specified. */
190 static bool specified_nonint, specified_int;
191
192 static int module_line, module_column, only_flag;
193 static enum
194 { IO_INPUT, IO_OUTPUT }
195 iomode;
196
197 static gfc_use_rename *gfc_rename_list;
198 static pointer_info *pi_root;
199 static int symbol_number; /* Counter for assigning symbol numbers */
200
201 /* Tells mio_expr_ref to make symbols for unused equivalence members. */
202 static bool in_load_equiv;
203
204
205
206 /*****************************************************************/
207
208 /* Pointer/integer conversion. Pointers between structures are stored
209 as integers in the module file. The next couple of subroutines
210 handle this translation for reading and writing. */
211
212 /* Recursively free the tree of pointer structures. */
213
214 static void
215 free_pi_tree (pointer_info *p)
216 {
217 if (p == NULL)
218 return;
219
220 if (p->fixup != NULL)
221 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
222
223 free_pi_tree (p->left);
224 free_pi_tree (p->right);
225
226 gfc_free (p);
227 }
228
229
230 /* Compare pointers when searching by pointer. Used when writing a
231 module. */
232
233 static int
234 compare_pointers (void *_sn1, void *_sn2)
235 {
236 pointer_info *sn1, *sn2;
237
238 sn1 = (pointer_info *) _sn1;
239 sn2 = (pointer_info *) _sn2;
240
241 if (sn1->u.pointer < sn2->u.pointer)
242 return -1;
243 if (sn1->u.pointer > sn2->u.pointer)
244 return 1;
245
246 return 0;
247 }
248
249
250 /* Compare integers when searching by integer. Used when reading a
251 module. */
252
253 static int
254 compare_integers (void *_sn1, void *_sn2)
255 {
256 pointer_info *sn1, *sn2;
257
258 sn1 = (pointer_info *) _sn1;
259 sn2 = (pointer_info *) _sn2;
260
261 if (sn1->integer < sn2->integer)
262 return -1;
263 if (sn1->integer > sn2->integer)
264 return 1;
265
266 return 0;
267 }
268
269
270 /* Initialize the pointer_info tree. */
271
272 static void
273 init_pi_tree (void)
274 {
275 compare_fn compare;
276 pointer_info *p;
277
278 pi_root = NULL;
279 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
280
281 /* Pointer 0 is the NULL pointer. */
282 p = gfc_get_pointer_info ();
283 p->u.pointer = NULL;
284 p->integer = 0;
285 p->type = P_OTHER;
286
287 gfc_insert_bbt (&pi_root, p, compare);
288
289 /* Pointer 1 is the current namespace. */
290 p = gfc_get_pointer_info ();
291 p->u.pointer = gfc_current_ns;
292 p->integer = 1;
293 p->type = P_NAMESPACE;
294
295 gfc_insert_bbt (&pi_root, p, compare);
296
297 symbol_number = 2;
298 }
299
300
301 /* During module writing, call here with a pointer to something,
302 returning the pointer_info node. */
303
304 static pointer_info *
305 find_pointer (void *gp)
306 {
307 pointer_info *p;
308
309 p = pi_root;
310 while (p != NULL)
311 {
312 if (p->u.pointer == gp)
313 break;
314 p = (gp < p->u.pointer) ? p->left : p->right;
315 }
316
317 return p;
318 }
319
320
321 /* Given a pointer while writing, returns the pointer_info tree node,
322 creating it if it doesn't exist. */
323
324 static pointer_info *
325 get_pointer (void *gp)
326 {
327 pointer_info *p;
328
329 p = find_pointer (gp);
330 if (p != NULL)
331 return p;
332
333 /* Pointer doesn't have an integer. Give it one. */
334 p = gfc_get_pointer_info ();
335
336 p->u.pointer = gp;
337 p->integer = symbol_number++;
338
339 gfc_insert_bbt (&pi_root, p, compare_pointers);
340
341 return p;
342 }
343
344
345 /* Given an integer during reading, find it in the pointer_info tree,
346 creating the node if not found. */
347
348 static pointer_info *
349 get_integer (int integer)
350 {
351 pointer_info *p, t;
352 int c;
353
354 t.integer = integer;
355
356 p = pi_root;
357 while (p != NULL)
358 {
359 c = compare_integers (&t, p);
360 if (c == 0)
361 break;
362
363 p = (c < 0) ? p->left : p->right;
364 }
365
366 if (p != NULL)
367 return p;
368
369 p = gfc_get_pointer_info ();
370 p->integer = integer;
371 p->u.pointer = NULL;
372
373 gfc_insert_bbt (&pi_root, p, compare_integers);
374
375 return p;
376 }
377
378
379 /* Recursive function to find a pointer within a tree by brute force. */
380
381 static pointer_info *
382 fp2 (pointer_info *p, const void *target)
383 {
384 pointer_info *q;
385
386 if (p == NULL)
387 return NULL;
388
389 if (p->u.pointer == target)
390 return p;
391
392 q = fp2 (p->left, target);
393 if (q != NULL)
394 return q;
395
396 return fp2 (p->right, target);
397 }
398
399
400 /* During reading, find a pointer_info node from the pointer value.
401 This amounts to a brute-force search. */
402
403 static pointer_info *
404 find_pointer2 (void *p)
405 {
406 return fp2 (pi_root, p);
407 }
408
409
410 /* Resolve any fixups using a known pointer. */
411
412 static void
413 resolve_fixups (fixup_t *f, void *gp)
414 {
415 fixup_t *next;
416
417 for (; f; f = next)
418 {
419 next = f->next;
420 *(f->pointer) = gp;
421 gfc_free (f);
422 }
423 }
424
425
426 /* Call here during module reading when we know what pointer to
427 associate with an integer. Any fixups that exist are resolved at
428 this time. */
429
430 static void
431 associate_integer_pointer (pointer_info *p, void *gp)
432 {
433 if (p->u.pointer != NULL)
434 gfc_internal_error ("associate_integer_pointer(): Already associated");
435
436 p->u.pointer = gp;
437
438 resolve_fixups (p->fixup, gp);
439
440 p->fixup = NULL;
441 }
442
443
444 /* During module reading, given an integer and a pointer to a pointer,
445 either store the pointer from an already-known value or create a
446 fixup structure in order to store things later. Returns zero if
447 the reference has been actually stored, or nonzero if the reference
448 must be fixed later (ie associate_integer_pointer must be called
449 sometime later. Returns the pointer_info structure. */
450
451 static pointer_info *
452 add_fixup (int integer, void *gp)
453 {
454 pointer_info *p;
455 fixup_t *f;
456 char **cp;
457
458 p = get_integer (integer);
459
460 if (p->integer == 0 || p->u.pointer != NULL)
461 {
462 cp = gp;
463 *cp = p->u.pointer;
464 }
465 else
466 {
467 f = gfc_getmem (sizeof (fixup_t));
468
469 f->next = p->fixup;
470 p->fixup = f;
471
472 f->pointer = gp;
473 }
474
475 return p;
476 }
477
478
479 /*****************************************************************/
480
481 /* Parser related subroutines */
482
483 /* Free the rename list left behind by a USE statement. */
484
485 static void
486 free_rename (void)
487 {
488 gfc_use_rename *next;
489
490 for (; gfc_rename_list; gfc_rename_list = next)
491 {
492 next = gfc_rename_list->next;
493 gfc_free (gfc_rename_list);
494 }
495 }
496
497
498 /* Match a USE statement. */
499
500 match
501 gfc_match_use (void)
502 {
503 char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
504 gfc_use_rename *tail = NULL, *new;
505 interface_type type, type2;
506 gfc_intrinsic_op operator;
507 match m;
508
509 specified_int = false;
510 specified_nonint = false;
511
512 if (gfc_match (" , ") == MATCH_YES)
513 {
514 if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
515 {
516 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
517 "nature in USE statement at %C") == FAILURE)
518 return MATCH_ERROR;
519
520 if (strcmp (module_nature, "intrinsic") == 0)
521 specified_int = true;
522 else
523 {
524 if (strcmp (module_nature, "non_intrinsic") == 0)
525 specified_nonint = true;
526 else
527 {
528 gfc_error ("Module nature in USE statement at %C shall "
529 "be either INTRINSIC or NON_INTRINSIC");
530 return MATCH_ERROR;
531 }
532 }
533 }
534 else
535 {
536 /* Help output a better error message than "Unclassifiable
537 statement". */
538 gfc_match (" %n", module_nature);
539 if (strcmp (module_nature, "intrinsic") == 0
540 || strcmp (module_nature, "non_intrinsic") == 0)
541 gfc_error ("\"::\" was expected after module nature at %C "
542 "but was not found");
543 return m;
544 }
545 }
546 else
547 {
548 m = gfc_match (" ::");
549 if (m == MATCH_YES &&
550 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
551 "\"USE :: module\" at %C") == FAILURE)
552 return MATCH_ERROR;
553
554 if (m != MATCH_YES)
555 {
556 m = gfc_match ("% ");
557 if (m != MATCH_YES)
558 return m;
559 }
560 }
561
562 m = gfc_match_name (module_name);
563 if (m != MATCH_YES)
564 return m;
565
566 free_rename ();
567 only_flag = 0;
568
569 if (gfc_match_eos () == MATCH_YES)
570 return MATCH_YES;
571 if (gfc_match_char (',') != MATCH_YES)
572 goto syntax;
573
574 if (gfc_match (" only :") == MATCH_YES)
575 only_flag = 1;
576
577 if (gfc_match_eos () == MATCH_YES)
578 return MATCH_YES;
579
580 for (;;)
581 {
582 /* Get a new rename struct and add it to the rename list. */
583 new = gfc_get_use_rename ();
584 new->where = gfc_current_locus;
585 new->found = 0;
586
587 if (gfc_rename_list == NULL)
588 gfc_rename_list = new;
589 else
590 tail->next = new;
591 tail = new;
592
593 /* See what kind of interface we're dealing with. Assume it is
594 not an operator. */
595 new->operator = INTRINSIC_NONE;
596 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
597 goto cleanup;
598
599 switch (type)
600 {
601 case INTERFACE_NAMELESS:
602 gfc_error ("Missing generic specification in USE statement at %C");
603 goto cleanup;
604
605 case INTERFACE_USER_OP:
606 case INTERFACE_GENERIC:
607 m = gfc_match (" =>");
608
609 if (type == INTERFACE_USER_OP && m == MATCH_YES
610 && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
611 "operators in USE statements at %C")
612 == FAILURE))
613 goto cleanup;
614
615 if (type == INTERFACE_USER_OP)
616 new->operator = INTRINSIC_USER;
617
618 if (only_flag)
619 {
620 if (m != MATCH_YES)
621 strcpy (new->use_name, name);
622 else
623 {
624 strcpy (new->local_name, name);
625 m = gfc_match_generic_spec (&type2, new->use_name, &operator);
626 if (type != type2)
627 goto syntax;
628 if (m == MATCH_NO)
629 goto syntax;
630 if (m == MATCH_ERROR)
631 goto cleanup;
632 }
633 }
634 else
635 {
636 if (m != MATCH_YES)
637 goto syntax;
638 strcpy (new->local_name, name);
639
640 m = gfc_match_generic_spec (&type2, new->use_name, &operator);
641 if (type != type2)
642 goto syntax;
643 if (m == MATCH_NO)
644 goto syntax;
645 if (m == MATCH_ERROR)
646 goto cleanup;
647 }
648
649 if (strcmp (new->use_name, module_name) == 0
650 || strcmp (new->local_name, module_name) == 0)
651 {
652 gfc_error ("The name '%s' at %C has already been used as "
653 "an external module name.", module_name);
654 goto cleanup;
655 }
656 break;
657
658 case INTERFACE_INTRINSIC_OP:
659 new->operator = operator;
660 break;
661
662 default:
663 gcc_unreachable ();
664 }
665
666 if (gfc_match_eos () == MATCH_YES)
667 break;
668 if (gfc_match_char (',') != MATCH_YES)
669 goto syntax;
670 }
671
672 return MATCH_YES;
673
674 syntax:
675 gfc_syntax_error (ST_USE);
676
677 cleanup:
678 free_rename ();
679 return MATCH_ERROR;
680 }
681
682
683 /* Given a name and a number, inst, return the inst name
684 under which to load this symbol. Returns NULL if this
685 symbol shouldn't be loaded. If inst is zero, returns
686 the number of instances of this name. If interface is
687 true, a user-defined operator is sought, otherwise only
688 non-operators are sought. */
689
690 static const char *
691 find_use_name_n (const char *name, int *inst, bool interface)
692 {
693 gfc_use_rename *u;
694 int i;
695
696 i = 0;
697 for (u = gfc_rename_list; u; u = u->next)
698 {
699 if (strcmp (u->use_name, name) != 0
700 || (u->operator == INTRINSIC_USER && !interface)
701 || (u->operator != INTRINSIC_USER && interface))
702 continue;
703 if (++i == *inst)
704 break;
705 }
706
707 if (!*inst)
708 {
709 *inst = i;
710 return NULL;
711 }
712
713 if (u == NULL)
714 return only_flag ? NULL : name;
715
716 u->found = 1;
717
718 return (u->local_name[0] != '\0') ? u->local_name : name;
719 }
720
721
722 /* Given a name, return the name under which to load this symbol.
723 Returns NULL if this symbol shouldn't be loaded. */
724
725 static const char *
726 find_use_name (const char *name, bool interface)
727 {
728 int i = 1;
729 return find_use_name_n (name, &i, interface);
730 }
731
732
733 /* Given a real name, return the number of use names associated with it. */
734
735 static int
736 number_use_names (const char *name, bool interface)
737 {
738 int i = 0;
739 const char *c;
740 c = find_use_name_n (name, &i, interface);
741 return i;
742 }
743
744
745 /* Try to find the operator in the current list. */
746
747 static gfc_use_rename *
748 find_use_operator (gfc_intrinsic_op operator)
749 {
750 gfc_use_rename *u;
751
752 for (u = gfc_rename_list; u; u = u->next)
753 if (u->operator == operator)
754 return u;
755
756 return NULL;
757 }
758
759
760 /*****************************************************************/
761
762 /* The next couple of subroutines maintain a tree used to avoid a
763 brute-force search for a combination of true name and module name.
764 While symtree names, the name that a particular symbol is known by
765 can changed with USE statements, we still have to keep track of the
766 true names to generate the correct reference, and also avoid
767 loading the same real symbol twice in a program unit.
768
769 When we start reading, the true name tree is built and maintained
770 as symbols are read. The tree is searched as we load new symbols
771 to see if it already exists someplace in the namespace. */
772
773 typedef struct true_name
774 {
775 BBT_HEADER (true_name);
776 gfc_symbol *sym;
777 }
778 true_name;
779
780 static true_name *true_name_root;
781
782
783 /* Compare two true_name structures. */
784
785 static int
786 compare_true_names (void *_t1, void *_t2)
787 {
788 true_name *t1, *t2;
789 int c;
790
791 t1 = (true_name *) _t1;
792 t2 = (true_name *) _t2;
793
794 c = ((t1->sym->module > t2->sym->module)
795 - (t1->sym->module < t2->sym->module));
796 if (c != 0)
797 return c;
798
799 return strcmp (t1->sym->name, t2->sym->name);
800 }
801
802
803 /* Given a true name, search the true name tree to see if it exists
804 within the main namespace. */
805
806 static gfc_symbol *
807 find_true_name (const char *name, const char *module)
808 {
809 true_name t, *p;
810 gfc_symbol sym;
811 int c;
812
813 sym.name = gfc_get_string (name);
814 if (module != NULL)
815 sym.module = gfc_get_string (module);
816 else
817 sym.module = NULL;
818 t.sym = &sym;
819
820 p = true_name_root;
821 while (p != NULL)
822 {
823 c = compare_true_names ((void *) (&t), (void *) p);
824 if (c == 0)
825 return p->sym;
826
827 p = (c < 0) ? p->left : p->right;
828 }
829
830 return NULL;
831 }
832
833
834 /* Given a gfc_symbol pointer that is not in the true name tree, add it. */
835
836 static void
837 add_true_name (gfc_symbol *sym)
838 {
839 true_name *t;
840
841 t = gfc_getmem (sizeof (true_name));
842 t->sym = sym;
843
844 gfc_insert_bbt (&true_name_root, t, compare_true_names);
845 }
846
847
848 /* Recursive function to build the initial true name tree by
849 recursively traversing the current namespace. */
850
851 static void
852 build_tnt (gfc_symtree *st)
853 {
854 if (st == NULL)
855 return;
856
857 build_tnt (st->left);
858 build_tnt (st->right);
859
860 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
861 return;
862
863 add_true_name (st->n.sym);
864 }
865
866
867 /* Initialize the true name tree with the current namespace. */
868
869 static void
870 init_true_name_tree (void)
871 {
872 true_name_root = NULL;
873 build_tnt (gfc_current_ns->sym_root);
874 }
875
876
877 /* Recursively free a true name tree node. */
878
879 static void
880 free_true_name (true_name *t)
881 {
882 if (t == NULL)
883 return;
884 free_true_name (t->left);
885 free_true_name (t->right);
886
887 gfc_free (t);
888 }
889
890
891 /*****************************************************************/
892
893 /* Module reading and writing. */
894
895 typedef enum
896 {
897 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
898 }
899 atom_type;
900
901 static atom_type last_atom;
902
903
904 /* The name buffer must be at least as long as a symbol name. Right
905 now it's not clear how we're going to store numeric constants--
906 probably as a hexadecimal string, since this will allow the exact
907 number to be preserved (this can't be done by a decimal
908 representation). Worry about that later. TODO! */
909
910 #define MAX_ATOM_SIZE 100
911
912 static int atom_int;
913 static char *atom_string, atom_name[MAX_ATOM_SIZE];
914
915
916 /* Report problems with a module. Error reporting is not very
917 elaborate, since this sorts of errors shouldn't really happen.
918 This subroutine never returns. */
919
920 static void bad_module (const char *) ATTRIBUTE_NORETURN;
921
922 static void
923 bad_module (const char *msgid)
924 {
925 fclose (module_fp);
926
927 switch (iomode)
928 {
929 case IO_INPUT:
930 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
931 module_name, module_line, module_column, msgid);
932 break;
933 case IO_OUTPUT:
934 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
935 module_name, module_line, module_column, msgid);
936 break;
937 default:
938 gfc_fatal_error ("Module %s at line %d column %d: %s",
939 module_name, module_line, module_column, msgid);
940 break;
941 }
942 }
943
944
945 /* Set the module's input pointer. */
946
947 static void
948 set_module_locus (module_locus *m)
949 {
950 module_column = m->column;
951 module_line = m->line;
952 fsetpos (module_fp, &m->pos);
953 }
954
955
956 /* Get the module's input pointer so that we can restore it later. */
957
958 static void
959 get_module_locus (module_locus *m)
960 {
961 m->column = module_column;
962 m->line = module_line;
963 fgetpos (module_fp, &m->pos);
964 }
965
966
967 /* Get the next character in the module, updating our reckoning of
968 where we are. */
969
970 static int
971 module_char (void)
972 {
973 int c;
974
975 c = getc (module_fp);
976
977 if (c == EOF)
978 bad_module ("Unexpected EOF");
979
980 if (c == '\n')
981 {
982 module_line++;
983 module_column = 0;
984 }
985
986 module_column++;
987 return c;
988 }
989
990
991 /* Parse a string constant. The delimiter is guaranteed to be a
992 single quote. */
993
994 static void
995 parse_string (void)
996 {
997 module_locus start;
998 int len, c;
999 char *p;
1000
1001 get_module_locus (&start);
1002
1003 len = 0;
1004
1005 /* See how long the string is. */
1006 for ( ; ; )
1007 {
1008 c = module_char ();
1009 if (c == EOF)
1010 bad_module ("Unexpected end of module in string constant");
1011
1012 if (c != '\'')
1013 {
1014 len++;
1015 continue;
1016 }
1017
1018 c = module_char ();
1019 if (c == '\'')
1020 {
1021 len++;
1022 continue;
1023 }
1024
1025 break;
1026 }
1027
1028 set_module_locus (&start);
1029
1030 atom_string = p = gfc_getmem (len + 1);
1031
1032 for (; len > 0; len--)
1033 {
1034 c = module_char ();
1035 if (c == '\'')
1036 module_char (); /* Guaranteed to be another \'. */
1037 *p++ = c;
1038 }
1039
1040 module_char (); /* Terminating \'. */
1041 *p = '\0'; /* C-style string for debug purposes. */
1042 }
1043
1044
1045 /* Parse a small integer. */
1046
1047 static void
1048 parse_integer (int c)
1049 {
1050 module_locus m;
1051
1052 atom_int = c - '0';
1053
1054 for (;;)
1055 {
1056 get_module_locus (&m);
1057
1058 c = module_char ();
1059 if (!ISDIGIT (c))
1060 break;
1061
1062 atom_int = 10 * atom_int + c - '0';
1063 if (atom_int > 99999999)
1064 bad_module ("Integer overflow");
1065 }
1066
1067 set_module_locus (&m);
1068 }
1069
1070
1071 /* Parse a name. */
1072
1073 static void
1074 parse_name (int c)
1075 {
1076 module_locus m;
1077 char *p;
1078 int len;
1079
1080 p = atom_name;
1081
1082 *p++ = c;
1083 len = 1;
1084
1085 get_module_locus (&m);
1086
1087 for (;;)
1088 {
1089 c = module_char ();
1090 if (!ISALNUM (c) && c != '_' && c != '-')
1091 break;
1092
1093 *p++ = c;
1094 if (++len > GFC_MAX_SYMBOL_LEN)
1095 bad_module ("Name too long");
1096 }
1097
1098 *p = '\0';
1099
1100 fseek (module_fp, -1, SEEK_CUR);
1101 module_column = m.column + len - 1;
1102
1103 if (c == '\n')
1104 module_line--;
1105 }
1106
1107
1108 /* Read the next atom in the module's input stream. */
1109
1110 static atom_type
1111 parse_atom (void)
1112 {
1113 int c;
1114
1115 do
1116 {
1117 c = module_char ();
1118 }
1119 while (c == ' ' || c == '\r' || c == '\n');
1120
1121 switch (c)
1122 {
1123 case '(':
1124 return ATOM_LPAREN;
1125
1126 case ')':
1127 return ATOM_RPAREN;
1128
1129 case '\'':
1130 parse_string ();
1131 return ATOM_STRING;
1132
1133 case '0':
1134 case '1':
1135 case '2':
1136 case '3':
1137 case '4':
1138 case '5':
1139 case '6':
1140 case '7':
1141 case '8':
1142 case '9':
1143 parse_integer (c);
1144 return ATOM_INTEGER;
1145
1146 case 'a':
1147 case 'b':
1148 case 'c':
1149 case 'd':
1150 case 'e':
1151 case 'f':
1152 case 'g':
1153 case 'h':
1154 case 'i':
1155 case 'j':
1156 case 'k':
1157 case 'l':
1158 case 'm':
1159 case 'n':
1160 case 'o':
1161 case 'p':
1162 case 'q':
1163 case 'r':
1164 case 's':
1165 case 't':
1166 case 'u':
1167 case 'v':
1168 case 'w':
1169 case 'x':
1170 case 'y':
1171 case 'z':
1172 case 'A':
1173 case 'B':
1174 case 'C':
1175 case 'D':
1176 case 'E':
1177 case 'F':
1178 case 'G':
1179 case 'H':
1180 case 'I':
1181 case 'J':
1182 case 'K':
1183 case 'L':
1184 case 'M':
1185 case 'N':
1186 case 'O':
1187 case 'P':
1188 case 'Q':
1189 case 'R':
1190 case 'S':
1191 case 'T':
1192 case 'U':
1193 case 'V':
1194 case 'W':
1195 case 'X':
1196 case 'Y':
1197 case 'Z':
1198 parse_name (c);
1199 return ATOM_NAME;
1200
1201 default:
1202 bad_module ("Bad name");
1203 }
1204
1205 /* Not reached. */
1206 }
1207
1208
1209 /* Peek at the next atom on the input. */
1210
1211 static atom_type
1212 peek_atom (void)
1213 {
1214 module_locus m;
1215 atom_type a;
1216
1217 get_module_locus (&m);
1218
1219 a = parse_atom ();
1220 if (a == ATOM_STRING)
1221 gfc_free (atom_string);
1222
1223 set_module_locus (&m);
1224 return a;
1225 }
1226
1227
1228 /* Read the next atom from the input, requiring that it be a
1229 particular kind. */
1230
1231 static void
1232 require_atom (atom_type type)
1233 {
1234 module_locus m;
1235 atom_type t;
1236 const char *p;
1237
1238 get_module_locus (&m);
1239
1240 t = parse_atom ();
1241 if (t != type)
1242 {
1243 switch (type)
1244 {
1245 case ATOM_NAME:
1246 p = _("Expected name");
1247 break;
1248 case ATOM_LPAREN:
1249 p = _("Expected left parenthesis");
1250 break;
1251 case ATOM_RPAREN:
1252 p = _("Expected right parenthesis");
1253 break;
1254 case ATOM_INTEGER:
1255 p = _("Expected integer");
1256 break;
1257 case ATOM_STRING:
1258 p = _("Expected string");
1259 break;
1260 default:
1261 gfc_internal_error ("require_atom(): bad atom type required");
1262 }
1263
1264 set_module_locus (&m);
1265 bad_module (p);
1266 }
1267 }
1268
1269
1270 /* Given a pointer to an mstring array, require that the current input
1271 be one of the strings in the array. We return the enum value. */
1272
1273 static int
1274 find_enum (const mstring *m)
1275 {
1276 int i;
1277
1278 i = gfc_string2code (m, atom_name);
1279 if (i >= 0)
1280 return i;
1281
1282 bad_module ("find_enum(): Enum not found");
1283
1284 /* Not reached. */
1285 }
1286
1287
1288 /**************** Module output subroutines ***************************/
1289
1290 /* Output a character to a module file. */
1291
1292 static void
1293 write_char (char out)
1294 {
1295 if (putc (out, module_fp) == EOF)
1296 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1297
1298 /* Add this to our MD5. */
1299 md5_process_bytes (&out, sizeof (out), &ctx);
1300
1301 if (out != '\n')
1302 module_column++;
1303 else
1304 {
1305 module_column = 1;
1306 module_line++;
1307 }
1308 }
1309
1310
1311 /* Write an atom to a module. The line wrapping isn't perfect, but it
1312 should work most of the time. This isn't that big of a deal, since
1313 the file really isn't meant to be read by people anyway. */
1314
1315 static void
1316 write_atom (atom_type atom, const void *v)
1317 {
1318 char buffer[20];
1319 int i, len;
1320 const char *p;
1321
1322 switch (atom)
1323 {
1324 case ATOM_STRING:
1325 case ATOM_NAME:
1326 p = v;
1327 break;
1328
1329 case ATOM_LPAREN:
1330 p = "(";
1331 break;
1332
1333 case ATOM_RPAREN:
1334 p = ")";
1335 break;
1336
1337 case ATOM_INTEGER:
1338 i = *((const int *) v);
1339 if (i < 0)
1340 gfc_internal_error ("write_atom(): Writing negative integer");
1341
1342 sprintf (buffer, "%d", i);
1343 p = buffer;
1344 break;
1345
1346 default:
1347 gfc_internal_error ("write_atom(): Trying to write dab atom");
1348
1349 }
1350
1351 if(p == NULL || *p == '\0')
1352 len = 0;
1353 else
1354 len = strlen (p);
1355
1356 if (atom != ATOM_RPAREN)
1357 {
1358 if (module_column + len > 72)
1359 write_char ('\n');
1360 else
1361 {
1362
1363 if (last_atom != ATOM_LPAREN && module_column != 1)
1364 write_char (' ');
1365 }
1366 }
1367
1368 if (atom == ATOM_STRING)
1369 write_char ('\'');
1370
1371 while (p != NULL && *p)
1372 {
1373 if (atom == ATOM_STRING && *p == '\'')
1374 write_char ('\'');
1375 write_char (*p++);
1376 }
1377
1378 if (atom == ATOM_STRING)
1379 write_char ('\'');
1380
1381 last_atom = atom;
1382 }
1383
1384
1385
1386 /***************** Mid-level I/O subroutines *****************/
1387
1388 /* These subroutines let their caller read or write atoms without
1389 caring about which of the two is actually happening. This lets a
1390 subroutine concentrate on the actual format of the data being
1391 written. */
1392
1393 static void mio_expr (gfc_expr **);
1394 pointer_info *mio_symbol_ref (gfc_symbol **);
1395 pointer_info *mio_interface_rest (gfc_interface **);
1396 static void mio_symtree_ref (gfc_symtree **);
1397
1398 /* Read or write an enumerated value. On writing, we return the input
1399 value for the convenience of callers. We avoid using an integer
1400 pointer because enums are sometimes inside bitfields. */
1401
1402 static int
1403 mio_name (int t, const mstring *m)
1404 {
1405 if (iomode == IO_OUTPUT)
1406 write_atom (ATOM_NAME, gfc_code2string (m, t));
1407 else
1408 {
1409 require_atom (ATOM_NAME);
1410 t = find_enum (m);
1411 }
1412
1413 return t;
1414 }
1415
1416 /* Specialization of mio_name. */
1417
1418 #define DECL_MIO_NAME(TYPE) \
1419 static inline TYPE \
1420 MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1421 { \
1422 return (TYPE) mio_name ((int) t, m); \
1423 }
1424 #define MIO_NAME(TYPE) mio_name_##TYPE
1425
1426 static void
1427 mio_lparen (void)
1428 {
1429 if (iomode == IO_OUTPUT)
1430 write_atom (ATOM_LPAREN, NULL);
1431 else
1432 require_atom (ATOM_LPAREN);
1433 }
1434
1435
1436 static void
1437 mio_rparen (void)
1438 {
1439 if (iomode == IO_OUTPUT)
1440 write_atom (ATOM_RPAREN, NULL);
1441 else
1442 require_atom (ATOM_RPAREN);
1443 }
1444
1445
1446 static void
1447 mio_integer (int *ip)
1448 {
1449 if (iomode == IO_OUTPUT)
1450 write_atom (ATOM_INTEGER, ip);
1451 else
1452 {
1453 require_atom (ATOM_INTEGER);
1454 *ip = atom_int;
1455 }
1456 }
1457
1458
1459 /* Read or write a character pointer that points to a string on the heap. */
1460
1461 static const char *
1462 mio_allocated_string (const char *s)
1463 {
1464 if (iomode == IO_OUTPUT)
1465 {
1466 write_atom (ATOM_STRING, s);
1467 return s;
1468 }
1469 else
1470 {
1471 require_atom (ATOM_STRING);
1472 return atom_string;
1473 }
1474 }
1475
1476
1477 /* Read or write a string that is in static memory. */
1478
1479 static void
1480 mio_pool_string (const char **stringp)
1481 {
1482 /* TODO: one could write the string only once, and refer to it via a
1483 fixup pointer. */
1484
1485 /* As a special case we have to deal with a NULL string. This
1486 happens for the 'module' member of 'gfc_symbol's that are not in a
1487 module. We read / write these as the empty string. */
1488 if (iomode == IO_OUTPUT)
1489 {
1490 const char *p = *stringp == NULL ? "" : *stringp;
1491 write_atom (ATOM_STRING, p);
1492 }
1493 else
1494 {
1495 require_atom (ATOM_STRING);
1496 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1497 gfc_free (atom_string);
1498 }
1499 }
1500
1501
1502 /* Read or write a string that is inside of some already-allocated
1503 structure. */
1504
1505 static void
1506 mio_internal_string (char *string)
1507 {
1508 if (iomode == IO_OUTPUT)
1509 write_atom (ATOM_STRING, string);
1510 else
1511 {
1512 require_atom (ATOM_STRING);
1513 strcpy (string, atom_string);
1514 gfc_free (atom_string);
1515 }
1516 }
1517
1518
1519 typedef enum
1520 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1521 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1522 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1523 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1524 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1525 AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED,
1526 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP
1527 }
1528 ab_attribute;
1529
1530 static const mstring attr_bits[] =
1531 {
1532 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1533 minit ("DIMENSION", AB_DIMENSION),
1534 minit ("EXTERNAL", AB_EXTERNAL),
1535 minit ("INTRINSIC", AB_INTRINSIC),
1536 minit ("OPTIONAL", AB_OPTIONAL),
1537 minit ("POINTER", AB_POINTER),
1538 minit ("VOLATILE", AB_VOLATILE),
1539 minit ("TARGET", AB_TARGET),
1540 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1541 minit ("DUMMY", AB_DUMMY),
1542 minit ("RESULT", AB_RESULT),
1543 minit ("DATA", AB_DATA),
1544 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1545 minit ("IN_COMMON", AB_IN_COMMON),
1546 minit ("FUNCTION", AB_FUNCTION),
1547 minit ("SUBROUTINE", AB_SUBROUTINE),
1548 minit ("SEQUENCE", AB_SEQUENCE),
1549 minit ("ELEMENTAL", AB_ELEMENTAL),
1550 minit ("PURE", AB_PURE),
1551 minit ("RECURSIVE", AB_RECURSIVE),
1552 minit ("GENERIC", AB_GENERIC),
1553 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1554 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1555 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1556 minit ("IS_BIND_C", AB_IS_BIND_C),
1557 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1558 minit ("IS_ISO_C", AB_IS_ISO_C),
1559 minit ("VALUE", AB_VALUE),
1560 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1561 minit ("POINTER_COMP", AB_POINTER_COMP),
1562 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1563 minit ("ZERO_COMP", AB_ZERO_COMP),
1564 minit ("PROTECTED", AB_PROTECTED),
1565 minit ("ABSTRACT", AB_ABSTRACT),
1566 minit (NULL, -1)
1567 };
1568
1569
1570 /* Specialization of mio_name. */
1571 DECL_MIO_NAME (ab_attribute)
1572 DECL_MIO_NAME (ar_type)
1573 DECL_MIO_NAME (array_type)
1574 DECL_MIO_NAME (bt)
1575 DECL_MIO_NAME (expr_t)
1576 DECL_MIO_NAME (gfc_access)
1577 DECL_MIO_NAME (gfc_intrinsic_op)
1578 DECL_MIO_NAME (ifsrc)
1579 DECL_MIO_NAME (save_state)
1580 DECL_MIO_NAME (procedure_type)
1581 DECL_MIO_NAME (ref_type)
1582 DECL_MIO_NAME (sym_flavor)
1583 DECL_MIO_NAME (sym_intent)
1584 #undef DECL_MIO_NAME
1585
1586 /* Symbol attributes are stored in list with the first three elements
1587 being the enumerated fields, while the remaining elements (if any)
1588 indicate the individual attribute bits. The access field is not
1589 saved-- it controls what symbols are exported when a module is
1590 written. */
1591
1592 static void
1593 mio_symbol_attribute (symbol_attribute *attr)
1594 {
1595 atom_type t;
1596
1597 mio_lparen ();
1598
1599 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1600 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1601 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1602 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1603 attr->save = MIO_NAME (save_state) (attr->save, save_status);
1604
1605 if (iomode == IO_OUTPUT)
1606 {
1607 if (attr->allocatable)
1608 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1609 if (attr->dimension)
1610 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1611 if (attr->external)
1612 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1613 if (attr->intrinsic)
1614 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1615 if (attr->optional)
1616 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1617 if (attr->pointer)
1618 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1619 if (attr->protected)
1620 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1621 if (attr->value)
1622 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1623 if (attr->volatile_)
1624 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1625 if (attr->target)
1626 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1627 if (attr->threadprivate)
1628 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1629 if (attr->dummy)
1630 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1631 if (attr->result)
1632 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1633 /* We deliberately don't preserve the "entry" flag. */
1634
1635 if (attr->data)
1636 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1637 if (attr->in_namelist)
1638 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1639 if (attr->in_common)
1640 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1641
1642 if (attr->function)
1643 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
1644 if (attr->subroutine)
1645 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
1646 if (attr->generic)
1647 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
1648 if (attr->abstract)
1649 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
1650
1651 if (attr->sequence)
1652 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
1653 if (attr->elemental)
1654 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
1655 if (attr->pure)
1656 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
1657 if (attr->recursive)
1658 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
1659 if (attr->always_explicit)
1660 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1661 if (attr->cray_pointer)
1662 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
1663 if (attr->cray_pointee)
1664 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1665 if (attr->is_bind_c)
1666 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
1667 if (attr->is_c_interop)
1668 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
1669 if (attr->is_iso_c)
1670 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
1671 if (attr->alloc_comp)
1672 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
1673 if (attr->pointer_comp)
1674 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
1675 if (attr->private_comp)
1676 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
1677 if (attr->zero_comp)
1678 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
1679
1680 mio_rparen ();
1681
1682 }
1683 else
1684 {
1685 for (;;)
1686 {
1687 t = parse_atom ();
1688 if (t == ATOM_RPAREN)
1689 break;
1690 if (t != ATOM_NAME)
1691 bad_module ("Expected attribute bit name");
1692
1693 switch ((ab_attribute) find_enum (attr_bits))
1694 {
1695 case AB_ALLOCATABLE:
1696 attr->allocatable = 1;
1697 break;
1698 case AB_DIMENSION:
1699 attr->dimension = 1;
1700 break;
1701 case AB_EXTERNAL:
1702 attr->external = 1;
1703 break;
1704 case AB_INTRINSIC:
1705 attr->intrinsic = 1;
1706 break;
1707 case AB_OPTIONAL:
1708 attr->optional = 1;
1709 break;
1710 case AB_POINTER:
1711 attr->pointer = 1;
1712 break;
1713 case AB_PROTECTED:
1714 attr->protected = 1;
1715 break;
1716 case AB_VALUE:
1717 attr->value = 1;
1718 break;
1719 case AB_VOLATILE:
1720 attr->volatile_ = 1;
1721 break;
1722 case AB_TARGET:
1723 attr->target = 1;
1724 break;
1725 case AB_THREADPRIVATE:
1726 attr->threadprivate = 1;
1727 break;
1728 case AB_DUMMY:
1729 attr->dummy = 1;
1730 break;
1731 case AB_RESULT:
1732 attr->result = 1;
1733 break;
1734 case AB_DATA:
1735 attr->data = 1;
1736 break;
1737 case AB_IN_NAMELIST:
1738 attr->in_namelist = 1;
1739 break;
1740 case AB_IN_COMMON:
1741 attr->in_common = 1;
1742 break;
1743 case AB_FUNCTION:
1744 attr->function = 1;
1745 break;
1746 case AB_SUBROUTINE:
1747 attr->subroutine = 1;
1748 break;
1749 case AB_GENERIC:
1750 attr->generic = 1;
1751 break;
1752 case AB_ABSTRACT:
1753 attr->abstract = 1;
1754 break;
1755 case AB_SEQUENCE:
1756 attr->sequence = 1;
1757 break;
1758 case AB_ELEMENTAL:
1759 attr->elemental = 1;
1760 break;
1761 case AB_PURE:
1762 attr->pure = 1;
1763 break;
1764 case AB_RECURSIVE:
1765 attr->recursive = 1;
1766 break;
1767 case AB_ALWAYS_EXPLICIT:
1768 attr->always_explicit = 1;
1769 break;
1770 case AB_CRAY_POINTER:
1771 attr->cray_pointer = 1;
1772 break;
1773 case AB_CRAY_POINTEE:
1774 attr->cray_pointee = 1;
1775 break;
1776 case AB_IS_BIND_C:
1777 attr->is_bind_c = 1;
1778 break;
1779 case AB_IS_C_INTEROP:
1780 attr->is_c_interop = 1;
1781 break;
1782 case AB_IS_ISO_C:
1783 attr->is_iso_c = 1;
1784 break;
1785 case AB_ALLOC_COMP:
1786 attr->alloc_comp = 1;
1787 break;
1788 case AB_POINTER_COMP:
1789 attr->pointer_comp = 1;
1790 break;
1791 case AB_PRIVATE_COMP:
1792 attr->private_comp = 1;
1793 break;
1794 case AB_ZERO_COMP:
1795 attr->zero_comp = 1;
1796 break;
1797 }
1798 }
1799 }
1800 }
1801
1802
1803 static const mstring bt_types[] = {
1804 minit ("INTEGER", BT_INTEGER),
1805 minit ("REAL", BT_REAL),
1806 minit ("COMPLEX", BT_COMPLEX),
1807 minit ("LOGICAL", BT_LOGICAL),
1808 minit ("CHARACTER", BT_CHARACTER),
1809 minit ("DERIVED", BT_DERIVED),
1810 minit ("PROCEDURE", BT_PROCEDURE),
1811 minit ("UNKNOWN", BT_UNKNOWN),
1812 minit ("VOID", BT_VOID),
1813 minit (NULL, -1)
1814 };
1815
1816
1817 static void
1818 mio_charlen (gfc_charlen **clp)
1819 {
1820 gfc_charlen *cl;
1821
1822 mio_lparen ();
1823
1824 if (iomode == IO_OUTPUT)
1825 {
1826 cl = *clp;
1827 if (cl != NULL)
1828 mio_expr (&cl->length);
1829 }
1830 else
1831 {
1832 if (peek_atom () != ATOM_RPAREN)
1833 {
1834 cl = gfc_get_charlen ();
1835 mio_expr (&cl->length);
1836
1837 *clp = cl;
1838
1839 cl->next = gfc_current_ns->cl_list;
1840 gfc_current_ns->cl_list = cl;
1841 }
1842 }
1843
1844 mio_rparen ();
1845 }
1846
1847
1848 /* See if a name is a generated name. */
1849
1850 static int
1851 check_unique_name (const char *name)
1852 {
1853 return *name == '@';
1854 }
1855
1856
1857 static void
1858 mio_typespec (gfc_typespec *ts)
1859 {
1860 mio_lparen ();
1861
1862 ts->type = MIO_NAME (bt) (ts->type, bt_types);
1863
1864 if (ts->type != BT_DERIVED)
1865 mio_integer (&ts->kind);
1866 else
1867 mio_symbol_ref (&ts->derived);
1868
1869 /* Add info for C interop and is_iso_c. */
1870 mio_integer (&ts->is_c_interop);
1871 mio_integer (&ts->is_iso_c);
1872
1873 /* If the typespec is for an identifier either from iso_c_binding, or
1874 a constant that was initialized to an identifier from it, use the
1875 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
1876 if (ts->is_iso_c)
1877 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
1878 else
1879 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
1880
1881 if (ts->type != BT_CHARACTER)
1882 {
1883 /* ts->cl is only valid for BT_CHARACTER. */
1884 mio_lparen ();
1885 mio_rparen ();
1886 }
1887 else
1888 mio_charlen (&ts->cl);
1889
1890 mio_rparen ();
1891 }
1892
1893
1894 static const mstring array_spec_types[] = {
1895 minit ("EXPLICIT", AS_EXPLICIT),
1896 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1897 minit ("DEFERRED", AS_DEFERRED),
1898 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1899 minit (NULL, -1)
1900 };
1901
1902
1903 static void
1904 mio_array_spec (gfc_array_spec **asp)
1905 {
1906 gfc_array_spec *as;
1907 int i;
1908
1909 mio_lparen ();
1910
1911 if (iomode == IO_OUTPUT)
1912 {
1913 if (*asp == NULL)
1914 goto done;
1915 as = *asp;
1916 }
1917 else
1918 {
1919 if (peek_atom () == ATOM_RPAREN)
1920 {
1921 *asp = NULL;
1922 goto done;
1923 }
1924
1925 *asp = as = gfc_get_array_spec ();
1926 }
1927
1928 mio_integer (&as->rank);
1929 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
1930
1931 for (i = 0; i < as->rank; i++)
1932 {
1933 mio_expr (&as->lower[i]);
1934 mio_expr (&as->upper[i]);
1935 }
1936
1937 done:
1938 mio_rparen ();
1939 }
1940
1941
1942 /* Given a pointer to an array reference structure (which lives in a
1943 gfc_ref structure), find the corresponding array specification
1944 structure. Storing the pointer in the ref structure doesn't quite
1945 work when loading from a module. Generating code for an array
1946 reference also needs more information than just the array spec. */
1947
1948 static const mstring array_ref_types[] = {
1949 minit ("FULL", AR_FULL),
1950 minit ("ELEMENT", AR_ELEMENT),
1951 minit ("SECTION", AR_SECTION),
1952 minit (NULL, -1)
1953 };
1954
1955
1956 static void
1957 mio_array_ref (gfc_array_ref *ar)
1958 {
1959 int i;
1960
1961 mio_lparen ();
1962 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
1963 mio_integer (&ar->dimen);
1964
1965 switch (ar->type)
1966 {
1967 case AR_FULL:
1968 break;
1969
1970 case AR_ELEMENT:
1971 for (i = 0; i < ar->dimen; i++)
1972 mio_expr (&ar->start[i]);
1973
1974 break;
1975
1976 case AR_SECTION:
1977 for (i = 0; i < ar->dimen; i++)
1978 {
1979 mio_expr (&ar->start[i]);
1980 mio_expr (&ar->end[i]);
1981 mio_expr (&ar->stride[i]);
1982 }
1983
1984 break;
1985
1986 case AR_UNKNOWN:
1987 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1988 }
1989
1990 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
1991 we can't call mio_integer directly. Instead loop over each element
1992 and cast it to/from an integer. */
1993 if (iomode == IO_OUTPUT)
1994 {
1995 for (i = 0; i < ar->dimen; i++)
1996 {
1997 int tmp = (int)ar->dimen_type[i];
1998 write_atom (ATOM_INTEGER, &tmp);
1999 }
2000 }
2001 else
2002 {
2003 for (i = 0; i < ar->dimen; i++)
2004 {
2005 require_atom (ATOM_INTEGER);
2006 ar->dimen_type[i] = atom_int;
2007 }
2008 }
2009
2010 if (iomode == IO_INPUT)
2011 {
2012 ar->where = gfc_current_locus;
2013
2014 for (i = 0; i < ar->dimen; i++)
2015 ar->c_where[i] = gfc_current_locus;
2016 }
2017
2018 mio_rparen ();
2019 }
2020
2021
2022 /* Saves or restores a pointer. The pointer is converted back and
2023 forth from an integer. We return the pointer_info pointer so that
2024 the caller can take additional action based on the pointer type. */
2025
2026 static pointer_info *
2027 mio_pointer_ref (void *gp)
2028 {
2029 pointer_info *p;
2030
2031 if (iomode == IO_OUTPUT)
2032 {
2033 p = get_pointer (*((char **) gp));
2034 write_atom (ATOM_INTEGER, &p->integer);
2035 }
2036 else
2037 {
2038 require_atom (ATOM_INTEGER);
2039 p = add_fixup (atom_int, gp);
2040 }
2041
2042 return p;
2043 }
2044
2045
2046 /* Save and load references to components that occur within
2047 expressions. We have to describe these references by a number and
2048 by name. The number is necessary for forward references during
2049 reading, and the name is necessary if the symbol already exists in
2050 the namespace and is not loaded again. */
2051
2052 static void
2053 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2054 {
2055 char name[GFC_MAX_SYMBOL_LEN + 1];
2056 gfc_component *q;
2057 pointer_info *p;
2058
2059 p = mio_pointer_ref (cp);
2060 if (p->type == P_UNKNOWN)
2061 p->type = P_COMPONENT;
2062
2063 if (iomode == IO_OUTPUT)
2064 mio_pool_string (&(*cp)->name);
2065 else
2066 {
2067 mio_internal_string (name);
2068
2069 /* It can happen that a component reference can be read before the
2070 associated derived type symbol has been loaded. Return now and
2071 wait for a later iteration of load_needed. */
2072 if (sym == NULL)
2073 return;
2074
2075 if (sym->components != NULL && p->u.pointer == NULL)
2076 {
2077 /* Symbol already loaded, so search by name. */
2078 for (q = sym->components; q; q = q->next)
2079 if (strcmp (q->name, name) == 0)
2080 break;
2081
2082 if (q == NULL)
2083 gfc_internal_error ("mio_component_ref(): Component not found");
2084
2085 associate_integer_pointer (p, q);
2086 }
2087
2088 /* Make sure this symbol will eventually be loaded. */
2089 p = find_pointer2 (sym);
2090 if (p->u.rsym.state == UNUSED)
2091 p->u.rsym.state = NEEDED;
2092 }
2093 }
2094
2095
2096 static void
2097 mio_component (gfc_component *c)
2098 {
2099 pointer_info *p;
2100 int n;
2101
2102 mio_lparen ();
2103
2104 if (iomode == IO_OUTPUT)
2105 {
2106 p = get_pointer (c);
2107 mio_integer (&p->integer);
2108 }
2109 else
2110 {
2111 mio_integer (&n);
2112 p = get_integer (n);
2113 associate_integer_pointer (p, c);
2114 }
2115
2116 if (p->type == P_UNKNOWN)
2117 p->type = P_COMPONENT;
2118
2119 mio_pool_string (&c->name);
2120 mio_typespec (&c->ts);
2121 mio_array_spec (&c->as);
2122
2123 mio_integer (&c->dimension);
2124 mio_integer (&c->pointer);
2125 mio_integer (&c->allocatable);
2126 c->access = MIO_NAME (gfc_access) (c->access, access_types);
2127
2128 mio_expr (&c->initializer);
2129 mio_rparen ();
2130 }
2131
2132
2133 static void
2134 mio_component_list (gfc_component **cp)
2135 {
2136 gfc_component *c, *tail;
2137
2138 mio_lparen ();
2139
2140 if (iomode == IO_OUTPUT)
2141 {
2142 for (c = *cp; c; c = c->next)
2143 mio_component (c);
2144 }
2145 else
2146 {
2147 *cp = NULL;
2148 tail = NULL;
2149
2150 for (;;)
2151 {
2152 if (peek_atom () == ATOM_RPAREN)
2153 break;
2154
2155 c = gfc_get_component ();
2156 mio_component (c);
2157
2158 if (tail == NULL)
2159 *cp = c;
2160 else
2161 tail->next = c;
2162
2163 tail = c;
2164 }
2165 }
2166
2167 mio_rparen ();
2168 }
2169
2170
2171 static void
2172 mio_actual_arg (gfc_actual_arglist *a)
2173 {
2174 mio_lparen ();
2175 mio_pool_string (&a->name);
2176 mio_expr (&a->expr);
2177 mio_rparen ();
2178 }
2179
2180
2181 static void
2182 mio_actual_arglist (gfc_actual_arglist **ap)
2183 {
2184 gfc_actual_arglist *a, *tail;
2185
2186 mio_lparen ();
2187
2188 if (iomode == IO_OUTPUT)
2189 {
2190 for (a = *ap; a; a = a->next)
2191 mio_actual_arg (a);
2192
2193 }
2194 else
2195 {
2196 tail = NULL;
2197
2198 for (;;)
2199 {
2200 if (peek_atom () != ATOM_LPAREN)
2201 break;
2202
2203 a = gfc_get_actual_arglist ();
2204
2205 if (tail == NULL)
2206 *ap = a;
2207 else
2208 tail->next = a;
2209
2210 tail = a;
2211 mio_actual_arg (a);
2212 }
2213 }
2214
2215 mio_rparen ();
2216 }
2217
2218
2219 /* Read and write formal argument lists. */
2220
2221 static void
2222 mio_formal_arglist (gfc_symbol *sym)
2223 {
2224 gfc_formal_arglist *f, *tail;
2225
2226 mio_lparen ();
2227
2228 if (iomode == IO_OUTPUT)
2229 {
2230 for (f = sym->formal; f; f = f->next)
2231 mio_symbol_ref (&f->sym);
2232 }
2233 else
2234 {
2235 sym->formal = tail = NULL;
2236
2237 while (peek_atom () != ATOM_RPAREN)
2238 {
2239 f = gfc_get_formal_arglist ();
2240 mio_symbol_ref (&f->sym);
2241
2242 if (sym->formal == NULL)
2243 sym->formal = f;
2244 else
2245 tail->next = f;
2246
2247 tail = f;
2248 }
2249 }
2250
2251 mio_rparen ();
2252 }
2253
2254
2255 /* Save or restore a reference to a symbol node. */
2256
2257 pointer_info *
2258 mio_symbol_ref (gfc_symbol **symp)
2259 {
2260 pointer_info *p;
2261
2262 p = mio_pointer_ref (symp);
2263 if (p->type == P_UNKNOWN)
2264 p->type = P_SYMBOL;
2265
2266 if (iomode == IO_OUTPUT)
2267 {
2268 if (p->u.wsym.state == UNREFERENCED)
2269 p->u.wsym.state = NEEDS_WRITE;
2270 }
2271 else
2272 {
2273 if (p->u.rsym.state == UNUSED)
2274 p->u.rsym.state = NEEDED;
2275 }
2276 return p;
2277 }
2278
2279
2280 /* Save or restore a reference to a symtree node. */
2281
2282 static void
2283 mio_symtree_ref (gfc_symtree **stp)
2284 {
2285 pointer_info *p;
2286 fixup_t *f;
2287
2288 if (iomode == IO_OUTPUT)
2289 mio_symbol_ref (&(*stp)->n.sym);
2290 else
2291 {
2292 require_atom (ATOM_INTEGER);
2293 p = get_integer (atom_int);
2294
2295 /* An unused equivalence member; make a symbol and a symtree
2296 for it. */
2297 if (in_load_equiv && p->u.rsym.symtree == NULL)
2298 {
2299 /* Since this is not used, it must have a unique name. */
2300 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2301
2302 /* Make the symbol. */
2303 if (p->u.rsym.sym == NULL)
2304 {
2305 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2306 gfc_current_ns);
2307 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2308 }
2309
2310 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2311 p->u.rsym.symtree->n.sym->refs++;
2312 p->u.rsym.referenced = 1;
2313
2314 /* If the symbol is PRIVATE and in COMMON, load_commons will
2315 generate a fixup symbol, which must be associated. */
2316 if (p->fixup)
2317 resolve_fixups (p->fixup, p->u.rsym.sym);
2318 p->fixup = NULL;
2319 }
2320
2321 if (p->type == P_UNKNOWN)
2322 p->type = P_SYMBOL;
2323
2324 if (p->u.rsym.state == UNUSED)
2325 p->u.rsym.state = NEEDED;
2326
2327 if (p->u.rsym.symtree != NULL)
2328 {
2329 *stp = p->u.rsym.symtree;
2330 }
2331 else
2332 {
2333 f = gfc_getmem (sizeof (fixup_t));
2334
2335 f->next = p->u.rsym.stfixup;
2336 p->u.rsym.stfixup = f;
2337
2338 f->pointer = (void **) stp;
2339 }
2340 }
2341 }
2342
2343
2344 static void
2345 mio_iterator (gfc_iterator **ip)
2346 {
2347 gfc_iterator *iter;
2348
2349 mio_lparen ();
2350
2351 if (iomode == IO_OUTPUT)
2352 {
2353 if (*ip == NULL)
2354 goto done;
2355 }
2356 else
2357 {
2358 if (peek_atom () == ATOM_RPAREN)
2359 {
2360 *ip = NULL;
2361 goto done;
2362 }
2363
2364 *ip = gfc_get_iterator ();
2365 }
2366
2367 iter = *ip;
2368
2369 mio_expr (&iter->var);
2370 mio_expr (&iter->start);
2371 mio_expr (&iter->end);
2372 mio_expr (&iter->step);
2373
2374 done:
2375 mio_rparen ();
2376 }
2377
2378
2379 static void
2380 mio_constructor (gfc_constructor **cp)
2381 {
2382 gfc_constructor *c, *tail;
2383
2384 mio_lparen ();
2385
2386 if (iomode == IO_OUTPUT)
2387 {
2388 for (c = *cp; c; c = c->next)
2389 {
2390 mio_lparen ();
2391 mio_expr (&c->expr);
2392 mio_iterator (&c->iterator);
2393 mio_rparen ();
2394 }
2395 }
2396 else
2397 {
2398 *cp = NULL;
2399 tail = NULL;
2400
2401 while (peek_atom () != ATOM_RPAREN)
2402 {
2403 c = gfc_get_constructor ();
2404
2405 if (tail == NULL)
2406 *cp = c;
2407 else
2408 tail->next = c;
2409
2410 tail = c;
2411
2412 mio_lparen ();
2413 mio_expr (&c->expr);
2414 mio_iterator (&c->iterator);
2415 mio_rparen ();
2416 }
2417 }
2418
2419 mio_rparen ();
2420 }
2421
2422
2423 static const mstring ref_types[] = {
2424 minit ("ARRAY", REF_ARRAY),
2425 minit ("COMPONENT", REF_COMPONENT),
2426 minit ("SUBSTRING", REF_SUBSTRING),
2427 minit (NULL, -1)
2428 };
2429
2430
2431 static void
2432 mio_ref (gfc_ref **rp)
2433 {
2434 gfc_ref *r;
2435
2436 mio_lparen ();
2437
2438 r = *rp;
2439 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2440
2441 switch (r->type)
2442 {
2443 case REF_ARRAY:
2444 mio_array_ref (&r->u.ar);
2445 break;
2446
2447 case REF_COMPONENT:
2448 mio_symbol_ref (&r->u.c.sym);
2449 mio_component_ref (&r->u.c.component, r->u.c.sym);
2450 break;
2451
2452 case REF_SUBSTRING:
2453 mio_expr (&r->u.ss.start);
2454 mio_expr (&r->u.ss.end);
2455 mio_charlen (&r->u.ss.length);
2456 break;
2457 }
2458
2459 mio_rparen ();
2460 }
2461
2462
2463 static void
2464 mio_ref_list (gfc_ref **rp)
2465 {
2466 gfc_ref *ref, *head, *tail;
2467
2468 mio_lparen ();
2469
2470 if (iomode == IO_OUTPUT)
2471 {
2472 for (ref = *rp; ref; ref = ref->next)
2473 mio_ref (&ref);
2474 }
2475 else
2476 {
2477 head = tail = NULL;
2478
2479 while (peek_atom () != ATOM_RPAREN)
2480 {
2481 if (head == NULL)
2482 head = tail = gfc_get_ref ();
2483 else
2484 {
2485 tail->next = gfc_get_ref ();
2486 tail = tail->next;
2487 }
2488
2489 mio_ref (&tail);
2490 }
2491
2492 *rp = head;
2493 }
2494
2495 mio_rparen ();
2496 }
2497
2498
2499 /* Read and write an integer value. */
2500
2501 static void
2502 mio_gmp_integer (mpz_t *integer)
2503 {
2504 char *p;
2505
2506 if (iomode == IO_INPUT)
2507 {
2508 if (parse_atom () != ATOM_STRING)
2509 bad_module ("Expected integer string");
2510
2511 mpz_init (*integer);
2512 if (mpz_set_str (*integer, atom_string, 10))
2513 bad_module ("Error converting integer");
2514
2515 gfc_free (atom_string);
2516 }
2517 else
2518 {
2519 p = mpz_get_str (NULL, 10, *integer);
2520 write_atom (ATOM_STRING, p);
2521 gfc_free (p);
2522 }
2523 }
2524
2525
2526 static void
2527 mio_gmp_real (mpfr_t *real)
2528 {
2529 mp_exp_t exponent;
2530 char *p;
2531
2532 if (iomode == IO_INPUT)
2533 {
2534 if (parse_atom () != ATOM_STRING)
2535 bad_module ("Expected real string");
2536
2537 mpfr_init (*real);
2538 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2539 gfc_free (atom_string);
2540 }
2541 else
2542 {
2543 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2544
2545 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
2546 {
2547 write_atom (ATOM_STRING, p);
2548 gfc_free (p);
2549 return;
2550 }
2551
2552 atom_string = gfc_getmem (strlen (p) + 20);
2553
2554 sprintf (atom_string, "0.%s@%ld", p, exponent);
2555
2556 /* Fix negative numbers. */
2557 if (atom_string[2] == '-')
2558 {
2559 atom_string[0] = '-';
2560 atom_string[1] = '0';
2561 atom_string[2] = '.';
2562 }
2563
2564 write_atom (ATOM_STRING, atom_string);
2565
2566 gfc_free (atom_string);
2567 gfc_free (p);
2568 }
2569 }
2570
2571
2572 /* Save and restore the shape of an array constructor. */
2573
2574 static void
2575 mio_shape (mpz_t **pshape, int rank)
2576 {
2577 mpz_t *shape;
2578 atom_type t;
2579 int n;
2580
2581 /* A NULL shape is represented by (). */
2582 mio_lparen ();
2583
2584 if (iomode == IO_OUTPUT)
2585 {
2586 shape = *pshape;
2587 if (!shape)
2588 {
2589 mio_rparen ();
2590 return;
2591 }
2592 }
2593 else
2594 {
2595 t = peek_atom ();
2596 if (t == ATOM_RPAREN)
2597 {
2598 *pshape = NULL;
2599 mio_rparen ();
2600 return;
2601 }
2602
2603 shape = gfc_get_shape (rank);
2604 *pshape = shape;
2605 }
2606
2607 for (n = 0; n < rank; n++)
2608 mio_gmp_integer (&shape[n]);
2609
2610 mio_rparen ();
2611 }
2612
2613
2614 static const mstring expr_types[] = {
2615 minit ("OP", EXPR_OP),
2616 minit ("FUNCTION", EXPR_FUNCTION),
2617 minit ("CONSTANT", EXPR_CONSTANT),
2618 minit ("VARIABLE", EXPR_VARIABLE),
2619 minit ("SUBSTRING", EXPR_SUBSTRING),
2620 minit ("STRUCTURE", EXPR_STRUCTURE),
2621 minit ("ARRAY", EXPR_ARRAY),
2622 minit ("NULL", EXPR_NULL),
2623 minit (NULL, -1)
2624 };
2625
2626 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2627 generic operators, not in expressions. INTRINSIC_USER is also
2628 replaced by the correct function name by the time we see it. */
2629
2630 static const mstring intrinsics[] =
2631 {
2632 minit ("UPLUS", INTRINSIC_UPLUS),
2633 minit ("UMINUS", INTRINSIC_UMINUS),
2634 minit ("PLUS", INTRINSIC_PLUS),
2635 minit ("MINUS", INTRINSIC_MINUS),
2636 minit ("TIMES", INTRINSIC_TIMES),
2637 minit ("DIVIDE", INTRINSIC_DIVIDE),
2638 minit ("POWER", INTRINSIC_POWER),
2639 minit ("CONCAT", INTRINSIC_CONCAT),
2640 minit ("AND", INTRINSIC_AND),
2641 minit ("OR", INTRINSIC_OR),
2642 minit ("EQV", INTRINSIC_EQV),
2643 minit ("NEQV", INTRINSIC_NEQV),
2644 minit ("EQ_SIGN", INTRINSIC_EQ),
2645 minit ("EQ", INTRINSIC_EQ_OS),
2646 minit ("NE_SIGN", INTRINSIC_NE),
2647 minit ("NE", INTRINSIC_NE_OS),
2648 minit ("GT_SIGN", INTRINSIC_GT),
2649 minit ("GT", INTRINSIC_GT_OS),
2650 minit ("GE_SIGN", INTRINSIC_GE),
2651 minit ("GE", INTRINSIC_GE_OS),
2652 minit ("LT_SIGN", INTRINSIC_LT),
2653 minit ("LT", INTRINSIC_LT_OS),
2654 minit ("LE_SIGN", INTRINSIC_LE),
2655 minit ("LE", INTRINSIC_LE_OS),
2656 minit ("NOT", INTRINSIC_NOT),
2657 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2658 minit (NULL, -1)
2659 };
2660
2661
2662 /* Remedy a couple of situations where the gfc_expr's can be defective. */
2663
2664 static void
2665 fix_mio_expr (gfc_expr *e)
2666 {
2667 gfc_symtree *ns_st = NULL;
2668 const char *fname;
2669
2670 if (iomode != IO_OUTPUT)
2671 return;
2672
2673 if (e->symtree)
2674 {
2675 /* If this is a symtree for a symbol that came from a contained module
2676 namespace, it has a unique name and we should look in the current
2677 namespace to see if the required, non-contained symbol is available
2678 yet. If so, the latter should be written. */
2679 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
2680 ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2681 e->symtree->n.sym->name);
2682
2683 /* On the other hand, if the existing symbol is the module name or the
2684 new symbol is a dummy argument, do not do the promotion. */
2685 if (ns_st && ns_st->n.sym
2686 && ns_st->n.sym->attr.flavor != FL_MODULE
2687 && !e->symtree->n.sym->attr.dummy)
2688 e->symtree = ns_st;
2689 }
2690 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2691 {
2692 /* In some circumstances, a function used in an initialization
2693 expression, in one use associated module, can fail to be
2694 coupled to its symtree when used in a specification
2695 expression in another module. */
2696 fname = e->value.function.esym ? e->value.function.esym->name
2697 : e->value.function.isym->name;
2698 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2699 }
2700 }
2701
2702
2703 /* Read and write expressions. The form "()" is allowed to indicate a
2704 NULL expression. */
2705
2706 static void
2707 mio_expr (gfc_expr **ep)
2708 {
2709 gfc_expr *e;
2710 atom_type t;
2711 char *s;
2712 int flag;
2713
2714 mio_lparen ();
2715
2716 if (iomode == IO_OUTPUT)
2717 {
2718 if (*ep == NULL)
2719 {
2720 mio_rparen ();
2721 return;
2722 }
2723
2724 e = *ep;
2725 MIO_NAME (expr_t) (e->expr_type, expr_types);
2726 }
2727 else
2728 {
2729 t = parse_atom ();
2730 if (t == ATOM_RPAREN)
2731 {
2732 *ep = NULL;
2733 return;
2734 }
2735
2736 if (t != ATOM_NAME)
2737 bad_module ("Expected expression type");
2738
2739 e = *ep = gfc_get_expr ();
2740 e->where = gfc_current_locus;
2741 e->expr_type = (expr_t) find_enum (expr_types);
2742 }
2743
2744 mio_typespec (&e->ts);
2745 mio_integer (&e->rank);
2746
2747 fix_mio_expr (e);
2748
2749 switch (e->expr_type)
2750 {
2751 case EXPR_OP:
2752 e->value.op.operator
2753 = MIO_NAME (gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2754
2755 switch (e->value.op.operator)
2756 {
2757 case INTRINSIC_UPLUS:
2758 case INTRINSIC_UMINUS:
2759 case INTRINSIC_NOT:
2760 case INTRINSIC_PARENTHESES:
2761 mio_expr (&e->value.op.op1);
2762 break;
2763
2764 case INTRINSIC_PLUS:
2765 case INTRINSIC_MINUS:
2766 case INTRINSIC_TIMES:
2767 case INTRINSIC_DIVIDE:
2768 case INTRINSIC_POWER:
2769 case INTRINSIC_CONCAT:
2770 case INTRINSIC_AND:
2771 case INTRINSIC_OR:
2772 case INTRINSIC_EQV:
2773 case INTRINSIC_NEQV:
2774 case INTRINSIC_EQ:
2775 case INTRINSIC_EQ_OS:
2776 case INTRINSIC_NE:
2777 case INTRINSIC_NE_OS:
2778 case INTRINSIC_GT:
2779 case INTRINSIC_GT_OS:
2780 case INTRINSIC_GE:
2781 case INTRINSIC_GE_OS:
2782 case INTRINSIC_LT:
2783 case INTRINSIC_LT_OS:
2784 case INTRINSIC_LE:
2785 case INTRINSIC_LE_OS:
2786 mio_expr (&e->value.op.op1);
2787 mio_expr (&e->value.op.op2);
2788 break;
2789
2790 default:
2791 bad_module ("Bad operator");
2792 }
2793
2794 break;
2795
2796 case EXPR_FUNCTION:
2797 mio_symtree_ref (&e->symtree);
2798 mio_actual_arglist (&e->value.function.actual);
2799
2800 if (iomode == IO_OUTPUT)
2801 {
2802 e->value.function.name
2803 = mio_allocated_string (e->value.function.name);
2804 flag = e->value.function.esym != NULL;
2805 mio_integer (&flag);
2806 if (flag)
2807 mio_symbol_ref (&e->value.function.esym);
2808 else
2809 write_atom (ATOM_STRING, e->value.function.isym->name);
2810 }
2811 else
2812 {
2813 require_atom (ATOM_STRING);
2814 e->value.function.name = gfc_get_string (atom_string);
2815 gfc_free (atom_string);
2816
2817 mio_integer (&flag);
2818 if (flag)
2819 mio_symbol_ref (&e->value.function.esym);
2820 else
2821 {
2822 require_atom (ATOM_STRING);
2823 e->value.function.isym = gfc_find_function (atom_string);
2824 gfc_free (atom_string);
2825 }
2826 }
2827
2828 break;
2829
2830 case EXPR_VARIABLE:
2831 mio_symtree_ref (&e->symtree);
2832 mio_ref_list (&e->ref);
2833 break;
2834
2835 case EXPR_SUBSTRING:
2836 s = gfc_widechar_to_char (e->value.character.string, -1);
2837 s = CONST_CAST (char *, mio_allocated_string (s));
2838 e->value.character.string = gfc_char_to_widechar (s);
2839 gfc_free (s);
2840 mio_ref_list (&e->ref);
2841 break;
2842
2843 case EXPR_STRUCTURE:
2844 case EXPR_ARRAY:
2845 mio_constructor (&e->value.constructor);
2846 mio_shape (&e->shape, e->rank);
2847 break;
2848
2849 case EXPR_CONSTANT:
2850 switch (e->ts.type)
2851 {
2852 case BT_INTEGER:
2853 mio_gmp_integer (&e->value.integer);
2854 break;
2855
2856 case BT_REAL:
2857 gfc_set_model_kind (e->ts.kind);
2858 mio_gmp_real (&e->value.real);
2859 break;
2860
2861 case BT_COMPLEX:
2862 gfc_set_model_kind (e->ts.kind);
2863 mio_gmp_real (&e->value.complex.r);
2864 mio_gmp_real (&e->value.complex.i);
2865 break;
2866
2867 case BT_LOGICAL:
2868 mio_integer (&e->value.logical);
2869 break;
2870
2871 case BT_CHARACTER:
2872 mio_integer (&e->value.character.length);
2873 s = gfc_widechar_to_char (e->value.character.string, -1);
2874 s = CONST_CAST (char *, mio_allocated_string (s));
2875 e->value.character.string = gfc_char_to_widechar (s);
2876 gfc_free (s);
2877 break;
2878
2879 default:
2880 bad_module ("Bad type in constant expression");
2881 }
2882
2883 break;
2884
2885 case EXPR_NULL:
2886 break;
2887 }
2888
2889 mio_rparen ();
2890 }
2891
2892
2893 /* Read and write namelists. */
2894
2895 static void
2896 mio_namelist (gfc_symbol *sym)
2897 {
2898 gfc_namelist *n, *m;
2899 const char *check_name;
2900
2901 mio_lparen ();
2902
2903 if (iomode == IO_OUTPUT)
2904 {
2905 for (n = sym->namelist; n; n = n->next)
2906 mio_symbol_ref (&n->sym);
2907 }
2908 else
2909 {
2910 /* This departure from the standard is flagged as an error.
2911 It does, in fact, work correctly. TODO: Allow it
2912 conditionally? */
2913 if (sym->attr.flavor == FL_NAMELIST)
2914 {
2915 check_name = find_use_name (sym->name, false);
2916 if (check_name && strcmp (check_name, sym->name) != 0)
2917 gfc_error ("Namelist %s cannot be renamed by USE "
2918 "association to %s", sym->name, check_name);
2919 }
2920
2921 m = NULL;
2922 while (peek_atom () != ATOM_RPAREN)
2923 {
2924 n = gfc_get_namelist ();
2925 mio_symbol_ref (&n->sym);
2926
2927 if (sym->namelist == NULL)
2928 sym->namelist = n;
2929 else
2930 m->next = n;
2931
2932 m = n;
2933 }
2934 sym->namelist_tail = m;
2935 }
2936
2937 mio_rparen ();
2938 }
2939
2940
2941 /* Save/restore lists of gfc_interface stuctures. When loading an
2942 interface, we are really appending to the existing list of
2943 interfaces. Checking for duplicate and ambiguous interfaces has to
2944 be done later when all symbols have been loaded. */
2945
2946 pointer_info *
2947 mio_interface_rest (gfc_interface **ip)
2948 {
2949 gfc_interface *tail, *p;
2950 pointer_info *pi = NULL;
2951
2952 if (iomode == IO_OUTPUT)
2953 {
2954 if (ip != NULL)
2955 for (p = *ip; p; p = p->next)
2956 mio_symbol_ref (&p->sym);
2957 }
2958 else
2959 {
2960 if (*ip == NULL)
2961 tail = NULL;
2962 else
2963 {
2964 tail = *ip;
2965 while (tail->next)
2966 tail = tail->next;
2967 }
2968
2969 for (;;)
2970 {
2971 if (peek_atom () == ATOM_RPAREN)
2972 break;
2973
2974 p = gfc_get_interface ();
2975 p->where = gfc_current_locus;
2976 pi = mio_symbol_ref (&p->sym);
2977
2978 if (tail == NULL)
2979 *ip = p;
2980 else
2981 tail->next = p;
2982
2983 tail = p;
2984 }
2985 }
2986
2987 mio_rparen ();
2988 return pi;
2989 }
2990
2991
2992 /* Save/restore a nameless operator interface. */
2993
2994 static void
2995 mio_interface (gfc_interface **ip)
2996 {
2997 mio_lparen ();
2998 mio_interface_rest (ip);
2999 }
3000
3001
3002 /* Save/restore a named operator interface. */
3003
3004 static void
3005 mio_symbol_interface (const char **name, const char **module,
3006 gfc_interface **ip)
3007 {
3008 mio_lparen ();
3009 mio_pool_string (name);
3010 mio_pool_string (module);
3011 mio_interface_rest (ip);
3012 }
3013
3014
3015 static void
3016 mio_namespace_ref (gfc_namespace **nsp)
3017 {
3018 gfc_namespace *ns;
3019 pointer_info *p;
3020
3021 p = mio_pointer_ref (nsp);
3022
3023 if (p->type == P_UNKNOWN)
3024 p->type = P_NAMESPACE;
3025
3026 if (iomode == IO_INPUT && p->integer != 0)
3027 {
3028 ns = (gfc_namespace *) p->u.pointer;
3029 if (ns == NULL)
3030 {
3031 ns = gfc_get_namespace (NULL, 0);
3032 associate_integer_pointer (p, ns);
3033 }
3034 else
3035 ns->refs++;
3036 }
3037 }
3038
3039
3040 /* Unlike most other routines, the address of the symbol node is already
3041 fixed on input and the name/module has already been filled in. */
3042
3043 static void
3044 mio_symbol (gfc_symbol *sym)
3045 {
3046 int intmod = INTMOD_NONE;
3047
3048 gfc_formal_arglist *formal;
3049
3050 mio_lparen ();
3051
3052 mio_symbol_attribute (&sym->attr);
3053 mio_typespec (&sym->ts);
3054
3055 /* Contained procedures don't have formal namespaces. Instead we output the
3056 procedure namespace. The will contain the formal arguments. */
3057 if (iomode == IO_OUTPUT)
3058 {
3059 formal = sym->formal;
3060 while (formal && !formal->sym)
3061 formal = formal->next;
3062
3063 if (formal)
3064 mio_namespace_ref (&formal->sym->ns);
3065 else
3066 mio_namespace_ref (&sym->formal_ns);
3067 }
3068 else
3069 {
3070 mio_namespace_ref (&sym->formal_ns);
3071 if (sym->formal_ns)
3072 {
3073 sym->formal_ns->proc_name = sym;
3074 sym->refs++;
3075 }
3076 }
3077
3078 /* Save/restore common block links. */
3079 mio_symbol_ref (&sym->common_next);
3080
3081 mio_formal_arglist (sym);
3082
3083 if (sym->attr.flavor == FL_PARAMETER)
3084 mio_expr (&sym->value);
3085
3086 mio_array_spec (&sym->as);
3087
3088 mio_symbol_ref (&sym->result);
3089
3090 if (sym->attr.cray_pointee)
3091 mio_symbol_ref (&sym->cp_pointer);
3092
3093 /* Note that components are always saved, even if they are supposed
3094 to be private. Component access is checked during searching. */
3095
3096 mio_component_list (&sym->components);
3097
3098 if (sym->components != NULL)
3099 sym->component_access
3100 = MIO_NAME (gfc_access) (sym->component_access, access_types);
3101
3102 mio_namelist (sym);
3103
3104 /* Add the fields that say whether this is from an intrinsic module,
3105 and if so, what symbol it is within the module. */
3106 /* mio_integer (&(sym->from_intmod)); */
3107 if (iomode == IO_OUTPUT)
3108 {
3109 intmod = sym->from_intmod;
3110 mio_integer (&intmod);
3111 }
3112 else
3113 {
3114 mio_integer (&intmod);
3115 sym->from_intmod = intmod;
3116 }
3117
3118 mio_integer (&(sym->intmod_sym_id));
3119
3120 mio_rparen ();
3121 }
3122
3123
3124 /************************* Top level subroutines *************************/
3125
3126 /* Given a root symtree node and a symbol, try to find a symtree that
3127 references the symbol that is not a unique name. */
3128
3129 static gfc_symtree *
3130 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3131 {
3132 gfc_symtree *s = NULL;
3133
3134 if (st == NULL)
3135 return s;
3136
3137 s = find_symtree_for_symbol (st->right, sym);
3138 if (s != NULL)
3139 return s;
3140 s = find_symtree_for_symbol (st->left, sym);
3141 if (s != NULL)
3142 return s;
3143
3144 if (st->n.sym == sym && !check_unique_name (st->name))
3145 return st;
3146
3147 return s;
3148 }
3149
3150
3151 /* A recursive function to look for a speficic symbol by name and by
3152 module. Whilst several symtrees might point to one symbol, its
3153 is sufficient for the purposes here than one exist. Note that
3154 generic interfaces are distinguished as are symbols that have been
3155 renamed in another module. */
3156 static gfc_symtree *
3157 find_symbol (gfc_symtree *st, const char *name,
3158 const char *module, int generic)
3159 {
3160 int c;
3161 gfc_symtree *retval, *s;
3162
3163 if (st == NULL || st->n.sym == NULL)
3164 return NULL;
3165
3166 c = strcmp (name, st->n.sym->name);
3167 if (c == 0 && st->n.sym->module
3168 && strcmp (module, st->n.sym->module) == 0
3169 && !check_unique_name (st->name))
3170 {
3171 s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3172
3173 /* Detect symbols that are renamed by use association in another
3174 module by the absence of a symtree and null attr.use_rename,
3175 since the latter is not transmitted in the module file. */
3176 if (((!generic && !st->n.sym->attr.generic)
3177 || (generic && st->n.sym->attr.generic))
3178 && !(s == NULL && !st->n.sym->attr.use_rename))
3179 return st;
3180 }
3181
3182 retval = find_symbol (st->left, name, module, generic);
3183
3184 if (retval == NULL)
3185 retval = find_symbol (st->right, name, module, generic);
3186
3187 return retval;
3188 }
3189
3190
3191 /* Skip a list between balanced left and right parens. */
3192
3193 static void
3194 skip_list (void)
3195 {
3196 int level;
3197
3198 level = 0;
3199 do
3200 {
3201 switch (parse_atom ())
3202 {
3203 case ATOM_LPAREN:
3204 level++;
3205 break;
3206
3207 case ATOM_RPAREN:
3208 level--;
3209 break;
3210
3211 case ATOM_STRING:
3212 gfc_free (atom_string);
3213 break;
3214
3215 case ATOM_NAME:
3216 case ATOM_INTEGER:
3217 break;
3218 }
3219 }
3220 while (level > 0);
3221 }
3222
3223
3224 /* Load operator interfaces from the module. Interfaces are unusual
3225 in that they attach themselves to existing symbols. */
3226
3227 static void
3228 load_operator_interfaces (void)
3229 {
3230 const char *p;
3231 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3232 gfc_user_op *uop;
3233 pointer_info *pi = NULL;
3234 int n, i;
3235
3236 mio_lparen ();
3237
3238 while (peek_atom () != ATOM_RPAREN)
3239 {
3240 mio_lparen ();
3241
3242 mio_internal_string (name);
3243 mio_internal_string (module);
3244
3245 n = number_use_names (name, true);
3246 n = n ? n : 1;
3247
3248 for (i = 1; i <= n; i++)
3249 {
3250 /* Decide if we need to load this one or not. */
3251 p = find_use_name_n (name, &i, true);
3252
3253 if (p == NULL)
3254 {
3255 while (parse_atom () != ATOM_RPAREN);
3256 continue;
3257 }
3258
3259 if (i == 1)
3260 {
3261 uop = gfc_get_uop (p);
3262 pi = mio_interface_rest (&uop->operator);
3263 }
3264 else
3265 {
3266 if (gfc_find_uop (p, NULL))
3267 continue;
3268 uop = gfc_get_uop (p);
3269 uop->operator = gfc_get_interface ();
3270 uop->operator->where = gfc_current_locus;
3271 add_fixup (pi->integer, &uop->operator->sym);
3272 }
3273 }
3274 }
3275
3276 mio_rparen ();
3277 }
3278
3279
3280 /* Load interfaces from the module. Interfaces are unusual in that
3281 they attach themselves to existing symbols. */
3282
3283 static void
3284 load_generic_interfaces (void)
3285 {
3286 const char *p;
3287 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3288 gfc_symbol *sym;
3289 gfc_interface *generic = NULL;
3290 int n, i, renamed;
3291
3292 mio_lparen ();
3293
3294 while (peek_atom () != ATOM_RPAREN)
3295 {
3296 mio_lparen ();
3297
3298 mio_internal_string (name);
3299 mio_internal_string (module);
3300
3301 n = number_use_names (name, false);
3302 renamed = n ? 1 : 0;
3303 n = n ? n : 1;
3304
3305 for (i = 1; i <= n; i++)
3306 {
3307 gfc_symtree *st;
3308 /* Decide if we need to load this one or not. */
3309 p = find_use_name_n (name, &i, false);
3310
3311 st = find_symbol (gfc_current_ns->sym_root,
3312 name, module_name, 1);
3313
3314 if (!p || gfc_find_symbol (p, NULL, 0, &sym))
3315 {
3316 /* Skip the specific names for these cases. */
3317 while (i == 1 && parse_atom () != ATOM_RPAREN);
3318
3319 continue;
3320 }
3321
3322 /* If the symbol exists already and is being USEd without being
3323 in an ONLY clause, do not load a new symtree(11.3.2). */
3324 if (!only_flag && st)
3325 sym = st->n.sym;
3326
3327 if (!sym)
3328 {
3329 /* Make the symbol inaccessible if it has been added by a USE
3330 statement without an ONLY(11.3.2). */
3331 if (st && only_flag
3332 && !st->n.sym->attr.use_only
3333 && !st->n.sym->attr.use_rename
3334 && strcmp (st->n.sym->module, module_name) == 0)
3335 {
3336 sym = st->n.sym;
3337 gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3338 st = gfc_get_unique_symtree (gfc_current_ns);
3339 st->n.sym = sym;
3340 sym = NULL;
3341 }
3342 else if (st)
3343 {
3344 sym = st->n.sym;
3345 if (strcmp (st->name, p) != 0)
3346 {
3347 st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
3348 st->n.sym = sym;
3349 sym->refs++;
3350 }
3351 }
3352
3353 /* Since we haven't found a valid generic interface, we had
3354 better make one. */
3355 if (!sym)
3356 {
3357 gfc_get_symbol (p, NULL, &sym);
3358 sym->name = gfc_get_string (name);
3359 sym->module = gfc_get_string (module_name);
3360 sym->attr.flavor = FL_PROCEDURE;
3361 sym->attr.generic = 1;
3362 sym->attr.use_assoc = 1;
3363 }
3364 }
3365 else
3366 {
3367 /* Unless sym is a generic interface, this reference
3368 is ambiguous. */
3369 if (st == NULL)
3370 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3371
3372 sym = st->n.sym;
3373
3374 if (st && !sym->attr.generic
3375 && sym->module
3376 && strcmp(module, sym->module))
3377 st->ambiguous = 1;
3378 }
3379
3380 sym->attr.use_only = only_flag;
3381 sym->attr.use_rename = renamed;
3382
3383 if (i == 1)
3384 {
3385 mio_interface_rest (&sym->generic);
3386 generic = sym->generic;
3387 }
3388 else if (!sym->generic)
3389 {
3390 sym->generic = generic;
3391 sym->attr.generic_copy = 1;
3392 }
3393 }
3394 }
3395
3396 mio_rparen ();
3397 }
3398
3399
3400 /* Load common blocks. */
3401
3402 static void
3403 load_commons (void)
3404 {
3405 char name[GFC_MAX_SYMBOL_LEN + 1];
3406 gfc_common_head *p;
3407
3408 mio_lparen ();
3409
3410 while (peek_atom () != ATOM_RPAREN)
3411 {
3412 int flags;
3413 mio_lparen ();
3414 mio_internal_string (name);
3415
3416 p = gfc_get_common (name, 1);
3417
3418 mio_symbol_ref (&p->head);
3419 mio_integer (&flags);
3420 if (flags & 1)
3421 p->saved = 1;
3422 if (flags & 2)
3423 p->threadprivate = 1;
3424 p->use_assoc = 1;
3425
3426 /* Get whether this was a bind(c) common or not. */
3427 mio_integer (&p->is_bind_c);
3428 /* Get the binding label. */
3429 mio_internal_string (p->binding_label);
3430
3431 mio_rparen ();
3432 }
3433
3434 mio_rparen ();
3435 }
3436
3437
3438 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
3439 so that unused variables are not loaded and so that the expression can
3440 be safely freed. */
3441
3442 static void
3443 load_equiv (void)
3444 {
3445 gfc_equiv *head, *tail, *end, *eq;
3446 bool unused;
3447
3448 mio_lparen ();
3449 in_load_equiv = true;
3450
3451 end = gfc_current_ns->equiv;
3452 while (end != NULL && end->next != NULL)
3453 end = end->next;
3454
3455 while (peek_atom () != ATOM_RPAREN) {
3456 mio_lparen ();
3457 head = tail = NULL;
3458
3459 while(peek_atom () != ATOM_RPAREN)
3460 {
3461 if (head == NULL)
3462 head = tail = gfc_get_equiv ();
3463 else
3464 {
3465 tail->eq = gfc_get_equiv ();
3466 tail = tail->eq;
3467 }
3468
3469 mio_pool_string (&tail->module);
3470 mio_expr (&tail->expr);
3471 }
3472
3473 /* Unused equivalence members have a unique name. */
3474 unused = true;
3475 for (eq = head; eq; eq = eq->eq)
3476 {
3477 if (!check_unique_name (eq->expr->symtree->name))
3478 {
3479 unused = false;
3480 break;
3481 }
3482 }
3483
3484 if (unused)
3485 {
3486 for (eq = head; eq; eq = head)
3487 {
3488 head = eq->eq;
3489 gfc_free_expr (eq->expr);
3490 gfc_free (eq);
3491 }
3492 }
3493
3494 if (end == NULL)
3495 gfc_current_ns->equiv = head;
3496 else
3497 end->next = head;
3498
3499 if (head != NULL)
3500 end = head;
3501
3502 mio_rparen ();
3503 }
3504
3505 mio_rparen ();
3506 in_load_equiv = false;
3507 }
3508
3509
3510 /* Recursive function to traverse the pointer_info tree and load a
3511 needed symbol. We return nonzero if we load a symbol and stop the
3512 traversal, because the act of loading can alter the tree. */
3513
3514 static int
3515 load_needed (pointer_info *p)
3516 {
3517 gfc_namespace *ns;
3518 pointer_info *q;
3519 gfc_symbol *sym;
3520 int rv;
3521
3522 rv = 0;
3523 if (p == NULL)
3524 return rv;
3525
3526 rv |= load_needed (p->left);
3527 rv |= load_needed (p->right);
3528
3529 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3530 return rv;
3531
3532 p->u.rsym.state = USED;
3533
3534 set_module_locus (&p->u.rsym.where);
3535
3536 sym = p->u.rsym.sym;
3537 if (sym == NULL)
3538 {
3539 q = get_integer (p->u.rsym.ns);
3540
3541 ns = (gfc_namespace *) q->u.pointer;
3542 if (ns == NULL)
3543 {
3544 /* Create an interface namespace if necessary. These are
3545 the namespaces that hold the formal parameters of module
3546 procedures. */
3547
3548 ns = gfc_get_namespace (NULL, 0);
3549 associate_integer_pointer (q, ns);
3550 }
3551
3552 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
3553 doesn't go pear-shaped if the symbol is used. */
3554 if (!ns->proc_name)
3555 gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
3556 1, &ns->proc_name);
3557
3558 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3559 sym->module = gfc_get_string (p->u.rsym.module);
3560 strcpy (sym->binding_label, p->u.rsym.binding_label);
3561
3562 associate_integer_pointer (p, sym);
3563 }
3564
3565 mio_symbol (sym);
3566 sym->attr.use_assoc = 1;
3567 if (only_flag)
3568 sym->attr.use_only = 1;
3569 if (p->u.rsym.renamed)
3570 sym->attr.use_rename = 1;
3571
3572 return 1;
3573 }
3574
3575
3576 /* Recursive function for cleaning up things after a module has been read. */
3577
3578 static void
3579 read_cleanup (pointer_info *p)
3580 {
3581 gfc_symtree *st;
3582 pointer_info *q;
3583
3584 if (p == NULL)
3585 return;
3586
3587 read_cleanup (p->left);
3588 read_cleanup (p->right);
3589
3590 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3591 {
3592 /* Add hidden symbols to the symtree. */
3593 q = get_integer (p->u.rsym.ns);
3594 st = gfc_get_unique_symtree ((gfc_namespace *) q->u.pointer);
3595
3596 st->n.sym = p->u.rsym.sym;
3597 st->n.sym->refs++;
3598
3599 /* Fixup any symtree references. */
3600 p->u.rsym.symtree = st;
3601 resolve_fixups (p->u.rsym.stfixup, st);
3602 p->u.rsym.stfixup = NULL;
3603 }
3604
3605 /* Free unused symbols. */
3606 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3607 gfc_free_symbol (p->u.rsym.sym);
3608 }
3609
3610
3611 /* Read a module file. */
3612
3613 static void
3614 read_module (void)
3615 {
3616 module_locus operator_interfaces, user_operators;
3617 const char *p;
3618 char name[GFC_MAX_SYMBOL_LEN + 1];
3619 gfc_intrinsic_op i;
3620 int ambiguous, j, nuse, symbol;
3621 pointer_info *info, *q;
3622 gfc_use_rename *u;
3623 gfc_symtree *st;
3624 gfc_symbol *sym;
3625
3626 get_module_locus (&operator_interfaces); /* Skip these for now. */
3627 skip_list ();
3628
3629 get_module_locus (&user_operators);
3630 skip_list ();
3631 skip_list ();
3632
3633 /* Skip commons and equivalences for now. */
3634 skip_list ();
3635 skip_list ();
3636
3637 mio_lparen ();
3638
3639 /* Create the fixup nodes for all the symbols. */
3640
3641 while (peek_atom () != ATOM_RPAREN)
3642 {
3643 require_atom (ATOM_INTEGER);
3644 info = get_integer (atom_int);
3645
3646 info->type = P_SYMBOL;
3647 info->u.rsym.state = UNUSED;
3648
3649 mio_internal_string (info->u.rsym.true_name);
3650 mio_internal_string (info->u.rsym.module);
3651 mio_internal_string (info->u.rsym.binding_label);
3652
3653
3654 require_atom (ATOM_INTEGER);
3655 info->u.rsym.ns = atom_int;
3656
3657 get_module_locus (&info->u.rsym.where);
3658 skip_list ();
3659
3660 /* See if the symbol has already been loaded by a previous module.
3661 If so, we reference the existing symbol and prevent it from
3662 being loaded again. This should not happen if the symbol being
3663 read is an index for an assumed shape dummy array (ns != 1). */
3664
3665 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3666
3667 if (sym == NULL
3668 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
3669 continue;
3670
3671 info->u.rsym.state = USED;
3672 info->u.rsym.sym = sym;
3673
3674 /* Some symbols do not have a namespace (eg. formal arguments),
3675 so the automatic "unique symtree" mechanism must be suppressed
3676 by marking them as referenced. */
3677 q = get_integer (info->u.rsym.ns);
3678 if (q->u.pointer == NULL)
3679 {
3680 info->u.rsym.referenced = 1;
3681 continue;
3682 }
3683
3684 /* If possible recycle the symtree that references the symbol.
3685 If a symtree is not found and the module does not import one,
3686 a unique-name symtree is found by read_cleanup. */
3687 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
3688 if (st != NULL)
3689 {
3690 info->u.rsym.symtree = st;
3691 info->u.rsym.referenced = 1;
3692 }
3693 }
3694
3695 mio_rparen ();
3696
3697 /* Parse the symtree lists. This lets us mark which symbols need to
3698 be loaded. Renaming is also done at this point by replacing the
3699 symtree name. */
3700
3701 mio_lparen ();
3702
3703 while (peek_atom () != ATOM_RPAREN)
3704 {
3705 mio_internal_string (name);
3706 mio_integer (&ambiguous);
3707 mio_integer (&symbol);
3708
3709 info = get_integer (symbol);
3710
3711 /* See how many use names there are. If none, go through the start
3712 of the loop at least once. */
3713 nuse = number_use_names (name, false);
3714 info->u.rsym.renamed = nuse ? 1 : 0;
3715
3716 if (nuse == 0)
3717 nuse = 1;
3718
3719 for (j = 1; j <= nuse; j++)
3720 {
3721 /* Get the jth local name for this symbol. */
3722 p = find_use_name_n (name, &j, false);
3723
3724 if (p == NULL && strcmp (name, module_name) == 0)
3725 p = name;
3726
3727 /* Skip symtree nodes not in an ONLY clause, unless there
3728 is an existing symtree loaded from another USE statement. */
3729 if (p == NULL)
3730 {
3731 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3732 if (st != NULL)
3733 info->u.rsym.symtree = st;
3734 continue;
3735 }
3736
3737 /* If a symbol of the same name and module exists already,
3738 this symbol, which is not in an ONLY clause, must not be
3739 added to the namespace(11.3.2). Note that find_symbol
3740 only returns the first occurrence that it finds. */
3741 if (!only_flag && !info->u.rsym.renamed
3742 && strcmp (name, module_name) != 0
3743 && find_symbol (gfc_current_ns->sym_root, name,
3744 module_name, 0))
3745 continue;
3746
3747 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3748
3749 if (st != NULL)
3750 {
3751 /* Check for ambiguous symbols. */
3752 if (st->n.sym != info->u.rsym.sym)
3753 st->ambiguous = 1;
3754 info->u.rsym.symtree = st;
3755 }
3756 else
3757 {
3758 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3759
3760 /* Delete the symtree if the symbol has been added by a USE
3761 statement without an ONLY(11.3.2). Remember that the rsym
3762 will be the same as the symbol found in the symtree, for
3763 this case.*/
3764 if (st && (only_flag || info->u.rsym.renamed)
3765 && !st->n.sym->attr.use_only
3766 && !st->n.sym->attr.use_rename
3767 && info->u.rsym.sym == st->n.sym)
3768 gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3769
3770 /* Create a symtree node in the current namespace for this
3771 symbol. */
3772 st = check_unique_name (p)
3773 ? gfc_get_unique_symtree (gfc_current_ns)
3774 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
3775 st->ambiguous = ambiguous;
3776
3777 sym = info->u.rsym.sym;
3778
3779 /* Create a symbol node if it doesn't already exist. */
3780 if (sym == NULL)
3781 {
3782 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
3783 gfc_current_ns);
3784 sym = info->u.rsym.sym;
3785 sym->module = gfc_get_string (info->u.rsym.module);
3786
3787 /* TODO: hmm, can we test this? Do we know it will be
3788 initialized to zeros? */
3789 if (info->u.rsym.binding_label[0] != '\0')
3790 strcpy (sym->binding_label, info->u.rsym.binding_label);
3791 }
3792
3793 st->n.sym = sym;
3794 st->n.sym->refs++;
3795
3796 if (strcmp (name, p) != 0)
3797 sym->attr.use_rename = 1;
3798
3799 /* Store the symtree pointing to this symbol. */
3800 info->u.rsym.symtree = st;
3801
3802 if (info->u.rsym.state == UNUSED)
3803 info->u.rsym.state = NEEDED;
3804 info->u.rsym.referenced = 1;
3805 }
3806 }
3807 }
3808
3809 mio_rparen ();
3810
3811 /* Load intrinsic operator interfaces. */
3812 set_module_locus (&operator_interfaces);
3813 mio_lparen ();
3814
3815 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3816 {
3817 if (i == INTRINSIC_USER)
3818 continue;
3819
3820 if (only_flag)
3821 {
3822 u = find_use_operator (i);
3823
3824 if (u == NULL)
3825 {
3826 skip_list ();
3827 continue;
3828 }
3829
3830 u->found = 1;
3831 }
3832
3833 mio_interface (&gfc_current_ns->operator[i]);
3834 }
3835
3836 mio_rparen ();
3837
3838 /* Load generic and user operator interfaces. These must follow the
3839 loading of symtree because otherwise symbols can be marked as
3840 ambiguous. */
3841
3842 set_module_locus (&user_operators);
3843
3844 load_operator_interfaces ();
3845 load_generic_interfaces ();
3846
3847 load_commons ();
3848 load_equiv ();
3849
3850 /* At this point, we read those symbols that are needed but haven't
3851 been loaded yet. If one symbol requires another, the other gets
3852 marked as NEEDED if its previous state was UNUSED. */
3853
3854 while (load_needed (pi_root));
3855
3856 /* Make sure all elements of the rename-list were found in the module. */
3857
3858 for (u = gfc_rename_list; u; u = u->next)
3859 {
3860 if (u->found)
3861 continue;
3862
3863 if (u->operator == INTRINSIC_NONE)
3864 {
3865 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3866 u->use_name, &u->where, module_name);
3867 continue;
3868 }
3869
3870 if (u->operator == INTRINSIC_USER)
3871 {
3872 gfc_error ("User operator '%s' referenced at %L not found "
3873 "in module '%s'", u->use_name, &u->where, module_name);
3874 continue;
3875 }
3876
3877 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
3878 "in module '%s'", gfc_op2string (u->operator), &u->where,
3879 module_name);
3880 }
3881
3882 gfc_check_interfaces (gfc_current_ns);
3883
3884 /* Clean up symbol nodes that were never loaded, create references
3885 to hidden symbols. */
3886
3887 read_cleanup (pi_root);
3888 }
3889
3890
3891 /* Given an access type that is specific to an entity and the default
3892 access, return nonzero if the entity is publicly accessible. If the
3893 element is declared as PUBLIC, then it is public; if declared
3894 PRIVATE, then private, and otherwise it is public unless the default
3895 access in this context has been declared PRIVATE. */
3896
3897 bool
3898 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3899 {
3900 if (specific_access == ACCESS_PUBLIC)
3901 return TRUE;
3902 if (specific_access == ACCESS_PRIVATE)
3903 return FALSE;
3904
3905 if (gfc_option.flag_module_private)
3906 return default_access == ACCESS_PUBLIC;
3907 else
3908 return default_access != ACCESS_PRIVATE;
3909 }
3910
3911
3912 /* A structure to remember which commons we've already written. */
3913
3914 struct written_common
3915 {
3916 BBT_HEADER(written_common);
3917 const char *name, *label;
3918 };
3919
3920 static struct written_common *written_commons = NULL;
3921
3922 /* Comparison function used for balancing the binary tree. */
3923
3924 static int
3925 compare_written_commons (void *a1, void *b1)
3926 {
3927 const char *aname = ((struct written_common *) a1)->name;
3928 const char *alabel = ((struct written_common *) a1)->label;
3929 const char *bname = ((struct written_common *) b1)->name;
3930 const char *blabel = ((struct written_common *) b1)->label;
3931 int c = strcmp (aname, bname);
3932
3933 return (c != 0 ? c : strcmp (alabel, blabel));
3934 }
3935
3936 /* Free a list of written commons. */
3937
3938 static void
3939 free_written_common (struct written_common *w)
3940 {
3941 if (!w)
3942 return;
3943
3944 if (w->left)
3945 free_written_common (w->left);
3946 if (w->right)
3947 free_written_common (w->right);
3948
3949 gfc_free (w);
3950 }
3951
3952 /* Write a common block to the module -- recursive helper function. */
3953
3954 static void
3955 write_common_0 (gfc_symtree *st)
3956 {
3957 gfc_common_head *p;
3958 const char * name;
3959 int flags;
3960 const char *label;
3961 struct written_common *w;
3962 bool write_me = true;
3963
3964 if (st == NULL)
3965 return;
3966
3967 write_common_0 (st->left);
3968
3969 /* We will write out the binding label, or the name if no label given. */
3970 name = st->n.common->name;
3971 p = st->n.common;
3972 label = p->is_bind_c ? p->binding_label : p->name;
3973
3974 /* Check if we've already output this common. */
3975 w = written_commons;
3976 while (w)
3977 {
3978 int c = strcmp (name, w->name);
3979 c = (c != 0 ? c : strcmp (label, w->label));
3980 if (c == 0)
3981 write_me = false;
3982
3983 w = (c < 0) ? w->left : w->right;
3984 }
3985
3986 if (write_me)
3987 {
3988 /* Write the common to the module. */
3989 mio_lparen ();
3990 mio_pool_string (&name);
3991
3992 mio_symbol_ref (&p->head);
3993 flags = p->saved ? 1 : 0;
3994 if (p->threadprivate)
3995 flags |= 2;
3996 mio_integer (&flags);
3997
3998 /* Write out whether the common block is bind(c) or not. */
3999 mio_integer (&(p->is_bind_c));
4000
4001 mio_pool_string (&label);
4002 mio_rparen ();
4003
4004 /* Record that we have written this common. */
4005 w = gfc_getmem (sizeof (struct written_common));
4006 w->name = p->name;
4007 w->label = label;
4008 gfc_insert_bbt (&written_commons, w, compare_written_commons);
4009 }
4010
4011 write_common_0 (st->right);
4012 }
4013
4014
4015 /* Write a common, by initializing the list of written commons, calling
4016 the recursive function write_common_0() and cleaning up afterwards. */
4017
4018 static void
4019 write_common (gfc_symtree *st)
4020 {
4021 written_commons = NULL;
4022 write_common_0 (st);
4023 free_written_common (written_commons);
4024 written_commons = NULL;
4025 }
4026
4027
4028 /* Write the blank common block to the module. */
4029
4030 static void
4031 write_blank_common (void)
4032 {
4033 const char * name = BLANK_COMMON_NAME;
4034 int saved;
4035 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
4036 this, but it hasn't been checked. Just making it so for now. */
4037 int is_bind_c = 0;
4038
4039 if (gfc_current_ns->blank_common.head == NULL)
4040 return;
4041
4042 mio_lparen ();
4043
4044 mio_pool_string (&name);
4045
4046 mio_symbol_ref (&gfc_current_ns->blank_common.head);
4047 saved = gfc_current_ns->blank_common.saved;
4048 mio_integer (&saved);
4049
4050 /* Write out whether the common block is bind(c) or not. */
4051 mio_integer (&is_bind_c);
4052
4053 /* Write out the binding label, which is BLANK_COMMON_NAME, though
4054 it doesn't matter because the label isn't used. */
4055 mio_pool_string (&name);
4056
4057 mio_rparen ();
4058 }
4059
4060
4061 /* Write equivalences to the module. */
4062
4063 static void
4064 write_equiv (void)
4065 {
4066 gfc_equiv *eq, *e;
4067 int num;
4068
4069 num = 0;
4070 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
4071 {
4072 mio_lparen ();
4073
4074 for (e = eq; e; e = e->eq)
4075 {
4076 if (e->module == NULL)
4077 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
4078 mio_allocated_string (e->module);
4079 mio_expr (&e->expr);
4080 }
4081
4082 num++;
4083 mio_rparen ();
4084 }
4085 }
4086
4087
4088 /* Write a symbol to the module. */
4089
4090 static void
4091 write_symbol (int n, gfc_symbol *sym)
4092 {
4093 const char *label;
4094
4095 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
4096 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
4097
4098 mio_integer (&n);
4099 mio_pool_string (&sym->name);
4100
4101 mio_pool_string (&sym->module);
4102 if (sym->attr.is_bind_c || sym->attr.is_iso_c)
4103 {
4104 label = sym->binding_label;
4105 mio_pool_string (&label);
4106 }
4107 else
4108 mio_pool_string (&sym->name);
4109
4110 mio_pointer_ref (&sym->ns);
4111
4112 mio_symbol (sym);
4113 write_char ('\n');
4114 }
4115
4116
4117 /* Recursive traversal function to write the initial set of symbols to
4118 the module. We check to see if the symbol should be written
4119 according to the access specification. */
4120
4121 static void
4122 write_symbol0 (gfc_symtree *st)
4123 {
4124 gfc_symbol *sym;
4125 pointer_info *p;
4126 bool dont_write = false;
4127
4128 if (st == NULL)
4129 return;
4130
4131 write_symbol0 (st->left);
4132
4133 sym = st->n.sym;
4134 if (sym->module == NULL)
4135 sym->module = gfc_get_string (module_name);
4136
4137 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4138 && !sym->attr.subroutine && !sym->attr.function)
4139 dont_write = true;
4140
4141 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
4142 dont_write = true;
4143
4144 if (!dont_write)
4145 {
4146 p = get_pointer (sym);
4147 if (p->type == P_UNKNOWN)
4148 p->type = P_SYMBOL;
4149
4150 if (p->u.wsym.state != WRITTEN)
4151 {
4152 write_symbol (p->integer, sym);
4153 p->u.wsym.state = WRITTEN;
4154 }
4155 }
4156
4157 write_symbol0 (st->right);
4158 }
4159
4160
4161 /* Recursive traversal function to write the secondary set of symbols
4162 to the module file. These are symbols that were not public yet are
4163 needed by the public symbols or another dependent symbol. The act
4164 of writing a symbol can modify the pointer_info tree, so we cease
4165 traversal if we find a symbol to write. We return nonzero if a
4166 symbol was written and pass that information upwards. */
4167
4168 static int
4169 write_symbol1 (pointer_info *p)
4170 {
4171 int result;
4172
4173 if (!p)
4174 return 0;
4175
4176 result = write_symbol1 (p->left);
4177
4178 if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
4179 {
4180 p->u.wsym.state = WRITTEN;
4181 write_symbol (p->integer, p->u.wsym.sym);
4182 result = 1;
4183 }
4184
4185 result |= write_symbol1 (p->right);
4186 return result;
4187 }
4188
4189
4190 /* Write operator interfaces associated with a symbol. */
4191
4192 static void
4193 write_operator (gfc_user_op *uop)
4194 {
4195 static char nullstring[] = "";
4196 const char *p = nullstring;
4197
4198 if (uop->operator == NULL
4199 || !gfc_check_access (uop->access, uop->ns->default_access))
4200 return;
4201
4202 mio_symbol_interface (&uop->name, &p, &uop->operator);
4203 }
4204
4205
4206 /* Write generic interfaces from the namespace sym_root. */
4207
4208 static void
4209 write_generic (gfc_symtree *st)
4210 {
4211 gfc_symbol *sym;
4212
4213 if (st == NULL)
4214 return;
4215
4216 write_generic (st->left);
4217 write_generic (st->right);
4218
4219 sym = st->n.sym;
4220 if (!sym || check_unique_name (st->name))
4221 return;
4222
4223 if (sym->generic == NULL
4224 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
4225 return;
4226
4227 if (sym->module == NULL)
4228 sym->module = gfc_get_string (module_name);
4229
4230 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
4231 }
4232
4233
4234 static void
4235 write_symtree (gfc_symtree *st)
4236 {
4237 gfc_symbol *sym;
4238 pointer_info *p;
4239
4240 sym = st->n.sym;
4241 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
4242 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4243 && !sym->attr.subroutine && !sym->attr.function))
4244 return;
4245
4246 if (check_unique_name (st->name))
4247 return;
4248
4249 p = find_pointer (sym);
4250 if (p == NULL)
4251 gfc_internal_error ("write_symtree(): Symbol not written");
4252
4253 mio_pool_string (&st->name);
4254 mio_integer (&st->ambiguous);
4255 mio_integer (&p->integer);
4256 }
4257
4258
4259 static void
4260 write_module (void)
4261 {
4262 gfc_intrinsic_op i;
4263
4264 /* Write the operator interfaces. */
4265 mio_lparen ();
4266
4267 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4268 {
4269 if (i == INTRINSIC_USER)
4270 continue;
4271
4272 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
4273 gfc_current_ns->default_access)
4274 ? &gfc_current_ns->operator[i] : NULL);
4275 }
4276
4277 mio_rparen ();
4278 write_char ('\n');
4279 write_char ('\n');
4280
4281 mio_lparen ();
4282 gfc_traverse_user_op (gfc_current_ns, write_operator);
4283 mio_rparen ();
4284 write_char ('\n');
4285 write_char ('\n');
4286
4287 mio_lparen ();
4288 write_generic (gfc_current_ns->sym_root);
4289 mio_rparen ();
4290 write_char ('\n');
4291 write_char ('\n');
4292
4293 mio_lparen ();
4294 write_blank_common ();
4295 write_common (gfc_current_ns->common_root);
4296 mio_rparen ();
4297 write_char ('\n');
4298 write_char ('\n');
4299
4300 mio_lparen ();
4301 write_equiv ();
4302 mio_rparen ();
4303 write_char ('\n');
4304 write_char ('\n');
4305
4306 /* Write symbol information. First we traverse all symbols in the
4307 primary namespace, writing those that need to be written.
4308 Sometimes writing one symbol will cause another to need to be
4309 written. A list of these symbols ends up on the write stack, and
4310 we end by popping the bottom of the stack and writing the symbol
4311 until the stack is empty. */
4312
4313 mio_lparen ();
4314
4315 write_symbol0 (gfc_current_ns->sym_root);
4316 while (write_symbol1 (pi_root))
4317 /* Nothing. */;
4318
4319 mio_rparen ();
4320
4321 write_char ('\n');
4322 write_char ('\n');
4323
4324 mio_lparen ();
4325 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
4326 mio_rparen ();
4327 }
4328
4329
4330 /* Read a MD5 sum from the header of a module file. If the file cannot
4331 be opened, or we have any other error, we return -1. */
4332
4333 static int
4334 read_md5_from_module_file (const char * filename, unsigned char md5[16])
4335 {
4336 FILE *file;
4337 char buf[1024];
4338 int n;
4339
4340 /* Open the file. */
4341 if ((file = fopen (filename, "r")) == NULL)
4342 return -1;
4343
4344 /* Read two lines. */
4345 if (fgets (buf, sizeof (buf) - 1, file) == NULL
4346 || fgets (buf, sizeof (buf) - 1, file) == NULL)
4347 {
4348 fclose (file);
4349 return -1;
4350 }
4351
4352 /* Close the file. */
4353 fclose (file);
4354
4355 /* If the header is not what we expect, or is too short, bail out. */
4356 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
4357 return -1;
4358
4359 /* Now, we have a real MD5, read it into the array. */
4360 for (n = 0; n < 16; n++)
4361 {
4362 unsigned int x;
4363
4364 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
4365 return -1;
4366
4367 md5[n] = x;
4368 }
4369
4370 return 0;
4371 }
4372
4373
4374 /* Given module, dump it to disk. If there was an error while
4375 processing the module, dump_flag will be set to zero and we delete
4376 the module file, even if it was already there. */
4377
4378 void
4379 gfc_dump_module (const char *name, int dump_flag)
4380 {
4381 int n;
4382 char *filename, *filename_tmp, *p;
4383 time_t now;
4384 fpos_t md5_pos;
4385 unsigned char md5_new[16], md5_old[16];
4386
4387 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
4388 if (gfc_option.module_dir != NULL)
4389 {
4390 n += strlen (gfc_option.module_dir);
4391 filename = (char *) alloca (n);
4392 strcpy (filename, gfc_option.module_dir);
4393 strcat (filename, name);
4394 }
4395 else
4396 {
4397 filename = (char *) alloca (n);
4398 strcpy (filename, name);
4399 }
4400 strcat (filename, MODULE_EXTENSION);
4401
4402 /* Name of the temporary file used to write the module. */
4403 filename_tmp = (char *) alloca (n + 1);
4404 strcpy (filename_tmp, filename);
4405 strcat (filename_tmp, "0");
4406
4407 /* There was an error while processing the module. We delete the
4408 module file, even if it was already there. */
4409 if (!dump_flag)
4410 {
4411 unlink (filename);
4412 return;
4413 }
4414
4415 /* Write the module to the temporary file. */
4416 module_fp = fopen (filename_tmp, "w");
4417 if (module_fp == NULL)
4418 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
4419 filename_tmp, strerror (errno));
4420
4421 /* Write the header, including space reserved for the MD5 sum. */
4422 now = time (NULL);
4423 p = ctime (&now);
4424
4425 *strchr (p, '\n') = '\0';
4426
4427 fprintf (module_fp, "GFORTRAN module created from %s on %s\nMD5:",
4428 gfc_source_file, p);
4429 fgetpos (module_fp, &md5_pos);
4430 fputs ("00000000000000000000000000000000 -- "
4431 "If you edit this, you'll get what you deserve.\n\n", module_fp);
4432
4433 /* Initialize the MD5 context that will be used for output. */
4434 md5_init_ctx (&ctx);
4435
4436 /* Write the module itself. */
4437 iomode = IO_OUTPUT;
4438 strcpy (module_name, name);
4439
4440 init_pi_tree ();
4441
4442 write_module ();
4443
4444 free_pi_tree (pi_root);
4445 pi_root = NULL;
4446
4447 write_char ('\n');
4448
4449 /* Write the MD5 sum to the header of the module file. */
4450 md5_finish_ctx (&ctx, md5_new);
4451 fsetpos (module_fp, &md5_pos);
4452 for (n = 0; n < 16; n++)
4453 fprintf (module_fp, "%02x", md5_new[n]);
4454
4455 if (fclose (module_fp))
4456 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
4457 filename_tmp, strerror (errno));
4458
4459 /* Read the MD5 from the header of the old module file and compare. */
4460 if (read_md5_from_module_file (filename, md5_old) != 0
4461 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
4462 {
4463 /* Module file have changed, replace the old one. */
4464 unlink (filename);
4465 rename (filename_tmp, filename);
4466 }
4467 else
4468 unlink (filename_tmp);
4469 }
4470
4471
4472 static void
4473 sort_iso_c_rename_list (void)
4474 {
4475 gfc_use_rename *tmp_list = NULL;
4476 gfc_use_rename *curr;
4477 gfc_use_rename *kinds_used[ISOCBINDING_NUMBER] = {NULL};
4478 int c_kind;
4479 int i;
4480
4481 for (curr = gfc_rename_list; curr; curr = curr->next)
4482 {
4483 c_kind = get_c_kind (curr->use_name, c_interop_kinds_table);
4484 if (c_kind == ISOCBINDING_INVALID || c_kind == ISOCBINDING_LAST)
4485 {
4486 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4487 "intrinsic module ISO_C_BINDING.", curr->use_name,
4488 &curr->where);
4489 }
4490 else
4491 /* Put it in the list. */
4492 kinds_used[c_kind] = curr;
4493 }
4494
4495 /* Make a new (sorted) rename list. */
4496 i = 0;
4497 while (i < ISOCBINDING_NUMBER && kinds_used[i] == NULL)
4498 i++;
4499
4500 if (i < ISOCBINDING_NUMBER)
4501 {
4502 tmp_list = kinds_used[i];
4503
4504 i++;
4505 curr = tmp_list;
4506 for (; i < ISOCBINDING_NUMBER; i++)
4507 if (kinds_used[i] != NULL)
4508 {
4509 curr->next = kinds_used[i];
4510 curr = curr->next;
4511 curr->next = NULL;
4512 }
4513 }
4514
4515 gfc_rename_list = tmp_list;
4516 }
4517
4518
4519 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
4520 the current namespace for all named constants, pointer types, and
4521 procedures in the module unless the only clause was used or a rename
4522 list was provided. */
4523
4524 static void
4525 import_iso_c_binding_module (void)
4526 {
4527 gfc_symbol *mod_sym = NULL;
4528 gfc_symtree *mod_symtree = NULL;
4529 const char *iso_c_module_name = "__iso_c_binding";
4530 gfc_use_rename *u;
4531 int i;
4532 char *local_name;
4533
4534 /* Look only in the current namespace. */
4535 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
4536
4537 if (mod_symtree == NULL)
4538 {
4539 /* symtree doesn't already exist in current namespace. */
4540 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree);
4541
4542 if (mod_symtree != NULL)
4543 mod_sym = mod_symtree->n.sym;
4544 else
4545 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
4546 "create symbol for %s", iso_c_module_name);
4547
4548 mod_sym->attr.flavor = FL_MODULE;
4549 mod_sym->attr.intrinsic = 1;
4550 mod_sym->module = gfc_get_string (iso_c_module_name);
4551 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
4552 }
4553
4554 /* Generate the symbols for the named constants representing
4555 the kinds for intrinsic data types. */
4556 if (only_flag)
4557 {
4558 /* Sort the rename list because there are dependencies between types
4559 and procedures (e.g., c_loc needs c_ptr). */
4560 sort_iso_c_rename_list ();
4561
4562 for (u = gfc_rename_list; u; u = u->next)
4563 {
4564 i = get_c_kind (u->use_name, c_interop_kinds_table);
4565
4566 if (i == ISOCBINDING_INVALID || i == ISOCBINDING_LAST)
4567 {
4568 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4569 "intrinsic module ISO_C_BINDING.", u->use_name,
4570 &u->where);
4571 continue;
4572 }
4573
4574 generate_isocbinding_symbol (iso_c_module_name, i, u->local_name);
4575 }
4576 }
4577 else
4578 {
4579 for (i = 0; i < ISOCBINDING_NUMBER; i++)
4580 {
4581 local_name = NULL;
4582 for (u = gfc_rename_list; u; u = u->next)
4583 {
4584 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
4585 {
4586 local_name = u->local_name;
4587 u->found = 1;
4588 break;
4589 }
4590 }
4591 generate_isocbinding_symbol (iso_c_module_name, i, local_name);
4592 }
4593
4594 for (u = gfc_rename_list; u; u = u->next)
4595 {
4596 if (u->found)
4597 continue;
4598
4599 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4600 "module ISO_C_BINDING", u->use_name, &u->where);
4601 }
4602 }
4603 }
4604
4605
4606 /* Add an integer named constant from a given module. */
4607
4608 static void
4609 create_int_parameter (const char *name, int value, const char *modname,
4610 intmod_id module, int id)
4611 {
4612 gfc_symtree *tmp_symtree;
4613 gfc_symbol *sym;
4614
4615 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4616 if (tmp_symtree != NULL)
4617 {
4618 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
4619 return;
4620 else
4621 gfc_error ("Symbol '%s' already declared", name);
4622 }
4623
4624 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree);
4625 sym = tmp_symtree->n.sym;
4626
4627 sym->module = gfc_get_string (modname);
4628 sym->attr.flavor = FL_PARAMETER;
4629 sym->ts.type = BT_INTEGER;
4630 sym->ts.kind = gfc_default_integer_kind;
4631 sym->value = gfc_int_expr (value);
4632 sym->attr.use_assoc = 1;
4633 sym->from_intmod = module;
4634 sym->intmod_sym_id = id;
4635 }
4636
4637
4638 /* USE the ISO_FORTRAN_ENV intrinsic module. */
4639
4640 static void
4641 use_iso_fortran_env_module (void)
4642 {
4643 static char mod[] = "iso_fortran_env";
4644 const char *local_name;
4645 gfc_use_rename *u;
4646 gfc_symbol *mod_sym;
4647 gfc_symtree *mod_symtree;
4648 int i;
4649
4650 intmod_sym symbol[] = {
4651 #define NAMED_INTCST(a,b,c) { a, b, 0 },
4652 #include "iso-fortran-env.def"
4653 #undef NAMED_INTCST
4654 { ISOFORTRANENV_INVALID, NULL, -1234 } };
4655
4656 i = 0;
4657 #define NAMED_INTCST(a,b,c) symbol[i++].value = c;
4658 #include "iso-fortran-env.def"
4659 #undef NAMED_INTCST
4660
4661 /* Generate the symbol for the module itself. */
4662 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
4663 if (mod_symtree == NULL)
4664 {
4665 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree);
4666 gcc_assert (mod_symtree);
4667 mod_sym = mod_symtree->n.sym;
4668
4669 mod_sym->attr.flavor = FL_MODULE;
4670 mod_sym->attr.intrinsic = 1;
4671 mod_sym->module = gfc_get_string (mod);
4672 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
4673 }
4674 else
4675 if (!mod_symtree->n.sym->attr.intrinsic)
4676 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
4677 "non-intrinsic module name used previously", mod);
4678
4679 /* Generate the symbols for the module integer named constants. */
4680 if (only_flag)
4681 for (u = gfc_rename_list; u; u = u->next)
4682 {
4683 for (i = 0; symbol[i].name; i++)
4684 if (strcmp (symbol[i].name, u->use_name) == 0)
4685 break;
4686
4687 if (symbol[i].name == NULL)
4688 {
4689 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4690 "intrinsic module ISO_FORTRAN_ENV", u->use_name,
4691 &u->where);
4692 continue;
4693 }
4694
4695 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4696 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4697 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4698 "from intrinsic module ISO_FORTRAN_ENV at %L is "
4699 "incompatible with option %s", &u->where,
4700 gfc_option.flag_default_integer
4701 ? "-fdefault-integer-8" : "-fdefault-real-8");
4702
4703 create_int_parameter (u->local_name[0] ? u->local_name
4704 : symbol[i].name,
4705 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4706 symbol[i].id);
4707 }
4708 else
4709 {
4710 for (i = 0; symbol[i].name; i++)
4711 {
4712 local_name = NULL;
4713 for (u = gfc_rename_list; u; u = u->next)
4714 {
4715 if (strcmp (symbol[i].name, u->use_name) == 0)
4716 {
4717 local_name = u->local_name;
4718 u->found = 1;
4719 break;
4720 }
4721 }
4722
4723 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4724 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4725 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4726 "from intrinsic module ISO_FORTRAN_ENV at %C is "
4727 "incompatible with option %s",
4728 gfc_option.flag_default_integer
4729 ? "-fdefault-integer-8" : "-fdefault-real-8");
4730
4731 create_int_parameter (local_name ? local_name : symbol[i].name,
4732 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4733 symbol[i].id);
4734 }
4735
4736 for (u = gfc_rename_list; u; u = u->next)
4737 {
4738 if (u->found)
4739 continue;
4740
4741 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4742 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
4743 }
4744 }
4745 }
4746
4747
4748 /* Process a USE directive. */
4749
4750 void
4751 gfc_use_module (void)
4752 {
4753 char *filename;
4754 gfc_state_data *p;
4755 int c, line, start;
4756 gfc_symtree *mod_symtree;
4757
4758 filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION)
4759 + 1);
4760 strcpy (filename, module_name);
4761 strcat (filename, MODULE_EXTENSION);
4762
4763 /* First, try to find an non-intrinsic module, unless the USE statement
4764 specified that the module is intrinsic. */
4765 module_fp = NULL;
4766 if (!specified_int)
4767 module_fp = gfc_open_included_file (filename, true, true);
4768
4769 /* Then, see if it's an intrinsic one, unless the USE statement
4770 specified that the module is non-intrinsic. */
4771 if (module_fp == NULL && !specified_nonint)
4772 {
4773 if (strcmp (module_name, "iso_fortran_env") == 0
4774 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
4775 "intrinsic module at %C") != FAILURE)
4776 {
4777 use_iso_fortran_env_module ();
4778 return;
4779 }
4780
4781 if (strcmp (module_name, "iso_c_binding") == 0
4782 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
4783 "ISO_C_BINDING module at %C") != FAILURE)
4784 {
4785 import_iso_c_binding_module();
4786 return;
4787 }
4788
4789 module_fp = gfc_open_intrinsic_module (filename);
4790
4791 if (module_fp == NULL && specified_int)
4792 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
4793 module_name);
4794 }
4795
4796 if (module_fp == NULL)
4797 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
4798 filename, strerror (errno));
4799
4800 /* Check that we haven't already USEd an intrinsic module with the
4801 same name. */
4802
4803 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
4804 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
4805 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
4806 "intrinsic module name used previously", module_name);
4807
4808 iomode = IO_INPUT;
4809 module_line = 1;
4810 module_column = 1;
4811 start = 0;
4812
4813 /* Skip the first two lines of the module, after checking that this is
4814 a gfortran module file. */
4815 line = 0;
4816 while (line < 2)
4817 {
4818 c = module_char ();
4819 if (c == EOF)
4820 bad_module ("Unexpected end of module");
4821 if (start++ < 2)
4822 parse_name (c);
4823 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
4824 || (start == 2 && strcmp (atom_name, " module") != 0))
4825 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
4826 "file", filename);
4827
4828 if (c == '\n')
4829 line++;
4830 }
4831
4832 /* Make sure we're not reading the same module that we may be building. */
4833 for (p = gfc_state_stack; p; p = p->previous)
4834 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
4835 gfc_fatal_error ("Can't USE the same module we're building!");
4836
4837 init_pi_tree ();
4838 init_true_name_tree ();
4839
4840 read_module ();
4841
4842 free_true_name (true_name_root);
4843 true_name_root = NULL;
4844
4845 free_pi_tree (pi_root);
4846 pi_root = NULL;
4847
4848 fclose (module_fp);
4849 }
4850
4851
4852 void
4853 gfc_module_init_2 (void)
4854 {
4855 last_atom = ATOM_LPAREN;
4856 }
4857
4858
4859 void
4860 gfc_module_done_2 (void)
4861 {
4862 free_rename ();
4863 }