+
+
The cl::extrahelp class is a nontemplated class that allows extra
+help text to be printed out for the --help option.
+
+
+namespace cl {
+ struct extrahelp;
+}
+
+
+
To use the extrahelp, simply construct one with a const char*
+parameter to the constructor. The text passed to the constructor will be printed
+at the bottom of the help message, verbatim. Note that multiple
+cl::extrahelp can be used but this practice is discouraged. If
+your tool needs to print additional help information, put all that help into a
+single cl::extrahelp instance.
+
For example:
+
+ cl::extrahelp("\nADDITIONAL HELP:\n\n This is the extra help\n");
+
+
+
Builtin parsers
diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h
index 4d5dccd38c0..3b4eda587aa 100644
--- a/include/llvm/Support/CommandLine.h
+++ b/include/llvm/Support/CommandLine.h
@@ -1046,13 +1046,19 @@ struct aliasopt {
void apply(alias &A) const { A.setAliasFor(Opt); }
};
-/// Permit the tool to provide additional help output after the normal
-/// help output. To use this, create a function that returns void and
-/// takes no arguments. Assign its address to cl::MoreHelp. If set,
-/// this function will be called just before the CommandLine exits
-/// after printing the help.
-/// @brief Optional pointer to additional help function
-extern void (*MoreHelp)();
+// extrahelp - provide additional help at the end of the normal help
+// output. All occurrences of cl::extrahelp will be accumulated and
+// printed to std::cerr at the end of the regular help, just before
+// exit is called.
+struct extrahelp {
+ const char * morehelp;
+ extrahelp(const char* help);
+};
+
+// This function just prints the help message, exactly the same way as if the
+// --help option had been given on the command line.
+// NOTE: THIS FUNCTION TERMINATES THE PROGRAM!
+void PrintHelpMessage();
} // End namespace cl
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index ad82c849479..15fd19591a0 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -838,7 +838,15 @@ void generic_parser_base::printOptionInfo(const Option &O,
// If this variable is set, it is a pointer to a function that the user wants
// us to call after we print out the help info. Basically a hook to allow
// additional help to be printed.
-void (*cl::MoreHelp)() = 0;
+static std::vector
* MoreHelp = 0;
+
+extrahelp::extrahelp(const char* Help)
+ : morehelp(Help) {
+ if (!MoreHelp) {
+ MoreHelp = new std::vector;
+ }
+ MoreHelp->push_back(Help);
+}
namespace {
@@ -913,11 +921,16 @@ public:
for (unsigned i = 0, e = Options.size(); i != e; ++i)
Options[i].second->printOptionInfo(MaxArgLen);
- // Call the user's hook so help output can be extended.
- if (MoreHelp != 0)
- (*MoreHelp)();
+ // Print any extra help the user has declared. If MoreHelp is not null,
+ // then the user used at least one cl::extrahelp instance to provide
+ // additional help. We just print it out now.
+ if (MoreHelp != 0) {
+ for (std::vector::iterator I = MoreHelp->begin(),
+ E = MoreHelp->end(); I != E; ++I)
+ std::cerr << *I;
+ }
- // Halt the program if help information is printed
+ // Halt the program since help information was printed
exit(1);
}
};
@@ -954,4 +967,10 @@ cl::opt >
VersOp("version", cl::desc("display the version"),
cl::location(VersionPrinterInstance), cl::ValueDisallowed);
+
} // End anonymous namespace
+
+// Utility function for printing the help message.
+void cl::PrintHelpMessage() {
+ NormalPrinter = true;
+}