aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/OptTable.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-04-07 18:21:47 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-04-07 18:21:47 +0000
commit4ae24e7f118f500994772cb051be2e3343b68c1d (patch)
treee59073b646ad5be1716f72b0475b8fb5133fd214 /lib/Driver/OptTable.cpp
parent3eb2fc820e4629bfc63f526e848b34a1f1e9eef0 (diff)
Driver: Fix a parsing bug where some options were matched
incorrectly. I'm blanking on the smartest way to write this search, but we should just do the right thing when we move to TableGen. - <rdar://problem/6761194> [driver] -Wextra-tokens isn't parsed correctly git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68525 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/OptTable.cpp')
-rw-r--r--lib/Driver/OptTable.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp
index 15b121c45b..cbbeea1974 100644
--- a/lib/Driver/OptTable.cpp
+++ b/lib/Driver/OptTable.cpp
@@ -230,19 +230,26 @@ Arg *OptTable::ParseOneArg(const InputArgList &Args, unsigned &Index) const {
struct Info *Start = OptionInfos + FirstSearchableOption - 1;
struct Info *End = OptionInfos + LastOption - 1;
- // Find the first option which could be a prefix.
+ // Search for the first next option which could be a prefix.
Start = std::lower_bound(Start, End, Str);
- // Scan for first option which is a proper prefix.
- for (; Start != End; ++Start)
- if (memcmp(Str, Start->Name, strlen(Start->Name)) == 0)
- break;
-
- // Look for a match until we don't have a prefix.
+ // Options are stored in sorted order, with '\0' at the end of the
+ // alphabet. Since the only options which can accept a string must
+ // prefix it, we iteratively search for the next option which could
+ // be a prefix.
+ //
+ // FIXME: This is searching much more than necessary, but I am
+ // blanking on the simplest way to make it fast. We can solve this
+ // problem when we move to TableGen.
for (; Start != End; ++Start) {
- if (memcmp(Start->Name, Str, strlen(Start->Name)) != 0)
+ // Scan for first option which is a proper prefix.
+ for (; Start != End; ++Start)
+ if (memcmp(Str, Start->Name, strlen(Start->Name)) == 0)
+ break;
+ if (Start == End)
break;
+ // See if this option matches.
options::ID id = (options::ID) (Start - OptionInfos + 1);
if (Arg *A = getOption(id)->accept(Args, Index))
return A;