[3/4] opts: add logic to generate options-urls.cc
Checks
Commit Message
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
@@ -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
@@ -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)
new file mode 100644
@@ -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
+# <http://www.gnu.org/licenses/>.
+
+# 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 "}"
+}
@@ -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