diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1ce8b1e6612804759df1fe5b07eb5490b4529468..d824921d3991d03f564919489cf244438acf5ccc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+2003-06-14  Neil Booth  <neil@daikokuya.co.uk>
+
+	* Makefile.in: Update to use common.opt and lang_opt_files.
+	(c-options.c, c-options.h): Remove.
+	(options.c, options.h): Add.
+	* c-opts.c: Include options.h not c-options.h.
+	* common.opt: New file.
+	* configure, configure.in: Add lang_opt_files.
+	* opts.c: Include flags.h and diagnostic.h.
+	(common_handle_option): New.
+	(handle_option): Update to recognize common options and all
+	language-dependent options.
+	* opts.h (CL_F77, CL_JAVA, CL_ADA, CL_COMMON, CL_TREELANG): New.
+	(struct cl_option): Make flags of type int.
+	* opts.h: Flag option with front ends to which it applies.
+	Handle duplicate options.
+	* toplev.c (filename): Remove.
+	(independent_decode_option): Don't handle filenames and -quiet.
+	(process_options, do_compile): Update.
+
 2003-06-14  Nick Clifton  <nickc@redhat.com>
 
 	* doc/install.texi (Specific): Add description of different
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index bd841229106b1cbddda9db9ecdff5d18c37d55ef..e96eb38d8ec93e934f6290fdf3c95c3561c0a70b 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -353,6 +353,7 @@ host_xm_file=@host_xm_file@
 host_xm_defines=@host_xm_defines@
 xm_file=@xm_file@
 xm_defines=@xm_defines@
+lang_opt_files=@lang_opt_files@ $(srcdir)/c.opt $(srcdir)/common.opt
 lang_specs_files=@lang_specs_files@
 lang_options_files=@lang_options_files@
 lang_tree_files=@lang_tree_files@
@@ -793,7 +794,7 @@ CXX_TARGET_OBJS=@cxx_target_objs@
 # 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-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \
-  c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o c-options.o prefix.o \
+  c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o \
   c-objc-common.o c-dump.o c-pch.o libcpp.a $(C_TARGET_OBJS)
 
 # Language-specific object files for C.
@@ -812,7 +813,7 @@ OBJS = alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o	   \
  haifa-sched.o hashtable.o hooks.o ifcvt.o insn-attrtab.o insn-emit.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  	   \
- loop.o mbchar.o optabs.o opts.o params.o predict.o			   \
+ loop.o mbchar.o optabs.o options.o opts.o params.o predict.o		   \
  print-rtl.o print-tree.o						   \
  profile.o ra.o ra-build.o ra-colorize.o ra-debug.o ra-rewrite.o	   \
  real.o recog.o reg-stack.o regclass.o regmove.o regrename.o		   \
@@ -1317,16 +1318,10 @@ c-pretty-print.o : c-pretty-print.c c-pretty-print.h pretty-print.h \
 
 c-opts.o : c-opts.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
         c-pragma.h flags.h toplev.h langhooks.h tree-inline.h diagnostic.h \
-	intl.h debug.h $(C_COMMON_H) opts.h c-options.h
+	intl.h debug.h $(C_COMMON_H) opts.h options.h
 	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 		$< $(OUTPUT_OPTION) @TARGET_SYSTEM_ROOT_DEFINE@
 
-c-options.c: c.opt $(srcdir)/opts.sh c-options.h
-
-c-options.h: c.opt $(srcdir)/opts.sh
-	AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh c-options.c c-options.h \
-		$(srcdir)/c.opt
-
 c-cppbuiltin.o : c-cppbuiltin.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
 	$(TREE_H) $(C_COMMON_H) c-pragma.h flags.h toplev.h langhooks.h \
 	output.h except.h real.h $(TM_P_H)
@@ -1421,6 +1416,12 @@ s-specs : Makefile
 	$(SHELL) $(srcdir)/move-if-change tmp-specs.h specs.h
 	$(STAMP) s-specs
 
+options.c: $(lang_opt_files) $(srcdir)/opts.sh options.h
+
+options.h: $(lang_opt_files) $(srcdir)/opts.sh
+	AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh options.c options.h \
+		$(lang_opt_files)
+
 dumpvers: dumpvers.c
 
 version.o: version.c version.h
@@ -1480,7 +1481,7 @@ fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H
 diagnostic.o : diagnostic.c diagnostic.h real.h diagnostic.def \
    $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(TM_P_H) flags.h $(GGC_H) \
    input.h toplev.h intl.h langhooks.h $(LANGHOOKS_DEF_H)
-opts.o : opts.c opts.h $(CONFIG_H) $(SYSTEM_H) \
+opts.o : opts.c opts.h options.h toplev.h $(CONFIG_H) $(SYSTEM_H) \
 	coretypes.h $(TREE_H) $(TM_H) $(LANGHOOKS_H)
 toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_H) \
    function.h flags.h xcoffout.h input.h $(INSN_ATTR_H) output.h diagnostic.h \
@@ -2788,7 +2789,7 @@ mostlyclean: $(INTL_MOSTLYCLEAN) lang.mostlyclean
 	-rm -f xlimits.h
 # Delete other built files.
 	-rm -f xsys-protos.hT
