public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/wschmidt/heads/builtins10)] Support scanning of build-time GC roots in gengtype
@ 2021-06-15 17:16 William Schmidt
  0 siblings, 0 replies; 5+ messages in thread
From: William Schmidt @ 2021-06-15 17:16 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:79f596121ad084c01265264f2f1f9d63c025aa9a

commit 79f596121ad084c01265264f2f1f9d63c025aa9a
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Tue Jun 15 08:07:39 2021 -0500

    Support scanning of build-time GC roots in gengtype
    
    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.

Diff:
---
 gcc/Makefile.in      |  5 +++--
 gcc/gengtype-state.c | 32 ++++++++++++++++++++++++++------
 gcc/gengtype.c       | 22 +++++++++++++++++++---
 gcc/gengtype.h       |  5 +++++
 4 files changed, 53 insertions(+), 11 deletions(-)

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 4cb2966157e..f651b61481b 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -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
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c
index e9775ed633e..ac9d536963f 100644
--- a/gcc/gengtype-state.c
+++ b/gcc/gengtype-state.c
@@ -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);
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index b94e2f126ec..a3cf9166a18 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -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", 
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 4fe8f0f7232..8a7a54957ea 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -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


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [gcc(refs/users/wschmidt/heads/builtins10)] Support scanning of build-time GC roots in gengtype
@ 2021-06-25 16:14 William Schmidt
  0 siblings, 0 replies; 5+ messages in thread
From: William Schmidt @ 2021-06-25 16:14 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:4f96cb6d1977e0d87b8419cf3a0aad6c71d6a31f

commit 4f96cb6d1977e0d87b8419cf3a0aad6c71d6a31f
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Tue Jun 15 08:07:39 2021 -0500

    Support scanning of build-time GC roots in gengtype
    
    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.

Diff:
---
 gcc/Makefile.in      |  5 +++--
 gcc/gengtype-state.c | 32 ++++++++++++++++++++++++++------
 gcc/gengtype.c       | 22 +++++++++++++++++++---
 gcc/gengtype.h       |  5 +++++
 4 files changed, 53 insertions(+), 11 deletions(-)

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 4cb2966157e..f651b61481b 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -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
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c
index e9775ed633e..ac9d536963f 100644
--- a/gcc/gengtype-state.c
+++ b/gcc/gengtype-state.c
@@ -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);
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index b94e2f126ec..a3cf9166a18 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -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", 
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 4fe8f0f7232..8a7a54957ea 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -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


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [gcc(refs/users/wschmidt/heads/builtins10)] Support scanning of build-time GC roots in gengtype
@ 2021-04-26 20:48 William Schmidt
  0 siblings, 0 replies; 5+ messages in thread
From: William Schmidt @ 2021-04-26 20:48 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:26d623c5117d22fbaea2ce1a445ba2d32df437ad

commit 26d623c5117d22fbaea2ce1a445ba2d32df437ad
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Mon Apr 26 15:33:11 2021 -0500

    Support scanning of build-time GC roots in gengtype
    
    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-04-02  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_files_list): Add a
            parameter to the fileslist expression for the number of build
            headers to scan.
            (read_state_file_list): Detect build headers and strip the initial
            "./" 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.

Diff:
---
 gcc/Makefile.in      |  5 +++--
 gcc/gengtype-state.c | 29 +++++++++++++++++++++++------
 gcc/gengtype.c       | 19 ++++++++++++++++---
 gcc/gengtype.h       |  5 +++++
 4 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 2fd94fc7dba..1a253256042 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -561,6 +561,7 @@ out_object_file=@out_object_file@
 OUT_FILE_DEPS=
 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@
@@ -2740,8 +2741,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
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c
index 891f2e18a61..be3549dce33 100644
--- a/gcc/gengtype-state.c
+++ b/gcc/gengtype-state.c
@@ -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,20 @@ 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] == '.' && 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);
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index 98d4626f87e..57dc6e9fbe8 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -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,17 @@ 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] == '.' && 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", 
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 4fe8f0f7232..ca348a3b4b1 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -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


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [gcc(refs/users/wschmidt/heads/builtins10)] Support scanning of build-time GC roots in gengtype
@ 2021-04-01 19:46 William Schmidt
  0 siblings, 0 replies; 5+ messages in thread
From: William Schmidt @ 2021-04-01 19:46 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:8cfd8d2bbbe24affeb1d305f08d7b0068463d7f6

commit 8cfd8d2bbbe24affeb1d305f08d7b0068463d7f6
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Wed Mar 3 11:26:15 2021 -0600

    Support scanning of build-time GC roots in gengtype
    
    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-03-03  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_files_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 "./" 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.c (build_headers): New extern variable.
            (num_build_headers): Likewise.

Diff:
---
 gcc/Makefile.in      |  5 +++--
 gcc/gengtype-state.c | 29 +++++++++++++++++++++++------
 gcc/gengtype.c       | 19 ++++++++++++++++---
 gcc/gengtype.h       |  5 +++++
 4 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 2fd94fc7dba..1a253256042 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -561,6 +561,7 @@ out_object_file=@out_object_file@
 OUT_FILE_DEPS=
 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@
@@ -2740,8 +2741,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
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c
index 891f2e18a61..be3549dce33 100644
--- a/gcc/gengtype-state.c
+++ b/gcc/gengtype-state.c
@@ -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,20 @@ 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] == '.' && 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);
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index 5f50242e857..b4b6a51e7c6 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -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,17 @@ 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] == '.' && 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", 
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 4fe8f0f7232..ca348a3b4b1 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -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


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [gcc(refs/users/wschmidt/heads/builtins10)] Support scanning of build-time GC roots in gengtype
@ 2021-03-25 15:44 William Schmidt
  0 siblings, 0 replies; 5+ messages in thread
From: William Schmidt @ 2021-03-25 15:44 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:bf019bf2a5d51e91888294544b46a9a3f86f32a0

commit bf019bf2a5d51e91888294544b46a9a3f86f32a0
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Wed Mar 3 11:26:15 2021 -0600

    Support scanning of build-time GC roots in gengtype
    
    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-03-03  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_files_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 "./" 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.c (build_headers): New extern variable.
            (num_build_headers): Likewise.

Diff:
---
 gcc/Makefile.in      |  5 +++--
 gcc/gengtype-state.c | 29 +++++++++++++++++++++++------
 gcc/gengtype.c       | 19 ++++++++++++++++---
 gcc/gengtype.h       |  5 +++++
 4 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 2fd94fc7dba..1a253256042 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -561,6 +561,7 @@ out_object_file=@out_object_file@
 OUT_FILE_DEPS=
 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@
@@ -2740,8 +2741,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
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c
index 891f2e18a61..be3549dce33 100644
--- a/gcc/gengtype-state.c
+++ b/gcc/gengtype-state.c
@@ -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,20 @@ 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] == '.' && 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);
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index 5f50242e857..b4b6a51e7c6 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -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,17 @@ 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] == '.' && 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", 
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 4fe8f0f7232..ca348a3b4b1 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -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


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-06-25 16:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-15 17:16 [gcc(refs/users/wschmidt/heads/builtins10)] Support scanning of build-time GC roots in gengtype William Schmidt
  -- strict thread matches above, loose matches on Subject: below --
2021-06-25 16:14 William Schmidt
2021-04-26 20:48 William Schmidt
2021-04-01 19:46 William Schmidt
2021-03-25 15:44 William Schmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).