diff options
author | Reid Kleckner <reid@kleckner.net> | 2013-07-19 18:04:57 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2013-07-19 18:04:57 +0000 |
commit | a2549d382789fa33b5541708b2e4cf39e8bf56c9 (patch) | |
tree | d2f24688ce4304a54925e4014780e28911fafcdc /lib/Option/OptTable.cpp | |
parent | ba460864440b4dd192bd2809f913babe0cf07031 (diff) | |
download | llvm-a2549d382789fa33b5541708b2e4cf39e8bf56c9.tar.gz llvm-a2549d382789fa33b5541708b2e4cf39e8bf56c9.tar.bz2 llvm-a2549d382789fa33b5541708b2e4cf39e8bf56c9.tar.xz |
[Option] Add inclusion and exclusion flags to option parsing
Summary:
This allows the clang driver to put MSVC compatible options in the same
enumerator space as its normal options but exclude them from normal
option parsing.
Also changes the standard ParseArgs() method to consider unknown
arguments with a leading slash as being inputs rather than flags.
High level discussion for clang-cl is here:
http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-June/030404.html
CC: llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1049
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186703 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Option/OptTable.cpp')
-rw-r--r-- | lib/Option/OptTable.cpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/lib/Option/OptTable.cpp b/lib/Option/OptTable.cpp index bbb28a5518..11439d3e56 100644 --- a/lib/Option/OptTable.cpp +++ b/lib/Option/OptTable.cpp @@ -180,7 +180,9 @@ static unsigned matchOption(const OptTable::Info *I, StringRef Str) { return 0; } -Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { +Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, + unsigned FlagsToInclude, + unsigned FlagsToExclude) const { unsigned Prev = Index; const char *Str = Args.getArgString(Index); @@ -213,8 +215,15 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { if (Start == End) break; + Option Opt(Start, this); + + if (FlagsToInclude && !Opt.hasFlag(FlagsToInclude)) + continue; + if (Opt.hasFlag(FlagsToExclude)) + continue; + // See if this option matches. - if (Arg *A = Option(Start, this).accept(Args, Index, ArgSize)) + if (Arg *A = Opt.accept(Args, Index, ArgSize)) return A; // Otherwise, see if this argument was missing values. @@ -222,13 +231,20 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { return 0; } + // If we failed to find an option and this arg started with /, then it's + // probably an input path. + if (Str[0] == '/') + return new Arg(getOption(TheInputOptionID), Str, Index++, Str); + return new Arg(getOption(TheUnknownOptionID), Str, Index++, Str); } -InputArgList *OptTable::ParseArgs(const char* const *ArgBegin, - const char* const *ArgEnd, +InputArgList *OptTable::ParseArgs(const char *const *ArgBegin, + const char *const *ArgEnd, unsigned &MissingArgIndex, - unsigned &MissingArgCount) const { + unsigned &MissingArgCount, + unsigned FlagsToInclude, + unsigned FlagsToExclude) const { InputArgList *Args = new InputArgList(ArgBegin, ArgEnd); // FIXME: Handle '@' args (or at least error on them). @@ -243,7 +259,7 @@ InputArgList *OptTable::ParseArgs(const char* const *ArgBegin, } unsigned Prev = Index; - Arg *A = ParseOneArg(*Args, Index); + Arg *A = ParseOneArg(*Args, Index, FlagsToInclude, FlagsToExclude); assert(Index > Prev && "Parser failed to consume argument."); // Check for missing argument error. |