OSDN Git Service

* config.gcc (extra_options): New variable for listing option files.
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Mar 2005 20:18:43 +0000 (20:18 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Mar 2005 20:18:43 +0000 (20:18 +0000)
Add ${cpu_type}/${cpu_type}.opt to it if that file exists.
* configure.ac (extra_opt_files): New AC_SUBST variable.
(tm_file_list, tm_include_list): Include options.h first.
* configure: Regenerate.
* Makefile.in (extra_opt_files, ALL_OPT_FILES): New variables.
(s-options): Use $(ALL_OPT_FILES) instead of $(lang_opt_files)
(s-options-h): New rule.
(options.h): Depend on it.
(TEXI_GCCINT_FILES): Add options.texi.
* hooks.h (hook_bool_size_t_constcharptr_int_true): Declare.
* hooks.c (hook_bool_size_t_constcharptr_int_true): New function.
* target.h (gcc_target): Add default_target_flags and handle_option.
* target-def.h (TARGET_DEFAULT_TARGET_FLAGS)
(TARGET_HANDLE_OPTION): New macros.
(TARGET_INITIALIZER): Include them.
* opt-functions.awk (opt_args, nth_arg): New functions.
(switch_flags): Handle the "Target" flag.
(var_args): Delete.
(var_name): Use opt_args and nth_arg.
(var_set, var_ref): Likewise.  Handle "Mask" and "InverseMask".
* opth-gen.awk: Declare target_flags.  Declare MASK_* and TARGET_*
macros for the "Mask" and "InverseMask" options.
* opts.h (cl_var_cond): New enum.
(cl_option): Replace the "has_set_value" and "set_value" fields with
"var_cond" and "var_value".
(CL_TARGET): New macro.
(option_enabled, print_filtered_help): Declare.
(decode_options): Move definition.
* opts.c (handle_option): Search for the original option before
removing any "no-" prefix.  Handle CL_TARGET.  Adjust for the new
var_cond and var_value fields.  Use targetm.handle_option to handle
target options.
(decode_options): Set target_flags to targetm.default_target_flags.
(print_filtered_help): Make global.  Handle CL_TARGET.
(option_enabled): New function.
* toplev.c (target_switches): Guard with #ifdef TARGET_SWITCHES.
(display_target_options, set_target_switch, print_switch_values)
(default_pch_valid_p): Guard uses of target_switches with
#ifdef TARGET_SWITCHES.  Also...
(display_target_options): Display the CL_TARGET entries in cl_options.
(set_target_option): Don't complain about the "" option when
TARGET_SWITCHES is undefined.
(print_switch_values): Use option_enabled.
(default_pch_valid_p): Check cl_options[] when looking for something
that has changed the value of target_flags.
* c.opt: Remove documentation from top of file.
* doc/gccint.texi: Add an "Options" chapter.  Include options.texi.
* doc/sourecebuild.texi: Refer to the new options documentation
instead of c.opt.  Document machine-specific .opt files.
* doc/tm.texi (target_flags): Say that this variable is declared
by options.h.
(TARGET_DEFAULT_TARGET_FLAGS, TARGET_HANDLE_OPTION): Document.
(TARGET_SWITCHES, TARGET_OPTIONS): Refer to the option files as
an alternative.
* doc/options.texi: New file.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96448 138bc75d-0d04-0410-961f-82ee72b054a4

19 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/c.opt
gcc/config.gcc
gcc/configure
gcc/configure.ac
gcc/doc/gccint.texi
gcc/doc/options.texi [new file with mode: 0644]
gcc/doc/sourcebuild.texi
gcc/doc/tm.texi
gcc/hooks.c
gcc/hooks.h
gcc/opt-functions.awk
gcc/opth-gen.awk
gcc/opts.c
gcc/opts.h
gcc/target-def.h
gcc/target.h
gcc/toplev.c

index 1e0a0f4..fb182eb 100644 (file)
@@ -1,3 +1,62 @@
+2005-03-14  Richard Sandiford  <rsandifo@redhat.com>
+
+       * config.gcc (extra_options): New variable for listing option files.
+       Add ${cpu_type}/${cpu_type}.opt to it if that file exists.
+       * configure.ac (extra_opt_files): New AC_SUBST variable.
+       (tm_file_list, tm_include_list): Include options.h first.
+       * configure: Regenerate.
+       * Makefile.in (extra_opt_files, ALL_OPT_FILES): New variables.
+       (s-options): Use $(ALL_OPT_FILES) instead of $(lang_opt_files)
+       (s-options-h): New rule.
+       (options.h): Depend on it.
+       (TEXI_GCCINT_FILES): Add options.texi.
+       * hooks.h (hook_bool_size_t_constcharptr_int_true): Declare.
+       * hooks.c (hook_bool_size_t_constcharptr_int_true): New function.
+       * target.h (gcc_target): Add default_target_flags and handle_option.
+       * target-def.h (TARGET_DEFAULT_TARGET_FLAGS)
+       (TARGET_HANDLE_OPTION): New macros.
+       (TARGET_INITIALIZER): Include them.
+       * opt-functions.awk (opt_args, nth_arg): New functions.
+       (switch_flags): Handle the "Target" flag.
+       (var_args): Delete.
+       (var_name): Use opt_args and nth_arg.
+       (var_set, var_ref): Likewise.  Handle "Mask" and "InverseMask".
+       * opth-gen.awk: Declare target_flags.  Declare MASK_* and TARGET_*
+       macros for the "Mask" and "InverseMask" options.
+       * opts.h (cl_var_cond): New enum.
+       (cl_option): Replace the "has_set_value" and "set_value" fields with 
+       "var_cond" and "var_value".
+       (CL_TARGET): New macro.
+       (option_enabled, print_filtered_help): Declare.
+       (decode_options): Move definition.
+       * opts.c (handle_option): Search for the original option before
+       removing any "no-" prefix.  Handle CL_TARGET.  Adjust for the new
+       var_cond and var_value fields.  Use targetm.handle_option to handle
+       target options.
+       (decode_options): Set target_flags to targetm.default_target_flags.
+       (print_filtered_help): Make global.  Handle CL_TARGET.
+       (option_enabled): New function.
+       * toplev.c (target_switches): Guard with #ifdef TARGET_SWITCHES.
+       (display_target_options, set_target_switch, print_switch_values)
+       (default_pch_valid_p): Guard uses of target_switches with
+       #ifdef TARGET_SWITCHES.  Also...
+       (display_target_options): Display the CL_TARGET entries in cl_options.
+       (set_target_option): Don't complain about the "" option when
+       TARGET_SWITCHES is undefined.
+       (print_switch_values): Use option_enabled.
+       (default_pch_valid_p): Check cl_options[] when looking for something
+       that has changed the value of target_flags.
+       * c.opt: Remove documentation from top of file.
+       * doc/gccint.texi: Add an "Options" chapter.  Include options.texi.
+       * doc/sourecebuild.texi: Refer to the new options documentation
+       instead of c.opt.  Document machine-specific .opt files.
+       * doc/tm.texi (target_flags): Say that this variable is declared
+       by options.h.
+       (TARGET_DEFAULT_TARGET_FLAGS, TARGET_HANDLE_OPTION): Document.
+       (TARGET_SWITCHES, TARGET_OPTIONS): Refer to the option files as
+       an alternative.
+       * doc/options.texi: New file.
+
 2005-03-14  Alexandre Oliva  <aoliva@redhat.com>
 
        PR middle-end/18628
index 1b72ac8..fbdc9e1 100644 (file)
@@ -425,6 +425,7 @@ GCC_THREAD_FILE=@thread_file@
 OBJC_BOEHM_GC=@objc_boehm_gc@
 GTHREAD_FLAGS=@gthread_flags@
 extra_modes_file=@extra_modes_file@
+extra_opt_files=@extra_opt_files@
 host_hook_obj=@out_host_hook_obj@
 # Be prepared for gcc2 merges.
 gcc_version=@gcc_version@
@@ -880,6 +881,9 @@ SUBDIR_FLAGS_TO_PASS = $(ORDINARY_FLAGS_TO_PASS) \
 #\f
 # Lists of files for various purposes.
 
+# All option source files
+ALL_OPT_FILES=$(lang_opt_files) $(extra_opt_files)
+
 # Target specific, C specific object file
 C_TARGET_OBJS=@c_target_objs@
 
@@ -1529,19 +1533,21 @@ s-specs : Makefile
        $(STAMP) s-specs
 
 optionlist: s-options ; @true
-s-options: $(lang_opt_files) Makefile $(srcdir)/opt-gather.awk
-       $(AWK) -f $(srcdir)/opt-gather.awk $(lang_opt_files) > tmp-optionlist
+s-options: $(ALL_OPT_FILES) Makefile $(srcdir)/opt-gather.awk
+       $(AWK) -f $(srcdir)/opt-gather.awk $(ALL_OPT_FILES) > tmp-optionlist
        $(SHELL) $(srcdir)/../move-if-change tmp-optionlist optionlist
        $(STAMP) s-options
 
-
 options.c: optionlist $(srcdir)/opt-functions.awk $(srcdir)/optc-gen.awk
        $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/optc-gen.awk \
               -v header_name="options.h" < $< > $@ 
 
-options.h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opth-gen.awk
+options.h: s-options-h ; @true
+s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opth-gen.awk
        $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opth-gen.awk \
-              < $< > $@
+              < $< > tmp-options.h
+       $(SHELL) $(srcdir)/../move-if-change tmp-options.h options.h
+       $(STAMP) $@
 
 options.o: options.c options.h opts.h intl.h
 
@@ -2977,7 +2983,7 @@ TEXI_GCCINT_FILES = gccint.texi gcc-common.texi contribute.texi makefile.texi \
         c-tree.texi rtl.texi md.texi tm.texi hostconfig.texi fragments.texi \
         configfiles.texi collect2.texi headerdirs.texi funding.texi gnu.texi \
         gpl.texi fdl.texi contrib.texi languages.texi sourcebuild.texi \
-        gty.texi libgcc.texi cfg.texi tree-ssa.texi
+        gty.texi libgcc.texi cfg.texi tree-ssa.texi options.texi
 
 TEXI_GCCINSTALL_FILES = install.texi install-old.texi fdl.texi
 
index 8267e0e..2582661 100644 (file)
--- a/gcc/c.opt
+++ b/gcc/c.opt
 ; 02111-1307, USA.
 
 
-; This file is processed by the script opts.sh.  It is a database of
-; command line options, with each record separated by a blank line,
-; and each field appearing on its own line.  The first field is the
-; command-line switch with the leading "-" removed.  All options
-; beginning with "f" or "W" are implicitly assumed to take a "no-"
-; form; this form should not be listed.  If you do not want this
-; negative form and you want it to be automatically rejected, add
-; RejectNegative to the second field.
-
-; The second field is a space-separated list of which parts of the
-; compiler recognize the switch, as declared by "Language" entries.
-; If the switch takes an argument, then you should also specify
-; "Joined" and/or "Separate" to indicate where the argument can
-; appear.  If a Joined argument can legitimately be omitted, specify
-; "JoinedOrMissing" instead of "Joined".  If the argument to a switch
-; is a non-negative integer, you can specify "UInteger" and the switch
-; decoder will convert the argument for you, or complain to the user
-; if the argument is invalid.  "Var(name,set)" creates an integer
-; variable "name".  The variable is declared and initialized to value
-; given by "Init(value)" (or zero if this property is not defined).
-; When the option is passed to compiler, this variable is set to "set"
-; if value passed through the flag is nonzero, !"set" if value is zero,
-; or to value if "set" is omitted.  If "VarExists"  is specified, the
-; declaration for the variable is not created.  If "Report" is specified,
-; the flag is output with -fverbose-asm.
-
-; The third field is the help text to output with --help.  This is
-; automatically line-wrapped on output.  Normally the switch is output
-; automatically, with the help text on the right hand side of the
-; output.  However, if the help text contains a tab character, the
-; text to the left of the tab is output instead of the switch, and the
-; text to its right forms the help.  This is useful for elaborating on
-; what type of argument a switch takes, for example.  If the second
-; field contains "Undocumented" then nothing is output with --help.
-; Only do this with good reason like the switch being internal between
-; the driver and the front end - it is not an excuse to leave a switch
-; undocumented.
-
-; Comments can appear on their own line anwhere in the file, preceded
-; by a semicolon.  Whitespace is permitted before the semicolon.
-
-; For each switch XXX below, an enumeration constant is created by the
-; script opts.sh spelt OPT_XXX, but with all non-alphanumeric
-; characters replaced with an underscore.
-
 ; Please try to keep this file in ASCII collating order.
 
 Language
index 9de2bb5..bd542c4 100644 (file)
@@ -98,6 +98,8 @@
 #
 #  extra_programs      Like extra_passes, but these are used when linking.
 #
+#  extra_options       List of target-dependent .opt files.
+#
 #  c_target_objs       List of extra target-dependent objects that be
 #                      linked into the C compiler only.
 #
@@ -151,6 +153,7 @@ extra_parts=
 extra_programs=
 extra_objs=
 extra_gcc_objs=
+extra_options=
 c_target_objs=
 cxx_target_objs=
 tm_defines=
@@ -318,6 +321,10 @@ if test -f ${srcdir}/config/${cpu_type}/${cpu_type}-modes.def
 then
        extra_modes=${cpu_type}/${cpu_type}-modes.def
 fi
+if test -f ${srcdir}/config/${cpu_type}/${cpu_type}.opt
+then
+       extra_options="${extra_options} ${cpu_type}/${cpu_type}.opt"
+fi
 
 case ${target} in
 x86_64-*-*)
