re PR lto/48217 (lto mishandles quotes in command line defines)

2011-11-03  Richard Guenther  <rguenther@suse.de>

	PR lto/48217
	* lto-wrapper.c (get_options_from_collect_gcc_options): Properly
	decode an encoded literal '.

From-SVN: r180822
This commit is contained in:
Richard Guenther 2011-11-03 13:13:33 +00:00 committed by Richard Biener
parent 4f44e38ac7
commit 969d578c2d
2 changed files with 35 additions and 20 deletions

View File

@ -1,3 +1,9 @@
2011-11-03 Richard Guenther <rguenther@suse.de>
PR lto/48217
* lto-wrapper.c (get_options_from_collect_gcc_options): Properly
decode an encoded literal '.
2011-11-03 Tristan Gingold <gingold@adacore.com>
* collect2.c (main): Add support of -f (response file) on AIX.

View File

@ -292,39 +292,48 @@ get_options_from_collect_gcc_options (const char *collect_gcc,
struct cl_decoded_option **decoded_options,
unsigned int *decoded_options_count)
{
struct obstack argv_obstack;
char *argv_storage;
const char **argv;
int i, j, argc;
int j, k, argc;
/* Count arguments, account for the program name. */
argc = 2;
for (j = 0; collect_gcc_options[j] != '\0'; ++j)
if (collect_gcc_options[j] == '\'')
++argc;
if (argc % 2 != 0)
fatal ("malformed COLLECT_GCC_OPTIONS");
/* Copy the options to a argv-like array. */
argc /= 2;
argv = (const char **) xmalloc ((argc + 2) * sizeof (char *));
argv[0] = collect_gcc;
argv_storage = xstrdup (collect_gcc_options);
for (i = 1, j = 0; argv_storage[j] != '\0'; ++j)
obstack_init (&argv_obstack);
obstack_ptr_grow (&argv_obstack, collect_gcc);
for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
{
if (argv_storage[j] == '\'')
{
argv[i++] = &argv_storage[++j];
while (argv_storage[j] != '\'')
++j;
argv_storage[j] = '\0';
obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
++j;
do
{
if (argv_storage[j] == '\0')
fatal ("malformed COLLECT_GCC_OPTIONS");
else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
{
argv_storage[k++] = '\'';
j += 4;
}
else if (argv_storage[j] == '\'')
break;
else
argv_storage[k++] = argv_storage[j++];
}
while (1);
argv_storage[k++] = '\0';
}
}
argv[i] = NULL;
obstack_ptr_grow (&argv_obstack, NULL);
argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
argv = XOBFINISH (&argv_obstack, const char **);
decode_cmdline_options_to_array (argc, (const char **)argv,
lang_mask,
decoded_options, decoded_options_count);
free (argv);
obstack_free (&argv_obstack, NULL);
}