2010-05-28 Segher Boessenkool <segher@kernel.crashing.org>
[official-gcc.git] / gcc / gengtype.c
blobcb3d9bbf2211e87ec844e6a1f0571d836890a071
1 /* Process source files and output type information.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
5 This file is part of GCC.
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.
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.
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/>. */
21 #include "bconfig.h"
22 #include "system.h"
23 #include "gengtype.h"
24 #include "errors.h" /* for fatal */
25 #include "double-int.h"
26 #include "hashtab.h"
28 /* Data types, macros, etc. used only in this file. */
30 /* Kinds of types we can understand. */
31 enum typekind {
32 TYPE_SCALAR,
33 TYPE_STRING,
34 TYPE_STRUCT,
35 TYPE_UNION,
36 TYPE_POINTER,
37 TYPE_ARRAY,
38 TYPE_LANG_STRUCT,
39 TYPE_PARAM_STRUCT
42 typedef unsigned lang_bitmap;
44 /* A way to pass data through to the output end. */
45 struct options
47 struct options *next;
48 const char *name;
49 const char *info;
52 /* Option data for the 'nested_ptr' option. */
53 struct nested_ptr_data
55 type_p type;
56 const char *convert_to;
57 const char *convert_from;
60 /* A name and a type. */
61 struct pair
63 pair_p next;
64 const char *name;
65 type_p type;
66 struct fileloc line;
67 options_p opt;
70 #define NUM_PARAM 10
72 /* A description of a type. */
73 enum gc_used_enum
75 GC_UNUSED = 0,
76 GC_USED,
77 /* Used for structures whose definitions we haven't seen so far when
78 we encounter a pointer to it that is annotated with ``maybe_undef''.
79 If after reading in everything we don't have source file
80 information for it, we assume that it never has been defined. */
81 GC_MAYBE_POINTED_TO,
82 GC_POINTED_TO
85 struct type
87 enum typekind kind;
88 type_p next;
89 type_p pointer_to;
90 enum gc_used_enum gc_used;
91 union {
92 type_p p;
93 struct {
94 const char *tag;
95 struct fileloc line;
96 pair_p fields;
97 options_p opt;
98 lang_bitmap bitmap;
99 type_p lang_struct;
100 } s;
101 bool scalar_is_char;
102 struct {
103 type_p p;
104 const char *len;
105 } a;
106 struct {
107 type_p stru;
108 type_p param[NUM_PARAM];
109 struct fileloc line;
110 } param_struct;
111 } u;
114 #define UNION_P(x) \
115 ((x)->kind == TYPE_UNION || \
116 ((x)->kind == TYPE_LANG_STRUCT \
117 && (x)->u.s.lang_struct->kind == TYPE_UNION))
118 #define UNION_OR_STRUCT_P(x) \
119 ((x)->kind == TYPE_UNION \
120 || (x)->kind == TYPE_STRUCT \
121 || (x)->kind == TYPE_LANG_STRUCT)
123 /* Structure representing an output file. */
124 struct outf
126 struct outf *next;
127 const char *name;
128 size_t buflength;
129 size_t bufused;
130 char *buf;
132 typedef struct outf * outf_p;
134 /* An output file, suitable for definitions, that can see declarations
135 made in INPUT_FILE and is linked into every language that uses
136 INPUT_FILE. May return NULL in plugin mode. */
137 extern outf_p get_output_file_with_visibility
138 (const char *input_file);
139 const char *get_output_file_name (const char *);
141 /* Print, like fprintf, to O. No-op if O is NULL. */
142 static void oprintf (outf_p o, const char *S, ...)
143 ATTRIBUTE_PRINTF_2;
145 /* The list of output files. */
146 static outf_p output_files;
148 /* The plugin input files and their number; in that case only
149 a single file is produced. */
150 static char** plugin_files;
151 static size_t nb_plugin_files;
152 /* the generated plugin output name & file */
153 static outf_p plugin_output;
155 /* The output header file that is included into pretty much every
156 source file. */
157 static outf_p header_file;
159 /* Source directory. */
160 static const char *srcdir;
162 /* Length of srcdir name. */
163 static size_t srcdir_len = 0;
165 static outf_p create_file (const char *, const char *);
167 static const char * get_file_basename (const char *);
168 static const char * get_file_realbasename (const char *);
169 static const char * get_file_srcdir_relative_path (const char *);
171 static int get_prefix_langdir_index (const char *);
172 static const char * get_file_langdir (const char *);
175 /* Nonzero iff an error has occurred. */
176 bool hit_error = false;
178 static void gen_rtx_next (void);
179 static void write_rtx_next (void);
180 static void open_base_files (void);
181 static void close_output_files (void);
183 /* Report an error at POS, printing MSG. */
185 void
186 error_at_line (const struct fileloc *pos, const char *msg, ...)
188 va_list ap;
190 va_start (ap, msg);
192 fprintf (stderr, "%s:%d: ", pos->file, pos->line);
193 vfprintf (stderr, msg, ap);
194 fputc ('\n', stderr);
195 hit_error = true;
197 va_end (ap);
200 /* asprintf, but produces fatal message on out-of-memory. */
201 char *
202 xasprintf (const char *format, ...)
204 int n;
205 char *result;
206 va_list ap;
208 va_start (ap, format);
209 n = vasprintf (&result, format, ap);
210 if (result == NULL || n < 0)
211 fatal ("out of memory");
212 va_end (ap);
214 return result;
217 /* Input file handling. */
219 /* Table of all input files. */
220 static const char **gt_files;
221 static size_t num_gt_files;
223 /* A number of places use the name of this file for a location for
224 things that we can't rely on the source to define. Make sure we
225 can still use pointer comparison on filenames. */
226 static const char this_file[] = __FILE__;
228 /* Vector of per-language directories. */
229 static const char **lang_dir_names;
230 static size_t num_lang_dirs;
232 /* An array of output files suitable for definitions. There is one
233 BASE_FILES entry for each language. */
234 static outf_p *base_files;
236 /* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff
237 INPUT_FILE is used by <lang>.
239 This function should be written to assume that a file _is_ used
240 if the situation is unclear. If it wrongly assumes a file _is_ used,
241 a linker error will result. If it wrongly assumes a file _is not_ used,
242 some GC roots may be missed, which is a much harder-to-debug problem.
244 The relevant bitmap is stored immediately before the file's name in the
245 buffer set up by read_input_list. It may be unaligned, so we have to
246 read it byte-by-byte. */
248 static lang_bitmap
249 get_lang_bitmap (const char *gtfile)
252 if (gtfile == this_file)
253 /* Things defined in this file are universal. */
254 return (((lang_bitmap)1) << num_lang_dirs) - 1;
255 else
257 lang_bitmap n = 0;
258 int i;
259 for (i = -(int) sizeof (lang_bitmap); i < 0; i++)
260 n = (n << CHAR_BIT) + (unsigned char)gtfile[i];
261 return n;
265 /* Set the bitmap returned by get_lang_bitmap. The only legitimate
266 caller of this function is read_input_list. */
267 static void
268 set_lang_bitmap (char *gtfile, lang_bitmap n)
270 int i;
271 for (i = -1; i >= -(int) sizeof (lang_bitmap); i--)
273 gtfile[i] = n & ((1U << CHAR_BIT)-1);
274 n >>= CHAR_BIT;
278 /* Scan the input file, LIST, and determine how much space we need to
279 store strings in. Also, count the number of language directories
280 and files. The numbers returned are overestimates as they does not
281 consider repeated files. */
282 static size_t
283 measure_input_list (FILE *list)
285 size_t n = 0;
286 int c;
287 bool atbol = true;
288 num_lang_dirs = 0;
289 num_gt_files = plugin_files ? nb_plugin_files : 0;
290 while ((c = getc (list)) != EOF)
292 n++;
293 if (atbol)
295 if (c == '[')
296 num_lang_dirs++;
297 else
299 /* Add space for a lang_bitmap before the input file name. */
300 n += sizeof (lang_bitmap);
301 num_gt_files++;
303 atbol = false;
306 if (c == '\n')
307 atbol = true;
310 rewind (list);
311 return n;
314 /* Read one input line from LIST to HEREP (which is updated). A
315 pointer to the string is returned via LINEP. If it was a language
316 subdirectory in square brackets, strip off the square brackets and
317 return true. Otherwise, leave space before the string for a
318 lang_bitmap, and return false. At EOF, returns false, does not
319 touch *HEREP, and sets *LINEP to NULL. POS is used for
320 diagnostics. */
321 static bool
322 read_input_line (FILE *list, char **herep, char **linep,
323 struct fileloc *pos)
325 char *here = *herep;
326 char *line;
327 int c = getc (list);
329 /* Read over whitespace. */
330 while (c == '\n' || c == ' ')
331 c = getc (list);
333 if (c == EOF)
335 *linep = 0;
336 return false;
338 else if (c == '[')
340 /* No space for a lang_bitmap is necessary. Discard the '['. */
341 c = getc (list);
342 line = here;
343 while (c != ']' && c != '\n' && c != EOF)
345 *here++ = c;
346 c = getc (list);
348 *here++ = '\0';
350 if (c == ']')
352 c = getc (list); /* eat what should be a newline */
353 if (c != '\n' && c != EOF)
354 error_at_line (pos, "junk on line after language tag [%s]", line);
356 else
357 error_at_line (pos, "missing close bracket for language tag [%s", line);
359 *herep = here;
360 *linep = line;
361 return true;
363 else
365 /* Leave space for a lang_bitmap. */
366 memset (here, 0, sizeof (lang_bitmap));
367 here += sizeof (lang_bitmap);
368 line = here;
371 *here++ = c;
372 c = getc (list);
374 while (c != EOF && c != '\n');
375 *here++ = '\0';
376 *herep = here;
377 *linep = line;
378 return false;
382 /* Read the list of input files from LIST and compute all of the
383 relevant tables. There is one file per line of the list. At
384 first, all the files on the list are language-generic, but
385 eventually a line will appear which is the name of a language
386 subdirectory in square brackets, like this: [cp]. All subsequent
387 files are specific to that language, until another language
388 subdirectory tag appears. Files can appear more than once, if
389 they apply to more than one language. */
390 static void
391 read_input_list (const char *listname)
393 FILE *list = fopen (listname, "r");
394 if (!list)
395 fatal ("cannot open %s: %s", listname, strerror (errno));
396 else
398 struct fileloc epos;
399 size_t bufsz = measure_input_list (list);
400 char *buf = XNEWVEC (char, bufsz);
401 char *here = buf;
402 char *committed = buf;
403 char *limit = buf + bufsz;
404 char *line;
405 bool is_language;
406 size_t langno = 0;
407 size_t nfiles = 0;
408 lang_bitmap curlangs = (1 << num_lang_dirs) - 1;
410 epos.file = listname;
411 epos.line = 0;
413 lang_dir_names = XNEWVEC (const char *, num_lang_dirs);
414 gt_files = XNEWVEC (const char *, num_gt_files);
416 for (;;)
418 next_line:
419 epos.line++;
420 committed = here;
421 is_language = read_input_line (list, &here, &line, &epos);
422 gcc_assert (here <= limit);
423 if (line == 0)
424 break;
425 else if (is_language)
427 size_t i;
428 gcc_assert (langno <= num_lang_dirs);
429 for (i = 0; i < langno; i++)
430 if (strcmp (lang_dir_names[i], line) == 0)
432 error_at_line (&epos, "duplicate language tag [%s]", line);
433 curlangs = 1 << i;
434 here = committed;
435 goto next_line;
438 curlangs = 1 << langno;
439 lang_dir_names[langno++] = line;
441 else
443 size_t i;
444 gcc_assert (nfiles <= num_gt_files);
445 for (i = 0; i < nfiles; i++)
446 if (strcmp (gt_files[i], line) == 0)
448 /* Throw away the string we just read, and add the
449 current language to the existing string's bitmap. */
450 lang_bitmap bmap = get_lang_bitmap (gt_files[i]);
451 if (bmap & curlangs)
452 error_at_line (&epos, "file %s specified more than once "
453 "for language %s", line, langno == 0
454 ? "(all)"
455 : lang_dir_names[langno - 1]);
457 bmap |= curlangs;
458 set_lang_bitmap (CONST_CAST(char *, gt_files[i]), bmap);
459 here = committed;
460 goto next_line;
463 set_lang_bitmap (line, curlangs);
464 gt_files[nfiles++] = line;
467 /* Update the global counts now that we know accurately how many
468 things there are. (We do not bother resizing the arrays down.) */
469 num_lang_dirs = langno;
470 /* Add the plugin files if provided. */
471 if (plugin_files)
473 size_t i;
474 for (i = 0; i < nb_plugin_files; i++)
475 gt_files[nfiles++] = plugin_files[i];
477 num_gt_files = nfiles;
480 /* Sanity check: any file that resides in a language subdirectory
481 (e.g. 'cp') ought to belong to the corresponding language.
482 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
483 (Can you even do that? Should you be allowed to?) */
485 size_t f;
486 for (f = 0; f < num_gt_files; f++)
488 lang_bitmap bitmap = get_lang_bitmap (gt_files[f]);
489 const char *basename = get_file_basename (gt_files[f]);
490 const char *slashpos = strchr (basename, '/');
492 if (slashpos)
494 size_t l;
495 for (l = 0; l < num_lang_dirs; l++)
496 if ((size_t)(slashpos - basename) == strlen (lang_dir_names [l])
497 && memcmp (basename, lang_dir_names[l],
498 strlen (lang_dir_names[l])) == 0)
500 if (!(bitmap & (1 << l)))
501 error ("%s is in language directory '%s' but is not "
502 "tagged for that language",
503 basename, lang_dir_names[l]);
504 break;
510 if (ferror (list))
511 fatal ("error reading %s: %s", listname, strerror (errno));
513 fclose (list);
518 /* The one and only TYPE_STRING. */
520 static struct type string_type = {
521 TYPE_STRING, 0, 0, GC_USED, {0}
524 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
525 set to appropriate values at the beginning of main. */
527 static struct type scalar_nonchar = {
528 TYPE_SCALAR, 0, 0, GC_USED, {0}
530 static struct type scalar_char = {
531 TYPE_SCALAR, 0, 0, GC_USED, {0}
534 /* Lists of various things. */
536 static pair_p typedefs;
537 static type_p structures;
538 static type_p param_structs;
539 static pair_p variables;
541 static type_p find_param_structure
542 (type_p t, type_p param[NUM_PARAM]);
543 static type_p adjust_field_tree_exp (type_p t, options_p opt);
544 static type_p adjust_field_rtx_def (type_p t, options_p opt);
546 /* Define S as a typedef to T at POS. */
548 void
549 do_typedef (const char *s, type_p t, struct fileloc *pos)
551 pair_p p;
553 /* temporary kludge - gengtype doesn't handle conditionals or
554 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
555 is coming from this file (main() sets them up with safe dummy
556 definitions). */
557 if (!strcmp (s, "CUMULATIVE_ARGS") && pos->file != this_file)
558 return;
560 for (p = typedefs; p != NULL; p = p->next)
561 if (strcmp (p->name, s) == 0)
563 if (p->type != t)
565 error_at_line (pos, "type `%s' previously defined", s);
566 error_at_line (&p->line, "previously defined here");
568 return;
571 p = XNEW (struct pair);
572 p->next = typedefs;
573 p->name = s;
574 p->type = t;
575 p->line = *pos;
576 p->opt = NULL;
577 typedefs = p;
580 /* Define S as a typename of a scalar. Cannot be used to define
581 typedefs of 'char'. Note: is also used for pointer-to-function
582 typedefs (which are therefore not treated as pointers). */
584 void
585 do_scalar_typedef (const char *s, struct fileloc *pos)
587 do_typedef (s, &scalar_nonchar, pos);
590 /* Return the type previously defined for S. Use POS to report errors. */
592 type_p
593 resolve_typedef (const char *s, struct fileloc *pos)
595 pair_p p;
596 for (p = typedefs; p != NULL; p = p->next)
597 if (strcmp (p->name, s) == 0)
598 return p->type;
599 error_at_line (pos, "unidentified type `%s'", s);
600 return &scalar_nonchar; /* treat as "int" */
603 /* Create and return a new structure with tag NAME (or a union iff
604 ISUNION is nonzero), at POS with fields FIELDS and options O. */
606 type_p
607 new_structure (const char *name, int isunion, struct fileloc *pos,
608 pair_p fields, options_p o)
610 type_p si;
611 type_p s = NULL;
612 lang_bitmap bitmap = get_lang_bitmap (pos->file);
614 /* temporary kludge - gengtype doesn't handle conditionals or
615 macros. Ignore any attempt to define struct location_s, unless
616 it is coming from this file (main() sets it up safely). */
617 if (!strcmp (name, "location_s") && !isunion
618 && pos->file != this_file)
619 return find_structure (name, 0);
621 for (si = structures; si != NULL; si = si->next)
622 if (strcmp (name, si->u.s.tag) == 0
623 && UNION_P (si) == isunion)
625 type_p ls = NULL;
626 if (si->kind == TYPE_LANG_STRUCT)
628 ls = si;
630 for (si = ls->u.s.lang_struct; si != NULL; si = si->next)
631 if (si->u.s.bitmap == bitmap)
632 s = si;
634 else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
636 ls = si;
637 si = XCNEW (struct type);
638 memcpy (si, ls, sizeof (struct type));
639 ls->kind = TYPE_LANG_STRUCT;
640 ls->u.s.lang_struct = si;
641 ls->u.s.fields = NULL;
642 si->next = NULL;
643 si->pointer_to = NULL;
644 si->u.s.lang_struct = ls;
646 else
647 s = si;
649 if (ls != NULL && s == NULL)
651 s = XCNEW (struct type);
652 s->next = ls->u.s.lang_struct;
653 ls->u.s.lang_struct = s;
654 s->u.s.lang_struct = ls;
656 break;
659 if (s == NULL)
661 s = XCNEW (struct type);
662 s->next = structures;
663 structures = s;
666 if (s->u.s.line.file != NULL
667 || (s->u.s.lang_struct && (s->u.s.lang_struct->u.s.bitmap & bitmap)))
669 error_at_line (pos, "duplicate definition of '%s %s'",
670 isunion ? "union" : "struct", s->u.s.tag);
671 error_at_line (&s->u.s.line, "previous definition here");
674 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
675 s->u.s.tag = name;
676 s->u.s.line = *pos;
677 s->u.s.fields = fields;
678 s->u.s.opt = o;
679 s->u.s.bitmap = bitmap;
680 if (s->u.s.lang_struct)
681 s->u.s.lang_struct->u.s.bitmap |= bitmap;
683 /* Reset location_s's location to input.h so that we know where to
684 write out its mark routine. */
685 if (!strcmp (name, "location_s") && !isunion
686 && pos->file == this_file)
688 size_t n;
689 for (n = 0; n < num_gt_files; n++)
690 if (!strcmp (gt_files[n] + strlen (gt_files[n]) - strlen ("input.h"),
691 "input.h"))
693 s->u.s.line.file = gt_files[n];
694 break;
698 return s;
701 /* Return the previously-defined structure with tag NAME (or a union
702 iff ISUNION is nonzero), or a new empty structure or union if none
703 was defined previously. */
705 type_p
706 find_structure (const char *name, int isunion)
708 type_p s;
710 for (s = structures; s != NULL; s = s->next)
711 if (strcmp (name, s->u.s.tag) == 0
712 && UNION_P (s) == isunion)
713 return s;
715 s = XCNEW (struct type);
716 s->next = structures;
717 structures = s;
718 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
719 s->u.s.tag = name;
720 structures = s;
721 return s;
724 /* Return the previously-defined parameterized structure for structure
725 T and parameters PARAM, or a new parameterized empty structure or
726 union if none was defined previously. */
728 static type_p
729 find_param_structure (type_p t, type_p param[NUM_PARAM])
731 type_p res;
733 for (res = param_structs; res; res = res->next)
734 if (res->u.param_struct.stru == t
735 && memcmp (res->u.param_struct.param, param,
736 sizeof (type_p) * NUM_PARAM) == 0)
737 break;
738 if (res == NULL)
740 res = XCNEW (struct type);
741 res->kind = TYPE_PARAM_STRUCT;
742 res->next = param_structs;
743 param_structs = res;
744 res->u.param_struct.stru = t;
745 memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
747 return res;
750 /* Return a scalar type with name NAME. */
752 type_p
753 create_scalar_type (const char *name)
755 if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
756 return &scalar_char;
757 else
758 return &scalar_nonchar;
761 /* Return a pointer to T. */
763 type_p
764 create_pointer (type_p t)
766 if (! t->pointer_to)
768 type_p r = XCNEW (struct type);
769 r->kind = TYPE_POINTER;
770 r->u.p = t;
771 t->pointer_to = r;
773 return t->pointer_to;
776 /* Return an array of length LEN. */
778 type_p
779 create_array (type_p t, const char *len)
781 type_p v;
783 v = XCNEW (struct type);
784 v->kind = TYPE_ARRAY;
785 v->u.a.p = t;
786 v->u.a.len = len;
787 return v;
790 /* Return an options structure with name NAME and info INFO. NEXT is the
791 next option in the chain. */
793 options_p
794 create_option (options_p next, const char *name, const void *info)
796 options_p o = XNEW (struct options);
797 o->next = next;
798 o->name = name;
799 o->info = (const char*) info;
800 return o;
803 /* Return an options structure for a "nested_ptr" option. */
804 options_p
805 create_nested_ptr_option (options_p next, type_p t,
806 const char *to, const char *from)
808 struct nested_ptr_data *d = XNEW (struct nested_ptr_data);
810 d->type = adjust_field_type (t, 0);
811 d->convert_to = to;
812 d->convert_from = from;
813 return create_option (next, "nested_ptr", d);
816 /* Add a variable named S of type T with options O defined at POS,
817 to `variables'. */
819 void
820 note_variable (const char *s, type_p t, options_p o, struct fileloc *pos)
822 pair_p n;
823 n = XNEW (struct pair);
824 n->name = s;
825 n->type = t;
826 n->line = *pos;
827 n->opt = o;
828 n->next = variables;
829 variables = n;
832 /* Most-general structure field creator. */
833 static pair_p
834 create_field_all (pair_p next, type_p type, const char *name, options_p opt,
835 const char *file, int line)
837 pair_p field;
839 field = XNEW (struct pair);
840 field->next = next;
841 field->type = type;
842 field->name = name;
843 field->opt = opt;
844 field->line.file = file;
845 field->line.line = line;
846 return field;
849 /* Create a field that came from the source code we are scanning,
850 i.e. we have a 'struct fileloc', and possibly options; also,
851 adjust_field_type should be called. */
852 pair_p
853 create_field_at (pair_p next, type_p type, const char *name, options_p opt,
854 struct fileloc *pos)
856 return create_field_all (next, adjust_field_type (type, opt),
857 name, opt, pos->file, pos->line);
860 /* Create a fake field with the given type and name. NEXT is the next
861 field in the chain. */
862 #define create_field(next,type,name) \
863 create_field_all(next,type,name, 0, this_file, __LINE__)
865 /* Like create_field, but the field is only valid when condition COND
866 is true. */
868 static pair_p
869 create_optional_field_ (pair_p next, type_p type, const char *name,
870 const char *cond, int line)
872 static int id = 1;
873 pair_p union_fields;
874 type_p union_type;
876 /* Create a fake union type with a single nameless field of type TYPE.
877 The field has a tag of "1". This allows us to make the presence
878 of a field of type TYPE depend on some boolean "desc" being true. */
879 union_fields = create_field (NULL, type, "");
880 union_fields->opt = create_option (union_fields->opt, "dot", "");
881 union_fields->opt = create_option (union_fields->opt, "tag", "1");
882 union_type = new_structure (xasprintf ("%s_%d", "fake_union", id++), 1,
883 &lexer_line, union_fields, NULL);
885 /* Create the field and give it the new fake union type. Add a "desc"
886 tag that specifies the condition under which the field is valid. */
887 return create_field_all (next, union_type, name,
888 create_option (0, "desc", cond),
889 this_file, line);
891 #define create_optional_field(next,type,name,cond) \
892 create_optional_field_(next,type,name,cond,__LINE__)
894 /* Reverse a linked list of 'struct pair's in place. */
895 pair_p
896 nreverse_pairs (pair_p list)
898 pair_p prev = 0, p, next;
899 for (p = list; p; p = next)
901 next = p->next;
902 p->next = prev;
903 prev = p;
905 return prev;
909 /* We don't care how long a CONST_DOUBLE is. */
910 #define CONST_DOUBLE_FORMAT "ww"
911 /* We don't want to see codes that are only for generator files. */
912 #undef GENERATOR_FILE
914 enum rtx_code {
915 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
916 #include "rtl.def"
917 #undef DEF_RTL_EXPR
918 NUM_RTX_CODE
921 static const char * const rtx_name[NUM_RTX_CODE] = {
922 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
923 #include "rtl.def"
924 #undef DEF_RTL_EXPR
927 static const char * const rtx_format[NUM_RTX_CODE] = {
928 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
929 #include "rtl.def"
930 #undef DEF_RTL_EXPR
933 static int rtx_next_new[NUM_RTX_CODE];
935 /* We also need codes and names for insn notes (not register notes).
936 Note that we do *not* bias the note values here. */
937 enum insn_note {
938 #define DEF_INSN_NOTE(NAME) NAME,
939 #include "insn-notes.def"
940 #undef DEF_INSN_NOTE
942 NOTE_INSN_MAX
945 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
946 default field for line number notes. */
947 static const char *const note_insn_name[NOTE_INSN_MAX+1] = {
948 #define DEF_INSN_NOTE(NAME) #NAME,
949 #include "insn-notes.def"
950 #undef DEF_INSN_NOTE
953 #undef CONST_DOUBLE_FORMAT
954 #define GENERATOR_FILE
956 /* Generate the contents of the rtx_next array. This really doesn't belong
957 in gengtype at all, but it's needed for adjust_field_rtx_def. */
959 static void
960 gen_rtx_next (void)
962 int i;
963 for (i = 0; i < NUM_RTX_CODE; i++)
965 int k;
967 rtx_next_new[i] = -1;
968 if (strncmp (rtx_format[i], "iuu", 3) == 0)
969 rtx_next_new[i] = 2;
970 else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
971 rtx_next_new[i] = 1;
972 else
973 for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
974 if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
975 rtx_next_new[i] = k;
979 /* Write out the contents of the rtx_next array. */
980 static void
981 write_rtx_next (void)
983 outf_p f = get_output_file_with_visibility (NULL);
984 int i;
985 if (!f)
986 return;
988 oprintf (f, "\n/* Used to implement the RTX_NEXT macro. */\n");
989 oprintf (f, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
990 for (i = 0; i < NUM_RTX_CODE; i++)
991 if (rtx_next_new[i] == -1)
992 oprintf (f, " 0,\n");
993 else
994 oprintf (f,
995 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n",
996 rtx_next_new[i]);
997 oprintf (f, "};\n");
1000 /* Handle `special("rtx_def")'. This is a special case for field
1001 `fld' of struct rtx_def, which is an array of unions whose values
1002 are based in a complex way on the type of RTL. */
1004 static type_p
1005 adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
1007 pair_p flds = NULL;
1008 options_p nodot;
1009 int i;
1010 type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
1011 type_p basic_block_tp, reg_attrs_tp, constant_tp, symbol_union_tp;
1013 if (t->kind != TYPE_UNION)
1015 error_at_line (&lexer_line,
1016 "special `rtx_def' must be applied to a union");
1017 return &string_type;
1020 nodot = create_option (NULL, "dot", "");
1022 rtx_tp = create_pointer (find_structure ("rtx_def", 0));
1023 rtvec_tp = create_pointer (find_structure ("rtvec_def", 0));
1024 tree_tp = create_pointer (find_structure ("tree_node", 1));
1025 mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
1026 reg_attrs_tp = create_pointer (find_structure ("reg_attrs", 0));
1027 basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
1028 constant_tp = create_pointer (find_structure ("constant_descriptor_rtx", 0));
1029 scalar_tp = &scalar_nonchar; /* rtunion int */
1032 pair_p note_flds = NULL;
1033 int c;
1035 for (c = 0; c <= NOTE_INSN_MAX; c++)
1037 switch (c)
1039 case NOTE_INSN_MAX:
1040 case NOTE_INSN_DELETED_LABEL:
1041 note_flds = create_field (note_flds, &string_type, "rt_str");
1042 break;
1044 case NOTE_INSN_BLOCK_BEG:
1045 case NOTE_INSN_BLOCK_END:
1046 note_flds = create_field (note_flds, tree_tp, "rt_tree");
1047 break;
1049 case NOTE_INSN_VAR_LOCATION:
1050 note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
1051 break;
1053 default:
1054 note_flds = create_field (note_flds, scalar_tp, "rt_int");
1055 break;
1057 /* NOTE_INSN_MAX is used as the default field for line
1058 number notes. */
1059 if (c == NOTE_INSN_MAX)
1060 note_flds->opt = create_option (nodot, "default", "");
1061 else
1062 note_flds->opt = create_option (nodot, "tag", note_insn_name[c]);
1064 note_union_tp = new_structure ("rtx_def_note_subunion", 1,
1065 &lexer_line, note_flds, NULL);
1067 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1069 pair_p sym_flds;
1071 sym_flds = create_field (NULL, tree_tp, "rt_tree");
1072 sym_flds->opt = create_option (nodot, "default", "");
1074 sym_flds = create_field (sym_flds, constant_tp, "rt_constant");
1075 sym_flds->opt = create_option (nodot, "tag", "1");
1077 symbol_union_tp = new_structure ("rtx_def_symbol_subunion", 1,
1078 &lexer_line, sym_flds, NULL);
1080 for (i = 0; i < NUM_RTX_CODE; i++)
1082 pair_p subfields = NULL;
1083 size_t aindex, nmindex;
1084 const char *sname;
1085 type_p substruct;
1086 char *ftag;
1088 for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
1090 type_p t;
1091 const char *subname;
1093 switch (rtx_format[i][aindex])
1095 case '*':
1096 case 'i':
1097 case 'n':
1098 case 'w':
1099 t = scalar_tp;
1100 subname = "rt_int";
1101 break;
1103 case '0':
1104 if (i == MEM && aindex == 1)
1105 t = mem_attrs_tp, subname = "rt_mem";
1106 else if (i == JUMP_INSN && aindex == 8)
1107 t = rtx_tp, subname = "rt_rtx";
1108 else if (i == CODE_LABEL && aindex == 4)
1109 t = scalar_tp, subname = "rt_int";
1110 else if (i == CODE_LABEL && aindex == 5)
1111 t = rtx_tp, subname = "rt_rtx";
1112 else if (i == LABEL_REF
1113 && (aindex == 1 || aindex == 2))
1114 t = rtx_tp, subname = "rt_rtx";
1115 else if (i == NOTE && aindex == 4)
1116 t = note_union_tp, subname = "";
1117 else if (i == NOTE && aindex == 5)
1118 t = scalar_tp, subname = "rt_int";
1119 else if (i == NOTE && aindex >= 7)
1120 t = scalar_tp, subname = "rt_int";
1121 else if (i == ADDR_DIFF_VEC && aindex == 4)
1122 t = scalar_tp, subname = "rt_int";
1123 else if (i == VALUE && aindex == 0)
1124 t = scalar_tp, subname = "rt_int";
1125 else if (i == DEBUG_EXPR && aindex == 0)
1126 t = tree_tp, subname = "rt_tree";
1127 else if (i == REG && aindex == 1)
1128 t = scalar_tp, subname = "rt_int";
1129 else if (i == REG && aindex == 2)
1130 t = reg_attrs_tp, subname = "rt_reg";
1131 else if (i == SCRATCH && aindex == 0)
1132 t = scalar_tp, subname = "rt_int";
1133 else if (i == SYMBOL_REF && aindex == 1)
1134 t = scalar_tp, subname = "rt_int";
1135 else if (i == SYMBOL_REF && aindex == 2)
1136 t = symbol_union_tp, subname = "";
1137 else if (i == BARRIER && aindex >= 3)
1138 t = scalar_tp, subname = "rt_int";
1139 else
1141 error_at_line (&lexer_line,
1142 "rtx type `%s' has `0' in position %lu, can't handle",
1143 rtx_name[i], (unsigned long) aindex);
1144 t = &string_type;
1145 subname = "rt_int";
1147 break;
1149 case 's':
1150 case 'S':
1151 case 'T':
1152 t = &string_type;
1153 subname = "rt_str";
1154 break;
1156 case 'e':
1157 case 'u':
1158 t = rtx_tp;
1159 subname = "rt_rtx";
1160 break;
1162 case 'E':
1163 case 'V':
1164 t = rtvec_tp;
1165 subname = "rt_rtvec";
1166 break;
1168 case 't':
1169 t = tree_tp;
1170 subname = "rt_tree";
1171 break;
1173 case 'B':
1174 t = basic_block_tp;
1175 subname = "rt_bb";
1176 break;
1178 default:
1179 error_at_line (&lexer_line,
1180 "rtx type `%s' has `%c' in position %lu, can't handle",
1181 rtx_name[i], rtx_format[i][aindex],
1182 (unsigned long)aindex);
1183 t = &string_type;
1184 subname = "rt_int";
1185 break;
1188 subfields = create_field (subfields, t,
1189 xasprintf (".fld[%lu].%s",
1190 (unsigned long) aindex,
1191 subname));
1192 subfields->opt = nodot;
1193 if (t == note_union_tp)
1194 subfields->opt = create_option (subfields->opt, "desc",
1195 "NOTE_KIND (&%0)");
1196 if (t == symbol_union_tp)
1197 subfields->opt = create_option (subfields->opt, "desc",
1198 "CONSTANT_POOL_ADDRESS_P (&%0)");
1201 if (i == SYMBOL_REF)
1203 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P holds. */
1204 type_p field_tp = find_structure ("block_symbol", 0);
1205 subfields
1206 = create_optional_field (subfields, field_tp, "block_sym",
1207 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1210 sname = xasprintf ("rtx_def_%s", rtx_name[i]);
1211 substruct = new_structure (sname, 0, &lexer_line, subfields, NULL);
1213 ftag = xstrdup (rtx_name[i]);
1214 for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
1215 ftag[nmindex] = TOUPPER (ftag[nmindex]);
1217 flds = create_field (flds, substruct, "");
1218 flds->opt = create_option (nodot, "tag", ftag);
1221 return new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
1224 /* Handle `special("tree_exp")'. This is a special case for
1225 field `operands' of struct tree_exp, which although it claims to contain
1226 pointers to trees, actually sometimes contains pointers to RTL too.
1227 Passed T, the old type of the field, and OPT its options. Returns
1228 a new type for the field. */
1230 static type_p
1231 adjust_field_tree_exp (type_p t, options_p opt ATTRIBUTE_UNUSED)
1233 pair_p flds;
1234 options_p nodot;
1236 if (t->kind != TYPE_ARRAY)
1238 error_at_line (&lexer_line,
1239 "special `tree_exp' must be applied to an array");
1240 return &string_type;
1243 nodot = create_option (NULL, "dot", "");
1245 flds = create_field (NULL, t, "");
1246 flds->opt = create_option (nodot, "length",
1247 "TREE_OPERAND_LENGTH ((tree) &%0)");
1248 flds->opt = create_option (flds->opt, "default", "");
1250 return new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
1253 /* Perform any special processing on a type T, about to become the type
1254 of a field. Return the appropriate type for the field.
1255 At present:
1256 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1257 - Similarly for arrays of pointer-to-char;
1258 - Converts structures for which a parameter is provided to
1259 TYPE_PARAM_STRUCT;
1260 - Handles "special" options.
1263 type_p
1264 adjust_field_type (type_p t, options_p opt)
1266 int length_p = 0;
1267 const int pointer_p = t->kind == TYPE_POINTER;
1268 type_p params[NUM_PARAM];
1269 int params_p = 0;
1270 int i;
1272 for (i = 0; i < NUM_PARAM; i++)
1273 params[i] = NULL;
1275 for (; opt; opt = opt->next)
1276 if (strcmp (opt->name, "length") == 0)
1277 length_p = 1;
1278 else if (strcmp (opt->name, "param_is") == 0
1279 || (strncmp (opt->name, "param", 5) == 0
1280 && ISDIGIT (opt->name[5])
1281 && strcmp (opt->name + 6, "_is") == 0))
1283 int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
1285 if (! UNION_OR_STRUCT_P (t)
1286 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
1288 error_at_line (&lexer_line,
1289 "option `%s' may only be applied to structures or structure pointers",
1290 opt->name);
1291 return t;
1294 params_p = 1;
1295 if (params[num] != NULL)
1296 error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
1297 if (! ISDIGIT (opt->name[5]))
1298 params[num] = create_pointer (CONST_CAST2(type_p, const char *, opt->info));
1299 else
1300 params[num] = CONST_CAST2 (type_p, const char *, opt->info);
1302 else if (strcmp (opt->name, "special") == 0)
1304 const char *special_name = opt->info;
1305 if (strcmp (special_name, "tree_exp") == 0)
1306 t = adjust_field_tree_exp (t, opt);
1307 else if (strcmp (special_name, "rtx_def") == 0)
1308 t = adjust_field_rtx_def (t, opt);
1309 else
1310 error_at_line (&lexer_line, "unknown special `%s'", special_name);
1313 if (params_p)
1315 type_p realt;
1317 if (pointer_p)
1318 t = t->u.p;
1319 realt = find_param_structure (t, params);
1320 t = pointer_p ? create_pointer (realt) : realt;
1323 if (! length_p
1324 && pointer_p
1325 && t->u.p->kind == TYPE_SCALAR
1326 && t->u.p->u.scalar_is_char)
1327 return &string_type;
1328 if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
1329 && t->u.a.p->u.p->kind == TYPE_SCALAR
1330 && t->u.a.p->u.p->u.scalar_is_char)
1331 return create_array (&string_type, t->u.a.len);
1333 return t;
1337 static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
1338 static void set_gc_used (pair_p);
1340 /* Handle OPT for set_gc_used_type. */
1342 static void
1343 process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
1344 int *pass_param, int *length, int *skip, type_p *nested_ptr)
1346 options_p o;
1347 for (o = opt; o; o = o->next)
1348 if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO)
1349 set_gc_used_type (CONST_CAST2 (type_p, const char *, o->info),
1350 GC_POINTED_TO, NULL);
1351 else if (strcmp (o->name, "maybe_undef") == 0)
1352 *maybe_undef = 1;
1353 else if (strcmp (o->name, "use_params") == 0)
1354 *pass_param = 1;
1355 else if (strcmp (o->name, "length") == 0)
1356 *length = 1;
1357 else if (strcmp (o->name, "skip") == 0)
1358 *skip = 1;
1359 else if (strcmp (o->name, "nested_ptr") == 0)
1360 *nested_ptr = ((const struct nested_ptr_data *) o->info)->type;
1363 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
1365 static void
1366 set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
1368 if (t->gc_used >= level)
1369 return;
1371 t->gc_used = level;
1373 switch (t->kind)
1375 case TYPE_STRUCT:
1376 case TYPE_UNION:
1378 pair_p f;
1379 int dummy;
1380 type_p dummy2;
1382 process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy,
1383 &dummy2);
1385 for (f = t->u.s.fields; f; f = f->next)
1387 int maybe_undef = 0;
1388 int pass_param = 0;
1389 int length = 0;
1390 int skip = 0;
1391 type_p nested_ptr = NULL;
1392 process_gc_options (f->opt, level, &maybe_undef, &pass_param,
1393 &length, &skip, &nested_ptr);
1395 if (nested_ptr && f->type->kind == TYPE_POINTER)
1396 set_gc_used_type (nested_ptr, GC_POINTED_TO,
1397 pass_param ? param : NULL);
1398 else if (length && f->type->kind == TYPE_POINTER)
1399 set_gc_used_type (f->type->u.p, GC_USED, NULL);
1400 else if (maybe_undef && f->type->kind == TYPE_POINTER)
1401 set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
1402 else if (pass_param && f->type->kind == TYPE_POINTER && param)
1403 set_gc_used_type (find_param_structure (f->type->u.p, param),
1404 GC_POINTED_TO, NULL);
1405 else if (skip)
1406 ; /* target type is not used through this field */
1407 else
1408 set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
1410 break;
1413 case TYPE_POINTER:
1414 set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
1415 break;
1417 case TYPE_ARRAY:
1418 set_gc_used_type (t->u.a.p, GC_USED, param);
1419 break;
1421 case TYPE_LANG_STRUCT:
1422 for (t = t->u.s.lang_struct; t; t = t->next)
1423 set_gc_used_type (t, level, param);
1424 break;
1426 case TYPE_PARAM_STRUCT:
1428 int i;
1429 for (i = 0; i < NUM_PARAM; i++)
1430 if (t->u.param_struct.param[i] != 0)
1431 set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
1433 if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
1434 level = GC_POINTED_TO;
1435 else
1436 level = GC_USED;
1437 t->u.param_struct.stru->gc_used = GC_UNUSED;
1438 set_gc_used_type (t->u.param_struct.stru, level,
1439 t->u.param_struct.param);
1440 break;
1442 default:
1443 break;
1447 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1449 static void
1450 set_gc_used (pair_p variables)
1452 pair_p p;
1453 for (p = variables; p; p = p->next)
1454 set_gc_used_type (p->type, GC_USED, NULL);
1457 /* File mapping routines. For each input file, there is one output .c file
1458 (but some output files have many input files), and there is one .h file
1459 for the whole build. */
1461 /* Output file handling. */
1463 /* Create and return an outf_p for a new file for NAME, to be called
1464 ONAME. */
1466 static outf_p
1467 create_file (const char *name, const char *oname)
1469 static const char *const hdr[] = {
1470 " Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.\n",
1471 "\n",
1472 "This file is part of GCC.\n",
1473 "\n",
1474 "GCC is free software; you can redistribute it and/or modify it under\n",
1475 "the terms of the GNU General Public License as published by the Free\n",
1476 "Software Foundation; either version 3, or (at your option) any later\n",
1477 "version.\n",
1478 "\n",
1479 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1480 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1481 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1482 "for more details.\n",
1483 "\n",
1484 "You should have received a copy of the GNU General Public License\n",
1485 "along with GCC; see the file COPYING3. If not see\n",
1486 "<http://www.gnu.org/licenses/>. */\n",
1487 "\n",
1488 "/* This file is machine generated. Do not edit. */\n"
1490 outf_p f;
1491 size_t i;
1493 gcc_assert (name != NULL);
1494 gcc_assert (oname != NULL);
1495 f = XCNEW (struct outf);
1496 f->next = output_files;
1497 f->name = oname;
1498 output_files = f;
1500 oprintf (f, "/* Type information for %s.\n", name);
1501 for (i = 0; i < ARRAY_SIZE (hdr); i++)
1502 oprintf (f, "%s", hdr[i]);
1503 return f;
1506 /* Print, like fprintf, to O.
1507 N.B. You might think this could be implemented more efficiently
1508 with vsnprintf(). Unfortunately, there are C libraries that
1509 provide that function but without the C99 semantics for its return
1510 value, making it impossible to know how much space is required. */
1511 void
1512 oprintf (outf_p o, const char *format, ...)
1514 char *s;
1515 size_t slength;
1516 va_list ap;
1518 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1519 in that case. */
1520 if (!o)
1521 return;
1523 va_start (ap, format);
1524 slength = vasprintf (&s, format, ap);
1525 if (s == NULL || (int)slength < 0)
1526 fatal ("out of memory");
1527 va_end (ap);
1529 if (o->bufused + slength > o->buflength)
1531 size_t new_len = o->buflength;
1532 if (new_len == 0)
1533 new_len = 1024;
1534 do {
1535 new_len *= 2;
1536 } while (o->bufused + slength >= new_len);
1537 o->buf = XRESIZEVEC (char, o->buf, new_len);
1538 o->buflength = new_len;
1540 memcpy (o->buf + o->bufused, s, slength);
1541 o->bufused += slength;
1542 free (s);
1545 /* Open the global header file and the language-specific header files. */
1547 static void
1548 open_base_files (void)
1550 size_t i;
1552 if (nb_plugin_files > 0 && plugin_files)
1553 return;
1555 header_file = create_file ("GCC", "gtype-desc.h");
1557 base_files = XNEWVEC (outf_p, num_lang_dirs);
1559 for (i = 0; i < num_lang_dirs; i++)
1560 base_files[i] = create_file (lang_dir_names[i],
1561 xasprintf ("gtype-%s.h", lang_dir_names[i]));
1563 /* gtype-desc.c is a little special, so we create it here. */
1565 /* The order of files here matters very much. */
1566 static const char *const ifiles [] = {
1567 "config.h", "system.h", "coretypes.h", "tm.h",
1568 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1569 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1570 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1571 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1572 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1573 "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
1574 "target.h", "ipa-prop.h", "lto-streamer.h", NULL
1576 const char *const *ifp;
1577 outf_p gtype_desc_c;
1579 gtype_desc_c = create_file ("GCC", "gtype-desc.c");
1580 for (ifp = ifiles; *ifp; ifp++)
1581 oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
1583 /* Make sure we handle "cfun" specially. */
1584 oprintf (gtype_desc_c, "\n/* See definition in function.h. */\n");
1585 oprintf (gtype_desc_c, "#undef cfun\n");
1589 /* For F a filename, return the real basename of F, with all the directory
1590 components skipped. */
1592 static const char *
1593 get_file_realbasename (const char *f)
1595 const char * lastslash = strrchr (f, '/');
1597 return (lastslash != NULL) ? lastslash + 1 : f;
1600 /* For F a filename, return the relative path to F from $(srcdir) if the
1601 latter is a prefix in F, NULL otherwise. */
1603 static const char *
1604 get_file_srcdir_relative_path (const char *f)
1606 if (strlen (f) > srcdir_len
1607 && IS_DIR_SEPARATOR (f[srcdir_len])
1608 && memcmp (f, srcdir, srcdir_len) == 0)
1609 return f + srcdir_len + 1;
1610 else
1611 return NULL;
1614 /* For F a filename, return the relative path to F from $(srcdir) if the
1615 latter is a prefix in F, or the real basename of F otherwise. */
1617 static const char *
1618 get_file_basename (const char *f)
1620 const char * srcdir_path = get_file_srcdir_relative_path (f);
1622 return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (f);
1625 /* For F a filename, return the lang_dir_names relative index of the language
1626 directory that is a prefix in F, if any, -1 otherwise. */
1628 static int
1629 get_prefix_langdir_index (const char *f)
1631 size_t f_len = strlen (f);
1632 size_t lang_index;
1634 for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
1636 const char * langdir = lang_dir_names [lang_index];
1637 size_t langdir_len = strlen (langdir);
1639 if (f_len > langdir_len
1640 && IS_DIR_SEPARATOR (f[langdir_len])
1641 && memcmp (f, langdir, langdir_len) == 0)
1642 return lang_index;
1645 return -1;
1648 /* For F a filename, return the name of language directory where F is located,
1649 if any, NULL otherwise. */
1651 static const char *
1652 get_file_langdir (const char *f)
1654 /* Get the relative path to F from $(srcdir) and find the language by
1655 comparing the prefix with language directory names. If F is not even
1656 srcdir relative, no point in looking further. */
1658 int lang_index;
1659 const char * srcdir_relative_path = get_file_srcdir_relative_path (f);
1661 if (!srcdir_relative_path)
1662 return NULL;
1664 lang_index = get_prefix_langdir_index (srcdir_relative_path);
1666 return (lang_index >= 0) ? lang_dir_names [lang_index] : NULL;
1669 /* The gt- output file name for F. */
1671 static const char *
1672 get_file_gtfilename (const char *f)
1674 /* Cook up an initial version of the gt- file name from the file real
1675 basename and the language name, if any. */
1677 const char *basename = get_file_realbasename (f);
1678 const char *langdir = get_file_langdir (f);
1680 char * result =
1681 (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
1682 : xasprintf ("gt-%s", basename));
1684 /* Then replace all non alphanumerics characters by '-' and change the
1685 extension to ".h". We expect the input filename extension was at least
1686 one character long. */
1688 char *s = result;
1690 for (; *s != '.'; s++)
1691 if (! ISALNUM (*s) && *s != '-')
1692 *s = '-';
1694 memcpy (s, ".h", sizeof (".h"));
1696 return result;
1699 /* An output file, suitable for definitions, that can see declarations
1700 made in INPUT_FILE and is linked into every language that uses
1701 INPUT_FILE. */
1703 outf_p
1704 get_output_file_with_visibility (const char *input_file)
1706 outf_p r;
1707 size_t len;
1708 const char *basename;
1709 const char *for_name;
1710 const char *output_name;
1712 /* This can happen when we need a file with visibility on a
1713 structure that we've never seen. We have to just hope that it's
1714 globally visible. */
1715 if (input_file == NULL)
1716 input_file = "system.h";
1718 /* In plugin mode, return NULL unless the input_file is one of the
1719 plugin_files. */
1720 if (plugin_files)
1722 size_t i;
1723 for (i = 0; i < nb_plugin_files; i++)
1724 if (strcmp (input_file, plugin_files[i]) == 0)
1725 return plugin_output;
1727 return NULL;
1730 /* Determine the output file name. */
1731 basename = get_file_basename (input_file);
1733 len = strlen (basename);
1734 if ((len > 2 && memcmp (basename+len-2, ".c", 2) == 0)
1735 || (len > 2 && memcmp (basename+len-2, ".y", 2) == 0)
1736 || (len > 3 && memcmp (basename+len-3, ".in", 3) == 0))
1738 output_name = get_file_gtfilename (input_file);
1739 for_name = basename;
1741 /* Some headers get used by more than one front-end; hence, it
1742 would be inappropriate to spew them out to a single gtype-<lang>.h
1743 (and gengtype doesn't know how to direct spewage into multiple
1744 gtype-<lang>.h headers at this time). Instead, we pair up these
1745 headers with source files (and their special purpose gt-*.h headers). */
1746 else if (strcmp (basename, "c-common.h") == 0)
1747 output_name = "gt-c-common.h", for_name = "c-common.c";
1748 else if (strcmp (basename, "c-lang.h") == 0)
1749 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1750 else if (strcmp (basename, "c-tree.h") == 0)
1751 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1752 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1753 && strcmp (basename + 3, "cp-tree.h") == 0)
1754 output_name = "gt-cp-tree.h", for_name = "cp/tree.c";
1755 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1756 && strcmp (basename + 3, "decl.h") == 0)
1757 output_name = "gt-cp-decl.h", for_name = "cp/decl.c";
1758 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1759 && strcmp (basename + 3, "name-lookup.h") == 0)
1760 output_name = "gt-cp-name-lookup.h", for_name = "cp/name-lookup.c";
1761 else if (strncmp (basename, "objc", 4) == 0 && IS_DIR_SEPARATOR (basename[4])
1762 && strcmp (basename + 5, "objc-act.h") == 0)
1763 output_name = "gt-objc-objc-act.h", for_name = "objc/objc-act.c";
1764 else
1766 int lang_index = get_prefix_langdir_index (basename);
1768 if (lang_index >= 0)
1769 return base_files[lang_index];
1771 output_name = "gtype-desc.c";
1772 for_name = NULL;
1775 /* Look through to see if we've ever seen this output filename before. */
1776 for (r = output_files; r; r = r->next)
1777 if (strcmp (r->name, output_name) == 0)
1778 return r;
1780 /* If not, create it. */
1781 r = create_file (for_name, output_name);
1783 gcc_assert (r && r->name);
1784 return r;
1787 /* The name of an output file, suitable for definitions, that can see
1788 declarations made in INPUT_FILE and is linked into every language
1789 that uses INPUT_FILE. */
1791 const char *
1792 get_output_file_name (const char *input_file)
1794 outf_p o = get_output_file_with_visibility (input_file);
1795 if (o)
1796 return o->name;
1797 return NULL;
1800 /* Check if existing file is equal to the in memory buffer. */
1802 static bool
1803 is_file_equal (outf_p of)
1805 FILE *newfile = fopen (of->name, "r");
1806 size_t i;
1807 bool equal;
1808 if (newfile == NULL)
1809 return false;
1811 equal = true;
1812 for (i = 0; i < of->bufused; i++)
1814 int ch;
1815 ch = fgetc (newfile);
1816 if (ch == EOF || ch != (unsigned char) of->buf[i])
1818 equal = false;
1819 break;
1822 fclose (newfile);
1823 return equal;
1826 /* Copy the output to its final destination,
1827 but don't unnecessarily change modification times. */
1829 static void
1830 close_output_files (void)
1832 outf_p of;
1834 for (of = output_files; of; of = of->next)
1837 if (!is_file_equal(of))
1839 FILE *newfile = fopen (of->name, "w");
1840 if (newfile == NULL)
1841 fatal ("opening output file %s: %s", of->name, strerror (errno));
1842 if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
1843 fatal ("writing output file %s: %s", of->name, strerror (errno));
1844 if (fclose (newfile) != 0)
1845 fatal ("closing output file %s: %s", of->name, strerror (errno));
1847 free(of->buf);
1848 of->buf = NULL;
1849 of->bufused = of->buflength = 0;
1853 struct flist {
1854 struct flist *next;
1855 int started_p;
1856 const char *name;
1857 outf_p f;
1860 struct walk_type_data;
1862 /* For scalars and strings, given the item in 'val'.
1863 For structures, given a pointer to the item in 'val'.
1864 For misc. pointers, given the item in 'val'.
1866 typedef void (*process_field_fn)
1867 (type_p f, const struct walk_type_data *p);
1868 typedef void (*func_name_fn)
1869 (type_p s, const struct walk_type_data *p);
1871 /* Parameters for write_types. */
1873 struct write_types_data
1875 const char *prefix;
1876 const char *param_prefix;
1877 const char *subfield_marker_routine;
1878 const char *marker_routine;
1879 const char *reorder_note_routine;
1880 const char *comment;
1881 int skip_hooks; /* skip hook generation if non zero */
1884 static void output_escaped_param (struct walk_type_data *d,
1885 const char *, const char *);
1886 static void output_mangled_typename (outf_p, const_type_p);
1887 static void walk_type (type_p t, struct walk_type_data *d);
1888 static void write_func_for_structure
1889 (type_p orig_s, type_p s, type_p * param,
1890 const struct write_types_data *wtd);
1891 static void write_types_process_field
1892 (type_p f, const struct walk_type_data *d);
1893 static void write_types (outf_p output_header,
1894 type_p structures,
1895 type_p param_structs,
1896 const struct write_types_data *wtd);
1897 static void write_types_local_process_field
1898 (type_p f, const struct walk_type_data *d);
1899 static void write_local_func_for_structure
1900 (const_type_p orig_s, type_p s, type_p * param);
1901 static void write_local (outf_p output_header,
1902 type_p structures,
1903 type_p param_structs);
1904 static void write_enum_defn (type_p structures, type_p param_structs);
1905 static int contains_scalar_p (type_p t);
1906 static void put_mangled_filename (outf_p , const char *);
1907 static void finish_root_table (struct flist *flp, const char *pfx,
1908 const char *tname, const char *lastname,
1909 const char *name);
1910 static void write_root (outf_p , pair_p, type_p, const char *, int,
1911 struct fileloc *, const char *, bool);
1912 static void write_array (outf_p f, pair_p v,
1913 const struct write_types_data *wtd);
1914 static void write_roots (pair_p, bool);
1916 /* Parameters for walk_type. */
1918 struct walk_type_data
1920 process_field_fn process_field;
1921 const void *cookie;
1922 outf_p of;
1923 options_p opt;
1924 const char *val;
1925 const char *prev_val[4];
1926 int indent;
1927 int counter;
1928 const struct fileloc *line;
1929 lang_bitmap bitmap;
1930 type_p *param;
1931 int used_length;
1932 type_p orig_s;
1933 const char *reorder_fn;
1934 bool needs_cast_p;
1935 bool fn_wants_lvalue;
1938 /* Print a mangled name representing T to OF. */
1940 static void
1941 output_mangled_typename (outf_p of, const_type_p t)
1943 if (t == NULL)
1944 oprintf (of, "Z");
1945 else switch (t->kind)
1947 case TYPE_POINTER:
1948 oprintf (of, "P");
1949 output_mangled_typename (of, t->u.p);
1950 break;
1951 case TYPE_SCALAR:
1952 oprintf (of, "I");
1953 break;
1954 case TYPE_STRING:
1955 oprintf (of, "S");
1956 break;
1957 case TYPE_STRUCT:
1958 case TYPE_UNION:
1959 case TYPE_LANG_STRUCT:
1960 oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag), t->u.s.tag);
1961 break;
1962 case TYPE_PARAM_STRUCT:
1964 int i;
1965 for (i = 0; i < NUM_PARAM; i++)
1966 if (t->u.param_struct.param[i] != NULL)
1967 output_mangled_typename (of, t->u.param_struct.param[i]);
1968 output_mangled_typename (of, t->u.param_struct.stru);
1970 break;
1971 case TYPE_ARRAY:
1972 gcc_unreachable ();
1976 /* Print PARAM to D->OF processing escapes. D->VAL references the
1977 current object, D->PREV_VAL the object containing the current
1978 object, ONAME is the name of the option and D->LINE is used to
1979 print error messages. */
1981 static void
1982 output_escaped_param (struct walk_type_data *d, const char *param,
1983 const char *oname)
1985 const char *p;
1987 for (p = param; *p; p++)
1988 if (*p != '%')
1989 oprintf (d->of, "%c", *p);
1990 else switch (*++p)
1992 case 'h':
1993 oprintf (d->of, "(%s)", d->prev_val[2]);
1994 break;
1995 case '0':
1996 oprintf (d->of, "(%s)", d->prev_val[0]);
1997 break;
1998 case '1':
1999 oprintf (d->of, "(%s)", d->prev_val[1]);
2000 break;
2001 case 'a':
2003 const char *pp = d->val + strlen (d->val);
2004 while (pp[-1] == ']')
2005 while (*pp != '[')
2006 pp--;
2007 oprintf (d->of, "%s", pp);
2009 break;
2010 default:
2011 error_at_line (d->line, "`%s' option contains bad escape %c%c",
2012 oname, '%', *p);
2016 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2017 which is of type T. Write code to D->OF to constrain execution (at
2018 the point that D->PROCESS_FIELD is called) to the appropriate
2019 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2020 pointers to those objects. D->PREV_VAL lists the objects
2021 containing the current object, D->OPT is a list of options to
2022 apply, D->INDENT is the current indentation level, D->LINE is used
2023 to print error messages, D->BITMAP indicates which languages to
2024 print the structure for, and D->PARAM is the current parameter
2025 (from an enclosing param_is option). */
2027 static void
2028 walk_type (type_p t, struct walk_type_data *d)
2030 const char *length = NULL;
2031 const char *desc = NULL;
2032 int maybe_undef_p = 0;
2033 int use_param_num = -1;
2034 int use_params_p = 0;
2035 options_p oo;
2036 const struct nested_ptr_data *nested_ptr_d = NULL;
2038 d->needs_cast_p = false;
2039 for (oo = d->opt; oo; oo = oo->next)
2040 if (strcmp (oo->name, "length") == 0)
2041 length = oo->info;
2042 else if (strcmp (oo->name, "maybe_undef") == 0)
2043 maybe_undef_p = 1;
2044 else if (strncmp (oo->name, "use_param", 9) == 0
2045 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2046 use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
2047 else if (strcmp (oo->name, "use_params") == 0)
2048 use_params_p = 1;
2049 else if (strcmp (oo->name, "desc") == 0)
2050 desc = oo->info;
2051 else if (strcmp (oo->name, "mark_hook") == 0)
2053 else if (strcmp (oo->name, "nested_ptr") == 0)
2054 nested_ptr_d = (const struct nested_ptr_data *) oo->info;
2055 else if (strcmp (oo->name, "dot") == 0)
2057 else if (strcmp (oo->name, "tag") == 0)
2059 else if (strcmp (oo->name, "special") == 0)
2061 else if (strcmp (oo->name, "skip") == 0)
2063 else if (strcmp (oo->name, "default") == 0)
2065 else if (strcmp (oo->name, "descbits") == 0)
2067 else if (strcmp (oo->name, "param_is") == 0)
2069 else if (strncmp (oo->name, "param", 5) == 0
2070 && ISDIGIT (oo->name[5])
2071 && strcmp (oo->name + 6, "_is") == 0)
2073 else if (strcmp (oo->name, "chain_next") == 0)
2075 else if (strcmp (oo->name, "chain_prev") == 0)
2077 else if (strcmp (oo->name, "chain_circular") == 0)
2079 else if (strcmp (oo->name, "reorder") == 0)
2081 else
2082 error_at_line (d->line, "unknown option `%s'\n", oo->name);
2084 if (d->used_length)
2085 length = NULL;
2087 if (use_params_p)
2089 int pointer_p = t->kind == TYPE_POINTER;
2091 if (pointer_p)
2092 t = t->u.p;
2093 if (! UNION_OR_STRUCT_P (t))
2094 error_at_line (d->line, "`use_params' option on unimplemented type");
2095 else
2096 t = find_param_structure (t, d->param);
2097 if (pointer_p)
2098 t = create_pointer (t);
2101 if (use_param_num != -1)
2103 if (d->param != NULL && d->param[use_param_num] != NULL)
2105 type_p nt = d->param[use_param_num];
2107 if (t->kind == TYPE_ARRAY)
2108 nt = create_array (nt, t->u.a.len);
2109 else if (length != NULL && t->kind == TYPE_POINTER)
2110 nt = create_pointer (nt);
2111 d->needs_cast_p = (t->kind != TYPE_POINTER
2112 && (nt->kind == TYPE_POINTER
2113 || nt->kind == TYPE_STRING));
2114 t = nt;
2116 else
2117 error_at_line (d->line, "no parameter defined for `%s'",
2118 d->val);
2121 if (maybe_undef_p
2122 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
2124 error_at_line (d->line,
2125 "field `%s' has invalid option `maybe_undef_p'\n",
2126 d->val);
2127 return;
2130 switch (t->kind)
2132 case TYPE_SCALAR:
2133 case TYPE_STRING:
2134 d->process_field (t, d);
2135 break;
2137 case TYPE_POINTER:
2139 if (maybe_undef_p
2140 && t->u.p->u.s.line.file == NULL)
2142 oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
2143 break;
2146 if (! length)
2148 if (! UNION_OR_STRUCT_P (t->u.p)
2149 && t->u.p->kind != TYPE_PARAM_STRUCT)
2151 error_at_line (d->line,
2152 "field `%s' is pointer to unimplemented type",
2153 d->val);
2154 break;
2157 if (nested_ptr_d)
2159 const char *oldprevval2 = d->prev_val[2];
2161 if (! UNION_OR_STRUCT_P (nested_ptr_d->type))
2163 error_at_line (d->line,
2164 "field `%s' has invalid "
2165 "option `nested_ptr'\n",
2166 d->val);
2167 return;
2170 d->prev_val[2] = d->val;
2171 oprintf (d->of, "%*s{\n", d->indent, "");
2172 d->indent += 2;
2173 d->val = xasprintf ("x%d", d->counter++);
2174 oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "",
2175 (nested_ptr_d->type->kind == TYPE_UNION
2176 ? "union" : "struct"),
2177 nested_ptr_d->type->u.s.tag,
2178 d->fn_wants_lvalue ? "" : "const ",
2179 d->val);
2180 oprintf (d->of, "%*s", d->indent + 2, "");
2181 output_escaped_param (d, nested_ptr_d->convert_from,
2182 "nested_ptr");
2183 oprintf (d->of, ";\n");
2185 d->process_field (nested_ptr_d->type, d);
2187 if (d->fn_wants_lvalue)
2189 oprintf (d->of, "%*s%s = ", d->indent, "",
2190 d->prev_val[2]);
2191 d->prev_val[2] = d->val;
2192 output_escaped_param (d, nested_ptr_d->convert_to,
2193 "nested_ptr");
2194 oprintf (d->of, ";\n");
2197 d->indent -= 2;
2198 oprintf (d->of, "%*s}\n", d->indent, "");
2199 d->val = d->prev_val[2];
2200 d->prev_val[2] = oldprevval2;
2202 else
2203 d->process_field (t->u.p, d);
2205 else
2207 int loopcounter = d->counter++;
2208 const char *oldval = d->val;
2209 const char *oldprevval3 = d->prev_val[3];
2210 char *newval;
2212 oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2213 d->indent += 2;
2214 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2215 oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent, "",
2216 loopcounter, loopcounter);
2217 output_escaped_param (d, length, "length");
2218 oprintf (d->of, "); i%d++) {\n", loopcounter);
2219 d->indent += 2;
2220 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2221 d->used_length = 1;
2222 d->prev_val[3] = oldval;
2223 walk_type (t->u.p, d);
2224 free (newval);
2225 d->val = oldval;
2226 d->prev_val[3] = oldprevval3;
2227 d->used_length = 0;
2228 d->indent -= 2;
2229 oprintf (d->of, "%*s}\n", d->indent, "");
2230 d->process_field(t, d);
2231 d->indent -= 2;
2232 oprintf (d->of, "%*s}\n", d->indent, "");
2235 break;
2237 case TYPE_ARRAY:
2239 int loopcounter = d->counter++;
2240 const char *oldval = d->val;
2241 char *newval;
2243 /* If it's an array of scalars, we optimize by not generating
2244 any code. */
2245 if (t->u.a.p->kind == TYPE_SCALAR)
2246 break;
2248 /* When walking an array, compute the length and store it in a
2249 local variable before walking the array elements, instead of
2250 recomputing the length expression each time through the loop.
2251 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2252 where the length is stored in the first array element,
2253 because otherwise that operand can get overwritten on the
2254 first iteration. */
2255 oprintf (d->of, "%*s{\n", d->indent, "");
2256 d->indent += 2;
2257 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2258 oprintf (d->of, "%*ssize_t l%d = (size_t)(",
2259 d->indent, "", loopcounter);
2260 if (length)
2261 output_escaped_param (d, length, "length");
2262 else
2263 oprintf (d->of, "%s", t->u.a.len);
2264 oprintf (d->of, ");\n");
2266 oprintf (d->of, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2267 d->indent, "",
2268 loopcounter, loopcounter, loopcounter, loopcounter);
2269 d->indent += 2;
2270 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2271 d->used_length = 1;
2272 walk_type (t->u.a.p, d);
2273 free (newval);
2274 d->used_length = 0;
2275 d->val = oldval;
2276 d->indent -= 2;
2277 oprintf (d->of, "%*s}\n", d->indent, "");
2278 d->indent -= 2;
2279 oprintf (d->of, "%*s}\n", d->indent, "");
2281 break;
2283 case TYPE_STRUCT:
2284 case TYPE_UNION:
2286 pair_p f;
2287 const char *oldval = d->val;
2288 const char *oldprevval1 = d->prev_val[1];
2289 const char *oldprevval2 = d->prev_val[2];
2290 const int union_p = t->kind == TYPE_UNION;
2291 int seen_default_p = 0;
2292 options_p o;
2294 if (! t->u.s.line.file)
2295 error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
2297 if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
2299 error_at_line (d->line,
2300 "structure `%s' defined for mismatching languages",
2301 t->u.s.tag);
2302 error_at_line (&t->u.s.line, "one structure defined here");
2305 /* Some things may also be defined in the structure's options. */
2306 for (o = t->u.s.opt; o; o = o->next)
2307 if (! desc && strcmp (o->name, "desc") == 0)
2308 desc = o->info;
2310 d->prev_val[2] = oldval;
2311 d->prev_val[1] = oldprevval2;
2312 if (union_p)
2314 if (desc == NULL)
2316 error_at_line (d->line, "missing `desc' option for union `%s'",
2317 t->u.s.tag);
2318 desc = "1";
2320 oprintf (d->of, "%*sswitch (", d->indent, "");
2321 output_escaped_param (d, desc, "desc");
2322 oprintf (d->of, ")\n");
2323 d->indent += 2;
2324 oprintf (d->of, "%*s{\n", d->indent, "");
2326 for (f = t->u.s.fields; f; f = f->next)
2328 options_p oo;
2329 const char *dot = ".";
2330 const char *tagid = NULL;
2331 int skip_p = 0;
2332 int default_p = 0;
2333 int use_param_p = 0;
2334 char *newval;
2336 d->reorder_fn = NULL;
2337 for (oo = f->opt; oo; oo = oo->next)
2338 if (strcmp (oo->name, "dot") == 0)
2339 dot = oo->info;
2340 else if (strcmp (oo->name, "tag") == 0)
2341 tagid = oo->info;
2342 else if (strcmp (oo->name, "skip") == 0)
2343 skip_p = 1;
2344 else if (strcmp (oo->name, "default") == 0)
2345 default_p = 1;
2346 else if (strcmp (oo->name, "reorder") == 0)
2347 d->reorder_fn = oo->info;
2348 else if (strncmp (oo->name, "use_param", 9) == 0
2349 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2350 use_param_p = 1;
2352 if (skip_p)
2353 continue;
2355 if (union_p && tagid)
2357 oprintf (d->of, "%*scase %s:\n", d->indent, "", tagid);
2358 d->indent += 2;
2360 else if (union_p && default_p)
2362 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2363 d->indent += 2;
2364 seen_default_p = 1;
2366 else if (! union_p && (default_p || tagid))
2367 error_at_line (d->line,
2368 "can't use `%s' outside a union on field `%s'",
2369 default_p ? "default" : "tag", f->name);
2370 else if (union_p && ! (default_p || tagid)
2371 && f->type->kind == TYPE_SCALAR)
2373 fprintf (stderr,
2374 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2375 d->line->file, d->line->line, f->name);
2376 continue;
2378 else if (union_p && ! (default_p || tagid))
2379 error_at_line (d->line,
2380 "field `%s' is missing `tag' or `default' option",
2381 f->name);
2383 d->line = &f->line;
2384 d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name);
2385 d->opt = f->opt;
2386 d->used_length = false;
2388 if (union_p && use_param_p && d->param == NULL)
2389 oprintf (d->of, "%*sgcc_unreachable ();\n", d->indent, "");
2390 else
2391 walk_type (f->type, d);
2393 free (newval);
2395 if (union_p)
2397 oprintf (d->of, "%*sbreak;\n", d->indent, "");
2398 d->indent -= 2;
2401 d->reorder_fn = NULL;
2403 d->val = oldval;
2404 d->prev_val[1] = oldprevval1;
2405 d->prev_val[2] = oldprevval2;
2407 if (union_p && ! seen_default_p)
2409 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2410 oprintf (d->of, "%*s break;\n", d->indent, "");
2412 if (union_p)
2414 oprintf (d->of, "%*s}\n", d->indent, "");
2415 d->indent -= 2;
2418 break;
2420 case TYPE_LANG_STRUCT:
2422 type_p nt;
2423 for (nt = t->u.s.lang_struct; nt; nt = nt->next)
2424 if ((d->bitmap & nt->u.s.bitmap) == d->bitmap)
2425 break;
2426 if (nt == NULL)
2427 error_at_line (d->line, "structure `%s' differs between languages",
2428 t->u.s.tag);
2429 else
2430 walk_type (nt, d);
2432 break;
2434 case TYPE_PARAM_STRUCT:
2436 type_p *oldparam = d->param;
2438 d->param = t->u.param_struct.param;
2439 walk_type (t->u.param_struct.stru, d);
2440 d->param = oldparam;
2442 break;
2444 default:
2445 gcc_unreachable ();
2449 /* process_field routine for marking routines. */
2451 static void
2452 write_types_process_field (type_p f, const struct walk_type_data *d)
2454 const struct write_types_data *wtd;
2455 const char *cast = d->needs_cast_p ? "(void *)" : "";
2456 wtd = (const struct write_types_data *) d->cookie;
2458 switch (f->kind)
2460 case TYPE_POINTER:
2461 oprintf (d->of, "%*s%s (%s%s", d->indent, "",
2462 wtd->subfield_marker_routine, cast, d->val);
2463 if (wtd->param_prefix)
2465 oprintf (d->of, ", %s", d->prev_val[3]);
2466 if (d->orig_s)
2468 oprintf (d->of, ", gt_%s_", wtd->param_prefix);
2469 output_mangled_typename (d->of, d->orig_s);
2471 else
2472 oprintf (d->of, ", gt_%sa_%s", wtd->param_prefix, d->prev_val[0]);
2474 if (f->u.p->kind == TYPE_PARAM_STRUCT
2475 && f->u.p->u.s.line.file != NULL)
2477 oprintf (d->of, ", gt_e_");
2478 output_mangled_typename (d->of, f);
2480 else if (UNION_OR_STRUCT_P (f)
2481 && f->u.p->u.s.line.file != NULL)
2483 oprintf (d->of, ", gt_ggc_e_");
2484 output_mangled_typename (d->of, f);
2486 else
2487 oprintf (d->of, ", gt_types_enum_last");
2489 oprintf (d->of, ");\n");
2490 if (d->reorder_fn && wtd->reorder_note_routine)
2491 oprintf (d->of, "%*s%s (%s%s, %s, %s);\n", d->indent, "",
2492 wtd->reorder_note_routine, cast, d->val,
2493 d->prev_val[3], d->reorder_fn);
2494 break;
2496 case TYPE_STRING:
2497 case TYPE_STRUCT:
2498 case TYPE_UNION:
2499 case TYPE_LANG_STRUCT:
2500 case TYPE_PARAM_STRUCT:
2501 oprintf (d->of, "%*sgt_%s_", d->indent, "", wtd->prefix);
2502 output_mangled_typename (d->of, f);
2503 oprintf (d->of, " (%s%s);\n", cast, d->val);
2504 if (d->reorder_fn && wtd->reorder_note_routine)
2505 oprintf (d->of, "%*s%s (%s%s, %s%s, %s);\n", d->indent, "",
2506 wtd->reorder_note_routine, cast, d->val, cast, d->val,
2507 d->reorder_fn);
2508 break;
2510 case TYPE_SCALAR:
2511 break;
2513 default:
2514 gcc_unreachable ();
2518 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
2520 static void
2521 output_type_enum (outf_p of, type_p s)
2523 if (s->kind == TYPE_PARAM_STRUCT && s->u.s.line.file != NULL)
2525 oprintf (of, ", gt_e_");
2526 output_mangled_typename (of, s);
2528 else if (UNION_OR_STRUCT_P (s) && s->u.s.line.file != NULL)
2530 oprintf (of, ", gt_ggc_e_");
2531 output_mangled_typename (of, s);
2533 else
2534 oprintf (of, ", gt_types_enum_last");
2537 /* Return an output file that is suitable for definitions which can
2538 reference struct S */
2540 static outf_p
2541 get_output_file_for_structure (const_type_p s, type_p *param)
2543 const char * fn = s->u.s.line.file;
2544 int i;
2546 /* This is a hack, and not the good kind either. */
2547 for (i = NUM_PARAM - 1; i >= 0; i--)
2548 if (param && param[i] && param[i]->kind == TYPE_POINTER
2549 && UNION_OR_STRUCT_P (param[i]->u.p))
2550 fn = param[i]->u.p->u.s.line.file;
2552 return get_output_file_with_visibility (fn);
2555 /* For S, a structure that's part of ORIG_S, and using parameters
2556 PARAM, write out a routine that:
2557 - Takes a parameter, a void * but actually of type *S
2558 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2559 field of S or its substructures and (in some cases) things
2560 that are pointed to by S.
2563 static void
2564 write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2565 const struct write_types_data *wtd)
2567 const char *chain_next = NULL;
2568 const char *chain_prev = NULL;
2569 const char *chain_circular = NULL;
2570 const char *mark_hook_name = NULL;
2571 options_p opt;
2572 struct walk_type_data d;
2574 memset (&d, 0, sizeof (d));
2575 d.of = get_output_file_for_structure (s, param);
2577 for (opt = s->u.s.opt; opt; opt = opt->next)
2578 if (strcmp (opt->name, "chain_next") == 0)
2579 chain_next = opt->info;
2580 else if (strcmp (opt->name, "chain_prev") == 0)
2581 chain_prev = opt->info;
2582 else if (strcmp (opt->name, "chain_circular") == 0)
2583 chain_circular = opt->info;
2584 else if (strcmp (opt->name, "mark_hook") == 0)
2585 mark_hook_name = opt->info;
2587 if (chain_prev != NULL && chain_next == NULL)
2588 error_at_line (&s->u.s.line, "chain_prev without chain_next");
2589 if (chain_circular != NULL && chain_next != NULL)
2590 error_at_line (&s->u.s.line, "chain_circular with chain_next");
2591 if (chain_circular != NULL)
2592 chain_next = chain_circular;
2594 d.process_field = write_types_process_field;
2595 d.cookie = wtd;
2596 d.orig_s = orig_s;
2597 d.opt = s->u.s.opt;
2598 d.line = &s->u.s.line;
2599 d.bitmap = s->u.s.bitmap;
2600 d.param = param;
2601 d.prev_val[0] = "*x";
2602 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2603 d.prev_val[3] = "x";
2604 d.val = "(*x)";
2606 oprintf (d.of, "\n");
2607 oprintf (d.of, "void\n");
2608 if (param == NULL)
2609 oprintf (d.of, "gt_%sx_%s", wtd->prefix, orig_s->u.s.tag);
2610 else
2612 oprintf (d.of, "gt_%s_", wtd->prefix);
2613 output_mangled_typename (d.of, orig_s);
2615 oprintf (d.of, " (void *x_p)\n");
2616 oprintf (d.of, "{\n");
2617 oprintf (d.of, " %s %s * %sx = (%s %s *)x_p;\n",
2618 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2619 chain_next == NULL ? "const " : "",
2620 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2621 if (chain_next != NULL)
2622 oprintf (d.of, " %s %s * xlimit = x;\n",
2623 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2624 if (chain_next == NULL)
2626 oprintf (d.of, " if (%s (x", wtd->marker_routine);
2627 if (wtd->param_prefix)
2629 oprintf (d.of, ", x, gt_%s_", wtd->param_prefix);
2630 output_mangled_typename (d.of, orig_s);
2631 output_type_enum (d.of, orig_s);
2633 oprintf (d.of, "))\n");
2635 else
2637 if (chain_circular != NULL)
2638 oprintf (d.of, " if (!%s (xlimit", wtd->marker_routine);
2639 else
2640 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2641 if (wtd->param_prefix)
2643 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2644 output_mangled_typename (d.of, orig_s);
2645 output_type_enum (d.of, orig_s);
2647 oprintf (d.of, "))\n");
2648 if (chain_circular != NULL)
2649 oprintf (d.of, " return;\n do\n");
2650 if (mark_hook_name && !wtd->skip_hooks)
2652 oprintf (d.of, " {\n");
2653 oprintf (d.of, " %s (xlimit);\n ", mark_hook_name);
2655 oprintf (d.of, " xlimit = (");
2656 d.prev_val[2] = "*xlimit";
2657 output_escaped_param (&d, chain_next, "chain_next");
2658 oprintf (d.of, ");\n");
2659 if (mark_hook_name && !wtd->skip_hooks)
2660 oprintf (d.of, " }\n");
2661 if (chain_prev != NULL)
2663 oprintf (d.of, " if (x != xlimit)\n");
2664 oprintf (d.of, " for (;;)\n");
2665 oprintf (d.of, " {\n");
2666 oprintf (d.of, " %s %s * const xprev = (",
2667 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2669 d.prev_val[2] = "*x";
2670 output_escaped_param (&d, chain_prev, "chain_prev");
2671 oprintf (d.of, ");\n");
2672 oprintf (d.of, " if (xprev == NULL) break;\n");
2673 oprintf (d.of, " x = xprev;\n");
2674 oprintf (d.of, " (void) %s (xprev",
2675 wtd->marker_routine);
2676 if (wtd->param_prefix)
2678 oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
2679 output_mangled_typename (d.of, orig_s);
2680 output_type_enum (d.of, orig_s);
2682 oprintf (d.of, ");\n");
2683 oprintf (d.of, " }\n");
2685 if (chain_circular != NULL)
2687 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2688 if (wtd->param_prefix)
2690 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2691 output_mangled_typename (d.of, orig_s);
2692 output_type_enum (d.of, orig_s);
2694 oprintf (d.of, "));\n");
2695 if (mark_hook_name && !wtd->skip_hooks)
2696 oprintf (d.of, " %s (xlimit);\n", mark_hook_name);
2697 oprintf (d.of, " do\n");
2699 else
2700 oprintf (d.of, " while (x != xlimit)\n");
2702 oprintf (d.of, " {\n");
2703 if (mark_hook_name && chain_next == NULL && !wtd->skip_hooks)
2705 oprintf (d.of, " %s (x);\n", mark_hook_name);
2707 d.prev_val[2] = "*x";
2708 d.indent = 6;
2709 walk_type (s, &d);
2711 if (chain_next != NULL)
2713 oprintf (d.of, " x = (");
2714 output_escaped_param (&d, chain_next, "chain_next");
2715 oprintf (d.of, ");\n");
2718 oprintf (d.of, " }\n");
2719 if (chain_circular != NULL)
2720 oprintf (d.of, " while (x != xlimit);\n");
2721 oprintf (d.of, "}\n");
2724 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
2726 static void
2727 write_types (outf_p output_header, type_p structures, type_p param_structs,
2728 const struct write_types_data *wtd)
2730 type_p s;
2732 oprintf (output_header, "\n/* %s*/\n", wtd->comment);
2733 /* We first emit the macros and the declarations. Functions' code is
2734 emitted afterwards. This is needed in plugin mode. */
2735 oprintf (output_header, "/* macros and declarations */\n");
2736 for (s = structures; s; s = s->next)
2737 if (s->gc_used == GC_POINTED_TO
2738 || s->gc_used == GC_MAYBE_POINTED_TO)
2740 options_p opt;
2742 if (s->gc_used == GC_MAYBE_POINTED_TO
2743 && s->u.s.line.file == NULL)
2744 continue;
2746 oprintf (output_header, "#define gt_%s_", wtd->prefix);
2747 output_mangled_typename (output_header, s);
2748 oprintf (output_header, "(X) do { \\\n");
2749 oprintf (output_header,
2750 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
2751 s->u.s.tag);
2752 oprintf (output_header,
2753 " } while (0)\n");
2755 for (opt = s->u.s.opt; opt; opt = opt->next)
2756 if (strcmp (opt->name, "ptr_alias") == 0)
2758 const_type_p const t = (const_type_p) opt->info;
2759 if (t->kind == TYPE_STRUCT
2760 || t->kind == TYPE_UNION
2761 || t->kind == TYPE_LANG_STRUCT)
2762 oprintf (output_header,
2763 "#define gt_%sx_%s gt_%sx_%s\n",
2764 wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
2765 else
2766 error_at_line (&s->u.s.line,
2767 "structure alias is not a structure");
2768 break;
2770 if (opt)
2771 continue;
2773 /* Declare the marker procedure only once. */
2774 oprintf (output_header,
2775 "extern void gt_%sx_%s (void *);\n",
2776 wtd->prefix, s->u.s.tag);
2778 if (s->u.s.line.file == NULL)
2780 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2781 s->u.s.tag);
2782 continue;
2786 for (s = param_structs; s; s = s->next)
2787 if (s->gc_used == GC_POINTED_TO)
2789 type_p stru = s->u.param_struct.stru;
2791 /* Declare the marker procedure. */
2792 oprintf (output_header, "extern void gt_%s_", wtd->prefix);
2793 output_mangled_typename (output_header, s);
2794 oprintf (output_header, " (void *);\n");
2796 if (stru->u.s.line.file == NULL)
2798 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2799 s->u.s.tag);
2800 continue;
2804 /* At last we emit the functions code. */
2805 oprintf (output_header, "\n/* functions code */\n");
2806 for (s = structures; s; s = s->next)
2807 if (s->gc_used == GC_POINTED_TO
2808 || s->gc_used == GC_MAYBE_POINTED_TO)
2810 options_p opt;
2812 if (s->gc_used == GC_MAYBE_POINTED_TO
2813 && s->u.s.line.file == NULL)
2814 continue;
2815 for (opt = s->u.s.opt; opt; opt = opt->next)
2816 if (strcmp (opt->name, "ptr_alias") == 0)
2817 break;
2818 if (opt)
2819 continue;
2821 if (s->kind == TYPE_LANG_STRUCT)
2823 type_p ss;
2824 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2825 write_func_for_structure (s, ss, NULL, wtd);
2827 else
2828 write_func_for_structure (s, s, NULL, wtd);
2830 for (s = param_structs; s; s = s->next)
2831 if (s->gc_used == GC_POINTED_TO)
2833 type_p *param = s->u.param_struct.param;
2834 type_p stru = s->u.param_struct.stru;
2835 if (stru->u.s.line.file == NULL)
2836 continue;
2837 if (stru->kind == TYPE_LANG_STRUCT)
2839 type_p ss;
2840 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
2841 write_func_for_structure (s, ss, param, wtd);
2843 else
2844 write_func_for_structure (s, stru, param, wtd);
2848 static const struct write_types_data ggc_wtd =
2850 "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
2851 "GC marker procedures. ",
2852 FALSE
2855 static const struct write_types_data pch_wtd =
2857 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
2858 "gt_pch_note_reorder",
2859 "PCH type-walking procedures. ",
2860 TRUE
2863 /* Write out the local pointer-walking routines. */
2865 /* process_field routine for local pointer-walking. */
2867 static void
2868 write_types_local_process_field (type_p f, const struct walk_type_data *d)
2870 switch (f->kind)
2872 case TYPE_POINTER:
2873 case TYPE_STRUCT:
2874 case TYPE_UNION:
2875 case TYPE_LANG_STRUCT:
2876 case TYPE_PARAM_STRUCT:
2877 case TYPE_STRING:
2878 oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "",
2879 d->prev_val[3]);
2880 oprintf (d->of, "%*s op (&(%s), cookie);\n", d->indent, "", d->val);
2881 break;
2883 case TYPE_SCALAR:
2884 break;
2886 default:
2887 gcc_unreachable ();
2891 /* For S, a structure that's part of ORIG_S, and using parameters
2892 PARAM, write out a routine that:
2893 - Is of type gt_note_pointers
2894 - Calls PROCESS_FIELD on each field of S or its substructures.
2897 static void
2898 write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param)
2900 struct walk_type_data d;
2902 memset (&d, 0, sizeof (d));
2903 d.of = get_output_file_for_structure (s, param);
2904 d.process_field = write_types_local_process_field;
2905 d.opt = s->u.s.opt;
2906 d.line = &s->u.s.line;
2907 d.bitmap = s->u.s.bitmap;
2908 d.param = param;
2909 d.prev_val[0] = d.prev_val[2] = "*x";
2910 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2911 d.prev_val[3] = "x";
2912 d.val = "(*x)";
2913 d.fn_wants_lvalue = true;
2915 oprintf (d.of, "\n");
2916 oprintf (d.of, "void\n");
2917 oprintf (d.of, "gt_pch_p_");
2918 output_mangled_typename (d.of, orig_s);
2919 oprintf (d.of, " (ATTRIBUTE_UNUSED void *this_obj,\n"
2920 "\tvoid *x_p,\n"
2921 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
2922 "\tATTRIBUTE_UNUSED void *cookie)\n");
2923 oprintf (d.of, "{\n");
2924 oprintf (d.of, " %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
2925 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2926 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2927 d.indent = 2;
2928 walk_type (s, &d);
2929 oprintf (d.of, "}\n");
2932 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
2934 static void
2935 write_local (outf_p output_header, type_p structures, type_p param_structs)
2937 type_p s;
2939 if (!output_header)
2940 return;
2941 oprintf (output_header, "\n/* Local pointer-walking routines. */\n");
2942 for (s = structures; s; s = s->next)
2943 if (s->gc_used == GC_POINTED_TO
2944 || s->gc_used == GC_MAYBE_POINTED_TO)
2946 options_p opt;
2948 if (s->u.s.line.file == NULL)
2949 continue;
2951 for (opt = s->u.s.opt; opt; opt = opt->next)
2952 if (strcmp (opt->name, "ptr_alias") == 0)
2954 const_type_p const t = (const_type_p) opt->info;
2955 if (t->kind == TYPE_STRUCT
2956 || t->kind == TYPE_UNION
2957 || t->kind == TYPE_LANG_STRUCT)
2959 oprintf (output_header, "#define gt_pch_p_");
2960 output_mangled_typename (output_header, s);
2961 oprintf (output_header, " gt_pch_p_");
2962 output_mangled_typename (output_header, t);
2963 oprintf (output_header, "\n");
2965 else
2966 error_at_line (&s->u.s.line,
2967 "structure alias is not a structure");
2968 break;
2970 if (opt)
2971 continue;
2973 /* Declare the marker procedure only once. */
2974 oprintf (output_header, "extern void gt_pch_p_");
2975 output_mangled_typename (output_header, s);
2976 oprintf (output_header,
2977 "\n (void *, void *, gt_pointer_operator, void *);\n");
2979 if (s->kind == TYPE_LANG_STRUCT)
2981 type_p ss;
2982 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2983 write_local_func_for_structure (s, ss, NULL);
2985 else
2986 write_local_func_for_structure (s, s, NULL);
2989 for (s = param_structs; s; s = s->next)
2990 if (s->gc_used == GC_POINTED_TO)
2992 type_p * param = s->u.param_struct.param;
2993 type_p stru = s->u.param_struct.stru;
2995 /* Declare the marker procedure. */
2996 oprintf (output_header, "extern void gt_pch_p_");
2997 output_mangled_typename (output_header, s);
2998 oprintf (output_header,
2999 "\n (void *, void *, gt_pointer_operator, void *);\n");
3001 if (stru->u.s.line.file == NULL)
3003 fprintf (stderr, "warning: structure `%s' used but not defined\n",
3004 s->u.s.tag);
3005 continue;
3008 if (stru->kind == TYPE_LANG_STRUCT)
3010 type_p ss;
3011 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3012 write_local_func_for_structure (s, ss, param);
3014 else
3015 write_local_func_for_structure (s, stru, param);
3019 /* Write out the 'enum' definition for gt_types_enum. */
3021 static void
3022 write_enum_defn (type_p structures, type_p param_structs)
3024 type_p s;
3026 if (!header_file)
3027 return;
3028 oprintf (header_file, "\n/* Enumeration of types known. */\n");
3029 oprintf (header_file, "enum gt_types_enum {\n");
3030 for (s = structures; s; s = s->next)
3031 if (s->gc_used == GC_POINTED_TO
3032 || s->gc_used == GC_MAYBE_POINTED_TO)
3034 if (s->gc_used == GC_MAYBE_POINTED_TO
3035 && s->u.s.line.file == NULL)
3036 continue;
3038 oprintf (header_file, " gt_ggc_e_");
3039 output_mangled_typename (header_file, s);
3040 oprintf (header_file, ", \n");
3042 for (s = param_structs; s; s = s->next)
3043 if (s->gc_used == GC_POINTED_TO)
3045 oprintf (header_file, " gt_e_");
3046 output_mangled_typename (header_file, s);
3047 oprintf (header_file, ", \n");
3049 oprintf (header_file, " gt_types_enum_last\n");
3050 oprintf (header_file, "};\n");
3053 /* Might T contain any non-pointer elements? */
3055 static int
3056 contains_scalar_p (type_p t)
3058 switch (t->kind)
3060 case TYPE_STRING:
3061 case TYPE_POINTER:
3062 return 0;
3063 case TYPE_ARRAY:
3064 return contains_scalar_p (t->u.a.p);
3065 default:
3066 /* Could also check for structures that have no non-pointer
3067 fields, but there aren't enough of those to worry about. */
3068 return 1;
3072 /* Mangle FN and print it to F. */
3074 static void
3075 put_mangled_filename (outf_p f, const char *fn)
3077 const char *name = get_output_file_name (fn);
3078 if (!f || !name)
3079 return;
3080 for (; *name != 0; name++)
3081 if (ISALNUM (*name))
3082 oprintf (f, "%c", *name);
3083 else
3084 oprintf (f, "%c", '_');
3087 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
3088 LASTNAME, and NAME are all strings to insert in various places in
3089 the resulting code. */
3091 static void
3092 finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
3093 const char *tname, const char *name)
3095 struct flist *fli2;
3097 for (fli2 = flp; fli2; fli2 = fli2->next)
3098 if (fli2->started_p)
3100 oprintf (fli2->f, " %s\n", lastname);
3101 oprintf (fli2->f, "};\n\n");
3104 for (fli2 = flp; fli2 && base_files; fli2 = fli2->next)
3105 if (fli2->started_p)
3107 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3108 int fnum;
3110 for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3111 if (bitmap & 1)
3113 oprintf (base_files[fnum],
3114 "extern const struct %s gt_%s_",
3115 tname, pfx);
3116 put_mangled_filename (base_files[fnum], fli2->name);
3117 oprintf (base_files[fnum], "[];\n");
3122 size_t fnum;
3123 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3124 oprintf (base_files [fnum],
3125 "EXPORTED_CONST struct %s * const %s[] = {\n",
3126 tname, name);
3130 for (fli2 = flp; fli2; fli2 = fli2->next)
3131 if (fli2->started_p)
3133 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3134 int fnum;
3136 fli2->started_p = 0;
3138 for (fnum = 0; base_files && bitmap != 0; fnum++, bitmap >>= 1)
3139 if (bitmap & 1)
3141 oprintf (base_files[fnum], " gt_%s_", pfx);
3142 put_mangled_filename (base_files[fnum], fli2->name);
3143 oprintf (base_files[fnum], ",\n");
3148 size_t fnum;
3149 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3151 oprintf (base_files[fnum], " NULL\n");
3152 oprintf (base_files[fnum], "};\n");
3157 /* Write out to F the table entry and any marker routines needed to
3158 mark NAME as TYPE. The original variable is V, at LINE.
3159 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
3160 is nonzero iff we are building the root table for hash table caches. */
3162 static void
3163 write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
3164 struct fileloc *line, const char *if_marked, bool emit_pch)
3166 switch (type->kind)
3168 case TYPE_STRUCT:
3170 pair_p fld;
3171 for (fld = type->u.s.fields; fld; fld = fld->next)
3173 int skip_p = 0;
3174 const char *desc = NULL;
3175 options_p o;
3177 for (o = fld->opt; o; o = o->next)
3178 if (strcmp (o->name, "skip") == 0)
3179 skip_p = 1;
3180 else if (strcmp (o->name, "desc") == 0)
3181 desc = o->info;
3182 else if (strcmp (o->name, "param_is") == 0)
3184 else
3185 error_at_line (line,
3186 "field `%s' of global `%s' has unknown option `%s'",
3187 fld->name, name, o->name);
3189 if (skip_p)
3190 continue;
3191 else if (desc && fld->type->kind == TYPE_UNION)
3193 pair_p validf = NULL;
3194 pair_p ufld;
3196 for (ufld = fld->type->u.s.fields; ufld; ufld = ufld->next)
3198 const char *tag = NULL;
3199 options_p oo;
3201 for (oo = ufld->opt; oo; oo = oo->next)
3202 if (strcmp (oo->name, "tag") == 0)
3203 tag = oo->info;
3204 if (tag == NULL || strcmp (tag, desc) != 0)
3205 continue;
3206 if (validf != NULL)
3207 error_at_line (line,
3208 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3209 name, fld->name, validf->name,
3210 name, fld->name, ufld->name,
3211 tag);
3212 validf = ufld;
3214 if (validf != NULL)
3216 char *newname;
3217 newname = xasprintf ("%s.%s.%s",
3218 name, fld->name, validf->name);
3219 write_root (f, v, validf->type, newname, 0, line,
3220 if_marked, emit_pch);
3221 free (newname);
3224 else if (desc)
3225 error_at_line (line,
3226 "global `%s.%s' has `desc' option but is not union",
3227 name, fld->name);
3228 else
3230 char *newname;
3231 newname = xasprintf ("%s.%s", name, fld->name);
3232 write_root (f, v, fld->type, newname, 0, line, if_marked,
3233 emit_pch);
3234 free (newname);
3238 break;
3240 case TYPE_ARRAY:
3242 char *newname;
3243 newname = xasprintf ("%s[0]", name);
3244 write_root (f, v, type->u.a.p, newname, has_length, line, if_marked,
3245 emit_pch);
3246 free (newname);
3248 break;
3250 case TYPE_POINTER:
3252 type_p ap, tp;
3254 oprintf (f, " {\n");
3255 oprintf (f, " &%s,\n", name);
3256 oprintf (f, " 1");
3258 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3259 if (ap->u.a.len[0])
3260 oprintf (f, " * (%s)", ap->u.a.len);
3261 else if (ap == v->type)
3262 oprintf (f, " * ARRAY_SIZE (%s)", v->name);
3263 oprintf (f, ",\n");
3264 oprintf (f, " sizeof (%s", v->name);
3265 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3266 oprintf (f, "[0]");
3267 oprintf (f, "),\n");
3269 tp = type->u.p;
3271 if (! has_length && UNION_OR_STRUCT_P (tp))
3273 oprintf (f, " &gt_ggc_mx_%s,\n", tp->u.s.tag);
3274 if (emit_pch)
3275 oprintf (f, " &gt_pch_nx_%s", tp->u.s.tag);
3276 else
3277 oprintf (f, " NULL");
3279 else if (! has_length && tp->kind == TYPE_PARAM_STRUCT)
3281 oprintf (f, " &gt_ggc_m_");
3282 output_mangled_typename (f, tp);
3283 if (emit_pch)
3285 oprintf (f, ",\n &gt_pch_n_");
3286 output_mangled_typename (f, tp);
3288 else
3289 oprintf (f, ",\n NULL");
3291 else if (has_length
3292 && (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
3294 oprintf (f, " &gt_ggc_ma_%s,\n", name);
3295 if (emit_pch)
3296 oprintf (f, " &gt_pch_na_%s", name);
3297 else
3298 oprintf (f, " NULL");
3300 else
3302 error_at_line (line,
3303 "global `%s' is pointer to unimplemented type",
3304 name);
3306 if (if_marked)
3307 oprintf (f, ",\n &%s", if_marked);
3308 oprintf (f, "\n },\n");
3310 break;
3312 case TYPE_STRING:
3314 oprintf (f, " {\n");
3315 oprintf (f, " &%s,\n", name);
3316 oprintf (f, " 1, \n");
3317 oprintf (f, " sizeof (%s),\n", v->name);
3318 oprintf (f, " (gt_pointer_walker) &gt_ggc_m_S,\n");
3319 oprintf (f, " (gt_pointer_walker) &gt_pch_n_S\n");
3320 oprintf (f, " },\n");
3322 break;
3324 case TYPE_SCALAR:
3325 break;
3327 default:
3328 error_at_line (line,
3329 "global `%s' is unimplemented type",
3330 name);
3334 /* This generates a routine to walk an array. */
3336 static void
3337 write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
3339 struct walk_type_data d;
3340 char *prevval3;
3342 memset (&d, 0, sizeof (d));
3343 d.of = f;
3344 d.cookie = wtd;
3345 d.indent = 2;
3346 d.line = &v->line;
3347 d.opt = v->opt;
3348 d.bitmap = get_lang_bitmap (v->line.file);
3349 d.param = NULL;
3351 d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name);
3353 if (wtd->param_prefix)
3355 oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
3356 oprintf (f,
3357 " (void *, void *, gt_pointer_operator, void *);\n");
3358 oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3359 wtd->param_prefix, v->name);
3360 oprintf (d.of,
3361 " ATTRIBUTE_UNUSED void *x_p,\n"
3362 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3363 " ATTRIBUTE_UNUSED void * cookie)\n");
3364 oprintf (d.of, "{\n");
3365 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3366 d.process_field = write_types_local_process_field;
3367 walk_type (v->type, &d);
3368 oprintf (f, "}\n\n");
3371 d.opt = v->opt;
3372 oprintf (f, "static void gt_%sa_%s (void *);\n",
3373 wtd->prefix, v->name);
3374 oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3375 wtd->prefix, v->name);
3376 oprintf (f, "{\n");
3377 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3378 d.process_field = write_types_process_field;
3379 walk_type (v->type, &d);
3380 free (prevval3);
3381 oprintf (f, "}\n\n");
3384 /* Output a table describing the locations and types of VARIABLES. */
3386 static void
3387 write_roots (pair_p variables, bool emit_pch)
3389 pair_p v;
3390 struct flist *flp = NULL;
3392 for (v = variables; v; v = v->next)
3394 outf_p f = get_output_file_with_visibility (v->line.file);
3395 struct flist *fli;
3396 const char *length = NULL;
3397 int deletable_p = 0;
3398 options_p o;
3400 for (o = v->opt; o; o = o->next)
3401 if (strcmp (o->name, "length") == 0)
3402 length = o->info;
3403 else if (strcmp (o->name, "deletable") == 0)
3404 deletable_p = 1;
3405 else if (strcmp (o->name, "param_is") == 0)
3407 else if (strncmp (o->name, "param", 5) == 0
3408 && ISDIGIT (o->name[5])
3409 && strcmp (o->name + 6, "_is") == 0)
3411 else if (strcmp (o->name, "if_marked") == 0)
3413 else
3414 error_at_line (&v->line,
3415 "global `%s' has unknown option `%s'",
3416 v->name, o->name);
3418 for (fli = flp; fli; fli = fli->next)
3419 if (fli->f == f && f)
3420 break;
3421 if (fli == NULL)
3423 fli = XNEW (struct flist);
3424 fli->f = f;
3425 fli->next = flp;
3426 fli->started_p = 0;
3427 fli->name = v->line.file;
3428 gcc_assert(fli->name);
3429 flp = fli;
3431 oprintf (f, "\n/* GC roots. */\n\n");
3434 if (! deletable_p
3435 && length
3436 && v->type->kind == TYPE_POINTER
3437 && (v->type->u.p->kind == TYPE_POINTER
3438 || v->type->u.p->kind == TYPE_STRUCT))
3440 write_array (f, v, &ggc_wtd);
3441 write_array (f, v, &pch_wtd);
3445 for (v = variables; v; v = v->next)
3447 outf_p f = get_output_file_with_visibility (v->line.file);
3448 struct flist *fli;
3449 int skip_p = 0;
3450 int length_p = 0;
3451 options_p o;
3453 for (o = v->opt; o; o = o->next)
3454 if (strcmp (o->name, "length") == 0)
3455 length_p = 1;
3456 else if (strcmp (o->name, "deletable") == 0
3457 || strcmp (o->name, "if_marked") == 0)
3458 skip_p = 1;
3460 if (skip_p)
3461 continue;
3463 for (fli = flp; fli; fli = fli->next)
3464 if (fli->f == f)
3465 break;
3466 if (! fli->started_p)
3468 fli->started_p = 1;
3470 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
3471 put_mangled_filename (f, v->line.file);
3472 oprintf (f, "[] = {\n");
3475 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3478 finish_root_table (flp, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3479 "gt_ggc_rtab");
3481 for (v = variables; v; v = v->next)
3483 outf_p f = get_output_file_with_visibility (v->line.file);
3484 struct flist *fli;
3485 int skip_p = 1;
3486 options_p o;
3488 for (o = v->opt; o; o = o->next)
3489 if (strcmp (o->name, "deletable") == 0)
3490 skip_p = 0;
3491 else if (strcmp (o->name, "if_marked") == 0)
3492 skip_p = 1;
3494 if (skip_p)
3495 continue;
3497 for (fli = flp; fli; fli = fli->next)
3498 if (fli->f == f)
3499 break;
3500 if (! fli->started_p)
3502 fli->started_p = 1;
3504 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
3505 put_mangled_filename (f, v->line.file);
3506 oprintf (f, "[] = {\n");
3509 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3510 v->name, v->name);
3513 finish_root_table (flp, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3514 "gt_ggc_deletable_rtab");
3516 for (v = variables; v; v = v->next)
3518 outf_p f = get_output_file_with_visibility (v->line.file);
3519 struct flist *fli;
3520 const char *if_marked = NULL;
3521 int length_p = 0;
3522 options_p o;
3524 for (o = v->opt; o; o = o->next)
3525 if (strcmp (o->name, "length") == 0)
3526 length_p = 1;
3527 else if (strcmp (o->name, "if_marked") == 0)
3528 if_marked = o->info;
3530 if (if_marked == NULL)
3531 continue;
3533 if (v->type->kind != TYPE_POINTER
3534 || v->type->u.p->kind != TYPE_PARAM_STRUCT
3535 || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
3537 error_at_line (&v->line, "if_marked option used but not hash table");
3538 continue;
3541 for (fli = flp; fli; fli = fli->next)
3542 if (fli->f == f)
3543 break;
3544 if (! fli->started_p)
3546 fli->started_p = 1;
3548 oprintf (f, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
3549 put_mangled_filename (f, v->line.file);
3550 oprintf (f, "[] = {\n");
3553 write_root (f, v, v->type->u.p->u.param_struct.param[0],
3554 v->name, length_p, &v->line, if_marked, emit_pch);
3557 finish_root_table (flp, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
3558 "gt_ggc_cache_rtab");
3560 if (!emit_pch)
3561 return;
3563 for (v = variables; v; v = v->next)
3565 outf_p f = get_output_file_with_visibility (v->line.file);
3566 struct flist *fli;
3567 int length_p = 0;
3568 int if_marked_p = 0;
3569 options_p o;
3571 for (o = v->opt; o; o = o->next)
3572 if (strcmp (o->name, "length") == 0)
3573 length_p = 1;
3574 else if (strcmp (o->name, "if_marked") == 0)
3575 if_marked_p = 1;
3577 if (! if_marked_p)
3578 continue;
3580 for (fli = flp; fli; fli = fli->next)
3581 if (fli->f == f)
3582 break;
3583 if (! fli->started_p)
3585 fli->started_p = 1;
3587 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
3588 put_mangled_filename (f, v->line.file);
3589 oprintf (f, "[] = {\n");
3592 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3595 finish_root_table (flp, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3596 "gt_pch_cache_rtab");
3598 for (v = variables; v; v = v->next)
3600 outf_p f = get_output_file_with_visibility (v->line.file);
3601 struct flist *fli;
3602 int skip_p = 0;
3603 options_p o;
3605 for (o = v->opt; o; o = o->next)
3606 if (strcmp (o->name, "deletable") == 0
3607 || strcmp (o->name, "if_marked") == 0)
3608 skip_p = 1;
3610 if (skip_p)
3611 continue;
3613 if (! contains_scalar_p (v->type))
3614 continue;
3616 for (fli = flp; fli; fli = fli->next)
3617 if (fli->f == f)
3618 break;
3619 if (! fli->started_p)
3621 fli->started_p = 1;
3623 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
3624 put_mangled_filename (f, v->line.file);
3625 oprintf (f, "[] = {\n");
3628 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3629 v->name, v->name);
3632 finish_root_table (flp, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3633 "gt_pch_scalar_rtab");
3636 /* Record the definition of a generic VEC structure, as if we had expanded
3637 the macros in vec.h:
3639 typedef struct VEC_<type>_base GTY(()) {
3640 unsigned num;
3641 unsigned alloc;
3642 <type> GTY((length ("%h.num"))) vec[1];
3643 } VEC_<type>_base
3645 where the GTY(()) tags are only present if is_scalar is _false_. */
3647 void
3648 note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
3650 pair_p fields;
3651 type_p t;
3652 options_p o;
3653 type_p len_ty = create_scalar_type ("unsigned");
3654 const char *name = concat ("VEC_", type_name, "_base", (char *)0);
3656 if (is_scalar)
3658 t = create_scalar_type (type_name);
3659 o = 0;
3661 else
3663 t = resolve_typedef (type_name, pos);
3664 o = create_option (0, "length", "%h.num");
3667 /* We assemble the field list in reverse order. */
3668 fields = create_field_at (0, create_array (t, "1"), "vec", o, pos);
3669 fields = create_field_at (fields, len_ty, "alloc", 0, pos);
3670 fields = create_field_at (fields, len_ty, "num", 0, pos);
3672 do_typedef (name, new_structure (name, 0, pos, fields, 0), pos);
3675 /* Record the definition of an allocation-specific VEC structure, as if
3676 we had expanded the macros in vec.h:
3678 typedef struct VEC_<type>_<astrat> {
3679 VEC_<type>_base base;
3680 } VEC_<type>_<astrat>;
3682 void
3683 note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
3685 const char *astratname = concat ("VEC_", type, "_", astrat, (char *)0);
3686 const char *basename = concat ("VEC_", type, "_base", (char *)0);
3688 pair_p field = create_field_at (0, resolve_typedef (basename, pos),
3689 "base", 0, pos);
3691 do_typedef (astratname, new_structure (astratname, 0, pos, field, 0), pos);
3694 static void dump_pair (int indent, pair_p p);
3695 static void dump_type (int indent, type_p p);
3696 static void dump_type_list (int indent, type_p p);
3698 #define INDENT 2
3700 /* Dumps the value of typekind KIND. */
3702 static void
3703 dump_typekind (int indent, enum typekind kind)
3705 printf ("%*ckind = ", indent, ' ');
3706 switch (kind)
3708 case TYPE_SCALAR: printf ("TYPE_SCALAR"); break;
3709 case TYPE_STRING: printf ("TYPE_STRING"); break;
3710 case TYPE_STRUCT: printf ("TYPE_STRUCT"); break;
3711 case TYPE_UNION: printf ("TYPE_UNION"); break;
3712 case TYPE_POINTER: printf ("TYPE_POINTER"); break;
3713 case TYPE_ARRAY: printf ("TYPE_ARRAY"); break;
3714 case TYPE_LANG_STRUCT: printf ("TYPE_LANG_STRUCT"); break;
3715 case TYPE_PARAM_STRUCT: printf ("TYPE_PARAM_STRUCT"); break;
3716 default: gcc_unreachable ();
3718 printf ("\n");
3721 /* Dumps the value of GC_USED flag. */
3723 static void
3724 dump_gc_used (int indent, enum gc_used_enum gc_used)
3726 printf ("%*cgc_used = ", indent, ' ');
3727 switch (gc_used)
3729 case GC_UNUSED: printf ("GC_UNUSED"); break;
3730 case GC_USED: printf ("GC_USED"); break;
3731 case GC_MAYBE_POINTED_TO: printf ("GC_MAYBE_POINTED_TO"); break;
3732 case GC_POINTED_TO: printf ("GC_POINTED_TO"); break;
3733 default: gcc_unreachable ();
3735 printf ("\n");
3738 /* Dumps the type options OPT. */
3740 static void
3741 dump_options (int indent, options_p opt)
3743 options_p o;
3744 printf ("%*coptions = ", indent, ' ');
3745 o = opt;
3746 while (o)
3748 printf ("%s:%s ", o->name, o->info);
3749 o = o->next;
3751 printf ("\n");
3754 /* Dumps the source file location in LINE. */
3756 static void
3757 dump_fileloc (int indent, struct fileloc line)
3759 printf ("%*cfileloc: file = %s, line = %d\n", indent, ' ', line.file,
3760 line.line);
3763 /* Recursively dumps the struct, union, or a language-specific
3764 struct T. */
3766 static void
3767 dump_type_u_s (int indent, type_p t)
3769 pair_p fields;
3771 gcc_assert (t->kind == TYPE_STRUCT || t->kind == TYPE_UNION
3772 || t->kind == TYPE_LANG_STRUCT);
3773 printf ("%*cu.s.tag = %s\n", indent, ' ', t->u.s.tag);
3774 dump_fileloc (indent, t->u.s.line);
3775 printf ("%*cu.s.fields =\n", indent, ' ');
3776 fields = t->u.s.fields;
3777 while (fields)
3779 dump_pair (indent + INDENT, fields);
3780 fields = fields->next;
3782 printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t);
3783 dump_options (indent, t->u.s.opt);
3784 printf ("%*cu.s.bitmap = %X\n", indent, ' ', t->u.s.bitmap);
3785 if (t->kind == TYPE_LANG_STRUCT)
3787 printf ("%*cu.s.lang_struct:\n", indent, ' ');
3788 dump_type_list (indent + INDENT, t->u.s.lang_struct);
3792 /* Recursively dumps the array T. */
3794 static void
3795 dump_type_u_a (int indent, type_p t)
3797 gcc_assert (t->kind == TYPE_ARRAY);
3798 printf ("%*clen = %s, u.a.p:\n", indent, ' ', t->u.a.len);
3799 dump_type_list (indent + INDENT, t->u.a.p);
3802 /* Recursively dumps the parameterized struct T. */
3804 static void
3805 dump_type_u_param_struct (int indent, type_p t)
3807 int i;
3808 gcc_assert (t->kind == TYPE_PARAM_STRUCT);
3809 printf ("%*cu.param_struct.stru:\n", indent, ' ');
3810 dump_type_list (indent, t->u.param_struct.stru);
3811 dump_fileloc (indent, t->u.param_struct.line);
3812 for (i = 0; i < NUM_PARAM; i++)
3814 if (t->u.param_struct.param[i] == NULL)
3815 continue;
3816 printf ("%*cu.param_struct.param[%d]:\n", indent, ' ', i);
3817 dump_type (indent + INDENT, t->u.param_struct.param[i]);
3821 /* Recursively dumps the type list T. */
3823 static void
3824 dump_type_list (int indent, type_p t)
3826 type_p p = t;
3827 while (p)
3829 dump_type (indent, p);
3830 p = p->next;
3834 static htab_t seen_types;
3836 /* Recursively dumps the type T if it was not dumped previously. */
3838 static void
3839 dump_type (int indent, type_p t)
3841 PTR *slot;
3843 printf ("%*cType at %p: ", indent, ' ', (void *)t);
3844 slot = htab_find_slot (seen_types, t, INSERT);
3845 if (*slot != NULL)
3847 printf ("already seen.\n");
3848 return;
3850 *slot = t;
3851 printf ("\n");
3853 dump_typekind (indent, t->kind);
3854 printf ("%*cpointer_to = %p\n", indent + INDENT, ' ',
3855 (void *)t->pointer_to);
3856 dump_gc_used (indent + INDENT, t->gc_used);
3857 switch (t->kind)
3859 case TYPE_SCALAR:
3860 printf ("%*cscalar_is_char = %s\n", indent + INDENT, ' ',
3861 t->u.scalar_is_char ? "true" : "false");
3862 break;
3863 case TYPE_STRING:
3864 break;
3865 case TYPE_STRUCT:
3866 case TYPE_UNION:
3867 case TYPE_LANG_STRUCT:
3868 dump_type_u_s (indent + INDENT, t);
3869 break;
3870 case TYPE_POINTER:
3871 printf ("%*cp:\n", indent + INDENT, ' ');
3872 dump_type (indent + INDENT, t->u.p);
3873 break;
3874 case TYPE_ARRAY:
3875 dump_type_u_a (indent + INDENT, t);
3876 break;
3877 case TYPE_PARAM_STRUCT:
3878 dump_type_u_param_struct (indent + INDENT, t);
3879 break;
3880 default:
3881 gcc_unreachable ();
3883 printf ("%*cEnd of type at %p\n", indent, ' ', (void *)t);
3886 /* Dumps the pair P. */
3888 static void
3889 dump_pair (int indent, pair_p p)
3891 printf ("%*cpair: name = %s\n", indent, ' ', p->name);
3892 dump_type (indent, p->type);
3893 dump_fileloc (indent, p->line);
3894 dump_options (indent, p->opt);
3895 printf ("%*cEnd of pair %s\n", indent, ' ', p->name);
3898 /* Dumps the list of pairs PP. */
3900 static void
3901 dump_pair_list (const char * name, pair_p pp)
3903 pair_p p;
3904 printf ("%s:\n", name);
3905 for (p = pp; p != NULL; p = p->next)
3906 dump_pair (0, p);
3907 printf ("End of %s\n\n", name);
3910 /* Dumps the STRUCTURES. */
3912 static void
3913 dump_structures (const char * name, type_p structures)
3915 printf ("%s:\n", name);
3916 dump_type_list (0, structures);
3917 printf ("End of %s\n\n", name);
3920 /* Dumps the internal structures of gengtype. */
3922 static void
3923 dump_everything (void)
3925 seen_types = htab_create (100, htab_hash_pointer, htab_eq_pointer, NULL);
3926 dump_pair_list ("typedefs", typedefs);
3927 dump_structures ("structures", structures);
3928 dump_structures ("param_structs", param_structs);
3929 dump_pair_list ("variables", variables);
3930 htab_delete (seen_types);
3935 main (int argc, char **argv)
3937 size_t i;
3938 static struct fileloc pos = { this_file, 0 };
3939 char* inputlist = 0;
3940 int do_dump = 0;
3941 outf_p output_header;
3942 char* plugin_output_filename = NULL;
3943 /* fatal uses this */
3944 progname = "gengtype";
3946 if (argc >= 2 && !strcmp (argv[1], "-d"))
3948 do_dump = 1;
3949 argv = &argv[1];
3950 argc--;
3953 if (argc >= 6 && !strcmp (argv[1], "-P"))
3955 plugin_output_filename = argv[2];
3956 plugin_output = create_file ("GCC", plugin_output_filename);
3957 srcdir = argv[3];
3958 inputlist = argv[4];
3959 nb_plugin_files = argc - 5;
3960 plugin_files = XCNEWVEC (char *, nb_plugin_files);
3961 for (i = 0; i < nb_plugin_files; i++)
3963 /* Place an all zero lang_bitmap before the plugin file
3964 name. */
3965 char *name = argv[i + 5];
3966 int len = strlen(name) + 1 + sizeof (lang_bitmap);
3967 plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap);
3968 strcpy (plugin_files[i], name);
3971 else if (argc == 3)
3973 srcdir = argv[1];
3974 inputlist = argv[2];
3976 else
3977 fatal ("usage: gengtype [-d] [-P pluginout.h] srcdir input-list "
3978 "[file1 file2 ... fileN]");
3980 srcdir_len = strlen (srcdir);
3982 read_input_list (inputlist);
3983 if (hit_error)
3984 return 1;
3986 scalar_char.u.scalar_is_char = true;
3987 scalar_nonchar.u.scalar_is_char = false;
3988 gen_rtx_next ();
3990 /* These types are set up with #define or else outside of where
3991 we can see them. */
3992 pos.line = __LINE__ + 1;
3993 do_scalar_typedef ("CUMULATIVE_ARGS", &pos); pos.line++;
3994 do_scalar_typedef ("REAL_VALUE_TYPE", &pos); pos.line++;
3995 do_scalar_typedef ("FIXED_VALUE_TYPE", &pos); pos.line++;
3996 do_scalar_typedef ("double_int", &pos); pos.line++;
3997 do_scalar_typedef ("uint64_t", &pos); pos.line++;
3998 do_scalar_typedef ("uint8", &pos); pos.line++;
3999 do_scalar_typedef ("jword", &pos); pos.line++;
4000 do_scalar_typedef ("JCF_u2", &pos); pos.line++;
4001 do_scalar_typedef ("void", &pos); pos.line++;
4002 do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos);
4004 for (i = 0; i < num_gt_files; i++)
4005 parse_file (gt_files[i]);
4007 if (hit_error)
4008 return 1;
4010 set_gc_used (variables);
4012 open_base_files ();
4013 write_enum_defn (structures, param_structs);
4014 output_header = plugin_output ? plugin_output : header_file;
4015 write_types (output_header, structures, param_structs, &ggc_wtd);
4016 if (plugin_files == NULL)
4018 write_types (header_file, structures, param_structs, &pch_wtd);
4019 write_local (header_file, structures, param_structs);
4021 write_roots (variables, plugin_files == NULL);
4022 write_rtx_next ();
4023 close_output_files ();
4025 if (do_dump)
4026 dump_everything ();
4028 if (plugin_files)
4030 for (i = 0; i < nb_plugin_files; i++)
4031 free (plugin_files[i] - sizeof (lang_bitmap));
4032 free (plugin_files);
4035 if (hit_error)
4036 return 1;
4037 return 0;