Newer
Older
// isHidden/isReallyHidden - Predicates to be used to filter down arg lists.
inline static bool isHidden(Option *Opt) {
return Opt->getOptionHiddenFlag() >= Hidden;
inline static bool isReallyHidden(Option *Opt) {
return Opt->getOptionHiddenFlag() == ReallyHidden;
explicit HelpPrinter(bool showHidden) : ShowHidden(showHidden) {
EmptyArg = 0;
}
void operator=(bool Value) {
if (Value == false) return;
Chris Lattner
committed
// Get all the options.
std::vector<Option*> PositionalOpts;
std::vector<Option*> SinkOpts;
StringMap<Option*> OptMap;
GetOptionInfo(PositionalOpts, SinkOpts, OptMap);
// Copy Options into a vector so we can sort them as we like...
std::vector<Option*> Opts;
for (StringMap<Option*>::iterator I = OptMap.begin(), E = OptMap.end();
I != E; ++I) {
Opts.push_back(I->second);
}
// Eliminate Hidden or ReallyHidden arguments, depending on ShowHidden
Opts.erase(std::remove_if(Opts.begin(), Opts.end(),
std::ptr_fun(ShowHidden ? isReallyHidden : isHidden)),
Opts.end());
// Eliminate duplicate entries in table (from enum flags options, f.e.)
{ // Give OptionSet a scope
std::set<Option*> OptionSet;
for (unsigned i = 0; i != Opts.size(); ++i)
if (OptionSet.count(Opts[i]) == 0)
OptionSet.insert(Opts[i]); // Add new entry to set
Opts.erase(Opts.begin()+i--); // Erase duplicate
outs() << "OVERVIEW: " << ProgramOverview << "\n";
outs() << "USAGE: " << ProgramName << " [options]";
Option *CAOpt = 0; // The cl::ConsumeAfter option, if it exists...
if (!PositionalOpts.empty() &&
Chris Lattner
committed
PositionalOpts[0]->getNumOccurrencesFlag() == ConsumeAfter)
CAOpt = PositionalOpts[0];
for (size_t i = CAOpt != 0, e = PositionalOpts.size(); i != e; ++i) {
Chris Lattner
committed
if (PositionalOpts[i]->ArgStr[0])
outs() << " --" << PositionalOpts[i]->ArgStr;
outs() << " " << PositionalOpts[i]->HelpStr;
// Print the consume after option info if it exists...
if (CAOpt) outs() << " " << CAOpt->HelpStr;
// Compute the maximum argument length...
MaxArgLen = 0;
for (size_t i = 0, e = Opts.size(); i != e; ++i)
MaxArgLen = std::max(MaxArgLen, Opts[i]->getOptionWidth());
for (size_t i = 0, e = Opts.size(); i != e; ++i)
Opts[i]->printOptionInfo(MaxArgLen);
// Print any extra help the user has declared.
for (std::vector<const char *>::iterator I = MoreHelp->begin(),
E = MoreHelp->end(); I != E; ++I)
} // End anonymous namespace
// Define the two HelpPrinter instances that are used to print out help, or
// help-hidden...
//
static HelpPrinter NormalPrinter(false);
static HelpPrinter HiddenPrinter(true);
static cl::opt<HelpPrinter, true, parser<bool> >
HOp("help", cl::desc("Display available options (--help-hidden for more)"),
cl::location(NormalPrinter), cl::ValueDisallowed);
static cl::opt<HelpPrinter, true, parser<bool> >
HHOp("help-hidden", cl::desc("Display all available options"),
cl::location(HiddenPrinter), cl::Hidden, cl::ValueDisallowed);
static void (*OverrideVersionPrinter)() = 0;
namespace {
class VersionPrinter {
public:
void print() {
Benjamin Kramer
committed
outs() << "Low Level Virtual Machine (http://llvm.org/):\n"
<< " " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
Benjamin Kramer
committed
outs() << LLVM_VERSION_INFO;
Benjamin Kramer
committed
outs() << "\n ";
Benjamin Kramer
committed
outs() << "DEBUG build";
#else
Benjamin Kramer
committed
outs() << "Optimized build";
Benjamin Kramer
committed
outs() << " with assertions";
#endif
Benjamin Kramer
committed
outs() << ".\n"
<< " Built " << __DATE__ << " (" << __TIME__ << ").\n"
<< " Host: " << sys::getHostTriple() << "\n"
Benjamin Kramer
committed
<< "\n"
<< " Registered Targets:\n";
std::vector<std::pair<std::string, const Target*> > Targets;
size_t Width = 0;
for (TargetRegistry::iterator it = TargetRegistry::begin(),
ie = TargetRegistry::end(); it != ie; ++it) {
Targets.push_back(std::make_pair(it->getName(), &*it));
Width = std::max(Width, Targets.back().first.length());
}
std::sort(Targets.begin(), Targets.end());
Benjamin Kramer
committed
for (unsigned i = 0, e = Targets.size(); i != e; ++i) {
outs() << " " << Targets[i].first
<< std::string(Width - Targets[i].first.length(), ' ') << " - "
<< Targets[i].second->getShortDescription() << "\n";
}
if (Targets.empty())
outs() << " (none)\n";
}
void operator=(bool OptionWasSpecified) {
if (OptionWasSpecified) {
if (OverrideVersionPrinter == 0) {
print();
exit(1);
} else {
(*OverrideVersionPrinter)();
exit(1);
}
}
}
};
} // End anonymous namespace
// Define the --version option that prints out the LLVM version for the tool
static VersionPrinter VersionPrinterInstance;
static cl::opt<VersionPrinter, true, parser<bool> >
VersOp("version", cl::desc("Display the version of this program"),
cl::location(VersionPrinterInstance), cl::ValueDisallowed);
// Utility function for printing the help message.
void cl::PrintHelpMessage() {
// This looks weird, but it actually prints the help message. The
// NormalPrinter variable is a HelpPrinter and the help gets printed when
// its operator= is invoked. That's because the "normal" usages of the
// help printer is to be assigned true/false depending on whether the
// --help option was given or not. Since we're circumventing that we have
// to make it look like --help was given, so we assign true.
/// Utility function for printing version number.
void cl::PrintVersionMessage() {
VersionPrinterInstance.print();
}
void cl::SetVersionPrinter(void (*func)()) {
OverrideVersionPrinter = func;
}