PR lto/48217
* lto-wrapper.c (get_options_from_collect_gcc_options): Properly
decode an encoded literal '.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180822
138bc75d-0d04-0410-961f-
82ee72b054a4
+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.
2011-11-03 Tristan Gingold <gingold@adacore.com>
* collect2.c (main): Add support of -f (response file) on AIX.
struct cl_decoded_option **decoded_options,
unsigned int *decoded_options_count)
{
struct cl_decoded_option **decoded_options,
unsigned int *decoded_options_count)
{
+ struct obstack argv_obstack;
char *argv_storage;
const char **argv;
char *argv_storage;
const char **argv;
- int i, j, 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);
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] == '\'')
{
{
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';
+
+ 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);
decode_cmdline_options_to_array (argc, (const char **)argv,
lang_mask,
decoded_options, decoded_options_count);
+ obstack_free (&argv_obstack, NULL);