Commit ba85c5fd by Olivier Hainque Committed by Olivier Hainque

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
parent c446cf07
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> 2016-01-12 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/68911 PR tree-optimization/68911
......
...@@ -3299,6 +3299,11 @@ int n_infiles; ...@@ -3299,6 +3299,11 @@ int n_infiles;
static int n_infiles_alloc; 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 /* True if multiple input files are being compiled to a single
assembly file. */ assembly file. */
...@@ -4542,6 +4547,26 @@ process_command (unsigned int decoded_options_count, ...@@ -4542,6 +4547,26 @@ process_command (unsigned int decoded_options_count,
add_infile ("help-dummy", "c"); 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 (); alloc_switch ();
switches[n_switches].part1 = 0; switches[n_switches].part1 = 0;
alloc_infile (); alloc_infile ();
...@@ -9085,14 +9110,17 @@ print_multilib_info (void) ...@@ -9085,14 +9110,17 @@ print_multilib_info (void)
/* getenv built-in spec function. /* getenv built-in spec function.
Returns the value of the environment variable given by its first Returns the value of the environment variable given by its first argument,
argument, concatenated with the second argument. If the concatenated with the second argument. If the variable is not defined, a
environment variable is not defined, a fatal error is issued. */ 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 * static const char *
getenv_spec_function (int argc, const char **argv) getenv_spec_function (int argc, const char **argv)
{ {
const char *value; const char *value;
const char *varname;
char *result; char *result;
char *ptr; char *ptr;
size_t len; size_t len;
...@@ -9100,10 +9128,15 @@ getenv_spec_function (int argc, const char **argv) ...@@ -9100,10 +9128,15 @@ getenv_spec_function (int argc, const char **argv)
if (argc != 2) if (argc != 2)
return NULL; return NULL;
value = env.get (argv[0]); varname = argv[0];
value = env.get (varname);
if (!value && spec_undefvar_allowed)
value = varname;
if (!value) if (!value)
fatal_error (input_location, 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 /* We have to escape every character of the environment variable so
they are not interpreted as active spec characters. A they are not interpreted as active spec characters. A
......
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