Prevent "undef var" errors on gcc --help or --version with self-specs

* gcc.c (spec_undefvar_allowed): New global.
        (process_command): Set to true when running for --version or --help,
        alone or together.
        (getenv_spec_function): When the variable is not defined, use the
        variable name as the variable value if we're allowed not to issue
        a fatal error.

From-SVN: r232287
This commit is contained in:
Olivier Hainque 2016-01-12 17:53:14 +00:00 committed by Olivier Hainque
parent c446cf07e9
commit ba85c5fd8f
2 changed files with 47 additions and 5 deletions

View File

@ -1,3 +1,12 @@
2016-01-12 Olivier Hainque <hainque@adacore.com>
* gcc.c (spec_undefvar_allowed): New global.
(process_command): Set to true when running for --version or --help,
alone or together.
(getenv_spec_function): When the variable is not defined, use the
variable name as the variable value if we're allowed not to issue
a fatal error.
2016-01-12 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/68911

View File

@ -3299,6 +3299,11 @@ int n_infiles;
static int n_infiles_alloc;
/* True if undefined environment variables encountered during spec processing
are ok to ignore, typically when we're running for --help or --version. */
static bool spec_undefvar_allowed;
/* True if multiple input files are being compiled to a single
assembly file. */
@ -4542,6 +4547,26 @@ process_command (unsigned int decoded_options_count,
add_infile ("help-dummy", "c");
}
/* Decide if undefined variable references are allowed in specs. */
/* --version and --help alone or together are safe. Note that -v would
make them unsafe, as they'd then be run for subprocesses as well, the
location of which might depend on variables possibly coming from
self-specs.
Count the number of options we have for which undefined variables
are harmless for sure, and check that nothing else is set. */
unsigned n_varsafe_options = 0;
if (print_version)
n_varsafe_options++;
if (print_help_list)
n_varsafe_options++;
spec_undefvar_allowed = (n_varsafe_options == decoded_options_count - 1);
alloc_switch ();
switches[n_switches].part1 = 0;
alloc_infile ();
@ -9085,14 +9110,17 @@ print_multilib_info (void)
/* getenv built-in spec function.
Returns the value of the environment variable given by its first
argument, concatenated with the second argument. If the
environment variable is not defined, a fatal error is issued. */
Returns the value of the environment variable given by its first argument,
concatenated with the second argument. If the variable is not defined, a
fatal error is issued unless such undefs are internally allowed, in which
case the variable name is used as the variable value. */
static const char *
getenv_spec_function (int argc, const char **argv)
{
const char *value;
const char *varname;
char *result;
char *ptr;
size_t len;
@ -9100,10 +9128,15 @@ getenv_spec_function (int argc, const char **argv)
if (argc != 2)
return NULL;
value = env.get (argv[0]);
varname = argv[0];
value = env.get (varname);
if (!value && spec_undefvar_allowed)
value = varname;
if (!value)
fatal_error (input_location,
"environment variable %qs not defined", argv[0]);
"environment variable %qs not defined", varname);
/* We have to escape every character of the environment variable so
they are not interpreted as active spec characters. A