From 7b499f7303940db399562b9ca0abd2ba692cf6a1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 26 Jul 2002 21:09:10 +0000 Subject: [PATCH] Factor PassNameParser out of opt.cpp so that analyze and eventually llc can use it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3108 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/PassNameParser.h | 106 ++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 include/llvm/Support/PassNameParser.h diff --git a/include/llvm/Support/PassNameParser.h b/include/llvm/Support/PassNameParser.h new file mode 100644 index 00000000000..ba53f8237a8 --- /dev/null +++ b/include/llvm/Support/PassNameParser.h @@ -0,0 +1,106 @@ +//===- llvm/Support/PassNameParser.h ----------------------------*- C++ -*-===// +// +// This file the PassNameParser and FilteredPassNameParser<> classes, which are +// used to add command line arguments to a utility for all of the passes that +// have been registered into the system. +// +// The PassNameParser class adds ALL passes linked into the system (that are +// creatable) as command line arguments to the tool (when instantiated with the +// appropriate command line option template). The FilteredPassNameParser<> +// template is used for the same purposes as PassNameParser, except that it only +// includes passes that have a PassType that are compatible with the filter +// (which is the template argument). +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_PASS_NAME_PARSER_H +#define LLVM_SUPPORT_PASS_NAME_PARSER_H + +#include "Support/CommandLine.h" +#include "llvm/Pass.h" +#include + +//===----------------------------------------------------------------------===// +// PassNameParser class - Make use of the pass registration mechanism to +// automatically add a command line argument to opt for each pass. +// +class PassNameParser : public PassRegistrationListener, + public cl::parser { + cl::Option *Opt; +public: + PassNameParser() : Opt(0) {} + + void initialize(cl::Option &O) { + Opt = &O; + cl::parser::initialize(O); + + // Add all of the passes to the map that got initialized before 'this' did. + enumeratePasses(); + } + + // ignorablePassImpl - Can be overriden in subclasses to refine the list of + // which passes we want to include. + // + virtual bool ignorablePassImpl(const PassInfo *P) const { return false; } + + inline bool ignorablePass(const PassInfo *P) const { + // Ignore non-selectable and non-constructible passes! Ignore + // non-optimizations. + return P->getPassArgument() == 0 || + (P->getNormalCtor() == 0 && P->getDataCtor() == 0) || + ignorablePassImpl(P); + } + + // Implement the PassRegistrationListener callbacks used to populate our map + // + virtual void passRegistered(const PassInfo *P) { + if (ignorablePass(P) || !Opt) return; + assert(findOption(P->getPassArgument()) == getNumOptions() && + "Two passes with the same argument attempted to be registered!"); + addLiteralOption(P->getPassArgument(), P, P->getPassName()); + Opt->addArgument(P->getPassArgument()); + } + virtual void passEnumerate(const PassInfo *P) { passRegistered(P); } + + virtual void passUnregistered(const PassInfo *P) { + if (ignorablePass(P) || !Opt) return; + assert(findOption(P->getPassArgument()) != getNumOptions() && + "Registered Pass not in the pass map!"); + removeLiteralOption(P->getPassArgument()); + Opt->removeArgument(P->getPassArgument()); + } + + // ValLessThan - Provide a sorting comparator for Values elements... + typedef std::pair > ValType; + static bool ValLessThan(const ValType &VT1, const ValType &VT2) { + return std::string(VT1.first) < std::string(VT2.first); + } + + // printOptionInfo - Print out information about this option. Override the + // default implementation to sort the table before we print... + virtual void printOptionInfo(const cl::Option &O, unsigned GlobalWidth) const{ + PassNameParser *PNP = const_cast(this); + std::sort(PNP->Values.begin(), PNP->Values.end(), ValLessThan); + cl::parser::printOptionInfo(O, GlobalWidth); + } +}; + + +//===----------------------------------------------------------------------===// +// FilteredPassNameParser class - Just like PassNameParser, but filter out +// passes that do not have a PassType that includes the flags specified as the +// template argument. +// +template +struct FilteredPassNameParser : public PassNameParser { + + // ignorablePassImpl - Can be overriden in subclasses to refine the list of + // which passes we want to include. + // + virtual bool ignorablePassImpl(const PassInfo *P) const { + return (P->getPassType() & Flags) == 0; + } +}; + +#endif