Commit 14c7833c by H.J. Lu Committed by H.J. Lu

re PR target/26885 (-m64 -m32 no longer creates 32-bit object)

gcc/

2006-05-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR driver/26885
	* Makefile.in (GCC_OBJS): New.
	(OBJS-common): Add opts-common.o.
	(xgcc$(exeext)): Replace gcc.o with $(GCC_OBJS).
	(cpp$(exeext)): Likewise.
	(gcc.o): Also depend on opts.h.
	(opts-common.o): New.

	* common.opt (gcoff): Add Negative(gdwarf-2).
	(gdwarf-2): Add Negative(gstabs).
	(gstabs): Add Negative(gstabs+).
	(gstabs+): Add Negative(gvms).
	(gvms): Add Negative(gxcoff).
	(gxcoff): Add Negative(gxcoff+).
	(gxcoff+): Add Negative(gcoff).
	* config/i386/i386.opt (m32): Add Negative(m64).
	(m64): Add Negative(m32).

	* doc/options.texi: Document the Negative option.

	* gcc.c: Include "opts.h".
	(main): Call prune_options after expandargv.

	* optc-gen.awk: Generate common declarations for all flag
	variables in options.c. Output the neg_index field.

	* opts.c (find_opt): Moved to ...
	* opts-common.c: Here. New file.

	* opts.h (cl_option): Add a neg_index field.
	(find_opt): New.
	(prune_options): Likewise.

gcc/cp/

2006-05-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR driver/26885
	* Make-lang.in (GXX_OBJS): Replace gcc.o with $(GCC_OBJS).

gcc/fortran/

2006-05-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR driver/26885
	* Make-lang.in (GFORTRAN_D_OBJS): Replace gcc.o with
	$(GCC_OBJS).

gcc/java/

2006-05-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR driver/26885
	* Make-lang.in ($(GCJ)$(exeext)): Replace gcc.o with
	$(GCC_OBJS).

gcc/treelang/

2006-05-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR driver/26885
	* Make-lang.in (gtreelang$(exeext)): Replace gcc.o with
	$(GCC_OBJS).