-	-rm -f specs.h options_.h gencheck.h c-options.c c-options.h
+	-rm -f specs.h options_.h gencheck.h options.c options.h
 # Delete the stamp and temporary files.
 	-rm -f s-* tmp-* stamp-* stmp-*
 	-rm -f */stamp-* */tmp-*
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 1d2abfe1be0e038073cb78341e0f7a896707db50..a0bdb474d8bc664e4105792bf22449441dea6047 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,10 @@
+2003-06-14  Neil Booth  <neil@daikokuya.co.uk>
+
+	* Make-lang.in: Update to use options.c and options.h.
+	* misc.c: Include options.h not aoptions.h.
+	(gnat_handle_option): Abort on unrecognized switch.
+	(gnat_init_options): Request Ada switches.
+
 2003-06-14  Neil Booth  <neil@daikokuya.co.uk>
 
 	* lang.opt: Add -Wall.
diff --git a/gcc/ada/Make-lang.in b/gcc/ada/Make-lang.in
index 33c019cf88f1ab671915544155a9740d721e7286..a2ca68475ea14d34e6d6f8f8249b427a25eec2d8 100644
--- a/gcc/ada/Make-lang.in
+++ b/gcc/ada/Make-lang.in
@@ -116,8 +116,7 @@ ADA_TOOLS_FLAGS_TO_PASS=\
 # Object files for gnat1 from C sources.
 GNAT1_C_OBJS = ada/b_gnat1.o ada/adadecode.o ada/adaint.o ada/cstreams.o \
  ada/cio.o ada/targtyps.o ada/decl.o ada/misc.o ada/utils.o ada/utils2.o \
- ada/trans.o ada/cuintp.o ada/argv.o ada/raise.o ada/init.o ada/tracebak.o \
- ada/aoptions.o
+ ada/trans.o ada/cuintp.o ada/argv.o ada/raise.o ada/init.o ada/tracebak.o
 
 # Object files from Ada sources that are used by gnat1
 
@@ -761,7 +760,6 @@ ada.mostlyclean:
 	-$(RM) ada/*$(objext) ada/*.ali ada/b_*.c
 	-$(RM) ada/*$(coverageexts)
 	-$(RM) ada/sdefault.adb ada/stamp-sdefault
-	-$(RM) ada/aoptions.c ada/aoptions.h
 	-$(RMDIR) ada/tools
 ada.clean:
 ada.distclean:
@@ -1016,7 +1014,7 @@ ada/misc.o : ada/misc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
    diagnostic.h output.h except.h $(TM_P_H) langhooks.h debug.h $(LANGHOOKS_DEF_H) \
    libfuncs.h $(OPTABS_H) ada/ada.h ada/types.h ada/atree.h ada/nlists.h \
    ada/elists.h ada/sinfo.h ada/einfo.h ada/namet.h ada/stringt.h ada/uintp.h \
-   ada/fe.h $(ADA_TREE_H) ada/gigi.h ada/adadecode.h opts.h ada/aoptions.h
+   ada/fe.h $(ADA_TREE_H) ada/gigi.h ada/adadecode.h opts.h options.h
 
 ada/targtyps.o : ada/targtyps.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
    ada/ada.h ada/types.h ada/atree.h ada/nlists.h ada/elists.h ada/uintp.h \
@@ -2525,10 +2523,4 @@ ada/widechar.o : ada/ada.ads ada/a-except.ads ada/hostparm.ads \
    ada/types.ads ada/unchconv.ads ada/unchdeal.ads ada/widechar.ads \
    ada/widechar.adb 
 
-ada/aoptions.c: ada/lang.opt opts.sh ada/aoptions.h
-
-ada/aoptions.h: ada/lang.opt opts.sh
-	AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh ada/aoptions.c \
-		ada/aoptions.h $(srcdir)/ada/lang.opt
-
 # end of regular dependencies
diff --git a/gcc/ada/misc.c b/gcc/ada/misc.c
index eaab916d9a45738680f3107ef3e139abc8d4533b..4d171fc1a6fa04257004660f068d788cc0383a98 100644
--- a/gcc/ada/misc.c
+++ b/gcc/ada/misc.c
@@ -75,7 +75,7 @@
 #include "gigi.h"
 #include "adadecode.h"
 #include "opts.h"
-#include "aoptions.h"
+#include "options.h"
 
 extern FILE *asm_out_file;
 extern int save_argc;
@@ -238,7 +238,7 @@ gnat_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED)
   switch (code)
     {
     default:
-      return 0;
+      abort();
 
     case OPT_I:
       q = xmalloc (sizeof("-I") + strlen (arg));
@@ -294,7 +294,7 @@ gnat_init_options ()
   gnat_argv[0] = save_argv[0];     /* name of the command */ 
   gnat_argc = 1;
 
-  return 0;
+  return CL_ADA;
 }
 
 /* Here is the function to handle the compiler error processing in GCC.  */
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 20884867df4846309f8870e74e8bf74dcbfc5b39..f1c87cb41b695fe8358c10e5e7816f89f6db36da 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -36,7 +36,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "c-incpath.h"
 #include "debug.h"		/* For debug_hooks.  */
 #include "opts.h"
-#include "c-options.h"
+#include "options.h"
 
 #ifndef DOLLARS_IN_IDENTIFIERS
 # define DOLLARS_IN_IDENTIFIERS true
