From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 8854F396AC05 for ; Thu, 17 Jun 2021 15:20:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8854F396AC05 Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 15HF3G58051894; Thu, 17 Jun 2021 11:20:06 -0400 Received: from ppma03dal.us.ibm.com (b.bd.3ea9.ip4.static.sl-reverse.com [169.62.189.11]) by mx0a-001b2d01.pphosted.com with ESMTP id 3986newu1f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 17 Jun 2021 11:20:06 -0400 Received: from pps.filterd (ppma03dal.us.ibm.com [127.0.0.1]) by ppma03dal.us.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 15HFBm7D028389; Thu, 17 Jun 2021 15:20:05 GMT Received: from b03cxnp07029.gho.boulder.ibm.com (b03cxnp07029.gho.boulder.ibm.com [9.17.130.16]) by ppma03dal.us.ibm.com with ESMTP id 394mjacbpp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 17 Jun 2021 15:20:05 +0000 Received: from b03ledav001.gho.boulder.ibm.com (b03ledav001.gho.boulder.ibm.com [9.17.130.232]) by b03cxnp07029.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 15HFK46p15925728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 17 Jun 2021 15:20:04 GMT Received: from b03ledav001.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B7BF86E079; Thu, 17 Jun 2021 15:20:03 +0000 (GMT) Received: from b03ledav001.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 98EDF6E056; Thu, 17 Jun 2021 15:20:03 +0000 (GMT) Received: from localhost (unknown [9.40.194.84]) by b03ledav001.gho.boulder.ibm.com (Postfix) with ESMTP; Thu, 17 Jun 2021 15:20:03 +0000 (GMT) From: Bill Schmidt To: gcc-patches@gcc.gnu.org Cc: segher@kernel.crashing.org Subject: [PATCH 01/55] Support scanning of build-time GC roots in gengtype Date: Thu, 17 Jun 2021 10:18:45 -0500 Message-Id: <4f96cb6d1977e0d87b8419cf3a0aad6c71d6a31f.1623941441.git.wschmidt@linux.ibm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ZhMdbytveJFRVk_RsDqvUG_JwYO9_aYC X-Proofpoint-ORIG-GUID: ZhMdbytveJFRVk_RsDqvUG_JwYO9_aYC X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391, 18.0.790 definitions=2021-06-17_13:2021-06-15, 2021-06-17 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 suspectscore=0 mlxscore=0 spamscore=0 mlxlogscore=999 phishscore=0 impostorscore=0 clxscore=1015 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2106170096 X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Jun 2021 15:20:09 -0000 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 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 | 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 "./.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 "./.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 "./.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 -- 2.27.0