summaryrefslogtreecommitdiff
path: root/gcc/gcc.c
diff options
context:
space:
mode:
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2000-11-22 19:17:14 +0000
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2000-11-22 19:17:14 +0000
commitdead3293929c5215fea523d0d83a188df8ba717a (patch)
tree6ac492e3e33761ee32ecc7a71fcec680adf93216 /gcc/gcc.c
parent7d3aa890515726b62a82a1f305e833d6e77d44e6 (diff)
downloadgcc-dead3293929c5215fea523d0d83a188df8ba717a.tar.gz
* gcc.c (validate_switches): Validate multiple switches named
in '|' (or) expressions in specs. (handle_braces): If more than 1 alternative in a '|' spec matches, call do_spec1 just once. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37667 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r--gcc/gcc.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c
index f7d5a9a6084..074cd6a633b 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -4720,6 +4720,7 @@ handle_braces (p)
{
const char *filter, *body = NULL, *endbody = NULL;
int pipe_p = 0;
+ int true_once = 0; /* If, in %{a|b:d}, at least one of a,b was seen. */
int negate;
int suffix;
int include_blanks = 1;
@@ -4924,11 +4925,8 @@ next_member:
give_switch (i, 0, include_blanks);
}
else
- {
- if (do_spec_1 (save_string (body, endbody - body - 1),
- 0, NULL_PTR) < 0)
- return 0;
- }
+ /* Even if many alternatives are matched, only output once. */
+ true_once = 1;
}
else if (pipe_p)
{
@@ -4943,6 +4941,14 @@ next_member:
if (*p++ == '|')
goto next_member;
+ /* Process the spec just once, regardless of match count. */
+ if (true_once)
+ {
+ if (do_spec_1 (save_string (body, endbody - body - 1),
+ 0, NULL_PTR) < 0)
+ return 0;
+ }
+
return endbody;
}
@@ -5938,19 +5944,21 @@ validate_switches (start)
register const char *p = start;
const char *filter;
register int i;
- int suffix = 0;
+ int suffix;
if (*p == '|')
++p;
+next_member:
if (*p == '!')
++p;
+ suffix = 0;
if (*p == '.')
suffix = 1, ++p;
filter = p;
- while (*p != ':' && *p != '}')
+ while (*p != ':' && *p != '}' && *p != '|')
p++;
if (suffix)
@@ -5958,9 +5966,8 @@ validate_switches (start)
else if (p[-1] == '*')
{
/* Mark all matching switches as valid. */
- --p;
for (i = 0; i < n_switches; i++)
- if (!strncmp (switches[i].part1, filter, p - filter))
+ if (!strncmp (switches[i].part1, filter, p - filter - 1))
switches[i].validated = 1;
}
else
@@ -5973,6 +5980,9 @@ validate_switches (start)
switches[i].validated = 1;
}
}
+
+ if (*p++ == '|')
+ goto next_member;
}
/* Check whether a particular argument was used. The first time we