index 0283bb9..02fdf0b 100755 (executable)
@@ -309,7 +309,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical build_subdir host_subdir target_subdir gcc_version_trigger gcc_version_full gcc_version GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP EGREP strict1_warn warn_cflags WERROR nocommon_flag TREEBROWSER valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep SET_MAKE AWK LN_S LN RANLIB ac_ct_RANLIB ranlib_flags INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON NM AR stage1_cflags COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LTLIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file PACKAGE VERSION USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS host_cc_for_libada CROSS ALL SYSTEM_HEADER_DIR inhibit_libc CC_FOR_BUILD BUILD_CFLAGS STMP_FIXINC STMP_FIXPROTO collect2 libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir objdir subdirs srcdir all_boot_languages all_compilers all_gtfiles all_gtfiles_files_langs all_gtfiles_files_files all_lang_makefrags all_lang_makefiles all_languages all_stagestuff build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines check_languages cc_set_by_configure quoted_cc_set_by_configure cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir libstdcxx_incdir host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file stage_prefix_set_by_configure quoted_stage_prefix_set_by_configure thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines c_target_objs cxx_target_objs target_cpu_default set_gcc_lib_path GMPLIBS GMPINC LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical build_subdir host_subdir target_subdir gcc_version_trigger gcc_version_full gcc_version GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP EGREP strict1_warn warn_cflags WERROR nocommon_flag TREEBROWSER valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep SET_MAKE AWK LN_S LN RANLIB ac_ct_RANLIB ranlib_flags INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON NM AR stage1_cflags COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LTLIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file extra_opt_files PACKAGE VERSION USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS host_cc_for_libada CROSS ALL SYSTEM_HEADER_DIR inhibit_libc CC_FOR_BUILD BUILD_CFLAGS STMP_FIXINC STMP_FIXPROTO collect2 libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir objdir subdirs srcdir all_boot_languages all_compilers all_gtfiles all_gtfiles_files_langs all_gtfiles_files_files all_lang_makefrags all_lang_makefiles all_languages all_stagestuff build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines check_languages cc_set_by_configure quoted_cc_set_by_configure cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir libstdcxx_incdir host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file stage_prefix_set_by_configure quoted_stage_prefix_set_by_configure thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines c_target_objs cxx_target_objs target_cpu_default set_gcc_lib_path GMPLIBS GMPINC LIBOBJS LTLIBOBJS'
 ac_subst_files='language_hooks'
 
 # Initialize some variables set by options.
