From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27169 invoked by alias); 19 May 2011 16:11:40 -0000 Received: (qmail 27158 invoked by uid 22791); 19 May 2011 16:11:37 -0000 X-SWARE-Spam-Status: No, hits=-0.8 required=5.0 tests=AWL,BAYES_40,TW_RG,TW_VF,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 19 May 2011 16:11:21 +0000 Received: (qmail 21450 invoked from network); 19 May 2011 16:11:20 -0000 Received: from unknown (HELO digraph.polyomino.org.uk) (joseph@127.0.0.2) by mail.codesourcery.com with ESMTPA; 19 May 2011 16:11:20 -0000 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.72) (envelope-from ) id 1QN5ok-00043g-Rl; Thu, 19 May 2011 16:11:18 +0000 Date: Thu, 19 May 2011 18:13:00 -0000 From: "Joseph S. Myers" To: gcc-patches@gcc.gnu.org cc: gdr@integrable-solutions.net Subject: Make collect2 use common diagnostics code Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-05/txt/msg01399.txt.bz2 This patch makes collect2 use the common diagnostics infrastructure, instead of its own diagnostic functions. (This is in preparation for having a hooks structure shared between the driver and cc1. Recall that as described in the idea is that collect2 is logically part of the driver, and in the interests of simplicity it is intended to share the same hooks as the rest of the driver.) Bootstrapped with no regressions on x86_64-unknown-linux-gnu. OK to commit? 2011-05-19 Joseph Myers * collect2.c: Include diagnostic.h. (fatal_perror, fatal, error, fancy_abort): Remove. (main): Set progname. Call xmalloc_set_program_name and diagnostic_initialize. (maybe_run_lto_and_relink, main, collect_execute, scan_prog_file, scan_libraries, resolve_lib_name): Call fatal_error instead of fatal and fatal_perror. * collect2.h (error, fatal, fatal_perror): Don't declare. * tlink.c: Include diagnostic-core.h. (recompile_files): Call fatal_error instead of fatal_perror. * Makefile.in (COLLECT2_OBJS): Include diagnostic.o, pretty-print.o and input.o. (collect2.o, tlink.o): Update dependencies. testsuite: 2011-05-19 Joseph Myers * lib/prune.exe (prune_gcc_output): Expect "error:" in collect2 output. Index: gcc/testsuite/lib/prune.exp =================================================================== --- gcc/testsuite/lib/prune.exp (revision 173864) +++ gcc/testsuite/lib/prune.exp (working copy) @@ -1,4 +1,4 @@ -# Copyright (C) 1997, 1999, 2000, 2002, 2004, 2007, 2008, 2010 +# Copyright (C) 1997, 1999, 2000, 2002, 2004, 2007, 2008, 2010, 2011 # Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify @@ -25,7 +25,7 @@ proc prune_gcc_output { text } { regsub -all "(^|\n)\[^\n\]*: (recursively )?instantiated from \[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*: . skipping \[0-9\]* instantiation contexts \[^\n\]*" $text "" text regsub -all "(^|\n) inlined from \[^\n\]*" $text "" text - regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text + regsub -all "(^|\n)collect2: error: ld returned \[^\n\]*" $text "" text regsub -all "(^|\n)collect: re(compiling|linking)\[^\n\]*" $text "" text regsub -all "(^|\n)Please submit.*instructions\[^\n\]*" $text "" text regsub -all "(^|\n)\[0-9\]\[0-9\]* errors\." $text "" text Index: gcc/tlink.c =================================================================== --- gcc/tlink.c (revision 173864) +++ gcc/tlink.c (working copy) @@ -2,7 +2,7 @@ them. Copyright (C) 1995, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008, - 2009, 2010 Free Software Foundation, Inc. + 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Jason Merrill (jason@cygnus.com). This file is part of GCC. @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. #include "demangle.h" #include "collect2.h" #include "filenames.h" +#include "diagnostic-core.h" /* TARGET_64BIT may be defined to use driver specific functionality. */ #undef TARGET_64BIT @@ -477,9 +478,9 @@ recompile_files (void) the new file name already exists. Therefore, we explicitly remove the old file first. */ if (remove (f->key) == -1) - fatal_perror ("removing .rpo file"); + fatal_error ("removing .rpo file: %m"); if (rename (outname, f->key) == -1) - fatal_perror ("renaming .rpo file"); + fatal_error ("renaming .rpo file: %m"); if (!f->args) { Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 173864) +++ gcc/Makefile.in (working copy) @@ -2089,7 +2089,8 @@ sbitmap.o: sbitmap.c sbitmap.h $(CONFIG_ ebitmap.o: ebitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(EBITMAP_H) sparseset.o: sparseset.c $(SYSTEM_H) sparseset.h $(CONFIG_H) -COLLECT2_OBJS = collect2.o collect2-aix.o tlink.o intl.o version.o +COLLECT2_OBJS = collect2.o collect2-aix.o tlink.o intl.o version.o \ + diagnostic.o pretty-print.o input.o COLLECT2_LIBS = @COLLECT2_LIBS@ collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS) # Don't try modifying collect2 (aka ld) in place--it might be linking this. @@ -2098,7 +2099,8 @@ collect2$(exeext): $(COLLECT2_OBJS) $(LI mv -f T$@ $@ collect2.o : collect2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h \ - $(OBSTACK_H) $(DEMANGLE_H) collect2.h collect2-aix.h version.h + $(OBSTACK_H) $(DEMANGLE_H) collect2.h collect2-aix.h version.h \ + $(DIAGNOSTIC_H) $(COMPILER) $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \ -DTARGET_MACHINE=\"$(target_noncanonical)\" \ -c $(srcdir)/collect2.c $(OUTPUT_OPTION) @TARGET_SYSTEM_ROOT_DEFINE@ @@ -2107,7 +2109,7 @@ collect2-aix.o : collect2-aix.c $(CONFIG collect2-aix.h tlink.o: tlink.c $(DEMANGLE_H) $(HASHTAB_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ - $(OBSTACK_H) collect2.h intl.h + $(OBSTACK_H) collect2.h intl.h $(DIAGNOSTIC_CORE_H) lto-wrapper$(exeext): lto-wrapper.o intl.o $(LIBDEPS) +$(COMPILER) $(ALL_COMPILERFLAGS) $(LDFLAGS) -o T$@ lto-wrapper.o intl.o $(LIBS) Index: gcc/collect2.c =================================================================== --- gcc/collect2.c (revision 173864) +++ gcc/collect2.c (working copy) @@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. #include "collect2.h" #include "collect2-aix.h" +#include "diagnostic.h" #include "demangle.h" #include "obstack.h" #include "intl.h" @@ -444,62 +445,6 @@ notice_translated (const char *cmsgid, . vfprintf (stderr, cmsgid, ap); va_end (ap); } - -/* Die when sys call fails. */ - -void -fatal_perror (const char * cmsgid, ...) -{ - int e = errno; - va_list ap; - - va_start (ap, cmsgid); - fprintf (stderr, "collect2: "); - vfprintf (stderr, _(cmsgid), ap); - fprintf (stderr, ": %s\n", xstrerror (e)); - va_end (ap); - - collect_exit (FATAL_EXIT_CODE); -} - -/* Just die. */ - -void -fatal (const char * cmsgid, ...) -{ - va_list ap; - - va_start (ap, cmsgid); - fprintf (stderr, "collect2: "); - vfprintf (stderr, _(cmsgid), ap); - fprintf (stderr, "\n"); - va_end (ap); - - collect_exit (FATAL_EXIT_CODE); -} - -/* Write error message. */ - -void -error (const char * gmsgid, ...) -{ - va_list ap; - - va_start (ap, gmsgid); - fprintf (stderr, "collect2: "); - vfprintf (stderr, _(gmsgid), ap); - fprintf (stderr, "\n"); - va_end(ap); -} - -/* In case obstack is linked in, and abort is defined to fancy_abort, - provide a default entry. */ - -void -fancy_abort (const char *file, int line, const char *func) -{ - fatal ("internal gcc abort in %s, at %s:%d", func, file, line); -} static void handler (int signo) @@ -953,7 +898,7 @@ maybe_run_lto_and_relink (char **lto_ld_ size_t num_files; if (!lto_wrapper) - fatal ("COLLECT_LTO_WRAPPER must be set"); + fatal_error ("COLLECT_LTO_WRAPPER must be set"); num_lto_c_args++; @@ -1151,6 +1096,13 @@ main (int argc, char **argv) int num_c_args; char **old_argv; + p = argv[0] + strlen (argv[0]); + while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1])) + --p; + progname = p; + + xmalloc_set_program_name (progname); + old_argv = argv; expandargv (&argc, &argv); if (argv != old_argv) @@ -1181,6 +1133,8 @@ main (int argc, char **argv) gcc_init_libintl (); + diagnostic_initialize (global_dc, 0); + /* Do not invoke xcalloc before this point, since locale needs to be set first, in case a diagnostic is issued. */ @@ -1270,7 +1224,7 @@ main (int argc, char **argv) c_ptr = CONST_CAST2 (const char **, char **, c_argv); if (argc < 2) - fatal ("no arguments"); + fatal_error ("no arguments"); #ifdef SIGQUIT if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) @@ -1671,10 +1625,10 @@ main (int argc, char **argv) exportf = fopen (export_file, "w"); if (exportf == (FILE *) 0) - fatal_perror ("fopen %s", export_file); + fatal_error ("fopen %s: %m", export_file); write_aix_file (exportf, exports.first); if (fclose (exportf)) - fatal_perror ("fclose %s", export_file); + fatal_error ("fclose %s: %m", export_file); } #endif @@ -1854,12 +1808,12 @@ main (int argc, char **argv) maybe_unlink(output_file); outf = fopen (c_file, "w"); if (outf == (FILE *) 0) - fatal_perror ("fopen %s", c_file); + fatal_error ("fopen %s: %m", c_file); write_c_file (outf, c_file); if (fclose (outf)) - fatal_perror ("fclose %s", c_file); + fatal_error ("fclose %s: %m", c_file); /* Tell the linker that we have initializer and finalizer functions. */ #ifdef LD_INIT_SWITCH @@ -1889,10 +1843,10 @@ main (int argc, char **argv) #endif exportf = fopen (export_file, "w"); if (exportf == (FILE *) 0) - fatal_perror ("fopen %s", export_file); + fatal_error ("fopen %s: %m", export_file); write_aix_file (exportf, exports.first); if (fclose (exportf)) - fatal_perror ("fclose %s", export_file); + fatal_error ("fclose %s: %m", export_file); } #endif @@ -1956,7 +1910,7 @@ collect_wait (const char *prog, struct p int status; if (!pex_get_status (pex, 1, &status)) - fatal_perror ("can't get program status"); + fatal_error ("can't get program status: %m"); pex_free (pex); if (status) @@ -2025,17 +1979,17 @@ collect_execute (const char *prog, char f = fopen (response_file, "w"); if (f == NULL) - fatal ("could not open response file %s", response_file); + fatal_error ("could not open response file %s", response_file); status = writeargv (current_argv, f); if (status) - fatal ("could not write to response file %s", response_file); + fatal_error ("could not write to response file %s", response_file); status = fclose (f); if (EOF == status) - fatal ("could not close response file %s", response_file); + fatal_error ("could not close response file %s", response_file); response_arg = concat ("@", response_file, NULL); response_argv[0] = argv0; @@ -2068,11 +2022,11 @@ collect_execute (const char *prog, char since we might not end up needing something that we could not find. */ if (argv[0] == 0) - fatal ("cannot find '%s'", prog); + fatal_error ("cannot find '%s'", prog); pex = pex_init (0, "collect2", NULL); if (pex == NULL) - fatal_perror ("pex_init failed"); + fatal_error ("pex_init failed: %m"); errmsg = pex_run (pex, flags, argv[0], argv, outname, errname, &err); @@ -2081,10 +2035,10 @@ collect_execute (const char *prog, char if (err != 0) { errno = err; - fatal_perror (errmsg); + fatal_error ("%s: %m", _(errmsg)); } else - fatal (errmsg); + fatal_error (errmsg); } free (response_arg); @@ -2582,7 +2536,7 @@ scan_prog_file (const char *prog_name, s /* If we do not have an `nm', complain. */ if (nm_file_name == 0) - fatal ("cannot find 'nm'"); + fatal_error ("cannot find 'nm'"); nm_argv[argc++] = nm_file_name; if (NM_FLAGS[0] != '\0') @@ -2608,7 +2562,7 @@ scan_prog_file (const char *prog_name, s pex = pex_init (PEX_USE_PIPES, "collect2", NULL); if (pex == NULL) - fatal_perror ("pex_init failed"); + fatal_error ("pex_init failed: %m"); errmsg = pex_run (pex, 0, nm_file_name, real_nm_argv, NULL, HOST_BIT_BUCKET, &err); @@ -2617,10 +2571,10 @@ scan_prog_file (const char *prog_name, s if (err != 0) { errno = err; - fatal_perror (errmsg); + fatal_error ("%s: %m", _(errmsg)); } else - fatal (errmsg); + fatal_error (errmsg); } int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN); @@ -2630,7 +2584,7 @@ scan_prog_file (const char *prog_name, s inf = pex_read_output (pex, 0); if (inf == NULL) - fatal_perror ("can't open nm output"); + fatal_error ("can't open nm output: %m"); if (debug) { @@ -2713,7 +2667,7 @@ scan_prog_file (const char *prog_name, s if (! (filter & SCAN_INIT)) break; if (which_pass != PASS_LIB) - fatal ("init function found in object %s", prog_name); + fatal_error ("init function found in object %s", prog_name); #ifndef LD_INIT_SWITCH add_to_list (&constructors, name); #endif @@ -2723,7 +2677,7 @@ scan_prog_file (const char *prog_name, s if (! (filter & SCAN_FINI)) break; if (which_pass != PASS_LIB) - fatal ("fini function found in object %s", prog_name); + fatal_error ("fini function found in object %s", prog_name); #ifndef LD_FINI_SWITCH add_to_list (&destructors, name); #endif @@ -2804,7 +2758,7 @@ scan_libraries (const char *prog_name) pex = pex_init (PEX_USE_PIPES, "collect2", NULL); if (pex == NULL) - fatal_perror ("pex_init failed"); + fatal_error ("pex_init failed: %m"); errmsg = pex_run (pex, 0, ldd_file_name, real_ldd_argv, NULL, NULL, &err); if (errmsg != NULL) @@ -2812,10 +2766,10 @@ scan_libraries (const char *prog_name) if (err != 0) { errno = err; - fatal_perror (errmsg); + fatal_error ("%s: %m", _(errmsg)); } else - fatal (errmsg); + fatal_error (errmsg); } int_handler = (void (*) (int)) signal (SIGINT, SIG_IGN); @@ -2825,7 +2779,7 @@ scan_libraries (const char *prog_name) inf = pex_read_output (pex, 0); if (inf == NULL) - fatal_perror ("can't open ldd output"); + fatal_error ("can't open ldd output: %m"); if (debug) notice ("\nldd output with constructors/destructors.\n"); @@ -2843,7 +2797,7 @@ scan_libraries (const char *prog_name) name = p; if (strncmp (name, "not found", sizeof ("not found") - 1) == 0) - fatal ("dynamic dependency %s not found", buf); + fatal_error ("dynamic dependency %s not found", buf); /* Find the end of the symbol name. */ for (end = p; @@ -2855,7 +2809,7 @@ scan_libraries (const char *prog_name) if (access (name, R_OK) == 0) add_to_list (&libraries, name); else - fatal ("unable to open dynamic dependency '%s'", buf); + fatal_error ("unable to open dynamic dependency '%s'", buf); if (debug) fprintf (stderr, "\t%s\n", buf); @@ -3016,7 +2970,7 @@ scan_prog_file (const char *prog_name, s if ((ldptr = ldopen (CONST_CAST (char *, prog_name), ldptr)) != NULL) { if (! MY_ISCOFF (HEADER (ldptr).f_magic)) - fatal ("%s: not a COFF file", prog_name); + fatal_error ("%s: not a COFF file", prog_name); if (GCC_CHECK_HDR (ldptr)) { @@ -3146,7 +3100,7 @@ scan_prog_file (const char *prog_name, s } else { - fatal ("%s: cannot open as COFF file", prog_name); + fatal_error ("%s: cannot open as COFF file", prog_name); } #ifdef COLLECT_EXPORT_LIST /* On AIX loop continues while there are more members in archive. */ @@ -3204,7 +3158,7 @@ resolve_lib_name (const char *name) if (debug) fprintf (stderr, "not found\n"); else - fatal ("library lib%s not found", name); + fatal_error ("library lib%s not found", name); return (NULL); } #endif /* COLLECT_EXPORT_LIST */ Index: gcc/collect2.h =================================================================== --- gcc/collect2.h (revision 173864) +++ gcc/collect2.h (working copy) @@ -1,5 +1,5 @@ /* Header file for collect/tlink routines. - Copyright (C) 1998, 2003, 2004, 2005, 2007, 2010 + Copyright (C) 1998, 2003, 2004, 2005, 2007, 2010, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -41,11 +41,7 @@ extern struct obstack temporary_obstack; extern char *temporary_firstobj; extern bool vflag, debug; -extern void error (const char *, ...) ATTRIBUTE_PRINTF_1; extern void notice_translated (const char *, ...) ATTRIBUTE_PRINTF_1; extern void notice (const char *, ...) ATTRIBUTE_PRINTF_1; -extern void fatal (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -extern void fatal_perror (const char *, ...) - ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; #endif /* ! GCC_COLLECT2_H */ -- Joseph S. Myers joseph@codesourcery.com