re PR fortran/36162 (Non-ASCII character in module string gives ICE)
[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 /* Functions for quoting and unquoting strings. */
1478
1479 static char *
1480 quote_string (const gfc_char_t *s, const size_t slength)
1481 {
1482 const gfc_char_t *p;
1483 char *res, *q;
1484 size_t len = 0, i;
1485
1486 /* Calculate the length we'll need: a backslash takes two ("\\"),
1487 non-printable characters take 10 ("\Uxxxxxxxx") and others take 1. */
1488 for (p = s, i = 0; i < slength; p++, i++)
1489 {
1490 if (*p == '\\')
1491 len += 2;
1492 else if (!gfc_wide_is_printable (*p))
1493 len += 10;
1494 else
1495 len++;
1496 }
1497
1498 q = res = gfc_getmem (len + 1);
1499 for (p = s, i = 0; i < slength; p++, i++)
1500 {
1501 if (*p == '\\')
1502 *q++ = '\\', *q++ = '\\';
1503 else if (!gfc_wide_is_printable (*p))
1504 {
1505 sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "ux",
1506 (unsigned HOST_WIDE_INT) *p);
1507 q += 10;
1508 }
1509 else
1510 *q++ = (unsigned char) *p;
1511 }
1512
1513 res[len] = '\0';
1514 return res;
1515 }
1516
1517 static gfc_char_t *
1518 unquote_string (const char *s)
1519 {
1520 size_t len, i;
1521 const char *p;
1522 gfc_char_t *res;
1523
1524 for (p = s, len = 0; *p; p++, len++)
1525 {
1526 if (*p != '\\')
1527 continue;
1528
1529 if (p[1] == '\\')
1530 p++;
1531 else if (p[1] == 'U')
1532 p += 9; /* That is a "\U????????". */
1533 else
1534 gfc_internal_error ("unquote_string(): got bad string");
1535 }
1536
1537 res = gfc_get_wide_string (len + 1);
1538 for (i = 0, p = s; i < len; i++, p++)
1539 {
1540 gcc_assert (*p);
1541
1542 if (*p != '\\')
1543 res[i] = (unsigned char) *p;
1544 else if (p[1] == '\\')
1545 {
1546 res[i] = (unsigned char) '\\';
1547 p++;
1548 }
1549 else
1550 {
1551 /* We read the 8-digits hexadecimal constant that follows. */
1552 int j;
1553 unsigned n;
1554 gfc_char_t c = 0;
1555
1556 gcc_assert (p[1] == 'U');
1557 for (j = 0; j < 8; j++)
1558 {
1559 c = c << 4;
1560 gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1561 c += n;
1562 }
1563
1564 res[i] = c;
1565 p += 9;
1566 }
1567 }
1568
1569 res[len] = '\0';
1570 return res;
1571 }
1572
1573
1574 /* Read or write a character pointer that points to a wide string on the
1575 heap, performing quoting/unquoting of nonprintable characters using the
1576 form \U???????? (where each ? is a hexadecimal digit).
1577 Length is the length of the string, only known and used in output mode. */
1578
1579 static const gfc_char_t *
1580 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1581 {
1582 if (iomode == IO_OUTPUT)
1583 {
1584 char *quoted = quote_string (s, length);
1585 write_atom (ATOM_STRING, quoted);
1586 gfc_free (quoted);
1587 return s;
1588 }
1589 else
1590 {
1591 gfc_char_t *unquoted;
1592
1593 require_atom (ATOM_STRING);
1594 unquoted = unquote_string (atom_string);
1595 gfc_free (atom_string);
1596 return unquoted;
1597 }
1598 }
1599
1600
1601 /* Read or write a string that is in static memory. */
1602
1603 static void
1604 mio_pool_string (const char **stringp)
1605 {
1606 /* TODO: one could write the string only once, and refer to it via a
1607 fixup pointer. */
1608
1609 /* As a special case we have to deal with a NULL string. This
1610 happens for the 'module' member of 'gfc_symbol's that are not in a
1611 module. We read / write these as the empty string. */
1612 if (iomode == IO_OUTPUT)
1613 {
1614 const char *p = *stringp == NULL ? "" : *stringp;
1615 write_atom (ATOM_STRING, p);
1616 }
1617 else
1618 {
1619 require_atom (ATOM_STRING);
1620 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1621 gfc_free (atom_string);
1622 }
1623 }
1624
1625
1626 /* Read or write a string that is inside of some already-allocated
1627 structure. */
1628
1629 static void
1630 mio_internal_string (char *string)
1631 {
1632 if (iomode == IO_OUTPUT)
1633 write_atom (ATOM_STRING, string);
1634 else
1635 {
1636 require_atom (ATOM_STRING);
1637 strcpy (string, atom_string);
1638 gfc_free (atom_string);
1639 }
1640 }
1641
1642
1643 typedef enum
1644 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1645 AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1646 AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1647 AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1648 AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1649 AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED,
1650 AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP
1651 }
1652 ab_attribute;
1653
1654 static const mstring attr_bits[] =
1655 {
1656 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1657 minit ("DIMENSION", AB_DIMENSION),
1658 minit ("EXTERNAL", AB_EXTERNAL),
1659 minit ("INTRINSIC", AB_INTRINSIC),
1660 minit ("OPTIONAL", AB_OPTIONAL),
1661 minit ("POINTER", AB_POINTER),
1662 minit ("VOLATILE", AB_VOLATILE),
1663 minit ("TARGET", AB_TARGET),
1664 minit ("THREADPRIVATE", AB_THREADPRIVATE),
1665 minit ("DUMMY", AB_DUMMY),
1666 minit ("RESULT", AB_RESULT),
1667 minit ("DATA", AB_DATA),
1668 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1669 minit ("IN_COMMON", AB_IN_COMMON),
1670 minit ("FUNCTION", AB_FUNCTION),
1671 minit ("SUBROUTINE", AB_SUBROUTINE),
1672 minit ("SEQUENCE", AB_SEQUENCE),
1673 minit ("ELEMENTAL", AB_ELEMENTAL),
1674 minit ("PURE", AB_PURE),
1675 minit ("RECURSIVE", AB_RECURSIVE),
1676 minit ("GENERIC", AB_GENERIC),
1677 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1678 minit ("CRAY_POINTER", AB_CRAY_POINTER),
1679 minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1680 minit ("IS_BIND_C", AB_IS_BIND_C),
1681 minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1682 minit ("IS_ISO_C", AB_IS_ISO_C),
1683 minit ("VALUE", AB_VALUE),
1684 minit ("ALLOC_COMP", AB_ALLOC_COMP),
1685 minit ("POINTER_COMP", AB_POINTER_COMP),
1686 minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1687 minit ("ZERO_COMP", AB_ZERO_COMP),
1688 minit ("PROTECTED", AB_PROTECTED),
1689 minit ("ABSTRACT", AB_ABSTRACT),
1690 minit (NULL, -1)
1691 };
1692
1693
1694 /* Specialization of mio_name. */
1695 DECL_MIO_NAME (ab_attribute)
1696 DECL_MIO_NAME (ar_type)
1697 DECL_MIO_NAME (array_type)
1698 DECL_MIO_NAME (bt)
1699 DECL_MIO_NAME (expr_t)
1700 DECL_MIO_NAME (gfc_access)
1701 DECL_MIO_NAME (gfc_intrinsic_op)
1702 DECL_MIO_NAME (ifsrc)
1703 DECL_MIO_NAME (save_state)
1704 DECL_MIO_NAME (procedure_type)
1705 DECL_MIO_NAME (ref_type)
1706 DECL_MIO_NAME (sym_flavor)
1707 DECL_MIO_NAME (sym_intent)
1708 #undef DECL_MIO_NAME
1709
1710 /* Symbol attributes are stored in list with the first three elements
1711 being the enumerated fields, while the remaining elements (if any)
1712 indicate the individual attribute bits. The access field is not
1713 saved-- it controls what symbols are exported when a module is
1714 written. */
1715
1716 static void
1717 mio_symbol_attribute (symbol_attribute *attr)
1718 {
1719 atom_type t;
1720
1721 mio_lparen ();
1722
1723 attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1724 attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1725 attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1726 attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1727 attr->save = MIO_NAME (save_state) (attr->save, save_status);
1728
1729 if (iomode == IO_OUTPUT)
1730 {
1731 if (attr->allocatable)
1732 MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1733 if (attr->dimension)
1734 MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1735 if (attr->external)
1736 MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1737 if (attr->intrinsic)
1738 MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1739 if (attr->optional)
1740 MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1741 if (attr->pointer)
1742 MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1743 if (attr->protected)
1744 MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1745 if (attr->value)
1746 MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1747 if (attr->volatile_)
1748 MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1749 if (attr->target)
1750 MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1751 if (attr->threadprivate)
1752 MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1753 if (attr->dummy)
1754 MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1755 if (attr->result)
1756 MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1757 /* We deliberately don't preserve the "entry" flag. */
1758
1759 if (attr->data)
1760 MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1761 if (attr->in_namelist)
1762 MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1763 if (attr->in_common)
1764 MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1765
1766 if (attr->function)
1767 MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
1768 if (attr->subroutine)
1769 MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
1770 if (attr->generic)
1771 MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
1772 if (attr->abstract)
1773 MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
1774
1775 if (attr->sequence)
1776 MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
1777 if (attr->elemental)
1778 MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
1779 if (attr->pure)
1780 MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
1781 if (attr->recursive)
1782 MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
1783 if (attr->always_explicit)
1784 MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1785 if (attr->cray_pointer)
1786 MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
1787 if (attr->cray_pointee)
1788 MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1789 if (attr->is_bind_c)
1790 MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
1791 if (attr->is_c_interop)
1792 MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
1793 if (attr->is_iso_c)
1794 MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
1795 if (attr->alloc_comp)
1796 MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
1797 if (attr->pointer_comp)
1798 MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
1799 if (attr->private_comp)
1800 MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
1801 if (attr->zero_comp)
1802 MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
1803
1804 mio_rparen ();
1805
1806 }
1807 else
1808 {
1809 for (;;)
1810 {
1811 t = parse_atom ();
1812 if (t == ATOM_RPAREN)
1813 break;
1814 if (t != ATOM_NAME)
1815 bad_module ("Expected attribute bit name");
1816
1817 switch ((ab_attribute) find_enum (attr_bits))
1818 {
1819 case AB_ALLOCATABLE:
1820 attr->allocatable = 1;
1821 break;
1822 case AB_DIMENSION:
1823 attr->dimension = 1;
1824 break;
1825 case AB_EXTERNAL:
1826 attr->external = 1;
1827 break;
1828 case AB_INTRINSIC:
1829 attr->intrinsic = 1;
1830 break;
1831 case AB_OPTIONAL:
1832 attr->optional = 1;
1833 break;
1834 case AB_POINTER:
1835 attr->pointer = 1;
1836 break;
1837 case AB_PROTECTED:
1838 attr->protected = 1;
1839 break;
1840 case AB_VALUE:
1841 attr->value = 1;
1842 break;
1843 case AB_VOLATILE:
1844 attr->volatile_ = 1;
1845 break;
1846 case AB_TARGET:
1847 attr->target = 1;
1848 break;
1849 case AB_THREADPRIVATE:
1850 attr->threadprivate = 1;
1851 break;
1852 case AB_DUMMY:
1853 attr->dummy = 1;
1854 break;
1855 case AB_RESULT:
1856 attr->result = 1;
1857 break;
1858 case AB_DATA:
1859 attr->data = 1;
1860 break;
1861 case AB_IN_NAMELIST:
1862 attr->in_namelist = 1;
1863 break;
1864 case AB_IN_COMMON:
1865 attr->in_common = 1;
1866 break;
1867 case AB_FUNCTION:
1868 attr->function = 1;
1869 break;
1870 case AB_SUBROUTINE:
1871 attr->subroutine = 1;
1872 break;
1873 case AB_GENERIC:
1874 attr->generic = 1;
1875 break;
1876 case AB_ABSTRACT:
1877 attr->abstract = 1;
1878 break;
1879 case AB_SEQUENCE:
1880 attr->sequence = 1;
1881 break;
1882 case AB_ELEMENTAL:
1883 attr->elemental = 1;
1884 break;
1885 case AB_PURE:
1886 attr->pure = 1;
1887 break;
1888 case AB_RECURSIVE:
1889 attr->recursive = 1;
1890 break;
1891 case AB_ALWAYS_EXPLICIT:
1892 attr->always_explicit = 1;
1893 break;
1894 case AB_CRAY_POINTER:
1895 attr->cray_pointer = 1;
1896 break;
1897 case AB_CRAY_POINTEE:
1898 attr->cray_pointee = 1;
1899 break;
1900 case AB_IS_BIND_C:
1901 attr->is_bind_c = 1;
1902 break;
1903 case AB_IS_C_INTEROP:
1904 attr->is_c_interop = 1;
1905 break;
1906 case AB_IS_ISO_C:
1907 attr->is_iso_c = 1;
1908 break;
1909 case AB_ALLOC_COMP:
1910 attr->alloc_comp = 1;
1911 break;
1912 case AB_POINTER_COMP:
1913 attr->pointer_comp = 1;
1914 break;
1915 case AB_PRIVATE_COMP:
1916 attr->private_comp = 1;
1917 break;
1918 case AB_ZERO_COMP:
1919 attr->zero_comp = 1;
1920 break;
1921 }
1922 }
1923 }
1924 }
1925
1926
1927 static const mstring bt_types[] = {
1928 minit ("INTEGER", BT_INTEGER),
1929 minit ("REAL", BT_REAL),
1930 minit ("COMPLEX", BT_COMPLEX),
1931 minit ("LOGICAL", BT_LOGICAL),
1932 minit ("CHARACTER", BT_CHARACTER),
1933 minit ("DERIVED", BT_DERIVED),
1934 minit ("PROCEDURE", BT_PROCEDURE),
1935 minit ("UNKNOWN", BT_UNKNOWN),
1936 minit ("VOID", BT_VOID),
1937 minit (NULL, -1)
1938 };
1939
1940
1941 static void
1942 mio_charlen (gfc_charlen **clp)
1943 {
1944 gfc_charlen *cl;
1945
1946 mio_lparen ();
1947
1948 if (iomode == IO_OUTPUT)
1949 {
1950 cl = *clp;
1951 if (cl != NULL)
1952 mio_expr (&cl->length);
1953 }
1954 else
1955 {
1956 if (peek_atom () != ATOM_RPAREN)
1957 {
1958 cl = gfc_get_charlen ();
1959 mio_expr (&cl->length);
1960
1961 *clp = cl;
1962
1963 cl->next = gfc_current_ns->cl_list;
1964 gfc_current_ns->cl_list = cl;
1965 }
1966 }
1967
1968 mio_rparen ();
1969 }
1970
1971
1972 /* See if a name is a generated name. */
1973
1974 static int
1975 check_unique_name (const char *name)
1976 {
1977 return *name == '@';
1978 }
1979
1980
1981 static void
1982 mio_typespec (gfc_typespec *ts)
1983 {
1984 mio_lparen ();
1985
1986 ts->type = MIO_NAME (bt) (ts->type, bt_types);
1987
1988 if (ts->type != BT_DERIVED)
1989 mio_integer (&ts->kind);
1990 else
1991 mio_symbol_ref (&ts->derived);
1992
1993 /* Add info for C interop and is_iso_c. */
1994 mio_integer (&ts->is_c_interop);
1995 mio_integer (&ts->is_iso_c);
1996
1997 /* If the typespec is for an identifier either from iso_c_binding, or
1998 a constant that was initialized to an identifier from it, use the
1999 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
2000 if (ts->is_iso_c)
2001 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2002 else
2003 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2004
2005 if (ts->type != BT_CHARACTER)
2006 {
2007 /* ts->cl is only valid for BT_CHARACTER. */
2008 mio_lparen ();
2009 mio_rparen ();
2010 }
2011 else
2012 mio_charlen (&ts->cl);
2013
2014 mio_rparen ();
2015 }
2016
2017
2018 static const mstring array_spec_types[] = {
2019 minit ("EXPLICIT", AS_EXPLICIT),
2020 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2021 minit ("DEFERRED", AS_DEFERRED),
2022 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2023 minit (NULL, -1)
2024 };
2025
2026
2027 static void
2028 mio_array_spec (gfc_array_spec **asp)
2029 {
2030 gfc_array_spec *as;
2031 int i;
2032
2033 mio_lparen ();
2034
2035 if (iomode == IO_OUTPUT)
2036 {
2037 if (*asp == NULL)
2038 goto done;
2039 as = *asp;
2040 }
2041 else
2042 {
2043 if (peek_atom () == ATOM_RPAREN)
2044 {
2045 *asp = NULL;
2046 goto done;
2047 }
2048
2049 *asp = as = gfc_get_array_spec ();
2050 }
2051
2052 mio_integer (&as->rank);
2053 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2054
2055 for (i = 0; i < as->rank; i++)
2056 {
2057 mio_expr (&as->lower[i]);
2058 mio_expr (&as->upper[i]);
2059 }
2060
2061 done:
2062 mio_rparen ();
2063 }
2064
2065
2066 /* Given a pointer to an array reference structure (which lives in a
2067 gfc_ref structure), find the corresponding array specification
2068 structure. Storing the pointer in the ref structure doesn't quite
2069 work when loading from a module. Generating code for an array
2070 reference also needs more information than just the array spec. */
2071
2072 static const mstring array_ref_types[] = {
2073 minit ("FULL", AR_FULL),
2074 minit ("ELEMENT", AR_ELEMENT),
2075 minit ("SECTION", AR_SECTION),
2076 minit (NULL, -1)
2077 };
2078
2079
2080 static void
2081 mio_array_ref (gfc_array_ref *ar)
2082 {
2083 int i;
2084
2085 mio_lparen ();
2086 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2087 mio_integer (&ar->dimen);
2088
2089 switch (ar->type)
2090 {
2091 case AR_FULL:
2092 break;
2093
2094 case AR_ELEMENT:
2095 for (i = 0; i < ar->dimen; i++)
2096 mio_expr (&ar->start[i]);
2097
2098 break;
2099
2100 case AR_SECTION:
2101 for (i = 0; i < ar->dimen; i++)
2102 {
2103 mio_expr (&ar->start[i]);
2104 mio_expr (&ar->end[i]);
2105 mio_expr (&ar->stride[i]);
2106 }
2107
2108 break;
2109
2110 case AR_UNKNOWN:
2111 gfc_internal_error ("mio_array_ref(): Unknown array ref");
2112 }
2113
2114 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2115 we can't call mio_integer directly. Instead loop over each element
2116 and cast it to/from an integer. */
2117 if (iomode == IO_OUTPUT)
2118 {
2119 for (i = 0; i < ar->dimen; i++)
2120 {
2121 int tmp = (int)ar->dimen_type[i];
2122 write_atom (ATOM_INTEGER, &tmp);
2123 }
2124 }
2125 else
2126 {
2127 for (i = 0; i < ar->dimen; i++)
2128 {
2129 require_atom (ATOM_INTEGER);
2130 ar->dimen_type[i] = atom_int;
2131 }
2132 }
2133
2134 if (iomode == IO_INPUT)
2135 {
2136 ar->where = gfc_current_locus;
2137
2138 for (i = 0; i < ar->dimen; i++)
2139 ar->c_where[i] = gfc_current_locus;
2140 }
2141
2142 mio_rparen ();
2143 }
2144
2145
2146 /* Saves or restores a pointer. The pointer is converted back and
2147 forth from an integer. We return the pointer_info pointer so that
2148 the caller can take additional action based on the pointer type. */
2149
2150 static pointer_info *
2151 mio_pointer_ref (void *gp)
2152 {
2153 pointer_info *p;
2154
2155 if (iomode == IO_OUTPUT)
2156 {
2157 p = get_pointer (*((char **) gp));
2158 write_atom (ATOM_INTEGER, &p->integer);
2159 }
2160 else
2161 {
2162 require_atom (ATOM_INTEGER);
2163 p = add_fixup (atom_int, gp);
2164 }
2165
2166 return p;
2167 }
2168
2169
2170 /* Save and load references to components that occur within
2171 expressions. We have to describe these references by a number and
2172 by name. The number is necessary for forward references during
2173 reading, and the name is necessary if the symbol already exists in
2174 the namespace and is not loaded again. */
2175
2176 static void
2177 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2178 {
2179 char name[GFC_MAX_SYMBOL_LEN + 1];
2180 gfc_component *q;
2181 pointer_info *p;
2182
2183 p = mio_pointer_ref (cp);
2184 if (p->type == P_UNKNOWN)
2185 p->type = P_COMPONENT;
2186
2187 if (iomode == IO_OUTPUT)
2188 mio_pool_string (&(*cp)->name);
2189 else
2190 {
2191 mio_internal_string (name);
2192
2193 /* It can happen that a component reference can be read before the
2194 associated derived type symbol has been loaded. Return now and
2195 wait for a later iteration of load_needed. */
2196 if (sym == NULL)
2197 return;
2198
2199 if (sym->components != NULL && p->u.pointer == NULL)
2200 {
2201 /* Symbol already loaded, so search by name. */
2202 for (q = sym->components; q; q = q->next)
2203 if (strcmp (q->name, name) == 0)
2204 break;
2205
2206 if (q == NULL)
2207 gfc_internal_error ("mio_component_ref(): Component not found");
2208
2209 associate_integer_pointer (p, q);
2210 }
2211
2212 /* Make sure this symbol will eventually be loaded. */
2213 p = find_pointer2 (sym);
2214 if (p->u.rsym.state == UNUSED)
2215 p->u.rsym.state = NEEDED;
2216 }
2217 }
2218
2219
2220 static void
2221 mio_component (gfc_component *c)
2222 {
2223 pointer_info *p;
2224 int n;
2225
2226 mio_lparen ();
2227
2228 if (iomode == IO_OUTPUT)
2229 {
2230 p = get_pointer (c);
2231 mio_integer (&p->integer);
2232 }
2233 else
2234 {
2235 mio_integer (&n);
2236 p = get_integer (n);
2237 associate_integer_pointer (p, c);
2238 }
2239
2240 if (p->type == P_UNKNOWN)
2241 p->type = P_COMPONENT;
2242
2243 mio_pool_string (&c->name);
2244 mio_typespec (&c->ts);
2245 mio_array_spec (&c->as);
2246
2247 mio_integer (&c->dimension);
2248 mio_integer (&c->pointer);
2249 mio_integer (&c->allocatable);
2250 c->access = MIO_NAME (gfc_access) (c->access, access_types);
2251
2252 mio_expr (&c->initializer);
2253 mio_rparen ();
2254 }
2255
2256
2257 static void
2258 mio_component_list (gfc_component **cp)
2259 {
2260 gfc_component *c, *tail;
2261
2262 mio_lparen ();
2263
2264 if (iomode == IO_OUTPUT)
2265 {
2266 for (c = *cp; c; c = c->next)
2267 mio_component (c);
2268 }
2269 else
2270 {
2271 *cp = NULL;
2272 tail = NULL;
2273
2274 for (;;)
2275 {
2276 if (peek_atom () == ATOM_RPAREN)
2277 break;
2278
2279 c = gfc_get_component ();
2280 mio_component (c);
2281
2282 if (tail == NULL)
2283 *cp = c;
2284 else
2285 tail->next = c;
2286
2287 tail = c;
2288 }
2289 }
2290
2291 mio_rparen ();
2292 }
2293
2294
2295 static void
2296 mio_actual_arg (gfc_actual_arglist *a)
2297 {
2298 mio_lparen ();
2299 mio_pool_string (&a->name);
2300 mio_expr (&a->expr);
2301 mio_rparen ();
2302 }
2303
2304
2305 static void
2306 mio_actual_arglist (gfc_actual_arglist **ap)
2307 {
2308 gfc_actual_arglist *a, *tail;
2309
2310 mio_lparen ();
2311
2312 if (iomode == IO_OUTPUT)
2313 {
2314 for (a = *ap; a; a = a->next)
2315 mio_actual_arg (a);
2316
2317 }
2318 else
2319 {
2320 tail = NULL;
2321
2322 for (;;)
2323 {
2324 if (peek_atom () != ATOM_LPAREN)
2325 break;
2326
2327 a = gfc_get_actual_arglist ();
2328
2329 if (tail == NULL)
2330 *ap = a;
2331 else
2332 tail->next = a;
2333
2334 tail = a;
2335 mio_actual_arg (a);
2336 }
2337 }
2338
2339 mio_rparen ();
2340 }
2341
2342
2343 /* Read and write formal argument lists. */
2344
2345 static void
2346 mio_formal_arglist (gfc_symbol *sym)
2347 {
2348 gfc_formal_arglist *f, *tail;
2349
2350 mio_lparen ();
2351
2352 if (iomode == IO_OUTPUT)
2353 {
2354 for (f = sym->formal; f; f = f->next)
2355 mio_symbol_ref (&f->sym);
2356 }
2357 else
2358 {
2359 sym->formal = tail = NULL;
2360
2361 while (peek_atom () != ATOM_RPAREN)
2362 {
2363 f = gfc_get_formal_arglist ();
2364 mio_symbol_ref (&f->sym);
2365
2366 if (sym->formal == NULL)
2367 sym->formal = f;
2368 else
2369 tail->next = f;
2370
2371 tail = f;
2372 }
2373 }
2374
2375 mio_rparen ();
2376 }
2377
2378
2379 /* Save or restore a reference to a symbol node. */
2380
2381 pointer_info *
2382 mio_symbol_ref (gfc_symbol **symp)
2383 {
2384 pointer_info *p;
2385
2386 p = mio_pointer_ref (symp);
2387 if (p->type == P_UNKNOWN)
2388 p->type = P_SYMBOL;
2389
2390 if (iomode == IO_OUTPUT)
2391 {
2392 if (p->u.wsym.state == UNREFERENCED)
2393 p->u.wsym.state = NEEDS_WRITE;
2394 }
2395 else
2396 {
2397 if (p->u.rsym.state == UNUSED)
2398 p->u.rsym.state = NEEDED;
2399 }
2400 return p;
2401 }
2402
2403
2404 /* Save or restore a reference to a symtree node. */
2405
2406 static void
2407 mio_symtree_ref (gfc_symtree **stp)
2408 {
2409 pointer_info *p;
2410 fixup_t *f;
2411
2412 if (iomode == IO_OUTPUT)
2413 mio_symbol_ref (&(*stp)->n.sym);
2414 else
2415 {
2416 require_atom (ATOM_INTEGER);
2417 p = get_integer (atom_int);
2418
2419 /* An unused equivalence member; make a symbol and a symtree
2420 for it. */
2421 if (in_load_equiv && p->u.rsym.symtree == NULL)
2422 {
2423 /* Since this is not used, it must have a unique name. */
2424 p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2425
2426 /* Make the symbol. */
2427 if (p->u.rsym.sym == NULL)
2428 {
2429 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2430 gfc_current_ns);
2431 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2432 }
2433
2434 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2435 p->u.rsym.symtree->n.sym->refs++;
2436 p->u.rsym.referenced = 1;
2437
2438 /* If the symbol is PRIVATE and in COMMON, load_commons will
2439 generate a fixup symbol, which must be associated. */
2440 if (p->fixup)
2441 resolve_fixups (p->fixup, p->u.rsym.sym);
2442 p->fixup = NULL;
2443 }
2444
2445 if (p->type == P_UNKNOWN)
2446 p->type = P_SYMBOL;
2447
2448 if (p->u.rsym.state == UNUSED)
2449 p->u.rsym.state = NEEDED;
2450
2451 if (p->u.rsym.symtree != NULL)
2452 {
2453 *stp = p->u.rsym.symtree;
2454 }
2455 else
2456 {
2457 f = gfc_getmem (sizeof (fixup_t));
2458
2459 f->next = p->u.rsym.stfixup;
2460 p->u.rsym.stfixup = f;
2461
2462 f->pointer = (void **) stp;
2463 }
2464 }
2465 }
2466
2467
2468 static void
2469 mio_iterator (gfc_iterator **ip)
2470 {
2471 gfc_iterator *iter;
2472
2473 mio_lparen ();
2474
2475 if (iomode == IO_OUTPUT)
2476 {
2477 if (*ip == NULL)
2478 goto done;
2479 }
2480 else
2481 {
2482 if (peek_atom () == ATOM_RPAREN)
2483 {
2484 *ip = NULL;
2485 goto done;
2486 }
2487
2488 *ip = gfc_get_iterator ();
2489 }
2490
2491 iter = *ip;
2492
2493 mio_expr (&iter->var);
2494 mio_expr (&iter->start);
2495 mio_expr (&iter->end);
2496 mio_expr (&iter->step);
2497
2498 done:
2499 mio_rparen ();
2500 }
2501
2502
2503 static void
2504 mio_constructor (gfc_constructor **cp)
2505 {
2506 gfc_constructor *c, *tail;
2507
2508 mio_lparen ();
2509
2510 if (iomode == IO_OUTPUT)
2511 {
2512 for (c = *cp; c; c = c->next)
2513 {
2514 mio_lparen ();
2515 mio_expr (&c->expr);
2516 mio_iterator (&c->iterator);
2517 mio_rparen ();
2518 }
2519 }
2520 else
2521 {
2522 *cp = NULL;
2523 tail = NULL;
2524
2525 while (peek_atom () != ATOM_RPAREN)
2526 {
2527 c = gfc_get_constructor ();
2528
2529 if (tail == NULL)
2530 *cp = c;
2531 else
2532 tail->next = c;
2533
2534 tail = c;
2535
2536 mio_lparen ();
2537 mio_expr (&c->expr);
2538 mio_iterator (&c->iterator);
2539 mio_rparen ();
2540 }
2541 }
2542
2543 mio_rparen ();
2544 }
2545
2546
2547 static const mstring ref_types[] = {
2548 minit ("ARRAY", REF_ARRAY),
2549 minit ("COMPONENT", REF_COMPONENT),
2550 minit ("SUBSTRING", REF_SUBSTRING),
2551 minit (NULL, -1)
2552 };
2553
2554
2555 static void
2556 mio_ref (gfc_ref **rp)
2557 {
2558 gfc_ref *r;
2559
2560 mio_lparen ();
2561
2562 r = *rp;
2563 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2564
2565 switch (r->type)
2566 {
2567 case REF_ARRAY:
2568 mio_array_ref (&r->u.ar);
2569 break;
2570
2571 case REF_COMPONENT:
2572 mio_symbol_ref (&r->u.c.sym);
2573 mio_component_ref (&r->u.c.component, r->u.c.sym);
2574 break;
2575
2576 case REF_SUBSTRING:
2577 mio_expr (&r->u.ss.start);
2578 mio_expr (&r->u.ss.end);
2579 mio_charlen (&r->u.ss.length);
2580 break;
2581 }
2582
2583 mio_rparen ();
2584 }
2585
2586
2587 static void
2588 mio_ref_list (gfc_ref **rp)
2589 {
2590 gfc_ref *ref, *head, *tail;
2591
2592 mio_lparen ();
2593
2594 if (iomode == IO_OUTPUT)
2595 {
2596 for (ref = *rp; ref; ref = ref->next)
2597 mio_ref (&ref);
2598 }
2599 else
2600 {
2601 head = tail = NULL;
2602
2603 while (peek_atom () != ATOM_RPAREN)
2604 {
2605 if (head == NULL)
2606 head = tail = gfc_get_ref ();
2607 else
2608 {
2609 tail->next = gfc_get_ref ();
2610 tail = tail->next;
2611 }
2612
2613 mio_ref (&tail);
2614 }
2615
2616 *rp = head;
2617 }
2618
2619 mio_rparen ();
2620 }
2621
2622
2623 /* Read and write an integer value. */
2624
2625 static void
2626 mio_gmp_integer (mpz_t *integer)
2627 {
2628 char *p;
2629
2630 if (iomode == IO_INPUT)
2631 {
2632 if (parse_atom () != ATOM_STRING)
2633 bad_module ("Expected integer string");
2634
2635 mpz_init (*integer);
2636 if (mpz_set_str (*integer, atom_string, 10))
2637 bad_module ("Error converting integer");
2638
2639 gfc_free (atom_string);
2640 }
2641 else
2642 {
2643 p = mpz_get_str (NULL, 10, *integer);
2644 write_atom (ATOM_STRING, p);
2645 gfc_free (p);
2646 }
2647 }
2648
2649
2650 static void
2651 mio_gmp_real (mpfr_t *real)
2652 {
2653 mp_exp_t exponent;
2654 char *p;
2655
2656 if (iomode == IO_INPUT)
2657 {
2658 if (parse_atom () != ATOM_STRING)
2659 bad_module ("Expected real string");
2660
2661 mpfr_init (*real);
2662 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2663 gfc_free (atom_string);
2664 }
2665 else
2666 {
2667 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2668
2669 if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
2670 {
2671 write_atom (ATOM_STRING, p);
2672 gfc_free (p);
2673 return;
2674 }
2675
2676 atom_string = gfc_getmem (strlen (p) + 20);
2677
2678 sprintf (atom_string, "0.%s@%ld", p, exponent);
2679
2680 /* Fix negative numbers. */
2681 if (atom_string[2] == '-')
2682 {
2683 atom_string[0] = '-';
2684 atom_string[1] = '0';
2685 atom_string[2] = '.';
2686 }
2687
2688 write_atom (ATOM_STRING, atom_string);
2689
2690 gfc_free (atom_string);
2691 gfc_free (p);
2692 }
2693 }
2694
2695
2696 /* Save and restore the shape of an array constructor. */
2697
2698 static void
2699 mio_shape (mpz_t **pshape, int rank)
2700 {
2701 mpz_t *shape;
2702 atom_type t;
2703 int n;
2704
2705 /* A NULL shape is represented by (). */
2706 mio_lparen ();
2707
2708 if (iomode == IO_OUTPUT)
2709 {
2710 shape = *pshape;
2711 if (!shape)
2712 {
2713 mio_rparen ();
2714 return;
2715 }
2716 }
2717 else
2718 {
2719 t = peek_atom ();
2720 if (t == ATOM_RPAREN)
2721 {
2722 *pshape = NULL;
2723 mio_rparen ();
2724 return;
2725 }
2726
2727 shape = gfc_get_shape (rank);
2728 *pshape = shape;
2729 }
2730
2731 for (n = 0; n < rank; n++)
2732 mio_gmp_integer (&shape[n]);
2733
2734 mio_rparen ();
2735 }
2736
2737
2738 static const mstring expr_types[] = {
2739 minit ("OP", EXPR_OP),
2740 minit ("FUNCTION", EXPR_FUNCTION),
2741 minit ("CONSTANT", EXPR_CONSTANT),
2742 minit ("VARIABLE", EXPR_VARIABLE),
2743 minit ("SUBSTRING", EXPR_SUBSTRING),
2744 minit ("STRUCTURE", EXPR_STRUCTURE),
2745 minit ("ARRAY", EXPR_ARRAY),
2746 minit ("NULL", EXPR_NULL),
2747 minit (NULL, -1)
2748 };
2749
2750 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2751 generic operators, not in expressions. INTRINSIC_USER is also
2752 replaced by the correct function name by the time we see it. */
2753
2754 static const mstring intrinsics[] =
2755 {
2756 minit ("UPLUS", INTRINSIC_UPLUS),
2757 minit ("UMINUS", INTRINSIC_UMINUS),
2758 minit ("PLUS", INTRINSIC_PLUS),
2759 minit ("MINUS", INTRINSIC_MINUS),
2760 minit ("TIMES", INTRINSIC_TIMES),
2761 minit ("DIVIDE", INTRINSIC_DIVIDE),
2762 minit ("POWER", INTRINSIC_POWER),
2763 minit ("CONCAT", INTRINSIC_CONCAT),
2764 minit ("AND", INTRINSIC_AND),
2765 minit ("OR", INTRINSIC_OR),
2766 minit ("EQV", INTRINSIC_EQV),
2767 minit ("NEQV", INTRINSIC_NEQV),
2768 minit ("EQ_SIGN", INTRINSIC_EQ),
2769 minit ("EQ", INTRINSIC_EQ_OS),
2770 minit ("NE_SIGN", INTRINSIC_NE),
2771 minit ("NE", INTRINSIC_NE_OS),
2772 minit ("GT_SIGN", INTRINSIC_GT),
2773 minit ("GT", INTRINSIC_GT_OS),
2774 minit ("GE_SIGN", INTRINSIC_GE),
2775 minit ("GE", INTRINSIC_GE_OS),
2776 minit ("LT_SIGN", INTRINSIC_LT),
2777 minit ("LT", INTRINSIC_LT_OS),
2778 minit ("LE_SIGN", INTRINSIC_LE),
2779 minit ("LE", INTRINSIC_LE_OS),
2780 minit ("NOT", INTRINSIC_NOT),
2781 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2782 minit (NULL, -1)
2783 };
2784
2785
2786 /* Remedy a couple of situations where the gfc_expr's can be defective. */
2787
2788 static void
2789 fix_mio_expr (gfc_expr *e)
2790 {
2791 gfc_symtree *ns_st = NULL;
2792 const char *fname;
2793
2794 if (iomode != IO_OUTPUT)
2795 return;
2796
2797 if (e->symtree)
2798 {
2799 /* If this is a symtree for a symbol that came from a contained module
2800 namespace, it has a unique name and we should look in the current
2801 namespace to see if the required, non-contained symbol is available
2802 yet. If so, the latter should be written. */
2803 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
2804 ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2805 e->symtree->n.sym->name);
2806
2807 /* On the other hand, if the existing symbol is the module name or the
2808 new symbol is a dummy argument, do not do the promotion. */
2809 if (ns_st && ns_st->n.sym
2810 && ns_st->n.sym->attr.flavor != FL_MODULE
2811 && !e->symtree->n.sym->attr.dummy)
2812 e->symtree = ns_st;
2813 }
2814 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2815 {
2816 /* In some circumstances, a function used in an initialization
2817 expression, in one use associated module, can fail to be
2818 coupled to its symtree when used in a specification
2819 expression in another module. */
2820 fname = e->value.function.esym ? e->value.function.esym->name
2821 : e->value.function.isym->name;
2822 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2823 }
2824 }
2825
2826
2827 /* Read and write expressions. The form "()" is allowed to indicate a
2828 NULL expression. */
2829
2830 static void
2831 mio_expr (gfc_expr **ep)
2832 {
2833 gfc_expr *e;
2834 atom_type t;
2835 int flag;
2836
2837 mio_lparen ();
2838
2839 if (iomode == IO_OUTPUT)
2840 {
2841 if (*ep == NULL)
2842 {
2843 mio_rparen ();
2844 return;
2845 }
2846
2847 e = *ep;
2848 MIO_NAME (expr_t) (e->expr_type, expr_types);
2849 }
2850 else
2851 {
2852 t = parse_atom ();
2853 if (t == ATOM_RPAREN)
2854 {
2855 *ep = NULL;
2856 return;
2857 }
2858
2859 if (t != ATOM_NAME)
2860 bad_module ("Expected expression type");
2861
2862 e = *ep = gfc_get_expr ();
2863 e->where = gfc_current_locus;
2864 e->expr_type = (expr_t) find_enum (expr_types);
2865 }
2866
2867 mio_typespec (&e->ts);
2868 mio_integer (&e->rank);
2869
2870 fix_mio_expr (e);
2871
2872 switch (e->expr_type)
2873 {
2874 case EXPR_OP:
2875 e->value.op.operator
2876 = MIO_NAME (gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2877
2878 switch (e->value.op.operator)
2879 {
2880 case INTRINSIC_UPLUS:
2881 case INTRINSIC_UMINUS:
2882 case INTRINSIC_NOT:
2883 case INTRINSIC_PARENTHESES:
2884 mio_expr (&e->value.op.op1);
2885 break;
2886
2887 case INTRINSIC_PLUS:
2888 case INTRINSIC_MINUS:
2889 case INTRINSIC_TIMES:
2890 case INTRINSIC_DIVIDE:
2891 case INTRINSIC_POWER:
2892 case INTRINSIC_CONCAT:
2893 case INTRINSIC_AND:
2894 case INTRINSIC_OR:
2895 case INTRINSIC_EQV:
2896 case INTRINSIC_NEQV:
2897 case INTRINSIC_EQ:
2898 case INTRINSIC_EQ_OS:
2899 case INTRINSIC_NE:
2900 case INTRINSIC_NE_OS:
2901 case INTRINSIC_GT:
2902 case INTRINSIC_GT_OS:
2903 case INTRINSIC_GE:
2904 case INTRINSIC_GE_OS:
2905 case INTRINSIC_LT:
2906 case INTRINSIC_LT_OS:
2907 case INTRINSIC_LE:
2908 case INTRINSIC_LE_OS:
2909 mio_expr (&e->value.op.op1);
2910 mio_expr (&e->value.op.op2);
2911 break;
2912
2913 default:
2914 bad_module ("Bad operator");
2915 }
2916
2917 break;
2918
2919 case EXPR_FUNCTION:
2920 mio_symtree_ref (&e->symtree);
2921 mio_actual_arglist (&e->value.function.actual);
2922
2923 if (iomode == IO_OUTPUT)
2924 {
2925 e->value.function.name
2926 = mio_allocated_string (e->value.function.name);
2927 flag = e->value.function.esym != NULL;
2928 mio_integer (&flag);
2929 if (flag)
2930 mio_symbol_ref (&e->value.function.esym);
2931 else
2932 write_atom (ATOM_STRING, e->value.function.isym->name);
2933 }
2934 else
2935 {
2936 require_atom (ATOM_STRING);
2937 e->value.function.name = gfc_get_string (atom_string);
2938 gfc_free (atom_string);
2939
2940 mio_integer (&flag);
2941 if (flag)
2942 mio_symbol_ref (&e->value.function.esym);
2943 else
2944 {
2945 require_atom (ATOM_STRING);
2946 e->value.function.isym = gfc_find_function (atom_string);
2947 gfc_free (atom_string);
2948 }
2949 }
2950
2951 break;
2952
2953 case EXPR_VARIABLE:
2954 mio_symtree_ref (&e->symtree);
2955 mio_ref_list (&e->ref);
2956 break;
2957
2958 case EXPR_SUBSTRING:
2959 e->value.character.string
2960 = CONST_CAST (gfc_char_t *,
2961 mio_allocated_wide_string (e->value.character.string,
2962 e->value.character.length));
2963 mio_ref_list (&e->ref);
2964 break;
2965
2966 case EXPR_STRUCTURE:
2967 case EXPR_ARRAY:
2968 mio_constructor (&e->value.constructor);
2969 mio_shape (&e->shape, e->rank);
2970 break;
2971
2972 case EXPR_CONSTANT:
2973 switch (e->ts.type)
2974 {
2975 case BT_INTEGER:
2976 mio_gmp_integer (&e->value.integer);
2977 break;
2978
2979 case BT_REAL:
2980 gfc_set_model_kind (e->ts.kind);
2981 mio_gmp_real (&e->value.real);
2982 break;
2983
2984 case BT_COMPLEX:
2985 gfc_set_model_kind (e->ts.kind);
2986 mio_gmp_real (&e->value.complex.r);
2987 mio_gmp_real (&e->value.complex.i);
2988 break;
2989
2990 case BT_LOGICAL:
2991 mio_integer (&e->value.logical);
2992 break;
2993
2994 case BT_CHARACTER:
2995 mio_integer (&e->value.character.length);
2996 e->value.character.string
2997 = CONST_CAST (gfc_char_t *,
2998 mio_allocated_wide_string (e->value.character.string,
2999 e->value.character.length));
3000 break;
3001
3002 default:
3003 bad_module ("Bad type in constant expression");
3004 }
3005
3006 break;
3007
3008 case EXPR_NULL:
3009 break;
3010 }
3011
3012 mio_rparen ();
3013 }
3014
3015
3016 /* Read and write namelists. */
3017
3018 static void
3019 mio_namelist (gfc_symbol *sym)
3020 {
3021 gfc_namelist *n, *m;
3022 const char *check_name;
3023
3024 mio_lparen ();
3025
3026 if (iomode == IO_OUTPUT)
3027 {
3028 for (n = sym->namelist; n; n = n->next)
3029 mio_symbol_ref (&n->sym);
3030 }
3031 else
3032 {
3033 /* This departure from the standard is flagged as an error.
3034 It does, in fact, work correctly. TODO: Allow it
3035 conditionally? */
3036 if (sym->attr.flavor == FL_NAMELIST)
3037 {
3038 check_name = find_use_name (sym->name, false);
3039 if (check_name && strcmp (check_name, sym->name) != 0)
3040 gfc_error ("Namelist %s cannot be renamed by USE "
3041 "association to %s", sym->name, check_name);
3042 }
3043
3044 m = NULL;
3045 while (peek_atom () != ATOM_RPAREN)
3046 {
3047 n = gfc_get_namelist ();
3048 mio_symbol_ref (&n->sym);
3049
3050 if (sym->namelist == NULL)
3051 sym->namelist = n;
3052 else
3053 m->next = n;
3054
3055 m = n;
3056 }
3057 sym->namelist_tail = m;
3058 }
3059
3060 mio_rparen ();
3061 }
3062
3063
3064 /* Save/restore lists of gfc_interface stuctures. When loading an
3065 interface, we are really appending to the existing list of
3066 interfaces. Checking for duplicate and ambiguous interfaces has to
3067 be done later when all symbols have been loaded. */
3068
3069 pointer_info *
3070 mio_interface_rest (gfc_interface **ip)
3071 {
3072 gfc_interface *tail, *p;
3073 pointer_info *pi = NULL;
3074
3075 if (iomode == IO_OUTPUT)
3076 {
3077 if (ip != NULL)
3078 for (p = *ip; p; p = p->next)
3079 mio_symbol_ref (&p->sym);
3080 }
3081 else
3082 {
3083 if (*ip == NULL)
3084 tail = NULL;
3085 else
3086 {
3087 tail = *ip;
3088 while (tail->next)
3089 tail = tail->next;
3090 }
3091
3092 for (;;)
3093 {
3094 if (peek_atom () == ATOM_RPAREN)
3095 break;
3096
3097 p = gfc_get_interface ();
3098 p->where = gfc_current_locus;
3099 pi = mio_symbol_ref (&p->sym);
3100
3101 if (tail == NULL)
3102 *ip = p;
3103 else
3104 tail->next = p;
3105
3106 tail = p;
3107 }
3108 }
3109
3110 mio_rparen ();
3111 return pi;
3112 }
3113
3114
3115 /* Save/restore a nameless operator interface. */
3116
3117 static void
3118 mio_interface (gfc_interface **ip)
3119 {
3120 mio_lparen ();
3121 mio_interface_rest (ip);
3122 }
3123
3124
3125 /* Save/restore a named operator interface. */
3126
3127 static void
3128 mio_symbol_interface (const char **name, const char **module,
3129 gfc_interface **ip)
3130 {
3131 mio_lparen ();
3132 mio_pool_string (name);
3133 mio_pool_string (module);
3134 mio_interface_rest (ip);
3135 }
3136
3137
3138 static void
3139 mio_namespace_ref (gfc_namespace **nsp)
3140 {
3141 gfc_namespace *ns;
3142 pointer_info *p;
3143
3144 p = mio_pointer_ref (nsp);
3145
3146 if (p->type == P_UNKNOWN)
3147 p->type = P_NAMESPACE;
3148
3149 if (iomode == IO_INPUT && p->integer != 0)
3150 {
3151 ns = (gfc_namespace *) p->u.pointer;
3152 if (ns == NULL)
3153 {
3154 ns = gfc_get_namespace (NULL, 0);
3155 associate_integer_pointer (p, ns);
3156 }
3157 else
3158 ns->refs++;
3159 }
3160 }
3161
3162
3163 /* Unlike most other routines, the address of the symbol node is already
3164 fixed on input and the name/module has already been filled in. */
3165
3166 static void
3167 mio_symbol (gfc_symbol *sym)
3168 {
3169 int intmod = INTMOD_NONE;
3170
3171 gfc_formal_arglist *formal;
3172
3173 mio_lparen ();
3174
3175 mio_symbol_attribute (&sym->attr);
3176 mio_typespec (&sym->ts);
3177
3178 /* Contained procedures don't have formal namespaces. Instead we output the
3179 procedure namespace. The will contain the formal arguments. */
3180 if (iomode == IO_OUTPUT)
3181 {
3182 formal = sym->formal;
3183 while (formal && !formal->sym)
3184 formal = formal->next;
3185
3186 if (formal)
3187 mio_namespace_ref (&formal->sym->ns);
3188 else
3189 mio_namespace_ref (&sym->formal_ns);
3190 }
3191 else
3192 {
3193 mio_namespace_ref (&sym->formal_ns);
3194 if (sym->formal_ns)
3195 {
3196 sym->formal_ns->proc_name = sym;
3197 sym->refs++;
3198 }
3199 }
3200
3201 /* Save/restore common block links. */
3202 mio_symbol_ref (&sym->common_next);
3203
3204 mio_formal_arglist (sym);
3205
3206 if (sym->attr.flavor == FL_PARAMETER)
3207 mio_expr (&sym->value);
3208
3209 mio_array_spec (&sym->as);
3210
3211 mio_symbol_ref (&sym->result);
3212
3213 if (sym->attr.cray_pointee)
3214 mio_symbol_ref (&sym->cp_pointer);
3215
3216 /* Note that components are always saved, even if they are supposed
3217 to be private. Component access is checked during searching. */
3218
3219 mio_component_list (&sym->components);
3220
3221 if (sym->components != NULL)
3222 sym->component_access
3223 = MIO_NAME (gfc_access) (sym->component_access, access_types);
3224
3225 mio_namelist (sym);
3226
3227 /* Add the fields that say whether this is from an intrinsic module,
3228 and if so, what symbol it is within the module. */
3229 /* mio_integer (&(sym->from_intmod)); */
3230 if (iomode == IO_OUTPUT)
3231 {
3232 intmod = sym->from_intmod;
3233 mio_integer (&intmod);
3234 }
3235 else
3236 {
3237 mio_integer (&intmod);
3238 sym->from_intmod = intmod;
3239 }
3240
3241 mio_integer (&(sym->intmod_sym_id));
3242
3243 mio_rparen ();
3244 }
3245
3246
3247 /************************* Top level subroutines *************************/
3248
3249 /* Given a root symtree node and a symbol, try to find a symtree that
3250 references the symbol that is not a unique name. */
3251
3252 static gfc_symtree *
3253 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3254 {
3255 gfc_symtree *s = NULL;
3256
3257 if (st == NULL)
3258 return s;
3259
3260 s = find_symtree_for_symbol (st->right, sym);
3261 if (s != NULL)
3262 return s;
3263 s = find_symtree_for_symbol (st->left, sym);
3264 if (s != NULL)
3265 return s;
3266
3267 if (st->n.sym == sym && !check_unique_name (st->name))
3268 return st;
3269
3270 return s;
3271 }
3272
3273
3274 /* A recursive function to look for a speficic symbol by name and by
3275 module. Whilst several symtrees might point to one symbol, its
3276 is sufficient for the purposes here than one exist. Note that
3277 generic interfaces are distinguished as are symbols that have been
3278 renamed in another module. */
3279 static gfc_symtree *
3280 find_symbol (gfc_symtree *st, const char *name,
3281 const char *module, int generic)
3282 {
3283 int c;
3284 gfc_symtree *retval, *s;
3285
3286 if (st == NULL || st->n.sym == NULL)
3287 return NULL;
3288
3289 c = strcmp (name, st->n.sym->name);
3290 if (c == 0 && st->n.sym->module
3291 && strcmp (module, st->n.sym->module) == 0
3292 && !check_unique_name (st->name))
3293 {
3294 s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3295
3296 /* Detect symbols that are renamed by use association in another
3297 module by the absence of a symtree and null attr.use_rename,
3298 since the latter is not transmitted in the module file. */
3299 if (((!generic && !st->n.sym->attr.generic)
3300 || (generic && st->n.sym->attr.generic))
3301 && !(s == NULL && !st->n.sym->attr.use_rename))
3302 return st;
3303 }
3304
3305 retval = find_symbol (st->left, name, module, generic);
3306
3307 if (retval == NULL)
3308 retval = find_symbol (st->right, name, module, generic);
3309
3310 return retval;
3311 }
3312
3313
3314 /* Skip a list between balanced left and right parens. */
3315
3316 static void
3317 skip_list (void)
3318 {
3319 int level;
3320
3321 level = 0;
3322 do
3323 {
3324 switch (parse_atom ())
3325 {
3326 case ATOM_LPAREN:
3327 level++;
3328 break;
3329
3330 case ATOM_RPAREN:
3331 level--;
3332 break;
3333
3334 case ATOM_STRING:
3335 gfc_free (atom_string);
3336 break;
3337
3338 case ATOM_NAME:
3339 case ATOM_INTEGER:
3340 break;
3341 }
3342 }
3343 while (level > 0);
3344 }
3345
3346
3347 /* Load operator interfaces from the module. Interfaces are unusual
3348 in that they attach themselves to existing symbols. */
3349
3350 static void
3351 load_operator_interfaces (void)
3352 {
3353 const char *p;
3354 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3355 gfc_user_op *uop;
3356 pointer_info *pi = NULL;
3357 int n, i;
3358
3359 mio_lparen ();
3360
3361 while (peek_atom () != ATOM_RPAREN)
3362 {
3363 mio_lparen ();
3364
3365 mio_internal_string (name);
3366 mio_internal_string (module);
3367
3368 n = number_use_names (name, true);
3369 n = n ? n : 1;
3370
3371 for (i = 1; i <= n; i++)
3372 {
3373 /* Decide if we need to load this one or not. */
3374 p = find_use_name_n (name, &i, true);
3375
3376 if (p == NULL)
3377 {
3378 while (parse_atom () != ATOM_RPAREN);
3379 continue;
3380 }
3381
3382 if (i == 1)
3383 {
3384 uop = gfc_get_uop (p);
3385 pi = mio_interface_rest (&uop->operator);
3386 }
3387 else
3388 {
3389 if (gfc_find_uop (p, NULL))
3390 continue;
3391 uop = gfc_get_uop (p);
3392 uop->operator = gfc_get_interface ();
3393 uop->operator->where = gfc_current_locus;
3394 add_fixup (pi->integer, &uop->operator->sym);
3395 }
3396 }
3397 }
3398
3399 mio_rparen ();
3400 }
3401
3402
3403 /* Load interfaces from the module. Interfaces are unusual in that
3404 they attach themselves to existing symbols. */
3405
3406 static void
3407 load_generic_interfaces (void)
3408 {
3409 const char *p;
3410 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3411 gfc_symbol *sym;
3412 gfc_interface *generic = NULL;
3413 int n, i, renamed;
3414
3415 mio_lparen ();
3416
3417 while (peek_atom () != ATOM_RPAREN)
3418 {
3419 mio_lparen ();
3420
3421 mio_internal_string (name);
3422 mio_internal_string (module);
3423
3424 n = number_use_names (name, false);
3425 renamed = n ? 1 : 0;
3426 n = n ? n : 1;
3427
3428 for (i = 1; i <= n; i++)
3429 {
3430 gfc_symtree *st;
3431 /* Decide if we need to load this one or not. */
3432 p = find_use_name_n (name, &i, false);
3433
3434 st = find_symbol (gfc_current_ns->sym_root,
3435 name, module_name, 1);
3436
3437 if (!p || gfc_find_symbol (p, NULL, 0, &sym))
3438 {
3439 /* Skip the specific names for these cases. */
3440 while (i == 1 && parse_atom () != ATOM_RPAREN);
3441
3442 continue;
3443 }
3444
3445 /* If the symbol exists already and is being USEd without being
3446 in an ONLY clause, do not load a new symtree(11.3.2). */
3447 if (!only_flag && st)
3448 sym = st->n.sym;
3449
3450 if (!sym)
3451 {
3452 /* Make the symbol inaccessible if it has been added by a USE
3453 statement without an ONLY(11.3.2). */
3454 if (st && only_flag
3455 && !st->n.sym->attr.use_only
3456 && !st->n.sym->attr.use_rename
3457 && strcmp (st->n.sym->module, module_name) == 0)
3458 {
3459 sym = st->n.sym;
3460 gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3461 st = gfc_get_unique_symtree (gfc_current_ns);
3462 st->n.sym = sym;
3463 sym = NULL;
3464 }
3465 else if (st)
3466 {
3467 sym = st->n.sym;
3468 if (strcmp (st->name, p) != 0)
3469 {
3470 st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
3471 st->n.sym = sym;
3472 sym->refs++;
3473 }
3474 }
3475
3476 /* Since we haven't found a valid generic interface, we had
3477 better make one. */
3478 if (!sym)
3479 {
3480 gfc_get_symbol (p, NULL, &sym);
3481 sym->name = gfc_get_string (name);
3482 sym->module = gfc_get_string (module_name);
3483 sym->attr.flavor = FL_PROCEDURE;
3484 sym->attr.generic = 1;
3485 sym->attr.use_assoc = 1;
3486 }
3487 }
3488 else
3489 {
3490 /* Unless sym is a generic interface, this reference
3491 is ambiguous. */
3492 if (st == NULL)
3493 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3494
3495 sym = st->n.sym;
3496
3497 if (st && !sym->attr.generic
3498 && sym->module
3499 && strcmp(module, sym->module))
3500 st->ambiguous = 1;
3501 }
3502
3503 sym->attr.use_only = only_flag;
3504 sym->attr.use_rename = renamed;
3505
3506 if (i == 1)
3507 {
3508 mio_interface_rest (&sym->generic);
3509 generic = sym->generic;
3510 }
3511 else if (!sym->generic)
3512 {
3513 sym->generic = generic;
3514 sym->attr.generic_copy = 1;
3515 }
3516 }
3517 }
3518
3519 mio_rparen ();
3520 }
3521
3522
3523 /* Load common blocks. */
3524
3525 static void
3526 load_commons (void)
3527 {
3528 char name[GFC_MAX_SYMBOL_LEN + 1];
3529 gfc_common_head *p;
3530
3531 mio_lparen ();
3532
3533 while (peek_atom () != ATOM_RPAREN)
3534 {
3535 int flags;
3536 mio_lparen ();
3537 mio_internal_string (name);
3538
3539 p = gfc_get_common (name, 1);
3540
3541 mio_symbol_ref (&p->head);
3542 mio_integer (&flags);
3543 if (flags & 1)
3544 p->saved = 1;
3545 if (flags & 2)
3546 p->threadprivate = 1;
3547 p->use_assoc = 1;
3548
3549 /* Get whether this was a bind(c) common or not. */
3550 mio_integer (&p->is_bind_c);
3551 /* Get the binding label. */
3552 mio_internal_string (p->binding_label);
3553
3554 mio_rparen ();
3555 }
3556
3557 mio_rparen ();
3558 }
3559
3560
3561 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
3562 so that unused variables are not loaded and so that the expression can
3563 be safely freed. */
3564
3565 static void
3566 load_equiv (void)
3567 {
3568 gfc_equiv *head, *tail, *end, *eq;
3569 bool unused;
3570
3571 mio_lparen ();
3572 in_load_equiv = true;
3573
3574 end = gfc_current_ns->equiv;
3575 while (end != NULL && end->next != NULL)
3576 end = end->next;
3577
3578 while (peek_atom () != ATOM_RPAREN) {
3579 mio_lparen ();
3580 head = tail = NULL;
3581
3582 while(peek_atom () != ATOM_RPAREN)
3583 {
3584 if (head == NULL)
3585 head = tail = gfc_get_equiv ();
3586 else
3587 {
3588 tail->eq = gfc_get_equiv ();
3589 tail = tail->eq;
3590 }
3591
3592 mio_pool_string (&tail->module);
3593 mio_expr (&tail->expr);
3594 }
3595
3596 /* Unused equivalence members have a unique name. */
3597 unused = true;
3598 for (eq = head; eq; eq = eq->eq)
3599 {
3600 if (!check_unique_name (eq->expr->symtree->name))
3601 {
3602 unused = false;
3603 break;
3604 }
3605 }
3606
3607 if (unused)
3608 {
3609 for (eq = head; eq; eq = head)
3610 {
3611 head = eq->eq;
3612 gfc_free_expr (eq->expr);
3613 gfc_free (eq);
3614 }
3615 }
3616
3617 if (end == NULL)
3618 gfc_current_ns->equiv = head;
3619 else
3620 end->next = head;
3621
3622 if (head != NULL)
3623 end = head;
3624
3625 mio_rparen ();
3626 }
3627
3628 mio_rparen ();
3629 in_load_equiv = false;
3630 }
3631
3632
3633 /* Recursive function to traverse the pointer_info tree and load a
3634 needed symbol. We return nonzero if we load a symbol and stop the
3635 traversal, because the act of loading can alter the tree. */
3636
3637 static int
3638 load_needed (pointer_info *p)
3639 {
3640 gfc_namespace *ns;
3641 pointer_info *q;
3642 gfc_symbol *sym;
3643 int rv;
3644
3645 rv = 0;
3646 if (p == NULL)
3647 return rv;
3648
3649 rv |= load_needed (p->left);
3650 rv |= load_needed (p->right);
3651
3652 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3653 return rv;
3654
3655 p->u.rsym.state = USED;
3656
3657 set_module_locus (&p->u.rsym.where);
3658
3659 sym = p->u.rsym.sym;
3660 if (sym == NULL)
3661 {
3662 q = get_integer (p->u.rsym.ns);
3663
3664 ns = (gfc_namespace *) q->u.pointer;
3665 if (ns == NULL)
3666 {
3667 /* Create an interface namespace if necessary. These are
3668 the namespaces that hold the formal parameters of module
3669 procedures. */
3670
3671 ns = gfc_get_namespace (NULL, 0);
3672 associate_integer_pointer (q, ns);
3673 }
3674
3675 /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
3676 doesn't go pear-shaped if the symbol is used. */
3677 if (!ns->proc_name)
3678 gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
3679 1, &ns->proc_name);
3680
3681 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3682 sym->module = gfc_get_string (p->u.rsym.module);
3683 strcpy (sym->binding_label, p->u.rsym.binding_label);
3684
3685 associate_integer_pointer (p, sym);
3686 }
3687
3688 mio_symbol (sym);
3689 sym->attr.use_assoc = 1;
3690 if (only_flag)
3691 sym->attr.use_only = 1;
3692 if (p->u.rsym.renamed)
3693 sym->attr.use_rename = 1;
3694
3695 return 1;
3696 }
3697
3698
3699 /* Recursive function for cleaning up things after a module has been read. */
3700
3701 static void
3702 read_cleanup (pointer_info *p)
3703 {
3704 gfc_symtree *st;
3705 pointer_info *q;
3706
3707 if (p == NULL)
3708 return;
3709
3710 read_cleanup (p->left);
3711 read_cleanup (p->right);
3712
3713 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3714 {
3715 /* Add hidden symbols to the symtree. */
3716 q = get_integer (p->u.rsym.ns);
3717 st = gfc_get_unique_symtree ((gfc_namespace *) q->u.pointer);
3718
3719 st->n.sym = p->u.rsym.sym;
3720 st->n.sym->refs++;
3721
3722 /* Fixup any symtree references. */
3723 p->u.rsym.symtree = st;
3724 resolve_fixups (p->u.rsym.stfixup, st);
3725 p->u.rsym.stfixup = NULL;
3726 }
3727
3728 /* Free unused symbols. */
3729 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3730 gfc_free_symbol (p->u.rsym.sym);
3731 }
3732
3733
3734 /* Read a module file. */
3735
3736 static void
3737 read_module (void)
3738 {
3739 module_locus operator_interfaces, user_operators;
3740 const char *p;
3741 char name[GFC_MAX_SYMBOL_LEN + 1];
3742 gfc_intrinsic_op i;
3743 int ambiguous, j, nuse, symbol;
3744 pointer_info *info, *q;
3745 gfc_use_rename *u;
3746 gfc_symtree *st;
3747 gfc_symbol *sym;
3748
3749 get_module_locus (&operator_interfaces); /* Skip these for now. */
3750 skip_list ();
3751
3752 get_module_locus (&user_operators);
3753 skip_list ();
3754 skip_list ();
3755
3756 /* Skip commons and equivalences for now. */
3757 skip_list ();
3758 skip_list ();
3759
3760 mio_lparen ();
3761
3762 /* Create the fixup nodes for all the symbols. */
3763
3764 while (peek_atom () != ATOM_RPAREN)
3765 {
3766 require_atom (ATOM_INTEGER);
3767 info = get_integer (atom_int);
3768
3769 info->type = P_SYMBOL;
3770 info->u.rsym.state = UNUSED;
3771
3772 mio_internal_string (info->u.rsym.true_name);
3773 mio_internal_string (info->u.rsym.module);
3774 mio_internal_string (info->u.rsym.binding_label);
3775
3776
3777 require_atom (ATOM_INTEGER);
3778 info->u.rsym.ns = atom_int;
3779
3780 get_module_locus (&info->u.rsym.where);
3781 skip_list ();
3782
3783 /* See if the symbol has already been loaded by a previous module.
3784 If so, we reference the existing symbol and prevent it from
3785 being loaded again. This should not happen if the symbol being
3786 read is an index for an assumed shape dummy array (ns != 1). */
3787
3788 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3789
3790 if (sym == NULL
3791 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
3792 continue;
3793
3794 info->u.rsym.state = USED;
3795 info->u.rsym.sym = sym;
3796
3797 /* Some symbols do not have a namespace (eg. formal arguments),
3798 so the automatic "unique symtree" mechanism must be suppressed
3799 by marking them as referenced. */
3800 q = get_integer (info->u.rsym.ns);
3801 if (q->u.pointer == NULL)
3802 {
3803 info->u.rsym.referenced = 1;
3804 continue;
3805 }
3806
3807 /* If possible recycle the symtree that references the symbol.
3808 If a symtree is not found and the module does not import one,
3809 a unique-name symtree is found by read_cleanup. */
3810 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
3811 if (st != NULL)
3812 {
3813 info->u.rsym.symtree = st;
3814 info->u.rsym.referenced = 1;
3815 }
3816 }
3817
3818 mio_rparen ();
3819
3820 /* Parse the symtree lists. This lets us mark which symbols need to
3821 be loaded. Renaming is also done at this point by replacing the
3822 symtree name. */
3823
3824 mio_lparen ();
3825
3826 while (peek_atom () != ATOM_RPAREN)
3827 {
3828 mio_internal_string (name);
3829 mio_integer (&ambiguous);
3830 mio_integer (&symbol);
3831
3832 info = get_integer (symbol);
3833
3834 /* See how many use names there are. If none, go through the start
3835 of the loop at least once. */
3836 nuse = number_use_names (name, false);
3837 info->u.rsym.renamed = nuse ? 1 : 0;
3838
3839 if (nuse == 0)
3840 nuse = 1;
3841
3842 for (j = 1; j <= nuse; j++)
3843 {
3844 /* Get the jth local name for this symbol. */
3845 p = find_use_name_n (name, &j, false);
3846
3847 if (p == NULL && strcmp (name, module_name) == 0)
3848 p = name;
3849
3850 /* Skip symtree nodes not in an ONLY clause, unless there
3851 is an existing symtree loaded from another USE statement. */
3852 if (p == NULL)
3853 {
3854 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3855 if (st != NULL)
3856 info->u.rsym.symtree = st;
3857 continue;
3858 }
3859
3860 /* If a symbol of the same name and module exists already,
3861 this symbol, which is not in an ONLY clause, must not be
3862 added to the namespace(11.3.2). Note that find_symbol
3863 only returns the first occurrence that it finds. */
3864 if (!only_flag && !info->u.rsym.renamed
3865 && strcmp (name, module_name) != 0
3866 && find_symbol (gfc_current_ns->sym_root, name,
3867 module_name, 0))
3868 continue;
3869
3870 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3871
3872 if (st != NULL)
3873 {
3874 /* Check for ambiguous symbols. */
3875 if (st->n.sym != info->u.rsym.sym)
3876 st->ambiguous = 1;
3877 info->u.rsym.symtree = st;
3878 }
3879 else
3880 {
3881 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3882
3883 /* Delete the symtree if the symbol has been added by a USE
3884 statement without an ONLY(11.3.2). Remember that the rsym
3885 will be the same as the symbol found in the symtree, for
3886 this case.*/
3887 if (st && (only_flag || info->u.rsym.renamed)
3888 && !st->n.sym->attr.use_only
3889 && !st->n.sym->attr.use_rename
3890 && info->u.rsym.sym == st->n.sym)
3891 gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3892
3893 /* Create a symtree node in the current namespace for this
3894 symbol. */
3895 st = check_unique_name (p)
3896 ? gfc_get_unique_symtree (gfc_current_ns)
3897 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
3898 st->ambiguous = ambiguous;
3899
3900 sym = info->u.rsym.sym;
3901
3902 /* Create a symbol node if it doesn't already exist. */
3903 if (sym == NULL)
3904 {
3905 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
3906 gfc_current_ns);
3907 sym = info->u.rsym.sym;
3908 sym->module = gfc_get_string (info->u.rsym.module);
3909
3910 /* TODO: hmm, can we test this? Do we know it will be
3911 initialized to zeros? */
3912 if (info->u.rsym.binding_label[0] != '\0')
3913 strcpy (sym->binding_label, info->u.rsym.binding_label);
3914 }
3915
3916 st->n.sym = sym;
3917 st->n.sym->refs++;
3918
3919 if (strcmp (name, p) != 0)
3920 sym->attr.use_rename = 1;
3921
3922 /* Store the symtree pointing to this symbol. */
3923 info->u.rsym.symtree = st;
3924
3925 if (info->u.rsym.state == UNUSED)
3926 info->u.rsym.state = NEEDED;
3927 info->u.rsym.referenced = 1;
3928 }
3929 }
3930 }
3931
3932 mio_rparen ();
3933
3934 /* Load intrinsic operator interfaces. */
3935 set_module_locus (&operator_interfaces);
3936 mio_lparen ();
3937
3938 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3939 {
3940 if (i == INTRINSIC_USER)
3941 continue;
3942
3943 if (only_flag)
3944 {
3945 u = find_use_operator (i);
3946
3947 if (u == NULL)
3948 {
3949 skip_list ();
3950 continue;
3951 }
3952
3953 u->found = 1;
3954 }
3955
3956 mio_interface (&gfc_current_ns->operator[i]);
3957 }
3958
3959 mio_rparen ();
3960
3961 /* Load generic and user operator interfaces. These must follow the
3962 loading of symtree because otherwise symbols can be marked as
3963 ambiguous. */
3964
3965 set_module_locus (&user_operators);
3966
3967 load_operator_interfaces ();
3968 load_generic_interfaces ();
3969
3970 load_commons ();
3971 load_equiv ();
3972
3973 /* At this point, we read those symbols that are needed but haven't
3974 been loaded yet. If one symbol requires another, the other gets
3975 marked as NEEDED if its previous state was UNUSED. */
3976
3977 while (load_needed (pi_root));
3978
3979 /* Make sure all elements of the rename-list were found in the module. */
3980
3981 for (u = gfc_rename_list; u; u = u->next)
3982 {
3983 if (u->found)
3984 continue;
3985
3986 if (u->operator == INTRINSIC_NONE)
3987 {
3988 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3989 u->use_name, &u->where, module_name);
3990 continue;
3991 }
3992
3993 if (u->operator == INTRINSIC_USER)
3994 {
3995 gfc_error ("User operator '%s' referenced at %L not found "
3996 "in module '%s'", u->use_name, &u->where, module_name);
3997 continue;
3998 }
3999
4000 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4001 "in module '%s'", gfc_op2string (u->operator), &u->where,
4002 module_name);
4003 }
4004
4005 gfc_check_interfaces (gfc_current_ns);
4006
4007 /* Clean up symbol nodes that were never loaded, create references
4008 to hidden symbols. */
4009
4010 read_cleanup (pi_root);
4011 }
4012
4013
4014 /* Given an access type that is specific to an entity and the default
4015 access, return nonzero if the entity is publicly accessible. If the
4016 element is declared as PUBLIC, then it is public; if declared
4017 PRIVATE, then private, and otherwise it is public unless the default
4018 access in this context has been declared PRIVATE. */
4019
4020 bool
4021 gfc_check_access (gfc_access specific_access, gfc_access default_access)
4022 {
4023 if (specific_access == ACCESS_PUBLIC)
4024 return TRUE;
4025 if (specific_access == ACCESS_PRIVATE)
4026 return FALSE;
4027
4028 if (gfc_option.flag_module_private)
4029 return default_access == ACCESS_PUBLIC;
4030 else
4031 return default_access != ACCESS_PRIVATE;
4032 }
4033
4034
4035 /* A structure to remember which commons we've already written. */
4036
4037 struct written_common
4038 {
4039 BBT_HEADER(written_common);
4040 const char *name, *label;
4041 };
4042
4043 static struct written_common *written_commons = NULL;
4044
4045 /* Comparison function used for balancing the binary tree. */
4046
4047 static int
4048 compare_written_commons (void *a1, void *b1)
4049 {
4050 const char *aname = ((struct written_common *) a1)->name;
4051 const char *alabel = ((struct written_common *) a1)->label;
4052 const char *bname = ((struct written_common *) b1)->name;
4053 const char *blabel = ((struct written_common *) b1)->label;
4054 int c = strcmp (aname, bname);
4055
4056 return (c != 0 ? c : strcmp (alabel, blabel));
4057 }
4058
4059 /* Free a list of written commons. */
4060
4061 static void
4062 free_written_common (struct written_common *w)
4063 {
4064 if (!w)
4065 return;
4066
4067 if (w->left)
4068 free_written_common (w->left);
4069 if (w->right)
4070 free_written_common (w->right);
4071
4072 gfc_free (w);
4073 }
4074
4075 /* Write a common block to the module -- recursive helper function. */
4076
4077 static void
4078 write_common_0 (gfc_symtree *st)
4079 {
4080 gfc_common_head *p;
4081 const char * name;
4082 int flags;
4083 const char *label;
4084 struct written_common *w;
4085 bool write_me = true;
4086
4087 if (st == NULL)
4088 return;
4089
4090 write_common_0 (st->left);
4091
4092 /* We will write out the binding label, or the name if no label given. */
4093 name = st->n.common->name;
4094 p = st->n.common;
4095 label = p->is_bind_c ? p->binding_label : p->name;
4096
4097 /* Check if we've already output this common. */
4098 w = written_commons;
4099 while (w)
4100 {
4101 int c = strcmp (name, w->name);
4102 c = (c != 0 ? c : strcmp (label, w->label));
4103 if (c == 0)
4104 write_me = false;
4105
4106 w = (c < 0) ? w->left : w->right;
4107 }
4108
4109 if (write_me)
4110 {
4111 /* Write the common to the module. */
4112 mio_lparen ();
4113 mio_pool_string (&name);
4114
4115 mio_symbol_ref (&p->head);
4116 flags = p->saved ? 1 : 0;
4117 if (p->threadprivate)
4118 flags |= 2;
4119 mio_integer (&flags);
4120
4121 /* Write out whether the common block is bind(c) or not. */
4122 mio_integer (&(p->is_bind_c));
4123
4124 mio_pool_string (&label);
4125 mio_rparen ();
4126
4127 /* Record that we have written this common. */
4128 w = gfc_getmem (sizeof (struct written_common));
4129 w->name = p->name;
4130 w->label = label;
4131 gfc_insert_bbt (&written_commons, w, compare_written_commons);
4132 }
4133
4134 write_common_0 (st->right);
4135 }
4136
4137
4138 /* Write a common, by initializing the list of written commons, calling
4139 the recursive function write_common_0() and cleaning up afterwards. */
4140
4141 static void
4142 write_common (gfc_symtree *st)
4143 {
4144 written_commons = NULL;
4145 write_common_0 (st);
4146 free_written_common (written_commons);
4147 written_commons = NULL;
4148 }
4149
4150
4151 /* Write the blank common block to the module. */
4152
4153 static void
4154 write_blank_common (void)
4155 {
4156 const char * name = BLANK_COMMON_NAME;
4157 int saved;
4158 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
4159 this, but it hasn't been checked. Just making it so for now. */
4160 int is_bind_c = 0;
4161
4162 if (gfc_current_ns->blank_common.head == NULL)
4163 return;
4164
4165 mio_lparen ();
4166
4167 mio_pool_string (&name);
4168
4169 mio_symbol_ref (&gfc_current_ns->blank_common.head);
4170 saved = gfc_current_ns->blank_common.saved;
4171 mio_integer (&saved);
4172
4173 /* Write out whether the common block is bind(c) or not. */
4174 mio_integer (&is_bind_c);
4175
4176 /* Write out the binding label, which is BLANK_COMMON_NAME, though
4177 it doesn't matter because the label isn't used. */
4178 mio_pool_string (&name);
4179
4180 mio_rparen ();
4181 }
4182
4183
4184 /* Write equivalences to the module. */
4185
4186 static void
4187 write_equiv (void)
4188 {
4189 gfc_equiv *eq, *e;
4190 int num;
4191
4192 num = 0;
4193 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
4194 {
4195 mio_lparen ();
4196
4197 for (e = eq; e; e = e->eq)
4198 {
4199 if (e->module == NULL)
4200 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
4201 mio_allocated_string (e->module);
4202 mio_expr (&e->expr);
4203 }
4204
4205 num++;
4206 mio_rparen ();
4207 }
4208 }
4209
4210
4211 /* Write a symbol to the module. */
4212
4213 static void
4214 write_symbol (int n, gfc_symbol *sym)
4215 {
4216 const char *label;
4217
4218 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
4219 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
4220
4221 mio_integer (&n);
4222 mio_pool_string (&sym->name);
4223
4224 mio_pool_string (&sym->module);
4225 if (sym->attr.is_bind_c || sym->attr.is_iso_c)
4226 {
4227 label = sym->binding_label;
4228 mio_pool_string (&label);
4229 }
4230 else
4231 mio_pool_string (&sym->name);
4232
4233 mio_pointer_ref (&sym->ns);
4234
4235 mio_symbol (sym);
4236 write_char ('\n');
4237 }
4238
4239
4240 /* Recursive traversal function to write the initial set of symbols to
4241 the module. We check to see if the symbol should be written
4242 according to the access specification. */
4243
4244 static void
4245 write_symbol0 (gfc_symtree *st)
4246 {
4247 gfc_symbol *sym;
4248 pointer_info *p;
4249 bool dont_write = false;
4250
4251 if (st == NULL)
4252 return;
4253
4254 write_symbol0 (st->left);
4255
4256 sym = st->n.sym;
4257 if (sym->module == NULL)
4258 sym->module = gfc_get_string (module_name);
4259
4260 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4261 && !sym->attr.subroutine && !sym->attr.function)
4262 dont_write = true;
4263
4264 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
4265 dont_write = true;
4266
4267 if (!dont_write)
4268 {
4269 p = get_pointer (sym);
4270 if (p->type == P_UNKNOWN)
4271 p->type = P_SYMBOL;
4272
4273 if (p->u.wsym.state != WRITTEN)
4274 {
4275 write_symbol (p->integer, sym);
4276 p->u.wsym.state = WRITTEN;
4277 }
4278 }
4279
4280 write_symbol0 (st->right);
4281 }
4282
4283
4284 /* Recursive traversal function to write the secondary set of symbols
4285 to the module file. These are symbols that were not public yet are
4286 needed by the public symbols or another dependent symbol. The act
4287 of writing a symbol can modify the pointer_info tree, so we cease
4288 traversal if we find a symbol to write. We return nonzero if a
4289 symbol was written and pass that information upwards. */
4290
4291 static int
4292 write_symbol1 (pointer_info *p)
4293 {
4294 int result;
4295
4296 if (!p)
4297 return 0;
4298
4299 result = write_symbol1 (p->left);
4300
4301 if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
4302 {
4303 p->u.wsym.state = WRITTEN;
4304 write_symbol (p->integer, p->u.wsym.sym);
4305 result = 1;
4306 }
4307
4308 result |= write_symbol1 (p->right);
4309 return result;
4310 }
4311
4312
4313 /* Write operator interfaces associated with a symbol. */
4314
4315 static void
4316 write_operator (gfc_user_op *uop)
4317 {
4318 static char nullstring[] = "";
4319 const char *p = nullstring;
4320
4321 if (uop->operator == NULL
4322 || !gfc_check_access (uop->access, uop->ns->default_access))
4323 return;
4324
4325 mio_symbol_interface (&uop->name, &p, &uop->operator);
4326 }
4327
4328
4329 /* Write generic interfaces from the namespace sym_root. */
4330
4331 static void
4332 write_generic (gfc_symtree *st)
4333 {
4334 gfc_symbol *sym;
4335
4336 if (st == NULL)
4337 return;
4338
4339 write_generic (st->left);
4340 write_generic (st->right);
4341
4342 sym = st->n.sym;
4343 if (!sym || check_unique_name (st->name))
4344 return;
4345
4346 if (sym->generic == NULL
4347 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
4348 return;
4349
4350 if (sym->module == NULL)
4351 sym->module = gfc_get_string (module_name);
4352
4353 mio_symbol_interface (&st->name, &sym->module, &sym->generic);
4354 }
4355
4356
4357 static void
4358 write_symtree (gfc_symtree *st)
4359 {
4360 gfc_symbol *sym;
4361 pointer_info *p;
4362
4363 sym = st->n.sym;
4364 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
4365 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4366 && !sym->attr.subroutine && !sym->attr.function))
4367 return;
4368
4369 if (check_unique_name (st->name))
4370 return;
4371
4372 p = find_pointer (sym);
4373 if (p == NULL)
4374 gfc_internal_error ("write_symtree(): Symbol not written");
4375
4376 mio_pool_string (&st->name);
4377 mio_integer (&st->ambiguous);
4378 mio_integer (&p->integer);
4379 }
4380
4381
4382 static void
4383 write_module (void)
4384 {
4385 gfc_intrinsic_op i;
4386
4387 /* Write the operator interfaces. */
4388 mio_lparen ();
4389
4390 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4391 {
4392 if (i == INTRINSIC_USER)
4393 continue;
4394
4395 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
4396 gfc_current_ns->default_access)
4397 ? &gfc_current_ns->operator[i] : NULL);
4398 }
4399
4400 mio_rparen ();
4401 write_char ('\n');
4402 write_char ('\n');
4403
4404 mio_lparen ();
4405 gfc_traverse_user_op (gfc_current_ns, write_operator);
4406 mio_rparen ();
4407 write_char ('\n');
4408 write_char ('\n');
4409
4410 mio_lparen ();
4411 write_generic (gfc_current_ns->sym_root);
4412 mio_rparen ();
4413 write_char ('\n');
4414 write_char ('\n');
4415
4416 mio_lparen ();
4417 write_blank_common ();
4418 write_common (gfc_current_ns->common_root);
4419 mio_rparen ();
4420 write_char ('\n');
4421 write_char ('\n');
4422
4423 mio_lparen ();
4424 write_equiv ();
4425 mio_rparen ();
4426 write_char ('\n');
4427 write_char ('\n');
4428
4429 /* Write symbol information. First we traverse all symbols in the
4430 primary namespace, writing those that need to be written.
4431 Sometimes writing one symbol will cause another to need to be
4432 written. A list of these symbols ends up on the write stack, and
4433 we end by popping the bottom of the stack and writing the symbol
4434 until the stack is empty. */
4435
4436 mio_lparen ();
4437
4438 write_symbol0 (gfc_current_ns->sym_root);
4439 while (write_symbol1 (pi_root))
4440 /* Nothing. */;
4441
4442 mio_rparen ();
4443
4444 write_char ('\n');
4445 write_char ('\n');
4446
4447 mio_lparen ();
4448 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
4449 mio_rparen ();
4450 }
4451
4452
4453 /* Read a MD5 sum from the header of a module file. If the file cannot
4454 be opened, or we have any other error, we return -1. */
4455
4456 static int
4457 read_md5_from_module_file (const char * filename, unsigned char md5[16])
4458 {
4459 FILE *file;
4460 char buf[1024];
4461 int n;
4462
4463 /* Open the file. */
4464 if ((file = fopen (filename, "r")) == NULL)
4465 return -1;
4466
4467 /* Read two lines. */
4468 if (fgets (buf, sizeof (buf) - 1, file) == NULL
4469 || fgets (buf, sizeof (buf) - 1, file) == NULL)
4470 {
4471 fclose (file);
4472 return -1;
4473 }
4474
4475 /* Close the file. */
4476 fclose (file);
4477
4478 /* If the header is not what we expect, or is too short, bail out. */
4479 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
4480 return -1;
4481
4482 /* Now, we have a real MD5, read it into the array. */
4483 for (n = 0; n < 16; n++)
4484 {
4485 unsigned int x;
4486
4487 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
4488 return -1;
4489
4490 md5[n] = x;
4491 }
4492
4493 return 0;
4494 }
4495
4496
4497 /* Given module, dump it to disk. If there was an error while
4498 processing the module, dump_flag will be set to zero and we delete
4499 the module file, even if it was already there. */
4500
4501 void
4502 gfc_dump_module (const char *name, int dump_flag)
4503 {
4504 int n;
4505 char *filename, *filename_tmp, *p;
4506 time_t now;
4507 fpos_t md5_pos;
4508 unsigned char md5_new[16], md5_old[16];
4509
4510 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
4511 if (gfc_option.module_dir != NULL)
4512 {
4513 n += strlen (gfc_option.module_dir);
4514 filename = (char *) alloca (n);
4515 strcpy (filename, gfc_option.module_dir);
4516 strcat (filename, name);
4517 }
4518 else
4519 {
4520 filename = (char *) alloca (n);
4521 strcpy (filename, name);
4522 }
4523 strcat (filename, MODULE_EXTENSION);
4524
4525 /* Name of the temporary file used to write the module. */
4526 filename_tmp = (char *) alloca (n + 1);
4527 strcpy (filename_tmp, filename);
4528 strcat (filename_tmp, "0");
4529
4530 /* There was an error while processing the module. We delete the
4531 module file, even if it was already there. */
4532 if (!dump_flag)
4533 {
4534 unlink (filename);
4535 return;
4536 }
4537
4538 /* Write the module to the temporary file. */
4539 module_fp = fopen (filename_tmp, "w");
4540 if (module_fp == NULL)
4541 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
4542 filename_tmp, strerror (errno));
4543
4544 /* Write the header, including space reserved for the MD5 sum. */
4545 now = time (NULL);
4546 p = ctime (&now);
4547
4548 *strchr (p, '\n') = '\0';
4549
4550 fprintf (module_fp, "GFORTRAN module created from %s on %s\nMD5:",
4551 gfc_source_file, p);
4552 fgetpos (module_fp, &md5_pos);
4553 fputs ("00000000000000000000000000000000 -- "
4554 "If you edit this, you'll get what you deserve.\n\n", module_fp);
4555
4556 /* Initialize the MD5 context that will be used for output. */
4557 md5_init_ctx (&ctx);
4558
4559 /* Write the module itself. */
4560 iomode = IO_OUTPUT;
4561 strcpy (module_name, name);
4562
4563 init_pi_tree ();
4564
4565 write_module ();
4566
4567 free_pi_tree (pi_root);
4568 pi_root = NULL;
4569
4570 write_char ('\n');
4571
4572 /* Write the MD5 sum to the header of the module file. */
4573 md5_finish_ctx (&ctx, md5_new);
4574 fsetpos (module_fp, &md5_pos);
4575 for (n = 0; n < 16; n++)
4576 fprintf (module_fp, "%02x", md5_new[n]);
4577
4578 if (fclose (module_fp))
4579 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
4580 filename_tmp, strerror (errno));
4581
4582 /* Read the MD5 from the header of the old module file and compare. */
4583 if (read_md5_from_module_file (filename, md5_old) != 0
4584 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
4585 {
4586 /* Module file have changed, replace the old one. */
4587 unlink (filename);
4588 rename (filename_tmp, filename);
4589 }
4590 else
4591 unlink (filename_tmp);
4592 }
4593
4594
4595 static void
4596 sort_iso_c_rename_list (void)
4597 {
4598 gfc_use_rename *tmp_list = NULL;
4599 gfc_use_rename *curr;
4600 gfc_use_rename *kinds_used[ISOCBINDING_NUMBER] = {NULL};
4601 int c_kind;
4602 int i;
4603
4604 for (curr = gfc_rename_list; curr; curr = curr->next)
4605 {
4606 c_kind = get_c_kind (curr->use_name, c_interop_kinds_table);
4607 if (c_kind == ISOCBINDING_INVALID || c_kind == ISOCBINDING_LAST)
4608 {
4609 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4610 "intrinsic module ISO_C_BINDING.", curr->use_name,
4611 &curr->where);
4612 }
4613 else
4614 /* Put it in the list. */
4615 kinds_used[c_kind] = curr;
4616 }
4617
4618 /* Make a new (sorted) rename list. */
4619 i = 0;
4620 while (i < ISOCBINDING_NUMBER && kinds_used[i] == NULL)
4621 i++;
4622
4623 if (i < ISOCBINDING_NUMBER)
4624 {
4625 tmp_list = kinds_used[i];
4626
4627 i++;
4628 curr = tmp_list;
4629 for (; i < ISOCBINDING_NUMBER; i++)
4630 if (kinds_used[i] != NULL)
4631 {
4632 curr->next = kinds_used[i];
4633 curr = curr->next;
4634 curr->next = NULL;
4635 }
4636 }
4637
4638 gfc_rename_list = tmp_list;
4639 }
4640
4641
4642 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
4643 the current namespace for all named constants, pointer types, and
4644 procedures in the module unless the only clause was used or a rename
4645 list was provided. */
4646
4647 static void
4648 import_iso_c_binding_module (void)
4649 {
4650 gfc_symbol *mod_sym = NULL;
4651 gfc_symtree *mod_symtree = NULL;
4652 const char *iso_c_module_name = "__iso_c_binding";
4653 gfc_use_rename *u;
4654 int i;
4655 char *local_name;
4656
4657 /* Look only in the current namespace. */
4658 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
4659
4660 if (mod_symtree == NULL)
4661 {
4662 /* symtree doesn't already exist in current namespace. */
4663 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree);
4664
4665 if (mod_symtree != NULL)
4666 mod_sym = mod_symtree->n.sym;
4667 else
4668 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
4669 "create symbol for %s", iso_c_module_name);
4670
4671 mod_sym->attr.flavor = FL_MODULE;
4672 mod_sym->attr.intrinsic = 1;
4673 mod_sym->module = gfc_get_string (iso_c_module_name);
4674 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
4675 }
4676
4677 /* Generate the symbols for the named constants representing
4678 the kinds for intrinsic data types. */
4679 if (only_flag)
4680 {
4681 /* Sort the rename list because there are dependencies between types
4682 and procedures (e.g., c_loc needs c_ptr). */
4683 sort_iso_c_rename_list ();
4684
4685 for (u = gfc_rename_list; u; u = u->next)
4686 {
4687 i = get_c_kind (u->use_name, c_interop_kinds_table);
4688
4689 if (i == ISOCBINDING_INVALID || i == ISOCBINDING_LAST)
4690 {
4691 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4692 "intrinsic module ISO_C_BINDING.", u->use_name,
4693 &u->where);
4694 continue;
4695 }
4696
4697 generate_isocbinding_symbol (iso_c_module_name, i, u->local_name);
4698 }
4699 }
4700 else
4701 {
4702 for (i = 0; i < ISOCBINDING_NUMBER; i++)
4703 {
4704 local_name = NULL;
4705 for (u = gfc_rename_list; u; u = u->next)
4706 {
4707 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
4708 {
4709 local_name = u->local_name;
4710 u->found = 1;
4711 break;
4712 }
4713 }
4714 generate_isocbinding_symbol (iso_c_module_name, i, local_name);
4715 }
4716
4717 for (u = gfc_rename_list; u; u = u->next)
4718 {
4719 if (u->found)
4720 continue;
4721
4722 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4723 "module ISO_C_BINDING", u->use_name, &u->where);
4724 }
4725 }
4726 }
4727
4728
4729 /* Add an integer named constant from a given module. */
4730
4731 static void
4732 create_int_parameter (const char *name, int value, const char *modname,
4733 intmod_id module, int id)
4734 {
4735 gfc_symtree *tmp_symtree;
4736 gfc_symbol *sym;
4737
4738 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4739 if (tmp_symtree != NULL)
4740 {
4741 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
4742 return;
4743 else
4744 gfc_error ("Symbol '%s' already declared", name);
4745 }
4746
4747 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree);
4748 sym = tmp_symtree->n.sym;
4749
4750 sym->module = gfc_get_string (modname);
4751 sym->attr.flavor = FL_PARAMETER;
4752 sym->ts.type = BT_INTEGER;
4753 sym->ts.kind = gfc_default_integer_kind;
4754 sym->value = gfc_int_expr (value);
4755 sym->attr.use_assoc = 1;
4756 sym->from_intmod = module;
4757 sym->intmod_sym_id = id;
4758 }
4759
4760
4761 /* USE the ISO_FORTRAN_ENV intrinsic module. */
4762
4763 static void
4764 use_iso_fortran_env_module (void)
4765 {
4766 static char mod[] = "iso_fortran_env";
4767 const char *local_name;
4768 gfc_use_rename *u;
4769 gfc_symbol *mod_sym;
4770 gfc_symtree *mod_symtree;
4771 int i;
4772
4773 intmod_sym symbol[] = {
4774 #define NAMED_INTCST(a,b,c) { a, b, 0 },
4775 #include "iso-fortran-env.def"
4776 #undef NAMED_INTCST
4777 { ISOFORTRANENV_INVALID, NULL, -1234 } };
4778
4779 i = 0;
4780 #define NAMED_INTCST(a,b,c) symbol[i++].value = c;
4781 #include "iso-fortran-env.def"
4782 #undef NAMED_INTCST
4783
4784 /* Generate the symbol for the module itself. */
4785 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
4786 if (mod_symtree == NULL)
4787 {
4788 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree);
4789 gcc_assert (mod_symtree);
4790 mod_sym = mod_symtree->n.sym;
4791
4792 mod_sym->attr.flavor = FL_MODULE;
4793 mod_sym->attr.intrinsic = 1;
4794 mod_sym->module = gfc_get_string (mod);
4795 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
4796 }
4797 else
4798 if (!mod_symtree->n.sym->attr.intrinsic)
4799 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
4800 "non-intrinsic module name used previously", mod);
4801
4802 /* Generate the symbols for the module integer named constants. */
4803 if (only_flag)
4804 for (u = gfc_rename_list; u; u = u->next)
4805 {
4806 for (i = 0; symbol[i].name; i++)
4807 if (strcmp (symbol[i].name, u->use_name) == 0)
4808 break;
4809
4810 if (symbol[i].name == NULL)
4811 {
4812 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4813 "intrinsic module ISO_FORTRAN_ENV", u->use_name,
4814 &u->where);
4815 continue;
4816 }
4817
4818 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4819 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4820 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4821 "from intrinsic module ISO_FORTRAN_ENV at %L is "
4822 "incompatible with option %s", &u->where,
4823 gfc_option.flag_default_integer
4824 ? "-fdefault-integer-8" : "-fdefault-real-8");
4825
4826 create_int_parameter (u->local_name[0] ? u->local_name
4827 : symbol[i].name,
4828 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4829 symbol[i].id);
4830 }
4831 else
4832 {
4833 for (i = 0; symbol[i].name; i++)
4834 {
4835 local_name = NULL;
4836 for (u = gfc_rename_list; u; u = u->next)
4837 {
4838 if (strcmp (symbol[i].name, u->use_name) == 0)
4839 {
4840 local_name = u->local_name;
4841 u->found = 1;
4842 break;
4843 }
4844 }
4845
4846 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4847 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4848 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4849 "from intrinsic module ISO_FORTRAN_ENV at %C is "
4850 "incompatible with option %s",
4851 gfc_option.flag_default_integer
4852 ? "-fdefault-integer-8" : "-fdefault-real-8");
4853
4854 create_int_parameter (local_name ? local_name : symbol[i].name,
4855 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4856 symbol[i].id);
4857 }
4858
4859 for (u = gfc_rename_list; u; u = u->next)
4860 {
4861 if (u->found)
4862 continue;
4863
4864 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4865 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
4866 }
4867 }
4868 }
4869
4870
4871 /* Process a USE directive. */
4872
4873 void
4874 gfc_use_module (void)
4875 {
4876 char *filename;
4877 gfc_state_data *p;
4878 int c, line, start;
4879 gfc_symtree *mod_symtree;
4880
4881 filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION)
4882 + 1);
4883 strcpy (filename, module_name);
4884 strcat (filename, MODULE_EXTENSION);
4885
4886 /* First, try to find an non-intrinsic module, unless the USE statement
4887 specified that the module is intrinsic. */
4888 module_fp = NULL;
4889 if (!specified_int)
4890 module_fp = gfc_open_included_file (filename, true, true);
4891
4892 /* Then, see if it's an intrinsic one, unless the USE statement
4893 specified that the module is non-intrinsic. */
4894 if (module_fp == NULL && !specified_nonint)
4895 {
4896 if (strcmp (module_name, "iso_fortran_env") == 0
4897 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
4898 "intrinsic module at %C") != FAILURE)
4899 {
4900 use_iso_fortran_env_module ();
4901 return;
4902 }
4903
4904 if (strcmp (module_name, "iso_c_binding") == 0
4905 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
4906 "ISO_C_BINDING module at %C") != FAILURE)
4907 {
4908 import_iso_c_binding_module();
4909 return;
4910 }
4911
4912 module_fp = gfc_open_intrinsic_module (filename);
4913
4914 if (module_fp == NULL && specified_int)
4915 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
4916 module_name);
4917 }
4918
4919 if (module_fp == NULL)
4920 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
4921 filename, strerror (errno));
4922
4923 /* Check that we haven't already USEd an intrinsic module with the
4924 same name. */
4925
4926 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
4927 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
4928 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
4929 "intrinsic module name used previously", module_name);
4930
4931 iomode = IO_INPUT;
4932 module_line = 1;
4933 module_column = 1;
4934 start = 0;
4935
4936 /* Skip the first two lines of the module, after checking that this is
4937 a gfortran module file. */
4938 line = 0;
4939 while (line < 2)
4940 {
4941 c = module_char ();
4942 if (c == EOF)
4943 bad_module ("Unexpected end of module");
4944 if (start++ < 2)
4945 parse_name (c);
4946 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
4947 || (start == 2 && strcmp (atom_name, " module") != 0))
4948 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
4949 "file", filename);
4950
4951 if (c == '\n')
4952 line++;
4953 }
4954
4955 /* Make sure we're not reading the same module that we may be building. */
4956 for (p = gfc_state_stack; p; p = p->previous)
4957 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
4958 gfc_fatal_error ("Can't USE the same module we're building!");
4959
4960 init_pi_tree ();
4961 init_true_name_tree ();
4962
4963 read_module ();
4964
4965 free_true_name (true_name_root);
4966 true_name_root = NULL;
4967
4968 free_pi_tree (pi_root);
4969 pi_root = NULL;
4970
4971 fclose (module_fp);
4972 }
4973
4974
4975 void
4976 gfc_module_init_2 (void)
4977 {
4978 last_atom = ATOM_LPAREN;
4979 }
4980
4981
4982 void
4983 gfc_module_done_2 (void)
4984 {
4985 free_rename ();
4986 }