config.gcc (extra_options): New variable for listing option files.
* 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. From-SVN: r96448
This commit is contained in:
parent
3a3b81e73f
commit
7568579261
|
@ -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
|
||||
|
|
|
@ -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) \
|
|||
#
|
||||
# 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
|
||||
|
||||
|
|
45
gcc/c.opt
45
gcc/c.opt
|
@ -19,51 +19,6 @@
|
|||
; 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
|
||||
|
|
|
@ -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-*-*)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -101,6 +101,14 @@ hook_bool_constcharptr_size_t_false (const char *a ATTRIBUTE_UNUSED,
|
|||
return false;
|
||||
}
|
||||
|
||||
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,
|
||||
|
|
|
@ -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 *);
|
||||
|
|
|
@ -18,6 +18,33 @@
|
|||
|
||||
# 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"
|
||||
}
|
||||
|
|
|
@ -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]
|
||||
|
|
70
gcc/opts.c
70
gcc/opts.c
|
@ -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,16 +362,25 @@ handle_option (const char **argv, unsigned int lang_mask)
|
|||
}
|
||||
|
||||
if (option->flag_var)
|
||||
switch (option->var_cond)
|
||||
{
|
||||
if (option->has_set_value)
|
||||
{
|
||||
if (value)
|
||||
*option->flag_var = option->set_value;
|
||||
else
|
||||
*option->flag_var = !option->set_value;
|
||||
}
|
||||
else
|
||||
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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
24
gcc/opts.h
24
gcc/opts.h
|
@ -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
|
||||
|
|
|
@ -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, \
|
||||
|
|
10
gcc/target.h
10
gcc/target.h
|
@ -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);
|
||||
|
||||
|
|
59
gcc/toplev.c
59
gcc/toplev.c
|
@ -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)
|
||||
{
|
||||
for (i = 0; i < ARRAY_SIZE (target_switches); i++)
|
||||
{
|
||||
int bits;
|
||||
int tf;
|
||||
|
||||
memcpy (&tf, data, sizeof (target_flags));
|
||||
#ifdef TARGET_SWITCHES
|
||||
for (i = 0; i < ARRAY_SIZE (target_switches); i++)
|
||||
{
|
||||
int bits;
|
||||
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue