Looks good.<br><div class="gmail_quote"><div dir="ltr">On Mon, Sep 12, 2016 at 6:59 PM Dean Michael Berris <<a href="mailto:dberris@google.com">dberris@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">dberris updated this revision to Diff 71098.<br class="gmail_msg">
dberris added a comment.<br class="gmail_msg">
<br class="gmail_msg">
- Style fixes<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D24489" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24489</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  include/llvm/Support/CommandLine.h<br class="gmail_msg">
  lib/Support/CommandLine.cpp<br class="gmail_msg">
  unittests/Support/CommandLineTest.cpp<br class="gmail_msg">
<br class="gmail_msg">
Index: unittests/Support/CommandLineTest.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- unittests/Support/CommandLineTest.cpp<br class="gmail_msg">
+++ unittests/Support/CommandLineTest.cpp<br class="gmail_msg">
@@ -476,4 +476,27 @@<br class="gmail_msg">
   EXPECT_FALSE(cl::ParseCommandLineOptions(3, args2, nullptr, true));<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+TEST(CommandLineTest, GetRegisteredSubcommands) {<br class="gmail_msg">
+  cl::ResetCommandLineParser();<br class="gmail_msg">
+<br class="gmail_msg">
+  StackSubCommand SC1("sc1", "First Subcommand");<br class="gmail_msg">
+  StackSubCommand SC2("sc2", "Second subcommand");<br class="gmail_msg">
+<br class="gmail_msg">
+  const char *args0[] = {"prog", "sc1"};<br class="gmail_msg">
+  const char *args1[] = {"prog", "sc2"};<br class="gmail_msg">
+<br class="gmail_msg">
+  EXPECT_TRUE(cl::ParseCommandLineOptions(2, args0, nullptr, true));<br class="gmail_msg">
+  for (auto *S : cl::getRegisteredSubcommands()) {<br class="gmail_msg">
+    if (*S)<br class="gmail_msg">
+      EXPECT_STREQ("sc1", S->getName());<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
+  cl::ResetAllOptionOccurrences();<br class="gmail_msg">
+  EXPECT_TRUE(cl::ParseCommandLineOptions(2, args1, nullptr, true));<br class="gmail_msg">
+  for (auto *S : cl::getRegisteredSubcommands()) {<br class="gmail_msg">
+    if (*S)<br class="gmail_msg">
+      EXPECT_STREQ("sc2", S->getName());<br class="gmail_msg">
+  }<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 }  // anonymous namespace<br class="gmail_msg">
Index: lib/Support/CommandLine.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- lib/Support/CommandLine.cpp<br class="gmail_msg">
+++ lib/Support/CommandLine.cpp<br class="gmail_msg">
@@ -309,6 +309,12 @@<br class="gmail_msg">
     RegisteredSubCommands.erase(sub);<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
+  iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator><br class="gmail_msg">
+  getRegisteredSubcommands() {<br class="gmail_msg">
+    return make_range(RegisteredSubCommands.begin(),<br class="gmail_msg">
+                      RegisteredSubCommands.end());<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
   void reset() {<br class="gmail_msg">
     ActiveSubCommand = nullptr;<br class="gmail_msg">
     ProgramName.clear();<br class="gmail_msg">
@@ -2105,6 +2111,11 @@<br class="gmail_msg">
   return Sub.OptionsMap;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator><br class="gmail_msg">
+cl::getRegisteredSubcommands() {<br class="gmail_msg">
+  return GlobalParser->getRegisteredSubcommands();<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 void cl::HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub) {<br class="gmail_msg">
   for (auto &I : Sub.OptionsMap) {<br class="gmail_msg">
     if (I.second->Category != &Category &&<br class="gmail_msg">
Index: include/llvm/Support/CommandLine.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- include/llvm/Support/CommandLine.h<br class="gmail_msg">
+++ include/llvm/Support/CommandLine.h<br class="gmail_msg">
@@ -1736,6 +1736,28 @@<br class="gmail_msg">
 /// than just handing around a global list.<br class="gmail_msg">
 StringMap<Option *> &getRegisteredOptions(SubCommand &Sub = *TopLevelSubCommand);<br class="gmail_msg">
<br class="gmail_msg">
+/// \brief Use this to get all registered SubCommands from the provided parser.<br class="gmail_msg">
+///<br class="gmail_msg">
+/// \return A range of all SubCommand pointers registered with the parser.<br class="gmail_msg">
+///<br class="gmail_msg">
+/// Typical usage:<br class="gmail_msg">
+/// \code<br class="gmail_msg">
+/// main(int argc, char* argv[]) {<br class="gmail_msg">
+///   llvm::cl::ParseCommandLineOptions(argc, argv);<br class="gmail_msg">
+///   for (auto* S : llvm::cl::getRegisteredSubcommands()) {<br class="gmail_msg">
+///     if (*S) {<br class="gmail_msg">
+///       std::cout << "Executing subcommand: " << S->getName() << std::endl;<br class="gmail_msg">
+///       // Execute some function based on the name...<br class="gmail_msg">
+///     }<br class="gmail_msg">
+///   }<br class="gmail_msg">
+/// }<br class="gmail_msg">
+/// \endcode<br class="gmail_msg">
+///<br class="gmail_msg">
+/// This interface is useful for defining subcommands in libraries and<br class="gmail_msg">
+/// the dispatch from a single point (like in the main function).<br class="gmail_msg">
+iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator><br class="gmail_msg">
+getRegisteredSubcommands();<br class="gmail_msg">
+<br class="gmail_msg">
 //===----------------------------------------------------------------------===//<br class="gmail_msg">
 // Standalone command line processing utilities.<br class="gmail_msg">
 //<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div>