]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/module.c
re PR fortran/20059 (internal compiler error: Segmentation Fault - For common blocks)
[gcc.git] / gcc / fortran / module.c
CommitLineData
6de9cd9a
DN
1/* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
ec378180 3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
9056bd70 4 Inc.
6de9cd9a
DN
5 Contributed by Andy Vaught
6
9fc4d79b 7This file is part of GCC.
6de9cd9a 8
9fc4d79b
TS
9GCC is free software; you can redistribute it and/or modify it under
10the terms of the GNU General Public License as published by the Free
11Software Foundation; either version 2, or (at your option) any later
12version.
6de9cd9a 13
9fc4d79b
TS
14GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15WARRANTY; without even the implied warranty of MERCHANTABILITY or
16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17for more details.
6de9cd9a
DN
18
19You should have received a copy of the GNU General Public License
9fc4d79b
TS
20along with GCC; see the file COPYING. If not, write to the Free
21Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2202111-1307, USA. */
6de9cd9a 23
75101feb 24/* The syntax of gfortran modules resembles that of lisp lists, ie a
6de9cd9a
DN
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
31
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
36
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
39 ...
40 )
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42 ...
43 )
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45 ...
46 )
9056bd70
TS
47 ( ( <common name> <symbol> <saved flag>)
48 ...
49 )
6de9cd9a
DN
50 ( <Symbol Number (in no particular order)>
51 <True name of symbol>
52 <Module name of symbol>
53 ( <symbol information> )
54 ...
55 )
56 ( <Symtree name>
57 <Ambiguous flag>
58 <Symbol number>
59 ...
60 )
61
62 In general, symbols refer to other symbols by their symbol number,
63 which are zero based. Symbols are written to the module in no
64 particular order. */
65
66#include "config.h"
d22e4895 67#include "system.h"
6de9cd9a 68#include "gfortran.h"
f8e566e5 69#include "arith.h"
6de9cd9a
DN
70#include "match.h"
71#include "parse.h" /* FIXME */
72
73#define MODULE_EXTENSION ".mod"
74
75
711f8369 76/* Structure that describes a position within a module file. */
6de9cd9a
DN
77
78typedef struct
79{
80 int column, line;
81 fpos_t pos;
82}
83module_locus;
84
85
86typedef enum
87{
88 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
89}
90pointer_t;
91
92/* The fixup structure lists pointers to pointers that have to
93 be updated when a pointer value becomes known. */
94
95typedef struct fixup_t
96{
97 void **pointer;
98 struct fixup_t *next;
99}
100fixup_t;
101
102
711f8369 103/* Structure for holding extra info needed for pointers being read. */
6de9cd9a
DN
104
105typedef struct pointer_info
106{
107 BBT_HEADER (pointer_info);
108 int integer;
109 pointer_t type;
110
111 /* The first component of each member of the union is the pointer
711f8369 112 being stored. */
6de9cd9a
DN
113
114 fixup_t *fixup;
115
116 union
117 {
711f8369 118 void *pointer; /* Member for doing pointer searches. */
6de9cd9a
DN
119
120 struct
121 {
122 gfc_symbol *sym;
123 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
124 enum
125 { UNUSED, NEEDED, USED }
126 state;
127 int ns, referenced;
128 module_locus where;
129 fixup_t *stfixup;
130 gfc_symtree *symtree;
131 }
132 rsym;
133
134 struct
135 {
136 gfc_symbol *sym;
137 enum
138 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
139 state;
140 }
141 wsym;
142 }
143 u;
144
145}
146pointer_info;
147
148#define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
149
150
711f8369 151/* Lists of rename info for the USE statement. */
6de9cd9a
DN
152
153typedef struct gfc_use_rename
154{
155 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
156 struct gfc_use_rename *next;
157 int found;
158 gfc_intrinsic_op operator;
159 locus where;
160}
161gfc_use_rename;
162
163#define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
164
165/* Local variables */
166
167/* The FILE for the module we're reading or writing. */
168static FILE *module_fp;
169
170/* The name of the module we're reading (USE'ing) or writing. */
171static char module_name[GFC_MAX_SYMBOL_LEN + 1];
172
173static int module_line, module_column, only_flag;
174static enum
175{ IO_INPUT, IO_OUTPUT }
176iomode;
177
178static gfc_use_rename *gfc_rename_list;
179static pointer_info *pi_root;
180static int symbol_number; /* Counter for assigning symbol numbers */
181
182
183
184/*****************************************************************/
185
186/* Pointer/integer conversion. Pointers between structures are stored
187 as integers in the module file. The next couple of subroutines
188 handle this translation for reading and writing. */
189
190/* Recursively free the tree of pointer structures. */
191
192static void
193free_pi_tree (pointer_info * p)
194{
6de9cd9a
DN
195 if (p == NULL)
196 return;
197
198 if (p->fixup != NULL)
199 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
200
201 free_pi_tree (p->left);
202 free_pi_tree (p->right);
203
204 gfc_free (p);
205}
206
207
208/* Compare pointers when searching by pointer. Used when writing a
209 module. */
210
211static int
212compare_pointers (void * _sn1, void * _sn2)
213{
214 pointer_info *sn1, *sn2;
215
216 sn1 = (pointer_info *) _sn1;
217 sn2 = (pointer_info *) _sn2;
218
219 if (sn1->u.pointer < sn2->u.pointer)
220 return -1;
221 if (sn1->u.pointer > sn2->u.pointer)
222 return 1;
223
224 return 0;
225}
226
227
228/* Compare integers when searching by integer. Used when reading a
229 module. */
230
231static int
232compare_integers (void * _sn1, void * _sn2)
233{
234 pointer_info *sn1, *sn2;
235
236 sn1 = (pointer_info *) _sn1;
237 sn2 = (pointer_info *) _sn2;
238
239 if (sn1->integer < sn2->integer)
240 return -1;
241 if (sn1->integer > sn2->integer)
242 return 1;
243
244 return 0;
245}
246
247
248/* Initialize the pointer_info tree. */
249
250static void
251init_pi_tree (void)
252{
253 compare_fn compare;
254 pointer_info *p;
255
256 pi_root = NULL;
257 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
258
259 /* Pointer 0 is the NULL pointer. */
260 p = gfc_get_pointer_info ();
261 p->u.pointer = NULL;
262 p->integer = 0;
263 p->type = P_OTHER;
264
265 gfc_insert_bbt (&pi_root, p, compare);
266
267 /* Pointer 1 is the current namespace. */
268 p = gfc_get_pointer_info ();
269 p->u.pointer = gfc_current_ns;
270 p->integer = 1;
271 p->type = P_NAMESPACE;
272
273 gfc_insert_bbt (&pi_root, p, compare);
274
275 symbol_number = 2;
276}
277
278
279/* During module writing, call here with a pointer to something,
280 returning the pointer_info node. */
281
282static pointer_info *
283find_pointer (void *gp)
284{
285 pointer_info *p;
286
287 p = pi_root;
288 while (p != NULL)
289 {
290 if (p->u.pointer == gp)
291 break;
292 p = (gp < p->u.pointer) ? p->left : p->right;
293 }
294
295 return p;
296}
297
298
299/* Given a pointer while writing, returns the pointer_info tree node,
300 creating it if it doesn't exist. */
301
302static pointer_info *
303get_pointer (void *gp)
304{
305 pointer_info *p;
306
307 p = find_pointer (gp);
308 if (p != NULL)
309 return p;
310
311 /* Pointer doesn't have an integer. Give it one. */
312 p = gfc_get_pointer_info ();
313
314 p->u.pointer = gp;
315 p->integer = symbol_number++;
316
317 gfc_insert_bbt (&pi_root, p, compare_pointers);
318
319 return p;
320}
321
322
323/* Given an integer during reading, find it in the pointer_info tree,
324 creating the node if not found. */
325
326static pointer_info *
327get_integer (int integer)
328{
329 pointer_info *p, t;
330 int c;
331
332 t.integer = integer;
333
334 p = pi_root;
335 while (p != NULL)
336 {
337 c = compare_integers (&t, p);
338 if (c == 0)
339 break;
340
341 p = (c < 0) ? p->left : p->right;
342 }
343
344 if (p != NULL)
345 return p;
346
347 p = gfc_get_pointer_info ();
348 p->integer = integer;
349 p->u.pointer = NULL;
350
351 gfc_insert_bbt (&pi_root, p, compare_integers);
352
353 return p;
354}
355
356
357/* Recursive function to find a pointer within a tree by brute force. */
358
359static pointer_info *
360fp2 (pointer_info * p, const void *target)
361{
362 pointer_info *q;
363
364 if (p == NULL)
365 return NULL;
366
367 if (p->u.pointer == target)
368 return p;
369
370 q = fp2 (p->left, target);
371 if (q != NULL)
372 return q;
373
374 return fp2 (p->right, target);
375}
376
377
378/* During reading, find a pointer_info node from the pointer value.
379 This amounts to a brute-force search. */
380
381static pointer_info *
382find_pointer2 (void *p)
383{
384
385 return fp2 (pi_root, p);
386}
387
388
389/* Resolve any fixups using a known pointer. */
390static void
391resolve_fixups (fixup_t *f, void * gp)
392{
393 fixup_t *next;
394
395 for (; f; f = next)
396 {
397 next = f->next;
398 *(f->pointer) = gp;
399 gfc_free (f);
400 }
401}
402
403/* Call here during module reading when we know what pointer to
404 associate with an integer. Any fixups that exist are resolved at
405 this time. */
406
407static void
408associate_integer_pointer (pointer_info * p, void *gp)
409{
410 if (p->u.pointer != NULL)
411 gfc_internal_error ("associate_integer_pointer(): Already associated");
412
413 p->u.pointer = gp;
414
415 resolve_fixups (p->fixup, gp);
416
417 p->fixup = NULL;
418}
419
420
421/* During module reading, given an integer and a pointer to a pointer,
422 either store the pointer from an already-known value or create a
423 fixup structure in order to store things later. Returns zero if
424 the reference has been actually stored, or nonzero if the reference
425 must be fixed later (ie associate_integer_pointer must be called
426 sometime later. Returns the pointer_info structure. */
427
428static pointer_info *
429add_fixup (int integer, void *gp)
430{
431 pointer_info *p;
432 fixup_t *f;
433 char **cp;
434
435 p = get_integer (integer);
436
437 if (p->integer == 0 || p->u.pointer != NULL)
438 {
439 cp = gp;
440 *cp = p->u.pointer;
441 }
442 else
443 {
444 f = gfc_getmem (sizeof (fixup_t));
445
446 f->next = p->fixup;
447 p->fixup = f;
448
449 f->pointer = gp;
450 }
451
452 return p;
453}
454
455
456/*****************************************************************/
457
458/* Parser related subroutines */
459
460/* Free the rename list left behind by a USE statement. */
461
462static void
463free_rename (void)
464{
465 gfc_use_rename *next;
466
467 for (; gfc_rename_list; gfc_rename_list = next)
468 {
469 next = gfc_rename_list->next;
470 gfc_free (gfc_rename_list);
471 }
472}
473
474
475/* Match a USE statement. */
476
477match
478gfc_match_use (void)
479{
480 char name[GFC_MAX_SYMBOL_LEN + 1];
481 gfc_use_rename *tail = NULL, *new;
482 interface_type type;
483 gfc_intrinsic_op operator;
484 match m;
485
486 m = gfc_match_name (module_name);
487 if (m != MATCH_YES)
488 return m;
489
490 free_rename ();
491 only_flag = 0;
492
493 if (gfc_match_eos () == MATCH_YES)
494 return MATCH_YES;
495 if (gfc_match_char (',') != MATCH_YES)
496 goto syntax;
497
498 if (gfc_match (" only :") == MATCH_YES)
499 only_flag = 1;
500
501 if (gfc_match_eos () == MATCH_YES)
502 return MATCH_YES;
503
504 for (;;)
505 {
506 /* Get a new rename struct and add it to the rename list. */
507 new = gfc_get_use_rename ();
63645982 508 new->where = gfc_current_locus;
6de9cd9a
DN
509 new->found = 0;
510
511 if (gfc_rename_list == NULL)
512 gfc_rename_list = new;
513 else
514 tail->next = new;
515 tail = new;
516
f8e566e5 517 /* See what kind of interface we're dealing with. Assume it is
6de9cd9a
DN
518 not an operator. */
519 new->operator = INTRINSIC_NONE;
520 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
521 goto cleanup;
522
523 switch (type)
524 {
525 case INTERFACE_NAMELESS:
526 gfc_error ("Missing generic specification in USE statement at %C");
527 goto cleanup;
528
529 case INTERFACE_GENERIC:
530 m = gfc_match (" =>");
531
532 if (only_flag)
533 {
534 if (m != MATCH_YES)
535 strcpy (new->use_name, name);
536 else
537 {
538 strcpy (new->local_name, name);
539
540 m = gfc_match_name (new->use_name);
541 if (m == MATCH_NO)
542 goto syntax;
543 if (m == MATCH_ERROR)
544 goto cleanup;
545 }
546 }
547 else
548 {
549 if (m != MATCH_YES)
550 goto syntax;
551 strcpy (new->local_name, name);
552
553 m = gfc_match_name (new->use_name);
554 if (m == MATCH_NO)
555 goto syntax;
556 if (m == MATCH_ERROR)
557 goto cleanup;
558 }
559
560 break;
561
562 case INTERFACE_USER_OP:
563 strcpy (new->use_name, name);
564 /* Fall through */
565
566 case INTERFACE_INTRINSIC_OP:
567 new->operator = operator;
568 break;
569 }
570
571 if (gfc_match_eos () == MATCH_YES)
572 break;
573 if (gfc_match_char (',') != MATCH_YES)
574 goto syntax;
575 }
576
577 return MATCH_YES;
578
579syntax:
580 gfc_syntax_error (ST_USE);
581
582cleanup:
583 free_rename ();
584 return MATCH_ERROR;
585}
586
587
588/* Given a name, return the name under which to load this symbol.
589 Returns NULL if this symbol shouldn't be loaded. */
590
591static const char *
592find_use_name (const char *name)
593{
594 gfc_use_rename *u;
595
596 for (u = gfc_rename_list; u; u = u->next)
597 if (strcmp (u->use_name, name) == 0)
598 break;
599
600 if (u == NULL)
601 return only_flag ? NULL : name;
602
603 u->found = 1;
604
605 return (u->local_name[0] != '\0') ? u->local_name : name;
606}
607
608
609/* Try to find the operator in the current list. */
610
611static gfc_use_rename *
612find_use_operator (gfc_intrinsic_op operator)
613{
614 gfc_use_rename *u;
615
616 for (u = gfc_rename_list; u; u = u->next)
617 if (u->operator == operator)
618 return u;
619
620 return NULL;
621}
622
623
624/*****************************************************************/
625
626/* The next couple of subroutines maintain a tree used to avoid a
627 brute-force search for a combination of true name and module name.
628 While symtree names, the name that a particular symbol is known by
629 can changed with USE statements, we still have to keep track of the
630 true names to generate the correct reference, and also avoid
631 loading the same real symbol twice in a program unit.
632
633 When we start reading, the true name tree is built and maintained
634 as symbols are read. The tree is searched as we load new symbols
635 to see if it already exists someplace in the namespace. */
636
637typedef struct true_name
638{
639 BBT_HEADER (true_name);
640 gfc_symbol *sym;
641}
642true_name;
643
644static true_name *true_name_root;
645
646
647/* Compare two true_name structures. */
648
649static int
650compare_true_names (void * _t1, void * _t2)
651{
652 true_name *t1, *t2;
653 int c;
654
655 t1 = (true_name *) _t1;
656 t2 = (true_name *) _t2;
657
cb9e4f55
TS
658 c = ((t1->sym->module > t2->sym->module)
659 - (t1->sym->module < t2->sym->module));
6de9cd9a
DN
660 if (c != 0)
661 return c;
662
663 return strcmp (t1->sym->name, t2->sym->name);
664}
665
666
667/* Given a true name, search the true name tree to see if it exists
668 within the main namespace. */
669
670static gfc_symbol *
671find_true_name (const char *name, const char *module)
672{
673 true_name t, *p;
674 gfc_symbol sym;
675 int c;
676
cb9e4f55
TS
677 sym.name = gfc_get_string (name);
678 if (module != NULL)
679 sym.module = gfc_get_string (module);
680 else
681 sym.module = NULL;
6de9cd9a
DN
682 t.sym = &sym;
683
684 p = true_name_root;
685 while (p != NULL)
686 {
687 c = compare_true_names ((void *)(&t), (void *) p);
688 if (c == 0)
689 return p->sym;
690
691 p = (c < 0) ? p->left : p->right;
692 }
693
694 return NULL;
695}
696
697
698/* Given a gfc_symbol pointer that is not in the true name tree, add
699 it. */
700
701static void
702add_true_name (gfc_symbol * sym)
703{
704 true_name *t;
705
706 t = gfc_getmem (sizeof (true_name));
707 t->sym = sym;
708
709 gfc_insert_bbt (&true_name_root, t, compare_true_names);
710}
711
712
713/* Recursive function to build the initial true name tree by
714 recursively traversing the current namespace. */
715
716static void
717build_tnt (gfc_symtree * st)
718{
719
720 if (st == NULL)
721 return;
722
723 build_tnt (st->left);
724 build_tnt (st->right);
725
726 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
727 return;
728
729 add_true_name (st->n.sym);
730}
731
732
733/* Initialize the true name tree with the current namespace. */
734
735static void
736init_true_name_tree (void)
737{
738 true_name_root = NULL;
739
740 build_tnt (gfc_current_ns->sym_root);
741}
742
743
744/* Recursively free a true name tree node. */
745
746static void
747free_true_name (true_name * t)
748{
749
750 if (t == NULL)
751 return;
752 free_true_name (t->left);
753 free_true_name (t->right);
754
755 gfc_free (t);
756}
757
758
759/*****************************************************************/
760
761/* Module reading and writing. */
762
763typedef enum
764{
765 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
766}
767atom_type;
768
769static atom_type last_atom;
770
771
772/* The name buffer must be at least as long as a symbol name. Right
773 now it's not clear how we're going to store numeric constants--
774 probably as a hexadecimal string, since this will allow the exact
775 number to be preserved (this can't be done by a decimal
776 representation). Worry about that later. TODO! */
777
778#define MAX_ATOM_SIZE 100
779
780static int atom_int;
781static char *atom_string, atom_name[MAX_ATOM_SIZE];
782
783
784/* Report problems with a module. Error reporting is not very
785 elaborate, since this sorts of errors shouldn't really happen.
786 This subroutine never returns. */
787
788static void bad_module (const char *) ATTRIBUTE_NORETURN;
789
790static void
791bad_module (const char *message)
792{
793 const char *p;
794
795 switch (iomode)
796 {
797 case IO_INPUT:
798 p = "Reading";
799 break;
800 case IO_OUTPUT:
801 p = "Writing";
802 break;
803 default:
804 p = "???";
805 break;
806 }
807
808 fclose (module_fp);
809
810 gfc_fatal_error ("%s module %s at line %d column %d: %s", p,
811 module_name, module_line, module_column, message);
812}
813
814
815/* Set the module's input pointer. */
816
817static void
818set_module_locus (module_locus * m)
819{
820
821 module_column = m->column;
822 module_line = m->line;
823 fsetpos (module_fp, &m->pos);
824}
825
826
827/* Get the module's input pointer so that we can restore it later. */
828
829static void
830get_module_locus (module_locus * m)
831{
832
833 m->column = module_column;
834 m->line = module_line;
835 fgetpos (module_fp, &m->pos);
836}
837
838
839/* Get the next character in the module, updating our reckoning of
840 where we are. */
841
842static int
843module_char (void)
844{
845 int c;
846
847 c = fgetc (module_fp);
848
849 if (c == EOF)
850 bad_module ("Unexpected EOF");
851
852 if (c == '\n')
853 {
854 module_line++;
855 module_column = 0;
856 }
857
858 module_column++;
859 return c;
860}
861
862
863/* Parse a string constant. The delimiter is guaranteed to be a
864 single quote. */
865
866static void
867parse_string (void)
868{
869 module_locus start;
870 int len, c;
871 char *p;
872
873 get_module_locus (&start);
874
875 len = 0;
876
877 /* See how long the string is */
878 for ( ; ; )
879 {
880 c = module_char ();
881 if (c == EOF)
882 bad_module ("Unexpected end of module in string constant");
883
884 if (c != '\'')
885 {
886 len++;
887 continue;
888 }
889
890 c = module_char ();
891 if (c == '\'')
892 {
893 len++;
894 continue;
895 }
896
897 break;
898 }
899
900 set_module_locus (&start);
901
902 atom_string = p = gfc_getmem (len + 1);
903
904 for (; len > 0; len--)
905 {
906 c = module_char ();
907 if (c == '\'')
908 module_char (); /* Guaranteed to be another \' */
909 *p++ = c;
910 }
911
912 module_char (); /* Terminating \' */
913 *p = '\0'; /* C-style string for debug purposes */
914}
915
916
917/* Parse a small integer. */
918
919static void
920parse_integer (int c)
921{
922 module_locus m;
923
924 atom_int = c - '0';
925
926 for (;;)
927 {
928 get_module_locus (&m);
929
930 c = module_char ();
931 if (!ISDIGIT (c))
932 break;
933
934 atom_int = 10 * atom_int + c - '0';
935 if (atom_int > 99999999)
936 bad_module ("Integer overflow");
937 }
938
939 set_module_locus (&m);
940}
941
942
943/* Parse a name. */
944
945static void
946parse_name (int c)
947{
948 module_locus m;
949 char *p;
950 int len;
951
952 p = atom_name;
953
954 *p++ = c;
955 len = 1;
956
957 get_module_locus (&m);
958
959 for (;;)
960 {
961 c = module_char ();
962 if (!ISALNUM (c) && c != '_' && c != '-')
963 break;
964
965 *p++ = c;
966 if (++len > GFC_MAX_SYMBOL_LEN)
967 bad_module ("Name too long");
968 }
969
970 *p = '\0';
971
972 fseek (module_fp, -1, SEEK_CUR);
973 module_column = m.column + len - 1;
974
975 if (c == '\n')
976 module_line--;
977}
978
979
980/* Read the next atom in the module's input stream. */
981
982static atom_type
983parse_atom (void)
984{
985 int c;
986
987 do
988 {
989 c = module_char ();
990 }
991 while (c == ' ' || c == '\n');
992
993 switch (c)
994 {
995 case '(':
996 return ATOM_LPAREN;
997
998 case ')':
999 return ATOM_RPAREN;
1000
1001 case '\'':
1002 parse_string ();
1003 return ATOM_STRING;
1004
1005 case '0':
1006 case '1':
1007 case '2':
1008 case '3':
1009 case '4':
1010 case '5':
1011 case '6':
1012 case '7':
1013 case '8':
1014 case '9':
1015 parse_integer (c);
1016 return ATOM_INTEGER;
1017
1018 case 'a':
1019 case 'b':
1020 case 'c':
1021 case 'd':
1022 case 'e':
1023 case 'f':
1024 case 'g':
1025 case 'h':
1026 case 'i':
1027 case 'j':
1028 case 'k':
1029 case 'l':
1030 case 'm':
1031 case 'n':
1032 case 'o':
1033 case 'p':
1034 case 'q':
1035 case 'r':
1036 case 's':
1037 case 't':
1038 case 'u':
1039 case 'v':
1040 case 'w':
1041 case 'x':
1042 case 'y':
1043 case 'z':
1044 case 'A':
1045 case 'B':
1046 case 'C':
1047 case 'D':
1048 case 'E':
1049 case 'F':
1050 case 'G':
1051 case 'H':
1052 case 'I':
1053 case 'J':
1054 case 'K':
1055 case 'L':
1056 case 'M':
1057 case 'N':
1058 case 'O':
1059 case 'P':
1060 case 'Q':
1061 case 'R':
1062 case 'S':
1063 case 'T':
1064 case 'U':
1065 case 'V':
1066 case 'W':
1067 case 'X':
1068 case 'Y':
1069 case 'Z':
1070 parse_name (c);
1071 return ATOM_NAME;
1072
1073 default:
1074 bad_module ("Bad name");
1075 }
1076
1077 /* Not reached */
1078}
1079
1080
1081/* Peek at the next atom on the input. */
1082
1083static atom_type
1084peek_atom (void)
1085{
1086 module_locus m;
1087 atom_type a;
1088
1089 get_module_locus (&m);
1090
1091 a = parse_atom ();
1092 if (a == ATOM_STRING)
1093 gfc_free (atom_string);
1094
1095 set_module_locus (&m);
1096 return a;
1097}
1098
1099
1100/* Read the next atom from the input, requiring that it be a
1101 particular kind. */
1102
1103static void
1104require_atom (atom_type type)
1105{
1106 module_locus m;
1107 atom_type t;
1108 const char *p;
1109
1110 get_module_locus (&m);
1111
1112 t = parse_atom ();
1113 if (t != type)
1114 {
1115 switch (type)
1116 {
1117 case ATOM_NAME:
1118 p = "Expected name";
1119 break;
1120 case ATOM_LPAREN:
1121 p = "Expected left parenthesis";
1122 break;
1123 case ATOM_RPAREN:
1124 p = "Expected right parenthesis";
1125 break;
1126 case ATOM_INTEGER:
1127 p = "Expected integer";
1128 break;
1129 case ATOM_STRING:
1130 p = "Expected string";
1131 break;
1132 default:
1133 gfc_internal_error ("require_atom(): bad atom type required");
1134 }
1135
1136 set_module_locus (&m);
1137 bad_module (p);
1138 }
1139}
1140
1141
1142/* Given a pointer to an mstring array, require that the current input
1143 be one of the strings in the array. We return the enum value. */
1144
1145static int
1146find_enum (const mstring * m)
1147{
1148 int i;
1149
1150 i = gfc_string2code (m, atom_name);
1151 if (i >= 0)
1152 return i;
1153
1154 bad_module ("find_enum(): Enum not found");
1155
1156 /* Not reached */
1157}
1158
1159
1160/**************** Module output subroutines ***************************/
1161
1162/* Output a character to a module file. */
1163
1164static void
1165write_char (char out)
1166{
1167
1168 if (fputc (out, module_fp) == EOF)
1169 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1170
1171 if (out != '\n')
1172 module_column++;
1173 else
1174 {
1175 module_column = 1;
1176 module_line++;
1177 }
1178}
1179
1180
1181/* Write an atom to a module. The line wrapping isn't perfect, but it
1182 should work most of the time. This isn't that big of a deal, since
1183 the file really isn't meant to be read by people anyway. */
1184
1185static void
1186write_atom (atom_type atom, const void *v)
1187{
1188 char buffer[20];
1189 int i, len;
1190 const char *p;
1191
1192 switch (atom)
1193 {
1194 case ATOM_STRING:
1195 case ATOM_NAME:
1196 p = v;
1197 break;
1198
1199 case ATOM_LPAREN:
1200 p = "(";
1201 break;
1202
1203 case ATOM_RPAREN:
1204 p = ")";
1205 break;
1206
1207 case ATOM_INTEGER:
1208 i = *((const int *) v);
1209 if (i < 0)
1210 gfc_internal_error ("write_atom(): Writing negative integer");
1211
1212 sprintf (buffer, "%d", i);
1213 p = buffer;
1214 break;
1215
1216 default:
1217 gfc_internal_error ("write_atom(): Trying to write dab atom");
1218
1219 }
1220
1221 len = strlen (p);
1222
1223 if (atom != ATOM_RPAREN)
1224 {
1225 if (module_column + len > 72)
1226 write_char ('\n');
1227 else
1228 {
1229
1230 if (last_atom != ATOM_LPAREN && module_column != 1)
1231 write_char (' ');
1232 }
1233 }
1234
1235 if (atom == ATOM_STRING)
1236 write_char ('\'');
1237
1238 while (*p)
1239 {
1240 if (atom == ATOM_STRING && *p == '\'')
1241 write_char ('\'');
1242 write_char (*p++);
1243 }
1244
1245 if (atom == ATOM_STRING)
1246 write_char ('\'');
1247
1248 last_atom = atom;
1249}
1250
1251
1252
1253/***************** Mid-level I/O subroutines *****************/
1254
1255/* These subroutines let their caller read or write atoms without
1256 caring about which of the two is actually happening. This lets a
1257 subroutine concentrate on the actual format of the data being
1258 written. */
1259
1260static void mio_expr (gfc_expr **);
1261static void mio_symbol_ref (gfc_symbol **);
1262static void mio_symtree_ref (gfc_symtree **);
1263
1264/* Read or write an enumerated value. On writing, we return the input
1265 value for the convenience of callers. We avoid using an integer
1266 pointer because enums are sometimes inside bitfields. */
1267
1268static int
1269mio_name (int t, const mstring * m)
1270{
1271
1272 if (iomode == IO_OUTPUT)
1273 write_atom (ATOM_NAME, gfc_code2string (m, t));
1274 else
1275 {
1276 require_atom (ATOM_NAME);
1277 t = find_enum (m);
1278 }
1279
1280 return t;
1281}
1282
69de3b83 1283/* Specialization of mio_name. */
6de9cd9a
DN
1284
1285#define DECL_MIO_NAME(TYPE) \
1286 static inline TYPE \
1287 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1288 { \
1289 return (TYPE)mio_name ((int)t, m); \
1290 }
1291#define MIO_NAME(TYPE) mio_name_##TYPE
1292
1293static void
1294mio_lparen (void)
1295{
1296
1297 if (iomode == IO_OUTPUT)
1298 write_atom (ATOM_LPAREN, NULL);
1299 else
1300 require_atom (ATOM_LPAREN);
1301}
1302
1303
1304static void
1305mio_rparen (void)
1306{
1307
1308 if (iomode == IO_OUTPUT)
1309 write_atom (ATOM_RPAREN, NULL);
1310 else
1311 require_atom (ATOM_RPAREN);
1312}
1313
1314
1315static void
1316mio_integer (int *ip)
1317{
1318
1319 if (iomode == IO_OUTPUT)
1320 write_atom (ATOM_INTEGER, ip);
1321 else
1322 {
1323 require_atom (ATOM_INTEGER);
1324 *ip = atom_int;
1325 }
1326}
1327
1328
1329/* Read or write a character pointer that points to a string on the
1330 heap. */
1331
6b25a558
RH
1332static const char *
1333mio_allocated_string (const char *s)
6de9cd9a 1334{
6de9cd9a 1335 if (iomode == IO_OUTPUT)
6b25a558
RH
1336 {
1337 write_atom (ATOM_STRING, s);
1338 return s;
1339 }
6de9cd9a
DN
1340 else
1341 {
1342 require_atom (ATOM_STRING);
6b25a558 1343 return atom_string;
6de9cd9a
DN
1344 }
1345}
1346
1347
cb9e4f55
TS
1348/* Read or write a string that is in static memory. */
1349
1350static void
1351mio_pool_string (const char **stringp)
1352{
1353 /* TODO: one could write the string only once, and refer to it via a
1354 fixup pointer. */
1355
1356 /* As a special case we have to deal with a NULL string. This
1357 happens for the 'module' member of 'gfc_symbol's that are not in a
1358 module. We read / write these as the empty string. */
1359 if (iomode == IO_OUTPUT)
1360 {
1361 const char *p = *stringp == NULL ? "" : *stringp;
1362 write_atom (ATOM_STRING, p);
1363 }
1364 else
1365 {
1366 require_atom (ATOM_STRING);
1367 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1368 gfc_free (atom_string);
1369 }
1370}
1371
1372
1373/* Read or write a string that is inside of some already-allocated
1374 structure. */
6de9cd9a
DN
1375
1376static void
1377mio_internal_string (char *string)
1378{
1379
1380 if (iomode == IO_OUTPUT)
1381 write_atom (ATOM_STRING, string);
1382 else
1383 {
1384 require_atom (ATOM_STRING);
1385 strcpy (string, atom_string);
1386 gfc_free (atom_string);
1387 }
1388}
1389
1390
1391
1392typedef enum
1393{ AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
9056bd70 1394 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
3d79abbd 1395 AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON,
6de9cd9a
DN
1396 AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1397 AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT
1398}
1399ab_attribute;
1400
1401static const mstring attr_bits[] =
1402{
1403 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1404 minit ("DIMENSION", AB_DIMENSION),
1405 minit ("EXTERNAL", AB_EXTERNAL),
1406 minit ("INTRINSIC", AB_INTRINSIC),
1407 minit ("OPTIONAL", AB_OPTIONAL),
1408 minit ("POINTER", AB_POINTER),
1409 minit ("SAVE", AB_SAVE),
1410 minit ("TARGET", AB_TARGET),
1411 minit ("DUMMY", AB_DUMMY),
6de9cd9a 1412 minit ("RESULT", AB_RESULT),
6de9cd9a
DN
1413 minit ("DATA", AB_DATA),
1414 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1415 minit ("IN_COMMON", AB_IN_COMMON),
6de9cd9a
DN
1416 minit ("FUNCTION", AB_FUNCTION),
1417 minit ("SUBROUTINE", AB_SUBROUTINE),
1418 minit ("SEQUENCE", AB_SEQUENCE),
1419 minit ("ELEMENTAL", AB_ELEMENTAL),
1420 minit ("PURE", AB_PURE),
1421 minit ("RECURSIVE", AB_RECURSIVE),
1422 minit ("GENERIC", AB_GENERIC),
1423 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1424 minit (NULL, -1)
1425};
1426
69de3b83 1427/* Specialization of mio_name. */
6de9cd9a
DN
1428DECL_MIO_NAME(ab_attribute)
1429DECL_MIO_NAME(ar_type)
1430DECL_MIO_NAME(array_type)
1431DECL_MIO_NAME(bt)
1432DECL_MIO_NAME(expr_t)
1433DECL_MIO_NAME(gfc_access)
1434DECL_MIO_NAME(gfc_intrinsic_op)
1435DECL_MIO_NAME(ifsrc)
1436DECL_MIO_NAME(procedure_type)
1437DECL_MIO_NAME(ref_type)
1438DECL_MIO_NAME(sym_flavor)
1439DECL_MIO_NAME(sym_intent)
1440#undef DECL_MIO_NAME
1441
1442/* Symbol attributes are stored in list with the first three elements
1443 being the enumerated fields, while the remaining elements (if any)
1444 indicate the individual attribute bits. The access field is not
1445 saved-- it controls what symbols are exported when a module is
1446 written. */
1447
1448static void
1449mio_symbol_attribute (symbol_attribute * attr)
1450{
1451 atom_type t;
1452
1453 mio_lparen ();
1454
1455 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1456 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1457 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1458 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1459
1460 if (iomode == IO_OUTPUT)
1461 {
1462 if (attr->allocatable)
1463 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1464 if (attr->dimension)
1465 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1466 if (attr->external)
1467 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1468 if (attr->intrinsic)
1469 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1470 if (attr->optional)
1471 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1472 if (attr->pointer)
1473 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1474 if (attr->save)
1475 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1476 if (attr->target)
1477 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1478 if (attr->dummy)
1479 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
6de9cd9a
DN
1480 if (attr->result)
1481 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
3d79abbd 1482 /* We deliberately don't preserve the "entry" flag. */
6de9cd9a
DN
1483
1484 if (attr->data)
1485 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1486 if (attr->in_namelist)
1487 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1488 if (attr->in_common)
1489 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
6de9cd9a
DN
1490
1491 if (attr->function)
1492 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1493 if (attr->subroutine)
1494 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1495 if (attr->generic)
1496 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1497
1498 if (attr->sequence)
1499 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1500 if (attr->elemental)
1501 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1502 if (attr->pure)
1503 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1504 if (attr->recursive)
1505 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1506 if (attr->always_explicit)
1507 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1508
1509 mio_rparen ();
1510
1511 }
1512 else
1513 {
1514
1515 for (;;)
1516 {
1517 t = parse_atom ();
1518 if (t == ATOM_RPAREN)
1519 break;
1520 if (t != ATOM_NAME)
1521 bad_module ("Expected attribute bit name");
1522
1523 switch ((ab_attribute) find_enum (attr_bits))
1524 {
1525 case AB_ALLOCATABLE:
1526 attr->allocatable = 1;
1527 break;
1528 case AB_DIMENSION:
1529 attr->dimension = 1;
1530 break;
1531 case AB_EXTERNAL:
1532 attr->external = 1;
1533 break;
1534 case AB_INTRINSIC:
1535 attr->intrinsic = 1;
1536 break;
1537 case AB_OPTIONAL:
1538 attr->optional = 1;
1539 break;
1540 case AB_POINTER:
1541 attr->pointer = 1;
1542 break;
1543 case AB_SAVE:
1544 attr->save = 1;
1545 break;
1546 case AB_TARGET:
1547 attr->target = 1;
1548 break;
1549 case AB_DUMMY:
1550 attr->dummy = 1;
1551 break;
6de9cd9a
DN
1552 case AB_RESULT:
1553 attr->result = 1;
1554 break;
6de9cd9a
DN
1555 case AB_DATA:
1556 attr->data = 1;
1557 break;
1558 case AB_IN_NAMELIST:
1559 attr->in_namelist = 1;
1560 break;
1561 case AB_IN_COMMON:
1562 attr->in_common = 1;
1563 break;
6de9cd9a
DN
1564 case AB_FUNCTION:
1565 attr->function = 1;
1566 break;
1567 case AB_SUBROUTINE:
1568 attr->subroutine = 1;
1569 break;
1570 case AB_GENERIC:
1571 attr->generic = 1;
1572 break;
1573 case AB_SEQUENCE:
1574 attr->sequence = 1;
1575 break;
1576 case AB_ELEMENTAL:
1577 attr->elemental = 1;
1578 break;
1579 case AB_PURE:
1580 attr->pure = 1;
1581 break;
1582 case AB_RECURSIVE:
1583 attr->recursive = 1;
1584 break;
1585 case AB_ALWAYS_EXPLICIT:
1586 attr->always_explicit = 1;
1587 break;
1588 }
1589 }
1590 }
1591}
1592
1593
1594static const mstring bt_types[] = {
1595 minit ("INTEGER", BT_INTEGER),
1596 minit ("REAL", BT_REAL),
1597 minit ("COMPLEX", BT_COMPLEX),
1598 minit ("LOGICAL", BT_LOGICAL),
1599 minit ("CHARACTER", BT_CHARACTER),
1600 minit ("DERIVED", BT_DERIVED),
1601 minit ("PROCEDURE", BT_PROCEDURE),
1602 minit ("UNKNOWN", BT_UNKNOWN),
1603 minit (NULL, -1)
1604};
1605
1606
1607static void
1608mio_charlen (gfc_charlen ** clp)
1609{
1610 gfc_charlen *cl;
1611
1612 mio_lparen ();
1613
1614 if (iomode == IO_OUTPUT)
1615 {
1616 cl = *clp;
1617 if (cl != NULL)
1618 mio_expr (&cl->length);
1619 }
1620 else
1621 {
1622
1623 if (peek_atom () != ATOM_RPAREN)
1624 {
1625 cl = gfc_get_charlen ();
1626 mio_expr (&cl->length);
1627
1628 *clp = cl;
1629
1630 cl->next = gfc_current_ns->cl_list;
1631 gfc_current_ns->cl_list = cl;
1632 }
1633 }
1634
1635 mio_rparen ();
1636}
1637
1638
1639/* Return a symtree node with a name that is guaranteed to be unique
1640 within the namespace and corresponds to an illegal fortran name. */
1641
1642static gfc_symtree *
1643get_unique_symtree (gfc_namespace * ns)
1644{
1645 char name[GFC_MAX_SYMBOL_LEN + 1];
1646 static int serial = 0;
1647
1648 sprintf (name, "@%d", serial++);
1649 return gfc_new_symtree (&ns->sym_root, name);
1650}
1651
1652
1653/* See if a name is a generated name. */
1654
1655static int
1656check_unique_name (const char *name)
1657{
1658
1659 return *name == '@';
1660}
1661
1662
1663static void
1664mio_typespec (gfc_typespec * ts)
1665{
1666
1667 mio_lparen ();
1668
1669 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1670
1671 if (ts->type != BT_DERIVED)
1672 mio_integer (&ts->kind);
1673 else
1674 mio_symbol_ref (&ts->derived);
1675
1676 mio_charlen (&ts->cl);
1677
1678 mio_rparen ();
1679}
1680
1681
1682static const mstring array_spec_types[] = {
1683 minit ("EXPLICIT", AS_EXPLICIT),
1684 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1685 minit ("DEFERRED", AS_DEFERRED),
1686 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1687 minit (NULL, -1)
1688};
1689
1690
1691static void
1692mio_array_spec (gfc_array_spec ** asp)
1693{
1694 gfc_array_spec *as;
1695 int i;
1696
1697 mio_lparen ();
1698
1699 if (iomode == IO_OUTPUT)
1700 {
1701 if (*asp == NULL)
1702 goto done;
1703 as = *asp;
1704 }
1705 else
1706 {
1707 if (peek_atom () == ATOM_RPAREN)
1708 {
1709 *asp = NULL;
1710 goto done;
1711 }
1712
1713 *asp = as = gfc_get_array_spec ();
1714 }
1715
1716 mio_integer (&as->rank);
1717 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1718
1719 for (i = 0; i < as->rank; i++)
1720 {
1721 mio_expr (&as->lower[i]);
1722 mio_expr (&as->upper[i]);
1723 }
1724
1725done:
1726 mio_rparen ();
1727}
1728
1729
1730/* Given a pointer to an array reference structure (which lives in a
1731 gfc_ref structure), find the corresponding array specification
1732 structure. Storing the pointer in the ref structure doesn't quite
1733 work when loading from a module. Generating code for an array
1f2959f0 1734 reference also needs more information than just the array spec. */
6de9cd9a
DN
1735
1736static const mstring array_ref_types[] = {
1737 minit ("FULL", AR_FULL),
1738 minit ("ELEMENT", AR_ELEMENT),
1739 minit ("SECTION", AR_SECTION),
1740 minit (NULL, -1)
1741};
1742
1743static void
1744mio_array_ref (gfc_array_ref * ar)
1745{
1746 int i;
1747
1748 mio_lparen ();
1749 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1750 mio_integer (&ar->dimen);
1751
1752 switch (ar->type)
1753 {
1754 case AR_FULL:
1755 break;
1756
1757 case AR_ELEMENT:
1758 for (i = 0; i < ar->dimen; i++)
1759 mio_expr (&ar->start[i]);
1760
1761 break;
1762
1763 case AR_SECTION:
1764 for (i = 0; i < ar->dimen; i++)
1765 {
1766 mio_expr (&ar->start[i]);
1767 mio_expr (&ar->end[i]);
1768 mio_expr (&ar->stride[i]);
1769 }
1770
1771 break;
1772
1773 case AR_UNKNOWN:
1774 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1775 }
1776
1777 for (i = 0; i < ar->dimen; i++)
1778 mio_integer ((int *) &ar->dimen_type[i]);
1779
1780 if (iomode == IO_INPUT)
1781 {
63645982 1782 ar->where = gfc_current_locus;
6de9cd9a
DN
1783
1784 for (i = 0; i < ar->dimen; i++)
63645982 1785 ar->c_where[i] = gfc_current_locus;
6de9cd9a
DN
1786 }
1787
1788 mio_rparen ();
1789}
1790
1791
1792/* Saves or restores a pointer. The pointer is converted back and
1793 forth from an integer. We return the pointer_info pointer so that
1794 the caller can take additional action based on the pointer type. */
1795
1796static pointer_info *
1797mio_pointer_ref (void *gp)
1798{
1799 pointer_info *p;
1800
1801 if (iomode == IO_OUTPUT)
1802 {
1803 p = get_pointer (*((char **) gp));
1804 write_atom (ATOM_INTEGER, &p->integer);
1805 }
1806 else
1807 {
1808 require_atom (ATOM_INTEGER);
1809 p = add_fixup (atom_int, gp);
1810 }
1811
1812 return p;
1813}
1814
1815
1816/* Save and load references to components that occur within
1817 expressions. We have to describe these references by a number and
1818 by name. The number is necessary for forward references during
1819 reading, and the name is necessary if the symbol already exists in
1820 the namespace and is not loaded again. */
1821
1822static void
1823mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1824{
1825 char name[GFC_MAX_SYMBOL_LEN + 1];
1826 gfc_component *q;
1827 pointer_info *p;
1828
1829 p = mio_pointer_ref (cp);
1830 if (p->type == P_UNKNOWN)
1831 p->type = P_COMPONENT;
1832
1833 if (iomode == IO_OUTPUT)
cb9e4f55 1834 mio_pool_string (&(*cp)->name);
6de9cd9a
DN
1835 else
1836 {
1837 mio_internal_string (name);
1838
1839 if (sym->components != NULL && p->u.pointer == NULL)
1840 {
1841 /* Symbol already loaded, so search by name. */
1842 for (q = sym->components; q; q = q->next)
1843 if (strcmp (q->name, name) == 0)
1844 break;
1845
1846 if (q == NULL)
1847 gfc_internal_error ("mio_component_ref(): Component not found");
1848
1849 associate_integer_pointer (p, q);
1850 }
1851
1852 /* Make sure this symbol will eventually be loaded. */
1853 p = find_pointer2 (sym);
1854 if (p->u.rsym.state == UNUSED)
1855 p->u.rsym.state = NEEDED;
1856 }
1857}
1858
1859
1860static void
1861mio_component (gfc_component * c)
1862{
1863 pointer_info *p;
1864 int n;
1865
1866 mio_lparen ();
1867
1868 if (iomode == IO_OUTPUT)
1869 {
1870 p = get_pointer (c);
1871 mio_integer (&p->integer);
1872 }
1873 else
1874 {
1875 mio_integer (&n);
1876 p = get_integer (n);
1877 associate_integer_pointer (p, c);
1878 }
1879
1880 if (p->type == P_UNKNOWN)
1881 p->type = P_COMPONENT;
1882
cb9e4f55 1883 mio_pool_string (&c->name);
6de9cd9a
DN
1884 mio_typespec (&c->ts);
1885 mio_array_spec (&c->as);
1886
1887 mio_integer (&c->dimension);
1888 mio_integer (&c->pointer);
1889
1890 mio_expr (&c->initializer);
1891 mio_rparen ();
1892}
1893
1894
1895static void
1896mio_component_list (gfc_component ** cp)
1897{
1898 gfc_component *c, *tail;
1899
1900 mio_lparen ();
1901
1902 if (iomode == IO_OUTPUT)
1903 {
1904 for (c = *cp; c; c = c->next)
1905 mio_component (c);
1906 }
1907 else
1908 {
1909
1910 *cp = NULL;
1911 tail = NULL;
1912
1913 for (;;)
1914 {
1915 if (peek_atom () == ATOM_RPAREN)
1916 break;
1917
1918 c = gfc_get_component ();
1919 mio_component (c);
1920
1921 if (tail == NULL)
1922 *cp = c;
1923 else
1924 tail->next = c;
1925
1926 tail = c;
1927 }
1928 }
1929
1930 mio_rparen ();
1931}
1932
1933
1934static void
1935mio_actual_arg (gfc_actual_arglist * a)
1936{
1937
1938 mio_lparen ();
cb9e4f55 1939 mio_pool_string (&a->name);
6de9cd9a
DN
1940 mio_expr (&a->expr);
1941 mio_rparen ();
1942}
1943
1944
1945static void
1946mio_actual_arglist (gfc_actual_arglist ** ap)
1947{
1948 gfc_actual_arglist *a, *tail;
1949
1950 mio_lparen ();
1951
1952 if (iomode == IO_OUTPUT)
1953 {
1954 for (a = *ap; a; a = a->next)
1955 mio_actual_arg (a);
1956
1957 }
1958 else
1959 {
1960 tail = NULL;
1961
1962 for (;;)
1963 {
1964 if (peek_atom () != ATOM_LPAREN)
1965 break;
1966
1967 a = gfc_get_actual_arglist ();
1968
1969 if (tail == NULL)
1970 *ap = a;
1971 else
1972 tail->next = a;
1973
1974 tail = a;
1975 mio_actual_arg (a);
1976 }
1977 }
1978
1979 mio_rparen ();
1980}
1981
1982
1983/* Read and write formal argument lists. */
1984
1985static void
1986mio_formal_arglist (gfc_symbol * sym)
1987{
1988 gfc_formal_arglist *f, *tail;
1989
1990 mio_lparen ();
1991
1992 if (iomode == IO_OUTPUT)
1993 {
1994 for (f = sym->formal; f; f = f->next)
1995 mio_symbol_ref (&f->sym);
1996
1997 }
1998 else
1999 {
2000 sym->formal = tail = NULL;
2001
2002 while (peek_atom () != ATOM_RPAREN)
2003 {
2004 f = gfc_get_formal_arglist ();
2005 mio_symbol_ref (&f->sym);
2006
2007 if (sym->formal == NULL)
2008 sym->formal = f;
2009 else
2010 tail->next = f;
2011
2012 tail = f;
2013 }
2014 }
2015
2016 mio_rparen ();
2017}
2018
2019
2020/* Save or restore a reference to a symbol node. */
2021
2022void
2023mio_symbol_ref (gfc_symbol ** symp)
2024{
2025 pointer_info *p;
2026
2027 p = mio_pointer_ref (symp);
2028 if (p->type == P_UNKNOWN)
2029 p->type = P_SYMBOL;
2030
2031 if (iomode == IO_OUTPUT)
2032 {
2033 if (p->u.wsym.state == UNREFERENCED)
2034 p->u.wsym.state = NEEDS_WRITE;
2035 }
2036 else
2037 {
2038 if (p->u.rsym.state == UNUSED)
2039 p->u.rsym.state = NEEDED;
2040 }
2041}
2042
2043
2044/* Save or restore a reference to a symtree node. */
2045
2046static void
2047mio_symtree_ref (gfc_symtree ** stp)
2048{
2049 pointer_info *p;
2050 fixup_t *f;
2051
2052 if (iomode == IO_OUTPUT)
2053 {
2054 mio_symbol_ref (&(*stp)->n.sym);
2055 }
2056 else
2057 {
2058 require_atom (ATOM_INTEGER);
2059 p = get_integer (atom_int);
2060 if (p->type == P_UNKNOWN)
2061 p->type = P_SYMBOL;
2062
2063 if (p->u.rsym.state == UNUSED)
2064 p->u.rsym.state = NEEDED;
2065
2066 if (p->u.rsym.symtree != NULL)
2067 {
2068 *stp = p->u.rsym.symtree;
2069 }
2070 else
2071 {
2072 f = gfc_getmem (sizeof (fixup_t));
2073
2074 f->next = p->u.rsym.stfixup;
2075 p->u.rsym.stfixup = f;
2076
2077 f->pointer = (void **)stp;
2078 }
2079 }
2080}
2081
2082static void
2083mio_iterator (gfc_iterator ** ip)
2084{
2085 gfc_iterator *iter;
2086
2087 mio_lparen ();
2088
2089 if (iomode == IO_OUTPUT)
2090 {
2091 if (*ip == NULL)
2092 goto done;
2093 }
2094 else
2095 {
2096 if (peek_atom () == ATOM_RPAREN)
2097 {
2098 *ip = NULL;
2099 goto done;
2100 }
2101
2102 *ip = gfc_get_iterator ();
2103 }
2104
2105 iter = *ip;
2106
2107 mio_expr (&iter->var);
2108 mio_expr (&iter->start);
2109 mio_expr (&iter->end);
2110 mio_expr (&iter->step);
2111
2112done:
2113 mio_rparen ();
2114}
2115
2116
2117
2118static void
2119mio_constructor (gfc_constructor ** cp)
2120{
2121 gfc_constructor *c, *tail;
2122
2123 mio_lparen ();
2124
2125 if (iomode == IO_OUTPUT)
2126 {
2127 for (c = *cp; c; c = c->next)
2128 {
2129 mio_lparen ();
2130 mio_expr (&c->expr);
2131 mio_iterator (&c->iterator);
2132 mio_rparen ();
2133 }
2134 }
2135 else
2136 {
2137
2138 *cp = NULL;
2139 tail = NULL;
2140
2141 while (peek_atom () != ATOM_RPAREN)
2142 {
2143 c = gfc_get_constructor ();
2144
2145 if (tail == NULL)
2146 *cp = c;
2147 else
2148 tail->next = c;
2149
2150 tail = c;
2151
2152 mio_lparen ();
2153 mio_expr (&c->expr);
2154 mio_iterator (&c->iterator);
2155 mio_rparen ();
2156 }
2157 }
2158
2159 mio_rparen ();
2160}
2161
2162
2163
2164static const mstring ref_types[] = {
2165 minit ("ARRAY", REF_ARRAY),
2166 minit ("COMPONENT", REF_COMPONENT),
2167 minit ("SUBSTRING", REF_SUBSTRING),
2168 minit (NULL, -1)
2169};
2170
2171
2172static void
2173mio_ref (gfc_ref ** rp)
2174{
2175 gfc_ref *r;
2176
2177 mio_lparen ();
2178
2179 r = *rp;
2180 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2181
2182 switch (r->type)
2183 {
2184 case REF_ARRAY:
2185 mio_array_ref (&r->u.ar);
2186 break;
2187
2188 case REF_COMPONENT:
2189 mio_symbol_ref (&r->u.c.sym);
2190 mio_component_ref (&r->u.c.component, r->u.c.sym);
2191 break;
2192
2193 case REF_SUBSTRING:
2194 mio_expr (&r->u.ss.start);
2195 mio_expr (&r->u.ss.end);
2196 mio_charlen (&r->u.ss.length);
2197 break;
2198 }
2199
2200 mio_rparen ();
2201}
2202
2203
2204static void
2205mio_ref_list (gfc_ref ** rp)
2206{
2207 gfc_ref *ref, *head, *tail;
2208
2209 mio_lparen ();
2210
2211 if (iomode == IO_OUTPUT)
2212 {
2213 for (ref = *rp; ref; ref = ref->next)
2214 mio_ref (&ref);
2215 }
2216 else
2217 {
2218 head = tail = NULL;
2219
2220 while (peek_atom () != ATOM_RPAREN)
2221 {
2222 if (head == NULL)
2223 head = tail = gfc_get_ref ();
2224 else
2225 {
2226 tail->next = gfc_get_ref ();
2227 tail = tail->next;
2228 }
2229
2230 mio_ref (&tail);
2231 }
2232
2233 *rp = head;
2234 }
2235
2236 mio_rparen ();
2237}
2238
2239
2240/* Read and write an integer value. */
2241
2242static void
2243mio_gmp_integer (mpz_t * integer)
2244{
2245 char *p;
2246
2247 if (iomode == IO_INPUT)
2248 {
2249 if (parse_atom () != ATOM_STRING)
2250 bad_module ("Expected integer string");
2251
2252 mpz_init (*integer);
2253 if (mpz_set_str (*integer, atom_string, 10))
2254 bad_module ("Error converting integer");
2255
2256 gfc_free (atom_string);
2257
2258 }
2259 else
2260 {
2261 p = mpz_get_str (NULL, 10, *integer);
2262 write_atom (ATOM_STRING, p);
2263 gfc_free (p);
2264 }
2265}
2266
2267
2268static void
f8e566e5 2269mio_gmp_real (mpfr_t * real)
6de9cd9a
DN
2270{
2271 mp_exp_t exponent;
2272 char *p;
2273
2274 if (iomode == IO_INPUT)
2275 {
2276 if (parse_atom () != ATOM_STRING)
2277 bad_module ("Expected real string");
2278
f8e566e5
SK
2279 mpfr_init (*real);
2280 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
6de9cd9a
DN
2281 gfc_free (atom_string);
2282
2283 }
2284 else
2285 {
f8e566e5 2286 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
6de9cd9a
DN
2287 atom_string = gfc_getmem (strlen (p) + 20);
2288
2289 sprintf (atom_string, "0.%s@%ld", p, exponent);
78f2fb08
TS
2290
2291 /* Fix negative numbers. */
2292 if (atom_string[2] == '-')
2293 {
2294 atom_string[0] = '-';
2295 atom_string[1] = '0';
2296 atom_string[2] = '.';
2297 }
2298
6de9cd9a
DN
2299 write_atom (ATOM_STRING, atom_string);
2300
2301 gfc_free (atom_string);
2302 gfc_free (p);
2303 }
2304}
2305
2306
2307/* Save and restore the shape of an array constructor. */
2308
2309static void
2310mio_shape (mpz_t ** pshape, int rank)
2311{
2312 mpz_t *shape;
2313 atom_type t;
2314 int n;
2315
2316 /* A NULL shape is represented by (). */
2317 mio_lparen ();
2318
2319 if (iomode == IO_OUTPUT)
2320 {
2321 shape = *pshape;
2322 if (!shape)
2323 {
2324 mio_rparen ();
2325 return;
2326 }
2327 }
2328 else
2329 {
2330 t = peek_atom ();
2331 if (t == ATOM_RPAREN)
2332 {
2333 *pshape = NULL;
2334 mio_rparen ();
2335 return;
2336 }
2337
2338 shape = gfc_get_shape (rank);
2339 *pshape = shape;
2340 }
2341
2342 for (n = 0; n < rank; n++)
2343 mio_gmp_integer (&shape[n]);
2344
2345 mio_rparen ();
2346}
2347
2348
2349static const mstring expr_types[] = {
2350 minit ("OP", EXPR_OP),
2351 minit ("FUNCTION", EXPR_FUNCTION),
2352 minit ("CONSTANT", EXPR_CONSTANT),
2353 minit ("VARIABLE", EXPR_VARIABLE),
2354 minit ("SUBSTRING", EXPR_SUBSTRING),
2355 minit ("STRUCTURE", EXPR_STRUCTURE),
2356 minit ("ARRAY", EXPR_ARRAY),
2357 minit ("NULL", EXPR_NULL),
2358 minit (NULL, -1)
2359};
2360
2361/* INTRINSIC_ASSIGN is missing because it is used as an index for
2362 generic operators, not in expressions. INTRINSIC_USER is also
f7b529fa 2363 replaced by the correct function name by the time we see it. */
6de9cd9a
DN
2364
2365static const mstring intrinsics[] =
2366{
2367 minit ("UPLUS", INTRINSIC_UPLUS),
2368 minit ("UMINUS", INTRINSIC_UMINUS),
2369 minit ("PLUS", INTRINSIC_PLUS),
2370 minit ("MINUS", INTRINSIC_MINUS),
2371 minit ("TIMES", INTRINSIC_TIMES),
2372 minit ("DIVIDE", INTRINSIC_DIVIDE),
2373 minit ("POWER", INTRINSIC_POWER),
2374 minit ("CONCAT", INTRINSIC_CONCAT),
2375 minit ("AND", INTRINSIC_AND),
2376 minit ("OR", INTRINSIC_OR),
2377 minit ("EQV", INTRINSIC_EQV),
2378 minit ("NEQV", INTRINSIC_NEQV),
2379 minit ("EQ", INTRINSIC_EQ),
2380 minit ("NE", INTRINSIC_NE),
2381 minit ("GT", INTRINSIC_GT),
2382 minit ("GE", INTRINSIC_GE),
2383 minit ("LT", INTRINSIC_LT),
2384 minit ("LE", INTRINSIC_LE),
2385 minit ("NOT", INTRINSIC_NOT),
2386 minit (NULL, -1)
2387};
2388
2389/* Read and write expressions. The form "()" is allowed to indicate a
2390 NULL expression. */
2391
2392static void
2393mio_expr (gfc_expr ** ep)
2394{
2395 gfc_expr *e;
2396 atom_type t;
2397 int flag;
2398
2399 mio_lparen ();
2400
2401 if (iomode == IO_OUTPUT)
2402 {
2403 if (*ep == NULL)
2404 {
2405 mio_rparen ();
2406 return;
2407 }
2408
2409 e = *ep;
2410 MIO_NAME(expr_t) (e->expr_type, expr_types);
2411
2412 }
2413 else
2414 {
2415 t = parse_atom ();
2416 if (t == ATOM_RPAREN)
2417 {
2418 *ep = NULL;
2419 return;
2420 }
2421
2422 if (t != ATOM_NAME)
2423 bad_module ("Expected expression type");
2424
2425 e = *ep = gfc_get_expr ();
63645982 2426 e->where = gfc_current_locus;
6de9cd9a
DN
2427 e->expr_type = (expr_t) find_enum (expr_types);
2428 }
2429
2430 mio_typespec (&e->ts);
2431 mio_integer (&e->rank);
2432
2433 switch (e->expr_type)
2434 {
2435 case EXPR_OP:
58b03ab2
TS
2436 e->value.op.operator
2437 = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
6de9cd9a 2438
58b03ab2 2439 switch (e->value.op.operator)
6de9cd9a
DN
2440 {
2441 case INTRINSIC_UPLUS:
2442 case INTRINSIC_UMINUS:
2443 case INTRINSIC_NOT:
58b03ab2 2444 mio_expr (&e->value.op.op1);
6de9cd9a
DN
2445 break;
2446
2447 case INTRINSIC_PLUS:
2448 case INTRINSIC_MINUS:
2449 case INTRINSIC_TIMES:
2450 case INTRINSIC_DIVIDE:
2451 case INTRINSIC_POWER:
2452 case INTRINSIC_CONCAT:
2453 case INTRINSIC_AND:
2454 case INTRINSIC_OR:
2455 case INTRINSIC_EQV:
2456 case INTRINSIC_NEQV:
2457 case INTRINSIC_EQ:
2458 case INTRINSIC_NE:
2459 case INTRINSIC_GT:
2460 case INTRINSIC_GE:
2461 case INTRINSIC_LT:
2462 case INTRINSIC_LE:
58b03ab2
TS
2463 mio_expr (&e->value.op.op1);
2464 mio_expr (&e->value.op.op2);
6de9cd9a
DN
2465 break;
2466
2467 default:
2468 bad_module ("Bad operator");
2469 }
2470
2471 break;
2472
2473 case EXPR_FUNCTION:
2474 mio_symtree_ref (&e->symtree);
2475 mio_actual_arglist (&e->value.function.actual);
2476
2477 if (iomode == IO_OUTPUT)
2478 {
6b25a558
RH
2479 e->value.function.name
2480 = mio_allocated_string (e->value.function.name);
6de9cd9a
DN
2481 flag = e->value.function.esym != NULL;
2482 mio_integer (&flag);
2483 if (flag)
2484 mio_symbol_ref (&e->value.function.esym);
2485 else
2486 write_atom (ATOM_STRING, e->value.function.isym->name);
2487
2488 }
2489 else
2490 {
2491 require_atom (ATOM_STRING);
2492 e->value.function.name = gfc_get_string (atom_string);
2493 gfc_free (atom_string);
2494
2495 mio_integer (&flag);
2496 if (flag)
2497 mio_symbol_ref (&e->value.function.esym);
2498 else
2499 {
2500 require_atom (ATOM_STRING);
2501 e->value.function.isym = gfc_find_function (atom_string);
2502 gfc_free (atom_string);
2503 }
2504 }
2505
2506 break;
2507
2508 case EXPR_VARIABLE:
2509 mio_symtree_ref (&e->symtree);
2510 mio_ref_list (&e->ref);
2511 break;
2512
2513 case EXPR_SUBSTRING:
6b25a558
RH
2514 e->value.character.string = (char *)
2515 mio_allocated_string (e->value.character.string);
eac33acc 2516 mio_ref_list (&e->ref);
6de9cd9a
DN
2517 break;
2518
2519 case EXPR_STRUCTURE:
2520 case EXPR_ARRAY:
2521 mio_constructor (&e->value.constructor);
2522 mio_shape (&e->shape, e->rank);
2523 break;
2524
2525 case EXPR_CONSTANT:
2526 switch (e->ts.type)
2527 {
2528 case BT_INTEGER:
2529 mio_gmp_integer (&e->value.integer);
2530 break;
2531
2532 case BT_REAL:
f8e566e5 2533 gfc_set_model_kind (e->ts.kind);
6de9cd9a
DN
2534 mio_gmp_real (&e->value.real);
2535 break;
2536
2537 case BT_COMPLEX:
f8e566e5 2538 gfc_set_model_kind (e->ts.kind);
6de9cd9a
DN
2539 mio_gmp_real (&e->value.complex.r);
2540 mio_gmp_real (&e->value.complex.i);
2541 break;
2542
2543 case BT_LOGICAL:
2544 mio_integer (&e->value.logical);
2545 break;
2546
2547 case BT_CHARACTER:
2548 mio_integer (&e->value.character.length);
6b25a558
RH
2549 e->value.character.string = (char *)
2550 mio_allocated_string (e->value.character.string);
6de9cd9a
DN
2551 break;
2552
2553 default:
2554 bad_module ("Bad type in constant expression");
2555 }
2556
2557 break;
2558
2559 case EXPR_NULL:
2560 break;
2561 }
2562
2563 mio_rparen ();
2564}
2565
2566
2567/* Save/restore lists of gfc_interface stuctures. When loading an
2568 interface, we are really appending to the existing list of
2569 interfaces. Checking for duplicate and ambiguous interfaces has to
2570 be done later when all symbols have been loaded. */
2571
2572static void
2573mio_interface_rest (gfc_interface ** ip)
2574{
2575 gfc_interface *tail, *p;
2576
2577 if (iomode == IO_OUTPUT)
2578 {
2579 if (ip != NULL)
2580 for (p = *ip; p; p = p->next)
2581 mio_symbol_ref (&p->sym);
2582 }
2583 else
2584 {
2585
2586 if (*ip == NULL)
2587 tail = NULL;
2588 else
2589 {
2590 tail = *ip;
2591 while (tail->next)
2592 tail = tail->next;
2593 }
2594
2595 for (;;)
2596 {
2597 if (peek_atom () == ATOM_RPAREN)
2598 break;
2599
2600 p = gfc_get_interface ();
5c76089a 2601 p->where = gfc_current_locus;
6de9cd9a
DN
2602 mio_symbol_ref (&p->sym);
2603
2604 if (tail == NULL)
2605 *ip = p;
2606 else
2607 tail->next = p;
2608
2609 tail = p;
2610 }
2611 }
2612
2613 mio_rparen ();
2614}
2615
2616
2617/* Save/restore a nameless operator interface. */
2618
2619static void
2620mio_interface (gfc_interface ** ip)
2621{
2622
2623 mio_lparen ();
2624 mio_interface_rest (ip);
2625}
2626
2627
2628/* Save/restore a named operator interface. */
2629
2630static void
cb9e4f55 2631mio_symbol_interface (const char **name, const char **module,
6de9cd9a
DN
2632 gfc_interface ** ip)
2633{
2634
2635 mio_lparen ();
2636
cb9e4f55
TS
2637 mio_pool_string (name);
2638 mio_pool_string (module);
6de9cd9a
DN
2639
2640 mio_interface_rest (ip);
2641}
2642
2643
2644static void
2645mio_namespace_ref (gfc_namespace ** nsp)
2646{
2647 gfc_namespace *ns;
2648 pointer_info *p;
2649
2650 p = mio_pointer_ref (nsp);
2651
2652 if (p->type == P_UNKNOWN)
2653 p->type = P_NAMESPACE;
2654
3d79abbd 2655 if (iomode == IO_INPUT && p->integer != 0)
6de9cd9a 2656 {
3d79abbd
PB
2657 ns = (gfc_namespace *)p->u.pointer;
2658 if (ns == NULL)
2659 {
0366dfe9 2660 ns = gfc_get_namespace (NULL, 0);
3d79abbd
PB
2661 associate_integer_pointer (p, ns);
2662 }
2663 else
2664 ns->refs++;
6de9cd9a
DN
2665 }
2666}
2667
2668
2669/* Unlike most other routines, the address of the symbol node is
2670 already fixed on input and the name/module has already been filled
2671 in. */
2672
2673static void
2674mio_symbol (gfc_symbol * sym)
2675{
2676 gfc_formal_arglist *formal;
2677
2678 mio_lparen ();
2679
2680 mio_symbol_attribute (&sym->attr);
2681 mio_typespec (&sym->ts);
2682
2683 /* Contained procedures don't have formal namespaces. Instead we output the
2684 procedure namespace. The will contain the formal arguments. */
2685 if (iomode == IO_OUTPUT)
2686 {
2687 formal = sym->formal;
2688 while (formal && !formal->sym)
2689 formal = formal->next;
2690
2691 if (formal)
2692 mio_namespace_ref (&formal->sym->ns);
2693 else
2694 mio_namespace_ref (&sym->formal_ns);
2695 }
2696 else
2697 {
2698 mio_namespace_ref (&sym->formal_ns);
2699 if (sym->formal_ns)
2700 {
2701 sym->formal_ns->proc_name = sym;
2702 sym->refs++;
2703 }
2704 }
2705
2706 /* Save/restore common block links */
6de9cd9a
DN
2707 mio_symbol_ref (&sym->common_next);
2708
2709 mio_formal_arglist (sym);
2710
8598a113
TS
2711 if (sym->attr.flavor == FL_PARAMETER)
2712 mio_expr (&sym->value);
2713
6de9cd9a
DN
2714 mio_array_spec (&sym->as);
2715
2716 mio_symbol_ref (&sym->result);
2717
2718 /* Note that components are always saved, even if they are supposed
2719 to be private. Component access is checked during searching. */
2720
2721 mio_component_list (&sym->components);
2722
2723 if (sym->components != NULL)
2724 sym->component_access =
2725 MIO_NAME(gfc_access) (sym->component_access, access_types);
2726
6de9cd9a
DN
2727 mio_rparen ();
2728}
2729
2730
2731/************************* Top level subroutines *************************/
2732
2733/* Skip a list between balanced left and right parens. */
2734
2735static void
2736skip_list (void)
2737{
2738 int level;
2739
2740 level = 0;
2741 do
2742 {
2743 switch (parse_atom ())
2744 {
2745 case ATOM_LPAREN:
2746 level++;
2747 break;
2748
2749 case ATOM_RPAREN:
2750 level--;
2751 break;
2752
2753 case ATOM_STRING:
2754 gfc_free (atom_string);
2755 break;
2756
2757 case ATOM_NAME:
2758 case ATOM_INTEGER:
2759 break;
2760 }
2761 }
2762 while (level > 0);
2763}
2764
2765
2766/* Load operator interfaces from the module. Interfaces are unusual
2767 in that they attach themselves to existing symbols. */
2768
2769static void
2770load_operator_interfaces (void)
2771{
2772 const char *p;
2773 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2774 gfc_user_op *uop;
2775
2776 mio_lparen ();
2777
2778 while (peek_atom () != ATOM_RPAREN)
2779 {
2780 mio_lparen ();
2781
2782 mio_internal_string (name);
2783 mio_internal_string (module);
2784
2785 /* Decide if we need to load this one or not. */
2786 p = find_use_name (name);
2787 if (p == NULL)
2788 {
2789 while (parse_atom () != ATOM_RPAREN);
2790 }
2791 else
2792 {
2793 uop = gfc_get_uop (p);
2794 mio_interface_rest (&uop->operator);
2795 }
2796 }
2797
2798 mio_rparen ();
2799}
2800
2801
2802/* Load interfaces from the module. Interfaces are unusual in that
2803 they attach themselves to existing symbols. */
2804
2805static void
2806load_generic_interfaces (void)
2807{
2808 const char *p;
2809 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2810 gfc_symbol *sym;
2811
2812 mio_lparen ();
2813
2814 while (peek_atom () != ATOM_RPAREN)
2815 {
2816 mio_lparen ();
2817
2818 mio_internal_string (name);
2819 mio_internal_string (module);
2820
2821 /* Decide if we need to load this one or not. */
2822 p = find_use_name (name);
2823
2824 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2825 {
2826 while (parse_atom () != ATOM_RPAREN);
2827 continue;
2828 }
2829
2830 if (sym == NULL)
2831 {
2832 gfc_get_symbol (p, NULL, &sym);
2833
2834 sym->attr.flavor = FL_PROCEDURE;
2835 sym->attr.generic = 1;
2836 sym->attr.use_assoc = 1;
2837 }
2838
2839 mio_interface_rest (&sym->generic);
2840 }
2841
2842 mio_rparen ();
2843}
2844
2845
9056bd70
TS
2846/* Load common blocks. */
2847
2848static void
2849load_commons(void)
2850{
2851 char name[GFC_MAX_SYMBOL_LEN+1];
2852 gfc_common_head *p;
2853
2854 mio_lparen ();
2855
2856 while (peek_atom () != ATOM_RPAREN)
2857 {
2858 mio_lparen ();
2859 mio_internal_string (name);
2860
53814b8f 2861 p = gfc_get_common (name, 1);
9056bd70
TS
2862
2863 mio_symbol_ref (&p->head);
2864 mio_integer (&p->saved);
2865 p->use_assoc = 1;
2866
2867 mio_rparen();
2868 }
2869
2870 mio_rparen();
2871}
2872
2873
6de9cd9a
DN
2874/* Recursive function to traverse the pointer_info tree and load a
2875 needed symbol. We return nonzero if we load a symbol and stop the
2876 traversal, because the act of loading can alter the tree. */
2877
2878static int
2879load_needed (pointer_info * p)
2880{
2881 gfc_namespace *ns;
2882 pointer_info *q;
2883 gfc_symbol *sym;
2884
2885 if (p == NULL)
2886 return 0;
2887 if (load_needed (p->left))
2888 return 1;
2889 if (load_needed (p->right))
2890 return 1;
2891
2892 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
2893 return 0;
2894
2895 p->u.rsym.state = USED;
2896
2897 set_module_locus (&p->u.rsym.where);
2898
2899 sym = p->u.rsym.sym;
2900 if (sym == NULL)
2901 {
2902 q = get_integer (p->u.rsym.ns);
2903
2904 ns = (gfc_namespace *) q->u.pointer;
2905 if (ns == NULL)
2906 {
2907 /* Create an interface namespace if necessary. These are
2908 the namespaces that hold the formal parameters of module
2909 procedures. */
2910
0366dfe9 2911 ns = gfc_get_namespace (NULL, 0);
6de9cd9a
DN
2912 associate_integer_pointer (q, ns);
2913 }
2914
2915 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
cb9e4f55 2916 sym->module = gfc_get_string (p->u.rsym.module);
6de9cd9a
DN
2917
2918 associate_integer_pointer (p, sym);
2919 }
2920
2921 mio_symbol (sym);
2922 sym->attr.use_assoc = 1;
2923
2924 return 1;
2925}
2926
2927
2928/* Recursive function for cleaning up things after a module has been
2929 read. */
2930
2931static void
2932read_cleanup (pointer_info * p)
2933{
2934 gfc_symtree *st;
2935 pointer_info *q;
2936
2937 if (p == NULL)
2938 return;
2939
2940 read_cleanup (p->left);
2941 read_cleanup (p->right);
2942
2943 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
2944 {
2945 /* Add hidden symbols to the symtree. */
2946 q = get_integer (p->u.rsym.ns);
2947 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
2948
2949 st->n.sym = p->u.rsym.sym;
2950 st->n.sym->refs++;
2951
2952 /* Fixup any symtree references. */
2953 p->u.rsym.symtree = st;
2954 resolve_fixups (p->u.rsym.stfixup, st);
2955 p->u.rsym.stfixup = NULL;
2956 }
2957
2958 /* Free unused symbols. */
2959 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
2960 gfc_free_symbol (p->u.rsym.sym);
2961}
2962
2963
2964/* Read a module file. */
2965
2966static void
2967read_module (void)
2968{
2969 module_locus operator_interfaces, user_operators;
2970 const char *p;
2971 char name[GFC_MAX_SYMBOL_LEN + 1];
2972 gfc_intrinsic_op i;
2973 int ambiguous, symbol;
2974 pointer_info *info;
2975 gfc_use_rename *u;
2976 gfc_symtree *st;
2977 gfc_symbol *sym;
2978
2979 get_module_locus (&operator_interfaces); /* Skip these for now */
2980 skip_list ();
2981
2982 get_module_locus (&user_operators);
2983 skip_list ();
2984 skip_list ();
9056bd70 2985 skip_list ();
6de9cd9a
DN
2986
2987 mio_lparen ();
2988
2989 /* Create the fixup nodes for all the symbols. */
2990
2991 while (peek_atom () != ATOM_RPAREN)
2992 {
2993 require_atom (ATOM_INTEGER);
2994 info = get_integer (atom_int);
2995
2996 info->type = P_SYMBOL;
2997 info->u.rsym.state = UNUSED;
2998
2999 mio_internal_string (info->u.rsym.true_name);
3000 mio_internal_string (info->u.rsym.module);
3001
3002 require_atom (ATOM_INTEGER);
3003 info->u.rsym.ns = atom_int;
3004
3005 get_module_locus (&info->u.rsym.where);
3006 skip_list ();
3007
3008 /* See if the symbol has already been loaded by a previous module.
3009 If so, we reference the existing symbol and prevent it from
3010 being loaded again. */
3011
3012 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3013 if (sym == NULL)
3014 continue;
3015
3016 info->u.rsym.state = USED;
3017 info->u.rsym.referenced = 1;
3018 info->u.rsym.sym = sym;
3019 }
3020
3021 mio_rparen ();
3022
3023 /* Parse the symtree lists. This lets us mark which symbols need to
3024 be loaded. Renaming is also done at this point by replacing the
3025 symtree name. */
3026
3027 mio_lparen ();
3028
3029 while (peek_atom () != ATOM_RPAREN)
3030 {
3031 mio_internal_string (name);
3032 mio_integer (&ambiguous);
3033 mio_integer (&symbol);
3034
3035 info = get_integer (symbol);
3036
3037 /* Get the local name for this symbol. */
3038 p = find_use_name (name);
3039
3040 /* Skip symtree nodes not in an ONLY caluse. */
3041 if (p == NULL)
3042 continue;
3043
3044 /* Check for ambiguous symbols. */
3045 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3046
3047 if (st != NULL)
3048 {
3049 if (st->n.sym != info->u.rsym.sym)
3050 st->ambiguous = 1;
3051 info->u.rsym.symtree = st;
3052 }
3053 else
3054 {
3055 /* Create a symtree node in the current namespace for this symbol. */
3056 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3057 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3058
3059 st->ambiguous = ambiguous;
3060
3061 sym = info->u.rsym.sym;
3062
3063 /* Create a symbol node if it doesn't already exist. */
3064 if (sym == NULL)
3065 {
3066 sym = info->u.rsym.sym =
3067 gfc_new_symbol (info->u.rsym.true_name, gfc_current_ns);
3068
cb9e4f55 3069 sym->module = gfc_get_string (info->u.rsym.module);
6de9cd9a
DN
3070 }
3071
3072 st->n.sym = sym;
3073 st->n.sym->refs++;
3074
3075 /* Store the symtree pointing to this symbol. */
3076 info->u.rsym.symtree = st;
3077
3078 if (info->u.rsym.state == UNUSED)
3079 info->u.rsym.state = NEEDED;
3080 info->u.rsym.referenced = 1;
3081 }
3082 }
3083
3084 mio_rparen ();
3085
3086 /* Load intrinsic operator interfaces. */
3087 set_module_locus (&operator_interfaces);
3088 mio_lparen ();
3089
3090 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3091 {
3092 if (i == INTRINSIC_USER)
3093 continue;
3094
3095 if (only_flag)
3096 {
3097 u = find_use_operator (i);
3098
3099 if (u == NULL)
3100 {
3101 skip_list ();
3102 continue;
3103 }
3104
3105 u->found = 1;
3106 }
3107
3108 mio_interface (&gfc_current_ns->operator[i]);
3109 }
3110
3111 mio_rparen ();
3112
3113 /* Load generic and user operator interfaces. These must follow the
3114 loading of symtree because otherwise symbols can be marked as
3115 ambiguous. */
3116
3117 set_module_locus (&user_operators);
3118
3119 load_operator_interfaces ();
3120 load_generic_interfaces ();
3121
9056bd70
TS
3122 load_commons ();
3123
6de9cd9a
DN
3124 /* At this point, we read those symbols that are needed but haven't
3125 been loaded yet. If one symbol requires another, the other gets
3126 marked as NEEDED if its previous state was UNUSED. */
3127
3128 while (load_needed (pi_root));
3129
3130 /* Make sure all elements of the rename-list were found in the
3131 module. */
3132
3133 for (u = gfc_rename_list; u; u = u->next)
3134 {
3135 if (u->found)
3136 continue;
3137
3138 if (u->operator == INTRINSIC_NONE)
3139 {
3140 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3141 u->use_name, &u->where, module_name);
3142 continue;
3143 }
3144
3145 if (u->operator == INTRINSIC_USER)
3146 {
3147 gfc_error
3148 ("User operator '%s' referenced at %L not found in module '%s'",
3149 u->use_name, &u->where, module_name);
3150 continue;
3151 }
3152
3153 gfc_error
3154 ("Intrinsic operator '%s' referenced at %L not found in module "
3155 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3156 }
3157
3158 gfc_check_interfaces (gfc_current_ns);
3159
3160 /* Clean up symbol nodes that were never loaded, create references
3161 to hidden symbols. */
3162
3163 read_cleanup (pi_root);
3164}
3165
3166
3167/* Given an access type that is specific to an entity and the default
af30f793 3168 access, return nonzero if the entity is publicly accessible. */
6de9cd9a 3169
af30f793
PB
3170bool
3171gfc_check_access (gfc_access specific_access, gfc_access default_access)
6de9cd9a
DN
3172{
3173
3174 if (specific_access == ACCESS_PUBLIC)
af30f793 3175 return TRUE;
6de9cd9a 3176 if (specific_access == ACCESS_PRIVATE)
af30f793 3177 return FALSE;
6de9cd9a
DN
3178
3179 if (gfc_option.flag_module_access_private)
af30f793 3180 return default_access == ACCESS_PUBLIC;
6de9cd9a 3181 else
af30f793 3182 return default_access != ACCESS_PRIVATE;
6de9cd9a 3183
af30f793 3184 return FALSE;
6de9cd9a
DN
3185}
3186
3187
9056bd70
TS
3188/* Write a common block to the module */
3189
3190static void
3191write_common (gfc_symtree *st)
3192{
3193 gfc_common_head *p;
3194
3195 if (st == NULL)
3196 return;
3197
3198 write_common(st->left);
3199 write_common(st->right);
3200
3201 mio_lparen();
cb9e4f55 3202 mio_pool_string(&st->name);
9056bd70
TS
3203
3204 p = st->n.common;
3205 mio_symbol_ref(&p->head);
3206 mio_integer(&p->saved);
3207
3208 mio_rparen();
3209}
3210
3211
6de9cd9a
DN
3212/* Write a symbol to the module. */
3213
3214static void
3215write_symbol (int n, gfc_symbol * sym)
3216{
3217
3218 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3219 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3220
3221 mio_integer (&n);
cb9e4f55 3222 mio_pool_string (&sym->name);
6de9cd9a 3223
cb9e4f55 3224 mio_pool_string (&sym->module);
6de9cd9a
DN
3225 mio_pointer_ref (&sym->ns);
3226
3227 mio_symbol (sym);
3228 write_char ('\n');
3229}
3230
3231
3232/* Recursive traversal function to write the initial set of symbols to
3233 the module. We check to see if the symbol should be written
3234 according to the access specification. */
3235
3236static void
3237write_symbol0 (gfc_symtree * st)
3238{
3239 gfc_symbol *sym;
3240 pointer_info *p;
3241
3242 if (st == NULL)
3243 return;
3244
3245 write_symbol0 (st->left);
3246 write_symbol0 (st->right);
3247
3248 sym = st->n.sym;
cb9e4f55
TS
3249 if (sym->module == NULL)
3250 sym->module = gfc_get_string (module_name);
6de9cd9a
DN
3251
3252 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3253 && !sym->attr.subroutine && !sym->attr.function)
3254 return;
3255
af30f793 3256 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
6de9cd9a
DN
3257 return;
3258
3259 p = get_pointer (sym);
3260 if (p->type == P_UNKNOWN)
3261 p->type = P_SYMBOL;
3262
3263 if (p->u.wsym.state == WRITTEN)
3264 return;
3265
3266 write_symbol (p->integer, sym);
3267 p->u.wsym.state = WRITTEN;
3268
3269 return;
3270}
3271
3272
3273/* Recursive traversal function to write the secondary set of symbols
3274 to the module file. These are symbols that were not public yet are
3275 needed by the public symbols or another dependent symbol. The act
3276 of writing a symbol can modify the pointer_info tree, so we cease
3277 traversal if we find a symbol to write. We return nonzero if a
3278 symbol was written and pass that information upwards. */
3279
3280static int
3281write_symbol1 (pointer_info * p)
3282{
3283
3284 if (p == NULL)
3285 return 0;
3286
3287 if (write_symbol1 (p->left))
3288 return 1;
3289 if (write_symbol1 (p->right))
3290 return 1;
3291
3292 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3293 return 0;
3294
36f4d144
TS
3295 /* FIXME: This shouldn't be necessary, but it works around
3296 deficiencies in the module loader or/and symbol handling. */
cb9e4f55
TS
3297 if (p->u.wsym.sym->module == NULL && p->u.wsym.sym->attr.dummy)
3298 p->u.wsym.sym->module = gfc_get_string (module_name);
36f4d144 3299
6de9cd9a
DN
3300 p->u.wsym.state = WRITTEN;
3301 write_symbol (p->integer, p->u.wsym.sym);
3302
3303 return 1;
3304}
3305
3306
3307/* Write operator interfaces associated with a symbol. */
3308
3309static void
3310write_operator (gfc_user_op * uop)
3311{
3312 static char nullstring[] = "";
cb9e4f55 3313 const char *p = nullstring;
6de9cd9a
DN
3314
3315 if (uop->operator == NULL
af30f793 3316 || !gfc_check_access (uop->access, uop->ns->default_access))
6de9cd9a
DN
3317 return;
3318
cb9e4f55 3319 mio_symbol_interface (&uop->name, &p, &uop->operator);
6de9cd9a
DN
3320}
3321
3322
3323/* Write generic interfaces associated with a symbol. */
3324
3325static void
3326write_generic (gfc_symbol * sym)
3327{
3328
3329 if (sym->generic == NULL
af30f793 3330 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
6de9cd9a
DN
3331 return;
3332
cb9e4f55 3333 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
6de9cd9a
DN
3334}
3335
3336
3337static void
3338write_symtree (gfc_symtree * st)
3339{
3340 gfc_symbol *sym;
3341 pointer_info *p;
3342
3343 sym = st->n.sym;
af30f793 3344 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
6de9cd9a
DN
3345 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3346 && !sym->attr.subroutine && !sym->attr.function))
3347 return;
3348
3349 if (check_unique_name (st->name))
3350 return;
3351
3352 p = find_pointer (sym);
3353 if (p == NULL)
3354 gfc_internal_error ("write_symtree(): Symbol not written");
3355
cb9e4f55 3356 mio_pool_string (&st->name);
6de9cd9a
DN
3357 mio_integer (&st->ambiguous);
3358 mio_integer (&p->integer);
3359}
3360
3361
3362static void
3363write_module (void)
3364{
3365 gfc_intrinsic_op i;
3366
3367 /* Write the operator interfaces. */
3368 mio_lparen ();
3369
3370 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3371 {
3372 if (i == INTRINSIC_USER)
3373 continue;
3374
af30f793
PB
3375 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3376 gfc_current_ns->default_access)
6de9cd9a
DN
3377 ? &gfc_current_ns->operator[i] : NULL);
3378 }
3379
3380 mio_rparen ();
3381 write_char ('\n');
3382 write_char ('\n');
3383
3384 mio_lparen ();
3385 gfc_traverse_user_op (gfc_current_ns, write_operator);
3386 mio_rparen ();
3387 write_char ('\n');
3388 write_char ('\n');
3389
3390 mio_lparen ();
3391 gfc_traverse_ns (gfc_current_ns, write_generic);
3392 mio_rparen ();
3393 write_char ('\n');
3394 write_char ('\n');
3395
9056bd70
TS
3396 mio_lparen ();
3397 write_common (gfc_current_ns->common_root);
3398 mio_rparen ();
3399 write_char ('\n');
3400 write_char ('\n');
3401
6de9cd9a
DN
3402 /* Write symbol information. First we traverse all symbols in the
3403 primary namespace, writing those that need to be written.
3404 Sometimes writing one symbol will cause another to need to be
3405 written. A list of these symbols ends up on the write stack, and
3406 we end by popping the bottom of the stack and writing the symbol
3407 until the stack is empty. */
3408
3409 mio_lparen ();
3410
3411 write_symbol0 (gfc_current_ns->sym_root);
3412 while (write_symbol1 (pi_root));
3413
3414 mio_rparen ();
3415
3416 write_char ('\n');
3417 write_char ('\n');
3418
3419 mio_lparen ();
9056bd70 3420 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
6de9cd9a
DN
3421 mio_rparen ();
3422}
3423
3424
3425/* Given module, dump it to disk. If there was an error while
3426 processing the module, dump_flag will be set to zero and we delete
3427 the module file, even if it was already there. */
3428
3429void
3430gfc_dump_module (const char *name, int dump_flag)
3431{
3432 char filename[PATH_MAX], *p;
6de9cd9a
DN
3433 time_t now;
3434
3435 filename[0] = '\0';
3436 if (gfc_option.module_dir != NULL)
3437 strcpy (filename, gfc_option.module_dir);
3438
3439 strcat (filename, name);
3440 strcat (filename, MODULE_EXTENSION);
3441
3442 if (!dump_flag)
3443 {
3444 unlink (filename);
3445 return;
3446 }
3447
3448 module_fp = fopen (filename, "w");
3449 if (module_fp == NULL)
87bdc5f8 3450 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
6de9cd9a
DN
3451 filename, strerror (errno));
3452
6de9cd9a
DN
3453 now = time (NULL);
3454 p = ctime (&now);
3455
3456 *strchr (p, '\n') = '\0';
3457
d4fa05b9
TS
3458 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3459 gfc_source_file, p);
6de9cd9a
DN
3460 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3461
3462 iomode = IO_OUTPUT;
3463 strcpy (module_name, name);
3464
3465 init_pi_tree ();
3466
3467 write_module ();
3468
3469 free_pi_tree (pi_root);
3470 pi_root = NULL;
3471
3472 write_char ('\n');
3473
3474 if (fclose (module_fp))
3475 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3476 filename, strerror (errno));
3477}
3478
3479
3480/* Process a USE directive. */
3481
3482void
3483gfc_use_module (void)
3484{
3485 char filename[GFC_MAX_SYMBOL_LEN + 5];
3486 gfc_state_data *p;
3487 int c, line;
3488
3489 strcpy (filename, module_name);
3490 strcat (filename, MODULE_EXTENSION);
3491
3492 module_fp = gfc_open_included_file (filename);
3493 if (module_fp == NULL)
87bdc5f8 3494 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
6de9cd9a
DN
3495 filename, strerror (errno));
3496
3497 iomode = IO_INPUT;
3498 module_line = 1;
3499 module_column = 1;
3500
3501 /* Skip the first two lines of the module. */
3502 /* FIXME: Could also check for valid two lines here, instead. */
3503 line = 0;
3504 while (line < 2)
3505 {
3506 c = module_char ();
3507 if (c == EOF)
3508 bad_module ("Unexpected end of module");
3509 if (c == '\n')
3510 line++;
3511 }
3512
3513 /* Make sure we're not reading the same module that we may be building. */
3514 for (p = gfc_state_stack; p; p = p->previous)
3515 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3516 gfc_fatal_error ("Can't USE the same module we're building!");
3517
3518 init_pi_tree ();
3519 init_true_name_tree ();
3520
3521 read_module ();
3522
3523 free_true_name (true_name_root);
3524 true_name_root = NULL;
3525
3526 free_pi_tree (pi_root);
3527 pi_root = NULL;
3528
3529 fclose (module_fp);
3530}
3531
3532
3533void
3534gfc_module_init_2 (void)
3535{
3536
3537 last_atom = ATOM_LPAREN;
3538}
3539
3540
3541void
3542gfc_module_done_2 (void)
3543{
3544
3545 free_rename ();
3546}
This page took 0.679718 seconds and 5 git commands to generate.