1 /* Process source files and output type information.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
28 #include "errors.h" /* for fatal */
30 #include "double-int.h"
31 #include "version.h" /* for version_string & pkgversion_string. */
36 #include "filenames.h"
38 /* Data types, macros, etc. used only in this file. */
41 /* The list of output files. */
44 /* The output header file that is included into pretty much every
49 /* The name of the file containing the list of input files. */
50 static char *inputlist
;
52 /* The plugin input files and their number; in that case only
53 a single file is produced. */
54 static input_file
**plugin_files
;
55 static size_t nb_plugin_files
;
57 /* The generated plugin output file and name. */
58 static outf_p plugin_output
;
59 static char *plugin_output_filename
;
61 /* Our source directory and its length. */
65 /* Variables used for reading and writing the state. */
66 const char *read_state_filename
;
67 const char *write_state_filename
;
69 /* Variables to help debugging. */
73 /* Level for verbose messages. */
76 /* We have a type count and use it to set the state_number of newly
77 allocated types to some unique negative number. */
78 static int type_count
;
80 /* The backup directory should be in the same file system as the
81 generated files, otherwise the rename(2) system call would fail.
82 If NULL, no backup is made when overwriting a generated file. */
83 static const char* backup_dir
; /* (-B) program option. */
86 static outf_p
create_file (const char *, const char *);
88 static const char *get_file_basename (const input_file
*);
89 static const char *get_file_realbasename (const input_file
*);
91 static int get_prefix_langdir_index (const char *);
92 static const char *get_file_langdir (const input_file
*);
94 static void dump_pair (int indent
, pair_p p
);
95 static void dump_type (int indent
, type_p p
);
96 static void dump_type_list (int indent
, type_p p
);
99 /* Nonzero iff an error has occurred. */
100 bool hit_error
= false;
102 static void gen_rtx_next (void);
103 static void write_rtx_next (void);
104 static void open_base_files (void);
105 static void close_output_files (void);
107 /* Report an error at POS, printing MSG. */
110 error_at_line (const struct fileloc
*pos
, const char *msg
, ...)
114 gcc_assert (pos
!= NULL
&& pos
->file
!= NULL
);
117 fprintf (stderr
, "%s:%d: ", get_input_file_name (pos
->file
), pos
->line
);
118 vfprintf (stderr
, msg
, ap
);
119 fputc ('\n', stderr
);
125 /* asprintf, but produces fatal message on out-of-memory. */
127 xasprintf (const char *format
, ...)
133 va_start (ap
, format
);
134 n
= vasprintf (&result
, format
, ap
);
135 if (result
== NULL
|| n
< 0)
136 fatal ("out of memory");
142 /* Input file handling. */
144 /* Table of all input files. */
145 const input_file
**gt_files
;
148 /* A number of places use the name of this "gengtype.c" file for a
149 location for things that we can't rely on the source to define.
150 Make sure we can still use pointer comparison on filenames. */
151 input_file
* this_file
;
152 /* The "system.h" file is likewise specially useful. */
153 input_file
* system_h_file
;
155 /* Vector of per-language directories. */
156 const char **lang_dir_names
;
157 size_t num_lang_dirs
;
159 /* An array of output files suitable for definitions. There is one
160 BASE_FILES entry for each language. */
161 static outf_p
*base_files
;
166 /* Utility debugging function, printing the various type counts within
167 a list of types. Called through the DBGPRINT_COUNT_TYPE macro. */
169 dbgprint_count_type_at (const char *fil
, int lin
, const char *msg
, type_p t
)
171 int nb_types
= 0, nb_scalar
= 0, nb_string
= 0;
172 int nb_struct
= 0, nb_union
= 0, nb_array
= 0, nb_pointer
= 0;
173 int nb_lang_struct
= 0, nb_param_struct
= 0;
174 int nb_user_struct
= 0, nb_undefined
= 0;
176 for (p
= t
; p
; p
= p
->next
)
192 case TYPE_USER_STRUCT
:
204 case TYPE_LANG_STRUCT
:
207 case TYPE_PARAM_STRUCT
:
214 fprintf (stderr
, "\n" "%s:%d: %s: @@%%@@ %d types ::\n",
215 lbasename (fil
), lin
, msg
, nb_types
);
216 if (nb_scalar
> 0 || nb_string
> 0)
217 fprintf (stderr
, "@@%%@@ %d scalars, %d strings\n", nb_scalar
, nb_string
);
218 if (nb_struct
> 0 || nb_union
> 0)
219 fprintf (stderr
, "@@%%@@ %d structs, %d unions\n", nb_struct
, nb_union
);
220 if (nb_pointer
> 0 || nb_array
> 0)
221 fprintf (stderr
, "@@%%@@ %d pointers, %d arrays\n", nb_pointer
, nb_array
);
222 if (nb_lang_struct
> 0 || nb_param_struct
> 0)
223 fprintf (stderr
, "@@%%@@ %d lang_structs, %d param_structs\n",
224 nb_lang_struct
, nb_param_struct
);
225 if (nb_user_struct
> 0)
226 fprintf (stderr
, "@@%%@@ %d user_structs\n", nb_user_struct
);
227 if (nb_undefined
> 0)
228 fprintf (stderr
, "@@%%@@ %d undefined types\n", nb_undefined
);
229 fprintf (stderr
, "\n");
231 #endif /* ENABLE_CHECKING */
233 /* Scan the input file, LIST, and determine how much space we need to
234 store strings in. Also, count the number of language directories
235 and files. The numbers returned are overestimates as they does not
236 consider repeated files. */
238 measure_input_list (FILE *list
)
244 num_gt_files
= plugin_files
? nb_plugin_files
: 0;
245 while ((c
= getc (list
)) != EOF
)
254 /* Add space for a lang_bitmap before the input file name. */
255 n
+= sizeof (lang_bitmap
);
269 /* Read one input line from LIST to HEREP (which is updated). A
270 pointer to the string is returned via LINEP. If it was a language
271 subdirectory in square brackets, strip off the square brackets and
272 return true. Otherwise, leave space before the string for a
273 lang_bitmap, and return false. At EOF, returns false, does not
274 touch *HEREP, and sets *LINEP to NULL. POS is used for
277 read_input_line (FILE *list
, char **herep
, char **linep
, struct fileloc
*pos
)
283 /* Read over whitespace. */
284 while (c
== '\n' || c
== ' ')
294 /* No space for a lang_bitmap is necessary. Discard the '['. */
297 while (c
!= ']' && c
!= '\n' && c
!= EOF
)
306 c
= getc (list
); /* eat what should be a newline */
307 if (c
!= '\n' && c
!= EOF
)
308 error_at_line (pos
, "junk on line after language tag [%s]", line
);
311 error_at_line (pos
, "missing close bracket for language tag [%s",
320 /* Leave space for a lang_bitmap. */
321 memset (here
, 0, sizeof (lang_bitmap
));
322 here
+= sizeof (lang_bitmap
);
329 while (c
!= EOF
&& c
!= '\n');
337 /* Read the list of input files from LIST and compute all of the
338 relevant tables. There is one file per line of the list. At
339 first, all the files on the list are language-generic, but
340 eventually a line will appear which is the name of a language
341 subdirectory in square brackets, like this: [cp]. All subsequent
342 files are specific to that language, until another language
343 subdirectory tag appears. Files can appear more than once, if
344 they apply to more than one language. */
346 read_input_list (const char *listname
)
348 FILE *list
= fopen (listname
, "r");
350 fatal ("cannot open %s: %s", listname
, xstrerror (errno
));
354 size_t bufsz
= measure_input_list (list
);
355 char *buf
= XNEWVEC (char, bufsz
);
357 char *committed
= buf
;
358 char *limit
= buf
+ bufsz
;
363 lang_bitmap curlangs
= (1 << num_lang_dirs
) - 1;
365 epos
.file
= input_file_by_name (listname
);
368 lang_dir_names
= XNEWVEC (const char *, num_lang_dirs
);
369 gt_files
= XNEWVEC (const input_file
*, num_gt_files
);
376 is_language
= read_input_line (list
, &here
, &line
, &epos
);
377 gcc_assert (here
<= limit
);
380 else if (is_language
)
383 gcc_assert (langno
<= num_lang_dirs
);
384 for (i
= 0; i
< langno
; i
++)
385 if (strcmp (lang_dir_names
[i
], line
) == 0)
387 error_at_line (&epos
, "duplicate language tag [%s]",
394 curlangs
= 1 << langno
;
395 lang_dir_names
[langno
++] = line
;
400 input_file
*inpf
= input_file_by_name (line
);
401 gcc_assert (nfiles
<= num_gt_files
);
402 for (i
= 0; i
< nfiles
; i
++)
403 /* Since the input_file-s are uniquely hash-consed, we
404 can just compare pointers! */
405 if (gt_files
[i
] == inpf
)
407 /* Throw away the string we just read, and add the
408 current language to the existing string's bitmap. */
409 lang_bitmap bmap
= get_lang_bitmap (inpf
);
411 error_at_line (&epos
,
412 "file %s specified more than once "
413 "for language %s", line
,
415 0 ? "(all)" : lang_dir_names
[langno
-
419 set_lang_bitmap (inpf
, bmap
);
424 set_lang_bitmap (inpf
, curlangs
);
425 gt_files
[nfiles
++] = inpf
;
428 /* Update the global counts now that we know accurately how many
429 things there are. (We do not bother resizing the arrays down.) */
430 num_lang_dirs
= langno
;
431 /* Add the plugin files if provided. */
435 for (i
= 0; i
< nb_plugin_files
; i
++)
436 gt_files
[nfiles
++] = plugin_files
[i
];
438 num_gt_files
= nfiles
;
441 /* Sanity check: any file that resides in a language subdirectory
442 (e.g. 'cp') ought to belong to the corresponding language.
443 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
444 (Can you even do that? Should you be allowed to?) */
447 for (f
= 0; f
< num_gt_files
; f
++)
449 lang_bitmap bitmap
= get_lang_bitmap (gt_files
[f
]);
450 const char *basename
= get_file_basename (gt_files
[f
]);
451 const char *slashpos
= strchr (basename
, '/');
452 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
453 const char *slashpos2
= strchr (basename
, '\\');
455 if (!slashpos
|| (slashpos2
&& slashpos2
< slashpos
))
456 slashpos
= slashpos2
;
462 for (l
= 0; l
< num_lang_dirs
; l
++)
463 if ((size_t) (slashpos
- basename
) == strlen (lang_dir_names
[l
])
464 && memcmp (basename
, lang_dir_names
[l
],
465 strlen (lang_dir_names
[l
])) == 0)
467 if (!(bitmap
& (1 << l
)))
468 error ("%s is in language directory '%s' but is not "
469 "tagged for that language",
470 basename
, lang_dir_names
[l
]);
478 fatal ("error reading %s: %s", listname
, xstrerror (errno
));
485 /* The one and only TYPE_STRING. */
487 struct type string_type
= {
488 TYPE_STRING
, 0, 0, 0, GC_USED
, {0}
491 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
492 set early in main. */
494 struct type scalar_nonchar
= {
495 TYPE_SCALAR
, 0, 0, 0, GC_USED
, {0}
498 struct type scalar_char
= {
499 TYPE_SCALAR
, 0, 0, 0, GC_USED
, {0}
502 /* Lists of various things. */
504 pair_p typedefs
= NULL
;
505 type_p structures
= NULL
;
506 type_p param_structs
= NULL
;
507 pair_p variables
= NULL
;
509 static type_p
find_param_structure (type_p t
, type_p param
[NUM_PARAM
]);
510 static type_p
adjust_field_tree_exp (type_p t
, options_p opt
);
511 static type_p
adjust_field_rtx_def (type_p t
, options_p opt
);
513 /* Define S as a typedef to T at POS. */
516 do_typedef (const char *s
, type_p t
, struct fileloc
*pos
)
520 /* temporary kludge - gengtype doesn't handle conditionals or
521 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
522 is coming from this file (main() sets them up with safe dummy
524 if (!strcmp (s
, "CUMULATIVE_ARGS") && pos
->file
!= this_file
)
527 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
528 if (strcmp (p
->name
, s
) == 0)
532 error_at_line (pos
, "type `%s' previously defined", s
);
533 error_at_line (&p
->line
, "previously defined here");
538 p
= XNEW (struct pair
);
547 /* Define S as a typename of a scalar. Cannot be used to define
548 typedefs of 'char'. Note: is also used for pointer-to-function
549 typedefs (which are therefore not treated as pointers). */
552 do_scalar_typedef (const char *s
, struct fileloc
*pos
)
554 do_typedef (s
, &scalar_nonchar
, pos
);
558 /* Define TYPE_NAME to be a user defined type at location POS. */
561 create_user_defined_type (const char *type_name
, struct fileloc
*pos
)
563 type_p ty
= find_structure (type_name
, TYPE_USER_STRUCT
);
565 ty
->u
.s
.bitmap
= get_lang_bitmap (pos
->file
);
566 do_typedef (type_name
, ty
, pos
);
568 /* If TYPE_NAME specifies a template, create references to the types
569 in the template by pretending that each type is a field of TY.
570 This is needed to make sure that the types referenced by the
571 template are marked as used. */
572 char *str
= xstrdup (type_name
);
573 char *open_bracket
= strchr (str
, '<');
576 /* We only accept simple template declarations (see
577 require_template_declaration), so we only need to parse a
578 comma-separated list of strings, implicitly assumed to
580 char *arg
= open_bracket
+ 1;
581 char *type_id
= strtok (arg
, ",>");
585 /* Create a new field for every type found inside the template
587 const char *field_name
= xstrdup (type_id
);
588 type_p arg_type
= resolve_typedef (field_name
, pos
);
589 fields
= create_field_at (fields
, arg_type
, field_name
, 0, pos
);
590 type_id
= strtok (0, ",>");
593 /* Associate the field list to TY. */
594 ty
->u
.s
.fields
= fields
;
602 /* Given a typedef name S, return its associated type. Return NULL if
603 S is not a registered type name. */
606 type_for_name (const char *s
)
609 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
610 if (strcmp (p
->name
, s
) == 0)
616 /* Create an undefined type with name S and location POS. Return the
617 newly created type. */
620 create_undefined_type (const char *s
, struct fileloc
*pos
)
622 type_p ty
= find_structure (s
, TYPE_UNDEFINED
);
624 ty
->u
.s
.bitmap
= get_lang_bitmap (pos
->file
);
625 do_typedef (s
, ty
, pos
);
630 /* Return the type previously defined for S. Use POS to report errors. */
633 resolve_typedef (const char *s
, struct fileloc
*pos
)
635 bool is_template_instance
= (strchr (s
, '<') != NULL
);
636 type_p p
= type_for_name (s
);
638 /* If we did not find a typedef registered, generate a TYPE_UNDEFINED
639 type for regular type identifiers. If the type identifier S is a
640 template instantiation, however, we treat it as a user defined
643 FIXME, this is actually a limitation in gengtype. Supporting
644 template types and their instances would require keeping separate
645 track of the basic types definition and its instances. This
646 essentially forces all template classes in GC to be marked
649 p
= (is_template_instance
)
650 ? create_user_defined_type (s
, pos
)
651 : create_undefined_type (s
, pos
);
657 /* Create and return a new structure with tag NAME at POS with fields
658 FIELDS and options O. The KIND of structure must be one of
659 TYPE_STRUCT, TYPE_UNION or TYPE_USER_STRUCT. */
662 new_structure (const char *name
, enum typekind kind
, struct fileloc
*pos
,
663 pair_p fields
, options_p o
)
667 lang_bitmap bitmap
= get_lang_bitmap (pos
->file
);
668 bool isunion
= (kind
== TYPE_UNION
);
670 gcc_assert (union_or_struct_p (kind
));
672 for (si
= structures
; si
!= NULL
; si
= si
->next
)
673 if (strcmp (name
, si
->u
.s
.tag
) == 0 && UNION_P (si
) == isunion
)
676 if (si
->kind
== TYPE_LANG_STRUCT
)
680 for (si
= ls
->u
.s
.lang_struct
; si
!= NULL
; si
= si
->next
)
681 if (si
->u
.s
.bitmap
== bitmap
)
684 else if (si
->u
.s
.line
.file
!= NULL
&& si
->u
.s
.bitmap
!= bitmap
)
688 si
= XCNEW (struct type
);
689 memcpy (si
, ls
, sizeof (struct type
));
690 ls
->kind
= TYPE_LANG_STRUCT
;
691 ls
->u
.s
.lang_struct
= si
;
692 ls
->u
.s
.fields
= NULL
;
694 si
->state_number
= -type_count
;
695 si
->pointer_to
= NULL
;
696 si
->u
.s
.lang_struct
= ls
;
701 if (ls
!= NULL
&& s
== NULL
)
704 s
= XCNEW (struct type
);
705 s
->state_number
= -type_count
;
706 s
->next
= ls
->u
.s
.lang_struct
;
707 ls
->u
.s
.lang_struct
= s
;
708 s
->u
.s
.lang_struct
= ls
;
716 s
= XCNEW (struct type
);
717 s
->state_number
= -type_count
;
718 s
->next
= structures
;
722 if (s
->u
.s
.lang_struct
&& (s
->u
.s
.lang_struct
->u
.s
.bitmap
& bitmap
))
724 error_at_line (pos
, "duplicate definition of '%s %s'",
725 isunion
? "union" : "struct", s
->u
.s
.tag
);
726 error_at_line (&s
->u
.s
.line
, "previous definition here");
732 s
->u
.s
.fields
= fields
;
734 s
->u
.s
.bitmap
= bitmap
;
735 if (s
->u
.s
.lang_struct
)
736 s
->u
.s
.lang_struct
->u
.s
.bitmap
|= bitmap
;
741 /* Return the previously-defined structure or union with tag NAME,
742 or a new empty structure or union if none was defined previously.
743 The KIND of structure must be one of TYPE_STRUCT, TYPE_UNION or
747 find_structure (const char *name
, enum typekind kind
)
750 bool isunion
= (kind
== TYPE_UNION
);
752 gcc_assert (kind
== TYPE_UNDEFINED
|| union_or_struct_p (kind
));
754 for (s
= structures
; s
!= NULL
; s
= s
->next
)
755 if (strcmp (name
, s
->u
.s
.tag
) == 0 && UNION_P (s
) == isunion
)
759 s
= XCNEW (struct type
);
760 s
->next
= structures
;
761 s
->state_number
= -type_count
;
769 /* Return the previously-defined parameterized structure for structure
770 T and parameters PARAM, or a new parameterized empty structure or
771 union if none was defined previously. */
774 find_param_structure (type_p t
, type_p param
[NUM_PARAM
])
778 for (res
= param_structs
; res
; res
= res
->next
)
779 if (res
->u
.param_struct
.stru
== t
780 && memcmp (res
->u
.param_struct
.param
, param
,
781 sizeof (type_p
) * NUM_PARAM
) == 0)
786 res
= XCNEW (struct type
);
787 res
->kind
= TYPE_PARAM_STRUCT
;
788 res
->next
= param_structs
;
789 res
->state_number
= -type_count
;
791 res
->u
.param_struct
.stru
= t
;
792 memcpy (res
->u
.param_struct
.param
, param
, sizeof (type_p
) * NUM_PARAM
);
797 /* Return a scalar type with name NAME. */
800 create_scalar_type (const char *name
)
802 if (!strcmp (name
, "char") || !strcmp (name
, "unsigned char"))
805 return &scalar_nonchar
;
809 /* Return a pointer to T. */
812 create_pointer (type_p t
)
816 type_p r
= XCNEW (struct type
);
818 r
->state_number
= -type_count
;
819 r
->kind
= TYPE_POINTER
;
823 return t
->pointer_to
;
826 /* Return an array of length LEN. */
829 create_array (type_p t
, const char *len
)
834 v
= XCNEW (struct type
);
835 v
->kind
= TYPE_ARRAY
;
836 v
->state_number
= -type_count
;
842 /* Return a string options structure with name NAME and info INFO.
843 NEXT is the next option in the chain. */
845 create_string_option (options_p next
, const char *name
, const char *info
)
847 options_p o
= XNEW (struct options
);
848 o
->kind
= OPTION_STRING
;
851 o
->info
.string
= info
;
855 /* Create a type options structure with name NAME and info INFO. NEXT
856 is the next option in the chain. */
858 create_type_option (options_p next
, const char* name
, type_p info
)
860 options_p o
= XNEW (struct options
);
863 o
->kind
= OPTION_TYPE
;
868 /* Create a nested pointer options structure with name NAME and info
869 INFO. NEXT is the next option in the chain. */
871 create_nested_option (options_p next
, const char* name
,
872 struct nested_ptr_data
* info
)
875 o
= XNEW (struct options
);
878 o
->kind
= OPTION_NESTED
;
879 o
->info
.nested
= info
;
883 /* Return an options structure for a "nested_ptr" option. */
885 create_nested_ptr_option (options_p next
, type_p t
,
886 const char *to
, const char *from
)
888 struct nested_ptr_data
*d
= XNEW (struct nested_ptr_data
);
890 d
->type
= adjust_field_type (t
, 0);
892 d
->convert_from
= from
;
893 return create_nested_option (next
, "nested_ptr", d
);
896 /* Add a variable named S of type T with options O defined at POS,
899 note_variable (const char *s
, type_p t
, options_p o
, struct fileloc
*pos
)
902 n
= XNEW (struct pair
);
911 /* Most-general structure field creator. */
913 create_field_all (pair_p next
, type_p type
, const char *name
, options_p opt
,
914 const input_file
*inpf
, int line
)
918 field
= XNEW (struct pair
);
923 field
->line
.file
= inpf
;
924 field
->line
.line
= line
;
928 /* Create a field that came from the source code we are scanning,
929 i.e. we have a 'struct fileloc', and possibly options; also,
930 adjust_field_type should be called. */
932 create_field_at (pair_p next
, type_p type
, const char *name
, options_p opt
,
935 return create_field_all (next
, adjust_field_type (type
, opt
),
936 name
, opt
, pos
->file
, pos
->line
);
939 /* Create a fake field with the given type and name. NEXT is the next
940 field in the chain. */
941 #define create_field(next,type,name) \
942 create_field_all(next,type,name, 0, this_file, __LINE__)
944 /* Like create_field, but the field is only valid when condition COND
948 create_optional_field_ (pair_p next
, type_p type
, const char *name
,
949 const char *cond
, int line
)
955 /* Create a fake union type with a single nameless field of type TYPE.
956 The field has a tag of "1". This allows us to make the presence
957 of a field of type TYPE depend on some boolean "desc" being true. */
958 union_fields
= create_field (NULL
, type
, "");
960 create_string_option (union_fields
->opt
, "dot", "");
962 create_string_option (union_fields
->opt
, "tag", "1");
964 new_structure (xasprintf ("%s_%d", "fake_union", id
++), TYPE_UNION
,
965 &lexer_line
, union_fields
, NULL
);
967 /* Create the field and give it the new fake union type. Add a "desc"
968 tag that specifies the condition under which the field is valid. */
969 return create_field_all (next
, union_type
, name
,
970 create_string_option (0, "desc", cond
),
974 #define create_optional_field(next,type,name,cond) \
975 create_optional_field_(next,type,name,cond,__LINE__)
977 /* Reverse a linked list of 'struct pair's in place. */
979 nreverse_pairs (pair_p list
)
981 pair_p prev
= 0, p
, next
;
982 for (p
= list
; p
; p
= next
)
992 /* We don't care how long a CONST_DOUBLE is. */
993 #define CONST_DOUBLE_FORMAT "ww"
994 /* We don't want to see codes that are only for generator files. */
995 #undef GENERATOR_FILE
999 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
1005 static const char *const rtx_name
[NUM_RTX_CODE
] = {
1006 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
1011 static const char *const rtx_format
[NUM_RTX_CODE
] = {
1012 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
1017 static int rtx_next_new
[NUM_RTX_CODE
];
1019 /* We also need codes and names for insn notes (not register notes).
1020 Note that we do *not* bias the note values here. */
1023 #define DEF_INSN_NOTE(NAME) NAME,
1024 #include "insn-notes.def"
1025 #undef DEF_INSN_NOTE
1030 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
1031 default field for line number notes. */
1032 static const char *const note_insn_name
[NOTE_INSN_MAX
+ 1] = {
1033 #define DEF_INSN_NOTE(NAME) #NAME,
1034 #include "insn-notes.def"
1035 #undef DEF_INSN_NOTE
1038 #undef CONST_DOUBLE_FORMAT
1039 #define GENERATOR_FILE
1041 /* Generate the contents of the rtx_next array. This really doesn't belong
1042 in gengtype at all, but it's needed for adjust_field_rtx_def. */
1048 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1052 rtx_next_new
[i
] = -1;
1053 if (strncmp (rtx_format
[i
], "iuu", 3) == 0)
1054 rtx_next_new
[i
] = 2;
1055 else if (i
== COND_EXEC
|| i
== SET
|| i
== EXPR_LIST
|| i
== INSN_LIST
)
1056 rtx_next_new
[i
] = 1;
1058 for (k
= strlen (rtx_format
[i
]) - 1; k
>= 0; k
--)
1059 if (rtx_format
[i
][k
] == 'e' || rtx_format
[i
][k
] == 'u')
1060 rtx_next_new
[i
] = k
;
1064 /* Write out the contents of the rtx_next array. */
1066 write_rtx_next (void)
1068 outf_p f
= get_output_file_with_visibility (NULL
);
1073 oprintf (f
, "\n/* Used to implement the RTX_NEXT macro. */\n");
1074 oprintf (f
, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
1075 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1076 if (rtx_next_new
[i
] == -1)
1077 oprintf (f
, " 0,\n");
1080 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n", rtx_next_new
[i
]);
1081 oprintf (f
, "};\n");
1084 /* Handle `special("rtx_def")'. This is a special case for field
1085 `fld' of struct rtx_def, which is an array of unions whose values
1086 are based in a complex way on the type of RTL. */
1089 adjust_field_rtx_def (type_p t
, options_p
ARG_UNUSED (opt
))
1094 type_p rtx_tp
, rtvec_tp
, tree_tp
, mem_attrs_tp
, note_union_tp
, scalar_tp
;
1095 type_p basic_block_tp
, reg_attrs_tp
, constant_tp
, symbol_union_tp
;
1097 if (t
->kind
!= TYPE_UNION
)
1099 error_at_line (&lexer_line
,
1100 "special `rtx_def' must be applied to a union");
1101 return &string_type
;
1104 nodot
= create_string_option (NULL
, "dot", "");
1106 rtx_tp
= create_pointer (find_structure ("rtx_def", TYPE_STRUCT
));
1107 rtvec_tp
= create_pointer (find_structure ("rtvec_def", TYPE_STRUCT
));
1108 tree_tp
= create_pointer (find_structure ("tree_node", TYPE_UNION
));
1109 mem_attrs_tp
= create_pointer (find_structure ("mem_attrs", TYPE_STRUCT
));
1111 create_pointer (find_structure ("reg_attrs", TYPE_STRUCT
));
1113 create_pointer (find_structure ("basic_block_def", TYPE_STRUCT
));
1115 create_pointer (find_structure ("constant_descriptor_rtx", TYPE_STRUCT
));
1116 scalar_tp
= &scalar_nonchar
; /* rtunion int */
1119 pair_p note_flds
= NULL
;
1122 for (c
= 0; c
<= NOTE_INSN_MAX
; c
++)
1127 case NOTE_INSN_DELETED_LABEL
:
1128 case NOTE_INSN_DELETED_DEBUG_LABEL
:
1129 note_flds
= create_field (note_flds
, &string_type
, "rt_str");
1132 case NOTE_INSN_BLOCK_BEG
:
1133 case NOTE_INSN_BLOCK_END
:
1134 note_flds
= create_field (note_flds
, tree_tp
, "rt_tree");
1137 case NOTE_INSN_VAR_LOCATION
:
1138 case NOTE_INSN_CALL_ARG_LOCATION
:
1139 note_flds
= create_field (note_flds
, rtx_tp
, "rt_rtx");
1143 note_flds
= create_field (note_flds
, scalar_tp
, "rt_int");
1146 /* NOTE_INSN_MAX is used as the default field for line
1148 if (c
== NOTE_INSN_MAX
)
1150 create_string_option (nodot
, "default", "");
1153 create_string_option (nodot
, "tag", note_insn_name
[c
]);
1155 note_union_tp
= new_structure ("rtx_def_note_subunion", TYPE_UNION
,
1156 &lexer_line
, note_flds
, NULL
);
1158 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1161 sym_flds
= create_field (NULL
, tree_tp
, "rt_tree");
1162 sym_flds
->opt
= create_string_option (nodot
, "default", "");
1163 sym_flds
= create_field (sym_flds
, constant_tp
, "rt_constant");
1164 sym_flds
->opt
= create_string_option (nodot
, "tag", "1");
1165 symbol_union_tp
= new_structure ("rtx_def_symbol_subunion", TYPE_UNION
,
1166 &lexer_line
, sym_flds
, NULL
);
1168 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1170 pair_p subfields
= NULL
;
1171 size_t aindex
, nmindex
;
1176 for (aindex
= 0; aindex
< strlen (rtx_format
[i
]); aindex
++)
1179 const char *subname
;
1181 switch (rtx_format
[i
][aindex
])
1192 if (i
== MEM
&& aindex
== 1)
1193 t
= mem_attrs_tp
, subname
= "rt_mem";
1194 else if (i
== JUMP_INSN
&& aindex
== 8)
1195 t
= rtx_tp
, subname
= "rt_rtx";
1196 else if (i
== CODE_LABEL
&& aindex
== 5)
1197 t
= scalar_tp
, subname
= "rt_int";
1198 else if (i
== CODE_LABEL
&& aindex
== 4)
1199 t
= rtx_tp
, subname
= "rt_rtx";
1200 else if (i
== LABEL_REF
&& (aindex
== 1 || aindex
== 2))
1201 t
= rtx_tp
, subname
= "rt_rtx";
1202 else if (i
== NOTE
&& aindex
== 4)
1203 t
= note_union_tp
, subname
= "";
1204 else if (i
== NOTE
&& aindex
== 5)
1205 t
= scalar_tp
, subname
= "rt_int";
1206 else if (i
== NOTE
&& aindex
>= 7)
1207 t
= scalar_tp
, subname
= "rt_int";
1208 else if (i
== ADDR_DIFF_VEC
&& aindex
== 4)
1209 t
= scalar_tp
, subname
= "rt_int";
1210 else if (i
== VALUE
&& aindex
== 0)
1211 t
= scalar_tp
, subname
= "rt_int";
1212 else if (i
== DEBUG_EXPR
&& aindex
== 0)
1213 t
= tree_tp
, subname
= "rt_tree";
1214 else if (i
== REG
&& aindex
== 1)
1215 t
= scalar_tp
, subname
= "rt_int";
1216 else if (i
== REG
&& aindex
== 2)
1217 t
= reg_attrs_tp
, subname
= "rt_reg";
1218 else if (i
== SCRATCH
&& aindex
== 0)
1219 t
= scalar_tp
, subname
= "rt_int";
1220 else if (i
== SYMBOL_REF
&& aindex
== 1)
1221 t
= scalar_tp
, subname
= "rt_int";
1222 else if (i
== SYMBOL_REF
&& aindex
== 2)
1223 t
= symbol_union_tp
, subname
= "";
1224 else if (i
== BARRIER
&& aindex
>= 3)
1225 t
= scalar_tp
, subname
= "rt_int";
1226 else if (i
== ENTRY_VALUE
&& aindex
== 0)
1227 t
= rtx_tp
, subname
= "rt_rtx";
1232 "rtx type `%s' has `0' in position %lu, can't handle",
1233 rtx_name
[i
], (unsigned long) aindex
);
1255 subname
= "rt_rtvec";
1260 subname
= "rt_tree";
1271 "rtx type `%s' has `%c' in position %lu, can't handle",
1272 rtx_name
[i
], rtx_format
[i
][aindex
],
1273 (unsigned long) aindex
);
1279 subfields
= create_field (subfields
, t
,
1280 xasprintf (".fld[%lu].%s",
1281 (unsigned long) aindex
,
1283 subfields
->opt
= nodot
;
1284 if (t
== note_union_tp
)
1286 create_string_option (subfields
->opt
, "desc",
1288 if (t
== symbol_union_tp
)
1290 create_string_option (subfields
->opt
, "desc",
1291 "CONSTANT_POOL_ADDRESS_P (&%0)");
1294 if (i
== SYMBOL_REF
)
1296 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P
1298 type_p field_tp
= find_structure ("block_symbol", TYPE_STRUCT
);
1300 = create_optional_field (subfields
, field_tp
, "block_sym",
1301 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1304 sname
= xasprintf ("rtx_def_%s", rtx_name
[i
]);
1305 substruct
= new_structure (sname
, TYPE_STRUCT
, &lexer_line
, subfields
,
1308 ftag
= xstrdup (rtx_name
[i
]);
1309 for (nmindex
= 0; nmindex
< strlen (ftag
); nmindex
++)
1310 ftag
[nmindex
] = TOUPPER (ftag
[nmindex
]);
1311 flds
= create_field (flds
, substruct
, "");
1312 flds
->opt
= create_string_option (nodot
, "tag", ftag
);
1314 return new_structure ("rtx_def_subunion", TYPE_UNION
, &lexer_line
, flds
,
1318 /* Handle `special("tree_exp")'. This is a special case for
1319 field `operands' of struct tree_exp, which although it claims to contain
1320 pointers to trees, actually sometimes contains pointers to RTL too.
1321 Passed T, the old type of the field, and OPT its options. Returns
1322 a new type for the field. */
1325 adjust_field_tree_exp (type_p t
, options_p opt ATTRIBUTE_UNUSED
)
1330 if (t
->kind
!= TYPE_ARRAY
)
1332 error_at_line (&lexer_line
,
1333 "special `tree_exp' must be applied to an array");
1334 return &string_type
;
1337 nodot
= create_string_option (NULL
, "dot", "");
1339 flds
= create_field (NULL
, t
, "");
1340 flds
->opt
= create_string_option (nodot
, "length",
1341 "TREE_OPERAND_LENGTH ((tree) &%0)");
1342 flds
->opt
= create_string_option (flds
->opt
, "default", "");
1344 return new_structure ("tree_exp_subunion", TYPE_UNION
, &lexer_line
, flds
,
1348 /* Perform any special processing on a type T, about to become the type
1349 of a field. Return the appropriate type for the field.
1351 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1352 - Similarly for arrays of pointer-to-char;
1353 - Converts structures for which a parameter is provided to
1355 - Handles "special" options.
1359 adjust_field_type (type_p t
, options_p opt
)
1362 const int pointer_p
= t
->kind
== TYPE_POINTER
;
1363 type_p params
[NUM_PARAM
];
1367 for (i
= 0; i
< NUM_PARAM
; i
++)
1370 for (; opt
; opt
= opt
->next
)
1371 if (strcmp (opt
->name
, "length") == 0)
1374 error_at_line (&lexer_line
, "duplicate `%s' option", opt
->name
);
1375 if (t
->u
.p
->kind
== TYPE_SCALAR
|| t
->u
.p
->kind
== TYPE_STRING
)
1377 error_at_line (&lexer_line
,
1378 "option `%s' may not be applied to "
1379 "arrays of atomic types", opt
->name
);
1383 else if ((strcmp (opt
->name
, "param_is") == 0
1384 || (strncmp (opt
->name
, "param", 5) == 0
1385 && ISDIGIT (opt
->name
[5])
1386 && strcmp (opt
->name
+ 6, "_is") == 0))
1387 && opt
->kind
== OPTION_TYPE
)
1389 int num
= ISDIGIT (opt
->name
[5]) ? opt
->name
[5] - '0' : 0;
1391 if (!union_or_struct_p (t
)
1392 && (t
->kind
!= TYPE_POINTER
|| !union_or_struct_p (t
->u
.p
)))
1394 error_at_line (&lexer_line
,
1395 "option `%s' may only be applied to structures or structure pointers",
1401 if (params
[num
] != NULL
)
1402 error_at_line (&lexer_line
, "duplicate `%s' option", opt
->name
);
1403 if (!ISDIGIT (opt
->name
[5]))
1404 params
[num
] = create_pointer (opt
->info
.type
);
1406 params
[num
] = opt
->info
.type
;
1408 else if (strcmp (opt
->name
, "special") == 0
1409 && opt
->kind
== OPTION_STRING
)
1411 const char *special_name
= opt
->info
.string
;
1412 if (strcmp (special_name
, "tree_exp") == 0)
1413 t
= adjust_field_tree_exp (t
, opt
);
1414 else if (strcmp (special_name
, "rtx_def") == 0)
1415 t
= adjust_field_rtx_def (t
, opt
);
1417 error_at_line (&lexer_line
, "unknown special `%s'", special_name
);
1426 realt
= find_param_structure (t
, params
);
1427 t
= pointer_p
? create_pointer (realt
) : realt
;
1431 && pointer_p
&& t
->u
.p
->kind
== TYPE_SCALAR
&& t
->u
.p
->u
.scalar_is_char
)
1432 return &string_type
;
1433 if (t
->kind
== TYPE_ARRAY
&& t
->u
.a
.p
->kind
== TYPE_POINTER
1434 && t
->u
.a
.p
->u
.p
->kind
== TYPE_SCALAR
1435 && t
->u
.a
.p
->u
.p
->u
.scalar_is_char
)
1436 return create_array (&string_type
, t
->u
.a
.len
);
1442 static void set_gc_used_type (type_p
, enum gc_used_enum
, type_p
*,
1444 static void set_gc_used (pair_p
);
1446 /* Handle OPT for set_gc_used_type. */
1449 process_gc_options (options_p opt
, enum gc_used_enum level
, int *maybe_undef
,
1450 int *pass_param
, int *length
, int *skip
,
1454 for (o
= opt
; o
; o
= o
->next
)
1455 if (strcmp (o
->name
, "ptr_alias") == 0 && level
== GC_POINTED_TO
1456 && o
->kind
== OPTION_TYPE
)
1457 set_gc_used_type (o
->info
.type
,
1458 GC_POINTED_TO
, NULL
);
1459 else if (strcmp (o
->name
, "maybe_undef") == 0)
1461 else if (strcmp (o
->name
, "use_params") == 0)
1463 else if (strcmp (o
->name
, "length") == 0)
1465 else if (strcmp (o
->name
, "skip") == 0)
1467 else if (strcmp (o
->name
, "nested_ptr") == 0
1468 && o
->kind
== OPTION_NESTED
)
1469 *nested_ptr
= ((const struct nested_ptr_data
*) o
->info
.nested
)->type
;
1473 /* Set the gc_used field of T to LEVEL, and handle the types it references.
1475 If ALLOWED_UNDEFINED_TYPES is true, types of kind TYPE_UNDEFINED
1476 are set to GC_UNUSED. Otherwise, an error is emitted for
1477 TYPE_UNDEFINED types. This is used to support user-defined
1478 template types with non-type arguments.
1480 For instance, when we parse a template type with enum arguments
1481 (e.g. MyType<AnotherType, EnumValue>), the parser created two
1482 artificial fields for 'MyType', one for 'AnotherType', the other
1483 one for 'EnumValue'.
1485 At the time that we parse this type we don't know that 'EnumValue'
1486 is really an enum value, so the parser creates a TYPE_UNDEFINED
1487 type for it. Since 'EnumValue' is never resolved to a known
1488 structure, it will stay with TYPE_UNDEFINED.
1490 Since 'MyType' is a TYPE_USER_STRUCT, we can simply ignore
1491 'EnumValue'. Generating marking code for it would cause
1492 compilation failures since the marking routines assumes that
1493 'EnumValue' is a type. */
1496 set_gc_used_type (type_p t
, enum gc_used_enum level
, type_p param
[NUM_PARAM
],
1497 bool allow_undefined_types
)
1499 if (t
->gc_used
>= level
)
1508 case TYPE_USER_STRUCT
:
1513 bool allow_undefined_field_types
= (t
->kind
== TYPE_USER_STRUCT
);
1515 process_gc_options (t
->u
.s
.opt
, level
, &dummy
, &dummy
, &dummy
, &dummy
,
1518 for (f
= t
->u
.s
.fields
; f
; f
= f
->next
)
1520 int maybe_undef
= 0;
1524 type_p nested_ptr
= NULL
;
1525 process_gc_options (f
->opt
, level
, &maybe_undef
, &pass_param
,
1526 &length
, &skip
, &nested_ptr
);
1528 if (nested_ptr
&& f
->type
->kind
== TYPE_POINTER
)
1529 set_gc_used_type (nested_ptr
, GC_POINTED_TO
,
1530 pass_param
? param
: NULL
);
1531 else if (length
&& f
->type
->kind
== TYPE_POINTER
)
1532 set_gc_used_type (f
->type
->u
.p
, GC_USED
, NULL
);
1533 else if (maybe_undef
&& f
->type
->kind
== TYPE_POINTER
)
1534 set_gc_used_type (f
->type
->u
.p
, GC_MAYBE_POINTED_TO
, NULL
);
1535 else if (pass_param
&& f
->type
->kind
== TYPE_POINTER
&& param
)
1536 set_gc_used_type (find_param_structure (f
->type
->u
.p
, param
),
1537 GC_POINTED_TO
, NULL
);
1539 ; /* target type is not used through this field */
1541 set_gc_used_type (f
->type
, GC_USED
, pass_param
? param
: NULL
,
1542 allow_undefined_field_types
);
1547 case TYPE_UNDEFINED
:
1548 if (level
> GC_UNUSED
)
1550 if (!allow_undefined_types
)
1551 error_at_line (&t
->u
.s
.line
, "undefined type `%s'", t
->u
.s
.tag
);
1552 t
->gc_used
= GC_UNUSED
;
1557 set_gc_used_type (t
->u
.p
, GC_POINTED_TO
, NULL
);
1561 set_gc_used_type (t
->u
.a
.p
, GC_USED
, param
);
1564 case TYPE_LANG_STRUCT
:
1565 for (t
= t
->u
.s
.lang_struct
; t
; t
= t
->next
)
1566 set_gc_used_type (t
, level
, param
);
1569 case TYPE_PARAM_STRUCT
:
1572 for (i
= 0; i
< NUM_PARAM
; i
++)
1573 if (t
->u
.param_struct
.param
[i
] != 0)
1574 set_gc_used_type (t
->u
.param_struct
.param
[i
], GC_USED
, NULL
);
1576 if (t
->u
.param_struct
.stru
->gc_used
== GC_POINTED_TO
)
1577 level
= GC_POINTED_TO
;
1580 t
->u
.param_struct
.stru
->gc_used
= GC_UNUSED
;
1581 set_gc_used_type (t
->u
.param_struct
.stru
, level
,
1582 t
->u
.param_struct
.param
);
1590 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1593 set_gc_used (pair_p variables
)
1597 for (p
= variables
; p
; p
= p
->next
)
1599 set_gc_used_type (p
->type
, GC_USED
, NULL
);
1602 if (verbosity_level
>= 2)
1603 printf ("%s used %d GTY-ed variables\n", progname
, nbvars
);
1606 /* File mapping routines. For each input file, there is one output .c file
1607 (but some output files have many input files), and there is one .h file
1608 for the whole build. */
1610 /* Output file handling. */
1612 /* Create and return an outf_p for a new file for NAME, to be called
1616 create_file (const char *name
, const char *oname
)
1618 static const char *const hdr
[] = {
1619 " Copyright (C) 2004, 2007, 2009, 2012 Free Software Foundation, Inc.\n",
1621 "This file is part of GCC.\n",
1623 "GCC is free software; you can redistribute it and/or modify it under\n",
1624 "the terms of the GNU General Public License as published by the Free\n",
1625 "Software Foundation; either version 3, or (at your option) any later\n",
1628 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1629 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1630 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1631 "for more details.\n",
1633 "You should have received a copy of the GNU General Public License\n",
1634 "along with GCC; see the file COPYING3. If not see\n",
1635 "<http://www.gnu.org/licenses/>. */\n",
1637 "/* This file is machine generated. Do not edit. */\n"
1642 gcc_assert (name
!= NULL
);
1643 gcc_assert (oname
!= NULL
);
1644 f
= XCNEW (struct outf
);
1645 f
->next
= output_files
;
1649 oprintf (f
, "/* Type information for %s.\n", name
);
1650 for (i
= 0; i
< ARRAY_SIZE (hdr
); i
++)
1651 oprintf (f
, "%s", hdr
[i
]);
1655 /* Print, like fprintf, to O.
1656 N.B. You might think this could be implemented more efficiently
1657 with vsnprintf(). Unfortunately, there are C libraries that
1658 provide that function but without the C99 semantics for its return
1659 value, making it impossible to know how much space is required. */
1661 oprintf (outf_p o
, const char *format
, ...)
1667 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1672 va_start (ap
, format
);
1673 slength
= vasprintf (&s
, format
, ap
);
1674 if (s
== NULL
|| (int) slength
< 0)
1675 fatal ("out of memory");
1678 if (o
->bufused
+ slength
> o
->buflength
)
1680 size_t new_len
= o
->buflength
;
1687 while (o
->bufused
+ slength
>= new_len
);
1688 o
->buf
= XRESIZEVEC (char, o
->buf
, new_len
);
1689 o
->buflength
= new_len
;
1691 memcpy (o
->buf
+ o
->bufused
, s
, slength
);
1692 o
->bufused
+= slength
;
1696 /* Open the global header file and the language-specific header files. */
1699 open_base_files (void)
1703 if (nb_plugin_files
> 0 && plugin_files
)
1706 header_file
= create_file ("GCC", "gtype-desc.h");
1708 base_files
= XNEWVEC (outf_p
, num_lang_dirs
);
1710 for (i
= 0; i
< num_lang_dirs
; i
++)
1711 base_files
[i
] = create_file (lang_dir_names
[i
],
1712 xasprintf ("gtype-%s.h", lang_dir_names
[i
]));
1714 /* gtype-desc.c is a little special, so we create it here. */
1716 /* The order of files here matters very much. */
1717 static const char *const ifiles
[] = {
1718 "config.h", "system.h", "coretypes.h", "tm.h",
1719 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1720 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1721 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1722 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1723 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1724 "except.h", "output.h", "gimple.h", "cfgloop.h",
1725 "target.h", "ipa-prop.h", "lto-streamer.h", "target-globals.h",
1726 "ipa-inline.h", "dwarf2out.h", NULL
1728 const char *const *ifp
;
1729 outf_p gtype_desc_c
;
1731 gtype_desc_c
= create_file ("GCC", "gtype-desc.c");
1732 for (ifp
= ifiles
; *ifp
; ifp
++)
1733 oprintf (gtype_desc_c
, "#include \"%s\"\n", *ifp
);
1735 /* Make sure we handle "cfun" specially. */
1736 oprintf (gtype_desc_c
, "\n/* See definition in function.h. */\n");
1737 oprintf (gtype_desc_c
, "#undef cfun\n");
1741 /* For INPF an input file, return the real basename of INPF, with all
1742 the directory components skipped. */
1745 get_file_realbasename (const input_file
*inpf
)
1747 return lbasename (get_input_file_name (inpf
));
1750 /* For INPF a filename, return the relative path to INPF from
1751 $(srcdir) if the latter is a prefix in INPF, NULL otherwise. */
1754 get_file_srcdir_relative_path (const input_file
*inpf
)
1756 const char *f
= get_input_file_name (inpf
);
1757 if (strlen (f
) > srcdir_len
1758 && IS_DIR_SEPARATOR (f
[srcdir_len
])
1759 && strncmp (f
, srcdir
, srcdir_len
) == 0)
1760 return f
+ srcdir_len
+ 1;
1765 /* For INPF an input_file, return the relative path to INPF from
1766 $(srcdir) if the latter is a prefix in INPF, or the real basename
1767 of INPF otherwise. */
1770 get_file_basename (const input_file
*inpf
)
1772 const char *srcdir_path
= get_file_srcdir_relative_path (inpf
);
1774 return (srcdir_path
!= NULL
) ? srcdir_path
: get_file_realbasename (inpf
);
1777 /* For F a filename, return the lang_dir_names relative index of the language
1778 directory that is a prefix in F, if any, -1 otherwise. */
1781 get_prefix_langdir_index (const char *f
)
1783 size_t f_len
= strlen (f
);
1786 for (lang_index
= 0; lang_index
< num_lang_dirs
; lang_index
++)
1788 const char *langdir
= lang_dir_names
[lang_index
];
1789 size_t langdir_len
= strlen (langdir
);
1791 if (f_len
> langdir_len
1792 && IS_DIR_SEPARATOR (f
[langdir_len
])
1793 && memcmp (f
, langdir
, langdir_len
) == 0)
1800 /* For INPF an input file, return the name of language directory where
1801 F is located, if any, NULL otherwise. */
1804 get_file_langdir (const input_file
*inpf
)
1806 /* Get the relative path to INPF from $(srcdir) and find the
1807 language by comparing the prefix with language directory names.
1808 If INPF is not even srcdir relative, no point in looking
1812 const char *srcdir_relative_path
= get_file_srcdir_relative_path (inpf
);
1815 if (!srcdir_relative_path
)
1818 lang_index
= get_prefix_langdir_index (srcdir_relative_path
);
1819 if (lang_index
< 0 && strncmp (srcdir_relative_path
, "c-family", 8) == 0)
1821 else if (lang_index
>= 0)
1822 r
= lang_dir_names
[lang_index
];
1829 /* The gt- output file name for INPF. */
1832 get_file_gtfilename (const input_file
*inpf
)
1834 /* Cook up an initial version of the gt- file name from the file real
1835 basename and the language name, if any. */
1837 const char *basename
= get_file_realbasename (inpf
);
1838 const char *langdir
= get_file_langdir (inpf
);
1841 (langdir
? xasprintf ("gt-%s-%s", langdir
, basename
)
1842 : xasprintf ("gt-%s", basename
));
1844 /* Then replace all non alphanumerics characters by '-' and change the
1845 extension to ".h". We expect the input filename extension was at least
1846 one character long. */
1850 for (; *s
!= '.'; s
++)
1851 if (!ISALNUM (*s
) && *s
!= '-')
1854 memcpy (s
, ".h", sizeof (".h"));
1859 /* Each input_file has its associated output file outf_p. The
1860 association is computed by the function
1861 get_output_file_with_visibility. The associated file is cached
1862 inside input_file in its inpoutf field, so is really computed only
1863 once. Associated output file paths (i.e. output_name-s) are
1864 computed by a rule based regexp machinery, using the files_rules
1865 array of struct file_rule_st. A for_name is also computed, giving
1866 the source file name for which the output_file is generated; it is
1867 often the last component of the input_file path. */
1871 Regexpr machinery to compute the output_name and for_name-s of each
1872 input_file. We have a sequence of file rules which gives the POSIX
1873 extended regular expression to match an input file path, and two
1874 transformed strings for the corresponding output_name and the
1875 corresponding for_name. The transformed string contain dollars: $0
1876 is replaced by the entire match, $1 is replaced by the substring
1877 matching the first parenthesis in the regexp, etc. And $$ is replaced
1878 by a single verbatim dollar. The rule order is important. The
1879 general case is last, and the particular cases should come before.
1880 An action routine can, when needed, update the out_name & for_name
1881 and/or return the appropriate output file. It is invoked only when a
1882 rule is triggered. When a rule is triggered, the output_name and
1883 for_name are computed using their transform string in while $$, $0,
1884 $1, ... are suitably replaced. If there is an action, it is called.
1885 In some few cases, the action can directly return the outf_p, but
1886 usually it just updates the output_name and for_name so should free
1887 them before replacing them. The get_output_file_with_visibility
1888 function creates an outf_p only once per each output_name, so it
1889 scans the output_files list for previously seen output file names.
1892 /* Signature of actions in file rules. */
1893 typedef outf_p (frul_actionrout_t
) (input_file
*, char**, char**);
1896 struct file_rule_st
{
1897 const char* frul_srcexpr
; /* Source string for regexp. */
1898 int frul_rflags
; /* Flags passed to regcomp, usually
1900 regex_t
* frul_re
; /* Compiled regular expression
1901 obtained by regcomp. */
1902 const char* frul_tr_out
; /* Transformation string for making
1903 * the output_name, with $1 ... $9 for
1904 * subpatterns and $0 for the whole
1905 * matched filename. */
1906 const char* frul_tr_for
; /* Tranformation string for making the
1908 frul_actionrout_t
* frul_action
; /* The action, if non null, is
1909 * called once the rule matches, on
1910 * the transformed out_name &
1911 * for_name. It could change them
1912 * and/or give the output file. */
1915 /* File rule action handling *.h files. */
1916 static outf_p
header_dot_h_frul (input_file
*, char**, char**);
1918 /* File rule action handling *.c files. */
1919 static outf_p
source_dot_c_frul (input_file
*, char**, char**);
1921 #define NULL_REGEX (regex_t*)0
1923 /* The prefix in our regexp-s matching the directory. */
1924 #define DIR_PREFIX_REGEX "^(([^/]*/)*)"
1926 #define NULL_FRULACT (frul_actionrout_t*)0
1928 /* The array of our rules governing file name generation. Rules order
1929 matters, so change with extreme care! */
1931 struct file_rule_st files_rules
[] = {
1932 /* The general rule assumes that files in subdirectories belong to a
1933 particular front-end, and files not in subdirectories are shared.
1934 The following rules deal with exceptions - files that are in
1935 subdirectories and yet are shared, and files that are top-level,
1936 but are not shared. */
1938 /* the c-family/ source directory is special. */
1939 { DIR_PREFIX_REGEX
"c-family/([[:alnum:]_-]*)\\.c$",
1940 REG_EXTENDED
, NULL_REGEX
,
1941 "gt-c-family-$3.h", "c-family/$3.c", NULL_FRULACT
},
1943 { DIR_PREFIX_REGEX
"c-family/([[:alnum:]_-]*)\\.h$",
1944 REG_EXTENDED
, NULL_REGEX
,
1945 "gt-c-family-$3.h", "c-family/$3.h", NULL_FRULACT
},
1947 /* Both c-lang.h & c-tree.h gives gt-c-c-decl.h for c-decl.c ! */
1948 { DIR_PREFIX_REGEX
"c/c-lang\\.h$",
1949 REG_EXTENDED
, NULL_REGEX
, "gt-c-c-decl.h", "c/c-decl.c", NULL_FRULACT
},
1951 { DIR_PREFIX_REGEX
"c/c-tree\\.h$",
1952 REG_EXTENDED
, NULL_REGEX
, "gt-c-c-decl.h", "c/c-decl.c", NULL_FRULACT
},
1954 /* cp/cp-tree.h gives gt-cp-tree.h for cp/tree.c ! */
1955 { DIR_PREFIX_REGEX
"cp/cp-tree\\.h$",
1956 REG_EXTENDED
, NULL_REGEX
,
1957 "gt-cp-tree.h", "cp/tree.c", NULL_FRULACT
},
1959 /* cp/decl.h & cp/decl.c gives gt-cp-decl.h for cp/decl.c ! */
1960 { DIR_PREFIX_REGEX
"cp/decl\\.[ch]$",
1961 REG_EXTENDED
, NULL_REGEX
,
1962 "gt-cp-decl.h", "cp/decl.c", NULL_FRULACT
},
1964 /* cp/name-lookup.h gives gt-cp-name-lookup.h for cp/name-lookup.c ! */
1965 { DIR_PREFIX_REGEX
"cp/name-lookup\\.h$",
1966 REG_EXTENDED
, NULL_REGEX
,
1967 "gt-cp-name-lookup.h", "cp/name-lookup.c", NULL_FRULACT
},
1969 /* cp/parser.h gives gt-cp-parser.h for cp/parser.c ! */
1970 { DIR_PREFIX_REGEX
"cp/parser\\.h$",
1971 REG_EXTENDED
, NULL_REGEX
,
1972 "gt-cp-parser.h", "cp/parser.c", NULL_FRULACT
},
1974 /* objc/objc-act.h gives gt-objc-objc-act.h for objc/objc-act.c ! */
1975 { DIR_PREFIX_REGEX
"objc/objc-act\\.h$",
1976 REG_EXTENDED
, NULL_REGEX
,
1977 "gt-objc-objc-act.h", "objc/objc-act.c", NULL_FRULACT
},
1979 /* objc/objc-map.h gives gt-objc-objc-map.h for objc/objc-map.c ! */
1980 { DIR_PREFIX_REGEX
"objc/objc-map\\.h$",
1981 REG_EXTENDED
, NULL_REGEX
,
1982 "gt-objc-objc-map.h", "objc/objc-map.c", NULL_FRULACT
},
1984 /* General cases. For header *.h and source *.c files, we need
1985 * special actions to handle the language. */
1987 /* Source *.c files are using get_file_gtfilename to compute their
1988 output_name and get_file_basename to compute their for_name
1989 through the source_dot_c_frul action. */
1990 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.c$",
1991 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.c", source_dot_c_frul
},
1992 /* Common header files get "gtype-desc.c" as their output_name,
1993 * while language specific header files are handled specially. So
1994 * we need the header_dot_h_frul action. */
1995 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.h$",
1996 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.h", header_dot_h_frul
},
1998 { DIR_PREFIX_REGEX
"([[:alnum:]_-]*)\\.in$",
1999 REG_EXTENDED
, NULL_REGEX
, "gt-$3.h", "$3.in", NULL_FRULACT
},
2001 /* Mandatory null last entry signaling end of rules. */
2002 {NULL
, 0, NULL_REGEX
, NULL
, NULL
, NULL_FRULACT
}
2005 /* Special file rules action for handling *.h header files. It gives
2006 "gtype-desc.c" for common headers and corresponding output
2007 files for language-specific header files. */
2009 header_dot_h_frul (input_file
* inpf
, char**poutname
,
2010 char**pforname ATTRIBUTE_UNUSED
)
2012 const char *basename
= 0;
2014 DBGPRINTF ("inpf %p inpname %s outname %s forname %s",
2015 (void*) inpf
, get_input_file_name (inpf
),
2016 *poutname
, *pforname
);
2017 basename
= get_file_basename (inpf
);
2018 lang_index
= get_prefix_langdir_index (basename
);
2019 DBGPRINTF ("basename %s lang_index %d", basename
, lang_index
);
2021 if (lang_index
>= 0)
2023 /* The header is language specific. Given output_name &
2024 for_name remains unchanged. The base_files array gives the
2026 DBGPRINTF ("header_dot_h found language specific @ %p '%s'",
2027 (void*) base_files
[lang_index
],
2028 (base_files
[lang_index
])->name
);
2029 return base_files
[lang_index
];
2033 /* The header is common to all front-end languages. So
2034 output_name is "gtype-desc.c" file. The calling function
2035 get_output_file_with_visibility will find its outf_p. */
2037 *poutname
= xstrdup ("gtype-desc.c");
2038 DBGPRINTF ("special 'gtype-desc.c' for inpname %s",
2039 get_input_file_name (inpf
));
2045 /* Special file rules action for handling *.c source files using
2046 * get_file_gtfilename to compute their output_name and
2047 * get_file_basename to compute their for_name. The output_name is
2048 * gt-<LANG>-<BASE>.h for language specific source files, and
2049 * gt-<BASE>.h for common source files. */
2051 source_dot_c_frul (input_file
* inpf
, char**poutname
, char**pforname
)
2053 char *newbasename
= CONST_CAST (char*, get_file_basename (inpf
));
2054 char *newoutname
= CONST_CAST (char*, get_file_gtfilename (inpf
));
2055 DBGPRINTF ("inpf %p inpname %s original outname %s forname %s",
2056 (void*) inpf
, get_input_file_name (inpf
),
2057 *poutname
, *pforname
);
2058 DBGPRINTF ("newoutname %s", newoutname
);
2059 DBGPRINTF ("newbasename %s", newbasename
);
2062 *poutname
= newoutname
;
2063 *pforname
= newbasename
;
2067 /* Utility function for get_output_file_with_visibility which returns
2068 * a malloc-ed substituted string using TRS on matching of the FILNAM
2069 * file name, using the PMATCH array. */
2071 matching_file_name_substitute (const char *filnam
, regmatch_t pmatch
[10],
2074 struct obstack str_obstack
;
2076 char *rawstr
= NULL
;
2077 const char *pt
= NULL
;
2078 DBGPRINTF ("filnam %s", filnam
);
2079 obstack_init (&str_obstack
);
2080 for (pt
= trs
; *pt
; pt
++) {
2086 /* A double dollar $$ is substituted by a single verbatim
2087 dollar, but who really uses dollar signs in file
2089 obstack_1grow (&str_obstack
, '$');
2091 else if (ISDIGIT (pt
[1]))
2093 /* Handle $0 $1 ... $9 by appropriate substitution. */
2094 int dolnum
= pt
[1] - '0';
2095 int so
= pmatch
[dolnum
].rm_so
;
2096 int eo
= pmatch
[dolnum
].rm_eo
;
2097 DBGPRINTF ("so=%d eo=%d dolnum=%d", so
, eo
, dolnum
);
2098 if (so
>=0 && eo
>=so
)
2099 obstack_grow (&str_obstack
, filnam
+ so
, eo
- so
);
2103 /* This can happen only when files_rules is buggy! */
2106 /* Always skip the character after the dollar. */
2110 obstack_1grow (&str_obstack
, c
);
2112 obstack_1grow (&str_obstack
, '\0');
2113 rawstr
= XOBFINISH (&str_obstack
, char *);
2114 str
= xstrdup (rawstr
);
2115 obstack_free (&str_obstack
, NULL
);
2116 DBGPRINTF ("matched replacement %s", str
);
2122 /* An output file, suitable for definitions, that can see declarations
2123 made in INPF and is linked into every language that uses INPF.
2124 Since the result is cached inside INPF, that argument cannot be
2125 declared constant, but is "almost" constant. */
2128 get_output_file_with_visibility (input_file
*inpf
)
2131 char *for_name
= NULL
;
2132 char *output_name
= NULL
;
2133 const char* inpfname
;
2135 /* This can happen when we need a file with visibility on a
2136 structure that we've never seen. We have to just hope that it's
2137 globally visible. */
2139 inpf
= system_h_file
;
2141 /* The result is cached in INPF, so return it if already known. */
2143 return inpf
->inpoutf
;
2145 /* In plugin mode, return NULL unless the input_file is one of the
2150 for (i
= 0; i
< nb_plugin_files
; i
++)
2151 if (inpf
== plugin_files
[i
])
2153 inpf
->inpoutf
= plugin_output
;
2154 return plugin_output
;
2160 inpfname
= get_input_file_name (inpf
);
2162 /* Try each rule in sequence in files_rules until one is triggered. */
2165 DBGPRINTF ("passing input file @ %p named %s through the files_rules",
2166 (void*) inpf
, inpfname
);
2168 for (; files_rules
[rulix
].frul_srcexpr
!= NULL
; rulix
++)
2170 DBGPRINTF ("rulix#%d srcexpr %s",
2171 rulix
, files_rules
[rulix
].frul_srcexpr
);
2173 if (!files_rules
[rulix
].frul_re
)
2175 /* Compile the regexpr lazily. */
2177 files_rules
[rulix
].frul_re
= XCNEW (regex_t
);
2178 err
= regcomp (files_rules
[rulix
].frul_re
,
2179 files_rules
[rulix
].frul_srcexpr
,
2180 files_rules
[rulix
].frul_rflags
);
2183 /* The regular expression compilation fails only when
2184 file_rules is buggy. */
2192 /* Match the regexpr and trigger the rule if matched. */
2194 /* We have exactly ten pmatch-s, one for each $0, $1, $2,
2196 regmatch_t pmatch
[10];
2197 memset (pmatch
, 0, sizeof (pmatch
));
2198 if (!regexec (files_rules
[rulix
].frul_re
,
2199 inpfname
, 10, pmatch
, 0))
2201 DBGPRINTF ("input @ %p filename %s matched rulix#%d pattern %s",
2202 (void*) inpf
, inpfname
, rulix
,
2203 files_rules
[rulix
].frul_srcexpr
);
2205 matching_file_name_substitute (inpfname
, pmatch
,
2206 files_rules
[rulix
].frul_tr_for
);
2207 DBGPRINTF ("for_name %s", for_name
);
2209 matching_file_name_substitute (inpfname
, pmatch
,
2210 files_rules
[rulix
].frul_tr_out
);
2211 DBGPRINTF ("output_name %s", output_name
);
2212 if (files_rules
[rulix
].frul_action
)
2214 /* Invoke our action routine. */
2216 DBGPRINTF ("before action rulix#%d output_name %s for_name %s",
2217 rulix
, output_name
, for_name
);
2219 (files_rules
[rulix
].frul_action
) (inpf
,
2220 &output_name
, &for_name
);
2221 DBGPRINTF ("after action rulix#%d of=%p output_name %s for_name %s",
2222 rulix
, (void*)of
, output_name
, for_name
);
2223 /* If the action routine returned something, give it back
2224 immediately and cache it in inpf. */
2231 /* The rule matched, and had no action, or that action did
2232 not return any output file but could have changed the
2233 output_name or for_name. We break out of the loop on the
2239 /* The regexpr did not match. */
2240 DBGPRINTF ("rulix#%d did not match %s pattern %s",
2241 rulix
, inpfname
, files_rules
[rulix
].frul_srcexpr
);
2247 if (!output_name
|| !for_name
)
2249 /* This is impossible, and could only happen if the files_rules is
2250 incomplete or buggy. */
2254 /* Look through to see if we've ever seen this output filename
2255 before. If found, cache the result in inpf. */
2256 for (r
= output_files
; r
; r
= r
->next
)
2257 if (filename_cmp (r
->name
, output_name
) == 0)
2260 DBGPRINTF ("found r @ %p for output_name %s for_name %s", (void*)r
,
2261 output_name
, for_name
);
2265 /* If not found, create it, and cache it in inpf. */
2266 r
= create_file (for_name
, output_name
);
2268 gcc_assert (r
&& r
->name
);
2269 DBGPRINTF ("created r @ %p for output_name %s for_name %s", (void*) r
,
2270 output_name
, for_name
);
2277 /* The name of an output file, suitable for definitions, that can see
2278 declarations made in INPF and is linked into every language that
2282 get_output_file_name (input_file
* inpf
)
2284 outf_p o
= get_output_file_with_visibility (inpf
);
2290 /* Check if existing file is equal to the in memory buffer. */
2293 is_file_equal (outf_p of
)
2295 FILE *newfile
= fopen (of
->name
, "r");
2298 if (newfile
== NULL
)
2302 for (i
= 0; i
< of
->bufused
; i
++)
2305 ch
= fgetc (newfile
);
2306 if (ch
== EOF
|| ch
!= (unsigned char) of
->buf
[i
])
2316 /* Copy the output to its final destination,
2317 but don't unnecessarily change modification times. */
2320 close_output_files (void)
2322 int nbwrittenfiles
= 0;
2325 for (of
= output_files
; of
; of
= of
->next
)
2327 if (!is_file_equal (of
))
2329 FILE *newfile
= NULL
;
2330 char *backupname
= NULL
;
2331 /* Back up the old version of the output file gt-FOO.c as
2332 BACKUPDIR/gt-FOO.c~ if we have a backup directory. */
2335 backupname
= concat (backup_dir
, "/",
2336 lbasename (of
->name
), "~", NULL
);
2337 if (!access (of
->name
, F_OK
) && rename (of
->name
, backupname
))
2338 fatal ("failed to back up %s as %s: %s",
2339 of
->name
, backupname
, xstrerror (errno
));
2342 newfile
= fopen (of
->name
, "w");
2343 if (newfile
== NULL
)
2344 fatal ("opening output file %s: %s", of
->name
, xstrerror (errno
));
2345 if (fwrite (of
->buf
, 1, of
->bufused
, newfile
) != of
->bufused
)
2346 fatal ("writing output file %s: %s", of
->name
, xstrerror (errno
));
2347 if (fclose (newfile
) != 0)
2348 fatal ("closing output file %s: %s", of
->name
, xstrerror (errno
));
2350 if (verbosity_level
>= 2 && backupname
)
2351 printf ("%s wrote #%-3d %s backed-up in %s\n",
2352 progname
, nbwrittenfiles
, of
->name
, backupname
);
2353 else if (verbosity_level
>= 1)
2354 printf ("%s write #%-3d %s\n", progname
, nbwrittenfiles
, of
->name
);
2359 /* output file remains unchanged. */
2360 if (verbosity_level
>= 2)
2361 printf ("%s keep %s\n", progname
, of
->name
);
2365 of
->bufused
= of
->buflength
= 0;
2367 if (verbosity_level
>= 1)
2368 printf ("%s wrote %d files.\n", progname
, nbwrittenfiles
);
2375 const input_file
* file
;
2379 struct walk_type_data
;
2381 /* For scalars and strings, given the item in 'val'.
2382 For structures, given a pointer to the item in 'val'.
2383 For misc. pointers, given the item in 'val'.
2385 typedef void (*process_field_fn
) (type_p f
, const struct walk_type_data
* p
);
2386 typedef void (*func_name_fn
) (type_p s
, const struct walk_type_data
* p
);
2388 /* Parameters for write_types. */
2390 struct write_types_data
2393 const char *param_prefix
;
2394 const char *subfield_marker_routine
;
2395 const char *marker_routine
;
2396 const char *reorder_note_routine
;
2397 const char *comment
;
2398 int skip_hooks
; /* skip hook generation if non zero */
2401 static void output_escaped_param (struct walk_type_data
*d
,
2402 const char *, const char *);
2403 static void output_mangled_typename (outf_p
, const_type_p
);
2404 static void walk_type (type_p t
, struct walk_type_data
*d
);
2405 static void write_func_for_structure (type_p orig_s
, type_p s
, type_p
*param
,
2406 const struct write_types_data
*wtd
);
2407 static void write_types_process_field
2408 (type_p f
, const struct walk_type_data
*d
);
2409 static void write_types (outf_p output_header
,
2411 type_p param_structs
,
2412 const struct write_types_data
*wtd
);
2413 static void write_types_local_process_field
2414 (type_p f
, const struct walk_type_data
*d
);
2415 static void write_local_func_for_structure
2416 (const_type_p orig_s
, type_p s
, type_p
*param
);
2417 static void write_local (outf_p output_header
,
2418 type_p structures
, type_p param_structs
);
2419 static void write_enum_defn (type_p structures
, type_p param_structs
);
2420 static int contains_scalar_p (type_p t
);
2421 static void put_mangled_filename (outf_p
, const input_file
*);
2422 static void finish_root_table (struct flist
*flp
, const char *pfx
,
2423 const char *tname
, const char *lastname
,
2425 static void write_root (outf_p
, pair_p
, type_p
, const char *, int,
2426 struct fileloc
*, const char *, bool);
2427 static void write_array (outf_p f
, pair_p v
,
2428 const struct write_types_data
*wtd
);
2429 static void write_roots (pair_p
, bool);
2431 /* Parameters for walk_type. */
2433 struct walk_type_data
2435 process_field_fn process_field
;
2440 const char *prev_val
[4];
2443 const struct fileloc
*line
;
2448 const char *reorder_fn
;
2450 bool fn_wants_lvalue
;
2458 /* Given a string TYPE_NAME, representing a C++ typename, return a valid
2459 pre-processor identifier to use in a #define directive. This replaces
2460 special characters used in C++ identifiers like '>', '<' and ':' with
2463 If no C++ special characters are found in TYPE_NAME, return
2464 TYPE_NAME. Otherwise, return a copy of TYPE_NAME with the special
2465 characters replaced with '_'. In this case, the caller is
2466 responsible for freeing the allocated string. */
2469 filter_type_name (const char *type_name
)
2471 if (strchr (type_name
, '<') || strchr (type_name
, ':'))
2474 char *s
= xstrdup (type_name
);
2475 for (i
= 0; i
< strlen (s
); i
++)
2476 if (s
[i
] == '<' || s
[i
] == '>' || s
[i
] == ':' || s
[i
] == ',')
2485 /* Print a mangled name representing T to OF. */
2488 output_mangled_typename (outf_p of
, const_type_p t
)
2496 case TYPE_UNDEFINED
:
2501 output_mangled_typename (of
, t
->u
.p
);
2511 case TYPE_LANG_STRUCT
:
2512 case TYPE_USER_STRUCT
:
2514 const char *id_for_tag
= filter_type_name (t
->u
.s
.tag
);
2515 oprintf (of
, "%lu%s", (unsigned long) strlen (id_for_tag
),
2517 if (id_for_tag
!= t
->u
.s
.tag
)
2518 free (CONST_CAST(char *, id_for_tag
));
2521 case TYPE_PARAM_STRUCT
:
2524 for (i
= 0; i
< NUM_PARAM
; i
++)
2525 if (t
->u
.param_struct
.param
[i
] != NULL
)
2526 output_mangled_typename (of
, t
->u
.param_struct
.param
[i
]);
2527 output_mangled_typename (of
, t
->u
.param_struct
.stru
);
2535 /* Print PARAM to D->OF processing escapes. D->VAL references the
2536 current object, D->PREV_VAL the object containing the current
2537 object, ONAME is the name of the option and D->LINE is used to
2538 print error messages. */
2541 output_escaped_param (struct walk_type_data
*d
, const char *param
,
2546 for (p
= param
; *p
; p
++)
2548 oprintf (d
->of
, "%c", *p
);
2553 oprintf (d
->of
, "(%s)", d
->prev_val
[2]);
2556 oprintf (d
->of
, "(%s)", d
->prev_val
[0]);
2559 oprintf (d
->of
, "(%s)", d
->prev_val
[1]);
2563 const char *pp
= d
->val
+ strlen (d
->val
);
2564 while (pp
[-1] == ']')
2567 oprintf (d
->of
, "%s", pp
);
2571 error_at_line (d
->line
, "`%s' option contains bad escape %c%c",
2577 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2578 which is of type T. Write code to D->OF to constrain execution (at
2579 the point that D->PROCESS_FIELD is called) to the appropriate
2580 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2581 pointers to those objects. D->PREV_VAL lists the objects
2582 containing the current object, D->OPT is a list of options to
2583 apply, D->INDENT is the current indentation level, D->LINE is used
2584 to print error messages, D->BITMAP indicates which languages to
2585 print the structure for, and D->PARAM is the current parameter
2586 (from an enclosing param_is option). */
2589 walk_type (type_p t
, struct walk_type_data
*d
)
2591 const char *length
= NULL
;
2592 const char *desc
= NULL
;
2593 int maybe_undef_p
= 0;
2594 int use_param_num
= -1;
2595 int use_params_p
= 0;
2598 const struct nested_ptr_data
*nested_ptr_d
= NULL
;
2600 d
->needs_cast_p
= false;
2601 for (oo
= d
->opt
; oo
; oo
= oo
->next
)
2602 if (strcmp (oo
->name
, "length") == 0 && oo
->kind
== OPTION_STRING
)
2603 length
= oo
->info
.string
;
2604 else if (strcmp (oo
->name
, "maybe_undef") == 0)
2606 else if (strncmp (oo
->name
, "use_param", 9) == 0
2607 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
2608 use_param_num
= oo
->name
[9] == '\0' ? 0 : oo
->name
[9] - '0';
2609 else if (strcmp (oo
->name
, "use_params") == 0)
2611 else if (strcmp (oo
->name
, "desc") == 0 && oo
->kind
== OPTION_STRING
)
2612 desc
= oo
->info
.string
;
2613 else if (strcmp (oo
->name
, "mark_hook") == 0)
2615 else if (strcmp (oo
->name
, "nested_ptr") == 0
2616 && oo
->kind
== OPTION_NESTED
)
2617 nested_ptr_d
= (const struct nested_ptr_data
*) oo
->info
.nested
;
2618 else if (strcmp (oo
->name
, "dot") == 0)
2620 else if (strcmp (oo
->name
, "tag") == 0)
2622 else if (strcmp (oo
->name
, "special") == 0)
2624 else if (strcmp (oo
->name
, "skip") == 0)
2626 else if (strcmp (oo
->name
, "atomic") == 0)
2628 else if (strcmp (oo
->name
, "default") == 0)
2630 else if (strcmp (oo
->name
, "param_is") == 0)
2632 else if (strncmp (oo
->name
, "param", 5) == 0
2633 && ISDIGIT (oo
->name
[5]) && strcmp (oo
->name
+ 6, "_is") == 0)
2635 else if (strcmp (oo
->name
, "chain_next") == 0)
2637 else if (strcmp (oo
->name
, "chain_prev") == 0)
2639 else if (strcmp (oo
->name
, "chain_circular") == 0)
2641 else if (strcmp (oo
->name
, "reorder") == 0)
2643 else if (strcmp (oo
->name
, "variable_size") == 0)
2646 error_at_line (d
->line
, "unknown option `%s'\n", oo
->name
);
2653 int pointer_p
= t
->kind
== TYPE_POINTER
;
2657 if (!union_or_struct_p (t
))
2658 error_at_line (d
->line
, "`use_params' option on unimplemented type");
2660 t
= find_param_structure (t
, d
->param
);
2662 t
= create_pointer (t
);
2665 if (use_param_num
!= -1)
2667 if (d
->param
!= NULL
&& d
->param
[use_param_num
] != NULL
)
2669 type_p nt
= d
->param
[use_param_num
];
2671 if (t
->kind
== TYPE_ARRAY
)
2672 nt
= create_array (nt
, t
->u
.a
.len
);
2673 else if (length
!= NULL
&& t
->kind
== TYPE_POINTER
)
2674 nt
= create_pointer (nt
);
2675 d
->needs_cast_p
= (t
->kind
!= TYPE_POINTER
2676 && (nt
->kind
== TYPE_POINTER
2677 || nt
->kind
== TYPE_STRING
));
2681 error_at_line (d
->line
, "no parameter defined for `%s'", d
->val
);
2685 && (t
->kind
!= TYPE_POINTER
|| !union_or_struct_p (t
->u
.p
)))
2687 error_at_line (d
->line
,
2688 "field `%s' has invalid option `maybe_undef_p'\n",
2693 if (atomic_p
&& (t
->kind
!= TYPE_POINTER
) && (t
->kind
!= TYPE_STRING
))
2695 error_at_line (d
->line
, "field `%s' has invalid option `atomic'\n", d
->val
);
2703 d
->process_field (t
, d
);
2708 d
->in_ptr_field
= true;
2709 if (maybe_undef_p
&& t
->u
.p
->u
.s
.line
.file
== NULL
)
2711 oprintf (d
->of
, "%*sgcc_assert (!%s);\n", d
->indent
, "", d
->val
);
2715 /* If a pointer type is marked as "atomic", we process the
2716 field itself, but we don't walk the data that they point to.
2718 There are two main cases where we walk types: to mark
2719 pointers that are reachable, and to relocate pointers when
2720 writing a PCH file. In both cases, an atomic pointer is
2721 itself marked or relocated, but the memory that it points
2722 to is left untouched. In the case of PCH, that memory will
2723 be read/written unchanged to the PCH file. */
2726 oprintf (d
->of
, "%*sif (%s != NULL) {\n", d
->indent
, "", d
->val
);
2728 d
->process_field (t
, d
);
2730 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2736 if (!union_or_struct_p (t
->u
.p
)
2737 && t
->u
.p
->kind
!= TYPE_PARAM_STRUCT
)
2739 error_at_line (d
->line
,
2740 "field `%s' is pointer to unimplemented type",
2747 const char *oldprevval2
= d
->prev_val
[2];
2749 if (!union_or_struct_p (nested_ptr_d
->type
))
2751 error_at_line (d
->line
,
2752 "field `%s' has invalid "
2753 "option `nested_ptr'\n", d
->val
);
2757 d
->prev_val
[2] = d
->val
;
2758 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2760 d
->val
= xasprintf ("x%d", d
->counter
++);
2761 oprintf (d
->of
, "%*s%s %s * %s%s =\n", d
->indent
, "",
2762 (nested_ptr_d
->type
->kind
== TYPE_UNION
2763 ? "union" : "struct"),
2764 nested_ptr_d
->type
->u
.s
.tag
,
2765 d
->fn_wants_lvalue
? "" : "const ", d
->val
);
2766 oprintf (d
->of
, "%*s", d
->indent
+ 2, "");
2767 output_escaped_param (d
, nested_ptr_d
->convert_from
,
2769 oprintf (d
->of
, ";\n");
2771 d
->process_field (nested_ptr_d
->type
, d
);
2773 if (d
->fn_wants_lvalue
)
2775 oprintf (d
->of
, "%*s%s = ", d
->indent
, "",
2777 d
->prev_val
[2] = d
->val
;
2778 output_escaped_param (d
, nested_ptr_d
->convert_to
,
2780 oprintf (d
->of
, ";\n");
2784 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2785 d
->val
= d
->prev_val
[2];
2786 d
->prev_val
[2] = oldprevval2
;
2789 d
->process_field (t
->u
.p
, d
);
2793 int loopcounter
= d
->loopcounter
;
2794 const char *oldval
= d
->val
;
2795 const char *oldprevval3
= d
->prev_val
[3];
2798 oprintf (d
->of
, "%*sif (%s != NULL) {\n", d
->indent
, "", d
->val
);
2800 oprintf (d
->of
, "%*ssize_t i%d;\n", d
->indent
, "", loopcounter
);
2801 oprintf (d
->of
, "%*sfor (i%d = 0; i%d != (size_t)(", d
->indent
,
2802 "", loopcounter
, loopcounter
);
2803 if (!d
->in_record_p
)
2804 output_escaped_param (d
, length
, "length");
2806 oprintf (d
->of
, "l%d", loopcounter
);
2807 if (d
->have_this_obj
)
2808 /* Try to unswitch loops (see PR53880). */
2809 oprintf (d
->of
, ") && ((void *)%s == this_obj", oldval
);
2810 oprintf (d
->of
, "); i%d++) {\n", loopcounter
);
2812 d
->val
= newval
= xasprintf ("%s[i%d]", oldval
, loopcounter
);
2814 d
->prev_val
[3] = oldval
;
2815 walk_type (t
->u
.p
, d
);
2818 d
->prev_val
[3] = oldprevval3
;
2821 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2822 d
->process_field (t
, d
);
2824 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2826 d
->in_ptr_field
= false;
2833 const char *oldval
= d
->val
;
2836 /* If it's an array of scalars, we optimize by not generating
2838 if (t
->u
.a
.p
->kind
== TYPE_SCALAR
)
2842 loopcounter
= d
->loopcounter
;
2844 loopcounter
= d
->counter
++;
2846 /* When walking an array, compute the length and store it in a
2847 local variable before walking the array elements, instead of
2848 recomputing the length expression each time through the loop.
2849 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2850 where the length is stored in the first array element,
2851 because otherwise that operand can get overwritten on the
2853 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2855 oprintf (d
->of
, "%*ssize_t i%d;\n", d
->indent
, "", loopcounter
);
2856 if (!d
->in_record_p
|| !length
)
2858 oprintf (d
->of
, "%*ssize_t l%d = (size_t)(",
2859 d
->indent
, "", loopcounter
);
2861 output_escaped_param (d
, length
, "length");
2863 oprintf (d
->of
, "%s", t
->u
.a
.len
);
2864 oprintf (d
->of
, ");\n");
2867 oprintf (d
->of
, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2869 loopcounter
, loopcounter
, loopcounter
, loopcounter
);
2871 d
->val
= newval
= xasprintf ("%s[i%d]", oldval
, loopcounter
);
2873 walk_type (t
->u
.a
.p
, d
);
2878 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2880 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2888 const char *oldval
= d
->val
;
2889 const char *oldprevval1
= d
->prev_val
[1];
2890 const char *oldprevval2
= d
->prev_val
[2];
2891 const char *struct_mark_hook
= NULL
;
2892 const int union_p
= t
->kind
== TYPE_UNION
;
2893 int seen_default_p
= 0;
2895 int lengths_seen
= 0;
2897 bool any_length_seen
= false;
2899 if (!t
->u
.s
.line
.file
)
2900 error_at_line (d
->line
, "incomplete structure `%s'", t
->u
.s
.tag
);
2902 if ((d
->bitmap
& t
->u
.s
.bitmap
) != d
->bitmap
)
2904 error_at_line (d
->line
,
2905 "structure `%s' defined for mismatching languages",
2907 error_at_line (&t
->u
.s
.line
, "one structure defined here");
2910 /* Some things may also be defined in the structure's options. */
2911 for (o
= t
->u
.s
.opt
; o
; o
= o
->next
)
2912 if (!desc
&& strcmp (o
->name
, "desc") == 0
2913 && o
->kind
== OPTION_STRING
)
2914 desc
= o
->info
.string
;
2915 else if (!struct_mark_hook
&& strcmp (o
->name
, "mark_hook") == 0
2916 && o
->kind
== OPTION_STRING
)
2917 struct_mark_hook
= o
->info
.string
;
2919 if (struct_mark_hook
)
2920 oprintf (d
->of
, "%*s%s (&%s);\n",
2921 d
->indent
, "", struct_mark_hook
, oldval
);
2923 d
->prev_val
[2] = oldval
;
2924 d
->prev_val
[1] = oldprevval2
;
2929 error_at_line (d
->line
,
2930 "missing `desc' option for union `%s'",
2934 oprintf (d
->of
, "%*sswitch (", d
->indent
, "");
2935 output_escaped_param (d
, desc
, "desc");
2936 oprintf (d
->of
, ")\n");
2938 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2941 for (f
= t
->u
.s
.fields
; f
; f
= f
->next
)
2945 const char *fieldlength
= NULL
;
2947 d
->reorder_fn
= NULL
;
2948 for (oo
= f
->opt
; oo
; oo
= oo
->next
)
2949 if (strcmp (oo
->name
, "skip") == 0)
2951 else if (strcmp (oo
->name
, "length") == 0
2952 && oo
->kind
== OPTION_STRING
)
2953 fieldlength
= oo
->info
.string
;
2963 if (!any_length_seen
)
2965 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2968 any_length_seen
= true;
2970 oprintf (d
->of
, "%*ssize_t l%d = (size_t)(",
2971 d
->indent
, "", d
->counter
- 1);
2972 output_escaped_param (d
, fieldlength
, "length");
2973 oprintf (d
->of
, ");\n");
2977 endcounter
= d
->counter
;
2979 for (f
= t
->u
.s
.fields
; f
; f
= f
->next
)
2982 const char *dot
= ".";
2983 const char *tagid
= NULL
;
2986 int use_param_p
= 0;
2987 const char *fieldlength
= NULL
;
2990 d
->reorder_fn
= NULL
;
2991 for (oo
= f
->opt
; oo
; oo
= oo
->next
)
2992 if (strcmp (oo
->name
, "dot") == 0
2993 && oo
->kind
== OPTION_STRING
)
2994 dot
= oo
->info
.string
;
2995 else if (strcmp (oo
->name
, "tag") == 0
2996 && oo
->kind
== OPTION_STRING
)
2997 tagid
= oo
->info
.string
;
2998 else if (strcmp (oo
->name
, "skip") == 0)
3000 else if (strcmp (oo
->name
, "default") == 0)
3002 else if (strcmp (oo
->name
, "reorder") == 0
3003 && oo
->kind
== OPTION_STRING
)
3004 d
->reorder_fn
= oo
->info
.string
;
3005 else if (strncmp (oo
->name
, "use_param", 9) == 0
3006 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
3008 else if (strcmp (oo
->name
, "length") == 0
3009 && oo
->kind
== OPTION_STRING
)
3010 fieldlength
= oo
->info
.string
;
3015 if (union_p
&& tagid
)
3017 oprintf (d
->of
, "%*scase %s:\n", d
->indent
, "", tagid
);
3020 else if (union_p
&& default_p
)
3022 oprintf (d
->of
, "%*sdefault:\n", d
->indent
, "");
3026 else if (!union_p
&& (default_p
|| tagid
))
3027 error_at_line (d
->line
,
3028 "can't use `%s' outside a union on field `%s'",
3029 default_p
? "default" : "tag", f
->name
);
3030 else if (union_p
&& !(default_p
|| tagid
)
3031 && f
->type
->kind
== TYPE_SCALAR
)
3034 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
3035 get_input_file_name (d
->line
->file
), d
->line
->line
,
3039 else if (union_p
&& !(default_p
|| tagid
))
3040 error_at_line (d
->line
,
3041 "field `%s' is missing `tag' or `default' option",
3046 d
->loopcounter
= endcounter
- lengths_seen
--;
3050 d
->val
= newval
= xasprintf ("%s%s%s", oldval
, dot
, f
->name
);
3052 d
->used_length
= false;
3053 d
->in_record_p
= !union_p
;
3055 if (union_p
&& use_param_p
&& d
->param
== NULL
)
3056 oprintf (d
->of
, "%*sgcc_unreachable ();\n", d
->indent
, "");
3058 walk_type (f
->type
, d
);
3060 d
->in_record_p
= false;
3066 oprintf (d
->of
, "%*sbreak;\n", d
->indent
, "");
3070 d
->reorder_fn
= NULL
;
3073 d
->prev_val
[1] = oldprevval1
;
3074 d
->prev_val
[2] = oldprevval2
;
3076 if (union_p
&& !seen_default_p
)
3078 oprintf (d
->of
, "%*sdefault:\n", d
->indent
, "");
3079 oprintf (d
->of
, "%*s break;\n", d
->indent
, "");
3083 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3086 if (any_length_seen
)
3089 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
3094 case TYPE_LANG_STRUCT
:
3097 for (nt
= t
->u
.s
.lang_struct
; nt
; nt
= nt
->next
)
3098 if ((d
->bitmap
& nt
->u
.s
.bitmap
) == d
->bitmap
)
3101 error_at_line (d
->line
, "structure `%s' differs between languages",
3108 case TYPE_PARAM_STRUCT
:
3110 type_p
*oldparam
= d
->param
;
3112 d
->param
= t
->u
.param_struct
.param
;
3113 walk_type (t
->u
.param_struct
.stru
, d
);
3114 d
->param
= oldparam
;
3118 case TYPE_USER_STRUCT
:
3119 d
->process_field (t
, d
);
3123 case TYPE_UNDEFINED
:
3128 /* process_field routine for marking routines. */
3131 write_types_process_field (type_p f
, const struct walk_type_data
*d
)
3133 const struct write_types_data
*wtd
;
3134 const char *cast
= d
->needs_cast_p
? "(void *)" : "";
3135 wtd
= (const struct write_types_data
*) d
->cookie
;
3140 case TYPE_UNDEFINED
:
3143 oprintf (d
->of
, "%*s%s (%s%s", d
->indent
, "",
3144 wtd
->subfield_marker_routine
, cast
, d
->val
);
3145 if (wtd
->param_prefix
)
3147 if (f
->u
.p
->kind
== TYPE_SCALAR
)
3148 /* The current type is a pointer to a scalar (so not
3149 considered like a pointer to instances of user defined
3150 types) and we are seeing it; it means we must be even
3151 more careful about the second argument of the
3152 SUBFIELD_MARKER_ROUTINE call. That argument must
3153 always be the instance of the type for which
3154 write_func_for_structure was called - this really is
3155 what the function SUBFIELD_MARKER_ROUTINE expects.
3156 That is, it must be an instance of the ORIG_S type
3157 parameter of write_func_for_structure. The convention
3158 is that that argument must be "x" in that case (as set
3159 by write_func_for_structure). The problem is, we can't
3160 count on d->prev_val[3] to be always set to "x" in that
3161 case. Sometimes walk_type can set it to something else
3162 (to e.g cooperate with write_array when called from
3163 write_roots). So let's set it to "x" here then. */
3164 oprintf (d
->of
, ", x");
3166 oprintf (d
->of
, ", %s", d
->prev_val
[3]);
3169 oprintf (d
->of
, ", gt_%s_", wtd
->param_prefix
);
3170 output_mangled_typename (d
->of
, d
->orig_s
);
3173 oprintf (d
->of
, ", gt_%sa_%s", wtd
->param_prefix
, d
->prev_val
[0]);
3175 if (f
->u
.p
->kind
== TYPE_PARAM_STRUCT
3176 && f
->u
.p
->u
.s
.line
.file
!= NULL
)
3178 oprintf (d
->of
, ", gt_e_");
3179 output_mangled_typename (d
->of
, f
);
3181 else if (union_or_struct_p (f
) && f
->u
.p
->u
.s
.line
.file
!= NULL
)
3183 oprintf (d
->of
, ", gt_ggc_e_");
3184 output_mangled_typename (d
->of
, f
);
3187 oprintf (d
->of
, ", gt_types_enum_last");
3189 oprintf (d
->of
, ");\n");
3190 if (d
->reorder_fn
&& wtd
->reorder_note_routine
)
3191 oprintf (d
->of
, "%*s%s (%s%s, %s, %s);\n", d
->indent
, "",
3192 wtd
->reorder_note_routine
, cast
, d
->val
,
3193 d
->prev_val
[3], d
->reorder_fn
);
3199 case TYPE_LANG_STRUCT
:
3200 case TYPE_PARAM_STRUCT
:
3201 case TYPE_USER_STRUCT
:
3202 if (f
->kind
== TYPE_USER_STRUCT
&& !d
->in_ptr_field
)
3204 /* If F is a user-defined type and the field is not a
3205 pointer to the type, then we should not generate the
3206 standard pointer-marking code. All we need to do is call
3207 the user-provided marking function to process the fields
3209 oprintf (d
->of
, "%*sgt_%sx (&(%s));\n", d
->indent
, "", wtd
->prefix
,
3214 oprintf (d
->of
, "%*sgt_%s_", d
->indent
, "", wtd
->prefix
);
3215 output_mangled_typename (d
->of
, f
);
3216 oprintf (d
->of
, " (%s%s);\n", cast
, d
->val
);
3217 if (d
->reorder_fn
&& wtd
->reorder_note_routine
)
3218 oprintf (d
->of
, "%*s%s (%s%s, %s%s, %s);\n", d
->indent
, "",
3219 wtd
->reorder_note_routine
, cast
, d
->val
, cast
, d
->val
,
3232 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
3235 output_type_enum (outf_p of
, type_p s
)
3237 if (s
->kind
== TYPE_PARAM_STRUCT
&& s
->u
.param_struct
.line
.file
!= NULL
)
3239 oprintf (of
, ", gt_e_");
3240 output_mangled_typename (of
, s
);
3242 else if (union_or_struct_p (s
) && s
->u
.s
.line
.file
!= NULL
)
3244 oprintf (of
, ", gt_ggc_e_");
3245 output_mangled_typename (of
, s
);
3248 oprintf (of
, ", gt_types_enum_last");
3251 /* Return an output file that is suitable for definitions which can
3252 reference struct S */
3255 get_output_file_for_structure (const_type_p s
, type_p
*param
)
3257 const input_file
*fn
;
3260 gcc_assert (union_or_struct_p (s
));
3261 fn
= s
->u
.s
.line
.file
;
3263 /* This is a hack, and not the good kind either. */
3264 for (i
= NUM_PARAM
- 1; i
>= 0; i
--)
3265 if (param
&& param
[i
] && param
[i
]->kind
== TYPE_POINTER
3266 && union_or_struct_p (param
[i
]->u
.p
))
3267 fn
= param
[i
]->u
.p
->u
.s
.line
.file
;
3269 /* The call to get_output_file_with_visibility may update fn by
3270 caching its result inside, so we need the CONST_CAST. */
3271 return get_output_file_with_visibility (CONST_CAST (input_file
*, fn
));
3275 /* Returns the specifier keyword for a string or union type S, empty string
3279 get_type_specifier (const type_p s
)
3281 if (s
->kind
== TYPE_STRUCT
)
3283 else if (s
->kind
== TYPE_LANG_STRUCT
)
3284 return get_type_specifier (s
->u
.s
.lang_struct
);
3285 else if (s
->kind
== TYPE_UNION
)
3291 /* Emits a declaration for type TY (assumed to be a union or a
3292 structure) on stream OUT. */
3295 write_type_decl (outf_p out
, type_p ty
)
3297 if (union_or_struct_p (ty
))
3298 oprintf (out
, "%s%s", get_type_specifier (ty
), ty
->u
.s
.tag
);
3299 else if (ty
->kind
== TYPE_SCALAR
)
3301 if (ty
->u
.scalar_is_char
)
3302 oprintf (out
, "const char");
3304 oprintf (out
, "void");
3306 else if (ty
->kind
== TYPE_POINTER
)
3308 write_type_decl (out
, ty
->u
.p
);
3309 oprintf (out
, " *");
3311 else if (ty
->kind
== TYPE_ARRAY
)
3313 write_type_decl (out
, ty
->u
.a
.p
);
3314 oprintf (out
, " *");
3316 else if (ty
->kind
== TYPE_STRING
)
3318 oprintf (out
, "const char *");
3325 /* Write on OF the name of the marker function for structure S. PREFIX
3326 is the prefix to use (to distinguish ggc from pch markers). */
3329 write_marker_function_name (outf_p of
, type_p s
, const char *prefix
)
3331 if (union_or_struct_p (s
))
3333 const char *id_for_tag
= filter_type_name (s
->u
.s
.tag
);
3334 oprintf (of
, "gt_%sx_%s", prefix
, id_for_tag
);
3335 if (id_for_tag
!= s
->u
.s
.tag
)
3336 free (CONST_CAST(char *, id_for_tag
));
3338 else if (s
->kind
== TYPE_PARAM_STRUCT
)
3340 oprintf (of
, "gt_%s_", prefix
);
3341 output_mangled_typename (of
, s
);
3347 /* Write on OF a user-callable routine to act as an entry point for
3348 the marking routine for S, generated by write_func_for_structure.
3349 PREFIX is the prefix to use to distinguish ggc and pch markers. */
3352 write_user_func_for_structure_ptr (outf_p of
, type_p s
, const char *prefix
)
3354 /* Parameterized structures are not supported in user markers. There
3355 is no way for the marker function to know which specific type
3356 to use to generate the call to the void * entry point. For
3357 instance, a marker for struct htab may need to call different
3358 routines to mark the fields, depending on the paramN_is attributes.
3360 A user-defined marker that accepts 'struct htab' as its argument
3361 would not know which variant to call. Generating several entry
3362 points accepting 'struct htab' would cause multiply-defined
3363 errors during compilation. */
3364 gcc_assert (union_or_struct_p (s
));
3366 type_p alias_of
= NULL
;
3367 for (options_p opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3368 if (strcmp (opt
->name
, "ptr_alias") == 0)
3370 /* ALIAS_OF is set if ORIG_S is marked "ptr_alias". This means that
3371 we do not generate marking code for ORIG_S here. Instead, a
3372 forwarder #define in gtype-desc.h will cause every call to its
3373 marker to call the target of this alias.
3375 However, we still want to create a user entry code for the
3376 aliased type. So, if ALIAS_OF is set, we only generate the
3377 user-callable marker function. */
3378 alias_of
= opt
->info
.type
;
3382 oprintf (of
, "\nvoid\n");
3383 oprintf (of
, "gt_%sx (", prefix
);
3384 write_type_decl (of
, s
);
3385 oprintf (of
, " *& x)\n");
3386 oprintf (of
, "{\n");
3387 oprintf (of
, " if (x)\n ");
3388 write_marker_function_name (of
, alias_of
? alias_of
: s
, prefix
);
3389 oprintf (of
, " ((void *) x);\n");
3390 oprintf (of
, "}\n");
3394 /* Write a function to mark all the fields of type S on OF. PREFIX
3395 and D are as in write_user_marking_functions. */
3398 write_user_func_for_structure_body (type_p s
, const char *prefix
,
3399 struct walk_type_data
*d
)
3401 oprintf (d
->of
, "\nvoid\n");
3402 oprintf (d
->of
, "gt_%sx (", prefix
);
3403 write_type_decl (d
->of
, s
);
3404 oprintf (d
->of
, "& x_r ATTRIBUTE_UNUSED)\n");
3405 oprintf (d
->of
, "{\n");
3406 oprintf (d
->of
, " ");
3407 write_type_decl (d
->of
, s
);
3408 oprintf (d
->of
, " * ATTRIBUTE_UNUSED x = &x_r;\n");
3412 oprintf (d
->of
, "}\n");
3416 /* Emit the user-callable functions needed to mark all the types used
3417 by the user structure S. PREFIX is the prefix to use to
3418 distinguish ggc and pch markers. D contains data needed to pass to
3419 walk_type when traversing the fields of a type.
3421 For every type T referenced by S, two routines are generated: one
3422 that takes 'T *', marks the pointer and calls the second routine,
3423 which just marks the fields of T. */
3426 write_user_marking_functions (type_p s
, const char *prefix
,
3427 struct walk_type_data
*d
)
3429 gcc_assert (s
->kind
== TYPE_USER_STRUCT
);
3431 for (pair_p fld
= s
->u
.s
.fields
; fld
; fld
= fld
->next
)
3433 type_p fld_type
= fld
->type
;
3434 if (fld_type
->kind
== TYPE_POINTER
)
3436 type_p pointed_to_type
= fld_type
->u
.p
;
3437 if (union_or_struct_p (pointed_to_type
))
3438 write_user_func_for_structure_ptr (d
->of
, pointed_to_type
, prefix
);
3440 else if (union_or_struct_p (fld_type
))
3441 write_user_func_for_structure_body (fld_type
, prefix
, d
);
3446 /* For S, a structure that's part of ORIG_S, and using parameters
3447 PARAM, write out a routine that:
3448 - Takes a parameter, a void * but actually of type *S
3449 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
3450 field of S or its substructures and (in some cases) things
3451 that are pointed to by S. */
3454 write_func_for_structure (type_p orig_s
, type_p s
, type_p
*param
,
3455 const struct write_types_data
*wtd
)
3457 const char *chain_next
= NULL
;
3458 const char *chain_prev
= NULL
;
3459 const char *chain_circular
= NULL
;
3460 const char *mark_hook_name
= NULL
;
3462 struct walk_type_data d
;
3464 memset (&d
, 0, sizeof (d
));
3465 d
.of
= get_output_file_for_structure (s
, param
);
3466 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3467 if (strcmp (opt
->name
, "chain_next") == 0
3468 && opt
->kind
== OPTION_STRING
)
3469 chain_next
= opt
->info
.string
;
3470 else if (strcmp (opt
->name
, "chain_prev") == 0
3471 && opt
->kind
== OPTION_STRING
)
3472 chain_prev
= opt
->info
.string
;
3473 else if (strcmp (opt
->name
, "chain_circular") == 0
3474 && opt
->kind
== OPTION_STRING
)
3475 chain_circular
= opt
->info
.string
;
3476 else if (strcmp (opt
->name
, "mark_hook") == 0
3477 && opt
->kind
== OPTION_STRING
)
3478 mark_hook_name
= opt
->info
.string
;
3479 if (chain_prev
!= NULL
&& chain_next
== NULL
)
3480 error_at_line (&s
->u
.s
.line
, "chain_prev without chain_next");
3481 if (chain_circular
!= NULL
&& chain_next
!= NULL
)
3482 error_at_line (&s
->u
.s
.line
, "chain_circular with chain_next");
3483 if (chain_circular
!= NULL
)
3484 chain_next
= chain_circular
;
3486 d
.process_field
= write_types_process_field
;
3490 d
.line
= &s
->u
.s
.line
;
3491 d
.bitmap
= s
->u
.s
.bitmap
;
3493 d
.prev_val
[0] = "*x";
3494 d
.prev_val
[1] = "not valid postage"; /* Guarantee an error. */
3495 d
.prev_val
[3] = "x";
3497 d
.have_this_obj
= false;
3499 oprintf (d
.of
, "\n");
3500 oprintf (d
.of
, "void\n");
3501 write_marker_function_name (d
.of
, orig_s
, wtd
->prefix
);
3502 oprintf (d
.of
, " (void *x_p)\n");
3503 oprintf (d
.of
, "{\n ");
3504 write_type_decl (d
.of
, s
);
3505 oprintf (d
.of
, " * %sx = (", chain_next
== NULL
? "const " : "");
3506 write_type_decl (d
.of
, s
);
3507 oprintf (d
.of
, " *)x_p;\n");
3508 if (chain_next
!= NULL
)
3510 /* TYPE_USER_STRUCTs should not occur here. These structures
3511 are completely handled by user code. */
3512 gcc_assert (orig_s
->kind
!= TYPE_USER_STRUCT
);
3514 oprintf (d
.of
, " ");
3515 write_type_decl (d
.of
, s
);
3516 oprintf (d
.of
, " * xlimit = x;\n");
3518 if (chain_next
== NULL
)
3520 oprintf (d
.of
, " if (%s (x", wtd
->marker_routine
);
3521 if (wtd
->param_prefix
)
3523 oprintf (d
.of
, ", x, gt_%s_", wtd
->param_prefix
);
3524 output_mangled_typename (d
.of
, orig_s
);
3525 output_type_enum (d
.of
, orig_s
);
3527 oprintf (d
.of
, "))\n");
3531 if (chain_circular
!= NULL
)
3532 oprintf (d
.of
, " if (!%s (xlimit", wtd
->marker_routine
);
3534 oprintf (d
.of
, " while (%s (xlimit", wtd
->marker_routine
);
3535 if (wtd
->param_prefix
)
3537 oprintf (d
.of
, ", xlimit, gt_%s_", wtd
->param_prefix
);
3538 output_mangled_typename (d
.of
, orig_s
);
3539 output_type_enum (d
.of
, orig_s
);
3541 oprintf (d
.of
, "))\n");
3542 if (chain_circular
!= NULL
)
3543 oprintf (d
.of
, " return;\n do\n");
3544 if (mark_hook_name
&& !wtd
->skip_hooks
)
3546 oprintf (d
.of
, " {\n");
3547 oprintf (d
.of
, " %s (xlimit);\n ", mark_hook_name
);
3549 oprintf (d
.of
, " xlimit = (");
3550 d
.prev_val
[2] = "*xlimit";
3551 output_escaped_param (&d
, chain_next
, "chain_next");
3552 oprintf (d
.of
, ");\n");
3553 if (mark_hook_name
&& !wtd
->skip_hooks
)
3554 oprintf (d
.of
, " }\n");
3555 if (chain_prev
!= NULL
)
3557 oprintf (d
.of
, " if (x != xlimit)\n");
3558 oprintf (d
.of
, " for (;;)\n");
3559 oprintf (d
.of
, " {\n");
3560 oprintf (d
.of
, " %s %s * const xprev = (",
3561 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
3563 d
.prev_val
[2] = "*x";
3564 output_escaped_param (&d
, chain_prev
, "chain_prev");
3565 oprintf (d
.of
, ");\n");
3566 oprintf (d
.of
, " if (xprev == NULL) break;\n");
3567 oprintf (d
.of
, " x = xprev;\n");
3568 oprintf (d
.of
, " (void) %s (xprev", wtd
->marker_routine
);
3569 if (wtd
->param_prefix
)
3571 oprintf (d
.of
, ", xprev, gt_%s_", wtd
->param_prefix
);
3572 output_mangled_typename (d
.of
, orig_s
);
3573 output_type_enum (d
.of
, orig_s
);
3575 oprintf (d
.of
, ");\n");
3576 oprintf (d
.of
, " }\n");
3578 if (chain_circular
!= NULL
)
3580 oprintf (d
.of
, " while (%s (xlimit", wtd
->marker_routine
);
3581 if (wtd
->param_prefix
)
3583 oprintf (d
.of
, ", xlimit, gt_%s_", wtd
->param_prefix
);
3584 output_mangled_typename (d
.of
, orig_s
);
3585 output_type_enum (d
.of
, orig_s
);
3587 oprintf (d
.of
, "));\n");
3588 if (mark_hook_name
&& !wtd
->skip_hooks
)
3589 oprintf (d
.of
, " %s (xlimit);\n", mark_hook_name
);
3590 oprintf (d
.of
, " do\n");
3593 oprintf (d
.of
, " while (x != xlimit)\n");
3595 oprintf (d
.of
, " {\n");
3596 if (mark_hook_name
&& chain_next
== NULL
&& !wtd
->skip_hooks
)
3598 oprintf (d
.of
, " %s (x);\n", mark_hook_name
);
3601 d
.prev_val
[2] = "*x";
3603 if (orig_s
->kind
!= TYPE_USER_STRUCT
)
3607 /* User structures have no fields to walk. Simply generate a call
3608 to the user-provided structure marker. */
3609 oprintf (d
.of
, "%*sgt_%sx (x);\n", d
.indent
, "", wtd
->prefix
);
3612 if (chain_next
!= NULL
)
3614 oprintf (d
.of
, " x = (");
3615 output_escaped_param (&d
, chain_next
, "chain_next");
3616 oprintf (d
.of
, ");\n");
3619 oprintf (d
.of
, " }\n");
3620 if (chain_circular
!= NULL
)
3621 oprintf (d
.of
, " while (x != xlimit);\n");
3622 oprintf (d
.of
, "}\n");
3624 if (orig_s
->kind
== TYPE_USER_STRUCT
)
3625 write_user_marking_functions (orig_s
, wtd
->prefix
, &d
);
3629 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
3632 write_types (outf_p output_header
, type_p structures
, type_p param_structs
,
3633 const struct write_types_data
*wtd
)
3635 int nbfun
= 0; /* Count the emitted functions. */
3638 oprintf (output_header
, "\n/* %s*/\n", wtd
->comment
);
3640 /* We first emit the macros and the declarations. Functions' code is
3641 emitted afterwards. This is needed in plugin mode. */
3642 oprintf (output_header
, "/* Macros and declarations. */\n");
3643 for (s
= structures
; s
; s
= s
->next
)
3644 if (s
->gc_used
== GC_POINTED_TO
|| s
->gc_used
== GC_MAYBE_POINTED_TO
)
3648 if (s
->gc_used
== GC_MAYBE_POINTED_TO
&& s
->u
.s
.line
.file
== NULL
)
3651 const char *s_id_for_tag
= filter_type_name (s
->u
.s
.tag
);
3653 oprintf (output_header
, "#define gt_%s_", wtd
->prefix
);
3654 output_mangled_typename (output_header
, s
);
3655 oprintf (output_header
, "(X) do { \\\n");
3656 oprintf (output_header
,
3657 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd
->prefix
,
3659 oprintf (output_header
, " } while (0)\n");
3661 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3662 if (strcmp (opt
->name
, "ptr_alias") == 0
3663 && opt
->kind
== OPTION_TYPE
)
3665 const_type_p
const t
= (const_type_p
) opt
->info
.type
;
3666 if (t
->kind
== TYPE_STRUCT
3667 || t
->kind
== TYPE_UNION
|| t
->kind
== TYPE_LANG_STRUCT
)
3669 const char *t_id_for_tag
= filter_type_name (t
->u
.s
.tag
);
3670 oprintf (output_header
,
3671 "#define gt_%sx_%s gt_%sx_%s\n",
3672 wtd
->prefix
, s
->u
.s
.tag
, wtd
->prefix
, t_id_for_tag
);
3673 if (t_id_for_tag
!= t
->u
.s
.tag
)
3674 free (CONST_CAST(char *, t_id_for_tag
));
3677 error_at_line (&s
->u
.s
.line
,
3678 "structure alias is not a structure");
3684 /* Declare the marker procedure only once. */
3685 oprintf (output_header
,
3686 "extern void gt_%sx_%s (void *);\n",
3687 wtd
->prefix
, s_id_for_tag
);
3689 if (s_id_for_tag
!= s
->u
.s
.tag
)
3690 free (CONST_CAST(char *, s_id_for_tag
));
3692 if (s
->u
.s
.line
.file
== NULL
)
3694 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
3700 for (s
= param_structs
; s
; s
= s
->next
)
3701 if (s
->gc_used
== GC_POINTED_TO
)
3703 type_p stru
= s
->u
.param_struct
.stru
;
3705 /* Declare the marker procedure. */
3706 oprintf (output_header
, "extern void gt_%s_", wtd
->prefix
);
3707 output_mangled_typename (output_header
, s
);
3708 oprintf (output_header
, " (void *);\n");
3710 if (stru
->u
.s
.line
.file
== NULL
)
3712 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
3718 /* At last we emit the functions code. */
3719 oprintf (output_header
, "\n/* functions code */\n");
3720 for (s
= structures
; s
; s
= s
->next
)
3721 if (s
->gc_used
== GC_POINTED_TO
|| s
->gc_used
== GC_MAYBE_POINTED_TO
)
3725 if (s
->gc_used
== GC_MAYBE_POINTED_TO
&& s
->u
.s
.line
.file
== NULL
)
3727 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
3728 if (strcmp (opt
->name
, "ptr_alias") == 0)
3733 if (s
->kind
== TYPE_LANG_STRUCT
)
3736 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
3739 DBGPRINTF ("writing func #%d lang_struct ss @ %p '%s'",
3740 nbfun
, (void*) ss
, ss
->u
.s
.tag
);
3741 write_func_for_structure (s
, ss
, NULL
, wtd
);
3747 DBGPRINTF ("writing func #%d struct s @ %p '%s'",
3748 nbfun
, (void*) s
, s
->u
.s
.tag
);
3749 write_func_for_structure (s
, s
, NULL
, wtd
);
3754 /* Structure s is not possibly pointed to, so can be ignored. */
3755 DBGPRINTF ("ignored s @ %p '%s' gc_used#%d",
3756 (void*)s
, s
->u
.s
.tag
,
3760 for (s
= param_structs
; s
; s
= s
->next
)
3761 if (s
->gc_used
== GC_POINTED_TO
)
3763 type_p
*param
= s
->u
.param_struct
.param
;
3764 type_p stru
= s
->u
.param_struct
.stru
;
3765 if (stru
->u
.s
.line
.file
== NULL
)
3767 if (stru
->kind
== TYPE_LANG_STRUCT
)
3770 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
3773 DBGPRINTF ("writing func #%d param lang_struct ss @ %p '%s'",
3774 nbfun
, (void*) ss
, ss
->u
.s
.tag
);
3775 write_func_for_structure (s
, ss
, param
, wtd
);
3781 DBGPRINTF ("writing func #%d param struct s @ %p stru @ %p '%s'",
3783 (void*) stru
, stru
->u
.s
.tag
);
3784 write_func_for_structure (s
, stru
, param
, wtd
);
3789 /* Param structure s is not pointed to, so should be ignored. */
3790 DBGPRINTF ("ignored s @ %p", (void*)s
);
3792 if (verbosity_level
>= 2)
3793 printf ("%s emitted %d routines for %s\n",
3794 progname
, nbfun
, wtd
->comment
);
3797 static const struct write_types_data ggc_wtd
= {
3798 "ggc_m", NULL
, "ggc_mark", "ggc_test_and_set_mark", NULL
,
3799 "GC marker procedures. ",
3803 static const struct write_types_data pch_wtd
= {
3804 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
3805 "gt_pch_note_reorder",
3806 "PCH type-walking procedures. ",
3810 /* Write out the local pointer-walking routines. */
3812 /* process_field routine for local pointer-walking for user-callable
3813 routines. The difference between this and
3814 write_types_local_process_field is that, in this case, we do not
3815 need to check whether the given pointer matches the address of the
3816 parent structure. This check was already generated by the call
3817 to gt_pch_nx in the main gt_pch_p_*() function that is calling
3821 write_types_local_user_process_field (type_p f
, const struct walk_type_data
*d
)
3828 case TYPE_LANG_STRUCT
:
3829 case TYPE_PARAM_STRUCT
:
3831 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
3834 case TYPE_USER_STRUCT
:
3835 if (d
->in_ptr_field
)
3836 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
3838 oprintf (d
->of
, "%*s gt_pch_nx (&(%s), op, cookie);\n",
3839 d
->indent
, "", d
->val
);
3847 case TYPE_UNDEFINED
:
3853 /* Write a function to PCH walk all the fields of type S on OF.
3854 D contains data needed by walk_type to recurse into the fields of S. */
3857 write_pch_user_walking_for_structure_body (type_p s
, struct walk_type_data
*d
)
3859 oprintf (d
->of
, "\nvoid\n");
3860 oprintf (d
->of
, "gt_pch_nx (");
3861 write_type_decl (d
->of
, s
);
3862 oprintf (d
->of
, "* x ATTRIBUTE_UNUSED,\n"
3863 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3864 "\tATTRIBUTE_UNUSED void *cookie)\n");
3865 oprintf (d
->of
, "{\n");
3868 d
->process_field
= write_types_local_user_process_field
;
3870 oprintf (d
->of
, "}\n");
3874 /* Emit the user-callable functions needed to mark all the types used
3875 by the user structure S. PREFIX is the prefix to use to
3876 distinguish ggc and pch markers. CHAIN_NEXT is set if S has the
3877 chain_next option defined. D contains data needed to pass to
3878 walk_type when traversing the fields of a type.
3880 For every type T referenced by S, two routines are generated: one
3881 that takes 'T *', marks the pointer and calls the second routine,
3882 which just marks the fields of T. */
3885 write_pch_user_walking_functions (type_p s
, struct walk_type_data
*d
)
3887 gcc_assert (s
->kind
== TYPE_USER_STRUCT
);
3889 for (pair_p fld
= s
->u
.s
.fields
; fld
; fld
= fld
->next
)
3891 type_p fld_type
= fld
->type
;
3892 if (union_or_struct_p (fld_type
))
3893 write_pch_user_walking_for_structure_body (fld_type
, d
);
3898 /* process_field routine for local pointer-walking. */
3901 write_types_local_process_field (type_p f
, const struct walk_type_data
*d
)
3903 gcc_assert (d
->have_this_obj
);
3909 case TYPE_LANG_STRUCT
:
3910 case TYPE_PARAM_STRUCT
:
3912 oprintf (d
->of
, "%*sif ((void *)(%s) == this_obj)\n", d
->indent
, "",
3914 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
3917 case TYPE_USER_STRUCT
:
3918 oprintf (d
->of
, "%*sif ((void *)(%s) == this_obj)\n", d
->indent
, "",
3920 if (d
->in_ptr_field
)
3921 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
3923 oprintf (d
->of
, "%*s gt_pch_nx (&(%s), op, cookie);\n",
3924 d
->indent
, "", d
->val
);
3932 case TYPE_UNDEFINED
:
3938 /* For S, a structure that's part of ORIG_S, and using parameters
3939 PARAM, write out a routine that:
3940 - Is of type gt_note_pointers
3941 - Calls PROCESS_FIELD on each field of S or its substructures.
3945 write_local_func_for_structure (const_type_p orig_s
, type_p s
, type_p
*param
)
3947 struct walk_type_data d
;
3949 memset (&d
, 0, sizeof (d
));
3950 d
.of
= get_output_file_for_structure (s
, param
);
3951 d
.process_field
= write_types_local_process_field
;
3953 d
.line
= &s
->u
.s
.line
;
3954 d
.bitmap
= s
->u
.s
.bitmap
;
3956 d
.prev_val
[0] = d
.prev_val
[2] = "*x";
3957 d
.prev_val
[1] = "not valid postage"; /* Guarantee an error. */
3958 d
.prev_val
[3] = "x";
3960 d
.fn_wants_lvalue
= true;
3962 oprintf (d
.of
, "\n");
3963 oprintf (d
.of
, "void\n");
3964 oprintf (d
.of
, "gt_pch_p_");
3965 output_mangled_typename (d
.of
, orig_s
);
3966 oprintf (d
.of
, " (ATTRIBUTE_UNUSED void *this_obj,\n"
3968 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3969 "\tATTRIBUTE_UNUSED void *cookie)\n");
3970 oprintf (d
.of
, "{\n");
3971 oprintf (d
.of
, " %s %s * x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
3972 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
3973 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
3975 d
.have_this_obj
= true;
3977 if (s
->kind
!= TYPE_USER_STRUCT
)
3981 /* User structures have no fields to walk. Simply generate a
3982 call to the user-provided PCH walker. */
3983 oprintf (d
.of
, "%*sif ((void *)(%s) == this_obj)\n", d
.indent
, "",
3985 oprintf (d
.of
, "%*s gt_pch_nx (&(%s), op, cookie);\n",
3986 d
.indent
, "", d
.val
);
3989 oprintf (d
.of
, "}\n");
3991 /* Write user-callable entry points for the PCH walking routines. */
3992 if (orig_s
->kind
== TYPE_USER_STRUCT
)
3993 write_pch_user_walking_functions (s
, &d
);
3996 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
3999 write_local (outf_p output_header
, type_p structures
, type_p param_structs
)
4006 oprintf (output_header
, "\n/* Local pointer-walking routines. */\n");
4007 for (s
= structures
; s
; s
= s
->next
)
4008 if (s
->gc_used
== GC_POINTED_TO
|| s
->gc_used
== GC_MAYBE_POINTED_TO
)
4012 if (s
->u
.s
.line
.file
== NULL
)
4014 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
4015 if (strcmp (opt
->name
, "ptr_alias") == 0
4016 && opt
->kind
== OPTION_TYPE
)
4018 const_type_p
const t
= (const_type_p
) opt
->info
.type
;
4019 if (t
->kind
== TYPE_STRUCT
4020 || t
->kind
== TYPE_UNION
|| t
->kind
== TYPE_LANG_STRUCT
)
4022 oprintf (output_header
, "#define gt_pch_p_");
4023 output_mangled_typename (output_header
, s
);
4024 oprintf (output_header
, " gt_pch_p_");
4025 output_mangled_typename (output_header
, t
);
4026 oprintf (output_header
, "\n");
4029 error_at_line (&s
->u
.s
.line
,
4030 "structure alias is not a structure");
4036 /* Declare the marker procedure only once. */
4037 oprintf (output_header
, "extern void gt_pch_p_");
4038 output_mangled_typename (output_header
, s
);
4039 oprintf (output_header
,
4040 "\n (void *, void *, gt_pointer_operator, void *);\n");
4042 if (s
->kind
== TYPE_LANG_STRUCT
)
4045 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
4046 write_local_func_for_structure (s
, ss
, NULL
);
4049 write_local_func_for_structure (s
, s
, NULL
);
4052 for (s
= param_structs
; s
; s
= s
->next
)
4053 if (s
->gc_used
== GC_POINTED_TO
)
4055 type_p
*param
= s
->u
.param_struct
.param
;
4056 type_p stru
= s
->u
.param_struct
.stru
;
4058 /* Declare the marker procedure. */
4059 oprintf (output_header
, "extern void gt_pch_p_");
4060 output_mangled_typename (output_header
, s
);
4061 oprintf (output_header
,
4062 "\n (void *, void *, gt_pointer_operator, void *);\n");
4064 if (stru
->u
.s
.line
.file
== NULL
)
4066 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
4071 if (stru
->kind
== TYPE_LANG_STRUCT
)
4074 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
4075 write_local_func_for_structure (s
, ss
, param
);
4078 write_local_func_for_structure (s
, stru
, param
);
4082 /* Nonzero if S is a type for which typed GC allocators should be output. */
4084 #define USED_BY_TYPED_GC_P(s) \
4085 ((s->kind == TYPE_POINTER \
4086 && (s->u.p->gc_used == GC_POINTED_TO \
4087 || s->u.p->gc_used == GC_USED)) \
4088 || (union_or_struct_p (s) \
4089 && ((s)->gc_used == GC_POINTED_TO \
4090 || ((s)->gc_used == GC_MAYBE_POINTED_TO \
4091 && s->u.s.line.file != NULL) \
4092 || ((s)->gc_used == GC_USED \
4093 && strncmp (s->u.s.tag, "anonymous", strlen ("anonymous"))))))
4096 /* Write out the 'enum' definition for gt_types_enum. */
4099 write_enum_defn (type_p structures
, type_p param_structs
)
4103 int nbparamstruct
= 0;
4107 oprintf (header_file
, "\n/* Enumeration of types known. */\n");
4108 oprintf (header_file
, "enum gt_types_enum {\n");
4109 for (s
= structures
; s
; s
= s
->next
)
4110 if (USED_BY_TYPED_GC_P (s
))
4113 DBGPRINTF ("write_enum_defn s @ %p nbstruct %d",
4114 (void*) s
, nbstruct
);
4115 if (union_or_struct_p (s
))
4116 DBGPRINTF ("write_enum_defn s %p #%d is unionorstruct tagged %s",
4117 (void*) s
, nbstruct
, s
->u
.s
.tag
);
4118 oprintf (header_file
, " gt_ggc_e_");
4119 output_mangled_typename (header_file
, s
);
4120 oprintf (header_file
, ",\n");
4122 for (s
= param_structs
; s
; s
= s
->next
)
4123 if (s
->gc_used
== GC_POINTED_TO
)
4126 DBGPRINTF ("write_enum_defn s %p nbparamstruct %d",
4127 (void*) s
, nbparamstruct
);
4128 oprintf (header_file
, " gt_e_");
4129 output_mangled_typename (header_file
, s
);
4130 oprintf (header_file
, ",\n");
4132 oprintf (header_file
, " gt_types_enum_last\n");
4133 oprintf (header_file
, "};\n");
4134 if (verbosity_level
>= 2)
4135 printf ("%s handled %d GTY-ed structures & %d parameterized structures.\n",
4136 progname
, nbstruct
, nbparamstruct
);
4140 /* Might T contain any non-pointer elements? */
4143 contains_scalar_p (type_p t
)
4151 return contains_scalar_p (t
->u
.a
.p
);
4152 case TYPE_USER_STRUCT
:
4153 /* User-marked structures will typically contain pointers. */
4156 /* Could also check for structures that have no non-pointer
4157 fields, but there aren't enough of those to worry about. */
4162 /* Mangle INPF and print it to F. */
4165 put_mangled_filename (outf_p f
, const input_file
*inpf
)
4167 /* The call to get_output_file_name may indirectly update fn since
4168 get_output_file_with_visibility caches its result inside, so we
4169 need the CONST_CAST. */
4170 const char *name
= get_output_file_name (CONST_CAST (input_file
*, inpf
));
4173 for (; *name
!= 0; name
++)
4174 if (ISALNUM (*name
))
4175 oprintf (f
, "%c", *name
);
4177 oprintf (f
, "%c", '_');
4180 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
4181 LASTNAME, and NAME are all strings to insert in various places in
4182 the resulting code. */
4185 finish_root_table (struct flist
*flp
, const char *pfx
, const char *lastname
,
4186 const char *tname
, const char *name
)
4190 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
4191 if (fli2
->started_p
)
4193 oprintf (fli2
->f
, " %s\n", lastname
);
4194 oprintf (fli2
->f
, "};\n\n");
4197 for (fli2
= flp
; fli2
&& base_files
; fli2
= fli2
->next
)
4198 if (fli2
->started_p
)
4200 lang_bitmap bitmap
= get_lang_bitmap (fli2
->file
);
4203 for (fnum
= 0; bitmap
!= 0; fnum
++, bitmap
>>= 1)
4206 oprintf (base_files
[fnum
],
4207 "extern const struct %s gt_%s_", tname
, pfx
);
4208 put_mangled_filename (base_files
[fnum
], fli2
->file
);
4209 oprintf (base_files
[fnum
], "[];\n");
4215 for (fnum
= 0; base_files
&& fnum
< num_lang_dirs
; fnum
++)
4216 oprintf (base_files
[fnum
],
4217 "EXPORTED_CONST struct %s * const %s[] = {\n", tname
, name
);
4221 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
4222 if (fli2
->started_p
)
4224 lang_bitmap bitmap
= get_lang_bitmap (fli2
->file
);
4227 fli2
->started_p
= 0;
4229 for (fnum
= 0; base_files
&& bitmap
!= 0; fnum
++, bitmap
>>= 1)
4232 oprintf (base_files
[fnum
], " gt_%s_", pfx
);
4233 put_mangled_filename (base_files
[fnum
], fli2
->file
);
4234 oprintf (base_files
[fnum
], ",\n");
4240 for (fnum
= 0; base_files
&& fnum
< num_lang_dirs
; fnum
++)
4242 oprintf (base_files
[fnum
], " NULL\n");
4243 oprintf (base_files
[fnum
], "};\n");
4248 /* Write the first three fields (pointer, count and stride) for
4249 root NAME to F. V and LINE are as for write_root.
4251 Return true if the entry could be written; return false on error. */
4254 start_root_entry (outf_p f
, pair_p v
, const char *name
, struct fileloc
*line
)
4260 error_at_line (line
, "`%s' is too complex to be a root", name
);
4264 oprintf (f
, " {\n");
4265 oprintf (f
, " &%s,\n", name
);
4268 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
4270 oprintf (f
, " * (%s)", ap
->u
.a
.len
);
4271 else if (ap
== v
->type
)
4272 oprintf (f
, " * ARRAY_SIZE (%s)", v
->name
);
4274 oprintf (f
, " sizeof (%s", v
->name
);
4275 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
4277 oprintf (f
, "),\n");
4281 /* A subroutine of write_root for writing the roots for field FIELD_NAME,
4282 which has type FIELD_TYPE. Parameters F to EMIT_PCH are the parameters
4286 write_field_root (outf_p f
, pair_p v
, type_p type
, const char *name
,
4287 int has_length
, struct fileloc
*line
, const char *if_marked
,
4288 bool emit_pch
, type_p field_type
, const char *field_name
)
4291 /* If the field reference is relative to V, rather than to some
4292 subcomponent of V, we can mark any subarrays with a single stride.
4293 We're effectively treating the field as a global variable in its
4295 if (v
&& type
== v
->type
)
4298 newv
.type
= field_type
;
4299 newv
.name
= ACONCAT ((v
->name
, ".", field_name
, NULL
));
4302 /* Otherwise, any arrays nested in the structure are too complex to
4304 else if (field_type
->kind
== TYPE_ARRAY
)
4306 write_root (f
, v
, field_type
, ACONCAT ((name
, ".", field_name
, NULL
)),
4307 has_length
, line
, if_marked
, emit_pch
);
4310 /* Write out to F the table entry and any marker routines needed to
4311 mark NAME as TYPE. V can be one of three values:
4313 - null, if NAME is too complex to represent using a single
4314 count and stride. In this case, it is an error for NAME to
4315 contain any gc-ed data.
4317 - the outermost array that contains NAME, if NAME is part of an array.
4319 - the C variable that contains NAME, if NAME is not part of an array.
4321 LINE is the line of the C source that declares the root variable.
4322 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
4323 is nonzero iff we are building the root table for hash table caches. */
4326 write_root (outf_p f
, pair_p v
, type_p type
, const char *name
, int has_length
,
4327 struct fileloc
*line
, const char *if_marked
, bool emit_pch
)
4334 for (fld
= type
->u
.s
.fields
; fld
; fld
= fld
->next
)
4337 const char *desc
= NULL
;
4340 for (o
= fld
->opt
; o
; o
= o
->next
)
4341 if (strcmp (o
->name
, "skip") == 0)
4343 else if (strcmp (o
->name
, "desc") == 0
4344 && o
->kind
== OPTION_STRING
)
4345 desc
= o
->info
.string
;
4346 else if (strcmp (o
->name
, "param_is") == 0)
4349 error_at_line (line
,
4350 "field `%s' of global `%s' has unknown option `%s'",
4351 fld
->name
, name
, o
->name
);
4355 else if (desc
&& fld
->type
->kind
== TYPE_UNION
)
4357 pair_p validf
= NULL
;
4360 for (ufld
= fld
->type
->u
.s
.fields
; ufld
; ufld
= ufld
->next
)
4362 const char *tag
= NULL
;
4364 for (oo
= ufld
->opt
; oo
; oo
= oo
->next
)
4365 if (strcmp (oo
->name
, "tag") == 0
4366 && oo
->kind
== OPTION_STRING
)
4367 tag
= oo
->info
.string
;
4368 if (tag
== NULL
|| strcmp (tag
, desc
) != 0)
4371 error_at_line (line
,
4372 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
4373 name
, fld
->name
, validf
->name
,
4374 name
, fld
->name
, ufld
->name
, tag
);
4378 write_field_root (f
, v
, type
, name
, 0, line
, if_marked
,
4379 emit_pch
, validf
->type
,
4380 ACONCAT ((fld
->name
, ".",
4381 validf
->name
, NULL
)));
4384 error_at_line (line
,
4385 "global `%s.%s' has `desc' option but is not union",
4388 write_field_root (f
, v
, type
, name
, 0, line
, if_marked
,
4389 emit_pch
, fld
->type
, fld
->name
);
4397 newname
= xasprintf ("%s[0]", name
);
4398 write_root (f
, v
, type
->u
.a
.p
, newname
, has_length
, line
, if_marked
,
4404 case TYPE_USER_STRUCT
:
4405 error_at_line (line
, "`%s' must be a pointer type, because it is "
4406 "a GC root and its type is marked with GTY((user))",
4414 if (!start_root_entry (f
, v
, name
, line
))
4419 if (!has_length
&& union_or_struct_p (tp
))
4421 const char *id_for_tag
= filter_type_name (tp
->u
.s
.tag
);
4422 oprintf (f
, " >_ggc_mx_%s,\n", id_for_tag
);
4424 oprintf (f
, " >_pch_nx_%s", id_for_tag
);
4426 oprintf (f
, " NULL");
4427 if (id_for_tag
!= tp
->u
.s
.tag
)
4428 free (CONST_CAST(char *, id_for_tag
));
4430 else if (!has_length
&& tp
->kind
== TYPE_PARAM_STRUCT
)
4432 oprintf (f
, " >_ggc_m_");
4433 output_mangled_typename (f
, tp
);
4436 oprintf (f
, ",\n >_pch_n_");
4437 output_mangled_typename (f
, tp
);
4440 oprintf (f
, ",\n NULL");
4443 && (tp
->kind
== TYPE_POINTER
|| union_or_struct_p (tp
)))
4445 oprintf (f
, " >_ggc_ma_%s,\n", name
);
4447 oprintf (f
, " >_pch_na_%s", name
);
4449 oprintf (f
, " NULL");
4453 error_at_line (line
,
4454 "global `%s' is pointer to unimplemented type",
4458 oprintf (f
, ",\n &%s", if_marked
);
4459 oprintf (f
, "\n },\n");
4465 if (!start_root_entry (f
, v
, name
, line
))
4468 oprintf (f
, " (gt_pointer_walker) >_ggc_m_S,\n");
4469 oprintf (f
, " (gt_pointer_walker) >_pch_n_S\n");
4470 oprintf (f
, " },\n");
4478 case TYPE_UNDEFINED
:
4480 case TYPE_LANG_STRUCT
:
4481 case TYPE_PARAM_STRUCT
:
4482 error_at_line (line
, "global `%s' is unimplemented type", name
);
4486 /* This generates a routine to walk an array. */
4489 write_array (outf_p f
, pair_p v
, const struct write_types_data
*wtd
)
4491 struct walk_type_data d
;
4494 memset (&d
, 0, sizeof (d
));
4500 d
.bitmap
= get_lang_bitmap (v
->line
.file
);
4503 d
.prev_val
[3] = prevval3
= xasprintf ("&%s", v
->name
);
4505 if (wtd
->param_prefix
)
4507 oprintf (f
, "static void gt_%sa_%s\n", wtd
->param_prefix
, v
->name
);
4508 oprintf (f
, " (void *, void *, gt_pointer_operator, void *);\n");
4509 oprintf (f
, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
4510 wtd
->param_prefix
, v
->name
);
4512 " ATTRIBUTE_UNUSED void *x_p,\n"
4513 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
4514 " ATTRIBUTE_UNUSED void * cookie)\n");
4515 oprintf (d
.of
, "{\n");
4516 d
.prev_val
[0] = d
.prev_val
[1] = d
.prev_val
[2] = d
.val
= v
->name
;
4517 d
.process_field
= write_types_local_process_field
;
4518 d
.have_this_obj
= true;
4519 walk_type (v
->type
, &d
);
4520 oprintf (f
, "}\n\n");
4524 oprintf (f
, "static void gt_%sa_%s (void *);\n", wtd
->prefix
, v
->name
);
4525 oprintf (f
, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
4526 wtd
->prefix
, v
->name
);
4528 d
.prev_val
[0] = d
.prev_val
[1] = d
.prev_val
[2] = d
.val
= v
->name
;
4529 d
.process_field
= write_types_process_field
;
4530 d
.have_this_obj
= false;
4531 walk_type (v
->type
, &d
);
4533 oprintf (f
, "}\n\n");
4536 /* Output a table describing the locations and types of VARIABLES. */
4539 write_roots (pair_p variables
, bool emit_pch
)
4542 struct flist
*flp
= NULL
;
4544 for (v
= variables
; v
; v
= v
->next
)
4547 get_output_file_with_visibility (CONST_CAST (input_file
*,
4550 const char *length
= NULL
;
4551 int deletable_p
= 0;
4553 for (o
= v
->opt
; o
; o
= o
->next
)
4554 if (strcmp (o
->name
, "length") == 0
4555 && o
->kind
== OPTION_STRING
)
4556 length
= o
->info
.string
;
4557 else if (strcmp (o
->name
, "deletable") == 0)
4559 else if (strcmp (o
->name
, "param_is") == 0)
4561 else if (strncmp (o
->name
, "param", 5) == 0
4562 && ISDIGIT (o
->name
[5]) && strcmp (o
->name
+ 6, "_is") == 0)
4564 else if (strcmp (o
->name
, "if_marked") == 0)
4567 error_at_line (&v
->line
,
4568 "global `%s' has unknown option `%s'",
4571 for (fli
= flp
; fli
; fli
= fli
->next
)
4572 if (fli
->f
== f
&& f
)
4576 fli
= XNEW (struct flist
);
4580 fli
->file
= v
->line
.file
;
4581 gcc_assert (fli
->file
);
4584 oprintf (f
, "\n/* GC roots. */\n\n");
4589 && v
->type
->kind
== TYPE_POINTER
4590 && (v
->type
->u
.p
->kind
== TYPE_POINTER
4591 || v
->type
->u
.p
->kind
== TYPE_STRUCT
))
4593 write_array (f
, v
, &ggc_wtd
);
4594 write_array (f
, v
, &pch_wtd
);
4598 for (v
= variables
; v
; v
= v
->next
)
4600 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4607 for (o
= v
->opt
; o
; o
= o
->next
)
4608 if (strcmp (o
->name
, "length") == 0)
4610 else if (strcmp (o
->name
, "deletable") == 0
4611 || strcmp (o
->name
, "if_marked") == 0)
4617 for (fli
= flp
; fli
; fli
= fli
->next
)
4620 if (!fli
->started_p
)
4624 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
4625 put_mangled_filename (f
, v
->line
.file
);
4626 oprintf (f
, "[] = {\n");
4629 write_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
, emit_pch
);
4632 finish_root_table (flp
, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4635 for (v
= variables
; v
; v
= v
->next
)
4637 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4643 for (o
= v
->opt
; o
; o
= o
->next
)
4644 if (strcmp (o
->name
, "deletable") == 0)
4646 else if (strcmp (o
->name
, "if_marked") == 0)
4652 for (fli
= flp
; fli
; fli
= fli
->next
)
4655 if (!fli
->started_p
)
4659 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
4660 put_mangled_filename (f
, v
->line
.file
);
4661 oprintf (f
, "[] = {\n");
4664 oprintf (f
, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
4668 finish_root_table (flp
, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4669 "gt_ggc_deletable_rtab");
4671 for (v
= variables
; v
; v
= v
->next
)
4673 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4676 const char *if_marked
= NULL
;
4680 for (o
= v
->opt
; o
; o
= o
->next
)
4681 if (strcmp (o
->name
, "length") == 0)
4683 else if (strcmp (o
->name
, "if_marked") == 0
4684 && o
->kind
== OPTION_STRING
)
4685 if_marked
= o
->info
.string
;
4686 if (if_marked
== NULL
)
4688 if (v
->type
->kind
!= TYPE_POINTER
4689 || v
->type
->u
.p
->kind
!= TYPE_PARAM_STRUCT
4690 || v
->type
->u
.p
->u
.param_struct
.stru
!= find_structure ("htab",
4693 error_at_line (&v
->line
,
4694 "if_marked option used but not hash table");
4698 for (fli
= flp
; fli
; fli
= fli
->next
)
4701 if (!fli
->started_p
)
4705 oprintf (f
, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
4706 put_mangled_filename (f
, v
->line
.file
);
4707 oprintf (f
, "[] = {\n");
4710 write_root (f
, v
, v
->type
->u
.p
->u
.param_struct
.param
[0],
4711 v
->name
, length_p
, &v
->line
, if_marked
, emit_pch
);
4714 finish_root_table (flp
, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
4715 "gt_ggc_cache_rtab");
4720 for (v
= variables
; v
; v
= v
->next
)
4722 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4726 int if_marked_p
= 0;
4729 for (o
= v
->opt
; o
; o
= o
->next
)
4730 if (strcmp (o
->name
, "length") == 0)
4732 else if (strcmp (o
->name
, "if_marked") == 0)
4738 for (fli
= flp
; fli
; fli
= fli
->next
)
4741 if (!fli
->started_p
)
4745 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
4746 put_mangled_filename (f
, v
->line
.file
);
4747 oprintf (f
, "[] = {\n");
4750 write_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
, emit_pch
);
4753 finish_root_table (flp
, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4754 "gt_pch_cache_rtab");
4756 for (v
= variables
; v
; v
= v
->next
)
4758 outf_p f
= get_output_file_with_visibility (CONST_CAST (input_file
*,
4764 for (o
= v
->opt
; o
; o
= o
->next
)
4765 if (strcmp (o
->name
, "deletable") == 0
4766 || strcmp (o
->name
, "if_marked") == 0)
4772 if (!contains_scalar_p (v
->type
))
4775 for (fli
= flp
; fli
; fli
= fli
->next
)
4778 if (!fli
->started_p
)
4782 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
4783 put_mangled_filename (f
, v
->line
.file
);
4784 oprintf (f
, "[] = {\n");
4787 oprintf (f
, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
4791 finish_root_table (flp
, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
4792 "gt_pch_scalar_rtab");
4795 /* TRUE if type S has the GTY variable_size annotation. */
4798 variable_size_p (const type_p s
)
4801 for (o
= s
->u
.s
.opt
; o
; o
= o
->next
)
4802 if (strcmp (o
->name
, "variable_size") == 0)
4810 { any_zone
, specific_zone
};
4812 /* Writes one typed allocator definition into output F for type
4813 identifier TYPE_NAME with optional type specifier TYPE_SPECIFIER.
4814 The allocator name will contain ALLOCATOR_TYPE. If VARIABLE_SIZE
4815 is true, the allocator will have an extra parameter specifying
4816 number of bytes to allocate. If QUANTITY is set to VECTOR, a
4817 vector allocator will be output, if ZONE is set to SPECIFIC_ZONE,
4818 the allocator will be zone-specific. */
4821 write_typed_alloc_def (outf_p f
,
4822 bool variable_size
, const char *type_specifier
,
4823 const char *type_name
, const char *allocator_type
,
4824 enum alloc_quantity quantity
, enum alloc_zone zone
)
4826 bool two_args
= variable_size
&& (quantity
== vector
);
4827 bool third_arg
= ((zone
== specific_zone
)
4828 && (variable_size
|| (quantity
== vector
)));
4829 gcc_assert (f
!= NULL
);
4830 const char *type_name_as_id
= filter_type_name (type_name
);
4831 oprintf (f
, "#define ggc_alloc_%s%s", allocator_type
, type_name_as_id
);
4832 oprintf (f
, "(%s%s%s%s%s) ",
4833 (variable_size
? "SIZE" : ""),
4834 (two_args
? ", " : ""),
4835 (quantity
== vector
) ? "n" : "",
4836 (third_arg
? ", " : ""), (zone
== specific_zone
) ? "z" : "");
4837 oprintf (f
, "((%s%s *)", type_specifier
, type_name
);
4838 oprintf (f
, "(ggc_internal_%salloc_stat (", allocator_type
);
4839 if (zone
== specific_zone
)
4842 oprintf (f
, "SIZE");
4844 oprintf (f
, "sizeof (%s%s)", type_specifier
, type_name
);
4845 if (quantity
== vector
)
4847 oprintf (f
, " MEM_STAT_INFO)))\n");
4848 if (type_name_as_id
!= type_name
)
4849 free (CONST_CAST(char *, type_name_as_id
));
4852 /* Writes a typed allocator definition into output F for a struct or
4853 union S, with a given ALLOCATOR_TYPE and QUANTITY for ZONE. */
4856 write_typed_struct_alloc_def (outf_p f
,
4857 const type_p s
, const char *allocator_type
,
4858 enum alloc_quantity quantity
,
4859 enum alloc_zone zone
)
4861 gcc_assert (union_or_struct_p (s
));
4862 write_typed_alloc_def (f
, variable_size_p (s
), get_type_specifier (s
),
4863 s
->u
.s
.tag
, allocator_type
, quantity
, zone
);
4866 /* Writes a typed allocator definition into output F for a typedef P,
4867 with a given ALLOCATOR_TYPE and QUANTITY for ZONE. */
4870 write_typed_typedef_alloc_def (outf_p f
,
4871 const pair_p p
, const char *allocator_type
,
4872 enum alloc_quantity quantity
,
4873 enum alloc_zone zone
)
4875 write_typed_alloc_def (f
, variable_size_p (p
->type
), "", p
->name
,
4876 allocator_type
, quantity
, zone
);
4879 /* Writes typed allocator definitions into output F for the types in
4880 STRUCTURES and TYPEDEFS that are used by GC. */
4883 write_typed_alloc_defns (outf_p f
,
4884 const type_p structures
, const pair_p typedefs
)
4889 gcc_assert (f
!= NULL
);
4891 "\n/* Allocators for known structs and unions. */\n\n");
4892 for (s
= structures
; s
; s
= s
->next
)
4894 if (!USED_BY_TYPED_GC_P (s
))
4896 gcc_assert (union_or_struct_p (s
));
4897 /* In plugin mode onput output ggc_alloc macro definitions
4898 relevant to plugin input files. */
4899 if (nb_plugin_files
> 0
4900 && ((s
->u
.s
.line
.file
== NULL
) || !s
->u
.s
.line
.file
->inpisplugin
))
4902 write_typed_struct_alloc_def (f
, s
, "", single
, any_zone
);
4903 write_typed_struct_alloc_def (f
, s
, "cleared_", single
, any_zone
);
4904 write_typed_struct_alloc_def (f
, s
, "vec_", vector
, any_zone
);
4905 write_typed_struct_alloc_def (f
, s
, "cleared_vec_", vector
, any_zone
);
4906 write_typed_struct_alloc_def (f
, s
, "zone_", single
, specific_zone
);
4907 write_typed_struct_alloc_def (f
, s
, "zone_cleared_", single
,
4909 write_typed_struct_alloc_def (f
, s
, "zone_vec_", vector
, specific_zone
);
4910 write_typed_struct_alloc_def (f
, s
, "zone_cleared_vec_", vector
,
4914 oprintf (f
, "\n/* Allocators for known typedefs. */\n");
4915 for (p
= typedefs
; p
; p
= p
->next
)
4918 if (!USED_BY_TYPED_GC_P (s
) || (strcmp (p
->name
, s
->u
.s
.tag
) == 0))
4920 /* In plugin mode onput output ggc_alloc macro definitions
4921 relevant to plugin input files. */
4922 if (nb_plugin_files
> 0)
4924 struct fileloc
* filoc
= type_fileloc(s
);
4925 if (!filoc
|| !filoc
->file
->inpisplugin
)
4928 write_typed_typedef_alloc_def (f
, p
, "", single
, any_zone
);
4929 write_typed_typedef_alloc_def (f
, p
, "cleared_", single
, any_zone
);
4930 write_typed_typedef_alloc_def (f
, p
, "vec_", vector
, any_zone
);
4931 write_typed_typedef_alloc_def (f
, p
, "cleared_vec_", vector
, any_zone
);
4932 write_typed_typedef_alloc_def (f
, p
, "zone_", single
, specific_zone
);
4933 write_typed_typedef_alloc_def (f
, p
, "zone_cleared_", single
,
4935 write_typed_typedef_alloc_def (f
, p
, "zone_cleared_vec_", vector
,
4940 /* Prints not-as-ugly version of a typename of T to OF. Trades the uniquness
4941 guaranteee for somewhat increased readability. If name conflicts do happen,
4942 this funcion will have to be adjusted to be more like
4943 output_mangled_typename. */
4946 output_typename (outf_p of
, const_type_p t
)
4951 oprintf (of
, "str");
4954 oprintf (of
, "scalar");
4957 output_typename (of
, t
->u
.p
);
4960 case TYPE_USER_STRUCT
:
4962 case TYPE_LANG_STRUCT
:
4963 oprintf (of
, "%s", t
->u
.s
.tag
);
4965 case TYPE_PARAM_STRUCT
:
4968 for (i
= 0; i
< NUM_PARAM
; i
++)
4969 if (t
->u
.param_struct
.param
[i
] != NULL
)
4971 output_typename (of
, t
->u
.param_struct
.param
[i
]);
4974 output_typename (of
, t
->u
.param_struct
.stru
);
4978 case TYPE_UNDEFINED
:
4984 /* Writes a typed GC allocator for type S that is suitable as a callback for
4985 the splay tree implementation in libiberty. */
4988 write_splay_tree_allocator_def (const_type_p s
)
4990 outf_p of
= get_output_file_with_visibility (NULL
);
4991 oprintf (of
, "void * ggc_alloc_splay_tree_");
4992 output_typename (of
, s
);
4993 oprintf (of
, " (int sz, void * nl)\n");
4994 oprintf (of
, "{\n");
4995 oprintf (of
, " return ggc_splay_alloc (");
4996 oprintf (of
, "gt_e_");
4997 output_mangled_typename (of
, s
);
4998 oprintf (of
, ", sz, nl);\n");
4999 oprintf (of
, "}\n\n");
5002 /* Writes typed GC allocators for PARAM_STRUCTS that are suitable as callbacks
5003 for the splay tree implementation in libiberty. */
5006 write_splay_tree_allocators (const_type_p param_structs
)
5010 oprintf (header_file
, "\n/* Splay tree callback allocators. */\n");
5011 for (s
= param_structs
; s
; s
= s
->next
)
5012 if (s
->gc_used
== GC_POINTED_TO
)
5014 oprintf (header_file
, "extern void * ggc_alloc_splay_tree_");
5015 output_typename (header_file
, s
);
5016 oprintf (header_file
, " (int, void *);\n");
5017 write_splay_tree_allocator_def (s
);
5023 /* Dumps the value of typekind KIND. */
5026 dump_typekind (int indent
, enum typekind kind
)
5028 printf ("%*ckind = ", indent
, ' ');
5032 printf ("TYPE_SCALAR");
5035 printf ("TYPE_STRING");
5038 printf ("TYPE_STRUCT");
5040 case TYPE_UNDEFINED
:
5041 printf ("TYPE_UNDEFINED");
5043 case TYPE_USER_STRUCT
:
5044 printf ("TYPE_USER_STRUCT");
5047 printf ("TYPE_UNION");
5050 printf ("TYPE_POINTER");
5053 printf ("TYPE_ARRAY");
5055 case TYPE_LANG_STRUCT
:
5056 printf ("TYPE_LANG_STRUCT");
5058 case TYPE_PARAM_STRUCT
:
5059 printf ("TYPE_PARAM_STRUCT");
5067 /* Dumps the value of GC_USED flag. */
5070 dump_gc_used (int indent
, enum gc_used_enum gc_used
)
5072 printf ("%*cgc_used = ", indent
, ' ');
5076 printf ("GC_UNUSED");
5081 case GC_MAYBE_POINTED_TO
:
5082 printf ("GC_MAYBE_POINTED_TO");
5085 printf ("GC_POINTED_TO");
5093 /* Dumps the type options OPT. */
5096 dump_options (int indent
, options_p opt
)
5099 printf ("%*coptions = ", indent
, ' ');
5106 printf ("%s:string %s ", o
->name
, o
->info
.string
);
5109 printf ("%s:type ", o
->name
);
5110 dump_type (indent
+1, o
->info
.type
);
5113 printf ("%s:nested ", o
->name
);
5123 /* Dumps the source file location in LINE. */
5126 dump_fileloc (int indent
, struct fileloc line
)
5128 printf ("%*cfileloc: file = %s, line = %d\n", indent
, ' ',
5129 get_input_file_name (line
.file
),
5133 /* Recursively dumps the struct, union, or a language-specific
5137 dump_type_u_s (int indent
, type_p t
)
5141 gcc_assert (union_or_struct_p (t
));
5142 printf ("%*cu.s.tag = %s\n", indent
, ' ', t
->u
.s
.tag
);
5143 dump_fileloc (indent
, t
->u
.s
.line
);
5144 printf ("%*cu.s.fields =\n", indent
, ' ');
5145 fields
= t
->u
.s
.fields
;
5148 dump_pair (indent
+ INDENT
, fields
);
5149 fields
= fields
->next
;
5151 printf ("%*cend of fields of type %p\n", indent
, ' ', (void *) t
);
5152 dump_options (indent
, t
->u
.s
.opt
);
5153 printf ("%*cu.s.bitmap = %X\n", indent
, ' ', t
->u
.s
.bitmap
);
5154 if (t
->kind
== TYPE_LANG_STRUCT
)
5156 printf ("%*cu.s.lang_struct:\n", indent
, ' ');
5157 dump_type_list (indent
+ INDENT
, t
->u
.s
.lang_struct
);
5161 /* Recursively dumps the array T. */
5164 dump_type_u_a (int indent
, type_p t
)
5166 gcc_assert (t
->kind
== TYPE_ARRAY
);
5167 printf ("%*clen = %s, u.a.p:\n", indent
, ' ', t
->u
.a
.len
);
5168 dump_type_list (indent
+ INDENT
, t
->u
.a
.p
);
5171 /* Recursively dumps the parameterized struct T. */
5174 dump_type_u_param_struct (int indent
, type_p t
)
5177 gcc_assert (t
->kind
== TYPE_PARAM_STRUCT
);
5178 printf ("%*cu.param_struct.stru:\n", indent
, ' ');
5179 dump_type_list (indent
, t
->u
.param_struct
.stru
);
5180 dump_fileloc (indent
, t
->u
.param_struct
.line
);
5181 for (i
= 0; i
< NUM_PARAM
; i
++)
5183 if (t
->u
.param_struct
.param
[i
] == NULL
)
5185 printf ("%*cu.param_struct.param[%d]:\n", indent
, ' ', i
);
5186 dump_type (indent
+ INDENT
, t
->u
.param_struct
.param
[i
]);
5190 /* Recursively dumps the type list T. */
5193 dump_type_list (int indent
, type_p t
)
5198 dump_type (indent
, p
);
5203 static htab_t seen_types
;
5205 /* Recursively dumps the type T if it was not dumped previously. */
5208 dump_type (int indent
, type_p t
)
5212 if (seen_types
== NULL
)
5213 seen_types
= htab_create (100, htab_hash_pointer
, htab_eq_pointer
, NULL
);
5215 printf ("%*cType at %p: ", indent
, ' ', (void *) t
);
5216 slot
= htab_find_slot (seen_types
, t
, INSERT
);
5219 printf ("already seen.\n");
5225 dump_typekind (indent
, t
->kind
);
5226 printf ("%*cpointer_to = %p\n", indent
+ INDENT
, ' ',
5227 (void *) t
->pointer_to
);
5228 dump_gc_used (indent
+ INDENT
, t
->gc_used
);
5232 printf ("%*cscalar_is_char = %s\n", indent
+ INDENT
, ' ',
5233 t
->u
.scalar_is_char
? "true" : "false");
5239 case TYPE_LANG_STRUCT
:
5240 case TYPE_USER_STRUCT
:
5241 dump_type_u_s (indent
+ INDENT
, t
);
5244 printf ("%*cp:\n", indent
+ INDENT
, ' ');
5245 dump_type (indent
+ INDENT
, t
->u
.p
);
5248 dump_type_u_a (indent
+ INDENT
, t
);
5250 case TYPE_PARAM_STRUCT
:
5251 dump_type_u_param_struct (indent
+ INDENT
, t
);
5256 printf ("%*cEnd of type at %p\n", indent
, ' ', (void *) t
);
5259 /* Dumps the pair P. */
5262 dump_pair (int indent
, pair_p p
)
5264 printf ("%*cpair: name = %s\n", indent
, ' ', p
->name
);
5265 dump_type (indent
, p
->type
);
5266 dump_fileloc (indent
, p
->line
);
5267 dump_options (indent
, p
->opt
);
5268 printf ("%*cEnd of pair %s\n", indent
, ' ', p
->name
);
5271 /* Dumps the list of pairs PP. */
5274 dump_pair_list (const char *name
, pair_p pp
)
5277 printf ("%s:\n", name
);
5278 for (p
= pp
; p
!= NULL
; p
= p
->next
)
5280 printf ("End of %s\n\n", name
);
5283 /* Dumps the STRUCTURES. */
5286 dump_structures (const char *name
, type_p structures
)
5288 printf ("%s:\n", name
);
5289 dump_type_list (0, structures
);
5290 printf ("End of %s\n\n", name
);
5293 /* Dumps the internal structures of gengtype. This is useful to debug
5294 gengtype itself, or to understand what it does, e.g. for plugin
5298 dump_everything (void)
5300 dump_pair_list ("typedefs", typedefs
);
5301 dump_structures ("structures", structures
);
5302 dump_structures ("param_structs", param_structs
);
5303 dump_pair_list ("variables", variables
);
5305 /* Allocated with the first call to dump_type. */
5306 htab_delete (seen_types
);
5311 /* Option specification for getopt_long. */
5312 static const struct option gengtype_long_options
[] = {
5313 {"help", no_argument
, NULL
, 'h'},
5314 {"version", no_argument
, NULL
, 'V'},
5315 {"verbose", no_argument
, NULL
, 'v'},
5316 {"dump", no_argument
, NULL
, 'd'},
5317 {"debug", no_argument
, NULL
, 'D'},
5318 {"plugin", required_argument
, NULL
, 'P'},
5319 {"srcdir", required_argument
, NULL
, 'S'},
5320 {"backupdir", required_argument
, NULL
, 'B'},
5321 {"inputs", required_argument
, NULL
, 'I'},
5322 {"read-state", required_argument
, NULL
, 'r'},
5323 {"write-state", required_argument
, NULL
, 'w'},
5324 /* Terminating NULL placeholder. */
5325 {NULL
, no_argument
, NULL
, 0},
5332 printf ("Usage: %s\n", progname
);
5333 printf ("\t -h | --help " " \t# Give this help.\n");
5334 printf ("\t -D | --debug "
5335 " \t# Give debug output to debug %s itself.\n", progname
);
5336 printf ("\t -V | --version " " \t# Give version information.\n");
5337 printf ("\t -v | --verbose \t# Increase verbosity. Can be given several times.\n");
5338 printf ("\t -d | --dump " " \t# Dump state for debugging.\n");
5339 printf ("\t -P | --plugin <output-file> <plugin-src> ... "
5340 " \t# Generate for plugin.\n");
5341 printf ("\t -S | --srcdir <GCC-directory> "
5342 " \t# Specify the GCC source directory.\n");
5343 printf ("\t -B | --backupdir <directory> "
5344 " \t# Specify the backup directory for updated files.\n");
5345 printf ("\t -I | --inputs <input-list> "
5346 " \t# Specify the file with source files list.\n");
5347 printf ("\t -w | --write-state <state-file> " " \t# Write a state file.\n");
5348 printf ("\t -r | --read-state <state-file> " " \t# Read a state file.\n");
5352 print_version (void)
5354 printf ("%s %s%s\n", progname
, pkgversion_string
, version_string
);
5355 printf ("Report bugs: %s\n", bug_report_url
);
5358 /* Parse the program options using getopt_long... */
5360 parse_program_options (int argc
, char **argv
)
5363 while ((opt
= getopt_long (argc
, argv
, "hVvdP:S:B:I:w:r:D",
5364 gengtype_long_options
, NULL
)) >= 0)
5368 case 'h': /* --help */
5371 case 'V': /* --version */
5374 case 'd': /* --dump */
5377 case 'D': /* --debug */
5380 case 'v': /* --verbose */
5383 case 'P': /* --plugin */
5385 plugin_output_filename
= optarg
;
5387 fatal ("missing plugin output file name");
5389 case 'S': /* --srcdir */
5393 fatal ("missing source directory");
5394 srcdir_len
= strlen (srcdir
);
5396 case 'B': /* --backupdir */
5398 backup_dir
= optarg
;
5400 fatal ("missing backup directory");
5402 case 'I': /* --inputs */
5406 fatal ("missing input list");
5408 case 'r': /* --read-state */
5410 read_state_filename
= optarg
;
5412 fatal ("missing read state file");
5413 DBGPRINTF ("read state %s\n", optarg
);
5415 case 'w': /* --write-state */
5416 DBGPRINTF ("write state %s\n", optarg
);
5418 write_state_filename
= optarg
;
5420 fatal ("missing write state file");
5423 fprintf (stderr
, "%s: unknown flag '%c'\n", progname
, opt
);
5425 fatal ("unexpected flag");
5428 if (plugin_output_filename
)
5430 /* In plugin mode we require some input files. */
5433 fatal ("no source files given in plugin mode");
5434 nb_plugin_files
= argc
- optind
;
5435 plugin_files
= XNEWVEC (input_file
*, nb_plugin_files
);
5436 for (i
= 0; i
< (int) nb_plugin_files
; i
++)
5438 char *name
= argv
[i
+ optind
];
5439 plugin_files
[i
] = input_file_by_name (name
);
5446 /******* Manage input files. ******/
5448 /* Hash table of unique input file names. */
5449 static htab_t input_file_htab
;
5451 /* Find or allocate a new input_file by hash-consing it. */
5453 input_file_by_name (const char* name
)
5456 input_file
* f
= NULL
;
5460 namlen
= strlen (name
);
5461 f
= XCNEWVAR (input_file
, sizeof (input_file
)+namlen
+2);
5464 f
->inpisplugin
= false;
5465 strcpy (f
->inpname
, name
);
5466 slot
= htab_find_slot (input_file_htab
, f
, INSERT
);
5467 gcc_assert (slot
!= NULL
);
5470 /* Already known input file. */
5472 return (input_file
*)(*slot
);
5474 /* New input file. */
5479 /* Hash table support routines for input_file-s. */
5481 htab_hash_inputfile (const void *p
)
5483 const input_file
*inpf
= (const input_file
*) p
;
5485 return htab_hash_string (get_input_file_name (inpf
));
5489 htab_eq_inputfile (const void *x
, const void *y
)
5491 const input_file
*inpfx
= (const input_file
*) x
;
5492 const input_file
*inpfy
= (const input_file
*) y
;
5493 gcc_assert (inpfx
!= NULL
&& inpfy
!= NULL
);
5494 return !filename_cmp (get_input_file_name (inpfx
), get_input_file_name (inpfy
));
5499 main (int argc
, char **argv
)
5502 static struct fileloc pos
= { NULL
, 0 };
5503 outf_p output_header
;
5505 /* Mandatory common initializations. */
5506 progname
= "gengtype"; /* For fatal and messages. */
5507 /* Create the hash-table used to hash-cons input files. */
5509 htab_create (800, htab_hash_inputfile
, htab_eq_inputfile
, NULL
);
5510 /* Initialize our special input files. */
5511 this_file
= input_file_by_name (__FILE__
);
5512 system_h_file
= input_file_by_name ("system.h");
5513 /* Set the scalar_is_char union number for predefined scalar types. */
5514 scalar_nonchar
.u
.scalar_is_char
= FALSE
;
5515 scalar_char
.u
.scalar_is_char
= TRUE
;
5517 parse_program_options (argc
, argv
);
5522 time_t now
= (time_t) 0;
5524 DBGPRINTF ("gengtype started pid %d at %s",
5525 (int) getpid (), ctime (&now
));
5527 #endif /* ENABLE_CHECKING */
5529 /* Parse the input list and the input files. */
5530 DBGPRINTF ("inputlist %s", inputlist
);
5531 if (read_state_filename
)
5534 fatal ("input list %s cannot be given with a read state file %s",
5535 inputlist
, read_state_filename
);
5536 read_state (read_state_filename
);
5537 DBGPRINT_COUNT_TYPE ("structures after read_state", structures
);
5538 DBGPRINT_COUNT_TYPE ("param_structs after read_state", param_structs
);
5542 /* These types are set up with #define or else outside of where
5543 we can see them. We should initialize them before calling
5545 #define POS_HERE(Call) do { pos.file = this_file; pos.line = __LINE__; \
5547 POS_HERE (do_scalar_typedef ("CUMULATIVE_ARGS", &pos
));
5548 POS_HERE (do_scalar_typedef ("REAL_VALUE_TYPE", &pos
));
5549 POS_HERE (do_scalar_typedef ("FIXED_VALUE_TYPE", &pos
));
5550 POS_HERE (do_scalar_typedef ("double_int", &pos
));
5551 POS_HERE (do_scalar_typedef ("uint64_t", &pos
));
5552 POS_HERE (do_scalar_typedef ("uint8", &pos
));
5553 POS_HERE (do_scalar_typedef ("uintptr_t", &pos
));
5554 POS_HERE (do_scalar_typedef ("jword", &pos
));
5555 POS_HERE (do_scalar_typedef ("JCF_u2", &pos
));
5556 POS_HERE (do_scalar_typedef ("void", &pos
));
5557 POS_HERE (do_typedef ("PTR",
5558 create_pointer (resolve_typedef ("void", &pos
)),
5561 read_input_list (inputlist
);
5562 for (i
= 0; i
< num_gt_files
; i
++)
5564 parse_file (get_input_file_name (gt_files
[i
]));
5565 DBGPRINTF ("parsed file #%d %s",
5566 (int) i
, get_input_file_name (gt_files
[i
]));
5568 if (verbosity_level
>= 1)
5569 printf ("%s parsed %d files with %d GTY types\n",
5570 progname
, (int) num_gt_files
, type_count
);
5572 DBGPRINT_COUNT_TYPE ("structures after parsing", structures
);
5573 DBGPRINT_COUNT_TYPE ("param_structs after parsing", param_structs
);
5577 fatal ("either an input list or a read state file should be given");
5582 if (plugin_output_filename
)
5585 /* In plugin mode, we should have read a state file, and have
5586 given at least one plugin file. */
5587 if (!read_state_filename
)
5588 fatal ("No read state given in plugin mode for %s",
5589 plugin_output_filename
);
5591 if (nb_plugin_files
== 0 || !plugin_files
)
5592 fatal ("No plugin files given in plugin mode for %s",
5593 plugin_output_filename
);
5595 /* Parse our plugin files and augment the state. */
5596 for (ix
= 0; ix
< nb_plugin_files
; ix
++)
5598 input_file
* pluginput
= plugin_files
[ix
];
5599 pluginput
->inpisplugin
= true;
5600 parse_file (get_input_file_name (pluginput
));
5605 plugin_output
= create_file ("GCC", plugin_output_filename
);
5606 DBGPRINTF ("created plugin_output %p named %s",
5607 (void *) plugin_output
, plugin_output
->name
);
5610 { /* No plugin files, we are in normal mode. */
5612 fatal ("gengtype needs a source directory in normal mode");
5619 /* The call to set_gc_used may indirectly call find_param_structure
5620 hence enlarge the param_structs list of types. */
5621 set_gc_used (variables
);
5623 /* The state at this point is read from the state input file or by
5624 parsing source files and optionally augmented by parsing plugin
5625 source files. Write it now. */
5626 if (write_state_filename
)
5628 DBGPRINT_COUNT_TYPE ("structures before write_state", structures
);
5629 DBGPRINT_COUNT_TYPE ("param_structs before write_state", param_structs
);
5632 fatal ("didn't write state file %s after errors",
5633 write_state_filename
);
5635 DBGPRINTF ("before write_state %s", write_state_filename
);
5636 write_state (write_state_filename
);
5641 /* After having written the state file we return immediately to
5642 avoid generating any output file. */
5652 write_enum_defn (structures
, param_structs
);
5653 output_header
= plugin_output
? plugin_output
: header_file
;
5654 write_typed_alloc_defns (output_header
, structures
, typedefs
);
5655 DBGPRINT_COUNT_TYPE ("structures before write_types outputheader",
5657 DBGPRINT_COUNT_TYPE ("param_structs before write_types outputheader",
5660 write_types (output_header
, structures
, param_structs
, &ggc_wtd
);
5661 if (plugin_files
== NULL
)
5663 DBGPRINT_COUNT_TYPE ("structures before write_types headerfil",
5665 DBGPRINT_COUNT_TYPE ("param_structs before write_types headerfil",
5667 write_types (header_file
, structures
, param_structs
, &pch_wtd
);
5668 write_local (header_file
, structures
, param_structs
);
5670 write_splay_tree_allocators (param_structs
);
5671 write_roots (variables
, plugin_files
== NULL
);
5673 close_output_files ();
5678 /* Don't bother about free-ing any input or plugin file, etc. */