darwin-driver.c (SWITCH_TAKES_ARG, [...]): Remove.
* config/darwin-driver.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Remove. * cppspec.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Remove. * defaults.h (DEFAULT_SWITCH_TAKES_ARG, DEFAULT_WORD_SWITCH_TAKES_ARG): Move from gcc.h. (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Move default definitions from gcc.c. * gcc.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Move to defaults.h. * gcc.h (DEFAULT_SWITCH_TAKES_ARG, DEFAULT_WORD_SWITCH_TAKES_ARG): Move to defaults.h. * opts-common.c: Include tm.h. (decode_cmdline_option): Use SWITCH_TAKES_ARG and WORD_SWITCH_TAKES_ARG to count arguments to unknown options. Handle more than one argument. Set canonical_option_num_elements. (decode_cmdline_options_to_array): Set canonical_option_num_elements and trailing elements of canonical_option. * opts.h (struct cl_decoded_option): Allow four elements in canonical_option. Add field canonical_option_num_elements. * Makefile.in (opts-common.o): Update dependencies. ada: * gcc-interface/misc.c (gnat_init_options): Ignore erroneous options. Check canonical_option_num_elements on options copied. fortran: * gfortranspec.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Remove. From-SVN: r162620
This commit is contained in:
parent
57e15568e8
commit
eea13eaddc
13 changed files with 135 additions and 85 deletions
|
@ -1,3 +1,27 @@
|
|||
2010-07-28 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* config/darwin-driver.c (SWITCH_TAKES_ARG,
|
||||
WORD_SWITCH_TAKES_ARG): Remove.
|
||||
* cppspec.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Remove.
|
||||
* defaults.h (DEFAULT_SWITCH_TAKES_ARG,
|
||||
DEFAULT_WORD_SWITCH_TAKES_ARG): Move from gcc.h.
|
||||
(SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Move default
|
||||
definitions from gcc.c.
|
||||
* gcc.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Move to
|
||||
defaults.h.
|
||||
* gcc.h (DEFAULT_SWITCH_TAKES_ARG, DEFAULT_WORD_SWITCH_TAKES_ARG):
|
||||
Move to defaults.h.
|
||||
* opts-common.c: Include tm.h.
|
||||
(decode_cmdline_option): Use SWITCH_TAKES_ARG and
|
||||
WORD_SWITCH_TAKES_ARG to count arguments to unknown options.
|
||||
Handle more than one argument. Set canonical_option_num_elements.
|
||||
(decode_cmdline_options_to_array): Set
|
||||
canonical_option_num_elements and trailing elements of
|
||||
canonical_option.
|
||||
* opts.h (struct cl_decoded_option): Allow four elements in
|
||||
canonical_option. Add field canonical_option_num_elements.
|
||||
* Makefile.in (opts-common.o): Update dependencies.
|
||||
|
||||
2010-07-28 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR middle-end/44790
|
||||
|
|
|
@ -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 \
|
||||
$(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h
|
||||
opts-common.o : opts-common.c opts.h options.h $(CONFIG_H) $(SYSTEM_H) \
|
||||
coretypes.h intl.h $(DIAGNOSTIC_H)
|
||||
coretypes.h intl.h $(DIAGNOSTIC_H) $(TM_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) \
|
||||
$(MACHMODE_H) $(TARGET_DEF_H) $(TARGET_H) $(GGC_H) gt-targhooks.h \
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-07-28 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc-interface/misc.c (gnat_init_options): Ignore erroneous
|
||||
options. Check canonical_option_num_elements on options copied.
|
||||
|
||||
2010-07-27 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc-interface/misc.c (gnat_handle_option): Update prototype and
|
||||
|
|
|
@ -272,8 +272,13 @@ gnat_init_options (unsigned int decoded_options_count,
|
|||
save_argc = 0;
|
||||
for (i = 0; i < decoded_options_count; i++)
|
||||
{
|
||||
if (decoded_options[i].errors
|
||||
|| decoded_options[i].opt_index == OPT_SPECIAL_unknown)
|
||||
continue;
|
||||
gcc_assert (decoded_options[i].canonical_option_num_elements >= 1
|
||||
&& decoded_options[i].canonical_option_num_elements <= 2);
|
||||
save_argv[save_argc++] = decoded_options[i].canonical_option[0];
|
||||
if (decoded_options[i].canonical_option[1] != NULL)
|
||||
if (decoded_options[i].canonical_option_num_elements >= 2)
|
||||
save_argv[save_argc++] = decoded_options[i].canonical_option[1];
|
||||
}
|
||||
save_argv[save_argc] = NULL;
|
||||
|
|
|
@ -27,14 +27,6 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include <sys/sysctl.h>
|
||||
#include "xregex.h"
|
||||
|
||||
#ifndef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
|
||||
#endif
|
||||
|
||||
#ifndef WORD_SWITCH_TAKES_ARG
|
||||
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
|
||||
#endif
|
||||
|
||||
/* When running on a Darwin system and using that system's headers and
|
||||
libraries, default the -mmacosx-version-min flag to be the version
|
||||
of the system on which the compiler is running. */
|
||||
|
|
|
@ -30,14 +30,6 @@ along with GCC; see the file COPYING3. If not see
|
|||
assume the user knows what they're doing. If no explicit input is
|
||||
mentioned, it will read stdin. */
|
||||
|
||||
#ifndef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
|
||||
#endif
|
||||
|
||||
#ifndef WORD_SWITCH_TAKES_ARG
|
||||
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
|
||||
#endif
|
||||
|
||||
/* Suffixes for known sorts of input files. Note that we do not list
|
||||
files which are normally considered to have been preprocessed already,
|
||||
since the user's expectation is that `cpp' always preprocesses. */
|
||||
|
|
|
@ -32,6 +32,38 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|||
#define GET_ENVIRONMENT(VALUE, NAME) do { (VALUE) = getenv (NAME); } while (0)
|
||||
#endif
|
||||
|
||||
/* This defines which switch letters take arguments. */
|
||||
|
||||
#define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
|
||||
((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
|
||||
|| (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
|
||||
|| (CHAR) == 'I' || (CHAR) == 'J' || (CHAR) == 'm' \
|
||||
|| (CHAR) == 'x' || (CHAR) == 'L' || (CHAR) == 'A' \
|
||||
|| (CHAR) == 'B' )
|
||||
|
||||
/* This defines which multi-letter switches take arguments. */
|
||||
|
||||
#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
|
||||
(!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \
|
||||
|| !strcmp (STR, "Tbss") || !strcmp (STR, "include") \
|
||||
|| !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
|
||||
|| !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
|
||||
|| !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
|
||||
|| !strcmp (STR, "iquote") || !strcmp (STR, "isystem") \
|
||||
|| !strcmp (STR, "isysroot") \
|
||||
|| !strcmp (STR, "-param") || !strcmp (STR, "specs") \
|
||||
|| !strcmp (STR, "MF") || !strcmp (STR, "MT") || !strcmp (STR, "MQ") \
|
||||
|| !strcmp (STR, "fintrinsic-modules-path") \
|
||||
|| !strcmp (STR, "dumpbase") || !strcmp (STR, "dumpdir"))
|
||||
|
||||
#ifndef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG (CHAR)
|
||||
#endif
|
||||
|
||||
#ifndef WORD_SWITCH_TAKES_ARG
|
||||
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
|
||||
#endif
|
||||
|
||||
/* Store in OUTPUT a string (made with alloca) containing an
|
||||
assembler-name for a local static variable or function named NAME.
|
||||
LABELNO is an integer which is different for each call. */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-07-28 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gfortranspec.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG):
|
||||
Remove.
|
||||
|
||||
2010-07-28 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR fortran/45077
|
||||
|
|
|
@ -113,22 +113,6 @@ static void append_arg (const char *);
|
|||
static int g77_newargc;
|
||||
static const char **g77_newargv;
|
||||
|
||||
/* --- This comes from gcc.c (2.8.1) verbatim: */
|
||||
|
||||
/* This defines which switch letters take arguments. */
|
||||
|
||||
#ifndef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
|
||||
#endif
|
||||
|
||||
/* This defines which multi-letter switches take arguments. */
|
||||
|
||||
#ifndef WORD_SWITCH_TAKES_ARG
|
||||
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
|
||||
#endif
|
||||
|
||||
/* --- End of verbatim. */
|
||||
|
||||
/* Assumes text[0] == '-'. Returns number of argv items that belong to
|
||||
(and follow) this one, an option id for options important to the
|
||||
caller, and a pointer to the first char of the arg, if embedded (else
|
||||
|
|
|
@ -946,13 +946,6 @@ struct user_specs
|
|||
|
||||
static struct user_specs *user_specs_head, *user_specs_tail;
|
||||
|
||||
#ifndef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
|
||||
#endif
|
||||
|
||||
#ifndef WORD_SWITCH_TAKES_ARG
|
||||
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
|
||||
/* This defines which switches stop a full compilation. */
|
||||
|
|
25
gcc/gcc.h
25
gcc/gcc.h
|
@ -32,31 +32,6 @@ struct spec_function
|
|||
const char *(*func) (int, const char **);
|
||||
};
|
||||
|
||||
/* This defines which switch letters take arguments. */
|
||||
|
||||
#define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
|
||||
((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
|
||||
|| (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
|
||||
|| (CHAR) == 'I' || (CHAR) == 'J' || (CHAR) == 'm' \
|
||||
|| (CHAR) == 'x' || (CHAR) == 'L' || (CHAR) == 'A' \
|
||||
|| (CHAR) == 'B' )
|
||||
|
||||
/* This defines which multi-letter switches take arguments. */
|
||||
|
||||
#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
|
||||
(!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \
|
||||
|| !strcmp (STR, "Tbss") || !strcmp (STR, "include") \
|
||||
|| !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
|
||||
|| !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
|
||||
|| !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
|
||||
|| !strcmp (STR, "iquote") || !strcmp (STR, "isystem") \
|
||||
|| !strcmp (STR, "isysroot") \
|
||||
|| !strcmp (STR, "-param") || !strcmp (STR, "specs") \
|
||||
|| !strcmp (STR, "MF") || !strcmp (STR, "MT") || !strcmp (STR, "MQ") \
|
||||
|| !strcmp (STR, "fintrinsic-modules-path") \
|
||||
|| !strcmp (STR, "dumpbase") || !strcmp (STR, "dumpdir"))
|
||||
|
||||
|
||||
/* These are exported by gcc.c. */
|
||||
extern int do_spec (const char *);
|
||||
extern void record_temp_file (const char *, int, int);
|
||||
|
|
|
@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "opts.h"
|
||||
#include "options.h"
|
||||
#include "diagnostic.h"
|
||||
#include "tm.h" /* For SWITCH_TAKES_ARG and WORD_SWITCH_TAKES_ARG. */
|
||||
|
||||
/* Perform a binary search to find which option the command-line INPUT
|
||||
matches. Returns its index in the option array, and
|
||||
|
@ -138,7 +139,9 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
|||
const char *opt, *arg = 0;
|
||||
char *dup = 0;
|
||||
int value = 1;
|
||||
unsigned int result = 1;
|
||||
unsigned int result = 1, i;
|
||||
size_t total_len;
|
||||
char *p;
|
||||
const struct cl_option *option;
|
||||
int errors = 0;
|
||||
|
||||
|
@ -242,22 +245,54 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask,
|
|||
decoded->arg = arg;
|
||||
decoded->value = value;
|
||||
decoded->errors = errors;
|
||||
switch (result)
|
||||
|
||||
if (opt_index == OPT_SPECIAL_unknown)
|
||||
{
|
||||
case 1:
|
||||
decoded->orig_option_with_args_text = argv[0];
|
||||
decoded->canonical_option[0] = argv[0];
|
||||
decoded->canonical_option[1] = NULL;
|
||||
break;
|
||||
case 2:
|
||||
decoded->orig_option_with_args_text = concat (argv[0], " ",
|
||||
argv[1], NULL);
|
||||
decoded->canonical_option[0] = argv[0];
|
||||
decoded->canonical_option[1] = argv[1];
|
||||
break;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
/* Skip the correct number of arguments for options handled
|
||||
through specs. */
|
||||
const char *popt = argv[0] + 1;
|
||||
int c = *popt;
|
||||
|
||||
gcc_assert (result == 1);
|
||||
if (SWITCH_TAKES_ARG (c) > (popt[1] != 0))
|
||||
result += SWITCH_TAKES_ARG (c) - (popt[1] != 0);
|
||||
else if (WORD_SWITCH_TAKES_ARG (popt))
|
||||
result += WORD_SWITCH_TAKES_ARG (popt);
|
||||
if (result > 1)
|
||||
for (i = 1; i < result; i++)
|
||||
if (argv[i] == NULL)
|
||||
{
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
|
||||
decoded->canonical_option_num_elements = result;
|
||||
total_len = 0;
|
||||
for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
|
||||
{
|
||||
if (i < result)
|
||||
{
|
||||
decoded->canonical_option[i] = argv[i];
|
||||
total_len += strlen (argv[i]) + 1;
|
||||
}
|
||||
else
|
||||
decoded->canonical_option[i] = NULL;
|
||||
}
|
||||
decoded->orig_option_with_args_text = p = XNEWVEC (char, total_len);
|
||||
for (i = 0; i < result; i++)
|
||||
{
|
||||
size_t len = strlen (argv[i]);
|
||||
|
||||
memcpy (p, argv[i], len);
|
||||
p += len;
|
||||
if (i == result - 1)
|
||||
*p++ = 0;
|
||||
else
|
||||
*p++ = ' ';
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -284,8 +319,11 @@ decode_cmdline_options_to_array (unsigned int argc, const char **argv,
|
|||
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].canonical_option_num_elements = 1;
|
||||
opt_array[0].canonical_option[0] = argv[0];
|
||||
opt_array[0].canonical_option[1] = NULL;
|
||||
opt_array[0].canonical_option[2] = NULL;
|
||||
opt_array[0].canonical_option[3] = NULL;
|
||||
opt_array[0].value = 1;
|
||||
opt_array[0].errors = 0;
|
||||
num_decoded_options = 1;
|
||||
|
@ -300,8 +338,11 @@ decode_cmdline_options_to_array (unsigned int argc, const char **argv,
|
|||
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].canonical_option_num_elements = 1;
|
||||
opt_array[num_decoded_options].canonical_option[0] = opt;
|
||||
opt_array[num_decoded_options].canonical_option[1] = NULL;
|
||||
opt_array[num_decoded_options].canonical_option[2] = NULL;
|
||||
opt_array[num_decoded_options].canonical_option[3] = NULL;
|
||||
opt_array[num_decoded_options].value = 1;
|
||||
opt_array[num_decoded_options].errors = 0;
|
||||
num_decoded_options++;
|
||||
|
|
10
gcc/opts.h
10
gcc/opts.h
|
@ -121,10 +121,12 @@ struct cl_decoded_option
|
|||
/* The canonical form of the option and its argument, for when it is
|
||||
necessary to reconstruct argv elements (in particular, for
|
||||
processing specs and passing options to subprocesses from the
|
||||
driver). The first element of this array is non-NULL; the second
|
||||
is NULL if the canonical form uses only one argv element,
|
||||
non-NULL otherwise. */
|
||||
const char *canonical_option[2];
|
||||
driver). */
|
||||
const char *canonical_option[4];
|
||||
|
||||
/* The number of elements in the canonical form of the option and
|
||||
arguments; always at least 1. */
|
||||
size_t canonical_option_num_elements;
|
||||
|
||||
/* For a boolean option, 1 for the true case and 0 for the "no-"
|
||||
case. For an unsigned integer option, the value of the
|
||||
|
|
Loading…
Add table
Reference in a new issue