re PR other/32998 (-frecord-gcc-switches issues)
PR other/32998 * opth-gen.awk: Generate definitions of OPT_SPECIAL_unknown, OPT_SPECIAL_program_name and OPT_SPECIAL_input_file. * opts-common.c (find_opt): Return OPT_SPECIAL_unknown on failure. (decode_cmdline_option): Update for this return value. Set orig_option_with_args_text field. Set arg field for unknown options. Make static. (decode_cmdline_options_to_array): New. (prune_options): Update handling of find_opt return value. * opts.c (read_cmdline_option): Take decoded option. Return void. (read_cmdline_options): Take decoded options. (decode_options): Add parameters for decoded options. Use decode_cmdline_options_to_array. Use decoded options for -O scan. Use integral_argument for -O parameters. Update call to read_cmdline_options. (enable_warning_as_error): Update handling of find_opt return value. * opts.h: Update comment on unknown options. (struct cl_decoded_option): Update comments on opt_index and arg. Add orig_option_with_args_text. (decode_cmdline_option): Remove. (decode_cmdline_options_to_array): Declare. (decode_options): Update prototype. * toplev.c (save_argv): Remove. (save_decoded_options, save_decoded_options_count): New. (read_integral_parameter): Remove. (print_switch_values): Use decoded options. (toplev_main): Don't set save_argv. Update call to decode_options. * toplev.h (read_integral_parameter): Remove. * varasm.c (elf_record_gcc_switches): Don't handle holding back names. c-family: * c-common.c (parse_optimize_options): Update call to decode_options. fortran: * options.c (gfc_handle_option): Don't handle N_OPTS. testsuite: * gcc.dg/opts-2.c: New test. From-SVN: r161053
This commit is contained in:
parent
1d63e3de09
commit
6e2f19568a
14 changed files with 264 additions and 200 deletions
|
@ -1,3 +1,38 @@
|
|||
2010-06-20 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR other/32998
|
||||
* opth-gen.awk: Generate definitions of OPT_SPECIAL_unknown,
|
||||
OPT_SPECIAL_program_name and OPT_SPECIAL_input_file.
|
||||
* opts-common.c (find_opt): Return OPT_SPECIAL_unknown on failure.
|
||||
(decode_cmdline_option): Update for this return value. Set
|
||||
orig_option_with_args_text field. Set arg field for unknown
|
||||
options. Make static.
|
||||
(decode_cmdline_options_to_array): New.
|
||||
(prune_options): Update handling of find_opt return value.
|
||||
* opts.c (read_cmdline_option): Take decoded option. Return void.
|
||||
(read_cmdline_options): Take decoded options.
|
||||
(decode_options): Add parameters for decoded options. Use
|
||||
decode_cmdline_options_to_array. Use decoded options for -O
|
||||
scan. Use integral_argument for -O parameters. Update call to
|
||||
read_cmdline_options.
|
||||
(enable_warning_as_error): Update handling of find_opt return
|
||||
value.
|
||||
* opts.h: Update comment on unknown options.
|
||||
(struct cl_decoded_option): Update comments on opt_index and arg.
|
||||
Add orig_option_with_args_text.
|
||||
(decode_cmdline_option): Remove.
|
||||
(decode_cmdline_options_to_array): Declare.
|
||||
(decode_options): Update prototype.
|
||||
* toplev.c (save_argv): Remove.
|
||||
(save_decoded_options, save_decoded_options_count): New.
|
||||
(read_integral_parameter): Remove.
|
||||
(print_switch_values): Use decoded options.
|
||||
(toplev_main): Don't set save_argv. Update call to
|
||||
decode_options.
|
||||
* toplev.h (read_integral_parameter): Remove.
|
||||
* varasm.c (elf_record_gcc_switches): Don't handle holding back
|
||||
names.
|
||||
|
||||
2010-06-19 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
PR target/44072
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-06-20 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* c-common.c (parse_optimize_options): Update call to
|
||||
decode_options.
|
||||
|
||||
2010-06-18 Nathan Froyd <froydnj@codesourcery.com>
|
||||
|
||||
* c-common.c (record_types_used_by_current_var_decl): Adjust for
|
||||
|
|
|
@ -7624,6 +7624,8 @@ parse_optimize_options (tree args, bool attr_p)
|
|||
unsigned i;
|
||||
int saved_flag_strict_aliasing;
|
||||
const char **opt_argv;
|
||||
struct cl_decoded_option *decoded_options;
|
||||
unsigned int decoded_options_count;
|
||||
tree ap;
|
||||
|
||||
/* Build up argv vector. Just in case the string is stored away, use garbage
|
||||
|
@ -7716,7 +7718,8 @@ parse_optimize_options (tree args, bool attr_p)
|
|||
saved_flag_strict_aliasing = flag_strict_aliasing;
|
||||
|
||||
/* Now parse the options. */
|
||||
decode_options (opt_argc, opt_argv);
|
||||
decode_options (opt_argc, opt_argv, &decoded_options,
|
||||
&decoded_options_count);
|
||||
|
||||
targetm.override_options_after_change();
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-06-20 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* options.c (gfc_handle_option): Don't handle N_OPTS.
|
||||
|
||||
2010-06-19 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/44584
|
||||
|
|
|
@ -541,10 +541,6 @@ gfc_handle_option (size_t scode, const char *arg, int value,
|
|||
int result = 1;
|
||||
enum opt_code code = (enum opt_code) scode;
|
||||
|
||||
/* Ignore file names. */
|
||||
if (code == N_OPTS)
|
||||
return 1;
|
||||
|
||||
if (gfc_cpp_handle_option (scode, arg, value) == 1)
|
||||
return 1;
|
||||
|
||||
|
|
|
@ -358,7 +358,10 @@ for (i = 0; i < n_opts; i++) {
|
|||
print " " enum "," s "/* -" opts[i] " */"
|
||||
}
|
||||
|
||||
print " N_OPTS"
|
||||
print " N_OPTS,"
|
||||
print " OPT_SPECIAL_unknown,"
|
||||
print " OPT_SPECIAL_program_name,"
|
||||
print " OPT_SPECIAL_input_file"
|
||||
print "};"
|
||||
print ""
|
||||
print "#endif /* OPTIONS_H */"
|
||||
|
|
|
@ -25,8 +25,8 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "options.h"
|
||||
|
||||
/* Perform a binary search to find which option the command-line INPUT
|
||||
matches. Returns its index in the option array, and N_OPTS
|
||||
(cl_options_count) on failure.
|
||||
matches. Returns its index in the option array, and
|
||||
OPT_SPECIAL_unknown on failure.
|
||||
|
||||
This routine is quite subtle. A normal binary search is not good
|
||||
enough because some options can be suffixed with an argument, and
|
||||
|
@ -73,8 +73,8 @@ find_opt (const char *input, int lang_mask)
|
|||
}
|
||||
|
||||
/* This is the switch that is the best match but for a different
|
||||
front end, or cl_options_count if there is no match at all. */
|
||||
match_wrong_lang = cl_options_count;
|
||||
front end, or OPT_SPECIAL_unknown if there is no match at all. */
|
||||
match_wrong_lang = OPT_SPECIAL_unknown;
|
||||
|
||||
/* Backtrace the chain of possible matches, returning the longest
|
||||
one, if any, that fits best. With current GCC switches, this
|
||||
|
@ -94,7 +94,7 @@ find_opt (const char *input, int lang_mask)
|
|||
|
||||
/* If we haven't remembered a prior match, remember this
|
||||
one. Any prior match is necessarily better. */
|
||||
if (match_wrong_lang == cl_options_count)
|
||||
if (match_wrong_lang == OPT_SPECIAL_unknown)
|
||||
match_wrong_lang = mn;
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ find_opt (const char *input, int lang_mask)
|
|||
}
|
||||
while (mn != cl_options_count);
|
||||
|
||||
/* Return the best wrong match, or cl_options_count if none. */
|
||||
/* Return the best wrong match, or OPT_SPECIAL_unknown if none. */
|
||||
return match_wrong_lang;
|
||||
}
|
||||
|
||||
|
@ -129,7 +129,7 @@ integral_argument (const char *arg)
|
|||
LANG_MASK, into the structure *DECODED. Returns the number of
|
||||
switches consumed. */
|
||||
|
||||
unsigned int
|
||||
static unsigned int
|
||||
decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
||||
struct cl_decoded_option *decoded)
|
||||
{
|
||||
|
@ -144,7 +144,7 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
|||
opt = argv[0];
|
||||
|
||||
opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
|
||||
if (opt_index == cl_options_count
|
||||
if (opt_index == OPT_SPECIAL_unknown
|
||||
&& (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
|
||||
&& opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
|
||||
{
|
||||
|
@ -160,8 +160,11 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
|||
opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
|
||||
}
|
||||
|
||||
if (opt_index == cl_options_count)
|
||||
goto done;
|
||||
if (opt_index == OPT_SPECIAL_unknown)
|
||||
{
|
||||
arg = argv[0];
|
||||
goto done;
|
||||
}
|
||||
|
||||
option = &cl_options[opt_index];
|
||||
|
||||
|
@ -169,7 +172,8 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
|||
unrecognized. */
|
||||
if (!value && (option->flags & CL_REJECT_NEGATIVE))
|
||||
{
|
||||
opt_index = cl_options_count;
|
||||
opt_index = OPT_SPECIAL_unknown;
|
||||
arg = argv[0];
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -237,9 +241,76 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
|||
decoded->arg = arg;
|
||||
decoded->value = value;
|
||||
decoded->errors = errors;
|
||||
switch (result)
|
||||
{
|
||||
case 1:
|
||||
decoded->orig_option_with_args_text = argv[0];
|
||||
break;
|
||||
case 2:
|
||||
decoded->orig_option_with_args_text = concat (argv[0], " ",
|
||||
argv[1], NULL);
|
||||
break;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Decode command-line options (ARGC and ARGV being the arguments of
|
||||
main) into an array, setting *DECODED_OPTIONS to a pointer to that
|
||||
array and *DECODED_OPTIONS_COUNT to the number of entries in the
|
||||
array. The first entry in the array is always one for the program
|
||||
name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
|
||||
applicable for decoding. Do not produce any diagnostics or set
|
||||
state outside of these variables. */
|
||||
|
||||
void
|
||||
decode_cmdline_options_to_array (unsigned int argc, const char **argv,
|
||||
unsigned int lang_mask,
|
||||
struct cl_decoded_option **decoded_options,
|
||||
unsigned int *decoded_options_count)
|
||||
{
|
||||
unsigned int n, i;
|
||||
struct cl_decoded_option *opt_array;
|
||||
unsigned int num_decoded_options;
|
||||
|
||||
opt_array = XNEWVEC (struct cl_decoded_option, argc);
|
||||
|
||||
opt_array[0].opt_index = OPT_SPECIAL_program_name;
|
||||
opt_array[0].arg = argv[0];
|
||||
opt_array[0].orig_option_with_args_text = argv[0];
|
||||
opt_array[0].value = 1;
|
||||
opt_array[0].errors = 0;
|
||||
num_decoded_options = 1;
|
||||
|
||||
for (i = 1; i < argc; i += n)
|
||||
{
|
||||
const char *opt = argv[i];
|
||||
|
||||
/* Interpret "-" or a non-switch as a file name. */
|
||||
if (opt[0] != '-' || opt[1] == '\0')
|
||||
{
|
||||
opt_array[num_decoded_options].opt_index = OPT_SPECIAL_input_file;
|
||||
opt_array[num_decoded_options].arg = opt;
|
||||
opt_array[num_decoded_options].orig_option_with_args_text = opt;
|
||||
opt_array[num_decoded_options].value = 1;
|
||||
opt_array[num_decoded_options].errors = 0;
|
||||
num_decoded_options++;
|
||||
n = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
n = decode_cmdline_option (argv + i, lang_mask,
|
||||
&opt_array[num_decoded_options]);
|
||||
num_decoded_options++;
|
||||
}
|
||||
|
||||
opt_array = XRESIZEVEC (struct cl_decoded_option, opt_array,
|
||||
num_decoded_options);
|
||||
*decoded_options = opt_array;
|
||||
*decoded_options_count = num_decoded_options;
|
||||
}
|
||||
|
||||
/* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
|
||||
next one is the same as ORIG_NEXT_OPT_IDX. */
|
||||
|
||||
|
@ -281,7 +352,7 @@ prune_options (int *argcp, char ***argvp)
|
|||
const char *opt = (*argvp) [i];
|
||||
|
||||
opt_index = find_opt (opt + 1, -1);
|
||||
if (opt_index == cl_options_count
|
||||
if (opt_index == OPT_SPECIAL_unknown
|
||||
&& (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
|
||||
&& opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
|
||||
{
|
||||
|
@ -300,7 +371,7 @@ prune_options (int *argcp, char ***argvp)
|
|||
free (dup);
|
||||
}
|
||||
|
||||
if (opt_index == cl_options_count)
|
||||
if (opt_index == OPT_SPECIAL_unknown)
|
||||
{
|
||||
cont:
|
||||
options [i] = 0;
|
||||
|
|
147
gcc/opts.c
147
gcc/opts.c
|
@ -515,67 +515,63 @@ handle_option (int opt_index, int value, const char *arg,
|
|||
return true;
|
||||
}
|
||||
|
||||
/* Handle the switch beginning at ARGV for the language indicated by
|
||||
LANG_MASK. Returns the number of switches consumed. */
|
||||
static unsigned int
|
||||
read_cmdline_option (const char **argv, unsigned int lang_mask)
|
||||
/* Handle the switch DECODED for the language indicated by
|
||||
LANG_MASK. */
|
||||
static void
|
||||
read_cmdline_option (struct cl_decoded_option *decoded,
|
||||
unsigned int lang_mask)
|
||||
{
|
||||
struct cl_decoded_option decoded;
|
||||
unsigned int result;
|
||||
const char *opt;
|
||||
const struct cl_option *option;
|
||||
const char *opt;
|
||||
|
||||
opt = argv[0];
|
||||
|
||||
result = decode_cmdline_option (argv, lang_mask, &decoded);
|
||||
if (decoded.opt_index == cl_options_count)
|
||||
if (decoded->opt_index == OPT_SPECIAL_unknown)
|
||||
{
|
||||
opt = decoded->arg;
|
||||
|
||||
if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
|
||||
/* We don't generate warnings for unknown -Wno-* options
|
||||
unless we issue diagnostics. */
|
||||
postpone_unknown_option_warning (argv[0]);
|
||||
postpone_unknown_option_warning (opt);
|
||||
else
|
||||
error ("unrecognized command line option %qs", opt);
|
||||
return result;
|
||||
return;
|
||||
}
|
||||
|
||||
option = &cl_options[decoded.opt_index];
|
||||
option = &cl_options[decoded->opt_index];
|
||||
opt = decoded->orig_option_with_args_text;
|
||||
|
||||
if (decoded.errors & CL_ERR_DISABLED)
|
||||
if (decoded->errors & CL_ERR_DISABLED)
|
||||
{
|
||||
error ("command line option %qs"
|
||||
" is not supported by this configuration", opt);
|
||||
goto done;
|
||||
return;
|
||||
}
|
||||
|
||||
if (decoded.errors & CL_ERR_WRONG_LANG)
|
||||
if (decoded->errors & CL_ERR_WRONG_LANG)
|
||||
{
|
||||
complain_wrong_lang (argv[0], option, lang_mask);
|
||||
goto done;
|
||||
complain_wrong_lang (opt, option, lang_mask);
|
||||
return;
|
||||
}
|
||||
|
||||
if (decoded.errors & CL_ERR_MISSING_ARG)
|
||||
if (decoded->errors & CL_ERR_MISSING_ARG)
|
||||
{
|
||||
if (!lang_hooks.missing_argument (opt, decoded.opt_index))
|
||||
if (!lang_hooks.missing_argument (opt, decoded->opt_index))
|
||||
error ("missing argument to %qs", opt);
|
||||
goto done;
|
||||
return;
|
||||
}
|
||||
|
||||
if (decoded.errors & CL_ERR_UINT_ARG)
|
||||
if (decoded->errors & CL_ERR_UINT_ARG)
|
||||
{
|
||||
error ("argument to %qs should be a non-negative integer",
|
||||
option->opt_text);
|
||||
goto done;
|
||||
return;
|
||||
}
|
||||
|
||||
gcc_assert (!decoded.errors);
|
||||
gcc_assert (!decoded->errors);
|
||||
|
||||
if (!handle_option (decoded.opt_index, decoded.value, decoded.arg,
|
||||
if (!handle_option (decoded->opt_index, decoded->value, decoded->arg,
|
||||
lang_mask, DK_UNSPECIFIED))
|
||||
error ("unrecognized command line option %qs", opt);
|
||||
|
||||
done:
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Handle FILENAME from the command line. */
|
||||
|
@ -667,40 +663,41 @@ flag_instrument_functions_exclude_p (tree fndecl)
|
|||
}
|
||||
|
||||
|
||||
/* Decode and handle the vector of command line options. LANG_MASK
|
||||
/* Handle the vector of command line options. LANG_MASK
|
||||
contains has a single bit set representing the current
|
||||
language. */
|
||||
static void
|
||||
read_cmdline_options (unsigned int argc, const char **argv, unsigned int lang_mask)
|
||||
read_cmdline_options (struct cl_decoded_option *decoded_options,
|
||||
unsigned int decoded_options_count,
|
||||
unsigned int lang_mask)
|
||||
{
|
||||
unsigned int n, i;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 1; i < argc; i += n)
|
||||
for (i = 1; i < decoded_options_count; i++)
|
||||
{
|
||||
const char *opt = argv[i];
|
||||
|
||||
/* Interpret "-" or a non-switch as a file name. */
|
||||
if (opt[0] != '-' || opt[1] == '\0')
|
||||
if (decoded_options[i].opt_index == OPT_SPECIAL_input_file)
|
||||
{
|
||||
if (main_input_filename == NULL)
|
||||
{
|
||||
main_input_filename = opt;
|
||||
main_input_filename = decoded_options[i].arg;
|
||||
main_input_baselength
|
||||
= base_of_path (main_input_filename, &main_input_basename);
|
||||
}
|
||||
add_input_filename (opt);
|
||||
n = 1;
|
||||
add_input_filename (decoded_options[i].arg);
|
||||
continue;
|
||||
}
|
||||
|
||||
n = read_cmdline_option (argv + i, lang_mask);
|
||||
read_cmdline_option (decoded_options + i, lang_mask);
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse command line options and set default flag values. Do minimal
|
||||
options processing. */
|
||||
options processing. The decoded options are placed in *DECODED_OPTIONS
|
||||
and *DECODED_OPTIONS_COUNT. */
|
||||
void
|
||||
decode_options (unsigned int argc, const char **argv)
|
||||
decode_options (unsigned int argc, const char **argv,
|
||||
struct cl_decoded_option **decoded_options,
|
||||
unsigned int *decoded_options_count)
|
||||
{
|
||||
static bool first_time_p = true;
|
||||
static int initial_min_crossjump_insns;
|
||||
|
@ -733,40 +730,30 @@ decode_options (unsigned int argc, const char **argv)
|
|||
else
|
||||
lang_mask = initial_lang_mask;
|
||||
|
||||
decode_cmdline_options_to_array (argc, argv, lang_mask,
|
||||
decoded_options, decoded_options_count);
|
||||
|
||||
/* Scan to see what optimization level has been specified. That will
|
||||
determine the default value of many flags. */
|
||||
for (i = 1; i < argc; i++)
|
||||
for (i = 1; i < *decoded_options_count; i++)
|
||||
{
|
||||
if (!strcmp (argv[i], "-O"))
|
||||
struct cl_decoded_option *opt = &(*decoded_options)[i];
|
||||
switch (opt->opt_index)
|
||||
{
|
||||
optimize = 1;
|
||||
optimize_size = 0;
|
||||
ofast = 0;
|
||||
}
|
||||
else if (argv[i][0] == '-' && argv[i][1] == 'O')
|
||||
{
|
||||
/* Handle -Os, -O2, -O3, -O69, ... */
|
||||
const char *p = &argv[i][2];
|
||||
|
||||
if ((p[0] == 's') && (p[1] == 0))
|
||||
case OPT_O:
|
||||
if (*opt->arg == '\0')
|
||||
{
|
||||
optimize_size = 1;
|
||||
|
||||
/* Optimizing for size forces optimize to be 2. */
|
||||
optimize = 2;
|
||||
ofast = 0;
|
||||
}
|
||||
else if (strcmp (p, "fast") == 0)
|
||||
{
|
||||
/* -Ofast only adds flags to -O3. */
|
||||
optimize = 1;
|
||||
optimize_size = 0;
|
||||
optimize = 3;
|
||||
ofast = 1;
|
||||
ofast = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
const int optimize_val = read_integral_parameter (p, p - 2, -1);
|
||||
if (optimize_val != -1)
|
||||
const int optimize_val = integral_argument (opt->arg);
|
||||
if (optimize_val == -1)
|
||||
error ("argument to %qs should be a non-negative integer",
|
||||
"-O");
|
||||
else
|
||||
{
|
||||
optimize = optimize_val;
|
||||
if ((unsigned int) optimize > 255)
|
||||
|
@ -775,6 +762,26 @@ decode_options (unsigned int argc, const char **argv)
|
|||
ofast = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case OPT_Os:
|
||||
optimize_size = 1;
|
||||
|
||||
/* Optimizing for size forces optimize to be 2. */
|
||||
optimize = 2;
|
||||
ofast = 0;
|
||||
break;
|
||||
|
||||
case OPT_Ofast:
|
||||
/* -Ofast only adds flags to -O3. */
|
||||
optimize_size = 0;
|
||||
optimize = 3;
|
||||
ofast = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Ignore other options in this prescan. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -927,7 +934,7 @@ decode_options (unsigned int argc, const char **argv)
|
|||
OPTIMIZATION_OPTIONS (optimize, optimize_size);
|
||||
#endif
|
||||
|
||||
read_cmdline_options (argc, argv, lang_mask);
|
||||
read_cmdline_options (*decoded_options, *decoded_options_count, lang_mask);
|
||||
|
||||
if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
|
||||
{
|
||||
|
@ -2419,7 +2426,7 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
|
|||
new_option[0] = 'W';
|
||||
strcpy (new_option + 1, arg);
|
||||
option_index = find_opt (new_option, lang_mask);
|
||||
if (option_index == N_OPTS)
|
||||
if (option_index == OPT_SPECIAL_unknown)
|
||||
{
|
||||
error ("-Werror=%s: No option -%s", arg, new_option);
|
||||
}
|
||||
|
|
26
gcc/opts.h
26
gcc/opts.h
|
@ -92,7 +92,7 @@ extern const unsigned int cl_lang_count;
|
|||
|
||||
/* Possible ways in which a command-line option may be erroneous.
|
||||
These do not include not being known at all; an option index of
|
||||
cl_options_count is used for that. */
|
||||
OPT_SPECIAL_unknown is used for that. */
|
||||
|
||||
#define CL_ERR_DISABLED (1 << 0) /* Disabled in this configuration. */
|
||||
#define CL_ERR_MISSING_ARG (1 << 1) /* Argument required but missing. */
|
||||
|
@ -103,12 +103,20 @@ extern const unsigned int cl_lang_count;
|
|||
|
||||
struct cl_decoded_option
|
||||
{
|
||||
/* The index of this option, or cl_options_count if not known. */
|
||||
/* The index of this option, or an OPT_SPECIAL_* value for
|
||||
non-options and unknown options. */
|
||||
size_t opt_index;
|
||||
|
||||
/* The string argument, or NULL if none. */
|
||||
/* The string argument, or NULL if none. For OPT_SPECIAL_* cases,
|
||||
the option or non-option command-line argument. */
|
||||
const char *arg;
|
||||
|
||||
/* The original text of option plus arguments, with separate argv
|
||||
elements concatenated into one string with spaces separating
|
||||
them. This is for such uses as diagnostics and
|
||||
-frecord-gcc-switches. */
|
||||
const char *orig_option_with_args_text;
|
||||
|
||||
/* For a boolean option, 1 for the true case and 0 for the "no-"
|
||||
case. For an unsigned integer option, the value of the
|
||||
argument. 1 in all other cases. */
|
||||
|
@ -128,11 +136,15 @@ extern unsigned num_in_fnames;
|
|||
|
||||
size_t find_opt (const char *input, int lang_mask);
|
||||
extern int integral_argument (const char *arg);
|
||||
extern unsigned int decode_cmdline_option (const char **argv,
|
||||
unsigned int lang_mask,
|
||||
struct cl_decoded_option *decoded);
|
||||
extern void decode_cmdline_options_to_array (unsigned int argc,
|
||||
const char **argv,
|
||||
unsigned int lang_mask,
|
||||
struct cl_decoded_option **decoded_options,
|
||||
unsigned int *decoded_options_count);
|
||||
extern void prune_options (int *argcp, char ***argvp);
|
||||
extern void decode_options (unsigned int argc, const char **argv);
|
||||
extern void decode_options (unsigned int argc, const char **argv,
|
||||
struct cl_decoded_option **decoded_options,
|
||||
unsigned int *decoded_options_count);
|
||||
extern int option_enabled (int opt_idx);
|
||||
extern bool get_option_state (int, struct cl_option_state *);
|
||||
extern void set_option (int opt_index, int value, const char *arg, int);
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-06-20 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/opts-2.c: New test.
|
||||
|
||||
2010-06-19 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/44584
|
||||
|
|
8
gcc/testsuite/gcc.dg/opts-2.c
Normal file
8
gcc/testsuite/gcc.dg/opts-2.c
Normal file
|
@ -0,0 +1,8 @@
|
|||
/* -O as an operand to another option should not take effect as an
|
||||
optimization option. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-I -O" } */
|
||||
|
||||
#ifdef __OPTIMIZE__
|
||||
#error "__OPTIMIZE__ defined"
|
||||
#endif
|
70
gcc/toplev.c
70
gcc/toplev.c
|
@ -126,8 +126,9 @@ static bool no_backend;
|
|||
/* Length of line when printing switch values. */
|
||||
#define MAX_LINE 75
|
||||
|
||||
/* Copy of argument vector to toplev_main. */
|
||||
static const char **save_argv;
|
||||
/* Decoded options, and number of such options. */
|
||||
static struct cl_decoded_option *save_decoded_options;
|
||||
static unsigned int save_decoded_options_count;
|
||||
|
||||
/* Name of top-level original source file (what was input to cpp).
|
||||
This comes from the #-command at the beginning of the actual input.
|
||||
|
@ -488,34 +489,6 @@ set_random_seed (const char *val)
|
|||
return old;
|
||||
}
|
||||
|
||||
/* Decode the string P as an integral parameter.
|
||||
If the string is indeed an integer return its numeric value else
|
||||
issue an Invalid Option error for the option PNAME and return DEFVAL.
|
||||
If PNAME is zero just return DEFVAL, do not call error. */
|
||||
|
||||
int
|
||||
read_integral_parameter (const char *p, const char *pname, const int defval)
|
||||
{
|
||||
const char *endp = p;
|
||||
|
||||
while (*endp)
|
||||
{
|
||||
if (ISDIGIT (*endp))
|
||||
endp++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (*endp != 0)
|
||||
{
|
||||
if (pname != 0)
|
||||
error ("invalid option argument %qs", pname);
|
||||
return defval;
|
||||
}
|
||||
|
||||
return atoi (p);
|
||||
}
|
||||
|
||||
#if GCC_VERSION < 3004
|
||||
|
||||
/* The functions floor_log2 and exact_log2 are defined as inline
|
||||
|
@ -1338,7 +1311,6 @@ print_switch_values (print_switch_fn_type print_fn)
|
|||
{
|
||||
int pos = 0;
|
||||
size_t j;
|
||||
const char **p;
|
||||
|
||||
/* Fill in the -frandom-seed option, if the user didn't pass it, so
|
||||
that it can be printed below. This helps reproducibility. */
|
||||
|
@ -1349,30 +1321,23 @@ print_switch_values (print_switch_fn_type print_fn)
|
|||
pos = print_single_switch (print_fn, pos,
|
||||
SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
|
||||
|
||||
for (p = &save_argv[1]; *p != NULL; p++)
|
||||
for (j = 1; j < save_decoded_options_count; j++)
|
||||
{
|
||||
if (**p == '-')
|
||||
switch (save_decoded_options[j].opt_index)
|
||||
{
|
||||
case OPT_o:
|
||||
case OPT_d:
|
||||
case OPT_dumpbase:
|
||||
case OPT_dumpdir:
|
||||
case OPT_auxbase:
|
||||
case OPT_quiet:
|
||||
case OPT_version:
|
||||
/* Ignore these. */
|
||||
if (strcmp (*p, "-o") == 0
|
||||
|| strcmp (*p, "-dumpbase") == 0
|
||||
|| strcmp (*p, "-dumpdir") == 0
|
||||
|| strcmp (*p, "-auxbase") == 0)
|
||||
{
|
||||
if (p[1] != NULL)
|
||||
p++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp (*p, "-quiet") == 0
|
||||
|| strcmp (*p, "-version") == 0)
|
||||
continue;
|
||||
|
||||
if ((*p)[1] == 'd')
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
|
||||
pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED, *p);
|
||||
pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED,
|
||||
save_decoded_options[j].orig_option_with_args_text);
|
||||
}
|
||||
|
||||
if (pos > 0)
|
||||
|
@ -2395,14 +2360,13 @@ toplev_main (int argc, char **argv)
|
|||
{
|
||||
expandargv (&argc, &argv);
|
||||
|
||||
save_argv = CONST_CAST2 (const char **, char **, argv);
|
||||
|
||||
/* Initialization of GCC's environment, and diagnostics. */
|
||||
general_init (argv[0]);
|
||||
|
||||
/* Parse the options and do minimal processing; basically just
|
||||
enough to default flags appropriately. */
|
||||
decode_options (argc, CONST_CAST2 (const char **, char **, argv));
|
||||
decode_options (argc, CONST_CAST2 (const char **, char **, argv),
|
||||
&save_decoded_options, &save_decoded_options_count);
|
||||
|
||||
init_local_tick ();
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@ along with GCC; see the file COPYING3. If not see
|
|||
(strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part))
|
||||
|
||||
extern int toplev_main (int, char **);
|
||||
extern int read_integral_parameter (const char *, const char *, const int);
|
||||
extern void strip_off_ending (char *, int);
|
||||
extern void _fatal_insn_not_found (const_rtx, const char *, int, const char *)
|
||||
ATTRIBUTE_NORETURN;
|
||||
|
|
53
gcc/varasm.c
53
gcc/varasm.c
|
@ -7199,50 +7199,11 @@ output_object_blocks (void)
|
|||
int
|
||||
elf_record_gcc_switches (print_switch_type type, const char * name)
|
||||
{
|
||||
static char buffer[1024];
|
||||
|
||||
/* This variable is used as part of a simplistic heuristic to detect
|
||||
command line switches which take an argument:
|
||||
|
||||
"If a command line option does not start with a dash then
|
||||
it is an argument for the previous command line option."
|
||||
|
||||
This fails in the case of the command line option which is the name
|
||||
of the file to compile, but otherwise it is pretty reasonable. */
|
||||
static bool previous_name_held_back = FALSE;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SWITCH_TYPE_PASSED:
|
||||
if (* name != '-')
|
||||
{
|
||||
if (previous_name_held_back)
|
||||
{
|
||||
unsigned int len = strlen (buffer);
|
||||
|
||||
snprintf (buffer + len, sizeof buffer - len, " %s", name);
|
||||
ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
|
||||
ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
|
||||
previous_name_held_back = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy (buffer, name, sizeof buffer);
|
||||
ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
|
||||
ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (previous_name_held_back)
|
||||
{
|
||||
ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
|
||||
ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
|
||||
}
|
||||
|
||||
strncpy (buffer, name, sizeof buffer);
|
||||
previous_name_held_back = TRUE;
|
||||
}
|
||||
ASM_OUTPUT_ASCII (asm_out_file, name, strlen (name));
|
||||
ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
|
||||
break;
|
||||
|
||||
case SWITCH_TYPE_DESCRIPTIVE:
|
||||
|
@ -7251,15 +7212,7 @@ elf_record_gcc_switches (print_switch_type type, const char * name)
|
|||
/* Distinguish between invocations where name is NULL. */
|
||||
static bool started = false;
|
||||
|
||||
if (started)
|
||||
{
|
||||
if (previous_name_held_back)
|
||||
{
|
||||
ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
|
||||
ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (!started)
|
||||
{
|
||||
section * sec;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue