From a9024779f1a66dc0e53913194d663a13ae598646 Mon Sep 17 00:00:00 2001 From: Danny Smith Date: Fri, 20 Aug 2004 11:14:11 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/i386/xm-mingw32.h | 3 +++ gcc/doc/hostconfig.texi | 4 ++++ gcc/gcc.c | 13 ++++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 013240c3fe8..5ebb50c810c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-08-20 Danny Smith + + 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 * 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 888196697be..f22347c3fa0 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 a016e561777..dc52b85c5fd 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 bce27bcd5dc..d56a3958e7a 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); -- 2.30.2