@@ -12061,6 +12061,13 @@ _ACEOF
 
 fi
 
+# Convert extra_options into a form suitable for Makefile use.
+extra_opt_files=
+for f in $extra_options; do
+  extra_opt_files="$extra_opt_files \$(srcdir)/config/$f"
+done
+
+
 # auto-host.h is the file containing items generated by autoconf and is
 # the first file included by config.h.
 # If host=build, it is correct to have bconfig include auto-host.h
@@ -12445,8 +12452,8 @@ host_cc_for_libada=${CC}
 
 out_object_file=`basename $out_file .c`.o
 
-tm_file_list=
-tm_include_list=
+tm_file_list="options.h"
+tm_include_list="options.h"
 for f in $tm_file; do
   case $f in
     defaults.h )
@@ -16029,6 +16036,7 @@ s,@manext@,$manext,;t t
 s,@objext@,$objext,;t t
 s,@gthread_flags@,$gthread_flags,;t t
 s,@extra_modes_file@,$extra_modes_file,;t t
+s,@extra_opt_files@,$extra_opt_files,;t t
 s,@PACKAGE@,$PACKAGE,;t t
 s,@VERSION@,$VERSION,;t t
 s,@USE_NLS@,$USE_NLS,;t t
index 3cad882..dedb800 100644 (file)
@@ -1332,6 +1332,13 @@ if test -n "$extra_modes" && test -f $srcdir/config/$extra_modes; then
    for this architecture.])
 fi
 
+# Convert extra_options into a form suitable for Makefile use.
+extra_opt_files=
+for f in $extra_options; do
+  extra_opt_files="$extra_opt_files \$(srcdir)/config/$f"
+done
+AC_SUBST(extra_opt_files)
+
 # auto-host.h is the file containing items generated by autoconf and is
 # the first file included by config.h.
 # If host=build, it is correct to have bconfig include auto-host.h
