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"
27 /* Data types, macros, etc. used only in this file. */
29 /* Kinds of types we can understand. */
41 typedef unsigned lang_bitmap;
43 /* A way to pass data through to the output end. */
51 /* Option data for the 'nested_ptr' option. */
52 struct nested_ptr_data
55 const char *convert_to;
56 const char *convert_from;
59 /* A name and a type. */
71 /* A description of a type. */
85 enum gc_used_enum gc_used;
103 type_p param[NUM_PARAM];
110 ((x)->kind == TYPE_UNION || \
111 ((x)->kind == TYPE_LANG_STRUCT \
112 && (x)->u.s.lang_struct->kind == TYPE_UNION))
113 #define UNION_OR_STRUCT_P(x) \
114 ((x)->kind == TYPE_UNION \
115 || (x)->kind == TYPE_STRUCT \
116 || (x)->kind == TYPE_LANG_STRUCT)
118 /* Structure representing an output file. */
127 typedef struct outf * outf_p;
129 /* An output file, suitable for definitions, that can see declarations
130 made in INPUT_FILE and is linked into every language that uses
131 INPUT_FILE. May return NULL in plugin mode. */
132 extern outf_p get_output_file_with_visibility
133 (const char *input_file);
134 const char *get_output_file_name (const char *);
136 /* Print, like fprintf, to O. No-op if O is NULL. */
137 static void oprintf (outf_p o, const char *S, ...)
140 /* The list of output files. */
141 static outf_p output_files;
143 /* The plugin input files and their number; in that case only
144 a single file is produced. */
145 static char** plugin_files;
146 static size_t nb_plugin_files;
147 /* the generated plugin output name & file */
148 static outf_p plugin_output;
150 /* The output header file that is included into pretty much every
152 static outf_p header_file;
154 /* Source directory. */
155 static const char *srcdir;
157 /* Length of srcdir name. */
158 static size_t srcdir_len = 0;
160 static outf_p create_file (const char *, const char *);
162 static const char * get_file_basename (const char *);
163 static const char * get_file_realbasename (const char *);
164 static const char * get_file_srcdir_relative_path (const char *);
166 static int get_prefix_langdir_index (const char *);
167 static const char * get_file_langdir (const char *);
170 /* Nonzero iff an error has occurred. */
171 bool hit_error = false;
173 static void gen_rtx_next (void);
174 static void write_rtx_next (void);
175 static void open_base_files (void);
176 static void close_output_files (void);
178 /* Report an error at POS, printing MSG. */
181 error_at_line (struct fileloc *pos, const char *msg, ...)
187 fprintf (stderr, "%s:%d: ", pos->file, pos->line);
188 vfprintf (stderr, msg, ap);
189 fputc ('\n', stderr);
195 /* asprintf, but produces fatal message on out-of-memory. */
197 xasprintf (const char *format, ...)
203 va_start (ap, format);
204 n = vasprintf (&result, format, ap);
205 if (result == NULL || n < 0)
206 fatal ("out of memory");
212 /* Input file handling. */
214 /* Table of all input files. */
215 static const char **gt_files;
216 static size_t num_gt_files;
218 /* A number of places use the name of this file for a location for
219 things that we can't rely on the source to define. Make sure we
220 can still use pointer comparison on filenames. */
221 static const char this_file[] = __FILE__;
223 /* Vector of per-language directories. */
224 static const char **lang_dir_names;
225 static size_t num_lang_dirs;
227 /* An array of output files suitable for definitions. There is one
228 BASE_FILES entry for each language. */
229 static outf_p *base_files;
231 /* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff
232 INPUT_FILE is used by <lang>.
234 This function should be written to assume that a file _is_ used
235 if the situation is unclear. If it wrongly assumes a file _is_ used,
236 a linker error will result. If it wrongly assumes a file _is not_ used,
237 some GC roots may be missed, which is a much harder-to-debug problem.
239 The relevant bitmap is stored immediately before the file's name in the
240 buffer set up by read_input_list. It may be unaligned, so we have to
241 read it byte-by-byte. */
244 get_lang_bitmap (const char *gtfile)
247 if (gtfile == this_file)
248 /* Things defined in this file are universal. */
249 return (((lang_bitmap)1) << num_lang_dirs) - 1;
254 for (i = -(int) sizeof (lang_bitmap); i < 0; i++)
255 n = (n << CHAR_BIT) + (unsigned char)gtfile[i];
260 /* Set the bitmap returned by get_lang_bitmap. The only legitimate
261 caller of this function is read_input_list. */
263 set_lang_bitmap (char *gtfile, lang_bitmap n)
266 for (i = -1; i >= -(int) sizeof (lang_bitmap); i--)
268 gtfile[i] = n & ((1U << CHAR_BIT)-1);
273 /* Scan the input file, LIST, and determine how much space we need to
274 store strings in. Also, count the number of language directories
275 and files. The numbers returned are overestimates as they does not
276 consider repeated files. */
278 measure_input_list (FILE *list)
284 num_gt_files = plugin_files ? nb_plugin_files : 0;
285 while ((c = getc (list)) != EOF)
294 /* Add space for a lang_bitmap before the input file name. */
295 n += sizeof (lang_bitmap);
309 /* Read one input line from LIST to HEREP (which is updated). A
310 pointer to the string is returned via LINEP. If it was a language
311 subdirectory in square brackets, strip off the square brackets and
312 return true. Otherwise, leave space before the string for a
313 lang_bitmap, and return false. At EOF, returns false, does not
314 touch *HEREP, and sets *LINEP to NULL. POS is used for
317 read_input_line (FILE *list, char **herep, char **linep,
324 /* Read over whitespace. */
325 while (c == '\n' || c == ' ')
335 /* No space for a lang_bitmap is necessary. Discard the '['. */
338 while (c != ']' && c != '\n' && c != EOF)
347 c = getc (list); /* eat what should be a newline */
348 if (c != '\n' && c != EOF)
349 error_at_line (pos, "junk on line after language tag [%s]", line);
352 error_at_line (pos, "missing close bracket for language tag [%s", line);
360 /* Leave space for a lang_bitmap. */
361 memset (here, 0, sizeof (lang_bitmap));
362 here += sizeof (lang_bitmap);
369 while (c != EOF && c != '\n');
377 /* Read the list of input files from LIST and compute all of the
378 relevant tables. There is one file per line of the list. At
379 first, all the files on the list are language-generic, but
380 eventually a line will appear which is the name of a language
381 subdirectory in square brackets, like this: [cp]. All subsequent
382 files are specific to that language, until another language
383 subdirectory tag appears. Files can appear more than once, if
384 they apply to more than one language. */
386 read_input_list (const char *listname)
388 FILE *list = fopen (listname, "r");
390 fatal ("cannot open %s: %s", listname, strerror (errno));
394 size_t bufsz = measure_input_list (list);
395 char *buf = XNEWVEC (char, bufsz);
397 char *committed = buf;
398 char *limit = buf + bufsz;
403 lang_bitmap curlangs = (1 << num_lang_dirs) - 1;
405 epos.file = listname;
408 lang_dir_names = XNEWVEC (const char *, num_lang_dirs);
409 gt_files = XNEWVEC (const char *, num_gt_files);
416 is_language = read_input_line (list, &here, &line, &epos);
417 gcc_assert (here <= limit);
420 else if (is_language)
423 gcc_assert (langno <= num_lang_dirs);
424 for (i = 0; i < langno; i++)
425 if (strcmp (lang_dir_names[i], line) == 0)
427 error_at_line (&epos, "duplicate language tag [%s]", line);
433 curlangs = 1 << langno;
434 lang_dir_names[langno++] = line;
439 gcc_assert (nfiles <= num_gt_files);
440 for (i = 0; i < nfiles; i++)
441 if (strcmp (gt_files[i], line) == 0)
443 /* Throw away the string we just read, and add the
444 current language to the existing string's bitmap. */
445 lang_bitmap bmap = get_lang_bitmap (gt_files[i]);
447 error_at_line (&epos, "file %s specified more than once "
448 "for language %s", line, langno == 0
450 : lang_dir_names[langno - 1]);
453 set_lang_bitmap (CONST_CAST(char *, gt_files[i]), bmap);
458 set_lang_bitmap (line, curlangs);
459 gt_files[nfiles++] = line;
462 /* Update the global counts now that we know accurately how many
463 things there are. (We do not bother resizing the arrays down.) */
464 num_lang_dirs = langno;
465 /* Add the plugin files if provided. */
469 for (i = 0; i < nb_plugin_files; i++)
470 gt_files[nfiles++] = plugin_files[i];
472 num_gt_files = nfiles;
475 /* Sanity check: any file that resides in a language subdirectory
476 (e.g. 'cp') ought to belong to the corresponding language.
477 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
478 (Can you even do that? Should you be allowed to?) */
481 for (f = 0; f < num_gt_files; f++)
483 lang_bitmap bitmap = get_lang_bitmap (gt_files[f]);
484 const char *basename = get_file_basename (gt_files[f]);
485 const char *slashpos = strchr (basename, '/');
490 for (l = 0; l < num_lang_dirs; l++)
491 if ((size_t)(slashpos - basename) == strlen (lang_dir_names [l])
492 && memcmp (basename, lang_dir_names[l],
493 strlen (lang_dir_names[l])) == 0)
495 if (!(bitmap & (1 << l)))
496 error ("%s is in language directory '%s' but is not "
497 "tagged for that language",
498 basename, lang_dir_names[l]);
506 fatal ("error reading %s: %s", listname, strerror (errno));
513 /* The one and only TYPE_STRING. */
515 static struct type string_type = {
516 TYPE_STRING, 0, 0, GC_USED, {0}
519 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
520 set to appropriate values at the beginning of main. */
522 static struct type scalar_nonchar = {
523 TYPE_SCALAR, 0, 0, GC_USED, {0}
525 static struct type scalar_char = {
526 TYPE_SCALAR, 0, 0, GC_USED, {0}
529 /* Lists of various things. */
531 static pair_p typedefs;
532 static type_p structures;
533 static type_p param_structs;
534 static pair_p variables;
536 static type_p find_param_structure
537 (type_p t, type_p param[NUM_PARAM]);
538 static type_p adjust_field_tree_exp (type_p t, options_p opt);
539 static type_p adjust_field_rtx_def (type_p t, options_p opt);
541 /* Define S as a typedef to T at POS. */
544 do_typedef (const char *s, type_p t, struct fileloc *pos)
548 /* temporary kludge - gengtype doesn't handle conditionals or
549 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
550 is coming from this file (main() sets them up with safe dummy
552 if (!strcmp (s, "CUMULATIVE_ARGS") && pos->file != this_file)
555 for (p = typedefs; p != NULL; p = p->next)
556 if (strcmp (p->name, s) == 0)
560 error_at_line (pos, "type `%s' previously defined", s);
561 error_at_line (&p->line, "previously defined here");
566 p = XNEW (struct pair);
574 /* Define S as a typename of a scalar. Cannot be used to define
575 typedefs of 'char'. Note: is also used for pointer-to-function
576 typedefs (which are therefore not treated as pointers). */
579 do_scalar_typedef (const char *s, struct fileloc *pos)
581 do_typedef (s, &scalar_nonchar, pos);
584 /* Return the type previously defined for S. Use POS to report errors. */
587 resolve_typedef (const char *s, struct fileloc *pos)
590 for (p = typedefs; p != NULL; p = p->next)
591 if (strcmp (p->name, s) == 0)
593 error_at_line (pos, "unidentified type `%s'", s);
594 return &scalar_nonchar; /* treat as "int" */
597 /* Create and return a new structure with tag NAME (or a union iff
598 ISUNION is nonzero), at POS with fields FIELDS and options O. */
601 new_structure (const char *name, int isunion, struct fileloc *pos,
602 pair_p fields, options_p o)
606 lang_bitmap bitmap = get_lang_bitmap (pos->file);
608 /* temporary kludge - gengtype doesn't handle conditionals or
609 macros. Ignore any attempt to define struct location_s, unless
610 it is coming from this file (main() sets it up safely). */
611 if (!strcmp (name, "location_s") && !isunion
612 && pos->file != this_file)
613 return find_structure (name, 0);
615 for (si = structures; si != NULL; si = si->next)
616 if (strcmp (name, si->u.s.tag) == 0
617 && UNION_P (si) == isunion)
620 if (si->kind == TYPE_LANG_STRUCT)
624 for (si = ls->u.s.lang_struct; si != NULL; si = si->next)
625 if (si->u.s.bitmap == bitmap)
628 else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
631 si = XCNEW (struct type);
632 memcpy (si, ls, sizeof (struct type));
633 ls->kind = TYPE_LANG_STRUCT;
634 ls->u.s.lang_struct = si;
635 ls->u.s.fields = NULL;
637 si->pointer_to = NULL;
638 si->u.s.lang_struct = ls;
643 if (ls != NULL && s == NULL)
645 s = XCNEW (struct type);
646 s->next = ls->u.s.lang_struct;
647 ls->u.s.lang_struct = s;
648 s->u.s.lang_struct = ls;
655 s = XCNEW (struct type);
656 s->next = structures;
660 if (s->u.s.line.file != NULL
661 || (s->u.s.lang_struct && (s->u.s.lang_struct->u.s.bitmap & bitmap)))
663 error_at_line (pos, "duplicate definition of '%s %s'",
664 isunion ? "union" : "struct", s->u.s.tag);
665 error_at_line (&s->u.s.line, "previous definition here");
668 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
671 s->u.s.fields = fields;
673 s->u.s.bitmap = bitmap;
674 if (s->u.s.lang_struct)
675 s->u.s.lang_struct->u.s.bitmap |= bitmap;
677 /* Reset location_s's location to input.h so that we know where to
678 write out its mark routine. */
679 if (!strcmp (name, "location_s") && !isunion
680 && pos->file == this_file)
683 for (n = 0; n < num_gt_files; n++)
684 if (!strcmp (gt_files[n] + strlen (gt_files[n]) - strlen ("input.h"),
687 s->u.s.line.file = gt_files[n];
695 /* Return the previously-defined structure with tag NAME (or a union
696 iff ISUNION is nonzero), or a new empty structure or union if none
697 was defined previously. */
700 find_structure (const char *name, int isunion)
704 for (s = structures; s != NULL; s = s->next)
705 if (strcmp (name, s->u.s.tag) == 0
706 && UNION_P (s) == isunion)
709 s = XCNEW (struct type);
710 s->next = structures;
712 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
718 /* Return the previously-defined parameterized structure for structure
719 T and parameters PARAM, or a new parameterized empty structure or
720 union if none was defined previously. */
723 find_param_structure (type_p t, type_p param[NUM_PARAM])
727 for (res = param_structs; res; res = res->next)
728 if (res->u.param_struct.stru == t
729 && memcmp (res->u.param_struct.param, param,
730 sizeof (type_p) * NUM_PARAM) == 0)
734 res = XCNEW (struct type);
735 res->kind = TYPE_PARAM_STRUCT;
736 res->next = param_structs;
738 res->u.param_struct.stru = t;
739 memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
744 /* Return a scalar type with name NAME. */
747 create_scalar_type (const char *name)
749 if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
752 return &scalar_nonchar;
755 /* Return a pointer to T. */
758 create_pointer (type_p t)
762 type_p r = XCNEW (struct type);
763 r->kind = TYPE_POINTER;
767 return t->pointer_to;
770 /* Return an array of length LEN. */
773 create_array (type_p t, const char *len)
777 v = XCNEW (struct type);
778 v->kind = TYPE_ARRAY;
784 /* Return an options structure with name NAME and info INFO. NEXT is the
785 next option in the chain. */
788 create_option (options_p next, const char *name, const void *info)
790 options_p o = XNEW (struct options);
793 o->info = (const char*) info;
797 /* Return an options structure for a "nested_ptr" option. */
799 create_nested_ptr_option (options_p next, type_p t,
800 const char *to, const char *from)
802 struct nested_ptr_data *d = XNEW (struct nested_ptr_data);
804 d->type = adjust_field_type (t, 0);
806 d->convert_from = from;
807 return create_option (next, "nested_ptr", d);
810 /* Add a variable named S of type T with options O defined at POS,
814 note_variable (const char *s, type_p t, options_p o, struct fileloc *pos)
817 n = XNEW (struct pair);
826 /* Most-general structure field creator. */
828 create_field_all (pair_p next, type_p type, const char *name, options_p opt,
829 const char *file, int line)
833 field = XNEW (struct pair);
838 field->line.file = file;
839 field->line.line = line;
843 /* Create a field that came from the source code we are scanning,
844 i.e. we have a 'struct fileloc', and possibly options; also,
845 adjust_field_type should be called. */
847 create_field_at (pair_p next, type_p type, const char *name, options_p opt,
850 return create_field_all (next, adjust_field_type (type, opt),
851 name, opt, pos->file, pos->line);
854 /* Create a fake field with the given type and name. NEXT is the next
855 field in the chain. */
856 #define create_field(next,type,name) \
857 create_field_all(next,type,name, 0, this_file, __LINE__)
859 /* Like create_field, but the field is only valid when condition COND
863 create_optional_field_ (pair_p next, type_p type, const char *name,
864 const char *cond, int line)
870 /* Create a fake union type with a single nameless field of type TYPE.
871 The field has a tag of "1". This allows us to make the presence
872 of a field of type TYPE depend on some boolean "desc" being true. */
873 union_fields = create_field (NULL, type, "");
874 union_fields->opt = create_option (union_fields->opt, "dot", "");
875 union_fields->opt = create_option (union_fields->opt, "tag", "1");
876 union_type = new_structure (xasprintf ("%s_%d", "fake_union", id++), 1,
877 &lexer_line, union_fields, NULL);
879 /* Create the field and give it the new fake union type. Add a "desc"
880 tag that specifies the condition under which the field is valid. */
881 return create_field_all (next, union_type, name,
882 create_option (0, "desc", cond),
885 #define create_optional_field(next,type,name,cond) \
886 create_optional_field_(next,type,name,cond,__LINE__)
888 /* Reverse a linked list of 'struct pair's in place. */
890 nreverse_pairs (pair_p list)
892 pair_p prev = 0, p, next;
893 for (p = list; p; p = next)
903 /* We don't care how long a CONST_DOUBLE is. */
904 #define CONST_DOUBLE_FORMAT "ww"
905 /* We don't want to see codes that are only for generator files. */
906 #undef GENERATOR_FILE
909 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
915 static const char * const rtx_name[NUM_RTX_CODE] = {
916 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
921 static const char * const rtx_format[NUM_RTX_CODE] = {
922 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
927 static int rtx_next_new[NUM_RTX_CODE];
929 /* We also need codes and names for insn notes (not register notes).
930 Note that we do *not* bias the note values here. */
932 #define DEF_INSN_NOTE(NAME) NAME,
933 #include "insn-notes.def"
939 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
940 default field for line number notes. */
941 static const char *const note_insn_name[NOTE_INSN_MAX+1] = {
942 #define DEF_INSN_NOTE(NAME) #NAME,
943 #include "insn-notes.def"
947 #undef CONST_DOUBLE_FORMAT
948 #define GENERATOR_FILE
950 /* Generate the contents of the rtx_next array. This really doesn't belong
951 in gengtype at all, but it's needed for adjust_field_rtx_def. */
957 for (i = 0; i < NUM_RTX_CODE; i++)
961 rtx_next_new[i] = -1;
962 if (strncmp (rtx_format[i], "iuu", 3) == 0)
964 else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
967 for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
968 if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
973 /* Write out the contents of the rtx_next array. */
975 write_rtx_next (void)
977 outf_p f = get_output_file_with_visibility (NULL);
982 oprintf (f, "\n/* Used to implement the RTX_NEXT macro. */\n");
983 oprintf (f, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
984 for (i = 0; i < NUM_RTX_CODE; i++)
985 if (rtx_next_new[i] == -1)
986 oprintf (f, " 0,\n");
989 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n",
994 /* Handle `special("rtx_def")'. This is a special case for field
995 `fld' of struct rtx_def, which is an array of unions whose values
996 are based in a complex way on the type of RTL. */
999 adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
1004 type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
1005 type_p bitmap_tp, basic_block_tp, reg_attrs_tp, constant_tp, symbol_union_tp;
1007 if (t->kind != TYPE_UNION)
1009 error_at_line (&lexer_line,
1010 "special `rtx_def' must be applied to a union");
1011 return &string_type;
1014 nodot = create_option (NULL, "dot", "");
1016 rtx_tp = create_pointer (find_structure ("rtx_def", 0));
1017 rtvec_tp = create_pointer (find_structure ("rtvec_def", 0));
1018 tree_tp = create_pointer (find_structure ("tree_node", 1));
1019 mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
1020 reg_attrs_tp = create_pointer (find_structure ("reg_attrs", 0));
1021 bitmap_tp = create_pointer (find_structure ("bitmap_element_def", 0));
1022 basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
1023 constant_tp = create_pointer (find_structure ("constant_descriptor_rtx", 0));
1024 scalar_tp = &scalar_nonchar; /* rtunion int */
1027 pair_p note_flds = NULL;
1030 for (c = 0; c <= NOTE_INSN_MAX; c++)
1035 case NOTE_INSN_DELETED_LABEL:
1036 note_flds = create_field (note_flds, &string_type, "rt_str");
1039 case NOTE_INSN_BLOCK_BEG:
1040 case NOTE_INSN_BLOCK_END:
1041 note_flds = create_field (note_flds, tree_tp, "rt_tree");
1044 case NOTE_INSN_VAR_LOCATION:
1045 note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
1049 note_flds = create_field (note_flds, scalar_tp, "rt_int");
1052 /* NOTE_INSN_MAX is used as the default field for line
1054 if (c == NOTE_INSN_MAX)
1055 note_flds->opt = create_option (nodot, "default", "");
1057 note_flds->opt = create_option (nodot, "tag", note_insn_name[c]);
1059 note_union_tp = new_structure ("rtx_def_note_subunion", 1,
1060 &lexer_line, note_flds, NULL);
1062 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1066 sym_flds = create_field (NULL, tree_tp, "rt_tree");
1067 sym_flds->opt = create_option (nodot, "default", "");
1069 sym_flds = create_field (sym_flds, constant_tp, "rt_constant");
1070 sym_flds->opt = create_option (nodot, "tag", "1");
1072 symbol_union_tp = new_structure ("rtx_def_symbol_subunion", 1,
1073 &lexer_line, sym_flds, NULL);
1075 for (i = 0; i < NUM_RTX_CODE; i++)
1077 pair_p subfields = NULL;
1078 size_t aindex, nmindex;
1083 for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
1086 const char *subname;
1088 switch (rtx_format[i][aindex])
1099 if (i == MEM && aindex == 1)
1100 t = mem_attrs_tp, subname = "rt_mem";
1101 else if (i == JUMP_INSN && aindex == 8)
1102 t = rtx_tp, subname = "rt_rtx";
1103 else if (i == CODE_LABEL && aindex == 4)
1104 t = scalar_tp, subname = "rt_int";
1105 else if (i == CODE_LABEL && aindex == 5)
1106 t = rtx_tp, subname = "rt_rtx";
1107 else if (i == LABEL_REF
1108 && (aindex == 1 || aindex == 2))
1109 t = rtx_tp, subname = "rt_rtx";
1110 else if (i == NOTE && aindex == 4)
1111 t = note_union_tp, subname = "";
1112 else if (i == NOTE && aindex == 5)
1113 t = scalar_tp, subname = "rt_int";
1114 else if (i == NOTE && aindex >= 7)
1115 t = scalar_tp, subname = "rt_int";
1116 else if (i == ADDR_DIFF_VEC && aindex == 4)
1117 t = scalar_tp, subname = "rt_int";
1118 else if (i == VALUE && aindex == 0)
1119 t = scalar_tp, subname = "rt_int";
1120 else if (i == REG && aindex == 1)
1121 t = scalar_tp, subname = "rt_int";
1122 else if (i == REG && aindex == 2)
1123 t = reg_attrs_tp, subname = "rt_reg";
1124 else if (i == SCRATCH && aindex == 0)
1125 t = scalar_tp, subname = "rt_int";
1126 else if (i == SYMBOL_REF && aindex == 1)
1127 t = scalar_tp, subname = "rt_int";
1128 else if (i == SYMBOL_REF && aindex == 2)
1129 t = symbol_union_tp, subname = "";
1130 else if (i == BARRIER && aindex >= 3)
1131 t = scalar_tp, subname = "rt_int";
1134 error_at_line (&lexer_line,
1135 "rtx type `%s' has `0' in position %lu, can't handle",
1136 rtx_name[i], (unsigned long) aindex);
1158 subname = "rt_rtvec";
1163 subname = "rt_tree";
1177 error_at_line (&lexer_line,
1178 "rtx type `%s' has `%c' in position %lu, can't handle",
1179 rtx_name[i], rtx_format[i][aindex],
1180 (unsigned long)aindex);
1186 subfields = create_field (subfields, t,
1187 xasprintf (".fld[%lu].%s",
1188 (unsigned long) aindex,
1190 subfields->opt = nodot;
1191 if (t == note_union_tp)
1192 subfields->opt = create_option (subfields->opt, "desc",
1194 if (t == symbol_union_tp)
1195 subfields->opt = create_option (subfields->opt, "desc",
1196 "CONSTANT_POOL_ADDRESS_P (&%0)");
1199 if (i == SYMBOL_REF)
1201 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P holds. */
1202 type_p field_tp = find_structure ("block_symbol", 0);
1204 = create_optional_field (subfields, field_tp, "block_sym",
1205 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1208 sname = xasprintf ("rtx_def_%s", rtx_name[i]);
1209 substruct = new_structure (sname, 0, &lexer_line, subfields, NULL);
1211 ftag = xstrdup (rtx_name[i]);
1212 for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
1213 ftag[nmindex] = TOUPPER (ftag[nmindex]);
1215 flds = create_field (flds, substruct, "");
1216 flds->opt = create_option (nodot, "tag", ftag);
1219 return new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
1222 /* Handle `special("tree_exp")'. This is a special case for
1223 field `operands' of struct tree_exp, which although it claims to contain
1224 pointers to trees, actually sometimes contains pointers to RTL too.
1225 Passed T, the old type of the field, and OPT its options. Returns
1226 a new type for the field. */
1229 adjust_field_tree_exp (type_p t, options_p opt ATTRIBUTE_UNUSED)
1234 if (t->kind != TYPE_ARRAY)
1236 error_at_line (&lexer_line,
1237 "special `tree_exp' must be applied to an array");
1238 return &string_type;
1241 nodot = create_option (NULL, "dot", "");
1243 flds = create_field (NULL, t, "");
1244 flds->opt = create_option (nodot, "length",
1245 "TREE_OPERAND_LENGTH ((tree) &%0)");
1246 flds->opt = create_option (flds->opt, "default", "");
1248 return new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
1251 /* Perform any special processing on a type T, about to become the type
1252 of a field. Return the appropriate type for the field.
1254 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1255 - Similarly for arrays of pointer-to-char;
1256 - Converts structures for which a parameter is provided to
1258 - Handles "special" options.
1262 adjust_field_type (type_p t, options_p opt)
1265 const int pointer_p = t->kind == TYPE_POINTER;
1266 type_p params[NUM_PARAM];
1270 for (i = 0; i < NUM_PARAM; i++)
1273 for (; opt; opt = opt->next)
1274 if (strcmp (opt->name, "length") == 0)
1276 else if (strcmp (opt->name, "param_is") == 0
1277 || (strncmp (opt->name, "param", 5) == 0
1278 && ISDIGIT (opt->name[5])
1279 && strcmp (opt->name + 6, "_is") == 0))
1281 int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
1283 if (! UNION_OR_STRUCT_P (t)
1284 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
1286 error_at_line (&lexer_line,
1287 "option `%s' may only be applied to structures or structure pointers",
1293 if (params[num] != NULL)
1294 error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
1295 if (! ISDIGIT (opt->name[5]))
1296 params[num] = create_pointer (CONST_CAST2(type_p, const char *, opt->info));
1298 params[num] = CONST_CAST2 (type_p, const char *, opt->info);
1300 else if (strcmp (opt->name, "special") == 0)
1302 const char *special_name = opt->info;
1303 if (strcmp (special_name, "tree_exp") == 0)
1304 t = adjust_field_tree_exp (t, opt);
1305 else if (strcmp (special_name, "rtx_def") == 0)
1306 t = adjust_field_rtx_def (t, opt);
1308 error_at_line (&lexer_line, "unknown special `%s'", special_name);
1317 realt = find_param_structure (t, params);
1318 t = pointer_p ? create_pointer (realt) : realt;
1323 && t->u.p->kind == TYPE_SCALAR
1324 && t->u.p->u.scalar_is_char)
1325 return &string_type;
1326 if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
1327 && t->u.a.p->u.p->kind == TYPE_SCALAR
1328 && t->u.a.p->u.p->u.scalar_is_char)
1329 return create_array (&string_type, t->u.a.len);
1335 static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
1336 static void set_gc_used (pair_p);
1338 /* Handle OPT for set_gc_used_type. */
1341 process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
1342 int *pass_param, int *length, int *skip, type_p *nested_ptr)
1345 for (o = opt; o; o = o->next)
1346 if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO)
1347 set_gc_used_type (CONST_CAST2 (type_p, const char *, o->info),
1348 GC_POINTED_TO, NULL);
1349 else if (strcmp (o->name, "maybe_undef") == 0)
1351 else if (strcmp (o->name, "use_params") == 0)
1353 else if (strcmp (o->name, "length") == 0)
1355 else if (strcmp (o->name, "skip") == 0)
1357 else if (strcmp (o->name, "nested_ptr") == 0)
1358 *nested_ptr = ((const struct nested_ptr_data *) o->info)->type;
1361 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
1364 set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
1366 if (t->gc_used >= level)
1380 process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy,
1383 for (f = t->u.s.fields; f; f = f->next)
1385 int maybe_undef = 0;
1389 type_p nested_ptr = NULL;
1390 process_gc_options (f->opt, level, &maybe_undef, &pass_param,
1391 &length, &skip, &nested_ptr);
1393 if (nested_ptr && f->type->kind == TYPE_POINTER)
1394 set_gc_used_type (nested_ptr, GC_POINTED_TO,
1395 pass_param ? param : NULL);
1396 else if (length && f->type->kind == TYPE_POINTER)
1397 set_gc_used_type (f->type->u.p, GC_USED, NULL);
1398 else if (maybe_undef && f->type->kind == TYPE_POINTER)
1399 set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
1400 else if (pass_param && f->type->kind == TYPE_POINTER && param)
1401 set_gc_used_type (find_param_structure (f->type->u.p, param),
1402 GC_POINTED_TO, NULL);
1404 ; /* target type is not used through this field */
1406 set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
1412 set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
1416 set_gc_used_type (t->u.a.p, GC_USED, param);
1419 case TYPE_LANG_STRUCT:
1420 for (t = t->u.s.lang_struct; t; t = t->next)
1421 set_gc_used_type (t, level, param);
1424 case TYPE_PARAM_STRUCT:
1427 for (i = 0; i < NUM_PARAM; i++)
1428 if (t->u.param_struct.param[i] != 0)
1429 set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
1431 if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
1432 level = GC_POINTED_TO;
1435 t->u.param_struct.stru->gc_used = GC_UNUSED;
1436 set_gc_used_type (t->u.param_struct.stru, level,
1437 t->u.param_struct.param);
1445 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1448 set_gc_used (pair_p variables)
1451 for (p = variables; p; p = p->next)
1452 set_gc_used_type (p->type, GC_USED, NULL);
1455 /* File mapping routines. For each input file, there is one output .c file
1456 (but some output files have many input files), and there is one .h file
1457 for the whole build. */
1459 /* Output file handling. */
1461 /* Create and return an outf_p for a new file for NAME, to be called
1465 create_file (const char *name, const char *oname)
1467 static const char *const hdr[] = {
1468 " Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.\n",
1470 "This file is part of GCC.\n",
1472 "GCC is free software; you can redistribute it and/or modify it under\n",
1473 "the terms of the GNU General Public License as published by the Free\n",
1474 "Software Foundation; either version 3, or (at your option) any later\n",
1477 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1478 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1479 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1480 "for more details.\n",
1482 "You should have received a copy of the GNU General Public License\n",
1483 "along with GCC; see the file COPYING3. If not see\n",
1484 "<http://www.gnu.org/licenses/>. */\n",
1486 "/* This file is machine generated. Do not edit. */\n"
1491 gcc_assert (name != NULL);
1492 gcc_assert (oname != NULL);
1493 f = XCNEW (struct outf);
1494 f->next = output_files;
1498 oprintf (f, "/* Type information for %s.\n", name);
1499 for (i = 0; i < ARRAY_SIZE (hdr); i++)
1500 oprintf (f, "%s", hdr[i]);
1504 /* Print, like fprintf, to O.
1505 N.B. You might think this could be implemented more efficiently
1506 with vsnprintf(). Unfortunately, there are C libraries that
1507 provide that function but without the C99 semantics for its return
1508 value, making it impossible to know how much space is required. */
1510 oprintf (outf_p o, const char *format, ...)
1516 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1521 va_start (ap, format);
1522 slength = vasprintf (&s, format, ap);
1523 if (s == NULL || (int)slength < 0)
1524 fatal ("out of memory");
1527 if (o->bufused + slength > o->buflength)
1529 size_t new_len = o->buflength;
1534 } while (o->bufused + slength >= new_len);
1535 o->buf = XRESIZEVEC (char, o->buf, new_len);
1536 o->buflength = new_len;
1538 memcpy (o->buf + o->bufused, s, slength);
1539 o->bufused += slength;
1543 /* Open the global header file and the language-specific header files. */
1546 open_base_files (void)
1550 if (nb_plugin_files > 0 && plugin_files)
1553 header_file = create_file ("GCC", "gtype-desc.h");
1555 base_files = XNEWVEC (outf_p, num_lang_dirs);
1557 for (i = 0; i < num_lang_dirs; i++)
1558 base_files[i] = create_file (lang_dir_names[i],
1559 xasprintf ("gtype-%s.h", lang_dir_names[i]));
1561 /* gtype-desc.c is a little special, so we create it here. */
1563 /* The order of files here matters very much. */
1564 static const char *const ifiles [] = {
1565 "config.h", "system.h", "coretypes.h", "tm.h", "varray.h",
1566 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1567 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1568 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1569 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1570 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1571 "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
1574 const char *const *ifp;
1575 outf_p gtype_desc_c;
1577 gtype_desc_c = create_file ("GCC", "gtype-desc.c");
1578 for (ifp = ifiles; *ifp; ifp++)
1579 oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
1581 /* Make sure we handle "cfun" specially. */
1582 oprintf (gtype_desc_c, "\n/* See definition in function.h. */\n");
1583 oprintf (gtype_desc_c, "#undef cfun\n");
1587 /* For F a filename, return the real basename of F, with all the directory
1588 components skipped. */
1591 get_file_realbasename (const char *f)
1593 const char * lastslash = strrchr (f, '/');
1595 return (lastslash != NULL) ? lastslash + 1 : f;
1598 /* For F a filename, return the relative path to F from $(srcdir) if the
1599 latter is a prefix in F, NULL otherwise. */
1602 get_file_srcdir_relative_path (const char *f)
1604 if (strlen (f) > srcdir_len
1605 && IS_DIR_SEPARATOR (f[srcdir_len])
1606 && memcmp (f, srcdir, srcdir_len) == 0)
1607 return f + srcdir_len + 1;
1612 /* For F a filename, return the relative path to F from $(srcdir) if the
1613 latter is a prefix in F, or the real basename of F otherwise. */
1616 get_file_basename (const char *f)
1618 const char * srcdir_path = get_file_srcdir_relative_path (f);
1620 return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (f);
1623 /* For F a filename, return the lang_dir_names relative index of the language
1624 directory that is a prefix in F, if any, -1 otherwise. */
1627 get_prefix_langdir_index (const char *f)
1629 size_t f_len = strlen (f);
1632 for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
1634 const char * langdir = lang_dir_names [lang_index];
1635 size_t langdir_len = strlen (langdir);
1637 if (f_len > langdir_len
1638 && IS_DIR_SEPARATOR (f[langdir_len])
1639 && memcmp (f, langdir, langdir_len) == 0)
1646 /* For F a filename, return the name of language directory where F is located,
1647 if any, NULL otherwise. */
1650 get_file_langdir (const char *f)
1652 /* Get the relative path to F from $(srcdir) and find the language by
1653 comparing the prefix with language directory names. If F is not even
1654 srcdir relative, no point in looking further. */
1657 const char * srcdir_relative_path = get_file_srcdir_relative_path (f);
1659 if (!srcdir_relative_path)
1662 lang_index = get_prefix_langdir_index (srcdir_relative_path);
1664 return (lang_index >= 0) ? lang_dir_names [lang_index] : NULL;
1667 /* The gt- output file name for F. */
1670 get_file_gtfilename (const char *f)
1672 /* Cook up an initial version of the gt- file name from the file real
1673 basename and the language name, if any. */
1675 const char *basename = get_file_realbasename (f);
1676 const char *langdir = get_file_langdir (f);
1679 (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
1680 : xasprintf ("gt-%s", basename));
1682 /* Then replace all non alphanumerics characters by '-' and change the
1683 extenstion to ".h". We expect the input filename extension was at least
1684 one character long. */
1688 for (; *s != '.'; s++)
1689 if (! ISALNUM (*s) && *s != '-')
1692 memcpy (s, ".h", sizeof (".h"));
1697 /* An output file, suitable for definitions, that can see declarations
1698 made in INPUT_FILE and is linked into every language that uses
1702 get_output_file_with_visibility (const char *input_file)
1706 const char *basename;
1707 const char *for_name;
1708 const char *output_name;
1710 /* This can happen when we need a file with visibility on a
1711 structure that we've never seen. We have to just hope that it's
1712 globally visible. */
1713 if (input_file == NULL)
1714 input_file = "system.h";
1716 /* In plugin mode, return NULL unless the input_file is one of the
1721 for (i = 0; i < nb_plugin_files; i++)
1722 if (strcmp (input_file, plugin_files[i]) == 0)
1723 return plugin_output;
1728 /* Determine the output file name. */
1729 basename = get_file_basename (input_file);
1731 len = strlen (basename);
1732 if ((len > 2 && memcmp (basename+len-2, ".c", 2) == 0)
1733 || (len > 2 && memcmp (basename+len-2, ".y", 2) == 0)
1734 || (len > 3 && memcmp (basename+len-3, ".in", 3) == 0))
1736 output_name = get_file_gtfilename (input_file);
1737 for_name = basename;
1739 /* Some headers get used by more than one front-end; hence, it
1740 would be inappropriate to spew them out to a single gtype-<lang>.h
1741 (and gengtype doesn't know how to direct spewage into multiple
1742 gtype-<lang>.h headers at this time). Instead, we pair up these
1743 headers with source files (and their special purpose gt-*.h headers). */
1744 else if (strcmp (basename, "c-common.h") == 0)
1745 output_name = "gt-c-common.h", for_name = "c-common.c";
1746 else if (strcmp (basename, "c-lang.h") == 0)
1747 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1748 else if (strcmp (basename, "c-tree.h") == 0)
1749 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1750 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1751 && strcmp (basename + 3, "cp-tree.h") == 0)
1752 output_name = "gt-cp-tree.h", for_name = "cp/tree.c";
1753 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1754 && strcmp (basename + 3, "decl.h") == 0)
1755 output_name = "gt-cp-decl.h", for_name = "cp/decl.c";
1756 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1757 && strcmp (basename + 3, "name-lookup.h") == 0)
1758 output_name = "gt-cp-name-lookup.h", for_name = "cp/name-lookup.c";
1759 else if (strncmp (basename, "objc", 4) == 0 && IS_DIR_SEPARATOR (basename[4])
1760 && strcmp (basename + 5, "objc-act.h") == 0)
1761 output_name = "gt-objc-objc-act.h", for_name = "objc/objc-act.c";
1764 int lang_index = get_prefix_langdir_index (basename);
1766 if (lang_index >= 0)
1767 return base_files[lang_index];
1769 output_name = "gtype-desc.c";
1773 /* Look through to see if we've ever seen this output filename before. */
1774 for (r = output_files; r; r = r->next)
1775 if (strcmp (r->name, output_name) == 0)
1778 /* If not, create it. */
1779 r = create_file (for_name, output_name);
1781 gcc_assert (r && r->name);
1785 /* The name of an output file, suitable for definitions, that can see
1786 declarations made in INPUT_FILE and is linked into every language
1787 that uses INPUT_FILE. */
1790 get_output_file_name (const char *input_file)
1792 outf_p o = get_output_file_with_visibility (input_file);
1798 /* Check if existing file is equal to the in memory buffer. */
1801 is_file_equal (outf_p of)
1803 FILE *newfile = fopen (of->name, "r");
1806 if (newfile == NULL)
1810 for (i = 0; i < of->bufused; i++)
1813 ch = fgetc (newfile);
1814 if (ch == EOF || ch != (unsigned char) of->buf[i])
1824 /* Copy the output to its final destination,
1825 but don't unnecessarily change modification times. */
1828 close_output_files (void)
1832 for (of = output_files; of; of = of->next)
1835 if (!is_file_equal(of))
1837 FILE *newfile = fopen (of->name, "w");
1838 if (newfile == NULL)
1839 fatal ("opening output file %s: %s", of->name, strerror (errno));
1840 if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
1841 fatal ("writing output file %s: %s", of->name, strerror (errno));
1842 if (fclose (newfile) != 0)
1843 fatal ("closing output file %s: %s", of->name, strerror (errno));
1847 of->bufused = of->buflength = 0;
1858 struct walk_type_data;
1860 /* For scalars and strings, given the item in 'val'.
1861 For structures, given a pointer to the item in 'val'.
1862 For misc. pointers, given the item in 'val'.
1864 typedef void (*process_field_fn)
1865 (type_p f, const struct walk_type_data *p);
1866 typedef void (*func_name_fn)
1867 (type_p s, const struct walk_type_data *p);
1869 /* Parameters for write_types. */
1871 struct write_types_data
1874 const char *param_prefix;
1875 const char *subfield_marker_routine;
1876 const char *marker_routine;
1877 const char *reorder_note_routine;
1878 const char *comment;
1879 int skip_hooks; /* skip hook generation if non zero */
1882 static void output_escaped_param (struct walk_type_data *d,
1883 const char *, const char *);
1884 static void output_mangled_typename (outf_p, const_type_p);
1885 static void walk_type (type_p t, struct walk_type_data *d);
1886 static void write_func_for_structure
1887 (type_p orig_s, type_p s, type_p * param,
1888 const struct write_types_data *wtd);
1889 static void write_types_process_field
1890 (type_p f, const struct walk_type_data *d);
1891 static void write_types (outf_p output_header,
1893 type_p param_structs,
1894 const struct write_types_data *wtd);
1895 static void write_types_local_process_field
1896 (type_p f, const struct walk_type_data *d);
1897 static void write_local_func_for_structure
1898 (type_p orig_s, type_p s, type_p * param);
1899 static void write_local (outf_p output_header,
1901 type_p param_structs);
1902 static void write_enum_defn (type_p structures, type_p param_structs);
1903 static int contains_scalar_p (type_p t);
1904 static void put_mangled_filename (outf_p , const char *);
1905 static void finish_root_table (struct flist *flp, const char *pfx,
1906 const char *tname, const char *lastname,
1908 static void write_root (outf_p , pair_p, type_p, const char *, int,
1909 struct fileloc *, const char *, bool);
1910 static void write_array (outf_p f, pair_p v,
1911 const struct write_types_data *wtd);
1912 static void write_roots (pair_p, bool);
1914 /* Parameters for walk_type. */
1916 struct walk_type_data
1918 process_field_fn process_field;
1923 const char *prev_val[4];
1926 struct fileloc *line;
1931 const char *reorder_fn;
1933 bool fn_wants_lvalue;
1936 /* Print a mangled name representing T to OF. */
1939 output_mangled_typename (outf_p of, const_type_p t)
1943 else switch (t->kind)
1947 output_mangled_typename (of, t->u.p);
1957 case TYPE_LANG_STRUCT:
1958 oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag), t->u.s.tag);
1960 case TYPE_PARAM_STRUCT:
1963 for (i = 0; i < NUM_PARAM; i++)
1964 if (t->u.param_struct.param[i] != NULL)
1965 output_mangled_typename (of, t->u.param_struct.param[i]);
1966 output_mangled_typename (of, t->u.param_struct.stru);
1974 /* Print PARAM to D->OF processing escapes. D->VAL references the
1975 current object, D->PREV_VAL the object containing the current
1976 object, ONAME is the name of the option and D->LINE is used to
1977 print error messages. */
1980 output_escaped_param (struct walk_type_data *d, const char *param,
1985 for (p = param; *p; p++)
1987 oprintf (d->of, "%c", *p);
1991 oprintf (d->of, "(%s)", d->prev_val[2]);
1994 oprintf (d->of, "(%s)", d->prev_val[0]);
1997 oprintf (d->of, "(%s)", d->prev_val[1]);
2001 const char *pp = d->val + strlen (d->val);
2002 while (pp[-1] == ']')
2005 oprintf (d->of, "%s", pp);
2009 error_at_line (d->line, "`%s' option contains bad escape %c%c",
2014 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2015 which is of type T. Write code to D->OF to constrain execution (at
2016 the point that D->PROCESS_FIELD is called) to the appropriate
2017 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2018 pointers to those objects. D->PREV_VAL lists the objects
2019 containing the current object, D->OPT is a list of options to
2020 apply, D->INDENT is the current indentation level, D->LINE is used
2021 to print error messages, D->BITMAP indicates which languages to
2022 print the structure for, and D->PARAM is the current parameter
2023 (from an enclosing param_is option). */
2026 walk_type (type_p t, struct walk_type_data *d)
2028 const char *length = NULL;
2029 const char *desc = NULL;
2030 int maybe_undef_p = 0;
2031 int use_param_num = -1;
2032 int use_params_p = 0;
2034 const struct nested_ptr_data *nested_ptr_d = NULL;
2036 d->needs_cast_p = false;
2037 for (oo = d->opt; oo; oo = oo->next)
2038 if (strcmp (oo->name, "length") == 0)
2040 else if (strcmp (oo->name, "maybe_undef") == 0)
2042 else if (strncmp (oo->name, "use_param", 9) == 0
2043 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2044 use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
2045 else if (strcmp (oo->name, "use_params") == 0)
2047 else if (strcmp (oo->name, "desc") == 0)
2049 else if (strcmp (oo->name, "mark_hook") == 0)
2051 else if (strcmp (oo->name, "nested_ptr") == 0)
2052 nested_ptr_d = (const struct nested_ptr_data *) oo->info;
2053 else if (strcmp (oo->name, "dot") == 0)
2055 else if (strcmp (oo->name, "tag") == 0)
2057 else if (strcmp (oo->name, "special") == 0)
2059 else if (strcmp (oo->name, "skip") == 0)
2061 else if (strcmp (oo->name, "default") == 0)
2063 else if (strcmp (oo->name, "descbits") == 0)
2065 else if (strcmp (oo->name, "param_is") == 0)
2067 else if (strncmp (oo->name, "param", 5) == 0
2068 && ISDIGIT (oo->name[5])
2069 && strcmp (oo->name + 6, "_is") == 0)
2071 else if (strcmp (oo->name, "chain_next") == 0)
2073 else if (strcmp (oo->name, "chain_prev") == 0)
2075 else if (strcmp (oo->name, "chain_circular") == 0)
2077 else if (strcmp (oo->name, "reorder") == 0)
2080 error_at_line (d->line, "unknown option `%s'\n", oo->name);
2087 int pointer_p = t->kind == TYPE_POINTER;
2091 if (! UNION_OR_STRUCT_P (t))
2092 error_at_line (d->line, "`use_params' option on unimplemented type");
2094 t = find_param_structure (t, d->param);
2096 t = create_pointer (t);
2099 if (use_param_num != -1)
2101 if (d->param != NULL && d->param[use_param_num] != NULL)
2103 type_p nt = d->param[use_param_num];
2105 if (t->kind == TYPE_ARRAY)
2106 nt = create_array (nt, t->u.a.len);
2107 else if (length != NULL && t->kind == TYPE_POINTER)
2108 nt = create_pointer (nt);
2109 d->needs_cast_p = (t->kind != TYPE_POINTER
2110 && (nt->kind == TYPE_POINTER
2111 || nt->kind == TYPE_STRING));
2115 error_at_line (d->line, "no parameter defined for `%s'",
2120 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
2122 error_at_line (d->line,
2123 "field `%s' has invalid option `maybe_undef_p'\n",
2132 d->process_field (t, d);
2138 && t->u.p->u.s.line.file == NULL)
2140 oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
2146 if (! UNION_OR_STRUCT_P (t->u.p)
2147 && t->u.p->kind != TYPE_PARAM_STRUCT)
2149 error_at_line (d->line,
2150 "field `%s' is pointer to unimplemented type",
2157 const char *oldprevval2 = d->prev_val[2];
2159 if (! UNION_OR_STRUCT_P (nested_ptr_d->type))
2161 error_at_line (d->line,
2162 "field `%s' has invalid "
2163 "option `nested_ptr'\n",
2168 d->prev_val[2] = d->val;
2169 oprintf (d->of, "%*s{\n", d->indent, "");
2171 d->val = xasprintf ("x%d", d->counter++);
2172 oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "",
2173 (nested_ptr_d->type->kind == TYPE_UNION
2174 ? "union" : "struct"),
2175 nested_ptr_d->type->u.s.tag,
2176 d->fn_wants_lvalue ? "" : "const ",
2178 oprintf (d->of, "%*s", d->indent + 2, "");
2179 output_escaped_param (d, nested_ptr_d->convert_from,
2181 oprintf (d->of, ";\n");
2183 d->process_field (nested_ptr_d->type, d);
2185 if (d->fn_wants_lvalue)
2187 oprintf (d->of, "%*s%s = ", d->indent, "",
2189 d->prev_val[2] = d->val;
2190 output_escaped_param (d, nested_ptr_d->convert_to,
2192 oprintf (d->of, ";\n");
2196 oprintf (d->of, "%*s}\n", d->indent, "");
2197 d->val = d->prev_val[2];
2198 d->prev_val[2] = oldprevval2;
2201 d->process_field (t->u.p, d);
2205 int loopcounter = d->counter++;
2206 const char *oldval = d->val;
2207 const char *oldprevval3 = d->prev_val[3];
2210 oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2212 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2213 oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent, "",
2214 loopcounter, loopcounter);
2215 output_escaped_param (d, length, "length");
2216 oprintf (d->of, "); i%d++) {\n", loopcounter);
2218 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2220 d->prev_val[3] = oldval;
2221 walk_type (t->u.p, d);
2224 d->prev_val[3] = oldprevval3;
2227 oprintf (d->of, "%*s}\n", d->indent, "");
2228 d->process_field(t, d);
2230 oprintf (d->of, "%*s}\n", d->indent, "");
2237 int loopcounter = d->counter++;
2238 const char *oldval = d->val;
2241 /* If it's an array of scalars, we optimize by not generating
2243 if (t->u.a.p->kind == TYPE_SCALAR)
2246 /* When walking an array, compute the length and store it in a
2247 local variable before walking the array elements, instead of
2248 recomputing the length expression each time through the loop.
2249 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2250 where the length is stored in the first array element,
2251 because otherwise that operand can get overwritten on the
2253 oprintf (d->of, "%*s{\n", d->indent, "");
2255 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2256 oprintf (d->of, "%*ssize_t l%d = (size_t)(",
2257 d->indent, "", loopcounter);
2259 output_escaped_param (d, length, "length");
2261 oprintf (d->of, "%s", t->u.a.len);
2262 oprintf (d->of, ");\n");
2264 oprintf (d->of, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2266 loopcounter, loopcounter, loopcounter, loopcounter);
2268 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2270 walk_type (t->u.a.p, d);
2275 oprintf (d->of, "%*s}\n", d->indent, "");
2277 oprintf (d->of, "%*s}\n", d->indent, "");
2285 const char *oldval = d->val;
2286 const char *oldprevval1 = d->prev_val[1];
2287 const char *oldprevval2 = d->prev_val[2];
2288 const int union_p = t->kind == TYPE_UNION;
2289 int seen_default_p = 0;
2292 if (! t->u.s.line.file)
2293 error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
2295 if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
2297 error_at_line (d->line,
2298 "structure `%s' defined for mismatching languages",
2300 error_at_line (&t->u.s.line, "one structure defined here");
2303 /* Some things may also be defined in the structure's options. */
2304 for (o = t->u.s.opt; o; o = o->next)
2305 if (! desc && strcmp (o->name, "desc") == 0)
2308 d->prev_val[2] = oldval;
2309 d->prev_val[1] = oldprevval2;
2314 error_at_line (d->line, "missing `desc' option for union `%s'",
2318 oprintf (d->of, "%*sswitch (", d->indent, "");
2319 output_escaped_param (d, desc, "desc");
2320 oprintf (d->of, ")\n");
2322 oprintf (d->of, "%*s{\n", d->indent, "");
2324 for (f = t->u.s.fields; f; f = f->next)
2327 const char *dot = ".";
2328 const char *tagid = NULL;
2331 int use_param_p = 0;
2334 d->reorder_fn = NULL;
2335 for (oo = f->opt; oo; oo = oo->next)
2336 if (strcmp (oo->name, "dot") == 0)
2338 else if (strcmp (oo->name, "tag") == 0)
2340 else if (strcmp (oo->name, "skip") == 0)
2342 else if (strcmp (oo->name, "default") == 0)
2344 else if (strcmp (oo->name, "reorder") == 0)
2345 d->reorder_fn = oo->info;
2346 else if (strncmp (oo->name, "use_param", 9) == 0
2347 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2353 if (union_p && tagid)
2355 oprintf (d->of, "%*scase %s:\n", d->indent, "", tagid);
2358 else if (union_p && default_p)
2360 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2364 else if (! union_p && (default_p || tagid))
2365 error_at_line (d->line,
2366 "can't use `%s' outside a union on field `%s'",
2367 default_p ? "default" : "tag", f->name);
2368 else if (union_p && ! (default_p || tagid)
2369 && f->type->kind == TYPE_SCALAR)
2372 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2373 d->line->file, d->line->line, f->name);
2376 else if (union_p && ! (default_p || tagid))
2377 error_at_line (d->line,
2378 "field `%s' is missing `tag' or `default' option",
2382 d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name);
2384 d->used_length = false;
2386 if (union_p && use_param_p && d->param == NULL)
2387 oprintf (d->of, "%*sgcc_unreachable ();\n", d->indent, "");
2389 walk_type (f->type, d);
2395 oprintf (d->of, "%*sbreak;\n", d->indent, "");
2399 d->reorder_fn = NULL;
2402 d->prev_val[1] = oldprevval1;
2403 d->prev_val[2] = oldprevval2;
2405 if (union_p && ! seen_default_p)
2407 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2408 oprintf (d->of, "%*s break;\n", d->indent, "");
2412 oprintf (d->of, "%*s}\n", d->indent, "");
2418 case TYPE_LANG_STRUCT:
2421 for (nt = t->u.s.lang_struct; nt; nt = nt->next)
2422 if ((d->bitmap & nt->u.s.bitmap) == d->bitmap)
2425 error_at_line (d->line, "structure `%s' differs between languages",
2432 case TYPE_PARAM_STRUCT:
2434 type_p *oldparam = d->param;
2436 d->param = t->u.param_struct.param;
2437 walk_type (t->u.param_struct.stru, d);
2438 d->param = oldparam;
2447 /* process_field routine for marking routines. */
2450 write_types_process_field (type_p f, const struct walk_type_data *d)
2452 const struct write_types_data *wtd;
2453 const char *cast = d->needs_cast_p ? "(void *)" : "";
2454 wtd = (const struct write_types_data *) d->cookie;
2459 oprintf (d->of, "%*s%s (%s%s", d->indent, "",
2460 wtd->subfield_marker_routine, cast, d->val);
2461 if (wtd->param_prefix)
2463 oprintf (d->of, ", %s", d->prev_val[3]);
2466 oprintf (d->of, ", gt_%s_", wtd->param_prefix);
2467 output_mangled_typename (d->of, d->orig_s);
2470 oprintf (d->of, ", gt_%sa_%s", wtd->param_prefix, d->prev_val[0]);
2472 if (f->u.p->kind == TYPE_PARAM_STRUCT
2473 && f->u.p->u.s.line.file != NULL)
2475 oprintf (d->of, ", gt_e_");
2476 output_mangled_typename (d->of, f);
2478 else if (UNION_OR_STRUCT_P (f)
2479 && f->u.p->u.s.line.file != NULL)
2481 oprintf (d->of, ", gt_ggc_e_");
2482 output_mangled_typename (d->of, f);
2485 oprintf (d->of, ", gt_types_enum_last");
2487 oprintf (d->of, ");\n");
2488 if (d->reorder_fn && wtd->reorder_note_routine)
2489 oprintf (d->of, "%*s%s (%s%s, %s, %s);\n", d->indent, "",
2490 wtd->reorder_note_routine, cast, d->val,
2491 d->prev_val[3], d->reorder_fn);
2497 case TYPE_LANG_STRUCT:
2498 case TYPE_PARAM_STRUCT:
2499 oprintf (d->of, "%*sgt_%s_", d->indent, "", wtd->prefix);
2500 output_mangled_typename (d->of, f);
2501 oprintf (d->of, " (%s%s);\n", cast, d->val);
2502 if (d->reorder_fn && wtd->reorder_note_routine)
2503 oprintf (d->of, "%*s%s (%s%s, %s%s, %s);\n", d->indent, "",
2504 wtd->reorder_note_routine, cast, d->val, cast, d->val,
2516 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
2519 output_type_enum (outf_p of, type_p s)
2521 if (s->kind == TYPE_PARAM_STRUCT && s->u.s.line.file != NULL)
2523 oprintf (of, ", gt_e_");
2524 output_mangled_typename (of, s);
2526 else if (UNION_OR_STRUCT_P (s) && s->u.s.line.file != NULL)
2528 oprintf (of, ", gt_ggc_e_");
2529 output_mangled_typename (of, s);
2532 oprintf (of, ", gt_types_enum_last");
2535 /* For S, a structure that's part of ORIG_S, and using parameters
2536 PARAM, write out a routine that:
2537 - Takes a parameter, a void * but actually of type *S
2538 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2539 field of S or its substructures and (in some cases) things
2540 that are pointed to by S.
2544 write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2545 const struct write_types_data *wtd)
2547 const char *fn = s->u.s.line.file;
2549 const char *chain_next = NULL;
2550 const char *chain_prev = NULL;
2551 const char *chain_circular = NULL;
2552 const char *mark_hook_name = NULL;
2554 struct walk_type_data d;
2556 /* This is a hack, and not the good kind either. */
2557 for (i = NUM_PARAM - 1; i >= 0; i--)
2558 if (param && param[i] && param[i]->kind == TYPE_POINTER
2559 && UNION_OR_STRUCT_P (param[i]->u.p))
2560 fn = param[i]->u.p->u.s.line.file;
2562 memset (&d, 0, sizeof (d));
2563 d.of = get_output_file_with_visibility (fn);
2565 for (opt = s->u.s.opt; opt; opt = opt->next)
2566 if (strcmp (opt->name, "chain_next") == 0)
2567 chain_next = opt->info;
2568 else if (strcmp (opt->name, "chain_prev") == 0)
2569 chain_prev = opt->info;
2570 else if (strcmp (opt->name, "chain_circular") == 0)
2571 chain_circular = opt->info;
2572 else if (strcmp (opt->name, "mark_hook") == 0)
2573 mark_hook_name = opt->info;
2575 if (chain_prev != NULL && chain_next == NULL)
2576 error_at_line (&s->u.s.line, "chain_prev without chain_next");
2577 if (chain_circular != NULL && chain_next != NULL)
2578 error_at_line (&s->u.s.line, "chain_circular with chain_next");
2579 if (chain_circular != NULL)
2580 chain_next = chain_circular;
2582 d.process_field = write_types_process_field;
2586 d.line = &s->u.s.line;
2587 d.bitmap = s->u.s.bitmap;
2589 d.prev_val[0] = "*x";
2590 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2591 d.prev_val[3] = "x";
2594 oprintf (d.of, "\n");
2595 oprintf (d.of, "void\n");
2597 oprintf (d.of, "gt_%sx_%s", wtd->prefix, orig_s->u.s.tag);
2600 oprintf (d.of, "gt_%s_", wtd->prefix);
2601 output_mangled_typename (d.of, orig_s);
2603 oprintf (d.of, " (void *x_p)\n");
2604 oprintf (d.of, "{\n");
2605 oprintf (d.of, " %s %s * %sx = (%s %s *)x_p;\n",
2606 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2607 chain_next == NULL ? "const " : "",
2608 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2609 if (chain_next != NULL)
2610 oprintf (d.of, " %s %s * xlimit = x;\n",
2611 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2612 if (chain_next == NULL)
2614 oprintf (d.of, " if (%s (x", wtd->marker_routine);
2615 if (wtd->param_prefix)
2617 oprintf (d.of, ", x, gt_%s_", wtd->param_prefix);
2618 output_mangled_typename (d.of, orig_s);
2619 output_type_enum (d.of, orig_s);
2621 oprintf (d.of, "))\n");
2625 if (chain_circular != NULL)
2626 oprintf (d.of, " if (!%s (xlimit", wtd->marker_routine);
2628 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2629 if (wtd->param_prefix)
2631 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2632 output_mangled_typename (d.of, orig_s);
2633 output_type_enum (d.of, orig_s);
2635 oprintf (d.of, "))\n");
2636 if (chain_circular != NULL)
2637 oprintf (d.of, " return;\n do\n");
2638 if (mark_hook_name && !wtd->skip_hooks)
2640 oprintf (d.of, " {\n");
2641 oprintf (d.of, " %s (xlimit);\n ", mark_hook_name);
2643 oprintf (d.of, " xlimit = (");
2644 d.prev_val[2] = "*xlimit";
2645 output_escaped_param (&d, chain_next, "chain_next");
2646 oprintf (d.of, ");\n");
2647 if (mark_hook_name && !wtd->skip_hooks)
2648 oprintf (d.of, " }\n");
2649 if (chain_prev != NULL)
2651 oprintf (d.of, " if (x != xlimit)\n");
2652 oprintf (d.of, " for (;;)\n");
2653 oprintf (d.of, " {\n");
2654 oprintf (d.of, " %s %s * const xprev = (",
2655 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2657 d.prev_val[2] = "*x";
2658 output_escaped_param (&d, chain_prev, "chain_prev");
2659 oprintf (d.of, ");\n");
2660 oprintf (d.of, " if (xprev == NULL) break;\n");
2661 oprintf (d.of, " x = xprev;\n");
2662 oprintf (d.of, " (void) %s (xprev",
2663 wtd->marker_routine);
2664 if (wtd->param_prefix)
2666 oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
2667 output_mangled_typename (d.of, orig_s);
2668 output_type_enum (d.of, orig_s);
2670 oprintf (d.of, ");\n");
2671 oprintf (d.of, " }\n");
2673 if (chain_circular != NULL)
2675 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2676 if (wtd->param_prefix)
2678 oprintf (d.of, ", xlimit, 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 if (mark_hook_name && !wtd->skip_hooks)
2684 oprintf (d.of, " %s (xlimit);\n", mark_hook_name);
2685 oprintf (d.of, " do\n");
2688 oprintf (d.of, " while (x != xlimit)\n");
2690 oprintf (d.of, " {\n");
2691 if (mark_hook_name && chain_next == NULL && !wtd->skip_hooks)
2693 oprintf (d.of, " %s (x);\n", mark_hook_name);
2695 d.prev_val[2] = "*x";
2699 if (chain_next != NULL)
2701 oprintf (d.of, " x = (");
2702 output_escaped_param (&d, chain_next, "chain_next");
2703 oprintf (d.of, ");\n");
2706 oprintf (d.of, " }\n");
2707 if (chain_circular != NULL)
2708 oprintf (d.of, " while (x != xlimit);\n");
2709 oprintf (d.of, "}\n");
2712 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
2715 write_types (outf_p output_header, type_p structures, type_p param_structs,
2716 const struct write_types_data *wtd)
2720 oprintf (output_header, "\n/* %s*/\n", wtd->comment);
2721 /* We first emit the macros and the declarations. Functions' code is
2722 emitted afterwards. This is needed in plugin mode. */
2723 oprintf (output_header, "/* macros and declarations */\n");
2724 for (s = structures; s; s = s->next)
2725 if (s->gc_used == GC_POINTED_TO
2726 || s->gc_used == GC_MAYBE_POINTED_TO)
2730 if (s->gc_used == GC_MAYBE_POINTED_TO
2731 && s->u.s.line.file == NULL)
2734 oprintf (output_header, "#define gt_%s_", wtd->prefix);
2735 output_mangled_typename (output_header, s);
2736 oprintf (output_header, "(X) do { \\\n");
2737 oprintf (output_header,
2738 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
2740 oprintf (output_header,
2743 for (opt = s->u.s.opt; opt; opt = opt->next)
2744 if (strcmp (opt->name, "ptr_alias") == 0)
2746 const_type_p const t = (const_type_p) opt->info;
2747 if (t->kind == TYPE_STRUCT
2748 || t->kind == TYPE_UNION
2749 || t->kind == TYPE_LANG_STRUCT)
2750 oprintf (output_header,
2751 "#define gt_%sx_%s gt_%sx_%s\n",
2752 wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
2754 error_at_line (&s->u.s.line,
2755 "structure alias is not a structure");
2761 /* Declare the marker procedure only once. */
2762 oprintf (output_header,
2763 "extern void gt_%sx_%s (void *);\n",
2764 wtd->prefix, s->u.s.tag);
2766 if (s->u.s.line.file == NULL)
2768 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2774 for (s = param_structs; s; s = s->next)
2775 if (s->gc_used == GC_POINTED_TO)
2777 type_p stru = s->u.param_struct.stru;
2779 /* Declare the marker procedure. */
2780 oprintf (output_header, "extern void gt_%s_", wtd->prefix);
2781 output_mangled_typename (output_header, s);
2782 oprintf (output_header, " (void *);\n");
2784 if (stru->u.s.line.file == NULL)
2786 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2792 /* At last we emit the functions code. */
2793 oprintf (output_header, "\n/* functions code */\n");
2794 for (s = structures; s; s = s->next)
2795 if (s->gc_used == GC_POINTED_TO
2796 || s->gc_used == GC_MAYBE_POINTED_TO)
2800 if (s->gc_used == GC_MAYBE_POINTED_TO
2801 && s->u.s.line.file == NULL)
2803 for (opt = s->u.s.opt; opt; opt = opt->next)
2804 if (strcmp (opt->name, "ptr_alias") == 0)
2809 if (s->kind == TYPE_LANG_STRUCT)
2812 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2813 write_func_for_structure (s, ss, NULL, wtd);
2816 write_func_for_structure (s, s, NULL, wtd);
2818 for (s = param_structs; s; s = s->next)
2819 if (s->gc_used == GC_POINTED_TO)
2821 type_p *param = s->u.param_struct.param;
2822 type_p stru = s->u.param_struct.stru;
2823 if (stru->u.s.line.file == NULL)
2825 if (stru->kind == TYPE_LANG_STRUCT)
2828 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
2829 write_func_for_structure (s, ss, param, wtd);
2832 write_func_for_structure (s, stru, param, wtd);
2836 static const struct write_types_data ggc_wtd =
2838 "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
2839 "GC marker procedures. ",
2843 static const struct write_types_data pch_wtd =
2845 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
2846 "gt_pch_note_reorder",
2847 "PCH type-walking procedures. ",
2851 /* Write out the local pointer-walking routines. */
2853 /* process_field routine for local pointer-walking. */
2856 write_types_local_process_field (type_p f, const struct walk_type_data *d)
2863 case TYPE_LANG_STRUCT:
2864 case TYPE_PARAM_STRUCT:
2866 oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "",
2868 oprintf (d->of, "%*s op (&(%s), cookie);\n", d->indent, "", d->val);
2879 /* For S, a structure that's part of ORIG_S, and using parameters
2880 PARAM, write out a routine that:
2881 - Is of type gt_note_pointers
2882 - Calls PROCESS_FIELD on each field of S or its substructures.
2886 write_local_func_for_structure (type_p orig_s, type_p s, type_p *param)
2888 const char *fn = s->u.s.line.file;
2890 struct walk_type_data d;
2892 /* This is a hack, and not the good kind either. */
2893 for (i = NUM_PARAM - 1; i >= 0; i--)
2894 if (param && param[i] && param[i]->kind == TYPE_POINTER
2895 && UNION_OR_STRUCT_P (param[i]->u.p))
2896 fn = param[i]->u.p->u.s.line.file;
2898 memset (&d, 0, sizeof (d));
2899 d.of = get_output_file_with_visibility (fn);
2900 d.process_field = write_types_local_process_field;
2902 d.line = &s->u.s.line;
2903 d.bitmap = s->u.s.bitmap;
2905 d.prev_val[0] = d.prev_val[2] = "*x";
2906 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2907 d.prev_val[3] = "x";
2909 d.fn_wants_lvalue = true;
2911 oprintf (d.of, "\n");
2912 oprintf (d.of, "void\n");
2913 oprintf (d.of, "gt_pch_p_");
2914 output_mangled_typename (d.of, orig_s);
2915 oprintf (d.of, " (ATTRIBUTE_UNUSED void *this_obj,\n"
2917 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
2918 "\tATTRIBUTE_UNUSED void *cookie)\n");
2919 oprintf (d.of, "{\n");
2920 oprintf (d.of, " %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
2921 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2922 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2925 oprintf (d.of, "}\n");
2928 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
2931 write_local (outf_p output_header, type_p structures, type_p param_structs)
2937 oprintf (output_header, "\n/* Local pointer-walking routines. */\n");
2938 for (s = structures; s; s = s->next)
2939 if (s->gc_used == GC_POINTED_TO
2940 || s->gc_used == GC_MAYBE_POINTED_TO)
2944 if (s->u.s.line.file == NULL)
2947 for (opt = s->u.s.opt; opt; opt = opt->next)
2948 if (strcmp (opt->name, "ptr_alias") == 0)
2950 const_type_p const t = (const_type_p) opt->info;
2951 if (t->kind == TYPE_STRUCT
2952 || t->kind == TYPE_UNION
2953 || t->kind == TYPE_LANG_STRUCT)
2955 oprintf (output_header, "#define gt_pch_p_");
2956 output_mangled_typename (output_header, s);
2957 oprintf (output_header, " gt_pch_p_");
2958 output_mangled_typename (output_header, t);
2959 oprintf (output_header, "\n");
2962 error_at_line (&s->u.s.line,
2963 "structure alias is not a structure");
2969 /* Declare the marker procedure only once. */
2970 oprintf (output_header, "extern void gt_pch_p_");
2971 output_mangled_typename (output_header, s);
2972 oprintf (output_header,
2973 "\n (void *, void *, gt_pointer_operator, void *);\n");
2975 if (s->kind == TYPE_LANG_STRUCT)
2978 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2979 write_local_func_for_structure (s, ss, NULL);
2982 write_local_func_for_structure (s, s, NULL);
2985 for (s = param_structs; s; s = s->next)
2986 if (s->gc_used == GC_POINTED_TO)
2988 type_p * param = s->u.param_struct.param;
2989 type_p stru = s->u.param_struct.stru;
2991 /* Declare the marker procedure. */
2992 oprintf (output_header, "extern void gt_pch_p_");
2993 output_mangled_typename (output_header, s);
2994 oprintf (output_header,
2995 "\n (void *, void *, gt_pointer_operator, void *);\n");
2997 if (stru->u.s.line.file == NULL)
2999 fprintf (stderr, "warning: structure `%s' used but not defined\n",
3004 if (stru->kind == TYPE_LANG_STRUCT)
3007 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3008 write_local_func_for_structure (s, ss, param);
3011 write_local_func_for_structure (s, stru, param);
3015 /* Write out the 'enum' definition for gt_types_enum. */
3018 write_enum_defn (type_p structures, type_p param_structs)
3024 oprintf (header_file, "\n/* Enumeration of types known. */\n");
3025 oprintf (header_file, "enum gt_types_enum {\n");
3026 for (s = structures; s; s = s->next)
3027 if (s->gc_used == GC_POINTED_TO
3028 || s->gc_used == GC_MAYBE_POINTED_TO)
3030 if (s->gc_used == GC_MAYBE_POINTED_TO
3031 && s->u.s.line.file == NULL)
3034 oprintf (header_file, " gt_ggc_e_");
3035 output_mangled_typename (header_file, s);
3036 oprintf (header_file, ", \n");
3038 for (s = param_structs; s; s = s->next)
3039 if (s->gc_used == GC_POINTED_TO)
3041 oprintf (header_file, " gt_e_");
3042 output_mangled_typename (header_file, s);
3043 oprintf (header_file, ", \n");
3045 oprintf (header_file, " gt_types_enum_last\n");
3046 oprintf (header_file, "};\n");
3049 /* Might T contain any non-pointer elements? */
3052 contains_scalar_p (type_p t)
3060 return contains_scalar_p (t->u.a.p);
3062 /* Could also check for structures that have no non-pointer
3063 fields, but there aren't enough of those to worry about. */
3068 /* Mangle FN and print it to F. */
3071 put_mangled_filename (outf_p f, const char *fn)
3073 const char *name = get_output_file_name (fn);
3076 for (; *name != 0; name++)
3077 if (ISALNUM (*name))
3078 oprintf (f, "%c", *name);
3080 oprintf (f, "%c", '_');
3083 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
3084 LASTNAME, and NAME are all strings to insert in various places in
3085 the resulting code. */
3088 finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
3089 const char *tname, const char *name)
3093 for (fli2 = flp; fli2; fli2 = fli2->next)
3094 if (fli2->started_p)
3096 oprintf (fli2->f, " %s\n", lastname);
3097 oprintf (fli2->f, "};\n\n");
3100 for (fli2 = flp; fli2 && base_files; fli2 = fli2->next)
3101 if (fli2->started_p)
3103 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3106 for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3109 oprintf (base_files[fnum],
3110 "extern const struct %s gt_%s_",
3112 put_mangled_filename (base_files[fnum], fli2->name);
3113 oprintf (base_files[fnum], "[];\n");
3119 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3120 oprintf (base_files [fnum],
3121 "EXPORTED_CONST struct %s * const %s[] = {\n",
3126 for (fli2 = flp; fli2; fli2 = fli2->next)
3127 if (fli2->started_p)
3129 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3132 fli2->started_p = 0;
3134 for (fnum = 0; base_files && bitmap != 0; fnum++, bitmap >>= 1)
3137 oprintf (base_files[fnum], " gt_%s_", pfx);
3138 put_mangled_filename (base_files[fnum], fli2->name);
3139 oprintf (base_files[fnum], ",\n");
3145 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3147 oprintf (base_files[fnum], " NULL\n");
3148 oprintf (base_files[fnum], "};\n");
3153 /* Write out to F the table entry and any marker routines needed to
3154 mark NAME as TYPE. The original variable is V, at LINE.
3155 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
3156 is nonzero iff we are building the root table for hash table caches. */
3159 write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
3160 struct fileloc *line, const char *if_marked, bool emit_pch)
3167 for (fld = type->u.s.fields; fld; fld = fld->next)
3170 const char *desc = NULL;
3173 for (o = fld->opt; o; o = o->next)
3174 if (strcmp (o->name, "skip") == 0)
3176 else if (strcmp (o->name, "desc") == 0)
3178 else if (strcmp (o->name, "param_is") == 0)
3181 error_at_line (line,
3182 "field `%s' of global `%s' has unknown option `%s'",
3183 fld->name, name, o->name);
3187 else if (desc && fld->type->kind == TYPE_UNION)
3189 pair_p validf = NULL;
3192 for (ufld = fld->type->u.s.fields; ufld; ufld = ufld->next)
3194 const char *tag = NULL;
3197 for (oo = ufld->opt; oo; oo = oo->next)
3198 if (strcmp (oo->name, "tag") == 0)
3200 if (tag == NULL || strcmp (tag, desc) != 0)
3203 error_at_line (line,
3204 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3205 name, fld->name, validf->name,
3206 name, fld->name, ufld->name,
3213 newname = xasprintf ("%s.%s.%s",
3214 name, fld->name, validf->name);
3215 write_root (f, v, validf->type, newname, 0, line,
3216 if_marked, emit_pch);
3221 error_at_line (line,
3222 "global `%s.%s' has `desc' option but is not union",
3227 newname = xasprintf ("%s.%s", name, fld->name);
3228 write_root (f, v, fld->type, newname, 0, line, if_marked,
3239 newname = xasprintf ("%s[0]", name);
3240 write_root (f, v, type->u.a.p, newname, has_length, line, if_marked,
3250 oprintf (f, " {\n");
3251 oprintf (f, " &%s,\n", name);
3254 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3256 oprintf (f, " * (%s)", ap->u.a.len);
3257 else if (ap == v->type)
3258 oprintf (f, " * ARRAY_SIZE (%s)", v->name);
3260 oprintf (f, " sizeof (%s", v->name);
3261 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3263 oprintf (f, "),\n");
3267 if (! has_length && UNION_OR_STRUCT_P (tp))
3269 oprintf (f, " >_ggc_mx_%s,\n", tp->u.s.tag);
3271 oprintf (f, " >_pch_nx_%s", tp->u.s.tag);
3273 oprintf (f, " NULL");
3275 else if (! has_length && tp->kind == TYPE_PARAM_STRUCT)
3277 oprintf (f, " >_ggc_m_");
3278 output_mangled_typename (f, tp);
3281 oprintf (f, ",\n >_pch_n_");
3282 output_mangled_typename (f, tp);
3285 oprintf (f, ",\n NULL");
3288 && (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
3290 oprintf (f, " >_ggc_ma_%s,\n", name);
3292 oprintf (f, " >_pch_na_%s", name);
3294 oprintf (f, " NULL");
3298 error_at_line (line,
3299 "global `%s' is pointer to unimplemented type",
3303 oprintf (f, ",\n &%s", if_marked);
3304 oprintf (f, "\n },\n");
3310 oprintf (f, " {\n");
3311 oprintf (f, " &%s,\n", name);
3312 oprintf (f, " 1, \n");
3313 oprintf (f, " sizeof (%s),\n", v->name);
3314 oprintf (f, " (gt_pointer_walker) >_ggc_m_S,\n");
3315 oprintf (f, " (gt_pointer_walker) >_pch_n_S\n");
3316 oprintf (f, " },\n");
3324 error_at_line (line,
3325 "global `%s' is unimplemented type",
3330 /* This generates a routine to walk an array. */
3333 write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
3335 struct walk_type_data d;
3338 memset (&d, 0, sizeof (d));
3344 d.bitmap = get_lang_bitmap (v->line.file);
3347 d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name);
3349 if (wtd->param_prefix)
3351 oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
3353 " (void *, void *, gt_pointer_operator, void *);\n");
3354 oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3355 wtd->param_prefix, v->name);
3357 " ATTRIBUTE_UNUSED void *x_p,\n"
3358 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3359 " ATTRIBUTE_UNUSED void * cookie)\n");
3360 oprintf (d.of, "{\n");
3361 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3362 d.process_field = write_types_local_process_field;
3363 walk_type (v->type, &d);
3364 oprintf (f, "}\n\n");
3368 oprintf (f, "static void gt_%sa_%s (void *);\n",
3369 wtd->prefix, v->name);
3370 oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3371 wtd->prefix, v->name);
3373 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3374 d.process_field = write_types_process_field;
3375 walk_type (v->type, &d);
3377 oprintf (f, "}\n\n");
3380 /* Output a table describing the locations and types of VARIABLES. */
3383 write_roots (pair_p variables, bool emit_pch)
3386 struct flist *flp = NULL;
3388 for (v = variables; v; v = v->next)
3390 outf_p f = get_output_file_with_visibility (v->line.file);
3392 const char *length = NULL;
3393 int deletable_p = 0;
3396 for (o = v->opt; o; o = o->next)
3397 if (strcmp (o->name, "length") == 0)
3399 else if (strcmp (o->name, "deletable") == 0)
3401 else if (strcmp (o->name, "param_is") == 0)
3403 else if (strncmp (o->name, "param", 5) == 0
3404 && ISDIGIT (o->name[5])
3405 && strcmp (o->name + 6, "_is") == 0)
3407 else if (strcmp (o->name, "if_marked") == 0)
3410 error_at_line (&v->line,
3411 "global `%s' has unknown option `%s'",
3414 for (fli = flp; fli; fli = fli->next)
3415 if (fli->f == f && f)
3419 fli = XNEW (struct flist);
3423 fli->name = v->line.file;
3424 gcc_assert(fli->name);
3427 oprintf (f, "\n/* GC roots. */\n\n");
3432 && v->type->kind == TYPE_POINTER
3433 && (v->type->u.p->kind == TYPE_POINTER
3434 || v->type->u.p->kind == TYPE_STRUCT))
3436 write_array (f, v, &ggc_wtd);
3437 write_array (f, v, &pch_wtd);
3441 for (v = variables; v; v = v->next)
3443 outf_p f = get_output_file_with_visibility (v->line.file);
3449 for (o = v->opt; o; o = o->next)
3450 if (strcmp (o->name, "length") == 0)
3452 else if (strcmp (o->name, "deletable") == 0
3453 || strcmp (o->name, "if_marked") == 0)
3459 for (fli = flp; fli; fli = fli->next)
3462 if (! fli->started_p)
3466 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
3467 put_mangled_filename (f, v->line.file);
3468 oprintf (f, "[] = {\n");
3471 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3474 finish_root_table (flp, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3477 for (v = variables; v; v = v->next)
3479 outf_p f = get_output_file_with_visibility (v->line.file);
3484 for (o = v->opt; o; o = o->next)
3485 if (strcmp (o->name, "deletable") == 0)
3487 else if (strcmp (o->name, "if_marked") == 0)
3493 for (fli = flp; fli; fli = fli->next)
3496 if (! fli->started_p)
3500 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
3501 put_mangled_filename (f, v->line.file);
3502 oprintf (f, "[] = {\n");
3505 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3509 finish_root_table (flp, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3510 "gt_ggc_deletable_rtab");
3512 for (v = variables; v; v = v->next)
3514 outf_p f = get_output_file_with_visibility (v->line.file);
3516 const char *if_marked = NULL;
3520 for (o = v->opt; o; o = o->next)
3521 if (strcmp (o->name, "length") == 0)
3523 else if (strcmp (o->name, "if_marked") == 0)
3524 if_marked = o->info;
3526 if (if_marked == NULL)
3529 if (v->type->kind != TYPE_POINTER
3530 || v->type->u.p->kind != TYPE_PARAM_STRUCT
3531 || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
3533 error_at_line (&v->line, "if_marked option used but not hash table");
3537 for (fli = flp; fli; fli = fli->next)
3540 if (! fli->started_p)
3544 oprintf (f, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
3545 put_mangled_filename (f, v->line.file);
3546 oprintf (f, "[] = {\n");
3549 write_root (f, v, v->type->u.p->u.param_struct.param[0],
3550 v->name, length_p, &v->line, if_marked, emit_pch);
3553 finish_root_table (flp, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
3554 "gt_ggc_cache_rtab");
3559 for (v = variables; v; v = v->next)
3561 outf_p f = get_output_file_with_visibility (v->line.file);
3564 int if_marked_p = 0;
3567 for (o = v->opt; o; o = o->next)
3568 if (strcmp (o->name, "length") == 0)
3570 else if (strcmp (o->name, "if_marked") == 0)
3576 for (fli = flp; fli; fli = fli->next)
3579 if (! fli->started_p)
3583 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
3584 put_mangled_filename (f, v->line.file);
3585 oprintf (f, "[] = {\n");
3588 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3591 finish_root_table (flp, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3592 "gt_pch_cache_rtab");
3594 for (v = variables; v; v = v->next)
3596 outf_p f = get_output_file_with_visibility (v->line.file);
3601 for (o = v->opt; o; o = o->next)
3602 if (strcmp (o->name, "deletable") == 0
3603 || strcmp (o->name, "if_marked") == 0)
3609 if (! contains_scalar_p (v->type))
3612 for (fli = flp; fli; fli = fli->next)
3615 if (! fli->started_p)
3619 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
3620 put_mangled_filename (f, v->line.file);
3621 oprintf (f, "[] = {\n");
3624 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3628 finish_root_table (flp, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3629 "gt_pch_scalar_rtab");
3632 /* Record the definition of a generic VEC structure, as if we had expanded
3633 the macros in vec.h:
3635 typedef struct VEC_<type>_base GTY(()) {
3638 <type> GTY((length ("%h.num"))) vec[1];
3641 where the GTY(()) tags are only present if is_scalar is _false_. */
3644 note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
3649 type_p len_ty = create_scalar_type ("unsigned");
3650 const char *name = concat ("VEC_", type_name, "_base", (char *)0);
3654 t = create_scalar_type (type_name);
3659 t = resolve_typedef (type_name, pos);
3660 o = create_option (0, "length", "%h.num");
3663 /* We assemble the field list in reverse order. */
3664 fields = create_field_at (0, create_array (t, "1"), "vec", o, pos);
3665 fields = create_field_at (fields, len_ty, "alloc", 0, pos);
3666 fields = create_field_at (fields, len_ty, "num", 0, pos);
3668 do_typedef (name, new_structure (name, 0, pos, fields, 0), pos);
3671 /* Record the definition of an allocation-specific VEC structure, as if
3672 we had expanded the macros in vec.h:
3674 typedef struct VEC_<type>_<astrat> {
3675 VEC_<type>_base base;
3676 } VEC_<type>_<astrat>;
3679 note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
3681 const char *astratname = concat ("VEC_", type, "_", astrat, (char *)0);
3682 const char *basename = concat ("VEC_", type, "_base", (char *)0);
3684 pair_p field = create_field_at (0, resolve_typedef (basename, pos),
3687 do_typedef (astratname, new_structure (astratname, 0, pos, field, 0), pos);
3692 main (int argc, char **argv)
3695 static struct fileloc pos = { this_file, 0 };
3696 char* inputlist = 0;
3697 outf_p output_header;
3698 char* plugin_output_filename = NULL;
3699 /* fatal uses this */
3700 progname = "gengtype";
3702 if (argc >= 6 && !strcmp (argv[1], "-P"))
3704 plugin_output_filename = argv[2];
3705 plugin_output = create_file ("GCC", plugin_output_filename);
3707 inputlist = argv[4];
3708 nb_plugin_files = argc - 5;
3709 plugin_files = XCNEWVEC (char *, nb_plugin_files);
3710 for (i = 0; i < nb_plugin_files; i++)
3712 /* Place an all zero lang_bitmap before the plugin file
3714 char *name = argv[i + 5];
3715 int len = strlen(name) + 1 + sizeof (lang_bitmap);
3716 plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap);
3717 strcpy (plugin_files[i], name);
3723 inputlist = argv[2];
3726 fatal ("usage: gengtype [-P pluginout.h] srcdir input-list "
3727 "[file1 file2 ... fileN]");
3729 srcdir_len = strlen (srcdir);
3731 read_input_list (inputlist);
3735 scalar_char.u.scalar_is_char = true;
3736 scalar_nonchar.u.scalar_is_char = false;
3739 /* These types are set up with #define or else outside of where
3741 pos.line = __LINE__ + 1;
3742 do_scalar_typedef ("CUMULATIVE_ARGS", &pos); pos.line++;
3743 do_scalar_typedef ("REAL_VALUE_TYPE", &pos); pos.line++;
3744 do_scalar_typedef ("FIXED_VALUE_TYPE", &pos); pos.line++;
3745 do_scalar_typedef ("double_int", &pos); pos.line++;
3746 do_scalar_typedef ("uint64_t", &pos); pos.line++;
3747 do_scalar_typedef ("uint8", &pos); pos.line++;
3748 do_scalar_typedef ("jword", &pos); pos.line++;
3749 do_scalar_typedef ("JCF_u2", &pos); pos.line++;
3750 do_scalar_typedef ("void", &pos); pos.line++;
3751 do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos);
3753 for (i = 0; i < num_gt_files; i++)
3754 parse_file (gt_files[i]);
3759 set_gc_used (variables);
3762 write_enum_defn (structures, param_structs);
3763 output_header = plugin_output ? plugin_output : header_file;
3764 write_types (output_header, structures, param_structs, &ggc_wtd);
3765 if (plugin_files == NULL)
3767 write_types (header_file, structures, param_structs, &pch_wtd);
3768 write_local (header_file, structures, param_structs);
3770 write_roots (variables, plugin_files == NULL);
3772 close_output_files ();
3776 for (i = 0; i < nb_plugin_files; i++)
3777 free (plugin_files[i] - sizeof (lang_bitmap));
3778 free (plugin_files);