1 /* Process source files and output type information.
2 Copyright (C) 2002-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
26 #include "errors.h" /* for fatal */
28 #include "version.h" /* for version_string & pkgversion_string. */
33 #include "filenames.h"
35 /* Data types, macros, etc. used only in this file. */
38 /* The list of output files. */
41 /* The output header file that is included into pretty much every
46 /* The name of the file containing the list of input files. */
47 static char *inputlist
;
49 /* The plugin input files and their number; in that case only
50 a single file is produced. */
51 static input_file
**plugin_files
;
52 static size_t nb_plugin_files
;
54 /* The generated plugin output file and name. */
55 static outf_p plugin_output
;
56 static char *plugin_output_filename
;
58 /* Our source directory and its length. */
62 /* Variables used for reading and writing the state. */
63 const char *read_state_filename
;
64 const char *write_state_filename
;
66 /* Variables to help debugging. */
70 /* Level for verbose messages. */
73 /* We have a type count and use it to set the state_number of newly
74 allocated types to some unique negative number. */
75 static int type_count
;
77 /* The backup directory should be in the same file system as the
78 generated files, otherwise the rename(2) system call would fail.
79 If NULL, no backup is made when overwriting a generated file. */
80 static const char* backup_dir
; /* (-B) program option. */
83 static outf_p
create_file (const char *, const char *);
85 static const char *get_file_basename (const input_file
*);
86 static const char *get_file_realbasename (const input_file
*);
88 static int get_prefix_langdir_index (const char *);
89 static const char *get_file_langdir (const input_file
*);
91 static void dump_pair (int indent
, pair_p p
);
92 static void dump_type (int indent
, type_p p
);
93 static void dump_type_list (int indent
, type_p p
);
96 /* Nonzero iff an error has occurred. */
97 bool hit_error
= false;
99 static void gen_rtx_next (void);
100 static void write_rtx_next (void);
101 static void open_base_files (void);
102 static void close_output_files (void);
104 /* Report an error at POS, printing MSG. */
107 error_at_line (const struct fileloc
*pos
, const char *msg
, ...)
111 gcc_assert (pos
!= NULL
&& pos
->file
!= NULL
);
114 fprintf (stderr
, "%s:%d: ", get_input_file_name (pos
->file
), pos
->line
);
115 vfprintf (stderr
, msg
, ap
);
116 fputc ('\n', stderr
);
122 /* asprintf, but produces fatal message on out-of-memory. */
124 xasprintf (const char *format
, ...)
130 va_start (ap
, format
);
131 n
= vasprintf (&result
, format
, ap
);
132 if (result
== NULL
|| n
< 0)
133 fatal ("out of memory");
139 /* Locate the ultimate base class of struct S. */
142 get_ultimate_base_class (const_type_p s
)
144 while (s
->u
.s
.base_class
)
145 s
= s
->u
.s
.base_class
;
150 get_ultimate_base_class (type_p s
)
152 while (s
->u
.s
.base_class
)
153 s
= s
->u
.s
.base_class
;
157 /* Input file handling. */
159 /* Table of all input files. */
160 const input_file
**gt_files
;
163 /* A number of places use the name of this "gengtype.c" file for a
164 location for things that we can't rely on the source to define.
165 Make sure we can still use pointer comparison on filenames. */
166 input_file
* this_file
;
167 /* The "system.h" file is likewise specially useful. */
168 input_file
* system_h_file
;
170 /* Vector of per-language directories. */
171 const char **lang_dir_names
;
172 size_t num_lang_dirs
;
174 /* An array of output files suitable for definitions. There is one
175 BASE_FILES entry for each language. */
176 static outf_p
*base_files
;
181 /* Utility debugging function, printing the various type counts within
182 a list of types. Called through the DBGPRINT_COUNT_TYPE macro. */
184 dbgprint_count_type_at (const char *fil
, int lin
, const char *msg
, type_p t
)
186 int nb_types
= 0, nb_scalar
= 0, nb_string
= 0;
187 int nb_struct
= 0, nb_union
= 0, nb_array
= 0, nb_pointer
= 0;
188 int nb_lang_struct
= 0, nb_param_struct
= 0;
189 int nb_user_struct
= 0, nb_undefined
= 0;
191 for (p
= t
; p
; p
= p
->next
)
207 case TYPE_USER_STRUCT
:
219 case TYPE_LANG_STRUCT
:
222 case TYPE_PARAM_STRUCT
:
229 fprintf (stderr
, "\n" "%s:%d: %s: @@%%@@ %d types ::\n",
230 lbasename (fil
), lin
, msg
, nb_types
);
231 if (nb_scalar
> 0 || nb_string
> 0)
232 fprintf (stderr
, "@@%%@@ %d scalars, %d strings\n", nb_scalar
, nb_string
);
233 if (nb_struct
> 0 || nb_union
> 0)
234 fprintf (stderr
, "@@%%@@ %d structs, %d unions\n", nb_struct
, nb_union
);
235 if (nb_pointer
> 0 || nb_array
> 0)
236 fprintf (stderr
, "@@%%@@ %d pointers, %d arrays\n", nb_pointer
, nb_array
);
237 if (nb_lang_struct
> 0 || nb_param_struct
> 0)
238 fprintf (stderr
, "@@%%@@ %d lang_structs, %d param_structs\n",
239 nb_lang_struct
, nb_param_struct
);
240 if (nb_user_struct
> 0)
241 fprintf (stderr
, "@@%%@@ %d user_structs\n", nb_user_struct
);
242 if (nb_undefined
> 0)
243 fprintf (stderr
, "@@%%@@ %d undefined types\n", nb_undefined
);
244 fprintf (stderr
, "\n");
246 #endif /* ENABLE_CHECKING */
248 /* Scan the input file, LIST, and determine how much space we need to
249 store strings in. Also, count the number of language directories
250 and files. The numbers returned are overestimates as they does not
251 consider repeated files. */
253 measure_input_list (FILE *list
)
259 num_gt_files
= plugin_files
? nb_plugin_files
: 0;
260 while ((c
= getc (list
)) != EOF
)
269 /* Add space for a lang_bitmap before the input file name. */
270 n
+= sizeof (lang_bitmap
);
284 /* Read one input line from LIST to HEREP (which is updated). A
285 pointer to the string is returned via LINEP. If it was a language
286 subdirectory in square brackets, strip off the square brackets and
287 return true. Otherwise, leave space before the string for a
288 lang_bitmap, and return false. At EOF, returns false, does not
289 touch *HEREP, and sets *LINEP to NULL. POS is used for
292 read_input_line (FILE *list
, char **herep
, char **linep
, struct fileloc
*pos
)
298 /* Read over whitespace. */
299 while (c
== '\n' || c
== ' ')
309 /* No space for a lang_bitmap is necessary. Discard the '['. */
312 while (c
!= ']' && c
!= '\n' && c
!= EOF
)
321 c
= getc (list
); /* eat what should be a newline */
322 if (c
!= '\n' && c
!= EOF
)
323 error_at_line (pos
, "junk on line after language tag [%s]", line
);
326 error_at_line (pos
, "missing close bracket for language tag [%s",
335 /* Leave space for a lang_bitmap. */
336 memset (here
, 0, sizeof (lang_bitmap
));
337 here
+= sizeof (lang_bitmap
);
344 while (c
!= EOF
&& c
!= '\n');
352 /* Read the list of input files from LIST and compute all of the
353 relevant tables. There is one file per line of the list. At
354 first, all the files on the list are language-generic, but
355 eventually a line will appear which is the name of a language
356 subdirectory in square brackets, like this: [cp]. All subsequent
357 files are specific to that language, until another language
358 subdirectory tag appears. Files can appear more than once, if
359 they apply to more than one language. */
361 read_input_list (const char *listname
)
363 FILE *list
= fopen (listname
, "r");
365 fatal ("cannot open %s: %s", listname
, xstrerror (errno
));
369 size_t bufsz
= measure_input_list (list
);
370 char *buf
= XNEWVEC (char, bufsz
);
372 char *committed
= buf
;
373 char *limit
= buf
+ bufsz
;
378 lang_bitmap curlangs
= (1 << num_lang_dirs
) - 1;
380 epos
.file
= input_file_by_name (listname
);
383 lang_dir_names
= XNEWVEC (const char *, num_lang_dirs
);
384 gt_files
= XNEWVEC (const input_file
*, num_gt_files
);
391 is_language
= read_input_line (list
, &here
, &line
, &epos
);
392 gcc_assert (here
<= limit
);
395 else if (is_language
)
398 gcc_assert (langno
<= num_lang_dirs
);
399 for (i
= 0; i
< langno
; i
++)
400 if (strcmp (lang_dir_names
[i
], line
) == 0)
402 error_at_line (&epos
, "duplicate language tag [%s]",
409 curlangs
= 1 << langno
;
410 lang_dir_names
[langno
++] = line
;
415 input_file
*inpf
= input_file_by_name (line
);
416 gcc_assert (nfiles
<= num_gt_files
);
417 for (i
= 0; i
< nfiles
; i
++)
418 /* Since the input_file-s are uniquely hash-consed, we
419 can just compare pointers! */
420 if (gt_files
[i
] == inpf
)
422 /* Throw away the string we just read, and add the
423 current language to the existing string's bitmap. */
424 lang_bitmap bmap
= get_lang_bitmap (inpf
);
426 error_at_line (&epos
,
427 "file %s specified more than once "
428 "for language %s", line
,
430 0 ? "(all)" : lang_dir_names
[langno
-
434 set_lang_bitmap (inpf
, bmap
);
439 set_lang_bitmap (inpf
, curlangs
);
440 gt_files
[nfiles
++] = inpf
;
443 /* Update the global counts now that we know accurately how many
444 things there are. (We do not bother resizing the arrays down.) */
445 num_lang_dirs
= langno
;
446 /* Add the plugin files if provided. */
450 for (i
= 0; i
< nb_plugin_files
; i
++)
451 gt_files
[nfiles
++] = plugin_files
[i
];
453 num_gt_files
= nfiles
;
456 /* Sanity check: any file that resides in a language subdirectory
457 (e.g. 'cp') ought to belong to the corresponding language.
458 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
459 (Can you even do that? Should you be allowed to?) */
462 for (f
= 0; f
< num_gt_files
; f
++)
464 lang_bitmap bitmap
= get_lang_bitmap (gt_files
[f
]);
465 const char *basename
= get_file_basename (gt_files
[f
]);
466 const char *slashpos
= strchr (basename
, '/');
467 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
468 const char *slashpos2
= strchr (basename
, '\\');
470 if (!slashpos
|| (slashpos2
&& slashpos2
< slashpos
))
471 slashpos
= slashpos2
;
477 for (l
= 0; l
< num_lang_dirs
; l
++)
478 if ((size_t) (slashpos
- basename
) == strlen (lang_dir_names
[l
])
479 && memcmp (basename
, lang_dir_names
[l
],
480 strlen (lang_dir_names
[l
])) == 0)
482 if (!(bitmap
& (1 << l
)))
483 error ("%s is in language directory '%s' but is not "
484 "tagged for that language",
485 basename
, lang_dir_names
[l
]);
493 fatal ("error reading %s: %s", listname
, xstrerror (errno
));
500 /* The one and only TYPE_STRING. */
502 struct type string_type
= {
503 TYPE_STRING
, 0, 0, 0, GC_USED
, {0}
506 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
507 set early in main. */
509 struct type scalar_nonchar
= {
510 TYPE_SCALAR
, 0, 0, 0, GC_USED
, {0}
513 struct type scalar_char
= {
514 TYPE_SCALAR
, 0, 0, 0, GC_USED
, {0}
517 /* Lists of various things. */
519 pair_p typedefs
= NULL
;
520 type_p structures
= NULL
;
521 type_p param_structs
= NULL
;
522 pair_p variables
= NULL
;
524 static type_p
find_param_structure (type_p t
, type_p param
[NUM_PARAM
]);
525 static type_p
adjust_field_tree_exp (type_p t
, options_p opt
);
526 static type_p
adjust_field_rtx_def (type_p t
, options_p opt
);
528 /* Define S as a typedef to T at POS. */
531 do_typedef (const char *s
, type_p t
, struct fileloc
*pos
)
535 /* temporary kludge - gengtype doesn't handle conditionals or
536 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
537 is coming from this file (main() sets them up with safe dummy
539 if (!strcmp (s
, "CUMULATIVE_ARGS") && pos
->file
!= this_file
)
542 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
543 if (strcmp (p
->name
, s
) == 0)
545 if (p
->type
!= t
&& strcmp (s
, "result_type") != 0)
547 error_at_line (pos
, "type `%s' previously defined", s
);
548 error_at_line (&p
->line
, "previously defined here");
553 p
= XNEW (struct pair
);
562 /* Define S as a typename of a scalar. Cannot be used to define
563 typedefs of 'char'. Note: is also used for pointer-to-function
564 typedefs (which are therefore not treated as pointers). */
567 do_scalar_typedef (const char *s
, struct fileloc
*pos
)
569 do_typedef (s
, &scalar_nonchar
, pos
);
572 /* Similar to strtok_r. */
575 strtoken (char *str
, const char *delim
, char **next
)
582 /* Skip the leading delimiters. */
583 str
+= strspn (str
, delim
);
585 /* This is an empty token. */
588 /* The current token. */
591 /* Find the next delimiter. */
592 str
+= strcspn (str
, delim
);
594 /* This is the last token. */
598 /* Terminate the current token. */
600 /* Advance to the next token. */
607 /* Define TYPE_NAME to be a user defined type at location POS. */
610 create_user_defined_type (const char *type_name
, struct fileloc
*pos
)
612 type_p ty
= find_structure (type_name
, TYPE_USER_STRUCT
);
614 /* We might have already seen an incomplete decl of the given type,
615 in which case we won't have yet seen a GTY((user)), and the type will
616 only have kind "TYPE_STRUCT". Mark it as a user struct. */
617 ty
->kind
= TYPE_USER_STRUCT
;
620 ty
->u
.s
.bitmap
= get_lang_bitmap (pos
->file
);
621 do_typedef (type_name
, ty
, pos
);
623 /* If TYPE_NAME specifies a template, create references to the types
624 in the template by pretending that each type is a field of TY.
625 This is needed to make sure that the types referenced by the
626 template are marked as used. */
627 char *str
= xstrdup (type_name
);
628 char *open_bracket
= strchr (str
, '<');
631 /* We only accept simple template declarations (see
632 require_template_declaration), so we only need to parse a
633 comma-separated list of strings, implicitly assumed to
634 be type names, potentially with "*" characters. */
635 char *arg
= open_bracket
+ 1;
637 char *type_id
= strtoken (arg
, ",>", &next
);
641 /* Create a new field for every type found inside the template
644 /* Support a single trailing "*" character. */
645 const char *star
= strchr (type_id
, '*');
646 int is_ptr
= (star
!= NULL
);
647 size_t offset_to_star
= star
- type_id
;
649 offset_to_star
= star
- type_id
;
651 if (strstr (type_id
, "char*"))
653 type_id
= strtoken (0, ",>", &next
);
657 char *field_name
= xstrdup (type_id
);
662 /* Strip off the first '*' character (and any subsequent text). */
663 *(field_name
+ offset_to_star
) = '\0';
665 arg_type
= find_structure (field_name
, TYPE_STRUCT
);
666 arg_type
= create_pointer (arg_type
);
669 arg_type
= resolve_typedef (field_name
, pos
);
671 fields
= create_field_at (fields
, arg_type
, field_name
, 0, pos
);
672 type_id
= strtoken (0, ",>", &next
);
675 /* Associate the field list to TY. */
676 ty
->u
.s
.fields
= fields
;
684 /* Given a typedef name S, return its associated type. Return NULL if
685 S is not a registered type name. */
688 type_for_name (const char *s
)
692 /* Special-case support for types within a "gcc::" namespace. Rather
693 than fully-supporting namespaces, simply strip off the "gcc::" prefix
694 where present. This allows us to have GTY roots of this form:
695 extern GTY(()) gcc::some_type *some_ptr;
696 where the autogenerated functions will refer to simply "some_type",
697 where they can be resolved into their namespace. */
698 if (0 == strncmp (s
, "gcc::", 5))
701 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
702 if (strcmp (p
->name
, s
) == 0)
708 /* Create an undefined type with name S and location POS. Return the
709 newly created type. */
712 create_undefined_type (const char *s
, struct fileloc
*pos
)
714 type_p ty
= find_structure (s
, TYPE_UNDEFINED
);
716 ty
->u
.s
.bitmap
= get_lang_bitmap (pos
->file
);
717 do_typedef (s
, ty
, pos
);
722 /* Return the type previously defined for S. Use POS to report errors. */
725 resolve_typedef (const char *s
, struct fileloc
*pos
)
727 bool is_template_instance
= (strchr (s
, '<') != NULL
);
728 type_p p
= type_for_name (s
);
730 /* If we did not find a typedef registered, generate a TYPE_UNDEFINED
731 type for regular type identifiers. If the type identifier S is a
732 template instantiation, however, we treat it as a user defined
735 FIXME, this is actually a limitation in gengtype. Supporting
736 template types and their instances would require keeping separate
737 track of the basic types definition and its instances. This
738 essentially forces all template classes in GC to be marked
741 p
= (is_template_instance
)
742 ? create_user_defined_type (s
, pos
)
743 : create_undefined_type (s
, pos
);
748 /* Add SUBCLASS to head of linked list of BASE's subclasses. */
750 void add_subclass (type_p base
, type_p subclass
)
752 gcc_assert (union_or_struct_p (base
));
753 gcc_assert (union_or_struct_p (subclass
));
755 subclass
->u
.s
.next_sibling_class
= base
->u
.s
.first_subclass
;
756 base
->u
.s
.first_subclass
= subclass
;
759 /* Create and return a new structure with tag NAME at POS with fields
760 FIELDS and options O. The KIND of structure must be one of
761 TYPE_STRUCT, TYPE_UNION or TYPE_USER_STRUCT. */
764 new_structure (const char *name
, enum typekind kind
, struct fileloc
*pos
,
765 pair_p fields
, options_p o
, type_p base_class
)
769 lang_bitmap bitmap
= get_lang_bitmap (pos
->file
);
770 bool isunion
= (kind
== TYPE_UNION
);
772 gcc_assert (union_or_struct_p (kind
));
774 for (si
= structures
; si
!= NULL
; si
= si
->next
)
775 if (strcmp (name
, si
->u
.s
.tag
) == 0 && UNION_P (si
) == isunion
)
778 if (si
->kind
== TYPE_LANG_STRUCT
)
782 for (si
= ls
->u
.s
.lang_struct
; si
!= NULL
; si
= si
->next
)
783 if (si
->u
.s
.bitmap
== bitmap
)
786 else if (si
->u
.s
.line
.file
!= NULL
&& si
->u
.s
.bitmap
!= bitmap
)
790 si
= XCNEW (struct type
);
791 memcpy (si
, ls
, sizeof (struct type
));
792 ls
->kind
= TYPE_LANG_STRUCT
;
793 ls
->u
.s
.lang_struct
= si
;
794 ls
->u
.s
.fields
= NULL
;
796 si
->state_number
= -type_count
;
797 si
->pointer_to
= NULL
;
798 si
->u
.s
.lang_struct
= ls
;
803 if (ls
!= NULL
&& s
== NULL
)
806 s
= XCNEW (struct type
);
807 s
->state_number
= -type_count
;
808 s
->next
= ls
->u
.s
.lang_struct
;
809 ls
->u
.s
.lang_struct
= s
;
810 s
->u
.s
.lang_struct
= ls
;
818 s
= XCNEW (struct type
);
819 s
->state_number
= -type_count
;
820 s
->next
= structures
;
824 if (s
->u
.s
.lang_struct
&& (s
->u
.s
.lang_struct
->u
.s
.bitmap
& bitmap
))
826 error_at_line (pos
, "duplicate definition of '%s %s'",
827 isunion
? "union" : "struct", s
->u
.s
.tag
);
828 error_at_line (&s
->u
.s
.line
, "previous definition here");
834 s
->u
.s
.fields
= fields
;
836 s
->u
.s
.bitmap
= bitmap
;
837 if (s
->u
.s
.lang_struct
)
838 s
->u
.s
.lang_struct
->u
.s
.bitmap
|= bitmap
;
839 s
->u
.s
.base_class
= base_class
;
841 add_subclass (base_class
, s
);
846 /* Return the previously-defined structure or union with tag NAME,
847 or a new empty structure or union if none was defined previously.
848 The KIND of structure must be one of TYPE_STRUCT, TYPE_UNION or
852 find_structure (const char *name
, enum typekind kind
)
855 bool isunion
= (kind
== TYPE_UNION
);
857 gcc_assert (kind
== TYPE_UNDEFINED
|| union_or_struct_p (kind
));
859 for (s
= structures
; s
!= NULL
; s
= s
->next
)
860 if (strcmp (name
, s
->u
.s
.tag
) == 0 && UNION_P (s
) == isunion
)
864 s
= XCNEW (struct type
);
865 s
->next
= structures
;
866 s
->state_number
= -type_count
;
874 /* Return the previously-defined parameterized structure for structure
875 T and parameters PARAM, or a new parameterized empty structure or
876 union if none was defined previously. */
879 find_param_structure (type_p t
, type_p param
[NUM_PARAM
])
883 for (res
= param_structs
; res
; res
= res
->next
)
884 if (res
->u
.param_struct
.stru
== t
885 && memcmp (res
->u
.param_struct
.param
, param
,
886 sizeof (type_p
) * NUM_PARAM
) == 0)
891 res
= XCNEW (struct type
);
892 res
->kind
= TYPE_PARAM_STRUCT
;
893 res
->next
= param_structs
;
894 res
->state_number
= -type_count
;
896 res
->u
.param_struct
.stru
= t
;
897 memcpy (res
->u
.param_struct
.param
, param
, sizeof (type_p
) * NUM_PARAM
);
902 /* Return a scalar type with name NAME. */
905 create_scalar_type (const char *name
)
907 if (!strcmp (name
, "char") || !strcmp (name
, "unsigned char"))
910 return &scalar_nonchar
;
914 /* Return a pointer to T. */
917 create_pointer (type_p t
)
921 type_p r
= XCNEW (struct type
);
923 r
->state_number
= -type_count
;
924 r
->kind
= TYPE_POINTER
;
928 return t
->pointer_to
;
931 /* Return an array of length LEN. */
934 create_array (type_p t
, const char *len
)
939 v
= XCNEW (struct type
);
940 v
->kind
= TYPE_ARRAY
;
941 v
->state_number
= -type_count
;
947 /* Return a string options structure with name NAME and info INFO.
948 NEXT is the next option in the chain. */
950 create_string_option (options_p next
, const char *name
, const char *info
)
952 options_p o
= XNEW (struct options
);
953 o
->kind
= OPTION_STRING
;
956 o
->info
.string
= info
;
960 /* Create a type options structure with name NAME and info INFO. NEXT
961 is the next option in the chain. */
963 create_type_option (options_p next
, const char* name
, type_p info
)
965 options_p o
= XNEW (struct options
);
968 o
->kind
= OPTION_TYPE
;
973 /* Create a nested pointer options structure with name NAME and info
974 INFO. NEXT is the next option in the chain. */
976 create_nested_option (options_p next
, const char* name
,
977 struct nested_ptr_data
* info
)
980 o
= XNEW (struct options
);
983 o
->kind
= OPTION_NESTED
;
984 o
->info
.nested
= info
;
988 /* Return an options structure for a "nested_ptr" option. */
990 create_nested_ptr_option (options_p next
, type_p t
,
991 const char *to
, const char *from
)
993 struct nested_ptr_data
*d
= XNEW (struct nested_ptr_data
);
995 d
->type
= adjust_field_type (t
, 0);
997 d
->convert_from
= from
;
998 return create_nested_option (next
, "nested_ptr", d
);
1001 /* Add a variable named S of type T with options O defined at POS,
1004 note_variable (const char *s
, type_p t
, options_p o
, struct fileloc
*pos
)
1007 n
= XNEW (struct pair
);
1012 n
->next
= variables
;
1016 /* Most-general structure field creator. */
1018 create_field_all (pair_p next
, type_p type
, const char *name
, options_p opt
,
1019 const input_file
*inpf
, int line
)
1023 field
= XNEW (struct pair
);
1028 field
->line
.file
= inpf
;
1029 field
->line
.line
= line
;
1033 /* Create a field that came from the source code we are scanning,
1034 i.e. we have a 'struct fileloc', and possibly options; also,
1035 adjust_field_type should be called. */
1037 create_field_at (pair_p next
, type_p type
, const char *name
, options_p opt
,
1038 struct fileloc
*pos
)
1040 return create_field_all (next
, adjust_field_type (type
, opt
),
1041 name
, opt
, pos
->file
, pos
->line
);
1044 /* Create a fake field with the given type and name. NEXT is the next
1045 field in the chain. */
1046 #define create_field(next,type,name) \
1047 create_field_all (next,type,name, 0, this_file, __LINE__)
1049 /* Like create_field, but the field is only valid when condition COND
1053 create_optional_field_ (pair_p next
, type_p type
, const char *name
,
1054 const char *cond
, int line
)
1057 pair_p union_fields
;
1060 /* Create a fake union type with a single nameless field of type TYPE.
1061 The field has a tag of "1". This allows us to make the presence
1062 of a field of type TYPE depend on some boolean "desc" being true. */
1063 union_fields
= create_field (NULL
, type
, "");
1065 create_string_option (union_fields
->opt
, "dot", "");
1067 create_string_option (union_fields
->opt
, "tag", "1");
1069 new_structure (xasprintf ("%s_%d", "fake_union", id
++), TYPE_UNION
,
1070 &lexer_line
, union_fields
, NULL
, NULL
);
1072 /* Create the field and give it the new fake union type. Add a "desc"
1073 tag that specifies the condition under which the field is valid. */
1074 return create_field_all (next
, union_type
, name
,
1075 create_string_option (0, "desc", cond
),
1079 #define create_optional_field(next,type,name,cond) \
1080 create_optional_field_(next,type,name,cond,__LINE__)
1082 /* Reverse a linked list of 'struct pair's in place. */
1084 nreverse_pairs (pair_p list
)
1086 pair_p prev
= 0, p
, next
;
1087 for (p
= list
; p
; p
= next
)
1097 /* We don't care how long a CONST_DOUBLE is. */
1098 #define CONST_DOUBLE_FORMAT "ww"
1099 /* We don't want to see codes that are only for generator files. */
1100 #undef GENERATOR_FILE
1104 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
1110 static const char *const rtx_name
[NUM_RTX_CODE
] = {
1111 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
1116 static const char *const rtx_format
[NUM_RTX_CODE
] = {
1117 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
1122 static int rtx_next_new
[NUM_RTX_CODE
];
1124 /* We also need codes and names for insn notes (not register notes).
1125 Note that we do *not* bias the note values here. */
1128 #define DEF_INSN_NOTE(NAME) NAME,
1129 #include "insn-notes.def"
1130 #undef DEF_INSN_NOTE
1135 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
1136 default field for line number notes. */
1137 static const char *const note_insn_name
[NOTE_INSN_MAX
+ 1] = {
1138 #define DEF_INSN_NOTE(NAME) #NAME,
1139 #include "insn-notes.def"
1140 #undef DEF_INSN_NOTE
1143 #undef CONST_DOUBLE_FORMAT
1144 #define GENERATOR_FILE
1146 /* Generate the contents of the rtx_next array. This really doesn't belong
1147 in gengtype at all, but it's needed for adjust_field_rtx_def. */
1153 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1157 rtx_next_new
[i
] = -1;
1158 if (strncmp (rtx_format
[i
], "uu", 2) == 0)
1159 rtx_next_new
[i
] = 1;
1160 else if (i
== COND_EXEC
|| i
== SET
|| i
== EXPR_LIST
|| i
== INSN_LIST
)
1161 rtx_next_new
[i
] = 1;
1163 for (k
= strlen (rtx_format
[i
]) - 1; k
>= 0; k
--)
1164 if (rtx_format
[i
][k
] == 'e' || rtx_format
[i
][k
] == 'u')
1165 rtx_next_new
[i
] = k
;
1169 /* Write out the contents of the rtx_next array. */
1171 write_rtx_next (void)
1173 outf_p f
= get_output_file_with_visibility (NULL
);
1178 oprintf (f
, "\n/* Used to implement the RTX_NEXT macro. */\n");
1179 oprintf (f
, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
1180 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1181 if (rtx_next_new
[i
] == -1)
1182 oprintf (f
, " 0,\n");
1185 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n", rtx_next_new
[i
]);
1186 oprintf (f
, "};\n");
1189 /* Handle `special("rtx_def")'. This is a special case for field
1190 `fld' of struct rtx_def, which is an array of unions whose values
1191 are based in a complex way on the type of RTL. */
1194 adjust_field_rtx_def (type_p t
, options_p
ARG_UNUSED (opt
))
1199 type_p rtx_tp
, rtvec_tp
, tree_tp
, mem_attrs_tp
, note_union_tp
, scalar_tp
;
1200 type_p basic_block_tp
, reg_attrs_tp
, constant_tp
, symbol_union_tp
;
1202 if (t
->kind
!= TYPE_UNION
)
1204 error_at_line (&lexer_line
,
1205 "special `rtx_def' must be applied to a union");
1206 return &string_type
;
1209 nodot
= create_string_option (NULL
, "dot", "");
1211 rtx_tp
= create_pointer (find_structure ("rtx_def", TYPE_STRUCT
));
1212 rtvec_tp
= create_pointer (find_structure ("rtvec_def", TYPE_STRUCT
));
1213 tree_tp
= create_pointer (find_structure ("tree_node", TYPE_UNION
));
1214 mem_attrs_tp
= create_pointer (find_structure ("mem_attrs", TYPE_STRUCT
));
1216 create_pointer (find_structure ("reg_attrs", TYPE_STRUCT
));
1218 create_pointer (find_structure ("basic_block_def", TYPE_STRUCT
));
1220 create_pointer (find_structure ("constant_descriptor_rtx", TYPE_STRUCT
));
1221 scalar_tp
= &scalar_nonchar
; /* rtunion int */
1224 pair_p note_flds
= NULL
;
1227 for (c
= 0; c
<= NOTE_INSN_MAX
; c
++)
1232 case NOTE_INSN_DELETED_LABEL
:
1233 case NOTE_INSN_DELETED_DEBUG_LABEL
:
1234 note_flds
= create_field (note_flds
, &string_type
, "rt_str");
1237 case NOTE_INSN_BLOCK_BEG
:
1238 case NOTE_INSN_BLOCK_END
:
1239 note_flds
= create_field (note_flds
, tree_tp
, "rt_tree");
1242 case NOTE_INSN_VAR_LOCATION
:
1243 case NOTE_INSN_CALL_ARG_LOCATION
:
1244 note_flds
= create_field (note_flds
, rtx_tp
, "rt_rtx");
1248 note_flds
= create_field (note_flds
, scalar_tp
, "rt_int");
1251 /* NOTE_INSN_MAX is used as the default field for line
1253 if (c
== NOTE_INSN_MAX
)
1255 create_string_option (nodot
, "default", "");
1258 create_string_option (nodot
, "tag", note_insn_name
[c
]);
1260 note_union_tp
= new_structure ("rtx_def_note_subunion", TYPE_UNION
,
1261 &lexer_line
, note_flds
, NULL
, NULL
);
1263 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1266 sym_flds
= create_field (NULL
, tree_tp
, "rt_tree");
1267 sym_flds
->opt
= create_string_option (nodot
, "default", "");
1268 sym_flds
= create_field (sym_flds
, constant_tp
, "rt_constant");
1269 sym_flds
->opt
= create_string_option (nodot
, "tag", "1");
1270 symbol_union_tp
= new_structure ("rtx_def_symbol_subunion", TYPE_UNION
,
1271 &lexer_line
, sym_flds
, NULL
, NULL
);
1273 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1275 pair_p subfields
= NULL
;
1276 size_t aindex
, nmindex
;
1281 for (aindex
= 0; aindex
< strlen (rtx_format
[i
]); aindex
++)
1284 const char *subname
;
1286 switch (rtx_format
[i
][aindex
])
1297 if (i
== MEM
&& aindex
== 1)
1298 t
= mem_attrs_tp
, subname
= "rt_mem";
1299 else if (i
== JUMP_INSN
&& aindex
== 7)
1300 t
= rtx_tp
, subname
= "rt_rtx";
1301 else if (i
== CODE_LABEL
&& aindex
== 4)
1302 t
= scalar_tp
, subname
= "rt_int";
1303 else if (i
== CODE_LABEL
&& aindex
== 3)
1304 t
= rtx_tp
, subname
= "rt_rtx";
1305 else if (i
== LABEL_REF
&& (aindex
== 1 || aindex
== 2))
1306 t
= rtx_tp
, subname
= "rt_rtx";
1307 else if (i
== NOTE
&& aindex
== 3)
1308 t
= note_union_tp
, subname
= "";
1309 else if (i
== NOTE
&& aindex
== 4)
1310 t
= scalar_tp
, subname
= "rt_int";
1311 else if (i
== NOTE
&& aindex
>= 6)
1312 t
= scalar_tp
, subname
= "rt_int";
1313 else if (i
== ADDR_DIFF_VEC
&& aindex
== 4)
1314 t
= scalar_tp
, subname
= "rt_int";
1315 else if (i
== VALUE
&& aindex
== 0)
1316 t
= scalar_tp
, subname
= "rt_int";
1317 else if (i
== DEBUG_EXPR
&& aindex
== 0)
1318 t
= tree_tp
, subname
= "rt_tree";
1319 else if (i
== REG
&& aindex
== 1)
1320 t
= reg_attrs_tp
, subname
= "rt_reg";
1321 else if (i
== SYMBOL_REF
&& aindex
== 1)
1322 t
= symbol_union_tp
, subname
= "";
1323 else if (i
== JUMP_TABLE_DATA
&& aindex
>= 4)
1324 t
= scalar_tp
, subname
= "rt_int";
1325 else if (i
== BARRIER
&& aindex
>= 2)
1326 t
= scalar_tp
, subname
= "rt_int";
1327 else if (i
== ENTRY_VALUE
&& aindex
== 0)
1328 t
= rtx_tp
, subname
= "rt_rtx";
1333 "rtx type `%s' has `0' in position %lu, can't handle",
1334 rtx_name
[i
], (unsigned long) aindex
);
1356 subname
= "rt_rtvec";
1361 subname
= "rt_tree";
1372 "rtx type `%s' has `%c' in position %lu, can't handle",
1373 rtx_name
[i
], rtx_format
[i
][aindex
],
1374 (unsigned long) aindex
);
1380 subfields
= create_field (subfields
, t
,
1381 xasprintf (".fld[%lu].%s",
1382 (unsigned long) aindex
,
1384 subfields
->opt
= nodot
;
1385 if (t
== note_union_tp
)
1387 create_string_option (subfields
->opt
, "desc",
1389 if (t
== symbol_union_tp
)
1391 create_string_option (subfields
->opt
, "desc",
1392 "CONSTANT_POOL_ADDRESS_P (&%0)");
1395 if (i
== SYMBOL_REF
)
1397 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P
1399 type_p field_tp
= find_structure ("block_symbol", TYPE_STRUCT
);
1401 = create_optional_field (subfields
, field_tp
, "block_sym",
1402 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1405 sname
= xasprintf ("rtx_def_%s", rtx_name
[i
]);
1406 substruct
= new_structure (sname
, TYPE_STRUCT
, &lexer_line
, subfields
,
1409 ftag
= xstrdup (rtx_name
[i
]);
1410 for (nmindex
= 0; nmindex
< strlen (ftag
); nmindex
++)
1411 ftag
[nmindex
] = TOUPPER (ftag
[nmindex
]);
1412 flds
= create_field (flds
, substruct
, "");
1413 flds
->opt
= create_string_option (nodot
, "tag", ftag
);
1415 return new_structure ("rtx_def_subunion", TYPE_UNION
, &lexer_line
, flds
,
1419 /* Handle `special("tree_exp")'. This is a special case for
1420 field `operands' of struct tree_exp, which although it claims to contain
1421 pointers to trees, actually sometimes contains pointers to RTL too.
1422 Passed T, the old type of the field, and OPT its options. Returns
1423 a new type for the field. */
1426 adjust_field_tree_exp (type_p t
, options_p opt ATTRIBUTE_UNUSED
)
1431 if (t
->kind
!= TYPE_ARRAY
)
1433 error_at_line (&lexer_line
,
1434 "special `tree_exp' must be applied to an array");
1435 return &string_type
;
1438 nodot
= create_string_option (NULL
, "dot", "");
1440 flds
= create_field (NULL
, t
, "");
1441 flds
->opt
= create_string_option (nodot
, "length",
1442 "TREE_OPERAND_LENGTH ((tree) &%0)");
1443 flds
->opt
= create_string_option (flds
->opt
, "default", "");
1445 return new_structure ("tree_exp_subunion", TYPE_UNION
, &lexer_line
, flds
,
1449 /* Perform any special processing on a type T, about to become the type
1450 of a field. Return the appropriate type for the field.
1452 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1453 - Similarly for arrays of pointer-to-char;
1454 - Converts structures for which a parameter is provided to
1456 - Handles "special" options.
1460 adjust_field_type (type_p t
, options_p opt
)
1463 const int pointer_p
= t
->kind
== TYPE_POINTER
;
1464 type_p params
[NUM_PARAM
];
1468 for (i
= 0; i
< NUM_PARAM
; i
++)
1471 for (; opt
; opt
= opt
->next
)
1472 if (strcmp (opt
->name
, "length") == 0)
1475 error_at_line (&lexer_line
, "duplicate `%s' option", opt
->name
);
1476 if (t
->u
.p
->kind
== TYPE_SCALAR
|| t
->u
.p
->kind
== TYPE_STRING
)
1478 error_at_line (&lexer_line
,
1479 "option `%s' may not be applied to "
1480 "arrays of atomic types", opt
->name
);
1484 else if ((strcmp (opt
->name
, "param_is") == 0
1485 || (strncmp (opt
->name
, "param", 5) == 0
1486 && ISDIGIT (opt
->name
[5])
1487 && strcmp (opt
->name
+ 6, "_is") == 0))
1488 && opt
->kind
== OPTION_TYPE
)
1490 int num
= ISDIGIT (opt
->name
[5]) ? opt
->name
[5] - '0' : 0;
1492 if (!union_or_struct_p (t
)
1493 && (t
->kind
!= TYPE_POINTER
|| !union_or_struct_p (t
->u
.p
)))
1495 error_at_line (&lexer_line
,
1496 "option `%s' may only be applied to structures or structure pointers",
1502 if (params
[num
] != NULL
)
1503 error_at_line (&lexer_line
, "duplicate `%s' option", opt
->name
);
1504 if (!ISDIGIT (opt
->name
[5]))
1505 params
[num
] = create_pointer (opt
->info
.type
);
1507 params
[num
] = opt
->info
.type
;
1509 else if (strcmp (opt
->name
, "special") == 0
1510 && opt
->kind
== OPTION_STRING
)
1512 const char *special_name
= opt
->info
.string
;
1513 if (strcmp (special_name
, "tree_exp") == 0)
1514 t
= adjust_field_tree_exp (t
, opt
);
1515 else if (strcmp (special_name
, "rtx_def") == 0)
1516 t
= adjust_field_rtx_def (t
, opt
);
1518 error_at_line (&lexer_line
, "unknown special `%s'", special_name
);
1527 realt
= find_param_structure (t
, params
);
1528 t
= pointer_p
? create_pointer (realt
) : realt
;
1532 && pointer_p
&& t
->u
.p
->kind
== TYPE_SCALAR
&& t
->u
.p
->u
.scalar_is_char
)
1533 return &string_type
;
1534 if (t
->kind
== TYPE_ARRAY
&& t
->u
.a
.p
->kind
== TYPE_POINTER
1535 && t
->u
.a
.p
->u
.p
->kind
== TYPE_SCALAR
1536 && t
->u
.a
.p
->u
.p
->u
.scalar_is_char
)
1537 return create_array (&string_type
, t
->u
.a
.len
);
1543 static void set_gc_used_type (type_p
, enum gc_used_enum
, type_p
*,
1545 static void set_gc_used (pair_p
);
1547 /* Handle OPT for set_gc_used_type. */
1550 process_gc_options (options_p opt
, enum gc_used_enum level
, int *maybe_undef
,
1551 int *pass_param
, int *length
, int *skip
,
1555 for (o
= opt
; o
; o
= o
->next
)
1556 if (strcmp (o
->name
, "ptr_alias") == 0 && level
== GC_POINTED_TO
1557 && o
->kind
== OPTION_TYPE
)
1558 set_gc_used_type (o
->info
.type
,
1559 GC_POINTED_TO
, NULL
);
1560 else if (strcmp (o
->name
, "maybe_undef") == 0)
1562 else if (strcmp (o
->name
, "use_params") == 0)
1564 else if (strcmp (o
->name
, "length") == 0)
1566 else if (strcmp (o
->name
, "skip") == 0)
1568 else if (strcmp (o
->name
, "nested_ptr") == 0
1569 && o
->kind
== OPTION_NESTED
)
1570 *nested_ptr
= ((const struct nested_ptr_data
*) o
->info
.nested
)->type
;
1574 /* Set the gc_used field of T to LEVEL, and handle the types it references.
1576 If ALLOWED_UNDEFINED_TYPES is true, types of kind TYPE_UNDEFINED
1577 are set to GC_UNUSED. Otherwise, an error is emitted for
1578 TYPE_UNDEFINED types. This is used to support user-defined
1579 template types with non-type arguments.
1581 For instance, when we parse a template type with enum arguments
1582 (e.g. MyType<AnotherType, EnumValue>), the parser created two
1583 artificial fields for 'MyType', one for 'AnotherType', the other
1584 one for 'EnumValue'.
1586 At the time that we parse this type we don't know that 'EnumValue'
1587 is really an enum value, so the parser creates a TYPE_UNDEFINED
1588 type for it. Since 'EnumValue' is never resolved to a known
1589 structure, it will stay with TYPE_UNDEFINED.
1591 Since 'MyType' is a TYPE_USER_STRUCT, we can simply ignore
1592 'EnumValue'. Generating marking code for it would cause
1593 compilation failures since the marking routines assumes that
1594 'EnumValue' is a type. */
1597 set_gc_used_type (type_p t
, enum gc_used_enum level
, type_p param
[NUM_PARAM
],
1598 bool allow_undefined_types
)
1600 if (t
->gc_used
>= level
)
1609 case TYPE_USER_STRUCT
:
1614 bool allow_undefined_field_types
= (t
->kind
== TYPE_USER_STRUCT
);
1616 process_gc_options (t
->u
.s
.opt
, level
, &dummy
, &dummy
, &dummy
, &dummy
,
1619 if (t
->u
.s
.base_class
)
1620 set_gc_used_type (t
->u
.s
.base_class
, level
, param
,
1621 allow_undefined_types
);
1622 /* Anything pointing to a base class might actually be pointing
1624 for (type_p subclass
= t
->u
.s
.first_subclass
; subclass
;
1625 subclass
= subclass
->u
.s
.next_sibling_class
)
1626 set_gc_used_type (subclass
, level
, param
,
1627 allow_undefined_types
);
1629 FOR_ALL_INHERITED_FIELDS(t
, f
)
1631 int maybe_undef
= 0;
1635 type_p nested_ptr
= NULL
;
1636 process_gc_options (f
->opt
, level
, &maybe_undef
, &pass_param
,
1637 &length
, &skip
, &nested_ptr
);
1639 if (nested_ptr
&& f
->type
->kind
== TYPE_POINTER
)
1640 set_gc_used_type (nested_ptr
, GC_POINTED_TO
,
1641 pass_param
? param
: NULL
);
1642 else if (length
&& f
->type
->kind
== TYPE_POINTER
)
1643 set_gc_used_type (f
->type
->u
.p
, GC_USED
, NULL
);
1644 else if (maybe_undef
&& f
->type
->kind
== TYPE_POINTER
)
1645 set_gc_used_type (f
->type
->u
.p
, GC_MAYBE_POINTED_TO
, NULL
);
1646 else if (pass_param
&& f
->type
->kind
== TYPE_POINTER
&& param
)
1647 set_gc_used_type (find_param_structure (f
->type
->u
.p
, param
),
1648 GC_POINTED_TO
, NULL
);
1650 ; /* target type is not used through this field */
1652 set_gc_used_type (f
->type
, GC_USED
, pass_param
? param
: NULL
,
1653 allow_undefined_field_types
);
1658 case TYPE_UNDEFINED
:
1659 if (level
> GC_UNUSED
)
1661 if (!allow_undefined_types
)
1662 error_at_line (&t
->u
.s
.line
, "undefined type `%s'", t
->u
.s
.tag
);
1663 t
->gc_used
= GC_UNUSED
;
1668 set_gc_used_type (t
->u
.p
, GC_POINTED_TO
, NULL
);
1672 set_gc_used_type (t
->u
.a
.p
, GC_USED
, param
);
1675 case TYPE_LANG_STRUCT
:
1676 for (t
= t
->u
.s
.lang_struct
; t
; t
= t
->next
)
1677 set_gc_used_type (t
, level
, param
);
1680 case TYPE_PARAM_STRUCT
:
1683 for (i
= 0; i
< NUM_PARAM
; i
++)
1684 if (t
->u
.param_struct
.param
[i
] != 0)
1685 set_gc_used_type (t
->u
.param_struct
.param
[i
], GC_USED
, NULL
);
1687 if (t
->u
.param_struct
.stru
->gc_used
== GC_POINTED_TO
)
1688 level
= GC_POINTED_TO
;
1691 t
->u
.param_struct
.stru
->gc_used
= GC_UNUSED
;
1692 set_gc_used_type (t
->u
.param_struct
.stru
, level
,
1693 t
->u
.param_struct
.param
);
1701 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1704 set_gc_used (pair_p variables
)
1708 for (p
= variables
; p
; p
= p
->next
)
1710 set_gc_used_type (p
->type
, GC_USED
, NULL
);
1713 if (verbosity_level
>= 2)
1714 printf ("%s used %d GTY-ed variables\n", progname
, nbvars
);
1717 /* File mapping routines. For each input file, there is one output .c file
1718 (but some output files have many input files), and there is one .h file
1719 for the whole build. */
1721 /* Output file handling. */
1723 /* Create and return an outf_p for a new file for NAME, to be called
1727 create_file (const char *name
, const char *oname
)
1729 static const char *const hdr
[] = {
1730 " Copyright (C) 2004-2014 Free Software Foundation, Inc.\n",
1732 "This file is part of GCC.\n",
1734 "GCC is free software; you can redistribute it and/or modify it under\n",
1735 "the terms of the GNU General Public License as published by the Free\n",
1736 "Software Foundation; either version 3, or (at your option) any later\n",
1739 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1740 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1741 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1742 "for more details.\n",
1744 "You should have received a copy of the GNU General Public License\n",
1745 "along with GCC; see the file COPYING3. If not see\n",
1746 "<http://www.gnu.org/licenses/>. */\n",
1748 "/* This file is machine generated. Do not edit. */\n"
1753 gcc_assert (name
!= NULL
);
1754 gcc_assert (oname
!= NULL
);
1755 f
= XCNEW (struct outf
);
1756 f
->next
= output_files
;
1760 oprintf (f
, "/* Type information for %s.\n", name
);
1761 for (i
= 0; i
< ARRAY_SIZE (hdr
); i
++)
1762 oprintf (f
, "%s", hdr
[i
]);
1766 /* Print, like fprintf, to O.
1767 N.B. You might think this could be implemented more efficiently
1768 with vsnprintf(). Unfortunately, there are C libraries that
1769 provide that function but without the C99 semantics for its return
1770 value, making it impossible to know how much space is required. */
1772 oprintf (outf_p o
, const char *format
, ...)
1778 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1783 va_start (ap
, format
);
1784 slength
= vasprintf (&s
, format
, ap
);
1785 if (s
== NULL
|| (int) slength
< 0)
1786 fatal ("out of memory");
1789 if (o
->bufused
+ slength
> o
->buflength
)
1791 size_t new_len
= o
->buflength
;
1798 while (o
->bufused
+ slength
>= new_len
);
1799 o
->buf
= XRESIZEVEC (char, o
->buf
, new_len
);
1800 o
->buflength
= new_len
;
1802 memcpy (o
->buf
+ o
->bufused
, s
, slength
);
1803 o
->bufused
+= slength
;
1807 /* Open the global header file and the language-specific header files. */
1810 open_base_files (void)
1814 if (nb_plugin_files
> 0 && plugin_files
)
1817 header_file
= create_file ("GCC", "gtype-desc.h");
1819 base_files
= XNEWVEC (outf_p
, num_lang_dirs
);
1821 for (i
= 0; i
< num_lang_dirs
; i
++)
1822 base_files
[i
] = create_file (lang_dir_names
[i
],
1823 xasprintf ("gtype-%s.h", lang_dir_names
[i
]));
1825 /* gtype-desc.c is a little special, so we create it here. */
1827 /* The order of files here matters very much. */
1828 static const char *const ifiles
[] = {
1829 "config.h", "system.h", "coretypes.h", "tm.h",
1830 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1831 "tree.h", "rtl.h", "wide-int.h", "function.h", "insn-config.h", "expr.h",
1832 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1833 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1834 "hash-table.h", "vec.h", "ggc.h", "basic-block.h",
1835 "tree-ssa-alias.h", "internal-fn.h", "gimple-fold.h", "tree-eh.h",
1836 "gimple-expr.h", "is-a.h",
1837 "gimple.h", "gimple-iterator.h", "gimple-ssa.h", "tree-cfg.h",
1838 "tree-phinodes.h", "ssa-iterators.h", "stringpool.h", "tree-ssanames.h",
1839 "tree-ssa-loop.h", "tree-ssa-loop-ivopts.h", "tree-ssa-loop-manip.h",
1840 "tree-ssa-loop-niter.h", "tree-into-ssa.h", "tree-dfa.h",
1841 "tree-ssa.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1842 "except.h", "output.h", "cfgloop.h",
1843 "target.h", "ipa-prop.h", "lto-streamer.h", "target-globals.h",
1844 "ipa-inline.h", "dwarf2out.h", NULL
1846 const char *const *ifp
;
1847 outf_p gtype_desc_c
;
1849 gtype_desc_c
= create_file ("GCC", "gtype-desc.c");
1850 for (ifp
= ifiles
; *ifp
; ifp
++)
1851 oprintf (gtype_desc_c
, "#include \"%s\"\n", *ifp
);
1853 /* Make sure we handle "cfun" specially. */
1854 oprintf (gtype_desc_c
, "\n/* See definition in function.h. */\n");
1855 oprintf (gtype_desc_c
, "#undef cfun\n");
1857 oprintf (gtype_desc_c
,
1859 "/* Types with a \"gcc::\" namespace have it stripped\n"
1860 " during gengtype parsing. Provide a \"using\" directive\n"
1861 " to ensure that the fully-qualified types are found. */\n"
1862 "using namespace gcc;\n");
1866 /* For INPF an input file, return the real basename of INPF, with all
1867 the directory components skipped. */
1870 get_file_realbasename (const input_file
*inpf
)
1872 return lbasename (get_input_file_name (inpf
));
1875 /* For INPF a filename, return the relative path to INPF from
1876 $(srcdir) if the latter is a prefix in INPF, NULL otherwise. */
1879 get_file_srcdir_relative_path (const input_file
*inpf
)
1881 const char *f
= get_input_file_name (inpf
);
1882 if (strlen (f
) > srcdir_len
1883 && IS_DIR_SEPARATOR (f
[srcdir_len
])
1884 && strncmp (f
, srcdir
, srcdir_len
) == 0)
1885 return f
+ srcdir_len
+ 1;
1890 /* For INPF an input_file, return the relative path to INPF from
1891 $(srcdir) if the latter is a prefix in INPF, or the real basename
1892 of INPF otherwise. */
1895 get_file_basename (const input_file
*inpf
)
1897 const char *srcdir_path
= get_file_srcdir_relative_path (inpf
);
1899 return (srcdir_path
!= NULL
) ? srcdir_path
: get_file_realbasename (inpf
);
1902 /* For F a filename, return the lang_dir_names relative index of the language
1903 directory that is a prefix in F, if any, -1 otherwise. */
1906 get_prefix_langdir_index (const char *f
)
1908 size_t f_len
= strlen (f
);
1911 for (lang_index
= 0; lang_index
< num_lang_dirs
; lang_index
++)
1913 const char *langdir
= lang_dir_names
[lang_index
];
1914 size_t langdir_len
= strlen (langdir
);
1916 if (f_len
> langdir_len
1917 && IS_DIR_SEPARATOR (f
[langdir_len
])
1918 && memcmp (f
, langdir
, langdir_len
) == 0)
1925 /* For INPF an input file, return the name of language directory where
1926 F is located, if any, NULL otherwise. */
1929 get_file_langdir (const input_file
*inpf
)
1931 /* Get the relative path to INPF from $(srcdir) and find the
1932 language by comparing the prefix with language directory names.
1933 If INPF is not even srcdir relative, no point in looking
1937 const char *srcdir_relative_path
= get_file_srcdir_relative_path (inpf
);
1940 if (!srcdir_relative_path
)
1943 lang_index
= get_prefix_langdir_index (srcdir_relative_path
);
1944 if (lang_index
< 0 && strncmp (srcdir_relative_path
, "c-family", 8) == 0)
1946 else if (lang_index
>= 0)
1947 r
= lang_dir_names
[lang_index
];
1954 /* The gt- output file name for INPF. */
1957 get_file_gtfilename (const input_file
*inpf
)
1959 /* Cook up an initial version of the gt- file name from the file real
1960 basename and the language name, if any. */
1962 const char *basename
= get_file_realbasename (inpf
);
1963 const char *langdir
= get_file_langdir (inpf
);
1966 (langdir
? xasprintf ("gt-%s-%s", langdir
, basename
)
1967 : xasprintf ("gt-%s", basename
));
1969 /* Then replace all non alphanumerics characters by '-' and change the
1970 extension to ".h". We expect the input filename extension was at least
1971 one character long. */
1975 for (; *s
!= '.'; s
++)
1976 if (!ISALNUM (*s
) && *s
!= '-')
1979 memcpy (s
, ".h", sizeof (".h"));
1984 /* Each input_file has its associated output file outf_p. The
1985 association is computed by the function
1986 get_output_file_with_visibility. The associated file is cached
1987 inside input_file in its inpoutf field, so is really computed only
1988 once. Associated output file paths (i.e. output_name-s) are
1989 computed by a rule based regexp machinery, using the files_rules
1990 array of struct file_rule_st. A for_name is also computed, giving
1991 the source file name for which the output_file is generated; it is
1992 often the last component of the input_file path. */
1996 Regexpr machinery to compute the output_name and for_name-s of each
1997 input_file. We have a sequence of file rules which gives the POSIX
1998 extended regular expression to match an input file path, and two
1999 transformed strings for the corresponding output_name and the
2000 corresponding for_name. The transformed string contain dollars: $0
2001 is replaced by the entire match, $1 is replaced by the substring
2002 matching the first parenthesis in the regexp, etc. And $$ is replaced
2003 by a single verbatim dollar. The rule order is important. The
2004 general case is last, and the particular cases should come before.
2005 An action routine can, when needed, update the out_name & for_name
2006 and/or return the appropriate output file. It is invoked only when a
2007 rule is triggered. When a rule is triggered, the output_name and
2008 for_name are computed using their transform string in while $$, $0,
2009 $1, ... are suitably replaced. If there is an action, it is called.
2010 In some few cases, the action can directly return the outf_p, but
2011 usually it just updates the output_name and for_name so should free
2012 them before replacing them. The get_output_file_with_visibility
2013 function creates an outf_p only once per each output_name, so it
2014 scans the output_files list for previously seen output file names.
2017 /* Signature of actions in file rules. */
2018 typedef outf_p (frul_actionrout_t
) (input_file
*, char**, char**);
2021 struct file_rule_st
{
2022 const char* frul_srcexpr
; /* Source string for regexp. */
2023 int frul_rflags
; /* Flags passed to regcomp, usually
2025 regex_t
* frul_re
; /* Compiled regular expression
2026 obtained by regcomp. */
2027 const char* frul_tr_out
; /* Transformation string for making
2028 * the output_name, with $1 ... $9 for
2029 * subpatterns and $0 for the whole
2030 * matched filename. */
2031 const char* frul_tr_for
; /* Tranformation string for making the
2033 frul_actionrout_t
* frul_action
; /* The action, if non null, is
2034 * called once the rule matches, on
2035 * the transformed out_name &
2036 * for_name. It could change them
2037 * and/or give the output file. */
2040 /* File rule action handling *.h files. */
2041 static outf_p
header_dot_h_frul (input_file
*, char**, char**);
2043 /* File rule action handling *.c files. */
2044 static outf_p
source_dot_c_frul (input_file
*, char**, char**);
2046 #define NULL_REGEX (regex_t*)0
2048 /* The prefix in our regexp-s matching the directory. */
2049 #define DIR_PREFIX_REGEX "^(([^/]*/)*)"
2051 #define NULL_FRULACT (frul_actionrout_t*)0
2053 /* The array of our rules governing file name generation. Rules order
2054 matters, so change with extreme care! */
2056 struct file_rule_st files_rules
[] = {
2057 /* The general rule assumes that files in subdirectories belong to a
2058 particular front-end, and files not in subdirectories are shared.
2059 The following rules deal with exceptions - files that are in
2060 subdirectories and yet are shared, and files that are top-level,
2061 but are not shared. */
2063 /* the c-family/ source directory is special. */
2064 { DIR_PREFIX_REGEX
"c-family/([[:alnum:]_-]*)\\.c$",
2065 REG_EXTENDED
, NULL_REGEX
,
2066 "gt-c-family-$3.h", "c-family/$3.c", NULL_FRULACT
},
2068 { DIR_PREFIX_REGEX
"c-family/([[:alnum:]_-]*)\\.h$",
2069 REG_EXTENDED
, NULL_REGEX
,
2070 "gt-c-family-$3.h", "c-family/$3.h", NULL_FRULACT
},
2072 /* Both c-lang.h & c-tree.h gives gt-c-c-decl.h for c-decl.c ! */
2073 { DIR_PREFIX_REGEX
"c/c-lang\\.h$",
2074 REG_EXTENDED
, NULL_REGEX
, "gt-c-c-decl.h", "c/c-decl.c", NULL_FRULACT
},
2076 { DIR_PREFIX_REGEX
"c/c-tree\\.h$",
2077 REG_EXTENDED
, NULL_REGEX
, "gt-c-c-decl.h", "c/c-decl.c", NULL_FRULACT
},
2079 /* cp/cp-tree.h gives gt-cp-tree.h for cp/tree.c ! */
2080 { DIR_PREFIX_REGEX
"cp/cp-tree\\.h$",
2081 REG_EXTENDED
, NULL_REGEX
,
2082 "gt-cp-tree.h", "cp/tree.c", NULL_FRULACT
},
2084 /* cp/decl.h & cp/decl.c gives gt-cp-decl.h for cp/decl.c ! */
2085 { DIR_PREFIX_REGEX
"cp/decl\\.[ch]$",
2086 REG_EXTENDED
, NULL_REGEX
,
2087 "gt-cp-decl.h", "cp/decl.c", NULL_FRULACT
},
2089 /* cp/name-lookup.h gives gt-cp-name-lookup.h for cp/name-lookup.c ! */
2090 { DIR_PREFIX_REGEX
"cp/name-lookup\\.h$",
2091 REG_EXTENDED
, NULL_REGEX
,
2092 "gt-cp-name-lookup.h", "cp/name-lookup.c", NULL_FRULACT
},
2094 /* cp/parser.h gives gt-cp-parser.h for cp/parser.c ! */
2095 { DIR_PREFIX_REGEX
"cp/parser\\.h$",
2096 REG_EXTENDED
, NULL_REGEX
,
2097 "gt-cp-parser.h", "cp/parser.c", NULL_FRULACT
},
2099 /* objc/objc-act.h gives gt-objc-objc-act.h for objc/objc-act.c ! */
2100 { DIR_PREFIX_REGEX
"objc/objc-act\\.h$",
2101 REG_EXTENDED
, NULL_REGEX
,
2102 "gt-objc-objc-act.h", "objc/objc-act.c", NULL_FRULACT
},
2104 /* objc/objc-map.h gives gt-objc-objc-map.h for objc/objc-map.c ! */
2105 { DIR_PREFIX_REGEX
"objc/objc-map\\.h$",
2106 REG_EXTENDED
, NULL_REGEX
,
2107 "gt-objc-objc-map.h", "objc/objc-map.c", NULL_FRULACT
},
2109 /* General cases. For header *.h and source *.c or *.cc files, we
2110 * need special actions to handle the language. */
2112 /* Source *.c files are using get_file_gtfilename to compute their
2113 output_name and get_file_basename to compute their for_name
2114 through the source_dot_c_frul action. */
2115 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.c$",
2116 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.c", source_dot_c_frul
},
2118 /* Source *.cc files are using get_file_gtfilename to compute their
2119 output_name and get_file_basename to compute their for_name
2120 through the source_dot_c_frul action. */
2121 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.cc$",
2122 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.cc", source_dot_c_frul
},
2124 /* Common header files get "gtype-desc.c" as their output_name,
2125 * while language specific header files are handled specially. So
2126 * we need the header_dot_h_frul action. */
2127 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.h$",
2128 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.h", header_dot_h_frul
},
2130 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.in$",
2131 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.in", NULL_FRULACT
},
2133 /* Mandatory null last entry signaling end of rules. */
2134 {NULL
, 0, NULL_REGEX
, NULL
, NULL
, NULL_FRULACT
}
2137 /* Special file rules action for handling *.h header files. It gives
2138 "gtype-desc.c" for common headers and corresponding output
2139 files for language-specific header files. */
2141 header_dot_h_frul (input_file
* inpf
, char**poutname
,
2142 char**pforname ATTRIBUTE_UNUSED
)
2144 const char *basename
= 0;
2146 DBGPRINTF ("inpf %p inpname %s outname %s forname %s",
2147 (void*) inpf
, get_input_file_name (inpf
),
2148 *poutname
, *pforname
);
2149 basename
= get_file_basename (inpf
);
2150 lang_index
= get_prefix_langdir_index (basename
);
2151 DBGPRINTF ("basename %s lang_index %d", basename
, lang_index
);
2153 if (lang_index
>= 0)
2155 /* The header is language specific. Given output_name &
2156 for_name remains unchanged. The base_files array gives the
2158 DBGPRINTF ("header_dot_h found language specific @ %p '%s'",
2159 (void*) base_files
[lang_index
],
2160 (base_files
[lang_index
])->name
);
2161 return base_files
[lang_index
];
2165 /* The header is common to all front-end languages. So
2166 output_name is "gtype-desc.c" file. The calling function
2167 get_output_file_with_visibility will find its outf_p. */
2169 *poutname
= xstrdup ("gtype-desc.c");
2170 DBGPRINTF ("special 'gtype-desc.c' for inpname %s",
2171 get_input_file_name (inpf
));
2177 /* Special file rules action for handling *.c source files using
2178 * get_file_gtfilename to compute their output_name and
2179 * get_file_basename to compute their for_name. The output_name is
2180 * gt-<LANG>-<BASE>.h for language specific source files, and
2181 * gt-<BASE>.h for common source files. */
2183 source_dot_c_frul (input_file
* inpf
, char**poutname
, char**pforname
)
2185 char *newbasename
= CONST_CAST (char*, get_file_basename (inpf
));
2186 char *newoutname
= CONST_CAST (char*, get_file_gtfilename (inpf
));
2187 DBGPRINTF ("inpf %p inpname %s original outname %s forname %s",
2188 (void*) inpf
, get_input_file_name (inpf
),
2189 *poutname
, *pforname
);
2190 DBGPRINTF ("newoutname %s", newoutname
);
2191 DBGPRINTF ("newbasename %s", newbasename
);
2194 *poutname
= newoutname
;
2195 *pforname
= newbasename
;
2199 /* Utility function for get_output_file_with_visibility which returns
2200 * a malloc-ed substituted string using TRS on matching of the FILNAM
2201 * file name, using the PMATCH array. */
2203 matching_file_name_substitute (const char *filnam
, regmatch_t pmatch
[10],
2206 struct obstack str_obstack
;
2208 char *rawstr
= NULL
;
2209 const char *pt
= NULL
;
2210 DBGPRINTF ("filnam %s", filnam
);
2211 obstack_init (&str_obstack
);
2212 for (pt
= trs
; *pt
; pt
++) {
2218 /* A double dollar $$ is substituted by a single verbatim
2219 dollar, but who really uses dollar signs in file
2221 obstack_1grow (&str_obstack
, '$');
2223 else if (ISDIGIT (pt
[1]))
2225 /* Handle $0 $1 ... $9 by appropriate substitution. */
2226 int dolnum
= pt
[1] - '0';
2227 int so
= pmatch
[dolnum
].rm_so
;
2228 int eo
= pmatch
[dolnum
].rm_eo
;
2229 DBGPRINTF ("so=%d eo=%d dolnum=%d", so
, eo
, dolnum
);
2230 if (so
>=0 && eo
>=so
)
2231 obstack_grow (&str_obstack
, filnam
+ so
, eo
- so
);
2235 /* This can happen only when files_rules is buggy! */
2238 /* Always skip the character after the dollar. */
2242 obstack_1grow (&str_obstack
, c
);
2244 obstack_1grow (&str_obstack
, '\0');
2245 rawstr
= XOBFINISH (&str_obstack
, char *);
2246 str
= xstrdup (rawstr
);
2247 obstack_free (&str_obstack
, NULL
);
2248 DBGPRINTF ("matched replacement %s", str
);
2254 /* An output file, suitable for definitions, that can see declarations
2255 made in INPF and is linked into every language that uses INPF.
2256 Since the result is cached inside INPF, that argument cannot be
2257 declared constant, but is "almost" constant. */
2260 get_output_file_with_visibility (input_file
*inpf
)
2263 char *for_name
= NULL
;
2264 char *output_name
= NULL
;
2265 const char* inpfname
;
2267 /* This can happen when we need a file with visibility on a
2268 structure that we've never seen. We have to just hope that it's
2269 globally visible. */
2271 inpf
= system_h_file
;
2273 /* The result is cached in INPF, so return it if already known. */
2275 return inpf
->inpoutf
;
2277 /* In plugin mode, return NULL unless the input_file is one of the
2282 for (i
= 0; i
< nb_plugin_files
; i
++)
2283 if (inpf
== plugin_files
[i
])
2285 inpf
->inpoutf
= plugin_output
;
2286 return plugin_output
;
2292 inpfname
= get_input_file_name (inpf
);
2294 /* Try each rule in sequence in files_rules until one is triggered. */
2297 DBGPRINTF ("passing input file @ %p named %s through the files_rules",
2298 (void*) inpf
, inpfname
);
2300 for (; files_rules
[rulix
].frul_srcexpr
!= NULL
; rulix
++)
2302 DBGPRINTF ("rulix#%d srcexpr %s",
2303 rulix
, files_rules
[rulix
].frul_srcexpr
);
2305 if (!files_rules
[rulix
].frul_re
)
2307 /* Compile the regexpr lazily. */
2309 files_rules
[rulix
].frul_re
= XCNEW (regex_t
);
2310 err
= regcomp (files_rules
[rulix
].frul_re
,
2311 files_rules
[rulix
].frul_srcexpr
,
2312 files_rules
[rulix
].frul_rflags
);
2315 /* The regular expression compilation fails only when
2316 file_rules is buggy. */
2324 /* Match the regexpr and trigger the rule if matched. */
2326 /* We have exactly ten pmatch-s, one for each $0, $1, $2,
2328 regmatch_t pmatch
[10];
2329 memset (pmatch
, 0, sizeof (pmatch
));
2330 if (!regexec (files_rules
[rulix
].frul_re
,
2331 inpfname
, 10, pmatch
, 0))
2333 DBGPRINTF ("input @ %p filename %s matched rulix#%d pattern %s",
2334 (void*) inpf
, inpfname
, rulix
,
2335 files_rules
[rulix
].frul_srcexpr
);
2337 matching_file_name_substitute (inpfname
, pmatch
,
2338 files_rules
[rulix
].frul_tr_for
);
2339 DBGPRINTF ("for_name %s", for_name
);
2341 matching_file_name_substitute (inpfname
, pmatch
,
2342 files_rules
[rulix
].frul_tr_out
);
2343 DBGPRINTF ("output_name %s", output_name
);
2344 if (files_rules
[rulix
].frul_action
)
2346 /* Invoke our action routine. */
2348 DBGPRINTF ("before action rulix#%d output_name %s for_name %s",
2349 rulix
, output_name
, for_name
);
2351 (files_rules
[rulix
].frul_action
) (inpf
,
2352 &output_name
, &for_name
);
2353 DBGPRINTF ("after action rulix#%d of=%p output_name %s for_name %s",
2354 rulix
, (void*)of
, output_name
, for_name
);
2355 /* If the action routine returned something, give it back
2356 immediately and cache it in inpf. */
2363 /* The rule matched, and had no action, or that action did
2364 not return any output file but could have changed the
2365 output_name or for_name. We break out of the loop on the
2371 /* The regexpr did not match. */
2372 DBGPRINTF ("rulix#%d did not match %s pattern %s",
2373 rulix
, inpfname
, files_rules
[rulix
].frul_srcexpr
);
2379 if (!output_name
|| !for_name
)
2381 /* This should not be possible, and could only happen if the
2382 files_rules is incomplete or buggy. */
2383 fatal ("failed to compute output name for %s", inpfname
);
2386 /* Look through to see if we've ever seen this output filename
2387 before. If found, cache the result in inpf. */
2388 for (r
= output_files
; r
; r
= r
->next
)
2389 if (filename_cmp (r
->name
, output_name
) == 0)
2392 DBGPRINTF ("found r @ %p for output_name %s for_name %s", (void*)r
,
2393 output_name
, for_name
);
2397 /* If not found, create it, and cache it in inpf. */
2398 r
= create_file (for_name
, output_name
);
2400 gcc_assert (r
&& r
->name
);
2401 DBGPRINTF ("created r @ %p for output_name %s for_name %s", (void*) r
,
2402 output_name
, for_name
);
2409 /* The name of an output file, suitable for definitions, that can see
2410 declarations made in INPF and is linked into every language that
2414 get_output_file_name (input_file
* inpf
)
2416 outf_p o
= get_output_file_with_visibility (inpf
);
2422 /* Check if existing file is equal to the in memory buffer. */
2425 is_file_equal (outf_p of
)
2427 FILE *newfile
= fopen (of
->name
, "r");
2430 if (newfile
== NULL
)
2434 for (i
= 0; i
< of
->bufused
; i
++)
2437 ch
= fgetc (newfile
);
2438 if (ch
== EOF
|| ch
!= (unsigned char) of
->buf
[i
])
2444 if (equal
&& EOF
!= fgetc (newfile
))
2450 /* Copy the output to its final destination,
2451 but don't unnecessarily change modification times. */
2454 close_output_files (void)
2456 int nbwrittenfiles
= 0;
2459 for (of
= output_files
; of
; of
= of
->next
)
2461 if (!is_file_equal (of
))
2463 FILE *newfile
= NULL
;
2464 char *backupname
= NULL
;
2465 /* Back up the old version of the output file gt-FOO.c as
2466 BACKUPDIR/gt-FOO.c~ if we have a backup directory. */
2469 backupname
= concat (backup_dir
, "/",
2470 lbasename (of
->name
), "~", NULL
);
2471 if (!access (of
->name
, F_OK
) && rename (of
->name
, backupname
))
2472 fatal ("failed to back up %s as %s: %s",
2473 of
->name
, backupname
, xstrerror (errno
));
2476 newfile
= fopen (of
->name
, "w");
2477 if (newfile
== NULL
)
2478 fatal ("opening output file %s: %s", of
->name
, xstrerror (errno
));
2479 if (fwrite (of
->buf
, 1, of
->bufused
, newfile
) != of
->bufused
)
2480 fatal ("writing output file %s: %s", of
->name
, xstrerror (errno
));
2481 if (fclose (newfile
) != 0)
2482 fatal ("closing output file %s: %s", of
->name
, xstrerror (errno
));
2484 if (verbosity_level
>= 2 && backupname
)
2485 printf ("%s wrote #%-3d %s backed-up in %s\n",
2486 progname
, nbwrittenfiles
, of
->name
, backupname
);
2487 else if (verbosity_level
>= 1)
2488 printf ("%s write #%-3d %s\n", progname
, nbwrittenfiles
, of
->name
);
2493 /* output file remains unchanged. */
2494 if (verbosity_level
>= 2)
2495 printf ("%s keep %s\n", progname
, of
->name
);
2499 of
->bufused
= of
->buflength
= 0;
2501 if (verbosity_level
>= 1)
2502 printf ("%s wrote %d files.\n", progname
, nbwrittenfiles
);
2509 const input_file
* file
;
2513 struct walk_type_data
;
2515 /* For scalars and strings, given the item in 'val'.
2516 For structures, given a pointer to the item in 'val'.
2517 For misc. pointers, given the item in 'val'.
2519 typedef void (*process_field_fn
) (type_p f
, const struct walk_type_data
* p
);
2520 typedef void (*func_name_fn
) (type_p s
, const struct walk_type_data
* p
);
2522 /* Parameters for write_types. */
2524 struct write_types_data
2527 const char *param_prefix
;
2528 const char *subfield_marker_routine
;
2529 const char *marker_routine
;
2530 const char *reorder_note_routine
;
2531 const char *comment
;
2532 int skip_hooks
; /* skip hook generation if non zero */
2533 enum write_types_kinds kind
;
2536 static void output_escaped_param (struct walk_type_data
*d
,
2537 const char *, const char *);
2538 static void output_mangled_typename (outf_p
, const_type_p
);
2539 static void walk_type (type_p t
, struct walk_type_data
*d
);
2540 static void write_func_for_structure (type_p orig_s
, type_p s
, type_p
*param
,
2541 const struct write_types_data
*wtd
);
2542 static void write_types_process_field
2543 (type_p f
, const struct walk_type_data
*d
);
2544 static void write_types (outf_p output_header
,
2546 type_p param_structs
,
2547 const struct write_types_data
*wtd
);
2548 static void write_types_local_process_field
2549 (type_p f
, const struct walk_type_data
*d
);
2550 static void write_local_func_for_structure
2551 (const_type_p orig_s
, type_p s
, type_p
*param
);
2552 static void write_local (outf_p output_header
,
2553 type_p structures
, type_p param_structs
);
2554 static int contains_scalar_p (type_p t
);
2555 static void put_mangled_filename (outf_p
, const input_file
*);
2556 static void finish_root_table (struct flist
*flp
, const char *pfx
,
2557 const char *tname
, const char *lastname
,
2559 static void write_root (outf_p
, pair_p
, type_p
, const char *, int,
2560 struct fileloc
*, const char *, bool);
2561 static void write_array (outf_p f
, pair_p v
,
2562 const struct write_types_data
*wtd
);
2563 static void write_roots (pair_p
, bool);
2565 /* Parameters for walk_type. */
2567 struct walk_type_data
2569 process_field_fn process_field
;
2574 const char *prev_val
[4];
2577 const struct fileloc
*line
;
2582 const char *reorder_fn
;
2584 bool fn_wants_lvalue
;
2592 /* Given a string TYPE_NAME, representing a C++ typename, return a valid
2593 pre-processor identifier to use in a #define directive. This replaces
2594 special characters used in C++ identifiers like '>', '<' and ':' with
2597 If no C++ special characters are found in TYPE_NAME, return
2598 TYPE_NAME. Otherwise, return a copy of TYPE_NAME with the special
2599 characters replaced with '_'. In this case, the caller is
2600 responsible for freeing the allocated string. */
2603 filter_type_name (const char *type_name
)
2605 if (strchr (type_name
, '<') || strchr (type_name
, ':'))
2608 char *s
= xstrdup (type_name
);
2609 for (i
= 0; i
< strlen (s
); i
++)
2610 if (s
[i
] == '<' || s
[i
] == '>' || s
[i
] == ':' || s
[i
] == ','
2620 /* Print a mangled name representing T to OF. */
2623 output_mangled_typename (outf_p of
, const_type_p t
)
2631 case TYPE_UNDEFINED
:
2636 output_mangled_typename (of
, t
->u
.p
);
2646 case TYPE_LANG_STRUCT
:
2647 case TYPE_USER_STRUCT
:
2649 /* For references to classes within an inheritance hierarchy,
2650 only ever reference the ultimate base class, since only
2651 it will have gt_ functions. */
2652 t
= get_ultimate_base_class (t
);
2653 const char *id_for_tag
= filter_type_name (t
->u
.s
.tag
);
2654 oprintf (of
, "%lu%s", (unsigned long) strlen (id_for_tag
),
2656 if (id_for_tag
!= t
->u
.s
.tag
)
2657 free (CONST_CAST (char *, id_for_tag
));
2660 case TYPE_PARAM_STRUCT
:
2663 for (i
= 0; i
< NUM_PARAM
; i
++)
2664 if (t
->u
.param_struct
.param
[i
] != NULL
)
2665 output_mangled_typename (of
, t
->u
.param_struct
.param
[i
]);
2666 output_mangled_typename (of
, t
->u
.param_struct
.stru
);
2674 /* Print PARAM to D->OF processing escapes. D->VAL references the
2675 current object, D->PREV_VAL the object containing the current
2676 object, ONAME is the name of the option and D->LINE is used to
2677 print error messages. */
2680 output_escaped_param (struct walk_type_data
*d
, const char *param
,
2685 for (p
= param
; *p
; p
++)
2687 oprintf (d
->of
, "%c", *p
);
2692 oprintf (d
->of
, "(%s)", d
->prev_val
[2]);
2695 oprintf (d
->of
, "(%s)", d
->prev_val
[0]);
2698 oprintf (d
->of
, "(%s)", d
->prev_val
[1]);
2702 const char *pp
= d
->val
+ strlen (d
->val
);
2703 while (pp
[-1] == ']')
2706 oprintf (d
->of
, "%s", pp
);
2710 error_at_line (d
->line
, "`%s' option contains bad escape %c%c",
2716 get_string_option (options_p opt
, const char *key
)
2718 for (; opt
; opt
= opt
->next
)
2719 if (strcmp (opt
->name
, key
) == 0)
2720 return opt
->info
.string
;
2724 /* Machinery for avoiding duplicate tags within switch statements. */
2728 struct seen_tag
*next
;
2732 already_seen_tag (struct seen_tag
*seen_tags
, const char *tag
)
2734 /* Linear search, so O(n^2), but n is currently small. */
2737 if (!strcmp (seen_tags
->tag
, tag
))
2739 seen_tags
= seen_tags
->next
;
2741 /* Not yet seen this tag. */
2746 mark_tag_as_seen (struct seen_tag
**seen_tags
, const char *tag
)
2748 /* Add to front of linked list. */
2749 struct seen_tag
*new_node
= XCNEW (struct seen_tag
);
2750 new_node
->tag
= tag
;
2751 new_node
->next
= *seen_tags
;
2752 *seen_tags
= new_node
;
2756 walk_subclasses (type_p base
, struct walk_type_data
*d
,
2757 struct seen_tag
**seen_tags
)
2759 for (type_p sub
= base
->u
.s
.first_subclass
; sub
!= NULL
;
2760 sub
= sub
->u
.s
.next_sibling_class
)
2762 const char *type_tag
= get_string_option (sub
->u
.s
.opt
, "tag");
2763 if (type_tag
&& !already_seen_tag (*seen_tags
, type_tag
))
2765 mark_tag_as_seen (seen_tags
, type_tag
);
2766 oprintf (d
->of
, "%*scase %s:\n", d
->indent
, "", type_tag
);
2768 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2770 oprintf (d
->of
, "%*s%s *sub = static_cast <%s *> (x);\n",
2771 d
->indent
, "", sub
->u
.s
.tag
, sub
->u
.s
.tag
);
2772 const char *old_val
= d
->val
;
2777 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2778 oprintf (d
->of
, "%*sbreak;\n", d
->indent
, "");
2781 walk_subclasses (sub
, d
, seen_tags
);
2785 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2786 which is of type T. Write code to D->OF to constrain execution (at
2787 the point that D->PROCESS_FIELD is called) to the appropriate
2788 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2789 pointers to those objects. D->PREV_VAL lists the objects
2790 containing the current object, D->OPT is a list of options to
2791 apply, D->INDENT is the current indentation level, D->LINE is used
2792 to print error messages, D->BITMAP indicates which languages to
2793 print the structure for, and D->PARAM is the current parameter
2794 (from an enclosing param_is option). */
2797 walk_type (type_p t
, struct walk_type_data
*d
)
2799 const char *length
= NULL
;
2800 const char *desc
= NULL
;
2801 const char *type_tag
= NULL
;
2802 int maybe_undef_p
= 0;
2803 int use_param_num
= -1;
2804 int use_params_p
= 0;
2807 const struct nested_ptr_data
*nested_ptr_d
= NULL
;
2809 d
->needs_cast_p
= false;
2810 for (oo
= d
->opt
; oo
; oo
= oo
->next
)
2811 if (strcmp (oo
->name
, "length") == 0 && oo
->kind
== OPTION_STRING
)
2812 length
= oo
->info
.string
;
2813 else if (strcmp (oo
->name
, "maybe_undef") == 0)
2815 else if (strncmp (oo
->name
, "use_param", 9) == 0
2816 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
2817 use_param_num
= oo
->name
[9] == '\0' ? 0 : oo
->name
[9] - '0';
2818 else if (strcmp (oo
->name
, "use_params") == 0)
2820 else if (strcmp (oo
->name
, "desc") == 0 && oo
->kind
== OPTION_STRING
)
2821 desc
= oo
->info
.string
;
2822 else if (strcmp (oo
->name
, "mark_hook") == 0)
2824 else if (strcmp (oo
->name
, "nested_ptr") == 0
2825 && oo
->kind
== OPTION_NESTED
)
2826 nested_ptr_d
= (const struct nested_ptr_data
*) oo
->info
.nested
;
2827 else if (strcmp (oo
->name
, "dot") == 0)
2829 else if (strcmp (oo
->name
, "tag") == 0)
2830 type_tag
= oo
->info
.string
;
2831 else if (strcmp (oo
->name
, "special") == 0)
2833 else if (strcmp (oo
->name
, "skip") == 0)
2835 else if (strcmp (oo
->name
, "atomic") == 0)
2837 else if (strcmp (oo
->name
, "default") == 0)
2839 else if (strcmp (oo
->name
, "param_is") == 0)
2841 else if (strncmp (oo
->name
, "param", 5) == 0
2842 && ISDIGIT (oo
->name
[5]) && strcmp (oo
->name
+ 6, "_is") == 0)
2844 else if (strcmp (oo
->name
, "chain_next") == 0)
2846 else if (strcmp (oo
->name
, "chain_prev") == 0)
2848 else if (strcmp (oo
->name
, "chain_circular") == 0)
2850 else if (strcmp (oo
->name
, "reorder") == 0)
2852 else if (strcmp (oo
->name
, "variable_size") == 0)
2854 else if (strcmp (oo
->name
, "for_user") == 0)
2857 error_at_line (d
->line
, "unknown option `%s'\n", oo
->name
);
2864 int pointer_p
= t
->kind
== TYPE_POINTER
;
2868 if (!union_or_struct_p (t
))
2869 error_at_line (d
->line
, "`use_params' option on unimplemented type");
2871 t
= find_param_structure (t
, d
->param
);
2873 t
= create_pointer (t
);
2876 if (use_param_num
!= -1)
2878 if (d
->param
!= NULL
&& d
->param
[use_param_num
] != NULL
)
2880 type_p nt
= d
->param
[use_param_num
];
2882 if (t
->kind
== TYPE_ARRAY
)
2883 nt
= create_array (nt
, t
->u
.a
.len
);
2884 else if (length
!= NULL
&& t
->kind
== TYPE_POINTER
)
2885 nt
= create_pointer (nt
);
2886 d
->needs_cast_p
= (t
->kind
!= TYPE_POINTER
2887 && (nt
->kind
== TYPE_POINTER
2888 || nt
->kind
== TYPE_STRING
));
2892 error_at_line (d
->line
, "no parameter defined for `%s'", d
->val
);
2896 && (t
->kind
!= TYPE_POINTER
|| !union_or_struct_p (t
->u
.p
)))
2898 error_at_line (d
->line
,
2899 "field `%s' has invalid option `maybe_undef_p'\n",
2904 if (atomic_p
&& (t
->kind
!= TYPE_POINTER
) && (t
->kind
!= TYPE_STRING
))
2906 error_at_line (d
->line
, "field `%s' has invalid option `atomic'\n", d
->val
);
2914 d
->process_field (t
, d
);
2919 d
->in_ptr_field
= true;
2920 if (maybe_undef_p
&& t
->u
.p
->u
.s
.line
.file
== NULL
)
2922 oprintf (d
->of
, "%*sgcc_assert (!%s);\n", d
->indent
, "", d
->val
);
2926 /* If a pointer type is marked as "atomic", we process the
2927 field itself, but we don't walk the data that they point to.
2929 There are two main cases where we walk types: to mark
2930 pointers that are reachable, and to relocate pointers when
2931 writing a PCH file. In both cases, an atomic pointer is
2932 itself marked or relocated, but the memory that it points
2933 to is left untouched. In the case of PCH, that memory will
2934 be read/written unchanged to the PCH file. */
2937 oprintf (d
->of
, "%*sif (%s != NULL) {\n", d
->indent
, "", d
->val
);
2939 d
->process_field (t
, d
);
2941 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2947 if (!union_or_struct_p (t
->u
.p
)
2948 && t
->u
.p
->kind
!= TYPE_PARAM_STRUCT
)
2950 error_at_line (d
->line
,
2951 "field `%s' is pointer to unimplemented type",
2958 const char *oldprevval2
= d
->prev_val
[2];
2960 if (!union_or_struct_p (nested_ptr_d
->type
))
2962 error_at_line (d
->line
,
2963 "field `%s' has invalid "
2964 "option `nested_ptr'\n", d
->val
);
2968 d
->prev_val
[2] = d
->val
;
2969 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2971 d
->val
= xasprintf ("x%d", d
->counter
++);
2972 oprintf (d
->of
, "%*s%s %s * %s%s =\n", d
->indent
, "",
2973 (nested_ptr_d
->type
->kind
== TYPE_UNION
2974 ? "union" : "struct"),
2975 nested_ptr_d
->type
->u
.s
.tag
,
2976 d
->fn_wants_lvalue
? "" : "const ", d
->val
);
2977 oprintf (d
->of
, "%*s", d
->indent
+ 2, "");
2978 output_escaped_param (d
, nested_ptr_d
->convert_from
,
2980 oprintf (d
->of
, ";\n");
2982 d
->process_field (nested_ptr_d
->type
, d
);
2984 if (d
->fn_wants_lvalue
)
2986 oprintf (d
->of
, "%*s%s = ", d
->indent
, "",
2988 d
->prev_val
[2] = d
->val
;
2989 output_escaped_param (d
, nested_ptr_d
->convert_to
,
2991 oprintf (d
->of
, ";\n");
2995 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2996 d
->val
= d
->prev_val
[2];
2997 d
->prev_val
[2] = oldprevval2
;
3000 d
->process_field (t
->u
.p
, d
);
3004 int loopcounter
= d
->loopcounter
;
3005 const char *oldval
= d
->val
;
3006 const char *oldprevval3
= d
->prev_val
[3];
3009 oprintf (d
->of
, "%*sif (%s != NULL) {\n", d
->indent
, "", d
->val
);
3011 oprintf (d
->of
, "%*ssize_t i%d;\n", d
->indent
, "", loopcounter
);
3012 oprintf (d
->of
, "%*sfor (i%d = 0; i%d != (size_t)(", d
->indent
,
3013 "", loopcounter
, loopcounter
);
3014 if (!d
->in_record_p
)
3015 output_escaped_param (d
, length
, "length");
3017 oprintf (d
->of
, "l%d", loopcounter
);
3018 if (d
->have_this_obj
)
3019 /* Try to unswitch loops (see PR53880). */
3020 oprintf (d
->of
, ") && ((void *)%s == this_obj", oldval
);
3021 oprintf (d
->of
, "); i%d++) {\n", loopcounter
);
3023 d
->val
= newval
= xasprintf ("%s[i%d]", oldval
, loopcounter
);
3025 d
->prev_val
[3] = oldval
;
3026 walk_type (t
->u
.p
, d
);
3029 d
->prev_val
[3] = oldprevval3
;
3032 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3033 d
->process_field (t
, d
);
3035 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3037 d
->in_ptr_field
= false;
3044 const char *oldval
= d
->val
;
3047 /* If it's an array of scalars, we optimize by not generating
3049 if (t
->u
.a
.p
->kind
== TYPE_SCALAR
)
3053 loopcounter
= d
->loopcounter
;
3055 loopcounter
= d
->counter
++;
3057 /* When walking an array, compute the length and store it in a
3058 local variable before walking the array elements, instead of
3059 recomputing the length expression each time through the loop.
3060 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
3061 where the length is stored in the first array element,
3062 because otherwise that operand can get overwritten on the
3064 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
3066 oprintf (d
->of
, "%*ssize_t i%d;\n", d
->indent
, "", loopcounter
);
3067 if (!d
->in_record_p
|| !length
)
3069 oprintf (d
->of
, "%*ssize_t l%d = (size_t)(",
3070 d
->indent
, "", loopcounter
);
3072 output_escaped_param (d
, length
, "length");
3074 oprintf (d
->of
, "%s", t
->u
.a
.len
);
3075 oprintf (d
->of
, ");\n");
3078 oprintf (d
->of
, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
3080 loopcounter
, loopcounter
, loopcounter
, loopcounter
);
3082 d
->val
= newval
= xasprintf ("%s[i%d]", oldval
, loopcounter
);
3084 walk_type (t
->u
.a
.p
, d
);
3089 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3091 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3099 const char *oldval
= d
->val
;
3100 const char *oldprevval1
= d
->prev_val
[1];
3101 const char *oldprevval2
= d
->prev_val
[2];
3102 const char *struct_mark_hook
= NULL
;
3103 const int union_p
= t
->kind
== TYPE_UNION
;
3104 int seen_default_p
= 0;
3106 int lengths_seen
= 0;
3108 bool any_length_seen
= false;
3110 if (!t
->u
.s
.line
.file
)
3111 error_at_line (d
->line
, "incomplete structure `%s'", t
->u
.s
.tag
);
3113 if ((d
->bitmap
& t
->u
.s
.bitmap
) != d
->bitmap
)
3115 error_at_line (d
->line
,
3116 "structure `%s' defined for mismatching languages",
3118 error_at_line (&t
->u
.s
.line
, "one structure defined here");
3121 /* Some things may also be defined in the structure's options. */
3122 for (o
= t
->u
.s
.opt
; o
; o
= o
->next
)
3123 if (!desc
&& strcmp (o
->name
, "desc") == 0
3124 && o
->kind
== OPTION_STRING
)
3125 desc
= o
->info
.string
;
3126 else if (!struct_mark_hook
&& strcmp (o
->name
, "mark_hook") == 0
3127 && o
->kind
== OPTION_STRING
)
3128 struct_mark_hook
= o
->info
.string
;
3130 if (struct_mark_hook
)
3131 oprintf (d
->of
, "%*s%s (&%s);\n",
3132 d
->indent
, "", struct_mark_hook
, oldval
);
3134 d
->prev_val
[2] = oldval
;
3135 d
->prev_val
[1] = oldprevval2
;
3140 error_at_line (d
->line
,
3141 "missing `desc' option for union `%s'",
3145 oprintf (d
->of
, "%*sswitch ((int) (", d
->indent
, "");
3146 output_escaped_param (d
, desc
, "desc");
3147 oprintf (d
->of
, "))\n");
3149 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
3153 /* We have a "desc" option on a struct, signifying the
3154 base class within a GC-managed inheritance hierarchy.
3155 The current code specialcases the base class, then walks
3156 into subclasses, recursing into this routine to handle them.
3157 This organization requires the base class to have a case in
3158 the switch statement, and hence a tag value is mandatory
3159 for the base class. This restriction could be removed, but
3160 it would require some restructing of this code. */
3163 error_at_line (d
->line
,
3164 "missing `tag' option for type `%s'",
3167 oprintf (d
->of
, "%*sswitch ((int) (", d
->indent
, "");
3168 output_escaped_param (d
, desc
, "desc");
3169 oprintf (d
->of
, "))\n");
3171 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
3172 oprintf (d
->of
, "%*scase %s:\n", d
->indent
, "", type_tag
);
3176 FOR_ALL_INHERITED_FIELDS (t
, f
)
3180 const char *fieldlength
= NULL
;
3182 d
->reorder_fn
= NULL
;
3183 for (oo
= f
->opt
; oo
; oo
= oo
->next
)
3184 if (strcmp (oo
->name
, "skip") == 0)
3186 else if (strcmp (oo
->name
, "length") == 0
3187 && oo
->kind
== OPTION_STRING
)
3188 fieldlength
= oo
->info
.string
;
3198 if (!any_length_seen
)
3200 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
3203 any_length_seen
= true;
3205 oprintf (d
->of
, "%*ssize_t l%d = (size_t)(",
3206 d
->indent
, "", d
->counter
- 1);
3207 output_escaped_param (d
, fieldlength
, "length");
3208 oprintf (d
->of
, ");\n");
3212 endcounter
= d
->counter
;
3214 FOR_ALL_INHERITED_FIELDS (t
, f
)
3217 const char *dot
= ".";
3218 const char *tagid
= NULL
;
3221 int use_param_p
= 0;
3222 const char *fieldlength
= NULL
;
3225 d
->reorder_fn
= NULL
;
3226 for (oo
= f
->opt
; oo
; oo
= oo
->next
)
3227 if (strcmp (oo
->name
, "dot") == 0
3228 && oo
->kind
== OPTION_STRING
)
3229 dot
= oo
->info
.string
;
3230 else if (strcmp (oo
->name
, "tag") == 0
3231 && oo
->kind
== OPTION_STRING
)
3232 tagid
= oo
->info
.string
;
3233 else if (strcmp (oo
->name
, "skip") == 0)
3235 else if (strcmp (oo
->name
, "default") == 0)
3237 else if (strcmp (oo
->name
, "reorder") == 0
3238 && oo
->kind
== OPTION_STRING
)
3239 d
->reorder_fn
= oo
->info
.string
;
3240 else if (strncmp (oo
->name
, "use_param", 9) == 0
3241 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
3243 else if (strcmp (oo
->name
, "length") == 0
3244 && oo
->kind
== OPTION_STRING
)
3245 fieldlength
= oo
->info
.string
;
3250 if (union_p
&& tagid
)
3252 oprintf (d
->of
, "%*scase %s:\n", d
->indent
, "", tagid
);
3255 else if (union_p
&& default_p
)
3257 oprintf (d
->of
, "%*sdefault:\n", d
->indent
, "");
3261 else if (!union_p
&& (default_p
|| tagid
))
3262 error_at_line (d
->line
,
3263 "can't use `%s' outside a union on field `%s'",
3264 default_p
? "default" : "tag", f
->name
);
3265 else if (union_p
&& !(default_p
|| tagid
)
3266 && f
->type
->kind
== TYPE_SCALAR
)
3269 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
3270 get_input_file_name (d
->line
->file
), d
->line
->line
,
3274 else if (union_p
&& !(default_p
|| tagid
))
3275 error_at_line (d
->line
,
3276 "field `%s' is missing `tag' or `default' option",
3281 d
->loopcounter
= endcounter
- lengths_seen
--;
3285 d
->val
= newval
= xasprintf ("%s%s%s", oldval
, dot
, f
->name
);
3287 d
->used_length
= false;
3288 d
->in_record_p
= !union_p
;
3290 if (union_p
&& use_param_p
&& d
->param
== NULL
)
3291 oprintf (d
->of
, "%*sgcc_unreachable ();\n", d
->indent
, "");
3293 walk_type (f
->type
, d
);
3295 d
->in_record_p
= false;
3301 oprintf (d
->of
, "%*sbreak;\n", d
->indent
, "");
3305 d
->reorder_fn
= NULL
;
3308 d
->prev_val
[1] = oldprevval1
;
3309 d
->prev_val
[2] = oldprevval2
;
3311 if (union_p
&& !seen_default_p
)
3313 oprintf (d
->of
, "%*sdefault:\n", d
->indent
, "");
3314 oprintf (d
->of
, "%*s break;\n", d
->indent
, "");
3317 if (desc
&& !union_p
)
3319 oprintf (d
->of
, "%*sbreak;\n", d
->indent
, "");
3324 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3329 /* Add cases to handle subclasses. */
3330 struct seen_tag
*tags
= NULL
;
3331 walk_subclasses (t
, d
, &tags
);
3333 /* Ensure that if someone forgets a "tag" option that we don't
3334 silent fail to traverse that subclass's fields. */
3335 if (!seen_default_p
)
3337 oprintf (d
->of
, "%*s/* Unrecognized tag value. */\n",
3339 oprintf (d
->of
, "%*sdefault: gcc_unreachable (); \n",
3343 /* End of the switch statement */
3344 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3347 if (any_length_seen
)
3350 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3355 case TYPE_LANG_STRUCT
:
3358 for (nt
= t
->u
.s
.lang_struct
; nt
; nt
= nt
->next
)
3359 if ((d
->bitmap
& nt
->u
.s
.bitmap
) == d
->bitmap
)
3362 error_at_line (d
->line
, "structure `%s' differs between languages",
3369 case TYPE_PARAM_STRUCT
:
3371 type_p
*oldparam
= d
->param
;
3373 d
->param
= t
->u
.param_struct
.param
;
3374 walk_type (t
->u
.param_struct
.stru
, d
);
3375 d
->param
= oldparam
;
3379 case TYPE_USER_STRUCT
:
3380 d
->process_field (t
, d
);
3384 case TYPE_UNDEFINED
:
3389 /* process_field routine for marking routines. */
3392 write_types_process_field (type_p f
, const struct walk_type_data
*d
)
3394 const struct write_types_data
*wtd
;
3395 const char *cast
= d
->needs_cast_p
? "(void *)" : "";
3396 wtd
= (const struct write_types_data
*) d
->cookie
;
3401 case TYPE_UNDEFINED
:
3404 oprintf (d
->of
, "%*s%s (%s%s", d
->indent
, "",
3405 wtd
->subfield_marker_routine
, cast
, d
->val
);
3406 if (wtd
->param_prefix
)
3408 if (f
->u
.p
->kind
== TYPE_SCALAR
)
3409 /* The current type is a pointer to a scalar (so not
3410 considered like a pointer to instances of user defined
3411 types) and we are seeing it; it means we must be even
3412 more careful about the second argument of the
3413 SUBFIELD_MARKER_ROUTINE call. That argument must
3414 always be the instance of the type for which
3415 write_func_for_structure was called - this really is
3416 what the function SUBFIELD_MARKER_ROUTINE expects.
3417 That is, it must be an instance of the ORIG_S type
3418 parameter of write_func_for_structure. The convention
3419 is that that argument must be "x" in that case (as set
3420 by write_func_for_structure). The problem is, we can't
3421 count on d->prev_val[3] to be always set to "x" in that
3422 case. Sometimes walk_type can set it to something else
3423 (to e.g cooperate with write_array when called from
3424 write_roots). So let's set it to "x" here then. */
3425 oprintf (d
->of
, ", x");
3427 oprintf (d
->of
, ", %s", d
->prev_val
[3]);
3430 oprintf (d
->of
, ", gt_%s_", wtd
->param_prefix
);
3431 output_mangled_typename (d
->of
, d
->orig_s
);
3434 oprintf (d
->of
, ", gt_%sa_%s", wtd
->param_prefix
, d
->prev_val
[0]);
3436 oprintf (d
->of
, ");\n");
3437 if (d
->reorder_fn
&& wtd
->reorder_note_routine
)
3438 oprintf (d
->of
, "%*s%s (%s%s, %s, %s);\n", d
->indent
, "",
3439 wtd
->reorder_note_routine
, cast
, d
->val
,
3440 d
->prev_val
[3], d
->reorder_fn
);
3446 case TYPE_LANG_STRUCT
:
3447 case TYPE_PARAM_STRUCT
:
3448 case TYPE_USER_STRUCT
:
3449 if (f
->kind
== TYPE_USER_STRUCT
&& !d
->in_ptr_field
)
3451 /* If F is a user-defined type and the field is not a
3452 pointer to the type, then we should not generate the
3453 standard pointer-marking code. All we need to do is call
3454 the user-provided marking function to process the fields
3456 oprintf (d
->of
, "%*sgt_%sx (&(%s));\n", d
->indent
, "", wtd
->prefix
,
3461 oprintf (d
->of
, "%*sgt_%s_", d
->indent
, "", wtd
->prefix
);
3462 output_mangled_typename (d
->of
, f
);
3463 oprintf (d
->of
, " (%s%s);\n", cast
, d
->val
);
3464 if (d
->reorder_fn
&& wtd
->reorder_note_routine
)
3465 oprintf (d
->of
, "%*s%s (%s%s, %s%s, %s);\n", d
->indent
, "",
3466 wtd
->reorder_note_routine
, cast
, d
->val
, cast
, d
->val
,
3479 /* Return an output file that is suitable for definitions which can
3480 reference struct S */
3483 get_output_file_for_structure (const_type_p s
, type_p
*param
)
3485 const input_file
*fn
;
3488 gcc_assert (union_or_struct_p (s
));
3489 fn
= s
->u
.s
.line
.file
;
3491 /* This is a hack, and not the good kind either. */
3492 for (i
= NUM_PARAM
- 1; i
>= 0; i
--)
3493 if (param
&& param
[i
] && param
[i
]->kind
== TYPE_POINTER
3494 && union_or_struct_p (param
[i
]->u
.p
))
3495 fn
= param
[i
]->u
.p
->u
.s
.line
.file
;
3497 /* The call to get_output_file_with_visibility may update fn by
3498 caching its result inside, so we need the CONST_CAST. */
3499 return get_output_file_with_visibility (CONST_CAST (input_file
*, fn
));
3503 /* Returns the specifier keyword for a string or union type S, empty string
3507 get_type_specifier (const type_p s
)
3509 if (s
->kind
== TYPE_STRUCT
)
3511 else if (s
->kind
== TYPE_LANG_STRUCT
)
3512 return get_type_specifier (s
->u
.s
.lang_struct
);
3513 else if (s
->kind
== TYPE_UNION
)
3519 /* Emits a declaration for type TY (assumed to be a union or a
3520 structure) on stream OUT. */
3523 write_type_decl (outf_p out
, type_p ty
)
3525 if (union_or_struct_p (ty
))
3526 oprintf (out
, "%s%s", get_type_specifier (ty
), ty
->u
.s
.tag
);
3527 else if (ty
->kind
== TYPE_SCALAR
)
3529 if (ty
->u
.scalar_is_char
)
3530 oprintf (out
, "const char");
3532 oprintf (out
, "void");
3534 else if (ty
->kind
== TYPE_POINTER
)
3536 write_type_decl (out
, ty
->u
.p
);
3537 oprintf (out
, " *");
3539 else if (ty
->kind
== TYPE_ARRAY
)
3541 write_type_decl (out
, ty
->u
.a
.p
);
3542 oprintf (out
, " *");
3544 else if (ty
->kind
== TYPE_STRING
)
3546 oprintf (out
, "const char *");
3553 /* Write on OF the name of the marker function for structure S. PREFIX
3554 is the prefix to use (to distinguish ggc from pch markers). */
3557 write_marker_function_name (outf_p of
, type_p s
, const char *prefix
)
3559 if (union_or_struct_p (s
))
3561 const char *id_for_tag
= filter_type_name (s
->u
.s
.tag
);
3562 oprintf (of
, "gt_%sx_%s", prefix
, id_for_tag
);
3563 if (id_for_tag
!= s
->u
.s
.tag
)
3564 free (CONST_CAST (char *, id_for_tag
));
3566 else if (s
->kind
== TYPE_PARAM_STRUCT
)
3568 oprintf (of
, "gt_%s_", prefix
);
3569 output_mangled_typename (of
, s
);
3575 /* Write on OF a user-callable routine to act as an entry point for
3576 the marking routine for S, generated by write_func_for_structure.
3577 WTD distinguishes between ggc and pch markers. */
3580 write_user_func_for_structure_ptr (outf_p of
, type_p s
, const write_types_data
*wtd
)
3582 /* Parameterized structures are not supported in user markers. There
3583 is no way for the marker function to know which specific type
3584 to use to generate the call to the void * entry point. For
3585 instance, a marker for struct htab may need to call different
3586 routines to mark the fields, depending on the paramN_is attributes.
3588 A user-defined marker that accepts 'struct htab' as its argument
3589 would not know which variant to call. Generating several entry
3590 points accepting 'struct htab' would cause multiply-defined
3591 errors during compilation. */
3592 gcc_assert (union_or_struct_p (s
));
3594 type_p alias_of
= NULL
;
3595 for (options_p opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3596 if (strcmp (opt
->name
, "ptr_alias") == 0)
3598 /* ALIAS_OF is set if ORIG_S is marked "ptr_alias". This means that
3599 we do not generate marking code for ORIG_S here. Instead, a
3600 forwarder #define in gtype-desc.h will cause every call to its
3601 marker to call the target of this alias.
3603 However, we still want to create a user entry code for the
3604 aliased type. So, if ALIAS_OF is set, we only generate the
3605 user-callable marker function. */
3606 alias_of
= opt
->info
.type
;
3610 DBGPRINTF ("write_user_func_for_structure_ptr: %s %s", s
->u
.s
.tag
,
3613 /* Only write the function once. */
3614 if (s
->u
.s
.wrote_user_func_for_ptr
[wtd
->kind
])
3616 s
->u
.s
.wrote_user_func_for_ptr
[wtd
->kind
] = true;
3618 oprintf (of
, "\nvoid\n");
3619 oprintf (of
, "gt_%sx (", wtd
->prefix
);
3620 write_type_decl (of
, s
);
3621 oprintf (of
, " *& x)\n");
3622 oprintf (of
, "{\n");
3623 oprintf (of
, " if (x)\n ");
3624 write_marker_function_name (of
,
3625 alias_of
? alias_of
: get_ultimate_base_class (s
),
3627 oprintf (of
, " ((void *) x);\n");
3628 oprintf (of
, "}\n");
3632 /* Write a function to mark all the fields of type S on OF. PREFIX
3633 and D are as in write_user_marking_functions. */
3636 write_user_func_for_structure_body (type_p s
, const char *prefix
,
3637 struct walk_type_data
*d
)
3639 oprintf (d
->of
, "\nvoid\n");
3640 oprintf (d
->of
, "gt_%sx (", prefix
);
3641 write_type_decl (d
->of
, s
);
3642 oprintf (d
->of
, "& x_r ATTRIBUTE_UNUSED)\n");
3643 oprintf (d
->of
, "{\n");
3644 oprintf (d
->of
, " ");
3645 write_type_decl (d
->of
, s
);
3646 oprintf (d
->of
, " * ATTRIBUTE_UNUSED x = &x_r;\n");
3650 oprintf (d
->of
, "}\n");
3653 /* Emit the user-callable functions needed to mark all the types used
3654 by the user structure S. PREFIX is the prefix to use to
3655 distinguish ggc and pch markers. D contains data needed to pass to
3656 walk_type when traversing the fields of a type.
3658 For every type T referenced by S, two routines are generated: one
3659 that takes 'T *', marks the pointer and calls the second routine,
3660 which just marks the fields of T. */
3663 write_user_marking_functions (type_p s
,
3664 const write_types_data
*w
,
3665 struct walk_type_data
*d
)
3667 gcc_assert (s
->kind
== TYPE_USER_STRUCT
);
3669 for (pair_p fld
= s
->u
.s
.fields
; fld
; fld
= fld
->next
)
3671 type_p fld_type
= fld
->type
;
3672 if (fld_type
->kind
== TYPE_POINTER
)
3674 type_p pointed_to_type
= fld_type
->u
.p
;
3675 if (union_or_struct_p (pointed_to_type
))
3676 write_user_func_for_structure_ptr (d
->of
, pointed_to_type
, w
);
3678 else if (union_or_struct_p (fld_type
))
3679 write_user_func_for_structure_body (fld_type
, w
->prefix
, d
);
3684 /* For S, a structure that's part of ORIG_S, and using parameters
3685 PARAM, write out a routine that:
3686 - Takes a parameter, a void * but actually of type *S
3687 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
3688 field of S or its substructures and (in some cases) things
3689 that are pointed to by S. */
3692 write_func_for_structure (type_p orig_s
, type_p s
, type_p
*param
,
3693 const struct write_types_data
*wtd
)
3695 const char *chain_next
= NULL
;
3696 const char *chain_prev
= NULL
;
3697 const char *chain_circular
= NULL
;
3698 const char *mark_hook_name
= NULL
;
3700 struct walk_type_data d
;
3702 if (s
->u
.s
.base_class
)
3704 /* Verify that the base class has a "desc", since otherwise
3705 the traversal hooks there won't attempt to visit fields of
3706 subclasses such as this one. */
3707 const_type_p ubc
= get_ultimate_base_class (s
);
3708 if ((!opts_have (ubc
->u
.s
.opt
, "user")
3709 && !opts_have (ubc
->u
.s
.opt
, "desc")))
3710 error_at_line (&s
->u
.s
.line
,
3711 ("'%s' is a subclass of non-GTY(user) GTY class '%s'"
3712 ", but '%s' lacks a discriminator 'desc' option"),
3713 s
->u
.s
.tag
, ubc
->u
.s
.tag
, ubc
->u
.s
.tag
);
3715 /* Don't write fns for subclasses, only for the ultimate base class
3716 within an inheritance hierarchy. */
3720 memset (&d
, 0, sizeof (d
));
3721 d
.of
= get_output_file_for_structure (s
, param
);
3723 bool for_user
= false;
3724 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3725 if (strcmp (opt
->name
, "chain_next") == 0
3726 && opt
->kind
== OPTION_STRING
)
3727 chain_next
= opt
->info
.string
;
3728 else if (strcmp (opt
->name
, "chain_prev") == 0
3729 && opt
->kind
== OPTION_STRING
)
3730 chain_prev
= opt
->info
.string
;
3731 else if (strcmp (opt
->name
, "chain_circular") == 0
3732 && opt
->kind
== OPTION_STRING
)
3733 chain_circular
= opt
->info
.string
;
3734 else if (strcmp (opt
->name
, "mark_hook") == 0
3735 && opt
->kind
== OPTION_STRING
)
3736 mark_hook_name
= opt
->info
.string
;
3737 else if (strcmp (opt
->name
, "for_user") == 0)
3739 if (chain_prev
!= NULL
&& chain_next
== NULL
)
3740 error_at_line (&s
->u
.s
.line
, "chain_prev without chain_next");
3741 if (chain_circular
!= NULL
&& chain_next
!= NULL
)
3742 error_at_line (&s
->u
.s
.line
, "chain_circular with chain_next");
3743 if (chain_circular
!= NULL
)
3744 chain_next
= chain_circular
;
3746 d
.process_field
= write_types_process_field
;
3750 d
.line
= &s
->u
.s
.line
;
3751 d
.bitmap
= s
->u
.s
.bitmap
;
3753 d
.prev_val
[0] = "*x";
3754 d
.prev_val
[1] = "not valid postage"; /* Guarantee an error. */
3755 d
.prev_val
[3] = "x";
3757 d
.have_this_obj
= false;
3759 oprintf (d
.of
, "\n");
3760 oprintf (d
.of
, "void\n");
3761 write_marker_function_name (d
.of
, orig_s
, wtd
->prefix
);
3762 oprintf (d
.of
, " (void *x_p)\n");
3763 oprintf (d
.of
, "{\n ");
3764 write_type_decl (d
.of
, s
);
3765 oprintf (d
.of
, " * %sx = (", chain_next
== NULL
? "const " : "");
3766 write_type_decl (d
.of
, s
);
3767 oprintf (d
.of
, " *)x_p;\n");
3768 if (chain_next
!= NULL
)
3770 /* TYPE_USER_STRUCTs should not occur here. These structures
3771 are completely handled by user code. */
3772 gcc_assert (orig_s
->kind
!= TYPE_USER_STRUCT
);
3774 oprintf (d
.of
, " ");
3775 write_type_decl (d
.of
, s
);
3776 oprintf (d
.of
, " * xlimit = x;\n");
3778 if (chain_next
== NULL
)
3780 oprintf (d
.of
, " if (%s (x", wtd
->marker_routine
);
3781 if (wtd
->param_prefix
)
3783 oprintf (d
.of
, ", x, gt_%s_", wtd
->param_prefix
);
3784 output_mangled_typename (d
.of
, orig_s
);
3786 oprintf (d
.of
, "))\n");
3790 if (chain_circular
!= NULL
)
3791 oprintf (d
.of
, " if (!%s (xlimit", wtd
->marker_routine
);
3793 oprintf (d
.of
, " while (%s (xlimit", wtd
->marker_routine
);
3794 if (wtd
->param_prefix
)
3796 oprintf (d
.of
, ", xlimit, gt_%s_", wtd
->param_prefix
);
3797 output_mangled_typename (d
.of
, orig_s
);
3799 oprintf (d
.of
, "))\n");
3800 if (chain_circular
!= NULL
)
3801 oprintf (d
.of
, " return;\n do\n");
3802 if (mark_hook_name
&& !wtd
->skip_hooks
)
3804 oprintf (d
.of
, " {\n");
3805 oprintf (d
.of
, " %s (xlimit);\n ", mark_hook_name
);
3807 oprintf (d
.of
, " xlimit = (");
3808 d
.prev_val
[2] = "*xlimit";
3809 output_escaped_param (&d
, chain_next
, "chain_next");
3810 oprintf (d
.of
, ");\n");
3811 if (mark_hook_name
&& !wtd
->skip_hooks
)
3812 oprintf (d
.of
, " }\n");
3813 if (chain_prev
!= NULL
)
3815 oprintf (d
.of
, " if (x != xlimit)\n");
3816 oprintf (d
.of
, " for (;;)\n");
3817 oprintf (d
.of
, " {\n");
3818 oprintf (d
.of
, " %s %s * const xprev = (",
3819 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
3821 d
.prev_val
[2] = "*x";
3822 output_escaped_param (&d
, chain_prev
, "chain_prev");
3823 oprintf (d
.of
, ");\n");
3824 oprintf (d
.of
, " if (xprev == NULL) break;\n");
3825 oprintf (d
.of
, " x = xprev;\n");
3826 oprintf (d
.of
, " (void) %s (xprev", wtd
->marker_routine
);
3827 if (wtd
->param_prefix
)
3829 oprintf (d
.of
, ", xprev, gt_%s_", wtd
->param_prefix
);
3830 output_mangled_typename (d
.of
, orig_s
);
3832 oprintf (d
.of
, ");\n");
3833 oprintf (d
.of
, " }\n");
3835 if (chain_circular
!= NULL
)
3837 oprintf (d
.of
, " while (%s (xlimit", wtd
->marker_routine
);
3838 if (wtd
->param_prefix
)
3840 oprintf (d
.of
, ", xlimit, gt_%s_", wtd
->param_prefix
);
3841 output_mangled_typename (d
.of
, orig_s
);
3843 oprintf (d
.of
, "));\n");
3844 if (mark_hook_name
&& !wtd
->skip_hooks
)
3845 oprintf (d
.of
, " %s (xlimit);\n", mark_hook_name
);
3846 oprintf (d
.of
, " do\n");
3849 oprintf (d
.of
, " while (x != xlimit)\n");
3851 oprintf (d
.of
, " {\n");
3852 if (mark_hook_name
&& chain_next
== NULL
&& !wtd
->skip_hooks
)
3854 oprintf (d
.of
, " %s (x);\n", mark_hook_name
);
3857 d
.prev_val
[2] = "*x";
3859 if (orig_s
->kind
!= TYPE_USER_STRUCT
)
3863 /* User structures have no fields to walk. Simply generate a call
3864 to the user-provided structure marker. */
3865 oprintf (d
.of
, "%*sgt_%sx (x);\n", d
.indent
, "", wtd
->prefix
);
3868 if (chain_next
!= NULL
)
3870 oprintf (d
.of
, " x = (");
3871 output_escaped_param (&d
, chain_next
, "chain_next");
3872 oprintf (d
.of
, ");\n");
3875 oprintf (d
.of
, " }\n");
3876 if (chain_circular
!= NULL
)
3877 oprintf (d
.of
, " while (x != xlimit);\n");
3878 oprintf (d
.of
, "}\n");
3880 if (orig_s
->kind
== TYPE_USER_STRUCT
)
3881 write_user_marking_functions (orig_s
, wtd
, &d
);
3885 write_user_func_for_structure_body (orig_s
, wtd
->prefix
, &d
);
3886 write_user_func_for_structure_ptr (d
.of
, orig_s
, wtd
);
3891 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
3894 write_types (outf_p output_header
, type_p structures
, type_p param_structs
,
3895 const struct write_types_data
*wtd
)
3897 int nbfun
= 0; /* Count the emitted functions. */
3900 oprintf (output_header
, "\n/* %s*/\n", wtd
->comment
);
3902 /* We first emit the macros and the declarations. Functions' code is
3903 emitted afterwards. This is needed in plugin mode. */
3904 oprintf (output_header
, "/* Macros and declarations. */\n");
3905 for (s
= structures
; s
; s
= s
->next
)
3906 /* Do not emit handlers for derived classes; we only ever deal with
3907 the ultimate base class within an inheritance hierarchy. */
3908 if ((s
->gc_used
== GC_POINTED_TO
|| s
->gc_used
== GC_MAYBE_POINTED_TO
)
3909 && !s
->u
.s
.base_class
)
3913 if (s
->gc_used
== GC_MAYBE_POINTED_TO
&& s
->u
.s
.line
.file
== NULL
)
3916 const char *s_id_for_tag
= filter_type_name (s
->u
.s
.tag
);
3918 oprintf (output_header
, "#define gt_%s_", wtd
->prefix
);
3919 output_mangled_typename (output_header
, s
);
3920 oprintf (output_header
, "(X) do { \\\n");
3921 oprintf (output_header
,
3922 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd
->prefix
,
3924 oprintf (output_header
, " } while (0)\n");
3926 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3927 if (strcmp (opt
->name
, "ptr_alias") == 0
3928 && opt
->kind
== OPTION_TYPE
)
3930 const_type_p
const t
= (const_type_p
) opt
->info
.type
;
3931 if (t
->kind
== TYPE_STRUCT
3932 || t
->kind
== TYPE_UNION
|| t
->kind
== TYPE_LANG_STRUCT
)
3934 const char *t_id_for_tag
= filter_type_name (t
->u
.s
.tag
);
3935 oprintf (output_header
,
3936 "#define gt_%sx_%s gt_%sx_%s\n",
3937 wtd
->prefix
, s
->u
.s
.tag
, wtd
->prefix
, t_id_for_tag
);
3938 if (t_id_for_tag
!= t
->u
.s
.tag
)
3939 free (CONST_CAST (char *, t_id_for_tag
));
3942 error_at_line (&s
->u
.s
.line
,
3943 "structure alias is not a structure");
3949 /* Declare the marker procedure only once. */
3950 oprintf (output_header
,
3951 "extern void gt_%sx_%s (void *);\n",
3952 wtd
->prefix
, s_id_for_tag
);
3954 if (s_id_for_tag
!= s
->u
.s
.tag
)
3955 free (CONST_CAST (char *, s_id_for_tag
));
3957 if (s
->u
.s
.line
.file
== NULL
)
3959 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
3965 for (s
= param_structs
; s
; s
= s
->next
)
3966 if (s
->gc_used
== GC_POINTED_TO
)
3968 type_p stru
= s
->u
.param_struct
.stru
;
3970 /* Declare the marker procedure. */
3971 oprintf (output_header
, "extern void gt_%s_", wtd
->prefix
);
3972 output_mangled_typename (output_header
, s
);
3973 oprintf (output_header
, " (void *);\n");
3975 if (stru
->u
.s
.line
.file
== NULL
)
3977 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
3983 /* At last we emit the functions code. */
3984 oprintf (output_header
, "\n/* functions code */\n");
3985 for (s
= structures
; s
; s
= s
->next
)
3986 if (s
->gc_used
== GC_POINTED_TO
|| s
->gc_used
== GC_MAYBE_POINTED_TO
)
3990 if (s
->gc_used
== GC_MAYBE_POINTED_TO
&& s
->u
.s
.line
.file
== NULL
)
3992 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3993 if (strcmp (opt
->name
, "ptr_alias") == 0)
3998 if (s
->kind
== TYPE_LANG_STRUCT
)
4001 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
4004 DBGPRINTF ("writing func #%d lang_struct ss @ %p '%s'",
4005 nbfun
, (void*) ss
, ss
->u
.s
.tag
);
4006 write_func_for_structure (s
, ss
, NULL
, wtd
);
4012 DBGPRINTF ("writing func #%d struct s @ %p '%s'",
4013 nbfun
, (void*) s
, s
->u
.s
.tag
);
4014 write_func_for_structure (s
, s
, NULL
, wtd
);
4019 /* Structure s is not possibly pointed to, so can be ignored. */
4020 DBGPRINTF ("ignored s @ %p '%s' gc_used#%d",
4021 (void*)s
, s
->u
.s
.tag
,
4025 for (s
= param_structs
; s
; s
= s
->next
)
4026 if (s
->gc_used
== GC_POINTED_TO
)
4028 type_p
*param
= s
->u
.param_struct
.param
;
4029 type_p stru
= s
->u
.param_struct
.stru
;
4030 if (stru
->u
.s
.line
.file
== NULL
)
4032 if (stru
->kind
== TYPE_LANG_STRUCT
)
4035 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
4038 DBGPRINTF ("writing func #%d param lang_struct ss @ %p '%s'",
4039 nbfun
, (void*) ss
, ss
->u
.s
.tag
);
4040 write_func_for_structure (s
, ss
, param
, wtd
);
4046 DBGPRINTF ("writing func #%d param struct s @ %p stru @ %p '%s'",
4048 (void*) stru
, stru
->u
.s
.tag
);
4049 write_func_for_structure (s
, stru
, param
, wtd
);
4054 /* Param structure s is not pointed to, so should be ignored. */
4055 DBGPRINTF ("ignored s @ %p", (void*)s
);
4057 if (verbosity_level
>= 2)
4058 printf ("%s emitted %d routines for %s\n",
4059 progname
, nbfun
, wtd
->comment
);
4062 static const struct write_types_data ggc_wtd
= {
4063 "ggc_m", NULL
, "ggc_mark", "ggc_test_and_set_mark", NULL
,
4064 "GC marker procedures. ",
4068 static const struct write_types_data pch_wtd
= {
4069 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
4070 "gt_pch_note_reorder",
4071 "PCH type-walking procedures. ",
4075 /* Write out the local pointer-walking routines. */
4077 /* process_field routine for local pointer-walking for user-callable
4078 routines. The difference between this and
4079 write_types_local_process_field is that, in this case, we do not
4080 need to check whether the given pointer matches the address of the
4081 parent structure. This check was already generated by the call
4082 to gt_pch_nx in the main gt_pch_p_*() function that is calling
4086 write_types_local_user_process_field (type_p f
, const struct walk_type_data
*d
)
4093 case TYPE_LANG_STRUCT
:
4094 case TYPE_PARAM_STRUCT
:
4096 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
4099 case TYPE_USER_STRUCT
:
4100 if (d
->in_ptr_field
)
4101 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
4103 oprintf (d
->of
, "%*s gt_pch_nx (&(%s), op, cookie);\n",
4104 d
->indent
, "", d
->val
);
4112 case TYPE_UNDEFINED
:
4118 /* Write a function to PCH walk all the fields of type S on OF.
4119 D contains data needed by walk_type to recurse into the fields of S. */
4122 write_pch_user_walking_for_structure_body (type_p s
, struct walk_type_data
*d
)
4124 oprintf (d
->of
, "\nvoid\n");
4125 oprintf (d
->of
, "gt_pch_nx (");
4126 write_type_decl (d
->of
, s
);
4127 oprintf (d
->of
, "* x ATTRIBUTE_UNUSED,\n"
4128 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
4129 "\tATTRIBUTE_UNUSED void *cookie)\n");
4130 oprintf (d
->of
, "{\n");
4133 d
->process_field
= write_types_local_user_process_field
;
4135 oprintf (d
->of
, "}\n");
4139 /* Emit the user-callable functions needed to mark all the types used
4140 by the user structure S. PREFIX is the prefix to use to
4141 distinguish ggc and pch markers. CHAIN_NEXT is set if S has the
4142 chain_next option defined. D contains data needed to pass to
4143 walk_type when traversing the fields of a type.
4145 For every type T referenced by S, two routines are generated: one
4146 that takes 'T *', marks the pointer and calls the second routine,
4147 which just marks the fields of T. */
4150 write_pch_user_walking_functions (type_p s
, struct walk_type_data
*d
)
4152 gcc_assert (s
->kind
== TYPE_USER_STRUCT
);
4154 for (pair_p fld
= s
->u
.s
.fields
; fld
; fld
= fld
->next
)
4156 type_p fld_type
= fld
->type
;
4157 if (union_or_struct_p (fld_type
))
4158 write_pch_user_walking_for_structure_body (fld_type
, d
);
4163 /* process_field routine for local pointer-walking. */
4166 write_types_local_process_field (type_p f
, const struct walk_type_data
*d
)
4168 gcc_assert (d
->have_this_obj
);
4174 case TYPE_LANG_STRUCT
:
4175 case TYPE_PARAM_STRUCT
:
4177 oprintf (d
->of
, "%*sif ((void *)(%s) == this_obj)\n", d
->indent
, "",
4179 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
4182 case TYPE_USER_STRUCT
:
4183 oprintf (d
->of
, "%*sif ((void *)(%s) == this_obj)\n", d
->indent
, "",
4185 if (d
->in_ptr_field
)
4186 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
4188 oprintf (d
->of
, "%*s gt_pch_nx (&(%s), op, cookie);\n",
4189 d
->indent
, "", d
->val
);
4197 case TYPE_UNDEFINED
:
4203 /* For S, a structure that's part of ORIG_S, and using parameters
4204 PARAM, write out a routine that:
4205 - Is of type gt_note_pointers
4206 - Calls PROCESS_FIELD on each field of S or its substructures.
4210 write_local_func_for_structure (const_type_p orig_s
, type_p s
, type_p
*param
)
4212 struct walk_type_data d
;
4214 /* Don't write fns for subclasses, only for the ultimate base class
4215 within an inheritance hierarchy. */
4216 if (s
->u
.s
.base_class
)
4219 memset (&d
, 0, sizeof (d
));
4220 d
.of
= get_output_file_for_structure (s
, param
);
4221 d
.process_field
= write_types_local_process_field
;
4223 d
.line
= &s
->u
.s
.line
;
4224 d
.bitmap
= s
->u
.s
.bitmap
;
4226 d
.prev_val
[0] = d
.prev_val
[2] = "*x";
4227 d
.prev_val
[1] = "not valid postage"; /* Guarantee an error. */
4228 d
.prev_val
[3] = "x";
4230 d
.fn_wants_lvalue
= true;
4232 oprintf (d
.of
, "\n");
4233 oprintf (d
.of
, "void\n");
4234 oprintf (d
.of
, "gt_pch_p_");
4235 output_mangled_typename (d
.of
, orig_s
);
4236 oprintf (d
.of
, " (ATTRIBUTE_UNUSED void *this_obj,\n"
4238 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
4239 "\tATTRIBUTE_UNUSED void *cookie)\n");
4240 oprintf (d
.of
, "{\n");
4241 oprintf (d
.of
, " %s %s * x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
4242 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
4243 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
4245 d
.have_this_obj
= true;
4247 if (s
->kind
!= TYPE_USER_STRUCT
)
4251 /* User structures have no fields to walk. Simply generate a
4252 call to the user-provided PCH walker. */
4253 oprintf (d
.of
, "%*sif ((void *)(%s) == this_obj)\n", d
.indent
, "",
4255 oprintf (d
.of
, "%*s gt_pch_nx (&(%s), op, cookie);\n",
4256 d
.indent
, "", d
.val
);
4259 oprintf (d
.of
, "}\n");
4261 /* Write user-callable entry points for the PCH walking routines. */
4262 if (orig_s
->kind
== TYPE_USER_STRUCT
)
4263 write_pch_user_walking_functions (s
, &d
);
4265 for (options_p o
= s
->u
.s
.opt
; o
; o
= o
->next
)
4266 if (strcmp (o
->name
, "for_user") == 0)
4268 write_pch_user_walking_for_structure_body (s
, &d
);
4273 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
4276 write_local (outf_p output_header
, type_p structures
, type_p param_structs
)
4283 oprintf (output_header
, "\n/* Local pointer-walking routines. */\n");
4284 for (s
= structures
; s
; s
= s
->next
)
4285 if (s
->gc_used
== GC_POINTED_TO
|| s
->gc_used
== GC_MAYBE_POINTED_TO
)
4289 if (s
->u
.s
.line
.file
== NULL
)
4291 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
4292 if (strcmp (opt
->name
, "ptr_alias") == 0
4293 && opt
->kind
== OPTION_TYPE
)
4295 const_type_p
const t
= (const_type_p
) opt
->info
.type
;
4296 if (t
->kind
== TYPE_STRUCT
4297 || t
->kind
== TYPE_UNION
|| t
->kind
== TYPE_LANG_STRUCT
)
4299 oprintf (output_header
, "#define gt_pch_p_");
4300 output_mangled_typename (output_header
, s
);
4301 oprintf (output_header
, " gt_pch_p_");
4302 output_mangled_typename (output_header
, t
);
4303 oprintf (output_header
, "\n");
4306 error_at_line (&s
->u
.s
.line
,
4307 "structure alias is not a structure");
4313 /* Declare the marker procedure only once. */
4314 oprintf (output_header
, "extern void gt_pch_p_");
4315 output_mangled_typename (output_header
, s
);
4316 oprintf (output_header
,
4317 "\n (void *, void *, gt_pointer_operator, void *);\n");
4319 if (s
->kind
== TYPE_LANG_STRUCT
)
4322 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
4323 write_local_func_for_structure (s
, ss
, NULL
);
4326 write_local_func_for_structure (s
, s
, NULL
);
4329 for (s
= param_structs
; s
; s
= s
->next
)
4330 if (s
->gc_used
== GC_POINTED_TO
)
4332 type_p
*param
= s
->u
.param_struct
.param
;
4333 type_p stru
= s
->u
.param_struct
.stru
;
4335 /* Declare the marker procedure. */
4336 oprintf (output_header
, "extern void gt_pch_p_");
4337 output_mangled_typename (output_header
, s
);
4338 oprintf (output_header
,
4339 "\n (void *, void *, gt_pointer_operator, void *);\n");
4341 if (stru
->u
.s
.line
.file
== NULL
)
4343 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
4348 if (stru
->kind
== TYPE_LANG_STRUCT
)
4351 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
4352 write_local_func_for_structure (s
, ss
, param
);
4355 write_local_func_for_structure (s
, stru
, param
);
4359 /* Nonzero if S is a type for which typed GC allocators should be output. */
4361 #define USED_BY_TYPED_GC_P(s) \
4362 ((s->kind == TYPE_POINTER \
4363 && (s->u.p->gc_used == GC_POINTED_TO \
4364 || s->u.p->gc_used == GC_USED)) \
4365 || (union_or_struct_p (s) \
4366 && ((s)->gc_used == GC_POINTED_TO \
4367 || ((s)->gc_used == GC_MAYBE_POINTED_TO \
4368 && s->u.s.line.file != NULL) \
4369 || ((s)->gc_used == GC_USED \
4370 && strncmp (s->u.s.tag, "anonymous", strlen ("anonymous"))) \
4371 || (s->u.s.base_class && opts_have (s->u.s.opt, "tag")))))
4375 /* Might T contain any non-pointer elements? */
4378 contains_scalar_p (type_p t
)
4386 return contains_scalar_p (t
->u
.a
.p
);
4387 case TYPE_USER_STRUCT
:
4388 /* User-marked structures will typically contain pointers. */
4391 /* Could also check for structures that have no non-pointer
4392 fields, but there aren't enough of those to worry about. */
4397 /* Mangle INPF and print it to F. */
4400 put_mangled_filename (outf_p f
, const input_file
*inpf
)
4402 /* The call to get_output_file_name may indirectly update fn since
4403 get_output_file_with_visibility caches its result inside, so we
4404 need the CONST_CAST. */
4405 const char *name
= get_output_file_name (CONST_CAST (input_file
*, inpf
));
4408 for (; *name
!= 0; name
++)
4409 if (ISALNUM (*name
))
4410 oprintf (f
, "%c", *name
);
4412 oprintf (f
, "%c", '_');
4415 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
4416 LASTNAME, and NAME are all strings to insert in various places in
4417 the resulting code. */
4420 finish_root_table (struct flist
*flp
, const char *pfx
, const char *lastname
,
4421 const char *tname
, const char *name
)
4425 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
4426 if (fli2
->started_p
)
4428 oprintf (fli2
->f
, " %s\n", lastname
);
4429 oprintf (fli2
->f
, "};\n\n");
4432 for (fli2
= flp
; fli2
&& base_files
; fli2
= fli2
->next
)
4433 if (fli2
->started_p
)
4435 lang_bitmap bitmap
= get_lang_bitmap (fli2
->file
);
4438 for (fnum
= 0; bitmap
!= 0; fnum
++, bitmap
>>= 1)
4441 oprintf (base_files
[fnum
],
4442 "extern const struct %s gt_%s_", tname
, pfx
);
4443 put_mangled_filename (base_files
[fnum
], fli2
->file
);
4444 oprintf (base_files
[fnum
], "[];\n");
4450 for (fnum
= 0; base_files
&& fnum
< num_lang_dirs
; fnum
++)
4451 oprintf (base_files
[fnum
],
4452 "EXPORTED_CONST struct %s * const %s[] = {\n", tname
, name
);
4456 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
4457 if (fli2
->started_p
)
4459 lang_bitmap bitmap
= get_lang_bitmap (fli2
->file
);
4462 fli2
->started_p
= 0;
4464 for (fnum
= 0; base_files
&& bitmap
!= 0; fnum
++, bitmap
>>= 1)
4467 oprintf (base_files
[fnum
], " gt_%s_", pfx
);
4468 put_mangled_filename (base_files
[fnum
], fli2
->file
);
4469 oprintf (base_files
[fnum
], ",\n");
4475 for (fnum
= 0; base_files
&& fnum
< num_lang_dirs
; fnum
++)
4477 oprintf (base_files
[fnum
], " NULL\n");
4478 oprintf (base_files
[fnum
], "};\n");
4483 /* Write the first three fields (pointer, count and stride) for
4484 root NAME to F. V and LINE are as for write_root.
4486 Return true if the entry could be written; return false on error. */
4489 start_root_entry (outf_p f
, pair_p v
, const char *name
, struct fileloc
*line
)
4495 error_at_line (line
, "`%s' is too complex to be a root", name
);
4499 oprintf (f
, " {\n");
4500 oprintf (f
, " &%s,\n", name
);
4503 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
4505 oprintf (f
, " * (%s)", ap
->u
.a
.len
);
4506 else if (ap
== v
->type
)
4507 oprintf (f
, " * ARRAY_SIZE (%s)", v
->name
);
4509 oprintf (f
, " sizeof (%s", v
->name
);
4510 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
4512 oprintf (f
, "),\n");
4516 /* A subroutine of write_root for writing the roots for field FIELD_NAME,
4517 which has type FIELD_TYPE. Parameters F to EMIT_PCH are the parameters
4521 write_field_root (outf_p f
, pair_p v
, type_p type
, const char *name
,
4522 int has_length
, struct fileloc
*line
, const char *if_marked
,
4523 bool emit_pch
, type_p field_type
, const char *field_name
)
4526 /* If the field reference is relative to V, rather than to some
4527 subcomponent of V, we can mark any subarrays with a single stride.
4528 We're effectively treating the field as a global variable in its
4530 if (v
&& type
== v
->type
)
4533 newv
.type
= field_type
;
4534 newv
.name
= ACONCAT ((v
->name
, ".", field_name
, NULL
));
4537 /* Otherwise, any arrays nested in the structure are too complex to
4539 else if (field_type
->kind
== TYPE_ARRAY
)
4541 write_root (f
, v
, field_type
, ACONCAT ((name
, ".", field_name
, NULL
)),
4542 has_length
, line
, if_marked
, emit_pch
);
4545 /* Write out to F the table entry and any marker routines needed to
4546 mark NAME as TYPE. V can be one of three values:
4548 - null, if NAME is too complex to represent using a single
4549 count and stride. In this case, it is an error for NAME to
4550 contain any gc-ed data.
4552 - the outermost array that contains NAME, if NAME is part of an array.
4554 - the C variable that contains NAME, if NAME is not part of an array.
4556 LINE is the line of the C source that declares the root variable.
4557 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
4558 is nonzero iff we are building the root table for hash table caches. */
4561 write_root (outf_p f
, pair_p v
, type_p type
, const char *name
, int has_length
,
4562 struct fileloc
*line
, const char *if_marked
, bool emit_pch
)
4569 for (fld
= type
->u
.s
.fields
; fld
; fld
= fld
->next
)
4572 const char *desc
= NULL
;
4575 for (o
= fld
->opt
; o
; o
= o
->next
)
4576 if (strcmp (o
->name
, "skip") == 0)
4578 else if (strcmp (o
->name
, "desc") == 0
4579 && o
->kind
== OPTION_STRING
)
4580 desc
= o
->info
.string
;
4581 else if (strcmp (o
->name
, "param_is") == 0)
4584 error_at_line (line
,
4585 "field `%s' of global `%s' has unknown option `%s'",
4586 fld
->name
, name
, o
->name
);
4590 else if (desc
&& fld
->type
->kind
== TYPE_UNION
)
4592 pair_p validf
= NULL
;
4595 for (ufld
= fld
->type
->u
.s
.fields
; ufld
; ufld
= ufld
->next
)
4597 const char *tag
= NULL
;
4599 for (oo
= ufld
->opt
; oo
; oo
= oo
->next
)
4600 if (strcmp (oo
->name
, "tag") == 0
4601 && oo
->kind
== OPTION_STRING
)
4602 tag
= oo
->info
.string
;
4603 if (tag
== NULL
|| strcmp (tag
, desc
) != 0)
4606 error_at_line (line
,
4607 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
4608 name
, fld
->name
, validf
->name
,
4609 name
, fld
->name
, ufld
->name
, tag
);
4613 write_field_root (f
, v
, type
, name
, 0, line
, if_marked
,
4614 emit_pch
, validf
->type
,
4615 ACONCAT ((fld
->name
, ".",
4616 validf
->name
, NULL
)));
4619 error_at_line (line
,
4620 "global `%s.%s' has `desc' option but is not union",
4623 write_field_root (f
, v
, type
, name
, 0, line
, if_marked
,
4624 emit_pch
, fld
->type
, fld
->name
);
4632 newname
= xasprintf ("%s[0]", name
);
4633 write_root (f
, v
, type
->u
.a
.p
, newname
, has_length
, line
, if_marked
,
4639 case TYPE_USER_STRUCT
:
4640 error_at_line (line
, "`%s' must be a pointer type, because it is "
4641 "a GC root and its type is marked with GTY((user))",
4649 if (!start_root_entry (f
, v
, name
, line
))
4654 if (!has_length
&& union_or_struct_p (tp
))
4656 tp
= get_ultimate_base_class (tp
);
4657 const char *id_for_tag
= filter_type_name (tp
->u
.s
.tag
);
4658 oprintf (f
, " >_ggc_mx_%s,\n", id_for_tag
);
4660 oprintf (f
, " >_pch_nx_%s", id_for_tag
);
4662 oprintf (f
, " NULL");
4663 if (id_for_tag
!= tp
->u
.s
.tag
)
4664 free (CONST_CAST (char *, id_for_tag
));
4666 else if (!has_length
&& tp
->kind
== TYPE_PARAM_STRUCT
)
4668 oprintf (f
, " >_ggc_m_");
4669 output_mangled_typename (f
, tp
);
4672 oprintf (f
, ",\n >_pch_n_");
4673 output_mangled_typename (f
, tp
);
4676 oprintf (f
, ",\n NULL");
4679 && (tp
->kind
== TYPE_POINTER
|| union_or_struct_p (tp
)))
4681 oprintf (f
, " >_ggc_ma_%s,\n", name
);
4683 oprintf (f
, " >_pch_na_%s", name
);
4685 oprintf (f
, " NULL");
4689 error_at_line (line
,
4690 "global `%s' is pointer to unimplemented type",
4694 oprintf (f
, ",\n &%s", if_marked
);
4695 oprintf (f
, "\n },\n");
4701 if (!start_root_entry (f
, v
, name
, line
))
4704 oprintf (f
, " (gt_pointer_walker) >_ggc_m_S,\n");
4705 oprintf (f
, " (gt_pointer_walker) >_pch_n_S\n");
4706 oprintf (f
, " },\n");
4714 case TYPE_UNDEFINED
:
4716 case TYPE_LANG_STRUCT
:
4717 case TYPE_PARAM_STRUCT
:
4718 error_at_line (line
, "global `%s' is unimplemented type", name
);
4722 /* This generates a routine to walk an array. */
4725 write_array (outf_p f
, pair_p v
, const struct write_types_data
*wtd
)
4727 struct walk_type_data d
;
4730 memset (&d
, 0, sizeof (d
));
4736 d
.bitmap
= get_lang_bitmap (v
->line
.file
);
4739 d
.prev_val
[3] = prevval3
= xasprintf ("&%s", v
->name
);
4741 if (wtd
->param_prefix
)
4743 oprintf (f
, "static void gt_%sa_%s\n", wtd
->param_prefix
, v
->name
);
4744 oprintf (f
, " (void *, void *, gt_pointer_operator, void *);\n");
4745 oprintf (f
, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
4746 wtd
->param_prefix
, v
->name
);
4748 " ATTRIBUTE_UNUSED void *x_p,\n"
4749 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
4750 " ATTRIBUTE_UNUSED void * cookie)\n");
4751 oprintf (d
.of
, "{\n");
4752 d
.prev_val
[0] = d
.prev_val
[1] = d
.prev_val
[2] = d
.val
= v
->name
;
4753 d
.process_field
= write_types_local_process_field
;
4754 d
.have_this_obj
= true;
4755 walk_type (v
->type
, &d
);
4756 oprintf (f
, "}\n\n");
4760 oprintf (f
, "static void gt_%sa_%s (void *);\n", wtd
->prefix
, v
->name
);
4761 oprintf (f
, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
4762 wtd
->prefix
, v
->name
);
4764 d
.prev_val
[0] = d
.prev_val
[1] = d
.prev_val
[2] = d
.val
= v
->name
;
4765 d
.process_field
= write_types_process_field
;
4766 d
.have_this_obj
= false;
4767 walk_type (v
->type
, &d
);
4769 oprintf (f
, "}\n\n");
4772 /* Output a table describing the locations and types of VARIABLES. */
4775 write_roots (pair_p variables
, bool emit_pch
)
4778 struct flist
*flp
= NULL
;
4780 for (v
= variables
; v
; v
= v
->next
)
4783 get_output_file_with_visibility (CONST_CAST (input_file
*,
4786 const char *length
= NULL
;
4787 int deletable_p
= 0;
4789 for (o
= v
->opt
; o
; o
= o
->next
)
4790 if (strcmp (o
->name
, "length") == 0
4791 && o
->kind
== OPTION_STRING
)
4792 length
= o
->info
.string
;
4793 else if (strcmp (o
->name
, "deletable") == 0)
4795 else if (strcmp (o
->name
, "param_is") == 0)
4797 else if (strncmp (o
->name
, "param", 5) == 0
4798 && ISDIGIT (o
->name
[5]) && strcmp (o
->name
+ 6, "_is") == 0)
4800 else if (strcmp (o
->name
, "if_marked") == 0)
4803 error_at_line (&v
->line
,
4804 "global `%s' has unknown option `%s'",
4807 for (fli
= flp
; fli
; fli
= fli
->next
)
4808 if (fli
->f
== f
&& f
)
4812 fli
= XNEW (struct flist
);
4816 fli
->file
= v
->line
.file
;
4817 gcc_assert (fli
->file
);
4820 oprintf (f
, "\n/* GC roots. */\n\n");
4825 && v
->type
->kind
== TYPE_POINTER
4826 && (v
->type
->u
.p
->kind
== TYPE_POINTER
4827 || v
->type
->u
.p
->kind
== TYPE_STRUCT
))
4829 write_array (f
, v
, &ggc_wtd
);
4830 write_array (f
, v
, &pch_wtd
);
4834 for (v
= variables
; v
; v
= v
->next
)
4836 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4843 for (o
= v
->opt
; o
; o
= o
->next
)
4844 if (strcmp (o
->name
, "length") == 0)
4846 else if (strcmp (o
->name
, "deletable") == 0
4847 || strcmp (o
->name
, "if_marked") == 0)
4853 for (fli
= flp
; fli
; fli
= fli
->next
)
4856 if (!fli
->started_p
)
4860 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
4861 put_mangled_filename (f
, v
->line
.file
);
4862 oprintf (f
, "[] = {\n");
4865 write_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
, emit_pch
);
4868 finish_root_table (flp
, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4871 for (v
= variables
; v
; v
= v
->next
)
4873 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4879 for (o
= v
->opt
; o
; o
= o
->next
)
4880 if (strcmp (o
->name
, "deletable") == 0)
4882 else if (strcmp (o
->name
, "if_marked") == 0)
4888 for (fli
= flp
; fli
; fli
= fli
->next
)
4891 if (!fli
->started_p
)
4895 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
4896 put_mangled_filename (f
, v
->line
.file
);
4897 oprintf (f
, "[] = {\n");
4900 oprintf (f
, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
4904 finish_root_table (flp
, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4905 "gt_ggc_deletable_rtab");
4907 for (v
= variables
; v
; v
= v
->next
)
4909 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4912 const char *if_marked
= NULL
;
4916 for (o
= v
->opt
; o
; o
= o
->next
)
4917 if (strcmp (o
->name
, "length") == 0)
4919 else if (strcmp (o
->name
, "if_marked") == 0
4920 && o
->kind
== OPTION_STRING
)
4921 if_marked
= o
->info
.string
;
4922 if (if_marked
== NULL
)
4924 if (v
->type
->kind
!= TYPE_POINTER
4925 || v
->type
->u
.p
->kind
!= TYPE_PARAM_STRUCT
4926 || v
->type
->u
.p
->u
.param_struct
.stru
!= find_structure ("htab",
4929 error_at_line (&v
->line
,
4930 "if_marked option used but not hash table");
4934 for (fli
= flp
; fli
; fli
= fli
->next
)
4937 if (!fli
->started_p
)
4941 oprintf (f
, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
4942 put_mangled_filename (f
, v
->line
.file
);
4943 oprintf (f
, "[] = {\n");
4946 write_root (f
, v
, v
->type
->u
.p
->u
.param_struct
.param
[0],
4947 v
->name
, length_p
, &v
->line
, if_marked
, emit_pch
);
4950 finish_root_table (flp
, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
4951 "gt_ggc_cache_rtab");
4956 for (v
= variables
; v
; v
= v
->next
)
4958 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4962 int if_marked_p
= 0;
4965 for (o
= v
->opt
; o
; o
= o
->next
)
4966 if (strcmp (o
->name
, "length") == 0)
4968 else if (strcmp (o
->name
, "if_marked") == 0)
4974 for (fli
= flp
; fli
; fli
= fli
->next
)
4977 if (!fli
->started_p
)
4981 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
4982 put_mangled_filename (f
, v
->line
.file
);
4983 oprintf (f
, "[] = {\n");
4986 write_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
, emit_pch
);
4989 finish_root_table (flp
, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4990 "gt_pch_cache_rtab");
4992 for (v
= variables
; v
; v
= v
->next
)
4994 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
5000 for (o
= v
->opt
; o
; o
= o
->next
)
5001 if (strcmp (o
->name
, "deletable") == 0
5002 || strcmp (o
->name
, "if_marked") == 0)
5011 if (!contains_scalar_p (v
->type
))
5014 for (fli
= flp
; fli
; fli
= fli
->next
)
5017 if (!fli
->started_p
)
5021 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
5022 put_mangled_filename (f
, v
->line
.file
);
5023 oprintf (f
, "[] = {\n");
5026 oprintf (f
, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
5030 finish_root_table (flp
, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
5031 "gt_pch_scalar_rtab");
5034 /* Prints not-as-ugly version of a typename of T to OF. Trades the uniquness
5035 guaranteee for somewhat increased readability. If name conflicts do happen,
5036 this funcion will have to be adjusted to be more like
5037 output_mangled_typename. */
5040 output_typename (outf_p of
, const_type_p t
)
5045 oprintf (of
, "str");
5048 oprintf (of
, "scalar");
5051 output_typename (of
, t
->u
.p
);
5054 case TYPE_USER_STRUCT
:
5056 case TYPE_LANG_STRUCT
:
5057 oprintf (of
, "%s", t
->u
.s
.tag
);
5059 case TYPE_PARAM_STRUCT
:
5062 for (i
= 0; i
< NUM_PARAM
; i
++)
5063 if (t
->u
.param_struct
.param
[i
] != NULL
)
5065 output_typename (of
, t
->u
.param_struct
.param
[i
]);
5068 output_typename (of
, t
->u
.param_struct
.stru
);
5072 case TYPE_UNDEFINED
:
5078 /* Writes a typed GC allocator for type S that is suitable as a callback for
5079 the splay tree implementation in libiberty. */
5082 write_splay_tree_allocator_def (const_type_p s
)
5084 outf_p of
= get_output_file_with_visibility (NULL
);
5085 oprintf (of
, "void * ggc_alloc_splay_tree_");
5086 output_typename (of
, s
);
5087 oprintf (of
, " (int sz, void * nl)\n");
5088 oprintf (of
, "{\n");
5089 oprintf (of
, " return ggc_splay_alloc (sz, nl);\n");
5090 oprintf (of
, "}\n\n");
5093 /* Writes typed GC allocators for PARAM_STRUCTS that are suitable as callbacks
5094 for the splay tree implementation in libiberty. */
5097 write_splay_tree_allocators (const_type_p param_structs
)
5101 oprintf (header_file
, "\n/* Splay tree callback allocators. */\n");
5102 for (s
= param_structs
; s
; s
= s
->next
)
5103 if (s
->gc_used
== GC_POINTED_TO
)
5105 oprintf (header_file
, "extern void * ggc_alloc_splay_tree_");
5106 output_typename (header_file
, s
);
5107 oprintf (header_file
, " (int, void *);\n");
5108 write_splay_tree_allocator_def (s
);
5114 /* Dumps the value of typekind KIND. */
5117 dump_typekind (int indent
, enum typekind kind
)
5119 printf ("%*ckind = ", indent
, ' ');
5123 printf ("TYPE_SCALAR");
5126 printf ("TYPE_STRING");
5129 printf ("TYPE_STRUCT");
5131 case TYPE_UNDEFINED
:
5132 printf ("TYPE_UNDEFINED");
5134 case TYPE_USER_STRUCT
:
5135 printf ("TYPE_USER_STRUCT");
5138 printf ("TYPE_UNION");
5141 printf ("TYPE_POINTER");
5144 printf ("TYPE_ARRAY");
5146 case TYPE_LANG_STRUCT
:
5147 printf ("TYPE_LANG_STRUCT");
5149 case TYPE_PARAM_STRUCT
:
5150 printf ("TYPE_PARAM_STRUCT");
5158 /* Dumps the value of GC_USED flag. */
5161 dump_gc_used (int indent
, enum gc_used_enum gc_used
)
5163 printf ("%*cgc_used = ", indent
, ' ');
5167 printf ("GC_UNUSED");
5172 case GC_MAYBE_POINTED_TO
:
5173 printf ("GC_MAYBE_POINTED_TO");
5176 printf ("GC_POINTED_TO");
5184 /* Dumps the type options OPT. */
5187 dump_options (int indent
, options_p opt
)
5190 printf ("%*coptions = ", indent
, ' ');
5197 printf ("%s:string %s ", o
->name
, o
->info
.string
);
5200 printf ("%s:type ", o
->name
);
5201 dump_type (indent
+1, o
->info
.type
);
5204 printf ("%s:nested ", o
->name
);
5214 /* Dumps the source file location in LINE. */
5217 dump_fileloc (int indent
, struct fileloc line
)
5219 printf ("%*cfileloc: file = %s, line = %d\n", indent
, ' ',
5220 get_input_file_name (line
.file
),
5224 /* Recursively dumps the struct, union, or a language-specific
5228 dump_type_u_s (int indent
, type_p t
)
5232 gcc_assert (union_or_struct_p (t
));
5233 printf ("%*cu.s.tag = %s\n", indent
, ' ', t
->u
.s
.tag
);
5234 dump_fileloc (indent
, t
->u
.s
.line
);
5235 printf ("%*cu.s.fields =\n", indent
, ' ');
5236 fields
= t
->u
.s
.fields
;
5239 dump_pair (indent
+ INDENT
, fields
);
5240 fields
= fields
->next
;
5242 printf ("%*cend of fields of type %p\n", indent
, ' ', (void *) t
);
5243 dump_options (indent
, t
->u
.s
.opt
);
5244 printf ("%*cu.s.bitmap = %X\n", indent
, ' ', t
->u
.s
.bitmap
);
5245 if (t
->kind
== TYPE_LANG_STRUCT
)
5247 printf ("%*cu.s.lang_struct:\n", indent
, ' ');
5248 dump_type_list (indent
+ INDENT
, t
->u
.s
.lang_struct
);
5252 /* Recursively dumps the array T. */
5255 dump_type_u_a (int indent
, type_p t
)
5257 gcc_assert (t
->kind
== TYPE_ARRAY
);
5258 printf ("%*clen = %s, u.a.p:\n", indent
, ' ', t
->u
.a
.len
);
5259 dump_type_list (indent
+ INDENT
, t
->u
.a
.p
);
5262 /* Recursively dumps the parameterized struct T. */
5265 dump_type_u_param_struct (int indent
, type_p t
)
5268 gcc_assert (t
->kind
== TYPE_PARAM_STRUCT
);
5269 printf ("%*cu.param_struct.stru:\n", indent
, ' ');
5270 dump_type_list (indent
, t
->u
.param_struct
.stru
);
5271 dump_fileloc (indent
, t
->u
.param_struct
.line
);
5272 for (i
= 0; i
< NUM_PARAM
; i
++)
5274 if (t
->u
.param_struct
.param
[i
] == NULL
)
5276 printf ("%*cu.param_struct.param[%d]:\n", indent
, ' ', i
);
5277 dump_type (indent
+ INDENT
, t
->u
.param_struct
.param
[i
]);
5281 /* Recursively dumps the type list T. */
5284 dump_type_list (int indent
, type_p t
)
5289 dump_type (indent
, p
);
5294 static htab_t seen_types
;
5296 /* Recursively dumps the type T if it was not dumped previously. */
5299 dump_type (int indent
, type_p t
)
5303 if (seen_types
== NULL
)
5304 seen_types
= htab_create (100, htab_hash_pointer
, htab_eq_pointer
, NULL
);
5306 printf ("%*cType at %p: ", indent
, ' ', (void *) t
);
5307 slot
= htab_find_slot (seen_types
, t
, INSERT
);
5310 printf ("already seen.\n");
5316 dump_typekind (indent
, t
->kind
);
5317 printf ("%*cpointer_to = %p\n", indent
+ INDENT
, ' ',
5318 (void *) t
->pointer_to
);
5319 dump_gc_used (indent
+ INDENT
, t
->gc_used
);
5323 printf ("%*cscalar_is_char = %s\n", indent
+ INDENT
, ' ',
5324 t
->u
.scalar_is_char
? "true" : "false");
5330 case TYPE_LANG_STRUCT
:
5331 case TYPE_USER_STRUCT
:
5332 dump_type_u_s (indent
+ INDENT
, t
);
5335 printf ("%*cp:\n", indent
+ INDENT
, ' ');
5336 dump_type (indent
+ INDENT
, t
->u
.p
);
5339 dump_type_u_a (indent
+ INDENT
, t
);
5341 case TYPE_PARAM_STRUCT
:
5342 dump_type_u_param_struct (indent
+ INDENT
, t
);
5347 printf ("%*cEnd of type at %p\n", indent
, ' ', (void *) t
);
5350 /* Dumps the pair P. */
5353 dump_pair (int indent
, pair_p p
)
5355 printf ("%*cpair: name = %s\n", indent
, ' ', p
->name
);
5356 dump_type (indent
, p
->type
);
5357 dump_fileloc (indent
, p
->line
);
5358 dump_options (indent
, p
->opt
);
5359 printf ("%*cEnd of pair %s\n", indent
, ' ', p
->name
);
5362 /* Dumps the list of pairs PP. */
5365 dump_pair_list (const char *name
, pair_p pp
)
5368 printf ("%s:\n", name
);
5369 for (p
= pp
; p
!= NULL
; p
= p
->next
)
5371 printf ("End of %s\n\n", name
);
5374 /* Dumps the STRUCTURES. */
5377 dump_structures (const char *name
, type_p structures
)
5379 printf ("%s:\n", name
);
5380 dump_type_list (0, structures
);
5381 printf ("End of %s\n\n", name
);
5384 /* Dumps the internal structures of gengtype. This is useful to debug
5385 gengtype itself, or to understand what it does, e.g. for plugin
5389 dump_everything (void)
5391 dump_pair_list ("typedefs", typedefs
);
5392 dump_structures ("structures", structures
);
5393 dump_structures ("param_structs", param_structs
);
5394 dump_pair_list ("variables", variables
);
5396 /* Allocated with the first call to dump_type. */
5397 htab_delete (seen_types
);
5402 /* Option specification for getopt_long. */
5403 static const struct option gengtype_long_options
[] = {
5404 {"help", no_argument
, NULL
, 'h'},
5405 {"version", no_argument
, NULL
, 'V'},
5406 {"verbose", no_argument
, NULL
, 'v'},
5407 {"dump", no_argument
, NULL
, 'd'},
5408 {"debug", no_argument
, NULL
, 'D'},
5409 {"plugin", required_argument
, NULL
, 'P'},
5410 {"srcdir", required_argument
, NULL
, 'S'},
5411 {"backupdir", required_argument
, NULL
, 'B'},
5412 {"inputs", required_argument
, NULL
, 'I'},
5413 {"read-state", required_argument
, NULL
, 'r'},
5414 {"write-state", required_argument
, NULL
, 'w'},
5415 /* Terminating NULL placeholder. */
5416 {NULL
, no_argument
, NULL
, 0},
5423 printf ("Usage: %s\n", progname
);
5424 printf ("\t -h | --help " " \t# Give this help.\n");
5425 printf ("\t -D | --debug "
5426 " \t# Give debug output to debug %s itself.\n", progname
);
5427 printf ("\t -V | --version " " \t# Give version information.\n");
5428 printf ("\t -v | --verbose \t# Increase verbosity. Can be given several times.\n");
5429 printf ("\t -d | --dump " " \t# Dump state for debugging.\n");
5430 printf ("\t -P | --plugin <output-file> <plugin-src> ... "
5431 " \t# Generate for plugin.\n");
5432 printf ("\t -S | --srcdir <GCC-directory> "
5433 " \t# Specify the GCC source directory.\n");
5434 printf ("\t -B | --backupdir <directory> "
5435 " \t# Specify the backup directory for updated files.\n");
5436 printf ("\t -I | --inputs <input-list> "
5437 " \t# Specify the file with source files list.\n");
5438 printf ("\t -w | --write-state <state-file> " " \t# Write a state file.\n");
5439 printf ("\t -r | --read-state <state-file> " " \t# Read a state file.\n");
5443 print_version (void)
5445 printf ("%s %s%s\n", progname
, pkgversion_string
, version_string
);
5446 printf ("Report bugs: %s\n", bug_report_url
);
5449 /* Parse the program options using getopt_long... */
5451 parse_program_options (int argc
, char **argv
)
5454 while ((opt
= getopt_long (argc
, argv
, "hVvdP:S:B:I:w:r:D",
5455 gengtype_long_options
, NULL
)) >= 0)
5459 case 'h': /* --help */
5462 case 'V': /* --version */
5465 case 'd': /* --dump */
5468 case 'D': /* --debug */
5471 case 'v': /* --verbose */
5474 case 'P': /* --plugin */
5476 plugin_output_filename
= optarg
;
5478 fatal ("missing plugin output file name");
5480 case 'S': /* --srcdir */
5484 fatal ("missing source directory");
5485 srcdir_len
= strlen (srcdir
);
5487 case 'B': /* --backupdir */
5489 backup_dir
= optarg
;
5491 fatal ("missing backup directory");
5493 case 'I': /* --inputs */
5497 fatal ("missing input list");
5499 case 'r': /* --read-state */
5501 read_state_filename
= optarg
;
5503 fatal ("missing read state file");
5504 DBGPRINTF ("read state %s\n", optarg
);
5506 case 'w': /* --write-state */
5507 DBGPRINTF ("write state %s\n", optarg
);
5509 write_state_filename
= optarg
;
5511 fatal ("missing write state file");
5514 fprintf (stderr
, "%s: unknown flag '%c'\n", progname
, opt
);
5516 fatal ("unexpected flag");
5519 if (plugin_output_filename
)
5521 /* In plugin mode we require some input files. */
5524 fatal ("no source files given in plugin mode");
5525 nb_plugin_files
= argc
- optind
;
5526 plugin_files
= XNEWVEC (input_file
*, nb_plugin_files
);
5527 for (i
= 0; i
< (int) nb_plugin_files
; i
++)
5529 char *name
= argv
[i
+ optind
];
5530 plugin_files
[i
] = input_file_by_name (name
);
5537 /******* Manage input files. ******/
5539 /* Hash table of unique input file names. */
5540 static htab_t input_file_htab
;
5542 /* Find or allocate a new input_file by hash-consing it. */
5544 input_file_by_name (const char* name
)
5547 input_file
* f
= NULL
;
5551 namlen
= strlen (name
);
5552 f
= XCNEWVAR (input_file
, sizeof (input_file
)+namlen
+2);
5555 f
->inpisplugin
= false;
5556 strcpy (f
->inpname
, name
);
5557 slot
= htab_find_slot (input_file_htab
, f
, INSERT
);
5558 gcc_assert (slot
!= NULL
);
5561 /* Already known input file. */
5563 return (input_file
*)(*slot
);
5565 /* New input file. */
5570 /* Hash table support routines for input_file-s. */
5572 htab_hash_inputfile (const void *p
)
5574 const input_file
*inpf
= (const input_file
*) p
;
5576 return htab_hash_string (get_input_file_name (inpf
));
5580 htab_eq_inputfile (const void *x
, const void *y
)
5582 const input_file
*inpfx
= (const input_file
*) x
;
5583 const input_file
*inpfy
= (const input_file
*) y
;
5584 gcc_assert (inpfx
!= NULL
&& inpfy
!= NULL
);
5585 return !filename_cmp (get_input_file_name (inpfx
), get_input_file_name (inpfy
));
5590 main (int argc
, char **argv
)
5593 static struct fileloc pos
= { NULL
, 0 };
5594 outf_p output_header
;
5596 /* Mandatory common initializations. */
5597 progname
= "gengtype"; /* For fatal and messages. */
5598 /* Create the hash-table used to hash-cons input files. */
5600 htab_create (800, htab_hash_inputfile
, htab_eq_inputfile
, NULL
);
5601 /* Initialize our special input files. */
5602 this_file
= input_file_by_name (__FILE__
);
5603 system_h_file
= input_file_by_name ("system.h");
5604 /* Set the scalar_is_char union number for predefined scalar types. */
5605 scalar_nonchar
.u
.scalar_is_char
= FALSE
;
5606 scalar_char
.u
.scalar_is_char
= TRUE
;
5608 parse_program_options (argc
, argv
);
5613 time_t now
= (time_t) 0;
5615 DBGPRINTF ("gengtype started pid %d at %s",
5616 (int) getpid (), ctime (&now
));
5618 #endif /* ENABLE_CHECKING */
5620 /* Parse the input list and the input files. */
5621 DBGPRINTF ("inputlist %s", inputlist
);
5622 if (read_state_filename
)
5625 fatal ("input list %s cannot be given with a read state file %s",
5626 inputlist
, read_state_filename
);
5627 read_state (read_state_filename
);
5628 DBGPRINT_COUNT_TYPE ("structures after read_state", structures
);
5629 DBGPRINT_COUNT_TYPE ("param_structs after read_state", param_structs
);
5633 /* These types are set up with #define or else outside of where
5634 we can see them. We should initialize them before calling
5636 #define POS_HERE(Call) do { pos.file = this_file; pos.line = __LINE__; \
5638 POS_HERE (do_scalar_typedef ("CUMULATIVE_ARGS", &pos
));
5639 POS_HERE (do_scalar_typedef ("REAL_VALUE_TYPE", &pos
));
5640 POS_HERE (do_scalar_typedef ("FIXED_VALUE_TYPE", &pos
));
5641 POS_HERE (do_scalar_typedef ("double_int", &pos
));
5642 POS_HERE (do_scalar_typedef ("offset_int", &pos
));
5643 POS_HERE (do_scalar_typedef ("widest_int", &pos
));
5644 POS_HERE (do_scalar_typedef ("int64_t", &pos
));
5645 POS_HERE (do_scalar_typedef ("uint64_t", &pos
));
5646 POS_HERE (do_scalar_typedef ("uint8", &pos
));
5647 POS_HERE (do_scalar_typedef ("uintptr_t", &pos
));
5648 POS_HERE (do_scalar_typedef ("jword", &pos
));
5649 POS_HERE (do_scalar_typedef ("JCF_u2", &pos
));
5650 POS_HERE (do_scalar_typedef ("void", &pos
));
5651 POS_HERE (do_typedef ("PTR",
5652 create_pointer (resolve_typedef ("void", &pos
)),
5655 read_input_list (inputlist
);
5656 for (i
= 0; i
< num_gt_files
; i
++)
5658 parse_file (get_input_file_name (gt_files
[i
]));
5659 DBGPRINTF ("parsed file #%d %s",
5660 (int) i
, get_input_file_name (gt_files
[i
]));
5662 if (verbosity_level
>= 1)
5663 printf ("%s parsed %d files with %d GTY types\n",
5664 progname
, (int) num_gt_files
, type_count
);
5666 DBGPRINT_COUNT_TYPE ("structures after parsing", structures
);
5667 DBGPRINT_COUNT_TYPE ("param_structs after parsing", param_structs
);
5671 fatal ("either an input list or a read state file should be given");
5676 if (plugin_output_filename
)
5679 /* In plugin mode, we should have read a state file, and have
5680 given at least one plugin file. */
5681 if (!read_state_filename
)
5682 fatal ("No read state given in plugin mode for %s",
5683 plugin_output_filename
);
5685 if (nb_plugin_files
== 0 || !plugin_files
)
5686 fatal ("No plugin files given in plugin mode for %s",
5687 plugin_output_filename
);
5689 /* Parse our plugin files and augment the state. */
5690 for (ix
= 0; ix
< nb_plugin_files
; ix
++)
5692 input_file
* pluginput
= plugin_files
[ix
];
5693 pluginput
->inpisplugin
= true;
5694 parse_file (get_input_file_name (pluginput
));
5699 plugin_output
= create_file ("GCC", plugin_output_filename
);
5700 DBGPRINTF ("created plugin_output %p named %s",
5701 (void *) plugin_output
, plugin_output
->name
);
5704 { /* No plugin files, we are in normal mode. */
5706 fatal ("gengtype needs a source directory in normal mode");
5713 /* The call to set_gc_used may indirectly call find_param_structure
5714 hence enlarge the param_structs list of types. */
5715 set_gc_used (variables
);
5717 for (type_p t
= structures
; t
; t
= t
->next
)
5719 bool for_user
= false;
5720 for (options_p o
= t
->u
.s
.opt
; o
; o
= o
->next
)
5721 if (strcmp (o
->name
, "for_user") == 0)
5728 set_gc_used_type (t
, GC_POINTED_TO
, NULL
);
5730 /* The state at this point is read from the state input file or by
5731 parsing source files and optionally augmented by parsing plugin
5732 source files. Write it now. */
5733 if (write_state_filename
)
5735 DBGPRINT_COUNT_TYPE ("structures before write_state", structures
);
5736 DBGPRINT_COUNT_TYPE ("param_structs before write_state", param_structs
);
5739 fatal ("didn't write state file %s after errors",
5740 write_state_filename
);
5742 DBGPRINTF ("before write_state %s", write_state_filename
);
5743 write_state (write_state_filename
);
5748 /* After having written the state file we return immediately to
5749 avoid generating any output file. */
5759 output_header
= plugin_output
? plugin_output
: header_file
;
5760 DBGPRINT_COUNT_TYPE ("structures before write_types outputheader",
5762 DBGPRINT_COUNT_TYPE ("param_structs before write_types outputheader",
5765 write_types (output_header
, structures
, param_structs
, &ggc_wtd
);
5766 if (plugin_files
== NULL
)
5768 DBGPRINT_COUNT_TYPE ("structures before write_types headerfil",
5770 DBGPRINT_COUNT_TYPE ("param_structs before write_types headerfil",
5772 write_types (header_file
, structures
, param_structs
, &pch_wtd
);
5773 write_local (header_file
, structures
, param_structs
);
5775 write_splay_tree_allocators (param_structs
);
5776 write_roots (variables
, plugin_files
== NULL
);
5778 close_output_files ();
5783 /* Don't bother about free-ing any input or plugin file, etc. */