diff options
author | Richard Guenther <rguenther@suse.de> | 2010-02-11 12:23:08 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-02-11 12:23:08 +0000 |
commit | f68df07c555d474b996e4d08114bd90ece3a1d47 (patch) | |
tree | b5c6ba211c6d44152757721aa56c71c41a65aff2 /gcc/gcc.c | |
parent | 8f6aedbafe717b329098a6846167a1bee2821507 (diff) | |
download | gcc-f68df07c555d474b996e4d08114bd90ece3a1d47.tar.gz |
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.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c index 2e219d614e9..31e4ab37513 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); |