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