1 /* Process source files and output type information.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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/>. */
23 #include "errors.h" /* for fatal */
25 #include "double-int.h"
26 #include "version.h" /* for version_string & pkgversion_string. */
32 /* Data types, macros, etc. used only in this file. */
35 /* The list of output files. */
38 /* The output header file that is included into pretty much every
43 /* The name of the file containing the list of input files. */
44 static char *inputlist;
46 /* The plugin input files and their number; in that case only
47 a single file is produced. */
48 static input_file **plugin_files;
49 static size_t nb_plugin_files;
51 /* The generated plugin output file and name. */
52 static outf_p plugin_output;
53 static char *plugin_output_filename;
55 /* Our source directory and its length. */
59 /* Variables used for reading and writing the state. */
60 const char *read_state_filename;
61 const char *write_state_filename;
63 /* Variables to help debugging. */
67 /* Level for verbose messages. */
70 /* The backup directory should be in the same file system as the
71 generated files, otherwise the rename(2) system call would fail.
72 If NULL, no backup is made when overwriting a generated file. */
73 static const char* backup_dir; /* (-B) program option. */
76 static outf_p create_file (const char *, const char *);
78 static const char *get_file_basename (const input_file *);
79 static const char *get_file_realbasename (const input_file *);
81 static int get_prefix_langdir_index (const char *);
82 static const char *get_file_langdir (const input_file *);
85 /* Nonzero iff an error has occurred. */
86 bool hit_error = false;
88 static void gen_rtx_next (void);
89 static void write_rtx_next (void);
90 static void open_base_files (void);
91 static void close_output_files (void);
93 /* Report an error at POS, printing MSG. */
96 error_at_line (const struct fileloc *pos, const char *msg, ...)
100 gcc_assert (pos != NULL && pos->file != NULL);
103 fprintf (stderr, "%s:%d: ", get_input_file_name (pos->file), pos->line);
104 vfprintf (stderr, msg, ap);
105 fputc ('\n', stderr);
111 /* asprintf, but produces fatal message on out-of-memory. */
113 xasprintf (const char *format, ...)
119 va_start (ap, format);
120 n = vasprintf (&result, format, ap);
121 if (result == NULL || n < 0)
122 fatal ("out of memory");
128 /* Input file handling. */
130 /* Table of all input files. */
131 const input_file **gt_files;
134 /* A number of places use the name of this "gengtype.c" file for a
135 location for things that we can't rely on the source to define.
136 Make sure we can still use pointer comparison on filenames. */
137 input_file* this_file;
138 /* The "system.h" file is likewise specially useful. */
139 input_file* system_h_file;
141 /* Vector of per-language directories. */
142 const char **lang_dir_names;
143 size_t num_lang_dirs;
145 /* An array of output files suitable for definitions. There is one
146 BASE_FILES entry for each language. */
147 static outf_p *base_files;
152 /* Utility debugging function, printing the various type counts within
153 a list of types. Called thru the DBGPRINT_COUNT_TYPE macro. */
155 dbgprint_count_type_at (const char *fil, int lin, const char *msg, type_p t)
157 int nb_types = 0, nb_scalar = 0, nb_string = 0;
158 int nb_struct = 0, nb_union = 0, nb_array = 0, nb_pointer = 0;
159 int nb_lang_struct = 0, nb_param_struct = 0;
161 for (p = t; p; p = p->next)
184 case TYPE_LANG_STRUCT:
187 case TYPE_PARAM_STRUCT:
194 fprintf (stderr, "\n" "%s:%d: %s: @@%%@@ %d types ::\n",
195 lbasename (fil), lin, msg, nb_types);
196 if (nb_scalar > 0 || nb_string > 0)
197 fprintf (stderr, "@@%%@@ %d scalars, %d strings\n", nb_scalar, nb_string);
198 if (nb_struct > 0 || nb_union > 0)
199 fprintf (stderr, "@@%%@@ %d structs, %d unions\n", nb_struct, nb_union);
200 if (nb_pointer > 0 || nb_array > 0)
201 fprintf (stderr, "@@%%@@ %d pointers, %d arrays\n", nb_pointer, nb_array);
202 if (nb_lang_struct > 0 || nb_param_struct > 0)
203 fprintf (stderr, "@@%%@@ %d lang_structs, %d param_structs\n",
204 nb_lang_struct, nb_param_struct);
205 fprintf (stderr, "\n");
207 #endif /* ENABLE_CHECKING */
209 /* Scan the input file, LIST, and determine how much space we need to
210 store strings in. Also, count the number of language directories
211 and files. The numbers returned are overestimates as they does not
212 consider repeated files. */
214 measure_input_list (FILE *list)
220 num_gt_files = plugin_files ? nb_plugin_files : 0;
221 while ((c = getc (list)) != EOF)
230 /* Add space for a lang_bitmap before the input file name. */
231 n += sizeof (lang_bitmap);
245 /* Read one input line from LIST to HEREP (which is updated). A
246 pointer to the string is returned via LINEP. If it was a language
247 subdirectory in square brackets, strip off the square brackets and
248 return true. Otherwise, leave space before the string for a
249 lang_bitmap, and return false. At EOF, returns false, does not
250 touch *HEREP, and sets *LINEP to NULL. POS is used for
253 read_input_line (FILE *list, char **herep, char **linep, struct fileloc *pos)
259 /* Read over whitespace. */
260 while (c == '\n' || c == ' ')
270 /* No space for a lang_bitmap is necessary. Discard the '['. */
273 while (c != ']' && c != '\n' && c != EOF)
282 c = getc (list); /* eat what should be a newline */
283 if (c != '\n' && c != EOF)
284 error_at_line (pos, "junk on line after language tag [%s]", line);
287 error_at_line (pos, "missing close bracket for language tag [%s",
296 /* Leave space for a lang_bitmap. */
297 memset (here, 0, sizeof (lang_bitmap));
298 here += sizeof (lang_bitmap);
305 while (c != EOF && c != '\n');
313 /* Read the list of input files from LIST and compute all of the
314 relevant tables. There is one file per line of the list. At
315 first, all the files on the list are language-generic, but
316 eventually a line will appear which is the name of a language
317 subdirectory in square brackets, like this: [cp]. All subsequent
318 files are specific to that language, until another language
319 subdirectory tag appears. Files can appear more than once, if
320 they apply to more than one language. */
322 read_input_list (const char *listname)
324 FILE *list = fopen (listname, "r");
326 fatal ("cannot open %s: %s", listname, xstrerror (errno));
330 size_t bufsz = measure_input_list (list);
331 char *buf = XNEWVEC (char, bufsz);
333 char *committed = buf;
334 char *limit = buf + bufsz;
339 lang_bitmap curlangs = (1 << num_lang_dirs) - 1;
341 epos.file = input_file_by_name (listname);
344 lang_dir_names = XNEWVEC (const char *, num_lang_dirs);
345 gt_files = XNEWVEC (const input_file *, num_gt_files);
352 is_language = read_input_line (list, &here, &line, &epos);
353 gcc_assert (here <= limit);
356 else if (is_language)
359 gcc_assert (langno <= num_lang_dirs);
360 for (i = 0; i < langno; i++)
361 if (strcmp (lang_dir_names[i], line) == 0)
363 error_at_line (&epos, "duplicate language tag [%s]",
370 curlangs = 1 << langno;
371 lang_dir_names[langno++] = line;
376 input_file *inpf = input_file_by_name (line);
377 gcc_assert (nfiles <= num_gt_files);
378 for (i = 0; i < nfiles; i++)
379 /* Since the input_file-s are uniquely hash-consed, we
380 can just compare pointers! */
381 if (gt_files[i] == inpf)
383 /* Throw away the string we just read, and add the
384 current language to the existing string's bitmap. */
385 lang_bitmap bmap = get_lang_bitmap (inpf);
387 error_at_line (&epos,
388 "file %s specified more than once "
389 "for language %s", line,
391 0 ? "(all)" : lang_dir_names[langno -
395 set_lang_bitmap (inpf, bmap);
400 set_lang_bitmap (inpf, curlangs);
401 gt_files[nfiles++] = inpf;
404 /* Update the global counts now that we know accurately how many
405 things there are. (We do not bother resizing the arrays down.) */
406 num_lang_dirs = langno;
407 /* Add the plugin files if provided. */
411 for (i = 0; i < nb_plugin_files; i++)
412 gt_files[nfiles++] = plugin_files[i];
414 num_gt_files = nfiles;
417 /* Sanity check: any file that resides in a language subdirectory
418 (e.g. 'cp') ought to belong to the corresponding language.
419 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
420 (Can you even do that? Should you be allowed to?) */
423 for (f = 0; f < num_gt_files; f++)
425 lang_bitmap bitmap = get_lang_bitmap (gt_files[f]);
426 const char *basename = get_file_basename (gt_files[f]);
427 const char *slashpos = strchr (basename, '/');
432 for (l = 0; l < num_lang_dirs; l++)
433 if ((size_t) (slashpos - basename) == strlen (lang_dir_names[l])
434 && memcmp (basename, lang_dir_names[l],
435 strlen (lang_dir_names[l])) == 0)
437 if (!(bitmap & (1 << l)))
438 error ("%s is in language directory '%s' but is not "
439 "tagged for that language",
440 basename, lang_dir_names[l]);
448 fatal ("error reading %s: %s", listname, xstrerror (errno));
455 /* The one and only TYPE_STRING. */
457 struct type string_type = {
458 TYPE_STRING, 0, 0, 0, GC_USED, {0}
461 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
462 set early in main. */
464 struct type scalar_nonchar = {
465 TYPE_SCALAR, 0, 0, 0, GC_USED, {0}
468 struct type scalar_char = {
469 TYPE_SCALAR, 0, 0, 0, GC_USED, {0}
472 /* Lists of various things. */
476 type_p param_structs;
479 static type_p find_param_structure (type_p t, type_p param[NUM_PARAM]);
480 static type_p adjust_field_tree_exp (type_p t, options_p opt);
481 static type_p adjust_field_rtx_def (type_p t, options_p opt);
483 /* Define S as a typedef to T at POS. */
486 do_typedef (const char *s, type_p t, struct fileloc *pos)
490 /* temporary kludge - gengtype doesn't handle conditionals or
491 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
492 is coming from this file (main() sets them up with safe dummy
494 if (!strcmp (s, "CUMULATIVE_ARGS") && pos->file != this_file)
497 for (p = typedefs; p != NULL; p = p->next)
498 if (strcmp (p->name, s) == 0)
502 error_at_line (pos, "type `%s' previously defined", s);
503 error_at_line (&p->line, "previously defined here");
508 p = XNEW (struct pair);
517 /* Define S as a typename of a scalar. Cannot be used to define
518 typedefs of 'char'. Note: is also used for pointer-to-function
519 typedefs (which are therefore not treated as pointers). */
522 do_scalar_typedef (const char *s, struct fileloc *pos)
524 do_typedef (s, &scalar_nonchar, pos);
527 /* Return the type previously defined for S. Use POS to report errors. */
530 resolve_typedef (const char *s, struct fileloc *pos)
533 for (p = typedefs; p != NULL; p = p->next)
534 if (strcmp (p->name, s) == 0)
536 error_at_line (pos, "unidentified type `%s'", s);
537 return &scalar_nonchar; /* treat as "int" */
540 /* Create and return a new structure with tag NAME (or a union iff
541 ISUNION is nonzero), at POS with fields FIELDS and options O. */
544 new_structure (const char *name, int isunion, struct fileloc *pos,
545 pair_p fields, options_p o)
549 lang_bitmap bitmap = get_lang_bitmap (pos->file);
551 for (si = structures; si != NULL; si = si->next)
552 if (strcmp (name, si->u.s.tag) == 0 && UNION_P (si) == isunion)
555 if (si->kind == TYPE_LANG_STRUCT)
559 for (si = ls->u.s.lang_struct; si != NULL; si = si->next)
560 if (si->u.s.bitmap == bitmap)
563 else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
566 si = XCNEW (struct type);
567 memcpy (si, ls, sizeof (struct type));
568 ls->kind = TYPE_LANG_STRUCT;
569 ls->u.s.lang_struct = si;
570 ls->u.s.fields = NULL;
572 si->pointer_to = NULL;
573 si->u.s.lang_struct = ls;
578 if (ls != NULL && s == NULL)
580 s = XCNEW (struct type);
581 s->next = ls->u.s.lang_struct;
582 ls->u.s.lang_struct = s;
583 s->u.s.lang_struct = ls;
590 s = XCNEW (struct type);
591 s->next = structures;
595 if (s->u.s.line.file != NULL
596 || (s->u.s.lang_struct && (s->u.s.lang_struct->u.s.bitmap & bitmap)))
598 error_at_line (pos, "duplicate definition of '%s %s'",
599 isunion ? "union" : "struct", s->u.s.tag);
600 error_at_line (&s->u.s.line, "previous definition here");
603 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
606 s->u.s.fields = fields;
608 s->u.s.bitmap = bitmap;
609 if (s->u.s.lang_struct)
610 s->u.s.lang_struct->u.s.bitmap |= bitmap;
615 /* Return the previously-defined structure with tag NAME (or a union
616 iff ISUNION is nonzero), or a new empty structure or union if none
617 was defined previously. */
620 find_structure (const char *name, int isunion)
624 for (s = structures; s != NULL; s = s->next)
625 if (strcmp (name, s->u.s.tag) == 0 && UNION_P (s) == isunion)
628 s = XCNEW (struct type);
629 s->next = structures;
631 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
637 /* Return the previously-defined parameterized structure for structure
638 T and parameters PARAM, or a new parameterized empty structure or
639 union if none was defined previously. */
642 find_param_structure (type_p t, type_p param[NUM_PARAM])
646 for (res = param_structs; res; res = res->next)
647 if (res->u.param_struct.stru == t
648 && memcmp (res->u.param_struct.param, param,
649 sizeof (type_p) * NUM_PARAM) == 0)
653 res = XCNEW (struct type);
654 res->kind = TYPE_PARAM_STRUCT;
655 res->next = param_structs;
657 res->u.param_struct.stru = t;
658 memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
663 /* Return a scalar type with name NAME. */
666 create_scalar_type (const char *name)
668 if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
671 return &scalar_nonchar;
674 /* Return a pointer to T. */
677 create_pointer (type_p t)
681 type_p r = XCNEW (struct type);
682 r->kind = TYPE_POINTER;
686 return t->pointer_to;
689 /* Return an array of length LEN. */
692 create_array (type_p t, const char *len)
696 v = XCNEW (struct type);
697 v->kind = TYPE_ARRAY;
703 /* Return a string options structure with name NAME and info INFO.
704 NEXT is the next option in the chain. */
706 create_string_option (options_p next, const char *name, const char *info)
708 options_p o = XNEW (struct options);
709 o->kind = OPTION_STRING;
712 o->info.string = info;
716 /* Create a type options structure with name NAME and info INFO. NEXT
717 is the next option in the chain. */
719 create_type_option (options_p next, const char* name, type_p info)
721 options_p o = XNEW (struct options);
724 o->kind = OPTION_TYPE;
729 /* Create a nested pointer options structure with name NAME and info
730 INFO. NEXT is the next option in the chain. */
732 create_nested_option (options_p next, const char* name,
733 struct nested_ptr_data* info)
736 o = XNEW (struct options);
739 o->kind = OPTION_NESTED;
740 o->info.nested = info;
744 /* Return an options structure for a "nested_ptr" option. */
746 create_nested_ptr_option (options_p next, type_p t,
747 const char *to, const char *from)
749 struct nested_ptr_data *d = XNEW (struct nested_ptr_data);
751 d->type = adjust_field_type (t, 0);
753 d->convert_from = from;
754 return create_nested_option (next, "nested_ptr", d);
757 /* Add a variable named S of type T with options O defined at POS,
760 note_variable (const char *s, type_p t, options_p o, struct fileloc *pos)
763 n = XNEW (struct pair);
772 /* Most-general structure field creator. */
774 create_field_all (pair_p next, type_p type, const char *name, options_p opt,
775 const input_file *inpf, int line)
779 field = XNEW (struct pair);
784 field->line.file = inpf;
785 field->line.line = line;
789 /* Create a field that came from the source code we are scanning,
790 i.e. we have a 'struct fileloc', and possibly options; also,
791 adjust_field_type should be called. */
793 create_field_at (pair_p next, type_p type, const char *name, options_p opt,
796 return create_field_all (next, adjust_field_type (type, opt),
797 name, opt, pos->file, pos->line);
800 /* Create a fake field with the given type and name. NEXT is the next
801 field in the chain. */
802 #define create_field(next,type,name) \
803 create_field_all(next,type,name, 0, this_file, __LINE__)
805 /* Like create_field, but the field is only valid when condition COND
809 create_optional_field_ (pair_p next, type_p type, const char *name,
810 const char *cond, int line)
816 /* Create a fake union type with a single nameless field of type TYPE.
817 The field has a tag of "1". This allows us to make the presence
818 of a field of type TYPE depend on some boolean "desc" being true. */
819 union_fields = create_field (NULL, type, "");
821 create_string_option (union_fields->opt, "dot", "");
823 create_string_option (union_fields->opt, "tag", "1");
825 new_structure (xasprintf ("%s_%d", "fake_union", id++), 1,
826 &lexer_line, union_fields, NULL);
828 /* Create the field and give it the new fake union type. Add a "desc"
829 tag that specifies the condition under which the field is valid. */
830 return create_field_all (next, union_type, name,
831 create_string_option (0, "desc", cond),
835 #define create_optional_field(next,type,name,cond) \
836 create_optional_field_(next,type,name,cond,__LINE__)
838 /* Reverse a linked list of 'struct pair's in place. */
840 nreverse_pairs (pair_p list)
842 pair_p prev = 0, p, next;
843 for (p = list; p; p = next)
853 /* We don't care how long a CONST_DOUBLE is. */
854 #define CONST_DOUBLE_FORMAT "ww"
855 /* We don't want to see codes that are only for generator files. */
856 #undef GENERATOR_FILE
860 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
866 static const char *const rtx_name[NUM_RTX_CODE] = {
867 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
872 static const char *const rtx_format[NUM_RTX_CODE] = {
873 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
878 static int rtx_next_new[NUM_RTX_CODE];
880 /* We also need codes and names for insn notes (not register notes).
881 Note that we do *not* bias the note values here. */
884 #define DEF_INSN_NOTE(NAME) NAME,
885 #include "insn-notes.def"
891 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
892 default field for line number notes. */
893 static const char *const note_insn_name[NOTE_INSN_MAX + 1] = {
894 #define DEF_INSN_NOTE(NAME) #NAME,
895 #include "insn-notes.def"
899 #undef CONST_DOUBLE_FORMAT
900 #define GENERATOR_FILE
902 /* Generate the contents of the rtx_next array. This really doesn't belong
903 in gengtype at all, but it's needed for adjust_field_rtx_def. */
909 for (i = 0; i < NUM_RTX_CODE; i++)
913 rtx_next_new[i] = -1;
914 if (strncmp (rtx_format[i], "iuu", 3) == 0)
916 else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
919 for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
920 if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
925 /* Write out the contents of the rtx_next array. */
927 write_rtx_next (void)
929 outf_p f = get_output_file_with_visibility (NULL);
934 oprintf (f, "\n/* Used to implement the RTX_NEXT macro. */\n");
935 oprintf (f, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
936 for (i = 0; i < NUM_RTX_CODE; i++)
937 if (rtx_next_new[i] == -1)
938 oprintf (f, " 0,\n");
941 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n", rtx_next_new[i]);
945 /* Handle `special("rtx_def")'. This is a special case for field
946 `fld' of struct rtx_def, which is an array of unions whose values
947 are based in a complex way on the type of RTL. */
950 adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
955 type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
956 type_p basic_block_tp, reg_attrs_tp, constant_tp, symbol_union_tp;
958 if (t->kind != TYPE_UNION)
960 error_at_line (&lexer_line,
961 "special `rtx_def' must be applied to a union");
965 nodot = create_string_option (NULL, "dot", "");
967 rtx_tp = create_pointer (find_structure ("rtx_def", 0));
968 rtvec_tp = create_pointer (find_structure ("rtvec_def", 0));
969 tree_tp = create_pointer (find_structure ("tree_node", 1));
970 mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
972 create_pointer (find_structure ("reg_attrs", 0));
974 create_pointer (find_structure ("basic_block_def", 0));
976 create_pointer (find_structure ("constant_descriptor_rtx", 0));
977 scalar_tp = &scalar_nonchar; /* rtunion int */
980 pair_p note_flds = NULL;
983 for (c = 0; c <= NOTE_INSN_MAX; c++)
988 case NOTE_INSN_DELETED_LABEL:
989 note_flds = create_field (note_flds, &string_type, "rt_str");
992 case NOTE_INSN_BLOCK_BEG:
993 case NOTE_INSN_BLOCK_END:
994 note_flds = create_field (note_flds, tree_tp, "rt_tree");
997 case NOTE_INSN_VAR_LOCATION:
998 note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
1002 note_flds = create_field (note_flds, scalar_tp, "rt_int");
1005 /* NOTE_INSN_MAX is used as the default field for line
1007 if (c == NOTE_INSN_MAX)
1009 create_string_option (nodot, "default", "");
1012 create_string_option (nodot, "tag", note_insn_name[c]);
1014 note_union_tp = new_structure ("rtx_def_note_subunion", 1,
1015 &lexer_line, note_flds, NULL);
1017 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1020 sym_flds = create_field (NULL, tree_tp, "rt_tree");
1021 sym_flds->opt = create_string_option (nodot, "default", "");
1022 sym_flds = create_field (sym_flds, constant_tp, "rt_constant");
1023 sym_flds->opt = create_string_option (nodot, "tag", "1");
1024 symbol_union_tp = new_structure ("rtx_def_symbol_subunion", 1,
1025 &lexer_line, sym_flds, NULL);
1027 for (i = 0; i < NUM_RTX_CODE; i++)
1029 pair_p subfields = NULL;
1030 size_t aindex, nmindex;
1035 for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
1038 const char *subname;
1040 switch (rtx_format[i][aindex])
1051 if (i == MEM && aindex == 1)
1052 t = mem_attrs_tp, subname = "rt_mem";
1053 else if (i == JUMP_INSN && aindex == 8)
1054 t = rtx_tp, subname = "rt_rtx";
1055 else if (i == CODE_LABEL && aindex == 5)
1056 t = scalar_tp, subname = "rt_int";
1057 else if (i == CODE_LABEL && aindex == 4)
1058 t = rtx_tp, subname = "rt_rtx";
1059 else if (i == LABEL_REF && (aindex == 1 || aindex == 2))
1060 t = rtx_tp, subname = "rt_rtx";
1061 else if (i == NOTE && aindex == 4)
1062 t = note_union_tp, subname = "";
1063 else if (i == NOTE && aindex == 5)
1064 t = scalar_tp, subname = "rt_int";
1065 else if (i == NOTE && aindex >= 7)
1066 t = scalar_tp, subname = "rt_int";
1067 else if (i == ADDR_DIFF_VEC && aindex == 4)
1068 t = scalar_tp, subname = "rt_int";
1069 else if (i == VALUE && aindex == 0)
1070 t = scalar_tp, subname = "rt_int";
1071 else if (i == DEBUG_EXPR && aindex == 0)
1072 t = tree_tp, subname = "rt_tree";
1073 else if (i == REG && aindex == 1)
1074 t = scalar_tp, subname = "rt_int";
1075 else if (i == REG && aindex == 2)
1076 t = reg_attrs_tp, subname = "rt_reg";
1077 else if (i == SCRATCH && aindex == 0)
1078 t = scalar_tp, subname = "rt_int";
1079 else if (i == SYMBOL_REF && aindex == 1)
1080 t = scalar_tp, subname = "rt_int";
1081 else if (i == SYMBOL_REF && aindex == 2)
1082 t = symbol_union_tp, subname = "";
1083 else if (i == BARRIER && aindex >= 3)
1084 t = scalar_tp, subname = "rt_int";
1089 "rtx type `%s' has `0' in position %lu, can't handle",
1090 rtx_name[i], (unsigned long) aindex);
1112 subname = "rt_rtvec";
1117 subname = "rt_tree";
1128 "rtx type `%s' has `%c' in position %lu, can't handle",
1129 rtx_name[i], rtx_format[i][aindex],
1130 (unsigned long) aindex);
1136 subfields = create_field (subfields, t,
1137 xasprintf (".fld[%lu].%s",
1138 (unsigned long) aindex,
1140 subfields->opt = nodot;
1141 if (t == note_union_tp)
1143 create_string_option (subfields->opt, "desc",
1145 if (t == symbol_union_tp)
1147 create_string_option (subfields->opt, "desc",
1148 "CONSTANT_POOL_ADDRESS_P (&%0)");
1151 if (i == SYMBOL_REF)
1153 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P
1155 type_p field_tp = find_structure ("block_symbol", 0);
1157 = create_optional_field (subfields, field_tp, "block_sym",
1158 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1161 sname = xasprintf ("rtx_def_%s", rtx_name[i]);
1162 substruct = new_structure (sname, 0, &lexer_line, subfields, NULL);
1164 ftag = xstrdup (rtx_name[i]);
1165 for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
1166 ftag[nmindex] = TOUPPER (ftag[nmindex]);
1167 flds = create_field (flds, substruct, "");
1168 flds->opt = create_string_option (nodot, "tag", ftag);
1170 return new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
1173 /* Handle `special("tree_exp")'. This is a special case for
1174 field `operands' of struct tree_exp, which although it claims to contain
1175 pointers to trees, actually sometimes contains pointers to RTL too.
1176 Passed T, the old type of the field, and OPT its options. Returns
1177 a new type for the field. */
1180 adjust_field_tree_exp (type_p t, options_p opt ATTRIBUTE_UNUSED)
1185 if (t->kind != TYPE_ARRAY)
1187 error_at_line (&lexer_line,
1188 "special `tree_exp' must be applied to an array");
1189 return &string_type;
1192 nodot = create_string_option (NULL, "dot", "");
1194 flds = create_field (NULL, t, "");
1195 flds->opt = create_string_option (nodot, "length",
1196 "TREE_OPERAND_LENGTH ((tree) &%0)");
1197 flds->opt = create_string_option (flds->opt, "default", "");
1199 return new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
1202 /* Perform any special processing on a type T, about to become the type
1203 of a field. Return the appropriate type for the field.
1205 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1206 - Similarly for arrays of pointer-to-char;
1207 - Converts structures for which a parameter is provided to
1209 - Handles "special" options.
1213 adjust_field_type (type_p t, options_p opt)
1216 const int pointer_p = t->kind == TYPE_POINTER;
1217 type_p params[NUM_PARAM];
1221 for (i = 0; i < NUM_PARAM; i++)
1224 for (; opt; opt = opt->next)
1225 if (strcmp (opt->name, "length") == 0)
1227 else if ((strcmp (opt->name, "param_is") == 0
1228 || (strncmp (opt->name, "param", 5) == 0
1229 && ISDIGIT (opt->name[5])
1230 && strcmp (opt->name + 6, "_is") == 0))
1231 && opt->kind == OPTION_TYPE)
1233 int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
1235 if (!UNION_OR_STRUCT_P (t)
1236 && (t->kind != TYPE_POINTER || !UNION_OR_STRUCT_P (t->u.p)))
1238 error_at_line (&lexer_line,
1239 "option `%s' may only be applied to structures or structure pointers",
1245 if (params[num] != NULL)
1246 error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
1247 if (!ISDIGIT (opt->name[5]))
1248 params[num] = create_pointer (opt->info.type);
1250 params[num] = opt->info.type;
1252 else if (strcmp (opt->name, "special") == 0
1253 && opt->kind == OPTION_STRING)
1255 const char *special_name = opt->info.string;
1256 if (strcmp (special_name, "tree_exp") == 0)
1257 t = adjust_field_tree_exp (t, opt);
1258 else if (strcmp (special_name, "rtx_def") == 0)
1259 t = adjust_field_rtx_def (t, opt);
1261 error_at_line (&lexer_line, "unknown special `%s'", special_name);
1270 realt = find_param_structure (t, params);
1271 t = pointer_p ? create_pointer (realt) : realt;
1275 && pointer_p && t->u.p->kind == TYPE_SCALAR && t->u.p->u.scalar_is_char)
1276 return &string_type;
1277 if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
1278 && t->u.a.p->u.p->kind == TYPE_SCALAR
1279 && t->u.a.p->u.p->u.scalar_is_char)
1280 return create_array (&string_type, t->u.a.len);
1286 static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
1287 static void set_gc_used (pair_p);
1289 /* Handle OPT for set_gc_used_type. */
1292 process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
1293 int *pass_param, int *length, int *skip,
1297 for (o = opt; o; o = o->next)
1298 if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO
1299 && o->kind == OPTION_TYPE)
1300 set_gc_used_type (o->info.type,
1301 GC_POINTED_TO, NULL);
1302 else if (strcmp (o->name, "maybe_undef") == 0)
1304 else if (strcmp (o->name, "use_params") == 0)
1306 else if (strcmp (o->name, "length") == 0)
1308 else if (strcmp (o->name, "skip") == 0)
1310 else if (strcmp (o->name, "nested_ptr") == 0
1311 && o->kind == OPTION_NESTED)
1312 *nested_ptr = ((const struct nested_ptr_data *) o->info.nested)->type;
1316 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
1318 set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
1320 if (t->gc_used >= level)
1334 process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy,
1337 for (f = t->u.s.fields; f; f = f->next)
1339 int maybe_undef = 0;
1343 type_p nested_ptr = NULL;
1344 process_gc_options (f->opt, level, &maybe_undef, &pass_param,
1345 &length, &skip, &nested_ptr);
1347 if (nested_ptr && f->type->kind == TYPE_POINTER)
1348 set_gc_used_type (nested_ptr, GC_POINTED_TO,
1349 pass_param ? param : NULL);
1350 else if (length && f->type->kind == TYPE_POINTER)
1351 set_gc_used_type (f->type->u.p, GC_USED, NULL);
1352 else if (maybe_undef && f->type->kind == TYPE_POINTER)
1353 set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
1354 else if (pass_param && f->type->kind == TYPE_POINTER && param)
1355 set_gc_used_type (find_param_structure (f->type->u.p, param),
1356 GC_POINTED_TO, NULL);
1358 ; /* target type is not used through this field */
1360 set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
1366 set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
1370 set_gc_used_type (t->u.a.p, GC_USED, param);
1373 case TYPE_LANG_STRUCT:
1374 for (t = t->u.s.lang_struct; t; t = t->next)
1375 set_gc_used_type (t, level, param);
1378 case TYPE_PARAM_STRUCT:
1381 for (i = 0; i < NUM_PARAM; i++)
1382 if (t->u.param_struct.param[i] != 0)
1383 set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
1385 if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
1386 level = GC_POINTED_TO;
1389 t->u.param_struct.stru->gc_used = GC_UNUSED;
1390 set_gc_used_type (t->u.param_struct.stru, level,
1391 t->u.param_struct.param);
1399 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1402 set_gc_used (pair_p variables)
1406 for (p = variables; p; p = p->next)
1408 set_gc_used_type (p->type, GC_USED, NULL);
1411 if (verbosity_level >= 2)
1412 printf ("%s used %d GTY-ed variables\n", progname, nbvars);
1415 /* File mapping routines. For each input file, there is one output .c file
1416 (but some output files have many input files), and there is one .h file
1417 for the whole build. */
1419 /* Output file handling. */
1421 /* Create and return an outf_p for a new file for NAME, to be called
1425 create_file (const char *name, const char *oname)
1427 static const char *const hdr[] = {
1428 " Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.\n",
1430 "This file is part of GCC.\n",
1432 "GCC is free software; you can redistribute it and/or modify it under\n",
1433 "the terms of the GNU General Public License as published by the Free\n",
1434 "Software Foundation; either version 3, or (at your option) any later\n",
1437 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1438 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1439 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1440 "for more details.\n",
1442 "You should have received a copy of the GNU General Public License\n",
1443 "along with GCC; see the file COPYING3. If not see\n",
1444 "<http://www.gnu.org/licenses/>. */\n",
1446 "/* This file is machine generated. Do not edit. */\n"
1451 gcc_assert (name != NULL);
1452 gcc_assert (oname != NULL);
1453 f = XCNEW (struct outf);
1454 f->next = output_files;
1458 oprintf (f, "/* Type information for %s.\n", name);
1459 for (i = 0; i < ARRAY_SIZE (hdr); i++)
1460 oprintf (f, "%s", hdr[i]);
1464 /* Print, like fprintf, to O.
1465 N.B. You might think this could be implemented more efficiently
1466 with vsnprintf(). Unfortunately, there are C libraries that
1467 provide that function but without the C99 semantics for its return
1468 value, making it impossible to know how much space is required. */
1470 oprintf (outf_p o, const char *format, ...)
1476 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1481 va_start (ap, format);
1482 slength = vasprintf (&s, format, ap);
1483 if (s == NULL || (int) slength < 0)
1484 fatal ("out of memory");
1487 if (o->bufused + slength > o->buflength)
1489 size_t new_len = o->buflength;
1496 while (o->bufused + slength >= new_len);
1497 o->buf = XRESIZEVEC (char, o->buf, new_len);
1498 o->buflength = new_len;
1500 memcpy (o->buf + o->bufused, s, slength);
1501 o->bufused += slength;
1505 /* Open the global header file and the language-specific header files. */
1508 open_base_files (void)
1512 if (nb_plugin_files > 0 && plugin_files)
1515 header_file = create_file ("GCC", "gtype-desc.h");
1517 base_files = XNEWVEC (outf_p, num_lang_dirs);
1519 for (i = 0; i < num_lang_dirs; i++)
1520 base_files[i] = create_file (lang_dir_names[i],
1521 xasprintf ("gtype-%s.h", lang_dir_names[i]));
1523 /* gtype-desc.c is a little special, so we create it here. */
1525 /* The order of files here matters very much. */
1526 static const char *const ifiles[] = {
1527 "config.h", "system.h", "coretypes.h", "tm.h",
1528 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1529 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1530 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1531 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1532 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1533 "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
1534 "target.h", "ipa-prop.h", "lto-streamer.h", "target-globals.h", NULL
1536 const char *const *ifp;
1537 outf_p gtype_desc_c;
1539 gtype_desc_c = create_file ("GCC", "gtype-desc.c");
1540 for (ifp = ifiles; *ifp; ifp++)
1541 oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
1543 /* Make sure we handle "cfun" specially. */
1544 oprintf (gtype_desc_c, "\n/* See definition in function.h. */\n");
1545 oprintf (gtype_desc_c, "#undef cfun\n");
1549 /* For INPF an input file, return the real basename of INPF, with all
1550 the directory components skipped. */
1553 get_file_realbasename (const input_file *inpf)
1555 const char *f = get_input_file_name (inpf);
1556 const char *lastslash = strrchr (f, '/');
1558 return (lastslash != NULL) ? lastslash + 1 : f;
1561 /* For INPF a filename, return the relative path to INPF from
1562 $(srcdir) if the latter is a prefix in INPF, NULL otherwise. */
1565 get_file_srcdir_relative_path (const input_file *inpf)
1567 const char *f = get_input_file_name (inpf);
1568 if (strlen (f) > srcdir_len
1569 && IS_DIR_SEPARATOR (f[srcdir_len])
1570 && strncmp (f, srcdir, srcdir_len) == 0)
1571 return f + srcdir_len + 1;
1576 /* For INPF an input_file, return the relative path to INPF from
1577 $(srcdir) if the latter is a prefix in INPF, or the real basename
1578 of INPF otherwise. */
1581 get_file_basename (const input_file *inpf)
1583 const char *srcdir_path = get_file_srcdir_relative_path (inpf);
1585 return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (inpf);
1588 /* For F a filename, return the lang_dir_names relative index of the language
1589 directory that is a prefix in F, if any, -1 otherwise. */
1592 get_prefix_langdir_index (const char *f)
1594 size_t f_len = strlen (f);
1597 for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
1599 const char *langdir = lang_dir_names[lang_index];
1600 size_t langdir_len = strlen (langdir);
1602 if (f_len > langdir_len
1603 && IS_DIR_SEPARATOR (f[langdir_len])
1604 && memcmp (f, langdir, langdir_len) == 0)
1611 /* For INPF an input file, return the name of language directory where
1612 F is located, if any, NULL otherwise. */
1615 get_file_langdir (const input_file *inpf)
1617 /* Get the relative path to INPF from $(srcdir) and find the
1618 language by comparing the prefix with language directory names.
1619 If INPF is not even srcdir relative, no point in looking
1623 const char *srcdir_relative_path = get_file_srcdir_relative_path (inpf);
1626 if (!srcdir_relative_path)
1629 lang_index = get_prefix_langdir_index (srcdir_relative_path);
1630 if (lang_index < 0 && strncmp (srcdir_relative_path, "c-family", 8) == 0)
1632 else if (lang_index >= 0)
1633 r = lang_dir_names[lang_index];
1640 /* The gt- output file name for INPF. */
1643 get_file_gtfilename (const input_file *inpf)
1645 /* Cook up an initial version of the gt- file name from the file real
1646 basename and the language name, if any. */
1648 const char *basename = get_file_realbasename (inpf);
1649 const char *langdir = get_file_langdir (inpf);
1652 (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
1653 : xasprintf ("gt-%s", basename));
1655 /* Then replace all non alphanumerics characters by '-' and change the
1656 extension to ".h". We expect the input filename extension was at least
1657 one character long. */
1661 for (; *s != '.'; s++)
1662 if (!ISALNUM (*s) && *s != '-')
1665 memcpy (s, ".h", sizeof (".h"));
1670 /* Each input_file has its associated output file outf_p. The
1671 association is computed by the function
1672 get_output_file_with_visibility. The associated file is cached
1673 inside input_file in its inpoutf field, so is really computed only
1674 once. Associated output file paths (i.e. output_name-s) are
1675 computed by a rule based regexp machinery, using the files_rules
1676 array of struct file_rule_st. A for_name is also computed, giving
1677 the source file name for which the output_file is generated; it is
1678 often the last component of the input_file path. */
1682 Regexpr machinery to compute the output_name and for_name-s of each
1683 input_file. We have a sequence of file rules which gives the POSIX
1684 extended regular expression to match an input file path, and two
1685 transformed strings for the corresponding output_name and the
1686 corresponding for_name. The transformed string contain dollars: $0
1687 is replaced by the entire match, $1 is replaced by the substring
1688 matching the first parenthesis in the regexp, etc. And $$ is replaced
1689 by a single verbatim dollar. The rule order is important. The
1690 general case is last, and the particular cases should come before.
1691 An action routine can, when needed, update the out_name & for_name
1692 and/or return the appropriate output file. It is invoked only when a
1693 rule is triggered. When a rule is triggered, the output_name and
1694 for_name are computed using their transform string in while $$, $0,
1695 $1, ... are suitably replaced. If there is an action, it is called.
1696 In some few cases, the action can directly return the outf_p, but
1697 usually it just updates the output_name and for_name so should free
1698 them before replacing them. The get_output_file_with_visibility
1699 function creates an outf_p only once per each output_name, so it
1700 scans the output_files list for previously seen output file names.
1703 /* Signature of actions in file rules. */
1704 typedef outf_p (frul_actionrout_t) (input_file*, char**, char**);
1707 struct file_rule_st {
1708 const char* frul_srcexpr; /* Source string for regexp. */
1709 int frul_rflags; /* Flags passed to regcomp, usually
1711 regex_t* frul_re; /* Compiled regular expression
1712 obtained by regcomp. */
1713 const char* frul_tr_out; /* Transformation string for making
1714 * the output_name, with $1 ... $9 for
1715 * subpatterns and $0 for the whole
1716 * matched filename. */
1717 const char* frul_tr_for; /* Tranformation string for making the
1719 frul_actionrout_t* frul_action; /* The action, if non null, is
1720 * called once the rule matches, on
1721 * the transformed out_name &
1722 * for_name. It could change them
1723 * and/or give the output file. */
1726 /* File rule action handling *.h files. */
1727 static outf_p header_dot_h_frul (input_file*, char**, char**);
1729 /* File rule action handling *.c files. */
1730 static outf_p source_dot_c_frul (input_file*, char**, char**);
1732 #define NULL_REGEX (regex_t*)0
1734 /* The prefix in our regexp-s matching the directory. */
1735 #define DIR_PREFIX_REGEX "^(([^/]*/)*)"
1737 #define NULL_FRULACT (frul_actionrout_t*)0
1739 /* The array of our rules governing file name generation. Rules order
1740 matters, so change with extreme care! */
1742 struct file_rule_st files_rules[] = {
1743 /* the c-family/ source directory is special. */
1744 { DIR_PREFIX_REGEX "c-family/([[:alnum:]_-]*)\\.c$",
1745 REG_EXTENDED, NULL_REGEX,
1746 "gt-c-family-$3.h", "c-family/$3.c", NULL_FRULACT},
1748 { DIR_PREFIX_REGEX "c-family/([[:alnum:]_-]*)\\.h$",
1749 REG_EXTENDED, NULL_REGEX,
1750 "gt-c-family-$3.h", "c-family/$3.h", NULL_FRULACT},
1752 /* Both c-lang.h & c-tree.h gives gt-c-decl.h for c-decl.c ! */
1753 { DIR_PREFIX_REGEX "c-lang\\.h$",
1754 REG_EXTENDED, NULL_REGEX, "gt-c-decl.h", "c-decl.c", NULL_FRULACT},
1756 { DIR_PREFIX_REGEX "c-tree\\.h$",
1757 REG_EXTENDED, NULL_REGEX, "gt-c-decl.h", "c-decl.c", NULL_FRULACT},
1759 /* cp/cp-tree.h gives gt-cp-tree.h for cp/tree.c ! */
1760 { DIR_PREFIX_REGEX "cp/cp-tree\\.h$",
1761 REG_EXTENDED, NULL_REGEX,
1762 "gt-cp-tree.h", "cp/tree.c", NULL_FRULACT },
1764 /* cp/decl.h & cp/decl.c gives gt-cp-decl.h for cp/decl.c ! */
1765 { DIR_PREFIX_REGEX "cp/decl\\.[ch]$",
1766 REG_EXTENDED, NULL_REGEX,
1767 "gt-cp-decl.h", "cp/decl.c", NULL_FRULACT },
1769 /* cp/name-lookup.h gives gt-cp-name-lookup.h for cp/name-lookup.c ! */
1770 { DIR_PREFIX_REGEX "cp/name-lookup\\.h$",
1771 REG_EXTENDED, NULL_REGEX,
1772 "gt-cp-name-lookup.h", "cp/name-lookup.c", NULL_FRULACT },
1774 /* objc/objc-act.h fives gt-objc-objc-act.h for objc/objc-act.c ! */
1775 { DIR_PREFIX_REGEX "objc/objc-act\\.h$",
1776 REG_EXTENDED, NULL_REGEX,
1777 "gt-objc-objc-act.h", "objc/objc-act.c", NULL_FRULACT },
1779 /* General cases. For header *.h and source *.c files, we need
1780 * special actions to handle the language. */
1782 /* Source *.c files are using get_file_gtfilename to compute their
1783 output_name and get_file_basename to compute their for_name
1784 thru the source_dot_c_frul action. */
1785 { DIR_PREFIX_REGEX "([[:alnum:]_-]*)\\.c$",
1786 REG_EXTENDED, NULL_REGEX, "gt-$3.h", "$3.c", source_dot_c_frul},
1787 /* Common header files get "gtype-desc.c" as their output_name,
1788 * while language specific header files are handled specially. So
1789 * we need the header_dot_h_frul action. */
1790 { DIR_PREFIX_REGEX "([[:alnum:]_-]*)\\.h$",
1791 REG_EXTENDED, NULL_REGEX, "gt-$3.h", "$3.h", header_dot_h_frul},
1793 { DIR_PREFIX_REGEX "([[:alnum:]_-]*)\\.in$",
1794 REG_EXTENDED, NULL_REGEX, "gt-$3.h", "$3.in", NULL_FRULACT},
1796 /* Mandatory null last entry signaling end of rules. */
1797 {NULL, 0, NULL_REGEX, NULL, NULL, NULL_FRULACT}
1800 /* Special file rules action for handling *.h header files. It gives
1801 "gtype-desc.c" for common headers and corresponding output
1802 files for language-specific header files. */
1804 header_dot_h_frul (input_file* inpf, char**poutname,
1805 char**pforname ATTRIBUTE_UNUSED)
1807 const char *basename = 0;
1809 DBGPRINTF ("inpf %p inpname %s outname %s forname %s",
1810 (void*) inpf, get_input_file_name (inpf),
1811 *poutname, *pforname);
1812 basename = get_file_basename (inpf);
1813 lang_index = get_prefix_langdir_index (basename);
1814 DBGPRINTF ("basename %s lang_index %d", basename, lang_index);
1816 if (lang_index >= 0)
1818 /* The header is language specific. Given output_name &
1819 for_name remains unchanged. The base_files array gives the
1821 DBGPRINTF ("header_dot_h found language specific @ %p '%s'",
1822 (void*) base_files[lang_index],
1823 (base_files[lang_index])->name);
1824 return base_files[lang_index];
1828 /* The header is common to all front-end languages. So
1829 output_name is "gtype-desc.c" file. The calling function
1830 get_output_file_with_visibility will find its outf_p. */
1832 *poutname = xstrdup ("gtype-desc.c");
1833 DBGPRINTF ("special 'gtype-desc.c' for inpname %s",
1834 get_input_file_name (inpf));
1840 /* Special file rules action for handling *.c source files using
1841 * get_file_gtfilename to compute their output_name and
1842 * get_file_basename to compute their for_name. The output_name is
1843 * gt-<LANG>-<BASE>.h for language specific source files, and
1844 * gt-<BASE>.h for common source files. */
1846 source_dot_c_frul (input_file* inpf, char**poutname, char**pforname)
1848 char *newbasename = CONST_CAST (char*, get_file_basename (inpf));
1849 char *newoutname = CONST_CAST (char*, get_file_gtfilename (inpf));
1850 DBGPRINTF ("inpf %p inpname %s original outname %s forname %s",
1851 (void*) inpf, get_input_file_name (inpf),
1852 *poutname, *pforname);
1853 DBGPRINTF ("newoutname %s", newoutname);
1854 DBGPRINTF ("newbasename %s", newbasename);
1857 *poutname = newoutname;
1858 *pforname = newbasename;
1862 /* Utility function for get_output_file_with_visibility which returns
1863 * a malloc-ed substituted string using TRS on matching of the FILNAM
1864 * file name, using the PMATCH array. */
1866 matching_file_name_substitute (const char *filnam, regmatch_t pmatch[10],
1869 struct obstack str_obstack;
1871 char *rawstr = NULL;
1872 const char *pt = NULL;
1873 DBGPRINTF ("filnam %s", filnam);
1874 obstack_init (&str_obstack);
1875 for (pt = trs; *pt; pt++) {
1881 /* A double dollar $$ is substituted by a single verbatim
1882 dollar, but who really uses dollar signs in file
1884 obstack_1grow (&str_obstack, '$');
1886 else if (ISDIGIT (pt[1]))
1888 /* Handle $0 $1 ... $9 by appropriate substitution. */
1889 int dolnum = pt[1] - '0';
1890 int so = pmatch[dolnum].rm_so;
1891 int eo = pmatch[dolnum].rm_eo;
1892 DBGPRINTF ("so=%d eo=%d dolnum=%d", so, eo, dolnum);
1893 if (so>=0 && eo>=so)
1894 obstack_grow (&str_obstack, filnam + so, eo - so);
1898 /* This can happen only when files_rules is buggy! */
1901 /* Always skip the character after the dollar. */
1905 obstack_1grow (&str_obstack, c);
1907 obstack_1grow (&str_obstack, '\0');
1908 rawstr = XOBFINISH (&str_obstack, char *);
1909 str = xstrdup (rawstr);
1910 obstack_free (&str_obstack, rawstr);
1911 DBGPRINTF ("matched replacement %s", str);
1917 /* An output file, suitable for definitions, that can see declarations
1918 made in INPF and is linked into every language that uses INPF.
1919 Since the the result is cached inside INPF, that argument cannot be
1920 declared constant, but is "almost" constant. */
1923 get_output_file_with_visibility (input_file *inpf)
1926 char *for_name = NULL;
1927 char *output_name = NULL;
1928 const char* inpfname;
1930 /* This can happen when we need a file with visibility on a
1931 structure that we've never seen. We have to just hope that it's
1932 globally visible. */
1934 inpf = system_h_file;
1936 /* The result is cached in INPF, so return it if already known. */
1938 return inpf->inpoutf;
1940 /* In plugin mode, return NULL unless the input_file is one of the
1945 for (i = 0; i < nb_plugin_files; i++)
1946 if (inpf == plugin_files[i])
1948 inpf->inpoutf = plugin_output;
1949 return plugin_output;
1955 inpfname = get_input_file_name (inpf);
1957 /* Try each rule in sequence in files_rules until one is triggered. */
1960 DBGPRINTF ("passing input file @ %p named %s thru the files_rules",
1961 (void*) inpf, inpfname);
1963 for (; files_rules[rulix].frul_srcexpr != NULL; rulix++)
1965 DBGPRINTF ("rulix#%d srcexpr %s",
1966 rulix, files_rules[rulix].frul_srcexpr);
1968 if (!files_rules[rulix].frul_re)
1970 /* Compile the regexpr lazily. */
1972 files_rules[rulix].frul_re = XCNEW (regex_t);
1973 err = regcomp (files_rules[rulix].frul_re,
1974 files_rules[rulix].frul_srcexpr,
1975 files_rules[rulix].frul_rflags);
1978 /* The regular expression compilation fails only when
1979 file_rules is buggy. */
1987 /* Match the regexpr and trigger the rule if matched. */
1989 /* We have exactly ten pmatch-s, one for each $0, $1, $2,
1991 regmatch_t pmatch[10];
1992 memset (pmatch, 0, sizeof (pmatch));
1993 if (!regexec (files_rules[rulix].frul_re,
1994 inpfname, 10, pmatch, 0))
1996 DBGPRINTF ("input @ %p filename %s matched rulix#%d pattern %s",
1997 (void*) inpf, inpfname, rulix,
1998 files_rules[rulix].frul_srcexpr);
2000 matching_file_name_substitute (inpfname, pmatch,
2001 files_rules[rulix].frul_tr_for);
2002 DBGPRINTF ("for_name %s", for_name);
2004 matching_file_name_substitute (inpfname, pmatch,
2005 files_rules[rulix].frul_tr_out);
2006 DBGPRINTF ("output_name %s", output_name);
2007 if (files_rules[rulix].frul_action)
2009 /* Invoke our action routine. */
2011 DBGPRINTF ("before action rulix#%d output_name %s for_name %s",
2012 rulix, output_name, for_name);
2014 (files_rules[rulix].frul_action) (inpf,
2015 &output_name, &for_name);
2016 DBGPRINTF ("after action rulix#%d of=%p output_name %s for_name %s",
2017 rulix, (void*)of, output_name, for_name);
2018 /* If the action routine returned something, give it back
2019 immediately and cache it in inpf. */
2026 /* The rule matched, and had no action, or that action did
2027 not return any output file but could have changed the
2028 output_name or for_name. We break out of the loop on the
2034 /* The regexpr did not match. */
2035 DBGPRINTF ("rulix#%d did not match %s pattern %s",
2036 rulix, inpfname, files_rules[rulix].frul_srcexpr);
2042 if (!output_name || !for_name)
2044 /* This is impossible, and could only happen if the files_rules is
2045 incomplete or buggy. */
2049 /* Look through to see if we've ever seen this output filename
2050 before. If found, cache the result in inpf. */
2051 for (r = output_files; r; r = r->next)
2052 if (strcmp (r->name, output_name) == 0)
2055 DBGPRINTF ("found r @ %p for output_name %s for_name %s", (void*)r,
2056 output_name, for_name);
2060 /* If not found, create it, and cache it in inpf. */
2061 r = create_file (for_name, output_name);
2063 gcc_assert (r && r->name);
2064 DBGPRINTF ("created r @ %p for output_name %s for_name %s", (void*) r,
2065 output_name, for_name);
2072 /* The name of an output file, suitable for definitions, that can see
2073 declarations made in INPF and is linked into every language that
2077 get_output_file_name (input_file* inpf)
2079 outf_p o = get_output_file_with_visibility (inpf);
2085 /* Check if existing file is equal to the in memory buffer. */
2088 is_file_equal (outf_p of)
2090 FILE *newfile = fopen (of->name, "r");
2093 if (newfile == NULL)
2097 for (i = 0; i < of->bufused; i++)
2100 ch = fgetc (newfile);
2101 if (ch == EOF || ch != (unsigned char) of->buf[i])
2111 /* Copy the output to its final destination,
2112 but don't unnecessarily change modification times. */
2115 close_output_files (void)
2117 int nbwrittenfiles = 0;
2120 for (of = output_files; of; of = of->next)
2123 if (!is_file_equal (of))
2125 FILE *newfile = NULL;
2126 char *backupname = NULL;
2127 /* Back up the old version of the output file gt-FOO.c as
2128 BACKUPDIR/gt-FOO.c~ if we have a backup directory. */
2131 backupname = concat (backup_dir, "/",
2132 lbasename (of->name), "~", NULL);
2133 if (!access (of->name, F_OK) && rename (of->name, backupname))
2134 fatal ("failed to back up %s as %s: %s",
2135 of->name, backupname, xstrerror (errno));
2138 newfile = fopen (of->name, "w");
2139 if (newfile == NULL)
2140 fatal ("opening output file %s: %s", of->name, xstrerror (errno));
2141 if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
2142 fatal ("writing output file %s: %s", of->name, xstrerror (errno));
2143 if (fclose (newfile) != 0)
2144 fatal ("closing output file %s: %s", of->name, xstrerror (errno));
2146 if (verbosity_level >= 2 && backupname)
2147 printf ("%s wrote #%-3d %s backed-up in %s\n",
2148 progname, nbwrittenfiles, of->name, backupname);
2149 else if (verbosity_level >= 1)
2150 printf ("%s write #%-3d %s\n", progname, nbwrittenfiles, of->name);
2155 /* output file remains unchanged. */
2156 if (verbosity_level >= 2)
2157 printf ("%s keep %s\n", progname, of->name);
2161 of->bufused = of->buflength = 0;
2163 if (verbosity_level >= 1)
2164 printf ("%s wrote %d files.\n", progname, nbwrittenfiles);
2171 const input_file* file;
2175 struct walk_type_data;
2177 /* For scalars and strings, given the item in 'val'.
2178 For structures, given a pointer to the item in 'val'.
2179 For misc. pointers, given the item in 'val'.
2181 typedef void (*process_field_fn) (type_p f, const struct walk_type_data * p);
2182 typedef void (*func_name_fn) (type_p s, const struct walk_type_data * p);
2184 /* Parameters for write_types. */
2186 struct write_types_data
2189 const char *param_prefix;
2190 const char *subfield_marker_routine;
2191 const char *marker_routine;
2192 const char *reorder_note_routine;
2193 const char *comment;
2194 int skip_hooks; /* skip hook generation if non zero */
2197 static void output_escaped_param (struct walk_type_data *d,
2198 const char *, const char *);
2199 static void output_mangled_typename (outf_p, const_type_p);
2200 static void walk_type (type_p t, struct walk_type_data *d);
2201 static void write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2202 const struct write_types_data *wtd);
2203 static void write_types_process_field
2204 (type_p f, const struct walk_type_data *d);
2205 static void write_types (outf_p output_header,
2207 type_p param_structs,
2208 const struct write_types_data *wtd);
2209 static void write_types_local_process_field
2210 (type_p f, const struct walk_type_data *d);
2211 static void write_local_func_for_structure
2212 (const_type_p orig_s, type_p s, type_p *param);
2213 static void write_local (outf_p output_header,
2214 type_p structures, type_p param_structs);
2215 static void write_enum_defn (type_p structures, type_p param_structs);
2216 static int contains_scalar_p (type_p t);
2217 static void put_mangled_filename (outf_p, const input_file *);
2218 static void finish_root_table (struct flist *flp, const char *pfx,
2219 const char *tname, const char *lastname,
2221 static void write_root (outf_p, pair_p, type_p, const char *, int,
2222 struct fileloc *, const char *, bool);
2223 static void write_array (outf_p f, pair_p v,
2224 const struct write_types_data *wtd);
2225 static void write_roots (pair_p, bool);
2227 /* Parameters for walk_type. */
2229 struct walk_type_data
2231 process_field_fn process_field;
2236 const char *prev_val[4];
2239 const struct fileloc *line;
2244 const char *reorder_fn;
2246 bool fn_wants_lvalue;
2249 /* Print a mangled name representing T to OF. */
2252 output_mangled_typename (outf_p of, const_type_p t)
2264 output_mangled_typename (of, t->u.p);
2274 case TYPE_LANG_STRUCT:
2275 oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag),
2278 case TYPE_PARAM_STRUCT:
2281 for (i = 0; i < NUM_PARAM; i++)
2282 if (t->u.param_struct.param[i] != NULL)
2283 output_mangled_typename (of, t->u.param_struct.param[i]);
2284 output_mangled_typename (of, t->u.param_struct.stru);
2292 /* Print PARAM to D->OF processing escapes. D->VAL references the
2293 current object, D->PREV_VAL the object containing the current
2294 object, ONAME is the name of the option and D->LINE is used to
2295 print error messages. */
2298 output_escaped_param (struct walk_type_data *d, const char *param,
2303 for (p = param; *p; p++)
2305 oprintf (d->of, "%c", *p);
2310 oprintf (d->of, "(%s)", d->prev_val[2]);
2313 oprintf (d->of, "(%s)", d->prev_val[0]);
2316 oprintf (d->of, "(%s)", d->prev_val[1]);
2320 const char *pp = d->val + strlen (d->val);
2321 while (pp[-1] == ']')
2324 oprintf (d->of, "%s", pp);
2328 error_at_line (d->line, "`%s' option contains bad escape %c%c",
2333 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2334 which is of type T. Write code to D->OF to constrain execution (at
2335 the point that D->PROCESS_FIELD is called) to the appropriate
2336 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2337 pointers to those objects. D->PREV_VAL lists the objects
2338 containing the current object, D->OPT is a list of options to
2339 apply, D->INDENT is the current indentation level, D->LINE is used
2340 to print error messages, D->BITMAP indicates which languages to
2341 print the structure for, and D->PARAM is the current parameter
2342 (from an enclosing param_is option). */
2345 walk_type (type_p t, struct walk_type_data *d)
2347 const char *length = NULL;
2348 const char *desc = NULL;
2349 int maybe_undef_p = 0;
2350 int use_param_num = -1;
2351 int use_params_p = 0;
2353 const struct nested_ptr_data *nested_ptr_d = NULL;
2355 d->needs_cast_p = false;
2356 for (oo = d->opt; oo; oo = oo->next)
2357 if (strcmp (oo->name, "length") == 0 && oo->kind == OPTION_STRING)
2358 length = oo->info.string;
2359 else if (strcmp (oo->name, "maybe_undef") == 0)
2361 else if (strncmp (oo->name, "use_param", 9) == 0
2362 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2363 use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
2364 else if (strcmp (oo->name, "use_params") == 0)
2366 else if (strcmp (oo->name, "desc") == 0 && oo->kind == OPTION_STRING)
2367 desc = oo->info.string;
2368 else if (strcmp (oo->name, "mark_hook") == 0)
2370 else if (strcmp (oo->name, "nested_ptr") == 0
2371 && oo->kind == OPTION_NESTED)
2372 nested_ptr_d = (const struct nested_ptr_data *) oo->info.nested;
2373 else if (strcmp (oo->name, "dot") == 0)
2375 else if (strcmp (oo->name, "tag") == 0)
2377 else if (strcmp (oo->name, "special") == 0)
2379 else if (strcmp (oo->name, "skip") == 0)
2381 else if (strcmp (oo->name, "default") == 0)
2383 else if (strcmp (oo->name, "param_is") == 0)
2385 else if (strncmp (oo->name, "param", 5) == 0
2386 && ISDIGIT (oo->name[5]) && strcmp (oo->name + 6, "_is") == 0)
2388 else if (strcmp (oo->name, "chain_next") == 0)
2390 else if (strcmp (oo->name, "chain_prev") == 0)
2392 else if (strcmp (oo->name, "chain_circular") == 0)
2394 else if (strcmp (oo->name, "reorder") == 0)
2396 else if (strcmp (oo->name, "variable_size") == 0)
2399 error_at_line (d->line, "unknown option `%s'\n", oo->name);
2406 int pointer_p = t->kind == TYPE_POINTER;
2410 if (!UNION_OR_STRUCT_P (t))
2411 error_at_line (d->line, "`use_params' option on unimplemented type");
2413 t = find_param_structure (t, d->param);
2415 t = create_pointer (t);
2418 if (use_param_num != -1)
2420 if (d->param != NULL && d->param[use_param_num] != NULL)
2422 type_p nt = d->param[use_param_num];
2424 if (t->kind == TYPE_ARRAY)
2425 nt = create_array (nt, t->u.a.len);
2426 else if (length != NULL && t->kind == TYPE_POINTER)
2427 nt = create_pointer (nt);
2428 d->needs_cast_p = (t->kind != TYPE_POINTER
2429 && (nt->kind == TYPE_POINTER
2430 || nt->kind == TYPE_STRING));
2434 error_at_line (d->line, "no parameter defined for `%s'", d->val);
2438 && (t->kind != TYPE_POINTER || !UNION_OR_STRUCT_P (t->u.p)))
2440 error_at_line (d->line,
2441 "field `%s' has invalid option `maybe_undef_p'\n",
2450 d->process_field (t, d);
2455 if (maybe_undef_p && t->u.p->u.s.line.file == NULL)
2457 oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
2463 if (!UNION_OR_STRUCT_P (t->u.p)
2464 && t->u.p->kind != TYPE_PARAM_STRUCT)
2466 error_at_line (d->line,
2467 "field `%s' is pointer to unimplemented type",
2474 const char *oldprevval2 = d->prev_val[2];
2476 if (!UNION_OR_STRUCT_P (nested_ptr_d->type))
2478 error_at_line (d->line,
2479 "field `%s' has invalid "
2480 "option `nested_ptr'\n", d->val);
2484 d->prev_val[2] = d->val;
2485 oprintf (d->of, "%*s{\n", d->indent, "");
2487 d->val = xasprintf ("x%d", d->counter++);
2488 oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "",
2489 (nested_ptr_d->type->kind == TYPE_UNION
2490 ? "union" : "struct"),
2491 nested_ptr_d->type->u.s.tag,
2492 d->fn_wants_lvalue ? "" : "const ", d->val);
2493 oprintf (d->of, "%*s", d->indent + 2, "");
2494 output_escaped_param (d, nested_ptr_d->convert_from,
2496 oprintf (d->of, ";\n");
2498 d->process_field (nested_ptr_d->type, d);
2500 if (d->fn_wants_lvalue)
2502 oprintf (d->of, "%*s%s = ", d->indent, "",
2504 d->prev_val[2] = d->val;
2505 output_escaped_param (d, nested_ptr_d->convert_to,
2507 oprintf (d->of, ";\n");
2511 oprintf (d->of, "%*s}\n", d->indent, "");
2512 d->val = d->prev_val[2];
2513 d->prev_val[2] = oldprevval2;
2516 d->process_field (t->u.p, d);
2520 int loopcounter = d->counter++;
2521 const char *oldval = d->val;
2522 const char *oldprevval3 = d->prev_val[3];
2525 oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2527 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2528 oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent,
2529 "", loopcounter, loopcounter);
2530 output_escaped_param (d, length, "length");
2531 oprintf (d->of, "); i%d++) {\n", loopcounter);
2533 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2535 d->prev_val[3] = oldval;
2536 walk_type (t->u.p, d);
2539 d->prev_val[3] = oldprevval3;
2542 oprintf (d->of, "%*s}\n", d->indent, "");
2543 d->process_field (t, d);
2545 oprintf (d->of, "%*s}\n", d->indent, "");
2552 int loopcounter = d->counter++;
2553 const char *oldval = d->val;
2556 /* If it's an array of scalars, we optimize by not generating
2558 if (t->u.a.p->kind == TYPE_SCALAR)
2561 /* When walking an array, compute the length and store it in a
2562 local variable before walking the array elements, instead of
2563 recomputing the length expression each time through the loop.
2564 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2565 where the length is stored in the first array element,
2566 because otherwise that operand can get overwritten on the
2568 oprintf (d->of, "%*s{\n", d->indent, "");
2570 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2571 oprintf (d->of, "%*ssize_t l%d = (size_t)(",
2572 d->indent, "", loopcounter);
2574 output_escaped_param (d, length, "length");
2576 oprintf (d->of, "%s", t->u.a.len);
2577 oprintf (d->of, ");\n");
2579 oprintf (d->of, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2581 loopcounter, loopcounter, loopcounter, loopcounter);
2583 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2585 walk_type (t->u.a.p, d);
2590 oprintf (d->of, "%*s}\n", d->indent, "");
2592 oprintf (d->of, "%*s}\n", d->indent, "");
2600 const char *oldval = d->val;
2601 const char *oldprevval1 = d->prev_val[1];
2602 const char *oldprevval2 = d->prev_val[2];
2603 const int union_p = t->kind == TYPE_UNION;
2604 int seen_default_p = 0;
2607 if (!t->u.s.line.file)
2608 error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
2610 if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
2612 error_at_line (d->line,
2613 "structure `%s' defined for mismatching languages",
2615 error_at_line (&t->u.s.line, "one structure defined here");
2618 /* Some things may also be defined in the structure's options. */
2619 for (o = t->u.s.opt; o; o = o->next)
2620 if (!desc && strcmp (o->name, "desc") == 0
2621 && o->kind == OPTION_STRING)
2622 desc = o->info.string;
2624 d->prev_val[2] = oldval;
2625 d->prev_val[1] = oldprevval2;
2630 error_at_line (d->line,
2631 "missing `desc' option for union `%s'",
2635 oprintf (d->of, "%*sswitch (", d->indent, "");
2636 output_escaped_param (d, desc, "desc");
2637 oprintf (d->of, ")\n");
2639 oprintf (d->of, "%*s{\n", d->indent, "");
2641 for (f = t->u.s.fields; f; f = f->next)
2644 const char *dot = ".";
2645 const char *tagid = NULL;
2648 int use_param_p = 0;
2651 d->reorder_fn = NULL;
2652 for (oo = f->opt; oo; oo = oo->next)
2653 if (strcmp (oo->name, "dot") == 0
2654 && oo->kind == OPTION_STRING)
2655 dot = oo->info.string;
2656 else if (strcmp (oo->name, "tag") == 0
2657 && oo->kind == OPTION_STRING)
2658 tagid = oo->info.string;
2659 else if (strcmp (oo->name, "skip") == 0)
2661 else if (strcmp (oo->name, "default") == 0)
2663 else if (strcmp (oo->name, "reorder") == 0
2664 && oo->kind == OPTION_STRING)
2665 d->reorder_fn = oo->info.string;
2666 else if (strncmp (oo->name, "use_param", 9) == 0
2667 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2673 if (union_p && tagid)
2675 oprintf (d->of, "%*scase %s:\n", d->indent, "", tagid);
2678 else if (union_p && default_p)
2680 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2684 else if (!union_p && (default_p || tagid))
2685 error_at_line (d->line,
2686 "can't use `%s' outside a union on field `%s'",
2687 default_p ? "default" : "tag", f->name);
2688 else if (union_p && !(default_p || tagid)
2689 && f->type->kind == TYPE_SCALAR)
2692 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2693 get_input_file_name (d->line->file), d->line->line,
2697 else if (union_p && !(default_p || tagid))
2698 error_at_line (d->line,
2699 "field `%s' is missing `tag' or `default' option",
2703 d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name);
2705 d->used_length = false;
2707 if (union_p && use_param_p && d->param == NULL)
2708 oprintf (d->of, "%*sgcc_unreachable ();\n", d->indent, "");
2710 walk_type (f->type, d);
2716 oprintf (d->of, "%*sbreak;\n", d->indent, "");
2720 d->reorder_fn = NULL;
2723 d->prev_val[1] = oldprevval1;
2724 d->prev_val[2] = oldprevval2;
2726 if (union_p && !seen_default_p)
2728 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2729 oprintf (d->of, "%*s break;\n", d->indent, "");
2733 oprintf (d->of, "%*s}\n", d->indent, "");
2739 case TYPE_LANG_STRUCT:
2742 for (nt = t->u.s.lang_struct; nt; nt = nt->next)
2743 if ((d->bitmap & nt->u.s.bitmap) == d->bitmap)
2746 error_at_line (d->line, "structure `%s' differs between languages",
2753 case TYPE_PARAM_STRUCT:
2755 type_p *oldparam = d->param;
2757 d->param = t->u.param_struct.param;
2758 walk_type (t->u.param_struct.stru, d);
2759 d->param = oldparam;
2768 /* process_field routine for marking routines. */
2771 write_types_process_field (type_p f, const struct walk_type_data *d)
2773 const struct write_types_data *wtd;
2774 const char *cast = d->needs_cast_p ? "(void *)" : "";
2775 wtd = (const struct write_types_data *) d->cookie;
2782 oprintf (d->of, "%*s%s (%s%s", d->indent, "",
2783 wtd->subfield_marker_routine, cast, d->val);
2784 if (wtd->param_prefix)
2786 oprintf (d->of, ", %s", d->prev_val[3]);
2789 oprintf (d->of, ", gt_%s_", wtd->param_prefix);
2790 output_mangled_typename (d->of, d->orig_s);
2793 oprintf (d->of, ", gt_%sa_%s", wtd->param_prefix, d->prev_val[0]);
2795 if (f->u.p->kind == TYPE_PARAM_STRUCT
2796 && f->u.p->u.s.line.file != NULL)
2798 oprintf (d->of, ", gt_e_");
2799 output_mangled_typename (d->of, f);
2801 else if (UNION_OR_STRUCT_P (f) && f->u.p->u.s.line.file != NULL)
2803 oprintf (d->of, ", gt_ggc_e_");
2804 output_mangled_typename (d->of, f);
2807 oprintf (d->of, ", gt_types_enum_last");
2809 oprintf (d->of, ");\n");
2810 if (d->reorder_fn && wtd->reorder_note_routine)
2811 oprintf (d->of, "%*s%s (%s%s, %s, %s);\n", d->indent, "",
2812 wtd->reorder_note_routine, cast, d->val,
2813 d->prev_val[3], d->reorder_fn);
2819 case TYPE_LANG_STRUCT:
2820 case TYPE_PARAM_STRUCT:
2821 oprintf (d->of, "%*sgt_%s_", d->indent, "", wtd->prefix);
2822 output_mangled_typename (d->of, f);
2823 oprintf (d->of, " (%s%s);\n", cast, d->val);
2824 if (d->reorder_fn && wtd->reorder_note_routine)
2825 oprintf (d->of, "%*s%s (%s%s, %s%s, %s);\n", d->indent, "",
2826 wtd->reorder_note_routine, cast, d->val, cast, d->val,
2838 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
2841 output_type_enum (outf_p of, type_p s)
2843 if (s->kind == TYPE_PARAM_STRUCT && s->u.param_struct.line.file != NULL)
2845 oprintf (of, ", gt_e_");
2846 output_mangled_typename (of, s);
2848 else if (UNION_OR_STRUCT_P (s) && s->u.s.line.file != NULL)
2850 oprintf (of, ", gt_ggc_e_");
2851 output_mangled_typename (of, s);
2854 oprintf (of, ", gt_types_enum_last");
2857 /* Return an output file that is suitable for definitions which can
2858 reference struct S */
2861 get_output_file_for_structure (const_type_p s, type_p *param)
2863 const input_file *fn;
2866 gcc_assert (UNION_OR_STRUCT_P (s));
2867 fn = s->u.s.line.file;
2869 /* This is a hack, and not the good kind either. */
2870 for (i = NUM_PARAM - 1; i >= 0; i--)
2871 if (param && param[i] && param[i]->kind == TYPE_POINTER
2872 && UNION_OR_STRUCT_P (param[i]->u.p))
2873 fn = param[i]->u.p->u.s.line.file;
2875 /* The call to get_output_file_with_visibility may update fn by
2876 caching its result inside, so we need the CONST_CAST. */
2877 return get_output_file_with_visibility (CONST_CAST (input_file*, fn));
2880 /* For S, a structure that's part of ORIG_S, and using parameters
2881 PARAM, write out a routine that:
2882 - Takes a parameter, a void * but actually of type *S
2883 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2884 field of S or its substructures and (in some cases) things
2885 that are pointed to by S.
2889 write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2890 const struct write_types_data *wtd)
2892 const char *chain_next = NULL;
2893 const char *chain_prev = NULL;
2894 const char *chain_circular = NULL;
2895 const char *mark_hook_name = NULL;
2897 struct walk_type_data d;
2899 memset (&d, 0, sizeof (d));
2900 d.of = get_output_file_for_structure (s, param);
2901 for (opt = s->u.s.opt; opt; opt = opt->next)
2902 if (strcmp (opt->name, "chain_next") == 0
2903 && opt->kind == OPTION_STRING)
2904 chain_next = opt->info.string;
2905 else if (strcmp (opt->name, "chain_prev") == 0
2906 && opt->kind == OPTION_STRING)
2907 chain_prev = opt->info.string;
2908 else if (strcmp (opt->name, "chain_circular") == 0
2909 && opt->kind == OPTION_STRING)
2910 chain_circular = opt->info.string;
2911 else if (strcmp (opt->name, "mark_hook") == 0
2912 && opt->kind == OPTION_STRING)
2913 mark_hook_name = opt->info.string;
2914 if (chain_prev != NULL && chain_next == NULL)
2915 error_at_line (&s->u.s.line, "chain_prev without chain_next");
2916 if (chain_circular != NULL && chain_next != NULL)
2917 error_at_line (&s->u.s.line, "chain_circular with chain_next");
2918 if (chain_circular != NULL)
2919 chain_next = chain_circular;
2921 d.process_field = write_types_process_field;
2925 d.line = &s->u.s.line;
2926 d.bitmap = s->u.s.bitmap;
2928 d.prev_val[0] = "*x";
2929 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2930 d.prev_val[3] = "x";
2933 oprintf (d.of, "\n");
2934 oprintf (d.of, "void\n");
2936 oprintf (d.of, "gt_%sx_%s", wtd->prefix, orig_s->u.s.tag);
2939 oprintf (d.of, "gt_%s_", wtd->prefix);
2940 output_mangled_typename (d.of, orig_s);
2942 oprintf (d.of, " (void *x_p)\n");
2943 oprintf (d.of, "{\n");
2944 oprintf (d.of, " %s %s * %sx = (%s %s *)x_p;\n",
2945 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2946 chain_next == NULL ? "const " : "",
2947 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2948 if (chain_next != NULL)
2949 oprintf (d.of, " %s %s * xlimit = x;\n",
2950 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2951 if (chain_next == NULL)
2953 oprintf (d.of, " if (%s (x", wtd->marker_routine);
2954 if (wtd->param_prefix)
2956 oprintf (d.of, ", x, gt_%s_", wtd->param_prefix);
2957 output_mangled_typename (d.of, orig_s);
2958 output_type_enum (d.of, orig_s);
2960 oprintf (d.of, "))\n");
2964 if (chain_circular != NULL)
2965 oprintf (d.of, " if (!%s (xlimit", wtd->marker_routine);
2967 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2968 if (wtd->param_prefix)
2970 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2971 output_mangled_typename (d.of, orig_s);
2972 output_type_enum (d.of, orig_s);
2974 oprintf (d.of, "))\n");
2975 if (chain_circular != NULL)
2976 oprintf (d.of, " return;\n do\n");
2977 if (mark_hook_name && !wtd->skip_hooks)
2979 oprintf (d.of, " {\n");
2980 oprintf (d.of, " %s (xlimit);\n ", mark_hook_name);
2982 oprintf (d.of, " xlimit = (");
2983 d.prev_val[2] = "*xlimit";
2984 output_escaped_param (&d, chain_next, "chain_next");
2985 oprintf (d.of, ");\n");
2986 if (mark_hook_name && !wtd->skip_hooks)
2987 oprintf (d.of, " }\n");
2988 if (chain_prev != NULL)
2990 oprintf (d.of, " if (x != xlimit)\n");
2991 oprintf (d.of, " for (;;)\n");
2992 oprintf (d.of, " {\n");
2993 oprintf (d.of, " %s %s * const xprev = (",
2994 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2996 d.prev_val[2] = "*x";
2997 output_escaped_param (&d, chain_prev, "chain_prev");
2998 oprintf (d.of, ");\n");
2999 oprintf (d.of, " if (xprev == NULL) break;\n");
3000 oprintf (d.of, " x = xprev;\n");
3001 oprintf (d.of, " (void) %s (xprev", wtd->marker_routine);
3002 if (wtd->param_prefix)
3004 oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
3005 output_mangled_typename (d.of, orig_s);
3006 output_type_enum (d.of, orig_s);
3008 oprintf (d.of, ");\n");
3009 oprintf (d.of, " }\n");
3011 if (chain_circular != NULL)
3013 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
3014 if (wtd->param_prefix)
3016 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
3017 output_mangled_typename (d.of, orig_s);
3018 output_type_enum (d.of, orig_s);
3020 oprintf (d.of, "));\n");
3021 if (mark_hook_name && !wtd->skip_hooks)
3022 oprintf (d.of, " %s (xlimit);\n", mark_hook_name);
3023 oprintf (d.of, " do\n");
3026 oprintf (d.of, " while (x != xlimit)\n");
3028 oprintf (d.of, " {\n");
3029 if (mark_hook_name && chain_next == NULL && !wtd->skip_hooks)
3031 oprintf (d.of, " %s (x);\n", mark_hook_name);
3033 d.prev_val[2] = "*x";
3037 if (chain_next != NULL)
3039 oprintf (d.of, " x = (");
3040 output_escaped_param (&d, chain_next, "chain_next");
3041 oprintf (d.of, ");\n");
3044 oprintf (d.of, " }\n");
3045 if (chain_circular != NULL)
3046 oprintf (d.of, " while (x != xlimit);\n");
3047 oprintf (d.of, "}\n");
3050 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
3053 write_types (outf_p output_header, type_p structures, type_p param_structs,
3054 const struct write_types_data *wtd)
3056 int nbfun = 0; /* Count the emitted functions. */
3059 oprintf (output_header, "\n/* %s*/\n", wtd->comment);
3060 /* We first emit the macros and the declarations. Functions' code is
3061 emitted afterwards. This is needed in plugin mode. */
3062 oprintf (output_header, "/* macros and declarations */\n");
3063 for (s = structures; s; s = s->next)
3064 if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
3068 if (s->gc_used == GC_MAYBE_POINTED_TO && s->u.s.line.file == NULL)
3071 oprintf (output_header, "#define gt_%s_", wtd->prefix);
3072 output_mangled_typename (output_header, s);
3073 oprintf (output_header, "(X) do { \\\n");
3074 oprintf (output_header,
3075 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
3077 oprintf (output_header, " } while (0)\n");
3079 for (opt = s->u.s.opt; opt; opt = opt->next)
3080 if (strcmp (opt->name, "ptr_alias") == 0
3081 && opt->kind == OPTION_TYPE)
3083 const_type_p const t = (const_type_p) opt->info.type;
3084 if (t->kind == TYPE_STRUCT
3085 || t->kind == TYPE_UNION || t->kind == TYPE_LANG_STRUCT)
3086 oprintf (output_header,
3087 "#define gt_%sx_%s gt_%sx_%s\n",
3088 wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
3090 error_at_line (&s->u.s.line,
3091 "structure alias is not a structure");
3097 /* Declare the marker procedure only once. */
3098 oprintf (output_header,
3099 "extern void gt_%sx_%s (void *);\n",
3100 wtd->prefix, s->u.s.tag);
3102 if (s->u.s.line.file == NULL)
3104 fprintf (stderr, "warning: structure `%s' used but not defined\n",
3110 for (s = param_structs; s; s = s->next)
3111 if (s->gc_used == GC_POINTED_TO)
3113 type_p stru = s->u.param_struct.stru;
3115 /* Declare the marker procedure. */
3116 oprintf (output_header, "extern void gt_%s_", wtd->prefix);
3117 output_mangled_typename (output_header, s);
3118 oprintf (output_header, " (void *);\n");
3120 if (stru->u.s.line.file == NULL)
3122 fprintf (stderr, "warning: structure `%s' used but not defined\n",
3128 /* At last we emit the functions code. */
3129 oprintf (output_header, "\n/* functions code */\n");
3130 for (s = structures; s; s = s->next)
3131 if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
3135 if (s->gc_used == GC_MAYBE_POINTED_TO && s->u.s.line.file == NULL)
3137 for (opt = s->u.s.opt; opt; opt = opt->next)
3138 if (strcmp (opt->name, "ptr_alias") == 0)
3143 if (s->kind == TYPE_LANG_STRUCT)
3146 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
3149 DBGPRINTF ("writing func #%d lang_struct ss @ %p '%s'",
3150 nbfun, (void*) ss, ss->u.s.tag);
3151 write_func_for_structure (s, ss, NULL, wtd);
3157 DBGPRINTF ("writing func #%d struct s @ %p '%s'",
3158 nbfun, (void*) s, s->u.s.tag);
3159 write_func_for_structure (s, s, NULL, wtd);
3164 /* Structure s is not possibly pointed to, so can be ignored. */
3165 DBGPRINTF ("ignored s @ %p '%s' gc_used#%d",
3166 (void*)s, s->u.s.tag,
3170 for (s = param_structs; s; s = s->next)
3171 if (s->gc_used == GC_POINTED_TO)
3173 type_p *param = s->u.param_struct.param;
3174 type_p stru = s->u.param_struct.stru;
3175 if (stru->u.s.line.file == NULL)
3177 if (stru->kind == TYPE_LANG_STRUCT)
3180 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3183 DBGPRINTF ("writing func #%d param lang_struct ss @ %p '%s'",
3184 nbfun, (void*) ss, ss->u.s.tag);
3185 write_func_for_structure (s, ss, param, wtd);
3191 DBGPRINTF ("writing func #%d param struct s @ %p stru @ %p '%s'",
3193 (void*) stru, stru->u.s.tag);
3194 write_func_for_structure (s, stru, param, wtd);
3199 /* Param structure s is not pointed to, so should be ignored. */
3200 DBGPRINTF ("ignored s @ %p", (void*)s);
3202 if (verbosity_level >= 2)
3203 printf ("%s emitted %d routines for %s\n",
3204 progname, nbfun, wtd->comment);
3207 static const struct write_types_data ggc_wtd = {
3208 "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
3209 "GC marker procedures. ",
3213 static const struct write_types_data pch_wtd = {
3214 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
3215 "gt_pch_note_reorder",
3216 "PCH type-walking procedures. ",
3220 /* Write out the local pointer-walking routines. */
3222 /* process_field routine for local pointer-walking. */
3225 write_types_local_process_field (type_p f, const struct walk_type_data *d)
3232 case TYPE_LANG_STRUCT:
3233 case TYPE_PARAM_STRUCT:
3235 oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "",
3237 oprintf (d->of, "%*s op (&(%s), cookie);\n", d->indent, "", d->val);
3248 /* For S, a structure that's part of ORIG_S, and using parameters
3249 PARAM, write out a routine that:
3250 - Is of type gt_note_pointers
3251 - Calls PROCESS_FIELD on each field of S or its substructures.
3255 write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param)
3257 struct walk_type_data d;
3259 memset (&d, 0, sizeof (d));
3260 d.of = get_output_file_for_structure (s, param);
3261 d.process_field = write_types_local_process_field;
3263 d.line = &s->u.s.line;
3264 d.bitmap = s->u.s.bitmap;
3266 d.prev_val[0] = d.prev_val[2] = "*x";
3267 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
3268 d.prev_val[3] = "x";
3270 d.fn_wants_lvalue = true;
3272 oprintf (d.of, "\n");
3273 oprintf (d.of, "void\n");
3274 oprintf (d.of, "gt_pch_p_");
3275 output_mangled_typename (d.of, orig_s);
3276 oprintf (d.of, " (ATTRIBUTE_UNUSED void *this_obj,\n"
3278 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3279 "\tATTRIBUTE_UNUSED void *cookie)\n");
3280 oprintf (d.of, "{\n");
3281 oprintf (d.of, " %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
3282 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
3283 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
3286 oprintf (d.of, "}\n");
3289 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
3292 write_local (outf_p output_header, type_p structures, type_p param_structs)
3298 oprintf (output_header, "\n/* Local pointer-walking routines. */\n");
3299 for (s = structures; s; s = s->next)
3300 if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
3304 if (s->u.s.line.file == NULL)
3306 for (opt = s->u.s.opt; opt; opt = opt->next)
3307 if (strcmp (opt->name, "ptr_alias") == 0
3308 && opt->kind == OPTION_TYPE)
3310 const_type_p const t = (const_type_p) opt->info.type;
3311 if (t->kind == TYPE_STRUCT
3312 || t->kind == TYPE_UNION || t->kind == TYPE_LANG_STRUCT)
3314 oprintf (output_header, "#define gt_pch_p_");
3315 output_mangled_typename (output_header, s);
3316 oprintf (output_header, " gt_pch_p_");
3317 output_mangled_typename (output_header, t);
3318 oprintf (output_header, "\n");
3321 error_at_line (&s->u.s.line,
3322 "structure alias is not a structure");
3328 /* Declare the marker procedure only once. */
3329 oprintf (output_header, "extern void gt_pch_p_");
3330 output_mangled_typename (output_header, s);
3331 oprintf (output_header,
3332 "\n (void *, void *, gt_pointer_operator, void *);\n");
3334 if (s->kind == TYPE_LANG_STRUCT)
3337 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
3338 write_local_func_for_structure (s, ss, NULL);
3341 write_local_func_for_structure (s, s, NULL);
3344 for (s = param_structs; s; s = s->next)
3345 if (s->gc_used == GC_POINTED_TO)
3347 type_p *param = s->u.param_struct.param;
3348 type_p stru = s->u.param_struct.stru;
3350 /* Declare the marker procedure. */
3351 oprintf (output_header, "extern void gt_pch_p_");
3352 output_mangled_typename (output_header, s);
3353 oprintf (output_header,
3354 "\n (void *, void *, gt_pointer_operator, void *);\n");
3356 if (stru->u.s.line.file == NULL)
3358 fprintf (stderr, "warning: structure `%s' used but not defined\n",
3363 if (stru->kind == TYPE_LANG_STRUCT)
3366 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
3367 write_local_func_for_structure (s, ss, param);
3370 write_local_func_for_structure (s, stru, param);
3374 /* Nonzero if S is a type for which typed GC allocators should be output. */
3376 #define USED_BY_TYPED_GC_P(s) \
3377 (((s->kind == TYPE_POINTER) \
3378 && ((s->u.p->gc_used == GC_POINTED_TO) \
3379 || (s->u.p->gc_used == GC_USED))) \
3380 || (UNION_OR_STRUCT_P (s) && \
3381 (((s)->gc_used == GC_POINTED_TO) \
3382 || ((s)->gc_used == GC_MAYBE_POINTED_TO \
3383 && s->u.s.line.file != NULL) \
3384 || ((s)->gc_used == GC_USED \
3385 && strncmp (s->u.s.tag, "anonymous", strlen ("anonymous"))))))
3388 /* Write out the 'enum' definition for gt_types_enum. */
3391 write_enum_defn (type_p structures, type_p param_structs)
3395 int nbparamstruct = 0;
3399 oprintf (header_file, "\n/* Enumeration of types known. */\n");
3400 oprintf (header_file, "enum gt_types_enum {\n");
3401 for (s = structures; s; s = s->next)
3402 if (USED_BY_TYPED_GC_P (s))
3405 DBGPRINTF ("write_enum_defn s @ %p nbstruct %d",
3406 (void*) s, nbstruct);
3407 if (UNION_OR_STRUCT_P (s))
3408 DBGPRINTF ("write_enum_defn s %p #%d is unionorstruct tagged %s",
3409 (void*) s, nbstruct, s->u.s.tag);
3410 oprintf (header_file, " gt_ggc_e_");
3411 output_mangled_typename (header_file, s);
3412 oprintf (header_file, ",\n");
3414 for (s = param_structs; s; s = s->next)
3415 if (s->gc_used == GC_POINTED_TO)
3418 DBGPRINTF ("write_enum_defn s %p nbparamstruct %d",
3419 (void*) s, nbparamstruct);
3420 oprintf (header_file, " gt_e_");
3421 output_mangled_typename (header_file, s);
3422 oprintf (header_file, ",\n");
3424 oprintf (header_file, " gt_types_enum_last\n");
3425 oprintf (header_file, "};\n");
3426 if (verbosity_level >= 2)
3427 printf ("%s handled %d GTY-ed structures & %d parameterized structures.\n",
3428 progname, nbstruct, nbparamstruct);
3432 /* Might T contain any non-pointer elements? */
3435 contains_scalar_p (type_p t)
3443 return contains_scalar_p (t->u.a.p);
3445 /* Could also check for structures that have no non-pointer
3446 fields, but there aren't enough of those to worry about. */
3451 /* Mangle INPF and print it to F. */
3454 put_mangled_filename (outf_p f, const input_file *inpf)
3456 /* The call to get_output_file_name may indirectly update fn since
3457 get_output_file_with_visibility caches its result inside, so we
3458 need the CONST_CAST. */
3459 const char *name = get_output_file_name (CONST_CAST (input_file*, inpf));
3462 for (; *name != 0; name++)
3463 if (ISALNUM (*name))
3464 oprintf (f, "%c", *name);
3466 oprintf (f, "%c", '_');
3469 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
3470 LASTNAME, and NAME are all strings to insert in various places in
3471 the resulting code. */
3474 finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
3475 const char *tname, const char *name)
3479 for (fli2 = flp; fli2; fli2 = fli2->next)
3480 if (fli2->started_p)
3482 oprintf (fli2->f, " %s\n", lastname);
3483 oprintf (fli2->f, "};\n\n");
3486 for (fli2 = flp; fli2 && base_files; fli2 = fli2->next)
3487 if (fli2->started_p)
3489 lang_bitmap bitmap = get_lang_bitmap (fli2->file);
3492 for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3495 oprintf (base_files[fnum],
3496 "extern const struct %s gt_%s_", tname, pfx);
3497 put_mangled_filename (base_files[fnum], fli2->file);
3498 oprintf (base_files[fnum], "[];\n");
3504 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3505 oprintf (base_files[fnum],
3506 "EXPORTED_CONST struct %s * const %s[] = {\n", tname, name);
3510 for (fli2 = flp; fli2; fli2 = fli2->next)
3511 if (fli2->started_p)
3513 lang_bitmap bitmap = get_lang_bitmap (fli2->file);
3516 fli2->started_p = 0;
3518 for (fnum = 0; base_files && bitmap != 0; fnum++, bitmap >>= 1)
3521 oprintf (base_files[fnum], " gt_%s_", pfx);
3522 put_mangled_filename (base_files[fnum], fli2->file);
3523 oprintf (base_files[fnum], ",\n");
3529 for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
3531 oprintf (base_files[fnum], " NULL\n");
3532 oprintf (base_files[fnum], "};\n");
3537 /* Write the first three fields (pointer, count and stride) for
3538 root NAME to F. V and LINE are as for write_root.
3540 Return true if the entry could be written; return false on error. */
3543 start_root_entry (outf_p f, pair_p v, const char *name, struct fileloc *line)
3549 error_at_line (line, "`%s' is too complex to be a root", name);
3553 oprintf (f, " {\n");
3554 oprintf (f, " &%s,\n", name);
3557 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3559 oprintf (f, " * (%s)", ap->u.a.len);
3560 else if (ap == v->type)
3561 oprintf (f, " * ARRAY_SIZE (%s)", v->name);
3563 oprintf (f, " sizeof (%s", v->name);
3564 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3566 oprintf (f, "),\n");
3570 /* A subroutine of write_root for writing the roots for field FIELD_NAME,
3571 which has type FIELD_TYPE. Parameters F to EMIT_PCH are the parameters
3575 write_field_root (outf_p f, pair_p v, type_p type, const char *name,
3576 int has_length, struct fileloc *line, const char *if_marked,
3577 bool emit_pch, type_p field_type, const char *field_name)
3579 /* If the field reference is relative to V, rather than to some
3580 subcomponent of V, we can mark any subarrays with a single stride.
3581 We're effectively treating the field as a global variable in its
3583 if (v && type == v->type)
3588 newv.type = field_type;
3589 newv.name = ACONCAT ((v->name, ".", field_name, NULL));
3592 /* Otherwise, any arrays nested in the structure are too complex to
3594 else if (field_type->kind == TYPE_ARRAY)
3596 write_root (f, v, field_type, ACONCAT ((name, ".", field_name, NULL)),
3597 has_length, line, if_marked, emit_pch);
3600 /* Write out to F the table entry and any marker routines needed to
3601 mark NAME as TYPE. V can be one of three values:
3603 - null, if NAME is too complex to represent using a single
3604 count and stride. In this case, it is an error for NAME to
3605 contain any gc-ed data.
3607 - the outermost array that contains NAME, if NAME is part of an array.
3609 - the C variable that contains NAME, if NAME is not part of an array.
3611 LINE is the line of the C source that declares the root variable.
3612 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
3613 is nonzero iff we are building the root table for hash table caches. */
3616 write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
3617 struct fileloc *line, const char *if_marked, bool emit_pch)
3624 for (fld = type->u.s.fields; fld; fld = fld->next)
3627 const char *desc = NULL;
3630 for (o = fld->opt; o; o = o->next)
3631 if (strcmp (o->name, "skip") == 0)
3633 else if (strcmp (o->name, "desc") == 0
3634 && o->kind == OPTION_STRING)
3635 desc = o->info.string;
3636 else if (strcmp (o->name, "param_is") == 0)
3639 error_at_line (line,
3640 "field `%s' of global `%s' has unknown option `%s'",
3641 fld->name, name, o->name);
3645 else if (desc && fld->type->kind == TYPE_UNION)
3647 pair_p validf = NULL;
3650 for (ufld = fld->type->u.s.fields; ufld; ufld = ufld->next)
3652 const char *tag = NULL;
3654 for (oo = ufld->opt; oo; oo = oo->next)
3655 if (strcmp (oo->name, "tag") == 0
3656 && oo->kind == OPTION_STRING)
3657 tag = oo->info.string;
3658 if (tag == NULL || strcmp (tag, desc) != 0)
3661 error_at_line (line,
3662 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3663 name, fld->name, validf->name,
3664 name, fld->name, ufld->name, tag);
3668 write_field_root (f, v, type, name, 0, line, if_marked,
3669 emit_pch, validf->type,
3670 ACONCAT ((fld->name, ".",
3671 validf->name, NULL)));
3674 error_at_line (line,
3675 "global `%s.%s' has `desc' option but is not union",
3678 write_field_root (f, v, type, name, 0, line, if_marked,
3679 emit_pch, fld->type, fld->name);
3687 newname = xasprintf ("%s[0]", name);
3688 write_root (f, v, type->u.a.p, newname, has_length, line, if_marked,
3698 if (!start_root_entry (f, v, name, line))
3703 if (!has_length && UNION_OR_STRUCT_P (tp))
3705 oprintf (f, " >_ggc_mx_%s,\n", tp->u.s.tag);
3707 oprintf (f, " >_pch_nx_%s", tp->u.s.tag);
3709 oprintf (f, " NULL");
3711 else if (!has_length && tp->kind == TYPE_PARAM_STRUCT)
3713 oprintf (f, " >_ggc_m_");
3714 output_mangled_typename (f, tp);
3717 oprintf (f, ",\n >_pch_n_");
3718 output_mangled_typename (f, tp);
3721 oprintf (f, ",\n NULL");
3724 && (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
3726 oprintf (f, " >_ggc_ma_%s,\n", name);
3728 oprintf (f, " >_pch_na_%s", name);
3730 oprintf (f, " NULL");
3734 error_at_line (line,
3735 "global `%s' is pointer to unimplemented type",
3739 oprintf (f, ",\n &%s", if_marked);
3740 oprintf (f, "\n },\n");
3746 if (!start_root_entry (f, v, name, line))
3749 oprintf (f, " (gt_pointer_walker) >_ggc_m_S,\n");
3750 oprintf (f, " (gt_pointer_walker) >_pch_n_S\n");
3751 oprintf (f, " },\n");
3759 error_at_line (line, "global `%s' is unimplemented type", name);
3763 /* This generates a routine to walk an array. */
3766 write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
3768 struct walk_type_data d;
3771 memset (&d, 0, sizeof (d));
3777 d.bitmap = get_lang_bitmap (v->line.file);
3780 d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name);
3782 if (wtd->param_prefix)
3784 oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
3785 oprintf (f, " (void *, void *, gt_pointer_operator, void *);\n");
3786 oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3787 wtd->param_prefix, v->name);
3789 " ATTRIBUTE_UNUSED void *x_p,\n"
3790 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3791 " ATTRIBUTE_UNUSED void * cookie)\n");
3792 oprintf (d.of, "{\n");
3793 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3794 d.process_field = write_types_local_process_field;
3795 walk_type (v->type, &d);
3796 oprintf (f, "}\n\n");
3800 oprintf (f, "static void gt_%sa_%s (void *);\n", wtd->prefix, v->name);
3801 oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3802 wtd->prefix, v->name);
3804 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3805 d.process_field = write_types_process_field;
3806 walk_type (v->type, &d);
3808 oprintf (f, "}\n\n");
3811 /* Output a table describing the locations and types of VARIABLES. */
3814 write_roots (pair_p variables, bool emit_pch)
3817 struct flist *flp = NULL;
3819 for (v = variables; v; v = v->next)
3822 get_output_file_with_visibility (CONST_CAST (input_file*,
3825 const char *length = NULL;
3826 int deletable_p = 0;
3828 for (o = v->opt; o; o = o->next)
3829 if (strcmp (o->name, "length") == 0
3830 && o->kind == OPTION_STRING)
3831 length = o->info.string;
3832 else if (strcmp (o->name, "deletable") == 0)
3834 else if (strcmp (o->name, "param_is") == 0)
3836 else if (strncmp (o->name, "param", 5) == 0
3837 && ISDIGIT (o->name[5]) && strcmp (o->name + 6, "_is") == 0)
3839 else if (strcmp (o->name, "if_marked") == 0)
3842 error_at_line (&v->line,
3843 "global `%s' has unknown option `%s'",
3846 for (fli = flp; fli; fli = fli->next)
3847 if (fli->f == f && f)
3851 fli = XNEW (struct flist);
3855 fli->file = v->line.file;
3856 gcc_assert (fli->file);
3859 oprintf (f, "\n/* GC roots. */\n\n");
3864 && v->type->kind == TYPE_POINTER
3865 && (v->type->u.p->kind == TYPE_POINTER
3866 || v->type->u.p->kind == TYPE_STRUCT))
3868 write_array (f, v, &ggc_wtd);
3869 write_array (f, v, &pch_wtd);
3873 for (v = variables; v; v = v->next)
3875 outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
3882 for (o = v->opt; o; o = o->next)
3883 if (strcmp (o->name, "length") == 0)
3885 else if (strcmp (o->name, "deletable") == 0
3886 || strcmp (o->name, "if_marked") == 0)
3892 for (fli = flp; fli; fli = fli->next)
3895 if (!fli->started_p)
3899 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
3900 put_mangled_filename (f, v->line.file);
3901 oprintf (f, "[] = {\n");
3904 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
3907 finish_root_table (flp, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3910 for (v = variables; v; v = v->next)
3912 outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
3918 for (o = v->opt; o; o = o->next)
3919 if (strcmp (o->name, "deletable") == 0)
3921 else if (strcmp (o->name, "if_marked") == 0)
3927 for (fli = flp; fli; fli = fli->next)
3930 if (!fli->started_p)
3934 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
3935 put_mangled_filename (f, v->line.file);
3936 oprintf (f, "[] = {\n");
3939 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3943 finish_root_table (flp, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3944 "gt_ggc_deletable_rtab");
3946 for (v = variables; v; v = v->next)
3948 outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
3951 const char *if_marked = NULL;
3955 for (o = v->opt; o; o = o->next)
3956 if (strcmp (o->name, "length") == 0)
3958 else if (strcmp (o->name, "if_marked") == 0
3959 && o->kind == OPTION_STRING)
3960 if_marked = o->info.string;
3961 if (if_marked == NULL)
3963 if (v->type->kind != TYPE_POINTER
3964 || v->type->u.p->kind != TYPE_PARAM_STRUCT
3965 || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
3967 error_at_line (&v->line,
3968 "if_marked option used but not hash table");
3972 for (fli = flp; fli; fli = fli->next)
3975 if (!fli->started_p)
3979 oprintf (f, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
3980 put_mangled_filename (f, v->line.file);
3981 oprintf (f, "[] = {\n");
3984 write_root (f, v, v->type->u.p->u.param_struct.param[0],
3985 v->name, length_p, &v->line, if_marked, emit_pch);
3988 finish_root_table (flp, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
3989 "gt_ggc_cache_rtab");
3994 for (v = variables; v; v = v->next)
3996 outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
4000 int if_marked_p = 0;
4003 for (o = v->opt; o; o = o->next)
4004 if (strcmp (o->name, "length") == 0)
4006 else if (strcmp (o->name, "if_marked") == 0)
4012 for (fli = flp; fli; fli = fli->next)
4015 if (!fli->started_p)
4019 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
4020 put_mangled_filename (f, v->line.file);
4021 oprintf (f, "[] = {\n");
4024 write_root (f, v, v->type, v->name, length_p, &v->line, NULL, emit_pch);
4027 finish_root_table (flp, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4028 "gt_pch_cache_rtab");
4030 for (v = variables; v; v = v->next)
4032 outf_p f = get_output_file_with_visibility (CONST_CAST (input_file*,
4038 for (o = v->opt; o; o = o->next)
4039 if (strcmp (o->name, "deletable") == 0
4040 || strcmp (o->name, "if_marked") == 0)
4046 if (!contains_scalar_p (v->type))
4049 for (fli = flp; fli; fli = fli->next)
4052 if (!fli->started_p)
4056 oprintf (f, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
4057 put_mangled_filename (f, v->line.file);
4058 oprintf (f, "[] = {\n");
4061 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
4065 finish_root_table (flp, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4066 "gt_pch_scalar_rtab");
4069 /* Record the definition of a generic VEC structure, as if we had expanded
4070 the macros in vec.h:
4072 typedef struct VEC_<type>_base GTY(()) {
4075 <type> GTY((length ("%h.num"))) vec[1];
4078 where the GTY(()) tags are only present if is_scalar is _false_. */
4081 note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
4086 type_p len_ty = create_scalar_type ("unsigned");
4087 const char *name = concat ("VEC_", type_name, "_base", (char *) 0);
4091 t = create_scalar_type (type_name);
4096 t = resolve_typedef (type_name, pos);
4097 o = create_string_option (0, "length", "%h.num");
4099 /* We assemble the field list in reverse order. */
4100 fields = create_field_at (0, create_array (t, "1"), "vec", o, pos);
4101 fields = create_field_at (fields, len_ty, "alloc", 0, pos);
4102 fields = create_field_at (fields, len_ty, "num", 0, pos);
4104 do_typedef (name, new_structure (name, 0, pos, fields, 0), pos);
4107 /* Record the definition of an allocation-specific VEC structure, as if
4108 we had expanded the macros in vec.h:
4110 typedef struct VEC_<type>_<astrat> {
4111 VEC_<type>_base base;
4112 } VEC_<type>_<astrat>;
4115 note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
4117 const char *astratname = concat ("VEC_", type, "_", astrat, (char *) 0);
4118 const char *basename = concat ("VEC_", type, "_base", (char *) 0);
4120 pair_p field = create_field_at (0, resolve_typedef (basename, pos),
4123 do_typedef (astratname, new_structure (astratname, 0, pos, field, 0), pos);
4126 /* Returns the specifier keyword for a string or union type S, empty string
4130 get_type_specifier (const type_p s)
4132 if (s->kind == TYPE_STRUCT || s->kind == TYPE_LANG_STRUCT)
4134 if (s->kind == TYPE_UNION)
4139 /* TRUE if type S has the GTY variable_size annotation. */
4142 variable_size_p (const type_p s)
4145 for (o = s->u.s.opt; o; o = o->next)
4146 if (strcmp (o->name, "variable_size") == 0)
4154 { any_zone, specific_zone };
4156 /* Writes one typed allocator definition for type identifier TYPE_NAME with
4157 optional type specifier TYPE_SPECIFIER. The allocator name will contain
4158 ALLOCATOR_TYPE. If VARIABLE_SIZE is true, the allocator will have an extra
4159 parameter specifying number of bytes to allocate. If QUANTITY is set to
4160 VECTOR, a vector allocator will be output, if ZONE is set to SPECIFIC_ZONE,
4161 the allocator will be zone-specific. */
4164 write_typed_alloc_def (bool variable_size, const char *type_specifier,
4165 const char *type_name, const char *allocator_type,
4166 enum alloc_quantity quantity, enum alloc_zone zone)
4168 bool two_args = variable_size && (quantity == vector);
4169 bool third_arg = ((zone == specific_zone)
4170 && (variable_size || (quantity == vector)));
4172 oprintf (header_file, "#define ggc_alloc_%s%s", allocator_type, type_name);
4173 oprintf (header_file, "(%s%s%s%s%s) ",
4174 (variable_size ? "SIZE" : ""),
4175 (two_args ? ", " : ""),
4176 (quantity == vector) ? "n" : "",
4177 (third_arg ? ", " : ""), (zone == specific_zone) ? "z" : "");
4178 oprintf (header_file, "((%s%s *)", type_specifier, type_name);
4179 oprintf (header_file, "(ggc_internal_%salloc_stat (", allocator_type);
4180 if (zone == specific_zone)
4181 oprintf (header_file, "z, ");
4183 oprintf (header_file, "SIZE");
4185 oprintf (header_file, "sizeof (%s%s)", type_specifier, type_name);
4186 if (quantity == vector)
4187 oprintf (header_file, ", n");
4188 oprintf (header_file, " MEM_STAT_INFO)))\n");
4191 /* Writes a typed allocator definition for a struct or union S. */
4194 write_typed_struct_alloc_def (const type_p s, const char *allocator_type,
4195 enum alloc_quantity quantity,
4196 enum alloc_zone zone)
4198 write_typed_alloc_def (variable_size_p (s), get_type_specifier (s),
4199 s->u.s.tag, allocator_type, quantity, zone);
4202 /* Writes a typed allocator definition for a typedef P. */
4205 write_typed_typedef_alloc_def (const pair_p p, const char *allocator_type,
4206 enum alloc_quantity quantity,
4207 enum alloc_zone zone)
4209 write_typed_alloc_def (variable_size_p (p->type), "", p->name,
4210 allocator_type, quantity, zone);
4213 /* Writes typed allocator definitions for the types in STRUCTURES and
4214 TYPEDEFS that are used by GC. */
4217 write_typed_alloc_defns (const type_p structures, const pair_p typedefs)
4222 oprintf (header_file,
4223 "\n/* Allocators for known structs and unions. */\n\n");
4224 for (s = structures; s; s = s->next)
4226 if (!USED_BY_TYPED_GC_P (s))
4228 write_typed_struct_alloc_def (s, "", single, any_zone);
4229 write_typed_struct_alloc_def (s, "cleared_", single, any_zone);
4230 write_typed_struct_alloc_def (s, "vec_", vector, any_zone);
4231 write_typed_struct_alloc_def (s, "cleared_vec_", vector, any_zone);
4232 write_typed_struct_alloc_def (s, "zone_", single, specific_zone);
4233 write_typed_struct_alloc_def (s, "zone_cleared_", single,
4235 write_typed_struct_alloc_def (s, "zone_vec_", vector, specific_zone);
4236 write_typed_struct_alloc_def (s, "zone_cleared_vec_", vector,
4240 oprintf (header_file, "\n/* Allocators for known typedefs. */\n");
4241 for (p = typedefs; p; p = p->next)
4244 if (!USED_BY_TYPED_GC_P (s) || (strcmp (p->name, s->u.s.tag) == 0))
4246 write_typed_typedef_alloc_def (p, "", single, any_zone);
4247 write_typed_typedef_alloc_def (p, "cleared_", single, any_zone);
4248 write_typed_typedef_alloc_def (p, "vec_", vector, any_zone);
4249 write_typed_typedef_alloc_def (p, "cleared_vec_", vector, any_zone);
4250 write_typed_typedef_alloc_def (p, "zone_", single, specific_zone);
4251 write_typed_typedef_alloc_def (p, "zone_cleared_", single,
4253 write_typed_typedef_alloc_def (p, "zone_cleared_vec_", vector,
4258 /* Prints not-as-ugly version of a typename of T to OF. Trades the uniquness
4259 guaranteee for somewhat increased readability. If name conflicts do happen,
4260 this funcion will have to be adjusted to be more like
4261 output_mangled_typename. */
4264 output_typename (outf_p of, const_type_p t)
4269 oprintf (of, "str");
4272 oprintf (of, "scalar");
4275 output_typename (of, t->u.p);
4279 case TYPE_LANG_STRUCT:
4280 oprintf (of, "%s", t->u.s.tag);
4282 case TYPE_PARAM_STRUCT:
4285 for (i = 0; i < NUM_PARAM; i++)
4286 if (t->u.param_struct.param[i] != NULL)
4288 output_typename (of, t->u.param_struct.param[i]);
4291 output_typename (of, t->u.param_struct.stru);
4299 /* Writes a typed GC allocator for type S that is suitable as a callback for
4300 the splay tree implementation in libiberty. */
4303 write_splay_tree_allocator_def (const_type_p s)
4305 outf_p of = get_output_file_with_visibility (NULL);
4306 oprintf (of, "void * ggc_alloc_splay_tree_");
4307 output_typename (of, s);
4308 oprintf (of, " (int sz, void * nl)\n");
4309 oprintf (of, "{\n");
4310 oprintf (of, " return ggc_splay_alloc (");
4311 oprintf (of, "gt_e_");
4312 output_mangled_typename (of, s);
4313 oprintf (of, ", sz, nl);\n");
4314 oprintf (of, "}\n\n");
4317 /* Writes typed GC allocators for PARAM_STRUCTS that are suitable as callbacks
4318 for the splay tree implementation in libiberty. */
4321 write_splay_tree_allocators (const_type_p param_structs)
4325 oprintf (header_file, "\n/* Splay tree callback allocators. */\n");
4326 for (s = param_structs; s; s = s->next)
4327 if (s->gc_used == GC_POINTED_TO)
4329 oprintf (header_file, "extern void * ggc_alloc_splay_tree_");
4330 output_typename (header_file, s);
4331 oprintf (header_file, " (int, void *);\n");
4332 write_splay_tree_allocator_def (s);
4336 static void dump_pair (int indent, pair_p p);
4337 static void dump_type (int indent, type_p p);
4338 static void dump_type_list (int indent, type_p p);
4342 /* Dumps the value of typekind KIND. */
4345 dump_typekind (int indent, enum typekind kind)
4347 printf ("%*ckind = ", indent, ' ');
4351 printf ("TYPE_SCALAR");
4354 printf ("TYPE_STRING");
4357 printf ("TYPE_STRUCT");
4360 printf ("TYPE_UNION");
4363 printf ("TYPE_POINTER");
4366 printf ("TYPE_ARRAY");
4368 case TYPE_LANG_STRUCT:
4369 printf ("TYPE_LANG_STRUCT");
4371 case TYPE_PARAM_STRUCT:
4372 printf ("TYPE_PARAM_STRUCT");
4380 /* Dumps the value of GC_USED flag. */
4383 dump_gc_used (int indent, enum gc_used_enum gc_used)
4385 printf ("%*cgc_used = ", indent, ' ');
4389 printf ("GC_UNUSED");
4394 case GC_MAYBE_POINTED_TO:
4395 printf ("GC_MAYBE_POINTED_TO");
4398 printf ("GC_POINTED_TO");
4406 /* Dumps the type options OPT. */
4409 dump_options (int indent, options_p opt)
4412 printf ("%*coptions = ", indent, ' ');
4419 printf ("%s:string %s ", o->name, o->info.string);
4422 printf ("%s:type ", o->name);
4423 dump_type (indent+1, o->info.type);
4426 printf ("%s:nested ", o->name);
4436 /* Dumps the source file location in LINE. */
4439 dump_fileloc (int indent, struct fileloc line)
4441 printf ("%*cfileloc: file = %s, line = %d\n", indent, ' ',
4442 get_input_file_name (line.file),
4446 /* Recursively dumps the struct, union, or a language-specific
4450 dump_type_u_s (int indent, type_p t)
4454 gcc_assert (t->kind == TYPE_STRUCT || t->kind == TYPE_UNION
4455 || t->kind == TYPE_LANG_STRUCT);
4456 printf ("%*cu.s.tag = %s\n", indent, ' ', t->u.s.tag);
4457 dump_fileloc (indent, t->u.s.line);
4458 printf ("%*cu.s.fields =\n", indent, ' ');
4459 fields = t->u.s.fields;
4462 dump_pair (indent + INDENT, fields);
4463 fields = fields->next;
4465 printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t);
4466 dump_options (indent, t->u.s.opt);
4467 printf ("%*cu.s.bitmap = %X\n", indent, ' ', t->u.s.bitmap);
4468 if (t->kind == TYPE_LANG_STRUCT)
4470 printf ("%*cu.s.lang_struct:\n", indent, ' ');
4471 dump_type_list (indent + INDENT, t->u.s.lang_struct);
4475 /* Recursively dumps the array T. */
4478 dump_type_u_a (int indent, type_p t)
4480 gcc_assert (t->kind == TYPE_ARRAY);
4481 printf ("%*clen = %s, u.a.p:\n", indent, ' ', t->u.a.len);
4482 dump_type_list (indent + INDENT, t->u.a.p);
4485 /* Recursively dumps the parameterized struct T. */
4488 dump_type_u_param_struct (int indent, type_p t)
4491 gcc_assert (t->kind == TYPE_PARAM_STRUCT);
4492 printf ("%*cu.param_struct.stru:\n", indent, ' ');
4493 dump_type_list (indent, t->u.param_struct.stru);
4494 dump_fileloc (indent, t->u.param_struct.line);
4495 for (i = 0; i < NUM_PARAM; i++)
4497 if (t->u.param_struct.param[i] == NULL)
4499 printf ("%*cu.param_struct.param[%d]:\n", indent, ' ', i);
4500 dump_type (indent + INDENT, t->u.param_struct.param[i]);
4504 /* Recursively dumps the type list T. */
4507 dump_type_list (int indent, type_p t)
4512 dump_type (indent, p);
4517 static htab_t seen_types;
4519 /* Recursively dumps the type T if it was not dumped previously. */
4522 dump_type (int indent, type_p t)
4526 printf ("%*cType at %p: ", indent, ' ', (void *) t);
4527 slot = htab_find_slot (seen_types, t, INSERT);
4530 printf ("already seen.\n");
4536 dump_typekind (indent, t->kind);
4537 printf ("%*cpointer_to = %p\n", indent + INDENT, ' ',
4538 (void *) t->pointer_to);
4539 dump_gc_used (indent + INDENT, t->gc_used);
4543 printf ("%*cscalar_is_char = %s\n", indent + INDENT, ' ',
4544 t->u.scalar_is_char ? "true" : "false");
4550 case TYPE_LANG_STRUCT:
4551 dump_type_u_s (indent + INDENT, t);
4554 printf ("%*cp:\n", indent + INDENT, ' ');
4555 dump_type (indent + INDENT, t->u.p);
4558 dump_type_u_a (indent + INDENT, t);
4560 case TYPE_PARAM_STRUCT:
4561 dump_type_u_param_struct (indent + INDENT, t);
4566 printf ("%*cEnd of type at %p\n", indent, ' ', (void *) t);
4569 /* Dumps the pair P. */
4572 dump_pair (int indent, pair_p p)
4574 printf ("%*cpair: name = %s\n", indent, ' ', p->name);
4575 dump_type (indent, p->type);
4576 dump_fileloc (indent, p->line);
4577 dump_options (indent, p->opt);
4578 printf ("%*cEnd of pair %s\n", indent, ' ', p->name);
4581 /* Dumps the list of pairs PP. */
4584 dump_pair_list (const char *name, pair_p pp)
4587 printf ("%s:\n", name);
4588 for (p = pp; p != NULL; p = p->next)
4590 printf ("End of %s\n\n", name);
4593 /* Dumps the STRUCTURES. */
4596 dump_structures (const char *name, type_p structures)
4598 printf ("%s:\n", name);
4599 dump_type_list (0, structures);
4600 printf ("End of %s\n\n", name);
4603 /* Dumps the internal structures of gengtype. */
4606 dump_everything (void)
4608 seen_types = htab_create (100, htab_hash_pointer, htab_eq_pointer, NULL);
4609 dump_pair_list ("typedefs", typedefs);
4610 dump_structures ("structures", structures);
4611 dump_structures ("param_structs", param_structs);
4612 dump_pair_list ("variables", variables);
4613 htab_delete (seen_types);
4618 /* Option specification for getopt_long. */
4619 static const struct option gengtype_long_options[] = {
4620 {"help", no_argument, NULL, 'h'},
4621 {"version", no_argument, NULL, 'V'},
4622 {"verbose", no_argument, NULL, 'v'},
4623 {"dump", no_argument, NULL, 'd'},
4624 {"debug", no_argument, NULL, 'D'},
4625 {"plugin", required_argument, NULL, 'P'},
4626 {"srcdir", required_argument, NULL, 'S'},
4627 {"backupdir", required_argument, NULL, 'B'},
4628 {"inputs", required_argument, NULL, 'I'},
4629 {"read-state", required_argument, NULL, 'r'},
4630 {"write-state", required_argument, NULL, 'w'},
4631 /* Terminating NULL placeholder. */
4632 {NULL, no_argument, NULL, 0},
4639 printf ("Usage: %s\n", progname);
4640 printf ("\t -h | --help " " \t# Give this help.\n");
4641 printf ("\t -D | --debug "
4642 " \t# Give debug output to debug %s itself.\n", progname);
4643 printf ("\t -V | --version " " \t# Give version information.\n");
4644 printf ("\t -v | --verbose \t# Increase verbosity. Can be given several times.\n");
4645 printf ("\t -d | --dump " " \t# Dump state for debugging.\n");
4646 printf ("\t -P | --plugin <output-file> <plugin-src> ... "
4647 " \t# Generate for plugin.\n");
4648 printf ("\t -S | --srcdir <GCC-directory> "
4649 " \t# Specify the GCC source directory.\n");
4650 printf ("\t -B | --backupdir <directory> "
4651 " \t# Specify the backup directory for updated files.\n");
4652 printf ("\t -I | --inputs <input-list> "
4653 " \t# Specify the file with source files list.\n");
4654 printf ("\t -w | --write-state <state-file> " " \t# Write a state file.\n");
4655 printf ("\t -r | --read-state <state-file> " " \t# Read a state file.\n");
4659 print_version (void)
4661 printf ("%s %s%s\n", progname, pkgversion_string, version_string);
4662 printf ("Report bugs: %s\n", bug_report_url);
4665 /* Parse the program options using getopt_long... */
4667 parse_program_options (int argc, char **argv)
4670 while ((opt = getopt_long (argc, argv, "hVvdP:S:B:I:w:r:D",
4671 gengtype_long_options, NULL)) >= 0)
4675 case 'h': /* --help */
4678 case 'V': /* --version */
4681 case 'd': /* --dump */
4684 case 'D': /* --debug */
4687 case 'v': /* --verbose */
4690 case 'P': /* --plugin */
4692 plugin_output_filename = optarg;
4694 fatal ("missing plugin output file name");
4696 case 'S': /* --srcdir */
4700 fatal ("missing source directory");
4701 srcdir_len = strlen (srcdir);
4703 case 'B': /* --backupdir */
4705 backup_dir = optarg;
4707 fatal ("missing backup directory");
4709 case 'I': /* --inputs */
4713 fatal ("missing input list");
4715 case 'r': /* --read-state */
4717 read_state_filename = optarg;
4719 fatal ("missing read state file");
4720 DBGPRINTF ("read state %s\n", optarg);
4722 case 'w': /* --write-state */
4723 DBGPRINTF ("write state %s\n", optarg);
4725 write_state_filename = optarg;
4727 fatal ("missing write state file");
4730 fprintf (stderr, "%s: unknown flag '%c'\n", progname, opt);
4732 fatal ("unexpected flag");
4735 if (plugin_output_filename)
4737 /* In plugin mode we require some input files. */
4740 fatal ("no source files given in plugin mode");
4741 nb_plugin_files = argc - optind;
4742 plugin_files = XNEWVEC (input_file*, nb_plugin_files);
4743 for (i = 0; i < (int) nb_plugin_files; i++)
4745 char *name = argv[i + optind];
4746 plugin_files[i] = input_file_by_name (name);
4753 /******* Manage input files. ******/
4755 /* Hash table of unique input file names. */
4756 static htab_t input_file_htab;
4758 /* Find or allocate a new input_file by hash-consing it. */
4760 input_file_by_name (const char* name)
4763 input_file* f = NULL;
4767 namlen = strlen (name);
4768 f = XCNEWVAR (input_file, sizeof (input_file)+namlen+2);
4771 strcpy (f->inpname, name);
4772 slot = htab_find_slot (input_file_htab, f, INSERT);
4773 gcc_assert (slot != NULL);
4776 /* Already known input file. */
4778 return (input_file*)(*slot);
4780 /* New input file. */
4785 /* Hash table support routines for input_file-s. */
4787 htab_hash_inputfile (const void *p)
4789 const input_file *inpf = (const input_file *) p;
4791 return htab_hash_string (get_input_file_name (inpf));
4795 htab_eq_inputfile (const void *x, const void *y)
4797 const input_file *inpfx = (const input_file *) x;
4798 const input_file *inpfy = (const input_file *) y;
4799 gcc_assert (inpfx != NULL && inpfy != NULL);
4800 return !strcmp (get_input_file_name (inpfx), get_input_file_name (inpfy));
4805 main (int argc, char **argv)
4808 static struct fileloc pos = { NULL, 0 };
4809 outf_p output_header;
4811 /* Mandatory common initializations. */
4812 progname = "gengtype"; /* For fatal and messages. */
4813 /* Create the hash-table used to hash-cons input files. */
4815 htab_create (800, htab_hash_inputfile, htab_eq_inputfile, NULL);
4816 /* Initialize our special input files. */
4817 this_file = input_file_by_name (__FILE__);
4818 system_h_file = input_file_by_name ("system.h");
4819 /* Set the scalar_is_char union number for predefined scalar types. */
4820 scalar_nonchar.u.scalar_is_char = FALSE;
4821 scalar_char.u.scalar_is_char = TRUE;
4823 parse_program_options (argc, argv);
4828 time_t now = (time_t) 0;
4830 DBGPRINTF ("gengtype started pid %d at %s",
4831 (int) getpid (), ctime (&now));
4833 #endif /* ENABLE_CHECKING */
4835 /* Parse the input list and the input files. */
4836 DBGPRINTF ("inputlist %s", inputlist);
4837 if (read_state_filename)
4839 fatal ("read state %s not implemented yet", read_state_filename);
4840 /* TODO: implement read state. */
4844 /* These types are set up with #define or else outside of where
4845 we can see them. We should initialize them before calling
4847 #define POS_HERE(Call) do { pos.file = this_file; pos.line = __LINE__; \
4849 POS_HERE (do_scalar_typedef ("CUMULATIVE_ARGS", &pos));
4850 POS_HERE (do_scalar_typedef ("REAL_VALUE_TYPE", &pos));
4851 POS_HERE (do_scalar_typedef ("FIXED_VALUE_TYPE", &pos));
4852 POS_HERE (do_scalar_typedef ("double_int", &pos));
4853 POS_HERE (do_scalar_typedef ("uint64_t", &pos));
4854 POS_HERE (do_scalar_typedef ("uint8", &pos));
4855 POS_HERE (do_scalar_typedef ("jword", &pos));
4856 POS_HERE (do_scalar_typedef ("JCF_u2", &pos));
4857 POS_HERE (do_scalar_typedef ("void", &pos));
4858 POS_HERE (do_typedef ("PTR",
4859 create_pointer (resolve_typedef ("void", &pos)),
4862 read_input_list (inputlist);
4863 for (i = 0; i < num_gt_files; i++)
4865 parse_file (get_input_file_name (gt_files[i]));
4866 DBGPRINTF ("parsed file #%d %s",
4867 (int) i, get_input_file_name (gt_files[i]));
4869 if (verbosity_level >= 1)
4870 printf ("%s parsed %d files\n", progname, (int) num_gt_files);
4872 DBGPRINT_COUNT_TYPE ("structures after parsing", structures);
4873 DBGPRINT_COUNT_TYPE ("param_structs after parsing", param_structs);
4877 fatal ("either an input list or a read state file should be given");
4882 if (plugin_output_filename)
4885 /* In plugin mode, we should have read a state file, and have
4886 given at least one plugin file. */
4887 if (!read_state_filename)
4888 fatal ("No read state given in plugin mode for %s",
4889 plugin_output_filename);
4891 if (nb_plugin_files == 0 || !plugin_files)
4892 fatal ("No plugin files given in plugin mode for %s",
4893 plugin_output_filename);
4895 /* Parse our plugin files. */
4896 for (ix = 0; ix < nb_plugin_files; ix++)
4897 parse_file (get_input_file_name (plugin_files[ix]));
4902 plugin_output = create_file ("GCC", plugin_output_filename);
4903 DBGPRINTF ("created plugin_output %p named %s",
4904 (void *) plugin_output, plugin_output->name);
4907 { /* No plugin files, we are in normal mode. */
4909 fatal ("gengtype needs a source directory in normal mode");
4916 /* The call to set_gc_used may indirectly call find_param_structure
4917 hence enlarge the param_structs list of types. */
4918 set_gc_used (variables);
4920 /* We should write the state here, but it is not yet implemented. */
4921 if (write_state_filename)
4923 fatal ("write state %s in not yet implemented", write_state_filename);
4924 /* TODO: implement write state. */
4930 write_enum_defn (structures, param_structs);
4931 write_typed_alloc_defns (structures, typedefs);
4932 output_header = plugin_output ? plugin_output : header_file;
4933 DBGPRINT_COUNT_TYPE ("structures before write_types outputheader",
4935 DBGPRINT_COUNT_TYPE ("param_structs before write_types outputheader",
4938 write_types (output_header, structures, param_structs, &ggc_wtd);
4939 if (plugin_files == NULL)
4941 DBGPRINT_COUNT_TYPE ("structures before write_types headerfil",
4943 DBGPRINT_COUNT_TYPE ("param_structs before write_types headerfil",
4945 write_types (header_file, structures, param_structs, &pch_wtd);
4946 write_local (header_file, structures, param_structs);
4948 write_splay_tree_allocators (param_structs);
4949 write_roots (variables, plugin_files == NULL);
4951 close_output_files ();
4956 /* Don't bother about free-ing any input or plugin file, etc. */