Prevent LTO wrappers to process a recursive execution
authorMartin Liska <mliska@suse.cz>
Thu, 7 Jul 2016 12:03:39 +0000 (14:03 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 7 Jul 2016 12:03:39 +0000 (12:03 +0000)
* file-find.c (remove_prefix): New function.
* file-find.h (remove_prefix): Declare the function.
* gcc-ar.c (main): Skip a folder of the wrapper if
a wrapped binary would point to the same file.

From-SVN: r238089

gcc/ChangeLog
gcc/file-find.c
gcc/file-find.h
gcc/gcc-ar.c

index fca1bac78e47ac7dc027dc5ee756b7c899566fb0..c3d6327577504eb9d52d703b527e5629711f54dd 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-07  Martin Liska  <mliska@suse.cz>
+
+       * file-find.c (remove_prefix): New function.
+       * file-find.h (remove_prefix): Declare the function.
+       * gcc-ar.c (main): Skip a folder of the wrapper if
+       a wrapped binary would point to the same file.
+
 2016-07-07  Jan Hubicka  <jh@suse.cz>
 
        * tree-scalar-evolution.c (iv_can_overflow_p): export.
index 289ef28de1209b0f58262d6c208f3b6b173de2f4..1066da9395ac2ffcb8568ddc95fd832d9a76843d 100644 (file)
@@ -208,3 +208,38 @@ prefix_from_string (const char *p, struct path_prefix *pprefix)
     }
   free (nstore);
 }
+
+void
+remove_prefix (const char *prefix, struct path_prefix *pprefix)
+{
+  struct prefix_list *remove, **prev, **remove_prev = NULL;
+  int max_len = 0;
+
+  if (pprefix->plist)
+    {
+      prev = &pprefix->plist;
+      for (struct prefix_list *pl = pprefix->plist; pl->next; pl = pl->next)
+       {
+         if (strcmp (prefix, pl->prefix) == 0)
+           {
+             remove = pl;
+             remove_prev = prev;
+             continue;
+           }
+
+         int l = strlen (pl->prefix);
+         if (l > max_len)
+           max_len = l;
+
+         prev = &pl;
+       }
+
+      if (remove_prev)
+       {
+         *remove_prev = remove->next;
+         free (remove);
+       }
+
+      pprefix->max_len = max_len;
+    }
+}
index 5ad9a5f44c6320c16754671623d7842cd61ff5d6..19a4746be091a766d4e0adbefa17f5632a322d06 100644 (file)
@@ -41,6 +41,7 @@ extern void find_file_set_debug (bool);
 extern char *find_a_file (struct path_prefix *, const char *, int);
 extern void add_prefix (struct path_prefix *, const char *);
 extern void add_prefix_begin (struct path_prefix *, const char *);
+extern void remove_prefix (const char *prefix, struct path_prefix *);
 extern void prefix_from_env (const char *, struct path_prefix *);
 extern void prefix_from_string (const char *, struct path_prefix *);
 
index 45ba3617ff38b9072556c39c718fefeeaf72145d..a02dccb80006b1bf39c8d2e2383c0110576538e8 100644 (file)
@@ -194,6 +194,14 @@ main (int ac, char **av)
 #ifdef CROSS_DIRECTORY_STRUCTURE
       real_exe_name = concat (target_machine, "-", PERSONALITY, NULL);
 #endif
+      /* Do not search original location in the same folder.  */
+      char *exe_folder = lrealpath (av[0]);
+      exe_folder[strlen (exe_folder) - strlen (lbasename (exe_folder))] = '\0';
+      char *location = concat (exe_folder, PERSONALITY, NULL);
+
+      if (access (location, X_OK) == 0)
+       remove_prefix (exe_folder, &path);
+
       exe_name = find_a_file (&path, real_exe_name, X_OK);
       if (!exe_name)
        {