aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog36
-rw-r--r--gcc/Makefile.in24
-rw-r--r--gcc/ada/ChangeLog4
-rw-r--r--gcc/ada/misc.c6
-rw-r--r--gcc/c-common.h4
-rw-r--r--gcc/c-lang.c10
-rw-r--r--gcc/c-opts.c263
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-lang.c4
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/lex.c6
-rw-r--r--gcc/f/ChangeLog4
-rw-r--r--gcc/f/com.c6
-rw-r--r--gcc/hooks.c6
-rw-r--r--gcc/hooks.h1
-rw-r--r--gcc/java/ChangeLog4
-rw-r--r--gcc/java/lang.c6
-rw-r--r--gcc/langhooks-def.h4
-rw-r--r--gcc/langhooks.h18
-rw-r--r--gcc/objc/objc-lang.c10
-rw-r--r--gcc/opts.c209
-rw-r--r--gcc/opts.h34
-rw-r--r--gcc/opts.sh7
-rw-r--r--gcc/toplev.c9
24 files changed, 410 insertions, 274 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70c9441..77210d9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,39 @@
+2003-06-07 Neil Booth <neil@daikokuya.co.uk>
+
+ * Makefile.in (OJBS, c-opts.o): Update.
+ (c-options.c, c-options.h): Rename options.h and options.c.
+ (options.h): Rename options_.h.
+ (opts.o): New.
+ * c-common.h (c_common_handle_option): Replace c_common_decode_option.
+ (c_common_init_options): Update prototype.
+ * c-lang.c (c_init_options): Update prototype.
+ (LANG_HOOKS_HANDLE_OPTION): Override.
+ (LANG_HOOKS_DECODE_OPTION): Drop.
+ * c-opts.c: Include opts.h and options.h instead of c-options.h
+ and c-options.c.
+ (lang_flags): Move to file scope.
+ (find_opt, c_common_decode_option): Remove.
+ (CL_C, CL_OBJC, CL_CXX, CL_OBJCXX, CL_JOINED, CL_SEPARATE,
+ CL_REJECT_NEGATIVE): Move to opts.h.
+ (missing_arg): Update prototype.
+ (c_common_init_options): Update for new prototype.
+ (c_common_handle_options): Filenames are passed as N_OPTS.
+ * hooks.c (hook_int_void_0): New.
+ * hooks.h (hook_int_void_0): New.
+ * langhooks-def.h (LANG_HOOKS_INIT_OPTIONS): New default.
+ (LANG_HOOKS_HANDLE_OPTION): Default to NULL for now.
+ (LANG_HOOKS_INITIALIZER): Update.
+ * langhooks.h (init_options): Update.
+ (handle_option): New.
+ * opts.c, opts.h: New files.
+ * opts.sh: Update c file to include opts.h and options.h.
+ * toplev.c: Include opts.h; change options.h to options_.h.
+ (parse_options_and_default_flags): Get lang_mask, use
+ handle_option for language-specific handling.
+ * objc/objc-lang.c (LANG_HOOKS_DECODE_OPTON): Drop.
+ (LANG_HOOKS_HANDLE_OPTION): Override.
+ (objc_init_options): Update.
+
2003-06-07 Magnus Kreth <magnus.kreth@gmx.de>
Thibaud Gaillard <thibaud.gaillard@nto.atmel.com>
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index a9a9065..c92a4c7 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -812,7 +812,8 @@ 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 params.o predict.o print-rtl.o print-tree.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 \
reload.o reload1.o reorg.o resource.o rtl.o rtlanal.o rtl-error.o \
@@ -1316,15 +1317,14 @@ 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) c-options.h c-options.c
+ 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
- AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh c-options.c c-options.h $(srcdir)/c.opt
+options.c: c.opt $(srcdir)/opts.sh options.h
-c-options.h: c-options.c
- @true
+options.h: c.opt $(srcdir)/opts.sh
+ AWK=$(AWK) $(SHELL) $(srcdir)/opts.sh options.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 \
@@ -1404,12 +1404,12 @@ s-gencheck : Makefile
$(SHELL) $(srcdir)/move-if-change tmp-gencheck.h gencheck.h
$(STAMP) s-gencheck
-options.h : s-options ; @true
+options_.h : s-options ; @true
s-options : Makefile
lof="$(lang_options_files)"; for f in $$lof; do \
echo "#include \"$$f\""; \
- done | sed 's|$(srcdir)/||' > tmp-options.h
- $(SHELL) $(srcdir)/move-if-change tmp-options.h options.h
+ done | sed 's|$(srcdir)/||' > tmp-options_.h
+ $(SHELL) $(srcdir)/move-if-change tmp-options_.h options_.h
$(STAMP) s-options
specs.h : s-specs ; @true
@@ -1479,13 +1479,15 @@ 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 options.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 \
debug.h insn-config.h intl.h $(RECOG_H) Makefile toplev.h \
dwarf2out.h sdbout.h dbxout.h $(EXPR_H) hard-reg-set.h $(BASIC_BLOCK_H) \
graph.h $(LOOP_H) except.h $(REGS_H) $(TIMEVAR_H) $(lang_options_files) \
ssa.h $(PARAMS_H) $(TM_P_H) reload.h dwarf2asm.h $(TARGET_H) \
- langhooks.h insn-flags.h options.h cfglayout.h real.h cfgloop.h \
+ langhooks.h insn-flags.h options_.h cfglayout.h real.h cfgloop.h \
hosthooks.h $(LANGHOOKS_DEF_H) cgraph.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-DTARGET_NAME=\"$(target_alias)\" \
@@ -2785,7 +2787,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 628a941..2a584d0 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-07 Neil Booth <neil@daikokuya.co.uk>
+
+ * misc.c (gnat_init_options): Update.
+
2003-06-05 Matt Kraai <kraai@alumni.cmu.edu>
* Make-lang.in (ada/b_gnatb.o-warn): Remove.
diff --git a/gcc/ada/misc.c b/gcc/ada/misc.c
index 93a52eb..180bb9a 100644
--- a/gcc/ada/misc.c
+++ b/gcc/ada/misc.c
@@ -81,7 +81,7 @@ extern char **save_argv;
static size_t gnat_tree_size PARAMS ((enum tree_code));
static bool gnat_init PARAMS ((void));
-static void gnat_init_options PARAMS ((void));
+static int gnat_init_options PARAMS ((void));
static int gnat_decode_option PARAMS ((int, char **));
static HOST_WIDE_INT gnat_get_alias_set PARAMS ((tree));
static void gnat_print_decl PARAMS ((FILE *, tree, int));
@@ -300,13 +300,15 @@ gnat_decode_option (argc, argv)
/* Initialize for option processing. */
-static void
+static int
gnat_init_options ()
{
/* Initialize gnat_argv with save_argv size */
gnat_argv = (char **) xmalloc ((save_argc + 1) * sizeof (gnat_argv[0]));
gnat_argv[0] = save_argv[0]; /* name of the command */
gnat_argc = 1;
+
+ return 0;
}
/* Here is the function to handle the compiler error processing in GCC. */
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 4f82b8f..b458afc 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -901,7 +901,7 @@ extern tree handle_format_attribute PARAMS ((tree *, tree, tree,
extern tree handle_format_arg_attribute PARAMS ((tree *, tree, tree,
int, bool *));
extern void c_common_insert_default_attributes PARAMS ((tree));
-extern int c_common_decode_option PARAMS ((int, char **));
+extern int c_common_handle_option (size_t code, const char *arg, int value);
extern tree c_common_type_for_mode PARAMS ((enum machine_mode,
int));
extern tree c_common_type_for_size PARAMS ((unsigned int, int));
@@ -959,7 +959,7 @@ extern void disable_builtin_function PARAMS ((const char *));
extern tree build_va_arg PARAMS ((tree, tree));
-extern void c_common_init_options PARAMS ((enum c_language_kind));
+extern int c_common_init_options PARAMS ((enum c_language_kind));
extern bool c_common_post_options PARAMS ((const char **));
extern bool c_common_init PARAMS ((void));
extern void c_common_finish PARAMS ((void));
diff --git a/gcc/c-lang.c b/gcc/c-lang.c
index 116561e..92b9c6e 100644
--- a/gcc/c-lang.c
+++ b/gcc/c-lang.c
@@ -31,7 +31,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "langhooks.h"
#include "langhooks-def.h"
-static void c_init_options PARAMS ((void));
+static int c_init_options PARAMS ((void));
/* ### When changing hooks, consider if ObjC needs changing too!! ### */
@@ -43,8 +43,8 @@ static void c_init_options PARAMS ((void));
#define LANG_HOOKS_FINISH c_common_finish
#undef LANG_HOOKS_INIT_OPTIONS
#define LANG_HOOKS_INIT_OPTIONS c_init_options
-#undef LANG_HOOKS_DECODE_OPTION
-#define LANG_HOOKS_DECODE_OPTION c_common_decode_option
+#undef LANG_HOOKS_HANDLE_OPTION
+#define LANG_HOOKS_HANDLE_OPTION c_common_handle_option
#undef LANG_HOOKS_POST_OPTIONS
#define LANG_HOOKS_POST_OPTIONS c_common_post_options
#undef LANG_HOOKS_GET_ALIAS_SET
@@ -157,10 +157,10 @@ const char *const tree_code_name[] = {
};
#undef DEFTREECODE
-static void
+static int
c_init_options ()
{
- c_common_init_options (clk_c);
+ return c_common_init_options (clk_c);
}
/* Used by c-lex.c, but only for objc. */
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 1dd5966..75078b5 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -35,7 +35,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "cppdefault.h"
#include "c-incpath.h"
#include "debug.h" /* For debug_hooks. */
-#include "c-options.h"
+#include "opts.h"
+#include "options.h"
#ifndef DOLLARS_IN_IDENTIFIERS
# define DOLLARS_IN_IDENTIFIERS true
@@ -49,6 +50,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
# define TARGET_EBCDIC 0
#endif
+static const int lang_flags[] = {CL_C, CL_OBJC, CL_CXX, CL_OBJCXX};
+
static int saved_lineno;
/* CPP's options. */
@@ -97,8 +100,7 @@ static size_t deferred_count, deferred_size;
/* Number of deferred options scanned for -include. */
static size_t include_cursor;
-static void missing_arg PARAMS ((size_t));
-static size_t find_opt PARAMS ((const char *, int));
+static void missing_arg PARAMS ((enum opt_code));
static void set_Wimplicit PARAMS ((int));
static void complain_wrong_lang PARAMS ((size_t));
static void write_langs PARAMS ((char *, int));
@@ -114,36 +116,12 @@ static void add_prefixed_path PARAMS ((const char *, size_t));
static void push_command_line_include PARAMS ((void));
static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *));
static void finish_options PARAMS ((void));
-static int c_common_handle_option (enum opt_code, const char *arg, int on);
#ifndef STDC_0_IN_SYSTEM_HEADERS
#define STDC_0_IN_SYSTEM_HEADERS 0
#endif
-#define CL_C (1 << 0) /* Only C. */
-#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. */
-
-#include "c-options.c"
-
-/* If the user gives an option to a front end that doesn't support it,
- an error is output, mentioning which front ends the option is valid
- for. If you don't want this, you must accept it for all front
- ends, and test for the front end in the option handler. See, for
- example, the handling of -fcond-mismatch.
-
- If you requested a joined or separate argument, it is stored in the
- variable "arg", which is guaranteed to be non-NULL and to not be an
- empty string. It points to the argument either within the argv[]
- vector or within one of that vector's strings, and so the text is
- permanent and copies need not be made. Be sure to add an error
- message in missing_arg() if the default is not appropriate. */
-
-/* Holds switches parsed by c_common_decode_option (), but whose
+/* Holds switches parsed by c_common_handle_option (), but whose
handling is deferred to c_common_post_options (). */
static void defer_opt PARAMS ((enum opt_code, const char *));
static struct deferred_opt
@@ -155,12 +133,11 @@ static struct deferred_opt
/* Complain that switch OPT_INDEX expects an argument but none was
provided. */
static void
-missing_arg (opt_index)
- size_t opt_index;
+missing_arg (enum opt_code code)
{
- const char *opt_text = cl_options[opt_index].opt_text;
+ const char *opt_text = cl_options[code].opt_text;
- switch (opt_index)
+ switch (code)
{
case OPT__output_pch_:
case OPT_Wformat_:
@@ -214,95 +191,6 @@ missing_arg (opt_index)
}
}
-/* Perform a binary search to find which option the command-line INPUT
- matches. Returns its index in the option array, and N_OPTS on
- failure.
-
- Complications arise since some options can be suffixed with an
- argument, and multiple complete matches can occur, e.g. -pedantic
- and -pedantic-errors. Also, some options are only accepted by some
- languages. If a switch matches for a different language and
- doesn't match any alternatives for the true front end, the index of
- the matched switch is returned anyway. The caller should check for
- this case. */
-static size_t
-find_opt (input, lang_flag)
- const char *input;
- int lang_flag;
-{
- size_t md, mn, mx;
- size_t opt_len;
- size_t result = N_OPTS;
- int comp;
-
- mn = 0;
- mx = N_OPTS;
-
- while (mx > mn)
- {
- md = (mn + mx) / 2;
-
- opt_len = cl_options[md].opt_len;
- comp = strncmp (input, cl_options[md].opt_text, opt_len);
-
- if (comp < 0)
- mx = md;
- else if (comp > 0)
- mn = md + 1;
- else
- {
- /* The switch matches. It it an exact match? */
- if (input[opt_len] == '\0')
- return md;
- else
- {
- mn = md + 1;
-
- /* If the switch takes no arguments this is not a proper
- match, so we continue the search (e.g. input="stdc++"
- match was "stdc"). */
- if (!(cl_options[md].flags & CL_JOINED))
- continue;
-
- /* Is this switch valid for this front end? */
- if (!(cl_options[md].flags & lang_flag))
- {
- /* If subsequently we don't find a better match,
- return this and let the caller report it as a bad
- match. */
- result = md;
- continue;
- }
-
- /* Two scenarios remain: we have the switch's argument,
- or we match a longer option. This can happen with
- -iwithprefix and -withprefixbefore. The longest
- possible option match succeeds.
-
- Scan forwards, and return an exact match. Otherwise
- return the longest valid option-accepting match (mx).
- This loops at most twice with current options. */
- mx = md;
- for (md = md + 1; md < (size_t) N_OPTS; md++)
- {
- opt_len = cl_options[md].opt_len;
- if (strncmp (input, cl_options[md].opt_text, opt_len))
- break;
- if (input[opt_len] == '\0')
- return md;
- if (cl_options[md].flags & lang_flag
- && cl_options[md].flags & CL_JOINED)
- mx = md;
- }
-
- return mx;
- }
- }
- }
-
- return result;
-}
-
/* Defer option CODE with argument ARG. */
static void
defer_opt (code, arg)
@@ -328,7 +216,7 @@ defer_opt (code, arg)
}
/* Common initialization before parsing options. */
-void
+int
c_common_init_options (lang)
enum c_language_kind lang;
{
@@ -342,134 +230,50 @@ c_common_init_options (lang)
flag_const_strings = (lang == clk_cplusplus);
warn_pointer_arith = (lang == clk_cplusplus);
+
+ return lang_flags[(c_language << 1) + flag_objc];
}
-/* Handle one command-line option in (argc, argv).
- Can be called multiple times, to handle multiple sets of options.
- Returns number of strings consumed. */
+/* Handle switch SCODE with argument ARG. ON is true, unless no-
+ form of an -f or -W option was given. Returns 0 if the switch was
+ invalid, a negative number to prevent language-independent
+ processing in toplev.c (a hack necessary for the short-term). */
int
-c_common_decode_option (argc, argv)
- int argc;
- char **argv;
+c_common_handle_option (size_t scode, const char *arg, int on)
{
- static const int lang_flags[] = {CL_C, CL_OBJC, CL_CXX, CL_OBJCXX};
- size_t opt_index;
- const char *opt, *arg = 0;
- char *dup = 0;
- bool on = true;
- int result = 0, temp, lang_flag;
- const struct cl_option *option;
-
- opt = argv[0];
-
- /* Interpret "-" or a non-switch as a file name. */
- if (opt[0] != '-' || opt[1] == '\0')
+ const struct cl_option *option = &cl_options[scode];
+ enum opt_code code = (enum opt_code) scode;
+ int result = 1, lang_mask;
+
+ if (code == N_OPTS)
{
if (!in_fname)
- in_fname = opt;
+ in_fname = arg;
else if (!out_fname)
- out_fname = opt;
+ out_fname = arg;
else
- {
error ("too many filenames given. Type %s --help for usage",
progname);
- return argc;
- }
-
return 1;
}
- /* Drop the "no-" from negative switches. */
- if ((opt[1] == 'W' || opt[1] == 'f')
- && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
- {
- size_t len = strlen (opt) - 3;
-
- dup = xmalloc (len + 1);
- dup[0] = '-';
- dup[1] = opt[1];
- memcpy (dup + 2, opt + 5, len - 2 + 1);
- opt = dup;
- on = false;
- }
-
- /* Skip over '-'. */
- lang_flag = lang_flags[(c_language << 1) + flag_objc];
- opt_index = find_opt (opt + 1, lang_flag);
- if (opt_index == N_OPTS)
- goto done;
-
- option = &cl_options[opt_index];
-
- /* Reject negative form of switches that don't take negatives. */
- if (!on && (option->flags & CL_REJECT_NEGATIVE))
- goto done;
-
- /* We've recognised this switch. */
- result = 1;
-
- /* Sort out any argument the switch takes. */
- if (option->flags & (CL_JOINED | CL_SEPARATE))
+ lang_mask = lang_flags[(c_language << 1) + flag_objc];
+ if (!(option->flags & lang_mask))
{
- if (option->flags & CL_JOINED)
- {
- /* Have arg point to the original switch. This is because
- some code, such as disable_builtin_function, expects its
- argument to be persistent until the program exits. */
- arg = argv[0] + cl_options[opt_index].opt_len + 1;
- if (!on)
- arg += strlen ("no-");
- }
-
- /* If we don't have an argument, and CL_SEPARATE, try the next
- argument in the vector. */
- if (!arg || (*arg == '\0' && option->flags & CL_SEPARATE))
- {
- arg = argv[1];
- result = 2;
- }
-
- if (!arg || *arg == '\0')
- {
- missing_arg (opt_index);
- result = argc;
- goto done;
- }
+ complain_wrong_lang (code);
+ return 1;
}
- /* Complain about the wrong language after we've swallowed any
- necessary extra argument. Eventually make this a hard error
- after the call to find_opt, and return argc. */
- if (!(cl_options[opt_index].flags & lang_flag))
+ if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
{
- complain_wrong_lang (opt_index);
- goto done;
+ missing_arg (code);
+ return 1;
}
- temp = c_common_handle_option (opt_index, arg, on);
- if (temp <= 0)
- result = temp;
-
- done:
- if (dup)
- free (dup);
- return result;
-}
-
-/* Handle switch OPT_INDEX with argument ARG. ON is true, unless no-
- form of an -f or -W option was given. Returns 0 if the switch was
- invalid, a negative number to prevent language-independent
- processing in toplev.c (a hack necessary for the short-term). */
-static int
-c_common_handle_option (enum opt_code code, const char *arg, int on)
-{
- const struct cl_option *option = &cl_options[code];
- int result = 1;
-
switch (code)
{
- case N_OPTS: /* Shut GCC up. */
- break;
+ default:
+ return 0;
case OPT__help:
print_help ();
@@ -1740,6 +1544,7 @@ complain_wrong_lang (opt_index)
write_langs (ok_langs, ok_flags);
write_langs (bad_langs, ~ok_flags);
+ /* Eventually this should become a hard error. */
warning ("\"-%s\" is valid for %s but not for %s",
cl_options[opt_index].opt_text, ok_langs, bad_langs);
}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e27e188..5910931 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2003-06-07 Neil Booth <neil@daikokuya.co.uk>
+
+ * cp-lang.c (LANG_HOOKS_DECODE_OPTON): Drop.
+ (LANG_HOOKS_HANDLE_OPTION): Override.
+ * cp-tree.h (cxx_init_options): Update.
+ * lex.c (cxx_init_options): Update.
+
Thu Jun 5 18:33:40 CEST 2003 Jan Hubicka <jh@suse.cz>
* Make-lang.in: Add support for stageprofile and stagefeedback
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index 0caa336..7914d81 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -49,8 +49,8 @@ static bool cp_var_mod_type_p (tree);
#define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything
#undef LANG_HOOKS_INIT_OPTIONS
#define LANG_HOOKS_INIT_OPTIONS cxx_init_options
-#undef LANG_HOOKS_DECODE_OPTION
-#define LANG_HOOKS_DECODE_OPTION c_common_decode_option
+#undef LANG_HOOKS_HANDLE_OPTION
+#define LANG_HOOKS_HANDLE_OPTION c_common_handle_option
#undef LANG_HOOKS_POST_OPTIONS
#define LANG_HOOKS_POST_OPTIONS c_common_post_options
#undef LANG_HOOKS_GET_ALIAS_SET
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index b72fb17..5b815fe 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3898,7 +3898,7 @@ extern void yyhook (int);
extern int cp_type_qual_from_rid (tree);
extern bool cxx_init (void);
extern void cxx_finish (void);
-extern void cxx_init_options (void);
+extern int cxx_init_options (void);
/* in method.c */
extern void init_method (void);
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 816f9e3..2768452 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -150,11 +150,9 @@ int interface_unknown; /* whether or not we know this class
/* Initialization before switch parsing. */
-void
+int
cxx_init_options ()
{
- c_common_init_options (clk_cplusplus);
-
/* Default exceptions on. */
flag_exceptions = 1;
/* By default wrap lines at 80 characters. Is getenv ("COLUMNS")
@@ -163,6 +161,8 @@ cxx_init_options ()
/* By default, emit location information once for every
diagnostic message. */
diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
+
+ return c_common_init_options (clk_cplusplus);
}
void
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index 0ff9f99..9baac57 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,7 @@
+Sat Jun 7 12:10:41 2003 Neil Booth <neil@daikokuya.co.uk>
+
+ * com.c (ffe_init_options): Update.
+
Thu Jun 5 18:33:40 CEST 2003 Jan Hubicka <jh@suse.cz>
* Make-lang.in: Add support for stageprofile and stagefeedback
diff --git a/gcc/f/com.c b/gcc/f/com.c
index fb90a46..c0902c5 100644
--- a/gcc/f/com.c
+++ b/gcc/f/com.c
@@ -14149,7 +14149,7 @@ 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 void ffe_init_options PARAMS ((void));
+static int ffe_init_options PARAMS ((void));
static void ffe_print_identifier PARAMS ((FILE *, tree, int));
struct language_function GTY(())
@@ -14289,7 +14289,7 @@ ffe_finish ()
fclose (finput);
}
-static void
+static int
ffe_init_options ()
{
/* Set default options for Fortran. */
@@ -14299,6 +14299,8 @@ ffe_init_options ()
flag_merge_constants = 2;
flag_errno_math = 0;
flag_complex_divide_method = 1;
+
+ return 0;
}
static bool
diff --git a/gcc/hooks.c b/gcc/hooks.c
index 1ec6725..a80ded7 100644
--- a/gcc/hooks.c
+++ b/gcc/hooks.c
@@ -104,6 +104,12 @@ hook_int_rtx_0 (a)
return 0;
}
+int
+hook_int_void_0 (void)
+{
+ return 0;
+}
+
void
hook_void_tree (a)
tree a ATTRIBUTE_UNUSED;
diff --git a/gcc/hooks.h b/gcc/hooks.h
index 5866da7..407440f 100644
--- a/gcc/hooks.h
+++ b/gcc/hooks.h
@@ -39,6 +39,7 @@ void hook_void_tree_treeptr PARAMS ((tree, tree *));
int hook_int_tree_tree_1 PARAMS ((tree, tree));
int hook_int_rtx_0 PARAMS ((rtx));
+int hook_int_void_0 (void);
bool default_can_output_mi_thunk_no_vcall
PARAMS ((tree, HOST_WIDE_INT, HOST_WIDE_INT, tree));
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 2c6d3f9..f06a3c6 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-07 Neil Booth <neil@daikokuya.co.uk>
+
+ * lang.c (java_init_options): Update.
+
Thu Jun 5 18:33:40 CEST 2003 Jan Hubicka <jh@suse.cz>
* Make-lang.in: Add support for stageprofile and stagefeedback
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index 918be0a..28be548 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -55,7 +55,7 @@ struct string_option
static bool java_init (void);
static void java_finish (void);
-static void java_init_options (void);
+static int java_init_options (void);
static bool java_post_options (const char **);
static int java_decode_option (int, char **);
@@ -731,7 +731,7 @@ void lang_init_source (int level)
inhibit_error_function_printing = (level == 1);
}
-static void
+static int
java_init_options (void)
{
flag_bounds_check = 1;
@@ -743,6 +743,8 @@ java_init_options (void)
/* In Java arithmetic overflow always wraps around. */
flag_wrapv = 1;
+
+ return 0;
}
static bool
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 1c2244a..5a752be 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -92,8 +92,9 @@ void write_global_declarations PARAMS ((void));
#define LANG_HOOKS_FINISH lhd_do_nothing
#define LANG_HOOKS_PARSE_FILE lhd_do_nothing_i
#define LANG_HOOKS_CLEAR_BINDING_STACK lhd_clear_binding_stack
-#define LANG_HOOKS_INIT_OPTIONS lhd_do_nothing
+#define LANG_HOOKS_INIT_OPTIONS hook_int_void_0
#define LANG_HOOKS_DECODE_OPTION lhd_decode_option
+#define LANG_HOOKS_HANDLE_OPTION NULL
#define LANG_HOOKS_POST_OPTIONS lhd_post_options
#define LANG_HOOKS_GET_ALIAS_SET lhd_get_alias_set
#define LANG_HOOKS_EXPAND_CONSTANT lhd_return_tree
@@ -243,6 +244,7 @@ int lhd_tree_dump_type_quals PARAMS ((tree));
LANG_HOOKS_TREE_SIZE, \
LANG_HOOKS_INIT_OPTIONS, \
LANG_HOOKS_DECODE_OPTION, \
+ LANG_HOOKS_HANDLE_OPTION, \
LANG_HOOKS_POST_OPTIONS, \
LANG_HOOKS_INIT, \
LANG_HOOKS_FINISH, \
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 70ad952..c3ec11d 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -199,8 +199,9 @@ struct lang_hooks
size_t (*tree_size) PARAMS ((enum tree_code));
/* The first callback made to the front end, for simple
- initialization needed before any calls to decode_option. */
- void (*init_options) PARAMS ((void));
+ initialization needed before any calls to handle_option. Return
+ the language mask to filter the switch array with. */
+ int (*init_options) PARAMS ((void));
/* Function called with an option vector as argument, to decode a
single option (typically starting with -f or -W or +). It should
@@ -209,9 +210,20 @@ struct lang_hooks
option. If this function returns a negative number, then its
absolute value is the number of command-line arguments used, but,
in addition, no language-independent option processing should be
- done for this option. */
+ done for this option. Obsoleted by handle_option. */
int (*decode_option) PARAMS ((int, char **));
+ /* Handle the switch CODE, which has real type enum opt_code from
+ options.h. If the switch takes an argument, it is passed in ARG
+ which points to permanent storage. The handler is resonsible for
+ checking whether ARG is NULL, which indicates that no argument
+ was in fact supplied. For -f and -W switches, VALUE is 1 or 0
+ for the positive and negative forms respectively.
+
+ Return 1 if the switch is valid, 0 if invalid, and -1 if it's
+ valid and should not be treated as language-independent too. */
+ int (*handle_option) (size_t code, const char *arg, int value);
+
/* Called when all command line options have been parsed to allow
further processing and initialization
diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c
index 686e35e..2002840 100644
--- a/gcc/objc/objc-lang.c
+++ b/gcc/objc/objc-lang.c
@@ -31,7 +31,7 @@ Boston, MA 02111-1307, USA. */
#include "langhooks.h"
#include "langhooks-def.h"
-static void objc_init_options PARAMS ((void));
+static int objc_init_options PARAMS ((void));
#undef LANG_HOOKS_NAME
#define LANG_HOOKS_NAME "GNU Objective-C"
@@ -41,8 +41,8 @@ static void objc_init_options PARAMS ((void));
#define LANG_HOOKS_FINISH c_common_finish
#undef LANG_HOOKS_INIT_OPTIONS
#define LANG_HOOKS_INIT_OPTIONS objc_init_options
-#undef LANG_HOOKS_DECODE_OPTION
-#define LANG_HOOKS_DECODE_OPTION c_common_decode_option
+#undef LANG_HOOKS_HANDLE_OPTION
+#define LANG_HOOKS_HANDLE_OPTION c_common_handle_option
#undef LANG_HOOKS_POST_OPTIONS
#define LANG_HOOKS_POST_OPTIONS c_common_post_options
#undef LANG_HOOKS_GET_ALIAS_SET
@@ -164,9 +164,9 @@ const char * const tree_code_name[] = {
};
#undef DEFTREECODE
-static void
+static int
objc_init_options ()
{
flag_objc = 1;
- c_common_init_options (clk_c);
+ return c_common_init_options (clk_c);
}
diff --git a/gcc/opts.c b/gcc/opts.c
new file mode 100644
index 0000000..3d3fa10
--- /dev/null
+++ b/gcc/opts.c
@@ -0,0 +1,209 @@
+/* Command line option handling.
+ Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+ Contributed by Neil Booth.
+
+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. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "tree.h"
+#include "langhooks.h"
+#include "opts.h"
+#include "options.h"
+
+static enum opt_code find_opt (const char *, int);
+
+/* Perform a binary search to find which option the command-line INPUT
+ matches. Returns its index in the option array, and N_OPTS on
+ failure.
+
+ Complications arise since some options can be suffixed with an
+ argument, and multiple complete matches can occur, e.g. -pedantic
+ and -pedantic-errors. Also, some options are only accepted by some
+ languages. If a switch matches for a different language and
+ doesn't match any alternatives for the true front end, the index of
+ the matched switch is returned anyway. The caller should check for
+ this case. */
+static enum opt_code
+find_opt (const char *input, int lang_mask)
+{
+ size_t md, mn, mx;
+ size_t opt_len;
+ enum opt_code result = N_OPTS;
+ int comp;
+
+ mn = 0;
+ mx = N_OPTS;
+
+ while (mx > mn)
+ {
+ md = (mn + mx) / 2;
+
+ opt_len = cl_options[md].opt_len;
+ comp = strncmp (input, cl_options[md].opt_text, opt_len);
+
+ if (comp < 0)
+ mx = md;
+ else if (comp > 0)
+ mn = md + 1;
+ else
+ {
+ /* The switch matches. It it an exact match? */
+ if (input[opt_len] == '\0')
+ return md;
+ else
+ {
+ mn = md + 1;
+
+ /* If the switch takes no arguments this is not a proper
+ match, so we continue the search (e.g. input="stdc++"
+ match was "stdc"). */
+ if (!(cl_options[md].flags & CL_JOINED))
+ continue;
+
+ /* Is this switch valid for this front end? */
+ if (!(cl_options[md].flags & lang_mask))
+ {
+ /* If subsequently we don't find a better match,
+ return this and let the caller report it as a bad
+ match. */
+ result = (enum opt_code) md;
+ continue;
+ }
+
+ /* Two scenarios remain: we have the switch's argument,
+ or we match a longer option. This can happen with
+ -iwithprefix and -withprefixbefore. The longest
+ possible option match succeeds.
+
+ Scan forwards, and return an exact match. Otherwise
+ return the longest valid option-accepting match (mx).
+ This loops at most twice with current options. */
+ mx = md;
+ for (md = md + 1; md < N_OPTS; md++)
+ {
+ opt_len = cl_options[md].opt_len;
+ if (strncmp (input, cl_options[md].opt_text, opt_len))
+ break;
+ if (input[opt_len] == '\0')
+ return md;
+ if (cl_options[md].flags & lang_mask
+ && cl_options[md].flags & CL_JOINED)
+ mx = md;
+ }
+
+ return mx;
+ }
+ }
+ }
+
+ return result;
+}
+
+/* Handle the switch beginning at ARGV, with ARGC remaining. */
+int
+handle_option (int argc, char **argv, int lang_mask)
+{
+ size_t opt_index;
+ const char *opt, *arg = 0;
+ char *dup = 0;
+ bool on = true;
+ int result = 0, temp;
+ const struct cl_option *option;
+
+ /* If the front end isn't yet converted, use the old hook. */
+ if (!lang_hooks.handle_option)
+ return (*lang_hooks.decode_option) (argc, argv);
+
+ opt = argv[0];
+
+ /* Interpret "-" or a non-switch as a file name. */
+ if (opt[0] != '-' || opt[1] == '\0')
+ {
+ opt_index = N_OPTS;
+ arg = opt;
+ result = 1;
+ }
+ else
+ {
+ /* Drop the "no-" from negative switches. */
+ if ((opt[1] == 'W' || opt[1] == 'f')
+ && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
+ {
+ size_t len = strlen (opt) - 3;
+
+ dup = xmalloc (len + 1);
+ dup[0] = '-';
+ dup[1] = opt[1];
+ memcpy (dup + 2, opt + 5, len - 2 + 1);
+ opt = dup;
+ on = false;
+ }
+
+ /* Skip over '-'. */
+ opt_index = find_opt (opt + 1, lang_mask);
+ if (opt_index == N_OPTS)
+ goto done;
+
+ option = &cl_options[opt_index];
+
+ /* Reject negative form of switches that don't take negatives. */
+ if (!on && (option->flags & CL_REJECT_NEGATIVE))
+ goto done;
+
+ /* We've recognised this switch. */
+ result = 1;
+
+ /* Sort out any argument the switch takes. */
+ if (option->flags & (CL_JOINED | CL_SEPARATE))
+ {
+ if (option->flags & CL_JOINED)
+ {
+ /* Have arg point to the original switch. This is because
+ some code, such as disable_builtin_function, expects its
+ argument to be persistent until the program exits. */
+ arg = argv[0] + cl_options[opt_index].opt_len + 1;
+ if (!on)
+ arg += strlen ("no-");
+ }
+
+ /* If we don't have an argument, and CL_SEPARATE, try the next
+ argument in the vector. */
+ if (!arg || (*arg == '\0' && option->flags & CL_SEPARATE))
+ {
+ arg = argv[1];
+ result = 2;
+ }
+
+ /* Canonicalize missing arguments as NULL for the handler. */
+ if (*arg == '\0')
+ arg = NULL;
+ }
+ }
+
+ temp = (*lang_hooks.handle_option) (opt_index, arg, on);
+ if (temp <= 0)
+ result = temp;
+
+ done:
+ if (dup)
+ free (dup);
+ return result;
+}
diff --git a/gcc/opts.h b/gcc/opts.h
new file mode 100644
index 0000000..297bd82
--- /dev/null
+++ b/gcc/opts.h
@@ -0,0 +1,34 @@
+/* Command line option handling.
+ Copyright (C) 2002, 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. */
+
+#ifndef GCC_OPTS_H
+#define GCC_OPTS_H
+
+extern int handle_option (int argc, char **argv, int lang_mask);
+
+#define CL_C (1 << 0) /* Only C. */
+#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. */
+
+#endif
diff --git a/gcc/opts.sh b/gcc/opts.sh
index 4056946..bc90150 100644
--- a/gcc/opts.sh
+++ b/gcc/opts.sh
@@ -65,9 +65,12 @@ cat "$@" | ${AWK} '
print " const char *opt_text;" >> h_file
print " unsigned char opt_len;" >> h_file
print " unsigned char flags;" >> h_file
- print "};\n" >> h_file
+ print "};\n\n" >> h_file
+ print "extern const struct cl_option cl_options[];\n" >> h_file
print "enum opt_code\n{" >> h_file
- print "static const struct cl_option cl_options[] =\n{" >> c_file
+ print "#include \"options.h\"" >> c_file
+ print "#include \"opts.h\"\n" >> c_file
+ print "const struct cl_option cl_options[] =\n{" >> c_file
}
{
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 1a82946..83db268 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -76,6 +76,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "cfgloop.h"
#include "hosthooks.h"
#include "cgraph.h"
+#include "opts.h"
#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
#include "dwarf2out.h"
@@ -1457,7 +1458,7 @@ documented_lang_options[] =
#define DEFINE_LANG_NAME(NAME) { NULL, NAME },
-#include "options.h"
+#include "options_.h"
};
@@ -5134,7 +5135,7 @@ general_init (char *argv0)
static void
parse_options_and_default_flags (int argc, char **argv)
{
- int i;
+ int i, lang_mask;
/* Save in case md file wants to emit args as a comment. */
save_argc = argc;
@@ -5150,7 +5151,7 @@ parse_options_and_default_flags (int argc, char **argv)
init_ggc_heuristics();
/* Perform language-specific options initialization. */
- (*lang_hooks.init_options) ();
+ lang_mask = (*lang_hooks.init_options) ();
/* Scan to see what optimization level has been specified. That will
determine the default value of many flags. */
@@ -5287,7 +5288,7 @@ parse_options_and_default_flags (int argc, char **argv)
int indep_processed;
/* Give the language a chance to decode the option for itself. */
- lang_processed = (*lang_hooks.decode_option) (argc - i, argv + i);
+ lang_processed = handle_option (argc - i, argv + i, lang_mask);
if (lang_processed >= 0)
/* Now see if the option also has a language independent meaning.