]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Support scanning of build-time GC roots in gengtype
authorBill Schmidt <wschmidt@linux.ibm.com>
Tue, 15 Jun 2021 13:07:39 +0000 (08:07 -0500)
committerBill Schmidt <wschmidt@linux.ibm.com>
Fri, 16 Jul 2021 16:51:46 +0000 (12:51 -0400)
Currently gengtype supports scanning target-specific files for GC roots,
but those files must exist in the source tree.  This patch extends the
support to include header files generated into the build directory.  It
also allows targets to specify build dependencies for s-gtype to ensure
the built headers are up to date prior to running gengtype.

2021-06-15  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/
* Makefile.in (EXTRA_GTYPE_DEPS): New variable.
(s-gtype): Depend on EXTRA_GTYPE_DEPS.
* gengtype-state.c (state_writer::write_state_file_list): Add a
parameter to the fileslist expression for the number of build
headers to scan.
(read_state_files_list): Detect build headers and strip the
initial "./" or ".\" from their names.
* gengtype.c (build_headers): New global variable.
(num_build_headers): Likewise.
(open_base_files): Emit #include for each build header.
(main): Detect and count build headers.
* gengtype.h (build_headers): New extern variable.
(num_build_headers): Likewise.

gcc/Makefile.in
gcc/gengtype-state.c
gcc/gengtype.c
gcc/gengtype.h

index 934b2a05327cc8de3ae7a911e0e0938e8f3a04be..1666ef84d6a43a386994873d447a33292d2912b7 100644 (file)
@@ -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@
@@ -2746,8 +2747,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
index e9775ed633e6726b42b8db839a25363243ffa7d2..ac9d536963ff02c80f7b8b8c376647cd5e431cf4 100644 (file)
@@ -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);
index d105c9bd41b1e85372a026057d02469e354a708f..31d4bf4e5d050d6cfdbf425886e6fcfe2b18df3b 100644 (file)
@@ -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");
@@ -5216,11 +5223,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", 
index 4fe8f0f7232349b38abaddf0e7233711702a3105..8a7a54957eafc6c1114267a1e93cf70e5eeead09 100644 (file)
@@ -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