diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-28 09:46:26 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-28 09:46:26 +0000 |
commit | b84346c686e626d417ce8a11fdae2034e672eb6e (patch) | |
tree | 2084ee4c9833905c4cdab3491aa8f44e7bfffd24 /gcc/lto-wrapper.c | |
parent | 1fdef5d42ac7ff8801d33bcc36db4206636f8c35 (diff) | |
download | gcc-b84346c686e626d417ce8a11fdae2034e672eb6e.tar.gz |
2010-10-28 Richard Guenther <rguenther@suse.de>
PR driver/50876
* lto-wrapper.c (get_options_from_collect_gcc_options):
Properly count arguments.
(run_gcc): Use an obstack to collect argv, properly separate
switches and their arguments.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180608 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lto-wrapper.c')
-rw-r--r-- | gcc/lto-wrapper.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index f0a3cf3dce2..1bf7ded2524 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -296,8 +296,8 @@ get_options_from_collect_gcc_options (const char *collect_gcc, const char **argv; int i, j, argc; - /* Count arguments. */ - argc = 0; + /* Count arguments, account for the program name. */ + argc = 2; for (j = 0; collect_gcc_options[j] != '\0'; ++j) if (collect_gcc_options[j] == '\'') ++argc; @@ -344,6 +344,8 @@ run_gcc (unsigned argc, char *argv[]) bool no_partition = false; struct cl_decoded_option *decoded_options; unsigned int decoded_options_count; + struct obstack argv_obstack; + int new_head_argc; /* Get the driver and options. */ collect_gcc = getenv ("COLLECT_GCC"); @@ -358,19 +360,17 @@ run_gcc (unsigned argc, char *argv[]) &decoded_options_count); /* Initalize the common arguments for the driver. */ - new_argv = (const char **) xmalloc ((15 + decoded_options_count + argc) - * sizeof (char *)); - argv_ptr = new_argv; - *argv_ptr++ = collect_gcc; - *argv_ptr++ = "-xlto"; - *argv_ptr++ = "-c"; + obstack_init (&argv_obstack); + obstack_ptr_grow (&argv_obstack, collect_gcc); + obstack_ptr_grow (&argv_obstack, "-xlto"); + obstack_ptr_grow (&argv_obstack, "-c"); for (j = 1; j < decoded_options_count; ++j) { struct cl_decoded_option *option = &decoded_options[j]; - /* Do not pass on frontend specific flags. */ + /* Do not pass on frontend specific flags not suitable for lto. */ if (!(cl_options[option->opt_index].flags - & (CL_COMMON|CL_TARGET|CL_DRIVER))) + & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO))) continue; switch (option->opt_index) @@ -416,7 +416,8 @@ run_gcc (unsigned argc, char *argv[]) } /* Pass the option on. */ - *argv_ptr++ = option->orig_option_with_args_text; + for (i = 0; i < option->canonical_option_num_elements; ++i) + obstack_ptr_grow (&argv_obstack, option->canonical_option[i]); } if (no_partition) @@ -446,22 +447,23 @@ run_gcc (unsigned argc, char *argv[]) } if (!bit_bucket) { - *argv_ptr++ = "-dumpdir"; - *argv_ptr++ = output_dir; + obstack_ptr_grow (&argv_obstack, "-dumpdir"); + obstack_ptr_grow (&argv_obstack, output_dir); } - *argv_ptr++ = "-dumpbase"; + obstack_ptr_grow (&argv_obstack, "-dumpbase"); } - else - argv_ptr--; + + /* Remember at which point we can scrub args to re-use the commons. */ + new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *); if (lto_mode == LTO_MODE_LTO) { flto_out = make_temp_file (".lto.o"); if (linker_output) - argv_ptr[0] = linker_output; - argv_ptr[1] = "-o"; - argv_ptr[2] = flto_out; + obstack_ptr_grow (&argv_obstack, linker_output); + obstack_ptr_grow (&argv_obstack, "-o"); + obstack_ptr_grow (&argv_obstack, flto_out); } else { @@ -475,7 +477,7 @@ run_gcc (unsigned argc, char *argv[]) + sizeof (".wpa") + 1); strcpy (dumpbase, linker_output); strcat (dumpbase, ".wpa"); - argv_ptr[0] = dumpbase; + obstack_ptr_grow (&argv_obstack, dumpbase); } if (linker_output && debug) @@ -491,19 +493,21 @@ run_gcc (unsigned argc, char *argv[]) (strlen (ltrans_output_file) + list_option_len + 1)); tmp = list_option_full; - argv_ptr[1] = tmp; + obstack_ptr_grow (&argv_obstack, tmp); strcpy (tmp, list_option); tmp += list_option_len; strcpy (tmp, ltrans_output_file); - argv_ptr[2] = "-fwpa"; + obstack_ptr_grow (&argv_obstack, "-fwpa"); } /* Append the input objects and possible preceeding arguments. */ for (i = 1; i < argc; ++i) - argv_ptr[2 + i] = argv[i]; - argv_ptr[2 + i] = NULL; + obstack_ptr_grow (&argv_obstack, argv[i]); + obstack_ptr_grow (&argv_obstack, NULL); + new_argv = XOBFINISH (&argv_obstack, const char **); + argv_ptr = &new_argv[new_head_argc]; fork_execute (CONST_CAST (char **, new_argv)); if (lto_mode == LTO_MODE_LTO) @@ -656,6 +660,8 @@ cont: free (list_option_full); obstack_free (&env_obstack, NULL); } + + obstack_free (&argv_obstack, NULL); } |