@@ -1525,8 +1532,8 @@ AC_SUBST(host_cc_for_libada)
 
 out_object_file=`basename $out_file .c`.o
 
-tm_file_list=
-tm_include_list=
+tm_file_list="options.h"
+tm_include_list="options.h"
 for f in $tm_file; do
   case $f in
     defaults.h )
index 031c707..d66a4a4 100644 (file)
@@ -105,6 +105,7 @@ Additional tutorial information is linked to from
 * Libgcc::          Low-level runtime library used by GCC.
 * Languages::       Languages for which GCC front ends are written.
 * Source Tree::     GCC source tree structure and build system.
+* Options::         Option specification files.
 * Passes::          Order of passes, what they do, and what each file is for.
 * Trees::           The source representation used by the C and C++ front ends.
 * RTL::             The intermediate representation that most passes work on.
@@ -136,6 +137,7 @@ Additional tutorial information is linked to from
 @include libgcc.texi
 @include languages.texi
 @include sourcebuild.texi
+@include options.texi
 @include passes.texi
 @include c-tree.texi
 @include tree-ssa.texi
diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi
new file mode 100644 (file)
index 0000000..138ebdb
--- /dev/null
@@ -0,0 +1,161 @@
+@c Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+@c This is part of the GCC manual.
+@c For copying conditions, see the file gcc.texi.
+
+@node Options
+@chapter Option specification files
+@cindex option specification files
+@cindex @samp{opts.sh}
+
+Most GCC command-line options are described by special option
+definition files, the names of which conventionally end in
+@code{.opt}.  This chapter describes the format of these files.
+
+@menu
+* Option file format::   The general layout of the files
+* Option properties::    Supported option properties
+@end menu
+
+@node Option file format
+@section Option file format
+
+Option files are a simple list of records in which each field occupies
+its own line and in which the records themselves are separated by
+blank lines.  Comments may appear on their own line anywhere within
+the file and are preceded by semicolons.  Whitespace is allowed before
+the semicolon.
+
+The files can contain two types of record: language definitions and
+option definitions.
+
+A language definition record has two fields: the string
+@samp{Language} and the name of the language.  Once a language has
+been declared in this way, it can be used as an option property.
+@xref{Option properties}.
+
+An option definition record has the following fields:
+
+@enumerate
+@item
+the name of the option, with the leading ``-'' removed
+@item
+a space-separated list of option properties (@pxref{Option properties})
+@item
+the help text to use for @option{--help} (omitted if the second field
+contains the @code{Undocumented} property).
+@end enumerate
+
+By default, all options beginning with ``f'', ``W'' or ``m'' are
+implicitly assumed to take a ``no-'' form.  This form should not be
+listed separately.  If an option beginning with one of these letters
+does not have a ``no-'' form, you can use the @code{RejectNegative}
+property to reject it.
+
+The help text is automatically line-wrapped before being displayed.
+Normally the name of the option is printed on the left-hand side of
+the output and the help text is printed on the right.  However, if the
+help text contains a tab character, the text to the left of the tab is
+used instead of the option's name and the text to the right of the
+tab forms the help text.  This allows you to elaborate on what type
+of argument the option takes.
+
+@node Option properties
+@section Option properties
+
+The second field of an option record can specify the following properties:
+
+@table @code
+@item Common
+The option is available for all languages and targets.
+
+@item Target
+The option is available for all languages but is target-specific.
+
+@item @var{language}
+The option is available when compiling for the given language.
+
+It is possible to specify several different languages for the same
+option.  Each @var{language} must have been declared by an earlier
+@code{Language} record.  @xref{Option file format}.
+
+@item RejectNegative
+The option does not have a ``no-'' form.  All options beginning with
+``f'', ``W'' or ``m'' are assumed to have a ``no-'' form unless this
+property is used.
+
+@item Joined
+@itemx Separate
+The option takes a mandatory argument.  @code{Joined} indicates
+that the option and argument can be included in the same @code{argv}
+entry (as with @code{-mflush-func=@var{name}}, for example).
+@code{Separate} indicates that the option and argument can be
+separate @code{argv} entries (as with @code{-o}).  An option is
+allowed to have both of these properties.
+
+@item JoinedOrMissing
+The option takes an optional argument.  If the argument is given,
+it will be part of the same @code{argv} entry as the option itself.
+
+This property cannot be used alongside @code{Joined} or @code{Separate}.
+
+@item UInteger
+The option's argument is a non-negative integer.  The option parser
+will check and convert the argument before passing it to the relevant
+option handler.
+
+@item Var(@var{var})
+The option controls an integer variable @var{var}.  If the option has
+the @code{UInteger} property, the option parser will set @var{var} to
+the value of the user-specified argument.  Otherwise the option is
+assumed to be an on/off switch that is active when @var{var} is nonzero.
+In this case, the option parser will set @var{var} to 1 when the positive
+form of the option is used and 0 when the ``no-'' form is used.
+
+The option-processing script will usually declare @var{var} in
+@file{options.c} and leave it to be zero-initialized at start-up time.
+You can modify this behavior using @code{VarExists} and @code{Init}.
+
+@item Var(@var{var}, @var{set})
+The option controls an integer variable @var{var} and is active when
+@var{var} equals @var{set}.  The option parser will set @var{var} to
+@var{set} when the positive form of the option is used and @code{!@var{set}}
+when the ``no-'' form is used.
+
+@var{var} is declared in the same way as for the single-argument form
+described above.
+
+@item VarExists
+The variable specified by the @code{Var} property already exists.
+No definition should be added to @file{options.c} in response to
+this option record.
+
+You should use this property if an earlier option has already declared
+the variable or if the variable is declared outside @file{options.c}.
+
+@item Init(@var{value})
+The variable specified by the @code{Var} property should be statically
+initialized to @var{value}.
+
+@item Mask(@var{name})
+The option is associated with a bit in the @code{target_flags} variable
+(@pxref{Run-time Target}) and is active when that bit is set.
+
+The options-processing script will automatically allocate a unique
+bit for the option and set the macro @code{MASK_@var{name}} to the
+appropriate bitmask.  It will also declare a @code{TARGET_@var{name}}
+macro that has the value 1 when the option is active and 0 otherwise.
+
+@item InverseMask(@var{othername})
+@itemx InverseMask(@var{othername}, @var{thisname})
+The option is the inverse of another option that has the
+@code{Mask(@var{othername})} property.  If @var{thisname} is given,
+the options-processing script will declare a @code{TARGET_@var{thisname}}
+macro that is 1 when the option is active and 0 otherwise.
+
+@item Report
+The state of the option should be printed by @option{-fverbose-asm}.
+
+@item Undocumented
+The option is deliberately missing documentation and should not
+be included in the @option{--help} output.
+@end table
index edb61b1..128322d 100644 (file)
@@ -652,9 +652,7 @@ Move to the stage directory files not included in @code{stagestuff} in
 
 @item lang.opt
 This file registers the set of switches that the front end accepts on
-the command line, and their @option{--help} text.  The file format is
-documented in the file @file{c.opt}.  These files are processed by the
-script @file{opts.sh}.
+the command line, and their @option{--help} text.  @xref{Options}.
 @item lang-specs.h
 This file provides entries for @code{default_compilers} in
 @file{gcc.c} which override the default of giving an error that a
@@ -746,6 +744,11 @@ If necessary, a file @file{@var{machine}-modes.def} in the
 @file{@var{machine}} directory, containing additional machine modes to
 represent condition codes.  @xref{Condition Code}, for further details.
 @item
+An optional @file{@var{machine}.opt} file in the @file{@var{machine}}
+directory, containing a list of target-specific options.  You can also
+add other option files using the @code{extra_options} variable in
+@file{config.gcc}.  @xref{Options}.
+@item
 Entries in @file{config.gcc} (@pxref{System Config, , The
 @file{config.gcc} File}) for the systems with this target
 architecture.
index 0a67353..aa5c929 100644 (file)
@@ -721,9 +721,35 @@ it yourself.
 @end defmac
 
 @deftypevar {extern int} target_flags
-This declaration should be present.
+This variable is declared in @file{options.h}, which is included before
+any target-specific headers.
 @end deftypevar
 
+@deftypevar {Target Hook} int TARGET_DEFAULT_TARGET_FLAGS
+This variable specifies the initial value of @code{target_flags}.
+Its default setting is 0.
+
+If the target defines @code{TARGET_SWITCHES}, the null
+@code{TARGET_SWITCHES} entry will override this value.
+@end deftypevar
+
+@deftypefn {Target Hook} bool TARGET_HANDLE_OPTION (size_t @var{code}, const char *@var{arg}, int @var{value})
+This hook is called whenever the user specifies one of the
+target-specific options described by the @file{.opt} definition files
+(@pxref{Options}).  It has the opportunity to do some option-specific
+processing and should return true if the option is valid.  The default
+definition does nothing but return true.
+
+@var{code} specifies the @code{OPT_@var{name}} enumeration value
+associated with the selected option; @var{name} is just a rendering of
+the option name in which non-alphanumeric characters are replaced by
+underscores.  @var{arg} specifies the string argument and is null if
+no argument was given.  If the option is flagged as a @code{UInteger}
+(@pxref{Option properties}), @var{value} is the numeric value of the
+argument.  Otherwise @var{value} is 1 if the positive form of the
+option was used and 0 if the ``no-'' form was.
+@end deftypefn
+
 @cindex optional hardware or system features
 @cindex features, optional, in system conventions
 
@@ -792,6 +818,10 @@ with opposite meanings, and picks the latter as the default:
     @{ "", MASK_68020, "" @},          \
   @}
 @end smallexample
+
+This macro is being kept for compatibility with older backends.
+New targets should use option definition files instead.
+@xref{Back End}.
 @end defmac
 
 @defmac TARGET_OPTIONS
@@ -861,6 +891,10 @@ extern char *chip_alu;
 #define TARGET_ALU1 (chip_alu[0] == '1')
 #define TARGET_ALU2 (chip_alu[0] == '2')
 @end smallexample
+
+This macro is being kept for compatibility with older backends.
+New targets should use option definition files instead.
+@xref{Back End}.
 @end defmac
 
 @defmac TARGET_VERSION
index d091583..fc59b97 100644 (file)
@@ -102,6 +102,14 @@ hook_bool_constcharptr_size_t_false (const char *a ATTRIBUTE_UNUSED,
 }
 
 bool
+hook_bool_size_t_constcharptr_int_true (size_t a ATTRIBUTE_UNUSED,
+                                       const char *b ATTRIBUTE_UNUSED,
+                                       int c ATTRIBUTE_UNUSED)
+{
+  return true;
+}
+
+bool
 default_can_output_mi_thunk_no_vcall (tree a ATTRIBUTE_UNUSED,
                                      HOST_WIDE_INT b ATTRIBUTE_UNUSED,
                                      HOST_WIDE_INT c,
index b0f47b7..a4a3804 100644 (file)
@@ -38,6 +38,7 @@ extern bool hook_bool_rtx_false (rtx);
 extern bool hook_bool_uintp_uintp_false (unsigned int *, unsigned int *);
 extern bool hook_bool_rtx_int_int_intp_false (rtx, int, int, int *);
 extern bool hook_bool_constcharptr_size_t_false (const char *, size_t);
+extern bool hook_bool_size_t_constcharptr_int_true (size_t, const char *, int);
 
 extern void hook_void_void (void);
 extern void hook_void_constcharptr (const char *);
index a21f29d..35ab445 100644 (file)
 
 # Some common subroutines for use by opt[ch]-gen.awk.
 
+# If FLAGS contains a "NAME(...argument...)" flag, return the value
+# of the argument.  Return the empty string otherwise.
+function opt_args(name, flags)
+{
+       flags = " " flags
+       if (flags !~ " " name "\\(")
+               return ""
+       sub(".* " name "\\(", "", flags)
+       sub("\\).*", "", flags)
+
+       return flags
+}
+
+# Return the Nth comma-separated element of S.  Return the empty string
+# if S does not contain N elements.
+function nth_arg(n, s)
+{
+       while (n-- > 0) {
+               if (s !~ ",")
+                       return ""
+               sub("[^,]*, *", "", s)
+       }
+       sub(",.*", "", s)
+       return s
+}
+
+# Return a bitmask of CL_* values for option flags FLAGS.
 function switch_flags (flags)
 {
        flags = " " flags " "
@@ -29,6 +56,7 @@ function switch_flags (flags)
                        result = result " | " macros[j]
        }
        if (flags ~ " Common ") result = result " | CL_COMMON"
+       if (flags ~ " Target ") result = result " | CL_TARGET"
        if (flags ~ " Joined ") result = result " | CL_JOINED"
        if (flags ~ " JoinedOrMissing ") \
            result = result " | CL_JOINED | CL_MISSING_OK"
@@ -41,36 +69,39 @@ function switch_flags (flags)
        return result
 }
 
