diff options
author | jye2 <jye2@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-03-06 06:32:03 +0000 |
---|---|---|
committer | jye2 <jye2@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-03-06 06:32:03 +0000 |
commit | 40c059b1d7ce04405d8897813997e1f3ce8b97e9 (patch) | |
tree | 4c3cf99f1787e5d18623890c1f8f5e6db8d7a684 /gcc/gcc.c | |
parent | 9fe603c35ae9aeebef1fb77bf4df7d9832904d79 (diff) | |
download | gcc-40c059b1d7ce04405d8897813997e1f3ce8b97e9.tar.gz |
2013-03-06 Joey Ye <joey.ye@arm.com>
PR lto/50293
* gcc.c (convert_white_space): New function.
(main): Handles white space in function name.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196485 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r-- | gcc/gcc.c | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c index 5022789609c..86077f8cf32 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -265,6 +265,7 @@ static const char *compare_debug_self_opt_spec_function (int, const char **); static const char *compare_debug_auxbase_opt_spec_function (int, const char **); static const char *pass_through_libs_spec_func (int, const char **); static const char *replace_extension_spec_func (int, const char **); +static char *convert_white_space (char *); /* The Specs Language @@ -6627,6 +6628,7 @@ main (int argc, char **argv) X_OK, false); if (lto_wrapper_file) { + lto_wrapper_file = convert_white_space (lto_wrapper_file); lto_wrapper_spec = lto_wrapper_file; obstack_init (&collect_obstack); obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=", @@ -7037,12 +7039,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" + strlen (fuse_linker_plugin), 0)) #endif { - linker_plugin_file_spec = find_a_file (&exec_prefixes, - LTOPLUGINSONAME, R_OK, - false); - if (!linker_plugin_file_spec) + char *temp_spec = find_a_file (&exec_prefixes, + LTOPLUGINSONAME, R_OK, + false); + if (!temp_spec) fatal_error ("-fuse-linker-plugin, but %s not found", LTOPLUGINSONAME); + linker_plugin_file_spec = convert_white_space (temp_spec); } #endif lto_gcc_spec = argv[0]; @@ -8538,3 +8541,51 @@ replace_extension_spec_func (int argc, const char **argv) free (name); return result; } + +/* Insert backslash before spaces in ORIG (usually a file path), to + avoid being broken by spec parser. + + This function is needed as do_spec_1 treats white space (' ' and '\t') + as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so, + the file name should be treated as a single argument rather than being + broken into multiple. Solution is to insert '\\' before the space in a + file name. + + This function converts and only converts all occurrence of ' ' + to '\\' + ' ' and '\t' to '\\' + '\t'. For example: + "a b" -> "a\\ b" + "a b" -> "a\\ \\ b" + "a\tb" -> "a\\\tb" + "a\\ b" -> "a\\\\ b" + + orig: input null-terminating string that was allocated by xalloc. The + memory it points to might be freed in this function. Behavior undefined + if ORIG wasn't xalloced or was freed already at entry. + + Return: ORIG if no conversion needed. Otherwise a newly allocated string + that was converted from ORIG. */ + +static char * +convert_white_space (char *orig) +{ + int len, number_of_space = 0; + + for (len = 0; orig[len]; len++) + if (orig[len] == ' ' || orig[len] == '\t') number_of_space++; + + if (number_of_space) + { + char *new_spec = (char *) xmalloc (len + number_of_space + 1); + int j, k; + for (j = 0, k = 0; j <= len; j++, k++) + { + if (orig[j] == ' ' || orig[j] == '\t') + new_spec[k++] = '\\'; + new_spec[k] = orig[j]; + } + free (orig); + return new_spec; + } + else + return orig; +} |