1 /* Gengtype persistent state serialization & de-serialization.
2 Useful for gengtype in plugin mode.
4 Copyright (C) 2010-2013 Free Software Foundation, Inc.
6 This file is part of GCC.
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
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
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/>.
22 Contributed by Jeremie Salvucci <jeremie.salvucci@free.fr>
23 and Basile Starynkevitch <basile@starynkevitch.net>
32 #include "errors.h" /* For fatal. */
33 #include "double-int.h"
35 #include "version.h" /* For version_string & pkgversion_string. */
41 /* Gives the file location of a type, if any. */
42 static inline struct fileloc
*
43 type_lineloc (const_type_p ty
)
53 case TYPE_LANG_STRUCT
:
54 case TYPE_USER_STRUCT
:
56 return CONST_CAST (struct fileloc
*, &ty
->u
.s
.line
);
57 case TYPE_PARAM_STRUCT
:
58 return CONST_CAST (struct fileloc
*, &ty
->u
.param_struct
.line
);
69 /* The state file has simplistic lispy lexical tokens. Its lexer gives
70 a linked list of struct state_token_st, through the peek_state_token
71 function. Lexical tokens are consumed with next_state_tokens. */
74 /* The lexical kind of each lispy token. */
77 STOK_NONE
, /* Never used. */
78 STOK_INTEGER
, /* Integer token. */
79 STOK_STRING
, /* String token. */
80 STOK_LEFTPAR
, /* Left opening parenthesis. */
81 STOK_RIGHTPAR
, /* Right closing parenthesis. */
82 STOK_NAME
/* hash-consed name or identifier. */
86 /* Structure and hash-table used to share identifiers or names. */
89 /* TODO: We could improve the parser by reserving identifiers for
90 state keywords and adding a keyword number for them. That would
91 mean adding another field in this state_ident_st struct. */
92 char stid_name
[1]; /* actually bigger & null terminated */
94 static htab_t state_ident_tab
;
97 /* The state_token_st structure is for lexical tokens in the read
98 state file. The stok_kind field discriminates the union. Tokens
99 are allocated by peek_state_token which calls read_a_state_token
100 which allocate them. Tokens are freed by calls to
101 next_state_tokens. Token are organized in a FIFO look-ahead queue
102 filled by peek_state_token. */
103 struct state_token_st
105 enum state_token_en stok_kind
; /* the lexical kind
106 discriminates the stok_un
108 int stok_line
; /* the line number */
109 int stok_col
; /* the column number */
110 const char *stok_file
; /* the file path */
111 struct state_token_st
*stok_next
; /* the next token in the
112 queue, when peeked */
113 union /* discriminated by stok_kind! */
115 int stok_num
; /* when STOK_INTEGER */
116 char stok_string
[1]; /* when STOK_STRING, actual size is
117 bigger and null terminated */
118 struct state_ident_st
*stok_ident
; /* when STOK_IDENT */
119 void *stok_ptr
; /* null otherwise */
127 #define NULL_STATE_TOKEN (struct state_token_st*)0
129 /* the state_token pointer contains the leftmost current token. The
130 tokens are organized in a linked queue, using stok_next, for token
132 struct state_token_st
*state_token
= NULL_STATE_TOKEN
;
134 /* Used by the reading lexer. */
135 static FILE *state_file
;
136 static const char *state_path
= NULL
;
137 static int state_line
= 0;
138 static long state_bol
= 0; /* offset of beginning of line */
140 /* A class for writing out s-expressions, keeping track of newlines and
141 nested indentation. */
147 void write_new_line ();
148 void write_any_indent (int leading_spaces
);
150 void begin_s_expr (const char *tag
);
155 int m_had_recent_newline
;
156 }; // class s_expr_writer
158 /* A class for writing out "gtype.state". */
159 class state_writer
: public s_expr_writer
165 void write_state_fileloc (struct fileloc
*floc
);
166 void write_state_fields (pair_p fields
);
167 void write_state_a_string (const char *s
);
168 void write_state_string_option (options_p current
);
169 void write_state_type_option (options_p current
);
170 void write_state_nested_option (options_p current
);
171 void write_state_option (options_p current
);
172 void write_state_options (options_p opt
);
173 void write_state_lang_bitmap (lang_bitmap bitmap
);
174 void write_state_version (const char *version
);
175 void write_state_scalar_type (type_p current
);
176 void write_state_string_type (type_p current
);
177 void write_state_undefined_type (type_p current
);
178 void write_state_struct_union_type (type_p current
, const char *kindstr
);
179 void write_state_struct_type (type_p current
);
180 void write_state_user_struct_type (type_p current
);
181 void write_state_union_type (type_p current
);
182 void write_state_lang_struct_type (type_p current
);
183 void write_state_param_struct_type (type_p current
);
184 void write_state_pointer_type (type_p current
);
185 void write_state_array_type (type_p current
);
186 void write_state_gc_used (enum gc_used_enum gus
);
187 void write_state_common_type_content (type_p current
);
188 void write_state_type (type_p current
);
189 void write_state_pair (pair_p current
);
190 int write_state_pair_list (pair_p list
);
191 void write_state_typedefs (void);
192 void write_state_structures (void);
193 void write_state_param_structs (void);
194 void write_state_variables (void);
195 void write_state_srcdir (void);
196 void write_state_files_list (void);
197 void write_state_languages (void);
199 friend void write_state (const char *state_path
);
202 /* Counter of written types. */
203 int m_state_written_type_count
;
204 }; // class state_writer
207 /* class s_expr_writer's trivial constructor. */
208 s_expr_writer::s_expr_writer ()
209 : m_indent_amount (0),
210 m_had_recent_newline (0)
214 /* Write a newline to the output file, merging adjacent newlines. */
216 s_expr_writer::write_new_line (void)
218 /* Don't add a newline if we've just had one. */
219 if (!m_had_recent_newline
)
221 fprintf (state_file
, "\n");
222 m_had_recent_newline
= 1;
226 /* If we've just had a newline, write the indentation amount, potentially
227 omitting some spaces.
229 LEADING_SPACES exists to support code that writes strings with leading
230 spaces (e.g " foo") which might occur within a line, or could be the first
231 thing on a line. By passing leading_spaces == 1, when such a string is the
232 first thing on a line, write_any_indent () swallows the successive
233 leading spaces into the indentation so that the "foo" begins at the expected
236 s_expr_writer::write_any_indent (int leading_spaces
)
239 int amount
= m_indent_amount
- leading_spaces
;
240 if (m_had_recent_newline
)
241 for (i
= 0; i
< amount
; i
++)
242 fprintf (state_file
, " ");
243 m_had_recent_newline
= 0;
246 /* Write the beginning of a new s-expresion e.g. "(!foo "
247 The writer automatically adds whitespace to show the hierarchical
248 structure of the expressions, so each one starts on a new line,
249 and any within it will be at an increased indentation level. */
251 s_expr_writer::begin_s_expr (const char *tag
)
254 write_any_indent (0);
255 fprintf (state_file
, "(!%s ", tag
);
259 /* Write out the end of an s-expression: any necssessary indentation,
260 a closing parenthesis, and a new line. */
262 s_expr_writer::end_s_expr (void)
265 write_any_indent (0);
266 fprintf (state_file
, ")");
271 /* class state_writer's trivial constructor. */
272 state_writer::state_writer ()
274 m_state_written_type_count (0)
279 /* Fatal error messages when reading the state. They are extremely
280 unlikely, and only appear when this gengtype-state.c file is buggy,
281 or when reading a gengtype state which was not generated by the
282 same version of gengtype or GCC. */
285 /* Fatal message while reading state. */
287 fatal_reading_state (struct state_token_st
* tok
, const char*msg
)
290 fatal ("%s:%d:%d: Invalid state file; %s",
291 tok
->stok_file
, tok
->stok_line
, tok
->stok_col
,
294 fatal ("%s:%d: Invalid state file; %s",
295 state_path
, state_line
, msg
);
299 /* Fatal printf-like message while reading state. This can't be a
300 function, because there is no way to pass a va_arg to a variant of
302 #define fatal_reading_state_printf(Tok,Fmt,...) do { \
303 struct state_token_st* badtok = Tok; \
305 fatal ("%s:%d:%d: Invalid state file; " Fmt, \
308 badtok->stok_col, __VA_ARGS__); \
310 fatal ("%s:%d: Invalid state file; " Fmt, \
311 state_path, state_line, __VA_ARGS__); \
315 /* Find or allocate an identifier in our name hash table. */
316 static struct state_ident_st
*
317 state_ident_by_name (const char *name
, enum insert_option optins
)
321 struct state_ident_st
*stid
= NULL
;
323 if (!name
|| !name
[0])
326 slot
= htab_find_slot (state_ident_tab
, name
, optins
);
330 namlen
= strlen (name
);
332 (struct state_ident_st
*) xmalloc (sizeof (struct state_ident_st
) +
334 memset (stid
, 0, sizeof (struct state_ident_st
) + namlen
);
335 strcpy (stid
->stid_name
, name
);
341 /* Our token lexer is heavily inspired by MELT's lexer, and share some
342 code with the file gcc/melt-runtime.c of the GCC MELT branch! We
343 really want the gengtype state to be easily parsable by MELT. This
344 is a usual lispy lexing routine, dealing with spaces and comments,
345 numbers, parenthesis, names, strings. */
346 static struct state_token_st
*
347 read_a_state_token (void)
351 struct state_token_st
*tk
= NULL
;
353 again
: /* Read again, e.g. after a comment or spaces. */
354 c
= getc (state_file
);
358 /* Handle spaces, count lines. */
362 state_bol
= curoff
= ftell (state_file
);
367 /* Skip comments starting with semi-colon. */
372 c
= getc (state_file
);
374 while (c
> 0 && c
!= '\n');
378 state_bol
= curoff
= ftell (state_file
);
382 /* Read signed numbers. */
383 if (ISDIGIT (c
) || c
== '-' || c
== '+')
386 ungetc (c
, state_file
);
387 curoff
= ftell (state_file
);
388 if (fscanf (state_file
, "%d", &n
) <= 0)
389 fatal_reading_state (NULL_STATE_TOKEN
, "Lexical error in number");
390 tk
= XCNEW (struct state_token_st
);
391 tk
->stok_kind
= STOK_INTEGER
;
392 tk
->stok_line
= state_line
;
393 tk
->stok_col
= curoff
- state_bol
;
394 tk
->stok_file
= state_path
;
395 tk
->stok_next
= NULL
;
396 tk
->stok_un
.stok_num
= n
;
400 /* Read an opening left parenthesis. */
403 curoff
= ftell (state_file
);
404 tk
= XCNEW (struct state_token_st
);
405 tk
->stok_kind
= STOK_LEFTPAR
;
406 tk
->stok_line
= state_line
;
407 tk
->stok_col
= curoff
- state_bol
;
408 tk
->stok_file
= state_path
;
409 tk
->stok_next
= NULL
;
413 /* Read an closing right parenthesis. */
416 curoff
= ftell (state_file
);
417 tk
= XCNEW (struct state_token_st
);
418 tk
->stok_kind
= STOK_RIGHTPAR
;
419 tk
->stok_line
= state_line
;
420 tk
->stok_col
= curoff
- state_bol
;
421 tk
->stok_file
= state_path
;
422 tk
->stok_next
= NULL
;
426 /* Read identifiers, using an obstack. */
427 else if (ISALPHA (c
) || c
== '_' || c
== '$' || c
== '!' || c
== '#')
429 struct obstack id_obstack
;
430 struct state_ident_st
*sid
= NULL
;
432 obstack_init (&id_obstack
);
433 curoff
= ftell (state_file
);
434 while (ISALNUM (c
) || c
== '_' || c
== '$' || c
== '!' || c
== '#')
436 obstack_1grow (&id_obstack
, c
);
437 c
= getc (state_file
);
442 ungetc (c
, state_file
);
443 obstack_1grow (&id_obstack
, (char) 0);
444 ids
= XOBFINISH (&id_obstack
, char *);
445 sid
= state_ident_by_name (ids
, INSERT
);
446 obstack_free (&id_obstack
, NULL
);
448 tk
= XCNEW (struct state_token_st
);
449 tk
->stok_kind
= STOK_NAME
;
450 tk
->stok_line
= state_line
;
451 tk
->stok_col
= curoff
- state_bol
;
452 tk
->stok_file
= state_path
;
453 tk
->stok_next
= NULL
;
454 tk
->stok_un
.stok_ident
= sid
;
458 /* Read a string, dealing with escape sequences a la C! */
463 struct obstack bstring_obstack
;
464 obstack_init (&bstring_obstack
);
465 curoff
= ftell (state_file
);
466 while ((c
= getc (state_file
)) != '"' && c
>= 0)
468 if (ISPRINT (c
) && c
!= '\\')
469 obstack_1grow (&bstring_obstack
, (char) c
);
470 else if (ISSPACE (c
) && c
!= '\n')
471 obstack_1grow (&bstring_obstack
, (char) c
);
474 c
= getc (state_file
);
478 obstack_1grow (&bstring_obstack
, '\a');
479 c
= getc (state_file
);
482 obstack_1grow (&bstring_obstack
, '\b');
483 c
= getc (state_file
);
486 obstack_1grow (&bstring_obstack
, '\t');
487 c
= getc (state_file
);
490 obstack_1grow (&bstring_obstack
, '\n');
491 c
= getc (state_file
);
494 obstack_1grow (&bstring_obstack
, '\v');
495 c
= getc (state_file
);
498 obstack_1grow (&bstring_obstack
, '\f');
499 c
= getc (state_file
);
502 obstack_1grow (&bstring_obstack
, '\r');
503 c
= getc (state_file
);
506 obstack_1grow (&bstring_obstack
, '\"');
507 c
= getc (state_file
);
510 obstack_1grow (&bstring_obstack
, '\\');
511 c
= getc (state_file
);
514 obstack_1grow (&bstring_obstack
, ' ');
515 c
= getc (state_file
);
520 if (fscanf (state_file
, "%02x", &cx
) > 0 && cx
> 0)
521 obstack_1grow (&bstring_obstack
, cx
);
525 "Lexical error in string hex escape");
526 c
= getc (state_file
);
532 "Lexical error - unknown string escape");
536 fatal_reading_state (NULL_STATE_TOKEN
, "Lexical error...");
539 fatal_reading_state (NULL_STATE_TOKEN
, "Unterminated string");
540 obstack_1grow (&bstring_obstack
, '\0');
541 cstr
= XOBFINISH (&bstring_obstack
, char *);
542 cslen
= strlen (cstr
);
543 tk
= (struct state_token_st
*)
544 xcalloc (sizeof (struct state_token_st
) + cslen
, 1);
545 tk
->stok_kind
= STOK_STRING
;
546 tk
->stok_line
= state_line
;
547 tk
->stok_col
= curoff
- state_bol
;
548 tk
->stok_file
= state_path
;
549 tk
->stok_next
= NULL
;
550 strcpy (tk
->stok_un
.stok_string
, cstr
);
551 obstack_free (&bstring_obstack
, NULL
);
555 /* Got an unexpected character. */
556 fatal_reading_state_printf
558 "Lexical error at offset %ld - bad character \\%03o = '%c'",
559 ftell (state_file
), c
, c
);
562 /* Used for lexical look-ahead. Retrieves the lexical token of rank
563 DEPTH, starting with 0 when reading the state file. Gives null on
565 static struct state_token_st
*
566 peek_state_token (int depth
)
568 int remdepth
= depth
;
569 struct state_token_st
**ptoken
= &state_token
;
570 struct state_token_st
*tok
= NULL
;
572 while (remdepth
>= 0)
576 *ptoken
= tok
= read_a_state_token ();
581 ptoken
= &((*ptoken
)->stok_next
);
588 /* Consume the next DEPTH tokens and free them. */
590 next_state_tokens (int depth
)
592 struct state_token_st
*n
;
596 if (state_token
!= NULL
)
598 n
= state_token
->stok_next
;
603 fatal_reading_state (NULL_STATE_TOKEN
, "Tokens stack empty");
609 /* Safely retrieve the lexical kind of a token. */
610 static inline enum state_token_en
611 state_token_kind (struct state_token_st
*p
)
619 /* Test if a token is a given name i.e. an identifier. */
621 state_token_is_name (struct state_token_st
*p
, const char *name
)
626 if (p
->stok_kind
!= STOK_NAME
)
629 return !strcmp (p
->stok_un
.stok_ident
->stid_name
, name
);
633 /* Following routines are useful for serializing datas.
635 * We want to serialize :
638 * - param_structs list
641 * So, we have one routine for each kind of data. The main writing
642 * routine is write_state. The main reading routine is
643 * read_state. Most writing routines write_state_FOO have a
644 * corresponding reading routine read_state_FOO. Reading is done in a
645 * recursive descending way, and any read error is fatal.
648 /* When reading the state, we need to remember the previously seen
649 types by their state_number, since GTY-ed types are usually
651 static htab_t state_seen_types
;
653 /* Return the length of a linked list made of pairs. */
654 static int pair_list_length (pair_p list
);
656 /* Compute the length of a list of pairs, starting from the first
659 pair_list_length (pair_p list
)
663 for (l
= list
; l
; l
= l
->next
)
668 /* Write a file location. Files relative to $(srcdir) are quite
669 frequent and are handled specially. This ensures that two gengtype
670 state file-s produced by gengtype on the same GCC source tree are
671 very similar and can be reasonably compared with diff, even if the
672 two GCC source trees have different absolute paths. */
674 state_writer::write_state_fileloc (struct fileloc
*floc
)
677 if (floc
!= NULL
&& floc
->line
> 0)
679 const char *srcrelpath
= NULL
;
680 gcc_assert (floc
->file
!= NULL
);
681 /* Most of the files are inside $(srcdir) so it is worth to
682 handle them specially. */
683 srcrelpath
= get_file_srcdir_relative_path (floc
->file
);
684 if (srcrelpath
!= NULL
)
686 begin_s_expr ("srcfileloc");
687 write_state_a_string (srcrelpath
);
691 begin_s_expr ("fileloc");
692 write_state_a_string (get_input_file_name (floc
->file
));
694 fprintf (state_file
, " %d", floc
->line
);
698 fprintf (state_file
, "nil ");
701 /* Write a list of fields. */
703 state_writer::write_state_fields (pair_p fields
)
705 int nbfields
= pair_list_length (fields
);
707 begin_s_expr ("fields");
708 fprintf (state_file
, "%d ", nbfields
);
709 nbpairs
= write_state_pair_list (fields
);
710 gcc_assert (nbpairs
== nbfields
);
714 /* Write a null-terminated string in our lexical convention, very
715 similar to the convention of C. */
717 state_writer::write_state_a_string (const char *s
)
721 write_any_indent (1);
723 fputs (" \"", state_file
);
730 fputs ("\\a", state_file
);
733 fputs ("\\b", state_file
);
736 fputs ("\\t", state_file
);
739 fputs ("\\n", state_file
);
742 fputs ("\\v", state_file
);
745 fputs ("\\f", state_file
);
748 fputs ("\\r", state_file
);
751 fputs ("\\\"", state_file
);
754 fputs ("\\\\", state_file
);
758 putc (c
, state_file
);
760 fprintf (state_file
, "\\x%02x", (unsigned) c
);
763 fputs ("\"", state_file
);
766 /* Our option-s have three kinds, each with its writer. */
768 state_writer::write_state_string_option (options_p current
)
770 write_any_indent (0);
771 fprintf (state_file
, "string ");
772 if (current
->info
.string
!= NULL
)
773 write_state_a_string (current
->info
.string
);
775 fprintf (state_file
, " nil ");
779 state_writer::write_state_type_option (options_p current
)
781 write_any_indent (0);
782 fprintf (state_file
, "type ");
783 write_state_type (current
->info
.type
);
787 state_writer::write_state_nested_option (options_p current
)
789 write_any_indent (0);
790 fprintf (state_file
, "nested ");
791 write_state_type (current
->info
.nested
->type
);
792 if (current
->info
.nested
->convert_from
!= NULL
)
793 write_state_a_string (current
->info
.nested
->convert_from
);
796 write_any_indent (1);
797 fprintf (state_file
, " nil ");
800 if (current
->info
.nested
->convert_to
!= NULL
)
801 write_state_a_string (current
->info
.nested
->convert_to
);
804 write_any_indent (1);
805 fprintf (state_file
, " nil ");
810 state_writer::write_state_option (options_p current
)
812 begin_s_expr ("option");
814 write_any_indent (0);
815 if (current
->name
!= NULL
)
816 fprintf (state_file
, "%s ", current
->name
);
818 fprintf (state_file
, "nil ");
820 switch (current
->kind
)
823 write_state_string_option (current
);
826 write_state_type_option (current
);
829 write_state_nested_option (current
);
832 fatal ("Option tag unknown");
835 /* Terminate the "option" s-expression. */
841 /* Write a list of GTY options. */
843 state_writer::write_state_options (options_p opt
)
849 write_any_indent (0);
850 fprintf (state_file
, "nil ");
854 begin_s_expr ("options");
855 for (current
= opt
; current
!= NULL
; current
= current
->next
)
856 write_state_option (current
);
861 /* Write a bitmap representing a set of GCC front-end languages. */
863 state_writer::write_state_lang_bitmap (lang_bitmap bitmap
)
865 write_any_indent (0);
866 fprintf (state_file
, "%d ", (int) bitmap
);
869 /* Write version information. */
871 state_writer::write_state_version (const char *version
)
873 begin_s_expr ("version");
874 write_state_a_string (version
);
878 /* Write a scalar type. We have only two of these. */
880 state_writer::write_state_scalar_type (type_p current
)
882 write_any_indent (0);
883 if (current
== &scalar_nonchar
)
884 fprintf (state_file
, "scalar_nonchar ");
885 else if (current
== &scalar_char
)
886 fprintf (state_file
, "scalar_char ");
888 fatal ("Unexpected type in write_state_scalar_type");
890 write_state_common_type_content (current
);
893 /* Write the string type. There is only one such thing! */
895 state_writer::write_state_string_type (type_p current
)
897 if (current
== &string_type
)
899 write_any_indent (0);
900 fprintf (state_file
, "string ");
901 write_state_common_type_content (current
);
904 fatal ("Unexpected type in write_state_string_type");
907 /* Write an undefined type. */
909 state_writer::write_state_undefined_type (type_p current
)
911 DBGPRINTF ("undefined type @ %p #%d '%s'", (void *) current
,
912 current
->state_number
, current
->u
.s
.tag
);
913 write_any_indent (0);
914 fprintf (state_file
, "undefined ");
915 gcc_assert (current
->gc_used
== GC_UNUSED
);
916 write_state_common_type_content (current
);
917 if (current
->u
.s
.tag
!= NULL
)
918 write_state_a_string (current
->u
.s
.tag
);
921 write_any_indent (0);
922 fprintf (state_file
, "nil");
925 write_state_fileloc (type_lineloc (current
));
929 /* Common code to write structure like types. */
931 state_writer::write_state_struct_union_type (type_p current
,
934 DBGPRINTF ("%s type @ %p #%d '%s'", kindstr
, (void *) current
,
935 current
->state_number
, current
->u
.s
.tag
);
936 write_any_indent (0);
937 fprintf (state_file
, "%s ", kindstr
);
938 write_state_common_type_content (current
);
939 if (current
->u
.s
.tag
!= NULL
)
940 write_state_a_string (current
->u
.s
.tag
);
943 write_any_indent (0);
944 fprintf (state_file
, "nil");
947 write_state_fileloc (type_lineloc (current
));
948 write_state_fields (current
->u
.s
.fields
);
949 write_state_options (current
->u
.s
.opt
);
950 write_state_lang_bitmap (current
->u
.s
.bitmap
);
954 /* Write a GTY struct type. */
956 state_writer::write_state_struct_type (type_p current
)
958 write_state_struct_union_type (current
, "struct");
959 write_state_type (current
->u
.s
.lang_struct
);
960 write_state_type (current
->u
.s
.base_class
);
963 /* Write a GTY user-defined struct type. */
965 state_writer::write_state_user_struct_type (type_p current
)
967 DBGPRINTF ("user_struct type @ %p #%d '%s'", (void *) current
,
968 current
->state_number
, current
->u
.s
.tag
);
969 write_any_indent (0);
970 fprintf (state_file
, "user_struct ");
971 write_state_common_type_content (current
);
972 if (current
->u
.s
.tag
!= NULL
)
973 write_state_a_string (current
->u
.s
.tag
);
976 write_any_indent (0);
977 fprintf (state_file
, "nil");
979 write_state_fileloc (type_lineloc (current
));
980 write_state_fields (current
->u
.s
.fields
);
983 /* write a GTY union type. */
985 state_writer::write_state_union_type (type_p current
)
987 write_state_struct_union_type (current
, "union");
988 write_state_type (current
->u
.s
.lang_struct
);
991 /* Write a lang_struct type. This is tricky and was painful to debug,
992 we deal with the next field specifically within their lang_struct
993 subfield, which points to a linked list of homonumous types.
994 Change this function with extreme care, see also
995 read_state_lang_struct_type. */
997 state_writer::write_state_lang_struct_type (type_p current
)
1001 const char *homoname
= 0;
1002 write_state_struct_union_type (current
, "lang_struct");
1003 /* lang_struct-ures are particularly tricky, since their
1004 u.s.lang_struct field gives a list of homonymous struct-s or
1006 DBGPRINTF ("lang_struct @ %p #%d", (void *) current
, current
->state_number
);
1007 for (hty
= current
->u
.s
.lang_struct
; hty
!= NULL
; hty
= hty
->next
)
1010 DBGPRINTF ("homonymous #%d hty @ %p #%d '%s'", nbhomontype
,
1011 (void *) hty
, hty
->state_number
, hty
->u
.s
.tag
);
1012 /* Every member of the homonymous list should have the same tag. */
1013 gcc_assert (union_or_struct_p (hty
));
1014 gcc_assert (hty
->u
.s
.lang_struct
== current
);
1016 homoname
= hty
->u
.s
.tag
;
1017 gcc_assert (strcmp (homoname
, hty
->u
.s
.tag
) == 0);
1019 begin_s_expr ("homotypes");
1020 fprintf (state_file
, "%d", nbhomontype
);
1021 for (hty
= current
->u
.s
.lang_struct
; hty
!= NULL
; hty
= hty
->next
)
1022 write_state_type (hty
);
1026 /* Write a parametrized structure GTY type. */
1028 state_writer::write_state_param_struct_type (type_p current
)
1032 write_any_indent (0);
1033 fprintf (state_file
, "param_struct ");
1034 write_state_common_type_content (current
);
1035 write_state_type (current
->u
.param_struct
.stru
);
1036 for (i
= 0; i
< NUM_PARAM
; i
++)
1038 if (current
->u
.param_struct
.param
[i
] != NULL
)
1039 write_state_type (current
->u
.param_struct
.param
[i
]);
1042 write_any_indent (0);
1043 fprintf (state_file
, "nil ");
1046 write_state_fileloc (¤t
->u
.param_struct
.line
);
1049 /* Write a pointer type. */
1051 state_writer::write_state_pointer_type (type_p current
)
1053 write_any_indent (0);
1054 fprintf (state_file
, "pointer ");
1055 write_state_common_type_content (current
);
1056 write_state_type (current
->u
.p
);
1059 /* Write an array type. */
1061 state_writer::write_state_array_type (type_p current
)
1063 write_any_indent (0);
1064 fprintf (state_file
, "array ");
1065 write_state_common_type_content (current
);
1066 if (current
->u
.a
.len
!= NULL
)
1067 write_state_a_string (current
->u
.a
.len
);
1070 write_any_indent (1);
1071 fprintf (state_file
, " nil");
1074 write_any_indent (1);
1075 fprintf (state_file
, " ");
1076 write_state_type (current
->u
.a
.p
);
1079 /* Write the gc_used information. */
1081 state_writer::write_state_gc_used (enum gc_used_enum gus
)
1083 write_any_indent (1);
1087 fprintf (state_file
, " gc_unused");
1090 fprintf (state_file
, " gc_used");
1092 case GC_MAYBE_POINTED_TO
:
1093 fprintf (state_file
, " gc_maybe_pointed_to");
1096 fprintf (state_file
, " gc_pointed_to");
1103 /* Utility routine to write the common content of all types. Notice
1104 that the next field is *not* written on purpose. */
1106 state_writer::write_state_common_type_content (type_p current
)
1108 write_any_indent (0);
1109 fprintf (state_file
, "%d ", current
->state_number
);
1110 /* We do not write the next type, because list of types are
1111 explicitly written. However, lang_struct are special in that
1112 respect. See function write_state_lang_struct_type for more. */
1113 write_state_type (current
->pointer_to
);
1114 write_state_gc_used (current
->gc_used
);
1118 /* The important and recursive routine writing GTY types as understood
1119 by gengtype. Types which have a positive state_number have already
1120 been seen and written. */
1122 state_writer::write_state_type (type_p current
)
1124 write_any_indent (0);
1125 if (current
== NULL
)
1127 fprintf (state_file
, "nil ");
1131 begin_s_expr ("type");
1133 if (current
->state_number
> 0)
1135 write_any_indent (0);
1136 fprintf (state_file
, "already_seen %d", current
->state_number
);
1140 m_state_written_type_count
++;
1141 DBGPRINTF ("writing type #%d @%p old number %d", m_state_written_type_count
,
1142 (void *) current
, current
->state_number
);
1143 current
->state_number
= m_state_written_type_count
;
1144 switch (current
->kind
)
1148 case TYPE_UNDEFINED
:
1149 write_state_undefined_type (current
);
1152 write_state_struct_type (current
);
1154 case TYPE_USER_STRUCT
:
1155 write_state_user_struct_type (current
);
1158 write_state_union_type (current
);
1161 write_state_pointer_type (current
);
1164 write_state_array_type (current
);
1166 case TYPE_LANG_STRUCT
:
1167 write_state_lang_struct_type (current
);
1169 case TYPE_PARAM_STRUCT
:
1170 write_state_param_struct_type (current
);
1173 write_state_scalar_type (current
);
1176 write_state_string_type (current
);
1181 /* Terminate the "type" s-expression. */
1188 state_writer::write_state_pair (pair_p current
)
1190 if (current
== NULL
)
1192 write_any_indent (0);
1193 fprintf (state_file
, "nil)");
1197 begin_s_expr ("pair");
1199 if (current
->name
!= NULL
)
1200 write_state_a_string (current
->name
);
1202 write_state_a_string ("nil");
1204 write_state_type (current
->type
);
1205 write_state_fileloc (&(current
->line
));
1206 write_state_options (current
->opt
);
1208 /* Terminate the "pair" s-expression. */
1212 /* Write a pair list and return the number of pairs written. */
1214 state_writer::write_state_pair_list (pair_p list
)
1219 for (current
= list
; current
!= NULL
; current
= current
->next
)
1221 write_state_pair (current
);
1228 /* When writing imported linked lists, like typedefs, structures,
1229 param_structs, ... we count their length first and write it. These
1230 eases the reading, and enables an extra verification on the number
1231 of actually read items. */
1233 /* Write our typedefs. */
1235 state_writer::write_state_typedefs (void)
1237 int nbtypedefs
= pair_list_length (typedefs
);
1239 begin_s_expr ("typedefs");
1240 fprintf (state_file
, "%d", nbtypedefs
);
1241 nbpairs
= write_state_pair_list (typedefs
);
1242 gcc_assert (nbpairs
== nbtypedefs
);
1244 if (verbosity_level
>= 2)
1245 printf ("%s wrote %d typedefs\n", progname
, nbtypedefs
);
1248 /* Write our structures. */
1250 state_writer::write_state_structures (void)
1255 for (current
= structures
; current
!= NULL
; current
= current
->next
)
1258 begin_s_expr ("structures");
1259 fprintf (state_file
, "%d", nbstruct
);
1261 for (current
= structures
; current
!= NULL
; current
= current
->next
)
1264 write_state_type (current
);
1267 /* Terminate the "structures" s-expression. */
1269 if (verbosity_level
>= 2)
1270 printf ("%s wrote %d structures in state\n", progname
, nbstruct
);
1273 /* Write our param_struct-s. */
1275 state_writer::write_state_param_structs (void)
1277 int nbparamstruct
= 0;
1280 for (current
= param_structs
; current
!= NULL
; current
= current
->next
)
1283 begin_s_expr ("param_structs");
1284 fprintf (state_file
, "%d", nbparamstruct
);
1286 for (current
= param_structs
; current
!= NULL
; current
= current
->next
)
1287 write_state_type (current
);
1292 /* Write our variables. */
1294 state_writer::write_state_variables (void)
1296 int nbvars
= pair_list_length (variables
);
1298 begin_s_expr ("variables");
1299 fprintf (state_file
, "%d", nbvars
);
1300 nbpairs
= write_state_pair_list (variables
);
1301 gcc_assert (nbpairs
== nbvars
);
1303 if (verbosity_level
>= 2)
1304 printf ("%s wrote %d variables.\n", progname
, nbvars
);
1307 /* Write the source directory. File locations within the source
1308 directory have been written specifically. */
1310 state_writer::write_state_srcdir (void)
1312 begin_s_expr ("srcdir");
1313 write_state_a_string (srcdir
);
1317 /* Count and write the list of our files. */
1319 state_writer::write_state_files_list (void)
1322 /* Write the list of files with their lang_bitmap. */
1323 begin_s_expr ("fileslist");
1324 fprintf (state_file
, "%d", (int) num_gt_files
);
1325 for (i
= 0; i
< (int) num_gt_files
; i
++)
1327 const char *cursrcrelpath
= NULL
;
1328 const input_file
*curfil
= gt_files
[i
];
1329 /* Most of the files are inside $(srcdir) so it is worth to
1330 handle them specially. */
1331 cursrcrelpath
= get_file_srcdir_relative_path (curfil
);
1334 begin_s_expr ("srcfile");
1335 fprintf (state_file
, "%d ", get_lang_bitmap (curfil
));
1336 write_state_a_string (cursrcrelpath
);
1340 begin_s_expr ("file");
1341 fprintf (state_file
, "%d ", get_lang_bitmap (curfil
));
1342 write_state_a_string (get_input_file_name (curfil
));
1344 /* Terminate the inner s-expression (either "srcfile" or "file"). */
1347 /* Terminate the "fileslist" s-expression. */
1351 /* Write the list of GCC front-end languages. */
1353 state_writer::write_state_languages (void)
1356 begin_s_expr ("languages");
1357 fprintf (state_file
, "%d", (int) num_lang_dirs
);
1358 for (i
= 0; i
< (int) num_lang_dirs
; i
++)
1360 /* Languages names are identifiers, we expect only letters or
1361 underscores or digits in them. In particular, C++ is not a
1362 valid language name, but cp is valid. */
1363 fprintf (state_file
, " %s", lang_dir_names
[i
]);
1368 /* Write the trailer. */
1370 write_state_trailer (void)
1372 /* This test should probably catch IO errors like disk full... */
1373 if (fputs ("\n(!endfile)\n", state_file
) == EOF
)
1374 fatal ("failed to write state trailer [%s]", xstrerror (errno
));
1377 /* The write_state routine is the only writing routine called by main
1378 in gengtype.c. To avoid messing the state if gengtype is
1379 interrupted or aborted, we write a temporary file and rename it
1380 after having written it in totality. */
1382 write_state (const char *state_path
)
1386 char *temp_state_path
= NULL
;
1387 char tempsuffix
[40];
1390 /* We write a unique temporary file which is renamed when complete
1391 * only. So even if gengtype is interrupted, the written state file
1392 * won't be partially written, since the temporary file is not yet
1393 * renamed in that case. */
1394 memset (tempsuffix
, 0, sizeof (tempsuffix
));
1395 snprintf (tempsuffix
, sizeof (tempsuffix
) - 1, "-%ld-%d.tmp", (long) now
,
1397 temp_state_path
= concat (state_path
, tempsuffix
, NULL
);
1398 state_file
= fopen (temp_state_path
, "w");
1399 if (state_file
== NULL
)
1400 fatal ("Failed to open file %s for writing state: %s",
1401 temp_state_path
, xstrerror (errno
));
1402 if (verbosity_level
>= 3)
1403 printf ("%s writing state file %s temporarily in %s\n",
1404 progname
, state_path
, temp_state_path
);
1405 /* This is the first line of the state. Perhaps the file utility
1406 could know about that, so don't change it often. */
1407 fprintf (state_file
, ";;;;@@@@ GCC gengtype state\n");
1408 /* Output a few comments for humans. */
1409 fprintf (state_file
,
1410 ";;; DON'T EDIT THIS FILE, since generated by GCC's gengtype\n");
1411 fprintf (state_file
,
1412 ";;; The format of this file is tied to a particular version of GCC.\n");
1413 fprintf (state_file
,
1414 ";;; Don't parse this file wihout knowing GCC gengtype internals.\n");
1415 fprintf (state_file
,
1416 ";;; This file should be parsed by the same %s which wrote it.\n",
1421 /* The first non-comment significant line gives the version string. */
1422 sw
.write_state_version (version_string
);
1423 sw
.write_state_srcdir ();
1424 sw
.write_state_languages ();
1425 sw
.write_state_files_list ();
1426 sw
.write_state_structures ();
1427 sw
.write_state_typedefs ();
1428 sw
.write_state_param_structs ();
1429 sw
.write_state_variables ();
1430 write_state_trailer ();
1431 statelen
= ftell (state_file
);
1432 if (ferror (state_file
))
1433 fatal ("output error when writing state file %s [%s]",
1434 temp_state_path
, xstrerror (errno
));
1435 if (fclose (state_file
))
1436 fatal ("failed to close state file %s [%s]",
1437 temp_state_path
, xstrerror (errno
));
1438 if (rename (temp_state_path
, state_path
))
1439 fatal ("failed to rename %s to state file %s [%s]", temp_state_path
,
1440 state_path
, xstrerror (errno
));
1441 free (temp_state_path
);
1443 if (verbosity_level
>= 1)
1444 printf ("%s wrote state file %s of %ld bytes with %d GTY-ed types\n",
1445 progname
, state_path
, statelen
, sw
.m_state_written_type_count
);
1449 /** End of writing routines! The corresponding reading routines follow. **/
1453 /* Forward declarations, since some read_state_* functions are
1455 static void read_state_fileloc (struct fileloc
*line
);
1456 static void read_state_options (options_p
*opt
);
1457 static void read_state_type (type_p
*current
);
1458 static void read_state_pair (pair_p
*pair
);
1459 /* Return the number of pairs actually read. */
1460 static int read_state_pair_list (pair_p
*list
);
1461 static void read_state_fields (pair_p
*fields
);
1462 static void read_state_common_type_content (type_p current
);
1467 /* Record into the state_seen_types hash-table a type which we are
1468 reading, to enable recursive or circular references to it. */
1470 record_type (type_p type
)
1474 slot
= htab_find_slot (state_seen_types
, type
, INSERT
);
1480 /* Read an already seen type. */
1482 read_state_already_seen_type (type_p
*type
)
1484 struct state_token_st
*t0
= peek_state_token (0);
1486 if (state_token_kind (t0
) == STOK_INTEGER
)
1489 struct type loctype
= { TYPE_SCALAR
, 0, 0, 0, GC_UNUSED
, {0} };
1491 loctype
.state_number
= t0
->stok_un
.stok_num
;
1492 slot
= htab_find_slot (state_seen_types
, &loctype
, NO_INSERT
);
1495 fatal_reading_state (t0
, "Unknown type");
1498 next_state_tokens (1);
1499 *type
= (type_p
) *slot
;
1503 fatal_reading_state (t0
, "Bad seen type");
1508 /* Read the scalar_nonchar type. */
1510 read_state_scalar_nonchar_type (type_p
*type
)
1512 *type
= &scalar_nonchar
;
1513 read_state_common_type_content (*type
);
1517 /* Read the scalar_char type. */
1519 read_state_scalar_char_type (type_p
*type
)
1521 *type
= &scalar_char
;
1522 read_state_common_type_content (*type
);
1525 /* Read the string_type. */
1527 read_state_string_type (type_p
*type
)
1529 *type
= &string_type
;
1530 read_state_common_type_content (*type
);
1534 /* Read a lang_bitmap representing a set of GCC front-end languages. */
1536 read_state_lang_bitmap (lang_bitmap
*bitmap
)
1538 struct state_token_st
*t
;
1540 t
= peek_state_token (0);
1541 if (state_token_kind (t
) == STOK_INTEGER
)
1543 *bitmap
= t
->stok_un
.stok_num
;
1544 next_state_tokens (1);
1548 fatal_reading_state (t
, "Bad syntax for bitmap");
1553 /* Read an undefined type. */
1555 read_state_undefined_type (type_p type
)
1557 struct state_token_st
*t0
;
1559 type
->kind
= TYPE_UNDEFINED
;
1560 read_state_common_type_content (type
);
1561 t0
= peek_state_token (0);
1562 if (state_token_kind (t0
) == STOK_STRING
)
1564 if (state_token_is_name (t0
, "nil"))
1566 type
->u
.s
.tag
= NULL
;
1567 DBGPRINTF ("read anonymous undefined type @%p #%d",
1568 (void *) type
, type
->state_number
);
1572 type
->u
.s
.tag
= xstrdup (t0
->stok_un
.stok_string
);
1573 DBGPRINTF ("read undefined type @%p #%d '%s'",
1574 (void *) type
, type
->state_number
, type
->u
.s
.tag
);
1577 next_state_tokens (1);
1578 read_state_fileloc (&(type
->u
.s
.line
));
1582 fatal_reading_state (t0
, "Bad tag in undefined type");
1587 /* Read a GTY-ed struct type. */
1589 read_state_struct_type (type_p type
)
1591 struct state_token_st
*t0
;
1593 type
->kind
= TYPE_STRUCT
;
1594 read_state_common_type_content (type
);
1595 t0
= peek_state_token (0);
1596 if (state_token_kind (t0
) == STOK_STRING
)
1598 if (state_token_is_name (t0
, "nil"))
1600 type
->u
.s
.tag
= NULL
;
1601 DBGPRINTF ("read anonymous struct type @%p #%d",
1602 (void *) type
, type
->state_number
);
1606 type
->u
.s
.tag
= xstrdup (t0
->stok_un
.stok_string
);
1607 DBGPRINTF ("read struct type @%p #%d '%s'",
1608 (void *) type
, type
->state_number
, type
->u
.s
.tag
);
1611 next_state_tokens (1);
1612 read_state_fileloc (&(type
->u
.s
.line
));
1613 read_state_fields (&(type
->u
.s
.fields
));
1614 read_state_options (&(type
->u
.s
.opt
));
1615 read_state_lang_bitmap (&(type
->u
.s
.bitmap
));
1616 read_state_type (&(type
->u
.s
.lang_struct
));
1617 read_state_type (&(type
->u
.s
.base_class
));
1621 fatal_reading_state (t0
, "Bad tag in struct type");
1626 /* Read a GTY-ed user-provided struct TYPE. */
1629 read_state_user_struct_type (type_p type
)
1631 struct state_token_st
*t0
;
1633 type
->kind
= TYPE_USER_STRUCT
;
1634 read_state_common_type_content (type
);
1635 t0
= peek_state_token (0);
1636 if (state_token_kind (t0
) == STOK_STRING
)
1638 if (state_token_is_name (t0
, "nil"))
1640 type
->u
.s
.tag
= NULL
;
1641 DBGPRINTF ("read anonymous struct type @%p #%d",
1642 (void *) type
, type
->state_number
);
1646 type
->u
.s
.tag
= xstrdup (t0
->stok_un
.stok_string
);
1647 DBGPRINTF ("read struct type @%p #%d '%s'",
1648 (void *) type
, type
->state_number
, type
->u
.s
.tag
);
1651 next_state_tokens (1);
1652 read_state_fileloc (&(type
->u
.s
.line
));
1653 read_state_fields (&(type
->u
.s
.fields
));
1657 fatal_reading_state (t0
, "Bad tag in user-struct type");
1662 /* Read a GTY-ed union type. */
1664 read_state_union_type (type_p type
)
1666 struct state_token_st
*t0
;
1668 type
->kind
= TYPE_UNION
;
1669 read_state_common_type_content (type
);
1670 t0
= peek_state_token (0);
1671 if (state_token_kind (t0
) == STOK_STRING
)
1673 if (state_token_is_name (t0
, "nil"))
1675 type
->u
.s
.tag
= NULL
;
1676 DBGPRINTF ("read anonymous union type @%p #%d",
1677 (void *) type
, type
->state_number
);
1681 type
->u
.s
.tag
= xstrdup (t0
->stok_un
.stok_string
);
1682 DBGPRINTF ("read union type @%p #%d '%s'",
1683 (void *) type
, type
->state_number
, type
->u
.s
.tag
);
1685 next_state_tokens (1);
1686 read_state_fileloc (&(type
->u
.s
.line
));
1687 read_state_fields (&(type
->u
.s
.fields
));
1688 read_state_options (&(type
->u
.s
.opt
));
1689 read_state_lang_bitmap (&(type
->u
.s
.bitmap
));
1690 read_state_type (&(type
->u
.s
.lang_struct
));
1693 fatal_reading_state (t0
, "Bad tag in union type");
1697 /* Read a GTY-ed pointer type. */
1699 read_state_pointer_type (type_p type
)
1701 type
->kind
= TYPE_POINTER
;
1702 read_state_common_type_content (type
);
1703 DBGPRINTF ("read pointer type @%p #%d", (void *) type
, type
->state_number
);
1704 read_state_type (&(type
->u
.p
));
1708 /* Read a GTY-ed array type. */
1710 read_state_array_type (type_p type
)
1712 struct state_token_st
*t0
;
1714 type
->kind
= TYPE_ARRAY
;
1715 read_state_common_type_content (type
);
1716 t0
= peek_state_token (0);
1717 if (state_token_kind (t0
) == STOK_STRING
)
1719 type
->u
.a
.len
= xstrdup (t0
->stok_un
.stok_string
);
1720 DBGPRINTF ("read array type @%p #%d length '%s'",
1721 (void *) type
, type
->state_number
, type
->u
.a
.len
);
1722 next_state_tokens (1);
1725 else if (state_token_is_name (t0
, "nil"))
1727 type
->u
.a
.len
= NULL
;
1728 DBGPRINTF ("read array type @%p #%d without length",
1729 (void *) type
, type
->state_number
);
1730 next_state_tokens (1);
1734 fatal_reading_state (t0
, "Bad array name type");
1735 read_state_type (&(type
->u
.a
.p
));
1740 /* Read a lang_struct type for GTY-ed struct-s which depends upon GCC
1741 front-end languages. This is a tricky function and it was painful
1742 to debug. Change it with extreme care. See also
1743 write_state_lang_struct_type. */
1745 read_state_lang_struct_type (type_p type
)
1747 struct state_token_st
*t0
= NULL
;
1748 struct state_token_st
*t1
= NULL
;
1749 struct state_token_st
*t2
= NULL
;
1751 type
->kind
= TYPE_LANG_STRUCT
;
1752 read_state_common_type_content (type
);
1753 t0
= peek_state_token (0);
1754 if (state_token_kind (t0
) == STOK_STRING
)
1756 if (state_token_is_name (t0
, "nil"))
1758 DBGPRINTF ("read anonymous lang_struct type @%p #%d",
1759 (void *) type
, type
->state_number
);
1760 type
->u
.s
.tag
= NULL
;
1764 type
->u
.s
.tag
= xstrdup (t0
->stok_un
.stok_string
);
1765 DBGPRINTF ("read lang_struct type @%p #%d '%s'",
1766 (void *) type
, type
->state_number
, type
->u
.s
.tag
);
1768 next_state_tokens (1);
1771 fatal_reading_state (t0
, "Bad tag in lang struct type");
1772 read_state_fileloc (&(type
->u
.s
.line
));
1773 read_state_fields (&(type
->u
.s
.fields
));
1774 read_state_options (&(type
->u
.s
.opt
));
1775 read_state_lang_bitmap (&(type
->u
.s
.bitmap
));
1776 /* Within lang_struct-ures, the lang_struct field is a linked list
1777 of homonymous types! */
1778 t0
= peek_state_token (0);
1779 t1
= peek_state_token (1);
1780 t2
= peek_state_token (2);
1781 /* Parse (!homotypes <number-types> <type-1> .... <type-n>) */
1782 if (state_token_kind (t0
) == STOK_LEFTPAR
1783 && state_token_is_name (t1
, "!homotypes")
1784 && state_token_kind (t2
) == STOK_INTEGER
)
1786 type_p
*prevty
= &type
->u
.s
.lang_struct
;
1787 int nbhomotype
= t2
->stok_un
.stok_num
;
1789 t0
= t1
= t2
= NULL
;
1790 next_state_tokens (3);
1791 for (i
= 0; i
< nbhomotype
; i
++)
1793 read_state_type (prevty
);
1794 t0
= peek_state_token (0);
1796 prevty
= &(*prevty
)->next
;
1798 fatal_reading_state (t0
,
1799 "expecting type in homotype list for lang_struct");
1801 if (state_token_kind (t0
) != STOK_RIGHTPAR
)
1802 fatal_reading_state (t0
,
1803 "expecting ) in homotype list for lang_struct");
1804 next_state_tokens (1);
1807 fatal_reading_state (t0
, "expecting !homotypes for lang_struct");
1811 /* Read a param_struct type for GTY parametrized structures. */
1813 read_state_param_struct_type (type_p type
)
1816 struct state_token_st
*t0
;
1818 type
->kind
= TYPE_PARAM_STRUCT
;
1819 read_state_common_type_content (type
);
1820 DBGPRINTF ("read param_struct type @%p #%d",
1821 (void *) type
, type
->state_number
);
1822 read_state_type (&(type
->u
.param_struct
.stru
));
1824 for (i
= 0; i
< NUM_PARAM
; i
++)
1826 t0
= peek_state_token (0);
1827 if (state_token_is_name (t0
, "nil"))
1829 type
->u
.param_struct
.param
[i
] = NULL
;
1830 next_state_tokens (1);
1833 read_state_type (&(type
->u
.param_struct
.param
[i
]));
1835 read_state_fileloc (&(type
->u
.param_struct
.line
));
1839 /* Read the gc used information. */
1841 read_state_gc_used (enum gc_used_enum
*pgus
)
1843 struct state_token_st
*t0
= peek_state_token (0);
1844 if (state_token_is_name (t0
, "gc_unused"))
1846 else if (state_token_is_name (t0
, "gc_used"))
1848 else if (state_token_is_name (t0
, "gc_maybe_pointed_to"))
1849 *pgus
= GC_MAYBE_POINTED_TO
;
1850 else if (state_token_is_name (t0
, "gc_pointed_to"))
1851 *pgus
= GC_POINTED_TO
;
1853 fatal_reading_state (t0
, "invalid gc_used information");
1854 next_state_tokens (1);
1858 /* Utility function to read the common content of types. */
1860 read_state_common_type_content (type_p current
)
1862 struct state_token_st
*t0
= peek_state_token (0);
1864 if (state_token_kind (t0
) == STOK_INTEGER
)
1866 current
->state_number
= t0
->stok_un
.stok_num
;
1867 next_state_tokens (1);
1868 record_type (current
);
1871 fatal_reading_state_printf (t0
,
1872 "Expected integer for state_number line %d",
1874 /* We don't read the next field of the type. */
1875 read_state_type (¤t
->pointer_to
);
1876 read_state_gc_used (¤t
->gc_used
);
1880 /* Read a GTY-ed type. */
1882 read_state_type (type_p
*current
)
1884 struct state_token_st
*t0
= peek_state_token (0);
1885 struct state_token_st
*t1
= peek_state_token (1);
1887 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
1888 state_token_is_name (t1
, "!type"))
1890 next_state_tokens (2);
1891 t0
= peek_state_token (0);
1892 if (state_token_is_name (t0
, "already_seen"))
1894 next_state_tokens (1);
1895 read_state_already_seen_type (current
);
1899 t0
= peek_state_token (0);
1901 if (state_token_is_name (t0
, "scalar_nonchar"))
1903 next_state_tokens (1);
1904 read_state_scalar_nonchar_type (current
);
1906 else if (state_token_is_name (t0
, "scalar_char"))
1908 next_state_tokens (1);
1909 read_state_scalar_char_type (current
);
1911 else if (state_token_is_name (t0
, "string"))
1913 next_state_tokens (1);
1914 read_state_string_type (current
);
1916 else if (state_token_is_name (t0
, "undefined"))
1918 *current
= XCNEW (struct type
);
1919 next_state_tokens (1);
1920 read_state_undefined_type (*current
);
1922 else if (state_token_is_name (t0
, "struct"))
1924 *current
= XCNEW (struct type
);
1925 next_state_tokens (1);
1926 read_state_struct_type (*current
);
1928 else if (state_token_is_name (t0
, "union"))
1930 *current
= XCNEW (struct type
);
1931 next_state_tokens (1);
1932 read_state_union_type (*current
);
1934 else if (state_token_is_name (t0
, "lang_struct"))
1936 *current
= XCNEW (struct type
);
1937 next_state_tokens (1);
1938 read_state_lang_struct_type (*current
);
1940 else if (state_token_is_name (t0
, "param_struct"))
1942 *current
= XCNEW (struct type
);
1943 next_state_tokens (1);
1944 read_state_param_struct_type (*current
);
1946 else if (state_token_is_name (t0
, "pointer"))
1948 *current
= XCNEW (struct type
);
1949 next_state_tokens (1);
1950 read_state_pointer_type (*current
);
1952 else if (state_token_is_name (t0
, "array"))
1954 *current
= XCNEW (struct type
);
1955 next_state_tokens (1);
1956 read_state_array_type (*current
);
1958 else if (state_token_is_name (t0
, "user_struct"))
1960 *current
= XCNEW (struct type
);
1961 next_state_tokens (1);
1962 read_state_user_struct_type (*current
);
1965 fatal_reading_state (t0
, "bad type in (!type");
1967 t0
= peek_state_token (0);
1968 if (state_token_kind (t0
) != STOK_RIGHTPAR
)
1969 fatal_reading_state (t0
, "missing ) in type");
1970 next_state_tokens (1);
1972 else if (state_token_is_name (t0
, "nil"))
1974 next_state_tokens (1);
1978 fatal_reading_state (t0
, "bad type syntax");
1982 /* Read a file location. Files within the source directory are dealt
1983 with specifically. */
1985 read_state_fileloc (struct fileloc
*floc
)
1987 bool issrcfile
= false;
1988 struct state_token_st
*t0
= peek_state_token (0);
1989 struct state_token_st
*t1
= peek_state_token (1);
1991 gcc_assert (floc
!= NULL
);
1992 gcc_assert (srcdir
!= NULL
);
1994 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
1995 (state_token_is_name (t1
, "!fileloc")
1996 || (issrcfile
= state_token_is_name (t1
, "!srcfileloc"))))
1998 next_state_tokens (2);
1999 t0
= peek_state_token (0);
2000 t1
= peek_state_token (1);
2001 if (state_token_kind (t0
) == STOK_STRING
&&
2002 state_token_kind (t1
) == STOK_INTEGER
)
2004 char *path
= t0
->stok_un
.stok_string
;
2007 static const char dirsepstr
[2] = { DIR_SEPARATOR
, (char) 0 };
2008 char *fullpath
= concat (srcdir
, dirsepstr
, path
, NULL
);
2009 floc
->file
= input_file_by_name (fullpath
);
2013 floc
->file
= input_file_by_name (path
);
2014 floc
->line
= t1
->stok_un
.stok_num
;
2015 next_state_tokens (2);
2018 fatal_reading_state (t0
,
2019 "Bad fileloc syntax, expected path string and line");
2020 t0
= peek_state_token (0);
2021 if (state_token_kind (t0
) != STOK_RIGHTPAR
)
2022 fatal_reading_state (t0
, "Bad fileloc syntax, expected )");
2023 next_state_tokens (1);
2025 else if (state_token_is_name (t0
, "nil"))
2027 next_state_tokens (1);
2032 fatal_reading_state (t0
, "Bad fileloc syntax");
2036 /* Read the fields of a GTY-ed type. */
2038 read_state_fields (pair_p
*fields
)
2041 struct state_token_st
*t0
= peek_state_token (0);
2042 struct state_token_st
*t1
= peek_state_token (1);
2043 struct state_token_st
*t2
= peek_state_token (2);
2045 if (state_token_kind (t0
) == STOK_LEFTPAR
2046 && state_token_is_name (t1
, "!fields")
2047 && state_token_kind (t2
) == STOK_INTEGER
)
2049 int nbfields
= t2
->stok_un
.stok_num
;
2051 next_state_tokens (3);
2052 nbpairs
= read_state_pair_list (&tmp
);
2053 t0
= peek_state_token (0);
2054 if (nbpairs
!= nbfields
)
2055 fatal_reading_state_printf
2057 "Mismatched fields number, expected %d got %d", nbpairs
, nbfields
);
2058 if (state_token_kind (t0
) == STOK_RIGHTPAR
)
2059 next_state_tokens (1);
2061 fatal_reading_state (t0
, "Bad fields expecting )");
2068 /* Read a string option. */
2070 read_state_string_option (options_p opt
)
2072 struct state_token_st
*t0
= peek_state_token (0);
2073 opt
->kind
= OPTION_STRING
;
2074 if (state_token_kind (t0
) == STOK_STRING
)
2076 opt
->info
.string
= xstrdup (t0
->stok_un
.stok_string
);
2077 next_state_tokens (1);
2079 else if (state_token_is_name (t0
, "nil"))
2081 opt
->info
.string
= NULL
;
2082 next_state_tokens (1);
2085 fatal_reading_state (t0
, "Missing name in string option");
2089 /* Read a type option. */
2091 read_state_type_option (options_p opt
)
2093 opt
->kind
= OPTION_TYPE
;
2094 read_state_type (&(opt
->info
.type
));
2098 /* Read a nested option. */
2100 read_state_nested_option (options_p opt
)
2102 struct state_token_st
*t0
;
2104 opt
->info
.nested
= XCNEW (struct nested_ptr_data
);
2105 opt
->kind
= OPTION_NESTED
;
2106 read_state_type (&(opt
->info
.nested
->type
));
2107 t0
= peek_state_token (0);
2108 if (state_token_kind (t0
) == STOK_STRING
)
2110 opt
->info
.nested
->convert_from
= xstrdup (t0
->stok_un
.stok_string
);
2111 next_state_tokens (1);
2113 else if (state_token_is_name (t0
, "nil"))
2115 opt
->info
.nested
->convert_from
= NULL
;
2116 next_state_tokens (1);
2119 fatal_reading_state (t0
, "Bad nested convert_from option");
2121 t0
= peek_state_token (0);
2122 if (state_token_kind (t0
) == STOK_STRING
)
2124 opt
->info
.nested
->convert_to
= xstrdup (t0
->stok_un
.stok_string
);
2125 next_state_tokens (1);
2127 else if (state_token_is_name (t0
, "nil"))
2129 opt
->info
.nested
->convert_to
= NULL
;
2130 next_state_tokens (1);
2133 fatal_reading_state (t0
, "Bad nested convert_from option");
2137 /* Read an GTY option. */
2139 read_state_option (options_p
*opt
)
2141 struct state_token_st
*t0
= peek_state_token (0);
2142 struct state_token_st
*t1
= peek_state_token (1);
2144 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
2145 state_token_is_name (t1
, "!option"))
2147 next_state_tokens (2);
2148 t0
= peek_state_token (0);
2149 if (state_token_kind (t0
) == STOK_NAME
)
2151 *opt
= XCNEW (struct options
);
2152 if (state_token_is_name (t0
, "nil"))
2153 (*opt
)->name
= NULL
;
2155 (*opt
)->name
= t0
->stok_un
.stok_ident
->stid_name
;
2156 next_state_tokens (1);
2157 t0
= peek_state_token (0);
2158 if (state_token_kind (t0
) == STOK_NAME
)
2160 if (state_token_is_name (t0
, "string"))
2162 next_state_tokens (1);
2163 read_state_string_option (*opt
);
2165 else if (state_token_is_name (t0
, "type"))
2167 next_state_tokens (1);
2168 read_state_type_option (*opt
);
2170 else if (state_token_is_name (t0
, "nested"))
2172 next_state_tokens (1);
2173 read_state_nested_option (*opt
);
2176 fatal_reading_state (t0
, "Bad option type");
2177 t0
= peek_state_token (0);
2178 if (state_token_kind (t0
) != STOK_RIGHTPAR
)
2179 fatal_reading_state (t0
, "Bad syntax in option, expecting )");
2181 next_state_tokens (1);
2184 fatal_reading_state (t0
, "Missing option type");
2187 fatal_reading_state (t0
, "Bad name for option");
2190 fatal_reading_state (t0
, "Bad option, waiting for )");
2193 /* Read a list of options. */
2195 read_state_options (options_p
*opt
)
2197 options_p head
= NULL
;
2198 options_p previous
= NULL
;
2199 options_p current_option
= NULL
;
2200 struct state_token_st
*t0
= peek_state_token (0);
2201 struct state_token_st
*t1
= peek_state_token (1);
2203 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
2204 state_token_is_name (t1
, "!options"))
2206 next_state_tokens (2);
2207 t0
= peek_state_token (0);
2208 while (state_token_kind (t0
) != STOK_RIGHTPAR
)
2210 read_state_option (¤t_option
);
2213 head
= current_option
;
2218 previous
->next
= current_option
;
2219 previous
= current_option
;
2221 t0
= peek_state_token (0);
2223 next_state_tokens (1);
2225 else if (state_token_is_name (t0
, "nil"))
2227 next_state_tokens (1);
2230 fatal_reading_state (t0
, "Bad options syntax");
2236 /* Read a version, and check against the version of the gengtype. */
2238 read_state_version (const char *version_string
)
2240 struct state_token_st
*t0
= peek_state_token (0);
2241 struct state_token_st
*t1
= peek_state_token (1);
2243 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
2244 state_token_is_name (t1
, "!version"))
2246 next_state_tokens (2);
2247 t0
= peek_state_token (0);
2248 t1
= peek_state_token (1);
2249 if (state_token_kind (t0
) == STOK_STRING
&&
2250 state_token_kind (t1
) == STOK_RIGHTPAR
)
2252 /* Check that the read version string is the same as current
2254 if (strcmp (version_string
, t0
->stok_un
.stok_string
))
2255 fatal_reading_state_printf (t0
,
2256 "version string mismatch; expecting %s but got %s",
2258 t0
->stok_un
.stok_string
);
2259 next_state_tokens (2);
2262 fatal_reading_state (t0
, "Missing version or right parenthesis");
2265 fatal_reading_state (t0
, "Bad version syntax");
2271 read_state_pair (pair_p
*current
)
2273 struct state_token_st
*t0
= peek_state_token (0);
2274 struct state_token_st
*t1
= peek_state_token (1);
2275 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
2276 state_token_is_name (t1
, "!pair"))
2278 *current
= XCNEW (struct pair
);
2279 next_state_tokens (2);
2280 t0
= peek_state_token (0);
2281 if (state_token_kind (t0
) == STOK_STRING
)
2283 if (strcmp (t0
->stok_un
.stok_string
, "nil") == 0)
2285 (*current
)->name
= NULL
;
2289 (*current
)->name
= xstrdup (t0
->stok_un
.stok_string
);
2291 next_state_tokens (1);
2292 read_state_type (&((*current
)->type
));
2293 read_state_fileloc (&((*current
)->line
));
2294 read_state_options (&((*current
)->opt
));;
2295 t0
= peek_state_token (0);
2296 if (state_token_kind (t0
) == STOK_RIGHTPAR
)
2298 next_state_tokens (1);
2302 fatal_reading_state (t0
, "Bad syntax for pair, )");
2307 fatal_reading_state (t0
, "Bad name for pair");
2310 else if (state_token_kind (t0
) == STOK_NAME
&&
2311 state_token_is_name (t0
, "nil"))
2313 next_state_tokens (1);
2317 fatal_reading_state_printf (t0
, "Bad syntax for pair, (!pair %d",
2318 state_token
->stok_kind
);
2322 /* Return the number of pairs actually read. */
2324 read_state_pair_list (pair_p
*list
)
2328 pair_p previous
= NULL
;
2330 struct state_token_st
*t0
= peek_state_token (0);
2331 while (t0
&& state_token_kind (t0
) != STOK_RIGHTPAR
)
2333 read_state_pair (&tmp
);
2341 previous
->next
= tmp
;
2344 t0
= peek_state_token (0);
2348 /* don't consume the ); the caller will eat it. */
2353 /* Read the typedefs. */
2355 read_state_typedefs (pair_p
*typedefs
)
2359 struct state_token_st
*t0
= peek_state_token (0);
2360 struct state_token_st
*t1
= peek_state_token (1);
2361 struct state_token_st
*t2
= peek_state_token (2);
2363 if (state_token_kind (t0
) == STOK_LEFTPAR
2364 && state_token_is_name (t1
, "!typedefs")
2365 && state_token_kind (t2
) == STOK_INTEGER
)
2368 nbtypedefs
= t2
->stok_un
.stok_num
;
2369 next_state_tokens (3);
2370 nbpairs
= read_state_pair_list (&list
);
2371 t0
= peek_state_token (0);
2372 if (nbpairs
!= nbtypedefs
)
2373 fatal_reading_state_printf
2375 "invalid number of typedefs, expected %d but got %d",
2376 nbtypedefs
, nbpairs
);
2377 if (state_token_kind (t0
) == STOK_RIGHTPAR
)
2378 next_state_tokens (1);
2380 fatal_reading_state (t0
, "Bad typedefs syntax )");
2383 fatal_reading_state (t0
, "Bad typedefs syntax (!typedefs");
2385 if (verbosity_level
>= 2)
2386 printf ("%s read %d typedefs from state\n", progname
, nbtypedefs
);
2391 /* Read the structures. */
2393 read_state_structures (type_p
*structures
)
2396 type_p previous
= NULL
;
2398 int nbstruct
= 0, countstruct
= 0;
2399 struct state_token_st
*t0
= peek_state_token (0);
2400 struct state_token_st
*t1
= peek_state_token (1);
2401 struct state_token_st
*t2
= peek_state_token (2);
2403 if (state_token_kind (t0
) == STOK_LEFTPAR
2404 && state_token_is_name (t1
, "!structures")
2405 && state_token_kind (t2
) == STOK_INTEGER
)
2407 nbstruct
= t2
->stok_un
.stok_num
;
2408 next_state_tokens (3);
2409 t0
= peek_state_token (0);
2410 while (t0
&& state_token_kind (t0
) != STOK_RIGHTPAR
)
2413 read_state_type (&tmp
);
2422 previous
->next
= tmp
;
2425 t0
= peek_state_token (0);
2427 next_state_tokens (1);
2430 fatal_reading_state (t0
, "Bad structures syntax");
2431 if (countstruct
!= nbstruct
)
2432 fatal_reading_state_printf (NULL_STATE_TOKEN
,
2433 "expected %d structures but got %d",
2434 nbstruct
, countstruct
);
2435 if (verbosity_level
>= 2)
2436 printf ("%s read %d structures from state\n", progname
, nbstruct
);
2441 /* Read the param_struct-s. */
2443 read_state_param_structs (type_p
*param_structs
)
2445 int nbparamstructs
= 0;
2446 int countparamstructs
= 0;
2448 type_p previous
= NULL
;
2450 struct state_token_st
*t0
= peek_state_token (0);
2451 struct state_token_st
*t1
= peek_state_token (1);
2452 struct state_token_st
*t2
= peek_state_token (2);
2454 if (state_token_kind (t0
) == STOK_LEFTPAR
2455 && state_token_is_name (t1
, "!param_structs")
2456 && state_token_kind (t2
) == STOK_INTEGER
)
2458 nbparamstructs
= t2
->stok_un
.stok_num
;
2459 next_state_tokens (3);
2460 t0
= t1
= t2
= NULL
;
2461 t0
= peek_state_token (0);
2462 while (state_token_kind (t0
) != STOK_RIGHTPAR
)
2465 read_state_type (&tmp
);
2473 previous
->next
= tmp
;
2476 t0
= peek_state_token (0);
2477 countparamstructs
++;
2479 next_state_tokens (1);
2482 fatal_reading_state (t0
, "Bad param_structs syntax");
2483 t0
= peek_state_token (0);
2484 if (countparamstructs
!= nbparamstructs
)
2485 fatal_reading_state_printf
2487 "invalid number of param_structs expected %d got %d",
2488 nbparamstructs
, countparamstructs
);
2489 *param_structs
= head
;
2493 /* Read the variables. */
2495 read_state_variables (pair_p
*variables
)
2499 struct state_token_st
*t0
= peek_state_token (0);
2500 struct state_token_st
*t1
= peek_state_token (1);
2501 struct state_token_st
*t2
= peek_state_token (2);
2503 if (state_token_kind (t0
) == STOK_LEFTPAR
2504 && state_token_is_name (t1
, "!variables")
2505 && state_token_kind (t2
) == STOK_INTEGER
)
2508 nbvars
= t2
->stok_un
.stok_num
;
2509 next_state_tokens (3);
2510 nbpairs
= read_state_pair_list (&list
);
2511 t0
= peek_state_token (0);
2512 if (nbpairs
!= nbvars
)
2513 fatal_reading_state_printf
2514 (t0
, "Invalid number of variables, expected %d but got %d",
2516 if (state_token_kind (t0
) == STOK_RIGHTPAR
)
2517 next_state_tokens (1);
2519 fatal_reading_state (t0
, "Waiting for ) in variables");
2522 fatal_reading_state (t0
, "Bad variables syntax");
2524 if (verbosity_level
>= 2)
2525 printf ("%s read %d variables from state\n", progname
, nbvars
);
2529 /* Read the source directory. */
2531 read_state_srcdir (void)
2533 struct state_token_st
*t0
= peek_state_token (0);
2534 struct state_token_st
*t1
= peek_state_token (1);
2535 if (state_token_kind (t0
) == STOK_LEFTPAR
&&
2536 state_token_is_name (t1
, "!srcdir"))
2538 next_state_tokens (2);
2539 t0
= peek_state_token (0);
2540 t1
= peek_state_token (1);
2541 if (state_token_kind (t0
) == STOK_STRING
&&
2542 state_token_kind (t1
) == STOK_RIGHTPAR
)
2544 srcdir
= xstrdup (t0
->stok_un
.stok_string
);
2545 srcdir_len
= strlen (srcdir
);
2546 next_state_tokens (2);
2551 fatal_reading_state (t0
, "Bad srcdir in state_file");
2555 /* Read the sequence of GCC front-end languages. */
2557 read_state_languages (void)
2559 struct state_token_st
*t0
= peek_state_token (0);
2560 struct state_token_st
*t1
= peek_state_token (1);
2561 struct state_token_st
*t2
= peek_state_token (2);
2562 if (state_token_kind (t0
) == STOK_LEFTPAR
2563 && state_token_is_name (t1
, "!languages")
2564 && state_token_kind (t2
) == STOK_INTEGER
)
2567 num_lang_dirs
= t2
->stok_un
.stok_num
;
2568 lang_dir_names
= XCNEWVEC (const char *, num_lang_dirs
);
2569 next_state_tokens (3);
2570 t0
= t1
= t2
= NULL
;
2571 for (i
= 0; i
< (int) num_lang_dirs
; i
++)
2573 t0
= peek_state_token (0);
2574 if (state_token_kind (t0
) != STOK_NAME
)
2575 fatal_reading_state (t0
, "expecting language name in state file");
2576 lang_dir_names
[i
] = t0
->stok_un
.stok_ident
->stid_name
;
2577 next_state_tokens (1);
2579 t0
= peek_state_token (0);
2580 if (state_token_kind (t0
) != STOK_RIGHTPAR
)
2581 fatal_reading_state (t0
, "missing ) in languages list of state file");
2582 next_state_tokens (1);
2585 fatal_reading_state (t0
, "expecting languages list in state file");
2589 /* Read the sequence of files. */
2591 read_state_files_list (void)
2593 struct state_token_st
*t0
= peek_state_token (0);
2594 struct state_token_st
*t1
= peek_state_token (1);
2595 struct state_token_st
*t2
= peek_state_token (2);
2597 if (state_token_kind (t0
) == STOK_LEFTPAR
2598 && state_token_is_name (t1
, "!fileslist")
2599 && state_token_kind (t2
) == STOK_INTEGER
)
2602 num_gt_files
= t2
->stok_un
.stok_num
;
2603 next_state_tokens (3);
2604 t0
= t1
= t2
= NULL
;
2605 gt_files
= XCNEWVEC (const input_file
*, num_gt_files
);
2606 for (i
= 0; i
< (int) num_gt_files
; i
++)
2608 bool issrcfile
= FALSE
;
2609 t0
= t1
= t2
= NULL
;
2610 t0
= peek_state_token (0);
2611 t1
= peek_state_token (1);
2612 t2
= peek_state_token (2);
2613 if (state_token_kind (t0
) == STOK_LEFTPAR
2614 && (state_token_is_name (t1
, "!file")
2615 || (issrcfile
= state_token_is_name (t1
, "!srcfile")))
2616 && state_token_kind (t2
) == STOK_INTEGER
)
2618 lang_bitmap bmap
= t2
->stok_un
.stok_num
;
2619 next_state_tokens (3);
2620 t0
= t1
= t2
= NULL
;
2621 t0
= peek_state_token (0);
2622 t1
= peek_state_token (1);
2623 if (state_token_kind (t0
) == STOK_STRING
2624 && state_token_kind (t1
) == STOK_RIGHTPAR
)
2626 const char *fnam
= t0
->stok_un
.stok_string
;
2627 /* Allocate & fill a gt_file entry with space for the lang_bitmap before! */
2628 input_file
*curgt
= NULL
;
2631 static const char dirsepstr
[2] =
2632 { DIR_SEPARATOR
, (char) 0 };
2633 char *fullpath
= concat (srcdir
, dirsepstr
, fnam
, NULL
);
2634 curgt
= input_file_by_name (fullpath
);
2638 curgt
= input_file_by_name (fnam
);
2639 set_lang_bitmap (curgt
, bmap
);
2640 gt_files
[i
] = curgt
;
2641 next_state_tokens (2);
2644 fatal_reading_state (t0
,
2645 "bad file in !fileslist of state file");
2648 fatal_reading_state (t0
,
2649 "expecting file in !fileslist of state file");
2651 t0
= peek_state_token (0);
2652 if (!state_token_kind (t0
) == STOK_RIGHTPAR
)
2653 fatal_reading_state (t0
, "missing ) for !fileslist in state file");
2654 next_state_tokens (1);
2657 fatal_reading_state (t0
, "missing !fileslist in state file");
2661 /* Read the trailer. */
2663 read_state_trailer (void)
2665 struct state_token_st
*t0
= peek_state_token (0);
2666 struct state_token_st
*t1
= peek_state_token (1);
2667 struct state_token_st
*t2
= peek_state_token (2);
2669 if (state_token_kind (t0
) == STOK_LEFTPAR
2670 && state_token_is_name (t1
, "!endfile")
2671 && state_token_kind (t2
) == STOK_RIGHTPAR
)
2672 next_state_tokens (3);
2674 fatal_reading_state (t0
, "missing !endfile in state file");
2678 /* Utility functions for the state_seen_types hash table. */
2680 hash_type_number (const void *ty
)
2682 const struct type
*type
= (const struct type
*) ty
;
2684 return type
->state_number
;
2688 equals_type_number (const void *ty1
, const void *ty2
)
2690 const struct type
*type1
= (const struct type
*) ty1
;
2691 const struct type
*type2
= (const struct type
*) ty2
;
2693 return type1
->state_number
== type2
->state_number
;
2697 string_eq (const void *a
, const void *b
)
2699 const char *a0
= (const char *)a
;
2700 const char *b0
= (const char *)b
;
2702 return (strcmp (a0
, b0
) == 0);
2706 /* The function reading the state, called by main from gengtype.c. */
2708 read_state (const char *path
)
2710 state_file
= fopen (path
, "r");
2711 if (state_file
== NULL
)
2712 fatal ("Failed to open state file %s for reading [%s]", path
,
2717 if (verbosity_level
>= 1)
2719 printf ("%s reading state file %s;", progname
, state_path
);
2720 if (verbosity_level
>= 2)
2726 htab_create (2017, hash_type_number
, equals_type_number
, NULL
);
2728 htab_create (4027, htab_hash_string
, string_eq
, NULL
);
2729 read_state_version (version_string
);
2730 read_state_srcdir ();
2731 read_state_languages ();
2732 read_state_files_list ();
2733 read_state_structures (&structures
);
2734 if (ferror (state_file
))
2735 fatal_reading_state_printf
2736 (NULL_STATE_TOKEN
, "input error while reading state [%s]",
2738 read_state_typedefs (&typedefs
);
2739 read_state_param_structs (¶m_structs
);
2740 read_state_variables (&variables
);
2741 read_state_trailer ();
2743 if (verbosity_level
>= 1)
2745 printf ("%s read %ld bytes.\n", progname
, ftell (state_file
));
2749 if (fclose (state_file
))
2750 fatal ("failed to close read state file %s [%s]",
2751 path
, xstrerror (errno
));
2756 /* End of file gengtype-state.c. */