opts: add logic to generate options-urls.cc
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. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
This commit is contained in:
parent
5bb18475a1
commit
6ecc1e3235
4 changed files with 138 additions and 4 deletions
|
@ -1273,6 +1273,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@
|
||||
|
||||
|
@ -1289,7 +1291,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)
|
||||
|
||||
|
@ -1612,6 +1614,7 @@ OBJS = \
|
|||
optinfo.o \
|
||||
optinfo-emit-json.o \
|
||||
options-save.o \
|
||||
options-urls.o \
|
||||
opts-global.o \
|
||||
ordered-hash-map-tests.o \
|
||||
passes.o \
|
||||
|
@ -1838,7 +1841,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))
|
||||
|
@ -2441,9 +2445,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
|
||||
|
||||
|
@ -2459,6 +2463,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)
|
||||
|
|
105
gcc/options-urls-cc-gen.awk
Normal file
105
gcc/options-urls-cc-gen.awk
Normal file
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue