Commit 5f20c657 by Joseph Myers Committed by Joseph Myers

coretypes.h (struct cl_option_handlers): Declare.

	* coretypes.h (struct cl_option_handlers): Declare.
	* hooks.c (hook_int_size_t_constcharptr_int_0): Remove.
	* hooks.h (hook_int_size_t_constcharptr_int_0): Remove.
	* langhooks-def.h (lhd_handle_option): Declare.
	(LANG_HOOKS_HANDLE_OPTION): Use lhd_handle_option.
	* langhooks.c (lhd_handle_option): New.
	* langhooks.h (struct lang_hooks): Update prototype and return
	value type of handle_option hook.
	* optc-gen.awk: Generate target_flags_explicit definition for the
	driver.
	* opts-common.c: Include diagnostic.h.
	(handle_option): Move from opts.c.  Update prototype and return
	value type.  Use handlers structure.
	(read_cmdline_option): Move from opts.c.  Update prototype.  Use
	handlers structure.
	(set_option): Move from opts.c.
	* opts.c (common_handle_option): Update prototype and return value
	type.  Update calls to handle_option and enable_warning_as_error.
	(unknown_option_callback, post_handling_callback,
	lang_handle_option, target_handle_option): New.
	(handle_option, read_cmdline_option): Move to opts-common.c.
	(read_cmdline_options): Update prototype.  Update call to
	read_cmdline_option.
	(decode_options): Initialize and use handlers structure.
	(set_option): Move to opts-common.c.
	(enable_warning_as_error): Update prototype.  Update call to
	handle_option.
	* opts.h (struct cl_option_handler_func, struct
	cl_option_handlers): New.
	(handle_option, enable_warning_as_error): Update prototypes.
	(read_cmdline_option): Declare.
	* Makefile.in (opts-common.o): Update dependencies.

ada:
	* gcc-interface/misc.c (gnat_handle_option): Update prototype and
	return value type.  Don't check for missing arguments here.

c-family:
	* c-common.h (c_common_handle_option): Update prototype and return
	value type.
	* c-opts.c (c_common_handle_option): Update prototype and return
	value type.  Update calls to handle_option and
	enable_warning_as_error.

fortran:
	* gfortran.h (gfc_handle_option): Update prototype and return
	value type.
	* options.c (gfc_handle_option): Update prototype and return value
	type.

java:
	* lang.c (java_handle_option): Update prototype and return value
	type.

lto:
	* lto-lang.c (lto_handle_option): Update prototype and return
	value type.  Remove duplicate assignment to result.

From-SVN: r162601
parent 689d6c4a
2010-07-27 Joseph Myers <joseph@codesourcery.com>
* coretypes.h (struct cl_option_handlers): Declare.
* hooks.c (hook_int_size_t_constcharptr_int_0): Remove.
* hooks.h (hook_int_size_t_constcharptr_int_0): Remove.
* langhooks-def.h (lhd_handle_option): Declare.
(LANG_HOOKS_HANDLE_OPTION): Use lhd_handle_option.
* langhooks.c (lhd_handle_option): New.
* langhooks.h (struct lang_hooks): Update prototype and return
value type of handle_option hook.
* optc-gen.awk: Generate target_flags_explicit definition for the
driver.
* opts-common.c: Include diagnostic.h.
(handle_option): Move from opts.c. Update prototype and return
value type. Use handlers structure.
(read_cmdline_option): Move from opts.c. Update prototype. Use
handlers structure.
(set_option): Move from opts.c.
* opts.c (common_handle_option): Update prototype and return value
type. Update calls to handle_option and enable_warning_as_error.
(unknown_option_callback, post_handling_callback,
lang_handle_option, target_handle_option): New.
(handle_option, read_cmdline_option): Move to opts-common.c.
(read_cmdline_options): Update prototype. Update call to
read_cmdline_option.
(decode_options): Initialize and use handlers structure.
(set_option): Move to opts-common.c.
(enable_warning_as_error): Update prototype. Update call to
handle_option.
* opts.h (struct cl_option_handler_func, struct
cl_option_handlers): New.
(handle_option, enable_warning_as_error): Update prototypes.
(read_cmdline_option): Declare.
* Makefile.in (opts-common.o): Update dependencies.
2010-07-27 Maxim Kuvyrkov <maxim@codesourcery.com> 2010-07-27 Maxim Kuvyrkov <maxim@codesourcery.com>
* config/arm/arm.c (params.h): Include. * config/arm/arm.c (params.h): Include.
......
...@@ -2806,7 +2806,7 @@ opts.o : opts.c opts.h options.h $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(CONFIG_H) $( ...@@ -2806,7 +2806,7 @@ opts.o : opts.c opts.h options.h $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) $(CONFIG_H) $(
$(FLAGS_H) $(PARAMS_H) $(TREE_PASS_H) $(DBGCNT_H) debug.h \ $(FLAGS_H) $(PARAMS_H) $(TREE_PASS_H) $(DBGCNT_H) debug.h \
$(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h $(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h
opts-common.o : opts-common.c opts.h options.h $(CONFIG_H) $(SYSTEM_H) \ opts-common.o : opts-common.c opts.h options.h $(CONFIG_H) $(SYSTEM_H) \
coretypes.h intl.h coretypes.h intl.h $(DIAGNOSTIC_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) $(DIAGNOSTIC_CORE_H) \ $(EXPR_H) $(TM_H) $(RTL_H) $(TM_P_H) $(FUNCTION_H) output.h $(TOPLEV_H) $(DIAGNOSTIC_CORE_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 \
......
2010-07-27 Joseph Myers <joseph@codesourcery.com> 2010-07-27 Joseph Myers <joseph@codesourcery.com>
* gcc-interface/misc.c (gnat_handle_option): Update prototype and
return value type. Don't check for missing arguments here.
2010-07-27 Joseph Myers <joseph@codesourcery.com>
* gcc-interface/misc.c (gnat_option_lang_mask): New. * gcc-interface/misc.c (gnat_option_lang_mask): New.
(gnat_init_options): Update prototype. Reconstruct argv array (gnat_init_options): Update prototype. Reconstruct argv array
from decoded options. from decoded options.
......
...@@ -64,7 +64,8 @@ static bool gnat_init (void); ...@@ -64,7 +64,8 @@ static bool gnat_init (void);
static unsigned int gnat_option_lang_mask (void); static unsigned int gnat_option_lang_mask (void);
static void gnat_init_options (unsigned int, static void gnat_init_options (unsigned int,
struct cl_decoded_option *); struct cl_decoded_option *);
static int gnat_handle_option (size_t, const char *, int, int); static bool gnat_handle_option (size_t, const char *, int, int,
const struct cl_option_handlers *);
static bool gnat_post_options (const char **); static bool gnat_post_options (const char **);
static alias_set_type gnat_get_alias_set (tree); static alias_set_type gnat_get_alias_set (tree);
static void gnat_print_decl (FILE *, tree, int); static void gnat_print_decl (FILE *, tree, int);
...@@ -186,22 +187,15 @@ gnat_parse_file (int set_yydebug ATTRIBUTE_UNUSED) ...@@ -186,22 +187,15 @@ gnat_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
/* Decode all the language specific options that cannot be decoded by GCC. /* Decode all the language specific options that cannot be decoded by GCC.
The option decoding phase of GCC calls this routine on the flags that The option decoding phase of GCC calls this routine on the flags that
it cannot decode. Return the number of consecutive arguments from ARGV are marked as Ada-specific. Return true on success or false on failure. */
that have been successfully decoded or 0 on failure. */
static int static bool
gnat_handle_option (size_t scode, const char *arg, int value, gnat_handle_option (size_t scode, const char *arg ATTRIBUTE_UNUSED, int value,
int kind ATTRIBUTE_UNUSED) int kind ATTRIBUTE_UNUSED,
const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
{ {
const struct cl_option *option = &cl_options[scode];
enum opt_code code = (enum opt_code) 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) switch (code)
{ {
case OPT_Wall: case OPT_Wall:
...@@ -250,7 +244,7 @@ gnat_handle_option (size_t scode, const char *arg, int value, ...@@ -250,7 +244,7 @@ gnat_handle_option (size_t scode, const char *arg, int value,
gcc_unreachable (); gcc_unreachable ();
} }
return 1; return true;
} }
/* Return language mask for option processing. */ /* Return language mask for option processing. */
......
2010-07-27 Joseph Myers <joseph@codesourcery.com>
* c-common.h (c_common_handle_option): Update prototype and return
value type.
* c-opts.c (c_common_handle_option): Update prototype and return
value type. Update calls to handle_option and
enable_warning_as_error.
2010-07-27 Jakub Jelinek <jakub@redhat.com> 2010-07-27 Jakub Jelinek <jakub@redhat.com>
PR c/45079 PR c/45079
......
...@@ -658,7 +658,8 @@ extern void set_Wformat (int); ...@@ -658,7 +658,8 @@ extern void set_Wformat (int);
extern tree handle_format_attribute (tree *, tree, tree, int, bool *); extern tree handle_format_attribute (tree *, tree, tree, int, bool *);
extern tree handle_format_arg_attribute (tree *, tree, tree, int, bool *); extern tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
extern bool attribute_takes_identifier_p (const_tree); extern bool attribute_takes_identifier_p (const_tree);
extern int c_common_handle_option (size_t code, const char *arg, int value, int kind); extern bool c_common_handle_option (size_t, const char *, int, int,
const struct cl_option_handlers *);
extern tree c_common_type_for_mode (enum machine_mode, int); extern tree c_common_type_for_mode (enum machine_mode, int);
extern tree c_common_type_for_size (unsigned int, int); extern tree c_common_type_for_size (unsigned int, int);
extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned int, extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned int,
......
...@@ -319,16 +319,15 @@ c_common_init_options (unsigned int decoded_options_count, ...@@ -319,16 +319,15 @@ c_common_init_options (unsigned int decoded_options_count,
} }
/* Handle switch SCODE with argument ARG. VALUE is true, unless no- /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
form of an -f or -W option was given. Returns 0 if the switch was form of an -f or -W option was given. Returns false if the switch was
invalid, a negative number to prevent language-independent invalid, true if valid. Use HANDLERS in recursive handle_option calls. */
processing in toplev.c (a hack necessary for the short-term). */ bool
int
c_common_handle_option (size_t scode, const char *arg, int value, c_common_handle_option (size_t scode, const char *arg, int value,
int kind) int kind, const struct cl_option_handlers *handlers)
{ {
const struct cl_option *option = &cl_options[scode]; const struct cl_option *option = &cl_options[scode];
enum opt_code code = (enum opt_code) scode; enum opt_code code = (enum opt_code) scode;
int result = 1; bool result = true;
/* Prevent resetting the language standard to a C dialect when the driver /* Prevent resetting the language standard to a C dialect when the driver
has already determined that we're looking at assembler input. */ has already determined that we're looking at assembler input. */
...@@ -341,10 +340,10 @@ c_common_handle_option (size_t scode, const char *arg, int value, ...@@ -341,10 +340,10 @@ c_common_handle_option (size_t scode, const char *arg, int value,
{ {
if ((option->flags & CL_TARGET) if ((option->flags & CL_TARGET)
&& ! targetcm.handle_c_option (scode, arg, value)) && ! targetcm.handle_c_option (scode, arg, value))
result = 0; result = false;
break; break;
} }
result = 0; result = false;
break; break;
case OPT__output_pch_: case OPT__output_pch_:
...@@ -438,7 +437,8 @@ c_common_handle_option (size_t scode, const char *arg, int value, ...@@ -438,7 +437,8 @@ c_common_handle_option (size_t scode, const char *arg, int value,
case OPT_Wall: case OPT_Wall:
warn_unused = value; warn_unused = value;
set_Wformat (value); set_Wformat (value);
handle_option (OPT_Wimplicit, value, NULL, c_family_lang_mask, kind); handle_option (OPT_Wimplicit, NULL, value, c_family_lang_mask, kind,
handlers);
warn_char_subscripts = value; warn_char_subscripts = value;
warn_missing_braces = value; warn_missing_braces = value;
warn_parentheses = value; warn_parentheses = value;
...@@ -524,7 +524,8 @@ c_common_handle_option (size_t scode, const char *arg, int value, ...@@ -524,7 +524,8 @@ c_common_handle_option (size_t scode, const char *arg, int value,
case OPT_Werror_implicit_function_declaration: case OPT_Werror_implicit_function_declaration:
/* For backward compatibility, this is the same as /* For backward compatibility, this is the same as
-Werror=implicit-function-declaration. */ -Werror=implicit-function-declaration. */
enable_warning_as_error ("implicit-function-declaration", value, CL_C | CL_ObjC); enable_warning_as_error ("implicit-function-declaration", value,
CL_C | CL_ObjC, handlers);
break; break;
case OPT_Wformat: case OPT_Wformat:
...@@ -538,11 +539,11 @@ c_common_handle_option (size_t scode, const char *arg, int value, ...@@ -538,11 +539,11 @@ c_common_handle_option (size_t scode, const char *arg, int value,
case OPT_Wimplicit: case OPT_Wimplicit:
gcc_assert (value == 0 || value == 1); gcc_assert (value == 0 || value == 1);
if (warn_implicit_int == -1) if (warn_implicit_int == -1)
handle_option (OPT_Wimplicit_int, value, NULL, handle_option (OPT_Wimplicit_int, NULL, value,
c_family_lang_mask, kind); c_family_lang_mask, kind, handlers);
if (warn_implicit_function_declaration == -1) if (warn_implicit_function_declaration == -1)
handle_option (OPT_Wimplicit_function_declaration, value, NULL, handle_option (OPT_Wimplicit_function_declaration, NULL, value,
c_family_lang_mask, kind); c_family_lang_mask, kind, handlers);
break; break;
case OPT_Wimport: case OPT_Wimport:
...@@ -655,7 +656,7 @@ c_common_handle_option (size_t scode, const char *arg, int value, ...@@ -655,7 +656,7 @@ c_common_handle_option (size_t scode, const char *arg, int value,
case OPT_fbuiltin_: case OPT_fbuiltin_:
if (value) if (value)
result = 0; result = false;
else else
disable_builtin_function (arg); disable_builtin_function (arg);
break; break;
......
...@@ -68,6 +68,7 @@ struct cl_target_option; ...@@ -68,6 +68,7 @@ struct cl_target_option;
struct cl_optimization; struct cl_optimization;
struct cl_option; struct cl_option;
struct cl_decoded_option; struct cl_decoded_option;
struct cl_option_handlers;
struct gimple_seq_d; struct gimple_seq_d;
typedef struct gimple_seq_d *gimple_seq; typedef struct gimple_seq_d *gimple_seq;
typedef const struct gimple_seq_d *const_gimple_seq; typedef const struct gimple_seq_d *const_gimple_seq;
......
2010-07-27 Joseph Myers <joseph@codesourcery.com> 2010-07-27 Joseph Myers <joseph@codesourcery.com>
* gfortran.h (gfc_handle_option): Update prototype and return
value type.
* options.c (gfc_handle_option): Update prototype and return value
type.
2010-07-27 Joseph Myers <joseph@codesourcery.com>
* cpp.c (gfc_cpp_init_options): Update prototype. Use number of * cpp.c (gfc_cpp_init_options): Update prototype. Use number of
decoded options in allocating deferred_opt. decoded options in allocating deferred_opt.
* cpp.h (gfc_cpp_init_options): Update prototype. * cpp.h (gfc_cpp_init_options): Update prototype.
......
...@@ -2358,7 +2358,8 @@ int get_c_kind (const char *, CInteropKind_t *); ...@@ -2358,7 +2358,8 @@ int get_c_kind (const char *, CInteropKind_t *);
unsigned int gfc_option_lang_mask (void); unsigned int gfc_option_lang_mask (void);
void gfc_init_options (unsigned int, void gfc_init_options (unsigned int,
struct cl_decoded_option *); struct cl_decoded_option *);
int gfc_handle_option (size_t, const char *, int, int); bool gfc_handle_option (size_t, const char *, int, int,
const struct cl_option_handlers *);
bool gfc_post_options (const char **); bool gfc_post_options (const char **);
/* f95-lang.c */ /* f95-lang.c */
......
...@@ -542,20 +542,21 @@ gfc_handle_runtime_check_option (const char *arg) ...@@ -542,20 +542,21 @@ gfc_handle_runtime_check_option (const char *arg)
/* Handle command-line options. Returns 0 if unrecognized, 1 if /* Handle command-line options. Returns 0 if unrecognized, 1 if
recognized and handled. */ recognized and handled. */
int bool
gfc_handle_option (size_t scode, const char *arg, int value, gfc_handle_option (size_t scode, const char *arg, int value,
int kind ATTRIBUTE_UNUSED) int kind ATTRIBUTE_UNUSED,
const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
{ {
int result = 1; bool result = true;
enum opt_code code = (enum opt_code) scode; enum opt_code code = (enum opt_code) scode;
if (gfc_cpp_handle_option (scode, arg, value) == 1) if (gfc_cpp_handle_option (scode, arg, value) == 1)
return 1; return true;
switch (code) switch (code)
{ {
default: default:
result = 0; result = false;
break; break;
case OPT_Wall: case OPT_Wall:
......
...@@ -160,14 +160,6 @@ hook_int_rtx_bool_0 (rtx a ATTRIBUTE_UNUSED, bool b ATTRIBUTE_UNUSED) ...@@ -160,14 +160,6 @@ hook_int_rtx_bool_0 (rtx a ATTRIBUTE_UNUSED, bool b ATTRIBUTE_UNUSED)
return 0; return 0;
} }
int
hook_int_size_t_constcharptr_int_0 (size_t a ATTRIBUTE_UNUSED,
const char *b ATTRIBUTE_UNUSED,
int c ATTRIBUTE_UNUSED)
{
return 0;
}
unsigned int unsigned int
hook_uint_void_0 (void) hook_uint_void_0 (void)
{ {
......
...@@ -63,7 +63,6 @@ extern int hook_int_const_tree_0 (const_tree); ...@@ -63,7 +63,6 @@ extern int hook_int_const_tree_0 (const_tree);
extern int hook_int_const_tree_const_tree_1 (const_tree, const_tree); extern int hook_int_const_tree_const_tree_1 (const_tree, const_tree);
extern int hook_int_rtx_0 (rtx); extern int hook_int_rtx_0 (rtx);
extern int hook_int_rtx_bool_0 (rtx, bool); extern int hook_int_rtx_bool_0 (rtx, bool);
extern int hook_int_size_t_constcharptr_int_0 (size_t, const char *, int);
extern tree hook_tree_const_tree_null (const_tree); extern tree hook_tree_const_tree_null (const_tree);
......
2010-07-27 Joseph Myers <joseph@codesourcery.com> 2010-07-27 Joseph Myers <joseph@codesourcery.com>
* lang.c (java_handle_option): Update prototype and return value
type.
2010-07-27 Joseph Myers <joseph@codesourcery.com>
* lang.c (java_option_lang_mask): New. * lang.c (java_option_lang_mask): New.
(java_init_options): Update prototype. (java_init_options): Update prototype.
(LANG_HOOKS_OPTION_LANG_MASK): Define. (LANG_HOOKS_OPTION_LANG_MASK): Define.
......
...@@ -50,7 +50,8 @@ static unsigned int java_option_lang_mask (void); ...@@ -50,7 +50,8 @@ static unsigned int java_option_lang_mask (void);
static void java_init_options (unsigned int, struct cl_decoded_option *); static void java_init_options (unsigned int, struct cl_decoded_option *);
static bool java_post_options (const char **); static bool java_post_options (const char **);
static int java_handle_option (size_t scode, const char *arg, int value, int kind); static bool java_handle_option (size_t, const char *, int, int,
const struct cl_option_handlers *);
static void put_decl_string (const char *, int); static void put_decl_string (const char *, int);
static void put_decl_node (tree, int); static void put_decl_node (tree, int);
static void java_print_error_function (diagnostic_context *, const char *, static void java_print_error_function (diagnostic_context *, const char *,
...@@ -174,11 +175,12 @@ struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; ...@@ -174,11 +175,12 @@ struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
/* /*
* process java-specific compiler command-line options * process java-specific compiler command-line options
* return 0, but do not complain if the option is not recognized. * return false, but do not complain if the option is not recognized.
*/ */
static int static bool
java_handle_option (size_t scode, const char *arg, int value, java_handle_option (size_t scode, const char *arg, int value,
int kind ATTRIBUTE_UNUSED) int kind ATTRIBUTE_UNUSED,
const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
{ {
enum opt_code code = (enum opt_code) scode; enum opt_code code = (enum opt_code) scode;
...@@ -269,7 +271,7 @@ java_handle_option (size_t scode, const char *arg, int value, ...@@ -269,7 +271,7 @@ java_handle_option (size_t scode, const char *arg, int value,
case OPT_fdump_: case OPT_fdump_:
if (!dump_switch_p (arg)) if (!dump_switch_p (arg))
return 0; return false;
break; break;
case OPT_fencoding_: case OPT_fencoding_:
...@@ -298,7 +300,7 @@ java_handle_option (size_t scode, const char *arg, int value, ...@@ -298,7 +300,7 @@ java_handle_option (size_t scode, const char *arg, int value,
gcc_unreachable (); gcc_unreachable ();
} }
return 1; return true;
} }
/* Global open file. */ /* Global open file. */
......
...@@ -69,6 +69,8 @@ extern void lhd_initialize_diagnostics (struct diagnostic_context *); ...@@ -69,6 +69,8 @@ extern void lhd_initialize_diagnostics (struct diagnostic_context *);
extern void lhd_init_options (unsigned int, extern void lhd_init_options (unsigned int,
struct cl_decoded_option *); struct cl_decoded_option *);
extern bool lhd_complain_wrong_lang_p (const struct cl_option *); extern bool lhd_complain_wrong_lang_p (const struct cl_option *);
extern bool lhd_handle_option (size_t, const char *, int, int,
const struct cl_option_handlers *);
extern tree lhd_callgraph_analyze_expr (tree *, int *); extern tree lhd_callgraph_analyze_expr (tree *, int *);
...@@ -89,7 +91,7 @@ extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *, ...@@ -89,7 +91,7 @@ extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
#define LANG_HOOKS_INIT_OPTIONS lhd_init_options #define LANG_HOOKS_INIT_OPTIONS lhd_init_options
#define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics
#define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lhd_complain_wrong_lang_p #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lhd_complain_wrong_lang_p
#define LANG_HOOKS_HANDLE_OPTION hook_int_size_t_constcharptr_int_0 #define LANG_HOOKS_HANDLE_OPTION lhd_handle_option
#define LANG_HOOKS_POST_OPTIONS lhd_post_options #define LANG_HOOKS_POST_OPTIONS lhd_post_options
#define LANG_HOOKS_MISSING_NORETURN_OK_P hook_bool_tree_true #define LANG_HOOKS_MISSING_NORETURN_OK_P hook_bool_tree_true
#define LANG_HOOKS_GET_ALIAS_SET lhd_get_alias_set #define LANG_HOOKS_GET_ALIAS_SET lhd_get_alias_set
......
...@@ -351,6 +351,16 @@ lhd_complain_wrong_lang_p (const struct cl_option *option ATTRIBUTE_UNUSED) ...@@ -351,6 +351,16 @@ lhd_complain_wrong_lang_p (const struct cl_option *option ATTRIBUTE_UNUSED)
return true; return true;
} }
/* By default, no language-specific options are valid. */
bool
lhd_handle_option (size_t code ATTRIBUTE_UNUSED,
const char *arg ATTRIBUTE_UNUSED,
int value ATTRIBUTE_UNUSED, int kind ATTRIBUTE_UNUSED,
const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
{
return false;
}
/* The default function to print out name of current function that caused /* The default function to print out name of current function that caused
an error. */ an error. */
void void
......
...@@ -292,11 +292,12 @@ struct lang_hooks ...@@ -292,11 +292,12 @@ struct lang_hooks
which points to permanent storage. The handler is responsible for which points to permanent storage. The handler is responsible for
checking whether ARG is NULL, which indicates that no argument checking whether ARG is NULL, which indicates that no argument
was in fact supplied. For -f and -W switches, VALUE is 1 or 0 was in fact supplied. For -f and -W switches, VALUE is 1 or 0
for the positive and negative forms respectively. for the positive and negative forms respectively. HANDLERS should
be passed to any recursive handle_option calls.
Return 1 if the switch is valid, 0 if invalid, and -1 if it's Return true if the switch is valid, false if invalid. */
valid and should not be treated as language-independent too. */ bool (*handle_option) (size_t code, const char *arg, int value, int kind,
int (*handle_option) (size_t code, const char *arg, int value, int kind); const struct cl_option_handlers *handlers);
/* Called when all command line options have been parsed to allow /* Called when all command line options have been parsed to allow
further processing and initialization further processing and initialization
......
2010-07-27 Joseph Myers <joseph@codesourcery.com> 2010-07-27 Joseph Myers <joseph@codesourcery.com>
* lto-lang.c (lto_handle_option): Update prototype and return
value type. Remove duplicate assignment to result.
2010-07-27 Joseph Myers <joseph@codesourcery.com>
* lto-lang.c (lto_option_lang_mask, lto_complain_wrong_lang_p): * lto-lang.c (lto_option_lang_mask, lto_complain_wrong_lang_p):
New. New.
(lto_init_options): Update prototype. (lto_init_options): Update prototype.
......
...@@ -631,18 +631,18 @@ lto_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED, ...@@ -631,18 +631,18 @@ lto_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
of the option was supplied. */ of the option was supplied. */
const char *resolution_file_name; const char *resolution_file_name;
static int static bool
lto_handle_option (size_t scode, const char *arg, lto_handle_option (size_t scode, const char *arg,
int value ATTRIBUTE_UNUSED, int kind ATTRIBUTE_UNUSED) int value ATTRIBUTE_UNUSED, int kind ATTRIBUTE_UNUSED,
const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
{ {
enum opt_code code = (enum opt_code) scode; enum opt_code code = (enum opt_code) scode;
int result = 1; bool result = true;
switch (code) switch (code)
{ {
case OPT_fresolution_: case OPT_fresolution_:
resolution_file_name = arg; resolution_file_name = arg;
result = 1;
break; break;
case OPT_Wabi: case OPT_Wabi:
......
...@@ -73,6 +73,7 @@ print "#include " quote "intl.h" quote ...@@ -73,6 +73,7 @@ print "#include " quote "intl.h" quote
print "" print ""
print "#ifdef GCC_DRIVER" print "#ifdef GCC_DRIVER"
print "int target_flags;" print "int target_flags;"
print "int target_flags_explicit;"
print "#else" print "#else"
print "#include " quote "flags.h" quote print "#include " quote "flags.h" quote
print "#include " quote "target.h" quote print "#include " quote "target.h" quote
......
...@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "coretypes.h" #include "coretypes.h"
#include "opts.h" #include "opts.h"
#include "options.h" #include "options.h"
#include "diagnostic.h"
/* Perform a binary search to find which option the command-line INPUT /* Perform a binary search to find which option the command-line INPUT
matches. Returns its index in the option array, and matches. Returns its index in the option array, and
...@@ -453,3 +454,136 @@ done: ...@@ -453,3 +454,136 @@ done:
free (options); free (options);
} }
/* Handle option OPT_INDEX, and argument ARG, for the language
indicated by LANG_MASK, using the handlers in HANDLERS. VALUE is
the option value as for the value field of cl_decoded_option. KIND
is the diagnostic_t if this is a diagnostics option, DK_UNSPECIFIED
otherwise. Returns false if the switch was invalid. */
bool
handle_option (size_t opt_index, const char *arg, int value,
unsigned int lang_mask, int kind,
const struct cl_option_handlers *handlers)
{
const struct cl_option *option = &cl_options[opt_index];
size_t i;
if (option->flag_var)
set_option (opt_index, value, arg, kind);
for (i = 0; i < handlers->num_handlers; i++)
if (option->flags & handlers->handlers[i].mask)
{
if (!handlers->handlers[i].handler (opt_index, arg, value,
lang_mask, kind, handlers))
return false;
else
handlers->post_handling_callback (opt_index, arg, value,
handlers->handlers[i].mask);
}
return true;
}
/* Handle the switch DECODED for the language indicated by LANG_MASK,
using the handlers in *HANDLERS. */
void
read_cmdline_option (struct cl_decoded_option *decoded,
unsigned int lang_mask,
const struct cl_option_handlers *handlers)
{
const struct cl_option *option;
const char *opt;
if (decoded->opt_index == OPT_SPECIAL_unknown)
{
opt = decoded->arg;
if (handlers->unknown_option_callback (opt))
error ("unrecognized command line option %qs", opt);
return;
}
option = &cl_options[decoded->opt_index];
opt = decoded->orig_option_with_args_text;
if (decoded->errors & CL_ERR_DISABLED)
{
error ("command line option %qs"
" is not supported by this configuration", opt);
return;
}
if (decoded->errors & CL_ERR_WRONG_LANG)
{
handlers->wrong_lang_callback (opt, option, lang_mask);
return;
}
if (decoded->errors & CL_ERR_MISSING_ARG)
{
if (option->missing_argument_error)
error (option->missing_argument_error, opt);
else
error ("missing argument to %qs", opt);
return;
}
if (decoded->errors & CL_ERR_UINT_ARG)
{
error ("argument to %qs should be a non-negative integer",
option->opt_text);
return;
}
gcc_assert (!decoded->errors);
if (!handle_option (decoded->opt_index, decoded->arg, decoded->value,
lang_mask, DK_UNSPECIFIED, handlers))
error ("unrecognized command line option %qs", opt);
}
/* Set any variable for option OPT_INDEX according to VALUE and ARG,
diagnostic kind KIND. */
void
set_option (int opt_index, int value, const char *arg, int kind)
{
const struct cl_option *option = &cl_options[opt_index];
if (!option->flag_var)
return;
switch (option->var_type)
{
case CLVC_BOOLEAN:
*(int *) option->flag_var = value;
break;
case CLVC_EQUAL:
*(int *) option->flag_var = (value
? option->var_value
: !option->var_value);
break;
case CLVC_BIT_CLEAR:
case CLVC_BIT_SET:
if ((value != 0) == (option->var_type == CLVC_BIT_SET))
*(int *) option->flag_var |= option->var_value;
else
*(int *) option->flag_var &= ~option->var_value;
if (option->flag_var == &target_flags)
target_flags_explicit |= option->var_value;
break;
case CLVC_STRING:
*(const char **) option->flag_var = arg;
break;
}
if ((diagnostic_t) kind != DK_UNSPECIFIED)
diagnostic_classify_diagnostic (global_dc, opt_index, (diagnostic_t) kind,
UNKNOWN_LOCATION);
}
...@@ -135,6 +135,47 @@ struct cl_decoded_option ...@@ -135,6 +135,47 @@ struct cl_decoded_option
int errors; int errors;
}; };
/* Structure describing a single option-handling callback. */
struct cl_option_handler_func
{
/* The function called to handle the option. */
bool (*handler) (size_t opt_index, const char *arg, int value,
unsigned int lang_mask, int kind,
const struct cl_option_handlers *handlers);
/* The mask that must have some bit in common with the flags for the
option for this particular handler to be used. */
unsigned int mask;
};
/* Structure describing the callbacks used in handling options. */
struct cl_option_handlers
{
/* Callback for an unknown option to determine whether to give an
error for it, and possibly store information to diagnose the
option at a later point. Return true if an error should be
given, false otherwise. */
bool (*unknown_option_callback) (const char *opt);
/* Callback to handle, and possibly diagnose, an option for another
language. */
void (*wrong_lang_callback) (const char *text,
const struct cl_option *option,
unsigned int lang_mask);
/* Callback to call after the successful handling of any option. */
void (*post_handling_callback) (size_t opt_index, const char *arg,
int value, unsigned int mask);
/* The number of individual handlers. */
size_t num_handlers;
/* The handlers themselves. */
struct cl_option_handler_func handlers[3];
};
/* Input file names. */ /* Input file names. */
extern const char **in_fnames; extern const char **in_fnames;
...@@ -157,10 +198,15 @@ extern void decode_options (unsigned int argc, const char **argv, ...@@ -157,10 +198,15 @@ 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 *);
extern void set_option (int opt_index, int value, const char *arg, int); extern void set_option (int opt_index, int value, const char *arg, int);
bool handle_option (int opt_index, int value, const char *arg, bool handle_option (size_t opt_index, const char *arg, int value,
unsigned int lang_mask, int kind); unsigned int lang_mask, int kind,
const struct cl_option_handlers *handlers);
extern void read_cmdline_option (struct cl_decoded_option *decoded,
unsigned int lang_mask,
const struct cl_option_handlers *handlers);
extern void register_warning_as_error_callback (void (*callback) (int)); extern void register_warning_as_error_callback (void (*callback) (int));
extern void enable_warning_as_error (const char *arg, int value, extern void enable_warning_as_error (const char *arg, int value,
unsigned int lang_mask); unsigned int lang_mask,
const struct cl_option_handlers *handlers);
extern void print_ignored_options (void); extern void print_ignored_options (void);
#endif #endif
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