Mercurial > hg > CbC > CbC_gcc
diff gcc/collect2.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/collect2.c Fri Feb 12 23:41:23 2010 +0900 +++ b/gcc/collect2.c Mon May 24 12:47:05 2010 +0900 @@ -1,7 +1,7 @@ /* Collect static initialization info into data structures that can be traversed by C++ initialization and finalization routines. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Chris Smith (csmith@convex.com). Heavily modified by Michael Meissner (meissner@cygnus.com), @@ -35,6 +35,10 @@ # define SIGCHLD SIGCLD #endif +/* TARGET_64BIT may be defined to use driver specific functionality. */ +#undef TARGET_64BIT +#define TARGET_64BIT TARGET_64BIT_DEFAULT + #ifndef LIBRARY_PATH_ENV #define LIBRARY_PATH_ENV "LIBRARY_PATH" #endif @@ -174,7 +178,7 @@ int number; }; -int vflag; /* true if -v */ +bool vflag; /* true if -v or --version */ static int rflag; /* true if -r */ static int strip_flag; /* true if -s */ static const char *demangle_flag; @@ -193,7 +197,8 @@ /* Current LTO mode. */ static enum lto_mode_d lto_mode = LTO_MODE_NONE; -int debug; /* true if -debug */ +bool debug; /* true if -debug */ +bool helpflag; /* true if --help */ static int shared_obj; /* true if -shared */ @@ -430,6 +435,17 @@ va_end (ap); } +/* Notify user of a non-error, without translating the format string. */ +void +notice_translated (const char *cmsgid, ...) +{ + va_list ap; + + va_start (ap, cmsgid); + vfprintf (stderr, cmsgid, ap); + va_end (ap); +} + /* Die when sys call fails. */ void @@ -924,10 +940,8 @@ if (lto_objects.first) { - const char *opts; char **lto_c_argv; const char **lto_c_ptr; - const char *cp; const char **p, **q, **r; const char **lto_o_ptr; struct lto_object *list; @@ -938,52 +952,15 @@ if (!lto_wrapper) fatal ("COLLECT_LTO_WRAPPER must be set."); + num_lto_c_args++; + /* There is at least one object file containing LTO info, so we need to run the LTO back end and relink. */ - /* Get compiler options passed down from the parent `gcc' command. - These must be passed to the LTO back end. */ - opts = getenv ("COLLECT_GCC_OPTIONS"); - - /* Increment the argument count by the number of inherited options. - Some arguments may be filtered out later. Again, an upper bound - suffices. */ - - cp = opts; - - while (cp && *cp) - { - extract_string (&cp); - num_lto_c_args++; - } - obstack_free (&temporary_obstack, temporary_firstobj); - - if (debug) - num_lto_c_args++; - - /* Increment the argument count by the number of initial - arguments added below. */ - num_lto_c_args += 9; - lto_c_argv = (char **) xcalloc (sizeof (char *), num_lto_c_args); lto_c_ptr = CONST_CAST2 (const char **, char **, lto_c_argv); *lto_c_ptr++ = lto_wrapper; - *lto_c_ptr++ = c_file_name; - - cp = opts; - - while (cp && *cp) - { - const char *s = extract_string (&cp); - - /* Pass the option or argument to the wrapper. */ - *lto_c_ptr++ = xstrdup (s); - } - obstack_free (&temporary_obstack, temporary_firstobj); - - if (debug) - *lto_c_ptr++ = xstrdup ("-debug"); /* Add LTO objects to the wrapper command line. */ for (list = lto_objects.first; list; list = list->next) @@ -991,10 +968,6 @@ *lto_c_ptr = NULL; - /* Save intermediate WPA files in lto1 if debug. */ - if (debug) - putenv (xstrdup ("WPA_SAVE_LTRANS=1")); - /* Run the LTO back end. */ pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH); { @@ -1174,6 +1147,8 @@ int num_c_args; char **old_argv; + bool use_verbose = false; + old_argv = argv; expandargv (&argc, &argv); if (argv != old_argv) @@ -1226,14 +1201,21 @@ for (i = 1; argv[i] != NULL; i ++) { if (! strcmp (argv[i], "-debug")) - debug = 1; + debug = true; else if (! strcmp (argv[i], "-flto") && ! use_plugin) - lto_mode = LTO_MODE_LTO; - else if (! strcmp (argv[i], "-fwhopr") && ! use_plugin) - lto_mode = LTO_MODE_WHOPR; + { + use_verbose = true; + lto_mode = LTO_MODE_LTO; + } + else if (! strncmp (argv[i], "-fwhopr", 7) && ! use_plugin) + { + use_verbose = true; + lto_mode = LTO_MODE_WHOPR; + } else if (! strcmp (argv[i], "-plugin")) { use_plugin = true; + use_verbose = true; lto_mode = LTO_MODE_NONE; } #ifdef COLLECT_EXPORT_LIST @@ -1446,6 +1428,11 @@ *c_ptr++ = xstrdup (q); } } + if (use_verbose && *q == '-' && q[1] == 'v' && q[2] == 0) + { + /* Turn on trace in collect2 if needed. */ + vflag = true; + } } obstack_free (&temporary_obstack, temporary_firstobj); *c_ptr++ = "-fno-profile-arcs"; @@ -1495,7 +1482,8 @@ break; case 'f': - if (strcmp (arg, "-flto") == 0 || strcmp (arg, "-fwhopr") == 0) + if (strcmp (arg, "-flto") == 0 + || strncmp (arg, "-fwhopr", 7) == 0) { #ifdef ENABLE_LTO /* Do not pass LTO flag to the linker. */ @@ -1574,7 +1562,7 @@ case 'v': if (arg[2] == '\0') - vflag = 1; + vflag = true; break; case '-': @@ -1605,6 +1593,10 @@ } else if (strncmp (arg, "--sysroot=", 10) == 0) target_system_root = arg + 10; + else if (strncmp (arg, "--version", 9) == 0) + vflag = true; + else if (strncmp (arg, "--help", 9) == 0) + helpflag = true; break; } } @@ -1663,8 +1655,11 @@ control whether we need a first pass link later on or not, and what will remain to be scanned there. */ - scanfilter this_filter - = shared_obj ? ld1_filter : (ld1_filter & ~SCAN_DWEH); + scanfilter this_filter = ld1_filter; +#if HAVE_AS_REF + if (!shared_obj) + this_filter &= ~SCAN_DWEH; +#endif while (export_object_lst < object) scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter); @@ -1703,6 +1698,20 @@ fprintf (stderr, "\n"); } + if (helpflag) + { + fprintf (stderr, "Usage: collect2 [options]\n"); + fprintf (stderr, " Wrap linker and generate constructor code if needed.\n"); + fprintf (stderr, " Options:\n"); + fprintf (stderr, " -debug Enable debug output\n"); + fprintf (stderr, " --help Display this information\n"); + fprintf (stderr, " -v, --version Display this program's version number\n"); + fprintf (stderr, "Overview: http://gcc.gnu.org/onlinedocs/gccint/Collect2.html\n"); + fprintf (stderr, "Report bugs: %s\n", bug_report_url); + + collect_exit (0); + } + if (debug) { const char *ptr; @@ -1770,7 +1779,7 @@ if (export_file != 0 && export_file[0]) maybe_unlink (export_file); #endif - if (lto_mode) + if (lto_mode != LTO_MODE_NONE) maybe_run_lto_and_relink (ld1_argv, object_lst, object, false); maybe_unlink (c_file); @@ -1792,9 +1801,18 @@ if (debug) { - notice ("%d constructor(s) found\n", constructors.number); - notice ("%d destructor(s) found\n", destructors.number); - notice ("%d frame table(s) found\n", frame_tables.number); + notice_translated (ngettext ("%d constructor found\n", + "%d constructors found\n", + constructors.number), + constructors.number); + notice_translated (ngettext ("%d destructor found\n", + "%d destructors found\n", + destructors.number), + destructors.number); + notice_translated (ngettext("%d frame table found\n", + "%d frame tables found\n", + frame_tables.number), + frame_tables.number); } /* If the scan exposed nothing of special interest, there's no need to @@ -2507,23 +2525,41 @@ #ifdef OBJECT_FORMAT_NONE -/* Check to make sure the file is an ELF file. LTO objects must - be in ELF format. */ +/* Check to make sure the file is an LTO object file. */ static bool -is_elf (const char *prog_name) +maybe_lto_object_file (const char *prog_name) { FILE *f; - char buf[4]; - static char magic[4] = { 0x7f, 'E', 'L', 'F' }; - - f = fopen (prog_name, "r"); + unsigned char buf[4]; + int i; + + static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' }; + static unsigned char coffmagic[2] = { 0x4c, 0x01 }; + static unsigned char coffmagic_x64[2] = { 0x64, 0x86 }; + static unsigned char machomagic[4][4] = { + { 0xcf, 0xfa, 0xed, 0xfe }, + { 0xce, 0xfa, 0xed, 0xfe }, + { 0xfe, 0xed, 0xfa, 0xcf }, + { 0xfe, 0xed, 0xfa, 0xce } + }; + + f = fopen (prog_name, "rb"); if (f == NULL) return false; if (fread (buf, sizeof (buf), 1, f) != 1) buf[0] = 0; fclose (f); - return memcmp (buf, magic, sizeof (magic)) == 0; + + if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0 + || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0 + || memcmp (buf, coffmagic_x64, sizeof (coffmagic_x64)) == 0) + return true; + for (i = 0; i < 4; i++) + if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0) + return true; + + return false; } /* Generic version to scan the name list of the loaded program for @@ -2550,10 +2586,10 @@ if (which_pass == PASS_SECOND) return; - /* LTO objects must be in ELF format. This check prevents + /* LTO objects must be in a known format. This check prevents us from accepting an archive containing LTO objects, which gcc cannnot currently handle. */ - if (which_pass == PASS_LTOINFO && !is_elf (prog_name)) + if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name)) return; /* If we do not have an `nm', complain. */ @@ -2633,9 +2669,9 @@ /* Look for the LTO info marker symbol, and add filename to the LTO objects list if found. */ for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++) - if (ch == ' ' - && (strncmp (p +1 , "gnu_lto_v1", 10) == 0) - && ISSPACE( p[11])) + if (ch == ' ' && p[1] == '_' && p[2] == '_' + && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0) + && ISSPACE (p[p[3] == '_' ? 14 : 13])) { add_lto_object (<o_objects, prog_name); @@ -2849,7 +2885,7 @@ /* Now iterate through the library list adding their symbols to the list. */ for (list = libraries.first; list; list = list->next) - scan_prog_file (list->name, PASS_LIB); + scan_prog_file (list->name, PASS_LIB, SCAN_ALL); } #endif /* LDD_SUFFIX */