aboutsummaryrefslogtreecommitdiff
path: root/gcc/file-find.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2016-07-07 14:03:39 +0200
committerMartin Liska <marxin@gcc.gnu.org>2016-07-07 12:03:39 +0000
commitf965d3dad7edb527e465d7d2811294177daee53c (patch)
tree9776d8d0e93b2015a8b4ebed34c65d2f6e684da5 /gcc/file-find.c
parent019d6598357659e05640cf762b75e18953f70fe9 (diff)
downloadgcc-f965d3dad7edb527e465d7d2811294177daee53c.zip
gcc-f965d3dad7edb527e465d7d2811294177daee53c.tar.gz
gcc-f965d3dad7edb527e465d7d2811294177daee53c.tar.bz2
Prevent LTO wrappers to process a recursive execution
* 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
Diffstat (limited to 'gcc/file-find.c')
-rw-r--r--gcc/file-find.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/file-find.c b/gcc/file-find.c
index 289ef28..1066da9 100644
--- a/gcc/file-find.c
+++ b/gcc/file-find.c
@@ -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;
+ }
+}