diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-03 13:13:33 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-03 13:13:33 +0000 |
commit | 05f1abc2e5784f4a1c1d00140e2a952e198e8d6f (patch) | |
tree | 77b4bd3b0b602c1f3a2f66b93619cd6f7c55f082 /gcc/lto-wrapper.c | |
parent | a5e27f17b6c52476fdc1d3a3f3bf0eb578049689 (diff) | |
download | gcc-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.c | 51 |
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); } |