aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Smith <dannysmith@users.sourceforge.net>2004-08-20 11:14:11 +0000
committerDanny Smith <dannysmith@gcc.gnu.org>2004-08-20 11:14:11 +0000
commita9024779f1a66dc0e53913194d663a13ae598646 (patch)
tree9dfbe7358ca35bc39796d9b1b9a25bd2a7da1be7
parentc0ca279584af777be53c427c287a5d2972447920 (diff)
downloadgcc-a9024779f1a66dc0e53913194d663a13ae598646.zip
gcc-a9024779f1a66dc0e53913194d663a13ae598646.tar.gz
gcc-a9024779f1a66dc0e53913194d663a13ae598646.tar.bz2
re PR other/5620 (GCC -save-temps foo.c fails to build foo.o)
PR 5620 * gcc.c (struct stat input_stat): Don't define if HOST_LACKS_INODE_NUMBERS (do_spec_1): If HOST_LACKS_INODE_NUMBERS, use lrealpath rather than stat to determine if temp file is same as input file. * doc/hostconfig.texi: Document HOST_LACKS_INODE_NUMBERS. * config/i386/xm-mingw32.h: Define HOST_LACKS_INODE_NUMBERS From-SVN: r86311
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/xm-mingw32.h3
-rw-r--r--gcc/doc/hostconfig.texi4
-rw-r--r--gcc/gcc.c13
4 files changed, 29 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 013240c..5ebb50c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2004-08-20 Danny Smith <dannysmith@users.sourceforge.net>
+
+ PR 5620
+ * gcc.c (struct stat input_stat): Don't define if
+ HOST_LACKS_INODE_NUMBERS
+ (do_spec_1): If HOST_LACKS_INODE_NUMBERS, use lrealpath rather
+ than stat to determine if temp file is same as input file.
+ * doc/hostconfig.texi: Document HOST_LACKS_INODE_NUMBERS.
+ * config/i386/xm-mingw32.h: Define HOST_LACKS_INODE_NUMBERS
+
2004-08-20 Richard Sandiford <rsandifo@redhat.com>
* configure.ac (mips*-*-*): Print an error if not using GAS.
diff --git a/gcc/config/i386/xm-mingw32.h b/gcc/config/i386/xm-mingw32.h
index 8881966..f22347c 100644
--- a/gcc/config/i386/xm-mingw32.h
+++ b/gcc/config/i386/xm-mingw32.h
@@ -27,3 +27,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* This is the name of the null device on windows. */
#define HOST_BIT_BUCKET "nul"
+
+/* The st_ino field of struct stat is always 0. */
+#define HOST_LACKS_INODE_NUMBERS
diff --git a/gcc/doc/hostconfig.texi b/gcc/doc/hostconfig.texi
index a016e56..dc52b85 100644
--- a/gcc/doc/hostconfig.texi
+++ b/gcc/doc/hostconfig.texi
@@ -163,6 +163,10 @@ If you do not define this macro, GCC will use the default version. You
should define this macro if the default version does not reliably remove
the temp file as, for example, on VMS which allows multiple versions
of a file.
+
+@item HOST_LACKS_INODE_NUMBERS
+Define this macro if the host filesystem does not report meaningful inode
+numbers in struct stat.
@end ftable
@node Host Misc
diff --git a/gcc/gcc.c b/gcc/gcc.c
index bce27bc..d56a395 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -4195,7 +4195,9 @@ static int basename_length;
static int suffixed_basename_length;
static const char *input_basename;
static const char *input_suffix;
+#ifndef HOST_LACKS_INODE_NUMBERS
static struct stat input_stat;
+#endif
static int input_stat_set;
/* The compiler used to process the current input file. */
@@ -4759,6 +4761,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
*((char *) temp_filename + temp_filename_length) = '\0';
if (strcmp (temp_filename, input_filename) != 0)
{
+#ifndef HOST_LACKS_INODE_NUMBERS
struct stat st_temp;
/* Note, set_input() resets input_stat_set to 0. */
@@ -4773,11 +4776,19 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
and we can do the stat for the temp_filename
then the they could still refer to the same
file if st_dev/st_ino's are the same. */
-
if (input_stat_set != 1
|| stat (temp_filename, &st_temp) < 0
|| input_stat.st_dev != st_temp.st_dev
|| input_stat.st_ino != st_temp.st_ino)
+#else
+ /* Just compare canonical pathnames. */
+ char* input_realname = lrealpath (input_filename);
+ char* temp_realname = lrealpath (temp_filename);
+ bool files_differ = strcmp (input_realname, temp_realname);
+ free (input_realname);
+ free (temp_realname);
+ if (files_differ)
+#endif
{
temp_filename = save_string (temp_filename,
temp_filename_length + 1);