OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [gengtype-state.c] - Blame information for rev 749

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.