Created
May 20, 2017 15:16
-
-
Save yamaguchi1024/99fd646b951940417948e4e2ca8c7e78 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt | |
index 9e43a10..c163a2b 100644 | |
--- a/clang/CMakeLists.txt | |
+++ b/clang/CMakeLists.txt | |
@@ -359,6 +359,10 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) | |
PATTERN "*.inc" | |
PATTERN "*.h" | |
) | |
+ | |
+ install(PROGRAMS utils/bash-autocomplete.sh | |
+ DESTINATION share/clang | |
+ ) | |
endif() | |
add_definitions( -D_GNU_SOURCE ) | |
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h | |
index 1009754..7e252e7 100644 | |
--- a/clang/include/clang/Driver/Driver.h | |
+++ b/clang/include/clang/Driver/Driver.h | |
@@ -406,6 +406,8 @@ public: | |
/// PrintVersion - Print the driver version. | |
void PrintVersion(const Compilation &C, raw_ostream &OS) const; | |
+ std::vector<std::string> findstd(StringRef Cur) const; | |
+ | |
/// GetFilePath - Lookup \p Name in the list of file search paths. | |
/// | |
/// \param TC - The tool chain for additional information on | |
diff --git a/clang/include/clang/Driver/Options.h b/clang/include/clang/Driver/Options.h | |
index 57e4452..5f0737a 100644 | |
--- a/clang/include/clang/Driver/Options.h | |
+++ b/clang/include/clang/Driver/Options.h | |
@@ -39,8 +39,9 @@ enum ClangFlags { | |
enum ID { | |
OPT_INVALID = 0, // This is not an option ID. | |
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) OPT_##ID, | |
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
+ OPT_##ID, | |
#include "clang/Driver/Options.inc" | |
LastOption | |
#undef OPTION | |
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td | |
index d812bd8..76f6220 100644 | |
--- a/clang/include/clang/Driver/Options.td | |
+++ b/clang/include/clang/Driver/Options.td | |
@@ -469,6 +469,7 @@ def arch__errors__fatal : Flag<["-"], "arch_errors_fatal">; | |
def arch : Separate<["-"], "arch">, Flags<[DriverOption]>; | |
def arch__only : Separate<["-"], "arch_only">; | |
def a : Joined<["-"], "a">; | |
+def autocomplete : Joined<["--"], "autocomplete=">, Value<"hoge">; | |
def bind__at__load : Flag<["-"], "bind_at_load">; | |
def bundle__loader : Separate<["-"], "bundle_loader">; | |
def bundle : Flag<["-"], "bundle">; | |
@@ -2194,7 +2195,7 @@ def std_default_EQ : Joined<["-"], "std-default=">; | |
def std_EQ : Joined<["-", "--"], "std=">, Flags<[CC1Option]>, | |
Group<CompileOnly_Group>, HelpText<"Language standard to compile for">; | |
def stdlib_EQ : Joined<["-", "--"], "stdlib=">, Flags<[CC1Option]>, | |
- HelpText<"C++ standard library to use">; | |
+ HelpText<"C++ standard library to use">, Value<"libc++,libstdc++">; | |
def sub__library : JoinedOrSeparate<["-"], "sub_library">; | |
def sub__umbrella : JoinedOrSeparate<["-"], "sub_umbrella">; | |
def system_header_prefix : Joined<["--"], "system-header-prefix=">, | |
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp | |
index f36deff..0221f5f 100644 | |
--- a/clang/lib/Driver/Driver.cpp | |
+++ b/clang/lib/Driver/Driver.cpp | |
@@ -1124,6 +1124,26 @@ static void PrintDiagnosticCategories(raw_ostream &OS) { | |
OS << i << ',' << DiagnosticIDs::getCategoryNameFromID(i) << '\n'; | |
} | |
+std::vector<std::string> Driver::findstd(StringRef Cur) const { | |
+ static const StringRef LangInfo[] = { | |
+#define LANGSTANDARD(id, name, lang, desc, features) {name}, | |
+#include "clang/Frontend/LangStandards.def" | |
+#undef LANGSTANDARD | |
+ }; | |
+ SmallVector<StringRef, 8> Split; | |
+ Cur.split(Split, StringRef("="), -1, false); | |
+ std::vector<std::string> Ret; | |
+ | |
+ if (Split[0] != "-std") | |
+ return Ret; | |
+ for (int i = 0; i <= sizeof(LangInfo[i]); i++) | |
+ if (LangInfo[i].startswith(Split[1])) { | |
+ std::string s = std::string(Split[0]) + "=" + std::string(LangInfo[i]); | |
+ Ret.push_back(s); | |
+ } | |
+ return Ret; | |
+} | |
+ | |
bool Driver::HandleImmediateArgs(const Compilation &C) { | |
// The order these options are handled in gcc is all over the place, but we | |
// don't expect inconsistencies w.r.t. that to matter in practice. | |
@@ -1216,6 +1236,21 @@ bool Driver::HandleImmediateArgs(const Compilation &C) { | |
return false; | |
} | |
+ if (Arg *A = C.getArgs().getLastArg(options::OPT_autocomplete)) { | |
+ // Print out all options that start with a given argument. This is used for | |
+ // shell autocompletion. | |
+ StringRef S = A->getValue(); | |
+ SmallVector<StringRef, 8> Split; | |
+ S.split(Split, StringRef(","), -1, false); | |
+ std::vector<std::string> V = Opts->findByPrefix(Split[0]); | |
+ if (V.empty()) | |
+ V = findstd(Split[0]); | |
+ if (V.empty()) | |
+ V = Opts->findByValue(Split); | |
+ llvm::outs() << llvm::join(V, " ") << '\n'; | |
+ return false; | |
+ } | |
+ | |
if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) { | |
ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(C.getArgs()); | |
switch (RLT) { | |
diff --git a/clang/lib/Driver/DriverOptions.cpp b/clang/lib/Driver/DriverOptions.cpp | |
index 6a74109..6112660 100644 | |
--- a/clang/lib/Driver/DriverOptions.cpp | |
+++ b/clang/lib/Driver/DriverOptions.cpp | |
@@ -21,10 +21,10 @@ using namespace llvm::opt; | |
#undef PREFIX | |
static const OptTable::Info InfoTable[] = { | |
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) \ | |
- { PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, PARAM, \ | |
- FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS }, | |
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
+ {PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, \ | |
+ PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUE}, | |
#include "clang/Driver/Options.inc" | |
#undef OPTION | |
}; | |
diff --git a/clang/test/Driver/autocomplete.c b/clang/test/Driver/autocomplete.c | |
new file mode 100644 | |
index 0000000..94649f2 | |
--- /dev/null | |
+++ b/clang/test/Driver/autocomplete.c | |
@@ -0,0 +1,6 @@ | |
+// RUN: %clang --autocomplete=-fsyn | FileCheck %s -check-prefix=FSYN | |
+// FSYN: -fsyntax-only | |
+// RUN: %clang --autocomplete=-s | FileCheck %s -check-prefix=STD | |
+// STD: -std={{.*}}-stdlib= | |
+// RUN: %clang --autocomplete=foo | not FileCheck %s -check-prefix=NONE | |
+// NONE: foo | |
diff --git a/clang/utils/bash-autocomplete.sh b/clang/utils/bash-autocomplete.sh | |
new file mode 100644 | |
index 0000000..0ce2091 | |
--- /dev/null | |
+++ b/clang/utils/bash-autocomplete.sh | |
@@ -0,0 +1,20 @@ | |
+# Please add "source /path/to/bash-autocomplete.sh" to your .bashrc to use this. | |
+_clang() | |
+{ | |
+ local cur prev words cword flags | |
+ _init_completion -n : || return | |
+ | |
+ arg="" | |
+ for (( i = $cword; i >= 1; i-- )) ; | |
+ do | |
+ arg="$arg""${COMP_WORDS[$i]}," | |
+ done | |
+ | |
+ flags=$( clang --autocomplete="$arg" ) | |
+ if [[ "$flags" == "" || "$cur" == "" ]]; then | |
+ _filedir | |
+ else | |
+ COMPREPLY=( $( compgen -W "$flags" -- "$cur" ) ) | |
+ fi | |
+} | |
+complete -F _clang clang | |
diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h | |
index ad72562..407d462 100644 | |
--- a/lld/COFF/Driver.h | |
+++ b/lld/COFF/Driver.h | |
@@ -185,7 +185,7 @@ void runMSVCLinker(std::string Rsp, ArrayRef<StringRef> Objects); | |
// Create enum with OPT_xxx values for each option in Options.td | |
enum { | |
OPT_INVALID = 0, | |
-#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID, | |
+#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, | |
#include "Options.inc" | |
#undef OPTION | |
}; | |
diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp | |
index 252590c..2c1cdba 100644 | |
--- a/lld/COFF/DriverUtils.cpp | |
+++ b/lld/COFF/DriverUtils.cpp | |
@@ -659,11 +659,9 @@ void runMSVCLinker(std::string Rsp, ArrayRef<StringRef> Objects) { | |
// Create table mapping all options defined in Options.td | |
static const llvm::opt::OptTable::Info infoTable[] = { | |
-#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10) \ | |
- { \ | |
- X1, X2, X9, X10, OPT_##ID, llvm::opt::Option::KIND##Class, X8, X7, \ | |
- OPT_##GROUP, OPT_##ALIAS, X6 \ | |
- }, | |
+#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10, X11) \ | |
+ {X1, X2, X9, X10, OPT_##ID, llvm::opt::Option::KIND##Class, \ | |
+ X8, X7, OPT_##GROUP, OPT_##ALIAS, X6, X11}, | |
#include "Options.inc" | |
#undef OPTION | |
}; | |
diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h | |
index af88341..076dda7 100644 | |
--- a/lld/ELF/Driver.h | |
+++ b/lld/ELF/Driver.h | |
@@ -58,7 +58,7 @@ public: | |
// Create enum with OPT_xxx values for each option in Options.td | |
enum { | |
OPT_INVALID = 0, | |
-#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID, | |
+#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, | |
#include "Options.inc" | |
#undef OPTION | |
}; | |
diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp | |
index f4eadee..9a38c78 100644 | |
--- a/lld/ELF/DriverUtils.cpp | |
+++ b/lld/ELF/DriverUtils.cpp | |
@@ -42,9 +42,9 @@ using namespace lld::elf; | |
// Create table mapping all options defined in Options.td | |
static const opt::OptTable::Info OptInfo[] = { | |
-#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10) \ | |
+#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10, X11) \ | |
{X1, X2, X9, X10, OPT_##ID, opt::Option::KIND##Class, \ | |
- X8, X7, OPT_##GROUP, OPT_##ALIAS, X6}, | |
+ X8, X7, OPT_##GROUP, OPT_##ALIAS, X6, X11}, | |
#include "Options.inc" | |
#undef OPTION | |
}; | |
diff --git a/lld/lib/Driver/DarwinLdDriver.cpp b/lld/lib/Driver/DarwinLdDriver.cpp | |
index 9b4aede..8a25bde 100644 | |
--- a/lld/lib/Driver/DarwinLdDriver.cpp | |
+++ b/lld/lib/Driver/DarwinLdDriver.cpp | |
@@ -61,9 +61,9 @@ namespace { | |
// Create enum with OPT_xxx values for each option in DarwinLdOptions.td | |
enum { | |
OPT_INVALID = 0, | |
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELP, META) \ | |
- OPT_##ID, | |
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
+ HELP, META, VALUE) \ | |
+ OPT_##ID, | |
#include "DarwinLdOptions.inc" | |
#undef OPTION | |
}; | |
@@ -75,10 +75,12 @@ enum { | |
// Create table mapping all options defined in DarwinLdOptions.td | |
static const llvm::opt::OptTable::Info infoTable[] = { | |
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) \ | |
- { PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \ | |
- PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS }, | |
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
+ {PREFIX, NAME, HELPTEXT, \ | |
+ METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \ | |
+ PARAM, FLAGS, OPT_##GROUP, \ | |
+ OPT_##ALIAS, ALIASARGS, VALUE}, | |
#include "DarwinLdOptions.inc" | |
#undef OPTION | |
}; | |
diff --git a/llvm/include/llvm/Option/OptParser.td b/llvm/include/llvm/Option/OptParser.td | |
index 4da86f0..815474d 100644 | |
--- a/llvm/include/llvm/Option/OptParser.td | |
+++ b/llvm/include/llvm/Option/OptParser.td | |
@@ -92,6 +92,7 @@ class Option<list<string> prefixes, string name, OptionKind kind> { | |
int NumArgs = 0; | |
string HelpText = ?; | |
string MetaVarName = ?; | |
+ string Value = ?; | |
list<OptionFlag> Flags = []; | |
OptionGroup Group = ?; | |
Option Alias = ?; | |
@@ -126,6 +127,7 @@ class Flags<list<OptionFlag> flags> { list<OptionFlag> Flags = flags; } | |
class Group<OptionGroup group> { OptionGroup Group = group; } | |
class HelpText<string text> { string HelpText = text; } | |
class MetaVarName<string name> { string MetaVarName = name; } | |
+class Value<string value> { string Value = value; } | |
// Predefined options. | |
diff --git a/llvm/include/llvm/Option/OptTable.h b/llvm/include/llvm/Option/OptTable.h | |
index 390e527..7599fa2 100644 | |
--- a/llvm/include/llvm/Option/OptTable.h | |
+++ b/llvm/include/llvm/Option/OptTable.h | |
@@ -46,6 +46,7 @@ public: | |
unsigned short GroupID; | |
unsigned short AliasID; | |
const char *AliasArgs; | |
+ const char *Value; | |
}; | |
private: | |
@@ -113,6 +114,15 @@ public: | |
return getInfo(id).MetaVar; | |
} | |
+ std::vector<std::string> findByValue(SmallVector<StringRef, 8> Command) const; | |
+ /// Find flags from OptTable which starts with Cur. | |
+ /// | |
+ /// \param [in] Cur - String prefix that all returned flags need | |
+ // to start with. | |
+ /// | |
+ /// \return The vector of flags which start with Cur. | |
+ std::vector<std::string> findByPrefix(StringRef Cur) const; | |
+ | |
/// \brief Parse a single argument; returning the new argument and | |
/// updating Index. | |
/// | |
diff --git a/llvm/include/llvm/Option/Option.h b/llvm/include/llvm/Option/Option.h | |
index 139f281..f6df35f 100644 | |
--- a/llvm/include/llvm/Option/Option.h | |
+++ b/llvm/include/llvm/Option/Option.h | |
@@ -49,6 +49,7 @@ public: | |
UnknownClass, | |
FlagClass, | |
JoinedClass, | |
+ ValueClass, | |
SeparateClass, | |
RemainingArgsClass, | |
RemainingArgsJoinedClass, | |
@@ -147,6 +148,7 @@ public: | |
case CommaJoinedClass: | |
return RenderCommaJoinedStyle; | |
case FlagClass: | |
+ case ValueClass: | |
case SeparateClass: | |
case MultiArgClass: | |
case JoinedOrSeparateClass: | |
diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp | |
index 7eafb00..2cd693e 100644 | |
--- a/llvm/lib/Option/OptTable.cpp | |
+++ b/llvm/lib/Option/OptTable.cpp | |
@@ -186,6 +186,43 @@ static unsigned matchOption(const OptTable::Info *I, StringRef Str, | |
return 0; | |
} | |
+std::vector<std::string> | |
+OptTable::findByValue(SmallVector<StringRef, 8> Command) const { | |
+ std::vector<std::string> Ret; | |
+ if (Command.size() <= 1) | |
+ return Ret; | |
+ for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) { | |
+ if (!In.Value) | |
+ continue; | |
+ std::string S = "-" + std::string(In.Name); | |
+ std::string C = std::string(Command[2]) + "="; | |
+ if (S != C) | |
+ continue; | |
+ SmallVector<StringRef, 8> Values; | |
+ StringRef V = In.Value; | |
+ V.split(Values, StringRef(","), -1, false); | |
+ for (StringRef &Val : Values) { | |
+ if (StringRef(Val).startswith(Command[0])) | |
+ Ret.push_back(Val); | |
+ } | |
+ } | |
+ return Ret; | |
+} | |
+ | |
+std::vector<std::string> OptTable::findByPrefix(StringRef Cur) const { | |
+ std::vector<std::string> Ret; | |
+ for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) { | |
+ if (!In.Prefixes) | |
+ continue; | |
+ for (int I = 0; In.Prefixes[I]; I++) { | |
+ std::string S = std::string(In.Prefixes[I]) + std::string(In.Name); | |
+ if (StringRef(S).startswith(Cur)) | |
+ Ret.push_back(S); | |
+ } | |
+ } | |
+ return Ret; | |
+} | |
+ | |
Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, | |
unsigned FlagsToInclude, | |
unsigned FlagsToExclude) const { | |
@@ -314,6 +351,9 @@ static std::string getOptionHelpName(const OptTable &Opts, OptSpecifier Id) { | |
case Option::FlagClass: | |
break; | |
+ case Option::ValueClass: | |
+ break; | |
+ | |
case Option::SeparateClass: case Option::JoinedOrSeparateClass: | |
case Option::RemainingArgsClass: case Option::RemainingArgsJoinedClass: | |
Name += ' '; | |
diff --git a/llvm/lib/Option/Option.cpp b/llvm/lib/Option/Option.cpp | |
index 736b939..22b8f0e 100644 | |
--- a/llvm/lib/Option/Option.cpp | |
+++ b/llvm/lib/Option/Option.cpp | |
@@ -45,6 +45,7 @@ void Option::print(raw_ostream &O) const { | |
P(UnknownClass); | |
P(FlagClass); | |
P(JoinedClass); | |
+ P(ValueClass); | |
P(SeparateClass); | |
P(CommaJoinedClass); | |
P(MultiArgClass); | |
diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | |
index 3bae382..6d59154 100644 | |
--- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | |
+++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | |
@@ -30,7 +30,7 @@ namespace { | |
enum { | |
OPT_INVALID = 0, | |
-#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID, | |
+#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, | |
#include "Options.inc" | |
#undef OPTION | |
}; | |
@@ -40,11 +40,9 @@ enum { | |
#undef PREFIX | |
static const llvm::opt::OptTable::Info infoTable[] = { | |
-#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10) \ | |
- { \ | |
- X1, X2, X9, X10, OPT_##ID, llvm::opt::Option::KIND##Class, X8, X7, \ | |
- OPT_##GROUP, OPT_##ALIAS, X6 \ | |
- }, | |
+#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10, X11) \ | |
+ {X1, X2, X9, X10, OPT_##ID, llvm::opt::Option::KIND##Class, \ | |
+ X8, X7, OPT_##GROUP, OPT_##ALIAS, X6, X11}, | |
#include "Options.inc" | |
#undef OPTION | |
}; | |
diff --git a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp | |
index f03e0b7..b3e44fc 100644 | |
--- a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp | |
+++ b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp | |
@@ -31,7 +31,7 @@ namespace { | |
enum ID { | |
OPT_INVALID = 0, // This is not an option ID. | |
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
OPT_##ID, | |
#include "Opts.inc" | |
#undef OPTION | |
@@ -43,12 +43,12 @@ enum ID { | |
static const opt::OptTable::Info InfoTable[] = { | |
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
{ \ | |
- PREFIX, NAME, HELPTEXT, \ | |
- METAVAR, OPT_##ID, opt::Option::KIND##Class, \ | |
- PARAM, FLAGS, OPT_##GROUP, \ | |
- OPT_##ALIAS, ALIASARGS}, | |
+ PREFIX, NAME, HELPTEXT, \ | |
+ METAVAR, OPT_##ID, opt::Option::KIND##Class, \ | |
+ PARAM, FLAGS, OPT_##GROUP, \ | |
+ OPT_##ALIAS, ALIASARGS, VALUE}, | |
#include "Opts.inc" | |
#undef OPTION | |
}; | |
diff --git a/llvm/unittests/Option/OptionParsingTest.cpp b/llvm/unittests/Option/OptionParsingTest.cpp | |
index 8630ff1..b6fbd85 100644 | |
--- a/llvm/unittests/Option/OptionParsingTest.cpp | |
+++ b/llvm/unittests/Option/OptionParsingTest.cpp | |
@@ -18,8 +18,9 @@ using namespace llvm::opt; | |
enum ID { | |
OPT_INVALID = 0, // This is not an option ID. | |
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) OPT_##ID, | |
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
+ OPT_##ID, | |
#include "Opts.inc" | |
LastOption | |
#undef OPTION | |
@@ -36,10 +37,10 @@ enum OptionFlags { | |
}; | |
static const OptTable::Info InfoTable[] = { | |
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
- HELPTEXT, METAVAR) \ | |
- { PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, PARAM, \ | |
- FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS }, | |
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ | |
+ HELPTEXT, METAVAR, VALUE) \ | |
+ {PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, \ | |
+ PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUE}, | |
#include "Opts.inc" | |
#undef OPTION | |
}; | |
diff --git a/llvm/utils/TableGen/OptParserEmitter.cpp b/llvm/utils/TableGen/OptParserEmitter.cpp | |
index c1b5e65..5e16ef2 100644 | |
--- a/llvm/utils/TableGen/OptParserEmitter.cpp | |
+++ b/llvm/utils/TableGen/OptParserEmitter.cpp | |
@@ -194,6 +194,8 @@ void EmitOptParser(RecordKeeper &Records, raw_ostream &OS) { | |
OS << ", nullptr"; | |
// The option meta-variable name (unused). | |
+ OS << ", nullptr"; | |
+ | |
OS << ", nullptr)\n"; | |
} | |
OS << "\n"; | |
@@ -283,6 +285,12 @@ void EmitOptParser(RecordKeeper &Records, raw_ostream &OS) { | |
else | |
OS << "nullptr"; | |
+ OS << ", "; | |
+ if (!isa<UnsetInit>(R.getValueInit("Value"))) | |
+ write_cstring(OS, R.getValueAsString("Value")); | |
+ else | |
+ OS << "nullptr"; | |
+ | |
OS << ")\n"; | |
} | |
OS << "#endif // OPTION\n"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment