re PR middle-end/41491 (ICE in set_value_range, at tree-vrp.c:386)
[gcc.git] / gcc / collect2.c
index 03300f3c79bc6e665fcd08a027f562f631d8930e..aa4b549b11b0d06fbc34d72ddbf1055744d2c0cf 100644 (file)
@@ -349,7 +349,7 @@ typedef enum {
 enum scanfilter_masks {
   SCAN_NOTHING = 0,
 
-  SCAN_CTOR = 1 << SYM_CTOR, 
+  SCAN_CTOR = 1 << SYM_CTOR,
   SCAN_DTOR = 1 << SYM_DTOR,
   SCAN_INIT = 1 << SYM_INIT,
   SCAN_FINI = 1 << SYM_FINI,
@@ -1100,6 +1100,7 @@ int
 main (int argc, char **argv)
 {
   static const char *const ld_suffix   = "ld";
+  static const char *const plugin_ld_suffix = PLUGIN_LD;
   static const char *const real_ld_suffix = "real-ld";
   static const char *const collect_ld_suffix = "collect-ld";
   static const char *const nm_suffix   = "nm";
@@ -1118,6 +1119,8 @@ main (int argc, char **argv)
 
   const char *const full_ld_suffix =
     concat(target_machine, "-", ld_suffix, NULL);
+  const char *const full_plugin_ld_suffix =
+    concat(target_machine, "-", plugin_ld_suffix, NULL);
   const char *const full_nm_suffix =
     concat (target_machine, "-", nm_suffix, NULL);
   const char *const full_gnm_suffix =
@@ -1132,6 +1135,7 @@ main (int argc, char **argv)
     concat (target_machine, "-", gstrip_suffix, NULL);
 #else
   const char *const full_ld_suffix     = ld_suffix;
+  const char *const full_plugin_ld_suffix = plugin_ld_suffix;
   const char *const full_nm_suffix     = nm_suffix;
   const char *const full_gnm_suffix    = gnm_suffix;
 #ifdef LDD_SUFFIX
@@ -1152,7 +1156,8 @@ main (int argc, char **argv)
   const char **c_ptr;
   char **ld1_argv;
   const char **ld1;
-  
+  bool use_plugin = false;
+
   /* The kinds of symbols we will have to consider when scanning the
      outcome of a first pass link.  This is ALL to start with, then might
      be adjusted before getting to the first pass link per se, typically on
@@ -1217,7 +1222,6 @@ main (int argc, char **argv)
      what LTO mode we are in.  */
   {
     int i;
-    bool use_plugin = false;
 
     for (i = 1; argv[i] != NULL; i ++)
       {
@@ -1329,11 +1333,17 @@ main (int argc, char **argv)
   /* Search the compiler directories for `ld'.  We have protection against
      recursive calls in find_a_file.  */
   if (ld_file_name == 0)
-    ld_file_name = find_a_file (&cpath, ld_suffix);
+    ld_file_name = find_a_file (&cpath,
+                               use_plugin
+                               ? plugin_ld_suffix
+                               : ld_suffix);
   /* Search the ordinary system bin directories
      for `ld' (if native linking) or `TARGET-ld' (if cross).  */
   if (ld_file_name == 0)
-    ld_file_name = find_a_file (&path, full_ld_suffix);
+    ld_file_name = find_a_file (&path,
+                               use_plugin
+                               ? full_plugin_ld_suffix
+                               : full_ld_suffix);
 
 #ifdef REAL_NM_FILE_NAME
   nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
@@ -1643,25 +1653,25 @@ main (int argc, char **argv)
      would otherwise reference them all, hence drag all the corresponding
      objects even if nothing else is referenced.  */
   {
-    const char **export_object_lst 
+    const char **export_object_lst
       = CONST_CAST2 (const char **, char **, object_lst);
-    
+
     struct id *list = libs.first;
 
     /* Compute the filter to use from the current one, do scan, then adjust
        the "current" filter to remove what we just included here.  This will
        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);
-    
+
     while (export_object_lst < object)
       scan_prog_file (*export_object_lst++, PASS_OBJ, this_filter);
-    
+
     for (; list; list = list->next)
       scan_prog_file (list->name, PASS_FIRST, this_filter);
-    
+
     ld1_filter = ld1_filter & ~this_filter;
   }
 
@@ -1734,9 +1744,9 @@ main (int argc, char **argv)
 
   /* Load the program, searching all libraries and attempting to provide
      undefined symbols from repository information.
-     
+
      If -r or they will be run via some other method, do not build the
-     constructor or destructor list, just return now.  */  
+     constructor or destructor list, just return now.  */
   {
     bool early_exit
       = rflag || (! DO_COLLECT_EXPORT_LIST && ! do_collecting);
@@ -1749,10 +1759,10 @@ main (int argc, char **argv)
        objects and libraries has performed above.  In the !shared_obj case, we
        expect the relevant tables to be dragged together with their associated
        functions from precise cross reference insertions by the compiler.  */
-       
+
     if (early_exit || ld1_filter != SCAN_NOTHING)
       do_tlink (ld1_argv, object_lst);
-    
+
     if (early_exit)
       {
 #ifdef COLLECT_EXPORT_LIST