From-SVN: r113824
parent b570947c
2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
PR driver/26885
* Makefile.in (GCC_OBJS): New.
(OBJS-common): Add opts-common.o.
(xgcc$(exeext)): Replace gcc.o with $(GCC_OBJS).
(cpp$(exeext)): Likewise.
(gcc.o): Also depend on opts.h.
(opts-common.o): New.
* common.opt (gcoff): Add Negative(gdwarf-2).
(gdwarf-2): Add Negative(gstabs).
(gstabs): Add Negative(gstabs+).
(gstabs+): Add Negative(gvms).
(gvms): Add Negative(gxcoff).
(gxcoff): Add Negative(gxcoff+).
(gxcoff+): Add Negative(gcoff).
* config/i386/i386.opt (m32): Add Negative(m64).
(m64): Add Negative(m32).
* doc/options.texi: Document the Negative option.
* gcc.c: Include "opts.h".
(main): Call prune_options after expandargv.
* optc-gen.awk: Generate common declarations for all flag
variables in options.c. Output the neg_index field.
* opts.c (find_opt): Moved to ...
* opts-common.c: Here. New file.
* opts.h (cl_option): Add a neg_index field.
(find_opt): New.
(prune_options): Likewise.
2006-05-16 Jakub Jelinek <jakub@redhat.com> 2006-05-16 Jakub Jelinek <jakub@redhat.com>
PR middle-end/27573 PR middle-end/27573
......
...@@ -947,6 +947,9 @@ C_TARGET_OBJS=@c_target_objs@ ...@@ -947,6 +947,9 @@ C_TARGET_OBJS=@c_target_objs@
# Target specific, C++ specific object file # Target specific, C++ specific object file
CXX_TARGET_OBJS=@cxx_target_objs@ CXX_TARGET_OBJS=@cxx_target_objs@
# Object files for gcc driver.
GCC_OBJS = gcc.o opts-common.o options.o
# Language-specific object files for C and Objective C. # Language-specific object files for C and Objective C.
C_AND_OBJC_OBJS = attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o \ C_AND_OBJC_OBJS = attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o \
c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \ c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \
...@@ -988,7 +991,7 @@ OBJS-common = \ ...@@ -988,7 +991,7 @@ OBJS-common = \
haifa-sched.o hooks.o ifcvt.o insn-attrtab.o insn-emit.o insn-modes.o \ haifa-sched.o hooks.o ifcvt.o insn-attrtab.o insn-emit.o insn-modes.o \
insn-extract.o insn-opinit.o insn-output.o insn-peep.o insn-recog.o \ insn-extract.o insn-opinit.o insn-output.o insn-peep.o insn-recog.o \
integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \ integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \
mode-switching.o modulo-sched.o optabs.o options.o opts.o \ mode-switching.o modulo-sched.o optabs.o options.o opts.o opts-common.o \
params.o postreload.o postreload-gcse.o predict.o \ params.o postreload.o postreload-gcse.o predict.o \
insn-preds.o insn-automata.o pointer-set.o \ insn-preds.o insn-automata.o pointer-set.o \
print-rtl.o print-tree.o profile.o value-prof.o var-tracking.o \ print-rtl.o print-tree.o profile.o value-prof.o var-tracking.o \
...@@ -1292,18 +1295,18 @@ libbackend.a: $(OBJS@onestep@) ...@@ -1292,18 +1295,18 @@ libbackend.a: $(OBJS@onestep@)
# We call this executable `xgcc' rather than `gcc' # We call this executable `xgcc' rather than `gcc'
# to avoid confusion if the current directory is in the path # to avoid confusion if the current directory is in the path
# and CC is `gcc'. It is renamed to `gcc' when it is installed. # and CC is `gcc'. It is renamed to `gcc' when it is installed.
xgcc$(exeext): gcc.o gccspec.o version.o intl.o prefix.o \ xgcc$(exeext): $(GCC_OBJS) gccspec.o version.o intl.o prefix.o \
version.o $(LIBDEPS) $(EXTRA_GCC_OBJS) version.o $(LIBDEPS) $(EXTRA_GCC_OBJS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ gcc.o gccspec.o intl.o \ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(GCC_OBJS) gccspec.o \
prefix.o version.o $(EXTRA_GCC_OBJS) $(LIBS) intl.o prefix.o version.o $(EXTRA_GCC_OBJS) $(LIBS)
# cpp is to cpp0 as gcc is to cc1. # cpp is to cpp0 as gcc is to cc1.
# The only difference from xgcc is that it's linked with cppspec.o # The only difference from xgcc is that it's linked with cppspec.o
# instead of gccspec.o. # instead of gccspec.o.
cpp$(exeext): gcc.o cppspec.o version.o intl.o prefix.o \ cpp$(exeext): $(GCC_OBJS) cppspec.o version.o intl.o prefix.o \
version.o $(LIBDEPS) $(EXTRA_GCC_OBJS) version.o $(LIBDEPS) $(EXTRA_GCC_OBJS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ gcc.o cppspec.o intl.o \ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(GCC_OBJS) cppspec.o \
prefix.o version.o $(EXTRA_GCC_OBJS) $(LIBS) intl.o prefix.o version.o $(EXTRA_GCC_OBJS) $(LIBS)
# Create links to binutils, especially for in-tree builds, to make -B. # Create links to binutils, especially for in-tree builds, to make -B.
# use them. We need hard links so that directories can be shuffled # use them. We need hard links so that directories can be shuffled
...@@ -1700,7 +1703,7 @@ DRIVER_DEFINES = \ ...@@ -1700,7 +1703,7 @@ DRIVER_DEFINES = \
gcc.o: gcc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h multilib.h \ gcc.o: gcc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h multilib.h \
Makefile $(lang_specs_files) specs.h prefix.h $(GCC_H) $(FLAGS_H) \ Makefile $(lang_specs_files) specs.h prefix.h $(GCC_H) $(FLAGS_H) \
configargs.h $(OBSTACK_H) configargs.h $(OBSTACK_H) opts.h
(SHLIB_LINK='$(SHLIB_LINK)' \ (SHLIB_LINK='$(SHLIB_LINK)' \
SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \ SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \
...@@ -2117,6 +2120,8 @@ opts.o : opts.c opts.h options.h toplev.h $(CONFIG_H) $(SYSTEM_H) \ ...@@ -2117,6 +2120,8 @@ opts.o : opts.c opts.h options.h toplev.h $(CONFIG_H) $(SYSTEM_H) \
coretypes.h $(TREE_H) $(TM_H) langhooks.h $(GGC_H) $(RTL_H) \ coretypes.h $(TREE_H) $(TM_H) langhooks.h $(GGC_H) $(RTL_H) \
output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \ output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \
$(FLAGS_H) $(PARAMS_H) tree-pass.h $(FLAGS_H) $(PARAMS_H) tree-pass.h
opts-common.o : opts-common.c opts.h $(CONFIG_H) $(SYSTEM_H) \
coretypes.h intl.h
targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \ targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
$(EXPR_H) $(TM_H) $(RTL_H) $(TM_P_H) $(FUNCTION_H) output.h toplev.h \ $(EXPR_H) $(TM_H) $(RTL_H) $(TM_P_H) $(FUNCTION_H) output.h toplev.h \
$(MACHMODE_H) $(TARGET_DEF_H) $(TARGET_H) $(GGC_H) gt-targhooks.h $(MACHMODE_H) $(TARGET_DEF_H) $(TARGET_H) $(GGC_H) gt-targhooks.h
......
...@@ -1088,11 +1088,11 @@ Common JoinedOrMissing ...@@ -1088,11 +1088,11 @@ Common JoinedOrMissing
Generate debug information in default format Generate debug information in default format
gcoff gcoff
Common JoinedOrMissing Common JoinedOrMissing Negative(gdwarf-2)
Generate debug information in COFF format Generate debug information in COFF format
gdwarf-2 gdwarf-2
Common JoinedOrMissing Common JoinedOrMissing Negative(gstabs)
Generate debug information in DWARF v2 format Generate debug information in DWARF v2 format
ggdb ggdb
...@@ -1100,23 +1100,23 @@ Common JoinedOrMissing ...@@ -1100,23 +1100,23 @@ Common JoinedOrMissing
Generate debug information in default extended format Generate debug information in default extended format
gstabs gstabs
Common JoinedOrMissing Common JoinedOrMissing Negative(gstabs+)
Generate debug information in STABS format Generate debug information in STABS format
gstabs+ gstabs+
Common JoinedOrMissing Common JoinedOrMissing Negative(gvms)
Generate debug information in extended STABS format Generate debug information in extended STABS format
gvms gvms
Common JoinedOrMissing Common JoinedOrMissing Negative(gxcoff)
Generate debug information in VMS format Generate debug information in VMS format
gxcoff gxcoff
Common JoinedOrMissing Common JoinedOrMissing Negative(gxcoff+)
Generate debug information in XCOFF format Generate debug information in XCOFF format
gxcoff+ gxcoff+
Common JoinedOrMissing Common JoinedOrMissing Negative(gcoff)
Generate debug information in extended XCOFF format Generate debug information in extended XCOFF format
o o
......
...@@ -24,7 +24,7 @@ Target RejectNegative Report Mask(128BIT_LONG_DOUBLE) ...@@ -24,7 +24,7 @@ Target RejectNegative Report Mask(128BIT_LONG_DOUBLE)
sizeof(long double) is 16 sizeof(long double) is 16
m32 m32
Target RejectNegative Report InverseMask(64BIT) Target RejectNegative Negative(m64) Report InverseMask(64BIT)
Generate 32bit i386 code Generate 32bit i386 code
m386 m386
...@@ -40,7 +40,7 @@ Target RejectNegative Undocumented ...@@ -40,7 +40,7 @@ Target RejectNegative Undocumented
;; Deprecated ;; Deprecated
m64 m64
Target RejectNegative Report Mask(64BIT) Target RejectNegative Negative(m32) Report Mask(64BIT)
Generate 64bit x86-64 code Generate 64bit x86-64 code
m80387 m80387
......
2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
PR driver/26885
* Make-lang.in (GXX_OBJS): Replace gcc.o with $(GCC_OBJS).
2006-05-15 Mark Mitchell <mark@codesourcery.com> 2006-05-15 Mark Mitchell <mark@codesourcery.com>
PR c++/27339 PR c++/27339
......
...@@ -60,7 +60,7 @@ g++spec.o: $(srcdir)/cp/g++spec.c $(SYSTEM_H) coretypes.h $(TM_H) $(GCC_H) $(CON ...@@ -60,7 +60,7 @@ g++spec.o: $(srcdir)/cp/g++spec.c $(SYSTEM_H) coretypes.h $(TM_H) $(GCC_H) $(CON
$(INCLUDES) $(srcdir)/cp/g++spec.c) $(INCLUDES) $(srcdir)/cp/g++spec.c)
# Create the compiler driver for g++. # Create the compiler driver for g++.
GXX_OBJS = gcc.o g++spec.o intl.o prefix.o version.o GXX_OBJS = $(GCC_OBJS) g++spec.o intl.o prefix.o version.o
g++$(exeext): $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS) g++$(exeext): $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
$(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBS) $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBS)
......
...@@ -136,6 +136,13 @@ parser will set the variable to 1 when the positive form of the ...@@ -136,6 +136,13 @@ parser will set the variable to 1 when the positive form of the
option is used and 0 when the ``no-'' form is used. option is used and 0 when the ``no-'' form is used.
@item @item
If the option uses the @code{Negative} property, @var{var} is the
the name of an option, with the leading ``-'' removed, which will be
turned off when this option is turned on. This chain action will
propagate through the @code{Negative} property of the option to be
turned off.
@item
If the option takes an argument and has the @code{UInteger} property, If the option takes an argument and has the @code{UInteger} property,
@var{var} is an integer variable that stores the value of the argument. @var{var} is an integer variable that stores the value of the argument.
......
2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
PR driver/26885
* Make-lang.in (GFORTRAN_D_OBJS): Replace gcc.o with
$(GCC_OBJS).
2006-05-15 Paul Thomas <pault@gcc.gnu.org> 2006-05-15 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25090 PR fortran/25090
......
...@@ -93,7 +93,7 @@ gfortranspec.o: $(srcdir)/fortran/gfortranspec.c $(SYSTEM_H) $(TM_H) $(GCC_H) $( ...@@ -93,7 +93,7 @@ gfortranspec.o: $(srcdir)/fortran/gfortranspec.c $(SYSTEM_H) $(TM_H) $(GCC_H) $(
$(INCLUDES) $(srcdir)/fortran/gfortranspec.c) $(INCLUDES) $(srcdir)/fortran/gfortranspec.c)
# Create the compiler driver gfortran. # Create the compiler driver gfortran.
GFORTRAN_D_OBJS = gcc.o gfortranspec.o version.o prefix.o intl.o GFORTRAN_D_OBJS = $(GCC_OBJS) gfortranspec.o version.o prefix.o intl.o
gfortran$(exeext): $(GFORTRAN_D_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS) gfortran$(exeext): $(GFORTRAN_D_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
$(GFORTRAN_D_OBJS) $(EXTRA_GCC_OBJS) $(LIBS) $(GFORTRAN_D_OBJS) $(EXTRA_GCC_OBJS) $(LIBS)
......
...@@ -86,6 +86,7 @@ compilation is specified by a string called a "spec". */ ...@@ -86,6 +86,7 @@ compilation is specified by a string called a "spec". */
#include "prefix.h" #include "prefix.h"
#include "gcc.h" #include "gcc.h"
#include "flags.h" #include "flags.h"
#include "opts.h"
/* By default there is no special suffix for target executables. */ /* By default there is no special suffix for target executables. */
/* FIXME: when autoconf is fixed, remove the host check - dj */ /* FIXME: when autoconf is fixed, remove the host check - dj */
...@@ -6098,6 +6099,8 @@ main (int argc, char **argv) ...@@ -6098,6 +6099,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
prune_options (&argc, &argv);
#ifdef GCC_DRIVER_HOST_INITIALIZATION #ifdef GCC_DRIVER_HOST_INITIALIZATION
/* Perform host dependent initialization when needed. */ /* Perform host dependent initialization when needed. */
GCC_DRIVER_HOST_INITIALIZATION; GCC_DRIVER_HOST_INITIALIZATION;
......
2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
PR driver/26885
* Make-lang.in ($(GCJ)$(exeext)): Replace gcc.o with
$(GCC_OBJS).
2006-05-14 H.J. Lu <hongjiu.lu@intel.com> 2006-05-14 H.J. Lu <hongjiu.lu@intel.com>
* Make-lang.in (java/decl.o): Add dependency on $(TARGET_H). * Make-lang.in (java/decl.o): Add dependency on $(TARGET_H).
......
...@@ -67,10 +67,10 @@ jvspec.o: $(srcdir)/java/jvspec.c $(SYSTEM_H) coretypes.h $(TM_H) \ ...@@ -67,10 +67,10 @@ jvspec.o: $(srcdir)/java/jvspec.c $(SYSTEM_H) coretypes.h $(TM_H) \
$(INCLUDES) $(srcdir)/java/jvspec.c $(OUTPUT_OPTION)) $(INCLUDES) $(srcdir)/java/jvspec.c $(OUTPUT_OPTION))
# Create the compiler driver for $(GCJ). # Create the compiler driver for $(GCJ).
$(GCJ)$(exeext): gcc.o jvspec.o version.o \ $(GCJ)$(exeext): $(GCC_OBJS) jvspec.o version.o \
prefix.o intl.o $(LIBDEPS) $(EXTRA_GCC_OBJS) prefix.o intl.o $(LIBDEPS) $(EXTRA_GCC_OBJS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ gcc.o jvspec.o prefix.o intl.o \ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(GCC_OBJS) jvspec.o \
version.o $(EXTRA_GCC_OBJS) $(LIBS) prefix.o intl.o version.o $(EXTRA_GCC_OBJS) $(LIBS)
# Create a version of the $(GCJ) driver which calls the cross-compiler. # Create a version of the $(GCJ) driver which calls the cross-compiler.
$(GCJ)-cross$(exeext): $(GCJ)$(exeext) $(GCJ)-cross$(exeext): $(GCJ)$(exeext)
......
...@@ -62,20 +62,27 @@ for (i = 1; i <= n_headers; i++) ...@@ -62,20 +62,27 @@ for (i = 1; i <= n_headers; i++)
print "#include " quote "opts.h" quote print "#include " quote "opts.h" quote
print "#include " quote "intl.h" quote print "#include " quote "intl.h" quote
print "" print ""
print "int target_flags;"
print ""
for (i = 0; i < n_opts; i++) { for (i = 0; i < n_opts; i++) {
name = var_name(flags[i]); name = var_name(flags[i]);
if (name == "") if (name == "")
continue; continue;
if (flag_set_p("VarExists", flags[i])) if (flag_set_p("VarExists", flags[i])) {
continue; # Need it for the gcc driver.
if (name in var_seen)
init = opt_args("Init", flags[i]) continue;
if (init != "") init = ""
init = " = " init; }
else if (name in var_seen) else {
continue; init = opt_args("Init", flags[i])
if (init != "")
init = " = " init;
else if (name in var_seen)
continue;
}
print "/* Set by -" opts[i] "." print "/* Set by -" opts[i] "."
print " " help[i] " */" print " " help[i] " */"
...@@ -107,8 +114,21 @@ print "const unsigned int cl_options_count = N_OPTS;\n" ...@@ -107,8 +114,21 @@ print "const unsigned int cl_options_count = N_OPTS;\n"
print "const struct cl_option cl_options[] =\n{" print "const struct cl_option cl_options[] =\n{"
for (i = 0; i < n_opts; i++) j = 0
for (i = 0; i < n_opts; i++) {
back_chain[i] = "N_OPTS"; back_chain[i] = "N_OPTS";
indices[opts[i]] = j;
# Combine the flags of identical switches. Switches
# appear many times if they are handled by many front
# ends, for example.
while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
flags[i + 1] = flags[i] " " flags[i + 1];
i++;
back_chain[i] = "N_OPTS";
indices[opts[i]] = j;
}
j++;
}
for (i = 0; i < n_opts; i++) { for (i = 0; i < n_opts; i++) {
# Combine the flags of identical switches. Switches # Combine the flags of identical switches. Switches
...@@ -147,8 +167,21 @@ for (i = 0; i < n_opts; i++) { ...@@ -147,8 +167,21 @@ for (i = 0; i < n_opts; i++) {
else else
hlp = quote help[i] quote; hlp = quote help[i] quote;
printf(" { %c-%s%c,\n %s,\n %s, %u,\n", neg = opt_args("Negative", flags[i]);
quote, opts[i], quote, hlp, back_chain[i], len) if (neg != "")
idx = indices[neg]
else {
if (flag_set_p("RejectNegative", flags[i]))
idx = -1;
else {
if (opts[i] ~ "^[Wfm]")
idx = indices[opts[i]];
else
idx = -1;
}
}
printf(" { %c-%s%c,\n %s,\n %s, %u, %d,\n",
quote, opts[i], quote, hlp, back_chain[i], len, idx)
condition = opt_args("Condition", flags[i]) condition = opt_args("Condition", flags[i])
cl_flags = switch_flags(flags[i]) cl_flags = switch_flags(flags[i])
if (condition != "") if (condition != "")
......
/* Command line option handling.
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
#include "config.h"
#include "system.h"
#include "intl.h"
#include "coretypes.h"
#include "opts.h"
/* Perform a binary search to find which option the command-line INPUT
matches. Returns its index in the option array, and N_OPTS
(cl_options_count) on failure.
This routine is quite subtle. A normal binary search is not good
enough because some options can be suffixed with an argument, and
multiple sub-matches can occur, e.g. input of "-pedantic" matching
the initial substring of "-pedantic-errors".
A more complicated example is -gstabs. It should match "-g" with
an argument of "stabs". Suppose, however, that the number and list
of switches are such that the binary search tests "-gen-decls"
before having tested "-g". This doesn't match, and as "-gen-decls"
is less than "-gstabs", it will become the lower bound of the
binary search range, and "-g" will never be seen. To resolve this
issue, opts.sh makes "-gen-decls" point, via the back_chain member,
to "-g" so that failed searches that end between "-gen-decls" and
the lexicographically subsequent switch know to go back and see if
"-g" causes a match (which it does in this example).
This search is done in such a way that the longest match for the
front end in question wins. If there is no match for the current
front end, the longest match for a different front end is returned
(or N_OPTS if none) and the caller emits an error message. */
size_t
find_opt (const char *input, int lang_mask)
{
size_t mn, mx, md, opt_len;
size_t match_wrong_lang;
int comp;
mn = 0;
mx = cl_options_count;
/* Find mn such this lexicographical inequality holds:
cl_options[mn] <= input < cl_options[mn + 1]. */
while (mx - mn > 1)
{
md = (mn + mx) / 2;
opt_len = cl_options[md].opt_len;
comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
if (comp < 0)
mx = md;
else
mn = md;
}
/* This is the switch that is the best match but for a different
front end, or cl_options_count if there is no match at all. */
match_wrong_lang = cl_options_count;
/* Backtrace the chain of possible matches, returning the longest
one, if any, that fits best. With current GCC switches, this
loop executes at most twice. */
do
{
const struct cl_option *opt = &cl_options[mn];
/* Is the input either an exact match or a prefix that takes a
joined argument? */
if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
&& (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
{
/* If language is OK, return it. */
if (opt->flags & lang_mask)
return mn;
/* If we haven't remembered a prior match, remember this
one. Any prior match is necessarily better. */
if (match_wrong_lang == cl_options_count)
match_wrong_lang = mn;
}
/* Try the next possibility. This is cl_options_count if there
are no more. */
mn = opt->back_chain;
}
while (mn != cl_options_count);
/* Return the best wrong match, or cl_options_count if none. */
return match_wrong_lang;
}
/* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
next one is the same as ORIG_NEXT_OPT_IDX. */
static bool
cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
{
/* An option can be canceled by the same option or an option with
Negative. */
if (cl_options [next_opt_idx].neg_index == opt_idx)
return true;
if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
orig_next_opt_idx);
return false;
}
/* Filter out options canceled by the ones after them. */
void
prune_options (int *argcp, char ***argvp)
{
int argc = *argcp;
int *options = xmalloc (argc * sizeof (*options));
char **argv = xmalloc (argc * sizeof (char *));
int i, arg_count, need_prune = 0;
const struct cl_option *option;
size_t opt_index;
/* Scan all arguments. */
for (i = 1; i < argc; i++)
{
int value = 1;
const char *opt = (*argvp) [i];
opt_index = find_opt (opt + 1, -1);
if (opt_index == cl_options_count
&& (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
&& opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
{
char *dup;
/* Drop the "no-" from negative switches. */
size_t len = strlen (opt) - 3;
dup = XNEWVEC (char, len + 1);
dup[0] = '-';
dup[1] = opt[1];
memcpy (dup + 2, opt + 5, len - 2 + 1);
opt = dup;
value = 0;
opt_index = find_opt (opt + 1, -1);
free (dup);
}
if (opt_index == cl_options_count)
{
cont:
options [i] = 0;
continue;
}
option = &cl_options[opt_index];
if (option->neg_index < 0)
goto cont;
/* Reject negative form of switches that don't take negatives as
unrecognized. */
if (!value && (option->flags & CL_REJECT_NEGATIVE))
goto cont;
options [i] = (int) opt_index;
need_prune |= options [i];
}
if (!need_prune)
goto done;
/* Remove arguments which are negated by others after them. */
argv [0] = (*argvp) [0];
arg_count = 1;
for (i = 1; i < argc; i++)
{
int j, opt_idx;
opt_idx = options [i];
if (opt_idx)
{
int next_opt_idx;
for (j = i + 1; j < argc; j++)
{
next_opt_idx = options [j];
if (next_opt_idx
&& cancel_option (opt_idx, next_opt_idx,
next_opt_idx))
break;
}
}
else
goto keep;
if (j == argc)
{
keep:
argv [arg_count] = (*argvp) [i];
arg_count++;
}
}
if (arg_count != argc)
{
*argcp = arg_count;
*argvp = argv;
}
else
{
done:
free (argv);
}
free (options);
}
...@@ -105,7 +105,6 @@ static bool flag_peel_loops_set, flag_branch_probabilities_set; ...@@ -105,7 +105,6 @@ static bool flag_peel_loops_set, flag_branch_probabilities_set;
const char **in_fnames; const char **in_fnames;
unsigned num_in_fnames; unsigned num_in_fnames;
static size_t find_opt (const char *, int);
static int common_handle_option (size_t scode, const char *arg, int value, static int common_handle_option (size_t scode, const char *arg, int value,
unsigned int lang_mask); unsigned int lang_mask);
static void handle_param (const char *); static void handle_param (const char *);
...@@ -124,90 +123,6 @@ static unsigned int print_switch (const char *text, unsigned int indent); ...@@ -124,90 +123,6 @@ static unsigned int print_switch (const char *text, unsigned int indent);
static void set_debug_level (enum debug_info_type type, int extended, static void set_debug_level (enum debug_info_type type, int extended,
const char *arg); const char *arg);
/* Perform a binary search to find which option the command-line INPUT
matches. Returns its index in the option array, and N_OPTS
(cl_options_count) on failure.
This routine is quite subtle. A normal binary search is not good
enough because some options can be suffixed with an argument, and
multiple sub-matches can occur, e.g. input of "-pedantic" matching
the initial substring of "-pedantic-errors".
A more complicated example is -gstabs. It should match "-g" with
an argument of "stabs". Suppose, however, that the number and list
of switches are such that the binary search tests "-gen-decls"
before having tested "-g". This doesn't match, and as "-gen-decls"
is less than "-gstabs", it will become the lower bound of the
binary search range, and "-g" will never be seen. To resolve this
issue, opts.sh makes "-gen-decls" point, via the back_chain member,
to "-g" so that failed searches that end between "-gen-decls" and
the lexicographically subsequent switch know to go back and see if
"-g" causes a match (which it does in this example).
This search is done in such a way that the longest match for the
front end in question wins. If there is no match for the current
front end, the longest match for a different front end is returned
(or N_OPTS if none) and the caller emits an error message. */
static size_t
find_opt (const char *input, int lang_mask)
{
size_t mn, mx, md, opt_len;
size_t match_wrong_lang;
int comp;
mn = 0;
mx = cl_options_count;
/* Find mn such this lexicographical inequality holds:
cl_options[mn] <= input < cl_options[mn + 1]. */
while (mx - mn > 1)
{
md = (mn + mx) / 2;
opt_len = cl_options[md].opt_len;
comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
if (comp < 0)
mx = md;
else
mn = md;
}
/* This is the switch that is the best match but for a different
front end, or cl_options_count if there is no match at all. */
match_wrong_lang = cl_options_count;
/* Backtrace the chain of possible matches, returning the longest
one, if any, that fits best. With current GCC switches, this
loop executes at most twice. */
do
{
const struct cl_option *opt = &cl_options[mn];
/* Is the input either an exact match or a prefix that takes a
joined argument? */
if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
&& (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
{
/* If language is OK, return it. */
if (opt->flags & lang_mask)
return mn;
/* If we haven't remembered a prior match, remember this
one. Any prior match is necessarily better. */
if (match_wrong_lang == cl_options_count)
match_wrong_lang = mn;
}
/* Try the next possibility. This is cl_options_count if there
are no more. */
mn = opt->back_chain;
}
while (mn != cl_options_count);
/* Return the best wrong match, or cl_options_count if none. */
return match_wrong_lang;
}
/* If ARG is a non-negative integer made up solely of digits, return its /* If ARG is a non-negative integer made up solely of digits, return its
value, otherwise return -1. */ value, otherwise return -1. */
static int static int
......
...@@ -46,6 +46,7 @@ struct cl_option ...@@ -46,6 +46,7 @@ struct cl_option
const char *help; const char *help;
unsigned short back_chain; unsigned short back_chain;
unsigned char opt_len; unsigned char opt_len;
int neg_index;
unsigned int flags; unsigned int flags;
void *flag_var; void *flag_var;
enum cl_var_type var_type; enum cl_var_type var_type;
...@@ -84,6 +85,8 @@ extern const char **in_fnames; ...@@ -84,6 +85,8 @@ extern const char **in_fnames;
extern unsigned num_in_fnames; extern unsigned num_in_fnames;
size_t find_opt (const char *input, int lang_mask);
extern void prune_options (int *argcp, char ***argvp);
extern void decode_options (unsigned int argc, const char **argv); extern void decode_options (unsigned int argc, const char **argv);
extern int option_enabled (int opt_idx); extern int option_enabled (int opt_idx);
extern bool get_option_state (int, struct cl_option_state *); extern bool get_option_state (int, struct cl_option_state *);
......
2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
PR driver/26885
* Make-lang.in (gtreelang$(exeext)): Replace gcc.o with
$(GCC_OBJS).
2006-05-14 H.J. Lu <hongjiu.lu@intel.com> 2006-05-14 H.J. Lu <hongjiu.lu@intel.com>
* Make-lang.in (treelang/treetree.o): Add dependency on * Make-lang.in (treelang/treetree.o): Add dependency on
......
...@@ -87,10 +87,10 @@ tree1$(exeext): treelang/tree1.o treelang/treetree.o treelang/tree-convert.o \ ...@@ -87,10 +87,10 @@ tree1$(exeext): treelang/tree1.o treelang/treetree.o treelang/tree-convert.o \
$(BACKEND) $(LIBS) attribs.o $(BACKEND) $(LIBS) attribs.o
# Create the compiler driver treelang. # Create the compiler driver treelang.
gtreelang$(exeext): gcc.o version.o prefix.o intl.o $(EXTRA_GCC_OBJS) \ gtreelang$(exeext): $(GCC_OBJS) version.o prefix.o intl.o $(EXTRA_GCC_OBJS) \
$(LIBDEPS) treelang/spec.o $(LIBDEPS) treelang/spec.o
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ treelang/spec.o \ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ treelang/spec.o \
gcc.o version.o prefix.o intl.o $(EXTRA_GCC_OBJS) $(LIBS) $(GCC_OBJS) version.o prefix.o intl.o $(EXTRA_GCC_OBJS) $(LIBS)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment