Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / gcc / gengtype-state.c
1 /* Gengtype persistent state serialization & de-serialization.
2    Useful for gengtype in plugin mode.
3
4    Copyright (C) 2010-2018 Free Software Foundation, Inc.
5
6    This file is part of GCC.
7
8    GCC is free software; you can redistribute it and/or modify it under
9    the terms of the GNU General Public License as published by the Free
10    Software Foundation; either version 3, or (at your option) any later
11    version.
12
13    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14    WARRANTY; without even the implied warranty of MERCHANTABILITY or
15    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16    for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GCC; see the file COPYING3.  If not see
20    <http://www.gnu.org/licenses/>.
21
22    Contributed by Jeremie Salvucci <jeremie.salvucci@free.fr>
23    and Basile Starynkevitch <basile@starynkevitch.net>
24 */
25
26 #ifdef HOST_GENERATOR_FILE
27 #include "config.h"
28 #define GENERATOR_FILE 1
29 #else
30 #include "bconfig.h"
31 #endif
32 #include "system.h"
33 #include "errors.h"     /* For fatal.  */
34 #include "version.h"    /* For version_string & pkgversion_string.  */
35 #include "obstack.h"
36 #include "gengtype.h"
37
38
39
40 /* Gives the file location of a type, if any.  */
41 static inline struct fileloc*
42 type_lineloc (const_type_p ty)
43 {
44   if (!ty)
45     return NULL;
46   switch (ty->kind)
47     {
48     case TYPE_NONE:
49       gcc_unreachable ();
50     case TYPE_STRUCT:
51     case TYPE_UNION:
52     case TYPE_LANG_STRUCT:
53     case TYPE_USER_STRUCT:
54     case TYPE_UNDEFINED:
55       return CONST_CAST (struct fileloc*, &ty->u.s.line);
56     case TYPE_SCALAR:
57     case TYPE_STRING:
58     case TYPE_POINTER:
59     case TYPE_ARRAY:
60       return NULL;
61     default:
62       gcc_unreachable ();
63     }
64 }
65
66 /* The state file has simplistic lispy lexical tokens.  Its lexer gives
67    a linked list of struct state_token_st, through the peek_state_token
68    function.  Lexical tokens are consumed with next_state_tokens.  */
69
70
71 /* The lexical kind of each lispy token.  */
72 enum state_token_en
73 {
74   STOK_NONE,                    /* Never used.  */
75   STOK_INTEGER,                 /* Integer token.  */
76   STOK_STRING,                  /* String token.  */
77   STOK_LEFTPAR,                 /* Left opening parenthesis.  */
78   STOK_RIGHTPAR,                /* Right closing parenthesis.  */
79   STOK_NAME                     /* hash-consed name or identifier.  */
80 };
81
82
83 /* Structure and hash-table used to share identifiers or names.  */
84 struct state_ident_st
85 {
86   /* TODO: We could improve the parser by reserving identifiers for
87      state keywords and adding a keyword number for them.  That would
88      mean adding another field in this state_ident_st struct.  */
89   char stid_name[1];            /* actually bigger & null terminated */
90 };
91 static htab_t state_ident_tab;
92
93
94 /* The state_token_st structure is for lexical tokens in the read
95    state file.  The stok_kind field discriminates the union.  Tokens
96    are allocated by peek_state_token which calls read_a_state_token
97    which allocate them.  Tokens are freed by calls to
98    next_state_tokens.  Token are organized in a FIFO look-ahead queue
99    filled by peek_state_token.  */
100 struct state_token_st
101 {
102   enum state_token_en stok_kind;        /* the lexical kind
103                                            discriminates the stok_un
104                                            union  */
105   int stok_line;                        /* the line number */
106   int stok_col;                         /* the column number */
107   const char *stok_file;                /* the file path */
108   struct state_token_st *stok_next;     /* the next token in the
109                                            queue, when peeked */
110   union                                 /* discriminated by stok_kind! */
111   {
112     int stok_num;                       /* when STOK_INTEGER */
113     char stok_string[1];                /* when STOK_STRING, actual size is
114                                            bigger and null terminated */
115     struct state_ident_st *stok_ident;  /* when STOK_IDENT */
116     void *stok_ptr;                     /* null otherwise */
117   }
118   stok_un;
119 };
120
121
122
123
124 #define NULL_STATE_TOKEN (struct state_token_st*)0
125
126 /* the state_token pointer contains the leftmost current token.  The
127    tokens are organized in a linked queue, using stok_next, for token
128    look-ahead.  */
129 struct state_token_st *state_token = NULL_STATE_TOKEN;
130
131 /* Used by the reading lexer.  */
132 static FILE *state_file;
133 static const char *state_path = NULL;
134 static int state_line = 0;
135 static long state_bol = 0;      /* offset of beginning of line */
136
137 /* A class for writing out s-expressions, keeping track of newlines and
138    nested indentation.  */
139 class s_expr_writer
140 {
141 public:
142   s_expr_writer ();
143
144   void write_new_line ();
145   void write_any_indent (int leading_spaces);
146
147   void begin_s_expr (const char *tag);
148   void end_s_expr ();
149
150 private:
151   int m_indent_amount;
152   int m_had_recent_newline;
153 }; // class s_expr_writer
154
155 /* A class for writing out "gtype.state".  */
156 class state_writer : public s_expr_writer
157 {
158 public:
159   state_writer ();
160
161 private:
162   void write_state_fileloc (struct fileloc *floc);
163   void write_state_fields (pair_p fields);
164   void write_state_a_string (const char *s);
165   void write_state_string_option (options_p current);
166   void write_state_type_option (options_p current);
167   void write_state_nested_option (options_p current);
168   void write_state_option (options_p current);
169   void write_state_options (options_p opt);
170   void write_state_lang_bitmap (lang_bitmap bitmap);
171   void write_state_version (const char *version);
172   void write_state_scalar_type (type_p current);
173   void write_state_string_type (type_p current);
174   void write_state_undefined_type (type_p current);
175   void write_state_struct_union_type (type_p current, const char *kindstr);
176   void write_state_struct_type (type_p current);
177   void write_state_user_struct_type (type_p current);
178   void write_state_union_type (type_p current);
179   void write_state_lang_struct_type (type_p current);
180   void write_state_pointer_type (type_p current);
181   void write_state_array_type (type_p current);
182   void write_state_gc_used (enum gc_used_enum gus);
183   void write_state_common_type_content (type_p current);
184   void write_state_type (type_p current);
185   void write_state_pair (pair_p current);
186   int write_state_pair_list (pair_p list);
187   void write_state_typedefs (void);
188   void write_state_structures (void);
189   void write_state_variables (void);
190   void write_state_srcdir (void);
191   void write_state_files_list (void);
192   void write_state_languages (void);
193
194   friend void write_state (const char *state_path);
195
196 private:
197   /* Counter of written types.  */
198   int m_state_written_type_count;
199 }; // class state_writer
200
201
202 /* class s_expr_writer's trivial constructor.  */
203 s_expr_writer::s_expr_writer ()
204   : m_indent_amount (0),
205     m_had_recent_newline (0)
206 {
207 }
208
209 /* Write a newline to the output file, merging adjacent newlines.  */
210 void
211 s_expr_writer::write_new_line (void)
212 {
213   /* Don't add a newline if we've just had one.  */
214   if (!m_had_recent_newline)
215     {
216       fprintf (state_file, "\n");
217       m_had_recent_newline = 1;
218     }
219 }
220
221 /* If we've just had a newline, write the indentation amount, potentially
222    omitting some spaces.
223
224    LEADING_SPACES exists to support code that writes strings with leading
225    spaces (e.g " foo") which might occur within a line, or could be the first
226    thing on a line.  By passing leading_spaces == 1, when such a string is the
227    first thing on a line, write_any_indent () swallows the successive
228    leading spaces into the indentation so that the "foo" begins at the expected
229    column.  */
230 void
231 s_expr_writer::write_any_indent (int leading_spaces)
232 {
233   int i;
234   int amount = m_indent_amount - leading_spaces;
235   if (m_had_recent_newline)
236     for (i = 0; i < amount; i++)
237       fprintf (state_file, " ");
238   m_had_recent_newline = 0;
239 }
240
241 /* Write the beginning of a new s-expresion e.g. "(!foo "
242    The writer automatically adds whitespace to show the hierarchical
243    structure of the expressions, so each one starts on a new line,
244    and any within it will be at an increased indentation level.  */
245 void
246 s_expr_writer::begin_s_expr (const char *tag)
247 {
248   write_new_line ();
249   write_any_indent (0);
250   fprintf (state_file, "(!%s ", tag);
251   m_indent_amount++;
252 }
253
254 /* Write out the end of an s-expression: any necssessary indentation,
255    a closing parenthesis, and a new line.  */
256 void
257 s_expr_writer::end_s_expr (void)
258 {
259   m_indent_amount--;
260   write_any_indent (0);
261   fprintf (state_file, ")");
262   write_new_line ();
263 }
264
265
266 /* class state_writer's trivial constructor.  */
267 state_writer::state_writer ()
268   : s_expr_writer (),
269     m_state_written_type_count (0)
270 {
271 }
272
273
274 /* Fatal error messages when reading the state.  They are extremely
275    unlikely, and only appear when this gengtype-state.c file is buggy,
276    or when reading a gengtype state which was not generated by the
277    same version of gengtype or GCC.  */
278
279
280 /* Fatal message while reading state.  */
281 static void 
282 fatal_reading_state (struct state_token_st* tok, const char*msg)
283 {
284   if (tok)
285     fatal ("%s:%d:%d: Invalid state file; %s",
286            tok->stok_file, tok->stok_line, tok->stok_col, 
287            msg); 
288   else
289     fatal ("%s:%d: Invalid state file; %s", 
290            state_path, state_line, msg);
291 }
292
293
294 /* Fatal printf-like message while reading state.  This can't be a
295    function, because there is no way to pass a va_arg to a variant of
296    fatal.  */
297 #define fatal_reading_state_printf(Tok,Fmt,...) do {    \
298     struct state_token_st* badtok = Tok;                \
299     if (badtok)                                         \
300       fatal ("%s:%d:%d: Invalid state file; " Fmt,      \
301               badtok->stok_file,                        \
302               badtok->stok_line,                        \
303               badtok->stok_col, __VA_ARGS__);           \
304     else                                                \
305       fatal ("%s:%d: Invalid state file; " Fmt,         \
306              state_path, state_line, __VA_ARGS__);      \
307   } while (0)
308
309
310 /* Find or allocate an identifier in our name hash table.  */
311 static struct state_ident_st *
312 state_ident_by_name (const char *name, enum insert_option optins)
313 {
314   PTR *slot = NULL;
315   int namlen = 0;
316   struct state_ident_st *stid = NULL;
317
318   if (!name || !name[0])
319     return NULL;
320
321   slot = htab_find_slot (state_ident_tab, name, optins);
322   if (!slot)
323     return NULL;
324
325   namlen = strlen (name);
326   stid =
327     (struct state_ident_st *) xmalloc (sizeof (struct state_ident_st) +
328                                        namlen);
329   memset (stid, 0, sizeof (struct state_ident_st) + namlen);
330   strcpy (stid->stid_name, name);
331   *slot = stid;
332
333   return stid;
334 }
335
336 /* Our token lexer is heavily inspired by MELT's lexer, and share some
337    code with the file gcc/melt-runtime.c of the GCC MELT branch!  We
338    really want the gengtype state to be easily parsable by MELT.  This
339    is a usual lispy lexing routine, dealing with spaces and comments,
340    numbers, parenthesis, names, strings.  */
341 static struct state_token_st *
342 read_a_state_token (void)
343 {
344   int c = 0;
345   long curoff = 0;
346   struct state_token_st *tk = NULL;
347
348  again: /* Read again, e.g. after a comment or spaces.  */
349   c = getc (state_file);
350   if (c == EOF)
351     return NULL;
352
353   /* Handle spaces, count lines.  */
354   if (c == '\n')
355     {
356       state_line++;
357       state_bol = curoff = ftell (state_file);
358       goto again;
359     };
360   if (ISSPACE (c))
361     goto again;
362   /* Skip comments starting with semi-colon.  */
363   if (c == ';')
364     {   
365       do
366         {
367           c = getc (state_file);
368         }
369       while (c > 0 && c != '\n');
370       if (c == '\n')
371         {
372           state_line++;
373           state_bol = curoff = ftell (state_file);
374         }
375       goto again;
376     };
377   /* Read signed numbers.  */
378   if (ISDIGIT (c) || c == '-' || c == '+')
379     {                           /* number */
380       int n = 0;
381       ungetc (c, state_file);
382       curoff = ftell (state_file);
383       if (fscanf (state_file, "%d", &n) <= 0)
384         fatal_reading_state (NULL_STATE_TOKEN, "Lexical error in number");
385       tk = XCNEW (struct state_token_st);
386       tk->stok_kind = STOK_INTEGER;
387       tk->stok_line = state_line;
388       tk->stok_col = curoff - state_bol;
389       tk->stok_file = state_path;
390       tk->stok_next = NULL;
391       tk->stok_un.stok_num = n;
392
393       return tk;
394     }
395   /* Read an opening left parenthesis.  */
396   else if (c == '(')
397     {
398       curoff = ftell (state_file);
399       tk = XCNEW (struct state_token_st);
400       tk->stok_kind = STOK_LEFTPAR;
401       tk->stok_line = state_line;
402       tk->stok_col = curoff - state_bol;
403       tk->stok_file = state_path;
404       tk->stok_next = NULL;
405
406       return tk;
407     }
408   /* Read an closing right parenthesis.  */
409   else if (c == ')')
410     {
411       curoff = ftell (state_file);
412       tk = XCNEW (struct state_token_st);
413       tk->stok_kind = STOK_RIGHTPAR;
414       tk->stok_line = state_line;
415       tk->stok_col = curoff - state_bol;
416       tk->stok_file = state_path;
417       tk->stok_next = NULL;
418
419       return tk;
420     }
421   /* Read identifiers, using an obstack.  */
422   else if (ISALPHA (c) || c == '_' || c == '$' || c == '!' || c == '#')
423     {
424       struct obstack id_obstack;
425       struct state_ident_st *sid = NULL;
426       char *ids = NULL;
427       obstack_init (&id_obstack);
428       curoff = ftell (state_file);
429       while (ISALNUM (c) || c == '_' || c == '$' || c == '!' || c == '#')
430         {
431           obstack_1grow (&id_obstack, c);
432           c = getc (state_file);
433           if (c < 0)
434             break;
435         };
436       if (c >= 0)
437         ungetc (c, state_file);
438       obstack_1grow (&id_obstack, (char) 0);
439       ids = XOBFINISH (&id_obstack, char *);
440       sid = state_ident_by_name (ids, INSERT);
441       obstack_free (&id_obstack, NULL);
442       ids = NULL;
443       tk = XCNEW (struct state_token_st);
444       tk->stok_kind = STOK_NAME;
445       tk->stok_line = state_line;
446       tk->stok_col = curoff - state_bol;
447       tk->stok_file = state_path;
448       tk->stok_next = NULL;
449       tk->stok_un.stok_ident = sid;
450
451       return tk;
452     }
453   /* Read a string, dealing with escape sequences a la C! */
454   else if (c == '"')
455     {
456       char *cstr = NULL;
457       int cslen = 0;
458       struct obstack bstring_obstack;
459       obstack_init (&bstring_obstack);
460       curoff = ftell (state_file);
461       while ((c = getc (state_file)) != '"' && c >= 0)
462         {
463           if (ISPRINT (c) && c != '\\')
464             obstack_1grow (&bstring_obstack, (char) c);
465           else if (ISSPACE (c) && c != '\n')
466             obstack_1grow (&bstring_obstack, (char) c);
467           else if (c == '\\')
468             {
469               c = getc (state_file);
470               switch (c)
471                 {
472                 case 'a':
473                   obstack_1grow (&bstring_obstack, '\a');
474                   c = getc (state_file);
475                   break;
476                 case 'b':
477                   obstack_1grow (&bstring_obstack, '\b');
478                   c = getc (state_file);
479                   break;
480                 case 't':
481                   obstack_1grow (&bstring_obstack, '\t');
482                   c = getc (state_file);
483                   break;
484                 case 'n':
485                   obstack_1grow (&bstring_obstack, '\n');
486                   c = getc (state_file);
487                   break;
488                 case 'v':
489                   obstack_1grow (&bstring_obstack, '\v');
490                   c = getc (state_file);
491                   break;
492                 case 'f':
493                   obstack_1grow (&bstring_obstack, '\f');
494                   c = getc (state_file);
495                   break;
496                 case 'r':
497                   obstack_1grow (&bstring_obstack, '\r');
498                   c = getc (state_file);
499                   break;
500                 case '"':
501                   obstack_1grow (&bstring_obstack, '\"');
502                   c = getc (state_file);
503                   break;
504                 case '\\':
505                   obstack_1grow (&bstring_obstack, '\\');
506                   c = getc (state_file);
507                   break;
508                 case ' ':
509                   obstack_1grow (&bstring_obstack, ' ');
510                   c = getc (state_file);
511                   break;
512                 case 'x':
513                   {
514                     unsigned int cx = 0;
515                     if (fscanf (state_file, "%02x", &cx) > 0 && cx > 0)
516                       obstack_1grow (&bstring_obstack, cx);
517                     else
518                       fatal_reading_state
519                         (NULL_STATE_TOKEN,
520                          "Lexical error in string hex escape");
521                     c = getc (state_file);
522                     break;
523                   }
524                 default:
525                   fatal_reading_state
526                     (NULL_STATE_TOKEN,
527                      "Lexical error - unknown string escape");
528                 }
529             }
530           else
531             fatal_reading_state (NULL_STATE_TOKEN, "Lexical error...");
532         };
533       if (c != '"')
534         fatal_reading_state (NULL_STATE_TOKEN, "Unterminated string");
535       obstack_1grow (&bstring_obstack, '\0');
536       cstr = XOBFINISH (&bstring_obstack, char *);
537       cslen = strlen (cstr);
538       tk = (struct state_token_st *)
539         xcalloc (sizeof (struct state_token_st) + cslen, 1);
540       tk->stok_kind = STOK_STRING;
541       tk->stok_line = state_line;
542       tk->stok_col = curoff - state_bol;
543       tk->stok_file = state_path;
544       tk->stok_next = NULL;
545       strcpy (tk->stok_un.stok_string, cstr);
546       obstack_free (&bstring_obstack, NULL);
547
548       return tk;
549     }
550   /* Got an unexpected character.  */
551   fatal_reading_state_printf
552     (NULL_STATE_TOKEN,
553      "Lexical error at offset %ld - bad character \\%03o = '%c'",
554      ftell (state_file), c, c);
555 }
556
557 /* Used for lexical look-ahead.  Retrieves the lexical token of rank
558    DEPTH, starting with 0 when reading the state file.  Gives null on
559    end of file.  */
560 static struct state_token_st *
561 peek_state_token (int depth)
562 {
563   int remdepth = depth;
564   struct state_token_st **ptoken = &state_token;
565   struct state_token_st *tok = NULL;
566
567   while (remdepth >= 0)
568     {
569       if (*ptoken == NULL)
570         {
571           *ptoken = tok = read_a_state_token ();
572           if (tok == NULL)
573             return NULL;
574         }
575       tok = *ptoken;
576       ptoken = &((*ptoken)->stok_next);
577       remdepth--;
578     }
579
580   return tok;
581 }
582
583 /* Consume the next DEPTH tokens and free them.  */
584 static void
585 next_state_tokens (int depth)
586 {
587   struct state_token_st *n;
588
589   while (depth > 0)
590     {
591       if (state_token != NULL)
592         {
593           n = state_token->stok_next;
594           free (state_token);
595           state_token = n;
596         }
597       else
598         fatal_reading_state (NULL_STATE_TOKEN, "Tokens stack empty");
599
600       depth--;
601     }
602 }
603
604 /* Safely retrieve the lexical kind of a token.  */
605 static inline enum state_token_en
606 state_token_kind (struct state_token_st *p)
607 {
608   if (p == NULL)
609     return STOK_NONE;
610   else
611     return p->stok_kind;
612 }
613
614 /* Test if a token is a given name i.e. an identifier.  */
615 static inline bool
616 state_token_is_name (struct state_token_st *p, const char *name)
617 {
618   if (p == NULL)
619     return false;
620
621   if (p->stok_kind != STOK_NAME)
622     return false;
623
624   return !strcmp (p->stok_un.stok_ident->stid_name, name);
625 }
626
627
628 /* Following routines are useful for serializing datas.
629  *
630  * We want to serialize :
631  *          - typedefs list
632  *          - structures list
633  *          - variables list
634  *
635  * So, we have one routine for each kind of data.  The main writing
636  * routine is write_state.  The main reading routine is
637  * read_state.  Most writing routines write_state_FOO have a
638  * corresponding reading routine read_state_FOO.  Reading is done in a
639  * recursive descending way, and any read error is fatal.
640  */
641
642 /* When reading the state, we need to remember the previously seen
643    types by their state_number, since GTY-ed types are usually
644    shared.  */
645 static htab_t state_seen_types;
646
647 /* Return the length of a linked list made of pairs.  */
648 static int pair_list_length (pair_p list);
649
650 /* Compute the length of a list of pairs, starting from the first
651    one.  */
652 static int
653 pair_list_length (pair_p list)
654 {
655   int nbpair = 0;
656   pair_p l = NULL;
657   for (l = list; l; l = l->next)
658     nbpair++;
659   return nbpair;
660 }
661
662 /* Write a file location.  Files relative to $(srcdir) are quite
663    frequent and are handled specially.  This ensures that two gengtype
664    state file-s produced by gengtype on the same GCC source tree are
665    very similar and can be reasonably compared with diff, even if the
666    two GCC source trees have different absolute paths.  */
667 void
668 state_writer::write_state_fileloc (struct fileloc *floc)
669 {
670
671   if (floc != NULL && floc->line > 0)
672     {
673       const char *srcrelpath = NULL;
674       gcc_assert (floc->file != NULL);
675       /* Most of the files are inside $(srcdir) so it is worth to
676          handle them specially.  */
677       srcrelpath = get_file_srcdir_relative_path (floc->file);
678       if (srcrelpath != NULL)
679         {
680           begin_s_expr ("srcfileloc");
681           write_state_a_string (srcrelpath);
682         }
683       else
684         {
685           begin_s_expr ("fileloc");
686           write_state_a_string (get_input_file_name (floc->file));
687         }
688       fprintf (state_file, " %d", floc->line);
689       end_s_expr ();
690     }
691   else
692     fprintf (state_file, "nil ");
693 }
694
695 /* Write a list of fields.  */
696 void
697 state_writer::write_state_fields (pair_p fields)
698 {
699   int nbfields = pair_list_length (fields);
700   int nbpairs = 0;
701   begin_s_expr ("fields");
702   fprintf (state_file, "%d ", nbfields);
703   nbpairs = write_state_pair_list (fields);
704   gcc_assert (nbpairs == nbfields);
705   end_s_expr ();
706 }
707
708 /* Write a null-terminated string in our lexical convention, very
709    similar to the convention of C.  */
710 void
711 state_writer::write_state_a_string (const char *s)
712 {
713   char c;
714
715   write_any_indent (1);
716
717   fputs (" \"", state_file);
718   for (; *s != 0; s++)
719     {
720       c = *s;
721       switch (c)
722         {
723         case '\a':
724           fputs ("\\a", state_file);
725           break;
726         case '\b':
727           fputs ("\\b", state_file);
728           break;
729         case '\t':
730           fputs ("\\t", state_file);
731           break;
732         case '\n':
733           fputs ("\\n", state_file);
734           break;
735         case '\v':
736           fputs ("\\v", state_file);
737           break;
738         case '\f':
739           fputs ("\\f", state_file);
740           break;
741         case '\r':
742           fputs ("\\r", state_file);
743           break;
744         case '\"':
745           fputs ("\\\"", state_file);
746           break;
747         case '\\':
748           fputs ("\\\\", state_file);
749           break;
750         default:
751           if (ISPRINT (c))
752             putc (c, state_file);
753           else
754             fprintf (state_file, "\\x%02x", (unsigned) c);
755         }
756     }
757   fputs ("\"", state_file);
758 }
759
760 /* Our option-s have three kinds, each with its writer.  */
761 void
762 state_writer::write_state_string_option (options_p current)
763 {
764   write_any_indent (0);
765   fprintf (state_file, "string ");
766   if (current->info.string != NULL)
767     write_state_a_string (current->info.string);
768   else
769     fprintf (state_file, " nil ");
770 }
771
772 void
773 state_writer::write_state_type_option (options_p current)
774 {
775   write_any_indent (0);
776   fprintf (state_file, "type ");
777   write_state_type (current->info.type);
778 }
779
780 void
781 state_writer::write_state_nested_option (options_p current)
782 {
783   write_any_indent (0);
784   fprintf (state_file, "nested ");
785   write_state_type (current->info.nested->type);
786   if (current->info.nested->convert_from != NULL)
787     write_state_a_string (current->info.nested->convert_from);
788   else
789     {
790       write_any_indent (1);
791       fprintf (state_file, " nil ");
792     }
793
794   if (current->info.nested->convert_to != NULL)
795     write_state_a_string (current->info.nested->convert_to);
796   else
797     {
798       write_any_indent (1);
799       fprintf (state_file, " nil ");
800     }
801 }
802
803 void
804 state_writer::write_state_option (options_p current)
805 {
806   begin_s_expr ("option");
807
808   write_any_indent (0);
809   if (current->name != NULL)
810     fprintf (state_file, "%s ", current->name);
811   else
812     fprintf (state_file, "nil ");
813
814   switch (current->kind)
815     {
816     case OPTION_STRING:
817       write_state_string_option (current);
818       break;
819     case OPTION_TYPE:
820       write_state_type_option (current);
821       break;
822     case OPTION_NESTED:
823       write_state_nested_option (current);
824       break;
825     default:
826       fatal ("Option tag unknown");
827     }
828
829   /* Terminate the "option" s-expression.  */
830   end_s_expr ();
831 }
832
833
834
835 /* Write a list of GTY options.  */
836 void
837 state_writer::write_state_options (options_p opt)
838 {
839   options_p current;
840
841   if (opt == NULL)
842     {
843         write_any_indent (0);
844         fprintf (state_file, "nil ");
845       return;
846     }
847
848   begin_s_expr ("options");
849   for (current = opt; current != NULL; current = current->next)
850       write_state_option (current);
851   end_s_expr ();
852 }
853
854
855 /* Write a bitmap representing a set of GCC front-end languages.  */
856 void
857 state_writer::write_state_lang_bitmap (lang_bitmap bitmap)
858 {
859   write_any_indent (0);
860   fprintf (state_file, "%d ", (int) bitmap);
861 }
862
863 /* Write version information.  */
864 void
865 state_writer::write_state_version (const char *version)
866 {
867   begin_s_expr ("version");
868   write_state_a_string (version);
869   end_s_expr ();
870 }
871
872 /* Write a scalar type.  We have only two of these.  */
873 void
874 state_writer::write_state_scalar_type (type_p current)
875 {
876   write_any_indent (0);
877   if (current == &scalar_nonchar)
878     fprintf (state_file, "scalar_nonchar ");
879   else if (current == &scalar_char)
880     fprintf (state_file, "scalar_char ");
881   else
882     fatal ("Unexpected type in write_state_scalar_type");
883
884   write_state_common_type_content (current);
885 }
886
887 /* Write the string type.  There is only one such thing! */
888 void
889 state_writer::write_state_string_type (type_p current)
890 {
891   if (current == &string_type)
892     {
893       write_any_indent (0);
894       fprintf (state_file, "string ");
895       write_state_common_type_content (current);
896     }
897   else
898     fatal ("Unexpected type in write_state_string_type");
899 }
900
901 /* Write an undefined type.  */
902 void
903 state_writer::write_state_undefined_type (type_p current)
904 {
905   DBGPRINTF ("undefined type @ %p #%d '%s'", (void *) current,
906              current->state_number, current->u.s.tag);
907   write_any_indent (0);
908   fprintf (state_file, "undefined ");
909   gcc_assert (current->gc_used == GC_UNUSED);
910   write_state_common_type_content (current);
911   if (current->u.s.tag != NULL)
912     write_state_a_string (current->u.s.tag);
913   else
914     {
915       write_any_indent (0);
916       fprintf (state_file, "nil");
917     }
918
919   write_state_fileloc (type_lineloc (current));
920 }
921
922
923 /* Common code to write structure like types.  */
924 void
925 state_writer::write_state_struct_union_type (type_p current,
926                                              const char *kindstr)
927 {
928   DBGPRINTF ("%s type @ %p #%d '%s'", kindstr, (void *) current,
929              current->state_number, current->u.s.tag);
930   write_any_indent (0);
931   fprintf (state_file, "%s ", kindstr);
932   write_state_common_type_content (current);
933   if (current->u.s.tag != NULL)
934     write_state_a_string (current->u.s.tag);
935   else
936     {
937       write_any_indent (0);
938       fprintf (state_file, "nil");
939     }
940
941   write_state_fileloc (type_lineloc (current));
942   write_state_fields (current->u.s.fields);
943   write_state_options (current->u.s.opt);
944   write_state_lang_bitmap (current->u.s.bitmap);
945 }
946
947
948 /* Write a GTY struct type.  */
949 void
950 state_writer::write_state_struct_type (type_p current)
951 {
952   write_state_struct_union_type (current, "struct");
953   write_state_type (current->u.s.lang_struct);
954   write_state_type (current->u.s.base_class);
955 }
956
957 /* Write a GTY user-defined struct type.  */
958 void
959 state_writer::write_state_user_struct_type (type_p current)
960 {
961   DBGPRINTF ("user_struct type @ %p #%d '%s'", (void *) current,
962              current->state_number, current->u.s.tag);
963   write_any_indent (0);
964   fprintf (state_file, "user_struct ");
965   write_state_common_type_content (current);
966   if (current->u.s.tag != NULL)
967     write_state_a_string (current->u.s.tag);
968   else
969     {
970       write_any_indent (0);
971       fprintf (state_file, "nil");
972     }
973   write_state_fileloc (type_lineloc (current));
974   write_state_fields (current->u.s.fields);
975 }
976
977 /* write a GTY union type.  */
978 void
979 state_writer::write_state_union_type (type_p current)
980 {
981   write_state_struct_union_type (current, "union");
982   write_state_type (current->u.s.lang_struct);
983 }
984
985 /* Write a lang_struct type.  This is tricky and was painful to debug,
986    we deal with the next field specifically within their lang_struct
987    subfield, which points to a linked list of homonumous types.
988    Change this function with extreme care, see also
989    read_state_lang_struct_type.  */
990 void
991 state_writer::write_state_lang_struct_type (type_p current)
992 {
993   int nbhomontype = 0;
994   type_p hty = NULL;
995   const char *homoname = 0;
996   write_state_struct_union_type (current, "lang_struct");
997   /* lang_struct-ures are particularly tricky, since their
998      u.s.lang_struct field gives a list of homonymous struct-s or
999      union-s! */
1000   DBGPRINTF ("lang_struct @ %p #%d", (void *) current, current->state_number);
1001   for (hty = current->u.s.lang_struct; hty != NULL; hty = hty->next)
1002     {
1003       nbhomontype++;
1004       DBGPRINTF ("homonymous #%d hty @ %p #%d '%s'", nbhomontype,
1005                  (void *) hty, hty->state_number, hty->u.s.tag);
1006       /* Every member of the homonymous list should have the same tag.  */
1007       gcc_assert (union_or_struct_p (hty));
1008       gcc_assert (hty->u.s.lang_struct == current);
1009       if (!homoname)
1010         homoname = hty->u.s.tag;
1011       gcc_assert (strcmp (homoname, hty->u.s.tag) == 0);
1012     }
1013   begin_s_expr ("homotypes");
1014   fprintf (state_file, "%d", nbhomontype);
1015   for (hty = current->u.s.lang_struct; hty != NULL; hty = hty->next)
1016     write_state_type (hty);
1017   end_s_expr ();
1018 }
1019
1020 /* Write a pointer type.  */
1021 void
1022 state_writer::write_state_pointer_type (type_p current)
1023 {
1024   write_any_indent (0);
1025   fprintf (state_file, "pointer ");
1026   write_state_common_type_content (current);
1027   write_state_type (current->u.p);
1028 }
1029
1030 /* Write an array type.  */
1031 void
1032 state_writer::write_state_array_type (type_p current)
1033 {
1034   write_any_indent (0);
1035   fprintf (state_file, "array ");
1036   write_state_common_type_content (current);
1037   if (current->u.a.len != NULL)
1038     write_state_a_string (current->u.a.len);
1039   else
1040     {
1041       write_any_indent (1);
1042       fprintf (state_file, " nil");
1043     }
1044
1045   write_any_indent (1);
1046   fprintf (state_file, " ");
1047   write_state_type (current->u.a.p);
1048 }
1049
1050 /* Write the gc_used information.  */
1051 void
1052 state_writer::write_state_gc_used (enum gc_used_enum gus)
1053 {
1054   write_any_indent (1);
1055   switch (gus)
1056     {
1057     case GC_UNUSED:
1058       fprintf (state_file, " gc_unused");
1059       break;
1060     case GC_USED:
1061       fprintf (state_file, " gc_used");
1062       break;
1063     case GC_MAYBE_POINTED_TO:
1064       fprintf (state_file, " gc_maybe_pointed_to");
1065       break;
1066     case GC_POINTED_TO:
1067       fprintf (state_file, " gc_pointed_to");
1068       break;
1069     default:
1070       gcc_unreachable ();
1071     }
1072 }
1073
1074 /* Utility routine to write the common content of all types.  Notice
1075    that the next field is *not* written on purpose.  */
1076 void
1077 state_writer::write_state_common_type_content (type_p current)
1078 {
1079   write_any_indent (0);
1080   fprintf (state_file, "%d ", current->state_number);
1081   /* We do not write the next type, because list of types are
1082      explicitly written.  However, lang_struct are special in that
1083      respect.  See function write_state_lang_struct_type for more.  */
1084   write_state_type (current->pointer_to);
1085   write_state_gc_used (current->gc_used);
1086 }
1087
1088
1089 /* The important and recursive routine writing GTY types as understood
1090    by gengtype.  Types which have a positive state_number have already
1091    been seen and written.  */
1092 void
1093 state_writer::write_state_type (type_p current)
1094 {
1095   write_any_indent (0);
1096   if (current == NULL)
1097     {
1098       fprintf (state_file, "nil ");
1099       return;
1100     }
1101
1102   begin_s_expr ("type");
1103
1104   if (current->state_number > 0)
1105     {
1106       write_any_indent (0);
1107       fprintf (state_file, "already_seen %d", current->state_number);
1108     }
1109   else
1110     {
1111       m_state_written_type_count++;
1112       DBGPRINTF ("writing type #%d @%p old number %d", m_state_written_type_count,
1113                  (void *) current, current->state_number);
1114       current->state_number = m_state_written_type_count;
1115       switch (current->kind)
1116         {
1117         case TYPE_NONE:
1118           gcc_unreachable ();
1119         case TYPE_UNDEFINED:
1120           write_state_undefined_type (current);
1121           break;
1122         case TYPE_STRUCT:
1123           write_state_struct_type (current);
1124           break;
1125         case TYPE_USER_STRUCT:
1126           write_state_user_struct_type (current);
1127           break;
1128         case TYPE_UNION:
1129           write_state_union_type (current);
1130           break;
1131         case TYPE_POINTER:
1132           write_state_pointer_type (current);
1133           break;
1134         case TYPE_ARRAY:
1135           write_state_array_type (current);
1136           break;
1137         case TYPE_LANG_STRUCT:
1138           write_state_lang_struct_type (current);
1139           break;
1140         case TYPE_SCALAR:
1141           write_state_scalar_type (current);
1142           break;
1143         case TYPE_STRING:
1144           write_state_string_type (current);
1145           break;
1146         }
1147     }
1148
1149   /* Terminate the "type" s-expression.  */
1150   end_s_expr ();
1151 }
1152
1153
1154 /* Write a pair.  */
1155 void
1156 state_writer::write_state_pair (pair_p current)
1157 {
1158   if (current == NULL)
1159     {
1160       write_any_indent (0);
1161       fprintf (state_file, "nil)");
1162       return;
1163     }
1164
1165   begin_s_expr ("pair");
1166
1167   if (current->name != NULL)
1168     write_state_a_string (current->name);
1169   else
1170     write_state_a_string ("nil");
1171
1172   write_state_type (current->type);
1173   write_state_fileloc (&(current->line));
1174   write_state_options (current->opt);
1175
1176   /* Terminate the "pair" s-expression.  */
1177   end_s_expr ();
1178 }
1179
1180 /* Write a pair list and return the number of pairs written.  */
1181 int
1182 state_writer::write_state_pair_list (pair_p list)
1183 {
1184   int nbpair = 0;
1185   pair_p current;
1186
1187   for (current = list; current != NULL; current = current->next)
1188     {
1189       write_state_pair (current);
1190       nbpair++;
1191     }
1192   return nbpair;
1193
1194 }
1195
1196 /* When writing imported linked lists, like typedefs, structures, ... we count
1197    their length first and write it.  This eases the reading, and enables an
1198    extra verification on the number of actually read items.  */
1199
1200 /* Write our typedefs.  */
1201 void
1202 state_writer::write_state_typedefs (void)
1203 {
1204   int nbtypedefs = pair_list_length (typedefs);
1205   int nbpairs = 0;
1206   begin_s_expr ("typedefs");
1207   fprintf (state_file, "%d", nbtypedefs);
1208   nbpairs = write_state_pair_list (typedefs);
1209   gcc_assert (nbpairs == nbtypedefs);
1210   end_s_expr ();
1211   if (verbosity_level >= 2)
1212     printf ("%s wrote %d typedefs\n", progname, nbtypedefs);
1213 }
1214
1215 /* Write our structures.  */
1216 void
1217 state_writer::write_state_structures (void)
1218 {
1219   int nbstruct = 0;
1220   type_p current;
1221
1222   for (current = structures; current != NULL; current = current->next)
1223     nbstruct++;
1224
1225   begin_s_expr ("structures");
1226   fprintf (state_file, "%d", nbstruct);
1227
1228   for (current = structures; current != NULL; current = current->next)
1229     {
1230       write_new_line ();
1231       write_state_type (current);
1232     }
1233
1234   /* Terminate the "structures" s-expression.  */
1235   end_s_expr ();
1236   if (verbosity_level >= 2)
1237     printf ("%s wrote %d structures in state\n", progname, nbstruct);
1238 }
1239
1240 /* Write our variables.  */
1241 void
1242 state_writer::write_state_variables (void)
1243 {
1244   int nbvars = pair_list_length (variables);
1245   int nbpairs = 0;
1246   begin_s_expr ("variables");
1247   fprintf (state_file, "%d", nbvars);
1248   nbpairs = write_state_pair_list (variables);
1249   gcc_assert (nbpairs == nbvars);
1250   end_s_expr ();
1251   if (verbosity_level >= 2)
1252     printf ("%s wrote %d variables.\n", progname, nbvars);
1253 }
1254
1255 /* Write the source directory.  File locations within the source
1256    directory have been written specifically.  */
1257 void
1258 state_writer::write_state_srcdir (void)
1259 {
1260   begin_s_expr ("srcdir");
1261   write_state_a_string (srcdir);
1262   end_s_expr ();
1263 }
1264
1265 /* Count and write the list of our files.  */
1266 void
1267 state_writer::write_state_files_list (void)
1268 {
1269   int i = 0;
1270   /* Write the list of files with their lang_bitmap.  */
1271   begin_s_expr ("fileslist");
1272   fprintf (state_file, "%d", (int) num_gt_files);
1273   for (i = 0; i < (int) num_gt_files; i++)
1274     {
1275       const char *cursrcrelpath = NULL;
1276       const input_file *curfil = gt_files[i];
1277       /* Most of the files are inside $(srcdir) so it is worth to
1278          handle them specially.  */
1279       cursrcrelpath = get_file_srcdir_relative_path (curfil);
1280       if (cursrcrelpath)
1281         {
1282           begin_s_expr ("srcfile");
1283           fprintf (state_file, "%d ", get_lang_bitmap (curfil));
1284           write_state_a_string (cursrcrelpath);
1285         }
1286       else
1287         {
1288           begin_s_expr ("file");
1289           fprintf (state_file, "%d ", get_lang_bitmap (curfil));
1290           write_state_a_string (get_input_file_name (curfil));
1291         }
1292       /* Terminate the inner s-expression (either "srcfile" or "file").   */
1293       end_s_expr ();
1294     }
1295   /* Terminate the "fileslist" s-expression.  */
1296   end_s_expr ();
1297 }
1298
1299 /* Write the list of GCC front-end languages.  */
1300 void
1301 state_writer::write_state_languages (void)
1302 {
1303   int i = 0;
1304   begin_s_expr ("languages");
1305   fprintf (state_file, "%d", (int) num_lang_dirs);
1306   for (i = 0; i < (int) num_lang_dirs; i++)
1307     {
1308       /* Languages names are identifiers, we expect only letters or
1309          underscores or digits in them.  In particular, C++ is not a
1310          valid language name, but cp is valid.  */
1311       fprintf (state_file, " %s", lang_dir_names[i]);
1312     }
1313   end_s_expr ();
1314 }
1315
1316 /* Write the trailer.  */
1317 static void
1318 write_state_trailer (void)
1319 {
1320   /* This test should probably catch IO errors like disk full...  */
1321   if (fputs ("\n(!endfile)\n", state_file) == EOF)
1322     fatal ("failed to write state trailer [%s]", xstrerror (errno));
1323 }
1324
1325 /* The write_state routine is the only writing routine called by main
1326    in gengtype.c.  To avoid messing the state if gengtype is
1327    interrupted or aborted, we write a temporary file and rename it
1328    after having written it in totality.  */
1329 void
1330 write_state (const char *state_path)
1331 {
1332   long statelen = 0;
1333   time_t now = 0;
1334   char *temp_state_path = NULL;
1335   char tempsuffix[40];
1336   time (&now);
1337
1338   /* We write a unique temporary file which is renamed when complete
1339    * only.  So even if gengtype is interrupted, the written state file
1340    * won't be partially written, since the temporary file is not yet
1341    * renamed in that case.  */
1342   memset (tempsuffix, 0, sizeof (tempsuffix));
1343   snprintf (tempsuffix, sizeof (tempsuffix) - 1, "-%ld-%d.tmp", (long) now,
1344             (int) getpid ());
1345   temp_state_path = concat (state_path, tempsuffix, NULL);
1346   state_file = fopen (temp_state_path, "w");
1347   if (state_file == NULL)
1348     fatal ("Failed to open file %s for writing state: %s",
1349            temp_state_path, xstrerror (errno));
1350   if (verbosity_level >= 3)
1351     printf ("%s writing state file %s temporarily in %s\n",
1352             progname, state_path, temp_state_path);
1353   /* This is the first line of the state.  Perhaps the file utility
1354      could know about that, so don't change it often.  */
1355   fprintf (state_file, ";;;;@@@@ GCC gengtype state\n");
1356   /* Output a few comments for humans. */
1357   fprintf (state_file,
1358            ";;; DON'T EDIT THIS FILE, since generated by GCC's gengtype\n");
1359   fprintf (state_file,
1360            ";;; The format of this file is tied to a particular version of GCC.\n");
1361   fprintf (state_file,
1362            ";;; Don't parse this file wihout knowing GCC gengtype internals.\n");
1363   fprintf (state_file,
1364            ";;; This file should be parsed by the same %s which wrote it.\n",
1365            progname);
1366
1367   state_writer sw;
1368
1369   /* The first non-comment significant line gives the version string.  */
1370   sw.write_state_version (version_string);
1371   sw.write_state_srcdir ();
1372   sw.write_state_languages ();
1373   sw.write_state_files_list ();
1374   sw.write_state_structures ();
1375   sw.write_state_typedefs ();
1376   sw.write_state_variables ();
1377   write_state_trailer ();
1378   statelen = ftell (state_file);
1379   if (ferror (state_file))
1380     fatal ("output error when writing state file %s [%s]",
1381            temp_state_path, xstrerror (errno));
1382   if (fclose (state_file))
1383     fatal ("failed to close state file %s [%s]",
1384            temp_state_path, xstrerror (errno));
1385   if (rename (temp_state_path, state_path))
1386     fatal ("failed to rename %s to state file %s [%s]", temp_state_path,
1387            state_path, xstrerror (errno));
1388   free (temp_state_path);
1389
1390   if (verbosity_level >= 1)
1391     printf ("%s wrote state file %s of %ld bytes with %d GTY-ed types\n",
1392             progname, state_path, statelen, sw.m_state_written_type_count);
1393
1394 }
1395 \f
1396 /** End of writing routines!  The corresponding reading routines follow.  **/
1397
1398
1399
1400 /* Forward declarations, since some read_state_* functions are
1401    recursive! */
1402 static void read_state_fileloc (struct fileloc *line);
1403 static void read_state_options (options_p *opt);
1404 static void read_state_type (type_p *current);
1405 static void read_state_pair (pair_p *pair);
1406 /* Return the number of pairs actually read.  */
1407 static int read_state_pair_list (pair_p *list);
1408 static void read_state_fields (pair_p *fields);
1409 static void read_state_common_type_content (type_p current);
1410
1411
1412
1413
1414 /* Record into the state_seen_types hash-table a type which we are
1415    reading, to enable recursive or circular references to it.  */
1416 static void
1417 record_type (type_p type)
1418 {
1419   PTR *slot;
1420
1421   slot = htab_find_slot (state_seen_types, type, INSERT);
1422   gcc_assert (slot);
1423
1424   *slot = type;
1425 }
1426
1427 /* Read an already seen type.  */
1428 static void
1429 read_state_already_seen_type (type_p *type)
1430 {
1431   struct state_token_st *t0 = peek_state_token (0);
1432
1433   if (state_token_kind (t0) == STOK_INTEGER)
1434     {
1435       PTR *slot = NULL;
1436       struct type loctype = { TYPE_SCALAR, 0, 0, 0, GC_UNUSED, {0} };
1437
1438       loctype.state_number = t0->stok_un.stok_num;
1439       slot = htab_find_slot (state_seen_types, &loctype, NO_INSERT);
1440       if (slot == NULL)
1441         {
1442           fatal_reading_state (t0, "Unknown type");
1443         }
1444
1445       next_state_tokens (1);
1446       *type = (type_p) *slot;
1447     }
1448   else
1449     {
1450       fatal_reading_state (t0, "Bad seen type");
1451     }
1452 }
1453
1454
1455 /* Read the scalar_nonchar type.  */
1456 static void
1457 read_state_scalar_nonchar_type (type_p *type)
1458 {
1459   *type = &scalar_nonchar;
1460   read_state_common_type_content (*type);
1461 }
1462
1463
1464 /* Read the scalar_char type.  */
1465 static void
1466 read_state_scalar_char_type (type_p *type)
1467 {
1468   *type = &scalar_char;
1469   read_state_common_type_content (*type);
1470 }
1471
1472 /* Read the string_type.  */
1473 static void
1474 read_state_string_type (type_p *type)
1475 {
1476   *type = &string_type;
1477   read_state_common_type_content (*type);
1478 }
1479
1480
1481 /* Read a lang_bitmap representing a set of GCC front-end languages.  */
1482 static void
1483 read_state_lang_bitmap (lang_bitmap *bitmap)
1484 {
1485   struct state_token_st *t;
1486
1487   t = peek_state_token (0);
1488   if (state_token_kind (t) == STOK_INTEGER)
1489     {
1490       *bitmap = t->stok_un.stok_num;
1491       next_state_tokens (1);
1492     }
1493   else
1494     {
1495       fatal_reading_state (t, "Bad syntax for bitmap");
1496     }
1497 }
1498
1499
1500 /* Read an undefined type.  */
1501 static void
1502 read_state_undefined_type (type_p type)
1503 {
1504   struct state_token_st *t0;
1505
1506   type->kind = TYPE_UNDEFINED;
1507   read_state_common_type_content (type);
1508   t0 = peek_state_token (0);
1509   if (state_token_kind (t0) == STOK_STRING)
1510     {
1511       if (state_token_is_name (t0, "nil"))
1512         {
1513           type->u.s.tag = NULL;
1514           DBGPRINTF ("read anonymous undefined type @%p #%d",
1515                      (void *) type, type->state_number);
1516         }
1517       else
1518         {
1519           type->u.s.tag = xstrdup (t0->stok_un.stok_string);
1520           DBGPRINTF ("read undefined type @%p #%d '%s'",
1521                      (void *) type, type->state_number, type->u.s.tag);
1522         }
1523
1524       next_state_tokens (1);
1525       read_state_fileloc (&(type->u.s.line));
1526     }
1527   else
1528     {
1529       fatal_reading_state (t0, "Bad tag in undefined type");
1530     }
1531 }
1532
1533
1534 /* Read a GTY-ed struct type.  */
1535 static void
1536 read_state_struct_type (type_p type)
1537 {
1538   struct state_token_st *t0;
1539
1540   type->kind = TYPE_STRUCT;
1541   read_state_common_type_content (type);
1542   t0 = peek_state_token (0);
1543   if (state_token_kind (t0) == STOK_STRING)
1544     {
1545       if (state_token_is_name (t0, "nil"))
1546         {
1547           type->u.s.tag = NULL;
1548           DBGPRINTF ("read anonymous struct type @%p #%d",
1549                      (void *) type, type->state_number);
1550         }
1551       else
1552         {
1553           type->u.s.tag = xstrdup (t0->stok_un.stok_string);
1554           DBGPRINTF ("read struct type @%p #%d '%s'",
1555                      (void *) type, type->state_number, type->u.s.tag);
1556         }
1557
1558       next_state_tokens (1);
1559       read_state_fileloc (&(type->u.s.line));
1560       read_state_fields (&(type->u.s.fields));
1561       read_state_options (&(type->u.s.opt));
1562       read_state_lang_bitmap (&(type->u.s.bitmap));
1563       read_state_type (&(type->u.s.lang_struct));
1564       read_state_type (&(type->u.s.base_class));
1565       if (type->u.s.base_class)
1566         add_subclass (type->u.s.base_class, type);
1567     }
1568   else
1569     {
1570       fatal_reading_state (t0, "Bad tag in struct type");
1571     }
1572 }
1573
1574
1575 /* Read a GTY-ed user-provided struct TYPE.  */
1576
1577 static void
1578 read_state_user_struct_type (type_p type)
1579 {
1580   struct state_token_st *t0;
1581
1582   type->kind = TYPE_USER_STRUCT;
1583   read_state_common_type_content (type);
1584   t0 = peek_state_token (0);
1585   if (state_token_kind (t0) == STOK_STRING)
1586     {
1587       if (state_token_is_name (t0, "nil"))
1588         {
1589           type->u.s.tag = NULL;
1590           DBGPRINTF ("read anonymous struct type @%p #%d",
1591                      (void *) type, type->state_number);
1592         }
1593       else
1594         {
1595           type->u.s.tag = xstrdup (t0->stok_un.stok_string);
1596           DBGPRINTF ("read struct type @%p #%d '%s'",
1597                      (void *) type, type->state_number, type->u.s.tag);
1598         }
1599
1600       next_state_tokens (1);
1601       read_state_fileloc (&(type->u.s.line));
1602       read_state_fields (&(type->u.s.fields));
1603     }
1604   else
1605     {
1606       fatal_reading_state (t0, "Bad tag in user-struct type");
1607     }
1608 }
1609
1610
1611 /* Read a GTY-ed union type.  */
1612 static void
1613 read_state_union_type (type_p type)
1614 {
1615   struct state_token_st *t0;
1616
1617   type->kind = TYPE_UNION;
1618   read_state_common_type_content (type);
1619   t0 = peek_state_token (0);
1620   if (state_token_kind (t0) == STOK_STRING)
1621     {
1622       if (state_token_is_name (t0, "nil"))
1623         {
1624           type->u.s.tag = NULL;
1625           DBGPRINTF ("read anonymous union type @%p #%d",
1626                      (void *) type, type->state_number);
1627         }
1628       else
1629         {
1630           type->u.s.tag = xstrdup (t0->stok_un.stok_string);
1631           DBGPRINTF ("read union type @%p #%d '%s'",
1632                      (void *) type, type->state_number, type->u.s.tag);
1633         }
1634       next_state_tokens (1);
1635       read_state_fileloc (&(type->u.s.line));
1636       read_state_fields (&(type->u.s.fields));
1637       read_state_options (&(type->u.s.opt));
1638       read_state_lang_bitmap (&(type->u.s.bitmap));
1639       read_state_type (&(type->u.s.lang_struct));
1640     }
1641   else
1642     fatal_reading_state (t0, "Bad tag in union type");
1643 }
1644
1645
1646 /* Read a GTY-ed pointer type.  */
1647 static void
1648 read_state_pointer_type (type_p type)
1649 {
1650   type->kind = TYPE_POINTER;
1651   read_state_common_type_content (type);
1652   DBGPRINTF ("read pointer type @%p #%d", (void *) type, type->state_number);
1653   read_state_type (&(type->u.p));
1654 }
1655
1656
1657 /* Read a GTY-ed array type.  */
1658 static void
1659 read_state_array_type (type_p type)
1660 {
1661   struct state_token_st *t0;
1662
1663   type->kind = TYPE_ARRAY;
1664   read_state_common_type_content (type);
1665   t0 = peek_state_token (0);
1666   if (state_token_kind (t0) == STOK_STRING)
1667     {
1668       type->u.a.len = xstrdup (t0->stok_un.stok_string);
1669       DBGPRINTF ("read array type @%p #%d length '%s'",
1670                  (void *) type, type->state_number, type->u.a.len);
1671       next_state_tokens (1);
1672     }
1673
1674   else if (state_token_is_name (t0, "nil"))
1675     {
1676       type->u.a.len = NULL;
1677       DBGPRINTF ("read array type @%p #%d without length",
1678                  (void *) type, type->state_number);
1679       next_state_tokens (1);
1680     }
1681
1682   else
1683     fatal_reading_state (t0, "Bad array name type");
1684   read_state_type (&(type->u.a.p));
1685 }
1686
1687
1688
1689 /* Read a lang_struct type for GTY-ed struct-s which depends upon GCC
1690    front-end languages.  This is a tricky function and it was painful
1691    to debug.  Change it with extreme care.  See also
1692    write_state_lang_struct_type.  */
1693 static void
1694 read_state_lang_struct_type (type_p type)
1695 {
1696   struct state_token_st *t0 = NULL;
1697   struct state_token_st *t1 = NULL;
1698   struct state_token_st *t2 = NULL;
1699
1700   type->kind = TYPE_LANG_STRUCT;
1701   read_state_common_type_content (type);
1702   t0 = peek_state_token (0);
1703   if (state_token_kind (t0) == STOK_STRING)
1704     {
1705       if (state_token_is_name (t0, "nil"))
1706         {
1707           DBGPRINTF ("read anonymous lang_struct type @%p #%d",
1708                      (void *) type, type->state_number);
1709           type->u.s.tag = NULL;
1710         }
1711       else
1712         {
1713           type->u.s.tag = xstrdup (t0->stok_un.stok_string);
1714           DBGPRINTF ("read lang_struct type @%p #%d '%s'",
1715                      (void *) type, type->state_number, type->u.s.tag);
1716         }
1717       next_state_tokens (1);
1718     }
1719   else
1720     fatal_reading_state (t0, "Bad tag in lang struct type");
1721   read_state_fileloc (&(type->u.s.line));
1722   read_state_fields (&(type->u.s.fields));
1723   read_state_options (&(type->u.s.opt));
1724   read_state_lang_bitmap (&(type->u.s.bitmap));
1725   /* Within lang_struct-ures, the lang_struct field is a linked list
1726      of homonymous types! */
1727   t0 = peek_state_token (0);
1728   t1 = peek_state_token (1);
1729   t2 = peek_state_token (2);
1730   /* Parse (!homotypes <number-types> <type-1> .... <type-n>) */
1731   if (state_token_kind (t0) == STOK_LEFTPAR
1732       && state_token_is_name (t1, "!homotypes")
1733       && state_token_kind (t2) == STOK_INTEGER)
1734     {
1735       type_p *prevty = &type->u.s.lang_struct;
1736       int nbhomotype = t2->stok_un.stok_num;
1737       int i = 0;
1738       t0 = t1 = t2 = NULL;
1739       next_state_tokens (3);
1740       for (i = 0; i < nbhomotype; i++)
1741         {
1742           read_state_type (prevty);
1743           t0 = peek_state_token (0);
1744           if (*prevty)
1745             prevty = &(*prevty)->next;
1746           else
1747               fatal_reading_state (t0,
1748                                    "expecting type in homotype list for lang_struct");
1749         };
1750       if (state_token_kind (t0) != STOK_RIGHTPAR)
1751         fatal_reading_state (t0,
1752                              "expecting ) in homotype list for lang_struct");
1753       next_state_tokens (1);
1754     }
1755   else
1756     fatal_reading_state (t0, "expecting !homotypes for lang_struct");
1757 }
1758
1759
1760 /* Read the gc used information.  */
1761 static void
1762 read_state_gc_used (enum gc_used_enum *pgus)
1763 {
1764   struct state_token_st *t0 = peek_state_token (0);
1765   if (state_token_is_name (t0, "gc_unused"))
1766     *pgus = GC_UNUSED;
1767   else if (state_token_is_name (t0, "gc_used"))
1768     *pgus = GC_USED;
1769   else if (state_token_is_name (t0, "gc_maybe_pointed_to"))
1770     *pgus = GC_MAYBE_POINTED_TO;
1771   else if (state_token_is_name (t0, "gc_pointed_to"))
1772     *pgus = GC_POINTED_TO;
1773   else
1774     fatal_reading_state (t0, "invalid gc_used information");
1775   next_state_tokens (1);
1776 }
1777
1778
1779 /* Utility function to read the common content of types.  */
1780 static void
1781 read_state_common_type_content (type_p current)
1782 {
1783   struct state_token_st *t0 = peek_state_token (0);
1784
1785   if (state_token_kind (t0) == STOK_INTEGER)
1786     {
1787       current->state_number = t0->stok_un.stok_num;
1788       next_state_tokens (1);
1789       record_type (current);
1790     }
1791   else
1792       fatal_reading_state_printf (t0,
1793                                   "Expected integer for state_number line %d",
1794                                   state_line);
1795   /* We don't read the next field of the type.  */
1796   read_state_type (&current->pointer_to);
1797   read_state_gc_used (&current->gc_used);
1798 }
1799
1800
1801 /* Read a GTY-ed type.  */
1802 void
1803 read_state_type (type_p *current)
1804 {
1805   struct state_token_st *t0 = peek_state_token (0);
1806   struct state_token_st *t1 = peek_state_token (1);
1807
1808   if (state_token_kind (t0) == STOK_LEFTPAR &&
1809       state_token_is_name (t1, "!type"))
1810     {
1811       next_state_tokens (2);
1812       t0 = peek_state_token (0);
1813       if (state_token_is_name (t0, "already_seen"))
1814         {
1815           next_state_tokens (1);
1816           read_state_already_seen_type (current);
1817         }
1818       else
1819         {
1820           t0 = peek_state_token (0);
1821
1822           if (state_token_is_name (t0, "scalar_nonchar"))
1823             {
1824               next_state_tokens (1);
1825               read_state_scalar_nonchar_type (current);
1826             }
1827           else if (state_token_is_name (t0, "scalar_char"))
1828             {
1829               next_state_tokens (1);
1830               read_state_scalar_char_type (current);
1831             }
1832           else if (state_token_is_name (t0, "string"))
1833             {
1834               next_state_tokens (1);
1835               read_state_string_type (current);
1836             }
1837           else if (state_token_is_name (t0, "undefined"))
1838             {
1839               *current = XCNEW (struct type);
1840               next_state_tokens (1);
1841               read_state_undefined_type (*current);
1842             }
1843           else if (state_token_is_name (t0, "struct"))
1844             {
1845               *current = XCNEW (struct type);
1846               next_state_tokens (1);
1847               read_state_struct_type (*current);
1848             }
1849           else if (state_token_is_name (t0, "union"))
1850             {
1851               *current = XCNEW (struct type);
1852               next_state_tokens (1);
1853               read_state_union_type (*current);
1854             }
1855           else if (state_token_is_name (t0, "lang_struct"))
1856             {
1857               *current = XCNEW (struct type);
1858               next_state_tokens (1);
1859               read_state_lang_struct_type (*current);
1860             }
1861           else if (state_token_is_name (t0, "pointer"))
1862             {
1863               *current = XCNEW (struct type);
1864               next_state_tokens (1);
1865               read_state_pointer_type (*current);
1866             }
1867           else if (state_token_is_name (t0, "array"))
1868             {
1869               *current = XCNEW (struct type);
1870               next_state_tokens (1);
1871               read_state_array_type (*current);
1872             }
1873           else if (state_token_is_name (t0, "user_struct"))
1874             {
1875               *current = XCNEW (struct type);
1876               next_state_tokens (1);
1877               read_state_user_struct_type (*current);
1878             }
1879           else
1880             fatal_reading_state (t0, "bad type in (!type");
1881         }
1882       t0 = peek_state_token (0);
1883       if (state_token_kind (t0) != STOK_RIGHTPAR)
1884         fatal_reading_state (t0, "missing ) in type");
1885       next_state_tokens (1);
1886     }
1887   else if (state_token_is_name (t0, "nil"))
1888     {
1889       next_state_tokens (1);
1890       *current = NULL;
1891     }
1892   else
1893     fatal_reading_state (t0, "bad type syntax");
1894 }
1895
1896
1897 /* Read a file location.  Files within the source directory are dealt
1898    with specifically.  */
1899 void
1900 read_state_fileloc (struct fileloc *floc)
1901 {
1902   bool issrcfile = false;
1903   struct state_token_st *t0 = peek_state_token (0);
1904   struct state_token_st *t1 = peek_state_token (1);
1905
1906   gcc_assert (floc != NULL);
1907   gcc_assert (srcdir != NULL);
1908
1909   if (state_token_kind (t0) == STOK_LEFTPAR &&
1910       (state_token_is_name (t1, "!fileloc")
1911        || (issrcfile = state_token_is_name (t1, "!srcfileloc"))))
1912     {
1913       next_state_tokens (2);
1914       t0 = peek_state_token (0);
1915       t1 = peek_state_token (1);
1916       if (state_token_kind (t0) == STOK_STRING &&
1917           state_token_kind (t1) == STOK_INTEGER)
1918         {
1919           char *path = t0->stok_un.stok_string;
1920           if (issrcfile)
1921             {
1922               static const char dirsepstr[2] = { DIR_SEPARATOR, (char) 0 };
1923               char *fullpath = concat (srcdir, dirsepstr, path, NULL);
1924               floc->file = input_file_by_name (fullpath);
1925               free (fullpath);
1926             }
1927           else
1928             floc->file = input_file_by_name (path);
1929           floc->line = t1->stok_un.stok_num;
1930           next_state_tokens (2);
1931         }
1932       else
1933         fatal_reading_state (t0,
1934                              "Bad fileloc syntax, expected path string and line");
1935       t0 = peek_state_token (0);
1936       if (state_token_kind (t0) != STOK_RIGHTPAR)
1937         fatal_reading_state (t0, "Bad fileloc syntax, expected )");
1938       next_state_tokens (1);
1939     }
1940   else if (state_token_is_name (t0, "nil"))
1941     {
1942       next_state_tokens (1);
1943       floc->file = NULL;
1944       floc->line = 0;
1945     }
1946   else
1947     fatal_reading_state (t0, "Bad fileloc syntax");
1948 }
1949
1950
1951 /* Read the fields of a GTY-ed type.  */
1952 void
1953 read_state_fields (pair_p *fields)
1954 {
1955   pair_p tmp = NULL;
1956   struct state_token_st *t0 = peek_state_token (0);
1957   struct state_token_st *t1 = peek_state_token (1);
1958   struct state_token_st *t2 = peek_state_token (2);
1959
1960   if (state_token_kind (t0) == STOK_LEFTPAR
1961       && state_token_is_name (t1, "!fields")
1962       && state_token_kind (t2) == STOK_INTEGER)
1963     {
1964       int nbfields = t2->stok_un.stok_num;
1965       int nbpairs = 0;
1966       next_state_tokens (3);
1967       nbpairs = read_state_pair_list (&tmp);
1968       t0 = peek_state_token (0);
1969       if (nbpairs != nbfields)
1970         fatal_reading_state_printf
1971           (t0,
1972            "Mismatched fields number, expected %d got %d", nbpairs, nbfields);
1973       if (state_token_kind (t0) == STOK_RIGHTPAR)
1974         next_state_tokens (1);
1975       else
1976         fatal_reading_state (t0, "Bad fields expecting )");
1977     }
1978
1979   *fields = tmp;
1980 }
1981
1982
1983 /* Read a string option.  */
1984 static void
1985 read_state_string_option (options_p opt)
1986 {
1987   struct state_token_st *t0 = peek_state_token (0);
1988   opt->kind = OPTION_STRING;
1989   if (state_token_kind (t0) == STOK_STRING)
1990     {
1991       opt->info.string = xstrdup (t0->stok_un.stok_string);
1992       next_state_tokens (1);
1993     }
1994   else if (state_token_is_name (t0, "nil"))
1995     {
1996       opt->info.string = NULL;
1997       next_state_tokens (1);
1998     }
1999   else
2000     fatal_reading_state (t0, "Missing name in string option");
2001 }
2002
2003
2004 /* Read a type option.  */
2005 static void
2006 read_state_type_option (options_p opt)
2007 {
2008   opt->kind = OPTION_TYPE;
2009   read_state_type (&(opt->info.type));
2010 }
2011
2012
2013 /* Read a nested option.  */
2014 static void
2015 read_state_nested_option (options_p opt)
2016 {
2017   struct state_token_st *t0;
2018
2019   opt->info.nested = XCNEW (struct nested_ptr_data);
2020   opt->kind = OPTION_NESTED;
2021   read_state_type (&(opt->info.nested->type));
2022   t0 = peek_state_token (0);
2023   if (state_token_kind (t0) == STOK_STRING)
2024     {
2025       opt->info.nested->convert_from = xstrdup (t0->stok_un.stok_string);
2026       next_state_tokens (1);
2027     }
2028   else if (state_token_is_name (t0, "nil"))
2029     {
2030       opt->info.nested->convert_from = NULL;
2031       next_state_tokens (1);
2032     }
2033   else
2034     fatal_reading_state (t0, "Bad nested convert_from option");
2035
2036   t0 = peek_state_token (0);
2037   if (state_token_kind (t0) == STOK_STRING)
2038     {
2039       opt->info.nested->convert_to = xstrdup (t0->stok_un.stok_string);
2040       next_state_tokens (1);
2041     }
2042   else if (state_token_is_name (t0, "nil"))
2043     {
2044       opt->info.nested->convert_to = NULL;
2045       next_state_tokens (1);
2046     }
2047   else
2048     fatal_reading_state (t0, "Bad nested convert_from option");
2049 }
2050
2051
2052 /* Read an GTY option.  */
2053 static void
2054 read_state_option (options_p *opt)
2055 {
2056   struct state_token_st *t0 = peek_state_token (0);
2057   struct state_token_st *t1 = peek_state_token (1);
2058
2059   if (state_token_kind (t0) == STOK_LEFTPAR &&
2060       state_token_is_name (t1, "!option"))
2061     {
2062       next_state_tokens (2);
2063       t0 = peek_state_token (0);
2064       if (state_token_kind (t0) == STOK_NAME)
2065         {
2066           *opt = XCNEW (struct options);
2067           if (state_token_is_name (t0, "nil"))
2068             (*opt)->name = NULL;
2069           else
2070             (*opt)->name = t0->stok_un.stok_ident->stid_name;
2071           next_state_tokens (1);
2072           t0 = peek_state_token (0);
2073           if (state_token_kind (t0) == STOK_NAME)
2074             {
2075               if (state_token_is_name (t0, "string"))
2076                 {
2077                   next_state_tokens (1);
2078                   read_state_string_option (*opt);
2079                 }
2080               else if (state_token_is_name (t0, "type"))
2081                 {
2082                   next_state_tokens (1);
2083                   read_state_type_option (*opt);
2084                 }
2085               else if (state_token_is_name (t0, "nested"))
2086                 {
2087                   next_state_tokens (1);
2088                   read_state_nested_option (*opt);
2089                 }
2090               else
2091                 fatal_reading_state (t0, "Bad option type");
2092               t0 = peek_state_token (0);
2093               if (state_token_kind (t0) != STOK_RIGHTPAR)
2094                 fatal_reading_state (t0, "Bad syntax in option, expecting )");
2095
2096               next_state_tokens (1);
2097             }
2098           else
2099             fatal_reading_state (t0, "Missing option type");
2100         }
2101       else
2102         fatal_reading_state (t0, "Bad name for option");
2103     }
2104   else
2105     fatal_reading_state (t0, "Bad option, waiting for )");
2106 }
2107
2108 /* Read a list of options.  */
2109 void
2110 read_state_options (options_p *opt)
2111 {
2112   options_p head = NULL;
2113   options_p previous = NULL;
2114   options_p current_option = NULL;
2115   struct state_token_st *t0 = peek_state_token (0);
2116   struct state_token_st *t1 = peek_state_token (1);
2117
2118   if (state_token_kind (t0) == STOK_LEFTPAR &&
2119       state_token_is_name (t1, "!options"))
2120     {
2121       next_state_tokens (2);
2122       t0 = peek_state_token (0);
2123       while (state_token_kind (t0) != STOK_RIGHTPAR)
2124         {
2125           read_state_option (&current_option);
2126           if (head == NULL)
2127             {
2128               head = current_option;
2129               previous = head;
2130             }
2131           else
2132             {
2133               previous->next = current_option;
2134               previous = current_option;
2135             }
2136           t0 = peek_state_token (0);
2137         }
2138       next_state_tokens (1);
2139     }
2140   else if (state_token_is_name (t0, "nil"))
2141     {
2142       next_state_tokens (1);
2143     }
2144   else
2145     fatal_reading_state (t0, "Bad options syntax");
2146
2147   *opt = head;
2148 }
2149
2150
2151 /* Read a version, and check against the version of the gengtype.  */
2152 static void
2153 read_state_version (const char *version_string)
2154 {
2155   struct state_token_st *t0 = peek_state_token (0);
2156   struct state_token_st *t1 = peek_state_token (1);
2157
2158   if (state_token_kind (t0) == STOK_LEFTPAR &&
2159       state_token_is_name (t1, "!version"))
2160     {
2161       next_state_tokens (2);
2162       t0 = peek_state_token (0);
2163       t1 = peek_state_token (1);
2164       if (state_token_kind (t0) == STOK_STRING &&
2165           state_token_kind (t1) == STOK_RIGHTPAR)
2166         {
2167           /* Check that the read version string is the same as current
2168              version.  */
2169           if (strcmp (version_string, t0->stok_un.stok_string))
2170             fatal_reading_state_printf (t0,
2171                                         "version string mismatch; expecting %s but got %s",
2172                                         version_string,
2173                                         t0->stok_un.stok_string);
2174           next_state_tokens (2);
2175         }
2176       else
2177         fatal_reading_state (t0, "Missing version or right parenthesis");
2178     }
2179   else
2180     fatal_reading_state (t0, "Bad version syntax");
2181 }
2182
2183
2184 /* Read a pair.  */
2185 void
2186 read_state_pair (pair_p *current)
2187 {
2188   struct state_token_st *t0 = peek_state_token (0);
2189   struct state_token_st *t1 = peek_state_token (1);
2190   if (state_token_kind (t0) == STOK_LEFTPAR &&
2191       state_token_is_name (t1, "!pair"))
2192     {
2193       *current = XCNEW (struct pair);
2194       next_state_tokens (2);
2195       t0 = peek_state_token (0);
2196       if (state_token_kind (t0) == STOK_STRING)
2197         {
2198           if (strcmp (t0->stok_un.stok_string, "nil") == 0)
2199             {
2200               (*current)->name = NULL;
2201             }
2202           else
2203             {
2204               (*current)->name = xstrdup (t0->stok_un.stok_string);
2205             }
2206           next_state_tokens (1);
2207           read_state_type (&((*current)->type));
2208           read_state_fileloc (&((*current)->line));
2209           read_state_options (&((*current)->opt));
2210           t0 = peek_state_token (0);
2211           if (state_token_kind (t0) == STOK_RIGHTPAR)
2212             {
2213               next_state_tokens (1);
2214             }
2215           else
2216             {
2217               fatal_reading_state (t0, "Bad syntax for pair, )");
2218             }
2219         }
2220       else
2221         {
2222           fatal_reading_state (t0, "Bad name for pair");
2223         }
2224     }
2225   else if (state_token_kind (t0) == STOK_NAME &&
2226            state_token_is_name (t0, "nil"))
2227     {
2228       next_state_tokens (1);
2229       *current = NULL;
2230     }
2231   else
2232     fatal_reading_state_printf (t0, "Bad syntax for pair, (!pair %d",
2233                                 state_token->stok_kind);
2234 }
2235
2236
2237 /* Return the number of pairs actually read.  */
2238 int
2239 read_state_pair_list (pair_p *list)
2240 {
2241   int nbpair = 0;
2242   pair_p head = NULL;
2243   pair_p previous = NULL;
2244   pair_p tmp = NULL;
2245   struct state_token_st *t0 = peek_state_token (0);
2246   while (t0 && state_token_kind (t0) != STOK_RIGHTPAR)
2247     {
2248       read_state_pair (&tmp);
2249       if (head == NULL)
2250         {
2251           head = tmp;
2252           previous = head;
2253         }
2254       else
2255         {
2256           previous->next = tmp;
2257           previous = tmp;
2258         }
2259       t0 = peek_state_token (0);
2260       nbpair++;
2261     }
2262
2263   /* don't consume the ); the caller will eat it.  */
2264   *list = head;
2265   return nbpair;
2266 }
2267
2268 /* Read the typedefs.  */
2269 static void
2270 read_state_typedefs (pair_p *typedefs)
2271 {
2272   int nbtypedefs = 0;
2273   pair_p list = NULL;
2274   struct state_token_st *t0 = peek_state_token (0);
2275   struct state_token_st *t1 = peek_state_token (1);
2276   struct state_token_st *t2 = peek_state_token (2);
2277
2278   if (state_token_kind (t0) == STOK_LEFTPAR
2279       && state_token_is_name (t1, "!typedefs")
2280       && state_token_kind (t2) == STOK_INTEGER)
2281     {
2282       int nbpairs = 0;
2283       nbtypedefs = t2->stok_un.stok_num;
2284       next_state_tokens (3);
2285       nbpairs = read_state_pair_list (&list);
2286       t0 = peek_state_token (0);
2287       if (nbpairs != nbtypedefs)
2288         fatal_reading_state_printf
2289           (t0,
2290            "invalid number of typedefs, expected %d but got %d",
2291            nbtypedefs, nbpairs);
2292       if (state_token_kind (t0) == STOK_RIGHTPAR)
2293         next_state_tokens (1);
2294       else
2295         fatal_reading_state (t0, "Bad typedefs syntax )");
2296     }
2297   else
2298     fatal_reading_state (t0, "Bad typedefs syntax (!typedefs");
2299
2300   if (verbosity_level >= 2)
2301     printf ("%s read %d typedefs from state\n", progname, nbtypedefs);
2302   *typedefs = list;
2303 }
2304
2305
2306 /* Read the structures.  */
2307 static void
2308 read_state_structures (type_p *structures)
2309 {
2310   type_p head = NULL;
2311   type_p previous = NULL;
2312   type_p tmp;
2313   int nbstruct = 0, countstruct = 0;
2314   struct state_token_st *t0 = peek_state_token (0);
2315   struct state_token_st *t1 = peek_state_token (1);
2316   struct state_token_st *t2 = peek_state_token (2);
2317
2318   if (state_token_kind (t0) == STOK_LEFTPAR
2319       && state_token_is_name (t1, "!structures")
2320       && state_token_kind (t2) == STOK_INTEGER)
2321     {
2322       nbstruct = t2->stok_un.stok_num;
2323       next_state_tokens (3);
2324       t0 = peek_state_token (0);
2325       while (t0 && state_token_kind (t0) != STOK_RIGHTPAR)
2326         {
2327           tmp = NULL;
2328           read_state_type (&tmp);
2329           countstruct++;
2330           if (head == NULL)
2331             {
2332               head = tmp;
2333               previous = head;
2334             }
2335           else
2336             {
2337               previous->next = tmp;
2338               previous = tmp;
2339             }
2340           t0 = peek_state_token (0);
2341         }
2342       next_state_tokens (1);
2343     }
2344   else
2345     fatal_reading_state (t0, "Bad structures syntax");
2346   if (countstruct != nbstruct)
2347     fatal_reading_state_printf (NULL_STATE_TOKEN, 
2348                                 "expected %d structures but got %d",
2349                                 nbstruct, countstruct);
2350   if (verbosity_level >= 2)
2351     printf ("%s read %d structures from state\n", progname, nbstruct);
2352   *structures = head;
2353 }
2354
2355
2356 /* Read the variables.  */
2357 static void
2358 read_state_variables (pair_p *variables)
2359 {
2360   pair_p list = NULL;
2361   int nbvars = 0;
2362   struct state_token_st *t0 = peek_state_token (0);
2363   struct state_token_st *t1 = peek_state_token (1);
2364   struct state_token_st *t2 = peek_state_token (2);
2365
2366   if (state_token_kind (t0) == STOK_LEFTPAR
2367       && state_token_is_name (t1, "!variables")
2368       && state_token_kind (t2) == STOK_INTEGER)
2369     {
2370       int nbpairs = 0;
2371       nbvars = t2->stok_un.stok_num;
2372       next_state_tokens (3);
2373       nbpairs = read_state_pair_list (&list);
2374       t0 = peek_state_token (0);
2375       if (nbpairs != nbvars)
2376         fatal_reading_state_printf
2377           (t0, "Invalid number of variables, expected %d but got %d",
2378            nbvars, nbpairs);
2379       if (state_token_kind (t0) == STOK_RIGHTPAR)
2380         next_state_tokens (1);
2381       else
2382         fatal_reading_state (t0, "Waiting for ) in variables");
2383     }
2384   else
2385     fatal_reading_state (t0, "Bad variables syntax");
2386   *variables = list;
2387   if (verbosity_level >= 2)
2388     printf ("%s read %d variables from state\n", progname, nbvars);
2389 }
2390
2391
2392 /* Read the source directory.  */
2393 static void
2394 read_state_srcdir (void)
2395 {
2396   struct state_token_st *t0 = peek_state_token (0);
2397   struct state_token_st *t1 = peek_state_token (1);
2398   if (state_token_kind (t0) == STOK_LEFTPAR &&
2399       state_token_is_name (t1, "!srcdir"))
2400     {
2401       next_state_tokens (2);
2402       t0 = peek_state_token (0);
2403       t1 = peek_state_token (1);
2404       if (state_token_kind (t0) == STOK_STRING &&
2405           state_token_kind (t1) == STOK_RIGHTPAR)
2406         {
2407           srcdir = xstrdup (t0->stok_un.stok_string);
2408           srcdir_len = strlen (srcdir);
2409           next_state_tokens (2);
2410           return;
2411         }
2412     }
2413
2414   fatal_reading_state (t0, "Bad srcdir in state_file");
2415 }
2416
2417
2418 /* Read the sequence of GCC front-end languages.  */
2419 static void
2420 read_state_languages (void)
2421 {
2422   struct state_token_st *t0 = peek_state_token (0);
2423   struct state_token_st *t1 = peek_state_token (1);
2424   struct state_token_st *t2 = peek_state_token (2);
2425   if (state_token_kind (t0) == STOK_LEFTPAR
2426       && state_token_is_name (t1, "!languages")
2427       && state_token_kind (t2) == STOK_INTEGER)
2428     {
2429       int i = 0;
2430       num_lang_dirs = t2->stok_un.stok_num;
2431       lang_dir_names = XCNEWVEC (const char *, num_lang_dirs);
2432       next_state_tokens (3);
2433       t0 = t1 = t2 = NULL;
2434       for (i = 0; i < (int) num_lang_dirs; i++)
2435         {
2436           t0 = peek_state_token (0);
2437           if (state_token_kind (t0) != STOK_NAME)
2438             fatal_reading_state (t0, "expecting language name in state file");
2439           lang_dir_names[i] = t0->stok_un.stok_ident->stid_name;
2440           next_state_tokens (1);
2441         }
2442       t0 = peek_state_token (0);
2443       if (state_token_kind (t0) != STOK_RIGHTPAR)
2444         fatal_reading_state (t0, "missing ) in languages list of state file");
2445       next_state_tokens (1);
2446     }
2447   else
2448     fatal_reading_state (t0, "expecting languages list in state file");
2449
2450 }
2451
2452 /* Read the sequence of files.  */
2453 static void
2454 read_state_files_list (void)
2455 {
2456   struct state_token_st *t0 = peek_state_token (0);
2457   struct state_token_st *t1 = peek_state_token (1);
2458   struct state_token_st *t2 = peek_state_token (2);
2459
2460   if (state_token_kind (t0) == STOK_LEFTPAR
2461       && state_token_is_name (t1, "!fileslist")
2462       && state_token_kind (t2) == STOK_INTEGER)
2463     {
2464       int i = 0;
2465       num_gt_files = t2->stok_un.stok_num;
2466       next_state_tokens (3);
2467       t0 = t1 = t2 = NULL;
2468       gt_files = XCNEWVEC (const input_file *, num_gt_files);
2469       for (i = 0; i < (int) num_gt_files; i++)
2470         {
2471           bool issrcfile = FALSE;
2472           t0 = t1 = t2 = NULL;
2473           t0 = peek_state_token (0);
2474           t1 = peek_state_token (1);
2475           t2 = peek_state_token (2);
2476           if (state_token_kind (t0) == STOK_LEFTPAR
2477               && (state_token_is_name (t1, "!file")
2478                   || (issrcfile = state_token_is_name (t1, "!srcfile")))
2479               && state_token_kind (t2) == STOK_INTEGER)
2480             {
2481               lang_bitmap bmap = t2->stok_un.stok_num;
2482               next_state_tokens (3);
2483               t0 = t1 = t2 = NULL;
2484               t0 = peek_state_token (0);
2485               t1 = peek_state_token (1);
2486               if (state_token_kind (t0) == STOK_STRING
2487                   && state_token_kind (t1) == STOK_RIGHTPAR)
2488                 {
2489                   const char *fnam = t0->stok_un.stok_string;
2490                   /* Allocate & fill a gt_file entry with space for the lang_bitmap before! */
2491                   input_file *curgt = NULL;
2492                   if (issrcfile)
2493                     {
2494                       static const char dirsepstr[2] =
2495                         { DIR_SEPARATOR, (char) 0 };
2496                       char *fullpath = concat (srcdir, dirsepstr, fnam, NULL);
2497                       curgt = input_file_by_name (fullpath);
2498                       free (fullpath);
2499                     }
2500                   else
2501                     curgt = input_file_by_name (fnam);
2502                   set_lang_bitmap (curgt, bmap);
2503                   gt_files[i] = curgt;
2504                   next_state_tokens (2);
2505                 }
2506               else
2507                 fatal_reading_state (t0,
2508                                      "bad file in !fileslist of state file");
2509             }
2510           else
2511             fatal_reading_state (t0,
2512                                  "expecting file in !fileslist of state file");
2513         };
2514       t0 = peek_state_token (0);
2515       if (state_token_kind (t0) != STOK_RIGHTPAR)
2516         fatal_reading_state (t0, "missing ) for !fileslist in state file");
2517       next_state_tokens (1);
2518     }
2519   else
2520     fatal_reading_state (t0, "missing !fileslist in state file");
2521 }
2522
2523
2524 /* Read the trailer.  */
2525 static void
2526 read_state_trailer (void)
2527 {
2528   struct state_token_st *t0 = peek_state_token (0);
2529   struct state_token_st *t1 = peek_state_token (1);
2530   struct state_token_st *t2 = peek_state_token (2);
2531
2532   if (state_token_kind (t0) == STOK_LEFTPAR
2533       && state_token_is_name (t1, "!endfile")
2534       && state_token_kind (t2) == STOK_RIGHTPAR)
2535     next_state_tokens (3);
2536   else
2537     fatal_reading_state (t0, "missing !endfile in state file");
2538 }
2539
2540
2541 /* Utility functions for the state_seen_types hash table.  */
2542 static unsigned
2543 hash_type_number (const void *ty)
2544 {
2545   const struct type *type = (const struct type *) ty;
2546
2547   return type->state_number;
2548 }
2549
2550 static int
2551 equals_type_number (const void *ty1, const void *ty2)
2552 {
2553   const struct type *type1 = (const struct type *) ty1;
2554   const struct type *type2 = (const struct type *) ty2;
2555
2556   return type1->state_number == type2->state_number;
2557 }
2558
2559 static int
2560 string_eq (const void *a, const void *b)
2561 {
2562   const char *a0 = (const char *)a;
2563   const char *b0 = (const char *)b;
2564
2565   return (strcmp (a0, b0) == 0);
2566 }
2567
2568
2569 /* The function reading the state, called by main from gengtype.c.  */
2570 void
2571 read_state (const char *path)
2572 {
2573   state_file = fopen (path, "r");
2574   if (state_file == NULL)
2575     fatal ("Failed to open state file %s for reading [%s]", path,
2576            xstrerror (errno));
2577   state_path = path;
2578   state_line = 1;
2579
2580   if (verbosity_level >= 1)
2581     {
2582       printf ("%s reading state file %s;", progname, state_path);
2583       if (verbosity_level >= 2)
2584         putchar ('\n');
2585       fflush (stdout);
2586     }
2587
2588   state_seen_types =
2589     htab_create (2017, hash_type_number, equals_type_number, NULL);
2590   state_ident_tab =
2591     htab_create (4027, htab_hash_string, string_eq, NULL);
2592   read_state_version (version_string);
2593   read_state_srcdir ();
2594   read_state_languages ();
2595   read_state_files_list ();
2596   read_state_structures (&structures);
2597   if (ferror (state_file))
2598     fatal_reading_state_printf
2599       (NULL_STATE_TOKEN, "input error while reading state [%s]",
2600        xstrerror (errno));
2601   read_state_typedefs (&typedefs);
2602   read_state_variables (&variables);
2603   read_state_trailer ();
2604
2605   if (verbosity_level >= 1)
2606     {
2607       printf ("%s read %ld bytes.\n", progname, ftell (state_file));
2608       fflush (stdout);
2609     };
2610
2611   if (fclose (state_file))
2612     fatal ("failed to close read state file %s [%s]",
2613            path, xstrerror (errno));
2614   state_file = NULL;
2615   state_path = NULL;
2616 }
2617
2618 /* End of file gengtype-state.c.  */