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