Skip to content
CommandLine.cpp 41.5 KiB
Newer Older
      size_t L = std::strlen(getOption(i));
      outs() << "    -" << getOption(i);
      outs().indent(GlobalWidth-L-8) << " - " << getDescription(i) << '\n';
Chris Lattner's avatar
Chris Lattner committed
  }
}


//===----------------------------------------------------------------------===//
Chris Lattner's avatar
Chris Lattner committed
// --help and --help-hidden option implementation
Chris Lattner's avatar
Chris Lattner committed
//
static int OptNameCompare(const void *LHS, const void *RHS) {
  typedef std::pair<const char *, Option*> pair_ty;
  
  return strcmp(((pair_ty*)LHS)->first, ((pair_ty*)RHS)->first);
}

Chris Lattner's avatar
Chris Lattner committed
namespace {

Chris Lattner's avatar
Chris Lattner committed
class HelpPrinter {
  size_t MaxArgLen;
Chris Lattner's avatar
Chris Lattner committed
  const Option *EmptyArg;
  const bool ShowHidden;

Chris Lattner's avatar
Chris Lattner committed
public:
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;

Chris Lattner's avatar
Chris Lattner committed
    SmallVector<Option*, 4> PositionalOpts;
    SmallVector<Option*, 4> SinkOpts;
    GetOptionInfo(PositionalOpts, SinkOpts, OptMap);
    // Copy Options into a vector so we can sort them as we like.
    SmallVector<std::pair<const char *, Option*>, 128> Opts;
    SmallPtrSet<Option*, 128> OptionSet;  // Duplicate option detection.

    for (StringMap<Option*>::iterator I = OptMap.begin(), E = OptMap.end();
         I != E; ++I) {
      // Ignore really-hidden options.
      if (I->second->getOptionHiddenFlag() == ReallyHidden)
        continue;
      
      // Unless showhidden is set, ignore hidden flags.
      if (I->second->getOptionHiddenFlag() == Hidden && !ShowHidden)
        continue;
      
      // If we've already seen this option, don't add it to the list again.
Chris Lattner's avatar
Chris Lattner committed

      Opts.push_back(std::pair<const char *, Option*>(I->getKey().data(),
                                                      I->second));
    
    // Sort the options list alphabetically.
    qsort(Opts.data(), Opts.size(), sizeof(Opts[0]), OptNameCompare);
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].second->getOptionWidth());
Chris Lattner's avatar
Chris Lattner committed

    outs() << "OPTIONS:\n";
    for (size_t i = 0, e = Opts.size(); i != e; ++i)
      Opts[i].second->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;
static int TargetArraySortFn(const void *LHS, const void *RHS) {
  typedef std::pair<const char *, const Target*> pair_ty;
  return strcmp(((const pair_ty*)LHS)->first, ((const pair_ty*)RHS)->first);
}

Chris Lattner's avatar
Chris Lattner committed
    raw_ostream &OS = outs();
    OS << "Low Level Virtual Machine (http://llvm.org/):\n"
       << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
#ifdef LLVM_VERSION_INFO
Chris Lattner's avatar
Chris Lattner committed
    OS << LLVM_VERSION_INFO;
Chris Lattner's avatar
Chris Lattner committed
    OS << "\n  ";
#ifndef __OPTIMIZE__
Chris Lattner's avatar
Chris Lattner committed
    OS << "DEBUG build";
Chris Lattner's avatar
Chris Lattner committed
    OS << "Optimized build";
#endif
#ifndef NDEBUG
Chris Lattner's avatar
Chris Lattner committed
    OS << " with assertions";
Chris Lattner's avatar
Chris Lattner committed
    OS << ".\n"
       << "  Built " << __DATE__ << " (" << __TIME__ << ").\n"
       << "  Host: " << sys::getHostTriple() << '\n'
       << '\n'
       << "  Registered Targets:\n";
    std::vector<std::pair<const char *, 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, strlen(Targets.back().first));
    if (!Targets.empty())
      qsort(&Targets[0], Targets.size(), sizeof(Targets[0]),
            TargetArraySortFn);
    for (unsigned i = 0, e = Targets.size(); i != e; ++i) {
Chris Lattner's avatar
Chris Lattner committed
      OS << "    " << Targets[i].first;
      OS.indent(Width - strlen(Targets[i].first)) << " - "
             << Targets[i].second->getShortDescription() << '\n';
Chris Lattner's avatar
Chris Lattner committed
      OS << "    (none)\n";
  }
  void operator=(bool OptionWasSpecified) {
    if (!OptionWasSpecified) return;
    
    if (OverrideVersionPrinter == 0) {
      print();
      exit(1);
// 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;
}