@@ -560,6 +560,7 @@ out_file=$(srcdir)/config/@out_file@
out_object_file=@out_object_file@
common_out_file=$(srcdir)/common/config/@common_out_file@
common_out_object_file=@common_out_object_file@
+EXTRA_GTYPE_DEPS=
md_file=$(srcdir)/common.md $(srcdir)/config/@md_file@
tm_file_list=@tm_file_list@
tm_include_list=@tm_include_list@
@@ -2734,8 +2735,8 @@ s-gtyp-input: Makefile
$(SHELL) $(srcdir)/../move-if-change tmp-gi.list gtyp-input.list
$(STAMP) s-gtyp-input
-s-gtype: build/gengtype$(build_exeext) $(filter-out [%], $(GTFILES)) \
- gtyp-input.list
+s-gtype: $(EXTRA_GTYPE_DEPS) build/gengtype$(build_exeext) \
+ $(filter-out [%], $(GTFILES)) gtyp-input.list
# First, parse all files and save a state file.
$(RUN_GEN) build/gengtype$(build_exeext) $(GENGTYPE_FLAGS) \
-S $(srcdir) -I gtyp-input.list -w tmp-gtype.state
@@ -1269,7 +1269,7 @@ state_writer::write_state_files_list (void)
int i = 0;
/* Write the list of files with their lang_bitmap. */
begin_s_expr ("fileslist");
- fprintf (state_file, "%d", (int) num_gt_files);
+ fprintf (state_file, "%d %d", (int) num_gt_files, (int) num_build_headers);
for (i = 0; i < (int) num_gt_files; i++)
{
const char *cursrcrelpath = NULL;
@@ -2456,16 +2456,20 @@ read_state_files_list (void)
struct state_token_st *t0 = peek_state_token (0);
struct state_token_st *t1 = peek_state_token (1);
struct state_token_st *t2 = peek_state_token (2);
+ struct state_token_st *t3 = peek_state_token (3);
if (state_token_kind (t0) == STOK_LEFTPAR
&& state_token_is_name (t1, "!fileslist")
- && state_token_kind (t2) == STOK_INTEGER)
+ && state_token_kind (t2) == STOK_INTEGER
+ && state_token_kind (t3) == STOK_INTEGER)
{
- int i = 0;
+ int i = 0, j = 0;
num_gt_files = t2->stok_un.stok_num;
- next_state_tokens (3);
- t0 = t1 = t2 = NULL;
+ num_build_headers = t3->stok_un.stok_num;
+ next_state_tokens (4);
+ t0 = t1 = t2 = t3 = NULL;
gt_files = XCNEWVEC (const input_file *, num_gt_files);
+ build_headers = XCNEWVEC (const char *, num_build_headers);
for (i = 0; i < (int) num_gt_files; i++)
{
bool issrcfile = FALSE;
@@ -2498,7 +2502,23 @@ read_state_files_list (void)
free (fullpath);
}
else
- curgt = input_file_by_name (fnam);
+ {
+ curgt = input_file_by_name (fnam);
+ /* Look for a header file created during the build,
+ which looks like "./<filename>.h". */
+ int len = strlen (fnam);
+ if (len >= 5
+ && fnam[0] == '.'
+ && IS_DIR_SEPARATOR (fnam[1])
+ && fnam[len-2] == '.'
+ && fnam[len-1] == 'h')
+ {
+ char *buf = (char *) xmalloc (len - 1);
+ /* Strip the leading "./" from the filename. */
+ strcpy (buf, &fnam[2]);
+ build_headers[j++] = buf;
+ }
+ }
set_lang_bitmap (curgt, bmap);
gt_files[i] = curgt;
next_state_tokens (2);
@@ -143,6 +143,11 @@ get_ultimate_base_class (type_p s)
const input_file **gt_files;
size_t num_gt_files;
+/* Table of headers to be included in gtype-desc.c that are generated
+ during the build. These are identified as "./<filename>.h". */
+const char **build_headers;
+size_t num_build_headers;
+
/* A number of places use the name of this "gengtype.c" file for a
location for things that we can't rely on the source to define.
Make sure we can still use pointer comparison on filenames. */
@@ -1736,6 +1741,8 @@ open_base_files (void)
gtype_desc_c = create_file ("GCC", "gtype-desc.c");
for (ifp = ifiles; *ifp; ifp++)
oprintf (gtype_desc_c, "#include \"%s\"\n", *ifp);
+ for (int j = 0; j < (int) num_build_headers; j++)
+ oprintf (gtype_desc_c, "#include \"%s\"\n", build_headers[j]);
/* Make sure we handle "cfun" specially. */
oprintf (gtype_desc_c, "\n/* See definition in function.h. */\n");
@@ -5215,11 +5222,20 @@ main (int argc, char **argv)
&pos));
#undef POS_HERE
read_input_list (inputlist);
+ num_build_headers = 0;
for (i = 0; i < num_gt_files; i++)
{
- parse_file (get_input_file_name (gt_files[i]));
- DBGPRINTF ("parsed file #%d %s",
- (int) i, get_input_file_name (gt_files[i]));
+ const char *fname = get_input_file_name (gt_files[i]);
+ parse_file (fname);
+ DBGPRINTF ("parsed file #%d %s", (int) i, fname);
+ /* Check if this is a header file generated during the build. */
+ int len = strlen (fname);
+ if (len >= 5
+ && fname[0] == '.'
+ && IS_DIR_SEPARATOR (fname[1])
+ && fname[len-2] == '.'
+ && fname[len-1] == 'h')
+ num_build_headers++;
}
if (verbosity_level >= 1)
printf ("%s parsed %d files with %d GTY types\n",
@@ -55,6 +55,11 @@ struct fileloc
extern const input_file** gt_files;
extern size_t num_gt_files;
+/* Table of headers to be included in gtype-desc.c that are generated
+ during the build. These are identified as "./<filename>.h". */
+extern const char **build_headers;
+extern size_t num_build_headers;
+
/* A number of places use the name of this "gengtype.c" file for a
location for things that we can't rely on the source to define. We
also need to refer to the "system.h" file specifically. These two