summaryrefslogtreecommitdiff
path: root/gcc/lto-wrapper.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-03 13:13:33 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-03 13:13:33 +0000
commit05f1abc2e5784f4a1c1d00140e2a952e198e8d6f (patch)
tree77b4bd3b0b602c1f3a2f66b93619cd6f7c55f082 /gcc/lto-wrapper.c
parenta5e27f17b6c52476fdc1d3a3f3bf0eb578049689 (diff)
downloadgcc-05f1abc2e5784f4a1c1d00140e2a952e198e8d6f.tar.gz
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 '. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180822 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lto-wrapper.c')
-rw-r--r--gcc/lto-wrapper.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index 1bf7ded2524..c1480f969b7 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -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;
-
- /* 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;
+ int j, k, argc;
+
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);
}