Commit 3c27ce4c by Joey Ye Committed by Joey Ye

re PR lto/50293 (-flto fails if GCC is installed in directory with space in path name)

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.

From-SVN: r196485
parent 8f6d1c86
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.
2013-03-06 Oleg Endo <olegendo@gcc.gnu.org>
PR target/56529
......
......@@ -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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment