1 /* Process source files and output type information.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
24 #include "errors.h" /* for fatal */
25 #include "double-int.h"
27 /* Data types, macros, etc. used only in this file. */
29 /* Kinds of types we can understand. */
41 typedef unsigned lang_bitmap;
43 /* A way to pass data through to the output end. */
51 /* Option data for the 'nested_ptr' option. */
52 struct nested_ptr_data
55 const char *convert_to;
56 const char *convert_from;
59 /* A name and a type. */
71 /* A description of a type. */
85 enum gc_used_enum gc_used;
103 type_p param[NUM_PARAM];
110 ((x)->kind == TYPE_UNION || \
111 ((x)->kind == TYPE_LANG_STRUCT \
112 && (x)->u.s.lang_struct->kind == TYPE_UNION))
113 #define UNION_OR_STRUCT_P(x) \
114 ((x)->kind == TYPE_UNION \
115 || (x)->kind == TYPE_STRUCT \
116 || (x)->kind == TYPE_LANG_STRUCT)
118 /* Structure representing an output file. */
127 typedef struct outf * outf_p;
129 /* An output file, suitable for definitions, that can see declarations
130 made in INPUT_FILE and is linked into every language that uses
132 extern outf_p get_output_file_with_visibility
133 (const char *input_file);
134 const char *get_output_file_name (const char *);
136 /* Print, like fprintf, to O. */
137 static void oprintf (outf_p o, const char *S, ...)
140 /* The list of output files. */
141 static outf_p output_files;
143 /* The output header file that is included into pretty much every
145 static outf_p header_file;
147 /* Source directory. */
148 static const char *srcdir;
150 /* Length of srcdir name. */
151 static size_t srcdir_len = 0;
153 static outf_p create_file (const char *, const char *);
155 static const char * get_file_basename (const char *);
156 static const char * get_file_realbasename (const char *);
157 static const char * get_file_srcdir_relative_path (const char *);
159 static int get_prefix_langdir_index (const char *);
160 static const char * get_file_langdir (const char *);
163 /* Nonzero iff an error has occurred. */
164 bool hit_error = false;
166 static void gen_rtx_next (void);
167 static void write_rtx_next (void);
168 static void open_base_files (void);
169 static void close_output_files (void);
171 /* Report an error at POS, printing MSG. */
174 error_at_line (struct fileloc *pos, const char *msg, ...)
180 fprintf (stderr, "%s:%d: ", pos->file, pos->line);
181 vfprintf (stderr, msg, ap);
182 fputc ('\n', stderr);
188 /* asprintf, but produces fatal message on out-of-memory. */
190 xasprintf (const char *format, ...)
196 va_start (ap, format);
197 n = vasprintf (&result, format, ap);
198 if (result == NULL || n < 0)
199 fatal ("out of memory");
205 /* Input file handling. */
207 /* Table of all input files. */
208 static const char **gt_files;
209 static size_t num_gt_files;
211 /* A number of places use the name of this file for a location for
212 things that we can't rely on the source to define. Make sure we
213 can still use pointer comparison on filenames. */
214 static const char this_file[] = __FILE__;
216 /* Vector of per-language directories. */
217 static const char **lang_dir_names;
218 static size_t num_lang_dirs;
220 /* An array of output files suitable for definitions. There is one
221 BASE_FILES entry for each language. */
222 static outf_p *base_files;
224 /* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff
225 INPUT_FILE is used by <lang>.
227 This function should be written to assume that a file _is_ used
228 if the situation is unclear. If it wrongly assumes a file _is_ used,
229 a linker error will result. If it wrongly assumes a file _is not_ used,
230 some GC roots may be missed, which is a much harder-to-debug problem.
232 The relevant bitmap is stored immediately before the file's name in the
233 buffer set up by read_input_list. It may be unaligned, so we have to
234 read it byte-by-byte. */
237 get_lang_bitmap (const char *gtfile)
240 if (gtfile == this_file)
241 /* Things defined in this file are universal. */
242 return (((lang_bitmap)1) << num_lang_dirs) - 1;
247 for (i = -(int) sizeof (lang_bitmap); i < 0; i++)
248 n = (n << CHAR_BIT) + (unsigned char)gtfile[i];
253 /* Set the bitmap returned by get_lang_bitmap. The only legitimate
254 caller of this function is read_input_list. */
256 set_lang_bitmap (char *gtfile, lang_bitmap n)
259 for (i = -1; i >= -(int) sizeof (lang_bitmap); i--)
261 gtfile[i] = n & ((1U << CHAR_BIT)-1);
266 /* Scan the input file, LIST, and determine how much space we need to
267 store strings in. Also, count the number of language directories
268 and files. The numbers returned are overestimates as they does not
269 consider repeated files. */
271 measure_input_list (FILE *list)
278 while ((c = getc (list)) != EOF)
287 /* Add space for a lang_bitmap before the input file name. */
288 n += sizeof (lang_bitmap);
302 /* Read one input line from LIST to HEREP (which is updated). A
303 pointer to the string is returned via LINEP. If it was a language
304 subdirectory in square brackets, strip off the square brackets and
305 return true. Otherwise, leave space before the string for a
306 lang_bitmap, and return false. At EOF, returns false, does not
307 touch *HEREP, and sets *LINEP to NULL. POS is used for
310 read_input_line (FILE *list, char **herep, char **linep,
324 /* No space for a lang_bitmap is necessary. Discard the '['. */
327 while (c != ']' && c != '\n' && c != EOF)
336 c = getc (list); /* eat what should be a newline */
337 if (c != '\n' && c != EOF)
338 error_at_line (pos, "junk on line after language tag [%s]", line);
341 error_at_line (pos, "missing close bracket for language tag [%s", line);
349 /* Leave space for a lang_bitmap. */
350 memset (here, 0, sizeof (lang_bitmap));
351 here += sizeof (lang_bitmap);
358 while (c != EOF && c != '\n');
366 /* Read the list of input files from LIST and compute all of the
367 relevant tables. There is one file per line of the list. At
368 first, all the files on the list are language-generic, but
369 eventually a line will appear which is the name of a language
370 subdirectory in square brackets, like this: [cp]. All subsequent
371 files are specific to that language, until another language
372 subdirectory tag appears. Files can appear more than once, if
373 they apply to more than one language. */
375 read_input_list (const char *listname)
377 FILE *list = fopen (listname, "r");
379 fatal ("cannot open %s: %s", listname, strerror (errno));
383 size_t bufsz = measure_input_list (list);
384 char *buf = XNEWVEC (char, bufsz);
386 char *committed = buf;
387 char *limit = buf + bufsz;
392 lang_bitmap curlangs = (1 << num_lang_dirs) - 1;
394 epos.file = listname;
397 lang_dir_names = XNEWVEC (const char *, num_lang_dirs);
398 gt_files = XNEWVEC (const char *, num_gt_files);
405 is_language = read_input_line (list, &here, &line, &epos);
406 gcc_assert (here <= limit);
409 else if (is_language)
412 gcc_assert (langno <= num_lang_dirs);
413 for (i = 0; i < langno; i++)
414 if (strcmp (lang_dir_names[i], line) == 0)
416 error_at_line (&epos, "duplicate language tag [%s]", line);
422 curlangs = 1 << langno;
423 lang_dir_names[langno++] = line;
428 gcc_assert (nfiles <= num_gt_files);
429 for (i = 0; i < nfiles; i++)
430 if (strcmp (gt_files[i], line) == 0)
432 /* Throw away the string we just read, and add the
433 current language to the existing string's bitmap. */
434 lang_bitmap bmap = get_lang_bitmap (gt_files[i]);
436 error_at_line (&epos, "file %s specified more than once "
437 "for language %s", line, langno == 0
439 : lang_dir_names[langno - 1]);
442 set_lang_bitmap (CONST_CAST(char *, gt_files[i]), bmap);
447 set_lang_bitmap (line, curlangs);
448 gt_files[nfiles++] = line;
451 /* Update the global counts now that we know accurately how many
452 things there are. (We do not bother resizing the arrays down.) */
453 num_lang_dirs = langno;
454 num_gt_files = nfiles;
457 /* Sanity check: any file that resides in a language subdirectory
458 (e.g. 'cp') ought to belong to the corresponding language.
459 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
460 (Can you even do that? Should you be allowed to?) */
463 for (f = 0; f < num_gt_files; f++)
465 lang_bitmap bitmap = get_lang_bitmap (gt_files[f]);
466 const char *basename = get_file_basename (gt_files[f]);
467 const char *slashpos = strchr (basename, '/');
472 for (l = 0; l < num_lang_dirs; l++)
473 if ((size_t)(slashpos - basename) == strlen (lang_dir_names [l])
474 && memcmp (basename, lang_dir_names[l],
475 strlen (lang_dir_names[l])) == 0)
477 if (!(bitmap & (1 << l)))
478 error ("%s is in language directory '%s' but is not "
479 "tagged for that language",
480 basename, lang_dir_names[l]);
488 fatal ("error reading %s: %s", listname, strerror (errno));
495 /* The one and only TYPE_STRING. */
497 static struct type string_type = {
498 TYPE_STRING, 0, 0, GC_USED, {0}
501 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
502 set to appropriate values at the beginning of main. */
504 static struct type scalar_nonchar = {
505 TYPE_SCALAR, 0, 0, GC_USED, {0}
507 static struct type scalar_char = {
508 TYPE_SCALAR, 0, 0, GC_USED, {0}
511 /* Lists of various things. */
513 static pair_p typedefs;
514 static type_p structures;
515 static type_p param_structs;
516 static pair_p variables;
518 static type_p find_param_structure
519 (type_p t, type_p param[NUM_PARAM]);
520 static type_p adjust_field_tree_exp (type_p t, options_p opt);
521 static type_p adjust_field_rtx_def (type_p t, options_p opt);
523 /* Define S as a typedef to T at POS. */
526 do_typedef (const char *s, type_p t, struct fileloc *pos)
530 /* temporary kludge - gengtype doesn't handle conditionals or
531 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
532 is coming from this file (main() sets them up with safe dummy
534 if (!strcmp (s, "CUMULATIVE_ARGS") && pos->file != this_file)
537 for (p = typedefs; p != NULL; p = p->next)
538 if (strcmp (p->name, s) == 0)
542 error_at_line (pos, "type `%s' previously defined", s);
543 error_at_line (&p->line, "previously defined here");
548 p = XNEW (struct pair);
556 /* Define S as a typename of a scalar. Cannot be used to define
557 typedefs of 'char'. Note: is also used for pointer-to-function
558 typedefs (which are therefore not treated as pointers). */
561 do_scalar_typedef (const char *s, struct fileloc *pos)
563 do_typedef (s, &scalar_nonchar, pos);
566 /* Return the type previously defined for S. Use POS to report errors. */
569 resolve_typedef (const char *s, struct fileloc *pos)
572 for (p = typedefs; p != NULL; p = p->next)
573 if (strcmp (p->name, s) == 0)
575 error_at_line (pos, "unidentified type `%s'", s);
576 return &scalar_nonchar; /* treat as "int" */
579 /* Create and return a new structure with tag NAME (or a union iff
580 ISUNION is nonzero), at POS with fields FIELDS and options O. */
583 new_structure (const char *name, int isunion, struct fileloc *pos,
584 pair_p fields, options_p o)
588 lang_bitmap bitmap = get_lang_bitmap (pos->file);
590 /* temporary kludge - gengtype doesn't handle conditionals or
591 macros. Ignore any attempt to define struct location_s, unless
592 it is coming from this file (main() sets it up safely). */
593 if (!strcmp (name, "location_s") && !isunion
594 && pos->file != this_file)
595 return find_structure (name, 0);
597 for (si = structures; si != NULL; si = si->next)
598 if (strcmp (name, si->u.s.tag) == 0
599 && UNION_P (si) == isunion)
602 if (si->kind == TYPE_LANG_STRUCT)
606 for (si = ls->u.s.lang_struct; si != NULL; si = si->next)
607 if (si->u.s.bitmap == bitmap)
610 else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
613 si = XCNEW (struct type);
614 memcpy (si, ls, sizeof (struct type));
615 ls->kind = TYPE_LANG_STRUCT;
616 ls->u.s.lang_struct = si;
617 ls->u.s.fields = NULL;
619 si->pointer_to = NULL;
620 si->u.s.lang_struct = ls;
625 if (ls != NULL && s == NULL)
627 s = XCNEW (struct type);
628 s->next = ls->u.s.lang_struct;
629 ls->u.s.lang_struct = s;
630 s->u.s.lang_struct = ls;
637 s = XCNEW (struct type);
638 s->next = structures;
642 if (s->u.s.line.file != NULL
643 || (s->u.s.lang_struct && (s->u.s.lang_struct->u.s.bitmap & bitmap)))
645 error_at_line (pos, "duplicate definition of '%s %s'",
646 isunion ? "union" : "struct", s->u.s.tag);
647 error_at_line (&s->u.s.line, "previous definition here");
650 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
653 s->u.s.fields = fields;
655 s->u.s.bitmap = bitmap;
656 if (s->u.s.lang_struct)
657 s->u.s.lang_struct->u.s.bitmap |= bitmap;
659 /* Reset location_s's location to input.h so that we know where to
660 write out its mark routine. */
661 if (!strcmp (name, "location_s") && !isunion
662 && pos->file == this_file)
665 for (n = 0; n < num_gt_files; n++)
666 if (!strcmp (gt_files[n] + strlen (gt_files[n]) - strlen ("input.h"),
669 s->u.s.line.file = gt_files[n];
677 /* Return the previously-defined structure with tag NAME (or a union
678 iff ISUNION is nonzero), or a new empty structure or union if none
679 was defined previously. */
682 find_structure (const char *name, int isunion)
686 for (s = structures; s != NULL; s = s->next)
687 if (strcmp (name, s->u.s.tag) == 0
688 && UNION_P (s) == isunion)
691 s = XCNEW (struct type);
692 s->next = structures;
694 s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
700 /* Return the previously-defined parameterized structure for structure
701 T and parameters PARAM, or a new parameterized empty structure or
702 union if none was defined previously. */
705 find_param_structure (type_p t, type_p param[NUM_PARAM])
709 for (res = param_structs; res; res = res->next)
710 if (res->u.param_struct.stru == t
711 && memcmp (res->u.param_struct.param, param,
712 sizeof (type_p) * NUM_PARAM) == 0)
716 res = XCNEW (struct type);
717 res->kind = TYPE_PARAM_STRUCT;
718 res->next = param_structs;
720 res->u.param_struct.stru = t;
721 memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
726 /* Return a scalar type with name NAME. */
729 create_scalar_type (const char *name)
731 if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
734 return &scalar_nonchar;
737 /* Return a pointer to T. */
740 create_pointer (type_p t)
744 type_p r = XCNEW (struct type);
745 r->kind = TYPE_POINTER;
749 return t->pointer_to;
752 /* Return an array of length LEN. */
755 create_array (type_p t, const char *len)
759 v = XCNEW (struct type);
760 v->kind = TYPE_ARRAY;
766 /* Return an options structure with name NAME and info INFO. NEXT is the
767 next option in the chain. */
770 create_option (options_p next, const char *name, const void *info)
772 options_p o = XNEW (struct options);
775 o->info = (const char*) info;
779 /* Return an options structure for a "nested_ptr" option. */
781 create_nested_ptr_option (options_p next, type_p t,
782 const char *to, const char *from)
784 struct nested_ptr_data *d = XNEW (struct nested_ptr_data);
786 d->type = adjust_field_type (t, 0);
788 d->convert_from = from;
789 return create_option (next, "nested_ptr", d);
792 /* Add a variable named S of type T with options O defined at POS,
796 note_variable (const char *s, type_p t, options_p o, struct fileloc *pos)
799 n = XNEW (struct pair);
808 /* Most-general structure field creator. */
810 create_field_all (pair_p next, type_p type, const char *name, options_p opt,
811 const char *file, int line)
815 field = XNEW (struct pair);
820 field->line.file = file;
821 field->line.line = line;
825 /* Create a field that came from the source code we are scanning,
826 i.e. we have a 'struct fileloc', and possibly options; also,
827 adjust_field_type should be called. */
829 create_field_at (pair_p next, type_p type, const char *name, options_p opt,
832 return create_field_all (next, adjust_field_type (type, opt),
833 name, opt, pos->file, pos->line);
836 /* Create a fake field with the given type and name. NEXT is the next
837 field in the chain. */
838 #define create_field(next,type,name) \
839 create_field_all(next,type,name, 0, this_file, __LINE__)
841 /* Like create_field, but the field is only valid when condition COND
845 create_optional_field_ (pair_p next, type_p type, const char *name,
846 const char *cond, int line)
852 /* Create a fake union type with a single nameless field of type TYPE.
853 The field has a tag of "1". This allows us to make the presence
854 of a field of type TYPE depend on some boolean "desc" being true. */
855 union_fields = create_field (NULL, type, "");
856 union_fields->opt = create_option (union_fields->opt, "dot", "");
857 union_fields->opt = create_option (union_fields->opt, "tag", "1");
858 union_type = new_structure (xasprintf ("%s_%d", "fake_union", id++), 1,
859 &lexer_line, union_fields, NULL);
861 /* Create the field and give it the new fake union type. Add a "desc"
862 tag that specifies the condition under which the field is valid. */
863 return create_field_all (next, union_type, name,
864 create_option (0, "desc", cond),
867 #define create_optional_field(next,type,name,cond) \
868 create_optional_field_(next,type,name,cond,__LINE__)
870 /* Reverse a linked list of 'struct pair's in place. */
872 nreverse_pairs (pair_p list)
874 pair_p prev = 0, p, next;
875 for (p = list; p; p = next)
885 /* We don't care how long a CONST_DOUBLE is. */
886 #define CONST_DOUBLE_FORMAT "ww"
887 /* We don't want to see codes that are only for generator files. */
888 #undef GENERATOR_FILE
891 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
897 static const char * const rtx_name[NUM_RTX_CODE] = {
898 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
903 static const char * const rtx_format[NUM_RTX_CODE] = {
904 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
909 static int rtx_next_new[NUM_RTX_CODE];
911 /* We also need codes and names for insn notes (not register notes).
912 Note that we do *not* bias the note values here. */
914 #define DEF_INSN_NOTE(NAME) NAME,
915 #include "insn-notes.def"
921 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
922 default field for line number notes. */
923 static const char *const note_insn_name[NOTE_INSN_MAX+1] = {
924 #define DEF_INSN_NOTE(NAME) #NAME,
925 #include "insn-notes.def"
929 #undef CONST_DOUBLE_FORMAT
930 #define GENERATOR_FILE
932 /* Generate the contents of the rtx_next array. This really doesn't belong
933 in gengtype at all, but it's needed for adjust_field_rtx_def. */
939 for (i = 0; i < NUM_RTX_CODE; i++)
943 rtx_next_new[i] = -1;
944 if (strncmp (rtx_format[i], "iuu", 3) == 0)
946 else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
949 for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
950 if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
955 /* Write out the contents of the rtx_next array. */
957 write_rtx_next (void)
959 outf_p f = get_output_file_with_visibility (NULL);
962 oprintf (f, "\n/* Used to implement the RTX_NEXT macro. */\n");
963 oprintf (f, "const unsigned char rtx_next[NUM_RTX_CODE] = {\n");
964 for (i = 0; i < NUM_RTX_CODE; i++)
965 if (rtx_next_new[i] == -1)
966 oprintf (f, " 0,\n");
969 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n",
974 /* Handle `special("rtx_def")'. This is a special case for field
975 `fld' of struct rtx_def, which is an array of unions whose values
976 are based in a complex way on the type of RTL. */
979 adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
984 type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
985 type_p bitmap_tp, basic_block_tp, reg_attrs_tp, constant_tp, symbol_union_tp;
987 if (t->kind != TYPE_UNION)
989 error_at_line (&lexer_line,
990 "special `rtx_def' must be applied to a union");
994 nodot = create_option (NULL, "dot", "");
996 rtx_tp = create_pointer (find_structure ("rtx_def", 0));
997 rtvec_tp = create_pointer (find_structure ("rtvec_def", 0));
998 tree_tp = create_pointer (find_structure ("tree_node", 1));
999 mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
1000 reg_attrs_tp = create_pointer (find_structure ("reg_attrs", 0));
1001 bitmap_tp = create_pointer (find_structure ("bitmap_element_def", 0));
1002 basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
1003 constant_tp = create_pointer (find_structure ("constant_descriptor_rtx", 0));
1004 scalar_tp = &scalar_nonchar; /* rtunion int */
1007 pair_p note_flds = NULL;
1010 for (c = 0; c <= NOTE_INSN_MAX; c++)
1015 note_flds = create_field (note_flds, &string_type, "rt_str");
1018 case NOTE_INSN_BLOCK_BEG:
1019 case NOTE_INSN_BLOCK_END:
1020 note_flds = create_field (note_flds, tree_tp, "rt_tree");
1023 case NOTE_INSN_VAR_LOCATION:
1024 note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
1028 note_flds = create_field (note_flds, scalar_tp, "rt_int");
1031 /* NOTE_INSN_MAX is used as the default field for line
1033 if (c == NOTE_INSN_MAX)
1034 note_flds->opt = create_option (nodot, "default", "");
1036 note_flds->opt = create_option (nodot, "tag", note_insn_name[c]);
1038 note_union_tp = new_structure ("rtx_def_note_subunion", 1,
1039 &lexer_line, note_flds, NULL);
1041 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1045 sym_flds = create_field (NULL, tree_tp, "rt_tree");
1046 sym_flds->opt = create_option (nodot, "default", "");
1048 sym_flds = create_field (sym_flds, constant_tp, "rt_constant");
1049 sym_flds->opt = create_option (nodot, "tag", "1");
1051 symbol_union_tp = new_structure ("rtx_def_symbol_subunion", 1,
1052 &lexer_line, sym_flds, NULL);
1054 for (i = 0; i < NUM_RTX_CODE; i++)
1056 pair_p subfields = NULL;
1057 size_t aindex, nmindex;
1062 for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
1065 const char *subname;
1067 switch (rtx_format[i][aindex])
1078 if (i == MEM && aindex == 1)
1079 t = mem_attrs_tp, subname = "rt_mem";
1080 else if (i == JUMP_INSN && aindex == 8)
1081 t = rtx_tp, subname = "rt_rtx";
1082 else if (i == CODE_LABEL && aindex == 4)
1083 t = scalar_tp, subname = "rt_int";
1084 else if (i == CODE_LABEL && aindex == 5)
1085 t = rtx_tp, subname = "rt_rtx";
1086 else if (i == LABEL_REF
1087 && (aindex == 1 || aindex == 2))
1088 t = rtx_tp, subname = "rt_rtx";
1089 else if (i == NOTE && aindex == 4)
1090 t = note_union_tp, subname = "";
1091 else if (i == NOTE && aindex == 5)
1092 t = scalar_tp, subname = "rt_int";
1093 else if (i == NOTE && aindex >= 7)
1094 t = scalar_tp, subname = "rt_int";
1095 else if (i == ADDR_DIFF_VEC && aindex == 4)
1096 t = scalar_tp, subname = "rt_int";
1097 else if (i == VALUE && aindex == 0)
1098 t = scalar_tp, subname = "rt_int";
1099 else if (i == REG && aindex == 1)
1100 t = scalar_tp, subname = "rt_int";
1101 else if (i == REG && aindex == 2)
1102 t = reg_attrs_tp, subname = "rt_reg";
1103 else if (i == SCRATCH && aindex == 0)
1104 t = scalar_tp, subname = "rt_int";
1105 else if (i == SYMBOL_REF && aindex == 1)
1106 t = scalar_tp, subname = "rt_int";
1107 else if (i == SYMBOL_REF && aindex == 2)
1108 t = symbol_union_tp, subname = "";
1109 else if (i == BARRIER && aindex >= 3)
1110 t = scalar_tp, subname = "rt_int";
1113 error_at_line (&lexer_line,
1114 "rtx type `%s' has `0' in position %lu, can't handle",
1115 rtx_name[i], (unsigned long) aindex);
1137 subname = "rt_rtvec";
1142 subname = "rt_tree";
1156 error_at_line (&lexer_line,
1157 "rtx type `%s' has `%c' in position %lu, can't handle",
1158 rtx_name[i], rtx_format[i][aindex],
1159 (unsigned long)aindex);
1165 subfields = create_field (subfields, t,
1166 xasprintf (".fld[%lu].%s",
1167 (unsigned long) aindex,
1169 subfields->opt = nodot;
1170 if (t == note_union_tp)
1171 subfields->opt = create_option (subfields->opt, "desc",
1173 if (t == symbol_union_tp)
1174 subfields->opt = create_option (subfields->opt, "desc",
1175 "CONSTANT_POOL_ADDRESS_P (&%0)");
1178 if (i == SYMBOL_REF)
1180 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P holds. */
1181 type_p field_tp = find_structure ("block_symbol", 0);
1183 = create_optional_field (subfields, field_tp, "block_sym",
1184 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1187 sname = xasprintf ("rtx_def_%s", rtx_name[i]);
1188 substruct = new_structure (sname, 0, &lexer_line, subfields, NULL);
1190 ftag = xstrdup (rtx_name[i]);
1191 for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
1192 ftag[nmindex] = TOUPPER (ftag[nmindex]);
1194 flds = create_field (flds, substruct, "");
1195 flds->opt = create_option (nodot, "tag", ftag);
1198 return new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
1201 /* Handle `special("tree_exp")'. This is a special case for
1202 field `operands' of struct tree_exp, which although it claims to contain
1203 pointers to trees, actually sometimes contains pointers to RTL too.
1204 Passed T, the old type of the field, and OPT its options. Returns
1205 a new type for the field. */
1208 adjust_field_tree_exp (type_p t, options_p opt ATTRIBUTE_UNUSED)
1213 if (t->kind != TYPE_ARRAY)
1215 error_at_line (&lexer_line,
1216 "special `tree_exp' must be applied to an array");
1217 return &string_type;
1220 nodot = create_option (NULL, "dot", "");
1222 flds = create_field (NULL, t, "");
1223 flds->opt = create_option (nodot, "length",
1224 "TREE_OPERAND_LENGTH ((tree) &%0)");
1225 flds->opt = create_option (flds->opt, "default", "");
1227 return new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
1230 /* Perform any special processing on a type T, about to become the type
1231 of a field. Return the appropriate type for the field.
1233 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1234 - Similarly for arrays of pointer-to-char;
1235 - Converts structures for which a parameter is provided to
1237 - Handles "special" options.
1241 adjust_field_type (type_p t, options_p opt)
1244 const int pointer_p = t->kind == TYPE_POINTER;
1245 type_p params[NUM_PARAM];
1249 for (i = 0; i < NUM_PARAM; i++)
1252 for (; opt; opt = opt->next)
1253 if (strcmp (opt->name, "length") == 0)
1255 else if (strcmp (opt->name, "param_is") == 0
1256 || (strncmp (opt->name, "param", 5) == 0
1257 && ISDIGIT (opt->name[5])
1258 && strcmp (opt->name + 6, "_is") == 0))
1260 int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
1262 if (! UNION_OR_STRUCT_P (t)
1263 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
1265 error_at_line (&lexer_line,
1266 "option `%s' may only be applied to structures or structure pointers",
1272 if (params[num] != NULL)
1273 error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
1274 if (! ISDIGIT (opt->name[5]))
1275 params[num] = create_pointer (CONST_CAST2(type_p, const char *, opt->info));
1277 params[num] = CONST_CAST2 (type_p, const char *, opt->info);
1279 else if (strcmp (opt->name, "special") == 0)
1281 const char *special_name = opt->info;
1282 if (strcmp (special_name, "tree_exp") == 0)
1283 t = adjust_field_tree_exp (t, opt);
1284 else if (strcmp (special_name, "rtx_def") == 0)
1285 t = adjust_field_rtx_def (t, opt);
1287 error_at_line (&lexer_line, "unknown special `%s'", special_name);
1296 realt = find_param_structure (t, params);
1297 t = pointer_p ? create_pointer (realt) : realt;
1302 && t->u.p->kind == TYPE_SCALAR
1303 && t->u.p->u.scalar_is_char)
1304 return &string_type;
1305 if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
1306 && t->u.a.p->u.p->kind == TYPE_SCALAR
1307 && t->u.a.p->u.p->u.scalar_is_char)
1308 return create_array (&string_type, t->u.a.len);
1314 static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
1315 static void set_gc_used (pair_p);
1317 /* Handle OPT for set_gc_used_type. */
1320 process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
1321 int *pass_param, int *length, int *skip, type_p *nested_ptr)
1324 for (o = opt; o; o = o->next)
1325 if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO)
1326 set_gc_used_type (CONST_CAST2 (type_p, const char *, o->info),
1327 GC_POINTED_TO, NULL);
1328 else if (strcmp (o->name, "maybe_undef") == 0)
1330 else if (strcmp (o->name, "use_params") == 0)
1332 else if (strcmp (o->name, "length") == 0)
1334 else if (strcmp (o->name, "skip") == 0)
1336 else if (strcmp (o->name, "nested_ptr") == 0)
1337 *nested_ptr = ((const struct nested_ptr_data *) o->info)->type;
1340 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
1343 set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
1345 if (t->gc_used >= level)
1359 process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, &dummy,
1362 for (f = t->u.s.fields; f; f = f->next)
1364 int maybe_undef = 0;
1368 type_p nested_ptr = NULL;
1369 process_gc_options (f->opt, level, &maybe_undef, &pass_param,
1370 &length, &skip, &nested_ptr);
1372 if (nested_ptr && f->type->kind == TYPE_POINTER)
1373 set_gc_used_type (nested_ptr, GC_POINTED_TO,
1374 pass_param ? param : NULL);
1375 else if (length && f->type->kind == TYPE_POINTER)
1376 set_gc_used_type (f->type->u.p, GC_USED, NULL);
1377 else if (maybe_undef && f->type->kind == TYPE_POINTER)
1378 set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
1379 else if (pass_param && f->type->kind == TYPE_POINTER && param)
1380 set_gc_used_type (find_param_structure (f->type->u.p, param),
1381 GC_POINTED_TO, NULL);
1383 ; /* target type is not used through this field */
1385 set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
1391 set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
1395 set_gc_used_type (t->u.a.p, GC_USED, param);
1398 case TYPE_LANG_STRUCT:
1399 for (t = t->u.s.lang_struct; t; t = t->next)
1400 set_gc_used_type (t, level, param);
1403 case TYPE_PARAM_STRUCT:
1406 for (i = 0; i < NUM_PARAM; i++)
1407 if (t->u.param_struct.param[i] != 0)
1408 set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
1410 if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
1411 level = GC_POINTED_TO;
1414 t->u.param_struct.stru->gc_used = GC_UNUSED;
1415 set_gc_used_type (t->u.param_struct.stru, level,
1416 t->u.param_struct.param);
1424 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1427 set_gc_used (pair_p variables)
1430 for (p = variables; p; p = p->next)
1431 set_gc_used_type (p->type, GC_USED, NULL);
1434 /* File mapping routines. For each input file, there is one output .c file
1435 (but some output files have many input files), and there is one .h file
1436 for the whole build. */
1438 /* Output file handling. */
1440 /* Create and return an outf_p for a new file for NAME, to be called
1444 create_file (const char *name, const char *oname)
1446 static const char *const hdr[] = {
1447 " Copyright (C) 2004, 2007 Free Software Foundation, Inc.\n",
1449 "This file is part of GCC.\n",
1451 "GCC is free software; you can redistribute it and/or modify it under\n",
1452 "the terms of the GNU General Public License as published by the Free\n",
1453 "Software Foundation; either version 3, or (at your option) any later\n",
1456 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1457 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1458 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1459 "for more details.\n",
1461 "You should have received a copy of the GNU General Public License\n",
1462 "along with GCC; see the file COPYING3. If not see\n",
1463 "<http://www.gnu.org/licenses/>. */\n",
1465 "/* This file is machine generated. Do not edit. */\n"
1470 f = XCNEW (struct outf);
1471 f->next = output_files;
1475 oprintf (f, "/* Type information for %s.\n", name);
1476 for (i = 0; i < ARRAY_SIZE (hdr); i++)
1477 oprintf (f, "%s", hdr[i]);
1481 /* Print, like fprintf, to O.
1482 N.B. You might think this could be implemented more efficiently
1483 with vsnprintf(). Unfortunately, there are C libraries that
1484 provide that function but without the C99 semantics for its return
1485 value, making it impossible to know how much space is required. */
1487 oprintf (outf_p o, const char *format, ...)
1493 va_start (ap, format);
1494 slength = vasprintf (&s, format, ap);
1495 if (s == NULL || (int)slength < 0)
1496 fatal ("out of memory");
1499 if (o->bufused + slength > o->buflength)
1501 size_t new_len = o->buflength;
1506 } while (o->bufused + slength >= new_len);
1507 o->buf = XRESIZEVEC (char, o->buf, new_len);
1508 o->buflength = new_len;
1510 memcpy (o->buf + o->bufused, s, slength);
1511 o->bufused += slength;
1515 /* Open the global header file and the language-specific header files. */
1518 open_base_files (void)
1522 header_file = create_file ("GCC", "gtype-desc.h");
1524 base_files = XNEWVEC (outf_p, num_lang_dirs);
1526 for (i = 0; i < num_lang_dirs; i++)
1527 base_files[i] = create_file (lang_dir_names[i],
1528 xasprintf ("gtype-%s.h", lang_dir_names[i]));
1530 /* gtype-desc.c is a little special, so we create it here. */
1532 /* The order of files here matters very much. */
1533 static const char *const ifiles [] = {
1534 "config.h", "system.h", "coretypes.h", "tm.h", "varray.h",
1535 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1536 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1537 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1538 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1539 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1540 "cfglayout.h", "except.h", "output.h", "cfgloop.h", NULL
1542 const char *const *ifp;
1543 outf_p gtype_desc_c;
1545 gtype_desc_c = create_file ("GCC", "gtype-desc.c");
1546 for (ifp = ifiles; *ifp; ifp++)
1547 oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
1549 /* Make sure we handle "cfun" specially. */
1550 oprintf (gtype_desc_c, "\n/* See definition in function.h. */\n");
1551 oprintf (gtype_desc_c, "#undef cfun\n");
1555 /* For F a filename, return the real basename of F, with all the directory
1556 components skipped. */
1559 get_file_realbasename (const char *f)
1561 const char * lastslash = strrchr (f, '/');
1563 return (lastslash != NULL) ? lastslash + 1 : f;
1566 /* For F a filename, return the relative path to F from $(srcdir) if the
1567 latter is a prefix in F, NULL otherwise. */
1570 get_file_srcdir_relative_path (const char *f)
1572 if (strlen (f) > srcdir_len
1573 && IS_DIR_SEPARATOR (f[srcdir_len])
1574 && memcmp (f, srcdir, srcdir_len) == 0)
1575 return f + srcdir_len + 1;
1580 /* For F a filename, return the relative path to F from $(srcdir) if the
1581 latter is a prefix in F, or the real basename of F otherwise. */
1584 get_file_basename (const char *f)
1586 const char * srcdir_path = get_file_srcdir_relative_path (f);
1588 return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (f);
1591 /* For F a filename, return the lang_dir_names relative index of the language
1592 directory that is a prefix in F, if any, -1 otherwise. */
1595 get_prefix_langdir_index (const char *f)
1597 size_t f_len = strlen (f);
1600 for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
1602 const char * langdir = lang_dir_names [lang_index];
1603 size_t langdir_len = strlen (langdir);
1605 if (f_len > langdir_len
1606 && IS_DIR_SEPARATOR (f[langdir_len])
1607 && memcmp (f, langdir, langdir_len) == 0)
1614 /* For F a filename, return the name of language directory where F is located,
1615 if any, NULL otherwise. */
1618 get_file_langdir (const char *f)
1620 /* Get the relative path to F from $(srcdir) and find the language by
1621 comparing the prefix with language directory names. If F is not even
1622 srcdir relative, no point in looking further. */
1625 const char * srcdir_relative_path = get_file_srcdir_relative_path (f);
1627 if (!srcdir_relative_path)
1630 lang_index = get_prefix_langdir_index (srcdir_relative_path);
1632 return (lang_index >= 0) ? lang_dir_names [lang_index] : NULL;
1635 /* The gt- output file name for F. */
1638 get_file_gtfilename (const char *f)
1640 /* Cook up an initial version of the gt- file name from the file real
1641 basename and the language name, if any. */
1643 const char *basename = get_file_realbasename (f);
1644 const char *langdir = get_file_langdir (f);
1647 (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
1648 : xasprintf ("gt-%s", basename));
1650 /* Then replace all non alphanumerics characters by '-' and change the
1651 extenstion to ".h". We expect the input filename extension was at least
1652 one character long. */
1656 for (; *s != '.'; s++)
1657 if (! ISALNUM (*s) && *s != '-')
1660 memcpy (s, ".h", sizeof (".h"));
1665 /* An output file, suitable for definitions, that can see declarations
1666 made in INPUT_FILE and is linked into every language that uses
1670 get_output_file_with_visibility (const char *input_file)
1674 const char *basename;
1675 const char *for_name;
1676 const char *output_name;
1678 /* This can happen when we need a file with visibility on a
1679 structure that we've never seen. We have to just hope that it's
1680 globally visible. */
1681 if (input_file == NULL)
1682 input_file = "system.h";
1684 /* Determine the output file name. */
1685 basename = get_file_basename (input_file);
1687 len = strlen (basename);
1688 if ((len > 2 && memcmp (basename+len-2, ".c", 2) == 0)
1689 || (len > 2 && memcmp (basename+len-2, ".y", 2) == 0)
1690 || (len > 3 && memcmp (basename+len-3, ".in", 3) == 0))
1692 output_name = get_file_gtfilename (input_file);
1693 for_name = basename;
1695 /* Some headers get used by more than one front-end; hence, it
1696 would be inappropriate to spew them out to a single gtype-<lang>.h
1697 (and gengtype doesn't know how to direct spewage into multiple
1698 gtype-<lang>.h headers at this time). Instead, we pair up these
1699 headers with source files (and their special purpose gt-*.h headers). */
1700 else if (strcmp (basename, "c-common.h") == 0)
1701 output_name = "gt-c-common.h", for_name = "c-common.c";
1702 else if (strcmp (basename, "c-tree.h") == 0)
1703 output_name = "gt-c-decl.h", for_name = "c-decl.c";
1704 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1705 && strcmp (basename + 3, "cp-tree.h") == 0)
1706 output_name = "gt-cp-tree.h", for_name = "cp/tree.c";
1707 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1708 && strcmp (basename + 3, "decl.h") == 0)
1709 output_name = "gt-cp-decl.h", for_name = "cp/decl.c";
1710 else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
1711 && strcmp (basename + 3, "name-lookup.h") == 0)
1712 output_name = "gt-cp-name-lookup.h", for_name = "cp/name-lookup.c";
1713 else if (strncmp (basename, "objc", 4) == 0 && IS_DIR_SEPARATOR (basename[4])
1714 && strcmp (basename + 5, "objc-act.h") == 0)
1715 output_name = "gt-objc-objc-act.h", for_name = "objc/objc-act.c";
1718 int lang_index = get_prefix_langdir_index (basename);
1720 if (lang_index >= 0)
1721 return base_files[lang_index];
1723 output_name = "gtype-desc.c";
1727 /* Look through to see if we've ever seen this output filename before. */
1728 for (r = output_files; r; r = r->next)
1729 if (strcmp (r->name, output_name) == 0)
1732 /* If not, create it. */
1733 r = create_file (for_name, output_name);
1738 /* The name of an output file, suitable for definitions, that can see
1739 declarations made in INPUT_FILE and is linked into every language
1740 that uses INPUT_FILE. */
1743 get_output_file_name (const char *input_file)
1745 return get_output_file_with_visibility (input_file)->name;
1748 /* Copy the output to its final destination,
1749 but don't unnecessarily change modification times. */
1752 close_output_files (void)
1756 for (of = output_files; of; of = of->next)
1760 newfile = fopen (of->name, "r");
1761 if (newfile != NULL )
1766 for (i = 0; i < of->bufused; i++)
1769 ch = fgetc (newfile);
1770 if (ch == EOF || ch != (unsigned char) of->buf[i])
1773 no_write_p = i == of->bufused && fgetc (newfile) == EOF;
1780 newfile = fopen (of->name, "w");
1781 if (newfile == NULL)
1782 fatal ("opening output file %s: %s", of->name, strerror (errno));
1783 if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
1784 fatal ("writing output file %s: %s", of->name, strerror (errno));
1785 if (fclose (newfile) != 0)
1786 fatal ("closing output file %s: %s", of->name, strerror (errno));
1797 struct walk_type_data;
1799 /* For scalars and strings, given the item in 'val'.
1800 For structures, given a pointer to the item in 'val'.
1801 For misc. pointers, given the item in 'val'.
1803 typedef void (*process_field_fn)
1804 (type_p f, const struct walk_type_data *p);
1805 typedef void (*func_name_fn)
1806 (type_p s, const struct walk_type_data *p);
1808 /* Parameters for write_types. */
1810 struct write_types_data
1813 const char *param_prefix;
1814 const char *subfield_marker_routine;
1815 const char *marker_routine;
1816 const char *reorder_note_routine;
1817 const char *comment;
1818 int skip_hooks; /* skip hook generation if non zero */
1821 static void output_escaped_param (struct walk_type_data *d,
1822 const char *, const char *);
1823 static void output_mangled_typename (outf_p, const_type_p);
1824 static void walk_type (type_p t, struct walk_type_data *d);
1825 static void write_func_for_structure
1826 (type_p orig_s, type_p s, type_p * param,
1827 const struct write_types_data *wtd);
1828 static void write_types_process_field
1829 (type_p f, const struct walk_type_data *d);
1830 static void write_types (type_p structures,
1831 type_p param_structs,
1832 const struct write_types_data *wtd);
1833 static void write_types_local_process_field
1834 (type_p f, const struct walk_type_data *d);
1835 static void write_local_func_for_structure
1836 (type_p orig_s, type_p s, type_p * param);
1837 static void write_local (type_p structures,
1838 type_p param_structs);
1839 static void write_enum_defn (type_p structures, type_p param_structs);
1840 static int contains_scalar_p (type_p t);
1841 static void put_mangled_filename (outf_p , const char *);
1842 static void finish_root_table (struct flist *flp, const char *pfx,
1843 const char *tname, const char *lastname,
1845 static void write_root (outf_p , pair_p, type_p, const char *, int,
1846 struct fileloc *, const char *);
1847 static void write_array (outf_p f, pair_p v,
1848 const struct write_types_data *wtd);
1849 static void write_roots (pair_p);
1851 /* Parameters for walk_type. */
1853 struct walk_type_data
1855 process_field_fn process_field;
1860 const char *prev_val[4];
1863 struct fileloc *line;
1868 const char *reorder_fn;
1870 bool fn_wants_lvalue;
1873 /* Print a mangled name representing T to OF. */
1876 output_mangled_typename (outf_p of, const_type_p t)
1880 else switch (t->kind)
1884 output_mangled_typename (of, t->u.p);
1894 case TYPE_LANG_STRUCT:
1895 oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag), t->u.s.tag);
1897 case TYPE_PARAM_STRUCT:
1900 for (i = 0; i < NUM_PARAM; i++)
1901 if (t->u.param_struct.param[i] != NULL)
1902 output_mangled_typename (of, t->u.param_struct.param[i]);
1903 output_mangled_typename (of, t->u.param_struct.stru);
1911 /* Print PARAM to D->OF processing escapes. D->VAL references the
1912 current object, D->PREV_VAL the object containing the current
1913 object, ONAME is the name of the option and D->LINE is used to
1914 print error messages. */
1917 output_escaped_param (struct walk_type_data *d, const char *param,
1922 for (p = param; *p; p++)
1924 oprintf (d->of, "%c", *p);
1928 oprintf (d->of, "(%s)", d->prev_val[2]);
1931 oprintf (d->of, "(%s)", d->prev_val[0]);
1934 oprintf (d->of, "(%s)", d->prev_val[1]);
1938 const char *pp = d->val + strlen (d->val);
1939 while (pp[-1] == ']')
1942 oprintf (d->of, "%s", pp);
1946 error_at_line (d->line, "`%s' option contains bad escape %c%c",
1951 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
1952 which is of type T. Write code to D->OF to constrain execution (at
1953 the point that D->PROCESS_FIELD is called) to the appropriate
1954 cases. Call D->PROCESS_FIELD on subobjects before calling it on
1955 pointers to those objects. D->PREV_VAL lists the objects
1956 containing the current object, D->OPT is a list of options to
1957 apply, D->INDENT is the current indentation level, D->LINE is used
1958 to print error messages, D->BITMAP indicates which languages to
1959 print the structure for, and D->PARAM is the current parameter
1960 (from an enclosing param_is option). */
1963 walk_type (type_p t, struct walk_type_data *d)
1965 const char *length = NULL;
1966 const char *desc = NULL;
1967 int maybe_undef_p = 0;
1968 int use_param_num = -1;
1969 int use_params_p = 0;
1971 const struct nested_ptr_data *nested_ptr_d = NULL;
1973 d->needs_cast_p = false;
1974 for (oo = d->opt; oo; oo = oo->next)
1975 if (strcmp (oo->name, "length") == 0)
1977 else if (strcmp (oo->name, "maybe_undef") == 0)
1979 else if (strncmp (oo->name, "use_param", 9) == 0
1980 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
1981 use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
1982 else if (strcmp (oo->name, "use_params") == 0)
1984 else if (strcmp (oo->name, "desc") == 0)
1986 else if (strcmp (oo->name, "mark_hook") == 0)
1988 else if (strcmp (oo->name, "nested_ptr") == 0)
1989 nested_ptr_d = (const struct nested_ptr_data *) oo->info;
1990 else if (strcmp (oo->name, "dot") == 0)
1992 else if (strcmp (oo->name, "tag") == 0)
1994 else if (strcmp (oo->name, "special") == 0)
1996 else if (strcmp (oo->name, "skip") == 0)
1998 else if (strcmp (oo->name, "default") == 0)
2000 else if (strcmp (oo->name, "descbits") == 0)
2002 else if (strcmp (oo->name, "param_is") == 0)
2004 else if (strncmp (oo->name, "param", 5) == 0
2005 && ISDIGIT (oo->name[5])
2006 && strcmp (oo->name + 6, "_is") == 0)
2008 else if (strcmp (oo->name, "chain_next") == 0)
2010 else if (strcmp (oo->name, "chain_prev") == 0)
2012 else if (strcmp (oo->name, "chain_circular") == 0)
2014 else if (strcmp (oo->name, "reorder") == 0)
2017 error_at_line (d->line, "unknown option `%s'\n", oo->name);
2024 int pointer_p = t->kind == TYPE_POINTER;
2028 if (! UNION_OR_STRUCT_P (t))
2029 error_at_line (d->line, "`use_params' option on unimplemented type");
2031 t = find_param_structure (t, d->param);
2033 t = create_pointer (t);
2036 if (use_param_num != -1)
2038 if (d->param != NULL && d->param[use_param_num] != NULL)
2040 type_p nt = d->param[use_param_num];
2042 if (t->kind == TYPE_ARRAY)
2043 nt = create_array (nt, t->u.a.len);
2044 else if (length != NULL && t->kind == TYPE_POINTER)
2045 nt = create_pointer (nt);
2046 d->needs_cast_p = (t->kind != TYPE_POINTER
2047 && (nt->kind == TYPE_POINTER
2048 || nt->kind == TYPE_STRING));
2052 error_at_line (d->line, "no parameter defined for `%s'",
2057 && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
2059 error_at_line (d->line,
2060 "field `%s' has invalid option `maybe_undef_p'\n",
2069 d->process_field (t, d);
2075 && t->u.p->u.s.line.file == NULL)
2077 oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
2083 if (! UNION_OR_STRUCT_P (t->u.p)
2084 && t->u.p->kind != TYPE_PARAM_STRUCT)
2086 error_at_line (d->line,
2087 "field `%s' is pointer to unimplemented type",
2094 const char *oldprevval2 = d->prev_val[2];
2096 if (! UNION_OR_STRUCT_P (nested_ptr_d->type))
2098 error_at_line (d->line,
2099 "field `%s' has invalid "
2100 "option `nested_ptr'\n",
2105 d->prev_val[2] = d->val;
2106 oprintf (d->of, "%*s{\n", d->indent, "");
2108 d->val = xasprintf ("x%d", d->counter++);
2109 oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "",
2110 (nested_ptr_d->type->kind == TYPE_UNION
2111 ? "union" : "struct"),
2112 nested_ptr_d->type->u.s.tag,
2113 d->fn_wants_lvalue ? "" : "const ",
2115 oprintf (d->of, "%*s", d->indent + 2, "");
2116 output_escaped_param (d, nested_ptr_d->convert_from,
2118 oprintf (d->of, ";\n");
2120 d->process_field (nested_ptr_d->type, d);
2122 if (d->fn_wants_lvalue)
2124 oprintf (d->of, "%*s%s = ", d->indent, "",
2126 d->prev_val[2] = d->val;
2127 output_escaped_param (d, nested_ptr_d->convert_to,
2129 oprintf (d->of, ";\n");
2133 oprintf (d->of, "%*s}\n", d->indent, "");
2134 d->val = d->prev_val[2];
2135 d->prev_val[2] = oldprevval2;
2138 d->process_field (t->u.p, d);
2142 int loopcounter = d->counter++;
2143 const char *oldval = d->val;
2144 const char *oldprevval3 = d->prev_val[3];
2147 oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
2149 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2150 oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent, "",
2151 loopcounter, loopcounter);
2152 output_escaped_param (d, length, "length");
2153 oprintf (d->of, "); i%d++) {\n", loopcounter);
2155 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2157 d->prev_val[3] = oldval;
2158 walk_type (t->u.p, d);
2161 d->prev_val[3] = oldprevval3;
2164 oprintf (d->of, "%*s}\n", d->indent, "");
2165 d->process_field(t, d);
2167 oprintf (d->of, "%*s}\n", d->indent, "");
2174 int loopcounter = d->counter++;
2175 const char *oldval = d->val;
2178 /* If it's an array of scalars, we optimize by not generating
2180 if (t->u.a.p->kind == TYPE_SCALAR)
2183 /* When walking an array, compute the length and store it in a
2184 local variable before walking the array elements, instead of
2185 recomputing the length expression each time through the loop.
2186 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2187 where the length is stored in the first array element,
2188 because otherwise that operand can get overwritten on the
2190 oprintf (d->of, "%*s{\n", d->indent, "");
2192 oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
2193 oprintf (d->of, "%*ssize_t l%d = (size_t)(",
2194 d->indent, "", loopcounter);
2196 output_escaped_param (d, length, "length");
2198 oprintf (d->of, "%s", t->u.a.len);
2199 oprintf (d->of, ");\n");
2201 oprintf (d->of, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2203 loopcounter, loopcounter, loopcounter, loopcounter);
2205 d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
2207 walk_type (t->u.a.p, d);
2212 oprintf (d->of, "%*s}\n", d->indent, "");
2214 oprintf (d->of, "%*s}\n", d->indent, "");
2222 const char *oldval = d->val;
2223 const char *oldprevval1 = d->prev_val[1];
2224 const char *oldprevval2 = d->prev_val[2];
2225 const int union_p = t->kind == TYPE_UNION;
2226 int seen_default_p = 0;
2229 if (! t->u.s.line.file)
2230 error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
2232 if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
2234 error_at_line (d->line,
2235 "structure `%s' defined for mismatching languages",
2237 error_at_line (&t->u.s.line, "one structure defined here");
2240 /* Some things may also be defined in the structure's options. */
2241 for (o = t->u.s.opt; o; o = o->next)
2242 if (! desc && strcmp (o->name, "desc") == 0)
2245 d->prev_val[2] = oldval;
2246 d->prev_val[1] = oldprevval2;
2251 error_at_line (d->line, "missing `desc' option for union `%s'",
2255 oprintf (d->of, "%*sswitch (", d->indent, "");
2256 output_escaped_param (d, desc, "desc");
2257 oprintf (d->of, ")\n");
2259 oprintf (d->of, "%*s{\n", d->indent, "");
2261 for (f = t->u.s.fields; f; f = f->next)
2264 const char *dot = ".";
2265 const char *tagid = NULL;
2268 int use_param_p = 0;
2271 d->reorder_fn = NULL;
2272 for (oo = f->opt; oo; oo = oo->next)
2273 if (strcmp (oo->name, "dot") == 0)
2275 else if (strcmp (oo->name, "tag") == 0)
2277 else if (strcmp (oo->name, "skip") == 0)
2279 else if (strcmp (oo->name, "default") == 0)
2281 else if (strcmp (oo->name, "reorder") == 0)
2282 d->reorder_fn = oo->info;
2283 else if (strncmp (oo->name, "use_param", 9) == 0
2284 && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
2290 if (union_p && tagid)
2292 oprintf (d->of, "%*scase %s:\n", d->indent, "", tagid);
2295 else if (union_p && default_p)
2297 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2301 else if (! union_p && (default_p || tagid))
2302 error_at_line (d->line,
2303 "can't use `%s' outside a union on field `%s'",
2304 default_p ? "default" : "tag", f->name);
2305 else if (union_p && ! (default_p || tagid)
2306 && f->type->kind == TYPE_SCALAR)
2309 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2310 d->line->file, d->line->line, f->name);
2313 else if (union_p && ! (default_p || tagid))
2314 error_at_line (d->line,
2315 "field `%s' is missing `tag' or `default' option",
2319 d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name);
2321 d->used_length = false;
2323 if (union_p && use_param_p && d->param == NULL)
2324 oprintf (d->of, "%*sgcc_unreachable ();\n", d->indent, "");
2326 walk_type (f->type, d);
2332 oprintf (d->of, "%*sbreak;\n", d->indent, "");
2336 d->reorder_fn = NULL;
2339 d->prev_val[1] = oldprevval1;
2340 d->prev_val[2] = oldprevval2;
2342 if (union_p && ! seen_default_p)
2344 oprintf (d->of, "%*sdefault:\n", d->indent, "");
2345 oprintf (d->of, "%*s break;\n", d->indent, "");
2349 oprintf (d->of, "%*s}\n", d->indent, "");
2355 case TYPE_LANG_STRUCT:
2358 for (nt = t->u.s.lang_struct; nt; nt = nt->next)
2359 if ((d->bitmap & nt->u.s.bitmap) == d->bitmap)
2362 error_at_line (d->line, "structure `%s' differs between languages",
2369 case TYPE_PARAM_STRUCT:
2371 type_p *oldparam = d->param;
2373 d->param = t->u.param_struct.param;
2374 walk_type (t->u.param_struct.stru, d);
2375 d->param = oldparam;
2384 /* process_field routine for marking routines. */
2387 write_types_process_field (type_p f, const struct walk_type_data *d)
2389 const struct write_types_data *wtd;
2390 const char *cast = d->needs_cast_p ? "(void *)" : "";
2391 wtd = (const struct write_types_data *) d->cookie;
2396 oprintf (d->of, "%*s%s (%s%s", d->indent, "",
2397 wtd->subfield_marker_routine, cast, d->val);
2398 if (wtd->param_prefix)
2400 oprintf (d->of, ", %s", d->prev_val[3]);
2403 oprintf (d->of, ", gt_%s_", wtd->param_prefix);
2404 output_mangled_typename (d->of, d->orig_s);
2407 oprintf (d->of, ", gt_%sa_%s", wtd->param_prefix, d->prev_val[0]);
2409 if (f->u.p->kind == TYPE_PARAM_STRUCT
2410 && f->u.p->u.s.line.file != NULL)
2412 oprintf (d->of, ", gt_e_");
2413 output_mangled_typename (d->of, f);
2415 else if (UNION_OR_STRUCT_P (f)
2416 && f->u.p->u.s.line.file != NULL)
2418 oprintf (d->of, ", gt_ggc_e_");
2419 output_mangled_typename (d->of, f);
2422 oprintf (d->of, ", gt_types_enum_last");
2424 oprintf (d->of, ");\n");
2425 if (d->reorder_fn && wtd->reorder_note_routine)
2426 oprintf (d->of, "%*s%s (%s%s, %s, %s);\n", d->indent, "",
2427 wtd->reorder_note_routine, cast, d->val,
2428 d->prev_val[3], d->reorder_fn);
2434 case TYPE_LANG_STRUCT:
2435 case TYPE_PARAM_STRUCT:
2436 oprintf (d->of, "%*sgt_%s_", d->indent, "", wtd->prefix);
2437 output_mangled_typename (d->of, f);
2438 oprintf (d->of, " (%s%s);\n", cast, d->val);
2439 if (d->reorder_fn && wtd->reorder_note_routine)
2440 oprintf (d->of, "%*s%s (%s%s, %s%s, %s);\n", d->indent, "",
2441 wtd->reorder_note_routine, cast, d->val, cast, d->val,
2453 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
2456 output_type_enum (outf_p of, type_p s)
2458 if (s->kind == TYPE_PARAM_STRUCT && s->u.s.line.file != NULL)
2460 oprintf (of, ", gt_e_");
2461 output_mangled_typename (of, s);
2463 else if (UNION_OR_STRUCT_P (s) && s->u.s.line.file != NULL)
2465 oprintf (of, ", gt_ggc_e_");
2466 output_mangled_typename (of, s);
2469 oprintf (of, ", gt_types_enum_last");
2472 /* For S, a structure that's part of ORIG_S, and using parameters
2473 PARAM, write out a routine that:
2474 - Takes a parameter, a void * but actually of type *S
2475 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2476 field of S or its substructures and (in some cases) things
2477 that are pointed to by S.
2481 write_func_for_structure (type_p orig_s, type_p s, type_p *param,
2482 const struct write_types_data *wtd)
2484 const char *fn = s->u.s.line.file;
2486 const char *chain_next = NULL;
2487 const char *chain_prev = NULL;
2488 const char *chain_circular = NULL;
2489 const char *mark_hook_name = NULL;
2491 struct walk_type_data d;
2493 /* This is a hack, and not the good kind either. */
2494 for (i = NUM_PARAM - 1; i >= 0; i--)
2495 if (param && param[i] && param[i]->kind == TYPE_POINTER
2496 && UNION_OR_STRUCT_P (param[i]->u.p))
2497 fn = param[i]->u.p->u.s.line.file;
2499 memset (&d, 0, sizeof (d));
2500 d.of = get_output_file_with_visibility (fn);
2502 for (opt = s->u.s.opt; opt; opt = opt->next)
2503 if (strcmp (opt->name, "chain_next") == 0)
2504 chain_next = opt->info;
2505 else if (strcmp (opt->name, "chain_prev") == 0)
2506 chain_prev = opt->info;
2507 else if (strcmp (opt->name, "chain_circular") == 0)
2508 chain_circular = opt->info;
2509 else if (strcmp (opt->name, "mark_hook") == 0)
2510 mark_hook_name = opt->info;
2512 if (chain_prev != NULL && chain_next == NULL)
2513 error_at_line (&s->u.s.line, "chain_prev without chain_next");
2514 if (chain_circular != NULL && chain_next != NULL)
2515 error_at_line (&s->u.s.line, "chain_circular with chain_next");
2516 if (chain_circular != NULL)
2517 chain_next = chain_circular;
2519 d.process_field = write_types_process_field;
2523 d.line = &s->u.s.line;
2524 d.bitmap = s->u.s.bitmap;
2526 d.prev_val[0] = "*x";
2527 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2528 d.prev_val[3] = "x";
2531 oprintf (d.of, "\n");
2532 oprintf (d.of, "void\n");
2534 oprintf (d.of, "gt_%sx_%s", wtd->prefix, orig_s->u.s.tag);
2537 oprintf (d.of, "gt_%s_", wtd->prefix);
2538 output_mangled_typename (d.of, orig_s);
2540 oprintf (d.of, " (void *x_p)\n");
2541 oprintf (d.of, "{\n");
2542 oprintf (d.of, " %s %s * %sx = (%s %s *)x_p;\n",
2543 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2544 chain_next == NULL ? "const " : "",
2545 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2546 if (chain_next != NULL)
2547 oprintf (d.of, " %s %s * xlimit = x;\n",
2548 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2549 if (chain_next == NULL)
2551 oprintf (d.of, " if (%s (x", wtd->marker_routine);
2552 if (wtd->param_prefix)
2554 oprintf (d.of, ", x, gt_%s_", wtd->param_prefix);
2555 output_mangled_typename (d.of, orig_s);
2556 output_type_enum (d.of, orig_s);
2558 oprintf (d.of, "))\n");
2562 if (chain_circular != NULL)
2563 oprintf (d.of, " if (!%s (xlimit", wtd->marker_routine);
2565 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2566 if (wtd->param_prefix)
2568 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2569 output_mangled_typename (d.of, orig_s);
2570 output_type_enum (d.of, orig_s);
2572 oprintf (d.of, "))\n");
2573 if (chain_circular != NULL)
2574 oprintf (d.of, " return;\n do\n");
2575 if (mark_hook_name && !wtd->skip_hooks)
2577 oprintf (d.of, " {\n");
2578 oprintf (d.of, " %s (xlimit);\n ", mark_hook_name);
2580 oprintf (d.of, " xlimit = (");
2581 d.prev_val[2] = "*xlimit";
2582 output_escaped_param (&d, chain_next, "chain_next");
2583 oprintf (d.of, ");\n");
2584 if (mark_hook_name && !wtd->skip_hooks)
2585 oprintf (d.of, " }\n");
2586 if (chain_prev != NULL)
2588 oprintf (d.of, " if (x != xlimit)\n");
2589 oprintf (d.of, " for (;;)\n");
2590 oprintf (d.of, " {\n");
2591 oprintf (d.of, " %s %s * const xprev = (",
2592 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2594 d.prev_val[2] = "*x";
2595 output_escaped_param (&d, chain_prev, "chain_prev");
2596 oprintf (d.of, ");\n");
2597 oprintf (d.of, " if (xprev == NULL) break;\n");
2598 oprintf (d.of, " x = xprev;\n");
2599 oprintf (d.of, " (void) %s (xprev",
2600 wtd->marker_routine);
2601 if (wtd->param_prefix)
2603 oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
2604 output_mangled_typename (d.of, orig_s);
2605 output_type_enum (d.of, orig_s);
2607 oprintf (d.of, ");\n");
2608 oprintf (d.of, " }\n");
2610 if (chain_circular != NULL)
2612 oprintf (d.of, " while (%s (xlimit", wtd->marker_routine);
2613 if (wtd->param_prefix)
2615 oprintf (d.of, ", xlimit, gt_%s_", wtd->param_prefix);
2616 output_mangled_typename (d.of, orig_s);
2617 output_type_enum (d.of, orig_s);
2619 oprintf (d.of, "));\n");
2620 if (mark_hook_name && !wtd->skip_hooks)
2621 oprintf (d.of, " %s (xlimit);\n", mark_hook_name);
2622 oprintf (d.of, " do\n");
2625 oprintf (d.of, " while (x != xlimit)\n");
2627 oprintf (d.of, " {\n");
2628 if (mark_hook_name && chain_next == NULL && !wtd->skip_hooks)
2630 oprintf (d.of, " %s (x);\n", mark_hook_name);
2632 d.prev_val[2] = "*x";
2636 if (chain_next != NULL)
2638 oprintf (d.of, " x = (");
2639 output_escaped_param (&d, chain_next, "chain_next");
2640 oprintf (d.of, ");\n");
2643 oprintf (d.of, " }\n");
2644 if (chain_circular != NULL)
2645 oprintf (d.of, " while (x != xlimit);\n");
2646 oprintf (d.of, "}\n");
2649 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
2652 write_types (type_p structures, type_p param_structs,
2653 const struct write_types_data *wtd)
2657 oprintf (header_file, "\n/* %s*/\n", wtd->comment);
2658 for (s = structures; s; s = s->next)
2659 if (s->gc_used == GC_POINTED_TO
2660 || s->gc_used == GC_MAYBE_POINTED_TO)
2664 if (s->gc_used == GC_MAYBE_POINTED_TO
2665 && s->u.s.line.file == NULL)
2668 oprintf (header_file, "#define gt_%s_", wtd->prefix);
2669 output_mangled_typename (header_file, s);
2670 oprintf (header_file, "(X) do { \\\n");
2671 oprintf (header_file,
2672 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
2674 oprintf (header_file,
2677 for (opt = s->u.s.opt; opt; opt = opt->next)
2678 if (strcmp (opt->name, "ptr_alias") == 0)
2680 const_type_p const t = (const_type_p) opt->info;
2681 if (t->kind == TYPE_STRUCT
2682 || t->kind == TYPE_UNION
2683 || t->kind == TYPE_LANG_STRUCT)
2684 oprintf (header_file,
2685 "#define gt_%sx_%s gt_%sx_%s\n",
2686 wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
2688 error_at_line (&s->u.s.line,
2689 "structure alias is not a structure");
2695 /* Declare the marker procedure only once. */
2696 oprintf (header_file,
2697 "extern void gt_%sx_%s (void *);\n",
2698 wtd->prefix, s->u.s.tag);
2700 if (s->u.s.line.file == NULL)
2702 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2707 if (s->kind == TYPE_LANG_STRUCT)
2710 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2711 write_func_for_structure (s, ss, NULL, wtd);
2714 write_func_for_structure (s, s, NULL, wtd);
2717 for (s = param_structs; s; s = s->next)
2718 if (s->gc_used == GC_POINTED_TO)
2720 type_p * param = s->u.param_struct.param;
2721 type_p stru = s->u.param_struct.stru;
2723 /* Declare the marker procedure. */
2724 oprintf (header_file, "extern void gt_%s_", wtd->prefix);
2725 output_mangled_typename (header_file, s);
2726 oprintf (header_file, " (void *);\n");
2728 if (stru->u.s.line.file == NULL)
2730 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2735 if (stru->kind == TYPE_LANG_STRUCT)
2738 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
2739 write_func_for_structure (s, ss, param, wtd);
2742 write_func_for_structure (s, stru, param, wtd);
2746 static const struct write_types_data ggc_wtd =
2748 "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
2749 "GC marker procedures. ",
2753 static const struct write_types_data pch_wtd =
2755 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
2756 "gt_pch_note_reorder",
2757 "PCH type-walking procedures. ",
2761 /* Write out the local pointer-walking routines. */
2763 /* process_field routine for local pointer-walking. */
2766 write_types_local_process_field (type_p f, const struct walk_type_data *d)
2773 case TYPE_LANG_STRUCT:
2774 case TYPE_PARAM_STRUCT:
2776 oprintf (d->of, "%*sif ((void *)(%s) == this_obj)\n", d->indent, "",
2778 oprintf (d->of, "%*s op (&(%s), cookie);\n", d->indent, "", d->val);
2789 /* For S, a structure that's part of ORIG_S, and using parameters
2790 PARAM, write out a routine that:
2791 - Is of type gt_note_pointers
2792 - Calls PROCESS_FIELD on each field of S or its substructures.
2796 write_local_func_for_structure (type_p orig_s, type_p s, type_p *param)
2798 const char *fn = s->u.s.line.file;
2800 struct walk_type_data d;
2802 /* This is a hack, and not the good kind either. */
2803 for (i = NUM_PARAM - 1; i >= 0; i--)
2804 if (param && param[i] && param[i]->kind == TYPE_POINTER
2805 && UNION_OR_STRUCT_P (param[i]->u.p))
2806 fn = param[i]->u.p->u.s.line.file;
2808 memset (&d, 0, sizeof (d));
2809 d.of = get_output_file_with_visibility (fn);
2811 d.process_field = write_types_local_process_field;
2813 d.line = &s->u.s.line;
2814 d.bitmap = s->u.s.bitmap;
2816 d.prev_val[0] = d.prev_val[2] = "*x";
2817 d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
2818 d.prev_val[3] = "x";
2820 d.fn_wants_lvalue = true;
2822 oprintf (d.of, "\n");
2823 oprintf (d.of, "void\n");
2824 oprintf (d.of, "gt_pch_p_");
2825 output_mangled_typename (d.of, orig_s);
2826 oprintf (d.of, " (ATTRIBUTE_UNUSED void *this_obj,\n"
2828 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
2829 "\tATTRIBUTE_UNUSED void *cookie)\n");
2830 oprintf (d.of, "{\n");
2831 oprintf (d.of, " %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
2832 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
2833 s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
2836 oprintf (d.of, "}\n");
2839 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
2842 write_local (type_p structures, type_p param_structs)
2846 oprintf (header_file, "\n/* Local pointer-walking routines. */\n");
2847 for (s = structures; s; s = s->next)
2848 if (s->gc_used == GC_POINTED_TO
2849 || s->gc_used == GC_MAYBE_POINTED_TO)
2853 if (s->u.s.line.file == NULL)
2856 for (opt = s->u.s.opt; opt; opt = opt->next)
2857 if (strcmp (opt->name, "ptr_alias") == 0)
2859 const_type_p const t = (const_type_p) opt->info;
2860 if (t->kind == TYPE_STRUCT
2861 || t->kind == TYPE_UNION
2862 || t->kind == TYPE_LANG_STRUCT)
2864 oprintf (header_file, "#define gt_pch_p_");
2865 output_mangled_typename (header_file, s);
2866 oprintf (header_file, " gt_pch_p_");
2867 output_mangled_typename (header_file, t);
2868 oprintf (header_file, "\n");
2871 error_at_line (&s->u.s.line,
2872 "structure alias is not a structure");
2878 /* Declare the marker procedure only once. */
2879 oprintf (header_file, "extern void gt_pch_p_");
2880 output_mangled_typename (header_file, s);
2881 oprintf (header_file,
2882 "\n (void *, void *, gt_pointer_operator, void *);\n");
2884 if (s->kind == TYPE_LANG_STRUCT)
2887 for (ss = s->u.s.lang_struct; ss; ss = ss->next)
2888 write_local_func_for_structure (s, ss, NULL);
2891 write_local_func_for_structure (s, s, NULL);
2894 for (s = param_structs; s; s = s->next)
2895 if (s->gc_used == GC_POINTED_TO)
2897 type_p * param = s->u.param_struct.param;
2898 type_p stru = s->u.param_struct.stru;
2900 /* Declare the marker procedure. */
2901 oprintf (header_file, "extern void gt_pch_p_");
2902 output_mangled_typename (header_file, s);
2903 oprintf (header_file,
2904 "\n (void *, void *, gt_pointer_operator, void *);\n");
2906 if (stru->u.s.line.file == NULL)
2908 fprintf (stderr, "warning: structure `%s' used but not defined\n",
2913 if (stru->kind == TYPE_LANG_STRUCT)
2916 for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
2917 write_local_func_for_structure (s, ss, param);
2920 write_local_func_for_structure (s, stru, param);
2924 /* Write out the 'enum' definition for gt_types_enum. */
2927 write_enum_defn (type_p structures, type_p param_structs)
2931 oprintf (header_file, "\n/* Enumeration of types known. */\n");
2932 oprintf (header_file, "enum gt_types_enum {\n");
2933 for (s = structures; s; s = s->next)
2934 if (s->gc_used == GC_POINTED_TO
2935 || s->gc_used == GC_MAYBE_POINTED_TO)
2937 if (s->gc_used == GC_MAYBE_POINTED_TO
2938 && s->u.s.line.file == NULL)
2941 oprintf (header_file, " gt_ggc_e_");
2942 output_mangled_typename (header_file, s);
2943 oprintf (header_file, ", \n");
2945 for (s = param_structs; s; s = s->next)
2946 if (s->gc_used == GC_POINTED_TO)
2948 oprintf (header_file, " gt_e_");
2949 output_mangled_typename (header_file, s);
2950 oprintf (header_file, ", \n");
2952 oprintf (header_file, " gt_types_enum_last\n");
2953 oprintf (header_file, "};\n");
2956 /* Might T contain any non-pointer elements? */
2959 contains_scalar_p (type_p t)
2967 return contains_scalar_p (t->u.a.p);
2969 /* Could also check for structures that have no non-pointer
2970 fields, but there aren't enough of those to worry about. */
2975 /* Mangle FN and print it to F. */
2978 put_mangled_filename (outf_p f, const char *fn)
2980 const char *name = get_output_file_name (fn);
2981 for (; *name != 0; name++)
2982 if (ISALNUM (*name))
2983 oprintf (f, "%c", *name);
2985 oprintf (f, "%c", '_');
2988 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
2989 LASTNAME, and NAME are all strings to insert in various places in
2990 the resulting code. */
2993 finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
2994 const char *tname, const char *name)
2998 for (fli2 = flp; fli2; fli2 = fli2->next)
2999 if (fli2->started_p)
3001 oprintf (fli2->f, " %s\n", lastname);
3002 oprintf (fli2->f, "};\n\n");
3005 for (fli2 = flp; fli2; fli2 = fli2->next)
3006 if (fli2->started_p)
3008 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3011 for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3014 oprintf (base_files[fnum],
3015 "extern const struct %s gt_%s_",
3017 put_mangled_filename (base_files[fnum], fli2->name);
3018 oprintf (base_files[fnum], "[];\n");
3024 for (fnum = 0; fnum < num_lang_dirs; fnum++)
3025 oprintf (base_files [fnum],
3026 "const struct %s * const %s[] = {\n",
3031 for (fli2 = flp; fli2; fli2 = fli2->next)
3032 if (fli2->started_p)
3034 lang_bitmap bitmap = get_lang_bitmap (fli2->name);
3037 fli2->started_p = 0;
3039 for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1)
3042 oprintf (base_files[fnum], " gt_%s_", pfx);
3043 put_mangled_filename (base_files[fnum], fli2->name);
3044 oprintf (base_files[fnum], ",\n");
3050 for (fnum = 0; fnum < num_lang_dirs; fnum++)
3052 oprintf (base_files[fnum], " NULL\n");
3053 oprintf (base_files[fnum], "};\n");
3058 /* Write out to F the table entry and any marker routines needed to
3059 mark NAME as TYPE. The original variable is V, at LINE.
3060 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
3061 is nonzero iff we are building the root table for hash table caches. */
3064 write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
3065 struct fileloc *line, const char *if_marked)
3072 for (fld = type->u.s.fields; fld; fld = fld->next)
3075 const char *desc = NULL;
3078 for (o = fld->opt; o; o = o->next)
3079 if (strcmp (o->name, "skip") == 0)
3081 else if (strcmp (o->name, "desc") == 0)
3083 else if (strcmp (o->name, "param_is") == 0)
3086 error_at_line (line,
3087 "field `%s' of global `%s' has unknown option `%s'",
3088 fld->name, name, o->name);
3092 else if (desc && fld->type->kind == TYPE_UNION)
3094 pair_p validf = NULL;
3097 for (ufld = fld->type->u.s.fields; ufld; ufld = ufld->next)
3099 const char *tag = NULL;
3102 for (oo = ufld->opt; oo; oo = oo->next)
3103 if (strcmp (oo->name, "tag") == 0)
3105 if (tag == NULL || strcmp (tag, desc) != 0)
3108 error_at_line (line,
3109 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3110 name, fld->name, validf->name,
3111 name, fld->name, ufld->name,
3118 newname = xasprintf ("%s.%s.%s",
3119 name, fld->name, validf->name);
3120 write_root (f, v, validf->type, newname, 0, line,
3126 error_at_line (line,
3127 "global `%s.%s' has `desc' option but is not union",
3132 newname = xasprintf ("%s.%s", name, fld->name);
3133 write_root (f, v, fld->type, newname, 0, line, if_marked);
3143 newname = xasprintf ("%s[0]", name);
3144 write_root (f, v, type->u.a.p, newname, has_length, line, if_marked);
3153 oprintf (f, " {\n");
3154 oprintf (f, " &%s,\n", name);
3157 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3159 oprintf (f, " * (%s)", ap->u.a.len);
3160 else if (ap == v->type)
3161 oprintf (f, " * ARRAY_SIZE (%s)", v->name);
3163 oprintf (f, " sizeof (%s", v->name);
3164 for (ap = v->type; ap->kind == TYPE_ARRAY; ap = ap->u.a.p)
3166 oprintf (f, "),\n");
3170 if (! has_length && UNION_OR_STRUCT_P (tp))
3172 oprintf (f, " >_ggc_mx_%s,\n", tp->u.s.tag);
3173 oprintf (f, " >_pch_nx_%s", tp->u.s.tag);
3175 else if (! has_length && tp->kind == TYPE_PARAM_STRUCT)
3177 oprintf (f, " >_ggc_m_");
3178 output_mangled_typename (f, tp);
3179 oprintf (f, ",\n >_pch_n_");
3180 output_mangled_typename (f, tp);
3183 && (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
3185 oprintf (f, " >_ggc_ma_%s,\n", name);
3186 oprintf (f, " >_pch_na_%s", name);
3190 error_at_line (line,
3191 "global `%s' is pointer to unimplemented type",
3195 oprintf (f, ",\n &%s", if_marked);
3196 oprintf (f, "\n },\n");
3202 oprintf (f, " {\n");
3203 oprintf (f, " &%s,\n", name);
3204 oprintf (f, " 1, \n");
3205 oprintf (f, " sizeof (%s),\n", v->name);
3206 oprintf (f, " (gt_pointer_walker) >_ggc_m_S,\n");
3207 oprintf (f, " (gt_pointer_walker) >_pch_n_S\n");
3208 oprintf (f, " },\n");
3216 error_at_line (line,
3217 "global `%s' is unimplemented type",
3222 /* This generates a routine to walk an array. */
3225 write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
3227 struct walk_type_data d;
3230 memset (&d, 0, sizeof (d));
3236 d.bitmap = get_lang_bitmap (v->line.file);
3239 d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name);
3241 if (wtd->param_prefix)
3243 oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
3245 " (void *, void *, gt_pointer_operator, void *);\n");
3246 oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3247 wtd->param_prefix, v->name);
3249 " ATTRIBUTE_UNUSED void *x_p,\n"
3250 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3251 " ATTRIBUTE_UNUSED void * cookie)\n");
3252 oprintf (d.of, "{\n");
3253 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3254 d.process_field = write_types_local_process_field;
3255 walk_type (v->type, &d);
3256 oprintf (f, "}\n\n");
3260 oprintf (f, "static void gt_%sa_%s (void *);\n",
3261 wtd->prefix, v->name);
3262 oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3263 wtd->prefix, v->name);
3265 d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
3266 d.process_field = write_types_process_field;
3267 walk_type (v->type, &d);
3269 oprintf (f, "}\n\n");
3272 /* Output a table describing the locations and types of VARIABLES. */
3275 write_roots (pair_p variables)
3278 struct flist *flp = NULL;
3280 for (v = variables; v; v = v->next)
3282 outf_p f = get_output_file_with_visibility (v->line.file);
3284 const char *length = NULL;
3285 int deletable_p = 0;
3288 for (o = v->opt; o; o = o->next)
3289 if (strcmp (o->name, "length") == 0)
3291 else if (strcmp (o->name, "deletable") == 0)
3293 else if (strcmp (o->name, "param_is") == 0)
3295 else if (strncmp (o->name, "param", 5) == 0
3296 && ISDIGIT (o->name[5])
3297 && strcmp (o->name + 6, "_is") == 0)
3299 else if (strcmp (o->name, "if_marked") == 0)
3302 error_at_line (&v->line,
3303 "global `%s' has unknown option `%s'",
3306 for (fli = flp; fli; fli = fli->next)
3311 fli = XNEW (struct flist);
3315 fli->name = v->line.file;
3318 oprintf (f, "\n/* GC roots. */\n\n");
3323 && v->type->kind == TYPE_POINTER
3324 && (v->type->u.p->kind == TYPE_POINTER
3325 || v->type->u.p->kind == TYPE_STRUCT))
3327 write_array (f, v, &ggc_wtd);
3328 write_array (f, v, &pch_wtd);
3332 for (v = variables; v; v = v->next)
3334 outf_p f = get_output_file_with_visibility (v->line.file);
3340 for (o = v->opt; o; o = o->next)
3341 if (strcmp (o->name, "length") == 0)
3343 else if (strcmp (o->name, "deletable") == 0
3344 || strcmp (o->name, "if_marked") == 0)
3350 for (fli = flp; fli; fli = fli->next)
3353 if (! fli->started_p)
3357 oprintf (f, "const struct ggc_root_tab gt_ggc_r_");
3358 put_mangled_filename (f, v->line.file);
3359 oprintf (f, "[] = {\n");
3362 write_root (f, v, v->type, v->name, length_p, &v->line, NULL);
3365 finish_root_table (flp, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3368 for (v = variables; v; v = v->next)
3370 outf_p f = get_output_file_with_visibility (v->line.file);
3375 for (o = v->opt; o; o = o->next)
3376 if (strcmp (o->name, "deletable") == 0)
3378 else if (strcmp (o->name, "if_marked") == 0)
3384 for (fli = flp; fli; fli = fli->next)
3387 if (! fli->started_p)
3391 oprintf (f, "const struct ggc_root_tab gt_ggc_rd_");
3392 put_mangled_filename (f, v->line.file);
3393 oprintf (f, "[] = {\n");
3396 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3400 finish_root_table (flp, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3401 "gt_ggc_deletable_rtab");
3403 for (v = variables; v; v = v->next)
3405 outf_p f = get_output_file_with_visibility (v->line.file);
3407 const char *if_marked = NULL;
3411 for (o = v->opt; o; o = o->next)
3412 if (strcmp (o->name, "length") == 0)
3414 else if (strcmp (o->name, "if_marked") == 0)
3415 if_marked = o->info;
3417 if (if_marked == NULL)
3420 if (v->type->kind != TYPE_POINTER
3421 || v->type->u.p->kind != TYPE_PARAM_STRUCT
3422 || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
3424 error_at_line (&v->line, "if_marked option used but not hash table");
3428 for (fli = flp; fli; fli = fli->next)
3431 if (! fli->started_p)
3435 oprintf (f, "const struct ggc_cache_tab gt_ggc_rc_");
3436 put_mangled_filename (f, v->line.file);
3437 oprintf (f, "[] = {\n");
3440 write_root (f, v, v->type->u.p->u.param_struct.param[0],
3441 v->name, length_p, &v->line, if_marked);
3444 finish_root_table (flp, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
3445 "gt_ggc_cache_rtab");
3447 for (v = variables; v; v = v->next)
3449 outf_p f = get_output_file_with_visibility (v->line.file);
3452 int if_marked_p = 0;
3455 for (o = v->opt; o; o = o->next)
3456 if (strcmp (o->name, "length") == 0)
3458 else if (strcmp (o->name, "if_marked") == 0)
3464 for (fli = flp; fli; fli = fli->next)
3467 if (! fli->started_p)
3471 oprintf (f, "const struct ggc_root_tab gt_pch_rc_");
3472 put_mangled_filename (f, v->line.file);
3473 oprintf (f, "[] = {\n");
3476 write_root (f, v, v->type, v->name, length_p, &v->line, NULL);
3479 finish_root_table (flp, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3480 "gt_pch_cache_rtab");
3482 for (v = variables; v; v = v->next)
3484 outf_p f = get_output_file_with_visibility (v->line.file);
3489 for (o = v->opt; o; o = o->next)
3490 if (strcmp (o->name, "deletable") == 0
3491 || strcmp (o->name, "if_marked") == 0)
3497 if (! contains_scalar_p (v->type))
3500 for (fli = flp; fli; fli = fli->next)
3503 if (! fli->started_p)
3507 oprintf (f, "const struct ggc_root_tab gt_pch_rs_");
3508 put_mangled_filename (f, v->line.file);
3509 oprintf (f, "[] = {\n");
3512 oprintf (f, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3516 finish_root_table (flp, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3517 "gt_pch_scalar_rtab");
3520 /* Record the definition of a generic VEC structure, as if we had expanded
3521 the macros in vec.h:
3523 typedef struct VEC_<type>_base GTY(()) {
3526 <type> GTY((length ("%h.num"))) vec[1];
3529 where the GTY(()) tags are only present if is_scalar is _false_. */
3532 note_def_vec (const char *typename, bool is_scalar, struct fileloc *pos)
3537 type_p len_ty = create_scalar_type ("unsigned");
3538 const char *name = concat ("VEC_", typename, "_base", (char *)0);
3542 t = create_scalar_type (typename);
3547 t = resolve_typedef (typename, pos);
3548 o = create_option (0, "length", "%h.num");
3551 /* We assemble the field list in reverse order. */
3552 fields = create_field_at (0, create_array (t, "1"), "vec", o, pos);
3553 fields = create_field_at (fields, len_ty, "alloc", 0, pos);
3554 fields = create_field_at (fields, len_ty, "num", 0, pos);
3556 do_typedef (name, new_structure (name, 0, pos, fields, 0), pos);
3559 /* Record the definition of an allocation-specific VEC structure, as if
3560 we had expanded the macros in vec.h:
3562 typedef struct VEC_<type>_<astrat> {
3563 VEC_<type>_base base;
3564 } VEC_<type>_<astrat>;
3567 note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
3569 const char *astratname = concat ("VEC_", type, "_", astrat, (char *)0);
3570 const char *basename = concat ("VEC_", type, "_base", (char *)0);
3572 pair_p field = create_field_at (0, resolve_typedef (basename, pos),
3575 do_typedef (astratname, new_structure (astratname, 0, pos, field, 0), pos);
3580 main (int argc, char **argv)
3583 static struct fileloc pos = { this_file, 0 };
3585 /* fatal uses this */
3586 progname = "gengtype";
3589 fatal ("usage: gengtype srcdir input-list");
3592 srcdir_len = strlen (srcdir);
3594 read_input_list (argv[2]);
3598 scalar_char.u.scalar_is_char = true;
3599 scalar_nonchar.u.scalar_is_char = false;
3602 /* These types are set up with #define or else outside of where
3604 pos.line = __LINE__ + 1;
3605 do_scalar_typedef ("CUMULATIVE_ARGS", &pos); pos.line++;
3606 do_scalar_typedef ("REAL_VALUE_TYPE", &pos); pos.line++;
3607 do_scalar_typedef ("FIXED_VALUE_TYPE", &pos); pos.line++;
3608 do_scalar_typedef ("double_int", &pos); pos.line++;
3609 do_scalar_typedef ("uint8", &pos); pos.line++;
3610 do_scalar_typedef ("jword", &pos); pos.line++;
3611 do_scalar_typedef ("JCF_u2", &pos); pos.line++;
3612 do_scalar_typedef ("void", &pos); pos.line++;
3613 do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos);
3615 for (i = 0; i < num_gt_files; i++)
3616 parse_file (gt_files[i]);
3621 set_gc_used (variables);
3624 write_enum_defn (structures, param_structs);
3625 write_types (structures, param_structs, &ggc_wtd);
3626 write_types (structures, param_structs, &pch_wtd);
3627 write_local (structures, param_structs);
3628 write_roots (variables);
3630 close_output_files ();