aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcc.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-02-11 12:23:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-02-11 12:23:08 +0000
commitf68df07c555d474b996e4d08114bd90ece3a1d47 (patch)
treeb5c6ba211c6d44152757721aa56c71c41a65aff2 /gcc/gcc.c
parent8f6aedbafe717b329098a6846167a1bee2821507 (diff)
downloadgcc-f68df07c555d474b996e4d08114bd90ece3a1d47.zip
gcc-f68df07c555d474b996e4d08114bd90ece3a1d47.tar.gz
gcc-f68df07c555d474b996e4d08114bd90ece3a1d47.tar.bz2
re PR driver/43021 (Driver no longer handles fancy names)
2010-02-11 Richard Guenther <rguenther@suse.de> PR driver/43021 * gcc.c (process_command): Handle LTO file@offset case more appropriately. lto/ * lto-elf.c (lto_elf_file_open): Handle file@offset case more appropriately. From-SVN: r156695
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r--gcc/gcc.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 2e219d6..31e4ab3 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -4575,20 +4575,35 @@ process_command (int argc, const char **argv)
}
else
{
- const char *p = strchr (argv[i], '@');
+ const char *p = strrchr (argv[i], '@');
char *fname;
+ long offset;
+ int consumed;
#ifdef HAVE_TARGET_OBJECT_SUFFIX
argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
#endif
- if (!p)
- fname = xstrdup (argv[i]);
- else
- {
+ /* For LTO static archive support we handle input file
+ specifications that are composed of a filename and
+ an offset like FNAME@OFFSET. */
+ if (p
+ && p != argv[i]
+ && sscanf (p, "@%li%n", &offset, &consumed) >= 1
+ && strlen (p) == (unsigned int)consumed)
+ {
fname = (char *)xmalloc (p - argv[i] + 1);
memcpy (fname, argv[i], p - argv[i]);
fname[p - argv[i]] = '\0';
- }
-
+ /* Only accept non-stdin and existing FNAME parts, otherwise
+ try with the full name. */
+ if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
+ {
+ free (fname);
+ fname = xstrdup (argv[i]);
+ }
+ }
+ else
+ fname = xstrdup (argv[i]);
+
if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
{
perror_with_name (fname);