From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 27C98385B53D for ; Thu, 16 Nov 2023 14:29:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 27C98385B53D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 27C98385B53D Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700144948; cv=none; b=x5AMW82qbp7MHMJFXMnmasqOYAwf7SZIrfFiHZoQDIkXamYS5/vc5Z4p/ZU5cOO97XqOzGjgxOJXH8eGBjs6ic1RVnjciT/HX6dZMaC10eb6UMJS7TCmT7ttLQgnM0tejNmfKhcQQEh5o4KLYq/pW9T89WCNtHKONC8ZKNBZxqw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700144948; c=relaxed/simple; bh=+qm9tm+YoVpmQhEQh1/weHwYt5H/GL+NJ+BWSRS2pmk=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=mRqFzK8m3HrOgCfbWV1IMkUhl0VhrtXAjfvmpZ2Yv8t9bwg01TZVesR4KnHo0Z2X3on7pThh99bxc03DkyrcYcFtK19BFTlnb4DfwvZ8PTav5Hm/J19pgJHzCY7sI8qSQYEte2XQQvK5PedymhBhtYClPiN8QyNE5nHUrFLmL3E= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1700144945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=u5cj9ITSyzv9EXYs0oZY6yYIlViQ4thVUwhjUw0zpF8=; b=S2GppVQZKfd7L2X0RgXh4I7M3O1RVUEVufg3MZFBdPJLhRYiBBs19CyJ0XSarVapsu8/g/ 0RCdFdPgFQ41TsPYdEr6vs5XGyWM2RvcDtFeF/co6mOnDhPsVILlKxMWl4drzawXW66GYu dxG9vuVOQeHvzPp65p/GtdiSjA7Asjc= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-347-2O8W9nPcMdO1KRVdnQqe_w-1; Thu, 16 Nov 2023 09:29:02 -0500 X-MC-Unique: 2O8W9nPcMdO1KRVdnQqe_w-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6D859828AC2; Thu, 16 Nov 2023 14:29:02 +0000 (UTC) Received: from t14s.localdomain.com (unknown [10.22.10.115]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3C8191121306; Thu, 16 Nov 2023 14:29:02 +0000 (UTC) From: David Malcolm To: Joseph Myers Cc: gcc-patches@gcc.gnu.org, David Malcolm Subject: [PATCH 3/4] opts: add logic to generate options-urls.cc Date: Thu, 16 Nov 2023 09:28:57 -0500 Message-Id: <20231116142858.3996740-4-dmalcolm@redhat.com> In-Reply-To: <20231116142858.3996740-1-dmalcolm@redhat.com> References: <9e5d6710-84e-15b9-d955-5381a6dc18a9@codesourcery.com> <20231116142858.3996740-1-dmalcolm@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Changed in v2: - split out from the code that uses this - now handles lang-specific URLs, as well as generic URLs - the generated options-urls.cc now contains a function with a switch statement, rather than an array, to support lang-specific URLs: const char * get_opt_url_suffix (int option_index, unsigned lang_mask) { switch (option_index) { [...snip...] case OPT_B: if (lang_mask & CL_D) return "gdc/Directory-Options.html#index-B"; return "gcc/Directory-Options.html#index-B"; [...snip...] return nullptr; } gcc/ChangeLog: * Makefile.in (ALL_OPT_URL_FILES): New. (GCC_OBJS): Add options-urls.o. (OBJS): Likewise. (OBJS-libcommon): Likewise. (s-options): Depend on $(ALL_OPT_URL_FILES), and add this to inputs to opt-gather.awk. (options-urls.cc): New Makefile target. * opt-functions.awk (url_suffix): New function. (lang_url_suffix): New function. * options-urls-cc-gen.awk: New file. * opts.h (get_opt_url_suffix): New decl. --- gcc/Makefile.in | 18 +++++-- gcc/opt-functions.awk | 15 ++++++ gcc/options-urls-cc-gen.awk | 105 ++++++++++++++++++++++++++++++++++++ gcc/opts.h | 4 ++ 4 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 gcc/options-urls-cc-gen.awk diff --git a/gcc/Makefile.in b/gcc/Makefile.in index f3b79b8a2663..72daf907c530 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1272,6 +1272,8 @@ FLAGS_TO_PASS = \ # All option source files ALL_OPT_FILES=$(lang_opt_files) $(extra_opt_files) +ALL_OPT_URL_FILES=$(patsubst %, %.urls, $(ALL_OPT_FILES)) + # Target specific, C specific object file C_TARGET_OBJS=@c_target_objs@ @@ -1288,7 +1290,7 @@ FORTRAN_TARGET_OBJS=@fortran_target_objs@ RUST_TARGET_OBJS=@rust_target_objs@ # Object files for gcc many-languages driver. -GCC_OBJS = gcc.o gcc-main.o ggc-none.o gcc-urlifier.o +GCC_OBJS = gcc.o gcc-main.o ggc-none.o gcc-urlifier.o options-urls.o c-family-warn = $(STRICT_WARN) @@ -1608,6 +1610,7 @@ OBJS = \ optinfo.o \ optinfo-emit-json.o \ options-save.o \ + options-urls.o \ opts-global.o \ ordered-hash-map-tests.o \ passes.o \ @@ -1834,7 +1837,8 @@ OBJS-libcommon = diagnostic-spec.o diagnostic.o diagnostic-color.o \ # compiler and containing target-dependent code. OBJS-libcommon-target = $(common_out_object_file) prefix.o \ opts.o opts-common.o options.o vec.o hooks.o common/common-targhooks.o \ - hash-table.o file-find.o spellcheck.o selftest.o opt-suggestions.o + hash-table.o file-find.o spellcheck.o selftest.o opt-suggestions.o \ + options-urls.o # This lists all host objects for the front ends. ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS)) @@ -2437,9 +2441,9 @@ s-specs : Makefile $(STAMP) s-specs optionlist: s-options ; @true -s-options: $(ALL_OPT_FILES) Makefile $(srcdir)/opt-gather.awk +s-options: $(ALL_OPT_FILES) $(ALL_OPT_URL_FILES) Makefile $(srcdir)/opt-gather.awk LC_ALL=C ; export LC_ALL ; \ - $(AWK) -f $(srcdir)/opt-gather.awk $(ALL_OPT_FILES) > tmp-optionlist + $(AWK) -f $(srcdir)/opt-gather.awk $(ALL_OPT_FILES) $(ALL_OPT_URL_FILES) > tmp-optionlist $(SHELL) $(srcdir)/../move-if-change tmp-optionlist optionlist $(STAMP) s-options @@ -2455,6 +2459,12 @@ options-save.cc: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ -f $(srcdir)/optc-save-gen.awk \ -v header_name="config.h system.h coretypes.h tm.h" < $< > $@ +options-urls.cc: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ + $(srcdir)/options-urls-cc-gen.awk + $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opt-read.awk \ + -f $(srcdir)/options-urls-cc-gen.awk \ + -v header_name="config.h system.h coretypes.h tm.h" < $< > $@ + options.h: s-options-h ; @true s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opt-read.awk \ $(srcdir)/opth-gen.awk diff --git a/gcc/opt-functions.awk b/gcc/opt-functions.awk index a58e93815e30..c31e66f2105a 100644 --- a/gcc/opt-functions.awk +++ b/gcc/opt-functions.awk @@ -193,6 +193,21 @@ function var_name(flags) return nth_arg(0, opt_args("Var", flags)) } +# If FLAGS includes a UrlSuffix flag, return the value it specifies. +# Return the empty string otherwise. +function url_suffix(flags) +{ + return nth_arg(0, opt_args("UrlSuffix", flags)) +} + +# If FLAGS includes a LangUrlSuffix_LANG flag, return the +# value it specifies. +# Return the empty string otherwise. +function lang_url_suffix(flags, lang) +{ + return nth_arg(0, opt_args("LangUrlSuffix_" lang, flags)) +} + # Return the name of the variable if FLAGS has a HOST_WIDE_INT variable. # Return the empty string otherwise. function host_wide_int_var_name(flags) diff --git a/gcc/options-urls-cc-gen.awk b/gcc/options-urls-cc-gen.awk new file mode 100644 index 000000000000..e021e7c3f1bc --- /dev/null +++ b/gcc/options-urls-cc-gen.awk @@ -0,0 +1,105 @@ +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# . + +# This Awk script reads in the option records generated from +# opt-gather.awk, and generates a C++ file containing an array +# of URL suffixes (possibly NULL), one per option. + +# This program uses functions from opt-functions.awk and code from +# opt-read.awk. +# +# Usage: awk -f opt-functions.awk -f opt-read.awk -f options-urls-cc-gen.awk \ +# [-v header_name=header.h] < inputfile > options-urls.cc + +END { + + +print "/* This file is auto-generated by options-urls-cc-gen.awk. */" +print "" +n_headers = split(header_name, headers, " ") +for (i = 1; i <= n_headers; i++) + print "#include " quote headers[i] quote +print "#include " quote "opts.h" quote +print "#include " quote "intl.h" quote +print "#include " quote "insn-attr-common.h" quote +print "" + +if (n_extra_c_includes > 0) { + for (i = 0; i < n_extra_c_includes; i++) { + print "#include " quote extra_c_includes[i] quote + } + print "" +} + +print "const char *" +print "get_opt_url_suffix (int option_index, unsigned lang_mask)" +print "{" +print " switch (option_index)" +print " {" + + +optindex = 0 +for (i = 0; i < n_opts; i++) { + # Combine the flags of identical switches. Switches + # appear many times if they are handled by many front + # ends, for example. + while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { + flags[i + 1] = flags[i] " " flags[i + 1]; + i++; + } + + len = length (opts[i]); + enum = opt_enum(opts[i]) + + # Aliases do not get enumeration names. + if ((flag_set_p("Alias.*", flags[i]) \ + && !flag_set_p("SeparateAlias", flags[i])) \ + || flag_set_p("Ignore", flags[i])) { + show_case = 0; + } else { + show_case = 1; + } + + if (show_case) { + printf(" case %s:\n", opt_enum(opts[i])) + + # Handle any lang-specific LangUrlSuffix directives: + for (lang_idx = 0; lang_idx < n_langs; lang_idx++) { + lang_name = lang_sanitized_name(langs[lang_idx]) + u = lang_url_suffix(flags[i], lang_name) + if (u != "") { + printf(" if (lang_mask & CL_%s)\n", lang_name) + printf(" return \"%s\";\n", u) + } + } + + # Use any language-independent UrlSuffix directive: + u = url_suffix(flags[i]) + if (u != "") { + printf(" return \"%s\";\n", u) + } else { + printf(" break;\n") + } + } + + # Bump up the informational option index. + ++optindex + } + +print " }" +print " return nullptr;" +print "}" +} diff --git a/gcc/opts.h b/gcc/opts.h index 00f377f9ca7e..0e47d3425604 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -152,6 +152,10 @@ struct cl_option_state { extern const struct cl_option cl_options[]; extern const unsigned int cl_options_count; + +extern const char * +get_opt_url_suffix (int option_index, unsigned lang_mask); + #ifdef ENABLE_PLUGIN extern const struct cl_var cl_vars[]; #endif -- 2.26.3