1 /* Process source files and output type information.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
24 #include "errors.h" /* for fatal */
25 #include "double-int.h"
27 /* Data types, macros, etc. used only in this file. */
29 /* Kinds of types we can understand. */
41 typedef unsigned lang_bitmap
;
43 /* A way to pass data through to the output end. */
51 /* Option data for the 'nested_ptr' option. */
52 struct nested_ptr_data
55 const char *convert_to
;
56 const char *convert_from
;
59 /* A name and a type. */
71 /* A description of a type. */
85 enum gc_used_enum gc_used
;
103 type_p param
[NUM_PARAM
];
110 ((x)->kind == TYPE_UNION || \
111 ((x)->kind == TYPE_LANG_STRUCT \
112 && (x)->u.s.lang_struct->kind == TYPE_UNION))
113 #define UNION_OR_STRUCT_P(x) \
114 ((x)->kind == TYPE_UNION \
115 || (x)->kind == TYPE_STRUCT \
116 || (x)->kind == TYPE_LANG_STRUCT)
118 /* Structure representing an output file. */
127 typedef struct outf
* outf_p
;
129 /* An output file, suitable for definitions, that can see declarations
130 made in INPUT_FILE and is linked into every language that uses
131 INPUT_FILE. May return NULL in plugin mode. */
132 extern outf_p get_output_file_with_visibility
133 (const char *input_file
);
134 const char *get_output_file_name (const char *);
136 /* Print, like fprintf, to O. No-op if O is NULL. */
137 static void oprintf (outf_p o
, const char *S
, ...)
140 /* The list of output files. */
141 static outf_p output_files
;
143 /* The plugin input files and their number; in that case only
144 a single file is produced. */
145 static char** plugin_files
;
146 static size_t nb_plugin_files
;
147 /* the generated plugin output name & file */
148 static outf_p plugin_output
;
150 /* The output header file that is included into pretty much every
152 static outf_p header_file
;
154 /* Source directory. */
155 static const char *srcdir
;
157 /* Length of srcdir name. */
158 static size_t srcdir_len
= 0;
160 static outf_p
create_file (const char *, const char *);
162 static const char * get_file_basename (const char *);
163 static const char * get_file_realbasename (const char *);
164 static const char * get_file_srcdir_relative_path (const char *);
166 static int get_prefix_langdir_index (const char *);
167 static const char * get_file_langdir (const char *);
170 /* Nonzero iff an error has occurred. */
171 bool hit_error
= false;
173 static void gen_rtx_next (void);
174 static void write_rtx_next (void);
175 static void open_base_files (void);
176 static void close_output_files (void);
178 /* Report an error at POS, printing MSG. */
181 error_at_line (struct fileloc
*pos
, const char *msg
, ...)
187 fprintf (stderr
, "%s:%d: ", pos
->file
, pos
->line
);
188 vfprintf (stderr
, msg
, ap
);
189 fputc ('\n', stderr
);
195 /* asprintf, but produces fatal message on out-of-memory. */
197 xasprintf (const char *format
, ...)
203 va_start (ap
, format
);
204 n
= vasprintf (&result
, format
, ap
);
205 if (result
== NULL
|| n
< 0)
206 fatal ("out of memory");
212 /* Input file handling. */
214 /* Table of all input files. */
215 static const char **gt_files
;
216 static size_t num_gt_files
;
218 /* A number of places use the name of this file for a location for
219 things that we can't rely on the source to define. Make sure we
220 can still use pointer comparison on filenames. */
221 static const char this_file
[] = __FILE__
;
223 /* Vector of per-language directories. */
224 static const char **lang_dir_names
;
225 static size_t num_lang_dirs
;
227 /* An array of output files suitable for definitions. There is one
228 BASE_FILES entry for each language. */
229 static outf_p
*base_files
;
231 /* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff
232 INPUT_FILE is used by <lang>.
234 This function should be written to assume that a file _is_ used
235 if the situation is unclear. If it wrongly assumes a file _is_ used,
236 a linker error will result. If it wrongly assumes a file _is not_ used,
237 some GC roots may be missed, which is a much harder-to-debug problem.
239 The relevant bitmap is stored immediately before the file's name in the
240 buffer set up by read_input_list. It may be unaligned, so we have to
241 read it byte-by-byte. */
244 get_lang_bitmap (const char *gtfile
)
247 if (gtfile
== this_file
)
248 /* Things defined in this file are universal. */
249 return (((lang_bitmap
)1) << num_lang_dirs
) - 1;
254 for (i
= -(int) sizeof (lang_bitmap
); i
< 0; i
++)
255 n
= (n
<< CHAR_BIT
) + (unsigned char)gtfile
[i
];
260 /* Set the bitmap returned by get_lang_bitmap. The only legitimate
261 caller of this function is read_input_list. */
263 set_lang_bitmap (char *gtfile
, lang_bitmap n
)
266 for (i
= -1; i
>= -(int) sizeof (lang_bitmap
); i
--)
268 gtfile
[i
] = n
& ((1U << CHAR_BIT
)-1);
273 /* Scan the input file, LIST, and determine how much space we need to
274 store strings in. Also, count the number of language directories
275 and files. The numbers returned are overestimates as they does not
276 consider repeated files. */
278 measure_input_list (FILE *list
)
284 num_gt_files
= plugin_files
? nb_plugin_files
: 0;
285 while ((c
= getc (list
)) != EOF
)
294 /* Add space for a lang_bitmap before the input file name. */
295 n
+= sizeof (lang_bitmap
);
309 /* Read one input line from LIST to HEREP (which is updated). A
310 pointer to the string is returned via LINEP. If it was a language
311 subdirectory in square brackets, strip off the square brackets and
312 return true. Otherwise, leave space before the string for a
313 lang_bitmap, and return false. At EOF, returns false, does not
314 touch *HEREP, and sets *LINEP to NULL. POS is used for
317 read_input_line (FILE *list
, char **herep
, char **linep
,
324 /* Read over whitespace. */
325 while (c
== '\n' || c
== ' ')
335 /* No space for a lang_bitmap is necessary. Discard the '['. */
338 while (c
!= ']' && c
!= '\n' && c
!= EOF
)
347 c
= getc (list
); /* eat what should be a newline */
348 if (c
!= '\n' && c
!= EOF
)
349 error_at_line (pos
, "junk on line after language tag [%s]", line
);
352 error_at_line (pos
, "missing close bracket for language tag [%s", line
);
360 /* Leave space for a lang_bitmap. */
361 memset (here
, 0, sizeof (lang_bitmap
));
362 here
+= sizeof (lang_bitmap
);
369 while (c
!= EOF
&& c
!= '\n');
377 /* Read the list of input files from LIST and compute all of the
378 relevant tables. There is one file per line of the list. At
379 first, all the files on the list are language-generic, but
380 eventually a line will appear which is the name of a language
381 subdirectory in square brackets, like this: [cp]. All subsequent
382 files are specific to that language, until another language
383 subdirectory tag appears. Files can appear more than once, if
384 they apply to more than one language. */
386 read_input_list (const char *listname
)
388 FILE *list
= fopen (listname
, "r");
390 fatal ("cannot open %s: %s", listname
, strerror (errno
));
394 size_t bufsz
= measure_input_list (list
);
395 char *buf
= XNEWVEC (char, bufsz
);
397 char *committed
= buf
;
398 char *limit
= buf
+ bufsz
;
403 lang_bitmap curlangs
= (1 << num_lang_dirs
) - 1;
405 epos
.file
= listname
;
408 lang_dir_names
= XNEWVEC (const char *, num_lang_dirs
);
409 gt_files
= XNEWVEC (const char *, num_gt_files
);
416 is_language
= read_input_line (list
, &here
, &line
, &epos
);
417 gcc_assert (here
<= limit
);
420 else if (is_language
)
423 gcc_assert (langno
<= num_lang_dirs
);
424 for (i
= 0; i
< langno
; i
++)
425 if (strcmp (lang_dir_names
[i
], line
) == 0)
427 error_at_line (&epos
, "duplicate language tag [%s]", line
);
433 curlangs
= 1 << langno
;
434 lang_dir_names
[langno
++] = line
;
439 gcc_assert (nfiles
<= num_gt_files
);
440 for (i
= 0; i
< nfiles
; i
++)
441 if (strcmp (gt_files
[i
], line
) == 0)
443 /* Throw away the string we just read, and add the
444 current language to the existing string's bitmap. */
445 lang_bitmap bmap
= get_lang_bitmap (gt_files
[i
]);
447 error_at_line (&epos
, "file %s specified more than once "
448 "for language %s", line
, langno
== 0
450 : lang_dir_names
[langno
- 1]);
453 set_lang_bitmap (CONST_CAST(char *, gt_files
[i
]), bmap
);
458 set_lang_bitmap (line
, curlangs
);
459 gt_files
[nfiles
++] = line
;
462 /* Update the global counts now that we know accurately how many
463 things there are. (We do not bother resizing the arrays down.) */
464 num_lang_dirs
= langno
;
465 /* Add the plugin files if provided. */
469 for (i
= 0; i
< nb_plugin_files
; i
++)
470 gt_files
[nfiles
++] = plugin_files
[i
];
472 num_gt_files
= nfiles
;
475 /* Sanity check: any file that resides in a language subdirectory
476 (e.g. 'cp') ought to belong to the corresponding language.
477 ??? Still true if for instance ObjC++ is enabled and C++ isn't?
478 (Can you even do that? Should you be allowed to?) */
481 for (f
= 0; f
< num_gt_files
; f
++)
483 lang_bitmap bitmap
= get_lang_bitmap (gt_files
[f
]);
484 const char *basename
= get_file_basename (gt_files
[f
]);
485 const char *slashpos
= strchr (basename
, '/');
490 for (l
= 0; l
< num_lang_dirs
; l
++)
491 if ((size_t)(slashpos
- basename
) == strlen (lang_dir_names
[l
])
492 && memcmp (basename
, lang_dir_names
[l
],
493 strlen (lang_dir_names
[l
])) == 0)
495 if (!(bitmap
& (1 << l
)))
496 error ("%s is in language directory '%s' but is not "
497 "tagged for that language",
498 basename
, lang_dir_names
[l
]);
506 fatal ("error reading %s: %s", listname
, strerror (errno
));
513 /* The one and only TYPE_STRING. */
515 static struct type string_type
= {
516 TYPE_STRING
, 0, 0, GC_USED
, {0}
519 /* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
520 set to appropriate values at the beginning of main. */
522 static struct type scalar_nonchar
= {
523 TYPE_SCALAR
, 0, 0, GC_USED
, {0}
525 static struct type scalar_char
= {
526 TYPE_SCALAR
, 0, 0, GC_USED
, {0}
529 /* Lists of various things. */
531 static pair_p typedefs
;
532 static type_p structures
;
533 static type_p param_structs
;
534 static pair_p variables
;
536 static type_p find_param_structure
537 (type_p t
, type_p param
[NUM_PARAM
]);
538 static type_p
adjust_field_tree_exp (type_p t
, options_p opt
);
539 static type_p
adjust_field_rtx_def (type_p t
, options_p opt
);
541 /* Define S as a typedef to T at POS. */
544 do_typedef (const char *s
, type_p t
, struct fileloc
*pos
)
548 /* temporary kludge - gengtype doesn't handle conditionals or
549 macros. Ignore any attempt to typedef CUMULATIVE_ARGS, unless it
550 is coming from this file (main() sets them up with safe dummy
552 if (!strcmp (s
, "CUMULATIVE_ARGS") && pos
->file
!= this_file
)
555 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
556 if (strcmp (p
->name
, s
) == 0)
560 error_at_line (pos
, "type `%s' previously defined", s
);
561 error_at_line (&p
->line
, "previously defined here");
566 p
= XNEW (struct pair
);
574 /* Define S as a typename of a scalar. Cannot be used to define
575 typedefs of 'char'. Note: is also used for pointer-to-function
576 typedefs (which are therefore not treated as pointers). */
579 do_scalar_typedef (const char *s
, struct fileloc
*pos
)
581 do_typedef (s
, &scalar_nonchar
, pos
);
584 /* Return the type previously defined for S. Use POS to report errors. */
587 resolve_typedef (const char *s
, struct fileloc
*pos
)
590 for (p
= typedefs
; p
!= NULL
; p
= p
->next
)
591 if (strcmp (p
->name
, s
) == 0)
593 error_at_line (pos
, "unidentified type `%s'", s
);
594 return &scalar_nonchar
; /* treat as "int" */
597 /* Create and return a new structure with tag NAME (or a union iff
598 ISUNION is nonzero), at POS with fields FIELDS and options O. */
601 new_structure (const char *name
, int isunion
, struct fileloc
*pos
,
602 pair_p fields
, options_p o
)
606 lang_bitmap bitmap
= get_lang_bitmap (pos
->file
);
608 /* temporary kludge - gengtype doesn't handle conditionals or
609 macros. Ignore any attempt to define struct location_s, unless
610 it is coming from this file (main() sets it up safely). */
611 if (!strcmp (name
, "location_s") && !isunion
612 && pos
->file
!= this_file
)
613 return find_structure (name
, 0);
615 for (si
= structures
; si
!= NULL
; si
= si
->next
)
616 if (strcmp (name
, si
->u
.s
.tag
) == 0
617 && UNION_P (si
) == isunion
)
620 if (si
->kind
== TYPE_LANG_STRUCT
)
624 for (si
= ls
->u
.s
.lang_struct
; si
!= NULL
; si
= si
->next
)
625 if (si
->u
.s
.bitmap
== bitmap
)
628 else if (si
->u
.s
.line
.file
!= NULL
&& si
->u
.s
.bitmap
!= bitmap
)
631 si
= XCNEW (struct type
);
632 memcpy (si
, ls
, sizeof (struct type
));
633 ls
->kind
= TYPE_LANG_STRUCT
;
634 ls
->u
.s
.lang_struct
= si
;
635 ls
->u
.s
.fields
= NULL
;
637 si
->pointer_to
= NULL
;
638 si
->u
.s
.lang_struct
= ls
;
643 if (ls
!= NULL
&& s
== NULL
)
645 s
= XCNEW (struct type
);
646 s
->next
= ls
->u
.s
.lang_struct
;
647 ls
->u
.s
.lang_struct
= s
;
648 s
->u
.s
.lang_struct
= ls
;
655 s
= XCNEW (struct type
);
656 s
->next
= structures
;
660 if (s
->u
.s
.line
.file
!= NULL
661 || (s
->u
.s
.lang_struct
&& (s
->u
.s
.lang_struct
->u
.s
.bitmap
& bitmap
)))
663 error_at_line (pos
, "duplicate definition of '%s %s'",
664 isunion
? "union" : "struct", s
->u
.s
.tag
);
665 error_at_line (&s
->u
.s
.line
, "previous definition here");
668 s
->kind
= isunion
? TYPE_UNION
: TYPE_STRUCT
;
671 s
->u
.s
.fields
= fields
;
673 s
->u
.s
.bitmap
= bitmap
;
674 if (s
->u
.s
.lang_struct
)
675 s
->u
.s
.lang_struct
->u
.s
.bitmap
|= bitmap
;
677 /* Reset location_s's location to input.h so that we know where to
678 write out its mark routine. */
679 if (!strcmp (name
, "location_s") && !isunion
680 && pos
->file
== this_file
)
683 for (n
= 0; n
< num_gt_files
; n
++)
684 if (!strcmp (gt_files
[n
] + strlen (gt_files
[n
]) - strlen ("input.h"),
687 s
->u
.s
.line
.file
= gt_files
[n
];
695 /* Return the previously-defined structure with tag NAME (or a union
696 iff ISUNION is nonzero), or a new empty structure or union if none
697 was defined previously. */
700 find_structure (const char *name
, int isunion
)
704 for (s
= structures
; s
!= NULL
; s
= s
->next
)
705 if (strcmp (name
, s
->u
.s
.tag
) == 0
706 && UNION_P (s
) == isunion
)
709 s
= XCNEW (struct type
);
710 s
->next
= structures
;
712 s
->kind
= isunion
? TYPE_UNION
: TYPE_STRUCT
;
718 /* Return the previously-defined parameterized structure for structure
719 T and parameters PARAM, or a new parameterized empty structure or
720 union if none was defined previously. */
723 find_param_structure (type_p t
, type_p param
[NUM_PARAM
])
727 for (res
= param_structs
; res
; res
= res
->next
)
728 if (res
->u
.param_struct
.stru
== t
729 && memcmp (res
->u
.param_struct
.param
, param
,
730 sizeof (type_p
) * NUM_PARAM
) == 0)
734 res
= XCNEW (struct type
);
735 res
->kind
= TYPE_PARAM_STRUCT
;
736 res
->next
= param_structs
;
738 res
->u
.param_struct
.stru
= t
;
739 memcpy (res
->u
.param_struct
.param
, param
, sizeof (type_p
) * NUM_PARAM
);
744 /* Return a scalar type with name NAME. */
747 create_scalar_type (const char *name
)
749 if (!strcmp (name
, "char") || !strcmp (name
, "unsigned char"))
752 return &scalar_nonchar
;
755 /* Return a pointer to T. */
758 create_pointer (type_p t
)
762 type_p r
= XCNEW (struct type
);
763 r
->kind
= TYPE_POINTER
;
767 return t
->pointer_to
;
770 /* Return an array of length LEN. */
773 create_array (type_p t
, const char *len
)
777 v
= XCNEW (struct type
);
778 v
->kind
= TYPE_ARRAY
;
784 /* Return an options structure with name NAME and info INFO. NEXT is the
785 next option in the chain. */
788 create_option (options_p next
, const char *name
, const void *info
)
790 options_p o
= XNEW (struct options
);
793 o
->info
= (const char*) info
;
797 /* Return an options structure for a "nested_ptr" option. */
799 create_nested_ptr_option (options_p next
, type_p t
,
800 const char *to
, const char *from
)
802 struct nested_ptr_data
*d
= XNEW (struct nested_ptr_data
);
804 d
->type
= adjust_field_type (t
, 0);
806 d
->convert_from
= from
;
807 return create_option (next
, "nested_ptr", d
);
810 /* Add a variable named S of type T with options O defined at POS,
814 note_variable (const char *s
, type_p t
, options_p o
, struct fileloc
*pos
)
817 n
= XNEW (struct pair
);
826 /* Most-general structure field creator. */
828 create_field_all (pair_p next
, type_p type
, const char *name
, options_p opt
,
829 const char *file
, int line
)
833 field
= XNEW (struct pair
);
838 field
->line
.file
= file
;
839 field
->line
.line
= line
;
843 /* Create a field that came from the source code we are scanning,
844 i.e. we have a 'struct fileloc', and possibly options; also,
845 adjust_field_type should be called. */
847 create_field_at (pair_p next
, type_p type
, const char *name
, options_p opt
,
850 return create_field_all (next
, adjust_field_type (type
, opt
),
851 name
, opt
, pos
->file
, pos
->line
);
854 /* Create a fake field with the given type and name. NEXT is the next
855 field in the chain. */
856 #define create_field(next,type,name) \
857 create_field_all(next,type,name, 0, this_file, __LINE__)
859 /* Like create_field, but the field is only valid when condition COND
863 create_optional_field_ (pair_p next
, type_p type
, const char *name
,
864 const char *cond
, int line
)
870 /* Create a fake union type with a single nameless field of type TYPE.
871 The field has a tag of "1". This allows us to make the presence
872 of a field of type TYPE depend on some boolean "desc" being true. */
873 union_fields
= create_field (NULL
, type
, "");
874 union_fields
->opt
= create_option (union_fields
->opt
, "dot", "");
875 union_fields
->opt
= create_option (union_fields
->opt
, "tag", "1");
876 union_type
= new_structure (xasprintf ("%s_%d", "fake_union", id
++), 1,
877 &lexer_line
, union_fields
, NULL
);
879 /* Create the field and give it the new fake union type. Add a "desc"
880 tag that specifies the condition under which the field is valid. */
881 return create_field_all (next
, union_type
, name
,
882 create_option (0, "desc", cond
),
885 #define create_optional_field(next,type,name,cond) \
886 create_optional_field_(next,type,name,cond,__LINE__)
888 /* Reverse a linked list of 'struct pair's in place. */
890 nreverse_pairs (pair_p list
)
892 pair_p prev
= 0, p
, next
;
893 for (p
= list
; p
; p
= next
)
903 /* We don't care how long a CONST_DOUBLE is. */
904 #define CONST_DOUBLE_FORMAT "ww"
905 /* We don't want to see codes that are only for generator files. */
906 #undef GENERATOR_FILE
909 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
915 static const char * const rtx_name
[NUM_RTX_CODE
] = {
916 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
921 static const char * const rtx_format
[NUM_RTX_CODE
] = {
922 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
927 static int rtx_next_new
[NUM_RTX_CODE
];
929 /* We also need codes and names for insn notes (not register notes).
930 Note that we do *not* bias the note values here. */
932 #define DEF_INSN_NOTE(NAME) NAME,
933 #include "insn-notes.def"
939 /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
940 default field for line number notes. */
941 static const char *const note_insn_name
[NOTE_INSN_MAX
+1] = {
942 #define DEF_INSN_NOTE(NAME) #NAME,
943 #include "insn-notes.def"
947 #undef CONST_DOUBLE_FORMAT
948 #define GENERATOR_FILE
950 /* Generate the contents of the rtx_next array. This really doesn't belong
951 in gengtype at all, but it's needed for adjust_field_rtx_def. */
957 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
961 rtx_next_new
[i
] = -1;
962 if (strncmp (rtx_format
[i
], "iuu", 3) == 0)
964 else if (i
== COND_EXEC
|| i
== SET
|| i
== EXPR_LIST
|| i
== INSN_LIST
)
967 for (k
= strlen (rtx_format
[i
]) - 1; k
>= 0; k
--)
968 if (rtx_format
[i
][k
] == 'e' || rtx_format
[i
][k
] == 'u')
973 /* Write out the contents of the rtx_next array. */
975 write_rtx_next (void)
977 outf_p f
= get_output_file_with_visibility (NULL
);
982 oprintf (f
, "\n/* Used to implement the RTX_NEXT macro. */\n");
983 oprintf (f
, "EXPORTED_CONST unsigned char rtx_next[NUM_RTX_CODE] = {\n");
984 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
985 if (rtx_next_new
[i
] == -1)
986 oprintf (f
, " 0,\n");
989 " RTX_HDR_SIZE + %d * sizeof (rtunion),\n",
994 /* Handle `special("rtx_def")'. This is a special case for field
995 `fld' of struct rtx_def, which is an array of unions whose values
996 are based in a complex way on the type of RTL. */
999 adjust_field_rtx_def (type_p t
, options_p
ARG_UNUSED (opt
))
1004 type_p rtx_tp
, rtvec_tp
, tree_tp
, mem_attrs_tp
, note_union_tp
, scalar_tp
;
1005 type_p bitmap_tp
, basic_block_tp
, reg_attrs_tp
, constant_tp
, symbol_union_tp
;
1007 if (t
->kind
!= TYPE_UNION
)
1009 error_at_line (&lexer_line
,
1010 "special `rtx_def' must be applied to a union");
1011 return &string_type
;
1014 nodot
= create_option (NULL
, "dot", "");
1016 rtx_tp
= create_pointer (find_structure ("rtx_def", 0));
1017 rtvec_tp
= create_pointer (find_structure ("rtvec_def", 0));
1018 tree_tp
= create_pointer (find_structure ("tree_node", 1));
1019 mem_attrs_tp
= create_pointer (find_structure ("mem_attrs", 0));
1020 reg_attrs_tp
= create_pointer (find_structure ("reg_attrs", 0));
1021 bitmap_tp
= create_pointer (find_structure ("bitmap_element_def", 0));
1022 basic_block_tp
= create_pointer (find_structure ("basic_block_def", 0));
1023 constant_tp
= create_pointer (find_structure ("constant_descriptor_rtx", 0));
1024 scalar_tp
= &scalar_nonchar
; /* rtunion int */
1027 pair_p note_flds
= NULL
;
1030 for (c
= 0; c
<= NOTE_INSN_MAX
; c
++)
1035 case NOTE_INSN_DELETED_LABEL
:
1036 note_flds
= create_field (note_flds
, &string_type
, "rt_str");
1039 case NOTE_INSN_BLOCK_BEG
:
1040 case NOTE_INSN_BLOCK_END
:
1041 note_flds
= create_field (note_flds
, tree_tp
, "rt_tree");
1044 case NOTE_INSN_VAR_LOCATION
:
1045 note_flds
= create_field (note_flds
, rtx_tp
, "rt_rtx");
1049 note_flds
= create_field (note_flds
, scalar_tp
, "rt_int");
1052 /* NOTE_INSN_MAX is used as the default field for line
1054 if (c
== NOTE_INSN_MAX
)
1055 note_flds
->opt
= create_option (nodot
, "default", "");
1057 note_flds
->opt
= create_option (nodot
, "tag", note_insn_name
[c
]);
1059 note_union_tp
= new_structure ("rtx_def_note_subunion", 1,
1060 &lexer_line
, note_flds
, NULL
);
1062 /* Create a type to represent the various forms of SYMBOL_REF_DATA. */
1066 sym_flds
= create_field (NULL
, tree_tp
, "rt_tree");
1067 sym_flds
->opt
= create_option (nodot
, "default", "");
1069 sym_flds
= create_field (sym_flds
, constant_tp
, "rt_constant");
1070 sym_flds
->opt
= create_option (nodot
, "tag", "1");
1072 symbol_union_tp
= new_structure ("rtx_def_symbol_subunion", 1,
1073 &lexer_line
, sym_flds
, NULL
);
1075 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
1077 pair_p subfields
= NULL
;
1078 size_t aindex
, nmindex
;
1083 for (aindex
= 0; aindex
< strlen (rtx_format
[i
]); aindex
++)
1086 const char *subname
;
1088 switch (rtx_format
[i
][aindex
])
1099 if (i
== MEM
&& aindex
== 1)
1100 t
= mem_attrs_tp
, subname
= "rt_mem";
1101 else if (i
== JUMP_INSN
&& aindex
== 8)
1102 t
= rtx_tp
, subname
= "rt_rtx";
1103 else if (i
== CODE_LABEL
&& aindex
== 4)
1104 t
= scalar_tp
, subname
= "rt_int";
1105 else if (i
== CODE_LABEL
&& aindex
== 5)
1106 t
= rtx_tp
, subname
= "rt_rtx";
1107 else if (i
== LABEL_REF
1108 && (aindex
== 1 || aindex
== 2))
1109 t
= rtx_tp
, subname
= "rt_rtx";
1110 else if (i
== NOTE
&& aindex
== 4)
1111 t
= note_union_tp
, subname
= "";
1112 else if (i
== NOTE
&& aindex
== 5)
1113 t
= scalar_tp
, subname
= "rt_int";
1114 else if (i
== NOTE
&& aindex
>= 7)
1115 t
= scalar_tp
, subname
= "rt_int";
1116 else if (i
== ADDR_DIFF_VEC
&& aindex
== 4)
1117 t
= scalar_tp
, subname
= "rt_int";
1118 else if (i
== VALUE
&& aindex
== 0)
1119 t
= scalar_tp
, subname
= "rt_int";
1120 else if (i
== DEBUG_EXPR
&& aindex
== 0)
1121 t
= tree_tp
, subname
= "rt_tree";
1122 else if (i
== REG
&& aindex
== 1)
1123 t
= scalar_tp
, subname
= "rt_int";
1124 else if (i
== REG
&& aindex
== 2)
1125 t
= reg_attrs_tp
, subname
= "rt_reg";
1126 else if (i
== SCRATCH
&& aindex
== 0)
1127 t
= scalar_tp
, subname
= "rt_int";
1128 else if (i
== SYMBOL_REF
&& aindex
== 1)
1129 t
= scalar_tp
, subname
= "rt_int";
1130 else if (i
== SYMBOL_REF
&& aindex
== 2)
1131 t
= symbol_union_tp
, subname
= "";
1132 else if (i
== BARRIER
&& aindex
>= 3)
1133 t
= scalar_tp
, subname
= "rt_int";
1136 error_at_line (&lexer_line
,
1137 "rtx type `%s' has `0' in position %lu, can't handle",
1138 rtx_name
[i
], (unsigned long) aindex
);
1160 subname
= "rt_rtvec";
1165 subname
= "rt_tree";
1179 error_at_line (&lexer_line
,
1180 "rtx type `%s' has `%c' in position %lu, can't handle",
1181 rtx_name
[i
], rtx_format
[i
][aindex
],
1182 (unsigned long)aindex
);
1188 subfields
= create_field (subfields
, t
,
1189 xasprintf (".fld[%lu].%s",
1190 (unsigned long) aindex
,
1192 subfields
->opt
= nodot
;
1193 if (t
== note_union_tp
)
1194 subfields
->opt
= create_option (subfields
->opt
, "desc",
1196 if (t
== symbol_union_tp
)
1197 subfields
->opt
= create_option (subfields
->opt
, "desc",
1198 "CONSTANT_POOL_ADDRESS_P (&%0)");
1201 if (i
== SYMBOL_REF
)
1203 /* Add the "block_sym" field if SYMBOL_REF_HAS_BLOCK_INFO_P holds. */
1204 type_p field_tp
= find_structure ("block_symbol", 0);
1206 = create_optional_field (subfields
, field_tp
, "block_sym",
1207 "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)");
1210 sname
= xasprintf ("rtx_def_%s", rtx_name
[i
]);
1211 substruct
= new_structure (sname
, 0, &lexer_line
, subfields
, NULL
);
1213 ftag
= xstrdup (rtx_name
[i
]);
1214 for (nmindex
= 0; nmindex
< strlen (ftag
); nmindex
++)
1215 ftag
[nmindex
] = TOUPPER (ftag
[nmindex
]);
1217 flds
= create_field (flds
, substruct
, "");
1218 flds
->opt
= create_option (nodot
, "tag", ftag
);
1221 return new_structure ("rtx_def_subunion", 1, &lexer_line
, flds
, nodot
);
1224 /* Handle `special("tree_exp")'. This is a special case for
1225 field `operands' of struct tree_exp, which although it claims to contain
1226 pointers to trees, actually sometimes contains pointers to RTL too.
1227 Passed T, the old type of the field, and OPT its options. Returns
1228 a new type for the field. */
1231 adjust_field_tree_exp (type_p t
, options_p opt ATTRIBUTE_UNUSED
)
1236 if (t
->kind
!= TYPE_ARRAY
)
1238 error_at_line (&lexer_line
,
1239 "special `tree_exp' must be applied to an array");
1240 return &string_type
;
1243 nodot
= create_option (NULL
, "dot", "");
1245 flds
= create_field (NULL
, t
, "");
1246 flds
->opt
= create_option (nodot
, "length",
1247 "TREE_OPERAND_LENGTH ((tree) &%0)");
1248 flds
->opt
= create_option (flds
->opt
, "default", "");
1250 return new_structure ("tree_exp_subunion", 1, &lexer_line
, flds
, nodot
);
1253 /* Perform any special processing on a type T, about to become the type
1254 of a field. Return the appropriate type for the field.
1256 - Converts pointer-to-char, with no length parameter, to TYPE_STRING;
1257 - Similarly for arrays of pointer-to-char;
1258 - Converts structures for which a parameter is provided to
1260 - Handles "special" options.
1264 adjust_field_type (type_p t
, options_p opt
)
1267 const int pointer_p
= t
->kind
== TYPE_POINTER
;
1268 type_p params
[NUM_PARAM
];
1272 for (i
= 0; i
< NUM_PARAM
; i
++)
1275 for (; opt
; opt
= opt
->next
)
1276 if (strcmp (opt
->name
, "length") == 0)
1278 else if (strcmp (opt
->name
, "param_is") == 0
1279 || (strncmp (opt
->name
, "param", 5) == 0
1280 && ISDIGIT (opt
->name
[5])
1281 && strcmp (opt
->name
+ 6, "_is") == 0))
1283 int num
= ISDIGIT (opt
->name
[5]) ? opt
->name
[5] - '0' : 0;
1285 if (! UNION_OR_STRUCT_P (t
)
1286 && (t
->kind
!= TYPE_POINTER
|| ! UNION_OR_STRUCT_P (t
->u
.p
)))
1288 error_at_line (&lexer_line
,
1289 "option `%s' may only be applied to structures or structure pointers",
1295 if (params
[num
] != NULL
)
1296 error_at_line (&lexer_line
, "duplicate `%s' option", opt
->name
);
1297 if (! ISDIGIT (opt
->name
[5]))
1298 params
[num
] = create_pointer (CONST_CAST2(type_p
, const char *, opt
->info
));
1300 params
[num
] = CONST_CAST2 (type_p
, const char *, opt
->info
);
1302 else if (strcmp (opt
->name
, "special") == 0)
1304 const char *special_name
= opt
->info
;
1305 if (strcmp (special_name
, "tree_exp") == 0)
1306 t
= adjust_field_tree_exp (t
, opt
);
1307 else if (strcmp (special_name
, "rtx_def") == 0)
1308 t
= adjust_field_rtx_def (t
, opt
);
1310 error_at_line (&lexer_line
, "unknown special `%s'", special_name
);
1319 realt
= find_param_structure (t
, params
);
1320 t
= pointer_p
? create_pointer (realt
) : realt
;
1325 && t
->u
.p
->kind
== TYPE_SCALAR
1326 && t
->u
.p
->u
.scalar_is_char
)
1327 return &string_type
;
1328 if (t
->kind
== TYPE_ARRAY
&& t
->u
.a
.p
->kind
== TYPE_POINTER
1329 && t
->u
.a
.p
->u
.p
->kind
== TYPE_SCALAR
1330 && t
->u
.a
.p
->u
.p
->u
.scalar_is_char
)
1331 return create_array (&string_type
, t
->u
.a
.len
);
1337 static void set_gc_used_type (type_p
, enum gc_used_enum
, type_p
*);
1338 static void set_gc_used (pair_p
);
1340 /* Handle OPT for set_gc_used_type. */
1343 process_gc_options (options_p opt
, enum gc_used_enum level
, int *maybe_undef
,
1344 int *pass_param
, int *length
, int *skip
, type_p
*nested_ptr
)
1347 for (o
= opt
; o
; o
= o
->next
)
1348 if (strcmp (o
->name
, "ptr_alias") == 0 && level
== GC_POINTED_TO
)
1349 set_gc_used_type (CONST_CAST2 (type_p
, const char *, o
->info
),
1350 GC_POINTED_TO
, NULL
);
1351 else if (strcmp (o
->name
, "maybe_undef") == 0)
1353 else if (strcmp (o
->name
, "use_params") == 0)
1355 else if (strcmp (o
->name
, "length") == 0)
1357 else if (strcmp (o
->name
, "skip") == 0)
1359 else if (strcmp (o
->name
, "nested_ptr") == 0)
1360 *nested_ptr
= ((const struct nested_ptr_data
*) o
->info
)->type
;
1363 /* Set the gc_used field of T to LEVEL, and handle the types it references. */
1366 set_gc_used_type (type_p t
, enum gc_used_enum level
, type_p param
[NUM_PARAM
])
1368 if (t
->gc_used
>= level
)
1382 process_gc_options (t
->u
.s
.opt
, level
, &dummy
, &dummy
, &dummy
, &dummy
,
1385 for (f
= t
->u
.s
.fields
; f
; f
= f
->next
)
1387 int maybe_undef
= 0;
1391 type_p nested_ptr
= NULL
;
1392 process_gc_options (f
->opt
, level
, &maybe_undef
, &pass_param
,
1393 &length
, &skip
, &nested_ptr
);
1395 if (nested_ptr
&& f
->type
->kind
== TYPE_POINTER
)
1396 set_gc_used_type (nested_ptr
, GC_POINTED_TO
,
1397 pass_param
? param
: NULL
);
1398 else if (length
&& f
->type
->kind
== TYPE_POINTER
)
1399 set_gc_used_type (f
->type
->u
.p
, GC_USED
, NULL
);
1400 else if (maybe_undef
&& f
->type
->kind
== TYPE_POINTER
)
1401 set_gc_used_type (f
->type
->u
.p
, GC_MAYBE_POINTED_TO
, NULL
);
1402 else if (pass_param
&& f
->type
->kind
== TYPE_POINTER
&& param
)
1403 set_gc_used_type (find_param_structure (f
->type
->u
.p
, param
),
1404 GC_POINTED_TO
, NULL
);
1406 ; /* target type is not used through this field */
1408 set_gc_used_type (f
->type
, GC_USED
, pass_param
? param
: NULL
);
1414 set_gc_used_type (t
->u
.p
, GC_POINTED_TO
, NULL
);
1418 set_gc_used_type (t
->u
.a
.p
, GC_USED
, param
);
1421 case TYPE_LANG_STRUCT
:
1422 for (t
= t
->u
.s
.lang_struct
; t
; t
= t
->next
)
1423 set_gc_used_type (t
, level
, param
);
1426 case TYPE_PARAM_STRUCT
:
1429 for (i
= 0; i
< NUM_PARAM
; i
++)
1430 if (t
->u
.param_struct
.param
[i
] != 0)
1431 set_gc_used_type (t
->u
.param_struct
.param
[i
], GC_USED
, NULL
);
1433 if (t
->u
.param_struct
.stru
->gc_used
== GC_POINTED_TO
)
1434 level
= GC_POINTED_TO
;
1437 t
->u
.param_struct
.stru
->gc_used
= GC_UNUSED
;
1438 set_gc_used_type (t
->u
.param_struct
.stru
, level
,
1439 t
->u
.param_struct
.param
);
1447 /* Set the gc_used fields of all the types pointed to by VARIABLES. */
1450 set_gc_used (pair_p variables
)
1453 for (p
= variables
; p
; p
= p
->next
)
1454 set_gc_used_type (p
->type
, GC_USED
, NULL
);
1457 /* File mapping routines. For each input file, there is one output .c file
1458 (but some output files have many input files), and there is one .h file
1459 for the whole build. */
1461 /* Output file handling. */
1463 /* Create and return an outf_p for a new file for NAME, to be called
1467 create_file (const char *name
, const char *oname
)
1469 static const char *const hdr
[] = {
1470 " Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.\n",
1472 "This file is part of GCC.\n",
1474 "GCC is free software; you can redistribute it and/or modify it under\n",
1475 "the terms of the GNU General Public License as published by the Free\n",
1476 "Software Foundation; either version 3, or (at your option) any later\n",
1479 "GCC is distributed in the hope that it will be useful, but WITHOUT ANY\n",
1480 "WARRANTY; without even the implied warranty of MERCHANTABILITY or\n",
1481 "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n",
1482 "for more details.\n",
1484 "You should have received a copy of the GNU General Public License\n",
1485 "along with GCC; see the file COPYING3. If not see\n",
1486 "<http://www.gnu.org/licenses/>. */\n",
1488 "/* This file is machine generated. Do not edit. */\n"
1493 gcc_assert (name
!= NULL
);
1494 gcc_assert (oname
!= NULL
);
1495 f
= XCNEW (struct outf
);
1496 f
->next
= output_files
;
1500 oprintf (f
, "/* Type information for %s.\n", name
);
1501 for (i
= 0; i
< ARRAY_SIZE (hdr
); i
++)
1502 oprintf (f
, "%s", hdr
[i
]);
1506 /* Print, like fprintf, to O.
1507 N.B. You might think this could be implemented more efficiently
1508 with vsnprintf(). Unfortunately, there are C libraries that
1509 provide that function but without the C99 semantics for its return
1510 value, making it impossible to know how much space is required. */
1512 oprintf (outf_p o
, const char *format
, ...)
1518 /* In plugin mode, the O could be a NULL pointer, so avoid crashing
1523 va_start (ap
, format
);
1524 slength
= vasprintf (&s
, format
, ap
);
1525 if (s
== NULL
|| (int)slength
< 0)
1526 fatal ("out of memory");
1529 if (o
->bufused
+ slength
> o
->buflength
)
1531 size_t new_len
= o
->buflength
;
1536 } while (o
->bufused
+ slength
>= new_len
);
1537 o
->buf
= XRESIZEVEC (char, o
->buf
, new_len
);
1538 o
->buflength
= new_len
;
1540 memcpy (o
->buf
+ o
->bufused
, s
, slength
);
1541 o
->bufused
+= slength
;
1545 /* Open the global header file and the language-specific header files. */
1548 open_base_files (void)
1552 if (nb_plugin_files
> 0 && plugin_files
)
1555 header_file
= create_file ("GCC", "gtype-desc.h");
1557 base_files
= XNEWVEC (outf_p
, num_lang_dirs
);
1559 for (i
= 0; i
< num_lang_dirs
; i
++)
1560 base_files
[i
] = create_file (lang_dir_names
[i
],
1561 xasprintf ("gtype-%s.h", lang_dir_names
[i
]));
1563 /* gtype-desc.c is a little special, so we create it here. */
1565 /* The order of files here matters very much. */
1566 static const char *const ifiles
[] = {
1567 "config.h", "system.h", "coretypes.h", "tm.h", "varray.h",
1568 "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
1569 "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
1570 "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
1571 "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
1572 "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h",
1573 "cfglayout.h", "except.h", "output.h", "gimple.h", "cfgloop.h",
1574 "target.h", "ipa-prop.h", NULL
1576 const char *const *ifp
;
1577 outf_p gtype_desc_c
;
1579 gtype_desc_c
= create_file ("GCC", "gtype-desc.c");
1580 for (ifp
= ifiles
; *ifp
; ifp
++)
1581 oprintf (gtype_desc_c
, "#include \"%s\"\n", *ifp
);
1583 /* Make sure we handle "cfun" specially. */
1584 oprintf (gtype_desc_c
, "\n/* See definition in function.h. */\n");
1585 oprintf (gtype_desc_c
, "#undef cfun\n");
1589 /* For F a filename, return the real basename of F, with all the directory
1590 components skipped. */
1593 get_file_realbasename (const char *f
)
1595 const char * lastslash
= strrchr (f
, '/');
1597 return (lastslash
!= NULL
) ? lastslash
+ 1 : f
;
1600 /* For F a filename, return the relative path to F from $(srcdir) if the
1601 latter is a prefix in F, NULL otherwise. */
1604 get_file_srcdir_relative_path (const char *f
)
1606 if (strlen (f
) > srcdir_len
1607 && IS_DIR_SEPARATOR (f
[srcdir_len
])
1608 && memcmp (f
, srcdir
, srcdir_len
) == 0)
1609 return f
+ srcdir_len
+ 1;
1614 /* For F a filename, return the relative path to F from $(srcdir) if the
1615 latter is a prefix in F, or the real basename of F otherwise. */
1618 get_file_basename (const char *f
)
1620 const char * srcdir_path
= get_file_srcdir_relative_path (f
);
1622 return (srcdir_path
!= NULL
) ? srcdir_path
: get_file_realbasename (f
);
1625 /* For F a filename, return the lang_dir_names relative index of the language
1626 directory that is a prefix in F, if any, -1 otherwise. */
1629 get_prefix_langdir_index (const char *f
)
1631 size_t f_len
= strlen (f
);
1634 for (lang_index
= 0; lang_index
< num_lang_dirs
; lang_index
++)
1636 const char * langdir
= lang_dir_names
[lang_index
];
1637 size_t langdir_len
= strlen (langdir
);
1639 if (f_len
> langdir_len
1640 && IS_DIR_SEPARATOR (f
[langdir_len
])
1641 && memcmp (f
, langdir
, langdir_len
) == 0)
1648 /* For F a filename, return the name of language directory where F is located,
1649 if any, NULL otherwise. */
1652 get_file_langdir (const char *f
)
1654 /* Get the relative path to F from $(srcdir) and find the language by
1655 comparing the prefix with language directory names. If F is not even
1656 srcdir relative, no point in looking further. */
1659 const char * srcdir_relative_path
= get_file_srcdir_relative_path (f
);
1661 if (!srcdir_relative_path
)
1664 lang_index
= get_prefix_langdir_index (srcdir_relative_path
);
1666 return (lang_index
>= 0) ? lang_dir_names
[lang_index
] : NULL
;
1669 /* The gt- output file name for F. */
1672 get_file_gtfilename (const char *f
)
1674 /* Cook up an initial version of the gt- file name from the file real
1675 basename and the language name, if any. */
1677 const char *basename
= get_file_realbasename (f
);
1678 const char *langdir
= get_file_langdir (f
);
1681 (langdir
? xasprintf ("gt-%s-%s", langdir
, basename
)
1682 : xasprintf ("gt-%s", basename
));
1684 /* Then replace all non alphanumerics characters by '-' and change the
1685 extenstion to ".h". We expect the input filename extension was at least
1686 one character long. */
1690 for (; *s
!= '.'; s
++)
1691 if (! ISALNUM (*s
) && *s
!= '-')
1694 memcpy (s
, ".h", sizeof (".h"));
1699 /* An output file, suitable for definitions, that can see declarations
1700 made in INPUT_FILE and is linked into every language that uses
1704 get_output_file_with_visibility (const char *input_file
)
1708 const char *basename
;
1709 const char *for_name
;
1710 const char *output_name
;
1712 /* This can happen when we need a file with visibility on a
1713 structure that we've never seen. We have to just hope that it's
1714 globally visible. */
1715 if (input_file
== NULL
)
1716 input_file
= "system.h";
1718 /* In plugin mode, return NULL unless the input_file is one of the
1723 for (i
= 0; i
< nb_plugin_files
; i
++)
1724 if (strcmp (input_file
, plugin_files
[i
]) == 0)
1725 return plugin_output
;
1730 /* Determine the output file name. */
1731 basename
= get_file_basename (input_file
);
1733 len
= strlen (basename
);
1734 if ((len
> 2 && memcmp (basename
+len
-2, ".c", 2) == 0)
1735 || (len
> 2 && memcmp (basename
+len
-2, ".y", 2) == 0)
1736 || (len
> 3 && memcmp (basename
+len
-3, ".in", 3) == 0))
1738 output_name
= get_file_gtfilename (input_file
);
1739 for_name
= basename
;
1741 /* Some headers get used by more than one front-end; hence, it
1742 would be inappropriate to spew them out to a single gtype-<lang>.h
1743 (and gengtype doesn't know how to direct spewage into multiple
1744 gtype-<lang>.h headers at this time). Instead, we pair up these
1745 headers with source files (and their special purpose gt-*.h headers). */
1746 else if (strcmp (basename
, "c-common.h") == 0)
1747 output_name
= "gt-c-common.h", for_name
= "c-common.c";
1748 else if (strcmp (basename
, "c-lang.h") == 0)
1749 output_name
= "gt-c-decl.h", for_name
= "c-decl.c";
1750 else if (strcmp (basename
, "c-tree.h") == 0)
1751 output_name
= "gt-c-decl.h", for_name
= "c-decl.c";
1752 else if (strncmp (basename
, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename
[2])
1753 && strcmp (basename
+ 3, "cp-tree.h") == 0)
1754 output_name
= "gt-cp-tree.h", for_name
= "cp/tree.c";
1755 else if (strncmp (basename
, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename
[2])
1756 && strcmp (basename
+ 3, "decl.h") == 0)
1757 output_name
= "gt-cp-decl.h", for_name
= "cp/decl.c";
1758 else if (strncmp (basename
, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename
[2])
1759 && strcmp (basename
+ 3, "name-lookup.h") == 0)
1760 output_name
= "gt-cp-name-lookup.h", for_name
= "cp/name-lookup.c";
1761 else if (strncmp (basename
, "objc", 4) == 0 && IS_DIR_SEPARATOR (basename
[4])
1762 && strcmp (basename
+ 5, "objc-act.h") == 0)
1763 output_name
= "gt-objc-objc-act.h", for_name
= "objc/objc-act.c";
1766 int lang_index
= get_prefix_langdir_index (basename
);
1768 if (lang_index
>= 0)
1769 return base_files
[lang_index
];
1771 output_name
= "gtype-desc.c";
1775 /* Look through to see if we've ever seen this output filename before. */
1776 for (r
= output_files
; r
; r
= r
->next
)
1777 if (strcmp (r
->name
, output_name
) == 0)
1780 /* If not, create it. */
1781 r
= create_file (for_name
, output_name
);
1783 gcc_assert (r
&& r
->name
);
1787 /* The name of an output file, suitable for definitions, that can see
1788 declarations made in INPUT_FILE and is linked into every language
1789 that uses INPUT_FILE. */
1792 get_output_file_name (const char *input_file
)
1794 outf_p o
= get_output_file_with_visibility (input_file
);
1800 /* Check if existing file is equal to the in memory buffer. */
1803 is_file_equal (outf_p of
)
1805 FILE *newfile
= fopen (of
->name
, "r");
1808 if (newfile
== NULL
)
1812 for (i
= 0; i
< of
->bufused
; i
++)
1815 ch
= fgetc (newfile
);
1816 if (ch
== EOF
|| ch
!= (unsigned char) of
->buf
[i
])
1826 /* Copy the output to its final destination,
1827 but don't unnecessarily change modification times. */
1830 close_output_files (void)
1834 for (of
= output_files
; of
; of
= of
->next
)
1837 if (!is_file_equal(of
))
1839 FILE *newfile
= fopen (of
->name
, "w");
1840 if (newfile
== NULL
)
1841 fatal ("opening output file %s: %s", of
->name
, strerror (errno
));
1842 if (fwrite (of
->buf
, 1, of
->bufused
, newfile
) != of
->bufused
)
1843 fatal ("writing output file %s: %s", of
->name
, strerror (errno
));
1844 if (fclose (newfile
) != 0)
1845 fatal ("closing output file %s: %s", of
->name
, strerror (errno
));
1849 of
->bufused
= of
->buflength
= 0;
1860 struct walk_type_data
;
1862 /* For scalars and strings, given the item in 'val'.
1863 For structures, given a pointer to the item in 'val'.
1864 For misc. pointers, given the item in 'val'.
1866 typedef void (*process_field_fn
)
1867 (type_p f
, const struct walk_type_data
*p
);
1868 typedef void (*func_name_fn
)
1869 (type_p s
, const struct walk_type_data
*p
);
1871 /* Parameters for write_types. */
1873 struct write_types_data
1876 const char *param_prefix
;
1877 const char *subfield_marker_routine
;
1878 const char *marker_routine
;
1879 const char *reorder_note_routine
;
1880 const char *comment
;
1881 int skip_hooks
; /* skip hook generation if non zero */
1884 static void output_escaped_param (struct walk_type_data
*d
,
1885 const char *, const char *);
1886 static void output_mangled_typename (outf_p
, const_type_p
);
1887 static void walk_type (type_p t
, struct walk_type_data
*d
);
1888 static void write_func_for_structure
1889 (type_p orig_s
, type_p s
, type_p
* param
,
1890 const struct write_types_data
*wtd
);
1891 static void write_types_process_field
1892 (type_p f
, const struct walk_type_data
*d
);
1893 static void write_types (outf_p output_header
,
1895 type_p param_structs
,
1896 const struct write_types_data
*wtd
);
1897 static void write_types_local_process_field
1898 (type_p f
, const struct walk_type_data
*d
);
1899 static void write_local_func_for_structure
1900 (type_p orig_s
, type_p s
, type_p
* param
);
1901 static void write_local (outf_p output_header
,
1903 type_p param_structs
);
1904 static void write_enum_defn (type_p structures
, type_p param_structs
);
1905 static int contains_scalar_p (type_p t
);
1906 static void put_mangled_filename (outf_p
, const char *);
1907 static void finish_root_table (struct flist
*flp
, const char *pfx
,
1908 const char *tname
, const char *lastname
,
1910 static void write_root (outf_p
, pair_p
, type_p
, const char *, int,
1911 struct fileloc
*, const char *, bool);
1912 static void write_array (outf_p f
, pair_p v
,
1913 const struct write_types_data
*wtd
);
1914 static void write_roots (pair_p
, bool);
1916 /* Parameters for walk_type. */
1918 struct walk_type_data
1920 process_field_fn process_field
;
1925 const char *prev_val
[4];
1928 struct fileloc
*line
;
1933 const char *reorder_fn
;
1935 bool fn_wants_lvalue
;
1938 /* Print a mangled name representing T to OF. */
1941 output_mangled_typename (outf_p of
, const_type_p t
)
1945 else switch (t
->kind
)
1949 output_mangled_typename (of
, t
->u
.p
);
1959 case TYPE_LANG_STRUCT
:
1960 oprintf (of
, "%lu%s", (unsigned long) strlen (t
->u
.s
.tag
), t
->u
.s
.tag
);
1962 case TYPE_PARAM_STRUCT
:
1965 for (i
= 0; i
< NUM_PARAM
; i
++)
1966 if (t
->u
.param_struct
.param
[i
] != NULL
)
1967 output_mangled_typename (of
, t
->u
.param_struct
.param
[i
]);
1968 output_mangled_typename (of
, t
->u
.param_struct
.stru
);
1976 /* Print PARAM to D->OF processing escapes. D->VAL references the
1977 current object, D->PREV_VAL the object containing the current
1978 object, ONAME is the name of the option and D->LINE is used to
1979 print error messages. */
1982 output_escaped_param (struct walk_type_data
*d
, const char *param
,
1987 for (p
= param
; *p
; p
++)
1989 oprintf (d
->of
, "%c", *p
);
1993 oprintf (d
->of
, "(%s)", d
->prev_val
[2]);
1996 oprintf (d
->of
, "(%s)", d
->prev_val
[0]);
1999 oprintf (d
->of
, "(%s)", d
->prev_val
[1]);
2003 const char *pp
= d
->val
+ strlen (d
->val
);
2004 while (pp
[-1] == ']')
2007 oprintf (d
->of
, "%s", pp
);
2011 error_at_line (d
->line
, "`%s' option contains bad escape %c%c",
2016 /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
2017 which is of type T. Write code to D->OF to constrain execution (at
2018 the point that D->PROCESS_FIELD is called) to the appropriate
2019 cases. Call D->PROCESS_FIELD on subobjects before calling it on
2020 pointers to those objects. D->PREV_VAL lists the objects
2021 containing the current object, D->OPT is a list of options to
2022 apply, D->INDENT is the current indentation level, D->LINE is used
2023 to print error messages, D->BITMAP indicates which languages to
2024 print the structure for, and D->PARAM is the current parameter
2025 (from an enclosing param_is option). */
2028 walk_type (type_p t
, struct walk_type_data
*d
)
2030 const char *length
= NULL
;
2031 const char *desc
= NULL
;
2032 int maybe_undef_p
= 0;
2033 int use_param_num
= -1;
2034 int use_params_p
= 0;
2036 const struct nested_ptr_data
*nested_ptr_d
= NULL
;
2038 d
->needs_cast_p
= false;
2039 for (oo
= d
->opt
; oo
; oo
= oo
->next
)
2040 if (strcmp (oo
->name
, "length") == 0)
2042 else if (strcmp (oo
->name
, "maybe_undef") == 0)
2044 else if (strncmp (oo
->name
, "use_param", 9) == 0
2045 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
2046 use_param_num
= oo
->name
[9] == '\0' ? 0 : oo
->name
[9] - '0';
2047 else if (strcmp (oo
->name
, "use_params") == 0)
2049 else if (strcmp (oo
->name
, "desc") == 0)
2051 else if (strcmp (oo
->name
, "mark_hook") == 0)
2053 else if (strcmp (oo
->name
, "nested_ptr") == 0)
2054 nested_ptr_d
= (const struct nested_ptr_data
*) oo
->info
;
2055 else if (strcmp (oo
->name
, "dot") == 0)
2057 else if (strcmp (oo
->name
, "tag") == 0)
2059 else if (strcmp (oo
->name
, "special") == 0)
2061 else if (strcmp (oo
->name
, "skip") == 0)
2063 else if (strcmp (oo
->name
, "default") == 0)
2065 else if (strcmp (oo
->name
, "descbits") == 0)
2067 else if (strcmp (oo
->name
, "param_is") == 0)
2069 else if (strncmp (oo
->name
, "param", 5) == 0
2070 && ISDIGIT (oo
->name
[5])
2071 && strcmp (oo
->name
+ 6, "_is") == 0)
2073 else if (strcmp (oo
->name
, "chain_next") == 0)
2075 else if (strcmp (oo
->name
, "chain_prev") == 0)
2077 else if (strcmp (oo
->name
, "chain_circular") == 0)
2079 else if (strcmp (oo
->name
, "reorder") == 0)
2082 error_at_line (d
->line
, "unknown option `%s'\n", oo
->name
);
2089 int pointer_p
= t
->kind
== TYPE_POINTER
;
2093 if (! UNION_OR_STRUCT_P (t
))
2094 error_at_line (d
->line
, "`use_params' option on unimplemented type");
2096 t
= find_param_structure (t
, d
->param
);
2098 t
= create_pointer (t
);
2101 if (use_param_num
!= -1)
2103 if (d
->param
!= NULL
&& d
->param
[use_param_num
] != NULL
)
2105 type_p nt
= d
->param
[use_param_num
];
2107 if (t
->kind
== TYPE_ARRAY
)
2108 nt
= create_array (nt
, t
->u
.a
.len
);
2109 else if (length
!= NULL
&& t
->kind
== TYPE_POINTER
)
2110 nt
= create_pointer (nt
);
2111 d
->needs_cast_p
= (t
->kind
!= TYPE_POINTER
2112 && (nt
->kind
== TYPE_POINTER
2113 || nt
->kind
== TYPE_STRING
));
2117 error_at_line (d
->line
, "no parameter defined for `%s'",
2122 && (t
->kind
!= TYPE_POINTER
|| ! UNION_OR_STRUCT_P (t
->u
.p
)))
2124 error_at_line (d
->line
,
2125 "field `%s' has invalid option `maybe_undef_p'\n",
2134 d
->process_field (t
, d
);
2140 && t
->u
.p
->u
.s
.line
.file
== NULL
)
2142 oprintf (d
->of
, "%*sgcc_assert (!%s);\n", d
->indent
, "", d
->val
);
2148 if (! UNION_OR_STRUCT_P (t
->u
.p
)
2149 && t
->u
.p
->kind
!= TYPE_PARAM_STRUCT
)
2151 error_at_line (d
->line
,
2152 "field `%s' is pointer to unimplemented type",
2159 const char *oldprevval2
= d
->prev_val
[2];
2161 if (! UNION_OR_STRUCT_P (nested_ptr_d
->type
))
2163 error_at_line (d
->line
,
2164 "field `%s' has invalid "
2165 "option `nested_ptr'\n",
2170 d
->prev_val
[2] = d
->val
;
2171 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2173 d
->val
= xasprintf ("x%d", d
->counter
++);
2174 oprintf (d
->of
, "%*s%s %s * %s%s =\n", d
->indent
, "",
2175 (nested_ptr_d
->type
->kind
== TYPE_UNION
2176 ? "union" : "struct"),
2177 nested_ptr_d
->type
->u
.s
.tag
,
2178 d
->fn_wants_lvalue
? "" : "const ",
2180 oprintf (d
->of
, "%*s", d
->indent
+ 2, "");
2181 output_escaped_param (d
, nested_ptr_d
->convert_from
,
2183 oprintf (d
->of
, ";\n");
2185 d
->process_field (nested_ptr_d
->type
, d
);
2187 if (d
->fn_wants_lvalue
)
2189 oprintf (d
->of
, "%*s%s = ", d
->indent
, "",
2191 d
->prev_val
[2] = d
->val
;
2192 output_escaped_param (d
, nested_ptr_d
->convert_to
,
2194 oprintf (d
->of
, ";\n");
2198 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2199 d
->val
= d
->prev_val
[2];
2200 d
->prev_val
[2] = oldprevval2
;
2203 d
->process_field (t
->u
.p
, d
);
2207 int loopcounter
= d
->counter
++;
2208 const char *oldval
= d
->val
;
2209 const char *oldprevval3
= d
->prev_val
[3];
2212 oprintf (d
->of
, "%*sif (%s != NULL) {\n", d
->indent
, "", d
->val
);
2214 oprintf (d
->of
, "%*ssize_t i%d;\n", d
->indent
, "", loopcounter
);
2215 oprintf (d
->of
, "%*sfor (i%d = 0; i%d != (size_t)(", d
->indent
, "",
2216 loopcounter
, loopcounter
);
2217 output_escaped_param (d
, length
, "length");
2218 oprintf (d
->of
, "); i%d++) {\n", loopcounter
);
2220 d
->val
= newval
= xasprintf ("%s[i%d]", oldval
, loopcounter
);
2222 d
->prev_val
[3] = oldval
;
2223 walk_type (t
->u
.p
, d
);
2226 d
->prev_val
[3] = oldprevval3
;
2229 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2230 d
->process_field(t
, d
);
2232 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2239 int loopcounter
= d
->counter
++;
2240 const char *oldval
= d
->val
;
2243 /* If it's an array of scalars, we optimize by not generating
2245 if (t
->u
.a
.p
->kind
== TYPE_SCALAR
)
2248 /* When walking an array, compute the length and store it in a
2249 local variable before walking the array elements, instead of
2250 recomputing the length expression each time through the loop.
2251 This is necessary to handle tcc_vl_exp objects like CALL_EXPR,
2252 where the length is stored in the first array element,
2253 because otherwise that operand can get overwritten on the
2255 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2257 oprintf (d
->of
, "%*ssize_t i%d;\n", d
->indent
, "", loopcounter
);
2258 oprintf (d
->of
, "%*ssize_t l%d = (size_t)(",
2259 d
->indent
, "", loopcounter
);
2261 output_escaped_param (d
, length
, "length");
2263 oprintf (d
->of
, "%s", t
->u
.a
.len
);
2264 oprintf (d
->of
, ");\n");
2266 oprintf (d
->of
, "%*sfor (i%d = 0; i%d != l%d; i%d++) {\n",
2268 loopcounter
, loopcounter
, loopcounter
, loopcounter
);
2270 d
->val
= newval
= xasprintf ("%s[i%d]", oldval
, loopcounter
);
2272 walk_type (t
->u
.a
.p
, d
);
2277 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2279 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2287 const char *oldval
= d
->val
;
2288 const char *oldprevval1
= d
->prev_val
[1];
2289 const char *oldprevval2
= d
->prev_val
[2];
2290 const int union_p
= t
->kind
== TYPE_UNION
;
2291 int seen_default_p
= 0;
2294 if (! t
->u
.s
.line
.file
)
2295 error_at_line (d
->line
, "incomplete structure `%s'", t
->u
.s
.tag
);
2297 if ((d
->bitmap
& t
->u
.s
.bitmap
) != d
->bitmap
)
2299 error_at_line (d
->line
,
2300 "structure `%s' defined for mismatching languages",
2302 error_at_line (&t
->u
.s
.line
, "one structure defined here");
2305 /* Some things may also be defined in the structure's options. */
2306 for (o
= t
->u
.s
.opt
; o
; o
= o
->next
)
2307 if (! desc
&& strcmp (o
->name
, "desc") == 0)
2310 d
->prev_val
[2] = oldval
;
2311 d
->prev_val
[1] = oldprevval2
;
2316 error_at_line (d
->line
, "missing `desc' option for union `%s'",
2320 oprintf (d
->of
, "%*sswitch (", d
->indent
, "");
2321 output_escaped_param (d
, desc
, "desc");
2322 oprintf (d
->of
, ")\n");
2324 oprintf (d
->of
, "%*s{\n", d
->indent
, "");
2326 for (f
= t
->u
.s
.fields
; f
; f
= f
->next
)
2329 const char *dot
= ".";
2330 const char *tagid
= NULL
;
2333 int use_param_p
= 0;
2336 d
->reorder_fn
= NULL
;
2337 for (oo
= f
->opt
; oo
; oo
= oo
->next
)
2338 if (strcmp (oo
->name
, "dot") == 0)
2340 else if (strcmp (oo
->name
, "tag") == 0)
2342 else if (strcmp (oo
->name
, "skip") == 0)
2344 else if (strcmp (oo
->name
, "default") == 0)
2346 else if (strcmp (oo
->name
, "reorder") == 0)
2347 d
->reorder_fn
= oo
->info
;
2348 else if (strncmp (oo
->name
, "use_param", 9) == 0
2349 && (oo
->name
[9] == '\0' || ISDIGIT (oo
->name
[9])))
2355 if (union_p
&& tagid
)
2357 oprintf (d
->of
, "%*scase %s:\n", d
->indent
, "", tagid
);
2360 else if (union_p
&& default_p
)
2362 oprintf (d
->of
, "%*sdefault:\n", d
->indent
, "");
2366 else if (! union_p
&& (default_p
|| tagid
))
2367 error_at_line (d
->line
,
2368 "can't use `%s' outside a union on field `%s'",
2369 default_p
? "default" : "tag", f
->name
);
2370 else if (union_p
&& ! (default_p
|| tagid
)
2371 && f
->type
->kind
== TYPE_SCALAR
)
2374 "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
2375 d
->line
->file
, d
->line
->line
, f
->name
);
2378 else if (union_p
&& ! (default_p
|| tagid
))
2379 error_at_line (d
->line
,
2380 "field `%s' is missing `tag' or `default' option",
2384 d
->val
= newval
= xasprintf ("%s%s%s", oldval
, dot
, f
->name
);
2386 d
->used_length
= false;
2388 if (union_p
&& use_param_p
&& d
->param
== NULL
)
2389 oprintf (d
->of
, "%*sgcc_unreachable ();\n", d
->indent
, "");
2391 walk_type (f
->type
, d
);
2397 oprintf (d
->of
, "%*sbreak;\n", d
->indent
, "");
2401 d
->reorder_fn
= NULL
;
2404 d
->prev_val
[1] = oldprevval1
;
2405 d
->prev_val
[2] = oldprevval2
;
2407 if (union_p
&& ! seen_default_p
)
2409 oprintf (d
->of
, "%*sdefault:\n", d
->indent
, "");
2410 oprintf (d
->of
, "%*s break;\n", d
->indent
, "");
2414 oprintf (d
->of
, "%*s}\n", d
->indent
, "");
2420 case TYPE_LANG_STRUCT
:
2423 for (nt
= t
->u
.s
.lang_struct
; nt
; nt
= nt
->next
)
2424 if ((d
->bitmap
& nt
->u
.s
.bitmap
) == d
->bitmap
)
2427 error_at_line (d
->line
, "structure `%s' differs between languages",
2434 case TYPE_PARAM_STRUCT
:
2436 type_p
*oldparam
= d
->param
;
2438 d
->param
= t
->u
.param_struct
.param
;
2439 walk_type (t
->u
.param_struct
.stru
, d
);
2440 d
->param
= oldparam
;
2449 /* process_field routine for marking routines. */
2452 write_types_process_field (type_p f
, const struct walk_type_data
*d
)
2454 const struct write_types_data
*wtd
;
2455 const char *cast
= d
->needs_cast_p
? "(void *)" : "";
2456 wtd
= (const struct write_types_data
*) d
->cookie
;
2461 oprintf (d
->of
, "%*s%s (%s%s", d
->indent
, "",
2462 wtd
->subfield_marker_routine
, cast
, d
->val
);
2463 if (wtd
->param_prefix
)
2465 oprintf (d
->of
, ", %s", d
->prev_val
[3]);
2468 oprintf (d
->of
, ", gt_%s_", wtd
->param_prefix
);
2469 output_mangled_typename (d
->of
, d
->orig_s
);
2472 oprintf (d
->of
, ", gt_%sa_%s", wtd
->param_prefix
, d
->prev_val
[0]);
2474 if (f
->u
.p
->kind
== TYPE_PARAM_STRUCT
2475 && f
->u
.p
->u
.s
.line
.file
!= NULL
)
2477 oprintf (d
->of
, ", gt_e_");
2478 output_mangled_typename (d
->of
, f
);
2480 else if (UNION_OR_STRUCT_P (f
)
2481 && f
->u
.p
->u
.s
.line
.file
!= NULL
)
2483 oprintf (d
->of
, ", gt_ggc_e_");
2484 output_mangled_typename (d
->of
, f
);
2487 oprintf (d
->of
, ", gt_types_enum_last");
2489 oprintf (d
->of
, ");\n");
2490 if (d
->reorder_fn
&& wtd
->reorder_note_routine
)
2491 oprintf (d
->of
, "%*s%s (%s%s, %s, %s);\n", d
->indent
, "",
2492 wtd
->reorder_note_routine
, cast
, d
->val
,
2493 d
->prev_val
[3], d
->reorder_fn
);
2499 case TYPE_LANG_STRUCT
:
2500 case TYPE_PARAM_STRUCT
:
2501 oprintf (d
->of
, "%*sgt_%s_", d
->indent
, "", wtd
->prefix
);
2502 output_mangled_typename (d
->of
, f
);
2503 oprintf (d
->of
, " (%s%s);\n", cast
, d
->val
);
2504 if (d
->reorder_fn
&& wtd
->reorder_note_routine
)
2505 oprintf (d
->of
, "%*s%s (%s%s, %s%s, %s);\n", d
->indent
, "",
2506 wtd
->reorder_note_routine
, cast
, d
->val
, cast
, d
->val
,
2518 /* A subroutine of write_func_for_structure. Write the enum tag for S. */
2521 output_type_enum (outf_p of
, type_p s
)
2523 if (s
->kind
== TYPE_PARAM_STRUCT
&& s
->u
.s
.line
.file
!= NULL
)
2525 oprintf (of
, ", gt_e_");
2526 output_mangled_typename (of
, s
);
2528 else if (UNION_OR_STRUCT_P (s
) && s
->u
.s
.line
.file
!= NULL
)
2530 oprintf (of
, ", gt_ggc_e_");
2531 output_mangled_typename (of
, s
);
2534 oprintf (of
, ", gt_types_enum_last");
2537 /* For S, a structure that's part of ORIG_S, and using parameters
2538 PARAM, write out a routine that:
2539 - Takes a parameter, a void * but actually of type *S
2540 - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
2541 field of S or its substructures and (in some cases) things
2542 that are pointed to by S.
2546 write_func_for_structure (type_p orig_s
, type_p s
, type_p
*param
,
2547 const struct write_types_data
*wtd
)
2549 const char *fn
= s
->u
.s
.line
.file
;
2551 const char *chain_next
= NULL
;
2552 const char *chain_prev
= NULL
;
2553 const char *chain_circular
= NULL
;
2554 const char *mark_hook_name
= NULL
;
2556 struct walk_type_data d
;
2558 /* This is a hack, and not the good kind either. */
2559 for (i
= NUM_PARAM
- 1; i
>= 0; i
--)
2560 if (param
&& param
[i
] && param
[i
]->kind
== TYPE_POINTER
2561 && UNION_OR_STRUCT_P (param
[i
]->u
.p
))
2562 fn
= param
[i
]->u
.p
->u
.s
.line
.file
;
2564 memset (&d
, 0, sizeof (d
));
2565 d
.of
= get_output_file_with_visibility (fn
);
2567 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
2568 if (strcmp (opt
->name
, "chain_next") == 0)
2569 chain_next
= opt
->info
;
2570 else if (strcmp (opt
->name
, "chain_prev") == 0)
2571 chain_prev
= opt
->info
;
2572 else if (strcmp (opt
->name
, "chain_circular") == 0)
2573 chain_circular
= opt
->info
;
2574 else if (strcmp (opt
->name
, "mark_hook") == 0)
2575 mark_hook_name
= opt
->info
;
2577 if (chain_prev
!= NULL
&& chain_next
== NULL
)
2578 error_at_line (&s
->u
.s
.line
, "chain_prev without chain_next");
2579 if (chain_circular
!= NULL
&& chain_next
!= NULL
)
2580 error_at_line (&s
->u
.s
.line
, "chain_circular with chain_next");
2581 if (chain_circular
!= NULL
)
2582 chain_next
= chain_circular
;
2584 d
.process_field
= write_types_process_field
;
2588 d
.line
= &s
->u
.s
.line
;
2589 d
.bitmap
= s
->u
.s
.bitmap
;
2591 d
.prev_val
[0] = "*x";
2592 d
.prev_val
[1] = "not valid postage"; /* Guarantee an error. */
2593 d
.prev_val
[3] = "x";
2596 oprintf (d
.of
, "\n");
2597 oprintf (d
.of
, "void\n");
2599 oprintf (d
.of
, "gt_%sx_%s", wtd
->prefix
, orig_s
->u
.s
.tag
);
2602 oprintf (d
.of
, "gt_%s_", wtd
->prefix
);
2603 output_mangled_typename (d
.of
, orig_s
);
2605 oprintf (d
.of
, " (void *x_p)\n");
2606 oprintf (d
.of
, "{\n");
2607 oprintf (d
.of
, " %s %s * %sx = (%s %s *)x_p;\n",
2608 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
2609 chain_next
== NULL
? "const " : "",
2610 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
2611 if (chain_next
!= NULL
)
2612 oprintf (d
.of
, " %s %s * xlimit = x;\n",
2613 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
2614 if (chain_next
== NULL
)
2616 oprintf (d
.of
, " if (%s (x", wtd
->marker_routine
);
2617 if (wtd
->param_prefix
)
2619 oprintf (d
.of
, ", x, gt_%s_", wtd
->param_prefix
);
2620 output_mangled_typename (d
.of
, orig_s
);
2621 output_type_enum (d
.of
, orig_s
);
2623 oprintf (d
.of
, "))\n");
2627 if (chain_circular
!= NULL
)
2628 oprintf (d
.of
, " if (!%s (xlimit", wtd
->marker_routine
);
2630 oprintf (d
.of
, " while (%s (xlimit", wtd
->marker_routine
);
2631 if (wtd
->param_prefix
)
2633 oprintf (d
.of
, ", xlimit, gt_%s_", wtd
->param_prefix
);
2634 output_mangled_typename (d
.of
, orig_s
);
2635 output_type_enum (d
.of
, orig_s
);
2637 oprintf (d
.of
, "))\n");
2638 if (chain_circular
!= NULL
)
2639 oprintf (d
.of
, " return;\n do\n");
2640 if (mark_hook_name
&& !wtd
->skip_hooks
)
2642 oprintf (d
.of
, " {\n");
2643 oprintf (d
.of
, " %s (xlimit);\n ", mark_hook_name
);
2645 oprintf (d
.of
, " xlimit = (");
2646 d
.prev_val
[2] = "*xlimit";
2647 output_escaped_param (&d
, chain_next
, "chain_next");
2648 oprintf (d
.of
, ");\n");
2649 if (mark_hook_name
&& !wtd
->skip_hooks
)
2650 oprintf (d
.of
, " }\n");
2651 if (chain_prev
!= NULL
)
2653 oprintf (d
.of
, " if (x != xlimit)\n");
2654 oprintf (d
.of
, " for (;;)\n");
2655 oprintf (d
.of
, " {\n");
2656 oprintf (d
.of
, " %s %s * const xprev = (",
2657 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
2659 d
.prev_val
[2] = "*x";
2660 output_escaped_param (&d
, chain_prev
, "chain_prev");
2661 oprintf (d
.of
, ");\n");
2662 oprintf (d
.of
, " if (xprev == NULL) break;\n");
2663 oprintf (d
.of
, " x = xprev;\n");
2664 oprintf (d
.of
, " (void) %s (xprev",
2665 wtd
->marker_routine
);
2666 if (wtd
->param_prefix
)
2668 oprintf (d
.of
, ", xprev, gt_%s_", wtd
->param_prefix
);
2669 output_mangled_typename (d
.of
, orig_s
);
2670 output_type_enum (d
.of
, orig_s
);
2672 oprintf (d
.of
, ");\n");
2673 oprintf (d
.of
, " }\n");
2675 if (chain_circular
!= NULL
)
2677 oprintf (d
.of
, " while (%s (xlimit", wtd
->marker_routine
);
2678 if (wtd
->param_prefix
)
2680 oprintf (d
.of
, ", xlimit, gt_%s_", wtd
->param_prefix
);
2681 output_mangled_typename (d
.of
, orig_s
);
2682 output_type_enum (d
.of
, orig_s
);
2684 oprintf (d
.of
, "));\n");
2685 if (mark_hook_name
&& !wtd
->skip_hooks
)
2686 oprintf (d
.of
, " %s (xlimit);\n", mark_hook_name
);
2687 oprintf (d
.of
, " do\n");
2690 oprintf (d
.of
, " while (x != xlimit)\n");
2692 oprintf (d
.of
, " {\n");
2693 if (mark_hook_name
&& chain_next
== NULL
&& !wtd
->skip_hooks
)
2695 oprintf (d
.of
, " %s (x);\n", mark_hook_name
);
2697 d
.prev_val
[2] = "*x";
2701 if (chain_next
!= NULL
)
2703 oprintf (d
.of
, " x = (");
2704 output_escaped_param (&d
, chain_next
, "chain_next");
2705 oprintf (d
.of
, ");\n");
2708 oprintf (d
.of
, " }\n");
2709 if (chain_circular
!= NULL
)
2710 oprintf (d
.of
, " while (x != xlimit);\n");
2711 oprintf (d
.of
, "}\n");
2714 /* Write out marker routines for STRUCTURES and PARAM_STRUCTS. */
2717 write_types (outf_p output_header
, type_p structures
, type_p param_structs
,
2718 const struct write_types_data
*wtd
)
2722 oprintf (output_header
, "\n/* %s*/\n", wtd
->comment
);
2723 /* We first emit the macros and the declarations. Functions' code is
2724 emitted afterwards. This is needed in plugin mode. */
2725 oprintf (output_header
, "/* macros and declarations */\n");
2726 for (s
= structures
; s
; s
= s
->next
)
2727 if (s
->gc_used
== GC_POINTED_TO
2728 || s
->gc_used
== GC_MAYBE_POINTED_TO
)
2732 if (s
->gc_used
== GC_MAYBE_POINTED_TO
2733 && s
->u
.s
.line
.file
== NULL
)
2736 oprintf (output_header
, "#define gt_%s_", wtd
->prefix
);
2737 output_mangled_typename (output_header
, s
);
2738 oprintf (output_header
, "(X) do { \\\n");
2739 oprintf (output_header
,
2740 " if (X != NULL) gt_%sx_%s (X);\\\n", wtd
->prefix
,
2742 oprintf (output_header
,
2745 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
2746 if (strcmp (opt
->name
, "ptr_alias") == 0)
2748 const_type_p
const t
= (const_type_p
) opt
->info
;
2749 if (t
->kind
== TYPE_STRUCT
2750 || t
->kind
== TYPE_UNION
2751 || t
->kind
== TYPE_LANG_STRUCT
)
2752 oprintf (output_header
,
2753 "#define gt_%sx_%s gt_%sx_%s\n",
2754 wtd
->prefix
, s
->u
.s
.tag
, wtd
->prefix
, t
->u
.s
.tag
);
2756 error_at_line (&s
->u
.s
.line
,
2757 "structure alias is not a structure");
2763 /* Declare the marker procedure only once. */
2764 oprintf (output_header
,
2765 "extern void gt_%sx_%s (void *);\n",
2766 wtd
->prefix
, s
->u
.s
.tag
);
2768 if (s
->u
.s
.line
.file
== NULL
)
2770 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
2776 for (s
= param_structs
; s
; s
= s
->next
)
2777 if (s
->gc_used
== GC_POINTED_TO
)
2779 type_p stru
= s
->u
.param_struct
.stru
;
2781 /* Declare the marker procedure. */
2782 oprintf (output_header
, "extern void gt_%s_", wtd
->prefix
);
2783 output_mangled_typename (output_header
, s
);
2784 oprintf (output_header
, " (void *);\n");
2786 if (stru
->u
.s
.line
.file
== NULL
)
2788 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
2794 /* At last we emit the functions code. */
2795 oprintf (output_header
, "\n/* functions code */\n");
2796 for (s
= structures
; s
; s
= s
->next
)
2797 if (s
->gc_used
== GC_POINTED_TO
2798 || s
->gc_used
== GC_MAYBE_POINTED_TO
)
2802 if (s
->gc_used
== GC_MAYBE_POINTED_TO
2803 && s
->u
.s
.line
.file
== NULL
)
2805 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
2806 if (strcmp (opt
->name
, "ptr_alias") == 0)
2811 if (s
->kind
== TYPE_LANG_STRUCT
)
2814 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
2815 write_func_for_structure (s
, ss
, NULL
, wtd
);
2818 write_func_for_structure (s
, s
, NULL
, wtd
);
2820 for (s
= param_structs
; s
; s
= s
->next
)
2821 if (s
->gc_used
== GC_POINTED_TO
)
2823 type_p
*param
= s
->u
.param_struct
.param
;
2824 type_p stru
= s
->u
.param_struct
.stru
;
2825 if (stru
->u
.s
.line
.file
== NULL
)
2827 if (stru
->kind
== TYPE_LANG_STRUCT
)
2830 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
2831 write_func_for_structure (s
, ss
, param
, wtd
);
2834 write_func_for_structure (s
, stru
, param
, wtd
);
2838 static const struct write_types_data ggc_wtd
=
2840 "ggc_m", NULL
, "ggc_mark", "ggc_test_and_set_mark", NULL
,
2841 "GC marker procedures. ",
2845 static const struct write_types_data pch_wtd
=
2847 "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
2848 "gt_pch_note_reorder",
2849 "PCH type-walking procedures. ",
2853 /* Write out the local pointer-walking routines. */
2855 /* process_field routine for local pointer-walking. */
2858 write_types_local_process_field (type_p f
, const struct walk_type_data
*d
)
2865 case TYPE_LANG_STRUCT
:
2866 case TYPE_PARAM_STRUCT
:
2868 oprintf (d
->of
, "%*sif ((void *)(%s) == this_obj)\n", d
->indent
, "",
2870 oprintf (d
->of
, "%*s op (&(%s), cookie);\n", d
->indent
, "", d
->val
);
2881 /* For S, a structure that's part of ORIG_S, and using parameters
2882 PARAM, write out a routine that:
2883 - Is of type gt_note_pointers
2884 - Calls PROCESS_FIELD on each field of S or its substructures.
2888 write_local_func_for_structure (type_p orig_s
, type_p s
, type_p
*param
)
2890 const char *fn
= s
->u
.s
.line
.file
;
2892 struct walk_type_data d
;
2894 /* This is a hack, and not the good kind either. */
2895 for (i
= NUM_PARAM
- 1; i
>= 0; i
--)
2896 if (param
&& param
[i
] && param
[i
]->kind
== TYPE_POINTER
2897 && UNION_OR_STRUCT_P (param
[i
]->u
.p
))
2898 fn
= param
[i
]->u
.p
->u
.s
.line
.file
;
2900 memset (&d
, 0, sizeof (d
));
2901 d
.of
= get_output_file_with_visibility (fn
);
2902 d
.process_field
= write_types_local_process_field
;
2904 d
.line
= &s
->u
.s
.line
;
2905 d
.bitmap
= s
->u
.s
.bitmap
;
2907 d
.prev_val
[0] = d
.prev_val
[2] = "*x";
2908 d
.prev_val
[1] = "not valid postage"; /* Guarantee an error. */
2909 d
.prev_val
[3] = "x";
2911 d
.fn_wants_lvalue
= true;
2913 oprintf (d
.of
, "\n");
2914 oprintf (d
.of
, "void\n");
2915 oprintf (d
.of
, "gt_pch_p_");
2916 output_mangled_typename (d
.of
, orig_s
);
2917 oprintf (d
.of
, " (ATTRIBUTE_UNUSED void *this_obj,\n"
2919 "\tATTRIBUTE_UNUSED gt_pointer_operator op,\n"
2920 "\tATTRIBUTE_UNUSED void *cookie)\n");
2921 oprintf (d
.of
, "{\n");
2922 oprintf (d
.of
, " %s %s * const x ATTRIBUTE_UNUSED = (%s %s *)x_p;\n",
2923 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
,
2924 s
->kind
== TYPE_UNION
? "union" : "struct", s
->u
.s
.tag
);
2927 oprintf (d
.of
, "}\n");
2930 /* Write out local marker routines for STRUCTURES and PARAM_STRUCTS. */
2933 write_local (outf_p output_header
, type_p structures
, type_p param_structs
)
2939 oprintf (output_header
, "\n/* Local pointer-walking routines. */\n");
2940 for (s
= structures
; s
; s
= s
->next
)
2941 if (s
->gc_used
== GC_POINTED_TO
2942 || s
->gc_used
== GC_MAYBE_POINTED_TO
)
2946 if (s
->u
.s
.line
.file
== NULL
)
2949 for (opt
= s
->u
.s
.opt
; opt
; opt
= opt
->next
)
2950 if (strcmp (opt
->name
, "ptr_alias") == 0)
2952 const_type_p
const t
= (const_type_p
) opt
->info
;
2953 if (t
->kind
== TYPE_STRUCT
2954 || t
->kind
== TYPE_UNION
2955 || t
->kind
== TYPE_LANG_STRUCT
)
2957 oprintf (output_header
, "#define gt_pch_p_");
2958 output_mangled_typename (output_header
, s
);
2959 oprintf (output_header
, " gt_pch_p_");
2960 output_mangled_typename (output_header
, t
);
2961 oprintf (output_header
, "\n");
2964 error_at_line (&s
->u
.s
.line
,
2965 "structure alias is not a structure");
2971 /* Declare the marker procedure only once. */
2972 oprintf (output_header
, "extern void gt_pch_p_");
2973 output_mangled_typename (output_header
, s
);
2974 oprintf (output_header
,
2975 "\n (void *, void *, gt_pointer_operator, void *);\n");
2977 if (s
->kind
== TYPE_LANG_STRUCT
)
2980 for (ss
= s
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
2981 write_local_func_for_structure (s
, ss
, NULL
);
2984 write_local_func_for_structure (s
, s
, NULL
);
2987 for (s
= param_structs
; s
; s
= s
->next
)
2988 if (s
->gc_used
== GC_POINTED_TO
)
2990 type_p
* param
= s
->u
.param_struct
.param
;
2991 type_p stru
= s
->u
.param_struct
.stru
;
2993 /* Declare the marker procedure. */
2994 oprintf (output_header
, "extern void gt_pch_p_");
2995 output_mangled_typename (output_header
, s
);
2996 oprintf (output_header
,
2997 "\n (void *, void *, gt_pointer_operator, void *);\n");
2999 if (stru
->u
.s
.line
.file
== NULL
)
3001 fprintf (stderr
, "warning: structure `%s' used but not defined\n",
3006 if (stru
->kind
== TYPE_LANG_STRUCT
)
3009 for (ss
= stru
->u
.s
.lang_struct
; ss
; ss
= ss
->next
)
3010 write_local_func_for_structure (s
, ss
, param
);
3013 write_local_func_for_structure (s
, stru
, param
);
3017 /* Write out the 'enum' definition for gt_types_enum. */
3020 write_enum_defn (type_p structures
, type_p param_structs
)
3026 oprintf (header_file
, "\n/* Enumeration of types known. */\n");
3027 oprintf (header_file
, "enum gt_types_enum {\n");
3028 for (s
= structures
; s
; s
= s
->next
)
3029 if (s
->gc_used
== GC_POINTED_TO
3030 || s
->gc_used
== GC_MAYBE_POINTED_TO
)
3032 if (s
->gc_used
== GC_MAYBE_POINTED_TO
3033 && s
->u
.s
.line
.file
== NULL
)
3036 oprintf (header_file
, " gt_ggc_e_");
3037 output_mangled_typename (header_file
, s
);
3038 oprintf (header_file
, ", \n");
3040 for (s
= param_structs
; s
; s
= s
->next
)
3041 if (s
->gc_used
== GC_POINTED_TO
)
3043 oprintf (header_file
, " gt_e_");
3044 output_mangled_typename (header_file
, s
);
3045 oprintf (header_file
, ", \n");
3047 oprintf (header_file
, " gt_types_enum_last\n");
3048 oprintf (header_file
, "};\n");
3051 /* Might T contain any non-pointer elements? */
3054 contains_scalar_p (type_p t
)
3062 return contains_scalar_p (t
->u
.a
.p
);
3064 /* Could also check for structures that have no non-pointer
3065 fields, but there aren't enough of those to worry about. */
3070 /* Mangle FN and print it to F. */
3073 put_mangled_filename (outf_p f
, const char *fn
)
3075 const char *name
= get_output_file_name (fn
);
3078 for (; *name
!= 0; name
++)
3079 if (ISALNUM (*name
))
3080 oprintf (f
, "%c", *name
);
3082 oprintf (f
, "%c", '_');
3085 /* Finish off the currently-created root tables in FLP. PFX, TNAME,
3086 LASTNAME, and NAME are all strings to insert in various places in
3087 the resulting code. */
3090 finish_root_table (struct flist
*flp
, const char *pfx
, const char *lastname
,
3091 const char *tname
, const char *name
)
3095 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
3096 if (fli2
->started_p
)
3098 oprintf (fli2
->f
, " %s\n", lastname
);
3099 oprintf (fli2
->f
, "};\n\n");
3102 for (fli2
= flp
; fli2
&& base_files
; fli2
= fli2
->next
)
3103 if (fli2
->started_p
)
3105 lang_bitmap bitmap
= get_lang_bitmap (fli2
->name
);
3108 for (fnum
= 0; bitmap
!= 0; fnum
++, bitmap
>>= 1)
3111 oprintf (base_files
[fnum
],
3112 "extern const struct %s gt_%s_",
3114 put_mangled_filename (base_files
[fnum
], fli2
->name
);
3115 oprintf (base_files
[fnum
], "[];\n");
3121 for (fnum
= 0; base_files
&& fnum
< num_lang_dirs
; fnum
++)
3122 oprintf (base_files
[fnum
],
3123 "EXPORTED_CONST struct %s * const %s[] = {\n",
3128 for (fli2
= flp
; fli2
; fli2
= fli2
->next
)
3129 if (fli2
->started_p
)
3131 lang_bitmap bitmap
= get_lang_bitmap (fli2
->name
);
3134 fli2
->started_p
= 0;
3136 for (fnum
= 0; base_files
&& bitmap
!= 0; fnum
++, bitmap
>>= 1)
3139 oprintf (base_files
[fnum
], " gt_%s_", pfx
);
3140 put_mangled_filename (base_files
[fnum
], fli2
->name
);
3141 oprintf (base_files
[fnum
], ",\n");
3147 for (fnum
= 0; base_files
&& fnum
< num_lang_dirs
; fnum
++)
3149 oprintf (base_files
[fnum
], " NULL\n");
3150 oprintf (base_files
[fnum
], "};\n");
3155 /* Write out to F the table entry and any marker routines needed to
3156 mark NAME as TYPE. The original variable is V, at LINE.
3157 HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
3158 is nonzero iff we are building the root table for hash table caches. */
3161 write_root (outf_p f
, pair_p v
, type_p type
, const char *name
, int has_length
,
3162 struct fileloc
*line
, const char *if_marked
, bool emit_pch
)
3169 for (fld
= type
->u
.s
.fields
; fld
; fld
= fld
->next
)
3172 const char *desc
= NULL
;
3175 for (o
= fld
->opt
; o
; o
= o
->next
)
3176 if (strcmp (o
->name
, "skip") == 0)
3178 else if (strcmp (o
->name
, "desc") == 0)
3180 else if (strcmp (o
->name
, "param_is") == 0)
3183 error_at_line (line
,
3184 "field `%s' of global `%s' has unknown option `%s'",
3185 fld
->name
, name
, o
->name
);
3189 else if (desc
&& fld
->type
->kind
== TYPE_UNION
)
3191 pair_p validf
= NULL
;
3194 for (ufld
= fld
->type
->u
.s
.fields
; ufld
; ufld
= ufld
->next
)
3196 const char *tag
= NULL
;
3199 for (oo
= ufld
->opt
; oo
; oo
= oo
->next
)
3200 if (strcmp (oo
->name
, "tag") == 0)
3202 if (tag
== NULL
|| strcmp (tag
, desc
) != 0)
3205 error_at_line (line
,
3206 "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
3207 name
, fld
->name
, validf
->name
,
3208 name
, fld
->name
, ufld
->name
,
3215 newname
= xasprintf ("%s.%s.%s",
3216 name
, fld
->name
, validf
->name
);
3217 write_root (f
, v
, validf
->type
, newname
, 0, line
,
3218 if_marked
, emit_pch
);
3223 error_at_line (line
,
3224 "global `%s.%s' has `desc' option but is not union",
3229 newname
= xasprintf ("%s.%s", name
, fld
->name
);
3230 write_root (f
, v
, fld
->type
, newname
, 0, line
, if_marked
,
3241 newname
= xasprintf ("%s[0]", name
);
3242 write_root (f
, v
, type
->u
.a
.p
, newname
, has_length
, line
, if_marked
,
3252 oprintf (f
, " {\n");
3253 oprintf (f
, " &%s,\n", name
);
3256 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
3258 oprintf (f
, " * (%s)", ap
->u
.a
.len
);
3259 else if (ap
== v
->type
)
3260 oprintf (f
, " * ARRAY_SIZE (%s)", v
->name
);
3262 oprintf (f
, " sizeof (%s", v
->name
);
3263 for (ap
= v
->type
; ap
->kind
== TYPE_ARRAY
; ap
= ap
->u
.a
.p
)
3265 oprintf (f
, "),\n");
3269 if (! has_length
&& UNION_OR_STRUCT_P (tp
))
3271 oprintf (f
, " >_ggc_mx_%s,\n", tp
->u
.s
.tag
);
3273 oprintf (f
, " >_pch_nx_%s", tp
->u
.s
.tag
);
3275 oprintf (f
, " NULL");
3277 else if (! has_length
&& tp
->kind
== TYPE_PARAM_STRUCT
)
3279 oprintf (f
, " >_ggc_m_");
3280 output_mangled_typename (f
, tp
);
3283 oprintf (f
, ",\n >_pch_n_");
3284 output_mangled_typename (f
, tp
);
3287 oprintf (f
, ",\n NULL");
3290 && (tp
->kind
== TYPE_POINTER
|| UNION_OR_STRUCT_P (tp
)))
3292 oprintf (f
, " >_ggc_ma_%s,\n", name
);
3294 oprintf (f
, " >_pch_na_%s", name
);
3296 oprintf (f
, " NULL");
3300 error_at_line (line
,
3301 "global `%s' is pointer to unimplemented type",
3305 oprintf (f
, ",\n &%s", if_marked
);
3306 oprintf (f
, "\n },\n");
3312 oprintf (f
, " {\n");
3313 oprintf (f
, " &%s,\n", name
);
3314 oprintf (f
, " 1, \n");
3315 oprintf (f
, " sizeof (%s),\n", v
->name
);
3316 oprintf (f
, " (gt_pointer_walker) >_ggc_m_S,\n");
3317 oprintf (f
, " (gt_pointer_walker) >_pch_n_S\n");
3318 oprintf (f
, " },\n");
3326 error_at_line (line
,
3327 "global `%s' is unimplemented type",
3332 /* This generates a routine to walk an array. */
3335 write_array (outf_p f
, pair_p v
, const struct write_types_data
*wtd
)
3337 struct walk_type_data d
;
3340 memset (&d
, 0, sizeof (d
));
3346 d
.bitmap
= get_lang_bitmap (v
->line
.file
);
3349 d
.prev_val
[3] = prevval3
= xasprintf ("&%s", v
->name
);
3351 if (wtd
->param_prefix
)
3353 oprintf (f
, "static void gt_%sa_%s\n", wtd
->param_prefix
, v
->name
);
3355 " (void *, void *, gt_pointer_operator, void *);\n");
3356 oprintf (f
, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
3357 wtd
->param_prefix
, v
->name
);
3359 " ATTRIBUTE_UNUSED void *x_p,\n"
3360 " ATTRIBUTE_UNUSED gt_pointer_operator op,\n"
3361 " ATTRIBUTE_UNUSED void * cookie)\n");
3362 oprintf (d
.of
, "{\n");
3363 d
.prev_val
[0] = d
.prev_val
[1] = d
.prev_val
[2] = d
.val
= v
->name
;
3364 d
.process_field
= write_types_local_process_field
;
3365 walk_type (v
->type
, &d
);
3366 oprintf (f
, "}\n\n");
3370 oprintf (f
, "static void gt_%sa_%s (void *);\n",
3371 wtd
->prefix
, v
->name
);
3372 oprintf (f
, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
3373 wtd
->prefix
, v
->name
);
3375 d
.prev_val
[0] = d
.prev_val
[1] = d
.prev_val
[2] = d
.val
= v
->name
;
3376 d
.process_field
= write_types_process_field
;
3377 walk_type (v
->type
, &d
);
3379 oprintf (f
, "}\n\n");
3382 /* Output a table describing the locations and types of VARIABLES. */
3385 write_roots (pair_p variables
, bool emit_pch
)
3388 struct flist
*flp
= NULL
;
3390 for (v
= variables
; v
; v
= v
->next
)
3392 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
3394 const char *length
= NULL
;
3395 int deletable_p
= 0;
3398 for (o
= v
->opt
; o
; o
= o
->next
)
3399 if (strcmp (o
->name
, "length") == 0)
3401 else if (strcmp (o
->name
, "deletable") == 0)
3403 else if (strcmp (o
->name
, "param_is") == 0)
3405 else if (strncmp (o
->name
, "param", 5) == 0
3406 && ISDIGIT (o
->name
[5])
3407 && strcmp (o
->name
+ 6, "_is") == 0)
3409 else if (strcmp (o
->name
, "if_marked") == 0)
3412 error_at_line (&v
->line
,
3413 "global `%s' has unknown option `%s'",
3416 for (fli
= flp
; fli
; fli
= fli
->next
)
3417 if (fli
->f
== f
&& f
)
3421 fli
= XNEW (struct flist
);
3425 fli
->name
= v
->line
.file
;
3426 gcc_assert(fli
->name
);
3429 oprintf (f
, "\n/* GC roots. */\n\n");
3434 && v
->type
->kind
== TYPE_POINTER
3435 && (v
->type
->u
.p
->kind
== TYPE_POINTER
3436 || v
->type
->u
.p
->kind
== TYPE_STRUCT
))
3438 write_array (f
, v
, &ggc_wtd
);
3439 write_array (f
, v
, &pch_wtd
);
3443 for (v
= variables
; v
; v
= v
->next
)
3445 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
3451 for (o
= v
->opt
; o
; o
= o
->next
)
3452 if (strcmp (o
->name
, "length") == 0)
3454 else if (strcmp (o
->name
, "deletable") == 0
3455 || strcmp (o
->name
, "if_marked") == 0)
3461 for (fli
= flp
; fli
; fli
= fli
->next
)
3464 if (! fli
->started_p
)
3468 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_ggc_r_");
3469 put_mangled_filename (f
, v
->line
.file
);
3470 oprintf (f
, "[] = {\n");
3473 write_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
, emit_pch
);
3476 finish_root_table (flp
, "ggc_r", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3479 for (v
= variables
; v
; v
= v
->next
)
3481 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
3486 for (o
= v
->opt
; o
; o
= o
->next
)
3487 if (strcmp (o
->name
, "deletable") == 0)
3489 else if (strcmp (o
->name
, "if_marked") == 0)
3495 for (fli
= flp
; fli
; fli
= fli
->next
)
3498 if (! fli
->started_p
)
3502 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_ggc_rd_");
3503 put_mangled_filename (f
, v
->line
.file
);
3504 oprintf (f
, "[] = {\n");
3507 oprintf (f
, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3511 finish_root_table (flp
, "ggc_rd", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3512 "gt_ggc_deletable_rtab");
3514 for (v
= variables
; v
; v
= v
->next
)
3516 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
3518 const char *if_marked
= NULL
;
3522 for (o
= v
->opt
; o
; o
= o
->next
)
3523 if (strcmp (o
->name
, "length") == 0)
3525 else if (strcmp (o
->name
, "if_marked") == 0)
3526 if_marked
= o
->info
;
3528 if (if_marked
== NULL
)
3531 if (v
->type
->kind
!= TYPE_POINTER
3532 || v
->type
->u
.p
->kind
!= TYPE_PARAM_STRUCT
3533 || v
->type
->u
.p
->u
.param_struct
.stru
!= find_structure ("htab", 0))
3535 error_at_line (&v
->line
, "if_marked option used but not hash table");
3539 for (fli
= flp
; fli
; fli
= fli
->next
)
3542 if (! fli
->started_p
)
3546 oprintf (f
, "EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc_");
3547 put_mangled_filename (f
, v
->line
.file
);
3548 oprintf (f
, "[] = {\n");
3551 write_root (f
, v
, v
->type
->u
.p
->u
.param_struct
.param
[0],
3552 v
->name
, length_p
, &v
->line
, if_marked
, emit_pch
);
3555 finish_root_table (flp
, "ggc_rc", "LAST_GGC_CACHE_TAB", "ggc_cache_tab",
3556 "gt_ggc_cache_rtab");
3561 for (v
= variables
; v
; v
= v
->next
)
3563 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
3566 int if_marked_p
= 0;
3569 for (o
= v
->opt
; o
; o
= o
->next
)
3570 if (strcmp (o
->name
, "length") == 0)
3572 else if (strcmp (o
->name
, "if_marked") == 0)
3578 for (fli
= flp
; fli
; fli
= fli
->next
)
3581 if (! fli
->started_p
)
3585 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_pch_rc_");
3586 put_mangled_filename (f
, v
->line
.file
);
3587 oprintf (f
, "[] = {\n");
3590 write_root (f
, v
, v
->type
, v
->name
, length_p
, &v
->line
, NULL
, emit_pch
);
3593 finish_root_table (flp
, "pch_rc", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3594 "gt_pch_cache_rtab");
3596 for (v
= variables
; v
; v
= v
->next
)
3598 outf_p f
= get_output_file_with_visibility (v
->line
.file
);
3603 for (o
= v
->opt
; o
; o
= o
->next
)
3604 if (strcmp (o
->name
, "deletable") == 0
3605 || strcmp (o
->name
, "if_marked") == 0)
3611 if (! contains_scalar_p (v
->type
))
3614 for (fli
= flp
; fli
; fli
= fli
->next
)
3617 if (! fli
->started_p
)
3621 oprintf (f
, "EXPORTED_CONST struct ggc_root_tab gt_pch_rs_");
3622 put_mangled_filename (f
, v
->line
.file
);
3623 oprintf (f
, "[] = {\n");
3626 oprintf (f
, " { &%s, 1, sizeof (%s), NULL, NULL },\n",
3630 finish_root_table (flp
, "pch_rs", "LAST_GGC_ROOT_TAB", "ggc_root_tab",
3631 "gt_pch_scalar_rtab");
3634 /* Record the definition of a generic VEC structure, as if we had expanded
3635 the macros in vec.h:
3637 typedef struct VEC_<type>_base GTY(()) {
3640 <type> GTY((length ("%h.num"))) vec[1];
3643 where the GTY(()) tags are only present if is_scalar is _false_. */
3646 note_def_vec (const char *type_name
, bool is_scalar
, struct fileloc
*pos
)
3651 type_p len_ty
= create_scalar_type ("unsigned");
3652 const char *name
= concat ("VEC_", type_name
, "_base", (char *)0);
3656 t
= create_scalar_type (type_name
);
3661 t
= resolve_typedef (type_name
, pos
);
3662 o
= create_option (0, "length", "%h.num");
3665 /* We assemble the field list in reverse order. */
3666 fields
= create_field_at (0, create_array (t
, "1"), "vec", o
, pos
);
3667 fields
= create_field_at (fields
, len_ty
, "alloc", 0, pos
);
3668 fields
= create_field_at (fields
, len_ty
, "num", 0, pos
);
3670 do_typedef (name
, new_structure (name
, 0, pos
, fields
, 0), pos
);
3673 /* Record the definition of an allocation-specific VEC structure, as if
3674 we had expanded the macros in vec.h:
3676 typedef struct VEC_<type>_<astrat> {
3677 VEC_<type>_base base;
3678 } VEC_<type>_<astrat>;
3681 note_def_vec_alloc (const char *type
, const char *astrat
, struct fileloc
*pos
)
3683 const char *astratname
= concat ("VEC_", type
, "_", astrat
, (char *)0);
3684 const char *basename
= concat ("VEC_", type
, "_base", (char *)0);
3686 pair_p field
= create_field_at (0, resolve_typedef (basename
, pos
),
3689 do_typedef (astratname
, new_structure (astratname
, 0, pos
, field
, 0), pos
);
3694 main (int argc
, char **argv
)
3697 static struct fileloc pos
= { this_file
, 0 };
3698 char* inputlist
= 0;
3699 outf_p output_header
;
3700 char* plugin_output_filename
= NULL
;
3701 /* fatal uses this */
3702 progname
= "gengtype";
3704 if (argc
>= 6 && !strcmp (argv
[1], "-P"))
3706 plugin_output_filename
= argv
[2];
3707 plugin_output
= create_file ("GCC", plugin_output_filename
);
3709 inputlist
= argv
[4];
3710 nb_plugin_files
= argc
- 5;
3711 plugin_files
= XCNEWVEC (char *, nb_plugin_files
);
3712 for (i
= 0; i
< nb_plugin_files
; i
++)
3714 /* Place an all zero lang_bitmap before the plugin file
3716 char *name
= argv
[i
+ 5];
3717 int len
= strlen(name
) + 1 + sizeof (lang_bitmap
);
3718 plugin_files
[i
] = XCNEWVEC (char, len
) + sizeof (lang_bitmap
);
3719 strcpy (plugin_files
[i
], name
);
3725 inputlist
= argv
[2];
3728 fatal ("usage: gengtype [-P pluginout.h] srcdir input-list "
3729 "[file1 file2 ... fileN]");
3731 srcdir_len
= strlen (srcdir
);
3733 read_input_list (inputlist
);
3737 scalar_char
.u
.scalar_is_char
= true;
3738 scalar_nonchar
.u
.scalar_is_char
= false;
3741 /* These types are set up with #define or else outside of where
3743 pos
.line
= __LINE__
+ 1;
3744 do_scalar_typedef ("CUMULATIVE_ARGS", &pos
); pos
.line
++;
3745 do_scalar_typedef ("REAL_VALUE_TYPE", &pos
); pos
.line
++;
3746 do_scalar_typedef ("FIXED_VALUE_TYPE", &pos
); pos
.line
++;
3747 do_scalar_typedef ("double_int", &pos
); pos
.line
++;
3748 do_scalar_typedef ("uint64_t", &pos
); pos
.line
++;
3749 do_scalar_typedef ("uint8", &pos
); pos
.line
++;
3750 do_scalar_typedef ("jword", &pos
); pos
.line
++;
3751 do_scalar_typedef ("JCF_u2", &pos
); pos
.line
++;
3752 do_scalar_typedef ("void", &pos
); pos
.line
++;
3753 do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos
)), &pos
);
3755 for (i
= 0; i
< num_gt_files
; i
++)
3756 parse_file (gt_files
[i
]);
3761 set_gc_used (variables
);
3764 write_enum_defn (structures
, param_structs
);
3765 output_header
= plugin_output
? plugin_output
: header_file
;
3766 write_types (output_header
, structures
, param_structs
, &ggc_wtd
);
3767 if (plugin_files
== NULL
)
3769 write_types (header_file
, structures
, param_structs
, &pch_wtd
);
3770 write_local (header_file
, structures
, param_structs
);
3772 write_roots (variables
, plugin_files
== NULL
);
3774 close_output_files ();
3778 for (i
= 0; i
< nb_plugin_files
; i
++)
3779 free (plugin_files
[i
] - sizeof (lang_bitmap
));
3780 free (plugin_files
);