re PR other/5620 (GCC -save-temps foo.c fails to build foo.o)
authorDanny Smith <dannysmith@users.sourceforge.net>
Fri, 20 Aug 2004 11:14:11 +0000 (11:14 +0000)
committerDanny Smith <dannysmith@gcc.gnu.org>
Fri, 20 Aug 2004 11:14:11 +0000 (11:14 +0000)
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

gcc/ChangeLog
gcc/config/i386/xm-mingw32.h
gcc/doc/hostconfig.texi
gcc/gcc.c

index 013240c3fe87b14fabae3946e2c739695d8fc85d..5ebb50c810c70d9c05c1e227f639f21515e2fb5b 100644 (file)
@@ -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.
index 888196697be9daa7be3afee3c6bfa4e83055cf8e..f22347c3fa0bdb349464637439cc56c489c82041 100644 (file)
@@ -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
index a016e561777ee00225dcf04b9879fcc5b213bef7..dc52b85c5fd46dd56b1cdfd2e377ab03ef7f80d2 100644 (file)
@@ -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
index bce27bcd5dcd40032d0413784dbdfb65db204ec4..d56a3958e7a58649c013520964509c85ed42a673 100644 (file)
--- 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);