Skip to content
CommandLine.cpp 40.5 KiB
Newer Older
  inline static bool isHidden(Option *Opt) {
    return Opt->getOptionHiddenFlag() >= Hidden;
  inline static bool isReallyHidden(Option *Opt) {
    return Opt->getOptionHiddenFlag() == ReallyHidden;
Dan Gohman's avatar
Dan Gohman committed
  explicit HelpPrinter(bool showHidden) : ShowHidden(showHidden) {
Chris Lattner's avatar
Chris Lattner committed
    EmptyArg = 0;
  }

  void operator=(bool Value) {
    if (Value == false) return;

    // Get all the options.
    std::vector<Option*> PositionalOpts;
    std::vector<Option*> SinkOpts;
    GetOptionInfo(PositionalOpts, SinkOpts, OptMap);
Chris Lattner's avatar
Chris Lattner committed
    // 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);
    }
Chris Lattner's avatar
Chris Lattner committed

    // 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());
Chris Lattner's avatar
Chris Lattner committed

    // Eliminate duplicate entries in table (from enum flags options, f.e.)
Chris Lattner's avatar
Chris Lattner committed
    {  // 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
Chris Lattner's avatar
Chris Lattner committed
        else
          Opts.erase(Opts.begin()+i--);    // Erase duplicate
Chris Lattner's avatar
Chris Lattner committed

    if (ProgramOverview)
      outs() << "OVERVIEW: " << ProgramOverview << "\n";
Chris Lattner's avatar
Chris Lattner committed

    outs() << "USAGE: " << ProgramName << " [options]";
    // Print out the positional options.
Chris Lattner's avatar
Chris Lattner committed
    Option *CAOpt = 0;   // The cl::ConsumeAfter option, if it exists...
    if (!PositionalOpts.empty() &&
        PositionalOpts[0]->getNumOccurrencesFlag() == ConsumeAfter)
      CAOpt = PositionalOpts[0];

    for (size_t i = CAOpt != 0, e = PositionalOpts.size(); i != e; ++i) {
        outs() << " --" << PositionalOpts[i]->ArgStr;
      outs() << " " << PositionalOpts[i]->HelpStr;
Chris Lattner's avatar
Chris Lattner committed

    // Print the consume after option info if it exists...
    if (CAOpt) outs() << " " << CAOpt->HelpStr;
    outs() << "\n\n";
Chris Lattner's avatar
Chris Lattner committed

    // 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());
Chris Lattner's avatar
Chris Lattner committed

    outs() << "OPTIONS:\n";
    for (size_t i = 0, e = Opts.size(); i != e; ++i)
      Opts[i]->printOptionInfo(MaxArgLen);
Chris Lattner's avatar
Chris Lattner committed

    // Print any extra help the user has declared.
    for (std::vector<const char *>::iterator I = MoreHelp->begin(),
          E = MoreHelp->end(); I != E; ++I)
    MoreHelp->clear();
Reid Spencer's avatar
Reid Spencer committed
    // Halt the program since help information was printed
Chris Lattner's avatar
Chris Lattner committed
    exit(1);
Chris Lattner's avatar
Chris Lattner committed
  }
Chris Lattner's avatar
Chris Lattner committed

Chris Lattner's avatar
Chris Lattner committed
// 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> >
Chris Lattner's avatar
Chris Lattner committed
HOp("help", cl::desc("Display available options (--help-hidden for more)"),
    cl::location(NormalPrinter), cl::ValueDisallowed);
Chris Lattner's avatar
Chris Lattner committed

static cl::opt<HelpPrinter, true, parser<bool> >
Chris Lattner's avatar
Chris Lattner committed
HHOp("help-hidden", cl::desc("Display all available options"),
     cl::location(HiddenPrinter), cl::Hidden, cl::ValueDisallowed);
Chris Lattner's avatar
Chris Lattner committed

static void (*OverrideVersionPrinter)() = 0;
    outs() << "Low Level Virtual Machine (http://llvm.org/):\n"
           << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
#ifdef LLVM_VERSION_INFO
#ifndef __OPTIMIZE__
#endif
#ifndef NDEBUG
    outs() << ".\n"
           << "  Built " << __DATE__ << " (" << __TIME__ << ").\n"
           << "  Host: " << sys::getHostTriple() << "\n"
           << "\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());
    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();
// Define the --version option that prints out the LLVM version for the tool
static VersionPrinter VersionPrinterInstance;

static cl::opt<VersionPrinter, true, parser<bool> >
Chris Lattner's avatar
Chris Lattner committed
VersOp("version", cl::desc("Display the version of this program"),
    cl::location(VersionPrinterInstance), cl::ValueDisallowed);

Reid Spencer's avatar
Reid Spencer committed
// 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.
Reid Spencer's avatar
Reid Spencer committed
  NormalPrinter = true;
}
/// Utility function for printing version number.
void cl::PrintVersionMessage() {
  VersionPrinterInstance.print();
}

void cl::SetVersionPrinter(void (*func)()) {
  OverrideVersionPrinter = func;
}