Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- LegacyPassNameParser.h -----------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file contains the PassNameParser and FilteredPassNameParser<> classes,
  10. // which are used to add command line arguments to a utility for all of the
  11. // passes that have been registered into the system.
  12. //
  13. // The PassNameParser class adds ALL passes linked into the system (that are
  14. // creatable) as command line arguments to the tool (when instantiated with the
  15. // appropriate command line option template).  The FilteredPassNameParser<>
  16. // template is used for the same purposes as PassNameParser, except that it only
  17. // includes passes that have a PassType that are compatible with the filter
  18. // (which is the template argument).
  19. //
  20. // Note that this is part of the legacy pass manager infrastructure and will be
  21. // (eventually) going away.
  22. //
  23. //===----------------------------------------------------------------------===//
  24.  
  25. #ifndef LLVM_IR_LEGACYPASSNAMEPARSER_H
  26. #define LLVM_IR_LEGACYPASSNAMEPARSER_H
  27.  
  28. #include "llvm/ADT/STLExtras.h"
  29. #include "llvm/Pass.h"
  30. #include "llvm/Support/CommandLine.h"
  31. #include "llvm/Support/ErrorHandling.h"
  32. #include "llvm/Support/raw_ostream.h"
  33. #include <cstring>
  34.  
  35. namespace llvm {
  36.  
  37. //===----------------------------------------------------------------------===//
  38. // PassNameParser class - Make use of the pass registration mechanism to
  39. // automatically add a command line argument to opt for each pass.
  40. //
  41. class PassNameParser : public PassRegistrationListener,
  42.                        public cl::parser<const PassInfo*> {
  43. public:
  44.   PassNameParser(cl::Option &O);
  45.   ~PassNameParser() override;
  46.  
  47.   void initialize() {
  48.     cl::parser<const PassInfo*>::initialize();
  49.  
  50.     // Add all of the passes to the map that got initialized before 'this' did.
  51.     enumeratePasses();
  52.   }
  53.  
  54.   // ignorablePassImpl - Can be overriden in subclasses to refine the list of
  55.   // which passes we want to include.
  56.   //
  57.   virtual bool ignorablePassImpl(const PassInfo *P) const { return false; }
  58.  
  59.   inline bool ignorablePass(const PassInfo *P) const {
  60.     // Ignore non-selectable and non-constructible passes!  Ignore
  61.     // non-optimizations.
  62.     return P->getPassArgument().empty() || P->getNormalCtor() == nullptr ||
  63.            ignorablePassImpl(P);
  64.   }
  65.  
  66.   // Implement the PassRegistrationListener callbacks used to populate our map
  67.   //
  68.   void passRegistered(const PassInfo *P) override {
  69.     if (ignorablePass(P)) return;
  70.     if (findOption(P->getPassArgument().data()) != getNumOptions()) {
  71.       errs() << "Two passes with the same argument (-"
  72.            << P->getPassArgument() << ") attempted to be registered!\n";
  73.       llvm_unreachable(nullptr);
  74.     }
  75.     addLiteralOption(P->getPassArgument().data(), P, P->getPassName().data());
  76.   }
  77.   void passEnumerate(const PassInfo *P) override { passRegistered(P); }
  78.  
  79.   // printOptionInfo - Print out information about this option.  Override the
  80.   // default implementation to sort the table before we print...
  81.   void printOptionInfo(const cl::Option &O, size_t GlobalWidth) const override {
  82.     PassNameParser *PNP = const_cast<PassNameParser*>(this);
  83.     array_pod_sort(PNP->Values.begin(), PNP->Values.end(), ValCompare);
  84.     cl::parser<const PassInfo*>::printOptionInfo(O, GlobalWidth);
  85.   }
  86.  
  87. private:
  88.   // ValCompare - Provide a sorting comparator for Values elements...
  89.   static int ValCompare(const PassNameParser::OptionInfo *VT1,
  90.                         const PassNameParser::OptionInfo *VT2) {
  91.     return VT1->Name.compare(VT2->Name);
  92.   }
  93. };
  94.  
  95. } // End llvm namespace
  96.  
  97. #endif
  98.