This patch is a minor variant of the one approved here:
https://gcc.gnu.org/ml/gcc-patches/2014-11/msg00246.html
fixing the problem with linker parameters (which are stored in infiles).
https://gcc.gnu.org/ml/gcc-patches/2014-11/msg00391.html
The only part that has changed, and thus requires approval, is in
gcc/gcc.c, in particular the condition:
+if ((!infiles[i].language || infiles[i].language[0] != '*')
+&& canonical_filename_eq (infiles[i].name, output_file))
is new.
Boot&tested on x86_64-linux-gnu with
--enable-languages=c,c++,objc,fortran,ada,obj-c++
OK?
gcc/testsuite/ChangeLog:
2014-11-08 Anthony Brandon
Manuel López-Ibáñez
PR driver/36312
* gcc.misc-tests/output.exp: New test case for identical input and
output files.
include/ChangeLog:
2014-11-08 Anthony Brandon
Manuel López-Ibáñez
PR driver/36312
* filenames.h: Add prototype for canonical_filename_eq.
gcc/ChangeLog:
2014-11-08 Anthony Brandon
Manuel López-Ibáñez
PR driver/36312
* diagnostic-core.h: Add prototype for fatal_error.
* diagnostic.c (fatal_error): New function fatal_error.
* gcc.c (store_arg): Remove have_o_argbuf_index.
(process_command): Check if input and output files are the same.
* toplev.c (init_asm_output): Check if input and output files are
the same.
libiberty/ChangeLog:
2014-11-08 Anthony Brandon
Manuel López-Ibáñez
PR driver/36312
* filename_cmp.c (canonical_filename_eq): New function to check if
file names are the same.
* functions.texi: Updated with documentation for new function.
Index: include/filenames.h
===
--- include/filenames.h (revision 217234)
+++ include/filenames.h (working copy)
@@ -88,10 +88,12 @@ extern int filename_ncmp (const char *s1
extern hashval_t filename_hash (const void *s);
extern int filename_eq (const void *s1, const void *s2);
+extern int canonical_filename_eq (const char *a, const char *b);
+
#ifdef __cplusplus
}
#endif
#endif /* FILENAMES_H */
Index: libiberty/functions.texi
===
--- libiberty/functions.texi(revision 217234)
+++ libiberty/functions.texi(working copy)
@@ -123,10 +123,20 @@ is deprecated in favor of @code{memset}.
Uses @code{malloc} to allocate storage for @var{nelem} objects of
@var{elsize} bytes each, then zeros the memory.
@end deftypefn
+@c filename_cmp.c:201
+@deftypefn Extension int canonical_filename_eq (const char *@var{a}, const
char *@var{b})
+
+Return non-zero if file names @var{a} and @var{b} are equivalent.
+This function compares the canonical versions of the filenames as returned by
+@code{lrealpath()}, so that so that different file names pointing to the same
+underlying file are treated as being identical.
+
+@end deftypefn
+
@c choose-temp.c:45
@deftypefn Extension char* choose_temp_base (void)
Return a prefix for temporary file names or @code{NULL} if unable to
find one. The current directory is chosen if all else fails so the
@@ -284,11 +294,11 @@ Find the first (least significant) bit s
numbered from right to left, starting with bit 1 (corresponding to the
value 1). If @var{valu} is zero, zero is returned.
@end deftypefn
-@c filename_cmp.c:32
+@c filename_cmp.c:37
@deftypefn Extension int filename_cmp (const char *@var{s1}, const char
*@var{s2})
Return zero if the two file names @var{s1} and @var{s2} are equivalent.
If not equivalent, the returned value is similar to what @code{strcmp}
would return. In other words, it returns a negative value if @var{s1}
@@ -301,28 +311,28 @@ the case when the two filenames point to
However, it does handle the fact that on DOS-like file systems, forward
and backward slashes are equal.
@end deftypefn
-@c filename_cmp.c:178
+@c filename_cmp.c:183
@deftypefn Extension int filename_eq (const void *@var{s1}, const void
*@var{s2})
Return non-zero if file names @var{s1} and @var{s2} are equivalent.
This function is for use with hashtab.c hash tables.
@end deftypefn
-@c filename_cmp.c:147
+@c filename_cmp.c:152
@deftypefn Extension hashval_t filename_hash (const void *@var{s})
Return the hash value for file name @var{s} that will be compared
using filename_cmp.
This function is for use with hashtab.c hash tables.
@end deftypefn
-@c filename_cmp.c:89
+@c filename_cmp.c:94
@deftypefn Extension int filename_ncmp (const char *@var{s1}, const char
*@var{s2}, size_t @var{n})
Return zero if the two file names @var{s1} and @var{s2} are equivalent
in range @var{n}.
If not equivalent, the returned value is similar to what @code{strncmp}
Index: libiberty/filename_cmp.c
===
--- libiberty/filename_cmp.c(revision 217234)
+++ libiberty/filename_cmp.c(working copy)
@@ -22,12 +22,17 @@
#ifdef HAVE_STRING_H
#include
#