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
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
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/>. */
24 #include "errors.h" /* for fatal */
25 #include "double-int.h"
28 /* Data types, macros, etc. used only in this file. */
30 /* Kinds of types we can understand. */
42 typedef unsigned lang_bitmap;
44 /* A way to pass data through to the output end. */
52 /* Option data for the 'nested_ptr' option. */
53 struct nested_ptr_data
56 const char *convert_to;
57 const char *convert_from;
60 /* A name and a type. */
72 /* A description of a type. */
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. */
90 enum gc_used_enum gc_used;
108 type_p param[NUM_PARAM];
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. */
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, ...)
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
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. */
186 error_at_line (const struct fileloc *pos, const char *msg, ...)
192 fprintf (stderr, "%s:%d: ", pos->file, pos->line);
193 vfprintf (stderr, msg, ap);
194 fputc ('\n', stderr);
200 /* asprintf, but produces fatal message on out-of-memory. */
202 xasprintf (const char *format, ...)
208 va_start (ap, format);
209 n = vasprintf (&result, format, ap);
210 if (result == NULL || n < 0)
211 fatal ("out of memory");
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. */
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;
259 for (i = -(int) sizeof (lang_bitmap); i < 0; i++)
260 n = (n << CHAR_BIT) + (unsigned char)gtfile[i];
265 /* Set the bitmap returned by get_lang_bitmap. The only legitimate
266 caller of this function is read_input_list. */
268 set_lang_bitmap (char *gtfile, lang_bitmap n)
271 for (i = -1; i >= -(int) sizeof (lang_bitmap); i--)
273 gtfile[i] = n & ((1U << CHAR_BIT)-1);
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. */
283 measure_input_list (FILE *list)
289 num_gt_files = plugin_files ? nb_plugin_files : 0;
290 while ((c = getc (list)) != EOF)
299 /* Add space for a lang_bitmap before the input file name. */
300 n += sizeof (lang_bitmap);
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
322 read_input_line (FILE *list, char **herep, char **linep,
329 /* Read over whitespace. */
330 while (c == '\n' || c == ' ')
340 /* No space for a lang_bitmap is necessary. Discard the '['. */
343 while (c != ']' && c != '\n' && c != EOF)
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);
357 error_at_line (pos, "missing close bracket for language tag [%s", line);
365 /* Leave space for a lang_bitmap. */
366 memset (here, 0, sizeof (lang_bitmap));
367 here += sizeof (lang_bitmap);
374 while (c != EOF && c != '\n');
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. */
391 read_input_list (const char *listname)
393 FILE *list = fopen (listname, "r");
395 fatal ("cannot open %s: %s", listname, strerror (errno));
399 size_t bufsz = measure_input_list (list);
400 char *buf = XNEWVEC (char, bufsz);
402 char *committed = buf;
403 char *limit = buf + bufsz;
408 lang_bitmap curlangs = (1 << num_lang_dirs) - 1;
410 epos.file = listname;
413 lang_dir_names = XNEWVEC (const char *, num_lang_dirs);
414 gt_files = XNEWVEC (const char *, num_gt_files);
421 is_language = read_input_line (list, &here, &line, &epos);
422 gcc_assert (here <= limit);
425 else if (is_language)
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);
438 curlangs = 1 << langno;
439 lang_dir_names[langno++] = line;
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]);
452 error_at_line (&epos, "file %s specified more than once "
453 "for language %s", line, langno == 0
455 : lang_dir_names[langno - 1]);
458 set_lang_bitmap (CONST_CAST(char *, gt_files[i]), bmap);
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. */
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?) */
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, '/');
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]);
511 fatal ("error reading %s: %s", listname, strerror (errno));
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. */
549 do_typedef (const char *s, type_p t, struct fileloc *pos)
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
557 if (!strcmp (s, "CUMULATIVE_ARGS") && pos->file != this_file)
560 for (p = typedefs; p != NULL; p = p->next)
561 if (strcmp (p->name, s) == 0)
565 error_at_line (pos, "type `%s' previously defined", s);
566 error_at_line (&p->line, "previously defined here");
571 p = XNEW (struct pair);
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). */
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. */
593 resolve_typedef (const char *s, struct fileloc *pos)
596 for (p = typedefs; p != NULL; p = p->next)
597 if (strcmp (p->name, s) == 0)
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. */
607 new_structure (const char *name, int isunion, struct fileloc *pos,
608 pair_p fields, options_p o)
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)
626 if (si->kind == TYPE_LANG_STRUCT)
630 for (si = ls->u.s.lang_struct; si != NULL; si = si->next)
631 if (si->u.s.bitmap == bitmap)
634 else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
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;
643 si->pointer_to = NULL;
644 si->u.s.lang_struct = ls;
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;
661 s = XCNEW (struct type);
662 s->next = structures;
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;
677 s->u.s.fields = fields;
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)
689 for (n = 0; n < num_gt_files; n++)
690 if (!strcmp (gt_files[n] + strlen (gt_files[n]) - strlen ("input.h"),
693 s->u.s.line.file = gt_files[n];
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. */
706 find_structure (const char *name, int isunion)
710 for (s = structures; s != NULL; s = s->next)
711 if (strcmp (name, s->u.s.tag) == 0
712 && UNION_P (s) == isunion)
715 s = XCNEW (struct type);
716 s->next = structures;
718 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
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. */
729 find_param_structure (type_p t, type_p param[NUM_PARAM])
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)
740 res = XCNEW (struct type);
741 res->kind = TYPE_PARAM_STRUCT;
742 res->next = param_structs;
744 res->u.param_struct.stru = t;
745 memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
750 /* Return a scalar type with name NAME. */
753 create_scalar_type (const char *name)
755 if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
758 return &scalar_nonchar;
761 /* Return a pointer to T. */
764 create_pointer (type_p t)
768 type_p r = XCNEW (struct type);
769 r->kind = TYPE_POINTER;
773 return t->pointer_to;
776 /* Return an array of length LEN. */
779 create_array (type_p t, const char *len)
783 v = XCNEW (struct type);
784 v->kind = TYPE_ARRAY;
790 /* Return an options structure with name NAME and info INFO. NEXT is the
791 next option in the chain. */
794 create_option (options_p next, const char *name, const void *info)
796 options_p o = XNEW (struct options);
799 o->info = (const char*) info;
803 /* Return an options structure for a "nested_ptr" option. */
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);
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,
820 note_variable (const char *s, type_p t, options_p o, struct fileloc *pos)
823 n = XNEW (struct pair);
832 /* Most-general structure field creator. */
834 create_field_all (pair_p next, type_p type, const char *name, options_p opt,
835 const char *file, int line)
839 field = XNEW (struct pair);
844 field->line.file = file;
845 field->line.line = line;
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. */
853 create_field_at (pair_p next, type_p type, const char *name, options_p opt,
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
869 create_optional_field_ (pair_p next, type_p type, const char *name,
870 const char *cond, int line)
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),
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. */
896 nreverse_pairs (pair_p list)
898 pair_p prev = 0, p, next;
899 for (p = list; p; p = next)
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
915 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
921 static const char * const rtx_name[NUM_RTX_CODE] = {
922 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
927 static const char * const rtx_format[NUM_RTX_CODE] = {
928 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
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. */
938 #define DEF_INSN_NOTE(NAME) NAME,
939 #include "insn-notes.def"
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"
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. */
963 for (i = 0; i < NUM_RTX_CODE; i++)
967 rtx_next_new[i] = -1;
968 if (strncmp (rtx_format[i], "iuu", 3) == 0)
970 else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
973 for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
974 if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
979 /* Write out the contents of the rtx_next array. */
981 write_rtx_next (void)
983 outf_p f = get_output_file_with_visibility (NULL);
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");
995 " RTX_HDR_SIZE + %d * sizeof (rtunion),\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. */
1005 adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
1010 type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
1011 type_p bitmap_tp, 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 bitmap_tp = create_pointer (find_structure ("bitmap_element_def", 0));
1028 basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
1029 constant_tp = create_pointer (find_structure ("constant_descriptor_rtx", 0));
1030 scalar_tp = &scalar_nonchar; /* rtunion int */
1033 pair_p note_flds = NULL;
1036 for (c = 0; c <= NOTE_INSN_MAX; c++)
1041 case NOTE_INSN_DELETED_LABEL:
1042 note_flds = create_field (note_flds, &string_type, "rt_str");
1045 case NOTE_INSN_BLOCK_BEG:
1046 case NOTE_INSN_BLOCK_END:
1047 note_flds = create_field (note_flds, tree_tp, "rt_tree");
1050 case NOTE_INSN_VAR_LOCATION:
1051 note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
1055 note_flds = create_field (note_flds, scalar_tp, "rt_int");
1058 /* NOTE_INSN_MAX is used as the default field for line
1060 if (c == NOTE_INSN_MAX)
1061 note_flds->opt = create_option (nodot, "default", "");
1063 note_flds->opt = create_option (nodot, "tag", note_insn_name[c]);
1065 note_union_tp = new_structure ("rtx_def_note_subunion", 1,
1066 &lexer_line, note_flds, NULL);
1068 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1072 sym_flds = create_field (NULL, tree_tp, "rt_tree");
1073 sym_flds->opt = create_option (nodot, "default", "");
1075 sym_flds = create_field (sym_flds, constant_tp, "rt_constant");
1076 sym_flds->opt = create_option (nodot, "tag", "1");
1078 symbol_union_tp = new_structure ("rtx_def_symbol_subunion", 1,
1079 &lexer_line, sym_flds, NULL);
1081 for (i = 0; i < NUM_RTX_CODE; i++)
1083 pair_p subfields = NULL;
1084 size_t aindex, nmindex;
1089 for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
1092 const char *subname;
1094 switch (rtx_format[i][aindex])
1105 if (i == MEM && aindex == 1)
1106 t = mem_attrs_tp, subname = "rt_mem";
1107 else if (i == JUMP_INSN && aindex == 8)
1108 t = rtx_tp, subname = "rt_rtx";
1109 else if (i == CODE_LABEL && aindex == 4)
1110 t = scalar_tp, subname = "rt_int";
1111 else if (i == CODE_LABEL && aindex == 5)
1112 t = rtx_tp, subname = "rt_rtx";
1113 else if (i == LABEL_REF
1114 && (aindex == 1 || aindex == 2))
1115 t = rtx_tp, subname = "rt_rtx";
1116 else if (i == NOTE && aindex == 4)
1117 t = note_union_tp, subname = "";
1118 else if (i == NOTE && aindex == 5)
1119 t = scalar_tp, subname = "rt_int";
1120 else if (i == NOTE && aindex >= 7)
1121 t = scalar_tp, subname = "rt_int";
1122 else if (i == ADDR_DIFF_VEC && aindex == 4)
1123 t = scalar_tp, subname = "rt_int";
1124 else if (i == VALUE && aindex == 0)
1125 t = scalar_tp, subname = "rt_int";
1126 else if (i == DEBUG_EXPR && aindex == 0)
1127 t = tree_tp, subname = "rt_tree";
1128 else if (i == REG && aindex == 1)
1129 t = scalar_tp, subname = "rt_int";
1130 else if (i == REG && aindex == 2)
1131 t = reg_attrs_tp, subname = "rt_reg";
1132 else if (i == SCRATCH && aindex == 0)
1133 t = scalar_tp, subname = "rt_int";
1134 else if (i == SYMBOL_REF && aindex == 1)
1135 t = scalar_tp, subname = "rt_int";
1136 else if (i == SYMBOL_REF && aindex == 2)
1137 t = symbol_union_tp, subname = "";
1138 else if (i == BARRIER && aindex >= 3)
1139 t = scalar_tp, subname = "rt_int";
1142 error_at_line (&lexer_line,
1143 "rtx type `%s' has `0' in position %lu, can't handle",
1144 rtx_name[i], (unsigned long) aindex);
1166 subname = "rt_rtvec";
1171 subname = "rt_tree";
1185 error_at_line (&lexer_line,
1186 "rtx type `%s' has `%c' in position %lu, can't handle",
1187 rtx_name[i], rtx_format[i][aindex],
1188 (unsigned long)aindex);
1194 subfields = create_field (subfields, t,
1195 xasprintf (".fld[%lu].%s",
1196 (unsigned long) aindex,
1198 subfields->opt = nodot;
1199 if (t == note_union_tp)
1200 subfields->opt = create_option (subfields->opt, "desc",
1202 if (t == symbol_union_tp)
1203 subfields->opt = create_option (subfields->opt, "desc",
1204 "CONSTANT_POOL_ADDRESS_P (&%0)");
1207 if (i == SYMBOL_REF)
1209 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P holds. */
1210 type_p field_tp = find_structure ("block_symbol", 0);
1212 = create_optional_field (subfields, field_tp, "block_sym",
1213 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1216 sname = xasprintf ("rtx_def_%s", rtx_name[i]);
1217 substruct = new_structure (sname, 0, &lexer_line, subfields, NULL);
1219 ftag = xstrdup (rtx_name[i]);
1220 for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
1221 ftag[nmindex] = TOUPPER (ftag[nmindex]);
1223 flds = create_field (flds, substruct, "");
1224 flds->opt = create_option (nodot, "tag", ftag);
1227 return new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
1230 /* Handle `special("tree_exp")'. This is a special case for
1231 field `operands' of struct tree_exp, which although it claims to contain
1232 pointers to trees, actually sometimes contains pointers to RTL too.
1233 Passed T, the old type of the field, and OPT its options. Returns
1234 a new type for the field. */
1237 adjust_field_tree_exp (type_p t, options_p opt ATTRIBUTE_UNUSED)
1242 if (t->kind != TYPE_ARRAY)
1244 error_at_line (&lexer_line,
1245 "special `tree_exp' must be applied to an array");
1246 return &string_type;
1249 nodot = create_option (NULL, "dot", "");
1251 flds = create_field (NULL, t, "");
1252 flds->opt = create_option (nodot, "length",
1253 "TREE_OPERAND_LENGTH ((tree) &%0)");
1254 flds->opt = create_option (flds->opt, "default", "");
1256 return new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
1259 /* Perform any special processing on a type T, about to become the type
1260 of a field. Return the appropriate type for the field.
1262 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1263 - Similarly for arrays of pointer-to-char;
1264 - Converts structures for which a parameter is provided to
1266 - Handles "special" options.
1270 adjust_field_type (type_p t, options_p opt)
1273 const int pointer_p = t->kind == TYPE_POINTER;
1274 type_p params[NUM_PARAM];
1278 for (i = 0; i < NUM_PARAM; i++)
1281 for (; opt; opt = opt->next)
1282 if (strcmp (opt->name, "length") == 0)
1284 else if (strcmp (opt->name, "param_is") == 0
1285 || (strncmp (opt->name, "param", 5) == 0
1286 && ISDIGIT (opt->name[5])
1287 && strcmp (opt->name + 6, "_is") == 0))
1289 int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
1291 if (! UNION_OR_STRUCT_P (t)
1292 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
1294 error_at_line (&lexer_line,
1295 "option `%s' may only be applied to structures or structure pointers",
1301 if (params[num] != NULL)
1302 error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
1303 if (! ISDIGIT (opt->name[5]))
1304 params[num] = create_pointer (CONST_CAST2(type_p, const char *, opt->info));
1306 params[num] = CONST_CAST2 (type_p, const char *, opt->info);
1308 else if (strcmp (opt->name, "special") == 0)
1310 const char *special_name = opt->info;
1311 if (strcmp (special_name, "tree_exp") == 0)
1312 t = adjust_field_tree_exp (t, opt);
1313 else if (strcmp (special_name, "rtx_def") == 0)
1314 t = adjust_field_rtx_def (t, opt);
1316 error_at_line (&lexer_line, "unknown special `%s'", special_name);
1325 realt = find_param_structure (t, params);
1326 t = pointer_p ? create_pointer (realt) : realt;
1331 && t->u.p->kind == TYPE_SCALAR
1332 && t->u.p->u.scalar_is_char)
1333 return &string_type;
1334 if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
1335 && t->u.a.p->u.p->kind == TYPE_SCALAR
1336 && t->u.a.p->u.p->u.scalar_is_char)
1337 return create_array (&string_type, t->u.a.len);
1343 static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
1344 static void set_gc_used (pair_p);
1346 /* Handle OPT for set_gc_used_type. */
1349 process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
1350 int *pass_param, int *length, int *skip, type_p *nested_ptr)
1353 for (o = opt; o; o = o->next)
1354 if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO)
1355 set_gc_used_type (CONST_CAST2 (type_p, const char *, o->info),
1356 GC_POINTED_TO, NULL);
1357 else if (strcmp (o->name, "maybe_undef") == 0)
1359 else if (strcmp (o->name, "use_params") == 0)
1361 else if (strcmp (o->name, "length") == 0)
1363 else if (strcmp (o->name, "skip") == 0)
1365 else if (strcmp (o->name, "nested_ptr") == 0)
1366 *nested_ptr = ((const struct nested_ptr_data *) o->info)->type;
1369 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
1372 set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
1374 if (t->gc_used >= level)
1388 process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy,
1391 for (f = t->u.s.fields; f; f = f->next)
1393 int maybe_undef = 0;
1397 type_p nested_ptr = NULL;
1398 process_gc_options (f->opt, level, &maybe_undef, &pass_param,
1399 &length, &skip, &nested_ptr);
1401 if (nested_ptr && f->type->kind == TYPE_POINTER)
1402 set_gc_used_type (nested_ptr, GC_POINTED_TO,
1403 pass_param ? param : NULL);
1404 else if (length && f->type->kind == TYPE_POINTER)
1405 set_gc_used_type (f->type->u.p, GC_USED, NULL);
1406 else if (maybe_undef && f->type->kind == TYPE_POINTER)
1407 set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
1408 else if (pass_param && f->type->kind == TYPE_POINTER && param)
1409 set_gc_used_type (find_param_structure (f->type->u.p, param),
1410 GC_POINTED_TO, NULL);
1412 ; /* target type is not used through this field */
1414 set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
1420 set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
1424 set_gc_used_type (t->u.a.p, GC_USED, param);
1427 case TYPE_LANG_STRUCT:
1428 for (t = t->u.s.lang_struct; t; t = t->next)
1429 set_gc_used_type (t, level, param);
1432 case TYPE_PARAM_STRUCT:
1435 for (i = 0; i < NUM_PARAM; i++)
1436 if (t->u.param_struct.param[i] != 0)
1437 set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
1439 if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
1440 level = GC_POINTED_TO;
1443 t->u.param_struct.stru->gc_used = GC_UNUSED;
1444 set_gc_used_type (t->u.param_struct.stru, level,
1445 t->u.param_struct.param);
1453 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1456 set_gc_used (pair_p variables)
1459 for (p = variables; p; p = p->next)
1460 set_gc_used_type (p->type, GC_USED, NULL);
1463 /* File mapping routines. For each input file, there is one output .c file
1464 (but some output files have many input files), and there is one .h file
1465 for the whole build. */
1467 /* Output file handling. */
1469 /* Create and return an outf_p for a new file for NAME, to be called
1473 create_file (const char *name, const char *oname)
1475 static const char *const hdr[] = {
1476 " Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.\n",
1478 "This file is part of GCC.\n",
1480 "GCC is free software; you can redistribute it and/or modify it under\n",
1481 "the terms of the GNU General Public License as published by the Free\n",
1482 "Software Foundation; either version 3, or (at your option) any later\n",
1485 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1486 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1487 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1488 "for more details.\n",
1490 "You should have received a copy of the GNU General Public License\n",
1491 "along with GCC; see the file COPYING3. If not see\n",
1492 "<http://www.gnu.org/licenses/>. */\n",
1494 "/* This file is machine generated. Do not edit. */\n"
1499 gcc_assert (name != NULL);
1500 gcc_assert (oname != NULL);
1501 f = XCNEW (struct outf);
1502 f->next = output_files;
1506 oprintf (f, "/* Type information for %s.\n", name);
1507 for (i = 0; i < ARRAY_SIZE (hdr); i++)
1508 oprintf (f, "%s", hdr[i]);
1512 /* Print, like fprintf, to O.
1513 N.B. You might think this could be implemented more efficiently
1514 with vsnprintf(). Unfortunately, there are C libraries that
1515 provide that function but without the C99 semantics for its return
1516 value, making it impossible to know how much space is required. */
1518 oprintf (outf_p o, const char *format, ...)
1524 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1529 va_start (ap, format);
1530 slength = vasprintf (&s, format, ap);
1531 if (s == NULL || (int)slength < 0)
1532 fatal ("out of memory");
1535 if (o->bufused + slength > o->buflength)
1537 size_t new_len = o->buflength;
1542 } while (o->bufused + slength >= new_len);
1543 o->buf = XRESIZEVEC (char, o->buf, new_len);
1544 o->buflength = new_len;
1546 memcpy (o->buf + o->bufused, s, slength);
1547 o->bufused += slength;
1551 /* Open the global header file and the language-specific header files. */
1554 open_base_files (void)
1558 if (nb_plugin_files > 0 && plugin_files)
1561 header_file = create_file ("GCC", "gtype-desc.h");
1563 base_files = XNEWVEC (outf_p, num_lang_dirs);
1565 for (i = 0; i < num_lang_dirs; i++)
1566 base_files[i] = create_file (lang_dir_names[i],
1567 xasprintf ("gtype-%s.h", lang_dir_names[i]));
1569 /* gtype-desc.c is a little special, so we create it here. */
1571 /* The order of files here matters very much. */
1572 static const char *const ifiles [] = {
1573 "config.h", "system.h", "coretypes.h", "tm.h",
1574 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1575 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1576 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1577 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1578 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1579 "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
1580 "target.h", "ipa-prop.h", "lto-streamer.h", NULL
1582 const char *const *ifp;
1583 outf_p gtype_desc_c;
1585 gtype_desc_c = create_file ("GCC", "gtype-desc.c");
1586 for (ifp = ifiles; *ifp; ifp++)
1587 oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
1589 /* Make sure we handle "cfun" specially. */
1590 oprintf (gtype_desc_c, "\n/* See definition in function.h. */\n");
1591 oprintf (gtype_desc_c, "#undef cfun\n");
1595 /* For F a filename, return the real basename of F, with all the directory
1596 components skipped. */
1599 get_file_realbasename (const char *f)
1601 const char * lastslash = strrchr (f, '/');
1603 return (lastslash != NULL) ? lastslash + 1 : f;
1606 /* For F a filename, return the relative path to F from $(srcdir) if the
1607 latter is a prefix in F, NULL otherwise. */
1610 get_file_srcdir_relative_path (const char *f)
1612 if (strlen (f) > srcdir_len
1613 && IS_DIR_SEPARATOR (f[srcdir_len])
1614 && memcmp (f, srcdir, srcdir_len) == 0)
1615 return f + srcdir_len + 1;
1620 /* For F a filename, return the relative path to F from $(srcdir) if the
1621 latter is a prefix in F, or the real basename of F otherwise. */
1624 get_file_basename (const char *f)
1626 const char * srcdir_path = get_file_srcdir_relative_path (f);
1628 return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (f);
1631 /* For F a filename, return the lang_dir_names relative index of the language
1632 directory that is a prefix in F, if any, -1 otherwise. */
1635 get_prefix_langdir_index (const char *f)
1637 size_t f_len = strlen (f);
1640 for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
1642 const char * langdir = lang_dir_names [lang_index];
1643 size_t langdir_len = strlen (langdir);
1645 if (f_len > langdir_len
1646 && IS_DIR_SEPARATOR (f[langdir_len])
1647 && memcmp (f, langdir, langdir_len) == 0)
1654 /* For F a filename, return the name of language directory where F is located,
1655 if any, NULL otherwise. */
1658 get_file_langdir (const char *f)
1660 /* Get the relative path to F from $(srcdir) and find the language by
1661 comparing the prefix with language directory names. If F is not even
1662 srcdir relative, no point in looking further. */
1665 const char * srcdir_relative_path = get_file_srcdir_relative_path (f);
1667 if (!srcdir_relative_path)
1670 lang_index = get_prefix_langdir_index (srcdir_relative_path);
1672 return (lang_index >= 0) ? lang_dir_names [lang_index] : NULL;
1675 /* The gt- output file name for F. */
1678 get_file_gtfilename (const char *f)
1680 /* Cook up an initial version of the gt- file name from the file real
1681 basename and the language name, if any. */
1683 const char *basename = get_file_realbasename (f);
1684 const char *langdir = get_file_langdir (f);
1687 (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
1688 : xasprintf ("gt-%s", basename));
1690 /* Then replace all non alphanumerics characters by '-' and change the
1691 extension to ".h". We expect the input filename extension was at least
1692 one character long. */
1696 for (; *s != '.'; s++)
1697 if (! ISALNUM (*s) && *s != '-')
1700 memcpy (s, ".h", sizeof (".h"));
1705 /* An output file, suitable for definitions, that can see declarations
1706 made in INPUT_FILE and is linked into every language that uses
1710 get_output_file_with_visibility (const char *input_file)
1714 const char *basename;
1715 const char *for_name;
1716 const char *output_name;
1718 /* This can happen when we need a file with visibility on a
1719 structure that we've never seen. We have to just hope that it's
1720 globally visible. */
1721 if (input_file == NULL)
1722 input_file = "system.h";
1724 /* In plugin mode, return NULL unless the input_file is one of the
1729 for (i = 0; i < nb_plugin_files; i++)
1730 if (strcmp (input_file, plugin_files[i]) == 0)
1731 return plugin_output;
1736 /* Determine the output file name. */
1737 basename = get_file_basename (input_file);
1739 len = strlen (basename);
1740 if ((len > 2 && memcmp (basename+len-2, ".c", 2) == 0)
1741 || (len > 2 && memcmp (basename+len-2, ".y", 2) == 0)
1742 || (len > 3 && memcmp (basename+len-3, ".in", 3) == 0))
1744 output_name = get_file_gtfilename (input_file);
1745 for_name = basename;
1747 /* Some headers get used by more than one front-end; hence, it
1748 would be inappropriate to spew them out to a single gtype-<lang>.h
1749 (and gengtype doesn't know how to direct spewage into multiple
1750 gtype-<lang>.h headers at this time). Instead, we pair up these
1751 headers with source files (and their special purpose gt-*.h headers). */
1752 else if (strcmp (basename, "c-common.h") == 0)
1753 output_name = "gt-c-common.h", for_name = "c-common.c";
1754 else if (strcmp (basename, "c-lang.h") == 0)
1755 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1756 else if (strcmp (basename, "c-tree.h") == 0)
1757 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1758 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1759 && strcmp (basename + 3, "cp-tree.h") == 0)
1760 output_name = "gt-cp-tree.h", for_name = "cp/tree.c";
1761 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1762 && strcmp (basename + 3, "decl.h") == 0)
1763 output_name = "gt-cp-decl.h", for_name = "cp/decl.c";
1764 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1765 && strcmp (basename + 3, "name-lookup.h") == 0)
1766 output_name = "gt-cp-name-lookup.h", for_name = "cp/name-lookup.c";
1767 else if (strncmp (basename, "objc", 4) == 0 && IS_DIR_SEPARATOR (basename[4])
1768 && strcmp (basename + 5, "objc-act.h") == 0)
1769 output_name = "gt-objc-objc-act.h", for_name = "objc/objc-act.c";
1772 int lang_index = get_prefix_langdir_index (basename);
1774 if (lang_index >= 0)
1775 return base_files[lang_index];
1777 output_name = "gtype-desc.c";
1781 /* Look through to see if we've ever seen this output filename before. */
1782 for (r = output_files; r; r = r->next)
1783 if (strcmp (r->name, output_name) == 0)
1786 /* If not, create it. */
1787 r = create_file (for_name, output_name);
1789 gcc_assert (r && r->name);
1793 /* The name of an output file, suitable for definitions, that can see
1794 declarations made in INPUT_FILE and is linked into every language
1795 that uses INPUT_FILE. */
1798 get_output_file_name (const char *input_file)
1800 outf_p o = get_output_file_with_visibility (input_file);
1806 /* Check if existing file is equal to the in memory buffer. */
1809 is_file_equal (outf_p of)
1811 FILE *newfile = fopen (of->name, "r");
1814 if (newfile == NULL)
1818 for (i = 0; i < of->bufused; i++)
1821 ch = fgetc (newfile);
1822 if (ch == EOF || ch != (unsigned char) of->buf[i])
1832 /* Copy the output to its final destination,
1833 but don't unnecessarily change modification times. */
1836 close_output_files (void)
1840 for (of = output_files; of; of = of->next)
1843 if (!is_file_equal(of))
1845 FILE *newfile = fopen (of->name, "w");
1846 if (newfile == NULL)
1847 fatal ("opening output file %s: %s", of->name, strerror (errno));
1848 if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
1849 fatal ("writing output file %s: %s", of->name, strerror (errno));
1850 if (fclose (newfile) != 0)
1851 fatal ("closing output file %s: %s", of->name, strerror (errno));
1855 of->bufused = of->buflength = 0;
1866 struct walk_type_data;
1868 /* For scalars and strings, given the item in 'val'.
1869 For structures, given a pointer to the item in 'val'.
1870 For misc. pointers, given the item in 'val'.
1872 typedef void (*process_field_fn)
1873 (type_p f, const struct walk_type_data *p);
1874 typedef void (*func_name_fn)
1875 (type_p s, const struct walk_type_data *p);
1877 /* Parameters for write_types. */
1879 struct write_types_data
1882 const char *param_prefix;
1883 const char *subfield_marker_routine;
1884 const char *marker_routine;
1885 const char *reorder_note_routine;
1886 const char *comment;
1887 int skip_hooks; /* skip hook generation if non zero */
1890 static void output_escaped_param (struct walk_type_data *d,
1891 const char *, const char *);
1892 static void output_mangled_typename (outf_p, const_type_p);
1893 static void walk_type (type_p t, struct walk_type_data *d);
1894 static void write_func_for_structure
1895 (type_p orig_s, type_p s, type_p * param,
1896 const struct write_types_data *wtd);
1897 static void write_types_process_field
1898 (type_p f, const struct walk_type_data *d);
1899 static void write_types (outf_p output_header,
1901 type_p param_structs,
1902 const struct write_types_data *wtd);
1903 static void write_types_local_process_field
1904 (type_p f, const struct walk_type_data *d);
1905 static void write_local_func_for_structure
1906 (const_type_p orig_s, type_p s, type_p * param);
1907 static void write_local (outf_p output_header,
1909 type_p param_structs);
1910 static void write_enum_defn (type_p structures, type_p param_structs);
1911 static int contains_scalar_p (type_p t);
1912 static void put_mangled_filename (outf_p , const char *);
1913 static void finish_root_table (struct flist *flp, const char *pfx,
1914 const char *tname, const char *lastname,
1916 static void write_root (outf_p , pair_p, type_p, const char *, int,
1917 struct fileloc *, const char *, bool);
1918 static void write_array (outf_p f, pair_p v,
1919 const struct write_types_data *wtd);
1920 static void write_roots (pair_p, bool);
1922 /* Parameters for walk_type. */
1924 struct walk_type_data
1926 process_field_fn process_field;
1931 const char *prev_val[4];
1934 const struct fileloc *line;
1939 const char *reorder_fn;
1941 bool fn_wants_lvalue;
1944 /* Print a mangled name representing T to OF. */
1947 output_mangled_typename (outf_p of, const_type_p t)
1951 else switch (t->kind)
1955 output_mangled_typename (of, t->u.p);
1965 case TYPE_LANG_STRUCT:
1966 oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag), t->u.s.tag);
1968 case TYPE_PARAM_STRUCT:
1971 for (i = 0; i < NUM_PARAM; i++)
1972 if (t->u.param_struct.param[i] != NULL)
1973 output_mangled_typename (of, t->u.param_struct.param[i]);
1974 output_mangled_typename (of, t->u.param_struct.stru);
1982 /* Print PARAM to D->OF processing escapes. D->VAL references the
1983 current object, D->PREV_VAL the object containing the current
1984 object, ONAME is the name of the option and D->LINE is used to
1985 print error messages. */
1988 output_escaped_param (struct walk_type_data *d, const char *param,
1993 for (p = param; *p; p++)
1995 oprintf (d->of, "%c", *p);
1999 oprintf (d->of, "(%s)", d->prev_val[2]);
2002 oprintf (d->of, "(%s)", d->prev_val[0]);
2005 oprintf (d->of, "(%s)", d->prev_val[1]);
2009 const char *pp = d->val + strlen (d->val);
2010 while (pp[-1] == ']')
2013 oprintf (d->of, "%s", pp);
2017 error_at_line (d->line, "`%s' option contains bad escape %c%c",
2022 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2023 which is of type T. Write code to D->OF to constrain execution (at
2024 the point that D->PROCESS_FIELD is called) to the appropriate
2025 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2026 pointers to those objects. D->PREV_VAL lists the objects
2027 containing the current object, D->OPT is a list of options to
2028 apply, D->INDENT is the current indentation level, D->LINE is used
2029 to print error messages, D->BITMAP indicates which languages to
2030 print the structure for, and D->PARAM is the current parameter
2031 (from an enclosing param_is option). */
2034 walk_type (type_p t, struct walk_type_data *d)
2036 const char *length = NULL;
2037 const char *desc = NULL;
2038 int maybe_undef_p = 0;
2039 int use_param_num = -1;
2040 int use_params_p = 0;
2042 const struct nested_ptr_data *nested_ptr_d = NULL;
2044 d->needs_cast_p = false;
2045 for (oo = d->opt; oo; oo = oo->next)
2046 if (strcmp (oo->name, "length") == 0)
2048 else if (strcmp (oo->name, "maybe_undef") == 0)
2050 else if (strncmp (oo->name, "use_param", 9) == 0
2051 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2052 use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
2053 else if (strcmp (oo->name, "use_params") == 0)
2055 else if (strcmp (oo->name, "desc") == 0)
2057 else if (strcmp (oo->name, "mark_hook") == 0)
2059 else if (strcmp (oo->name, "nested_ptr") == 0)
2060 nested_ptr_d = (const struct nested_ptr_data *) oo->info;
2061 else if (strcmp (oo->name, "dot") == 0)
2063 else if (strcmp (oo->name, "tag") == 0)
2065 else if (strcmp (oo->name, "special") == 0)
2067 else if (strcmp (oo->name, "skip") == 0)
2069 else if (strcmp (oo->name, "default") == 0)
2071 else if (strcmp (oo->name, "descbits") == 0)
2073 else if (strcmp (oo->name, "param_is") == 0)
2075 else if (strncmp (oo->name, "param", 5) == 0
2076 && ISDIGIT (oo->name[5])
2077 && strcmp (oo->name + 6, "_is") == 0)
2079 else if (strcmp (oo->name, "chain_next") == 0)
2081 else if (strcmp (oo->name, "chain_prev") == 0)
2083 else if (strcmp (oo->name, "chain_circular") == 0)
2085 else if (strcmp (oo->name, "reorder") == 0)
2088 error_at_line (d->line, "unknown option `%s'\n", oo->name);
2095 int pointer_p = t->kind == TYPE_POINTER;
2099 if (! UNION_OR_STRUCT_P (t))
2100 error_at_line (d->line, "`use_params' option on unimplemented type");
2102 t = find_param_structure (t, d->param);
2104 t = create_pointer (t);
2107 if (use_param_num != -1)
2109 if (d->param != NULL && d->param[use_param_num] != NULL)
2111 type_p nt = d->param[use_param_num];
2113 if (t->kind == TYPE_ARRAY)
2114 nt = create_array (nt, t->u.a.len);
2115 else if (length != NULL && t->kind == TYPE_POINTER)
2116 nt = create_pointer (nt);
2117 d->needs_cast_p = (t->kind != TYPE_POINTER
2118 && (nt->kind == TYPE_POINTER
2119 || nt->kind == TYPE_STRING));
2123 error_at_line (d->line, "no parameter defined for `%s'",
2128 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
2130 error_at_line (d->line,
2131 "field `%s' has invalid option `maybe_undef_p'\n",
2140 d->process_field (t, d);
2146 && t->u.p->u.s.line.file == NULL)
2148 oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
2154 if (! UNION_OR_STRUCT_P (t->u.p)
2155 && t->u.p->kind != TYPE_PARAM_STRUCT)
2157 error_at_line (d->line,
2158 "field `%s' is pointer to unimplemented type",
2165 const char *oldprevval2 = d->prev_val[2];
2167 if (! UNION_OR_STRUCT_P (nested_ptr_d->type))
2169 error_at_line (d->line,
2170 "field `%s' has invalid "
2171 "option `nested_ptr'\n",
2176 d->prev_val[2] = d->val;
2177 oprintf (d->of, "%*s{\n", d->indent, "");
2179 d->val = xasprintf ("x%d", d->counter++);
2180 oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "",
2181 (nested_ptr_d->type->kind == TYPE_UNION
2182 ? "union" : "struct"),
2183 nested_ptr_d->type->u.s.tag,
2184 d->fn_wants_lvalue ? "" : "const ",
2186 oprintf (d->of, "%*s", d->indent + 2, "");
2187 output_escaped_param (d, nested_ptr_d->convert_from,
2189 oprintf (d->of, ";\n");
2191 d->process_field (nested_ptr_d->type, d);
2193 if (d->fn_wants_lvalue)
2195 oprintf (d->of, "%*s%s = ", d->indent, "",
2197 d->prev_val[2] = d->val;
2198 output_escaped_param (d, nested_ptr_d->convert_to,
2200 oprintf (d->of, ";\n");
2204 oprintf (d->of, "%*s}\n", d->indent, "");
2205 d->val = d->prev_val[2];
2206 d->prev_val[2] = oldprevval2;
2209 d->process_field (t->u.p, d);
2213 int loopcounter = d->counter++;
2214 const char *oldval = d->val;
2215 const char *oldprevval3 = d->prev_val[3];
2218 oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2220 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2221 oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent, "",
2222 loopcounter, loopcounter);
2223 output_escaped_param (d, length, "length");
2224 oprintf (d->of, "); i%d++) {\n", loopcounter);
2226 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2228 d->prev_val[3] = oldval;
2229 walk_type (t->u.p, d);
2232 d->prev_val[3] = oldprevval3;
2235 oprintf (d->of, "%*s}\n", d->indent, "");
2236 d->process_field(t, d);
2238 oprintf (d->of, "%*s}\n", d->indent, "");
2245 int loopcounter = d->counter++;
2246 const char *oldval = d->val;
2249 /* If it's an array of scalars, we optimize by not generating
2251 if (t->u.a.p->kind == TYPE_SCALAR)
2254 /* When walking an array, compute the length and store it in a
2255 local variable before walking the array elements, instead of
2256 recomputing the length expression each time through the loop.
2257 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2258 where the length is stored in the first array element,
2259 because otherwise that operand can get overwritten on the
2261 oprintf (d->of, "%*s{\n", d->indent, "");
2263 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2264 oprintf (d->of, "%*ssize_t l%d = (size_t)(",
2265 d->indent, "", loopcounter);
2267 output_escaped_param (d, length, "length");
2269 oprintf (d->of, "%s", t->u.a.len);
2270 oprintf (d->of, ");\n");
2272 oprintf (d->of, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2274 loopcounter, loopcounter, loopcounter, loopcounter);
2276 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2278 walk_type (t->u.a.p, d);
2283 oprintf (d->of, "%*s}\n", d->indent, "");
2285 oprintf (d->of, "%*s}\n", d->indent, "");
2293 const char *oldval = d->val;
2294 const char *oldprevval1 = d->prev_val[1];
2295 const char *oldprevval2 = d->prev_val[2];
2296 const int union_p = t->kind == TYPE_UNION;
2297 int seen_default_p = 0;
2300 if (! t->u.s.line.file)
2301 error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
2303 if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
2305 error_at_line (d->line,
2306 "structure `%s' defined for mismatching languages",
2308 error_at_line (&t->u.s.line, "one structure defined here");
2311 /* Some things may also be defined in the structure's options. */
2312 for (o = t->u.s.opt; o; o = o->next)
2313 if (! desc && strcmp (o->name, "desc") == 0)
2316 d->prev_val[2] = oldval;
2317 d->prev_val[1] = oldprevval2;
2322 error_at_line (d->line, "missing `desc' option for union `%s'",
2326 oprintf (d->of, "%*sswitch (", d->indent, "");
2327 output_escaped_param (d, desc, "desc");
2328 oprintf (d->of, ")\n");
2330 oprintf (d->of, "%*s{\n", d->indent, "");
2332 for (f = t->u.s.fields; f; f = f->next)
2335 const char *dot = ".";
2336 const char *tagid = NULL;
2339 int use_param_p = 0;
2342 d->reorder_fn = NULL;
2343 for (oo = f->opt; oo; oo = oo->next)
2344 if (strcmp (oo->name, "dot") == 0)
2346 else if (strcmp (oo->name, "tag") == 0)
2348 else if (strcmp (oo->name, "skip") == 0)
2350 else if (strcmp (oo->name, "default") == 0)
2352 else if (strcmp (oo->name, "reorder") == 0)
2353 d->reorder_fn = oo->info;
2354 else if (strncmp (oo->name, "use_param", 9) == 0
2355 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2361 if (union_p && tagid)
2363 oprintf (d->of, "%*scase %s:\n", d->indent, "", tagid);
2366 else if (union_p && default_p)
2368 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2372 else if (! union_p && (default_p || tagid))
2373 error_at_line (d->line,
2374 "can't use `%s' outside a union on field `%s'",
2375 default_p ? "default" : "tag", f->name);
2376 else if (union_p && ! (default_p || tagid)
2377 && f->type->kind == TYPE_SCALAR)
2380 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2381 d->line->file, d->line->line, f->name);
2384 else if (union_p && ! (default_p || tagid))
2385 error_at_line (d->line,
2386 "field `%s' is missing `tag' or `default' option",
2390 d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name);
2392 d->used_length = false;
2394 if (union_p && use_param_p && d->param == NULL)
2395 oprintf (d->of, "%*sgcc_unreachable ();\n", d->indent, "");
2397 walk_type (f->type, d);
2403 oprintf (d->of, "%*sbreak;\n", d->indent, "");
2407 d->reorder_fn = NULL;
2410 d->prev_val[1] = oldprevval1;
2411 d->prev_val[2] = oldprevval2;
2413 if (union_p && ! seen_default_p)
2415 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2416 oprintf (d->of, "%*s break;\n", d->indent, "");
2420 oprintf (d->of, "%*s}\n", d->indent, "");
2426 case TYPE_LANG_STRUCT:
2429 for (nt = t->u.s.lang_struct; nt; nt = nt->next)
2430 if ((d->bitmap & nt->u.s.bitmap) == d->bitmap)
2433 error_at_line (d->line, "structure `%s' differs between languages",
2440 case TYPE_PARAM_STRUCT:
2442 type_p *oldparam = d->param;
2444 d->param = t->u.param_struct.param;
2445 walk_type (t->u.param_struct.stru, d);
2446 d->param = oldparam;
2455 /* process_field routine for marking routines. */
2458 write_types_process_field (type_p f, const struct walk_type_data *d)
2460 const struct write_types_data *wtd;
2461 const char *cast = d->needs_cast_p ? "(void *)" : "";
2462 wtd = (const struct write_types_data *) d->cookie;
2467 oprintf (d->of, "%*s%s (%s%s", d->indent, "",
2468 wtd->subfield_marker_routine, cast, d->val);
2469 if (wtd->param_prefix)
2471 oprintf (d->of, ", %s", d->prev_val[3]);
2474 oprintf (d->of, ", gt_%s_", wtd->param_prefix);
2475 output_mangled_typename (d->of, d->orig_s);
2478 oprintf (d->of, ", gt_%sa_%s", wtd->param_prefix, d->prev_val[0]);
2480 if (f->u.p->kind == TYPE_PARAM_STRUCT
2481 && f->u.p->u.s.line.file != NULL)
2483 oprintf (d->of, ", gt_e_");
2484 output_mangled_typename (d->of, f);
2486 else if (UNION_OR_STRUCT_P (f)
2487 && f->u.p->u.s.line.file != NULL)
2489 oprintf (d->of, ", gt_ggc_e_");
2490 output_mangled_typename (d->of, f);
2493 oprintf (d->of, ", gt_types_enum_last");
2495 oprintf (d->of, ");\n");
2496 if (d->reorder_fn && wtd->reorder_note_routine)
2497 oprintf (d->of, "%*s%s (%s%s, %s, %s);\n", d->indent, "",
2498 wtd->reorder_note_routine, cast, d->val,
2499 d->prev_val[3], d->reorder_fn);
2505 case TYPE_LANG_STRUCT:
2506 case TYPE_PARAM_STRUCT:
2507 oprintf (d->of, "%*sgt_%s_", d->indent, "", wtd->prefix);
2508 output_mangled_typename (d->of, f);
2509 oprintf (d->of, " (%s%s);\n", cast, d->val);
2510 if (d->reorder_fn && wtd->reorder_note_routine)
2511 oprintf (d->of, "%*s%s (%s%s, %s%s, %s);\n", d->indent, "",
2512 wtd->reorder_note_routine, cast, d->val, cast, d->val,
2524 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
2527 output_type_enum (outf_p of, type_p s)
2529 if (s->kind == TYPE_PARAM_STRUCT && s->u.s.line.file != NULL)
2531 oprintf (of, ", gt_e_");
2532 output_mangled_typename (of, s);
2534 else if (UNION_OR_STRUCT_P (s) && s->u.s.line.file != NULL)
2536 oprintf (of, ", gt_ggc_e_");
2537 output_mangled_typename (of, s);
2540 oprintf (of, ", gt_types_enum_last");
2543 /* Return an output file that is suitable for definitions which can
2544 reference struct S */
2547 get_output_file_for_structure (const_type_p s, type_p *param)
2549 const char * fn = s->u.s.line.file;
2552 /* This is a hack, and not the good kind either. */
2553 for (i = NUM_PARAM - 1; i >= 0; i--)
2554 if (param && param[i] && param[i]->kind == TYPE_POINTER
2555 && UNION_OR_STRUCT_P (param[i]->u.p))
2556 fn = param[i]->u.p->u.s.line.file;
2558 return get_output_file_with_visibility (fn);
2561 /* For S, a structure that's part of ORIG_S, and using parameters
2562 PARAM, write out a routine that:
2563 - Takes a parameter, a void * but actually of type *S
2564 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2565 field of S or its substructures and (in some cases) things
2566 that are pointed to by S.
2570 write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2571 const struct write_types_data *wtd)
2573 const char *chain_next = NULL;
2574 const char *chain_prev = NULL;
2575 const char *chain_circular = NULL;
2576 const char *mark_hook_name = NULL;
2578 struct walk_type_data d;
2580 memset (&d, 0, sizeof (d));
2581 d.of = get_output_file_for_structure (s, param);
2583 for (opt = s->u.s.opt; opt; opt = opt->next)
2584 if (strcmp (opt->name, "chain_next") == 0)
2585 chain_next = opt->info;
2586 else if (strcmp (opt->name, "chain_prev") == 0)
2587 chain_prev = opt->info;
2588 else if (strcmp (opt->name, "chain_circular") == 0)
2589 chain_circular = opt->info;
2590 else if (strcmp (opt->name, "mark_hook") == 0)
2591 mark_hook_name = opt->info;
2593 if (chain_prev != NULL && chain_next == NULL)
2594 error_at_line (&s->u.s.line, "chain_prev without chain_next");
2595 if (chain_circular != NULL && chain_next != NULL)
2596 error_at_line (&s->u.s.line, "chain_circular with chain_next");
2597 if (chain_circular != NULL)
2598 chain_next = chain_circular;
2600 d.process_field = write_types_process_field;
2604 d.line = &s->u.s.line;
2605 d.bitmap = s->u.s.bitmap;
2607 d.prev_val[0] = "*x";
2608 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2609 d.prev_val[3] = "x";
2612 oprintf (d.of, "\n");
2613 oprintf (d.of, "void\n");
2615 oprintf (d.of, "gt_%sx_%s", wtd->prefix, orig_s->u.s.tag);
2618 oprintf (d.of, "gt_%s_", wtd->prefix);
2619 output_mangled_typename (d.of, orig_s);
2621 oprintf (d.of, " (void *x_p)\n");
2622 oprintf (d.of, "{\n");
2623 oprintf (d.of, " %s %s * %sx = (%s %s *)x_p;\n",
2624 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2625 chain_next == NULL ? "const " : "",
2626 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2627 if (chain_next != NULL)
2628 oprintf (d.of, " %s %s * xlimit = x;\n",
2629 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2630 if (chain_next == NULL)
2632 oprintf (d.of, " if (%s (x", wtd->marker_routine);
2633 if (wtd->param_prefix)
2635 oprintf (d.of, ", x, gt_%s_", wtd->param_prefix);
2636 output_mangled_typename (d.of, orig_s);
2637 output_type_enum (d.of, orig_s);
2639 oprintf (d.of, "))\n");
2643 if (chain_circular != NULL)
2644 oprintf (d.of, " if (!%s (xlimit", wtd->marker_routine);
2646 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2647 if (wtd->param_prefix)
2649 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2650 output_mangled_typename (d.of, orig_s);
2651 output_type_enum (d.of, orig_s);
2653 oprintf (d.of, "))\n");
2654 if (chain_circular != NULL)
2655 oprintf (d.of, " return;\n do\n");
2656 if (mark_hook_name && !wtd->skip_hooks)
2658 oprintf (d.of, " {\n");
2659 oprintf (d.of, " %s (xlimit);\n ", mark_hook_name);
2661 oprintf (d.of, " xlimit = (");
2662 d.prev_val[2] = "*xlimit";
2663 output_escaped_param (&d, chain_next, "chain_next");
2664 oprintf (d.of, ");\n");
2665 if (mark_hook_name && !wtd->skip_hooks)
2666 oprintf (d.of, " }\n");
2667 if (chain_prev != NULL)
2669 oprintf (d.of, " if (x != xlimit)\n");
2670 oprintf (d.of, " for (;;)\n");
2671 oprintf (d.of, " {\n");
2672 oprintf (d.of, " %s %s * const xprev = (",
2673 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2675 d.prev_val[2] = "*x";
2676 output_escaped_param (&d, chain_prev, "chain_prev");
2677 oprintf (d.of, ");\n");
2678 oprintf (d.of, " if (xprev == NULL) break;\n");
2679 oprintf (d.of, " x = xprev;\n");
2680 oprintf (d.of, " (void) %s (xprev",
2681 wtd->marker_routine);
2682 if (wtd->param_prefix)
2684 oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
2685 output_mangled_typename (d.of, orig_s);
2686 output_type_enum (d.of, orig_s);
2688 oprintf (d.of, ");\n");
2689 oprintf (d.of, " }\n");
2691 if (chain_circular != NULL)
2693 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2694 if (wtd->param_prefix)
2696 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2697 output_mangled_typename (d.of, orig_s);
2698 output_type_enum (d.of, orig_s);
2700 oprintf (d.of, "));\n");
2701 if (mark_hook_name && !wtd->skip_hooks)
2702 oprintf (d.of, " %s (xlimit);\n", mark_hook_name);
2703 oprintf (d.of, " do\n");
2706 oprintf (d.of, " while (x != xlimit)\n");
2708 oprintf (d.of, " {\n");
2709 if (mark_hook_name && chain_next == NULL && !wtd->skip_hooks)
2711 oprintf (d.of, " %s (x);\n", mark_hook_name);
2713 d.prev_val[2] = "*x";
2717 if (chain_next != NULL)
2719 oprintf (d.of, " x = (");
2720 output_escaped_param (&d, chain_next, "chain_next");
2721 oprintf (d.of, ");\n");
2724 oprintf (d.of, " }\n");
2725 if (chain_circular != NULL)
2726 oprintf (d.of, " while (x != xlimit);\n");
2727 oprintf (d.of, "}\n");
2730 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
2733 write_types (outf_p output_header, type_p structures, type_p param_structs,
2734 const struct write_types_data *wtd)
2738 oprintf (output_header, "\n/* %s*/\n", wtd->comment);
2739 /* We first emit the macros and the declarations. Functions' code is
2740 emitted afterwards. This is needed in plugin mode. */
2741 oprintf (output_header, "/* macros and declarations */\n");
2742 for (s = structures; s; s = s->next)
2743 if (s->gc_used == GC_POINTED_TO
2744 || s->gc_used == GC_MAYBE_POINTED_TO)
2748 if (s->gc_used == GC_MAYBE_POINTED_TO
2749 && s->u.s.line.file == NULL)
2752 oprintf (output_header, "#define gt_%s_", wtd->prefix);
2753 output_mangled_typename (output_header, s);
2754 oprintf (output_header, "(X) do { \\\n");
2755 oprintf (output_header,
2756 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
2758 oprintf (output_header,
2761 for (opt = s->u.s.opt; opt; opt = opt->next)
2762 if (strcmp (opt->name, "ptr_alias") == 0)
2764 const_type_p const t = (const_type_p) opt->info;
2765 if (t->kind == TYPE_STRUCT
2766 || t->kind == TYPE_UNION
2767 || t->kind == TYPE_LANG_STRUCT)
2768 oprintf (output_header,
2769 "#define gt_%sx_%s gt_%sx_%s\n",
2770 wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
2772 error_at_line (&s->u.s.line,
2773 "structure alias is not a structure");
2779 /* Declare the marker procedure only once. */
2780 oprintf (output_header,
2781 "extern void gt_%sx_%s (void *);\n",
2782 wtd->prefix, s->u.s.tag);
2784 if (s->u.s.line.file == NULL)
2786 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2792 for (s = param_structs; s; s = s->next)
2793 if (s->gc_used == GC_POINTED_TO)
2795 type_p stru = s->u.param_struct.stru;
2797 /* Declare the marker procedure. */
2798 oprintf (output_header, "extern void gt_%s_", wtd->prefix);
2799 output_mangled_typename (output_header, s);
2800 oprintf (output_header, " (void *);\n");
2802 if (stru->u.s.line.file == NULL)
2804 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2810 /* At last we emit the functions code. */
2811 oprintf (output_header, "\n/* functions code */\n");
2812 for (s = structures; s; s = s->next)
2813 if (s->gc_used == GC_POINTED_TO
2814 || s->gc_used == GC_MAYBE_POINTED_TO)
2818 if (s->gc_used == GC_MAYBE_POINTED_TO
2819 && s->u.s.line.file == NULL)
2821 for (opt = s->u.s.opt; opt; opt = opt->next)
2822 if (strcmp (opt->name, "ptr_alias") == 0)
2827 if (s->kind == TYPE_LANG_STRUCT)
2830 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2831 write_func_for_structure (s, ss, NULL, wtd);
2834 write_func_for_structure (s, s, NULL, wtd);
2836 for (s = param_structs; s; s = s->next)
2837 if (s->gc_used == GC_POINTED_TO)
2839 type_p *param = s->u.param_struct.param;
2840 type_p stru = s->u.param_struct.stru;
2841 if (stru->u.s.line.file == NULL)
2843 if (stru->kind == TYPE_LANG_STRUCT)
2846 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
2847 write_func_for_structure (s, ss, param, wtd);
2850 write_func_for_structure (s, stru, param, wtd);
2854 static const struct write_types_data ggc_wtd =
2856 "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
2857 "GC marker procedures. ",
2861 static const struct write_types_data pch_wtd =
2863 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
2864 "gt_pch_note_reorder",
2865 "PCH type-walking procedures. ",
2869 /* Write out the local pointer-walking routines. */
2871 /* process_field routine for local pointer-walking. */
2874 write_types_local_process_field (type_p f, const struct walk_type_data *d)
2881 case TYPE_LANG_STRUCT:
2882 case TYPE_PARAM_STRUCT:
2884 oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "",
2886 oprintf (d->of, "%*s op (&(%s), cookie);\n", d->indent, "", d->val);
2897 /* For S, a structure that's part of ORIG_S, and using parameters
2898 PARAM, write out a routine that:
2899 - Is of type gt_note_pointers
2900 - Calls PROCESS_FIELD on each field of S or its substructures.
2904 write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param)
2906 struct walk_type_data d;
2908 memset (&d, 0, sizeof (d));
2909 d.of = get_output_file_for_structure (s, param);
2910 d.process_field = write_types_local_process_field;
2912 d.line = &s->u.s.line;
2913 d.bitmap = s->u.s.bitmap;
2915 d.prev_val[0] = d.prev_val[2] = "*x";
2916 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2917 d.prev_val[3] = "x";
2919 d.fn_wants_lvalue = true;
2921 oprintf (d.of, "\n");
2922 oprintf (d.of, "void\n");
2923 oprintf (d.of, "gt_pch_p_");
2924 output_mangled_typename (d.of, orig_s);
2925 oprintf (d.of, " (ATTRIBUTE_UNUSED void *this_obj,\n"
2927 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
2928 "\tATTRIBUTE_UNUSED void *cookie)\n");
2929 oprintf (d.of, "{\n");
2930 oprintf (d.of, " %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
2931 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2932 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2935 oprintf (d.of, "}\n");
2938 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
2941 write_local (outf_p output_header, type_p structures, type_p param_structs)
2947 oprintf (output_header, "\n/* Local pointer-walking routines. */\n");
2948 for (s = structures; s; s = s->next)
2949 if (s->gc_used == GC_POINTED_TO
2950 || s->gc_used == GC_MAYBE_POINTED_TO)
2954 if (s->u.s.line.file == NULL)
2957 for (opt = s->u.s.opt; opt; opt = opt->next)
2958 if (strcmp (opt->name, "ptr_alias") == 0)
2960 const_type_p const t = (const_type_p) opt->info;
2961 if (t->kind == TYPE_STRUCT
2962 || t->kind == TYPE_UNION
2963 || t->kind == TYPE_LANG_STRUCT)
2965 oprintf (output_header, "#define gt_pch_p_");
2966 output_mangled_typename (output_header, s);
2967 oprintf (output_header, " gt_pch_p_");
2968 output_mangled_typename (output_header, t);
2969 oprintf (output_header, "\n");
2972 error_at_line (&s->u.s.line,
2973 "structure alias is not a structure");
2979 /* Declare the marker procedure only once. */
2980 oprintf (output_header, "extern void gt_pch_p_");
2981 output_mangled_typename (output_header, s);
2982 oprintf (output_header,
2983 "\n (void *, void *, gt_pointer_operator, void *);\n");
2985 if (s->kind == TYPE_LANG_STRUCT)
2988 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2989 write_local_func_for_structure (s, ss, NULL);
2992 write_local_func_for_structure (s, s, NULL);
2995 for (s = param_structs; s; s = s->next)
2996 if (s->gc_used == GC_POINTED_TO)
2998 type_p * param = s->u.param_struct.param;
2999 type_p stru = s->u.param_struct.stru;
3001 /* Declare the marker procedure. */
3002 oprintf (output_header, "extern void gt_pch_p_");
3003 output_mangled_typename (output_header, s);
3004 oprintf (output_header,
3005 "\n (void *, void *, gt_pointer_operator, void *);\n");
3007 if (stru->u.s.line.file == NULL)
3009 fprintf (stderr, "warning: structure `%s' used but not defined\n",
3014 if (stru->kind == TYPE_LANG_STRUCT)
3017 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3018 write_local_func_for_structure (s, ss, param);
3021 write_local_func_for_structure (s, stru, param);
3025 /* Write out the 'enum' definition for gt_types_enum. */
3028 write_enum_defn (type_p structures, type_p param_structs)
3034 oprintf (header_file, "\n/* Enumeration of types known. */\n");
3035 oprintf (header_file, "enum gt_types_enum {\n");
3036 for (s = structures; s; s = s->next)
3037 if (s->gc_used == GC_POINTED_TO
3038 || s->gc_used == GC_MAYBE_POINTED_TO)
3040 if (s->gc_used == GC_MAYBE_POINTED_TO
3041 && s->u.s.line.file == NULL)
3044 oprintf (header_file, " gt_ggc_e_");
3045 output_mangled_typename (header_file, s);
3046 oprintf (header_file, ", \n");
3048 for (s = param_structs; s; s = s->next)
3049 if (s->gc_used == GC_POINTED_TO)
3051 oprintf (header_file, " gt_e_");
3052 output_mangled_typename (header_file, s);
3053 oprintf (header_file, ", \n");
3055 oprintf (header_file, " gt_types_enum_last\n");
3056 oprintf (header_file, "};\n");
3059 /* Might T contain any non-pointer elements? */
3062 contains_scalar_p (type_p t)
3070 return contains_scalar_p (t->u.a.p);
3072 /* Could also check for structures that have no non-pointer
3073 fields, but there aren't enough of those to worry about. */
3078 /* Mangle FN and print it to F. */
3081 put_mangled_filename (outf_p f, const char *fn)
3083 const char *name = get_output_file_name (fn);
3086 for (; *name != 0; name++)
3087 if (ISALNUM (*name))
3088 oprintf (f, "%c", *name);
3090 oprintf (f, "%c", '_');
3093 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
3094 LASTNAME, and NAME are all strings to insert in various places in
3095 the resulting code. */
3098 finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
3099 const char *tname, const char *name)
3103 for (fli2 = flp; fli2; fli2 = fli2->next)
3104 if (fli2->started_p)
3106 oprintf (fli2->f, " %s\n", lastname);
3107 oprintf (fli2->f, "};\n\n");
3110 for (fli2 = flp; fli2 && base_files; fli2 = fli2->next)
3111 if (fli2->started_p)
3113 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3116 for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3119 oprintf (base_files[fnum],
3120 "extern const struct %s gt_%s_",
3122 put_mangled_filename (base_files[fnum], fli2->name);
3123 oprintf (base_files[fnum], "[];\n");
3129 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3130 oprintf (base_files [fnum],
3131 "EXPORTED_CONST struct %s * const %s[] = {\n",
3136 for (fli2 = flp; fli2; fli2 = fli2->next)
3137 if (fli2->started_p)
3139 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3142 fli2->started_p = 0;
3144 for (fnum = 0; base_files && bitmap != 0; fnum++, bitmap >>= 1)
3147 oprintf (base_files[fnum], " gt_%s_", pfx);
3148 put_mangled_filename (base_files[fnum], fli2->name);
3149 oprintf (base_files[fnum], ",\n");
3155 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3157 oprintf (base_files[fnum], " NULL\n");
3158 oprintf (base_files[fnum], "};\n");
3163 /* Write out to F the table entry and any marker routines needed to
3164 mark NAME as TYPE. The original variable is V, at LINE.
3165 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
3166 is nonzero iff we are building the root table for hash table caches. */
3169 write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
3170 struct fileloc *line, const char *if_marked, bool emit_pch)
3177 for (fld = type->u.s.fields; fld; fld = fld->next)
3180 const char *desc = NULL;
3183 for (o = fld->opt; o; o = o->next)
3184 if (strcmp (o->name, "skip") == 0)
3186 else if (strcmp (o->name, "desc") == 0)
3188 else if (strcmp (o->name, "param_is") == 0)
3191 error_at_line (line,
3192 "field `%s' of global `%s' has unknown option `%s'",
3193 fld->name, name, o->name);
3197 else if (desc && fld->type->kind == TYPE_UNION)
3199 pair_p validf = NULL;
3202 for (ufld = fld->type->u.s.fields; ufld; ufld = ufld->next)
3204 const char *tag = NULL;
3207 for (oo = ufld->opt; oo; oo = oo->next)
3208 if (strcmp (oo->name, "tag") == 0)
3210 if (tag == NULL || strcmp (tag, desc) != 0)
3213 error_at_line (line,
3214 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3215 name, fld->name, validf->name,
3216 name, fld->name, ufld->name,
3223 newname = xasprintf ("%s.%s.%s",
3224 name, fld->name, validf->name);
3225 write_root (f, v, validf->type, newname, 0, line,
3226 if_marked, emit_pch);
3231 error_at_line (line,
3232 "global `%s.%s' has `desc' option but is not union",
3237 newname = xasprintf ("%s.%s", name, fld->name);
3238 write_root (f, v, fld->type, newname, 0, line, if_marked,
3249 newname = xasprintf ("%s[0]", name);
3250 write_root (f, v, type->u.a.p, newname, has_length, line, if_marked,
3260 oprintf (f, " {\n");
3261 oprintf (f, " &%s,\n", name);
3264 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3266 oprintf (f, " * (%s)", ap->u.a.len);
3267 else if (ap == v->type)
3268 oprintf (f, " * ARRAY_SIZE (%s)", v->name);
3270 oprintf (f, " sizeof (%s", v->name);
3271 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3273 oprintf (f, "),\n");
3277 if (! has_length && UNION_OR_STRUCT_P (tp))
3279 oprintf (f, " >_ggc_mx_%s,\n", tp->u.s.tag);
3281 oprintf (f, " >_pch_nx_%s", tp->u.s.tag);
3283 oprintf (f, " NULL");
3285 else if (! has_length && tp->kind == TYPE_PARAM_STRUCT)
3287 oprintf (f, " >_ggc_m_");
3288 output_mangled_typename (f, tp);
3291 oprintf (f, ",\n >_pch_n_");
3292 output_mangled_typename (f, tp);
3295 oprintf (f, ",\n NULL");
3298 && (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
3300 oprintf (f, " >_ggc_ma_%s,\n", name);
3302 oprintf (f, " >_pch_na_%s", name);
3304 oprintf (f, " NULL");
3308 error_at_line (line,
3309 "global `%s' is pointer to unimplemented type",
3313 oprintf (f, ",\n &%s", if_marked);
3314 oprintf (f, "\n },\n");
3320 oprintf (f, " {\n");
3321 oprintf (f, " &%s,\n", name);
3322 oprintf (f, " 1, \n");
3323 oprintf (f, " sizeof (%s),\n", v->name);
3324 oprintf (f, " (gt_pointer_walker) >_ggc_m_S,\n");
3325 oprintf (f, " (gt_pointer_walker) >_pch_n_S\n");
3326 oprintf (f, " },\n");
3334 error_at_line (line,
3335 "global `%s' is unimplemented type",
3340 /* This generates a routine to walk an array. */
3343 write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
3345 struct walk_type_data d;
3348 memset (&d, 0, sizeof (d));
3354 d.bitmap = get_lang_bitmap (v->line.file);
3357 d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name);
3359 if (wtd->param_prefix)
3361 oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
3363 " (void *, void *, gt_pointer_operator, void *);\n");
3364 oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3365 wtd->param_prefix, v->name);
3367 " ATTRIBUTE_UNUSED void *x_p,\n"
3368 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3369 " ATTRIBUTE_UNUSED void * cookie)\n");
3370 oprintf (d.of, "{\n");
3371 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3372 d.process_field = write_types_local_process_field;
3373 walk_type (v->type, &d);
3374 oprintf (f, "}\n\n");
3378 oprintf (f, "static void gt_%sa_%s (void *);\n",
3379 wtd->prefix, v->name);
3380 oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3381 wtd->prefix, v->name);
3383 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3384 d.process_field = write_types_process_field;
3385 walk_type (v->type, &d);
3387 oprintf (f, "}\n\n");
3390 /* Output a table describing the locations and types of VARIABLES. */
3393 write_roots (pair_p variables, bool emit_pch)
3396 struct flist *flp = NULL;
3398 for (v = variables; v; v = v->next)
3400 outf_p f = get_output_file_with_visibility (v->line.file);
3402 const char *length = NULL;
3403 int deletable_p = 0;
3406 for (o = v->opt; o; o = o->next)
3407 if (strcmp (o->name, "length") == 0)
3409 else if (strcmp (o->name, "deletable") == 0)
3411 else if (strcmp (o->name, "param_is") == 0)
3413 else if (strncmp (o->name, "param", 5) == 0
3414 && ISDIGIT (o->name[5])
3415 && strcmp (o->name + 6, "_is") == 0)
3417 else if (strcmp (o->name, "if_marked") == 0)
3420 error_at_line (&v->line,
3421 "global `%s' has unknown option `%s'",
3424 for (fli = flp; fli; fli = fli->next)
3425 if (fli->f == f && f)
3429 fli = XNEW (struct flist);
3433 fli->name = v->line.file;
3434 gcc_assert(fli->name);
3437 oprintf (f, "\n/* GC roots. */\n\n");
3442 && v->type->kind == TYPE_POINTER
3443 && (v->type->u.p->kind == TYPE_POINTER
3444 || v->type->u.p->kind == TYPE_STRUCT))
3446 write_array (f, v, &ggc_wtd);
3447 write_array (f, v, &pch_wtd);
3451 for (v = variables; v; v = v->next)
3453 outf_p f = get_output_file_with_visibility (v->line.file);
3459 for (o = v->opt; o; o = o->next)
3460 if (strcmp (o->name, "length") == 0)
3462 else if (strcmp (o->name, "deletable") == 0
3463 || strcmp (o->name, "if_marked") == 0)
3469 for (fli = flp; fli; fli = fli->next)
3472 if (! fli->started_p)
3476 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
3477 put_mangled_filename (f, v->line.file);
3478 oprintf (f, "[] = {\n");
3481 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3484 finish_root_table (flp, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3487 for (v = variables; v; v = v->next)
3489 outf_p f = get_output_file_with_visibility (v->line.file);
3494 for (o = v->opt; o; o = o->next)
3495 if (strcmp (o->name, "deletable") == 0)
3497 else if (strcmp (o->name, "if_marked") == 0)
3503 for (fli = flp; fli; fli = fli->next)
3506 if (! fli->started_p)
3510 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
3511 put_mangled_filename (f, v->line.file);
3512 oprintf (f, "[] = {\n");
3515 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3519 finish_root_table (flp, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3520 "gt_ggc_deletable_rtab");
3522 for (v = variables; v; v = v->next)
3524 outf_p f = get_output_file_with_visibility (v->line.file);
3526 const char *if_marked = NULL;
3530 for (o = v->opt; o; o = o->next)
3531 if (strcmp (o->name, "length") == 0)
3533 else if (strcmp (o->name, "if_marked") == 0)
3534 if_marked = o->info;
3536 if (if_marked == NULL)
3539 if (v->type->kind != TYPE_POINTER
3540 || v->type->u.p->kind != TYPE_PARAM_STRUCT
3541 || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
3543 error_at_line (&v->line, "if_marked option used but not hash table");
3547 for (fli = flp; fli; fli = fli->next)
3550 if (! fli->started_p)
3554 oprintf (f, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
3555 put_mangled_filename (f, v->line.file);
3556 oprintf (f, "[] = {\n");
3559 write_root (f, v, v->type->u.p->u.param_struct.param[0],
3560 v->name, length_p, &v->line, if_marked, emit_pch);
3563 finish_root_table (flp, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
3564 "gt_ggc_cache_rtab");
3569 for (v = variables; v; v = v->next)
3571 outf_p f = get_output_file_with_visibility (v->line.file);
3574 int if_marked_p = 0;
3577 for (o = v->opt; o; o = o->next)
3578 if (strcmp (o->name, "length") == 0)
3580 else if (strcmp (o->name, "if_marked") == 0)
3586 for (fli = flp; fli; fli = fli->next)
3589 if (! fli->started_p)
3593 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
3594 put_mangled_filename (f, v->line.file);
3595 oprintf (f, "[] = {\n");
3598 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3601 finish_root_table (flp, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3602 "gt_pch_cache_rtab");
3604 for (v = variables; v; v = v->next)
3606 outf_p f = get_output_file_with_visibility (v->line.file);
3611 for (o = v->opt; o; o = o->next)
3612 if (strcmp (o->name, "deletable") == 0
3613 || strcmp (o->name, "if_marked") == 0)
3619 if (! contains_scalar_p (v->type))
3622 for (fli = flp; fli; fli = fli->next)
3625 if (! fli->started_p)
3629 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
3630 put_mangled_filename (f, v->line.file);
3631 oprintf (f, "[] = {\n");
3634 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3638 finish_root_table (flp, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3639 "gt_pch_scalar_rtab");
3642 /* Record the definition of a generic VEC structure, as if we had expanded
3643 the macros in vec.h:
3645 typedef struct VEC_<type>_base GTY(()) {
3648 <type> GTY((length ("%h.num"))) vec[1];
3651 where the GTY(()) tags are only present if is_scalar is _false_. */
3654 note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
3659 type_p len_ty = create_scalar_type ("unsigned");
3660 const char *name = concat ("VEC_", type_name, "_base", (char *)0);
3664 t = create_scalar_type (type_name);
3669 t = resolve_typedef (type_name, pos);
3670 o = create_option (0, "length", "%h.num");
3673 /* We assemble the field list in reverse order. */
3674 fields = create_field_at (0, create_array (t, "1"), "vec", o, pos);
3675 fields = create_field_at (fields, len_ty, "alloc", 0, pos);
3676 fields = create_field_at (fields, len_ty, "num", 0, pos);
3678 do_typedef (name, new_structure (name, 0, pos, fields, 0), pos);
3681 /* Record the definition of an allocation-specific VEC structure, as if
3682 we had expanded the macros in vec.h:
3684 typedef struct VEC_<type>_<astrat> {
3685 VEC_<type>_base base;
3686 } VEC_<type>_<astrat>;
3689 note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
3691 const char *astratname = concat ("VEC_", type, "_", astrat, (char *)0);
3692 const char *basename = concat ("VEC_", type, "_base", (char *)0);
3694 pair_p field = create_field_at (0, resolve_typedef (basename, pos),
3697 do_typedef (astratname, new_structure (astratname, 0, pos, field, 0), pos);
3700 static void dump_pair (int indent, pair_p p);
3701 static void dump_type (int indent, type_p p);
3702 static void dump_type_list (int indent, type_p p);
3706 /* Dumps the value of typekind KIND. */
3709 dump_typekind (int indent, enum typekind kind)
3711 printf ("%*ckind = ", indent, ' ');
3714 case TYPE_SCALAR: printf ("TYPE_SCALAR"); break;
3715 case TYPE_STRING: printf ("TYPE_STRING"); break;
3716 case TYPE_STRUCT: printf ("TYPE_STRUCT"); break;
3717 case TYPE_UNION: printf ("TYPE_UNION"); break;
3718 case TYPE_POINTER: printf ("TYPE_POINTER"); break;
3719 case TYPE_ARRAY: printf ("TYPE_ARRAY"); break;
3720 case TYPE_LANG_STRUCT: printf ("TYPE_LANG_STRUCT"); break;
3721 case TYPE_PARAM_STRUCT: printf ("TYPE_PARAM_STRUCT"); break;
3722 default: gcc_unreachable ();
3727 /* Dumps the value of GC_USED flag. */
3730 dump_gc_used (int indent, enum gc_used_enum gc_used)
3732 printf ("%*cgc_used = ", indent, ' ');
3735 case GC_UNUSED: printf ("GC_UNUSED"); break;
3736 case GC_USED: printf ("GC_USED"); break;
3737 case GC_MAYBE_POINTED_TO: printf ("GC_MAYBE_POINTED_TO"); break;
3738 case GC_POINTED_TO: printf ("GC_POINTED_TO"); break;
3739 default: gcc_unreachable ();
3744 /* Dumps the type options OPT. */
3747 dump_options (int indent, options_p opt)
3750 printf ("%*coptions = ", indent, ' ');
3754 printf ("%s:%s ", o->name, o->info);
3760 /* Dumps the source file location in LINE. */
3763 dump_fileloc (int indent, struct fileloc line)
3765 printf ("%*cfileloc: file = %s, line = %d\n", indent, ' ', line.file,
3769 /* Recursively dumps the struct, union, or a language-specific
3773 dump_type_u_s (int indent, type_p t)
3777 gcc_assert (t->kind == TYPE_STRUCT || t->kind == TYPE_UNION
3778 || t->kind == TYPE_LANG_STRUCT);
3779 printf ("%*cu.s.tag = %s\n", indent, ' ', t->u.s.tag);
3780 dump_fileloc (indent, t->u.s.line);
3781 printf ("%*cu.s.fields =\n", indent, ' ');
3782 fields = t->u.s.fields;
3785 dump_pair (indent + INDENT, fields);
3786 fields = fields->next;
3788 printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t);
3789 dump_options (indent, t->u.s.opt);
3790 printf ("%*cu.s.bitmap = %X\n", indent, ' ', t->u.s.bitmap);
3791 if (t->kind == TYPE_LANG_STRUCT)
3793 printf ("%*cu.s.lang_struct:\n", indent, ' ');
3794 dump_type_list (indent + INDENT, t->u.s.lang_struct);
3798 /* Recursively dumps the array T. */
3801 dump_type_u_a (int indent, type_p t)
3803 gcc_assert (t->kind == TYPE_ARRAY);
3804 printf ("%*clen = %s, u.a.p:\n", indent, ' ', t->u.a.len);
3805 dump_type_list (indent + INDENT, t->u.a.p);
3808 /* Recursively dumps the parameterized struct T. */
3811 dump_type_u_param_struct (int indent, type_p t)
3814 gcc_assert (t->kind == TYPE_PARAM_STRUCT);
3815 printf ("%*cu.param_struct.stru:\n", indent, ' ');
3816 dump_type_list (indent, t->u.param_struct.stru);
3817 dump_fileloc (indent, t->u.param_struct.line);
3818 for (i = 0; i < NUM_PARAM; i++)
3820 if (t->u.param_struct.param[i] == NULL)
3822 printf ("%*cu.param_struct.param[%d]:\n", indent, ' ', i);
3823 dump_type (indent + INDENT, t->u.param_struct.param[i]);
3827 /* Recursively dumps the type list T. */
3830 dump_type_list (int indent, type_p t)
3835 dump_type (indent, p);
3840 static htab_t seen_types;
3842 /* Recursively dumps the type T if it was not dumped previously. */
3845 dump_type (int indent, type_p t)
3849 printf ("%*cType at %p: ", indent, ' ', (void *)t);
3850 slot = htab_find_slot (seen_types, t, INSERT);
3853 printf ("already seen.\n");
3859 dump_typekind (indent, t->kind);
3860 printf ("%*cpointer_to = %p\n", indent + INDENT, ' ',
3861 (void *)t->pointer_to);
3862 dump_gc_used (indent + INDENT, t->gc_used);
3866 printf ("%*cscalar_is_char = %s\n", indent + INDENT, ' ',
3867 t->u.scalar_is_char ? "true" : "false");
3873 case TYPE_LANG_STRUCT:
3874 dump_type_u_s (indent + INDENT, t);
3877 printf ("%*cp:\n", indent + INDENT, ' ');
3878 dump_type (indent + INDENT, t->u.p);
3881 dump_type_u_a (indent + INDENT, t);
3883 case TYPE_PARAM_STRUCT:
3884 dump_type_u_param_struct (indent + INDENT, t);
3889 printf ("%*cEnd of type at %p\n", indent, ' ', (void *)t);
3892 /* Dumps the pair P. */
3895 dump_pair (int indent, pair_p p)
3897 printf ("%*cpair: name = %s\n", indent, ' ', p->name);
3898 dump_type (indent, p->type);
3899 dump_fileloc (indent, p->line);
3900 dump_options (indent, p->opt);
3901 printf ("%*cEnd of pair %s\n", indent, ' ', p->name);
3904 /* Dumps the list of pairs PP. */
3907 dump_pair_list (const char * name, pair_p pp)
3910 printf ("%s:\n", name);
3911 for (p = pp; p != NULL; p = p->next)
3913 printf ("End of %s\n\n", name);
3916 /* Dumps the STRUCTURES. */
3919 dump_structures (const char * name, type_p structures)
3921 printf ("%s:\n", name);
3922 dump_type_list (0, structures);
3923 printf ("End of %s\n\n", name);
3926 /* Dumps the internal structures of gengtype. */
3929 dump_everything (void)
3931 seen_types = htab_create (100, htab_hash_pointer, htab_eq_pointer, NULL);
3932 dump_pair_list ("typedefs", typedefs);
3933 dump_structures ("structures", structures);
3934 dump_structures ("param_structs", param_structs);
3935 dump_pair_list ("variables", variables);
3936 htab_delete (seen_types);
3941 main (int argc, char **argv)
3944 static struct fileloc pos = { this_file, 0 };
3945 char* inputlist = 0;
3947 outf_p output_header;
3948 char* plugin_output_filename = NULL;
3949 /* fatal uses this */
3950 progname = "gengtype";
3952 if (argc >= 2 && !strcmp (argv[1], "-d"))
3959 if (argc >= 6 && !strcmp (argv[1], "-P"))
3961 plugin_output_filename = argv[2];
3962 plugin_output = create_file ("GCC", plugin_output_filename);
3964 inputlist = argv[4];
3965 nb_plugin_files = argc - 5;
3966 plugin_files = XCNEWVEC (char *, nb_plugin_files);
3967 for (i = 0; i < nb_plugin_files; i++)
3969 /* Place an all zero lang_bitmap before the plugin file
3971 char *name = argv[i + 5];
3972 int len = strlen(name) + 1 + sizeof (lang_bitmap);
3973 plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap);
3974 strcpy (plugin_files[i], name);
3980 inputlist = argv[2];
3983 fatal ("usage: gengtype [-d] [-P pluginout.h] srcdir input-list "
3984 "[file1 file2 ... fileN]");
3986 srcdir_len = strlen (srcdir);
3988 read_input_list (inputlist);
3992 scalar_char.u.scalar_is_char = true;
3993 scalar_nonchar.u.scalar_is_char = false;
3996 /* These types are set up with #define or else outside of where
3998 pos.line = __LINE__ + 1;
3999 do_scalar_typedef ("CUMULATIVE_ARGS", &pos); pos.line++;
4000 do_scalar_typedef ("REAL_VALUE_TYPE", &pos); pos.line++;
4001 do_scalar_typedef ("FIXED_VALUE_TYPE", &pos); pos.line++;
4002 do_scalar_typedef ("double_int", &pos); pos.line++;
4003 do_scalar_typedef ("uint64_t", &pos); pos.line++;
4004 do_scalar_typedef ("uint8", &pos); pos.line++;
4005 do_scalar_typedef ("jword", &pos); pos.line++;
4006 do_scalar_typedef ("JCF_u2", &pos); pos.line++;
4007 do_scalar_typedef ("void", &pos); pos.line++;
4008 do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos);
4010 for (i = 0; i < num_gt_files; i++)
4011 parse_file (gt_files[i]);
4016 set_gc_used (variables);
4019 write_enum_defn (structures, param_structs);
4020 output_header = plugin_output ? plugin_output : header_file;
4021 write_types (output_header, structures, param_structs, &ggc_wtd);
4022 if (plugin_files == NULL)
4024 write_types (header_file, structures, param_structs, &pch_wtd);
4025 write_local (header_file, structures, param_structs);
4027 write_roots (variables, plugin_files == NULL);
4029 close_output_files ();
4036 for (i = 0; i < nb_plugin_files; i++)
4037 free (plugin_files[i] - sizeof (lang_bitmap));
4038 free (plugin_files);