Skip to content

Commit

Permalink
Prevent "undef var" errors on gcc --help or --version with self-specs
Browse files Browse the repository at this point in the history
        * 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.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232287 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
hainque committed Jan 12, 2016
1 parent b95d41c commit e1a390d
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 5 deletions.
9 changes: 9 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
43 changes: 38 additions & 5 deletions gcc/gcc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */

Expand Down Expand Up @@ -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 ();
Expand Down Expand Up @@ -9085,25 +9110,33 @@ 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;

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
Expand Down

0 comments on commit e1a390d

Please sign in to comment.