-function var_args(flags)
-{
-       if (flags !~ "Var\\(")
-           return ""
-       sub(".*Var\\(", "", flags)
-       sub("\\).*", "", flags)
-
-       return flags
-}
+# If FLAGS includes a Var flag, return the name of the variable it specifies.
+# Return the empty string otherwise.
 function var_name(flags)
 {
-       s = var_args(flags)
-       if (s == "")
-               return "";
-       sub( ",.*", "", s)
-       return s
+       return nth_arg(0, opt_args("Var", flags))
 }
+
+# Given that an option has flags FLAGS, return an initializer for the
+# "var_cond" and "var_value" fields of its cl_options[] entry.
 function var_set(flags)
 {
-       s = var_args(flags)
-       if (s !~ ",")
-               return "0, 0"
-       sub( "[^,]*,", "", s)
-       return "1, " s
+       s = nth_arg(1, opt_args("Var", flags))
+       if (s != "")
+               return "CLVC_EQUAL, " s
+       s = opt_args("Mask", flags);
+       if (s != "")
+               return "CLVC_BIT_SET, MASK_" s
+       s = nth_arg(0, opt_args("InverseMask", flags));
+       if (s != "")
+               return "CLVC_BIT_CLEAR, MASK_" s
+       return "CLVC_BOOLEAN, 0"
 }
+
+# Given that an option has flags FLAGS, return an initializer for the
+# "flag_var" field of its cl_options[] entry.
 function var_ref(flags)
 {
        name = var_name(flags)
-       if (name == "")
-               return "0"
-       else
+       if (name != "")
                return "&" name
+       if (opt_args("Mask", flags) != "")
+               return "&target_flags"
+       if (opt_args("InverseMask", flags) != "")
+               return "&target_flags"
+       return "0"
 }
index 6cea944..83d1934 100644 (file)
@@ -53,6 +53,7 @@ print ""
 print "#ifndef OPTIONS_H"
 print "#define OPTIONS_H"
 print ""
+print "extern int target_flags;"
 
 for (i = 0; i < n_opts; i++) {
        name = var_name(flags[i]);
@@ -66,6 +67,31 @@ for (i = 0; i < n_opts; i++) {
 
     }
 
+masknum = 0
+for (i = 0; i < n_opts; i++) {
+       name = opt_args("Mask", flags[i])
+       if (name != "")
+               print "#define MASK_" name " (1 << " masknum++ ")"
+}
+if (masknum > 31)
+       print "#error too many target masks"
+print ""
+
+for (i = 0; i < n_opts; i++) {
+       name = opt_args("Mask", flags[i])
+       if (name != "")
+               print "#define TARGET_" name \
+                     " ((target_flags & MASK_" name ") != 0)"
+}
+print ""
+
+for (i = 0; i < n_opts; i++) {
+       opt = opt_args("InverseMask", flags[i])
+       if (opt ~ ",")
+               print "#define TARGET_" nth_arg(1, opt) \
+                     " ((target_flags & MASK_" nth_arg(0, opt) ") == 0)"
+}
+print ""
 
 for (i = 0; i < n_langs; i++) {
        macros[i] = "CL_" langs[i]
index c694001..3361c9f 100644 (file)
@@ -112,7 +112,6 @@ static void handle_options (unsigned int, const char **, unsigned int);
 static void wrap_help (const char *help, const char *item, unsigned int);
 static void print_help (void);
 static void print_param_help (void);
-static void print_filtered_help (unsigned int flag);
 static unsigned int print_switch (const char *text, unsigned int indent);
 static void set_debug_level (enum debug_info_type type, int extended,
                             const char *arg);
@@ -277,10 +276,12 @@ handle_option (const char **argv, unsigned int lang_mask)
 
   opt = argv[0];
 
-  /* Drop the "no-" from negative switches.  */
-  if ((opt[1] == 'W' || opt[1] == 'f')
+  opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
+  if (opt_index == cl_options_count
+      && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
       && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
     {
+      /* Drop the "no-" from negative switches.  */
       size_t len = strlen (opt) - 3;
 
       dup = xmalloc (len + 1);
@@ -289,9 +290,9 @@ handle_option (const char **argv, unsigned int lang_mask)
       memcpy (dup + 2, opt + 5, len - 2 + 1);
       opt = dup;
       value = 0;
+      opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
     }
 
-  opt_index = find_opt (opt + 1, lang_mask | CL_COMMON);
   if (opt_index == cl_options_count)
     goto done;
 
@@ -335,7 +336,7 @@ handle_option (const char **argv, unsigned int lang_mask)
 
   /* Now we've swallowed any potential argument, complain if this
      is a switch for a different front end.  */
-  if (!(option->flags & (lang_mask | CL_COMMON)))
+  if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
     {
       complain_wrong_lang (argv[0], option, lang_mask);
       goto done;
@@ -361,17 +362,26 @@ handle_option (const char **argv, unsigned int lang_mask)
     }
 
   if (option->flag_var)
-    {
-      if (option->has_set_value)
-       {
-         if (value)
-           *option->flag_var = option->set_value;
-         else
-           *option->flag_var = !option->set_value;
-       }
-      else
+    switch (option->var_cond)
+      {
+      case CLVC_BOOLEAN:
        *option->flag_var = value;
-    }
+       break;
+
+      case CLVC_EQUAL:
+       *option->flag_var = value ? option->var_value : !option->var_value;
+       break;
+
+      case CLVC_BIT_CLEAR:
+      case CLVC_BIT_SET:
+       if ((value != 0) == (option->var_cond == CLVC_BIT_SET))
+         *option->flag_var |= option->var_value;
+       else
+         *option->flag_var &= ~option->var_value;
+       if (option->flag_var == &target_flags)
+         target_flags_explicit |= option->var_value;
+       break;
+      }
   
   if (option->flags & lang_mask)
     if (lang_hooks.handle_option (opt_index, arg, value) == 0)
@@ -381,6 +391,10 @@ handle_option (const char **argv, unsigned int lang_mask)
     if (common_handle_option (opt_index, arg, value) == 0)
       result = 0;
 
+  if (result && (option->flags & CL_TARGET))
+    if (!targetm.handle_option (opt_index, arg, value))
+      result = 0;
+
  done:
   if (dup)
     free (dup);
@@ -591,7 +605,7 @@ decode_options (unsigned int argc, const char **argv)
 
   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
      modify it.  */
-  target_flags = 0;
+  target_flags = targetm.default_target_flags;
   set_target_switch ("");
 
   /* Unwind tables are always present when a target has ABI-specified unwind
@@ -1223,7 +1237,7 @@ print_param_help (void)
 }
 
 /* Print help for a specific front-end, etc.  */
-static void
+void
 print_filtered_help (unsigned int flag)
 {
   unsigned int i, len, filter, indent = 0;
@@ -1231,7 +1245,7 @@ print_filtered_help (unsigned int flag)
   const char *help, *opt, *tab;
   static char *printed;
 
-  if (flag == CL_COMMON)
+  if (flag == CL_COMMON || flag == CL_TARGET)
     {
       filter = flag;
       if (!printed)
@@ -1378,3 +1392,27 @@ wrap_help (const char *help, const char *item, unsigned int item_width)
     }
   while (remaining);
 }
+
+/* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
+   a simple on-off switch.  */
+
+int
+option_enabled (const struct cl_option *option)
+{
+  if (option->flag_var)
+    switch (option->var_cond)
+      {
+      case CLVC_BOOLEAN:
+       return *option->flag_var != 0;
+
+      case CLVC_EQUAL:
+       return *option->flag_var == option->var_value;
+
+      case CLVC_BIT_CLEAR:
+       return (*option->flag_var & option->var_value) == 0;
+
+      case CLVC_BIT_SET:
+       return (*option->flag_var & option->var_value) != 0;
+      }
+  return -1;
+}
index e1e921b..de1fe31 100644 (file)
@@ -21,7 +21,20 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #ifndef GCC_OPTS_H
 #define GCC_OPTS_H
 
-extern void decode_options (unsigned int argc, const char **argv);
+/* Specifies how a switch's VAR_VALUE relates to its FLAG_VAR.  */
+enum cl_var_cond {
+  /* The switch is enabled when FLAG_VAR is nonzero.  */
+  CLVC_BOOLEAN,
+
+  /* The switch is enabled when FLAG_VAR == VAR_VALUE.  */
+  CLVC_EQUAL,
+
+  /* The switch is enabled when VAR_VALUE is not set in FLAG_VAR.  */
+  CLVC_BIT_CLEAR,
+
+  /* The switch is enabled when VAR_VALUE is set in FLAG_VAR.  */
+  CLVC_BIT_SET
+};
 
 struct cl_option
 {
@@ -31,14 +44,15 @@ struct cl_option
   unsigned char opt_len;
   unsigned int flags;
   int *flag_var;
-  int has_set_value;
-  int set_value;
+  enum cl_var_cond var_cond;
+  int var_value;
 };
 
 extern const struct cl_option cl_options[];
 extern const unsigned int cl_options_count;
 extern const char *const lang_names[];
 
+#define CL_TARGET              (1 << 22) /* Target-specific option.  */
 #define CL_REPORT              (1 << 23) /* Report argument with -fverbose-asm  */
 #define CL_JOINED              (1 << 24) /* If takes joined argument.  */
 #define CL_SEPARATE            (1 << 25) /* If takes a separate argument.  */
@@ -56,4 +70,8 @@ extern const char **in_fnames;
 
 extern unsigned num_in_fnames;
 
+extern void decode_options (unsigned int argc, const char **argv);
+extern int option_enabled (const struct cl_option *);
+extern void print_filtered_help (unsigned int);
+
 #endif
index 0a072a5..e4e2b36 100644 (file)
@@ -278,6 +278,10 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #define TARGET_VECTORIZE                                                \
   {TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD}
 
+#define TARGET_DEFAULT_TARGET_FLAGS 0
+
+#define TARGET_HANDLE_OPTION hook_bool_size_t_constcharptr_int_true
+
 /* In except.c */
 #define TARGET_EH_RETURN_FILTER_MODE  default_eh_return_filter_mode
 
@@ -485,6 +489,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   TARGET_ASM_OUT,                              \
   TARGET_SCHED,                                        \
   TARGET_VECTORIZE,                            \
+  TARGET_DEFAULT_TARGET_FLAGS,                 \
+  TARGET_HANDLE_OPTION,                                \
   TARGET_EH_RETURN_FILTER_MODE,                        \
   TARGET_MERGE_DECL_ATTRIBUTES,                        \
   TARGET_MERGE_TYPE_ATTRIBUTES,                        \
index b43517b..3513550 100644 (file)
@@ -291,6 +291,16 @@ struct gcc_target
     tree (* builtin_mask_for_load) (void);
   } vectorize;
 
+  /* The initial value of target_flags.  */
+  int default_target_flags;
+
+  /* Handle target switch CODE (an OPT_* value).  ARG is the argument
+     passed to the switch; it is NULL if no argument was.  VALUE is the
+     value of ARG if CODE specifies a UInteger option, otherwise it is
+     1 if the positive form of the switch was used and 0 if the negative
+     form was.  Return true if the switch was valid.  */
+  bool (* handle_option) (size_t code, const char *arg, int value);
+
   /* Return machine mode for filter value.  */
   enum machine_mode (* eh_return_filter_mode) (void);
 
index e7947eb..04b02bc 100644 (file)
@@ -374,6 +374,7 @@ static const param_info lang_independent_params[] = {
   { NULL, 0, 0, 0, NULL }
 };
 
+#ifdef TARGET_SWITCHES
 /* Here is a table, controlled by the tm.h file, listing each -m switch
    and which bits in `target_switches' it should set or clear.
    If VALUE is positive, it is bits to set.
@@ -387,6 +388,7 @@ static const struct
   const char *const description;
 }
 target_switches[] = TARGET_SWITCHES;
+#endif
 
 /* This table is similar, but allows the switch to have a value.  */
 
@@ -1066,6 +1068,7 @@ void
 display_target_options (void)
 {
   int undoc, i;
+  unsigned int cli;
   static bool displayed = false;
 
   /* Avoid double printing for --help --target-help.  */
@@ -1074,18 +1077,26 @@ display_target_options (void)
 
   displayed = true;
 
-  if (ARRAY_SIZE (target_switches) > 1
+  for (cli = 0; cli < cl_options_count; cli++)
+    if ((cl_options[cli].flags & (CL_TARGET | CL_UNDOCUMENTED)) == CL_TARGET)
+      break;
+
+  if (cli < cl_options_count
+#ifdef TARGET_SWITCHES
+      || ARRAY_SIZE (target_switches) > 1
+#endif
 #ifdef TARGET_OPTIONS
       || ARRAY_SIZE (target_options) > 1
 #endif
       )
     {
-      int doc = 0;
+      int doc = cli < cl_options_count;
 
       undoc = 0;
 
       printf (_("\nTarget specific options:\n"));
 
+#ifdef TARGET_SWITCHES
       for (i = ARRAY_SIZE (target_switches); i--;)
        {
          const char *option      = target_switches[i].name;
@@ -1103,6 +1114,7 @@ display_target_options (void)
          else if (*description != 0)
            doc += printf ("  -m%-23s %s\n", option, _(description));
        }
+#endif
 
 #ifdef TARGET_OPTIONS
       for (i = ARRAY_SIZE (target_options); i--;)
@@ -1123,6 +1135,7 @@ display_target_options (void)
            doc += printf ("  -m%-23s %s\n", option, _(description));
        }
 #endif
+      print_filtered_help (CL_TARGET);
       if (undoc)
        {
          if (doc)
@@ -1189,9 +1202,12 @@ const char *const debug_type_names[] =
 void
 set_target_switch (const char *name)
 {
+#if defined (TARGET_SWITCHES) || defined (TARGET_OPTIONS)
   size_t j;
+#endif
   int valid_target_option = 0;
 
+#ifdef TARGET_SWITCHES
   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
     if (!strcmp (target_switches[j].name, name))
       {
@@ -1208,6 +1224,7 @@ set_target_switch (const char *name)
          }
        valid_target_option = 1;
       }
+#endif
 
 #ifdef TARGET_OPTIONS
   if (!valid_target_option)
@@ -1233,7 +1250,7 @@ set_target_switch (const char *name)
       }
 #endif
 
-  if (!valid_target_option)
+  if (name[0] != 0 && !valid_target_option)
     error ("invalid option %qs", name);
 }
 
@@ -1340,28 +1357,14 @@ print_switch_values (FILE *file, int pos, int max,
                             _("options enabled: "), "");
 
   for (j = 0; j < cl_options_count; j++)
-    {
-      if (!cl_options[j].flag_var
-         || !(cl_options[j].flags & CL_REPORT))
-       continue;
-
-      if (cl_options[j].has_set_value)
-       {
-         if (*cl_options[j].flag_var != cl_options[j].set_value)
-           continue;
-       }
-      else
-       {
-         if (!*cl_options[j].flag_var)
-           continue;
-       }
-      
+    if ((cl_options[j].flags & CL_REPORT)
+       && option_enabled (&cl_options[j]) > 0)
       pos = print_single_switch (file, pos, max, indent, sep, term,
                                 "", cl_options[j].opt_text);
-    }
 
   /* Print target specific options.  */
 
+#ifdef TARGET_SWITCHES
   for (j = 0; j < ARRAY_SIZE (target_switches); j++)
     if (target_switches[j].name[0] != '\0'
        && target_switches[j].value > 0
@@ -1371,6 +1374,7 @@ print_switch_values (FILE *file, int pos, int max,
        pos = print_single_switch (file, pos, max, indent, sep, term,
                                   "-m", target_switches[j].name);
       }
+#endif
 
 #ifdef TARGET_OPTIONS
   for (j = 0; j < ARRAY_SIZE (target_options); j++)
@@ -1497,12 +1501,13 @@ default_pch_valid_p (const void *data_p, size_t len)
   /* Check target_flags.  */
   if (memcmp (data, &target_flags, sizeof (target_flags)) != 0)
     {
+      int tf;
+
+      memcpy (&tf, data, sizeof (target_flags));
+#ifdef TARGET_SWITCHES
       for (i = 0; i < ARRAY_SIZE (target_switches); i++)
        {
          int bits;
-         int tf;
-
-         memcpy (&tf, data, sizeof (target_flags));
 
          bits = target_switches[i].value;
          if (bits < 0)
@@ -1513,6 +1518,14 @@ default_pch_valid_p (const void *data_p, size_t len)
              goto make_message;
            }
        }
+#endif
+      for (i = 0; i < cl_options_count; i++)
+       if (cl_options[i].flag_var == &target_flags
+           && (cl_options[i].var_value & (target_flags ^ tf)) != 0)
+         {
+           flag_that_differs = cl_options[i].opt_text + 2;
+           goto make_message;
+         }
       gcc_unreachable ();
     }
   data += sizeof (target_flags);