xref: /dragonfly/contrib/gcc-4.7/gcc/gengtype.c (revision e0b1d537)
1 /* Process source files and output type information.
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4 
5    This file is part of GCC.
6 
7    GCC is free software; you can redistribute it and/or modify it under
8    the terms of the GNU General Public License as published by the Free
9    Software Foundation; either version 3, or (at your option) any later
10    version.
11 
12    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13    WARRANTY; without even the implied warranty of MERCHANTABILITY or
14    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15    for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING3.  If not see
19    <http://www.gnu.org/licenses/>.  */
20 
21 #ifdef GENERATOR_FILE
22 #include "bconfig.h"
23 #else
24 #include "config.h"
25 #endif
26 #include "system.h"
27 #include "errors.h"		/* for fatal */
28 #include "getopt.h"
29 #include "double-int.h"
30 #include "version.h"		/* for version_string & pkgversion_string.  */
31 #include "hashtab.h"
32 #include "xregex.h"
33 #include "obstack.h"
34 #include "gengtype.h"
35 #include "filenames.h"
36 
37 /* Data types, macros, etc. used only in this file.  */
38 
39 
40 /* The list of output files.  */
41 outf_p output_files;
42 
43 /* The output header file that is included into pretty much every
44    source file.  */
45 outf_p header_file;
46 
47 
48 /* The name of the file containing the list of input files.  */
49 static char *inputlist;
50 
51 /* The plugin input files and their number; in that case only
52    a single file is produced.  */
53 static input_file **plugin_files;
54 static size_t nb_plugin_files;
55 
56 /* The generated plugin output file and name.  */
57 static outf_p plugin_output;
58 static char *plugin_output_filename;
59 
60 /* Our source directory and its length.  */
61 const char *srcdir;
62 size_t srcdir_len;
63 
64 /* Variables used for reading and writing the state.  */
65 const char *read_state_filename;
66 const char *write_state_filename;
67 
68 /* Variables to help debugging.  */
69 int do_dump;
70 int do_debug;
71 
72 /* Level for verbose messages.  */
73 int verbosity_level;
74 
75 /* We have a type count and use it to set the state_number of newly
76    allocated types to some unique negative number.  */
77 static int type_count;
78 
79 /* The backup directory should be in the same file system as the
80    generated files, otherwise the rename(2) system call would fail.
81    If NULL, no backup is made when overwriting a generated file.  */
82 static const char* backup_dir;	/* (-B) program option.  */
83 
84 
85 static outf_p create_file (const char *, const char *);
86 
87 static const char *get_file_basename (const input_file *);
88 static const char *get_file_realbasename (const input_file *);
89 
90 static int get_prefix_langdir_index (const char *);
91 static const char *get_file_langdir (const input_file *);
92 
93 
94 /* Nonzero iff an error has occurred.  */
95 bool hit_error = false;
96 
97 static void gen_rtx_next (void);
98 static void write_rtx_next (void);
99 static void open_base_files (void);
100 static void close_output_files (void);
101 
102 /* Report an error at POS, printing MSG.  */
103 
104 void
105 error_at_line (const struct fileloc *pos, const char *msg, ...)
106 {
107   va_list ap;
108 
109   gcc_assert (pos != NULL && pos->file != NULL);
110   va_start (ap, msg);
111 
112   fprintf (stderr, "%s:%d: ", get_input_file_name (pos->file), pos->line);
113   vfprintf (stderr, msg, ap);
114   fputc ('\n', stderr);
115   hit_error = true;
116 
117   va_end (ap);
118 }
119 
120 /* asprintf, but produces fatal message on out-of-memory.  */
121 char *
122 xasprintf (const char *format, ...)
123 {
124   int n;
125   char *result;
126   va_list ap;
127 
128   va_start (ap, format);
129   n = vasprintf (&result, format, ap);
130   if (result == NULL || n < 0)
131     fatal ("out of memory");
132   va_end (ap);
133 
134   return result;
135 }
136 
137 /* Input file handling. */
138 
139 /* Table of all input files.  */
140 const input_file **gt_files;
141 size_t num_gt_files;
142 
143 /* A number of places use the name of this "gengtype.c" file for a
144    location for things that we can't rely on the source to define.
145    Make sure we can still use pointer comparison on filenames.  */
146 input_file* this_file;
147 /* The "system.h" file is likewise specially useful.  */
148 input_file* system_h_file;
149 
150 /* Vector of per-language directories.  */
151 const char **lang_dir_names;
152 size_t num_lang_dirs;
153 
154 /* An array of output files suitable for definitions.  There is one
155    BASE_FILES entry for each language.  */
156 static outf_p *base_files;
157 
158 
159 
160 #if ENABLE_CHECKING
161 /* Utility debugging function, printing the various type counts within
162    a list of types.  Called thru the DBGPRINT_COUNT_TYPE macro.  */
163 void
164 dbgprint_count_type_at (const char *fil, int lin, const char *msg, type_p t)
165 {
166   int nb_types = 0, nb_scalar = 0, nb_string = 0;
167   int nb_struct = 0, nb_union = 0, nb_array = 0, nb_pointer = 0;
168   int nb_lang_struct = 0, nb_param_struct = 0;
169   type_p p = NULL;
170   for (p = t; p; p = p->next)
171     {
172       nb_types++;
173       switch (p->kind)
174 	{
175 	case TYPE_SCALAR:
176 	  nb_scalar++;
177 	  break;
178 	case TYPE_STRING:
179 	  nb_string++;
180 	  break;
181 	case TYPE_STRUCT:
182 	  nb_struct++;
183 	  break;
184 	case TYPE_UNION:
185 	  nb_union++;
186 	  break;
187 	case TYPE_POINTER:
188 	  nb_pointer++;
189 	  break;
190 	case TYPE_ARRAY:
191 	  nb_array++;
192 	  break;
193 	case TYPE_LANG_STRUCT:
194 	  nb_lang_struct++;
195 	  break;
196 	case TYPE_PARAM_STRUCT:
197 	  nb_param_struct++;
198 	  break;
199 	default:
200 	  gcc_unreachable ();
201 	}
202     }
203   fprintf (stderr, "\n" "%s:%d: %s: @@%%@@ %d types ::\n",
204 	   lbasename (fil), lin, msg, nb_types);
205   if (nb_scalar > 0 || nb_string > 0)
206     fprintf (stderr, "@@%%@@ %d scalars, %d strings\n", nb_scalar, nb_string);
207   if (nb_struct > 0 || nb_union > 0)
208     fprintf (stderr, "@@%%@@ %d structs, %d unions\n", nb_struct, nb_union);
209   if (nb_pointer > 0 || nb_array > 0)
210     fprintf (stderr, "@@%%@@ %d pointers, %d arrays\n", nb_pointer, nb_array);
211   if (nb_lang_struct > 0 || nb_param_struct > 0)
212     fprintf (stderr, "@@%%@@ %d lang_structs, %d param_structs\n",
213 	     nb_lang_struct, nb_param_struct);
214   fprintf (stderr, "\n");
215 }
216 #endif /* ENABLE_CHECKING */
217 
218 /* Scan the input file, LIST, and determine how much space we need to
219    store strings in.  Also, count the number of language directories
220    and files.  The numbers returned are overestimates as they does not
221    consider repeated files.  */
222 static size_t
223 measure_input_list (FILE *list)
224 {
225   size_t n = 0;
226   int c;
227   bool atbol = true;
228   num_lang_dirs = 0;
229   num_gt_files = plugin_files ? nb_plugin_files : 0;
230   while ((c = getc (list)) != EOF)
231     {
232       n++;
233       if (atbol)
234 	{
235 	  if (c == '[')
236 	    num_lang_dirs++;
237 	  else
238 	    {
239 	      /* Add space for a lang_bitmap before the input file name.  */
240 	      n += sizeof (lang_bitmap);
241 	      num_gt_files++;
242 	    }
243 	  atbol = false;
244 	}
245 
246       if (c == '\n')
247 	atbol = true;
248     }
249 
250   rewind (list);
251   return n;
252 }
253 
254 /* Read one input line from LIST to HEREP (which is updated).  A
255    pointer to the string is returned via LINEP.  If it was a language
256    subdirectory in square brackets, strip off the square brackets and
257    return true.  Otherwise, leave space before the string for a
258    lang_bitmap, and return false.  At EOF, returns false, does not
259    touch *HEREP, and sets *LINEP to NULL.  POS is used for
260    diagnostics.  */
261 static bool
262 read_input_line (FILE *list, char **herep, char **linep, struct fileloc *pos)
263 {
264   char *here = *herep;
265   char *line;
266   int c = getc (list);
267 
268   /* Read over whitespace.  */
269   while (c == '\n' || c == ' ')
270     c = getc (list);
271 
272   if (c == EOF)
273     {
274       *linep = 0;
275       return false;
276     }
277   else if (c == '[')
278     {
279       /* No space for a lang_bitmap is necessary.  Discard the '['. */
280       c = getc (list);
281       line = here;
282       while (c != ']' && c != '\n' && c != EOF)
283 	{
284 	  *here++ = c;
285 	  c = getc (list);
286 	}
287       *here++ = '\0';
288 
289       if (c == ']')
290 	{
291 	  c = getc (list);	/* eat what should be a newline */
292 	  if (c != '\n' && c != EOF)
293 	    error_at_line (pos, "junk on line after language tag [%s]", line);
294 	}
295       else
296 	error_at_line (pos, "missing close bracket for language tag [%s",
297 		       line);
298 
299       *herep = here;
300       *linep = line;
301       return true;
302     }
303   else
304     {
305       /* Leave space for a lang_bitmap.  */
306       memset (here, 0, sizeof (lang_bitmap));
307       here += sizeof (lang_bitmap);
308       line = here;
309       do
310 	{
311 	  *here++ = c;
312 	  c = getc (list);
313 	}
314       while (c != EOF && c != '\n');
315       *here++ = '\0';
316       *herep = here;
317       *linep = line;
318       return false;
319     }
320 }
321 
322 /* Read the list of input files from LIST and compute all of the
323    relevant tables.  There is one file per line of the list.  At
324    first, all the files on the list are language-generic, but
325    eventually a line will appear which is the name of a language
326    subdirectory in square brackets, like this: [cp].  All subsequent
327    files are specific to that language, until another language
328    subdirectory tag appears.  Files can appear more than once, if
329    they apply to more than one language.  */
330 static void
331 read_input_list (const char *listname)
332 {
333   FILE *list = fopen (listname, "r");
334   if (!list)
335     fatal ("cannot open %s: %s", listname, xstrerror (errno));
336   else
337     {
338       struct fileloc epos;
339       size_t bufsz = measure_input_list (list);
340       char *buf = XNEWVEC (char, bufsz);
341       char *here = buf;
342       char *committed = buf;
343       char *limit = buf + bufsz;
344       char *line;
345       bool is_language;
346       size_t langno = 0;
347       size_t nfiles = 0;
348       lang_bitmap curlangs = (1 << num_lang_dirs) - 1;
349 
350       epos.file = input_file_by_name (listname);
351       epos.line = 0;
352 
353       lang_dir_names = XNEWVEC (const char *, num_lang_dirs);
354       gt_files = XNEWVEC (const input_file *, num_gt_files);
355 
356       for (;;)
357 	{
358 	next_line:
359 	  epos.line++;
360 	  committed = here;
361 	  is_language = read_input_line (list, &here, &line, &epos);
362 	  gcc_assert (here <= limit);
363 	  if (line == 0)
364 	    break;
365 	  else if (is_language)
366 	    {
367 	      size_t i;
368 	      gcc_assert (langno <= num_lang_dirs);
369 	      for (i = 0; i < langno; i++)
370 		if (strcmp (lang_dir_names[i], line) == 0)
371 		  {
372 		    error_at_line (&epos, "duplicate language tag [%s]",
373 				   line);
374 		    curlangs = 1 << i;
375 		    here = committed;
376 		    goto next_line;
377 		  }
378 
379 	      curlangs = 1 << langno;
380 	      lang_dir_names[langno++] = line;
381 	    }
382 	  else
383 	    {
384 	      size_t i;
385 	      input_file *inpf = input_file_by_name (line);
386 	      gcc_assert (nfiles <= num_gt_files);
387 	      for (i = 0; i < nfiles; i++)
388 		/* Since the input_file-s are uniquely hash-consed, we
389 		   can just compare pointers! */
390 		if (gt_files[i] == inpf)
391 		  {
392 		    /* Throw away the string we just read, and add the
393 		       current language to the existing string's bitmap.  */
394 		    lang_bitmap bmap = get_lang_bitmap (inpf);
395 		    if (bmap & curlangs)
396 		      error_at_line (&epos,
397 				     "file %s specified more than once "
398 				     "for language %s", line,
399 				     langno ==
400 				     0 ? "(all)" : lang_dir_names[langno -
401 								  1]);
402 
403 		    bmap |= curlangs;
404 		    set_lang_bitmap (inpf, bmap);
405 		    here = committed;
406 		    goto next_line;
407 		  }
408 
409 	      set_lang_bitmap (inpf, curlangs);
410 	      gt_files[nfiles++] = inpf;
411 	    }
412 	}
413       /* Update the global counts now that we know accurately how many
414          things there are.  (We do not bother resizing the arrays down.)  */
415       num_lang_dirs = langno;
416       /* Add the plugin files if provided.  */
417       if (plugin_files)
418 	{
419 	  size_t i;
420 	  for (i = 0; i < nb_plugin_files; i++)
421 	    gt_files[nfiles++] = plugin_files[i];
422 	}
423       num_gt_files = nfiles;
424     }
425 
426   /* Sanity check: any file that resides in a language subdirectory
427      (e.g. 'cp') ought to belong to the corresponding language.
428      ??? Still true if for instance ObjC++ is enabled and C++ isn't?
429      (Can you even do that?  Should you be allowed to?)  */
430   {
431     size_t f;
432     for (f = 0; f < num_gt_files; f++)
433       {
434 	lang_bitmap bitmap = get_lang_bitmap (gt_files[f]);
435 	const char *basename = get_file_basename (gt_files[f]);
436 	const char *slashpos = strchr (basename, '/');
437 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
438 	const char *slashpos2 = strchr (basename, '\\');
439 
440 	if (!slashpos || (slashpos2 && slashpos2 < slashpos))
441 	  slashpos = slashpos2;
442 #endif
443 
444 	if (slashpos)
445 	  {
446 	    size_t l;
447 	    for (l = 0; l < num_lang_dirs; l++)
448 	      if ((size_t) (slashpos - basename) == strlen (lang_dir_names[l])
449 		  && memcmp (basename, lang_dir_names[l],
450 			     strlen (lang_dir_names[l])) == 0)
451 		{
452 		  if (!(bitmap & (1 << l)))
453 		    error ("%s is in language directory '%s' but is not "
454 			   "tagged for that language",
455 			   basename, lang_dir_names[l]);
456 		  break;
457 		}
458 	  }
459       }
460   }
461 
462   if (ferror (list))
463     fatal ("error reading %s: %s", listname, xstrerror (errno));
464 
465   fclose (list);
466 }
467 
468 
469 
470 /* The one and only TYPE_STRING.  */
471 
472 struct type string_type = {
473   TYPE_STRING, 0, 0, 0, GC_USED, {0}
474 };
475 
476 /* The two and only TYPE_SCALARs.  Their u.scalar_is_char flags are
477    set early in main.  */
478 
479 struct type scalar_nonchar = {
480   TYPE_SCALAR, 0, 0, 0, GC_USED, {0}
481 };
482 
483 struct type scalar_char = {
484   TYPE_SCALAR, 0, 0, 0, GC_USED, {0}
485 };
486 
487 /* Lists of various things.  */
488 
489 pair_p typedefs;
490 type_p structures;
491 type_p param_structs;
492 pair_p variables;
493 
494 static type_p find_param_structure (type_p t, type_p param[NUM_PARAM]);
495 static type_p adjust_field_tree_exp (type_p t, options_p opt);
496 static type_p adjust_field_rtx_def (type_p t, options_p opt);
497 
498 /* Define S as a typedef to T at POS.  */
499 
500 void
501 do_typedef (const char *s, type_p t, struct fileloc *pos)
502 {
503   pair_p p;
504 
505   /* temporary kludge - gengtype doesn't handle conditionals or
506      macros.  Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
507      is coming from this file (main() sets them up with safe dummy
508      definitions).  */
509   if (!strcmp (s, "CUMULATIVE_ARGS") && pos->file != this_file)
510     return;
511 
512   for (p = typedefs; p != NULL; p = p->next)
513     if (strcmp (p->name, s) == 0)
514       {
515 	if (p->type != t)
516 	  {
517 	    error_at_line (pos, "type `%s' previously defined", s);
518 	    error_at_line (&p->line, "previously defined here");
519 	  }
520 	return;
521       }
522 
523   p = XNEW (struct pair);
524   p->next = typedefs;
525   p->name = s;
526   p->type = t;
527   p->line = *pos;
528   p->opt = NULL;
529   typedefs = p;
530 }
531 
532 /* Define S as a typename of a scalar.  Cannot be used to define
533    typedefs of 'char'.  Note: is also used for pointer-to-function
534    typedefs (which are therefore not treated as pointers).  */
535 
536 void
537 do_scalar_typedef (const char *s, struct fileloc *pos)
538 {
539   do_typedef (s, &scalar_nonchar, pos);
540 }
541 
542 /* Return the type previously defined for S.  Use POS to report errors.  */
543 
544 type_p
545 resolve_typedef (const char *s, struct fileloc *pos)
546 {
547   pair_p p;
548   for (p = typedefs; p != NULL; p = p->next)
549     if (strcmp (p->name, s) == 0)
550       return p->type;
551   error_at_line (pos, "unidentified type `%s'", s);
552   return &scalar_nonchar;	/* treat as "int" */
553 }
554 
555 /* Create and return a new structure with tag NAME (or a union iff
556    ISUNION is nonzero), at POS with fields FIELDS and options O.  */
557 
558 type_p
559 new_structure (const char *name, int isunion, struct fileloc *pos,
560 	       pair_p fields, options_p o)
561 {
562   type_p si;
563   type_p s = NULL;
564   lang_bitmap bitmap = get_lang_bitmap (pos->file);
565 
566   for (si = structures; si != NULL; si = si->next)
567     if (strcmp (name, si->u.s.tag) == 0 && UNION_P (si) == isunion)
568       {
569 	type_p ls = NULL;
570 	if (si->kind == TYPE_LANG_STRUCT)
571 	  {
572 	    ls = si;
573 
574 	    for (si = ls->u.s.lang_struct; si != NULL; si = si->next)
575 	      if (si->u.s.bitmap == bitmap)
576 		s = si;
577 	  }
578 	else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
579 	  {
580 	    ls = si;
581 	    type_count++;
582 	    si = XCNEW (struct type);
583 	    memcpy (si, ls, sizeof (struct type));
584 	    ls->kind = TYPE_LANG_STRUCT;
585 	    ls->u.s.lang_struct = si;
586 	    ls->u.s.fields = NULL;
587 	    si->next = NULL;
588 	    si->state_number = -type_count;
589 	    si->pointer_to = NULL;
590 	    si->u.s.lang_struct = ls;
591 	  }
592 	else
593 	  s = si;
594 
595 	if (ls != NULL && s == NULL)
596 	  {
597 	    type_count++;
598 	    s = XCNEW (struct type);
599 	    s->state_number = -type_count;
600 	    s->next = ls->u.s.lang_struct;
601 	    ls->u.s.lang_struct = s;
602 	    s->u.s.lang_struct = ls;
603 	  }
604 	break;
605       }
606 
607   if (s == NULL)
608     {
609       type_count++;
610       s = XCNEW (struct type);
611       s->state_number = -type_count;
612       s->next = structures;
613       structures = s;
614     }
615 
616   if (s->u.s.line.file != NULL
617       || (s->u.s.lang_struct && (s->u.s.lang_struct->u.s.bitmap & bitmap)))
618     {
619       error_at_line (pos, "duplicate definition of '%s %s'",
620 		     isunion ? "union" : "struct", s->u.s.tag);
621       error_at_line (&s->u.s.line, "previous definition here");
622     }
623 
624   s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
625   s->u.s.tag = name;
626   s->u.s.line = *pos;
627   s->u.s.fields = fields;
628   s->u.s.opt = o;
629   s->u.s.bitmap = bitmap;
630   if (s->u.s.lang_struct)
631     s->u.s.lang_struct->u.s.bitmap |= bitmap;
632 
633   return s;
634 }
635 
636 /* Return the previously-defined structure with tag NAME (or a union
637    iff ISUNION is nonzero), or a new empty structure or union if none
638    was defined previously.  */
639 
640 type_p
641 find_structure (const char *name, int isunion)
642 {
643   type_p s;
644 
645   for (s = structures; s != NULL; s = s->next)
646     if (strcmp (name, s->u.s.tag) == 0 && UNION_P (s) == isunion)
647       return s;
648 
649   type_count++;
650   s = XCNEW (struct type);
651   s->next = structures;
652   s->state_number = -type_count;
653   structures = s;
654   s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
655   s->u.s.tag = name;
656   structures = s;
657   return s;
658 }
659 
660 /* Return the previously-defined parameterized structure for structure
661    T and parameters PARAM, or a new parameterized empty structure or
662    union if none was defined previously.  */
663 
664 static type_p
665 find_param_structure (type_p t, type_p param[NUM_PARAM])
666 {
667   type_p res;
668 
669   for (res = param_structs; res; res = res->next)
670     if (res->u.param_struct.stru == t
671 	&& memcmp (res->u.param_struct.param, param,
672 		   sizeof (type_p) * NUM_PARAM) == 0)
673       break;
674   if (res == NULL)
675     {
676       type_count++;
677       res = XCNEW (struct type);
678       res->kind = TYPE_PARAM_STRUCT;
679       res->next = param_structs;
680       res->state_number = -type_count;
681       param_structs = res;
682       res->u.param_struct.stru = t;
683       memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
684     }
685   return res;
686 }
687 
688 /* Return a scalar type with name NAME.  */
689 
690 type_p
691 create_scalar_type (const char *name)
692 {
693   if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
694     return &scalar_char;
695   else
696     return &scalar_nonchar;
697 }
698 
699 /* Return a pointer to T.  */
700 
701 type_p
702 create_pointer (type_p t)
703 {
704   if (!t->pointer_to)
705     {
706       type_p r = XCNEW (struct type);
707       type_count++;
708       r->state_number = -type_count;
709       r->kind = TYPE_POINTER;
710       r->u.p = t;
711       t->pointer_to = r;
712     }
713   return t->pointer_to;
714 }
715 
716 /* Return an array of length LEN.  */
717 
718 type_p
719 create_array (type_p t, const char *len)
720 {
721   type_p v;
722 
723   type_count++;
724   v = XCNEW (struct type);
725   v->kind = TYPE_ARRAY;
726   v->state_number = -type_count;
727   v->u.a.p = t;
728   v->u.a.len = len;
729   return v;
730 }
731 
732 /* Return a string options structure with name NAME and info INFO.
733    NEXT is the next option in the chain.  */
734 options_p
735 create_string_option (options_p next, const char *name, const char *info)
736 {
737   options_p o = XNEW (struct options);
738   o->kind = OPTION_STRING;
739   o->next = next;
740   o->name = name;
741   o->info.string = info;
742   return o;
743 }
744 
745 /* Create a type options structure with name NAME and info INFO.  NEXT
746    is the next option in the chain.  */
747 options_p
748 create_type_option (options_p next, const char* name, type_p info)
749 {
750   options_p o = XNEW (struct options);
751   o->next = next;
752   o->name = name;
753   o->kind = OPTION_TYPE;
754   o->info.type = info;
755   return o;
756 }
757 
758 /* Create a nested pointer options structure with name NAME and info
759    INFO.  NEXT is the next option in the chain.  */
760 options_p
761 create_nested_option (options_p next, const char* name,
762                       struct nested_ptr_data* info)
763 {
764   options_p o;
765   o = XNEW (struct options);
766   o->next = next;
767   o->name = name;
768   o->kind = OPTION_NESTED;
769   o->info.nested = info;
770   return o;
771 }
772 
773 /* Return an options structure for a "nested_ptr" option.  */
774 options_p
775 create_nested_ptr_option (options_p next, type_p t,
776 			  const char *to, const char *from)
777 {
778   struct nested_ptr_data *d = XNEW (struct nested_ptr_data);
779 
780   d->type = adjust_field_type (t, 0);
781   d->convert_to = to;
782   d->convert_from = from;
783   return create_nested_option (next, "nested_ptr", d);
784 }
785 
786 /* Add a variable named S of type T with options O defined at POS,
787    to `variables'.  */
788 void
789 note_variable (const char *s, type_p t, options_p o, struct fileloc *pos)
790 {
791   pair_p n;
792   n = XNEW (struct pair);
793   n->name = s;
794   n->type = t;
795   n->line = *pos;
796   n->opt = o;
797   n->next = variables;
798   variables = n;
799 }
800 
801 /* Most-general structure field creator.  */
802 static pair_p
803 create_field_all (pair_p next, type_p type, const char *name, options_p opt,
804 		  const input_file *inpf, int line)
805 {
806   pair_p field;
807 
808   field = XNEW (struct pair);
809   field->next = next;
810   field->type = type;
811   field->name = name;
812   field->opt = opt;
813   field->line.file = inpf;
814   field->line.line = line;
815   return field;
816 }
817 
818 /* Create a field that came from the source code we are scanning,
819    i.e. we have a 'struct fileloc', and possibly options; also,
820    adjust_field_type should be called.  */
821 pair_p
822 create_field_at (pair_p next, type_p type, const char *name, options_p opt,
823 		 struct fileloc *pos)
824 {
825   return create_field_all (next, adjust_field_type (type, opt),
826 			   name, opt, pos->file, pos->line);
827 }
828 
829 /* Create a fake field with the given type and name.  NEXT is the next
830    field in the chain.  */
831 #define create_field(next,type,name) \
832     create_field_all(next,type,name, 0, this_file, __LINE__)
833 
834 /* Like create_field, but the field is only valid when condition COND
835    is true.  */
836 
837 static pair_p
838 create_optional_field_ (pair_p next, type_p type, const char *name,
839 			const char *cond, int line)
840 {
841   static int id = 1;
842   pair_p union_fields;
843   type_p union_type;
844 
845   /* Create a fake union type with a single nameless field of type TYPE.
846      The field has a tag of "1".  This allows us to make the presence
847      of a field of type TYPE depend on some boolean "desc" being true.  */
848   union_fields = create_field (NULL, type, "");
849   union_fields->opt =
850     create_string_option (union_fields->opt, "dot", "");
851   union_fields->opt =
852     create_string_option (union_fields->opt, "tag", "1");
853   union_type =
854     new_structure (xasprintf ("%s_%d", "fake_union", id++), 1,
855                    &lexer_line, union_fields, NULL);
856 
857   /* Create the field and give it the new fake union type.  Add a "desc"
858      tag that specifies the condition under which the field is valid.  */
859   return create_field_all (next, union_type, name,
860 			   create_string_option (0, "desc", cond),
861 			   this_file, line);
862 }
863 
864 #define create_optional_field(next,type,name,cond)	\
865        create_optional_field_(next,type,name,cond,__LINE__)
866 
867 /* Reverse a linked list of 'struct pair's in place.  */
868 pair_p
869 nreverse_pairs (pair_p list)
870 {
871   pair_p prev = 0, p, next;
872   for (p = list; p; p = next)
873     {
874       next = p->next;
875       p->next = prev;
876       prev = p;
877     }
878   return prev;
879 }
880 
881 
882 /* We don't care how long a CONST_DOUBLE is.  */
883 #define CONST_DOUBLE_FORMAT "ww"
884 /* We don't want to see codes that are only for generator files.  */
885 #undef GENERATOR_FILE
886 
887 enum rtx_code
888 {
889 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
890 #include "rtl.def"
891 #undef DEF_RTL_EXPR
892   NUM_RTX_CODE
893 };
894 
895 static const char *const rtx_name[NUM_RTX_CODE] = {
896 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   NAME ,
897 #include "rtl.def"
898 #undef DEF_RTL_EXPR
899 };
900 
901 static const char *const rtx_format[NUM_RTX_CODE] = {
902 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   FORMAT ,
903 #include "rtl.def"
904 #undef DEF_RTL_EXPR
905 };
906 
907 static int rtx_next_new[NUM_RTX_CODE];
908 
909 /* We also need codes and names for insn notes (not register notes).
910    Note that we do *not* bias the note values here.  */
911 enum insn_note
912 {
913 #define DEF_INSN_NOTE(NAME) NAME,
914 #include "insn-notes.def"
915 #undef DEF_INSN_NOTE
916 
917   NOTE_INSN_MAX
918 };
919 
920 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
921    default field for line number notes.  */
922 static const char *const note_insn_name[NOTE_INSN_MAX + 1] = {
923 #define DEF_INSN_NOTE(NAME) #NAME,
924 #include "insn-notes.def"
925 #undef DEF_INSN_NOTE
926 };
927 
928 #undef CONST_DOUBLE_FORMAT
929 #define GENERATOR_FILE
930 
931 /* Generate the contents of the rtx_next array.  This really doesn't belong
932    in gengtype at all, but it's needed for adjust_field_rtx_def.  */
933 
934 static void
935 gen_rtx_next (void)
936 {
937   int i;
938   for (i = 0; i < NUM_RTX_CODE; i++)
939     {
940       int k;
941 
942       rtx_next_new[i] = -1;
943       if (strncmp (rtx_format[i], "iuu", 3) == 0)
944 	rtx_next_new[i] = 2;
945       else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
946 	rtx_next_new[i] = 1;
947       else
948 	for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
949 	  if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
950 	    rtx_next_new[i] = k;
951     }
952 }
953 
954 /* Write out the contents of the rtx_next array.  */
955 static void
956 write_rtx_next (void)
957 {
958   outf_p f = get_output_file_with_visibility (NULL);
959   int i;
960   if (!f)
961     return;
962 
963   oprintf (f, "\n/* Used to implement the RTX_NEXT macro.  */\n");
964   oprintf (f, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
965   for (i = 0; i < NUM_RTX_CODE; i++)
966     if (rtx_next_new[i] == -1)
967       oprintf (f, "  0,\n");
968     else
969       oprintf (f,
970 	       "  RTX_HDR_SIZE + %d * sizeof (rtunion),\n", rtx_next_new[i]);
971   oprintf (f, "};\n");
972 }
973 
974 /* Handle `special("rtx_def")'.  This is a special case for field
975    `fld' of struct rtx_def, which is an array of unions whose values
976    are based in a complex way on the type of RTL.  */
977 
978 static type_p
979 adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
980 {
981   pair_p flds = NULL;
982   options_p nodot;
983   int i;
984   type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
985   type_p basic_block_tp, reg_attrs_tp, constant_tp, symbol_union_tp;
986 
987   if (t->kind != TYPE_UNION)
988     {
989       error_at_line (&lexer_line,
990 		     "special `rtx_def' must be applied to a union");
991       return &string_type;
992     }
993 
994   nodot = create_string_option (NULL, "dot", "");
995 
996   rtx_tp = create_pointer (find_structure ("rtx_def", 0));
997   rtvec_tp = create_pointer (find_structure ("rtvec_def", 0));
998   tree_tp = create_pointer (find_structure ("tree_node", 1));
999   mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
1000   reg_attrs_tp =
1001     create_pointer (find_structure ("reg_attrs", 0));
1002   basic_block_tp =
1003     create_pointer (find_structure ("basic_block_def", 0));
1004   constant_tp =
1005     create_pointer (find_structure ("constant_descriptor_rtx", 0));
1006   scalar_tp = &scalar_nonchar;	/* rtunion int */
1007 
1008   {
1009     pair_p note_flds = NULL;
1010     int c;
1011 
1012     for (c = 0; c <= NOTE_INSN_MAX; c++)
1013       {
1014 	switch (c)
1015 	  {
1016 	  case NOTE_INSN_MAX:
1017 	  case NOTE_INSN_DELETED_LABEL:
1018 	  case NOTE_INSN_DELETED_DEBUG_LABEL:
1019 	    note_flds = create_field (note_flds, &string_type, "rt_str");
1020 	    break;
1021 
1022 	  case NOTE_INSN_BLOCK_BEG:
1023 	  case NOTE_INSN_BLOCK_END:
1024 	    note_flds = create_field (note_flds, tree_tp, "rt_tree");
1025 	    break;
1026 
1027 	  case NOTE_INSN_VAR_LOCATION:
1028 	  case NOTE_INSN_CALL_ARG_LOCATION:
1029 	    note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
1030 	    break;
1031 
1032 	  default:
1033 	    note_flds = create_field (note_flds, scalar_tp, "rt_int");
1034 	    break;
1035 	  }
1036 	/* NOTE_INSN_MAX is used as the default field for line
1037 	   number notes.  */
1038 	if (c == NOTE_INSN_MAX)
1039 	  note_flds->opt =
1040 	    create_string_option (nodot, "default", "");
1041 	else
1042 	  note_flds->opt =
1043 	    create_string_option (nodot, "tag", note_insn_name[c]);
1044       }
1045     note_union_tp = new_structure ("rtx_def_note_subunion", 1,
1046 				   &lexer_line, note_flds, NULL);
1047   }
1048   /* Create a type to represent the various forms of SYMBOL_REF_DATA.  */
1049   {
1050     pair_p sym_flds;
1051     sym_flds = create_field (NULL, tree_tp, "rt_tree");
1052     sym_flds->opt = create_string_option (nodot, "default", "");
1053     sym_flds = create_field (sym_flds, constant_tp, "rt_constant");
1054     sym_flds->opt = create_string_option (nodot, "tag", "1");
1055     symbol_union_tp = new_structure ("rtx_def_symbol_subunion", 1,
1056 				     &lexer_line, sym_flds, NULL);
1057   }
1058   for (i = 0; i < NUM_RTX_CODE; i++)
1059     {
1060       pair_p subfields = NULL;
1061       size_t aindex, nmindex;
1062       const char *sname;
1063       type_p substruct;
1064       char *ftag;
1065 
1066       for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
1067 	{
1068 	  type_p t;
1069 	  const char *subname;
1070 
1071 	  switch (rtx_format[i][aindex])
1072 	    {
1073 	    case '*':
1074 	    case 'i':
1075 	    case 'n':
1076 	    case 'w':
1077 	      t = scalar_tp;
1078 	      subname = "rt_int";
1079 	      break;
1080 
1081 	    case '0':
1082 	      if (i == MEM && aindex == 1)
1083 		t = mem_attrs_tp, subname = "rt_mem";
1084 	      else if (i == JUMP_INSN && aindex == 8)
1085 		t = rtx_tp, subname = "rt_rtx";
1086 	      else if (i == CODE_LABEL && aindex == 5)
1087 		t = scalar_tp, subname = "rt_int";
1088 	      else if (i == CODE_LABEL && aindex == 4)
1089 		t = rtx_tp, subname = "rt_rtx";
1090 	      else if (i == LABEL_REF && (aindex == 1 || aindex == 2))
1091 		t = rtx_tp, subname = "rt_rtx";
1092 	      else if (i == NOTE && aindex == 4)
1093 		t = note_union_tp, subname = "";
1094 	      else if (i == NOTE && aindex == 5)
1095 		t = scalar_tp, subname = "rt_int";
1096 	      else if (i == NOTE && aindex >= 7)
1097 		t = scalar_tp, subname = "rt_int";
1098 	      else if (i == ADDR_DIFF_VEC && aindex == 4)
1099 		t = scalar_tp, subname = "rt_int";
1100 	      else if (i == VALUE && aindex == 0)
1101 		t = scalar_tp, subname = "rt_int";
1102 	      else if (i == DEBUG_EXPR && aindex == 0)
1103 		t = tree_tp, subname = "rt_tree";
1104 	      else if (i == REG && aindex == 1)
1105 		t = scalar_tp, subname = "rt_int";
1106 	      else if (i == REG && aindex == 2)
1107 		t = reg_attrs_tp, subname = "rt_reg";
1108 	      else if (i == SCRATCH && aindex == 0)
1109 		t = scalar_tp, subname = "rt_int";
1110 	      else if (i == SYMBOL_REF && aindex == 1)
1111 		t = scalar_tp, subname = "rt_int";
1112 	      else if (i == SYMBOL_REF && aindex == 2)
1113 		t = symbol_union_tp, subname = "";
1114 	      else if (i == BARRIER && aindex >= 3)
1115 		t = scalar_tp, subname = "rt_int";
1116 	      else if (i == ENTRY_VALUE && aindex == 0)
1117 		t = rtx_tp, subname = "rt_rtx";
1118 	      else
1119 		{
1120 		  error_at_line
1121 		    (&lexer_line,
1122 		     "rtx type `%s' has `0' in position %lu, can't handle",
1123 		     rtx_name[i], (unsigned long) aindex);
1124 		  t = &string_type;
1125 		  subname = "rt_int";
1126 		}
1127 	      break;
1128 
1129 	    case 's':
1130 	    case 'S':
1131 	    case 'T':
1132 	      t = &string_type;
1133 	      subname = "rt_str";
1134 	      break;
1135 
1136 	    case 'e':
1137 	    case 'u':
1138 	      t = rtx_tp;
1139 	      subname = "rt_rtx";
1140 	      break;
1141 
1142 	    case 'E':
1143 	    case 'V':
1144 	      t = rtvec_tp;
1145 	      subname = "rt_rtvec";
1146 	      break;
1147 
1148 	    case 't':
1149 	      t = tree_tp;
1150 	      subname = "rt_tree";
1151 	      break;
1152 
1153 	    case 'B':
1154 	      t = basic_block_tp;
1155 	      subname = "rt_bb";
1156 	      break;
1157 
1158 	    default:
1159 	      error_at_line
1160 		(&lexer_line,
1161 		 "rtx type `%s' has `%c' in position %lu, can't handle",
1162 		 rtx_name[i], rtx_format[i][aindex],
1163 		 (unsigned long) aindex);
1164 	      t = &string_type;
1165 	      subname = "rt_int";
1166 	      break;
1167 	    }
1168 
1169 	  subfields = create_field (subfields, t,
1170 				    xasprintf (".fld[%lu].%s",
1171 					       (unsigned long) aindex,
1172 					       subname));
1173 	  subfields->opt = nodot;
1174 	  if (t == note_union_tp)
1175 	    subfields->opt =
1176 	      create_string_option (subfields->opt, "desc",
1177 				    "NOTE_KIND (&%0)");
1178 	  if (t == symbol_union_tp)
1179 	    subfields->opt =
1180 	      create_string_option (subfields->opt, "desc",
1181 				    "CONSTANT_POOL_ADDRESS_P (&%0)");
1182 	}
1183 
1184       if (i == SYMBOL_REF)
1185 	{
1186 	  /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P
1187 	     holds.  */
1188 	  type_p field_tp = find_structure ("block_symbol", 0);
1189 	  subfields
1190 	    = create_optional_field (subfields, field_tp, "block_sym",
1191 				     "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1192 	}
1193 
1194       sname = xasprintf ("rtx_def_%s", rtx_name[i]);
1195       substruct = new_structure (sname, 0, &lexer_line, subfields, NULL);
1196 
1197       ftag = xstrdup (rtx_name[i]);
1198       for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
1199 	ftag[nmindex] = TOUPPER (ftag[nmindex]);
1200       flds = create_field (flds, substruct, "");
1201       flds->opt = create_string_option (nodot, "tag", ftag);
1202     }
1203   return new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
1204 }
1205 
1206 /* Handle `special("tree_exp")'.  This is a special case for
1207    field `operands' of struct tree_exp, which although it claims to contain
1208    pointers to trees, actually sometimes contains pointers to RTL too.
1209    Passed T, the old type of the field, and OPT its options.  Returns
1210    a new type for the field.  */
1211 
1212 static type_p
1213 adjust_field_tree_exp (type_p t, options_p opt ATTRIBUTE_UNUSED)
1214 {
1215   pair_p flds;
1216   options_p nodot;
1217 
1218   if (t->kind != TYPE_ARRAY)
1219     {
1220       error_at_line (&lexer_line,
1221 		     "special `tree_exp' must be applied to an array");
1222       return &string_type;
1223     }
1224 
1225   nodot = create_string_option (NULL, "dot", "");
1226 
1227   flds = create_field (NULL, t, "");
1228   flds->opt = create_string_option (nodot, "length",
1229 				    "TREE_OPERAND_LENGTH ((tree) &%0)");
1230   flds->opt = create_string_option (flds->opt, "default", "");
1231 
1232   return new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
1233 }
1234 
1235 /* Perform any special processing on a type T, about to become the type
1236    of a field.  Return the appropriate type for the field.
1237    At present:
1238    - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1239    - Similarly for arrays of pointer-to-char;
1240    - Converts structures for which a parameter is provided to
1241      TYPE_PARAM_STRUCT;
1242    - Handles "special" options.
1243 */
1244 
1245 type_p
1246 adjust_field_type (type_p t, options_p opt)
1247 {
1248   int length_p = 0;
1249   const int pointer_p = t->kind == TYPE_POINTER;
1250   type_p params[NUM_PARAM];
1251   int params_p = 0;
1252   int i;
1253 
1254   for (i = 0; i < NUM_PARAM; i++)
1255     params[i] = NULL;
1256 
1257   for (; opt; opt = opt->next)
1258     if (strcmp (opt->name, "length") == 0)
1259       length_p = 1;
1260     else if ((strcmp (opt->name, "param_is") == 0
1261 	      || (strncmp (opt->name, "param", 5) == 0
1262 		  && ISDIGIT (opt->name[5])
1263 		  && strcmp (opt->name + 6, "_is") == 0))
1264 	     && opt->kind == OPTION_TYPE)
1265       {
1266 	int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
1267 
1268 	if (!UNION_OR_STRUCT_P (t)
1269 	    && (t->kind != TYPE_POINTER || !UNION_OR_STRUCT_P (t->u.p)))
1270 	  {
1271 	    error_at_line (&lexer_line,
1272 			   "option `%s' may only be applied to structures or structure pointers",
1273 			   opt->name);
1274 	    return t;
1275 	  }
1276 
1277 	params_p = 1;
1278 	if (params[num] != NULL)
1279 	  error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
1280 	if (!ISDIGIT (opt->name[5]))
1281 	  params[num] = create_pointer (opt->info.type);
1282 	else
1283 	  params[num] = opt->info.type;
1284       }
1285     else if (strcmp (opt->name, "special") == 0
1286 	     && opt->kind == OPTION_STRING)
1287       {
1288 	const char *special_name = opt->info.string;
1289 	if (strcmp (special_name, "tree_exp") == 0)
1290 	  t = adjust_field_tree_exp (t, opt);
1291 	else if (strcmp (special_name, "rtx_def") == 0)
1292 	  t = adjust_field_rtx_def (t, opt);
1293 	else
1294 	  error_at_line (&lexer_line, "unknown special `%s'", special_name);
1295       }
1296 
1297   if (params_p)
1298     {
1299       type_p realt;
1300 
1301       if (pointer_p)
1302 	t = t->u.p;
1303       realt = find_param_structure (t, params);
1304       t = pointer_p ? create_pointer (realt) : realt;
1305     }
1306 
1307   if (!length_p
1308       && pointer_p && t->u.p->kind == TYPE_SCALAR && t->u.p->u.scalar_is_char)
1309     return &string_type;
1310   if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
1311       && t->u.a.p->u.p->kind == TYPE_SCALAR
1312       && t->u.a.p->u.p->u.scalar_is_char)
1313     return create_array (&string_type, t->u.a.len);
1314 
1315   return t;
1316 }
1317 
1318 
1319 static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
1320 static void set_gc_used (pair_p);
1321 
1322 /* Handle OPT for set_gc_used_type.  */
1323 
1324 static void
1325 process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
1326 		    int *pass_param, int *length, int *skip,
1327 		    type_p *nested_ptr)
1328 {
1329   options_p o;
1330   for (o = opt; o; o = o->next)
1331     if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO
1332 	&& o->kind == OPTION_TYPE)
1333       set_gc_used_type (o->info.type,
1334 			GC_POINTED_TO, NULL);
1335     else if (strcmp (o->name, "maybe_undef") == 0)
1336       *maybe_undef = 1;
1337     else if (strcmp (o->name, "use_params") == 0)
1338       *pass_param = 1;
1339     else if (strcmp (o->name, "length") == 0)
1340       *length = 1;
1341     else if (strcmp (o->name, "skip") == 0)
1342       *skip = 1;
1343     else if (strcmp (o->name, "nested_ptr") == 0
1344 	     && o->kind == OPTION_NESTED)
1345       *nested_ptr = ((const struct nested_ptr_data *) o->info.nested)->type;
1346 }
1347 
1348 
1349 /* Set the gc_used field of T to LEVEL, and handle the types it references.  */
1350 static void
1351 set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
1352 {
1353   if (t->gc_used >= level)
1354     return;
1355 
1356   t->gc_used = level;
1357 
1358   switch (t->kind)
1359     {
1360     case TYPE_STRUCT:
1361     case TYPE_UNION:
1362       {
1363 	pair_p f;
1364 	int dummy;
1365 	type_p dummy2;
1366 
1367 	process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy,
1368 			    &dummy2);
1369 
1370 	for (f = t->u.s.fields; f; f = f->next)
1371 	  {
1372 	    int maybe_undef = 0;
1373 	    int pass_param = 0;
1374 	    int length = 0;
1375 	    int skip = 0;
1376 	    type_p nested_ptr = NULL;
1377 	    process_gc_options (f->opt, level, &maybe_undef, &pass_param,
1378 				&length, &skip, &nested_ptr);
1379 
1380 	    if (nested_ptr && f->type->kind == TYPE_POINTER)
1381 	      set_gc_used_type (nested_ptr, GC_POINTED_TO,
1382 				pass_param ? param : NULL);
1383 	    else if (length && f->type->kind == TYPE_POINTER)
1384 	      set_gc_used_type (f->type->u.p, GC_USED, NULL);
1385 	    else if (maybe_undef && f->type->kind == TYPE_POINTER)
1386 	      set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
1387 	    else if (pass_param && f->type->kind == TYPE_POINTER && param)
1388 	      set_gc_used_type (find_param_structure (f->type->u.p, param),
1389 				GC_POINTED_TO, NULL);
1390 	    else if (skip)
1391 	      ;			/* target type is not used through this field */
1392 	    else
1393 	      set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
1394 	  }
1395 	break;
1396       }
1397 
1398     case TYPE_POINTER:
1399       set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
1400       break;
1401 
1402     case TYPE_ARRAY:
1403       set_gc_used_type (t->u.a.p, GC_USED, param);
1404       break;
1405 
1406     case TYPE_LANG_STRUCT:
1407       for (t = t->u.s.lang_struct; t; t = t->next)
1408 	set_gc_used_type (t, level, param);
1409       break;
1410 
1411     case TYPE_PARAM_STRUCT:
1412       {
1413 	int i;
1414 	for (i = 0; i < NUM_PARAM; i++)
1415 	  if (t->u.param_struct.param[i] != 0)
1416 	    set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
1417       }
1418       if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
1419 	level = GC_POINTED_TO;
1420       else
1421 	level = GC_USED;
1422       t->u.param_struct.stru->gc_used = GC_UNUSED;
1423       set_gc_used_type (t->u.param_struct.stru, level,
1424 			t->u.param_struct.param);
1425       break;
1426 
1427     default:
1428       break;
1429     }
1430 }
1431 
1432 /* Set the gc_used fields of all the types pointed to by VARIABLES.  */
1433 
1434 static void
1435 set_gc_used (pair_p variables)
1436 {
1437   int nbvars = 0;
1438   pair_p p;
1439   for (p = variables; p; p = p->next)
1440     {
1441       set_gc_used_type (p->type, GC_USED, NULL);
1442       nbvars++;
1443     };
1444   if (verbosity_level >= 2)
1445     printf ("%s used %d GTY-ed variables\n", progname, nbvars);
1446 }
1447 
1448 /* File mapping routines.  For each input file, there is one output .c file
1449    (but some output files have many input files), and there is one .h file
1450    for the whole build.  */
1451 
1452 /* Output file handling.  */
1453 
1454 /* Create and return an outf_p for a new file for NAME, to be called
1455    ONAME.  */
1456 
1457 static outf_p
1458 create_file (const char *name, const char *oname)
1459 {
1460   static const char *const hdr[] = {
1461     "   Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.\n",
1462     "\n",
1463     "This file is part of GCC.\n",
1464     "\n",
1465     "GCC is free software; you can redistribute it and/or modify it under\n",
1466     "the terms of the GNU General Public License as published by the Free\n",
1467     "Software Foundation; either version 3, or (at your option) any later\n",
1468     "version.\n",
1469     "\n",
1470     "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1471     "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1472     "FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n",
1473     "for more details.\n",
1474     "\n",
1475     "You should have received a copy of the GNU General Public License\n",
1476     "along with GCC; see the file COPYING3.  If not see\n",
1477     "<http://www.gnu.org/licenses/>.  */\n",
1478     "\n",
1479     "/* This file is machine generated.  Do not edit.  */\n"
1480   };
1481   outf_p f;
1482   size_t i;
1483 
1484   gcc_assert (name != NULL);
1485   gcc_assert (oname != NULL);
1486   f = XCNEW (struct outf);
1487   f->next = output_files;
1488   f->name = oname;
1489   output_files = f;
1490 
1491   oprintf (f, "/* Type information for %s.\n", name);
1492   for (i = 0; i < ARRAY_SIZE (hdr); i++)
1493     oprintf (f, "%s", hdr[i]);
1494   return f;
1495 }
1496 
1497 /* Print, like fprintf, to O.
1498    N.B. You might think this could be implemented more efficiently
1499    with vsnprintf().  Unfortunately, there are C libraries that
1500    provide that function but without the C99 semantics for its return
1501    value, making it impossible to know how much space is required.  */
1502 void
1503 oprintf (outf_p o, const char *format, ...)
1504 {
1505   char *s;
1506   size_t slength;
1507   va_list ap;
1508 
1509   /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1510      in that case.  */
1511   if (!o)
1512     return;
1513 
1514   va_start (ap, format);
1515   slength = vasprintf (&s, format, ap);
1516   if (s == NULL || (int) slength < 0)
1517     fatal ("out of memory");
1518   va_end (ap);
1519 
1520   if (o->bufused + slength > o->buflength)
1521     {
1522       size_t new_len = o->buflength;
1523       if (new_len == 0)
1524 	new_len = 1024;
1525       do
1526 	{
1527 	  new_len *= 2;
1528 	}
1529       while (o->bufused + slength >= new_len);
1530       o->buf = XRESIZEVEC (char, o->buf, new_len);
1531       o->buflength = new_len;
1532     }
1533   memcpy (o->buf + o->bufused, s, slength);
1534   o->bufused += slength;
1535   free (s);
1536 }
1537 
1538 /* Open the global header file and the language-specific header files.  */
1539 
1540 static void
1541 open_base_files (void)
1542 {
1543   size_t i;
1544 
1545   if (nb_plugin_files > 0 && plugin_files)
1546     return;
1547 
1548   header_file = create_file ("GCC", "gtype-desc.h");
1549 
1550   base_files = XNEWVEC (outf_p, num_lang_dirs);
1551 
1552   for (i = 0; i < num_lang_dirs; i++)
1553     base_files[i] = create_file (lang_dir_names[i],
1554 				 xasprintf ("gtype-%s.h", lang_dir_names[i]));
1555 
1556   /* gtype-desc.c is a little special, so we create it here.  */
1557   {
1558     /* The order of files here matters very much.  */
1559     static const char *const ifiles[] = {
1560       "config.h", "system.h", "coretypes.h", "tm.h",
1561       "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1562       "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1563       "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1564       "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1565       "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1566       "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
1567       "target.h", "ipa-prop.h", "lto-streamer.h", "target-globals.h",
1568       "ipa-inline.h", "dwarf2out.h", NULL
1569     };
1570     const char *const *ifp;
1571     outf_p gtype_desc_c;
1572 
1573     gtype_desc_c = create_file ("GCC", "gtype-desc.c");
1574     for (ifp = ifiles; *ifp; ifp++)
1575       oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
1576 
1577     /* Make sure we handle "cfun" specially.  */
1578     oprintf (gtype_desc_c, "\n/* See definition in function.h.  */\n");
1579     oprintf (gtype_desc_c, "#undef cfun\n");
1580   }
1581 }
1582 
1583 /* For INPF an input file, return the real basename of INPF, with all
1584    the directory components skipped.  */
1585 
1586 static const char *
1587 get_file_realbasename (const input_file *inpf)
1588 {
1589   return lbasename (get_input_file_name (inpf));
1590 }
1591 
1592 /* For INPF a filename, return the relative path to INPF from
1593    $(srcdir) if the latter is a prefix in INPF, NULL otherwise.  */
1594 
1595 const char *
1596 get_file_srcdir_relative_path (const input_file *inpf)
1597 {
1598   const char *f = get_input_file_name (inpf);
1599   if (strlen (f) > srcdir_len
1600       && IS_DIR_SEPARATOR (f[srcdir_len])
1601       && strncmp (f, srcdir, srcdir_len) == 0)
1602     return f + srcdir_len + 1;
1603   else
1604     return NULL;
1605 }
1606 
1607 /*  For INPF an input_file, return the relative path to INPF from
1608     $(srcdir) if the latter is a prefix in INPF, or the real basename
1609     of INPF otherwise. */
1610 
1611 static const char *
1612 get_file_basename (const input_file *inpf)
1613 {
1614   const char *srcdir_path = get_file_srcdir_relative_path (inpf);
1615 
1616   return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (inpf);
1617 }
1618 
1619 /* For F a filename, return the lang_dir_names relative index of the language
1620    directory that is a prefix in F, if any, -1 otherwise.  */
1621 
1622 static int
1623 get_prefix_langdir_index (const char *f)
1624 {
1625   size_t f_len = strlen (f);
1626   size_t lang_index;
1627 
1628   for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
1629     {
1630       const char *langdir = lang_dir_names[lang_index];
1631       size_t langdir_len = strlen (langdir);
1632 
1633       if (f_len > langdir_len
1634 	  && IS_DIR_SEPARATOR (f[langdir_len])
1635 	  && memcmp (f, langdir, langdir_len) == 0)
1636 	return lang_index;
1637     }
1638 
1639   return -1;
1640 }
1641 
1642 /* For INPF an input file, return the name of language directory where
1643    F is located, if any, NULL otherwise.  */
1644 
1645 static const char *
1646 get_file_langdir (const input_file *inpf)
1647 {
1648   /* Get the relative path to INPF from $(srcdir) and find the
1649      language by comparing the prefix with language directory names.
1650      If INPF is not even srcdir relative, no point in looking
1651      further.  */
1652 
1653   int lang_index;
1654   const char *srcdir_relative_path = get_file_srcdir_relative_path (inpf);
1655   const char *r;
1656 
1657   if (!srcdir_relative_path)
1658     return NULL;
1659 
1660   lang_index = get_prefix_langdir_index (srcdir_relative_path);
1661   if (lang_index < 0 && strncmp (srcdir_relative_path, "c-family", 8) == 0)
1662     r = "c-family";
1663   else if (lang_index >= 0)
1664     r = lang_dir_names[lang_index];
1665   else
1666     r = NULL;
1667 
1668   return r;
1669 }
1670 
1671 /* The gt- output file name for INPF.  */
1672 
1673 static const char *
1674 get_file_gtfilename (const input_file *inpf)
1675 {
1676   /* Cook up an initial version of the gt- file name from the file real
1677      basename and the language name, if any.  */
1678 
1679   const char *basename = get_file_realbasename (inpf);
1680   const char *langdir = get_file_langdir (inpf);
1681 
1682   char *result =
1683     (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
1684      : xasprintf ("gt-%s", basename));
1685 
1686   /* Then replace all non alphanumerics characters by '-' and change the
1687      extension to ".h".  We expect the input filename extension was at least
1688      one character long.  */
1689 
1690   char *s = result;
1691 
1692   for (; *s != '.'; s++)
1693     if (!ISALNUM (*s) && *s != '-')
1694       *s = '-';
1695 
1696   memcpy (s, ".h", sizeof (".h"));
1697 
1698   return result;
1699 }
1700 
1701 /* Each input_file has its associated output file outf_p.  The
1702    association is computed by the function
1703    get_output_file_with_visibility.  The associated file is cached
1704    inside input_file in its inpoutf field, so is really computed only
1705    once.  Associated output file paths (i.e. output_name-s) are
1706    computed by a rule based regexp machinery, using the files_rules
1707    array of struct file_rule_st.  A for_name is also computed, giving
1708    the source file name for which the output_file is generated; it is
1709    often the last component of the input_file path.  */
1710 
1711 
1712 /*
1713  Regexpr machinery to compute the output_name and for_name-s of each
1714  input_file.  We have a sequence of file rules which gives the POSIX
1715  extended regular expression to match an input file path, and two
1716  transformed strings for the corresponding output_name and the
1717  corresponding for_name.  The transformed string contain dollars: $0
1718  is replaced by the entire match, $1 is replaced by the substring
1719  matching the first parenthesis in the regexp, etc.  And $$ is replaced
1720  by a single verbatim dollar.  The rule order is important.  The
1721  general case is last, and the particular cases should come before.
1722  An action routine can, when needed, update the out_name & for_name
1723  and/or return the appropriate output file.  It is invoked only when a
1724  rule is triggered.  When a rule is triggered, the output_name and
1725  for_name are computed using their transform string in while $$, $0,
1726  $1, ... are suitably replaced.  If there is an action, it is called.
1727  In some few cases, the action can directly return the outf_p, but
1728  usually it just updates the output_name and for_name so should free
1729  them before replacing them.  The get_output_file_with_visibility
1730  function creates an outf_p only once per each output_name, so it
1731  scans the output_files list for previously seen output file names.
1732  */
1733 
1734 /* Signature of actions in file rules.  */
1735 typedef outf_p (frul_actionrout_t) (input_file*, char**, char**);
1736 
1737 
1738 struct file_rule_st {
1739   const char* frul_srcexpr;	/* Source string for regexp.  */
1740   int frul_rflags;		/* Flags passed to regcomp, usually
1741 				 * REG_EXTENDED.  */
1742   regex_t* frul_re;		/* Compiled regular expression
1743 				   obtained by regcomp.  */
1744   const char* frul_tr_out;	/* Transformation string for making
1745 				 * the output_name, with $1 ... $9 for
1746 				 * subpatterns and $0 for the whole
1747 				 * matched filename.  */
1748   const char* frul_tr_for;	/* Tranformation string for making the
1749 				   for_name.  */
1750   frul_actionrout_t* frul_action; /* The action, if non null, is
1751 				   * called once the rule matches, on
1752 				   * the transformed out_name &
1753 				   * for_name.  It could change them
1754 				   * and/or give the output file.  */
1755 };
1756 
1757 /* File rule action handling *.h files.  */
1758 static outf_p header_dot_h_frul (input_file*, char**, char**);
1759 
1760 /* File rule action handling *.c files.  */
1761 static outf_p source_dot_c_frul (input_file*, char**, char**);
1762 
1763 #define NULL_REGEX (regex_t*)0
1764 
1765 /* The prefix in our regexp-s matching the directory.  */
1766 #define DIR_PREFIX_REGEX "^(([^/]*/)*)"
1767 
1768 #define NULL_FRULACT (frul_actionrout_t*)0
1769 
1770 /* The array of our rules governing file name generation.  Rules order
1771    matters, so change with extreme care!  */
1772 
1773 struct file_rule_st files_rules[] = {
1774   /* The general rule assumes that files in subdirectories belong to a
1775      particular front-end, and files not in subdirectories are shared.
1776      The following rules deal with exceptions - files that are in
1777      subdirectories and yet are shared, and files that are top-level,
1778      but are not shared.  */
1779 
1780   /* the c-family/ source directory is special.  */
1781   { DIR_PREFIX_REGEX "c-family/([[:alnum:]_-]*)\\.c$",
1782     REG_EXTENDED, NULL_REGEX,
1783     "gt-c-family-$3.h", "c-family/$3.c", NULL_FRULACT},
1784 
1785   { DIR_PREFIX_REGEX "c-family/([[:alnum:]_-]*)\\.h$",
1786     REG_EXTENDED, NULL_REGEX,
1787     "gt-c-family-$3.h", "c-family/$3.h", NULL_FRULACT},
1788 
1789   /* Both c-lang.h & c-tree.h gives gt-c-decl.h for c-decl.c !  */
1790   { DIR_PREFIX_REGEX "c-lang\\.h$",
1791     REG_EXTENDED, NULL_REGEX, "gt-c-decl.h", "c-decl.c", NULL_FRULACT},
1792 
1793   { DIR_PREFIX_REGEX "c-tree\\.h$",
1794     REG_EXTENDED, NULL_REGEX, "gt-c-decl.h", "c-decl.c", NULL_FRULACT},
1795 
1796   /* cp/cp-tree.h gives gt-cp-tree.h for cp/tree.c !  */
1797   { DIR_PREFIX_REGEX "cp/cp-tree\\.h$",
1798     REG_EXTENDED, NULL_REGEX,
1799     "gt-cp-tree.h", "cp/tree.c", NULL_FRULACT },
1800 
1801   /* cp/decl.h & cp/decl.c gives gt-cp-decl.h for cp/decl.c !  */
1802   { DIR_PREFIX_REGEX "cp/decl\\.[ch]$",
1803     REG_EXTENDED, NULL_REGEX,
1804     "gt-cp-decl.h", "cp/decl.c", NULL_FRULACT },
1805 
1806   /* cp/name-lookup.h gives gt-cp-name-lookup.h for cp/name-lookup.c !  */
1807   { DIR_PREFIX_REGEX "cp/name-lookup\\.h$",
1808     REG_EXTENDED, NULL_REGEX,
1809     "gt-cp-name-lookup.h", "cp/name-lookup.c", NULL_FRULACT },
1810 
1811   /* cp/parser.h gives gt-cp-parser.h for cp/parser.c !  */
1812   { DIR_PREFIX_REGEX "cp/parser\\.h$",
1813     REG_EXTENDED, NULL_REGEX,
1814     "gt-cp-parser.h", "cp/parser.c", NULL_FRULACT },
1815 
1816   /* objc/objc-act.h gives gt-objc-objc-act.h for objc/objc-act.c !  */
1817   { DIR_PREFIX_REGEX "objc/objc-act\\.h$",
1818     REG_EXTENDED, NULL_REGEX,
1819     "gt-objc-objc-act.h", "objc/objc-act.c", NULL_FRULACT },
1820 
1821   /* objc/objc-map.h gives gt-objc-objc-map.h for objc/objc-map.c !  */
1822   { DIR_PREFIX_REGEX "objc/objc-map\\.h$",
1823     REG_EXTENDED, NULL_REGEX,
1824     "gt-objc-objc-map.h", "objc/objc-map.c", NULL_FRULACT },
1825 
1826   /* General cases.  For header *.h and source *.c files, we need
1827    * special actions to handle the language.  */
1828 
1829   /* Source *.c files are using get_file_gtfilename to compute their
1830      output_name and get_file_basename to compute their for_name
1831      thru the source_dot_c_frul action.  */
1832   { DIR_PREFIX_REGEX "([[:alnum:]_-]*)\\.c$",
1833     REG_EXTENDED, NULL_REGEX, "gt-$3.h", "$3.c", source_dot_c_frul},
1834   /* Common header files get "gtype-desc.c" as their output_name,
1835    * while language specific header files are handled specially.  So
1836    * we need the header_dot_h_frul action.  */
1837   { DIR_PREFIX_REGEX "([[:alnum:]_-]*)\\.h$",
1838     REG_EXTENDED, NULL_REGEX, "gt-$3.h", "$3.h", header_dot_h_frul},
1839 
1840   { DIR_PREFIX_REGEX "([[:alnum:]_-]*)\\.in$",
1841     REG_EXTENDED, NULL_REGEX, "gt-$3.h", "$3.in", NULL_FRULACT},
1842 
1843   /* Mandatory null last entry signaling end of rules.  */
1844   {NULL, 0, NULL_REGEX, NULL, NULL, NULL_FRULACT}
1845 };
1846 
1847 /* Special file rules action for handling *.h header files.  It gives
1848    "gtype-desc.c" for common headers and corresponding output
1849    files for language-specific header files.  */
1850 static outf_p
1851 header_dot_h_frul (input_file* inpf, char**poutname,
1852 		   char**pforname ATTRIBUTE_UNUSED)
1853 {
1854   const char *basename = 0;
1855   int lang_index = 0;
1856   DBGPRINTF ("inpf %p inpname %s outname %s forname %s",
1857 	     (void*) inpf, get_input_file_name (inpf),
1858 	     *poutname, *pforname);
1859   basename = get_file_basename (inpf);
1860   lang_index = get_prefix_langdir_index (basename);
1861   DBGPRINTF ("basename %s lang_index %d", basename, lang_index);
1862 
1863   if (lang_index >= 0)
1864     {
1865       /* The header is language specific.  Given output_name &
1866 	 for_name remains unchanged.  The base_files array gives the
1867 	 outf_p.  */
1868       DBGPRINTF ("header_dot_h found language specific @ %p '%s'",
1869 		 (void*) base_files[lang_index],
1870 		 (base_files[lang_index])->name);
1871       return base_files[lang_index];
1872     }
1873   else
1874     {
1875       /* The header is common to all front-end languages.  So
1876 	 output_name is "gtype-desc.c" file.  The calling function
1877 	 get_output_file_with_visibility will find its outf_p.  */
1878       free (*poutname);
1879       *poutname = xstrdup ("gtype-desc.c");
1880       DBGPRINTF ("special 'gtype-desc.c' for inpname %s",
1881 		 get_input_file_name (inpf));
1882       return NULL;
1883     }
1884 }
1885 
1886 
1887 /* Special file rules action for handling *.c source files using
1888  * get_file_gtfilename to compute their output_name and
1889  * get_file_basename to compute their for_name.  The output_name is
1890  * gt-<LANG>-<BASE>.h for language specific source files, and
1891  * gt-<BASE>.h for common source files.  */
1892 static outf_p
1893 source_dot_c_frul (input_file* inpf, char**poutname, char**pforname)
1894 {
1895   char *newbasename = CONST_CAST (char*, get_file_basename (inpf));
1896   char *newoutname = CONST_CAST (char*, get_file_gtfilename (inpf));
1897   DBGPRINTF ("inpf %p inpname %s original outname %s forname %s",
1898 	     (void*) inpf, get_input_file_name (inpf),
1899 	     *poutname, *pforname);
1900   DBGPRINTF ("newoutname %s", newoutname);
1901   DBGPRINTF ("newbasename %s", newbasename);
1902   free (*poutname);
1903   free (*pforname);
1904   *poutname = newoutname;
1905   *pforname = newbasename;
1906   return NULL;
1907 }
1908 
1909 /* Utility function for get_output_file_with_visibility which returns
1910  * a malloc-ed substituted string using TRS on matching of the FILNAM
1911  * file name, using the PMATCH array.  */
1912 static char*
1913 matching_file_name_substitute (const char *filnam, regmatch_t pmatch[10],
1914 			       const char *trs)
1915 {
1916   struct obstack str_obstack;
1917   char *str = NULL;
1918   char *rawstr = NULL;
1919   const char *pt = NULL;
1920   DBGPRINTF ("filnam %s", filnam);
1921   obstack_init (&str_obstack);
1922   for (pt = trs; *pt; pt++) {
1923     char c = *pt;
1924     if (c == '$')
1925       {
1926 	if (pt[1] == '$')
1927 	  {
1928 	    /* A double dollar $$ is substituted by a single verbatim
1929 	       dollar, but who really uses dollar signs in file
1930 	       paths? */
1931 	    obstack_1grow (&str_obstack, '$');
1932 	  }
1933 	else if (ISDIGIT (pt[1]))
1934 	  {
1935 	    /* Handle $0 $1 ... $9 by appropriate substitution.  */
1936 	    int dolnum = pt[1] - '0';
1937 	    int so = pmatch[dolnum].rm_so;
1938 	    int eo = pmatch[dolnum].rm_eo;
1939 	    DBGPRINTF ("so=%d eo=%d dolnum=%d", so, eo, dolnum);
1940 	    if (so>=0 && eo>=so)
1941 	      obstack_grow (&str_obstack, filnam + so, eo - so);
1942 	  }
1943 	else
1944 	  {
1945 	    /* This can happen only when files_rules is buggy! */
1946 	    gcc_unreachable();
1947 	  }
1948 	/* Always skip the character after the dollar.  */
1949 	pt++;
1950       }
1951     else
1952       obstack_1grow (&str_obstack, c);
1953   }
1954   obstack_1grow (&str_obstack, '\0');
1955   rawstr = XOBFINISH (&str_obstack, char *);
1956   str = xstrdup (rawstr);
1957   obstack_free (&str_obstack, NULL);
1958   DBGPRINTF ("matched replacement %s", str);
1959   rawstr = NULL;
1960   return str;
1961 }
1962 
1963 
1964 /* An output file, suitable for definitions, that can see declarations
1965    made in INPF and is linked into every language that uses INPF.
1966    Since the result is cached inside INPF, that argument cannot be
1967    declared constant, but is "almost" constant. */
1968 
1969 outf_p
1970 get_output_file_with_visibility (input_file *inpf)
1971 {
1972   outf_p r;
1973   char *for_name = NULL;
1974   char *output_name = NULL;
1975   const char* inpfname;
1976 
1977   /* This can happen when we need a file with visibility on a
1978      structure that we've never seen.  We have to just hope that it's
1979      globally visible.  */
1980   if (inpf == NULL)
1981     inpf = system_h_file;
1982 
1983   /* The result is cached in INPF, so return it if already known.  */
1984   if (inpf->inpoutf)
1985     return inpf->inpoutf;
1986 
1987   /* In plugin mode, return NULL unless the input_file is one of the
1988      plugin_files.  */
1989   if (plugin_files)
1990     {
1991       size_t i;
1992       for (i = 0; i < nb_plugin_files; i++)
1993 	if (inpf == plugin_files[i])
1994 	  {
1995 	    inpf->inpoutf = plugin_output;
1996 	    return plugin_output;
1997 	  }
1998 
1999       return NULL;
2000     }
2001 
2002   inpfname = get_input_file_name (inpf);
2003 
2004   /* Try each rule in sequence in files_rules until one is triggered. */
2005   {
2006     int rulix = 0;
2007     DBGPRINTF ("passing input file @ %p named %s thru the files_rules",
2008 	       (void*) inpf, inpfname);
2009 
2010     for (; files_rules[rulix].frul_srcexpr != NULL; rulix++)
2011       {
2012 	DBGPRINTF ("rulix#%d srcexpr %s",
2013 		   rulix, files_rules[rulix].frul_srcexpr);
2014 
2015 	if (!files_rules[rulix].frul_re)
2016 	  {
2017 	    /* Compile the regexpr lazily.  */
2018 	    int err = 0;
2019 	    files_rules[rulix].frul_re = XCNEW (regex_t);
2020 	    err = regcomp (files_rules[rulix].frul_re,
2021 			   files_rules[rulix].frul_srcexpr,
2022 			   files_rules[rulix].frul_rflags);
2023 	    if (err)
2024 	      {
2025 		/* The regular expression compilation fails only when
2026 		   file_rules is buggy.  */
2027 		gcc_unreachable ();
2028 	      }
2029 	  }
2030 
2031 	output_name = NULL;
2032 	for_name = NULL;
2033 
2034 	/* Match the regexpr and trigger the rule if matched.  */
2035 	{
2036 	  /* We have exactly ten pmatch-s, one for each $0, $1, $2,
2037 	     $3, ... $9.  */
2038 	  regmatch_t pmatch[10];
2039 	  memset (pmatch, 0, sizeof (pmatch));
2040 	  if (!regexec (files_rules[rulix].frul_re,
2041 			inpfname, 10, pmatch, 0))
2042 	    {
2043 	      DBGPRINTF ("input @ %p filename %s matched rulix#%d pattern %s",
2044 			 (void*) inpf, inpfname, rulix,
2045 			 files_rules[rulix].frul_srcexpr);
2046 	      for_name =
2047 		matching_file_name_substitute (inpfname, pmatch,
2048 					       files_rules[rulix].frul_tr_for);
2049 	      DBGPRINTF ("for_name %s", for_name);
2050 	      output_name =
2051 		matching_file_name_substitute (inpfname, pmatch,
2052 					       files_rules[rulix].frul_tr_out);
2053 	      DBGPRINTF ("output_name %s", output_name);
2054 	      if (files_rules[rulix].frul_action)
2055 		{
2056 		  /* Invoke our action routine.  */
2057 		  outf_p of = NULL;
2058 		  DBGPRINTF ("before action rulix#%d output_name %s for_name %s",
2059 			     rulix, output_name, for_name);
2060 		  of =
2061 		    (files_rules[rulix].frul_action) (inpf,
2062 						      &output_name, &for_name);
2063 		  DBGPRINTF ("after action rulix#%d of=%p output_name %s for_name %s",
2064 			     rulix, (void*)of, output_name, for_name);
2065 		  /* If the action routine returned something, give it back
2066 		     immediately and cache it in inpf.  */
2067 		  if (of)
2068 		    {
2069 		      inpf->inpoutf = of;
2070 		      return of;
2071 		    }
2072 		}
2073 	      /* The rule matched, and had no action, or that action did
2074 		 not return any output file but could have changed the
2075 		 output_name or for_name.  We break out of the loop on the
2076 		 files_rules.  */
2077 	      break;
2078 	    }
2079 	  else
2080 	    {
2081 	      /* The regexpr did not match.  */
2082 	      DBGPRINTF ("rulix#%d did not match %s pattern %s",
2083 			 rulix, inpfname, files_rules[rulix].frul_srcexpr);
2084 	      continue;
2085 	    }
2086 	}
2087       }
2088   }
2089   if (!output_name || !for_name)
2090     {
2091       /* This is impossible, and could only happen if the files_rules is
2092 	 incomplete or buggy.  */
2093       gcc_unreachable ();
2094     }
2095 
2096   /* Look through to see if we've ever seen this output filename
2097      before.  If found, cache the result in inpf.  */
2098   for (r = output_files; r; r = r->next)
2099     if (filename_cmp (r->name, output_name) == 0)
2100       {
2101 	inpf->inpoutf = r;
2102 	DBGPRINTF ("found r @ %p for output_name %s for_name %s", (void*)r,
2103 		   output_name, for_name);
2104 	return r;
2105       }
2106 
2107   /* If not found, create it, and cache it in inpf.  */
2108   r = create_file (for_name, output_name);
2109 
2110   gcc_assert (r && r->name);
2111   DBGPRINTF ("created r @ %p for output_name %s for_name %s", (void*) r,
2112 	     output_name, for_name);
2113   inpf->inpoutf = r;
2114   return r;
2115 
2116 
2117 }
2118 
2119 /* The name of an output file, suitable for definitions, that can see
2120    declarations made in INPF and is linked into every language that
2121    uses INPF.  */
2122 
2123 const char *
2124 get_output_file_name (input_file* inpf)
2125 {
2126   outf_p o = get_output_file_with_visibility (inpf);
2127   if (o)
2128     return o->name;
2129   return NULL;
2130 }
2131 
2132 /* Check if existing file is equal to the in memory buffer. */
2133 
2134 static bool
2135 is_file_equal (outf_p of)
2136 {
2137   FILE *newfile = fopen (of->name, "r");
2138   size_t i;
2139   bool equal;
2140   if (newfile == NULL)
2141     return false;
2142 
2143   equal = true;
2144   for (i = 0; i < of->bufused; i++)
2145     {
2146       int ch;
2147       ch = fgetc (newfile);
2148       if (ch == EOF || ch != (unsigned char) of->buf[i])
2149 	{
2150 	  equal = false;
2151 	  break;
2152 	}
2153     }
2154   fclose (newfile);
2155   return equal;
2156 }
2157 
2158 /* Copy the output to its final destination,
2159    but don't unnecessarily change modification times.  */
2160 
2161 static void
2162 close_output_files (void)
2163 {
2164   int nbwrittenfiles = 0;
2165   outf_p of;
2166 
2167   for (of = output_files; of; of = of->next)
2168     {
2169 
2170       if (!is_file_equal (of))
2171 	{
2172 	  FILE *newfile = NULL;
2173 	  char *backupname = NULL;
2174 	  /* Back up the old version of the output file gt-FOO.c as
2175 	     BACKUPDIR/gt-FOO.c~ if we have a backup directory.  */
2176 	  if (backup_dir)
2177 	    {
2178 	      backupname = concat (backup_dir, "/",
2179 				   lbasename (of->name), "~", NULL);
2180 	      if (!access (of->name, F_OK) && rename (of->name, backupname))
2181 		fatal ("failed to back up %s as %s: %s",
2182 		       of->name, backupname, xstrerror (errno));
2183 	    }
2184 
2185 	  newfile = fopen (of->name, "w");
2186 	  if (newfile == NULL)
2187 	    fatal ("opening output file %s: %s", of->name, xstrerror (errno));
2188 	  if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
2189 	    fatal ("writing output file %s: %s", of->name, xstrerror (errno));
2190 	  if (fclose (newfile) != 0)
2191 	    fatal ("closing output file %s: %s", of->name, xstrerror (errno));
2192 	  nbwrittenfiles++;
2193 	  if (verbosity_level >= 2 && backupname)
2194 	    printf ("%s wrote #%-3d %s backed-up in %s\n",
2195 		    progname, nbwrittenfiles, of->name, backupname);
2196 	  else if (verbosity_level >= 1)
2197 	    printf ("%s write #%-3d %s\n", progname, nbwrittenfiles, of->name);
2198 	  free (backupname);
2199 	}
2200       else
2201 	{
2202 	  /* output file remains unchanged. */
2203 	  if (verbosity_level >= 2)
2204 	    printf ("%s keep %s\n", progname, of->name);
2205 	}
2206       free (of->buf);
2207       of->buf = NULL;
2208       of->bufused = of->buflength = 0;
2209     }
2210   if (verbosity_level >= 1)
2211     printf ("%s wrote %d files.\n", progname, nbwrittenfiles);
2212 }
2213 
2214 struct flist
2215 {
2216   struct flist *next;
2217   int started_p;
2218   const input_file* file;
2219   outf_p f;
2220 };
2221 
2222 struct walk_type_data;
2223 
2224 /* For scalars and strings, given the item in 'val'.
2225    For structures, given a pointer to the item in 'val'.
2226    For misc. pointers, given the item in 'val'.
2227 */
2228 typedef void (*process_field_fn) (type_p f, const struct walk_type_data * p);
2229 typedef void (*func_name_fn) (type_p s, const struct walk_type_data * p);
2230 
2231 /* Parameters for write_types.  */
2232 
2233 struct write_types_data
2234 {
2235   const char *prefix;
2236   const char *param_prefix;
2237   const char *subfield_marker_routine;
2238   const char *marker_routine;
2239   const char *reorder_note_routine;
2240   const char *comment;
2241   int skip_hooks;		/* skip hook generation if non zero */
2242 };
2243 
2244 static void output_escaped_param (struct walk_type_data *d,
2245 				  const char *, const char *);
2246 static void output_mangled_typename (outf_p, const_type_p);
2247 static void walk_type (type_p t, struct walk_type_data *d);
2248 static void write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2249 				      const struct write_types_data *wtd);
2250 static void write_types_process_field
2251   (type_p f, const struct walk_type_data *d);
2252 static void write_types (outf_p output_header,
2253 			 type_p structures,
2254 			 type_p param_structs,
2255 			 const struct write_types_data *wtd);
2256 static void write_types_local_process_field
2257   (type_p f, const struct walk_type_data *d);
2258 static void write_local_func_for_structure
2259   (const_type_p orig_s, type_p s, type_p *param);
2260 static void write_local (outf_p output_header,
2261 			 type_p structures, type_p param_structs);
2262 static void write_enum_defn (type_p structures, type_p param_structs);
2263 static int contains_scalar_p (type_p t);
2264 static void put_mangled_filename (outf_p, const input_file *);
2265 static void finish_root_table (struct flist *flp, const char *pfx,
2266 			       const char *tname, const char *lastname,
2267 			       const char *name);
2268 static void write_root (outf_p, pair_p, type_p, const char *, int,
2269 			struct fileloc *, const char *, bool);
2270 static void write_array (outf_p f, pair_p v,
2271 			 const struct write_types_data *wtd);
2272 static void write_roots (pair_p, bool);
2273 
2274 /* Parameters for walk_type.  */
2275 
2276 struct walk_type_data
2277 {
2278   process_field_fn process_field;
2279   const void *cookie;
2280   outf_p of;
2281   options_p opt;
2282   const char *val;
2283   const char *prev_val[4];
2284   int indent;
2285   int counter;
2286   const struct fileloc *line;
2287   lang_bitmap bitmap;
2288   type_p *param;
2289   int used_length;
2290   type_p orig_s;
2291   const char *reorder_fn;
2292   bool needs_cast_p;
2293   bool fn_wants_lvalue;
2294 };
2295 
2296 /* Print a mangled name representing T to OF.  */
2297 
2298 static void
2299 output_mangled_typename (outf_p of, const_type_p t)
2300 {
2301   if (t == NULL)
2302     oprintf (of, "Z");
2303   else
2304     switch (t->kind)
2305       {
2306       case TYPE_NONE:
2307 	gcc_unreachable ();
2308 	break;
2309       case TYPE_POINTER:
2310 	oprintf (of, "P");
2311 	output_mangled_typename (of, t->u.p);
2312 	break;
2313       case TYPE_SCALAR:
2314 	oprintf (of, "I");
2315 	break;
2316       case TYPE_STRING:
2317 	oprintf (of, "S");
2318 	break;
2319       case TYPE_STRUCT:
2320       case TYPE_UNION:
2321       case TYPE_LANG_STRUCT:
2322 	oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag),
2323 		 t->u.s.tag);
2324 	break;
2325       case TYPE_PARAM_STRUCT:
2326 	{
2327 	  int i;
2328 	  for (i = 0; i < NUM_PARAM; i++)
2329 	    if (t->u.param_struct.param[i] != NULL)
2330 	      output_mangled_typename (of, t->u.param_struct.param[i]);
2331 	  output_mangled_typename (of, t->u.param_struct.stru);
2332 	}
2333 	break;
2334       case TYPE_ARRAY:
2335 	gcc_unreachable ();
2336       }
2337 }
2338 
2339 /* Print PARAM to D->OF processing escapes.  D->VAL references the
2340    current object, D->PREV_VAL the object containing the current
2341    object, ONAME is the name of the option and D->LINE is used to
2342    print error messages.  */
2343 
2344 static void
2345 output_escaped_param (struct walk_type_data *d, const char *param,
2346 		      const char *oname)
2347 {
2348   const char *p;
2349 
2350   for (p = param; *p; p++)
2351     if (*p != '%')
2352       oprintf (d->of, "%c", *p);
2353     else
2354       switch (*++p)
2355 	{
2356 	case 'h':
2357 	  oprintf (d->of, "(%s)", d->prev_val[2]);
2358 	  break;
2359 	case '0':
2360 	  oprintf (d->of, "(%s)", d->prev_val[0]);
2361 	  break;
2362 	case '1':
2363 	  oprintf (d->of, "(%s)", d->prev_val[1]);
2364 	  break;
2365 	case 'a':
2366 	  {
2367 	    const char *pp = d->val + strlen (d->val);
2368 	    while (pp[-1] == ']')
2369 	      while (*pp != '[')
2370 		pp--;
2371 	    oprintf (d->of, "%s", pp);
2372 	  }
2373 	  break;
2374 	default:
2375 	  error_at_line (d->line, "`%s' option contains bad escape %c%c",
2376 			 oname, '%', *p);
2377 	}
2378 }
2379 
2380 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2381    which is of type T.  Write code to D->OF to constrain execution (at
2382    the point that D->PROCESS_FIELD is called) to the appropriate
2383    cases.  Call D->PROCESS_FIELD on subobjects before calling it on
2384    pointers to those objects.  D->PREV_VAL lists the objects
2385    containing the current object, D->OPT is a list of options to
2386    apply, D->INDENT is the current indentation level, D->LINE is used
2387    to print error messages, D->BITMAP indicates which languages to
2388    print the structure for, and D->PARAM is the current parameter
2389    (from an enclosing param_is option).  */
2390 
2391 static void
2392 walk_type (type_p t, struct walk_type_data *d)
2393 {
2394   const char *length = NULL;
2395   const char *desc = NULL;
2396   int maybe_undef_p = 0;
2397   int use_param_num = -1;
2398   int use_params_p = 0;
2399   int atomic_p = 0;
2400   options_p oo;
2401   const struct nested_ptr_data *nested_ptr_d = NULL;
2402 
2403   d->needs_cast_p = false;
2404   for (oo = d->opt; oo; oo = oo->next)
2405     if (strcmp (oo->name, "length") == 0 && oo->kind == OPTION_STRING)
2406       length = oo->info.string;
2407     else if (strcmp (oo->name, "maybe_undef") == 0)
2408       maybe_undef_p = 1;
2409     else if (strncmp (oo->name, "use_param", 9) == 0
2410 	     && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2411       use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
2412     else if (strcmp (oo->name, "use_params") == 0)
2413       use_params_p = 1;
2414     else if (strcmp (oo->name, "desc") == 0 && oo->kind == OPTION_STRING)
2415       desc = oo->info.string;
2416     else if (strcmp (oo->name, "mark_hook") == 0)
2417       ;
2418     else if (strcmp (oo->name, "nested_ptr") == 0
2419 	     && oo->kind == OPTION_NESTED)
2420       nested_ptr_d = (const struct nested_ptr_data *) oo->info.nested;
2421     else if (strcmp (oo->name, "dot") == 0)
2422       ;
2423     else if (strcmp (oo->name, "tag") == 0)
2424       ;
2425     else if (strcmp (oo->name, "special") == 0)
2426       ;
2427     else if (strcmp (oo->name, "skip") == 0)
2428       ;
2429     else if (strcmp (oo->name, "atomic") == 0)
2430       atomic_p = 1;
2431     else if (strcmp (oo->name, "default") == 0)
2432       ;
2433     else if (strcmp (oo->name, "param_is") == 0)
2434       ;
2435     else if (strncmp (oo->name, "param", 5) == 0
2436 	     && ISDIGIT (oo->name[5]) && strcmp (oo->name + 6, "_is") == 0)
2437       ;
2438     else if (strcmp (oo->name, "chain_next") == 0)
2439       ;
2440     else if (strcmp (oo->name, "chain_prev") == 0)
2441       ;
2442     else if (strcmp (oo->name, "chain_circular") == 0)
2443       ;
2444     else if (strcmp (oo->name, "reorder") == 0)
2445       ;
2446     else if (strcmp (oo->name, "variable_size") == 0)
2447       ;
2448     else
2449       error_at_line (d->line, "unknown option `%s'\n", oo->name);
2450 
2451   if (d->used_length)
2452     length = NULL;
2453 
2454   if (use_params_p)
2455     {
2456       int pointer_p = t->kind == TYPE_POINTER;
2457 
2458       if (pointer_p)
2459 	t = t->u.p;
2460       if (!UNION_OR_STRUCT_P (t))
2461 	error_at_line (d->line, "`use_params' option on unimplemented type");
2462       else
2463 	t = find_param_structure (t, d->param);
2464       if (pointer_p)
2465 	t = create_pointer (t);
2466     }
2467 
2468   if (use_param_num != -1)
2469     {
2470       if (d->param != NULL && d->param[use_param_num] != NULL)
2471 	{
2472 	  type_p nt = d->param[use_param_num];
2473 
2474 	  if (t->kind == TYPE_ARRAY)
2475 	    nt = create_array (nt, t->u.a.len);
2476 	  else if (length != NULL && t->kind == TYPE_POINTER)
2477 	    nt = create_pointer (nt);
2478 	  d->needs_cast_p = (t->kind != TYPE_POINTER
2479 			     && (nt->kind == TYPE_POINTER
2480 				 || nt->kind == TYPE_STRING));
2481 	  t = nt;
2482 	}
2483       else
2484 	error_at_line (d->line, "no parameter defined for `%s'", d->val);
2485     }
2486 
2487   if (maybe_undef_p
2488       && (t->kind != TYPE_POINTER || !UNION_OR_STRUCT_P (t->u.p)))
2489     {
2490       error_at_line (d->line,
2491 		     "field `%s' has invalid option `maybe_undef_p'\n",
2492 		     d->val);
2493       return;
2494     }
2495 
2496   if (atomic_p && (t->kind != TYPE_POINTER))
2497     {
2498       error_at_line (d->line, "field `%s' has invalid option `atomic'\n", d->val);
2499       return;
2500     }
2501 
2502   switch (t->kind)
2503     {
2504     case TYPE_SCALAR:
2505     case TYPE_STRING:
2506       d->process_field (t, d);
2507       break;
2508 
2509     case TYPE_POINTER:
2510       {
2511 	if (maybe_undef_p && t->u.p->u.s.line.file == NULL)
2512 	  {
2513 	    oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
2514 	    break;
2515 	  }
2516 
2517 	/* If a pointer type is marked as "atomic", we process the
2518 	   field itself, but we don't walk the data that they point to.
2519 
2520 	   There are two main cases where we walk types: to mark
2521 	   pointers that are reachable, and to relocate pointers when
2522 	   writing a PCH file.  In both cases, an atomic pointer is
2523 	   itself marked or relocated, but the memory that it points
2524 	   to is left untouched.  In the case of PCH, that memory will
2525 	   be read/written unchanged to the PCH file.  */
2526 	if (atomic_p)
2527 	  {
2528 	    oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2529 	    d->indent += 2;
2530 	    d->process_field (t, d);
2531 	    d->indent -= 2;
2532 	    oprintf (d->of, "%*s}\n", d->indent, "");
2533 	    break;
2534 	  }
2535 
2536 	if (!length)
2537 	  {
2538 	    if (!UNION_OR_STRUCT_P (t->u.p)
2539 		&& t->u.p->kind != TYPE_PARAM_STRUCT)
2540 	      {
2541 		error_at_line (d->line,
2542 			       "field `%s' is pointer to unimplemented type",
2543 			       d->val);
2544 		break;
2545 	      }
2546 
2547 	    if (nested_ptr_d)
2548 	      {
2549 		const char *oldprevval2 = d->prev_val[2];
2550 
2551 		if (!UNION_OR_STRUCT_P (nested_ptr_d->type))
2552 		  {
2553 		    error_at_line (d->line,
2554 				   "field `%s' has invalid "
2555 				   "option `nested_ptr'\n", d->val);
2556 		    return;
2557 		  }
2558 
2559 		d->prev_val[2] = d->val;
2560 		oprintf (d->of, "%*s{\n", d->indent, "");
2561 		d->indent += 2;
2562 		d->val = xasprintf ("x%d", d->counter++);
2563 		oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "",
2564 			 (nested_ptr_d->type->kind == TYPE_UNION
2565 			  ? "union" : "struct"),
2566 			 nested_ptr_d->type->u.s.tag,
2567 			 d->fn_wants_lvalue ? "" : "const ", d->val);
2568 		oprintf (d->of, "%*s", d->indent + 2, "");
2569 		output_escaped_param (d, nested_ptr_d->convert_from,
2570 				      "nested_ptr");
2571 		oprintf (d->of, ";\n");
2572 
2573 		d->process_field (nested_ptr_d->type, d);
2574 
2575 		if (d->fn_wants_lvalue)
2576 		  {
2577 		    oprintf (d->of, "%*s%s = ", d->indent, "",
2578 			     d->prev_val[2]);
2579 		    d->prev_val[2] = d->val;
2580 		    output_escaped_param (d, nested_ptr_d->convert_to,
2581 					  "nested_ptr");
2582 		    oprintf (d->of, ";\n");
2583 		  }
2584 
2585 		d->indent -= 2;
2586 		oprintf (d->of, "%*s}\n", d->indent, "");
2587 		d->val = d->prev_val[2];
2588 		d->prev_val[2] = oldprevval2;
2589 	      }
2590 	    else
2591 	      d->process_field (t->u.p, d);
2592 	  }
2593 	else
2594 	  {
2595 	    int loopcounter = d->counter++;
2596 	    const char *oldval = d->val;
2597 	    const char *oldprevval3 = d->prev_val[3];
2598 	    char *newval;
2599 
2600 	    oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2601 	    d->indent += 2;
2602 	    oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2603 	    oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent,
2604 		     "", loopcounter, loopcounter);
2605 	    output_escaped_param (d, length, "length");
2606 	    oprintf (d->of, "); i%d++) {\n", loopcounter);
2607 	    d->indent += 2;
2608 	    d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2609 	    d->used_length = 1;
2610 	    d->prev_val[3] = oldval;
2611 	    walk_type (t->u.p, d);
2612 	    free (newval);
2613 	    d->val = oldval;
2614 	    d->prev_val[3] = oldprevval3;
2615 	    d->used_length = 0;
2616 	    d->indent -= 2;
2617 	    oprintf (d->of, "%*s}\n", d->indent, "");
2618 	    d->process_field (t, d);
2619 	    d->indent -= 2;
2620 	    oprintf (d->of, "%*s}\n", d->indent, "");
2621 	  }
2622       }
2623       break;
2624 
2625     case TYPE_ARRAY:
2626       {
2627 	int loopcounter = d->counter++;
2628 	const char *oldval = d->val;
2629 	char *newval;
2630 
2631 	/* If it's an array of scalars, we optimize by not generating
2632 	   any code.  */
2633 	if (t->u.a.p->kind == TYPE_SCALAR)
2634 	  break;
2635 
2636 	/* When walking an array, compute the length and store it in a
2637 	   local variable before walking the array elements, instead of
2638 	   recomputing the length expression each time through the loop.
2639 	   This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2640 	   where the length is stored in the first array element,
2641 	   because otherwise that operand can get overwritten on the
2642 	   first iteration.  */
2643 	oprintf (d->of, "%*s{\n", d->indent, "");
2644 	d->indent += 2;
2645 	oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2646 	oprintf (d->of, "%*ssize_t l%d = (size_t)(",
2647 		 d->indent, "", loopcounter);
2648 	if (length)
2649 	  output_escaped_param (d, length, "length");
2650 	else
2651 	  oprintf (d->of, "%s", t->u.a.len);
2652 	oprintf (d->of, ");\n");
2653 
2654 	oprintf (d->of, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2655 		 d->indent, "",
2656 		 loopcounter, loopcounter, loopcounter, loopcounter);
2657 	d->indent += 2;
2658 	d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2659 	d->used_length = 1;
2660 	walk_type (t->u.a.p, d);
2661 	free (newval);
2662 	d->used_length = 0;
2663 	d->val = oldval;
2664 	d->indent -= 2;
2665 	oprintf (d->of, "%*s}\n", d->indent, "");
2666 	d->indent -= 2;
2667 	oprintf (d->of, "%*s}\n", d->indent, "");
2668       }
2669       break;
2670 
2671     case TYPE_STRUCT:
2672     case TYPE_UNION:
2673       {
2674 	pair_p f;
2675 	const char *oldval = d->val;
2676 	const char *oldprevval1 = d->prev_val[1];
2677 	const char *oldprevval2 = d->prev_val[2];
2678 	const int union_p = t->kind == TYPE_UNION;
2679 	int seen_default_p = 0;
2680 	options_p o;
2681 
2682 	if (!t->u.s.line.file)
2683 	  error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
2684 
2685 	if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
2686 	  {
2687 	    error_at_line (d->line,
2688 			   "structure `%s' defined for mismatching languages",
2689 			   t->u.s.tag);
2690 	    error_at_line (&t->u.s.line, "one structure defined here");
2691 	  }
2692 
2693 	/* Some things may also be defined in the structure's options.  */
2694 	for (o = t->u.s.opt; o; o = o->next)
2695 	  if (!desc && strcmp (o->name, "desc") == 0
2696 	      && o->kind == OPTION_STRING)
2697 	    desc = o->info.string;
2698 
2699 	d->prev_val[2] = oldval;
2700 	d->prev_val[1] = oldprevval2;
2701 	if (union_p)
2702 	  {
2703 	    if (desc == NULL)
2704 	      {
2705 		error_at_line (d->line,
2706 			       "missing `desc' option for union `%s'",
2707 			       t->u.s.tag);
2708 		desc = "1";
2709 	      }
2710 	    oprintf (d->of, "%*sswitch (", d->indent, "");
2711 	    output_escaped_param (d, desc, "desc");
2712 	    oprintf (d->of, ")\n");
2713 	    d->indent += 2;
2714 	    oprintf (d->of, "%*s{\n", d->indent, "");
2715 	  }
2716 	for (f = t->u.s.fields; f; f = f->next)
2717 	  {
2718 	    options_p oo;
2719 	    const char *dot = ".";
2720 	    const char *tagid = NULL;
2721 	    int skip_p = 0;
2722 	    int default_p = 0;
2723 	    int use_param_p = 0;
2724 	    char *newval;
2725 
2726 	    d->reorder_fn = NULL;
2727 	    for (oo = f->opt; oo; oo = oo->next)
2728 	      if (strcmp (oo->name, "dot") == 0
2729 		  && oo->kind == OPTION_STRING)
2730 		dot = oo->info.string;
2731 	      else if (strcmp (oo->name, "tag") == 0
2732 		       && oo->kind == OPTION_STRING)
2733 		tagid = oo->info.string;
2734 	      else if (strcmp (oo->name, "skip") == 0)
2735 		skip_p = 1;
2736 	      else if (strcmp (oo->name, "default") == 0)
2737 		default_p = 1;
2738 	      else if (strcmp (oo->name, "reorder") == 0
2739 		  && oo->kind == OPTION_STRING)
2740 		d->reorder_fn = oo->info.string;
2741 	      else if (strncmp (oo->name, "use_param", 9) == 0
2742 		       && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2743 		use_param_p = 1;
2744 
2745 	    if (skip_p)
2746 	      continue;
2747 
2748 	    if (union_p && tagid)
2749 	      {
2750 		oprintf (d->of, "%*scase %s:\n", d->indent, "", tagid);
2751 		d->indent += 2;
2752 	      }
2753 	    else if (union_p && default_p)
2754 	      {
2755 		oprintf (d->of, "%*sdefault:\n", d->indent, "");
2756 		d->indent += 2;
2757 		seen_default_p = 1;
2758 	      }
2759 	    else if (!union_p && (default_p || tagid))
2760 	      error_at_line (d->line,
2761 			     "can't use `%s' outside a union on field `%s'",
2762 			     default_p ? "default" : "tag", f->name);
2763 	    else if (union_p && !(default_p || tagid)
2764 		     && f->type->kind == TYPE_SCALAR)
2765 	      {
2766 		fprintf (stderr,
2767 			 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2768 			 get_input_file_name (d->line->file), d->line->line,
2769 			 f->name);
2770 		continue;
2771 	      }
2772 	    else if (union_p && !(default_p || tagid))
2773 	      error_at_line (d->line,
2774 			     "field `%s' is missing `tag' or `default' option",
2775 			     f->name);
2776 
2777 	    d->line = &f->line;
2778 	    d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name);
2779 	    d->opt = f->opt;
2780 	    d->used_length = false;
2781 
2782 	    if (union_p && use_param_p && d->param == NULL)
2783 	      oprintf (d->of, "%*sgcc_unreachable ();\n", d->indent, "");
2784 	    else
2785 	      walk_type (f->type, d);
2786 
2787 	    free (newval);
2788 
2789 	    if (union_p)
2790 	      {
2791 		oprintf (d->of, "%*sbreak;\n", d->indent, "");
2792 		d->indent -= 2;
2793 	      }
2794 	  }
2795 	d->reorder_fn = NULL;
2796 
2797 	d->val = oldval;
2798 	d->prev_val[1] = oldprevval1;
2799 	d->prev_val[2] = oldprevval2;
2800 
2801 	if (union_p && !seen_default_p)
2802 	  {
2803 	    oprintf (d->of, "%*sdefault:\n", d->indent, "");
2804 	    oprintf (d->of, "%*s  break;\n", d->indent, "");
2805 	  }
2806 	if (union_p)
2807 	  {
2808 	    oprintf (d->of, "%*s}\n", d->indent, "");
2809 	    d->indent -= 2;
2810 	  }
2811       }
2812       break;
2813 
2814     case TYPE_LANG_STRUCT:
2815       {
2816 	type_p nt;
2817 	for (nt = t->u.s.lang_struct; nt; nt = nt->next)
2818 	  if ((d->bitmap & nt->u.s.bitmap) == d->bitmap)
2819 	    break;
2820 	if (nt == NULL)
2821 	  error_at_line (d->line, "structure `%s' differs between languages",
2822 			 t->u.s.tag);
2823 	else
2824 	  walk_type (nt, d);
2825       }
2826       break;
2827 
2828     case TYPE_PARAM_STRUCT:
2829       {
2830 	type_p *oldparam = d->param;
2831 
2832 	d->param = t->u.param_struct.param;
2833 	walk_type (t->u.param_struct.stru, d);
2834 	d->param = oldparam;
2835       }
2836       break;
2837 
2838     default:
2839       gcc_unreachable ();
2840     }
2841 }
2842 
2843 /* process_field routine for marking routines.  */
2844 
2845 static void
2846 write_types_process_field (type_p f, const struct walk_type_data *d)
2847 {
2848   const struct write_types_data *wtd;
2849   const char *cast = d->needs_cast_p ? "(void *)" : "";
2850   wtd = (const struct write_types_data *) d->cookie;
2851 
2852   switch (f->kind)
2853     {
2854     case TYPE_NONE:
2855       gcc_unreachable ();
2856     case TYPE_POINTER:
2857       oprintf (d->of, "%*s%s (%s%s", d->indent, "",
2858 	       wtd->subfield_marker_routine, cast, d->val);
2859       if (wtd->param_prefix)
2860 	{
2861 	  oprintf (d->of, ", %s", d->prev_val[3]);
2862 	  if (d->orig_s)
2863 	    {
2864 	      oprintf (d->of, ", gt_%s_", wtd->param_prefix);
2865 	      output_mangled_typename (d->of, d->orig_s);
2866 	    }
2867 	  else
2868 	    oprintf (d->of, ", gt_%sa_%s", wtd->param_prefix, d->prev_val[0]);
2869 
2870 	  if (f->u.p->kind == TYPE_PARAM_STRUCT
2871 	      && f->u.p->u.s.line.file != NULL)
2872 	    {
2873 	      oprintf (d->of, ", gt_e_");
2874 	      output_mangled_typename (d->of, f);
2875 	    }
2876 	  else if (UNION_OR_STRUCT_P (f) && f->u.p->u.s.line.file != NULL)
2877 	    {
2878 	      oprintf (d->of, ", gt_ggc_e_");
2879 	      output_mangled_typename (d->of, f);
2880 	    }
2881 	  else
2882 	    oprintf (d->of, ", gt_types_enum_last");
2883 	}
2884       oprintf (d->of, ");\n");
2885       if (d->reorder_fn && wtd->reorder_note_routine)
2886 	oprintf (d->of, "%*s%s (%s%s, %s, %s);\n", d->indent, "",
2887 		 wtd->reorder_note_routine, cast, d->val,
2888 		 d->prev_val[3], d->reorder_fn);
2889       break;
2890 
2891     case TYPE_STRING:
2892     case TYPE_STRUCT:
2893     case TYPE_UNION:
2894     case TYPE_LANG_STRUCT:
2895     case TYPE_PARAM_STRUCT:
2896       oprintf (d->of, "%*sgt_%s_", d->indent, "", wtd->prefix);
2897       output_mangled_typename (d->of, f);
2898       oprintf (d->of, " (%s%s);\n", cast, d->val);
2899       if (d->reorder_fn && wtd->reorder_note_routine)
2900 	oprintf (d->of, "%*s%s (%s%s, %s%s, %s);\n", d->indent, "",
2901 		 wtd->reorder_note_routine, cast, d->val, cast, d->val,
2902 		 d->reorder_fn);
2903       break;
2904 
2905     case TYPE_SCALAR:
2906       break;
2907 
2908     case TYPE_ARRAY:
2909       gcc_unreachable ();
2910     }
2911 }
2912 
2913 /* A subroutine of write_func_for_structure.  Write the enum tag for S.  */
2914 
2915 static void
2916 output_type_enum (outf_p of, type_p s)
2917 {
2918   if (s->kind == TYPE_PARAM_STRUCT && s->u.param_struct.line.file != NULL)
2919     {
2920       oprintf (of, ", gt_e_");
2921       output_mangled_typename (of, s);
2922     }
2923   else if (UNION_OR_STRUCT_P (s) && s->u.s.line.file != NULL)
2924     {
2925       oprintf (of, ", gt_ggc_e_");
2926       output_mangled_typename (of, s);
2927     }
2928   else
2929     oprintf (of, ", gt_types_enum_last");
2930 }
2931 
2932 /* Return an output file that is suitable for definitions which can
2933    reference struct S */
2934 
2935 static outf_p
2936 get_output_file_for_structure (const_type_p s, type_p *param)
2937 {
2938   const input_file *fn;
2939   int i;
2940 
2941   gcc_assert (UNION_OR_STRUCT_P (s));
2942   fn = s->u.s.line.file;
2943 
2944   /* This is a hack, and not the good kind either.  */
2945   for (i = NUM_PARAM - 1; i >= 0; i--)
2946     if (param && param[i] && param[i]->kind == TYPE_POINTER
2947 	&& UNION_OR_STRUCT_P (param[i]->u.p))
2948       fn = param[i]->u.p->u.s.line.file;
2949 
2950   /* The call to get_output_file_with_visibility may update fn by
2951      caching its result inside, so we need the CONST_CAST.  */
2952   return get_output_file_with_visibility (CONST_CAST (input_file*, fn));
2953 }
2954 
2955 /* For S, a structure that's part of ORIG_S, and using parameters
2956    PARAM, write out a routine that:
2957    - Takes a parameter, a void * but actually of type *S
2958    - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2959    field of S or its substructures and (in some cases) things
2960    that are pointed to by S.
2961 */
2962 
2963 static void
2964 write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2965 			  const struct write_types_data *wtd)
2966 {
2967   const char *chain_next = NULL;
2968   const char *chain_prev = NULL;
2969   const char *chain_circular = NULL;
2970   const char *mark_hook_name = NULL;
2971   options_p opt;
2972   struct walk_type_data d;
2973 
2974   memset (&d, 0, sizeof (d));
2975   d.of = get_output_file_for_structure (s, param);
2976   for (opt = s->u.s.opt; opt; opt = opt->next)
2977     if (strcmp (opt->name, "chain_next") == 0
2978 	&& opt->kind == OPTION_STRING)
2979       chain_next = opt->info.string;
2980     else if (strcmp (opt->name, "chain_prev") == 0
2981 	     && opt->kind == OPTION_STRING)
2982       chain_prev = opt->info.string;
2983     else if (strcmp (opt->name, "chain_circular") == 0
2984 	     && opt->kind == OPTION_STRING)
2985       chain_circular = opt->info.string;
2986     else if (strcmp (opt->name, "mark_hook") == 0
2987 	     && opt->kind == OPTION_STRING)
2988       mark_hook_name = opt->info.string;
2989   if (chain_prev != NULL && chain_next == NULL)
2990     error_at_line (&s->u.s.line, "chain_prev without chain_next");
2991   if (chain_circular != NULL && chain_next != NULL)
2992     error_at_line (&s->u.s.line, "chain_circular with chain_next");
2993   if (chain_circular != NULL)
2994     chain_next = chain_circular;
2995 
2996   d.process_field = write_types_process_field;
2997   d.cookie = wtd;
2998   d.orig_s = orig_s;
2999   d.opt = s->u.s.opt;
3000   d.line = &s->u.s.line;
3001   d.bitmap = s->u.s.bitmap;
3002   d.param = param;
3003   d.prev_val[0] = "*x";
3004   d.prev_val[1] = "not valid postage";	/* Guarantee an error.  */
3005   d.prev_val[3] = "x";
3006   d.val = "(*x)";
3007 
3008   oprintf (d.of, "\n");
3009   oprintf (d.of, "void\n");
3010   if (param == NULL)
3011     oprintf (d.of, "gt_%sx_%s", wtd->prefix, orig_s->u.s.tag);
3012   else
3013     {
3014       oprintf (d.of, "gt_%s_", wtd->prefix);
3015       output_mangled_typename (d.of, orig_s);
3016     }
3017   oprintf (d.of, " (void *x_p)\n");
3018   oprintf (d.of, "{\n");
3019   oprintf (d.of, "  %s %s * %sx = (%s %s *)x_p;\n",
3020 	   s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
3021 	   chain_next == NULL ? "const " : "",
3022 	   s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
3023   if (chain_next != NULL)
3024     oprintf (d.of, "  %s %s * xlimit = x;\n",
3025 	     s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
3026   if (chain_next == NULL)
3027     {
3028       oprintf (d.of, "  if (%s (x", wtd->marker_routine);
3029       if (wtd->param_prefix)
3030 	{
3031 	  oprintf (d.of, ", x, gt_%s_", wtd->param_prefix);
3032 	  output_mangled_typename (d.of, orig_s);
3033 	  output_type_enum (d.of, orig_s);
3034 	}
3035       oprintf (d.of, "))\n");
3036     }
3037   else
3038     {
3039       if (chain_circular != NULL)
3040 	oprintf (d.of, "  if (!%s (xlimit", wtd->marker_routine);
3041       else
3042 	oprintf (d.of, "  while (%s (xlimit", wtd->marker_routine);
3043       if (wtd->param_prefix)
3044 	{
3045 	  oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
3046 	  output_mangled_typename (d.of, orig_s);
3047 	  output_type_enum (d.of, orig_s);
3048 	}
3049       oprintf (d.of, "))\n");
3050       if (chain_circular != NULL)
3051 	oprintf (d.of, "    return;\n  do\n");
3052       if (mark_hook_name && !wtd->skip_hooks)
3053 	{
3054 	  oprintf (d.of, "    {\n");
3055 	  oprintf (d.of, "      %s (xlimit);\n   ", mark_hook_name);
3056 	}
3057       oprintf (d.of, "   xlimit = (");
3058       d.prev_val[2] = "*xlimit";
3059       output_escaped_param (&d, chain_next, "chain_next");
3060       oprintf (d.of, ");\n");
3061       if (mark_hook_name && !wtd->skip_hooks)
3062 	oprintf (d.of, "    }\n");
3063       if (chain_prev != NULL)
3064 	{
3065 	  oprintf (d.of, "  if (x != xlimit)\n");
3066 	  oprintf (d.of, "    for (;;)\n");
3067 	  oprintf (d.of, "      {\n");
3068 	  oprintf (d.of, "        %s %s * const xprev = (",
3069 		   s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
3070 
3071 	  d.prev_val[2] = "*x";
3072 	  output_escaped_param (&d, chain_prev, "chain_prev");
3073 	  oprintf (d.of, ");\n");
3074 	  oprintf (d.of, "        if (xprev == NULL) break;\n");
3075 	  oprintf (d.of, "        x = xprev;\n");
3076 	  oprintf (d.of, "        (void) %s (xprev", wtd->marker_routine);
3077 	  if (wtd->param_prefix)
3078 	    {
3079 	      oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
3080 	      output_mangled_typename (d.of, orig_s);
3081 	      output_type_enum (d.of, orig_s);
3082 	    }
3083 	  oprintf (d.of, ");\n");
3084 	  oprintf (d.of, "      }\n");
3085 	}
3086       if (chain_circular != NULL)
3087 	{
3088 	  oprintf (d.of, "  while (%s (xlimit", wtd->marker_routine);
3089 	  if (wtd->param_prefix)
3090 	    {
3091 	      oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
3092 	      output_mangled_typename (d.of, orig_s);
3093 	      output_type_enum (d.of, orig_s);
3094 	    }
3095 	  oprintf (d.of, "));\n");
3096 	  if (mark_hook_name && !wtd->skip_hooks)
3097 	    oprintf (d.of, "  %s (xlimit);\n", mark_hook_name);
3098 	  oprintf (d.of, "  do\n");
3099 	}
3100       else
3101 	oprintf (d.of, "  while (x != xlimit)\n");
3102     }
3103   oprintf (d.of, "    {\n");
3104   if (mark_hook_name && chain_next == NULL && !wtd->skip_hooks)
3105     {
3106       oprintf (d.of, "      %s (x);\n", mark_hook_name);
3107     }
3108   d.prev_val[2] = "*x";
3109   d.indent = 6;
3110   walk_type (s, &d);
3111 
3112   if (chain_next != NULL)
3113     {
3114       oprintf (d.of, "      x = (");
3115       output_escaped_param (&d, chain_next, "chain_next");
3116       oprintf (d.of, ");\n");
3117     }
3118 
3119   oprintf (d.of, "    }\n");
3120   if (chain_circular != NULL)
3121     oprintf (d.of, "  while (x != xlimit);\n");
3122   oprintf (d.of, "}\n");
3123 }
3124 
3125 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS.  */
3126 
3127 static void
3128 write_types (outf_p output_header, type_p structures, type_p param_structs,
3129 	     const struct write_types_data *wtd)
3130 {
3131   int nbfun = 0;		/* Count the emitted functions.  */
3132   type_p s;
3133 
3134   oprintf (output_header, "\n/* %s*/\n", wtd->comment);
3135   /* We first emit the macros and the declarations. Functions' code is
3136      emitted afterwards.  This is needed in plugin mode.  */
3137   oprintf (output_header, "/* macros and declarations */\n");
3138   for (s = structures; s; s = s->next)
3139     if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
3140       {
3141 	options_p opt;
3142 
3143 	if (s->gc_used == GC_MAYBE_POINTED_TO && s->u.s.line.file == NULL)
3144 	  continue;
3145 
3146 	oprintf (output_header, "#define gt_%s_", wtd->prefix);
3147 	output_mangled_typename (output_header, s);
3148 	oprintf (output_header, "(X) do { \\\n");
3149 	oprintf (output_header,
3150 		 "  if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
3151 		 s->u.s.tag);
3152 	oprintf (output_header, "  } while (0)\n");
3153 
3154 	for (opt = s->u.s.opt; opt; opt = opt->next)
3155 	  if (strcmp (opt->name, "ptr_alias") == 0
3156 	      && opt->kind == OPTION_TYPE)
3157 	    {
3158 	      const_type_p const t = (const_type_p) opt->info.type;
3159 	      if (t->kind == TYPE_STRUCT
3160 		  || t->kind == TYPE_UNION || t->kind == TYPE_LANG_STRUCT)
3161 		oprintf (output_header,
3162 			 "#define gt_%sx_%s gt_%sx_%s\n",
3163 			 wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
3164 	      else
3165 		error_at_line (&s->u.s.line,
3166 			       "structure alias is not a structure");
3167 	      break;
3168 	    }
3169 	if (opt)
3170 	  continue;
3171 
3172 	/* Declare the marker procedure only once.  */
3173 	oprintf (output_header,
3174 		 "extern void gt_%sx_%s (void *);\n",
3175 		 wtd->prefix, s->u.s.tag);
3176 
3177 	if (s->u.s.line.file == NULL)
3178 	  {
3179 	    fprintf (stderr, "warning: structure `%s' used but not defined\n",
3180 		     s->u.s.tag);
3181 	    continue;
3182 	  }
3183       }
3184 
3185   for (s = param_structs; s; s = s->next)
3186     if (s->gc_used == GC_POINTED_TO)
3187       {
3188 	type_p stru = s->u.param_struct.stru;
3189 
3190 	/* Declare the marker procedure.  */
3191 	oprintf (output_header, "extern void gt_%s_", wtd->prefix);
3192 	output_mangled_typename (output_header, s);
3193 	oprintf (output_header, " (void *);\n");
3194 
3195 	if (stru->u.s.line.file == NULL)
3196 	  {
3197 	    fprintf (stderr, "warning: structure `%s' used but not defined\n",
3198 		     s->u.s.tag);
3199 	    continue;
3200 	  }
3201       }
3202 
3203   /* At last we emit the functions code.  */
3204   oprintf (output_header, "\n/* functions code */\n");
3205   for (s = structures; s; s = s->next)
3206     if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
3207       {
3208 	options_p opt;
3209 
3210 	if (s->gc_used == GC_MAYBE_POINTED_TO && s->u.s.line.file == NULL)
3211 	  continue;
3212 	for (opt = s->u.s.opt; opt; opt = opt->next)
3213 	  if (strcmp (opt->name, "ptr_alias") == 0)
3214 	    break;
3215 	if (opt)
3216 	  continue;
3217 
3218 	if (s->kind == TYPE_LANG_STRUCT)
3219 	  {
3220 	    type_p ss;
3221 	    for (ss = s->u.s.lang_struct; ss; ss = ss->next)
3222 	      {
3223 		nbfun++;
3224 		DBGPRINTF ("writing func #%d lang_struct ss @ %p '%s'",
3225 			   nbfun, (void*) ss, ss->u.s.tag);
3226 		write_func_for_structure (s, ss, NULL, wtd);
3227 	      }
3228 	  }
3229 	else
3230 	  {
3231 	    nbfun++;
3232 	    DBGPRINTF ("writing func #%d struct s @ %p '%s'",
3233 		       nbfun, (void*) s, s->u.s.tag);
3234 	    write_func_for_structure (s, s, NULL, wtd);
3235 	  }
3236       }
3237     else
3238       {
3239 	/* Structure s is not possibly pointed to, so can be ignored.  */
3240 	DBGPRINTF ("ignored s @ %p  '%s' gc_used#%d",
3241 		   (void*)s,  s->u.s.tag,
3242 		   (int) s->gc_used);
3243       }
3244 
3245   for (s = param_structs; s; s = s->next)
3246     if (s->gc_used == GC_POINTED_TO)
3247       {
3248 	type_p *param = s->u.param_struct.param;
3249 	type_p stru = s->u.param_struct.stru;
3250 	if (stru->u.s.line.file == NULL)
3251 	  continue;
3252 	if (stru->kind == TYPE_LANG_STRUCT)
3253 	  {
3254 	    type_p ss;
3255 	    for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3256 	      {
3257 		nbfun++;
3258 		DBGPRINTF ("writing func #%d param lang_struct ss @ %p '%s'",
3259 			   nbfun, (void*) ss,  ss->u.s.tag);
3260 		write_func_for_structure (s, ss, param, wtd);
3261 	      }
3262 	  }
3263 	else
3264 	  {
3265 	    nbfun++;
3266 	    DBGPRINTF ("writing func #%d param struct s @ %p stru @ %p '%s'",
3267 		       nbfun, (void*) s,
3268 		       (void*) stru,  stru->u.s.tag);
3269 	    write_func_for_structure (s, stru, param, wtd);
3270 	  }
3271       }
3272     else
3273       {
3274 	/* Param structure s is not pointed to, so should be ignored.  */
3275 	DBGPRINTF ("ignored s @ %p", (void*)s);
3276       }
3277   if (verbosity_level >= 2)
3278     printf ("%s emitted %d routines for %s\n",
3279 	    progname, nbfun, wtd->comment);
3280 }
3281 
3282 static const struct write_types_data ggc_wtd = {
3283   "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
3284   "GC marker procedures.  ",
3285   FALSE
3286 };
3287 
3288 static const struct write_types_data pch_wtd = {
3289   "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
3290   "gt_pch_note_reorder",
3291   "PCH type-walking procedures.  ",
3292   TRUE
3293 };
3294 
3295 /* Write out the local pointer-walking routines.  */
3296 
3297 /* process_field routine for local pointer-walking.  */
3298 
3299 static void
3300 write_types_local_process_field (type_p f, const struct walk_type_data *d)
3301 {
3302   switch (f->kind)
3303     {
3304     case TYPE_POINTER:
3305     case TYPE_STRUCT:
3306     case TYPE_UNION:
3307     case TYPE_LANG_STRUCT:
3308     case TYPE_PARAM_STRUCT:
3309     case TYPE_STRING:
3310       oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "",
3311 	       d->prev_val[3]);
3312       oprintf (d->of, "%*s  op (&(%s), cookie);\n", d->indent, "", d->val);
3313       break;
3314 
3315     case TYPE_SCALAR:
3316       break;
3317 
3318     default:
3319       gcc_unreachable ();
3320     }
3321 }
3322 
3323 /* For S, a structure that's part of ORIG_S, and using parameters
3324    PARAM, write out a routine that:
3325    - Is of type gt_note_pointers
3326    - Calls PROCESS_FIELD on each field of S or its substructures.
3327 */
3328 
3329 static void
3330 write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param)
3331 {
3332   struct walk_type_data d;
3333 
3334   memset (&d, 0, sizeof (d));
3335   d.of = get_output_file_for_structure (s, param);
3336   d.process_field = write_types_local_process_field;
3337   d.opt = s->u.s.opt;
3338   d.line = &s->u.s.line;
3339   d.bitmap = s->u.s.bitmap;
3340   d.param = param;
3341   d.prev_val[0] = d.prev_val[2] = "*x";
3342   d.prev_val[1] = "not valid postage";	/* Guarantee an error.  */
3343   d.prev_val[3] = "x";
3344   d.val = "(*x)";
3345   d.fn_wants_lvalue = true;
3346 
3347   oprintf (d.of, "\n");
3348   oprintf (d.of, "void\n");
3349   oprintf (d.of, "gt_pch_p_");
3350   output_mangled_typename (d.of, orig_s);
3351   oprintf (d.of, " (ATTRIBUTE_UNUSED void *this_obj,\n"
3352 	   "\tvoid *x_p,\n"
3353 	   "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3354 	   "\tATTRIBUTE_UNUSED void *cookie)\n");
3355   oprintf (d.of, "{\n");
3356   oprintf (d.of, "  %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
3357 	   s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
3358 	   s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
3359   d.indent = 2;
3360   walk_type (s, &d);
3361   oprintf (d.of, "}\n");
3362 }
3363 
3364 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS.  */
3365 
3366 static void
3367 write_local (outf_p output_header, type_p structures, type_p param_structs)
3368 {
3369   type_p s;
3370 
3371   if (!output_header)
3372     return;
3373   oprintf (output_header, "\n/* Local pointer-walking routines.  */\n");
3374   for (s = structures; s; s = s->next)
3375     if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
3376       {
3377 	options_p opt;
3378 
3379 	if (s->u.s.line.file == NULL)
3380 	  continue;
3381  	for (opt = s->u.s.opt; opt; opt = opt->next)
3382 	  if (strcmp (opt->name, "ptr_alias") == 0
3383 	      && opt->kind == OPTION_TYPE)
3384 	    {
3385 	      const_type_p const t = (const_type_p) opt->info.type;
3386 	      if (t->kind == TYPE_STRUCT
3387 		  || t->kind == TYPE_UNION || t->kind == TYPE_LANG_STRUCT)
3388 		{
3389 		  oprintf (output_header, "#define gt_pch_p_");
3390 		  output_mangled_typename (output_header, s);
3391 		  oprintf (output_header, " gt_pch_p_");
3392 		  output_mangled_typename (output_header, t);
3393 		  oprintf (output_header, "\n");
3394 		}
3395 	      else
3396 		error_at_line (&s->u.s.line,
3397 			       "structure alias is not a structure");
3398 	      break;
3399 	    }
3400 	if (opt)
3401 	  continue;
3402 
3403 	/* Declare the marker procedure only once.  */
3404 	oprintf (output_header, "extern void gt_pch_p_");
3405 	output_mangled_typename (output_header, s);
3406 	oprintf (output_header,
3407 		 "\n    (void *, void *, gt_pointer_operator, void *);\n");
3408 
3409 	if (s->kind == TYPE_LANG_STRUCT)
3410 	  {
3411 	    type_p ss;
3412 	    for (ss = s->u.s.lang_struct; ss; ss = ss->next)
3413 	      write_local_func_for_structure (s, ss, NULL);
3414 	  }
3415 	else
3416 	  write_local_func_for_structure (s, s, NULL);
3417       }
3418 
3419   for (s = param_structs; s; s = s->next)
3420     if (s->gc_used == GC_POINTED_TO)
3421       {
3422 	type_p *param = s->u.param_struct.param;
3423 	type_p stru = s->u.param_struct.stru;
3424 
3425 	/* Declare the marker procedure.  */
3426 	oprintf (output_header, "extern void gt_pch_p_");
3427 	output_mangled_typename (output_header, s);
3428 	oprintf (output_header,
3429 		 "\n    (void *, void *, gt_pointer_operator, void *);\n");
3430 
3431 	if (stru->u.s.line.file == NULL)
3432 	  {
3433 	    fprintf (stderr, "warning: structure `%s' used but not defined\n",
3434 		     s->u.s.tag);
3435 	    continue;
3436 	  }
3437 
3438 	if (stru->kind == TYPE_LANG_STRUCT)
3439 	  {
3440 	    type_p ss;
3441 	    for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3442 	      write_local_func_for_structure (s, ss, param);
3443 	  }
3444 	else
3445 	  write_local_func_for_structure (s, stru, param);
3446       }
3447 }
3448 
3449 /* Nonzero if S is a type for which typed GC allocators should be output.  */
3450 
3451 #define USED_BY_TYPED_GC_P(s)						\
3452   (((s->kind == TYPE_POINTER)						\
3453     && ((s->u.p->gc_used == GC_POINTED_TO)				\
3454 	|| (s->u.p->gc_used == GC_USED)))				\
3455    || (UNION_OR_STRUCT_P (s) &&						\
3456        (((s)->gc_used == GC_POINTED_TO)					\
3457 	|| ((s)->gc_used == GC_MAYBE_POINTED_TO				\
3458 	    && s->u.s.line.file != NULL)				\
3459 	|| ((s)->gc_used == GC_USED					\
3460 	    && strncmp (s->u.s.tag, "anonymous", strlen ("anonymous"))))))
3461 
3462 
3463 /* Write out the 'enum' definition for gt_types_enum.  */
3464 
3465 static void
3466 write_enum_defn (type_p structures, type_p param_structs)
3467 {
3468   type_p s;
3469   int nbstruct = 0;
3470   int nbparamstruct = 0;
3471 
3472   if (!header_file)
3473     return;
3474   oprintf (header_file, "\n/* Enumeration of types known.  */\n");
3475   oprintf (header_file, "enum gt_types_enum {\n");
3476   for (s = structures; s; s = s->next)
3477     if (USED_BY_TYPED_GC_P (s))
3478       {
3479 	nbstruct++;
3480 	DBGPRINTF ("write_enum_defn s @ %p nbstruct %d",
3481 		   (void*) s, nbstruct);
3482 	if (UNION_OR_STRUCT_P (s))
3483 	  DBGPRINTF ("write_enum_defn s %p #%d is unionorstruct tagged %s",
3484 		     (void*) s, nbstruct, s->u.s.tag);
3485 	oprintf (header_file, " gt_ggc_e_");
3486 	output_mangled_typename (header_file, s);
3487 	oprintf (header_file, ",\n");
3488       }
3489   for (s = param_structs; s; s = s->next)
3490     if (s->gc_used == GC_POINTED_TO)
3491       {
3492 	nbparamstruct++;
3493 	DBGPRINTF ("write_enum_defn s %p nbparamstruct %d",
3494 		   (void*) s, nbparamstruct);
3495 	oprintf (header_file, " gt_e_");
3496 	output_mangled_typename (header_file, s);
3497 	oprintf (header_file, ",\n");
3498       }
3499   oprintf (header_file, " gt_types_enum_last\n");
3500   oprintf (header_file, "};\n");
3501   if (verbosity_level >= 2)
3502     printf ("%s handled %d GTY-ed structures & %d parameterized structures.\n",
3503 	    progname, nbstruct, nbparamstruct);
3504 
3505 }
3506 
3507 /* Might T contain any non-pointer elements?  */
3508 
3509 static int
3510 contains_scalar_p (type_p t)
3511 {
3512   switch (t->kind)
3513     {
3514     case TYPE_STRING:
3515     case TYPE_POINTER:
3516       return 0;
3517     case TYPE_ARRAY:
3518       return contains_scalar_p (t->u.a.p);
3519     default:
3520       /* Could also check for structures that have no non-pointer
3521          fields, but there aren't enough of those to worry about.  */
3522       return 1;
3523     }
3524 }
3525 
3526 /* Mangle INPF and print it to F.  */
3527 
3528 static void
3529 put_mangled_filename (outf_p f, const input_file *inpf)
3530 {
3531   /* The call to get_output_file_name may indirectly update fn since
3532      get_output_file_with_visibility caches its result inside, so we
3533      need the CONST_CAST.  */
3534   const char *name = get_output_file_name (CONST_CAST (input_file*, inpf));
3535   if (!f || !name)
3536     return;
3537   for (; *name != 0; name++)
3538     if (ISALNUM (*name))
3539       oprintf (f, "%c", *name);
3540     else
3541       oprintf (f, "%c", '_');
3542 }
3543 
3544 /* Finish off the currently-created root tables in FLP.  PFX, TNAME,
3545    LASTNAME, and NAME are all strings to insert in various places in
3546    the resulting code.  */
3547 
3548 static void
3549 finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
3550 		   const char *tname, const char *name)
3551 {
3552   struct flist *fli2;
3553 
3554   for (fli2 = flp; fli2; fli2 = fli2->next)
3555     if (fli2->started_p)
3556       {
3557 	oprintf (fli2->f, "  %s\n", lastname);
3558 	oprintf (fli2->f, "};\n\n");
3559       }
3560 
3561   for (fli2 = flp; fli2 && base_files; fli2 = fli2->next)
3562     if (fli2->started_p)
3563       {
3564 	lang_bitmap bitmap = get_lang_bitmap (fli2->file);
3565 	int fnum;
3566 
3567 	for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3568 	  if (bitmap & 1)
3569 	    {
3570 	      oprintf (base_files[fnum],
3571 		       "extern const struct %s gt_%s_", tname, pfx);
3572 	      put_mangled_filename (base_files[fnum], fli2->file);
3573 	      oprintf (base_files[fnum], "[];\n");
3574 	    }
3575       }
3576 
3577   {
3578     size_t fnum;
3579     for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3580       oprintf (base_files[fnum],
3581 	       "EXPORTED_CONST struct %s * const %s[] = {\n", tname, name);
3582   }
3583 
3584 
3585   for (fli2 = flp; fli2; fli2 = fli2->next)
3586     if (fli2->started_p)
3587       {
3588 	lang_bitmap bitmap = get_lang_bitmap (fli2->file);
3589 	int fnum;
3590 
3591 	fli2->started_p = 0;
3592 
3593 	for (fnum = 0; base_files && bitmap != 0; fnum++, bitmap >>= 1)
3594 	  if (bitmap & 1)
3595 	    {
3596 	      oprintf (base_files[fnum], "  gt_%s_", pfx);
3597 	      put_mangled_filename (base_files[fnum], fli2->file);
3598 	      oprintf (base_files[fnum], ",\n");
3599 	    }
3600       }
3601 
3602   {
3603     size_t fnum;
3604     for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3605       {
3606 	oprintf (base_files[fnum], "  NULL\n");
3607 	oprintf (base_files[fnum], "};\n");
3608       }
3609   }
3610 }
3611 
3612 /* Write the first three fields (pointer, count and stride) for
3613    root NAME to F.  V and LINE are as for write_root.
3614 
3615    Return true if the entry could be written; return false on error.  */
3616 
3617 static bool
3618 start_root_entry (outf_p f, pair_p v, const char *name, struct fileloc *line)
3619 {
3620   type_p ap;
3621 
3622   if (!v)
3623     {
3624       error_at_line (line, "`%s' is too complex to be a root", name);
3625       return false;
3626     }
3627 
3628   oprintf (f, "  {\n");
3629   oprintf (f, "    &%s,\n", name);
3630   oprintf (f, "    1");
3631 
3632   for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3633     if (ap->u.a.len[0])
3634       oprintf (f, " * (%s)", ap->u.a.len);
3635     else if (ap == v->type)
3636       oprintf (f, " * ARRAY_SIZE (%s)", v->name);
3637   oprintf (f, ",\n");
3638   oprintf (f, "    sizeof (%s", v->name);
3639   for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3640     oprintf (f, "[0]");
3641   oprintf (f, "),\n");
3642   return true;
3643 }
3644 
3645 /* A subroutine of write_root for writing the roots for field FIELD_NAME,
3646    which has type FIELD_TYPE.  Parameters F to EMIT_PCH are the parameters
3647    of the caller.  */
3648 
3649 static void
3650 write_field_root (outf_p f, pair_p v, type_p type, const char *name,
3651 		  int has_length, struct fileloc *line, const char *if_marked,
3652 		  bool emit_pch, type_p field_type, const char *field_name)
3653 {
3654   struct pair newv;
3655   /* If the field reference is relative to V, rather than to some
3656      subcomponent of V, we can mark any subarrays with a single stride.
3657      We're effectively treating the field as a global variable in its
3658      own right.  */
3659   if (v && type == v->type)
3660     {
3661       newv = *v;
3662       newv.type = field_type;
3663       newv.name = ACONCAT ((v->name, ".", field_name, NULL));
3664       v = &newv;
3665     }
3666   /* Otherwise, any arrays nested in the structure are too complex to
3667      handle.  */
3668   else if (field_type->kind == TYPE_ARRAY)
3669     v = NULL;
3670   write_root (f, v, field_type, ACONCAT ((name, ".", field_name, NULL)),
3671 	      has_length, line, if_marked, emit_pch);
3672 }
3673 
3674 /* Write out to F the table entry and any marker routines needed to
3675    mark NAME as TYPE.  V can be one of three values:
3676 
3677      - null, if NAME is too complex to represent using a single
3678        count and stride.  In this case, it is an error for NAME to
3679        contain any gc-ed data.
3680 
3681      - the outermost array that contains NAME, if NAME is part of an array.
3682 
3683      - the C variable that contains NAME, if NAME is not part of an array.
3684 
3685    LINE is the line of the C source that declares the root variable.
3686    HAS_LENGTH is nonzero iff V was a variable-length array.  IF_MARKED
3687    is nonzero iff we are building the root table for hash table caches.  */
3688 
3689 static void
3690 write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
3691 	    struct fileloc *line, const char *if_marked, bool emit_pch)
3692 {
3693   switch (type->kind)
3694     {
3695     case TYPE_STRUCT:
3696       {
3697 	pair_p fld;
3698 	for (fld = type->u.s.fields; fld; fld = fld->next)
3699 	  {
3700 	    int skip_p = 0;
3701 	    const char *desc = NULL;
3702 	    options_p o;
3703 
3704 	    for (o = fld->opt; o; o = o->next)
3705 	      if (strcmp (o->name, "skip") == 0)
3706 		skip_p = 1;
3707 	      else if (strcmp (o->name, "desc") == 0
3708 		       && o->kind == OPTION_STRING)
3709 		desc = o->info.string;
3710 	      else if (strcmp (o->name, "param_is") == 0)
3711 		;
3712 	      else
3713 		error_at_line (line,
3714 			       "field `%s' of global `%s' has unknown option `%s'",
3715 			       fld->name, name, o->name);
3716 
3717 	    if (skip_p)
3718 	      continue;
3719 	    else if (desc && fld->type->kind == TYPE_UNION)
3720 	      {
3721 		pair_p validf = NULL;
3722 		pair_p ufld;
3723 
3724 		for (ufld = fld->type->u.s.fields; ufld; ufld = ufld->next)
3725 		  {
3726 		    const char *tag = NULL;
3727 		    options_p oo;
3728  		    for (oo = ufld->opt; oo; oo = oo->next)
3729 		      if (strcmp (oo->name, "tag") == 0
3730 			  && oo->kind == OPTION_STRING)
3731 			tag = oo->info.string;
3732 		    if (tag == NULL || strcmp (tag, desc) != 0)
3733 		      continue;
3734 		    if (validf != NULL)
3735 		      error_at_line (line,
3736 				     "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3737 				     name, fld->name, validf->name,
3738 				     name, fld->name, ufld->name, tag);
3739 		    validf = ufld;
3740 		  }
3741 		if (validf != NULL)
3742 		  write_field_root (f, v, type, name, 0, line, if_marked,
3743 				    emit_pch, validf->type,
3744 				    ACONCAT ((fld->name, ".",
3745 					      validf->name, NULL)));
3746 	      }
3747 	    else if (desc)
3748 	      error_at_line (line,
3749 			     "global `%s.%s' has `desc' option but is not union",
3750 			     name, fld->name);
3751 	    else
3752 	      write_field_root (f, v, type, name, 0, line, if_marked,
3753 				emit_pch, fld->type, fld->name);
3754 	  }
3755       }
3756       break;
3757 
3758     case TYPE_ARRAY:
3759       {
3760 	char *newname;
3761 	newname = xasprintf ("%s[0]", name);
3762 	write_root (f, v, type->u.a.p, newname, has_length, line, if_marked,
3763 		    emit_pch);
3764 	free (newname);
3765       }
3766       break;
3767 
3768     case TYPE_POINTER:
3769       {
3770 	type_p tp;
3771 
3772 	if (!start_root_entry (f, v, name, line))
3773 	  return;
3774 
3775 	tp = type->u.p;
3776 
3777 	if (!has_length && UNION_OR_STRUCT_P (tp))
3778 	  {
3779 	    oprintf (f, "    &gt_ggc_mx_%s,\n", tp->u.s.tag);
3780 	    if (emit_pch)
3781 	      oprintf (f, "    &gt_pch_nx_%s", tp->u.s.tag);
3782 	    else
3783 	      oprintf (f, "    NULL");
3784 	  }
3785 	else if (!has_length && tp->kind == TYPE_PARAM_STRUCT)
3786 	  {
3787 	    oprintf (f, "    &gt_ggc_m_");
3788 	    output_mangled_typename (f, tp);
3789 	    if (emit_pch)
3790 	      {
3791 		oprintf (f, ",\n    &gt_pch_n_");
3792 		output_mangled_typename (f, tp);
3793 	      }
3794 	    else
3795 	      oprintf (f, ",\n    NULL");
3796 	  }
3797 	else if (has_length
3798 		 && (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
3799 	  {
3800 	    oprintf (f, "    &gt_ggc_ma_%s,\n", name);
3801 	    if (emit_pch)
3802 	      oprintf (f, "    &gt_pch_na_%s", name);
3803 	    else
3804 	      oprintf (f, "    NULL");
3805 	  }
3806 	else
3807 	  {
3808 	    error_at_line (line,
3809 			   "global `%s' is pointer to unimplemented type",
3810 			   name);
3811 	  }
3812 	if (if_marked)
3813 	  oprintf (f, ",\n    &%s", if_marked);
3814 	oprintf (f, "\n  },\n");
3815       }
3816       break;
3817 
3818     case TYPE_STRING:
3819       {
3820 	if (!start_root_entry (f, v, name, line))
3821 	  return;
3822 
3823 	oprintf (f, "    (gt_pointer_walker) &gt_ggc_m_S,\n");
3824 	oprintf (f, "    (gt_pointer_walker) &gt_pch_n_S\n");
3825 	oprintf (f, "  },\n");
3826       }
3827       break;
3828 
3829     case TYPE_SCALAR:
3830       break;
3831 
3832     default:
3833       error_at_line (line, "global `%s' is unimplemented type", name);
3834     }
3835 }
3836 
3837 /* This generates a routine to walk an array.  */
3838 
3839 static void
3840 write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
3841 {
3842   struct walk_type_data d;
3843   char *prevval3;
3844 
3845   memset (&d, 0, sizeof (d));
3846   d.of = f;
3847   d.cookie = wtd;
3848   d.indent = 2;
3849   d.line = &v->line;
3850   d.opt = v->opt;
3851   d.bitmap = get_lang_bitmap (v->line.file);
3852   d.param = NULL;
3853 
3854   d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name);
3855 
3856   if (wtd->param_prefix)
3857     {
3858       oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
3859       oprintf (f, "    (void *, void *, gt_pointer_operator, void *);\n");
3860       oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3861 	       wtd->param_prefix, v->name);
3862       oprintf (d.of,
3863 	       "      ATTRIBUTE_UNUSED void *x_p,\n"
3864 	       "      ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3865 	       "      ATTRIBUTE_UNUSED void * cookie)\n");
3866       oprintf (d.of, "{\n");
3867       d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3868       d.process_field = write_types_local_process_field;
3869       walk_type (v->type, &d);
3870       oprintf (f, "}\n\n");
3871     }
3872 
3873   d.opt = v->opt;
3874   oprintf (f, "static void gt_%sa_%s (void *);\n", wtd->prefix, v->name);
3875   oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3876 	   wtd->prefix, v->name);
3877   oprintf (f, "{\n");
3878   d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3879   d.process_field = write_types_process_field;
3880   walk_type (v->type, &d);
3881   free (prevval3);
3882   oprintf (f, "}\n\n");
3883 }
3884 
3885 /* Output a table describing the locations and types of VARIABLES.  */
3886 
3887 static void
3888 write_roots (pair_p variables, bool emit_pch)
3889 {
3890   pair_p v;
3891   struct flist *flp = NULL;
3892 
3893   for (v = variables; v; v = v->next)
3894     {
3895       outf_p f =
3896 	get_output_file_with_visibility (CONST_CAST (input_file*,
3897 						     v->line.file));
3898       struct flist *fli;
3899       const char *length = NULL;
3900       int deletable_p = 0;
3901       options_p o;
3902       for (o = v->opt; o; o = o->next)
3903 	if (strcmp (o->name, "length") == 0
3904 	    && o->kind == OPTION_STRING)
3905 	  length = o->info.string;
3906 	else if (strcmp (o->name, "deletable") == 0)
3907 	  deletable_p = 1;
3908 	else if (strcmp (o->name, "param_is") == 0)
3909 	  ;
3910 	else if (strncmp (o->name, "param", 5) == 0
3911 		 && ISDIGIT (o->name[5]) && strcmp (o->name + 6, "_is") == 0)
3912 	  ;
3913 	else if (strcmp (o->name, "if_marked") == 0)
3914 	  ;
3915 	else
3916 	  error_at_line (&v->line,
3917 			 "global `%s' has unknown option `%s'",
3918 			 v->name, o->name);
3919 
3920       for (fli = flp; fli; fli = fli->next)
3921 	if (fli->f == f && f)
3922 	  break;
3923       if (fli == NULL)
3924 	{
3925 	  fli = XNEW (struct flist);
3926 	  fli->f = f;
3927 	  fli->next = flp;
3928 	  fli->started_p = 0;
3929 	  fli->file = v->line.file;
3930 	  gcc_assert (fli->file);
3931 	  flp = fli;
3932 
3933 	  oprintf (f, "\n/* GC roots.  */\n\n");
3934 	}
3935 
3936       if (!deletable_p
3937 	  && length
3938 	  && v->type->kind == TYPE_POINTER
3939 	  && (v->type->u.p->kind == TYPE_POINTER
3940 	      || v->type->u.p->kind == TYPE_STRUCT))
3941 	{
3942 	  write_array (f, v, &ggc_wtd);
3943 	  write_array (f, v, &pch_wtd);
3944 	}
3945     }
3946 
3947   for (v = variables; v; v = v->next)
3948     {
3949       outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
3950 							      v->line.file));
3951       struct flist *fli;
3952       int skip_p = 0;
3953       int length_p = 0;
3954       options_p o;
3955 
3956       for (o = v->opt; o; o = o->next)
3957 	if (strcmp (o->name, "length") == 0)
3958 	  length_p = 1;
3959 	else if (strcmp (o->name, "deletable") == 0
3960 		 || strcmp (o->name, "if_marked") == 0)
3961 	  skip_p = 1;
3962 
3963       if (skip_p)
3964 	continue;
3965 
3966       for (fli = flp; fli; fli = fli->next)
3967 	if (fli->f == f)
3968 	  break;
3969       if (!fli->started_p)
3970 	{
3971 	  fli->started_p = 1;
3972 
3973 	  oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
3974 	  put_mangled_filename (f, v->line.file);
3975 	  oprintf (f, "[] = {\n");
3976 	}
3977 
3978       write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3979     }
3980 
3981   finish_root_table (flp, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3982 		     "gt_ggc_rtab");
3983 
3984   for (v = variables; v; v = v->next)
3985     {
3986       outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
3987 							      v->line.file));
3988       struct flist *fli;
3989       int skip_p = 1;
3990       options_p o;
3991 
3992       for (o = v->opt; o; o = o->next)
3993 	if (strcmp (o->name, "deletable") == 0)
3994 	  skip_p = 0;
3995 	else if (strcmp (o->name, "if_marked") == 0)
3996 	  skip_p = 1;
3997 
3998       if (skip_p)
3999 	continue;
4000 
4001       for (fli = flp; fli; fli = fli->next)
4002 	if (fli->f == f)
4003 	  break;
4004       if (!fli->started_p)
4005 	{
4006 	  fli->started_p = 1;
4007 
4008 	  oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
4009 	  put_mangled_filename (f, v->line.file);
4010 	  oprintf (f, "[] = {\n");
4011 	}
4012 
4013       oprintf (f, "  { &%s, 1, sizeof (%s), NULL, NULL },\n",
4014 	       v->name, v->name);
4015     }
4016 
4017   finish_root_table (flp, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4018 		     "gt_ggc_deletable_rtab");
4019 
4020   for (v = variables; v; v = v->next)
4021     {
4022       outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
4023 							      v->line.file));
4024       struct flist *fli;
4025       const char *if_marked = NULL;
4026       int length_p = 0;
4027       options_p o;
4028 
4029       for (o = v->opt; o; o = o->next)
4030 	if (strcmp (o->name, "length") == 0)
4031 	  length_p = 1;
4032 	else if (strcmp (o->name, "if_marked") == 0
4033 		       && o->kind == OPTION_STRING)
4034 	  if_marked = o->info.string;
4035        if (if_marked == NULL)
4036 	continue;
4037       if (v->type->kind != TYPE_POINTER
4038 	  || v->type->u.p->kind != TYPE_PARAM_STRUCT
4039 	  || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
4040 	{
4041 	  error_at_line (&v->line,
4042 			 "if_marked option used but not hash table");
4043 	  continue;
4044 	}
4045 
4046       for (fli = flp; fli; fli = fli->next)
4047 	if (fli->f == f)
4048 	  break;
4049       if (!fli->started_p)
4050 	{
4051 	  fli->started_p = 1;
4052 
4053 	  oprintf (f, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
4054 	  put_mangled_filename (f, v->line.file);
4055 	  oprintf (f, "[] = {\n");
4056 	}
4057 
4058       write_root (f, v, v->type->u.p->u.param_struct.param[0],
4059 		  v->name, length_p, &v->line, if_marked, emit_pch);
4060     }
4061 
4062   finish_root_table (flp, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
4063 		     "gt_ggc_cache_rtab");
4064 
4065   if (!emit_pch)
4066     return;
4067 
4068   for (v = variables; v; v = v->next)
4069     {
4070       outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
4071 							      v->line.file));
4072       struct flist *fli;
4073       int length_p = 0;
4074       int if_marked_p = 0;
4075       options_p o;
4076 
4077       for (o = v->opt; o; o = o->next)
4078 	if (strcmp (o->name, "length") == 0)
4079 	  length_p = 1;
4080 	else if (strcmp (o->name, "if_marked") == 0)
4081 	  if_marked_p = 1;
4082 
4083       if (!if_marked_p)
4084 	continue;
4085 
4086       for (fli = flp; fli; fli = fli->next)
4087 	if (fli->f == f)
4088 	  break;
4089       if (!fli->started_p)
4090 	{
4091 	  fli->started_p = 1;
4092 
4093 	  oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
4094 	  put_mangled_filename (f, v->line.file);
4095 	  oprintf (f, "[] = {\n");
4096 	}
4097 
4098       write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
4099     }
4100 
4101   finish_root_table (flp, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4102 		     "gt_pch_cache_rtab");
4103 
4104   for (v = variables; v; v = v->next)
4105     {
4106       outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
4107 							      v->line.file));
4108       struct flist *fli;
4109       int skip_p = 0;
4110       options_p o;
4111 
4112       for (o = v->opt; o; o = o->next)
4113 	if (strcmp (o->name, "deletable") == 0
4114 	    || strcmp (o->name, "if_marked") == 0)
4115 	  skip_p = 1;
4116 
4117       if (skip_p)
4118 	continue;
4119 
4120       if (!contains_scalar_p (v->type))
4121 	continue;
4122 
4123       for (fli = flp; fli; fli = fli->next)
4124 	if (fli->f == f)
4125 	  break;
4126       if (!fli->started_p)
4127 	{
4128 	  fli->started_p = 1;
4129 
4130 	  oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
4131 	  put_mangled_filename (f, v->line.file);
4132 	  oprintf (f, "[] = {\n");
4133 	}
4134 
4135       oprintf (f, "  { &%s, 1, sizeof (%s), NULL, NULL },\n",
4136 	       v->name, v->name);
4137     }
4138 
4139   finish_root_table (flp, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4140 		     "gt_pch_scalar_rtab");
4141 }
4142 /* Record the definition of the vec_prefix structure, as defined in vec.h:
4143 
4144    struct vec_prefix GTY(()) {
4145    unsigned num;
4146    unsigned alloc;
4147    };  */
4148 static type_p
4149 vec_prefix_type (void)
4150 {
4151   static type_p prefix_type = NULL;
4152   if (prefix_type == NULL)
4153     {
4154       pair_p fields;
4155       static struct fileloc pos = { NULL, 0 };
4156       type_p len_ty = create_scalar_type ("unsigned");
4157       pos.file = input_file_by_name (__FILE__); pos.line = __LINE__;
4158       fields = create_field_at (0, len_ty, "alloc", 0, &pos);
4159       fields = create_field_at (fields, len_ty, "num", 0, &pos);
4160       prefix_type = new_structure ("vec_prefix", 0, &pos, fields, 0);
4161       prefix_type->u.s.bitmap = -1;
4162     }
4163   return prefix_type;
4164 }
4165 
4166 /* Record the definition of a generic VEC structure, as if we had expanded
4167    the macros in vec.h:
4168 
4169    typedef struct VEC_<type>_base GTY(()) {
4170    struct vec_prefix prefix;
4171    <type> GTY((length ("%h.prefix.num"))) vec[1];
4172    } VEC_<type>_base
4173 
4174    where the GTY(()) tags are only present if is_scalar is _false_.  */
4175 
4176 void
4177 note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
4178 {
4179   pair_p fields;
4180   type_p t;
4181   options_p o;
4182   const char *name = concat ("VEC_", type_name, "_base", (char *) 0);
4183 
4184   if (is_scalar)
4185     {
4186       t = create_scalar_type (type_name);
4187       o = 0;
4188     }
4189   else
4190     {
4191       t = resolve_typedef (type_name, pos);
4192       o = create_string_option (0, "length", "%h.prefix.num");
4193     }
4194   /* We assemble the field list in reverse order.  */
4195   fields = create_field_at (0, create_array (t, "1"), "vec", o, pos);
4196   fields = create_field_at (fields, vec_prefix_type (), "prefix", 0, pos);
4197 
4198   do_typedef (name, new_structure (name, 0, pos, fields, 0), pos);
4199 }
4200 
4201 /* Record the definition of an allocation-specific VEC structure, as if
4202    we had expanded the macros in vec.h:
4203 
4204    typedef struct VEC_<type>_<astrat> {
4205      VEC_<type>_base base;
4206    } VEC_<type>_<astrat>;
4207 */
4208 void
4209 note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
4210 {
4211   const char *astratname = concat ("VEC_", type, "_", astrat, (char *) 0);
4212   const char *basename = concat ("VEC_", type, "_base", (char *) 0);
4213 
4214   pair_p field = create_field_at (0, resolve_typedef (basename, pos),
4215 				  "base", 0, pos);
4216 
4217   do_typedef (astratname, new_structure (astratname, 0, pos, field, 0), pos);
4218 }
4219 
4220 /* Returns the specifier keyword for a string or union type S, empty string
4221    otherwise.  */
4222 
4223 static const char *
4224 get_type_specifier (const type_p s)
4225 {
4226   if (s->kind == TYPE_STRUCT || s->kind == TYPE_LANG_STRUCT)
4227     return "struct ";
4228   if (s->kind == TYPE_UNION)
4229     return "union ";
4230   return "";
4231 }
4232 
4233 /* TRUE if type S has the GTY variable_size annotation.  */
4234 
4235 static bool
4236 variable_size_p (const type_p s)
4237 {
4238   options_p o;
4239   for (o = s->u.s.opt; o; o = o->next)
4240     if (strcmp (o->name, "variable_size") == 0)
4241       return true;
4242   return false;
4243 }
4244 
4245 enum alloc_quantity
4246 { single, vector };
4247 enum alloc_zone
4248 { any_zone, specific_zone };
4249 
4250 /* Writes one typed allocator definition into output F for type
4251    identifier TYPE_NAME with optional type specifier TYPE_SPECIFIER.
4252    The allocator name will contain ALLOCATOR_TYPE.  If VARIABLE_SIZE
4253    is true, the allocator will have an extra parameter specifying
4254    number of bytes to allocate.  If QUANTITY is set to VECTOR, a
4255    vector allocator will be output, if ZONE is set to SPECIFIC_ZONE,
4256    the allocator will be zone-specific.  */
4257 
4258 static void
4259 write_typed_alloc_def (outf_p f,
4260                        bool variable_size, const char *type_specifier,
4261                        const char *type_name, const char *allocator_type,
4262                        enum alloc_quantity quantity, enum alloc_zone zone)
4263 {
4264   bool two_args = variable_size && (quantity == vector);
4265   bool third_arg = ((zone == specific_zone)
4266 		    && (variable_size || (quantity == vector)));
4267   gcc_assert (f != NULL);
4268   oprintf (f, "#define ggc_alloc_%s%s", allocator_type, type_name);
4269   oprintf (f, "(%s%s%s%s%s) ",
4270 	   (variable_size ? "SIZE" : ""),
4271 	   (two_args ? ", " : ""),
4272 	   (quantity == vector) ? "n" : "",
4273 	   (third_arg ? ", " : ""), (zone == specific_zone) ? "z" : "");
4274   oprintf (f, "((%s%s *)", type_specifier, type_name);
4275   oprintf (f, "(ggc_internal_%salloc_stat (", allocator_type);
4276   if (zone == specific_zone)
4277     oprintf (f, "z, ");
4278   if (variable_size)
4279     oprintf (f, "SIZE");
4280   else
4281     oprintf (f, "sizeof (%s%s)", type_specifier, type_name);
4282   if (quantity == vector)
4283     oprintf (f, ", n");
4284   oprintf (f, " MEM_STAT_INFO)))\n");
4285 }
4286 
4287 /* Writes a typed allocator definition into output F for a struct or
4288    union S, with a given ALLOCATOR_TYPE and QUANTITY for ZONE.  */
4289 
4290 static void
4291 write_typed_struct_alloc_def (outf_p f,
4292 			      const type_p s, const char *allocator_type,
4293 			      enum alloc_quantity quantity,
4294 			      enum alloc_zone zone)
4295 {
4296   gcc_assert (UNION_OR_STRUCT_P (s));
4297   write_typed_alloc_def (f, variable_size_p (s), get_type_specifier (s),
4298                          s->u.s.tag, allocator_type, quantity, zone);
4299 }
4300 
4301 /* Writes a typed allocator definition into output F for a typedef P,
4302    with a given ALLOCATOR_TYPE and QUANTITY for ZONE.  */
4303 
4304 static void
4305 write_typed_typedef_alloc_def (outf_p f,
4306                                const pair_p p, const char *allocator_type,
4307                                enum alloc_quantity quantity,
4308                                enum alloc_zone zone)
4309 {
4310   write_typed_alloc_def (f, variable_size_p (p->type), "", p->name,
4311                          allocator_type, quantity, zone);
4312 }
4313 
4314 /* Writes typed allocator definitions into output F for the types in
4315    STRUCTURES and TYPEDEFS that are used by GC.  */
4316 
4317 static void
4318 write_typed_alloc_defns (outf_p f,
4319                          const type_p structures, const pair_p typedefs)
4320 {
4321   type_p s;
4322   pair_p p;
4323 
4324   gcc_assert (f != NULL);
4325   oprintf (f,
4326 	   "\n/* Allocators for known structs and unions.  */\n\n");
4327   for (s = structures; s; s = s->next)
4328     {
4329       if (!USED_BY_TYPED_GC_P (s))
4330 	continue;
4331       gcc_assert (UNION_OR_STRUCT_P (s));
4332       /* In plugin mode onput output ggc_alloc macro definitions
4333 	 relevant to plugin input files.  */
4334       if (nb_plugin_files > 0
4335 	  && ((s->u.s.line.file == NULL) || !s->u.s.line.file->inpisplugin))
4336 	continue;
4337       write_typed_struct_alloc_def (f, s, "", single, any_zone);
4338       write_typed_struct_alloc_def (f, s, "cleared_", single, any_zone);
4339       write_typed_struct_alloc_def (f, s, "vec_", vector, any_zone);
4340       write_typed_struct_alloc_def (f, s, "cleared_vec_", vector, any_zone);
4341       write_typed_struct_alloc_def (f, s, "zone_", single, specific_zone);
4342       write_typed_struct_alloc_def (f, s, "zone_cleared_", single,
4343 				    specific_zone);
4344       write_typed_struct_alloc_def (f, s, "zone_vec_", vector, specific_zone);
4345       write_typed_struct_alloc_def (f, s, "zone_cleared_vec_", vector,
4346 				    specific_zone);
4347     }
4348 
4349   oprintf (f, "\n/* Allocators for known typedefs.  */\n");
4350   for (p = typedefs; p; p = p->next)
4351     {
4352       s = p->type;
4353       if (!USED_BY_TYPED_GC_P (s) || (strcmp (p->name, s->u.s.tag) == 0))
4354 	continue;
4355       /* In plugin mode onput output ggc_alloc macro definitions
4356 	 relevant to plugin input files.  */
4357       if (nb_plugin_files > 0)
4358 	{
4359 	  struct fileloc* filoc = type_fileloc(s);
4360 	  if (!filoc || !filoc->file->inpisplugin)
4361 	    continue;
4362 	};
4363       write_typed_typedef_alloc_def (f, p, "", single, any_zone);
4364       write_typed_typedef_alloc_def (f, p, "cleared_", single, any_zone);
4365       write_typed_typedef_alloc_def (f, p, "vec_", vector, any_zone);
4366       write_typed_typedef_alloc_def (f, p, "cleared_vec_", vector, any_zone);
4367       write_typed_typedef_alloc_def (f, p, "zone_", single, specific_zone);
4368       write_typed_typedef_alloc_def (f, p, "zone_cleared_", single,
4369 				     specific_zone);
4370       write_typed_typedef_alloc_def (f, p, "zone_cleared_vec_", vector,
4371 				     specific_zone);
4372     }
4373 }
4374 
4375 /* Prints not-as-ugly version of a typename of T to OF.  Trades the uniquness
4376    guaranteee for somewhat increased readability.  If name conflicts do happen,
4377    this funcion will have to be adjusted to be more like
4378    output_mangled_typename.  */
4379 
4380 static void
4381 output_typename (outf_p of, const_type_p t)
4382 {
4383   switch (t->kind)
4384     {
4385     case TYPE_STRING:
4386       oprintf (of, "str");
4387       break;
4388     case TYPE_SCALAR:
4389       oprintf (of, "scalar");
4390       break;
4391     case TYPE_POINTER:
4392       output_typename (of, t->u.p);
4393       break;
4394     case TYPE_STRUCT:
4395     case TYPE_UNION:
4396     case TYPE_LANG_STRUCT:
4397       oprintf (of, "%s", t->u.s.tag);
4398       break;
4399     case TYPE_PARAM_STRUCT:
4400       {
4401 	int i;
4402 	for (i = 0; i < NUM_PARAM; i++)
4403 	  if (t->u.param_struct.param[i] != NULL)
4404 	    {
4405 	      output_typename (of, t->u.param_struct.param[i]);
4406 	      oprintf (of, "_");
4407 	    }
4408 	output_typename (of, t->u.param_struct.stru);
4409 	break;
4410       }
4411     default:
4412       gcc_unreachable ();
4413     }
4414 }
4415 
4416 /* Writes a typed GC allocator for type S that is suitable as a callback for
4417    the splay tree implementation in libiberty.  */
4418 
4419 static void
4420 write_splay_tree_allocator_def (const_type_p s)
4421 {
4422   outf_p of = get_output_file_with_visibility (NULL);
4423   oprintf (of, "void * ggc_alloc_splay_tree_");
4424   output_typename (of, s);
4425   oprintf (of, " (int sz, void * nl)\n");
4426   oprintf (of, "{\n");
4427   oprintf (of, "  return ggc_splay_alloc (");
4428   oprintf (of, "gt_e_");
4429   output_mangled_typename (of, s);
4430   oprintf (of, ", sz, nl);\n");
4431   oprintf (of, "}\n\n");
4432 }
4433 
4434 /* Writes typed GC allocators for PARAM_STRUCTS that are suitable as callbacks
4435    for the splay tree implementation in libiberty.  */
4436 
4437 static void
4438 write_splay_tree_allocators (const_type_p param_structs)
4439 {
4440   const_type_p s;
4441 
4442   oprintf (header_file, "\n/* Splay tree callback allocators.  */\n");
4443   for (s = param_structs; s; s = s->next)
4444     if (s->gc_used == GC_POINTED_TO)
4445       {
4446 	oprintf (header_file, "extern void * ggc_alloc_splay_tree_");
4447 	output_typename (header_file, s);
4448 	oprintf (header_file, " (int, void *);\n");
4449 	write_splay_tree_allocator_def (s);
4450       }
4451 }
4452 
4453 static void dump_pair (int indent, pair_p p);
4454 static void dump_type (int indent, type_p p);
4455 static void dump_type_list (int indent, type_p p);
4456 
4457 #define INDENT 2
4458 
4459 /* Dumps the value of typekind KIND.  */
4460 
4461 static void
4462 dump_typekind (int indent, enum typekind kind)
4463 {
4464   printf ("%*ckind = ", indent, ' ');
4465   switch (kind)
4466     {
4467     case TYPE_SCALAR:
4468       printf ("TYPE_SCALAR");
4469       break;
4470     case TYPE_STRING:
4471       printf ("TYPE_STRING");
4472       break;
4473     case TYPE_STRUCT:
4474       printf ("TYPE_STRUCT");
4475       break;
4476     case TYPE_UNION:
4477       printf ("TYPE_UNION");
4478       break;
4479     case TYPE_POINTER:
4480       printf ("TYPE_POINTER");
4481       break;
4482     case TYPE_ARRAY:
4483       printf ("TYPE_ARRAY");
4484       break;
4485     case TYPE_LANG_STRUCT:
4486       printf ("TYPE_LANG_STRUCT");
4487       break;
4488     case TYPE_PARAM_STRUCT:
4489       printf ("TYPE_PARAM_STRUCT");
4490       break;
4491     default:
4492       gcc_unreachable ();
4493     }
4494   printf ("\n");
4495 }
4496 
4497 /* Dumps the value of GC_USED flag.  */
4498 
4499 static void
4500 dump_gc_used (int indent, enum gc_used_enum gc_used)
4501 {
4502   printf ("%*cgc_used = ", indent, ' ');
4503   switch (gc_used)
4504     {
4505     case GC_UNUSED:
4506       printf ("GC_UNUSED");
4507       break;
4508     case GC_USED:
4509       printf ("GC_USED");
4510       break;
4511     case GC_MAYBE_POINTED_TO:
4512       printf ("GC_MAYBE_POINTED_TO");
4513       break;
4514     case GC_POINTED_TO:
4515       printf ("GC_POINTED_TO");
4516       break;
4517     default:
4518       gcc_unreachable ();
4519     }
4520   printf ("\n");
4521 }
4522 
4523 /* Dumps the type options OPT.  */
4524 
4525 static void
4526 dump_options (int indent, options_p opt)
4527 {
4528   options_p o;
4529   printf ("%*coptions = ", indent, ' ');
4530   o = opt;
4531   while (o)
4532     {
4533       switch (o->kind)
4534 	{
4535 	case OPTION_STRING:
4536 	  printf ("%s:string %s ", o->name, o->info.string);
4537 	  break;
4538 	case OPTION_TYPE:
4539 	  printf ("%s:type ", o->name);
4540 	  dump_type (indent+1, o->info.type);
4541 	  break;
4542 	case OPTION_NESTED:
4543 	  printf ("%s:nested ", o->name);
4544 	  break;
4545 	case OPTION_NONE:
4546 	  gcc_unreachable ();
4547 	}
4548       o = o->next;
4549     }
4550   printf ("\n");
4551 }
4552 
4553 /* Dumps the source file location in LINE.  */
4554 
4555 static void
4556 dump_fileloc (int indent, struct fileloc line)
4557 {
4558   printf ("%*cfileloc: file = %s, line = %d\n", indent, ' ',
4559 	  get_input_file_name (line.file),
4560 	  line.line);
4561 }
4562 
4563 /* Recursively dumps the struct, union, or a language-specific
4564    struct T.  */
4565 
4566 static void
4567 dump_type_u_s (int indent, type_p t)
4568 {
4569   pair_p fields;
4570 
4571   gcc_assert (t->kind == TYPE_STRUCT || t->kind == TYPE_UNION
4572 	      || t->kind == TYPE_LANG_STRUCT);
4573   printf ("%*cu.s.tag = %s\n", indent, ' ', t->u.s.tag);
4574   dump_fileloc (indent, t->u.s.line);
4575   printf ("%*cu.s.fields =\n", indent, ' ');
4576   fields = t->u.s.fields;
4577   while (fields)
4578     {
4579       dump_pair (indent + INDENT, fields);
4580       fields = fields->next;
4581     }
4582   printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t);
4583   dump_options (indent, t->u.s.opt);
4584   printf ("%*cu.s.bitmap = %X\n", indent, ' ', t->u.s.bitmap);
4585   if (t->kind == TYPE_LANG_STRUCT)
4586     {
4587       printf ("%*cu.s.lang_struct:\n", indent, ' ');
4588       dump_type_list (indent + INDENT, t->u.s.lang_struct);
4589     }
4590 }
4591 
4592 /* Recursively dumps the array T.  */
4593 
4594 static void
4595 dump_type_u_a (int indent, type_p t)
4596 {
4597   gcc_assert (t->kind == TYPE_ARRAY);
4598   printf ("%*clen = %s, u.a.p:\n", indent, ' ', t->u.a.len);
4599   dump_type_list (indent + INDENT, t->u.a.p);
4600 }
4601 
4602 /* Recursively dumps the parameterized struct T.  */
4603 
4604 static void
4605 dump_type_u_param_struct (int indent, type_p t)
4606 {
4607   int i;
4608   gcc_assert (t->kind == TYPE_PARAM_STRUCT);
4609   printf ("%*cu.param_struct.stru:\n", indent, ' ');
4610   dump_type_list (indent, t->u.param_struct.stru);
4611   dump_fileloc (indent, t->u.param_struct.line);
4612   for (i = 0; i < NUM_PARAM; i++)
4613     {
4614       if (t->u.param_struct.param[i] == NULL)
4615 	continue;
4616       printf ("%*cu.param_struct.param[%d]:\n", indent, ' ', i);
4617       dump_type (indent + INDENT, t->u.param_struct.param[i]);
4618     }
4619 }
4620 
4621 /* Recursively dumps the type list T.  */
4622 
4623 static void
4624 dump_type_list (int indent, type_p t)
4625 {
4626   type_p p = t;
4627   while (p)
4628     {
4629       dump_type (indent, p);
4630       p = p->next;
4631     }
4632 }
4633 
4634 static htab_t seen_types;
4635 
4636 /* Recursively dumps the type T if it was not dumped previously.  */
4637 
4638 static void
4639 dump_type (int indent, type_p t)
4640 {
4641   PTR *slot;
4642 
4643   printf ("%*cType at %p: ", indent, ' ', (void *) t);
4644   slot = htab_find_slot (seen_types, t, INSERT);
4645   if (*slot != NULL)
4646     {
4647       printf ("already seen.\n");
4648       return;
4649     }
4650   *slot = t;
4651   printf ("\n");
4652 
4653   dump_typekind (indent, t->kind);
4654   printf ("%*cpointer_to = %p\n", indent + INDENT, ' ',
4655 	  (void *) t->pointer_to);
4656   dump_gc_used (indent + INDENT, t->gc_used);
4657   switch (t->kind)
4658     {
4659     case TYPE_SCALAR:
4660       printf ("%*cscalar_is_char = %s\n", indent + INDENT, ' ',
4661 	      t->u.scalar_is_char ? "true" : "false");
4662       break;
4663     case TYPE_STRING:
4664       break;
4665     case TYPE_STRUCT:
4666     case TYPE_UNION:
4667     case TYPE_LANG_STRUCT:
4668       dump_type_u_s (indent + INDENT, t);
4669       break;
4670     case TYPE_POINTER:
4671       printf ("%*cp:\n", indent + INDENT, ' ');
4672       dump_type (indent + INDENT, t->u.p);
4673       break;
4674     case TYPE_ARRAY:
4675       dump_type_u_a (indent + INDENT, t);
4676       break;
4677     case TYPE_PARAM_STRUCT:
4678       dump_type_u_param_struct (indent + INDENT, t);
4679       break;
4680     default:
4681       gcc_unreachable ();
4682     }
4683   printf ("%*cEnd of type at %p\n", indent, ' ', (void *) t);
4684 }
4685 
4686 /* Dumps the pair P.  */
4687 
4688 static void
4689 dump_pair (int indent, pair_p p)
4690 {
4691   printf ("%*cpair: name = %s\n", indent, ' ', p->name);
4692   dump_type (indent, p->type);
4693   dump_fileloc (indent, p->line);
4694   dump_options (indent, p->opt);
4695   printf ("%*cEnd of pair %s\n", indent, ' ', p->name);
4696 }
4697 
4698 /* Dumps the list of pairs PP.  */
4699 
4700 static void
4701 dump_pair_list (const char *name, pair_p pp)
4702 {
4703   pair_p p;
4704   printf ("%s:\n", name);
4705   for (p = pp; p != NULL; p = p->next)
4706     dump_pair (0, p);
4707   printf ("End of %s\n\n", name);
4708 }
4709 
4710 /* Dumps the STRUCTURES.  */
4711 
4712 static void
4713 dump_structures (const char *name, type_p structures)
4714 {
4715   printf ("%s:\n", name);
4716   dump_type_list (0, structures);
4717   printf ("End of %s\n\n", name);
4718 }
4719 
4720 /* Dumps the internal structures of gengtype.  This is useful to debug
4721    gengtype itself, or to understand what it does, e.g. for plugin
4722    developers.  */
4723 
4724 static void
4725 dump_everything (void)
4726 {
4727   seen_types = htab_create (100, htab_hash_pointer, htab_eq_pointer, NULL);
4728   dump_pair_list ("typedefs", typedefs);
4729   dump_structures ("structures", structures);
4730   dump_structures ("param_structs", param_structs);
4731   dump_pair_list ("variables", variables);
4732   htab_delete (seen_types);
4733 }
4734 
4735 
4736 
4737 /* Option specification for getopt_long.  */
4738 static const struct option gengtype_long_options[] = {
4739   {"help", no_argument, NULL, 'h'},
4740   {"version", no_argument, NULL, 'V'},
4741   {"verbose", no_argument, NULL, 'v'},
4742   {"dump", no_argument, NULL, 'd'},
4743   {"debug", no_argument, NULL, 'D'},
4744   {"plugin", required_argument, NULL, 'P'},
4745   {"srcdir", required_argument, NULL, 'S'},
4746   {"backupdir", required_argument, NULL, 'B'},
4747   {"inputs", required_argument, NULL, 'I'},
4748   {"read-state", required_argument, NULL, 'r'},
4749   {"write-state", required_argument, NULL, 'w'},
4750   /* Terminating NULL placeholder.  */
4751   {NULL, no_argument, NULL, 0},
4752 };
4753 
4754 
4755 static void
4756 print_usage (void)
4757 {
4758   printf ("Usage: %s\n", progname);
4759   printf ("\t -h | --help " " \t# Give this help.\n");
4760   printf ("\t -D | --debug "
4761 	  " \t# Give debug output to debug %s itself.\n", progname);
4762   printf ("\t -V | --version " " \t# Give version information.\n");
4763   printf ("\t -v | --verbose  \t# Increase verbosity.  Can be given several times.\n");
4764   printf ("\t -d | --dump " " \t# Dump state for debugging.\n");
4765   printf ("\t -P | --plugin <output-file> <plugin-src> ... "
4766 	  " \t# Generate for plugin.\n");
4767   printf ("\t -S | --srcdir <GCC-directory> "
4768 	  " \t# Specify the GCC source directory.\n");
4769   printf ("\t -B | --backupdir <directory> "
4770 	  " \t# Specify the backup directory for updated files.\n");
4771   printf ("\t -I | --inputs <input-list> "
4772 	  " \t# Specify the file with source files list.\n");
4773   printf ("\t -w | --write-state <state-file> " " \t# Write a state file.\n");
4774   printf ("\t -r | --read-state <state-file> " " \t# Read a state file.\n");
4775 }
4776 
4777 static void
4778 print_version (void)
4779 {
4780   printf ("%s %s%s\n", progname, pkgversion_string, version_string);
4781   printf ("Report bugs: %s\n", bug_report_url);
4782 }
4783 
4784 /* Parse the program options using getopt_long... */
4785 static void
4786 parse_program_options (int argc, char **argv)
4787 {
4788   int opt = -1;
4789   while ((opt = getopt_long (argc, argv, "hVvdP:S:B:I:w:r:D",
4790 			     gengtype_long_options, NULL)) >= 0)
4791     {
4792       switch (opt)
4793 	{
4794 	case 'h':		/* --help */
4795 	  print_usage ();
4796 	  break;
4797 	case 'V':		/* --version */
4798 	  print_version ();
4799 	  break;
4800 	case 'd':		/* --dump */
4801 	  do_dump = 1;
4802 	  break;
4803 	case 'D':		/* --debug */
4804 	  do_debug = 1;
4805 	  break;
4806 	case 'v':		/* --verbose */
4807 	  verbosity_level++;
4808 	  break;
4809 	case 'P':		/* --plugin */
4810 	  if (optarg)
4811 	    plugin_output_filename = optarg;
4812 	  else
4813 	    fatal ("missing plugin output file name");
4814 	  break;
4815 	case 'S':		/* --srcdir */
4816 	  if (optarg)
4817 	    srcdir = optarg;
4818 	  else
4819 	    fatal ("missing source directory");
4820 	  srcdir_len = strlen (srcdir);
4821 	  break;
4822 	case 'B':		/* --backupdir */
4823 	  if (optarg)
4824 	    backup_dir = optarg;
4825 	  else
4826 	    fatal ("missing backup directory");
4827 	  break;
4828 	case 'I':		/* --inputs */
4829 	  if (optarg)
4830 	    inputlist = optarg;
4831 	  else
4832 	    fatal ("missing input list");
4833 	  break;
4834 	case 'r':		/* --read-state */
4835 	  if (optarg)
4836 	    read_state_filename = optarg;
4837 	  else
4838 	    fatal ("missing read state file");
4839 	  DBGPRINTF ("read state %s\n", optarg);
4840 	  break;
4841 	case 'w':		/* --write-state */
4842 	  DBGPRINTF ("write state %s\n", optarg);
4843 	  if (optarg)
4844 	    write_state_filename = optarg;
4845 	  else
4846 	    fatal ("missing write state file");
4847 	  break;
4848 	default:
4849 	  fprintf (stderr, "%s: unknown flag '%c'\n", progname, opt);
4850 	  print_usage ();
4851 	  fatal ("unexpected flag");
4852 	}
4853     };
4854   if (plugin_output_filename)
4855     {
4856       /* In plugin mode we require some input files.  */
4857       int i = 0;
4858       if (optind >= argc)
4859 	fatal ("no source files given in plugin mode");
4860       nb_plugin_files = argc - optind;
4861       plugin_files = XNEWVEC (input_file*, nb_plugin_files);
4862       for (i = 0; i < (int) nb_plugin_files; i++)
4863 	{
4864 	  char *name = argv[i + optind];
4865 	  plugin_files[i] = input_file_by_name (name);
4866 	}
4867     }
4868 }
4869 
4870 
4871 
4872 /******* Manage input files.  ******/
4873 
4874 /* Hash table of unique input file names.  */
4875 static htab_t input_file_htab;
4876 
4877 /* Find or allocate a new input_file by hash-consing it.  */
4878 input_file*
4879 input_file_by_name (const char* name)
4880 {
4881   PTR* slot;
4882   input_file* f = NULL;
4883   int namlen = 0;
4884   if (!name)
4885     return NULL;
4886   namlen = strlen (name);
4887   f = XCNEWVAR (input_file, sizeof (input_file)+namlen+2);
4888   f->inpbitmap = 0;
4889   f->inpoutf = NULL;
4890   f->inpisplugin = false;
4891   strcpy (f->inpname, name);
4892   slot = htab_find_slot (input_file_htab, f, INSERT);
4893   gcc_assert (slot != NULL);
4894   if (*slot)
4895     {
4896       /* Already known input file.  */
4897       free (f);
4898       return (input_file*)(*slot);
4899     }
4900   /* New input file.  */
4901   *slot = f;
4902   return f;
4903     }
4904 
4905 /* Hash table support routines for input_file-s.  */
4906 static hashval_t
4907 htab_hash_inputfile (const void *p)
4908 {
4909   const input_file *inpf = (const input_file *) p;
4910   gcc_assert (inpf);
4911   return htab_hash_string (get_input_file_name (inpf));
4912 }
4913 
4914 static int
4915 htab_eq_inputfile (const void *x, const void *y)
4916 {
4917   const input_file *inpfx = (const input_file *) x;
4918   const input_file *inpfy = (const input_file *) y;
4919   gcc_assert (inpfx != NULL && inpfy != NULL);
4920   return !filename_cmp (get_input_file_name (inpfx), get_input_file_name (inpfy));
4921 }
4922 
4923 
4924 int
4925 main (int argc, char **argv)
4926 {
4927   size_t i;
4928   static struct fileloc pos = { NULL, 0 };
4929   outf_p output_header;
4930 
4931   /* Mandatory common initializations.  */
4932   progname = "gengtype";	/* For fatal and messages.  */
4933   /* Create the hash-table used to hash-cons input files.  */
4934   input_file_htab =
4935     htab_create (800, htab_hash_inputfile, htab_eq_inputfile, NULL);
4936   /* Initialize our special input files.  */
4937   this_file = input_file_by_name (__FILE__);
4938   system_h_file = input_file_by_name ("system.h");
4939   /* Set the scalar_is_char union number for predefined scalar types.  */
4940   scalar_nonchar.u.scalar_is_char = FALSE;
4941   scalar_char.u.scalar_is_char = TRUE;
4942 
4943   parse_program_options (argc, argv);
4944 
4945 #if ENABLE_CHECKING
4946   if (do_debug)
4947     {
4948       time_t now = (time_t) 0;
4949       time (&now);
4950       DBGPRINTF ("gengtype started pid %d at %s",
4951 		 (int) getpid (), ctime (&now));
4952     }
4953 #endif	/* ENABLE_CHECKING */
4954 
4955   /* Parse the input list and the input files.  */
4956   DBGPRINTF ("inputlist %s", inputlist);
4957   if (read_state_filename)
4958     {
4959       if (inputlist)
4960 	fatal ("input list %s cannot be given with a read state file %s",
4961 	       inputlist, read_state_filename);
4962       read_state (read_state_filename);
4963       DBGPRINT_COUNT_TYPE ("structures after read_state", structures);
4964       DBGPRINT_COUNT_TYPE ("param_structs after read_state", param_structs);
4965     }
4966   else if (inputlist)
4967     {
4968       /* These types are set up with #define or else outside of where
4969          we can see them.  We should initialize them before calling
4970          read_input_list.  */
4971 #define POS_HERE(Call) do { pos.file = this_file; pos.line = __LINE__; \
4972 	Call;} while(0)
4973       POS_HERE (do_scalar_typedef ("CUMULATIVE_ARGS", &pos));
4974       POS_HERE (do_scalar_typedef ("REAL_VALUE_TYPE", &pos));
4975       POS_HERE (do_scalar_typedef ("FIXED_VALUE_TYPE", &pos));
4976       POS_HERE (do_scalar_typedef ("double_int", &pos));
4977       POS_HERE (do_scalar_typedef ("uint64_t", &pos));
4978       POS_HERE (do_scalar_typedef ("uint8", &pos));
4979       POS_HERE (do_scalar_typedef ("jword", &pos));
4980       POS_HERE (do_scalar_typedef ("JCF_u2", &pos));
4981       POS_HERE (do_scalar_typedef ("void", &pos));
4982       POS_HERE (do_typedef ("PTR",
4983 			    create_pointer (resolve_typedef ("void", &pos)),
4984 			    &pos));
4985 #undef POS_HERE
4986       read_input_list (inputlist);
4987       for (i = 0; i < num_gt_files; i++)
4988 	{
4989 	  parse_file (get_input_file_name (gt_files[i]));
4990 	  DBGPRINTF ("parsed file #%d %s",
4991 		     (int) i, get_input_file_name (gt_files[i]));
4992 	}
4993       if (verbosity_level >= 1)
4994 	printf ("%s parsed %d files with %d GTY types\n",
4995 		progname, (int) num_gt_files, type_count);
4996 
4997       DBGPRINT_COUNT_TYPE ("structures after parsing", structures);
4998       DBGPRINT_COUNT_TYPE ("param_structs after parsing", param_structs);
4999 
5000     }
5001   else
5002     fatal ("either an input list or a read state file should be given");
5003   if (hit_error)
5004     return 1;
5005 
5006 
5007   if (plugin_output_filename)
5008     {
5009       size_t ix = 0;
5010       /* In plugin mode, we should have read a state file, and have
5011 	 given at least one plugin file.  */
5012       if (!read_state_filename)
5013 	fatal ("No read state given in plugin mode for %s",
5014 	       plugin_output_filename);
5015 
5016       if (nb_plugin_files == 0 || !plugin_files)
5017 	fatal ("No plugin files given in plugin mode for %s",
5018 	       plugin_output_filename);
5019 
5020       /* Parse our plugin files and augment the state.  */
5021       for (ix = 0; ix < nb_plugin_files; ix++)
5022 	{
5023 	  input_file* pluginput = plugin_files [ix];
5024 	  pluginput->inpisplugin = true;
5025 	  parse_file (get_input_file_name (pluginput));
5026 	}
5027       if (hit_error)
5028 	return 1;
5029 
5030       plugin_output = create_file ("GCC", plugin_output_filename);
5031       DBGPRINTF ("created plugin_output %p named %s",
5032 		 (void *) plugin_output, plugin_output->name);
5033     }
5034   else
5035     {				/* No plugin files, we are in normal mode.  */
5036       if (!srcdir)
5037 	fatal ("gengtype needs a source directory in normal mode");
5038     }
5039   if (hit_error)
5040     return 1;
5041 
5042   gen_rtx_next ();
5043 
5044   /* The call to set_gc_used may indirectly call find_param_structure
5045      hence enlarge the param_structs list of types.  */
5046   set_gc_used (variables);
5047 
5048  /* The state at this point is read from the state input file or by
5049     parsing source files and optionally augmented by parsing plugin
5050     source files.  Write it now.  */
5051   if (write_state_filename)
5052     {
5053       DBGPRINT_COUNT_TYPE ("structures before write_state", structures);
5054       DBGPRINT_COUNT_TYPE ("param_structs before write_state", param_structs);
5055 
5056       if (hit_error)
5057 	fatal ("didn't write state file %s after errors",
5058 	       write_state_filename);
5059 
5060       DBGPRINTF ("before write_state %s", write_state_filename);
5061       write_state (write_state_filename);
5062 
5063       if (do_dump)
5064 	dump_everything ();
5065 
5066       /* After having written the state file we return immediately to
5067 	 avoid generating any output file.  */
5068       if (hit_error)
5069 	return 1;
5070       else
5071 	return 0;
5072     }
5073 
5074 
5075   open_base_files ();
5076 
5077   write_enum_defn (structures, param_structs);
5078   output_header = plugin_output ? plugin_output : header_file;
5079   write_typed_alloc_defns (output_header, structures, typedefs);
5080   DBGPRINT_COUNT_TYPE ("structures before write_types outputheader",
5081 		       structures);
5082   DBGPRINT_COUNT_TYPE ("param_structs before write_types outputheader",
5083 		       param_structs);
5084 
5085   write_types (output_header, structures, param_structs, &ggc_wtd);
5086   if (plugin_files == NULL)
5087     {
5088       DBGPRINT_COUNT_TYPE ("structures before write_types headerfil",
5089 			   structures);
5090       DBGPRINT_COUNT_TYPE ("param_structs before write_types headerfil",
5091 			   param_structs);
5092       write_types (header_file, structures, param_structs, &pch_wtd);
5093       write_local (header_file, structures, param_structs);
5094     }
5095   write_splay_tree_allocators (param_structs);
5096   write_roots (variables, plugin_files == NULL);
5097   write_rtx_next ();
5098   close_output_files ();
5099 
5100   if (do_dump)
5101     dump_everything ();
5102 
5103   /* Don't bother about free-ing any input or plugin file, etc.  */
5104 
5105   if (hit_error)
5106     return 1;
5107   return 0;
5108 }
5109