]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/fortran/module.c
arith.c: Change copyright header to refer to version 3 of the GNU General Public...
[thirdparty/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 /* Return a symtree node with a name that is guaranteed to be unique
1826 within the namespace and corresponds to an illegal fortran name. */
1827
1828 static gfc_symtree *
1829 get_unique_symtree (gfc_namespace *ns)
1830 {
1831 char name[GFC_MAX_SYMBOL_LEN + 1];
1832 static int serial = 0;
1833
1834 sprintf (name, "@%d", serial++);
1835 return gfc_new_symtree (&ns->sym_root, name);
1836 }
1837
1838
1839 /* See if a name is a generated name. */
1840
1841 static int
1842 check_unique_name (const char *name)
1843 {
1844 return *name == '@';
1845 }
1846
1847
1848 static void
1849 mio_typespec (gfc_typespec *ts)
1850 {
1851 mio_lparen ();
1852
1853 ts->type = MIO_NAME (bt) (ts->type, bt_types);
1854
1855 if (ts->type != BT_DERIVED)
1856 mio_integer (&ts->kind);
1857 else
1858 mio_symbol_ref (&ts->derived);
1859
1860 /* Add info for C interop and is_iso_c. */
1861 mio_integer (&ts->is_c_interop);
1862 mio_integer (&ts->is_iso_c);
1863
1864 /* If the typespec is for an identifier either from iso_c_binding, or
1865 a constant that was initialized to an identifier from it, use the
1866 f90_type. Otherwise, use the ts->type, since it shouldn't matter. */
1867 if (ts->is_iso_c)
1868 ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
1869 else
1870 ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
1871
1872 if (ts->type != BT_CHARACTER)
1873 {
1874 /* ts->cl is only valid for BT_CHARACTER. */
1875 mio_lparen ();
1876 mio_rparen ();
1877 }
1878 else
1879 mio_charlen (&ts->cl);
1880
1881 mio_rparen ();
1882 }
1883
1884
1885 static const mstring array_spec_types[] = {
1886 minit ("EXPLICIT", AS_EXPLICIT),
1887 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1888 minit ("DEFERRED", AS_DEFERRED),
1889 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1890 minit (NULL, -1)
1891 };
1892
1893
1894 static void
1895 mio_array_spec (gfc_array_spec **asp)
1896 {
1897 gfc_array_spec *as;
1898 int i;
1899
1900 mio_lparen ();
1901
1902 if (iomode == IO_OUTPUT)
1903 {
1904 if (*asp == NULL)
1905 goto done;
1906 as = *asp;
1907 }
1908 else
1909 {
1910 if (peek_atom () == ATOM_RPAREN)
1911 {
1912 *asp = NULL;
1913 goto done;
1914 }
1915
1916 *asp = as = gfc_get_array_spec ();
1917 }
1918
1919 mio_integer (&as->rank);
1920 as->type = MIO_NAME (array_type) (as->type, array_spec_types);
1921
1922 for (i = 0; i < as->rank; i++)
1923 {
1924 mio_expr (&as->lower[i]);
1925 mio_expr (&as->upper[i]);
1926 }
1927
1928 done:
1929 mio_rparen ();
1930 }
1931
1932
1933 /* Given a pointer to an array reference structure (which lives in a
1934 gfc_ref structure), find the corresponding array specification
1935 structure. Storing the pointer in the ref structure doesn't quite
1936 work when loading from a module. Generating code for an array
1937 reference also needs more information than just the array spec. */
1938
1939 static const mstring array_ref_types[] = {
1940 minit ("FULL", AR_FULL),
1941 minit ("ELEMENT", AR_ELEMENT),
1942 minit ("SECTION", AR_SECTION),
1943 minit (NULL, -1)
1944 };
1945
1946
1947 static void
1948 mio_array_ref (gfc_array_ref *ar)
1949 {
1950 int i;
1951
1952 mio_lparen ();
1953 ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
1954 mio_integer (&ar->dimen);
1955
1956 switch (ar->type)
1957 {
1958 case AR_FULL:
1959 break;
1960
1961 case AR_ELEMENT:
1962 for (i = 0; i < ar->dimen; i++)
1963 mio_expr (&ar->start[i]);
1964
1965 break;
1966
1967 case AR_SECTION:
1968 for (i = 0; i < ar->dimen; i++)
1969 {
1970 mio_expr (&ar->start[i]);
1971 mio_expr (&ar->end[i]);
1972 mio_expr (&ar->stride[i]);
1973 }
1974
1975 break;
1976
1977 case AR_UNKNOWN:
1978 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1979 }
1980
1981 /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
1982 we can't call mio_integer directly. Instead loop over each element
1983 and cast it to/from an integer. */
1984 if (iomode == IO_OUTPUT)
1985 {
1986 for (i = 0; i < ar->dimen; i++)
1987 {
1988 int tmp = (int)ar->dimen_type[i];
1989 write_atom (ATOM_INTEGER, &tmp);
1990 }
1991 }
1992 else
1993 {
1994 for (i = 0; i < ar->dimen; i++)
1995 {
1996 require_atom (ATOM_INTEGER);
1997 ar->dimen_type[i] = atom_int;
1998 }
1999 }
2000
2001 if (iomode == IO_INPUT)
2002 {
2003 ar->where = gfc_current_locus;
2004
2005 for (i = 0; i < ar->dimen; i++)
2006 ar->c_where[i] = gfc_current_locus;
2007 }
2008
2009 mio_rparen ();
2010 }
2011
2012
2013 /* Saves or restores a pointer. The pointer is converted back and
2014 forth from an integer. We return the pointer_info pointer so that
2015 the caller can take additional action based on the pointer type. */
2016
2017 static pointer_info *
2018 mio_pointer_ref (void *gp)
2019 {
2020 pointer_info *p;
2021
2022 if (iomode == IO_OUTPUT)
2023 {
2024 p = get_pointer (*((char **) gp));
2025 write_atom (ATOM_INTEGER, &p->integer);
2026 }
2027 else
2028 {
2029 require_atom (ATOM_INTEGER);
2030 p = add_fixup (atom_int, gp);
2031 }
2032
2033 return p;
2034 }
2035
2036
2037 /* Save and load references to components that occur within
2038 expressions. We have to describe these references by a number and
2039 by name. The number is necessary for forward references during
2040 reading, and the name is necessary if the symbol already exists in
2041 the namespace and is not loaded again. */
2042
2043 static void
2044 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2045 {
2046 char name[GFC_MAX_SYMBOL_LEN + 1];
2047 gfc_component *q;
2048 pointer_info *p;
2049
2050 p = mio_pointer_ref (cp);
2051 if (p->type == P_UNKNOWN)
2052 p->type = P_COMPONENT;
2053
2054 if (iomode == IO_OUTPUT)
2055 mio_pool_string (&(*cp)->name);
2056 else
2057 {
2058 mio_internal_string (name);
2059
2060 /* It can happen that a component reference can be read before the
2061 associated derived type symbol has been loaded. Return now and
2062 wait for a later iteration of load_needed. */
2063 if (sym == NULL)
2064 return;
2065
2066 if (sym->components != NULL && p->u.pointer == NULL)
2067 {
2068 /* Symbol already loaded, so search by name. */
2069 for (q = sym->components; q; q = q->next)
2070 if (strcmp (q->name, name) == 0)
2071 break;
2072
2073 if (q == NULL)
2074 gfc_internal_error ("mio_component_ref(): Component not found");
2075
2076 associate_integer_pointer (p, q);
2077 }
2078
2079 /* Make sure this symbol will eventually be loaded. */
2080 p = find_pointer2 (sym);
2081 if (p->u.rsym.state == UNUSED)
2082 p->u.rsym.state = NEEDED;
2083 }
2084 }
2085
2086
2087 static void
2088 mio_component (gfc_component *c)
2089 {
2090 pointer_info *p;
2091 int n;
2092
2093 mio_lparen ();
2094
2095 if (iomode == IO_OUTPUT)
2096 {
2097 p = get_pointer (c);
2098 mio_integer (&p->integer);
2099 }
2100 else
2101 {
2102 mio_integer (&n);
2103 p = get_integer (n);
2104 associate_integer_pointer (p, c);
2105 }
2106
2107 if (p->type == P_UNKNOWN)
2108 p->type = P_COMPONENT;
2109
2110 mio_pool_string (&c->name);
2111 mio_typespec (&c->ts);
2112 mio_array_spec (&c->as);
2113
2114 mio_integer (&c->dimension);
2115 mio_integer (&c->pointer);
2116 mio_integer (&c->allocatable);
2117 c->access = MIO_NAME (gfc_access) (c->access, access_types);
2118
2119 mio_expr (&c->initializer);
2120 mio_rparen ();
2121 }
2122
2123
2124 static void
2125 mio_component_list (gfc_component **cp)
2126 {
2127 gfc_component *c, *tail;
2128
2129 mio_lparen ();
2130
2131 if (iomode == IO_OUTPUT)
2132 {
2133 for (c = *cp; c; c = c->next)
2134 mio_component (c);
2135 }
2136 else
2137 {
2138 *cp = NULL;
2139 tail = NULL;
2140
2141 for (;;)
2142 {
2143 if (peek_atom () == ATOM_RPAREN)
2144 break;
2145
2146 c = gfc_get_component ();
2147 mio_component (c);
2148
2149 if (tail == NULL)
2150 *cp = c;
2151 else
2152 tail->next = c;
2153
2154 tail = c;
2155 }
2156 }
2157
2158 mio_rparen ();
2159 }
2160
2161
2162 static void
2163 mio_actual_arg (gfc_actual_arglist *a)
2164 {
2165 mio_lparen ();
2166 mio_pool_string (&a->name);
2167 mio_expr (&a->expr);
2168 mio_rparen ();
2169 }
2170
2171
2172 static void
2173 mio_actual_arglist (gfc_actual_arglist **ap)
2174 {
2175 gfc_actual_arglist *a, *tail;
2176
2177 mio_lparen ();
2178
2179 if (iomode == IO_OUTPUT)
2180 {
2181 for (a = *ap; a; a = a->next)
2182 mio_actual_arg (a);
2183
2184 }
2185 else
2186 {
2187 tail = NULL;
2188
2189 for (;;)
2190 {
2191 if (peek_atom () != ATOM_LPAREN)
2192 break;
2193
2194 a = gfc_get_actual_arglist ();
2195
2196 if (tail == NULL)
2197 *ap = a;
2198 else
2199 tail->next = a;
2200
2201 tail = a;
2202 mio_actual_arg (a);
2203 }
2204 }
2205
2206 mio_rparen ();
2207 }
2208
2209
2210 /* Read and write formal argument lists. */
2211
2212 static void
2213 mio_formal_arglist (gfc_symbol *sym)
2214 {
2215 gfc_formal_arglist *f, *tail;
2216
2217 mio_lparen ();
2218
2219 if (iomode == IO_OUTPUT)
2220 {
2221 for (f = sym->formal; f; f = f->next)
2222 mio_symbol_ref (&f->sym);
2223 }
2224 else
2225 {
2226 sym->formal = tail = NULL;
2227
2228 while (peek_atom () != ATOM_RPAREN)
2229 {
2230 f = gfc_get_formal_arglist ();
2231 mio_symbol_ref (&f->sym);
2232
2233 if (sym->formal == NULL)
2234 sym->formal = f;
2235 else
2236 tail->next = f;
2237
2238 tail = f;
2239 }
2240 }
2241
2242 mio_rparen ();
2243 }
2244
2245
2246 /* Save or restore a reference to a symbol node. */
2247
2248 void
2249 mio_symbol_ref (gfc_symbol **symp)
2250 {
2251 pointer_info *p;
2252
2253 p = mio_pointer_ref (symp);
2254 if (p->type == P_UNKNOWN)
2255 p->type = P_SYMBOL;
2256
2257 if (iomode == IO_OUTPUT)
2258 {
2259 if (p->u.wsym.state == UNREFERENCED)
2260 p->u.wsym.state = NEEDS_WRITE;
2261 }
2262 else
2263 {
2264 if (p->u.rsym.state == UNUSED)
2265 p->u.rsym.state = NEEDED;
2266 }
2267 }
2268
2269
2270 /* Save or restore a reference to a symtree node. */
2271
2272 static void
2273 mio_symtree_ref (gfc_symtree **stp)
2274 {
2275 pointer_info *p;
2276 fixup_t *f;
2277
2278 if (iomode == IO_OUTPUT)
2279 mio_symbol_ref (&(*stp)->n.sym);
2280 else
2281 {
2282 require_atom (ATOM_INTEGER);
2283 p = get_integer (atom_int);
2284
2285 /* An unused equivalence member; make a symbol and a symtree
2286 for it. */
2287 if (in_load_equiv && p->u.rsym.symtree == NULL)
2288 {
2289 /* Since this is not used, it must have a unique name. */
2290 p->u.rsym.symtree = get_unique_symtree (gfc_current_ns);
2291
2292 /* Make the symbol. */
2293 if (p->u.rsym.sym == NULL)
2294 {
2295 p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2296 gfc_current_ns);
2297 p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2298 }
2299
2300 p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2301 p->u.rsym.symtree->n.sym->refs++;
2302 p->u.rsym.referenced = 1;
2303 }
2304
2305 if (p->type == P_UNKNOWN)
2306 p->type = P_SYMBOL;
2307
2308 if (p->u.rsym.state == UNUSED)
2309 p->u.rsym.state = NEEDED;
2310
2311 if (p->u.rsym.symtree != NULL)
2312 {
2313 *stp = p->u.rsym.symtree;
2314 }
2315 else
2316 {
2317 f = gfc_getmem (sizeof (fixup_t));
2318
2319 f->next = p->u.rsym.stfixup;
2320 p->u.rsym.stfixup = f;
2321
2322 f->pointer = (void **) stp;
2323 }
2324 }
2325 }
2326
2327
2328 static void
2329 mio_iterator (gfc_iterator **ip)
2330 {
2331 gfc_iterator *iter;
2332
2333 mio_lparen ();
2334
2335 if (iomode == IO_OUTPUT)
2336 {
2337 if (*ip == NULL)
2338 goto done;
2339 }
2340 else
2341 {
2342 if (peek_atom () == ATOM_RPAREN)
2343 {
2344 *ip = NULL;
2345 goto done;
2346 }
2347
2348 *ip = gfc_get_iterator ();
2349 }
2350
2351 iter = *ip;
2352
2353 mio_expr (&iter->var);
2354 mio_expr (&iter->start);
2355 mio_expr (&iter->end);
2356 mio_expr (&iter->step);
2357
2358 done:
2359 mio_rparen ();
2360 }
2361
2362
2363 static void
2364 mio_constructor (gfc_constructor **cp)
2365 {
2366 gfc_constructor *c, *tail;
2367
2368 mio_lparen ();
2369
2370 if (iomode == IO_OUTPUT)
2371 {
2372 for (c = *cp; c; c = c->next)
2373 {
2374 mio_lparen ();
2375 mio_expr (&c->expr);
2376 mio_iterator (&c->iterator);
2377 mio_rparen ();
2378 }
2379 }
2380 else
2381 {
2382 *cp = NULL;
2383 tail = NULL;
2384
2385 while (peek_atom () != ATOM_RPAREN)
2386 {
2387 c = gfc_get_constructor ();
2388
2389 if (tail == NULL)
2390 *cp = c;
2391 else
2392 tail->next = c;
2393
2394 tail = c;
2395
2396 mio_lparen ();
2397 mio_expr (&c->expr);
2398 mio_iterator (&c->iterator);
2399 mio_rparen ();
2400 }
2401 }
2402
2403 mio_rparen ();
2404 }
2405
2406
2407 static const mstring ref_types[] = {
2408 minit ("ARRAY", REF_ARRAY),
2409 minit ("COMPONENT", REF_COMPONENT),
2410 minit ("SUBSTRING", REF_SUBSTRING),
2411 minit (NULL, -1)
2412 };
2413
2414
2415 static void
2416 mio_ref (gfc_ref **rp)
2417 {
2418 gfc_ref *r;
2419
2420 mio_lparen ();
2421
2422 r = *rp;
2423 r->type = MIO_NAME (ref_type) (r->type, ref_types);
2424
2425 switch (r->type)
2426 {
2427 case REF_ARRAY:
2428 mio_array_ref (&r->u.ar);
2429 break;
2430
2431 case REF_COMPONENT:
2432 mio_symbol_ref (&r->u.c.sym);
2433 mio_component_ref (&r->u.c.component, r->u.c.sym);
2434 break;
2435
2436 case REF_SUBSTRING:
2437 mio_expr (&r->u.ss.start);
2438 mio_expr (&r->u.ss.end);
2439 mio_charlen (&r->u.ss.length);
2440 break;
2441 }
2442
2443 mio_rparen ();
2444 }
2445
2446
2447 static void
2448 mio_ref_list (gfc_ref **rp)
2449 {
2450 gfc_ref *ref, *head, *tail;
2451
2452 mio_lparen ();
2453
2454 if (iomode == IO_OUTPUT)
2455 {
2456 for (ref = *rp; ref; ref = ref->next)
2457 mio_ref (&ref);
2458 }
2459 else
2460 {
2461 head = tail = NULL;
2462
2463 while (peek_atom () != ATOM_RPAREN)
2464 {
2465 if (head == NULL)
2466 head = tail = gfc_get_ref ();
2467 else
2468 {
2469 tail->next = gfc_get_ref ();
2470 tail = tail->next;
2471 }
2472
2473 mio_ref (&tail);
2474 }
2475
2476 *rp = head;
2477 }
2478
2479 mio_rparen ();
2480 }
2481
2482
2483 /* Read and write an integer value. */
2484
2485 static void
2486 mio_gmp_integer (mpz_t *integer)
2487 {
2488 char *p;
2489
2490 if (iomode == IO_INPUT)
2491 {
2492 if (parse_atom () != ATOM_STRING)
2493 bad_module ("Expected integer string");
2494
2495 mpz_init (*integer);
2496 if (mpz_set_str (*integer, atom_string, 10))
2497 bad_module ("Error converting integer");
2498
2499 gfc_free (atom_string);
2500 }
2501 else
2502 {
2503 p = mpz_get_str (NULL, 10, *integer);
2504 write_atom (ATOM_STRING, p);
2505 gfc_free (p);
2506 }
2507 }
2508
2509
2510 static void
2511 mio_gmp_real (mpfr_t *real)
2512 {
2513 mp_exp_t exponent;
2514 char *p;
2515
2516 if (iomode == IO_INPUT)
2517 {
2518 if (parse_atom () != ATOM_STRING)
2519 bad_module ("Expected real string");
2520
2521 mpfr_init (*real);
2522 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2523 gfc_free (atom_string);
2524 }
2525 else
2526 {
2527 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2528 atom_string = gfc_getmem (strlen (p) + 20);
2529
2530 sprintf (atom_string, "0.%s@%ld", p, exponent);
2531
2532 /* Fix negative numbers. */
2533 if (atom_string[2] == '-')
2534 {
2535 atom_string[0] = '-';
2536 atom_string[1] = '0';
2537 atom_string[2] = '.';
2538 }
2539
2540 write_atom (ATOM_STRING, atom_string);
2541
2542 gfc_free (atom_string);
2543 gfc_free (p);
2544 }
2545 }
2546
2547
2548 /* Save and restore the shape of an array constructor. */
2549
2550 static void
2551 mio_shape (mpz_t **pshape, int rank)
2552 {
2553 mpz_t *shape;
2554 atom_type t;
2555 int n;
2556
2557 /* A NULL shape is represented by (). */
2558 mio_lparen ();
2559
2560 if (iomode == IO_OUTPUT)
2561 {
2562 shape = *pshape;
2563 if (!shape)
2564 {
2565 mio_rparen ();
2566 return;
2567 }
2568 }
2569 else
2570 {
2571 t = peek_atom ();
2572 if (t == ATOM_RPAREN)
2573 {
2574 *pshape = NULL;
2575 mio_rparen ();
2576 return;
2577 }
2578
2579 shape = gfc_get_shape (rank);
2580 *pshape = shape;
2581 }
2582
2583 for (n = 0; n < rank; n++)
2584 mio_gmp_integer (&shape[n]);
2585
2586 mio_rparen ();
2587 }
2588
2589
2590 static const mstring expr_types[] = {
2591 minit ("OP", EXPR_OP),
2592 minit ("FUNCTION", EXPR_FUNCTION),
2593 minit ("CONSTANT", EXPR_CONSTANT),
2594 minit ("VARIABLE", EXPR_VARIABLE),
2595 minit ("SUBSTRING", EXPR_SUBSTRING),
2596 minit ("STRUCTURE", EXPR_STRUCTURE),
2597 minit ("ARRAY", EXPR_ARRAY),
2598 minit ("NULL", EXPR_NULL),
2599 minit (NULL, -1)
2600 };
2601
2602 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2603 generic operators, not in expressions. INTRINSIC_USER is also
2604 replaced by the correct function name by the time we see it. */
2605
2606 static const mstring intrinsics[] =
2607 {
2608 minit ("UPLUS", INTRINSIC_UPLUS),
2609 minit ("UMINUS", INTRINSIC_UMINUS),
2610 minit ("PLUS", INTRINSIC_PLUS),
2611 minit ("MINUS", INTRINSIC_MINUS),
2612 minit ("TIMES", INTRINSIC_TIMES),
2613 minit ("DIVIDE", INTRINSIC_DIVIDE),
2614 minit ("POWER", INTRINSIC_POWER),
2615 minit ("CONCAT", INTRINSIC_CONCAT),
2616 minit ("AND", INTRINSIC_AND),
2617 minit ("OR", INTRINSIC_OR),
2618 minit ("EQV", INTRINSIC_EQV),
2619 minit ("NEQV", INTRINSIC_NEQV),
2620 minit ("==", INTRINSIC_EQ),
2621 minit ("EQ", INTRINSIC_EQ_OS),
2622 minit ("/=", INTRINSIC_NE),
2623 minit ("NE", INTRINSIC_NE_OS),
2624 minit (">", INTRINSIC_GT),
2625 minit ("GT", INTRINSIC_GT_OS),
2626 minit (">=", INTRINSIC_GE),
2627 minit ("GE", INTRINSIC_GE_OS),
2628 minit ("<", INTRINSIC_LT),
2629 minit ("LT", INTRINSIC_LT_OS),
2630 minit ("<=", INTRINSIC_LE),
2631 minit ("LE", INTRINSIC_LE_OS),
2632 minit ("NOT", INTRINSIC_NOT),
2633 minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2634 minit (NULL, -1)
2635 };
2636
2637
2638 /* Remedy a couple of situations where the gfc_expr's can be defective. */
2639
2640 static void
2641 fix_mio_expr (gfc_expr *e)
2642 {
2643 gfc_symtree *ns_st = NULL;
2644 const char *fname;
2645
2646 if (iomode != IO_OUTPUT)
2647 return;
2648
2649 if (e->symtree)
2650 {
2651 /* If this is a symtree for a symbol that came from a contained module
2652 namespace, it has a unique name and we should look in the current
2653 namespace to see if the required, non-contained symbol is available
2654 yet. If so, the latter should be written. */
2655 if (e->symtree->n.sym && check_unique_name (e->symtree->name))
2656 ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2657 e->symtree->n.sym->name);
2658
2659 /* On the other hand, if the existing symbol is the module name or the
2660 new symbol is a dummy argument, do not do the promotion. */
2661 if (ns_st && ns_st->n.sym
2662 && ns_st->n.sym->attr.flavor != FL_MODULE
2663 && !e->symtree->n.sym->attr.dummy)
2664 e->symtree = ns_st;
2665 }
2666 else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2667 {
2668 /* In some circumstances, a function used in an initialization
2669 expression, in one use associated module, can fail to be
2670 coupled to its symtree when used in a specification
2671 expression in another module. */
2672 fname = e->value.function.esym ? e->value.function.esym->name
2673 : e->value.function.isym->name;
2674 e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2675 }
2676 }
2677
2678
2679 /* Read and write expressions. The form "()" is allowed to indicate a
2680 NULL expression. */
2681
2682 static void
2683 mio_expr (gfc_expr **ep)
2684 {
2685 gfc_expr *e;
2686 atom_type t;
2687 int flag;
2688
2689 mio_lparen ();
2690
2691 if (iomode == IO_OUTPUT)
2692 {
2693 if (*ep == NULL)
2694 {
2695 mio_rparen ();
2696 return;
2697 }
2698
2699 e = *ep;
2700 MIO_NAME (expr_t) (e->expr_type, expr_types);
2701 }
2702 else
2703 {
2704 t = parse_atom ();
2705 if (t == ATOM_RPAREN)
2706 {
2707 *ep = NULL;
2708 return;
2709 }
2710
2711 if (t != ATOM_NAME)
2712 bad_module ("Expected expression type");
2713
2714 e = *ep = gfc_get_expr ();
2715 e->where = gfc_current_locus;
2716 e->expr_type = (expr_t) find_enum (expr_types);
2717 }
2718
2719 mio_typespec (&e->ts);
2720 mio_integer (&e->rank);
2721
2722 fix_mio_expr (e);
2723
2724 switch (e->expr_type)
2725 {
2726 case EXPR_OP:
2727 e->value.op.operator
2728 = MIO_NAME (gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2729
2730 switch (e->value.op.operator)
2731 {
2732 case INTRINSIC_UPLUS:
2733 case INTRINSIC_UMINUS:
2734 case INTRINSIC_NOT:
2735 case INTRINSIC_PARENTHESES:
2736 mio_expr (&e->value.op.op1);
2737 break;
2738
2739 case INTRINSIC_PLUS:
2740 case INTRINSIC_MINUS:
2741 case INTRINSIC_TIMES:
2742 case INTRINSIC_DIVIDE:
2743 case INTRINSIC_POWER:
2744 case INTRINSIC_CONCAT:
2745 case INTRINSIC_AND:
2746 case INTRINSIC_OR:
2747 case INTRINSIC_EQV:
2748 case INTRINSIC_NEQV:
2749 case INTRINSIC_EQ:
2750 case INTRINSIC_EQ_OS:
2751 case INTRINSIC_NE:
2752 case INTRINSIC_NE_OS:
2753 case INTRINSIC_GT:
2754 case INTRINSIC_GT_OS:
2755 case INTRINSIC_GE:
2756 case INTRINSIC_GE_OS:
2757 case INTRINSIC_LT:
2758 case INTRINSIC_LT_OS:
2759 case INTRINSIC_LE:
2760 case INTRINSIC_LE_OS:
2761 mio_expr (&e->value.op.op1);
2762 mio_expr (&e->value.op.op2);
2763 break;
2764
2765 default:
2766 bad_module ("Bad operator");
2767 }
2768
2769 break;
2770
2771 case EXPR_FUNCTION:
2772 mio_symtree_ref (&e->symtree);
2773 mio_actual_arglist (&e->value.function.actual);
2774
2775 if (iomode == IO_OUTPUT)
2776 {
2777 e->value.function.name
2778 = mio_allocated_string (e->value.function.name);
2779 flag = e->value.function.esym != NULL;
2780 mio_integer (&flag);
2781 if (flag)
2782 mio_symbol_ref (&e->value.function.esym);
2783 else
2784 write_atom (ATOM_STRING, e->value.function.isym->name);
2785 }
2786 else
2787 {
2788 require_atom (ATOM_STRING);
2789 e->value.function.name = gfc_get_string (atom_string);
2790 gfc_free (atom_string);
2791
2792 mio_integer (&flag);
2793 if (flag)
2794 mio_symbol_ref (&e->value.function.esym);
2795 else
2796 {
2797 require_atom (ATOM_STRING);
2798 e->value.function.isym = gfc_find_function (atom_string);
2799 gfc_free (atom_string);
2800 }
2801 }
2802
2803 break;
2804
2805 case EXPR_VARIABLE:
2806 mio_symtree_ref (&e->symtree);
2807 mio_ref_list (&e->ref);
2808 break;
2809
2810 case EXPR_SUBSTRING:
2811 e->value.character.string
2812 = (char *) mio_allocated_string (e->value.character.string);
2813 mio_ref_list (&e->ref);
2814 break;
2815
2816 case EXPR_STRUCTURE:
2817 case EXPR_ARRAY:
2818 mio_constructor (&e->value.constructor);
2819 mio_shape (&e->shape, e->rank);
2820 break;
2821
2822 case EXPR_CONSTANT:
2823 switch (e->ts.type)
2824 {
2825 case BT_INTEGER:
2826 mio_gmp_integer (&e->value.integer);
2827 break;
2828
2829 case BT_REAL:
2830 gfc_set_model_kind (e->ts.kind);
2831 mio_gmp_real (&e->value.real);
2832 break;
2833
2834 case BT_COMPLEX:
2835 gfc_set_model_kind (e->ts.kind);
2836 mio_gmp_real (&e->value.complex.r);
2837 mio_gmp_real (&e->value.complex.i);
2838 break;
2839
2840 case BT_LOGICAL:
2841 mio_integer (&e->value.logical);
2842 break;
2843
2844 case BT_CHARACTER:
2845 mio_integer (&e->value.character.length);
2846 e->value.character.string
2847 = (char *) mio_allocated_string (e->value.character.string);
2848 break;
2849
2850 default:
2851 bad_module ("Bad type in constant expression");
2852 }
2853
2854 break;
2855
2856 case EXPR_NULL:
2857 break;
2858 }
2859
2860 mio_rparen ();
2861 }
2862
2863
2864 /* Read and write namelists. */
2865
2866 static void
2867 mio_namelist (gfc_symbol *sym)
2868 {
2869 gfc_namelist *n, *m;
2870 const char *check_name;
2871
2872 mio_lparen ();
2873
2874 if (iomode == IO_OUTPUT)
2875 {
2876 for (n = sym->namelist; n; n = n->next)
2877 mio_symbol_ref (&n->sym);
2878 }
2879 else
2880 {
2881 /* This departure from the standard is flagged as an error.
2882 It does, in fact, work correctly. TODO: Allow it
2883 conditionally? */
2884 if (sym->attr.flavor == FL_NAMELIST)
2885 {
2886 check_name = find_use_name (sym->name);
2887 if (check_name && strcmp (check_name, sym->name) != 0)
2888 gfc_error ("Namelist %s cannot be renamed by USE "
2889 "association to %s", sym->name, check_name);
2890 }
2891
2892 m = NULL;
2893 while (peek_atom () != ATOM_RPAREN)
2894 {
2895 n = gfc_get_namelist ();
2896 mio_symbol_ref (&n->sym);
2897
2898 if (sym->namelist == NULL)
2899 sym->namelist = n;
2900 else
2901 m->next = n;
2902
2903 m = n;
2904 }
2905 sym->namelist_tail = m;
2906 }
2907
2908 mio_rparen ();
2909 }
2910
2911
2912 /* Save/restore lists of gfc_interface stuctures. When loading an
2913 interface, we are really appending to the existing list of
2914 interfaces. Checking for duplicate and ambiguous interfaces has to
2915 be done later when all symbols have been loaded. */
2916
2917 static void
2918 mio_interface_rest (gfc_interface **ip)
2919 {
2920 gfc_interface *tail, *p;
2921
2922 if (iomode == IO_OUTPUT)
2923 {
2924 if (ip != NULL)
2925 for (p = *ip; p; p = p->next)
2926 mio_symbol_ref (&p->sym);
2927 }
2928 else
2929 {
2930 if (*ip == NULL)
2931 tail = NULL;
2932 else
2933 {
2934 tail = *ip;
2935 while (tail->next)
2936 tail = tail->next;
2937 }
2938
2939 for (;;)
2940 {
2941 if (peek_atom () == ATOM_RPAREN)
2942 break;
2943
2944 p = gfc_get_interface ();
2945 p->where = gfc_current_locus;
2946 mio_symbol_ref (&p->sym);
2947
2948 if (tail == NULL)
2949 *ip = p;
2950 else
2951 tail->next = p;
2952
2953 tail = p;
2954 }
2955 }
2956
2957 mio_rparen ();
2958 }
2959
2960
2961 /* Save/restore a nameless operator interface. */
2962
2963 static void
2964 mio_interface (gfc_interface **ip)
2965 {
2966 mio_lparen ();
2967 mio_interface_rest (ip);
2968 }
2969
2970
2971 /* Save/restore a named operator interface. */
2972
2973 static void
2974 mio_symbol_interface (const char **name, const char **module,
2975 gfc_interface **ip)
2976 {
2977 mio_lparen ();
2978 mio_pool_string (name);
2979 mio_pool_string (module);
2980 mio_interface_rest (ip);
2981 }
2982
2983
2984 static void
2985 mio_namespace_ref (gfc_namespace **nsp)
2986 {
2987 gfc_namespace *ns;
2988 pointer_info *p;
2989
2990 p = mio_pointer_ref (nsp);
2991
2992 if (p->type == P_UNKNOWN)
2993 p->type = P_NAMESPACE;
2994
2995 if (iomode == IO_INPUT && p->integer != 0)
2996 {
2997 ns = (gfc_namespace *) p->u.pointer;
2998 if (ns == NULL)
2999 {
3000 ns = gfc_get_namespace (NULL, 0);
3001 associate_integer_pointer (p, ns);
3002 }
3003 else
3004 ns->refs++;
3005 }
3006 }
3007
3008
3009 /* Unlike most other routines, the address of the symbol node is already
3010 fixed on input and the name/module has already been filled in. */
3011
3012 static void
3013 mio_symbol (gfc_symbol *sym)
3014 {
3015 int intmod = INTMOD_NONE;
3016
3017 gfc_formal_arglist *formal;
3018
3019 mio_lparen ();
3020
3021 mio_symbol_attribute (&sym->attr);
3022 mio_typespec (&sym->ts);
3023
3024 /* Contained procedures don't have formal namespaces. Instead we output the
3025 procedure namespace. The will contain the formal arguments. */
3026 if (iomode == IO_OUTPUT)
3027 {
3028 formal = sym->formal;
3029 while (formal && !formal->sym)
3030 formal = formal->next;
3031
3032 if (formal)
3033 mio_namespace_ref (&formal->sym->ns);
3034 else
3035 mio_namespace_ref (&sym->formal_ns);
3036 }
3037 else
3038 {
3039 mio_namespace_ref (&sym->formal_ns);
3040 if (sym->formal_ns)
3041 {
3042 sym->formal_ns->proc_name = sym;
3043 sym->refs++;
3044 }
3045 }
3046
3047 /* Save/restore common block links. */
3048 mio_symbol_ref (&sym->common_next);
3049
3050 mio_formal_arglist (sym);
3051
3052 if (sym->attr.flavor == FL_PARAMETER)
3053 mio_expr (&sym->value);
3054
3055 mio_array_spec (&sym->as);
3056
3057 mio_symbol_ref (&sym->result);
3058
3059 if (sym->attr.cray_pointee)
3060 mio_symbol_ref (&sym->cp_pointer);
3061
3062 /* Note that components are always saved, even if they are supposed
3063 to be private. Component access is checked during searching. */
3064
3065 mio_component_list (&sym->components);
3066
3067 if (sym->components != NULL)
3068 sym->component_access
3069 = MIO_NAME (gfc_access) (sym->component_access, access_types);
3070
3071 mio_namelist (sym);
3072
3073 /* Add the fields that say whether this is from an intrinsic module,
3074 and if so, what symbol it is within the module. */
3075 /* mio_integer (&(sym->from_intmod)); */
3076 if (iomode == IO_OUTPUT)
3077 {
3078 intmod = sym->from_intmod;
3079 mio_integer (&intmod);
3080 }
3081 else
3082 {
3083 mio_integer (&intmod);
3084 sym->from_intmod = intmod;
3085 }
3086
3087 mio_integer (&(sym->intmod_sym_id));
3088
3089 mio_rparen ();
3090 }
3091
3092
3093 /************************* Top level subroutines *************************/
3094
3095 /* Skip a list between balanced left and right parens. */
3096
3097 static void
3098 skip_list (void)
3099 {
3100 int level;
3101
3102 level = 0;
3103 do
3104 {
3105 switch (parse_atom ())
3106 {
3107 case ATOM_LPAREN:
3108 level++;
3109 break;
3110
3111 case ATOM_RPAREN:
3112 level--;
3113 break;
3114
3115 case ATOM_STRING:
3116 gfc_free (atom_string);
3117 break;
3118
3119 case ATOM_NAME:
3120 case ATOM_INTEGER:
3121 break;
3122 }
3123 }
3124 while (level > 0);
3125 }
3126
3127
3128 /* Load operator interfaces from the module. Interfaces are unusual
3129 in that they attach themselves to existing symbols. */
3130
3131 static void
3132 load_operator_interfaces (void)
3133 {
3134 const char *p;
3135 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3136 gfc_user_op *uop;
3137
3138 mio_lparen ();
3139
3140 while (peek_atom () != ATOM_RPAREN)
3141 {
3142 mio_lparen ();
3143
3144 mio_internal_string (name);
3145 mio_internal_string (module);
3146
3147 /* Decide if we need to load this one or not. */
3148 p = find_use_name (name);
3149 if (p == NULL)
3150 {
3151 while (parse_atom () != ATOM_RPAREN);
3152 }
3153 else
3154 {
3155 uop = gfc_get_uop (p);
3156 mio_interface_rest (&uop->operator);
3157 }
3158 }
3159
3160 mio_rparen ();
3161 }
3162
3163
3164 /* Load interfaces from the module. Interfaces are unusual in that
3165 they attach themselves to existing symbols. */
3166
3167 static void
3168 load_generic_interfaces (void)
3169 {
3170 const char *p;
3171 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3172 gfc_symbol *sym;
3173 gfc_interface *generic = NULL;
3174 int n, i;
3175
3176 mio_lparen ();
3177
3178 while (peek_atom () != ATOM_RPAREN)
3179 {
3180 mio_lparen ();
3181
3182 mio_internal_string (name);
3183 mio_internal_string (module);
3184
3185 n = number_use_names (name);
3186 n = n ? n : 1;
3187
3188 for (i = 1; i <= n; i++)
3189 {
3190 /* Decide if we need to load this one or not. */
3191 p = find_use_name_n (name, &i);
3192
3193 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
3194 {
3195 while (parse_atom () != ATOM_RPAREN);
3196 continue;
3197 }
3198
3199 if (sym == NULL)
3200 {
3201 gfc_get_symbol (p, NULL, &sym);
3202
3203 sym->attr.flavor = FL_PROCEDURE;
3204 sym->attr.generic = 1;
3205 sym->attr.use_assoc = 1;
3206 }
3207 else
3208 {
3209 /* Unless sym is a generic interface, this reference
3210 is ambiguous. */
3211 gfc_symtree *st;
3212 p = p ? p : name;
3213 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3214 if (!sym->attr.generic
3215 && sym->module != NULL
3216 && strcmp(module, sym->module) != 0)
3217 st->ambiguous = 1;
3218 }
3219 if (i == 1)
3220 {
3221 mio_interface_rest (&sym->generic);
3222 generic = sym->generic;
3223 }
3224 else
3225 {
3226 sym->generic = generic;
3227 sym->attr.generic_copy = 1;
3228 }
3229 }
3230 }
3231
3232 mio_rparen ();
3233 }
3234
3235
3236 /* Load common blocks. */
3237
3238 static void
3239 load_commons (void)
3240 {
3241 char name[GFC_MAX_SYMBOL_LEN + 1];
3242 gfc_common_head *p;
3243
3244 mio_lparen ();
3245
3246 while (peek_atom () != ATOM_RPAREN)
3247 {
3248 int flags;
3249 mio_lparen ();
3250 mio_internal_string (name);
3251
3252 p = gfc_get_common (name, 1);
3253
3254 mio_symbol_ref (&p->head);
3255 mio_integer (&flags);
3256 if (flags & 1)
3257 p->saved = 1;
3258 if (flags & 2)
3259 p->threadprivate = 1;
3260 p->use_assoc = 1;
3261
3262 /* Get whether this was a bind(c) common or not. */
3263 mio_integer (&p->is_bind_c);
3264 /* Get the binding label. */
3265 mio_internal_string (p->binding_label);
3266
3267 mio_rparen ();
3268 }
3269
3270 mio_rparen ();
3271 }
3272
3273
3274 /* Load equivalences. The flag in_load_equiv informs mio_expr_ref of this
3275 so that unused variables are not loaded and so that the expression can
3276 be safely freed. */
3277
3278 static void
3279 load_equiv (void)
3280 {
3281 gfc_equiv *head, *tail, *end, *eq;
3282 bool unused;
3283
3284 mio_lparen ();
3285 in_load_equiv = true;
3286
3287 end = gfc_current_ns->equiv;
3288 while (end != NULL && end->next != NULL)
3289 end = end->next;
3290
3291 while (peek_atom () != ATOM_RPAREN) {
3292 mio_lparen ();
3293 head = tail = NULL;
3294
3295 while(peek_atom () != ATOM_RPAREN)
3296 {
3297 if (head == NULL)
3298 head = tail = gfc_get_equiv ();
3299 else
3300 {
3301 tail->eq = gfc_get_equiv ();
3302 tail = tail->eq;
3303 }
3304
3305 mio_pool_string (&tail->module);
3306 mio_expr (&tail->expr);
3307 }
3308
3309 /* Unused equivalence members have a unique name. */
3310 unused = true;
3311 for (eq = head; eq; eq = eq->eq)
3312 {
3313 if (!check_unique_name (eq->expr->symtree->name))
3314 {
3315 unused = false;
3316 break;
3317 }
3318 }
3319
3320 if (unused)
3321 {
3322 for (eq = head; eq; eq = head)
3323 {
3324 head = eq->eq;
3325 gfc_free_expr (eq->expr);
3326 gfc_free (eq);
3327 }
3328 }
3329
3330 if (end == NULL)
3331 gfc_current_ns->equiv = head;
3332 else
3333 end->next = head;
3334
3335 if (head != NULL)
3336 end = head;
3337
3338 mio_rparen ();
3339 }
3340
3341 mio_rparen ();
3342 in_load_equiv = false;
3343 }
3344
3345
3346 /* Recursive function to traverse the pointer_info tree and load a
3347 needed symbol. We return nonzero if we load a symbol and stop the
3348 traversal, because the act of loading can alter the tree. */
3349
3350 static int
3351 load_needed (pointer_info *p)
3352 {
3353 gfc_namespace *ns;
3354 pointer_info *q;
3355 gfc_symbol *sym;
3356 int rv;
3357
3358 rv = 0;
3359 if (p == NULL)
3360 return rv;
3361
3362 rv |= load_needed (p->left);
3363 rv |= load_needed (p->right);
3364
3365 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3366 return rv;
3367
3368 p->u.rsym.state = USED;
3369
3370 set_module_locus (&p->u.rsym.where);
3371
3372 sym = p->u.rsym.sym;
3373 if (sym == NULL)
3374 {
3375 q = get_integer (p->u.rsym.ns);
3376
3377 ns = (gfc_namespace *) q->u.pointer;
3378 if (ns == NULL)
3379 {
3380 /* Create an interface namespace if necessary. These are
3381 the namespaces that hold the formal parameters of module
3382 procedures. */
3383
3384 ns = gfc_get_namespace (NULL, 0);
3385 associate_integer_pointer (q, ns);
3386 }
3387
3388 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3389 sym->module = gfc_get_string (p->u.rsym.module);
3390
3391 associate_integer_pointer (p, sym);
3392 }
3393
3394 mio_symbol (sym);
3395 sym->attr.use_assoc = 1;
3396 if (only_flag)
3397 sym->attr.use_only = 1;
3398
3399 return 1;
3400 }
3401
3402
3403 /* Recursive function for cleaning up things after a module has been read. */
3404
3405 static void
3406 read_cleanup (pointer_info *p)
3407 {
3408 gfc_symtree *st;
3409 pointer_info *q;
3410
3411 if (p == NULL)
3412 return;
3413
3414 read_cleanup (p->left);
3415 read_cleanup (p->right);
3416
3417 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3418 {
3419 /* Add hidden symbols to the symtree. */
3420 q = get_integer (p->u.rsym.ns);
3421 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3422
3423 st->n.sym = p->u.rsym.sym;
3424 st->n.sym->refs++;
3425
3426 /* Fixup any symtree references. */
3427 p->u.rsym.symtree = st;
3428 resolve_fixups (p->u.rsym.stfixup, st);
3429 p->u.rsym.stfixup = NULL;
3430 }
3431
3432 /* Free unused symbols. */
3433 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3434 gfc_free_symbol (p->u.rsym.sym);
3435 }
3436
3437
3438 /* Given a root symtree node and a symbol, try to find a symtree that
3439 references the symbol that is not a unique name. */
3440
3441 static gfc_symtree *
3442 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3443 {
3444 gfc_symtree *s = NULL;
3445
3446 if (st == NULL)
3447 return s;
3448
3449 s = find_symtree_for_symbol (st->right, sym);
3450 if (s != NULL)
3451 return s;
3452 s = find_symtree_for_symbol (st->left, sym);
3453 if (s != NULL)
3454 return s;
3455
3456 if (st->n.sym == sym && !check_unique_name (st->name))
3457 return st;
3458
3459 return s;
3460 }
3461
3462
3463 /* Read a module file. */
3464
3465 static void
3466 read_module (void)
3467 {
3468 module_locus operator_interfaces, user_operators;
3469 const char *p;
3470 char name[GFC_MAX_SYMBOL_LEN + 1];
3471 gfc_intrinsic_op i;
3472 int ambiguous, j, nuse, symbol;
3473 pointer_info *info, *q;
3474 gfc_use_rename *u;
3475 gfc_symtree *st;
3476 gfc_symbol *sym;
3477
3478 get_module_locus (&operator_interfaces); /* Skip these for now. */
3479 skip_list ();
3480
3481 get_module_locus (&user_operators);
3482 skip_list ();
3483 skip_list ();
3484
3485 /* Skip commons and equivalences for now. */
3486 skip_list ();
3487 skip_list ();
3488
3489 mio_lparen ();
3490
3491 /* Create the fixup nodes for all the symbols. */
3492
3493 while (peek_atom () != ATOM_RPAREN)
3494 {
3495 require_atom (ATOM_INTEGER);
3496 info = get_integer (atom_int);
3497
3498 info->type = P_SYMBOL;
3499 info->u.rsym.state = UNUSED;
3500
3501 mio_internal_string (info->u.rsym.true_name);
3502 mio_internal_string (info->u.rsym.module);
3503 mio_internal_string (info->u.rsym.binding_label);
3504
3505
3506 require_atom (ATOM_INTEGER);
3507 info->u.rsym.ns = atom_int;
3508
3509 get_module_locus (&info->u.rsym.where);
3510 skip_list ();
3511
3512 /* See if the symbol has already been loaded by a previous module.
3513 If so, we reference the existing symbol and prevent it from
3514 being loaded again. This should not happen if the symbol being
3515 read is an index for an assumed shape dummy array (ns != 1). */
3516
3517 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3518
3519 if (sym == NULL
3520 || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
3521 continue;
3522
3523 info->u.rsym.state = USED;
3524 info->u.rsym.sym = sym;
3525
3526 /* Some symbols do not have a namespace (eg. formal arguments),
3527 so the automatic "unique symtree" mechanism must be suppressed
3528 by marking them as referenced. */
3529 q = get_integer (info->u.rsym.ns);
3530 if (q->u.pointer == NULL)
3531 {
3532 info->u.rsym.referenced = 1;
3533 continue;
3534 }
3535
3536 /* If possible recycle the symtree that references the symbol.
3537 If a symtree is not found and the module does not import one,
3538 a unique-name symtree is found by read_cleanup. */
3539 st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
3540 if (st != NULL)
3541 {
3542 info->u.rsym.symtree = st;
3543 info->u.rsym.referenced = 1;
3544 }
3545 }
3546
3547 mio_rparen ();
3548
3549 /* Parse the symtree lists. This lets us mark which symbols need to
3550 be loaded. Renaming is also done at this point by replacing the
3551 symtree name. */
3552
3553 mio_lparen ();
3554
3555 while (peek_atom () != ATOM_RPAREN)
3556 {
3557 mio_internal_string (name);
3558 mio_integer (&ambiguous);
3559 mio_integer (&symbol);
3560
3561 info = get_integer (symbol);
3562
3563 /* See how many use names there are. If none, go through the start
3564 of the loop at least once. */
3565 nuse = number_use_names (name);
3566 if (nuse == 0)
3567 nuse = 1;
3568
3569 for (j = 1; j <= nuse; j++)
3570 {
3571 /* Get the jth local name for this symbol. */
3572 p = find_use_name_n (name, &j);
3573
3574 if (p == NULL && strcmp (name, module_name) == 0)
3575 p = name;
3576
3577 /* Skip symtree nodes not in an ONLY clause, unless there
3578 is an existing symtree loaded from another USE statement. */
3579 if (p == NULL)
3580 {
3581 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3582 if (st != NULL)
3583 info->u.rsym.symtree = st;
3584 continue;
3585 }
3586
3587 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3588
3589 if (st != NULL)
3590 {
3591 /* Check for ambiguous symbols. */
3592 if (st->n.sym != info->u.rsym.sym)
3593 st->ambiguous = 1;
3594 info->u.rsym.symtree = st;
3595 }
3596 else
3597 {
3598 /* Create a symtree node in the current namespace for this
3599 symbol. */
3600 st = check_unique_name (p)
3601 ? get_unique_symtree (gfc_current_ns)
3602 : gfc_new_symtree (&gfc_current_ns->sym_root, p);
3603
3604 st->ambiguous = ambiguous;
3605
3606 sym = info->u.rsym.sym;
3607
3608 /* Create a symbol node if it doesn't already exist. */
3609 if (sym == NULL)
3610 {
3611 info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
3612 gfc_current_ns);
3613 sym = info->u.rsym.sym;
3614 sym->module = gfc_get_string (info->u.rsym.module);
3615
3616 /* TODO: hmm, can we test this? Do we know it will be
3617 initialized to zeros? */
3618 if (info->u.rsym.binding_label[0] != '\0')
3619 strcpy (sym->binding_label, info->u.rsym.binding_label);
3620 }
3621
3622 st->n.sym = sym;
3623 st->n.sym->refs++;
3624
3625 /* Store the symtree pointing to this symbol. */
3626 info->u.rsym.symtree = st;
3627
3628 if (info->u.rsym.state == UNUSED)
3629 info->u.rsym.state = NEEDED;
3630 info->u.rsym.referenced = 1;
3631 }
3632 }
3633 }
3634
3635 mio_rparen ();
3636
3637 /* Load intrinsic operator interfaces. */
3638 set_module_locus (&operator_interfaces);
3639 mio_lparen ();
3640
3641 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3642 {
3643 if (i == INTRINSIC_USER)
3644 continue;
3645
3646 if (only_flag)
3647 {
3648 u = find_use_operator (i);
3649
3650 if (u == NULL)
3651 {
3652 skip_list ();
3653 continue;
3654 }
3655
3656 u->found = 1;
3657 }
3658
3659 mio_interface (&gfc_current_ns->operator[i]);
3660 }
3661
3662 mio_rparen ();
3663
3664 /* Load generic and user operator interfaces. These must follow the
3665 loading of symtree because otherwise symbols can be marked as
3666 ambiguous. */
3667
3668 set_module_locus (&user_operators);
3669
3670 load_operator_interfaces ();
3671 load_generic_interfaces ();
3672
3673 load_commons ();
3674 load_equiv ();
3675
3676 /* At this point, we read those symbols that are needed but haven't
3677 been loaded yet. If one symbol requires another, the other gets
3678 marked as NEEDED if its previous state was UNUSED. */
3679
3680 while (load_needed (pi_root));
3681
3682 /* Make sure all elements of the rename-list were found in the module. */
3683
3684 for (u = gfc_rename_list; u; u = u->next)
3685 {
3686 if (u->found)
3687 continue;
3688
3689 if (u->operator == INTRINSIC_NONE)
3690 {
3691 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3692 u->use_name, &u->where, module_name);
3693 continue;
3694 }
3695
3696 if (u->operator == INTRINSIC_USER)
3697 {
3698 gfc_error ("User operator '%s' referenced at %L not found "
3699 "in module '%s'", u->use_name, &u->where, module_name);
3700 continue;
3701 }
3702
3703 gfc_error ("Intrinsic operator '%s' referenced at %L not found "
3704 "in module '%s'", gfc_op2string (u->operator), &u->where,
3705 module_name);
3706 }
3707
3708 gfc_check_interfaces (gfc_current_ns);
3709
3710 /* Clean up symbol nodes that were never loaded, create references
3711 to hidden symbols. */
3712
3713 read_cleanup (pi_root);
3714 }
3715
3716
3717 /* Given an access type that is specific to an entity and the default
3718 access, return nonzero if the entity is publicly accessible. If the
3719 element is declared as PUBLIC, then it is public; if declared
3720 PRIVATE, then private, and otherwise it is public unless the default
3721 access in this context has been declared PRIVATE. */
3722
3723 bool
3724 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3725 {
3726 if (specific_access == ACCESS_PUBLIC)
3727 return TRUE;
3728 if (specific_access == ACCESS_PRIVATE)
3729 return FALSE;
3730
3731 return default_access != ACCESS_PRIVATE;
3732 }
3733
3734
3735 /* Write a common block to the module. */
3736
3737 static void
3738 write_common (gfc_symtree *st)
3739 {
3740 gfc_common_head *p;
3741 const char * name;
3742 int flags;
3743 const char *label;
3744
3745 if (st == NULL)
3746 return;
3747
3748 write_common (st->left);
3749 write_common (st->right);
3750
3751 mio_lparen ();
3752
3753 /* Write the unmangled name. */
3754 name = st->n.common->name;
3755
3756 mio_pool_string (&name);
3757
3758 p = st->n.common;
3759 mio_symbol_ref (&p->head);
3760 flags = p->saved ? 1 : 0;
3761 if (p->threadprivate) flags |= 2;
3762 mio_integer (&flags);
3763
3764 /* Write out whether the common block is bind(c) or not. */
3765 mio_integer (&(p->is_bind_c));
3766
3767 /* Write out the binding label, or the com name if no label given. */
3768 if (p->is_bind_c)
3769 {
3770 label = p->binding_label;
3771 mio_pool_string (&label);
3772 }
3773 else
3774 {
3775 label = p->name;
3776 mio_pool_string (&label);
3777 }
3778
3779 mio_rparen ();
3780 }
3781
3782
3783 /* Write the blank common block to the module. */
3784
3785 static void
3786 write_blank_common (void)
3787 {
3788 const char * name = BLANK_COMMON_NAME;
3789 int saved;
3790 /* TODO: Blank commons are not bind(c). The F2003 standard probably says
3791 this, but it hasn't been checked. Just making it so for now. */
3792 int is_bind_c = 0;
3793
3794 if (gfc_current_ns->blank_common.head == NULL)
3795 return;
3796
3797 mio_lparen ();
3798
3799 mio_pool_string (&name);
3800
3801 mio_symbol_ref (&gfc_current_ns->blank_common.head);
3802 saved = gfc_current_ns->blank_common.saved;
3803 mio_integer (&saved);
3804
3805 /* Write out whether the common block is bind(c) or not. */
3806 mio_integer (&is_bind_c);
3807
3808 /* Write out the binding label, which is BLANK_COMMON_NAME, though
3809 it doesn't matter because the label isn't used. */
3810 mio_pool_string (&name);
3811
3812 mio_rparen ();
3813 }
3814
3815
3816 /* Write equivalences to the module. */
3817
3818 static void
3819 write_equiv (void)
3820 {
3821 gfc_equiv *eq, *e;
3822 int num;
3823
3824 num = 0;
3825 for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
3826 {
3827 mio_lparen ();
3828
3829 for (e = eq; e; e = e->eq)
3830 {
3831 if (e->module == NULL)
3832 e->module = gfc_get_string ("%s.eq.%d", module_name, num);
3833 mio_allocated_string (e->module);
3834 mio_expr (&e->expr);
3835 }
3836
3837 num++;
3838 mio_rparen ();
3839 }
3840 }
3841
3842
3843 /* Write a symbol to the module. */
3844
3845 static void
3846 write_symbol (int n, gfc_symbol *sym)
3847 {
3848 const char *label;
3849
3850 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3851 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3852
3853 mio_integer (&n);
3854 mio_pool_string (&sym->name);
3855
3856 mio_pool_string (&sym->module);
3857 if (sym->attr.is_bind_c || sym->attr.is_iso_c)
3858 {
3859 label = sym->binding_label;
3860 mio_pool_string (&label);
3861 }
3862 else
3863 mio_pool_string (&sym->name);
3864
3865 mio_pointer_ref (&sym->ns);
3866
3867 mio_symbol (sym);
3868 write_char ('\n');
3869 }
3870
3871
3872 /* Recursive traversal function to write the initial set of symbols to
3873 the module. We check to see if the symbol should be written
3874 according to the access specification. */
3875
3876 static void
3877 write_symbol0 (gfc_symtree *st)
3878 {
3879 gfc_symbol *sym;
3880 pointer_info *p;
3881
3882 if (st == NULL)
3883 return;
3884
3885 write_symbol0 (st->left);
3886 write_symbol0 (st->right);
3887
3888 sym = st->n.sym;
3889 if (sym->module == NULL)
3890 sym->module = gfc_get_string (module_name);
3891
3892 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3893 && !sym->attr.subroutine && !sym->attr.function)
3894 return;
3895
3896 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3897 return;
3898
3899 p = get_pointer (sym);
3900 if (p->type == P_UNKNOWN)
3901 p->type = P_SYMBOL;
3902
3903 if (p->u.wsym.state == WRITTEN)
3904 return;
3905
3906 write_symbol (p->integer, sym);
3907 p->u.wsym.state = WRITTEN;
3908 }
3909
3910
3911 /* Recursive traversal function to write the secondary set of symbols
3912 to the module file. These are symbols that were not public yet are
3913 needed by the public symbols or another dependent symbol. The act
3914 of writing a symbol can modify the pointer_info tree, so we cease
3915 traversal if we find a symbol to write. We return nonzero if a
3916 symbol was written and pass that information upwards. */
3917
3918 static int
3919 write_symbol1 (pointer_info *p)
3920 {
3921
3922 if (p == NULL)
3923 return 0;
3924
3925 if (write_symbol1 (p->left))
3926 return 1;
3927 if (write_symbol1 (p->right))
3928 return 1;
3929
3930 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3931 return 0;
3932
3933 p->u.wsym.state = WRITTEN;
3934 write_symbol (p->integer, p->u.wsym.sym);
3935
3936 return 1;
3937 }
3938
3939
3940 /* Write operator interfaces associated with a symbol. */
3941
3942 static void
3943 write_operator (gfc_user_op *uop)
3944 {
3945 static char nullstring[] = "";
3946 const char *p = nullstring;
3947
3948 if (uop->operator == NULL
3949 || !gfc_check_access (uop->access, uop->ns->default_access))
3950 return;
3951
3952 mio_symbol_interface (&uop->name, &p, &uop->operator);
3953 }
3954
3955
3956 /* Write generic interfaces associated with a symbol. */
3957
3958 static void
3959 write_generic (gfc_symbol *sym)
3960 {
3961 const char *p;
3962 int nuse, j;
3963
3964 if (sym->generic == NULL
3965 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3966 return;
3967
3968 if (sym->module == NULL)
3969 sym->module = gfc_get_string (module_name);
3970
3971 /* See how many use names there are. If none, use the symbol name. */
3972 nuse = number_use_names (sym->name);
3973 if (nuse == 0)
3974 {
3975 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3976 return;
3977 }
3978
3979 for (j = 1; j <= nuse; j++)
3980 {
3981 /* Get the jth local name for this symbol. */
3982 p = find_use_name_n (sym->name, &j);
3983
3984 mio_symbol_interface (&p, &sym->module, &sym->generic);
3985 }
3986 }
3987
3988
3989 static void
3990 write_symtree (gfc_symtree *st)
3991 {
3992 gfc_symbol *sym;
3993 pointer_info *p;
3994
3995 sym = st->n.sym;
3996 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3997 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3998 && !sym->attr.subroutine && !sym->attr.function))
3999 return;
4000
4001 if (check_unique_name (st->name))
4002 return;
4003
4004 p = find_pointer (sym);
4005 if (p == NULL)
4006 gfc_internal_error ("write_symtree(): Symbol not written");
4007
4008 mio_pool_string (&st->name);
4009 mio_integer (&st->ambiguous);
4010 mio_integer (&p->integer);
4011 }
4012
4013
4014 static void
4015 write_module (void)
4016 {
4017 gfc_intrinsic_op i;
4018
4019 /* Write the operator interfaces. */
4020 mio_lparen ();
4021
4022 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4023 {
4024 if (i == INTRINSIC_USER)
4025 continue;
4026
4027 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
4028 gfc_current_ns->default_access)
4029 ? &gfc_current_ns->operator[i] : NULL);
4030 }
4031
4032 mio_rparen ();
4033 write_char ('\n');
4034 write_char ('\n');
4035
4036 mio_lparen ();
4037 gfc_traverse_user_op (gfc_current_ns, write_operator);
4038 mio_rparen ();
4039 write_char ('\n');
4040 write_char ('\n');
4041
4042 mio_lparen ();
4043 gfc_traverse_ns (gfc_current_ns, write_generic);
4044 mio_rparen ();
4045 write_char ('\n');
4046 write_char ('\n');
4047
4048 mio_lparen ();
4049 write_blank_common ();
4050 write_common (gfc_current_ns->common_root);
4051 mio_rparen ();
4052 write_char ('\n');
4053 write_char ('\n');
4054
4055 mio_lparen ();
4056 write_equiv ();
4057 mio_rparen ();
4058 write_char ('\n');
4059 write_char ('\n');
4060
4061 /* Write symbol information. First we traverse all symbols in the
4062 primary namespace, writing those that need to be written.
4063 Sometimes writing one symbol will cause another to need to be
4064 written. A list of these symbols ends up on the write stack, and
4065 we end by popping the bottom of the stack and writing the symbol
4066 until the stack is empty. */
4067
4068 mio_lparen ();
4069
4070 write_symbol0 (gfc_current_ns->sym_root);
4071 while (write_symbol1 (pi_root));
4072
4073 mio_rparen ();
4074
4075 write_char ('\n');
4076 write_char ('\n');
4077
4078 mio_lparen ();
4079 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
4080 mio_rparen ();
4081 }
4082
4083
4084 /* Read a MD5 sum from the header of a module file. If the file cannot
4085 be opened, or we have any other error, we return -1. */
4086
4087 static int
4088 read_md5_from_module_file (const char * filename, unsigned char md5[16])
4089 {
4090 FILE *file;
4091 char buf[1024];
4092 int n;
4093
4094 /* Open the file. */
4095 if ((file = fopen (filename, "r")) == NULL)
4096 return -1;
4097
4098 /* Read two lines. */
4099 if (fgets (buf, sizeof (buf) - 1, file) == NULL
4100 || fgets (buf, sizeof (buf) - 1, file) == NULL)
4101 {
4102 fclose (file);
4103 return -1;
4104 }
4105
4106 /* Close the file. */
4107 fclose (file);
4108
4109 /* If the header is not what we expect, or is too short, bail out. */
4110 if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
4111 return -1;
4112
4113 /* Now, we have a real MD5, read it into the array. */
4114 for (n = 0; n < 16; n++)
4115 {
4116 unsigned int x;
4117
4118 if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
4119 return -1;
4120
4121 md5[n] = x;
4122 }
4123
4124 return 0;
4125 }
4126
4127
4128 /* Given module, dump it to disk. If there was an error while
4129 processing the module, dump_flag will be set to zero and we delete
4130 the module file, even if it was already there. */
4131
4132 void
4133 gfc_dump_module (const char *name, int dump_flag)
4134 {
4135 int n;
4136 char *filename, *filename_tmp, *p;
4137 time_t now;
4138 fpos_t md5_pos;
4139 unsigned char md5_new[16], md5_old[16];
4140
4141 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
4142 if (gfc_option.module_dir != NULL)
4143 {
4144 n += strlen (gfc_option.module_dir);
4145 filename = (char *) alloca (n);
4146 strcpy (filename, gfc_option.module_dir);
4147 strcat (filename, name);
4148 }
4149 else
4150 {
4151 filename = (char *) alloca (n);
4152 strcpy (filename, name);
4153 }
4154 strcat (filename, MODULE_EXTENSION);
4155
4156 /* Name of the temporary file used to write the module. */
4157 filename_tmp = (char *) alloca (n + 1);
4158 strcpy (filename_tmp, filename);
4159 strcat (filename_tmp, "0");
4160
4161 /* There was an error while processing the module. We delete the
4162 module file, even if it was already there. */
4163 if (!dump_flag)
4164 {
4165 unlink (filename);
4166 return;
4167 }
4168
4169 /* Write the module to the temporary file. */
4170 module_fp = fopen (filename_tmp, "w");
4171 if (module_fp == NULL)
4172 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
4173 filename_tmp, strerror (errno));
4174
4175 /* Write the header, including space reserved for the MD5 sum. */
4176 now = time (NULL);
4177 p = ctime (&now);
4178
4179 *strchr (p, '\n') = '\0';
4180
4181 fprintf (module_fp, "GFORTRAN module created from %s on %s\nMD5:",
4182 gfc_source_file, p);
4183 fgetpos (module_fp, &md5_pos);
4184 fputs ("00000000000000000000000000000000 -- "
4185 "If you edit this, you'll get what you deserve.\n\n", module_fp);
4186
4187 /* Initialize the MD5 context that will be used for output. */
4188 md5_init_ctx (&ctx);
4189
4190 /* Write the module itself. */
4191 iomode = IO_OUTPUT;
4192 strcpy (module_name, name);
4193
4194 init_pi_tree ();
4195
4196 write_module ();
4197
4198 free_pi_tree (pi_root);
4199 pi_root = NULL;
4200
4201 write_char ('\n');
4202
4203 /* Write the MD5 sum to the header of the module file. */
4204 md5_finish_ctx (&ctx, md5_new);
4205 fsetpos (module_fp, &md5_pos);
4206 for (n = 0; n < 16; n++)
4207 fprintf (module_fp, "%02x", md5_new[n]);
4208
4209 if (fclose (module_fp))
4210 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
4211 filename_tmp, strerror (errno));
4212
4213 /* Read the MD5 from the header of the old module file and compare. */
4214 if (read_md5_from_module_file (filename, md5_old) != 0
4215 || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
4216 {
4217 /* Module file have changed, replace the old one. */
4218 unlink (filename);
4219 rename (filename_tmp, filename);
4220 }
4221 else
4222 unlink (filename_tmp);
4223 }
4224
4225
4226 static void
4227 sort_iso_c_rename_list (void)
4228 {
4229 gfc_use_rename *tmp_list = NULL;
4230 gfc_use_rename *curr;
4231 gfc_use_rename *kinds_used[ISOCBINDING_NUMBER] = {NULL};
4232 int c_kind;
4233 int i;
4234
4235 for (curr = gfc_rename_list; curr; curr = curr->next)
4236 {
4237 c_kind = get_c_kind (curr->use_name, c_interop_kinds_table);
4238 if (c_kind == ISOCBINDING_INVALID || c_kind == ISOCBINDING_LAST)
4239 {
4240 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4241 "intrinsic module ISO_C_BINDING.", curr->use_name,
4242 &curr->where);
4243 }
4244 else
4245 /* Put it in the list. */
4246 kinds_used[c_kind] = curr;
4247 }
4248
4249 /* Make a new (sorted) rename list. */
4250 i = 0;
4251 while (i < ISOCBINDING_NUMBER && kinds_used[i] == NULL)
4252 i++;
4253
4254 if (i < ISOCBINDING_NUMBER)
4255 {
4256 tmp_list = kinds_used[i];
4257
4258 i++;
4259 curr = tmp_list;
4260 for (; i < ISOCBINDING_NUMBER; i++)
4261 if (kinds_used[i] != NULL)
4262 {
4263 curr->next = kinds_used[i];
4264 curr = curr->next;
4265 curr->next = NULL;
4266 }
4267 }
4268
4269 gfc_rename_list = tmp_list;
4270 }
4271
4272
4273 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
4274 the current namespace for all named constants, pointer types, and
4275 procedures in the module unless the only clause was used or a rename
4276 list was provided. */
4277
4278 static void
4279 import_iso_c_binding_module (void)
4280 {
4281 gfc_symbol *mod_sym = NULL;
4282 gfc_symtree *mod_symtree = NULL;
4283 const char *iso_c_module_name = "__iso_c_binding";
4284 gfc_use_rename *u;
4285 int i;
4286 char *local_name;
4287
4288 /* Look only in the current namespace. */
4289 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
4290
4291 if (mod_symtree == NULL)
4292 {
4293 /* symtree doesn't already exist in current namespace. */
4294 gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree);
4295
4296 if (mod_symtree != NULL)
4297 mod_sym = mod_symtree->n.sym;
4298 else
4299 gfc_internal_error ("import_iso_c_binding_module(): Unable to "
4300 "create symbol for %s", iso_c_module_name);
4301
4302 mod_sym->attr.flavor = FL_MODULE;
4303 mod_sym->attr.intrinsic = 1;
4304 mod_sym->module = gfc_get_string (iso_c_module_name);
4305 mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
4306 }
4307
4308 /* Generate the symbols for the named constants representing
4309 the kinds for intrinsic data types. */
4310 if (only_flag)
4311 {
4312 /* Sort the rename list because there are dependencies between types
4313 and procedures (e.g., c_loc needs c_ptr). */
4314 sort_iso_c_rename_list ();
4315
4316 for (u = gfc_rename_list; u; u = u->next)
4317 {
4318 i = get_c_kind (u->use_name, c_interop_kinds_table);
4319
4320 if (i == ISOCBINDING_INVALID || i == ISOCBINDING_LAST)
4321 {
4322 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4323 "intrinsic module ISO_C_BINDING.", u->use_name,
4324 &u->where);
4325 continue;
4326 }
4327
4328 generate_isocbinding_symbol (iso_c_module_name, i, u->local_name);
4329 }
4330 }
4331 else
4332 {
4333 for (i = 0; i < ISOCBINDING_NUMBER; i++)
4334 {
4335 local_name = NULL;
4336 for (u = gfc_rename_list; u; u = u->next)
4337 {
4338 if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
4339 {
4340 local_name = u->local_name;
4341 u->found = 1;
4342 break;
4343 }
4344 }
4345 generate_isocbinding_symbol (iso_c_module_name, i, local_name);
4346 }
4347
4348 for (u = gfc_rename_list; u; u = u->next)
4349 {
4350 if (u->found)
4351 continue;
4352
4353 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4354 "module ISO_C_BINDING", u->use_name, &u->where);
4355 }
4356 }
4357 }
4358
4359
4360 /* Add an integer named constant from a given module. */
4361
4362 static void
4363 create_int_parameter (const char *name, int value, const char *modname,
4364 intmod_id module, int id)
4365 {
4366 gfc_symtree *tmp_symtree;
4367 gfc_symbol *sym;
4368
4369 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4370 if (tmp_symtree != NULL)
4371 {
4372 if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
4373 return;
4374 else
4375 gfc_error ("Symbol '%s' already declared", name);
4376 }
4377
4378 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree);
4379 sym = tmp_symtree->n.sym;
4380
4381 sym->module = gfc_get_string (modname);
4382 sym->attr.flavor = FL_PARAMETER;
4383 sym->ts.type = BT_INTEGER;
4384 sym->ts.kind = gfc_default_integer_kind;
4385 sym->value = gfc_int_expr (value);
4386 sym->attr.use_assoc = 1;
4387 sym->from_intmod = module;
4388 sym->intmod_sym_id = id;
4389 }
4390
4391
4392 /* USE the ISO_FORTRAN_ENV intrinsic module. */
4393
4394 static void
4395 use_iso_fortran_env_module (void)
4396 {
4397 static char mod[] = "iso_fortran_env";
4398 const char *local_name;
4399 gfc_use_rename *u;
4400 gfc_symbol *mod_sym;
4401 gfc_symtree *mod_symtree;
4402 int i;
4403
4404 intmod_sym symbol[] = {
4405 #define NAMED_INTCST(a,b,c) { a, b, 0 },
4406 #include "iso-fortran-env.def"
4407 #undef NAMED_INTCST
4408 { ISOFORTRANENV_INVALID, NULL, -1234 } };
4409
4410 i = 0;
4411 #define NAMED_INTCST(a,b,c) symbol[i++].value = c;
4412 #include "iso-fortran-env.def"
4413 #undef NAMED_INTCST
4414
4415 /* Generate the symbol for the module itself. */
4416 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
4417 if (mod_symtree == NULL)
4418 {
4419 gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree);
4420 gcc_assert (mod_symtree);
4421 mod_sym = mod_symtree->n.sym;
4422
4423 mod_sym->attr.flavor = FL_MODULE;
4424 mod_sym->attr.intrinsic = 1;
4425 mod_sym->module = gfc_get_string (mod);
4426 mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
4427 }
4428 else
4429 if (!mod_symtree->n.sym->attr.intrinsic)
4430 gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
4431 "non-intrinsic module name used previously", mod);
4432
4433 /* Generate the symbols for the module integer named constants. */
4434 if (only_flag)
4435 for (u = gfc_rename_list; u; u = u->next)
4436 {
4437 for (i = 0; symbol[i].name; i++)
4438 if (strcmp (symbol[i].name, u->use_name) == 0)
4439 break;
4440
4441 if (symbol[i].name == NULL)
4442 {
4443 gfc_error ("Symbol '%s' referenced at %L does not exist in "
4444 "intrinsic module ISO_FORTRAN_ENV", u->use_name,
4445 &u->where);
4446 continue;
4447 }
4448
4449 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4450 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4451 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4452 "from intrinsic module ISO_FORTRAN_ENV at %L is "
4453 "incompatible with option %s", &u->where,
4454 gfc_option.flag_default_integer
4455 ? "-fdefault-integer-8" : "-fdefault-real-8");
4456
4457 create_int_parameter (u->local_name[0] ? u->local_name
4458 : symbol[i].name,
4459 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4460 symbol[i].id);
4461 }
4462 else
4463 {
4464 for (i = 0; symbol[i].name; i++)
4465 {
4466 local_name = NULL;
4467 for (u = gfc_rename_list; u; u = u->next)
4468 {
4469 if (strcmp (symbol[i].name, u->use_name) == 0)
4470 {
4471 local_name = u->local_name;
4472 u->found = 1;
4473 break;
4474 }
4475 }
4476
4477 if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4478 && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4479 gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4480 "from intrinsic module ISO_FORTRAN_ENV at %C is "
4481 "incompatible with option %s",
4482 gfc_option.flag_default_integer
4483 ? "-fdefault-integer-8" : "-fdefault-real-8");
4484
4485 create_int_parameter (local_name ? local_name : symbol[i].name,
4486 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4487 symbol[i].id);
4488 }
4489
4490 for (u = gfc_rename_list; u; u = u->next)
4491 {
4492 if (u->found)
4493 continue;
4494
4495 gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4496 "module ISO_FORTRAN_ENV", u->use_name, &u->where);
4497 }
4498 }
4499 }
4500
4501
4502 /* Process a USE directive. */
4503
4504 void
4505 gfc_use_module (void)
4506 {
4507 char *filename;
4508 gfc_state_data *p;
4509 int c, line, start;
4510 gfc_symtree *mod_symtree;
4511
4512 filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION)
4513 + 1);
4514 strcpy (filename, module_name);
4515 strcat (filename, MODULE_EXTENSION);
4516
4517 /* First, try to find an non-intrinsic module, unless the USE statement
4518 specified that the module is intrinsic. */
4519 module_fp = NULL;
4520 if (!specified_int)
4521 module_fp = gfc_open_included_file (filename, true, true);
4522
4523 /* Then, see if it's an intrinsic one, unless the USE statement
4524 specified that the module is non-intrinsic. */
4525 if (module_fp == NULL && !specified_nonint)
4526 {
4527 if (strcmp (module_name, "iso_fortran_env") == 0
4528 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
4529 "intrinsic module at %C") != FAILURE)
4530 {
4531 use_iso_fortran_env_module ();
4532 return;
4533 }
4534
4535 if (strcmp (module_name, "iso_c_binding") == 0
4536 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
4537 "ISO_C_BINDING module at %C") != FAILURE)
4538 {
4539 import_iso_c_binding_module();
4540 return;
4541 }
4542
4543 module_fp = gfc_open_intrinsic_module (filename);
4544
4545 if (module_fp == NULL && specified_int)
4546 gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
4547 module_name);
4548 }
4549
4550 if (module_fp == NULL)
4551 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
4552 filename, strerror (errno));
4553
4554 /* Check that we haven't already USEd an intrinsic module with the
4555 same name. */
4556
4557 mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
4558 if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
4559 gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
4560 "intrinsic module name used previously", module_name);
4561
4562 iomode = IO_INPUT;
4563 module_line = 1;
4564 module_column = 1;
4565 start = 0;
4566
4567 /* Skip the first two lines of the module, after checking that this is
4568 a gfortran module file. */
4569 line = 0;
4570 while (line < 2)
4571 {
4572 c = module_char ();
4573 if (c == EOF)
4574 bad_module ("Unexpected end of module");
4575 if (start++ < 2)
4576 parse_name (c);
4577 if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
4578 || (start == 2 && strcmp (atom_name, " module") != 0))
4579 gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
4580 "file", filename);
4581
4582 if (c == '\n')
4583 line++;
4584 }
4585
4586 /* Make sure we're not reading the same module that we may be building. */
4587 for (p = gfc_state_stack; p; p = p->previous)
4588 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
4589 gfc_fatal_error ("Can't USE the same module we're building!");
4590
4591 init_pi_tree ();
4592 init_true_name_tree ();
4593
4594 read_module ();
4595
4596 free_true_name (true_name_root);
4597 true_name_root = NULL;
4598
4599 free_pi_tree (pi_root);
4600 pi_root = NULL;
4601
4602 fclose (module_fp);
4603 }
4604
4605
4606 void
4607 gfc_module_init_2 (void)
4608 {
4609 last_atom = ATOM_LPAREN;
4610 }
4611
4612
4613 void
4614 gfc_module_done_2 (void)
4615 {
4616 free_rename ();
4617 }