diff --git a/gcc/common.opt b/gcc/common.opt
new file mode 100644
index 0000000000000000000000000000000000000000..c3c955e2462359ef4ce6e4d2235a8318798c5936
--- /dev/null
+++ b/gcc/common.opt
@@ -0,0 +1,47 @@
+; Options for the language- and target-independent parts of the compiler.
+; Copyright (C) 2003 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, 59 Temple Place - Suite 330, Boston, MA
+; 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 should contain "Common".  If the switch takes an
+; argument, then you should also specify "Joined" and/or "Separate" to
+; indicate where the argument can appear.
+
+; 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.
+
+quiet
+Common
+
+; This comment is to ensure we retain the blank line above.
diff --git a/gcc/configure b/gcc/configure
index cae6648e1e47d09b13de1a9af297b26828a175a1..b4ac3e0b73817f308d9e383873d390f73d1ff79a 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -2440,7 +2440,7 @@ fi
 
 
 # Find some useful tools
-for ac_prog in gawk mawk nawk awk
+for ac_prog in mawk gawk nawk awk
 do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
@@ -8799,11 +8799,15 @@ fi
 # Make empty files to contain the specs and options for each language.
 # Then add #include lines to for a compiler that has specs and/or options.
 
+lang_opt_files=
 lang_specs_files=
 lang_options_files=
 lang_tree_files=
 for subdir in . $subdirs
 do
+	if test -f $srcdir/$subdir/lang.opt; then
+	    lang_opt_files="$lang_opt_files $srcdir/$subdir/lang.opt"
+	fi
 	if test -f $srcdir/$subdir/lang-specs.h; then
 	    lang_specs_files="$lang_specs_files $srcdir/$subdir/lang-specs.h"
 	fi
@@ -9078,6 +9082,7 @@ ${CONFIG_SHELL-/bin/sh} $srcdir/configure.frag $srcdir "$subdirs" "$dep_host_xma
 
 
 
+
 
 
 # Echo that links are built
@@ -9387,6 +9392,7 @@ s%@host_xm_file@%$host_xm_file%g
 s%@host_xm_defines@%$host_xm_defines%g
 s%@out_host_hook_obj@%$out_host_hook_obj%g
 s%@install@%$install%g
+s%@lang_opt_files@%$lang_opt_files%g
 s%@lang_options_files@%$lang_options_files%g
 s%@lang_specs_files@%$lang_specs_files%g
 s%@lang_tree_files@%$lang_tree_files%g
diff --git a/gcc/configure.in b/gcc/configure.in
index 44e10effdadcfd8b227ab22546d20535c4dcb0c1..a3fe7ec270a2818033932d39def0ffce536e4332 100644
--- a/gcc/configure.in
+++ b/gcc/configure.in
@@ -2893,11 +2893,15 @@ AC_SUBST(MAINT)dnl
 # Make empty files to contain the specs and options for each language.
 # Then add #include lines to for a compiler that has specs and/or options.
 
+lang_opt_files=
 lang_specs_files=
 lang_options_files=
 lang_tree_files=
 for subdir in . $subdirs
 do
+	if test -f $srcdir/$subdir/lang.opt; then
+	    lang_opt_files="$lang_opt_files $srcdir/$subdir/lang.opt"
+	fi
 	if test -f $srcdir/$subdir/lang-specs.h; then
 	    lang_specs_files="$lang_specs_files $srcdir/$subdir/lang-specs.h"
 	fi
@@ -3141,6 +3145,7 @@ AC_SUBST(host_xm_file)
 AC_SUBST(host_xm_defines)
 AC_SUBST(out_host_hook_obj)
 AC_SUBST(install)
+AC_SUBST(lang_opt_files)
 AC_SUBST(lang_options_files)
 AC_SUBST(lang_specs_files)
 AC_SUBST(lang_tree_files)
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9c3069d2a816845286d3af207a15106dc75979d8..8713ac966b3d5a5225505037d270be71a1d0779a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-14  Neil Booth  <neil@daikokuya.co.uk>
+
+	* Make-lang.in: Remove c-options.o.
+
 2003-06-13  Nathanael Nerode  <neroden@gcc.gnu.org>
 
 	* lex.c: Convert to ISO C.
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 7f823dc391e691df1e1af554ba57181db851e07a..ddada02bd6b8016d039cb26eb1cc2a68a359b8ba 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -80,8 +80,7 @@ g++-cross$(exeext): g++$(exeext)
 # Shared with C front end:
 CXX_C_OBJS = attribs.o c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o \
 	c-dump.o $(CXX_TARGET_OBJS) c-pretty-print.o c-opts.o c-pch.o \
-	c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o \
-	c-options.o
+	c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o
 
 # Language-specific object files.
 CXX_OBJS = cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o \
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index 76717e667af68ecd4f9df70125bf353b1d21e031..e6667f4695e489a61c6c942caf5fe622c85bf874 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,12 @@
+Sat Jun 14 13:25:00 2003  Neil Booth  <neil@daikokuya.co.uk>
+
+	* Make-lang.in: Update to use options.c and options.h.
+	* top.c: Include options.h not f-options.h.
+	(ffe_init_options): From com.c.  Request F77 options.
+	(ffe_handle_options): Abort on unrecognized switch.
+	* com.c (ffe_init_options): Move to top.c.
+	* top.h (fee_init_options): New.
+
 2003-06-13  Richard Henderson  <rth@redhat.com>
 
 	PR debug/9864
diff --git a/gcc/f/Make-lang.in b/gcc/f/Make-lang.in
index 0fe264bd26b1c781b80edf1aff96deece33abb26..c243317e7aee460d4fbaafdc44e44d138429e217 100644
--- a/gcc/f/Make-lang.in
+++ b/gcc/f/Make-lang.in
@@ -88,7 +88,7 @@ g77-cross$(exeext): g77$(exeext)
 
 F77_OBJS = f/bad.o f/bit.o f/bld.o f/com.o f/data.o f/equiv.o f/expr.o \
  f/global.o f/implic.o f/info.o f/intrin.o f/lab.o f/lex.o f/malloc.o \
- f/name.o f/f-options.o f/parse.o f/src.o f/st.o f/sta.o f/stb.o f/stc.o \
+ f/name.o f/parse.o f/src.o f/st.o f/sta.o f/stb.o f/stc.o \
  f/std.o f/ste.o f/storag.o f/stp.o f/str.o f/sts.o f/stt.o f/stu.o \
  f/stv.o f/stw.o f/symbol.o f/target.o f/top.o f/type.o f/where.o
 
@@ -320,7 +320,6 @@ f77.uninstall: installdirs
 f77.mostlyclean:
 	-rm -f f/*$(objext)
 	-rm -f f/*$(coverageexts)
-	-rm -f f/f-options.c f/f-options.h
 	-rm -f f/fini$(build_exeext) f/stamp-str f/str-*.h f/str-*.j
 	-rm -f f/intdoc$(build_exeext) f/ansify$(build_exeext) f/intdoc.h0
 	-rm -f g77.aux g77.cps g77.ky g77.toc g77.vr g77.fn g77.kys \
@@ -543,14 +542,8 @@ f/top.o: f/top.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/top.h f/malloc.h f/where.h \
  f/info-w.def f/target.h f/lex.h f/type.h f/lab.h f/storag.h \
  f/symbol.h f/symbol.def f/equiv.h f/global.h f/name.h f/intrin.h \
  f/intrin.def f/data.h f/expr.h f/implic.h f/src.h f/st.h flags.h \
- toplev.h coretypes.h $(TM_H) opts.h f/f-options.h
+ toplev.h coretypes.h $(TM_H) opts.h options.h
 f/type.o: f/type.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/type.h f/malloc.h \
  coretypes.h $(TM_H)
 f/where.o: f/where.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/where.h glimits.h \
  f/top.h f/malloc.h f/lex.h $(GGC_H) gt-f-where.h coretypes.h $(TM_H)
-
-f/f-options.c: f/lang.opt opts.sh f/f-options.h
-
-f/f-options.h: f/lang.opt opts.sh
-	AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh f/f-options.c \
-		f/f-options.h $(srcdir)/f/lang.opt
diff --git a/gcc/f/com.c b/gcc/f/com.c
index 4de5d6c18ae65fa44a9b8607c1bef085b9cb2bf7..6750fc32f209ae58cf508057bbdd8c8649aea4b0 100644
--- a/gcc/f/com.c
+++ b/gcc/f/com.c
@@ -14125,7 +14125,6 @@ insert_block (tree block)
 static bool ffe_init PARAMS ((void));
 static void ffe_finish PARAMS ((void));
 static bool ffe_post_options PARAMS ((const char **));
-static int ffe_init_options PARAMS ((void));
 static void ffe_print_identifier PARAMS ((FILE *, tree, int));
 
 struct language_function GTY(())
@@ -14265,20 +14264,6 @@ ffe_finish ()
   fclose (finput);
 }
 
-static int
-ffe_init_options ()
-{
-  /* Set default options for Fortran.  */
-  flag_move_all_movables = 1;
-  flag_reduce_all_givs = 1;
-  flag_argument_noalias = 2;
-  flag_merge_constants = 2;
-  flag_errno_math = 0;
-  flag_complex_divide_method = 1;
-
-  return 0;
-}
-
 static bool
 ffe_mark_addressable (tree exp)
 {
diff --git a/gcc/f/top.c b/gcc/f/top.c
index 715e61ceebba2492ead2f0ce0d39f2f56020a8c5..7ca2db998b86b3923cb0ca7e0bb9fb148f0b6051 100644
--- a/gcc/f/top.c
+++ b/gcc/f/top.c
@@ -47,7 +47,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "lex.h"
 #include "malloc.h"
 #include "name.h"
-#include "f-options.h"
+#include "options.h"
 #include "opts.h"
 #include "src.h"
 #include "st.h"
@@ -155,6 +155,21 @@ ffe_is_digit_string_ (const char *s)
   return (p != s) && (*p == '\0');
 }
 
+/* Get ready for options handling.  */
+int
+ffe_init_options ()
+{
+  /* Set default options for Fortran.  */
+  flag_move_all_movables = 1;
+  flag_reduce_all_givs = 1;
+  flag_argument_noalias = 2;
+  flag_merge_constants = 2;
+  flag_errno_math = 0;
+  flag_complex_divide_method = 1;
+
+  return CL_F77;
+}
+
 /* Handle command-line options.	 Returns 0 if unrecognized, 1 if
    recognized and handled.  */
 int
@@ -176,7 +191,7 @@ ffe_handle_option (size_t scode, const char *arg, int value)
   switch (code)
     {
     default:
-      return 0;
+      abort();
 
     case OPT_fversion:
       ffe_set_is_version (TRUE);
diff --git a/gcc/f/top.h b/gcc/f/top.h
index 60c099512c48e1941957190c24f3c747a216023e..041dc16ef629a50f5007d3d3cbf1f75db13ee739 100644
--- a/gcc/f/top.h
+++ b/gcc/f/top.h
@@ -141,6 +141,7 @@ extern bool ffe_in_4;
 
 /* Declare functions with prototypes. */
 
+int ffe_init_options (void);
 int ffe_handle_option (size_t code, const char *arg, int on);
 void ffe_file (ffewhereFile wf, FILE *f);
 void ffe_init_0 (void);
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index fcd451d536246b245a0a42215bffce1cb46e1d7e..88bc7fe44dd37d66491931e55a4bb8db385e53c5 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,10 @@
+2003-06-14  Neil Booth  <neil@daikokuya.co.uk>
+
+	* Make-lang.in: Update to use options.c and options.h.
+	* lang.c: Include options.h not j-options.h.
+	(java_handle_option): Abort on unrecognized option.
+	(java_init_options): Request Java switches.
+
 2003-06-11  Neil Booth  <neil@daikokuya.co.uk>
 
 	* Make-lang.in: Handle mostlyclean.
diff --git a/gcc/java/Make-lang.in b/gcc/java/Make-lang.in
index 7bac1872649134626e6664b8b94168154852560d..ae2a7e73165415f7a248418b8fac9991efc62e04 100644
--- a/gcc/java/Make-lang.in
+++ b/gcc/java/Make-lang.in
@@ -108,7 +108,7 @@ gt-java-builtins.h gtype-java.h gt-java-resource.h : s-gtype ; @true
 JAVA_OBJS = java/parse.o java/class.o java/decl.o java/expr.o \
   java/constants.o java/lang.o java/typeck.o java/except.o java/verify.o \
   java/zextract.o java/jcf-io.o java/jcf-parse.o java/mangle.o \
-  java/mangle_name.o java/builtins.o java/resource.o java/j-options.o \
+  java/mangle_name.o java/builtins.o java/resource.o \
   java/jcf-write.o java/buffer.o java/check-init.o java/jcf-depend.o \
   java/jcf-path.o java/xref.o java/boehm.o java/java-tree-inline.o mkdeps.o
 
@@ -237,7 +237,6 @@ java.install-info: installdirs
 java.mostlyclean:
 	-rm -f java/*$(objext) $(DEMANGLER_PROG)
 	-rm -f java/*$(coverageexts)
-	-rm -f java/j-options.c java/j-options.h
 	-rm -f jc1$(exeext) $(GCJ)$(exeext) jvgenmain$(exeext) gcjh$(exeext) jv-scan$(exeext) jcf-dump$(exeext) s-java
 java.clean:
 java.distclean:
@@ -327,7 +326,7 @@ java/jvgenmain.o: java/jvgenmain.c $(CONFIG_H) $(JAVA_TREE_H) $(SYSTEM_H) \
   coretypes.h $(TM_H)
 java/lang.o: java/lang.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h input.h \
   toplev.h $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(EXPR_H) diagnostic.h \
-  langhooks.h $(LANGHOOKS_DEF_H) gt-java-lang.h opts.h java/j-options.h
+  langhooks.h $(LANGHOOKS_DEF_H) gt-java-lang.h opts.h options.h
 java/mangle.o: java/mangle.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) $(SYSTEM_H) \
   coretypes.h $(TM_H) toplev.h $(GGC_H) gt-java-mangle.h
 java/mangle_name.o: java/mangle_name.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) \
@@ -348,12 +347,6 @@ java/xref.o: java/xref.c java/xref.h $(CONFIG_H) $(JAVA_TREE_H) toplev.h \
 java/zextract.o: java/zextract.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
   java/zipfile.h
 
-java/j-options.c: java/lang.opt opts.sh java/j-options.h
-
-java/j-options.h: java/lang.opt opts.sh
-	AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh java/j-options.c \
-		java/j-options.h $(srcdir)/java/lang.opt
-
 # jcf-io.o needs $(ZLIBINC) added to cflags.
 java/jcf-io.o: java/jcf-io.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
   $(JAVA_TREE_H)
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index cb907a7956f7d5c5d06d03f938f2fba20932af1d..8fd4ba07437d9832e462616a0bc8e7d3fb251ebf 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -46,7 +46,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 #include "splay-tree.h"
 #include "tree-dump.h"
 #include "opts.h"
-#include "j-options.h"
+#include "options.h"
 
 static bool java_init (void);
 static void java_finish (void);
@@ -290,7 +290,7 @@ java_handle_option (size_t scode, const char *arg, int value)
   switch (code)
     {
     default:
-      return 0;
+      abort();
 
     case OPT_I:
       jcf_path_include_arg (arg);
@@ -695,7 +695,7 @@ java_init_options (void)
 
   jcf_path_init ();
 
-  return 0;
+  return CL_JAVA;
 }
 
 static bool
diff --git a/gcc/opts.c b/gcc/opts.c
index 83561b2679f45fde036f11a631e2c4dbfd9d3914..99b3298688b4cab89706e6050847282a54b3608b 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -26,8 +26,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "tree.h"
 #include "langhooks.h"
 #include "opts.h"
+#include "options.h"
+#include "flags.h"
+#include "toplev.h"
 
 static size_t find_opt (const char *, int);
+static int common_handle_option (size_t scode, const char *arg, int value);
 
 /* Perform a binary search to find which option the command-line INPUT
    matches.  Returns its index in the option array, and N_OPTS on
@@ -134,7 +138,8 @@ handle_option (int argc ATTRIBUTE_UNUSED, char **argv, int lang_mask)
     {
       opt_index = cl_options_count;
       arg = opt;
-      result = 1;
+      main_input_filename = opt;
+      result = (*lang_hooks.handle_option) (opt_index, arg, on);
     }
   else
     {
@@ -152,8 +157,7 @@ handle_option (int argc ATTRIBUTE_UNUSED, char **argv, int lang_mask)
 	  on = false;
 	}
 
-      /* Skip over '-'.  */
-      opt_index = find_opt (opt + 1, lang_mask);
+      opt_index = find_opt (opt + 1, lang_mask | CL_COMMON);
       if (opt_index == cl_options_count)
 	goto done;
 
@@ -191,14 +195,51 @@ handle_option (int argc ATTRIBUTE_UNUSED, char **argv, int lang_mask)
 	  if (*arg == '\0')
 	    arg = NULL;
 	}
-    }
 
-  temp = (*lang_hooks.handle_option) (opt_index, arg, on);
-  if (temp <= 0)
-    result = temp;
+      if (option->flags & lang_mask)
+	{
+	  temp = (*lang_hooks.handle_option) (opt_index, arg, on);
+	  if (temp <= 0)
+	    result = temp;
+	}
+
+      if (result > 0 && (option->flags & CL_COMMON))
+	{
+	  if (common_handle_option (opt_index, arg, on) == 0)
+	    result = 0;
+	}
+    }
 
  done:
   if (dup)
     free (dup);
   return result;
 }
+
+/* Handle target- and language-independent options.  Return zero to
+   generate an "unknown option" message.  */
+static int
+common_handle_option (size_t scode, const char *arg,
+		      int value ATTRIBUTE_UNUSED)
+{
+  const struct cl_option *option = &cl_options[scode];
+  enum opt_code code = (enum opt_code) scode;
+
+  if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
+    {
+      error ("missing argument to \"-%s\"", option->opt_text);
+      return 1;
+    }
+
+  switch (code)
+    {
+    default:
+      abort ();
+
+    case OPT_quiet:
+      quiet_flag = 1;
+      break;
+    }
+
+  return 1;
+}
diff --git a/gcc/opts.h b/gcc/opts.h
index 0bba52d34999760611a1a8d9540b7f2a9412d9e8..340092e87d3792b405b2801ad2fdb1bb4131e6db 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -27,7 +27,7 @@ struct cl_option
 {
   const char *opt_text;
   unsigned char opt_len;
-  unsigned char flags;
+  unsigned int flags;
 };
 
 extern const struct cl_option cl_options[];
@@ -37,8 +37,14 @@ extern const unsigned int cl_options_count;
 #define CL_OBJC			(1 << 1) /* Only ObjC.  */
 #define CL_CXX			(1 << 2) /* Only C++.  */
 #define CL_OBJCXX		(1 << 3) /* Only ObjC++.  */
-#define CL_JOINED		(1 << 4) /* If takes joined argument.  */
-#define CL_SEPARATE		(1 << 5) /* If takes a separate argument.  */
-#define CL_REJECT_NEGATIVE	(1 << 6) /* Reject no- form.  */
+#define CL_F77			(1 << 4) /* Only Fortran.  */
+#define CL_JAVA			(1 << 5) /* Only Java.  */
+#define CL_ADA			(1 << 6) /* Only Ada.  */
+#define CL_TREELANG		(1 << 7) /* Only Treelang.  */
+#define CL_COMMON		(1 << 8) /* Language-independent.  */
+
+#define CL_JOINED		(1 << 24) /* If takes joined argument.  */
+#define CL_SEPARATE		(1 << 25) /* If takes a separate argument.  */
+#define CL_REJECT_NEGATIVE	(1 << 26) /* Reject no- form.  */
 
 #endif
diff --git a/gcc/opts.sh b/gcc/opts.sh
index 1ce8c4a089d7c3de6df2251642ec78dbf5a1acf5..9be2c5d7befb65f3a973bfc92758de1489178c97 100644
--- a/gcc/opts.sh
+++ b/gcc/opts.sh
@@ -48,6 +48,11 @@ cat "$@" | ${AWK} '
         if (langs ~ ":ObjC:") flags = flags " | CL_OBJC"
         if (langs ~ ":C\\+\\+:") flags = flags " | CL_CXX"
         if (langs ~ ":ObjC\\+\\+:") flags = flags " | CL_OBJCXX"
+        if (langs ~ ":F77:") flags = flags " | CL_F77"
+        if (langs ~ ":Java:") flags = flags " | CL_JAVA"
+        if (langs ~ ":Ada:") flags = flags " | CL_ADA"
+        if (langs ~ ":Tree:") flags = flags " | CL_TREELANG"
+        if (langs ~ ":Common:") flags = flags " | CL_COMMON"
         if (langs ~ ":Joined:") flags = flags " | CL_JOINED"
         if (langs ~ ":Separate:") flags = flags " | CL_SEPARATE"
         if (langs ~ ":RejectNegative:") flags = flags " | CL_REJECT_NEGATIVE"
@@ -56,29 +61,50 @@ cat "$@" | ${AWK} '
     }
 
     BEGIN {
+	FS = "\034"
+	n_opts = 0
+    }
+
+# Collect the text and flags of each option into an array
+    {
+	opts[n_opts] = $1
+	flags[n_opts] = $2
+	n_opts++;
+    }
+
+# Dump out an enumeration into a .h file, and an array of options into a
+# C file.  Combine the flags of duplicate options.
+    END {
 	c_file = "'${C_FILE}'"
 	h_file = "'${H_FILE}'"
-	FS = "\034"
+	comma = ","
+
 	print "/* This file is auto-generated by opts.sh.  */\n" > h_file
-	print "/* This file is auto-generated by opts.sh.  */\n" > c_file
 	print "enum opt_code\n{"			>> h_file
+
+	print "/* This file is auto-generated by opts.sh.  */\n" > c_file
 	print "#include \"" h_file "\""			>> c_file
 	print "#include \"opts.h\"\n"			>> c_file
 	print "const unsigned int cl_options_count = N_OPTS;\n" >> c_file
 	print "const struct cl_option cl_options[] =\n{" >> c_file
-    }
 
-    {
-	opt = $1
-	gsub ( "[^A-Za-z0-9]", "_", opt)
-	s = substr ("                                  ", length (opt))
-	enum = "OPT_" opt
-	printf ("  %s,%s/* -%s */\n", enum, s, $1 )	>> h_file
-	printf ("  { \"%s\", %u, %s },\n", $1, \
-	    length ($1), switch_flags($2))		>> c_file
-    }
+	for (i = 0; i < n_opts; i++) {
+	    while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
+		flags[i + 1] = flags[i] " " flags[i + 1];
+		i++;
+	    }
+
+	    enum = "OPT_" opts[i]
+	    gsub( "[^A-Za-z0-9]", "_", enum)
+	    s = substr("                                  ", length (opts[i]))
+	    if (i + 1 == n_opts)
+		comma = ""
+
+	    printf("  %s,%s/* -%s */\n", enum, s, opts[i]) >> h_file
+	    printf("  { \"%s\", %u, %s }%s\n", opts[i], \
+		length(opts[i]), switch_flags(flags[i]), comma) >> c_file
+	}
 
-    END {
 	print "  N_OPTS\n};"				>> h_file
 	print "};"					>> c_file
     }
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 85157e7bb0ddfae08ff587c423b004e240f6f9e0..f349f73f5f1464989f875ad50cba48ddbf70f2a8 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -359,7 +359,6 @@ static void close_dump_file (enum dump_file_index,
 int rtl_dump_and_exit;
 int flag_print_asm_name;
 static int version_flag;
-static const char *filename;
 enum graph_dump_types graph_dump_format;
 
 /* Name for output file of assembly code, specified with -o.  */
@@ -4594,14 +4593,7 @@ independent_decode_option (int argc, char **argv)
   char *arg = argv[0];
 
   if (arg[0] != '-' || arg[1] == 0)
-    {
-      if (arg[0] == '+')
-	return 0;
-
-      filename = arg;
-
-      return 1;
-    }
+    return 1;
 
   arg++;
 
@@ -4705,13 +4697,6 @@ independent_decode_option (int argc, char **argv)
 	return 0;
       break;
 
-    case 'q':
-      if (!strcmp (arg, "quiet"))
-	quiet_flag = 1;
-      else
-	return 0;
-      break;
-
     case 'v':
       if (!strcmp (arg, "version"))
 	version_flag = 1;
@@ -5385,8 +5370,8 @@ process_options (void)
      initialization based on the command line options.  This hook also
      sets the original filename if appropriate (e.g. foo.i -> foo.c)
      so we can correctly initialize debug output.  */
-  no_backend = (*lang_hooks.post_options) (&filename);
-  main_input_filename = input_filename = filename;
+  no_backend = (*lang_hooks.post_options) (&main_input_filename);
+  input_filename = main_input_filename;
 
 #ifdef OVERRIDE_OPTIONS
   /* Some machines may reject certain combinations of options.  */
@@ -5396,9 +5381,9 @@ process_options (void)
   /* Set aux_base_name if not already set.  */
   if (aux_base_name)
     ;
-  else if (filename)
+  else if (main_input_filename)
     {
-      char *name = xstrdup (lbasename (filename));
+      char *name = xstrdup (lbasename (main_input_filename));
 
       strip_off_ending (name, strlen (name));
       aux_base_name = name;
@@ -5738,7 +5723,7 @@ do_compile (void)
 	backend_init ();
 
       /* Language-dependent initialization.  Returns true on success.  */
-      if (lang_dependent_init (filename))
+      if (lang_dependent_init (main_input_filename))
 	compile_file ();
 
       finalize ();
diff --git a/gcc/treelang/ChangeLog b/gcc/treelang/ChangeLog
index 933d8fb95afc38f709fd70d0b9cfc3f969caa30b..710f468de2a66098c18c65733992cb2aa1e496bf 100644
--- a/gcc/treelang/ChangeLog
+++ b/gcc/treelang/ChangeLog
@@ -1,3 +1,12 @@
+2003-06-14  Neil Booth  <neil@daikokuya.co.uk>
+
+	* Make-lang.in: Update to use options.c and options.h.
+	* tree1.c: Include options.h not t-options.h.
+	(treelang_init_options): New.
+	(treelang_handle_option): Abort on unrecognized switch.
+	* treetree.c (LANG_HOOKS_INIT_OPTIONS): Override.
+	* treetree.h (treelang_init_options): New.
+
 2003-06-12  Andreas Jaeger  <aj@suse.de>
 
 	* treetree.c: Remove cl_options-count and cl_options.
diff --git a/gcc/treelang/Make-lang.in b/gcc/treelang/Make-lang.in
index d5e96af4bcd4e10cbe8bf5a6704f938cdc87a752..52106a4329163feef29c42b960ebcc43a2746f12 100644
--- a/gcc/treelang/Make-lang.in
+++ b/gcc/treelang/Make-lang.in
@@ -85,11 +85,11 @@ treelang.done: tree1$(exeext)
 # core compiler
 tree1$(exeext): treelang/tree1.o treelang/treetree.o treelang/lex.o treelang/parse.o\
 	$(TREE_BE_LIBS) c-convert.o c-typeck.o c-common.o c-cppbuiltin.o \
-	c-decl.o attribs.o treelang/t-options.o
+	c-decl.o attribs.o
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
 	treelang/tree1.o treelang/treetree.o treelang/lex.o treelang/parse.o \
 	c-convert.o c-typeck.o c-common.o c-cppbuiltin.o c-decl.o attribs.o \
-	$(TREE_BE_LIBS) treelang/t-options.o
+	$(TREE_BE_LIBS)
 
 #
 # Compiling object files from source files.
@@ -98,7 +98,7 @@ tree1$(exeext): treelang/tree1.o treelang/treetree.o treelang/lex.o treelang/par
 
 treelang/tree1.o: treelang/tree1.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
   flags.h toplev.h $(GGC_H) $(TREE_H) diagnostic.h treelang/treelang.h \
-  input.h treelang/treetree.h treelang/t-options.h \
+  input.h treelang/treetree.h options.h opts.h \
   treelang/treetree.h gt-treelang-tree1.h gtype-treelang.h
 
 treelang/treetree.o: treelang/treetree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
@@ -112,12 +112,6 @@ treelang/parse.o: treelang/parse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
 treelang/lex.o: treelang/lex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
   $(TM_H) diagnostic.h $(TREE_H) treelang/treelang.h input.h treelang/parse.h
 
-treelang/t-options.c: treelang/lang.opt opts.sh treelang/t-options.h
-
-treelang/t-options.h: treelang/lang.opt opts.sh
-	AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh treelang/t-options.c \
-		treelang/t-options.h $(srcdir)/treelang/lang.opt
-
 # generated files the files from lex and yacc are put into the source
 # directory in case someone wants to build but does not have
 # lex/yacc
@@ -237,7 +231,6 @@ treelang.mostlyclean:
 	    rm -f treelang/$$name$(exeext); \
 	  fi ; \
 	done
-	-rm -f treelang/t-options.c treelang/t-options.h
 	-rm -f treelang/*$(objext)
 	-rm -f treelang/*$(coverageexts)
 	-rm treelang.done
diff --git a/gcc/treelang/tree1.c b/gcc/treelang/tree1.c
index f4e5fa84cb582dd5d1e3e3a17fcb3092d35f1669..6be21a34095d806552fa9a2990cc13833d3c9a48 100644
--- a/gcc/treelang/tree1.c
+++ b/gcc/treelang/tree1.c
@@ -45,7 +45,7 @@
 #include "treelang.h"
 #include "treetree.h"
 #include "opts.h"
-#include "t-options.h"
+#include "options.h"
 
 extern int yyparse (void);
 
@@ -88,6 +88,13 @@ static int version_done = 0;
 
 static unsigned int work_nesting_level = 0;
 
+/* Prepare to handle switches.  */
+int
+treelang_init_options (void)
+{
+  return CL_TREELANG;
+}
+
 /* Process a switch - called by opts.c.  */
 int
 treelang_handle_option (size_t scode, const char *arg ATTRIBUTE_UNUSED,
@@ -98,7 +105,7 @@ treelang_handle_option (size_t scode, const char *arg ATTRIBUTE_UNUSED,
   switch (code)
     {
     default:
-      return 0;
+      abort();
 
     case OPT__help:
       if (!version_done)
diff --git a/gcc/treelang/treetree.c b/gcc/treelang/treetree.c
index d6720cb8433225879ca643ef80481fd6458633fc..40db190851709779a1d4685a9dbabb4417e2c905 100644
--- a/gcc/treelang/treetree.c
+++ b/gcc/treelang/treetree.c
@@ -112,6 +112,8 @@ extern char **file_names;
 #define LANG_HOOKS_NAME	"GNU treelang"
 #undef LANG_HOOKS_FINISH
 #define LANG_HOOKS_FINISH		treelang_finish
+#undef LANG_HOOKS_INIT_OPTIONS
+#define LANG_HOOKS_INIT_OPTIONS  treelang_init_options
 #undef LANG_HOOKS_HANDLE_OPTION
 #define LANG_HOOKS_HANDLE_OPTION treelang_handle_option
 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
diff --git a/gcc/treelang/treetree.h b/gcc/treelang/treetree.h
index c87b3af4da6a741f592ff6da27de5d15fbf367d9..2c7aec3b5f32507e9d607b125397c1c653de1646 100644
--- a/gcc/treelang/treetree.h
+++ b/gcc/treelang/treetree.h
@@ -63,6 +63,7 @@ tree tree_code_get_type (int type_num);
 void treelang_init_decl_processing (void);
 void treelang_finish (void);
 bool treelang_init (void);
+int treelang_init_options (void);
 int treelang_handle_option (size_t scode, const char *arg, int value);
 void treelang_parse_file (int debug_flag);
 void push_var_level (void);