[llvm] r311958 - Revert "Revert r311552: [Bash-autocompletion] Add support for static analyzer flags"
Yuka Takahashi via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 28 17:09:31 PDT 2017
Author: yamaguchi
Date: Mon Aug 28 17:09:31 2017
New Revision: 311958
URL: http://llvm.org/viewvc/llvm-project?rev=311958&view=rev
Log:
Revert "Revert r311552: [Bash-autocompletion] Add support for static analyzer flags"
This reverts commit 7c46b80c022e18d43c1fdafb117b0c409c5a6d1e.
r311552 broke lld buildbot because I've changed OptionInfos type from
ArrayRef to vector. However the bug is fixed, so I'll commit this again.
Modified:
llvm/trunk/include/llvm/Option/OptParser.td
llvm/trunk/include/llvm/Option/OptTable.h
llvm/trunk/lib/Option/OptTable.cpp
llvm/trunk/utils/TableGen/OptParserEmitter.cpp
Modified: llvm/trunk/include/llvm/Option/OptParser.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Option/OptParser.td?rev=311958&r1=311957&r2=311958&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Option/OptParser.td (original)
+++ llvm/trunk/include/llvm/Option/OptParser.td Mon Aug 28 17:09:31 2017
@@ -93,6 +93,7 @@ class Option<list<string> prefixes, stri
string HelpText = ?;
string MetaVarName = ?;
string Values = ?;
+ code ValuesCode = ?;
list<OptionFlag> Flags = [];
OptionGroup Group = ?;
Option Alias = ?;
@@ -128,6 +129,7 @@ class Group<OptionGroup group> { OptionG
class HelpText<string text> { string HelpText = text; }
class MetaVarName<string name> { string MetaVarName = name; }
class Values<string value> { string Values = value; }
+class ValuesCode<code valuecode> { code ValuesCode = valuecode; }
// Predefined options.
Modified: llvm/trunk/include/llvm/Option/OptTable.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Option/OptTable.h?rev=311958&r1=311957&r2=311958&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Option/OptTable.h (original)
+++ llvm/trunk/include/llvm/Option/OptTable.h Mon Aug 28 17:09:31 2017
@@ -57,8 +57,8 @@ public:
};
private:
- /// \brief The static option information table.
- ArrayRef<Info> OptionInfos;
+ /// \brief The option information table.
+ std::vector<Info> OptionInfos;
bool IgnoreCase;
unsigned TheInputOptionID = 0;
@@ -143,6 +143,17 @@ public:
std::vector<std::string> findByPrefix(StringRef Cur,
unsigned short DisableFlags) const;
+ /// Add Values to Option's Values class
+ ///
+ /// \param [in] Option - Prefix + Name of the flag which Values will be
+ /// changed. For example, "-analyzer-checker".
+ /// \param [in] Values - String of Values seperated by ",", such as
+ /// "foo, bar..", where foo and bar is the argument which the Option flag
+ /// takes
+ ///
+ /// \return true in success, and false in fail.
+ bool addValues(const char *Option, const char *Values);
+
/// \brief Parse a single argument; returning the new argument and
/// updating Index.
///
Modified: llvm/trunk/lib/Option/OptTable.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Option/OptTable.cpp?rev=311958&r1=311957&r2=311958&view=diff
==============================================================================
--- llvm/trunk/lib/Option/OptTable.cpp (original)
+++ llvm/trunk/lib/Option/OptTable.cpp Mon Aug 28 17:09:31 2017
@@ -196,7 +196,7 @@ static unsigned matchOption(const OptTab
// Returns true if one of the Prefixes + In.Names matches Option
static bool optionMatches(const OptTable::Info &In, StringRef Option) {
- if (In.Values && In.Prefixes)
+ if (In.Prefixes)
for (size_t I = 0; In.Prefixes[I]; I++)
if (Option == std::string(In.Prefixes[I]) + In.Name)
return true;
@@ -209,8 +209,9 @@ static bool optionMatches(const OptTable
std::vector<std::string>
OptTable::suggestValueCompletions(StringRef Option, StringRef Arg) const {
// Search all options and return possible values.
- for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) {
- if (!optionMatches(In, Option))
+ for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
+ const Info &In = OptionInfos[I];
+ if (!In.Values || !optionMatches(In, Option))
continue;
SmallVector<StringRef, 8> Candidates;
@@ -228,7 +229,8 @@ OptTable::suggestValueCompletions(String
std::vector<std::string>
OptTable::findByPrefix(StringRef Cur, unsigned short DisableFlags) const {
std::vector<std::string> Ret;
- for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) {
+ for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
+ const Info &In = OptionInfos[I];
if (!In.Prefixes || (!In.HelpText && !In.GroupID))
continue;
if (In.Flags & DisableFlags)
@@ -245,6 +247,17 @@ OptTable::findByPrefix(StringRef Cur, un
return Ret;
}
+bool OptTable::addValues(const char *Option, const char *Values) {
+ for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
+ Info &In = OptionInfos[I];
+ if (optionMatches(In, Option)) {
+ In.Values = Values;
+ return true;
+ }
+ }
+ return false;
+}
+
Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index,
unsigned FlagsToInclude,
unsigned FlagsToExclude) const {
@@ -256,8 +269,8 @@ Arg *OptTable::ParseOneArg(const ArgList
if (isInput(PrefixesUnion, Str))
return new Arg(getOption(TheInputOptionID), Str, Index++, Str);
- const Info *Start = OptionInfos.begin() + FirstSearchableIndex;
- const Info *End = OptionInfos.end();
+ const Info *Start = OptionInfos.data() + FirstSearchableIndex;
+ const Info *End = OptionInfos.data() + OptionInfos.size();
StringRef Name = StringRef(Str).ltrim(PrefixChars);
// Search for the first next option which could be a prefix.
Modified: llvm/trunk/utils/TableGen/OptParserEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/OptParserEmitter.cpp?rev=311958&r1=311957&r2=311958&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/OptParserEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/OptParserEmitter.cpp Mon Aug 28 17:09:31 2017
@@ -298,5 +298,31 @@ void EmitOptParser(RecordKeeper &Records
OS << ")\n";
}
OS << "#endif // OPTION\n";
+
+ OS << "\n";
+ OS << "#ifdef OPTTABLE_ARG_INIT\n";
+ OS << "//////////\n";
+ OS << "// Option Values\n\n";
+ for (unsigned I = 0, E = Opts.size(); I != E; ++I) {
+ const Record &R = *Opts[I];
+ if (isa<UnsetInit>(R.getValueInit("ValuesCode")))
+ continue;
+ OS << "{\n";
+ OS << R.getValueAsString("ValuesCode");
+ OS << "\n";
+ for (const std::string &Pref : R.getValueAsListOfStrings("Prefixes")) {
+ OS << "bool ValuesWereAdded = ";
+ OS << "Opt.addValues(";
+ std::string S = (Pref + R.getValueAsString("Name")).str();
+ write_cstring(OS, S);
+ OS << ", Values);\n";
+ OS << "(void)ValuesWereAdded;\n";
+ OS << "assert(ValuesWereAdded && \"Couldn't add values to "
+ "OptTable!\");\n";
+ }
+ OS << "}\n";
+ }
+ OS << "\n";
+ OS << "#endif // OPTTABLE_ARG_INIT\n";
}
} // end namespace llvm
More information about the llvm-commits
mailing list